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:
epgdatacapbon 2018-03-30 07:09:10 +09:00
parent da22adaf99
commit 6f6f83b9ca
4 changed files with 43 additions and 18 deletions

View File

@ -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;

View File

@ -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 */

View File

@ -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)

View File

@ -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;
};