B25Decoder.dllとの互換性向上
EDCBでのEPG取得時の問題に対応 排他制御はB25Decoder.dllのソースコードと下記を参考にした http://echo.2ch.net/test/read.cgi/avi/1428405907/472 http://echo.2ch.net/test/read.cgi/avi/1428405907/476 DiscardScramblePacketにも対応したが、Enable時はワンセグで副作用あり(EDCBではデフォルトでDisableになっている)
This commit is contained in:
parent
da22adaf99
commit
6f6f83b9ca
@ -929,7 +929,7 @@ static int put_arib_std_b25(void *std_b25, ARIB_STD_B25_BUFFER *buf)
|
||||
if(prv->p_count < 1){
|
||||
if(prv->sbuf_offset < (16*1024*1024)){
|
||||
/* need more data */
|
||||
return 0;
|
||||
return ARIB_STD_B25_WARN_PAT_NOT_COMPLETE;
|
||||
}else{
|
||||
/* exceed sbuf limit */
|
||||
return ARIB_STD_B25_ERROR_NO_PAT_IN_HEAD_16M;
|
||||
@ -946,7 +946,7 @@ static int put_arib_std_b25(void *std_b25, ARIB_STD_B25_BUFFER *buf)
|
||||
if(!check_pmt_complete(prv)){
|
||||
if(prv->sbuf_offset < (32*1024*1024)){
|
||||
/* need more data */
|
||||
return 0;
|
||||
return ARIB_STD_B25_WARN_PMT_NOT_COMPLETE;
|
||||
}else{
|
||||
/* exceed sbuf limit */
|
||||
return ARIB_STD_B25_ERROR_NO_PMT_IN_HEAD_32M;
|
||||
@ -963,7 +963,7 @@ static int put_arib_std_b25(void *std_b25, ARIB_STD_B25_BUFFER *buf)
|
||||
if(!check_ecm_complete(prv)){
|
||||
if(prv->sbuf_offset < (32*1024*1024)){
|
||||
/* need more data */
|
||||
return 0;
|
||||
return ARIB_STD_B25_WARN_ECM_NOT_COMPLETE;
|
||||
}else{
|
||||
/* exceed sbuf limit */
|
||||
return ARIB_STD_B25_ERROR_NO_ECM_IN_HEAD_32M;
|
||||
|
@ -21,5 +21,8 @@
|
||||
#define ARIB_STD_B25_WARN_UNPURCHASED_ECM 1
|
||||
#define ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH 2
|
||||
#define ARIB_STD_B25_WARN_BROKEN_TS_SECTION 3
|
||||
#define ARIB_STD_B25_WARN_PAT_NOT_COMPLETE 4
|
||||
#define ARIB_STD_B25_WARN_PMT_NOT_COMPLETE 5
|
||||
#define ARIB_STD_B25_WARN_ECM_NOT_COMPLETE 6
|
||||
|
||||
#endif /* ARIB_STD_B25_ERROR_CODE_H */
|
||||
|
@ -53,6 +53,12 @@ CB25Decoder::CB25Decoder(void) : _bcas(nullptr), _b25(nullptr), _data(nullptr)
|
||||
|
||||
CB25Decoder::~CB25Decoder(void)
|
||||
{
|
||||
m_pThis = nullptr;
|
||||
}
|
||||
|
||||
void CB25Decoder::Release()
|
||||
{
|
||||
// インスタンス開放
|
||||
if (_data)
|
||||
::free(_data);
|
||||
|
||||
@ -64,12 +70,6 @@ CB25Decoder::~CB25Decoder(void)
|
||||
if (_bcas)
|
||||
_bcas->release(_bcas);
|
||||
|
||||
m_pThis = nullptr;
|
||||
}
|
||||
|
||||
void CB25Decoder::Release()
|
||||
{
|
||||
// インスタンス開放
|
||||
delete this;
|
||||
}
|
||||
|
||||
@ -95,7 +95,7 @@ const BOOL CB25Decoder::Initialize(DWORD dwRound)
|
||||
goto err;
|
||||
|
||||
_b25->set_strip(_b25, 1);
|
||||
_b25->set_emm_proc(_b25, 0);
|
||||
_b25->set_emm_proc(_b25, 1);
|
||||
_b25->set_multi2_round(_b25, dwRound);
|
||||
|
||||
return TRUE; // success
|
||||
@ -117,6 +117,13 @@ err:
|
||||
|
||||
const BOOL CB25Decoder::Decode(BYTE *pSrcBuf, const DWORD dwSrcSize, BYTE **ppDstBuf, DWORD *pdwDstSize)
|
||||
{
|
||||
if (!pSrcBuf || !dwSrcSize || !ppDstBuf || !pdwDstSize) {
|
||||
// 引数が不正
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> lock(_mtx);
|
||||
|
||||
if (!_b25) {
|
||||
time_t now = time(nullptr);
|
||||
if (difftime(now, _errtime) > RETRY_INTERVAL) {
|
||||
@ -142,7 +149,18 @@ const BOOL CB25Decoder::Decode(BYTE *pSrcBuf, const DWORD dwSrcSize, BYTE **ppDs
|
||||
buf.data = pSrcBuf;
|
||||
buf.size = dwSrcSize;
|
||||
const int rc = _b25->put(_b25, &buf);
|
||||
if (rc < 0) {
|
||||
if (rc > 0) {
|
||||
if (discard_scramble) {
|
||||
*ppDstBuf = nullptr;
|
||||
*pdwDstSize = 0;
|
||||
} else {
|
||||
if (*ppDstBuf != pSrcBuf) {
|
||||
*ppDstBuf = pSrcBuf;
|
||||
*pdwDstSize = dwSrcSize;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
} else if (rc < 0) {
|
||||
if (rc >= ARIB_STD_B25_ERROR_NO_ECM_IN_HEAD_32M) {
|
||||
// pass through
|
||||
_b25->release(_b25);
|
||||
@ -208,6 +226,8 @@ const BOOL CB25Decoder::Reset(void)
|
||||
{
|
||||
BOOL ret = TRUE;
|
||||
|
||||
std::lock_guard<std::mutex> lock(_mtx);
|
||||
|
||||
if (_b25) {
|
||||
int rc = _b25->reset(_b25);
|
||||
ret = (rc < 0) ? FALSE : TRUE;
|
||||
@ -224,6 +244,8 @@ void CB25Decoder::DiscardNullPacket(const bool bEnable)
|
||||
|
||||
void CB25Decoder::DiscardScramblePacket(const bool bEnable)
|
||||
{
|
||||
// 復号漏れパケット破棄の有無を設定
|
||||
discard_scramble = bEnable;
|
||||
}
|
||||
|
||||
void CB25Decoder::EnableEmmProcess(const bool bEnable)
|
||||
|
@ -16,13 +16,6 @@
|
||||
class CB25Decoder : public IB25Decoder2
|
||||
{
|
||||
public:
|
||||
// CB25Decoder
|
||||
CB25Decoder(void);
|
||||
virtual ~CB25Decoder(void);
|
||||
void Release(void);
|
||||
|
||||
static CB25Decoder *m_pThis;
|
||||
|
||||
// IB25Decoder
|
||||
virtual const BOOL Initialize(DWORD dwRound = 4);
|
||||
virtual const BOOL Decode(BYTE *pSrcBuf, const DWORD dwSrcSize, BYTE **ppDstBuf, DWORD *pdwDstSize);
|
||||
@ -47,10 +40,17 @@ public:
|
||||
virtual const DWORD GetEcmProcessNum(void);
|
||||
virtual const DWORD GetEmmProcessNum(void);
|
||||
|
||||
// CB25Decoder
|
||||
CB25Decoder(void);
|
||||
virtual ~CB25Decoder(void);
|
||||
void Release(void);
|
||||
static CB25Decoder *m_pThis;
|
||||
|
||||
private:
|
||||
std::mutex _mtx;
|
||||
B_CAS_CARD *_bcas;
|
||||
ARIB_STD_B25 *_b25;
|
||||
BYTE *_data;
|
||||
time_t _errtime;
|
||||
BOOL discard_scramble = TRUE;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user