Merge pull request #2270 from huili2/parseonly_api_bugfix
disable wrongly calling for parseonly related
This commit is contained in:
commit
404315ab19
@ -304,13 +304,13 @@ long CWelsDecoder::SetOption (DECODER_OPTION eOptID, void* pOption) {
|
||||
|
||||
iVal = * ((int*)pOption); // int value for error concealment idc
|
||||
iVal = WELS_CLIP3 (iVal, (int32_t) ERROR_CON_DISABLE, (int32_t) ERROR_CON_SLICE_MV_COPY_CROSS_IDR_FREEZE_RES_CHANGE);
|
||||
m_pDecContext->pParam->eEcActiveIdc = m_pDecContext->eErrorConMethod = (ERROR_CON_IDC) iVal;
|
||||
if ((m_pDecContext->bParseOnly) && (m_pDecContext->eErrorConMethod != ERROR_CON_DISABLE)) {
|
||||
if ((m_pDecContext->bParseOnly) && (iVal != (int32_t) ERROR_CON_DISABLE)) {
|
||||
WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
|
||||
"CWelsDecoder::SetOption for ERROR_CON_IDC = %d not allowd for parse only!.", iVal);
|
||||
return cmInitParaError;
|
||||
}
|
||||
|
||||
m_pDecContext->pParam->eEcActiveIdc = m_pDecContext->eErrorConMethod = (ERROR_CON_IDC) iVal;
|
||||
InitErrorCon (m_pDecContext);
|
||||
WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
|
||||
"CWelsDecoder::SetOption for ERROR_CON_IDC = %d.", iVal);
|
||||
@ -438,6 +438,11 @@ DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc,
|
||||
const int kiSrcLen,
|
||||
unsigned char** ppDst,
|
||||
SBufferInfo* pDstInfo) {
|
||||
if (m_pDecContext->bParseOnly) {
|
||||
WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_ERROR, "bParseOnly should be false for this API calling! \n");
|
||||
m_pDecContext->iErrorCode |= dsInvalidArgument;
|
||||
return dsInvalidArgument;
|
||||
}
|
||||
if (CheckBsBuffer (m_pDecContext, kiSrcLen)) {
|
||||
return dsOutOfMemory;
|
||||
}
|
||||
@ -578,6 +583,11 @@ DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc,
|
||||
DECODING_STATE CWelsDecoder::DecodeParser (const unsigned char* kpSrc,
|
||||
const int kiSrcLen,
|
||||
SParserBsInfo* pDstInfo) {
|
||||
if (!m_pDecContext->bParseOnly) {
|
||||
WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_ERROR, "bParseOnly should be true for this API calling! \n");
|
||||
m_pDecContext->iErrorCode |= dsInvalidArgument;
|
||||
return dsInvalidArgument;
|
||||
}
|
||||
if (CheckBsBuffer (m_pDecContext, kiSrcLen)) {
|
||||
return dsOutOfMemory;
|
||||
}
|
||||
|
@ -34,6 +34,8 @@ class DecoderInterfaceTest : public ::testing::Test {
|
||||
void DecoderBs (const char* sFileName);
|
||||
//Test Initialize/Uninitialize
|
||||
void TestInitUninit();
|
||||
//Test parse only API
|
||||
void TestParseOnlyAPI();
|
||||
//DECODER_OPTION_END_OF_STREAM
|
||||
void TestEndOfStream();
|
||||
//DECODER_OPTION_VCL_NAL
|
||||
@ -66,6 +68,7 @@ class DecoderInterfaceTest : public ::testing::Test {
|
||||
ISVCDecoder* m_pDec;
|
||||
SDecodingParam m_sDecParam;
|
||||
SBufferInfo m_sBufferInfo;
|
||||
SParserBsInfo m_sParserBsInfo;
|
||||
uint8_t* m_pData[3];
|
||||
unsigned char m_szBuffer[BUF_SIZE]; //for mocking packet
|
||||
int m_iBufLength; //record the valid data in m_szBuffer
|
||||
@ -74,6 +77,7 @@ class DecoderInterfaceTest : public ::testing::Test {
|
||||
//Init members
|
||||
void DecoderInterfaceTest::Init() {
|
||||
memset (&m_sBufferInfo, 0, sizeof (SBufferInfo));
|
||||
memset (&m_sParserBsInfo, 0, sizeof (SParserBsInfo));
|
||||
memset (&m_sDecParam, 0, sizeof (SDecodingParam));
|
||||
m_sDecParam.pFileNameRestructed = NULL;
|
||||
m_sDecParam.uiCpuLoad = rand() % 100;
|
||||
@ -96,6 +100,7 @@ void DecoderInterfaceTest::Uninit() {
|
||||
ASSERT_EQ (eRet, cmResultSuccess);
|
||||
}
|
||||
memset (&m_sDecParam, 0, sizeof (SDecodingParam));
|
||||
memset (&m_sParserBsInfo, 0, sizeof (SParserBsInfo));
|
||||
memset (&m_sBufferInfo, 0, sizeof (SBufferInfo));
|
||||
m_pData[0] = m_pData[1] = m_pData[2] = NULL;
|
||||
m_iBufLength = 0;
|
||||
@ -180,16 +185,15 @@ void DecoderInterfaceTest::MockPacketType (const EWelsNalUnitType eNalUnitType,
|
||||
default:
|
||||
m_szBuffer[m_iBufLength++] = 0; //NAL_UNIT_UNSPEC_0
|
||||
break;
|
||||
|
||||
int iAddLength = iPacketLength - 5; //excluding 0001 and type
|
||||
if (iAddLength > PAYLOAD_SIZE)
|
||||
iAddLength = PAYLOAD_SIZE;
|
||||
for (int i = 0; i < iAddLength; ++i) {
|
||||
m_szBuffer[m_iBufLength++] = rand() % 256;
|
||||
}
|
||||
m_szBuffer[m_iBufLength++] = '\0';
|
||||
|
||||
}
|
||||
int iAddLength = iPacketLength - 5; //excluding 0001 and type
|
||||
if (iAddLength > PAYLOAD_SIZE)
|
||||
iAddLength = PAYLOAD_SIZE;
|
||||
for (int i = 0; i < iAddLength; ++i) {
|
||||
m_szBuffer[m_iBufLength++] = rand() % 256;
|
||||
}
|
||||
m_szBuffer[m_iBufLength++] = '\0';
|
||||
|
||||
}
|
||||
|
||||
//Test Initialize/Uninitialize
|
||||
@ -220,6 +224,87 @@ void DecoderInterfaceTest::TestInitUninit() {
|
||||
}
|
||||
}
|
||||
|
||||
//Test parse only API
|
||||
void DecoderInterfaceTest::TestParseOnlyAPI() {
|
||||
int iOutput;
|
||||
int iRet;
|
||||
|
||||
m_pData[0] = m_pData[1] = m_pData[2] = NULL;
|
||||
m_szBuffer[0] = m_szBuffer[1] = m_szBuffer[2] = 0;
|
||||
m_szBuffer[3] = 1;
|
||||
m_iBufLength = 4;
|
||||
MockPacketType (NAL_UNIT_SPS, 12);
|
||||
|
||||
m_pDec->Uninitialize();
|
||||
|
||||
//test 1: bParseOnly = true; eEcActiveIdc = 0,1
|
||||
for (int iNum = 0; iNum < 2; ++iNum) { //loop for EC
|
||||
memset (&m_sBufferInfo, 0, sizeof (SBufferInfo));
|
||||
memset (&m_sParserBsInfo, 0, sizeof (SParserBsInfo));
|
||||
memset (&m_sDecParam, 0, sizeof (SDecodingParam));
|
||||
m_sDecParam.pFileNameRestructed = NULL;
|
||||
m_sDecParam.uiCpuLoad = rand() % 100;
|
||||
m_sDecParam.uiTargetDqLayer = -1;
|
||||
m_sDecParam.bParseOnly = true;
|
||||
m_sDecParam.eEcActiveIdc = (ERROR_CON_IDC) iNum;
|
||||
m_sDecParam.sVideoProperty.size = sizeof (SVideoProperty);
|
||||
m_sDecParam.sVideoProperty.eVideoBsType = (VIDEO_BITSTREAM_TYPE) (rand() % 3);
|
||||
|
||||
iRet = m_pDec->Initialize (&m_sDecParam);
|
||||
ASSERT_EQ (iRet, (int32_t) cmResultSuccess);
|
||||
iRet = m_pDec->GetOption (DECODER_OPTION_ERROR_CON_IDC, &iOutput);
|
||||
EXPECT_EQ (iRet, (int32_t) cmResultSuccess);
|
||||
EXPECT_EQ (iOutput, (int32_t) ERROR_CON_DISABLE); //should be 0
|
||||
//call DecodeParser(), correct call
|
||||
iRet = (int32_t) m_pDec->DecodeParser (m_szBuffer, m_iBufLength, &m_sParserBsInfo);
|
||||
EXPECT_EQ (iRet, (int32_t) dsNoParamSets);
|
||||
iRet = m_pDec->GetOption (DECODER_OPTION_ERROR_CON_IDC, &iOutput);
|
||||
EXPECT_EQ (iRet, (int32_t) cmResultSuccess);
|
||||
EXPECT_EQ (iOutput, (int32_t) ERROR_CON_DISABLE); //should be 0
|
||||
//call DecodeFrame2(), incorrect call
|
||||
iRet = (int32_t) m_pDec->DecodeFrame2 (m_szBuffer, m_iBufLength, m_pData, &m_sBufferInfo);
|
||||
EXPECT_EQ (iRet, (int32_t) dsInvalidArgument);
|
||||
iRet = m_pDec->GetOption (DECODER_OPTION_ERROR_CON_IDC, &iOutput);
|
||||
EXPECT_EQ (iRet, (int32_t) cmResultSuccess);
|
||||
EXPECT_EQ (iOutput, (int32_t) ERROR_CON_DISABLE); //should be 0
|
||||
m_pDec->Uninitialize();
|
||||
}
|
||||
|
||||
//test 2: bParseOnly = false; eEcActiveIdc = 0,1
|
||||
for (int iNum = 0; iNum < 2; ++iNum) { //loop for EC
|
||||
memset (&m_sBufferInfo, 0, sizeof (SBufferInfo));
|
||||
memset (&m_sParserBsInfo, 0, sizeof (SParserBsInfo));
|
||||
memset (&m_sDecParam, 0, sizeof (SDecodingParam));
|
||||
m_sDecParam.pFileNameRestructed = NULL;
|
||||
m_sDecParam.uiCpuLoad = rand() % 100;
|
||||
m_sDecParam.uiTargetDqLayer = -1;
|
||||
m_sDecParam.bParseOnly = false;
|
||||
m_sDecParam.eEcActiveIdc = (ERROR_CON_IDC) iNum;
|
||||
m_sDecParam.sVideoProperty.size = sizeof (SVideoProperty);
|
||||
m_sDecParam.sVideoProperty.eVideoBsType = (VIDEO_BITSTREAM_TYPE) (rand() % 3);
|
||||
|
||||
iRet = m_pDec->Initialize (&m_sDecParam);
|
||||
ASSERT_EQ (iRet, (int32_t) cmResultSuccess);
|
||||
iRet = m_pDec->GetOption (DECODER_OPTION_ERROR_CON_IDC, &iOutput);
|
||||
EXPECT_EQ (iRet, (int32_t) cmResultSuccess);
|
||||
EXPECT_EQ (iOutput, iNum);
|
||||
//call DecodeParser(), incorrect call
|
||||
iRet = (int32_t) m_pDec->DecodeParser (m_szBuffer, m_iBufLength, &m_sParserBsInfo);
|
||||
EXPECT_EQ (iRet, (int32_t) dsInvalidArgument); //error call
|
||||
iRet = m_pDec->GetOption (DECODER_OPTION_ERROR_CON_IDC, &iOutput);
|
||||
EXPECT_EQ (iRet, (int32_t) cmResultSuccess);
|
||||
EXPECT_EQ (iOutput, iNum);
|
||||
//call DecodeFrame2(), correct call
|
||||
iRet = (int32_t) m_pDec->DecodeFrame2 (m_szBuffer, m_iBufLength, m_pData, &m_sBufferInfo);
|
||||
EXPECT_EQ (iRet, (int32_t) dsNoParamSets);
|
||||
iRet = m_pDec->GetOption (DECODER_OPTION_ERROR_CON_IDC, &iOutput);
|
||||
EXPECT_EQ (iRet, (int32_t) cmResultSuccess);
|
||||
EXPECT_EQ (iOutput, iNum);
|
||||
m_pDec->Uninitialize();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//DECODER_OPTION_END_OF_STREAM
|
||||
void DecoderInterfaceTest::TestEndOfStream() {
|
||||
int iTmp, iOut;
|
||||
|
Loading…
x
Reference in New Issue
Block a user