ref: 5364be4504d4c8b2da84ebfee42fccb8b2d10089
parent: 4c1642a6dc0b8121b3691625427ba0bc82c40e88
author: huili2 <huili2@cisco.com>
date: Sat Sep 29 11:03:58 EDT 2018
add UT for cavlc_b not support case
--- a/test/decoder/DecUT_ParseSyntax.cpp
+++ b/test/decoder/DecUT_ParseSyntax.cpp
@@ -10,6 +10,13 @@
using namespace WelsDec;
#define BUF_SIZE 100
+typedef enum DecCase {
+ CorrectDec = 0,
+ ErrorDec = 1,
+ CorrectParseOnly = 2,
+ ErrorParseOnly = 3,
+ RESERVED,
+} EDecCase;
DECODING_STATE DecodeFrame (const unsigned char* kpSrc,
const int kiSrcLen,
@@ -16,7 +23,6 @@
unsigned char** ppDst,
SBufferInfo* pDstInfo,
PWelsDecoderContext pCtx) {
-
PWelsDecoderContext m_pDecContext = pCtx;
if (CheckBsBuffer (m_pDecContext, kiSrcLen)) {
return dsOutOfMemory;
@@ -55,7 +61,7 @@
pDstInfo, NULL); //iErrorCode has been modified in this function
m_pDecContext->bInstantDecFlag = false; //reset no-delay flag
- return dsErrorFree;
+ return (DECODING_STATE) m_pDecContext->iErrorCode;
}
void UninitDecoder (PWelsDecoderContext& pCtx) {
@@ -132,13 +138,14 @@
//Uninit members
void Uninit();
//Decoder real bitstream
- bool DecodeBs (const char* sFileName);
+ bool DecodeBs (const char* sFileName, EDecCase eDecCase);
//Parse real bitstream
- bool ParseBs (const char* sFileName);
+ bool ParseBs (const char* sFileName, EDecCase eDecCase);
//Scalinglist
void TestScalingList();
//specific bitstream test
void TestSpecificBs();
+ void TestSpecificBsError();
//Do whole tests here
void DecoderParseSyntaxTestAll();
@@ -204,7 +211,7 @@
m_iBufLength = 0;
}
-bool DecoderParseSyntaxTest::DecodeBs (const char* sFileName) {
+bool DecoderParseSyntaxTest::DecodeBs (const char* sFileName, EDecCase eDecCase) {
uint8_t* pBuf = NULL;
int32_t iBufPos = 0;
@@ -211,10 +218,10 @@
int32_t iFileSize;
int32_t i = 0;
int32_t iSliceSize;
- int32_t iSliceIndex = 0;
int32_t iEndOfStreamFlag = 0;
FILE* pH264File;
uint8_t uiStartCode[4] = {0, 0, 0, 1};
+ int iRet = 0;
#if defined(ANDROID_NDK)
std::string filename = std::string ("/sdcard/") + sFileName;
@@ -255,12 +262,13 @@
}
}
iSliceSize = i;
- DecodeFrame (pBuf + iBufPos, iSliceSize, m_pData, &m_sBufferInfo, m_pCtx);
+ iRet |= DecodeFrame (pBuf + iBufPos, iSliceSize, m_pData, &m_sBufferInfo, m_pCtx);
iBufPos += iSliceSize;
- ++ iSliceIndex;
- if (iSliceIndex == 4)
- break;
}
+ if (eDecCase == CorrectDec)
+ EXPECT_TRUE (iRet == dsErrorFree);
+ else if (eDecCase == ErrorDec)
+ EXPECT_TRUE ((iRet & (dsBitstreamError | dsRefLost | dsDataErrorConcealed)) != 0) << "iRet = " << iRet;
fclose (pH264File);
if (pBuf) {
@@ -270,7 +278,7 @@
return true;
}
-bool DecoderParseSyntaxTest::ParseBs (const char* sFileName) {
+bool DecoderParseSyntaxTest::ParseBs (const char* sFileName, EDecCase eDecCase) {
uint8_t* pBuf = NULL;
int32_t iBufPos = 0;
@@ -281,7 +289,7 @@
int32_t iEndOfStreamFlag = 0;
FILE* pH264File;
uint8_t uiStartCode[4] = { 0, 0, 0, 1 };
- int iRet;
+ int iRet = 0;
#if defined(ANDROID_NDK)
std::string filename = std::string ("/sdcard/") + sFileName;
@@ -323,15 +331,17 @@
}
iSliceSize = i;
memset (&m_sParserBsInfo, 0, sizeof (SParserBsInfo));
- iRet = m_pDec->DecodeParser (pBuf + iBufPos, iSliceSize, &m_sParserBsInfo);
- EXPECT_TRUE (iRet == dsErrorFree || iRet == dsFramePending);
- iRet = m_pDec->DecodeParser (NULL, 0, &m_sParserBsInfo);
- EXPECT_TRUE (iRet == dsErrorFree || iRet == dsFramePending);
+ iRet |= m_pDec->DecodeParser (pBuf + iBufPos, iSliceSize, &m_sParserBsInfo);
+ iRet |= m_pDec->DecodeParser (NULL, 0, &m_sParserBsInfo);
+ if (eDecCase == CorrectParseOnly)
+ EXPECT_TRUE (iRet == dsErrorFree || iRet == dsFramePending);
iBufPos += iSliceSize;
++iSliceIndex;
if (iSliceIndex == 4)
break;
}
+ if (eDecCase == ErrorDec)
+ EXPECT_TRUE ((iRet & (dsBitstreamError | dsRefLost | dsDataErrorConcealed)) != 0) << iRet;
fclose (pH264File);
if (pBuf) {
@@ -366,7 +376,7 @@
int32_t iRet = ERR_NONE;
iRet = Init();
ASSERT_EQ (iRet, ERR_NONE);
- ASSERT_TRUE (DecodeBs ("res/BA_MW_D.264"));
+ ASSERT_TRUE (DecodeBs ("res/BA_MW_D.264", CorrectDec));
ASSERT_TRUE (m_pCtx->sSpsBuffer[0].bSeqScalingMatrixPresentFlag == false);
EXPECT_EQ (0, memcmp (iScalingListZero, m_pCtx->sSpsBuffer[0].iScalingList4x4, 6 * 16 * sizeof (uint8_t)));
ASSERT_TRUE (m_pCtx->sPpsBuffer[0].bPicScalingMatrixPresentFlag == false);
@@ -375,7 +385,7 @@
//Scalinglist value just written into sps and pps
iRet = Init();
ASSERT_EQ (iRet, ERR_NONE);
- ASSERT_TRUE (DecodeBs ("res/test_scalinglist_jm.264"));
+ ASSERT_TRUE (DecodeBs ("res/test_scalinglist_jm.264", CorrectDec));
ASSERT_TRUE (m_pCtx->sSpsBuffer[0].bSeqScalingMatrixPresentFlag);
for (int i = 0; i < 6; i++) {
EXPECT_EQ (0, memcmp (iScalingList[i], m_pCtx->sSpsBuffer[0].iScalingList4x4[i], 16 * sizeof (uint8_t)));
@@ -390,20 +400,28 @@
void DecoderParseSyntaxTest::TestSpecificBs() {
int32_t iRet = ERR_NONE;
- Uninit();
m_sDecParam.bParseOnly = true;
m_sDecParam.eEcActiveIdc = ERROR_CON_DISABLE;
iRet = m_pDec->Initialize (&m_sDecParam);
ASSERT_EQ (iRet, ERR_NONE);
- ASSERT_TRUE (ParseBs ("res/jm_1080p_allslice.264"));
+ ASSERT_TRUE (ParseBs ("res/jm_1080p_allslice.264", CorrectParseOnly));
m_pDec->Uninitialize();
- //Uninit();
}
+
+void DecoderParseSyntaxTest::TestSpecificBsError() {
+ int32_t iRet = ERR_NONE;
+ Init();
+ ASSERT_EQ (iRet, ERR_NONE);
+ ASSERT_TRUE (DecodeBs ("res/Cisco_Men_whisper_640x320_CAVLC_Bframe_9.264", ErrorDec));
+ Uninit();
+}
+
//TEST here for whole tests
TEST_F (DecoderParseSyntaxTest, DecoderParseSyntaxTestAll) {
TestScalingList();
TestSpecificBs();
+ TestSpecificBsError();
}