History

fix parseonly length overflow

huili2 committed 9 years ago

Commit 17139511 parent 2ca99128 files · +370 −24Browse files

Showing the changes to test/api/decode_api_test.cpp (1 of 8 files). Show all

Unified · Split

test/api/decode_api_test.cpp+222−13
@@ -801,8 +801,13 @@ class DecodeParseAPI : public ::testing::TestWithParam<EncodeDecodeFileParamBase · 800 unmodified lines
801801 int rv = decoder_->Initialize (&decParam);
802802 ASSERT_EQ (0, rv);
803803 memset (&BsInfo_, 0, sizeof (SParserBsInfo));
804− fYuv_ = fopen ("./res/CiscoVT2people_160x96_6fps.yuv", "rb");
805− ASSERT_TRUE (fYuv_ != NULL);
804+ const char* sFileName = "res/CiscoVT2people_160x96_6fps.yuv";
805+#if defined(ANDROID_NDK)
806+ std::string filename = std::string ("/sdcard/") + sFileName;
807+ ASSERT_TRUE ((fYuv_ = fopen (filename.c_str(), "rb")) != NULL);
808+#else
809+ ASSERT_TRUE ((fYuv_ = fopen (sFileName, "rb")) != NULL);
810+#endif
806811 iWidth_ = kiWidth;
807812 iHeight_ = kiHeight;
808813 }
@@ -810,6 +815,7 @@ class DecodeParseAPI : public ::testing::TestWithParam<EncodeDecodeFileParamBase · 1 unmodified line
810815 EncodeDecodeTestBase::TearDown();
811816 if (fYuv_ != NULL) {
812817 fclose (fYuv_);
818+ fYuv_ = NULL;
813819 }
814820 }
815821
@@ -820,7 +826,15 @@ class DecodeParseAPI : public ::testing::TestWithParam<EncodeDecodeFileParamBase · 4 unmodified lines
820826 BsInfo_.pDstBuff = pTmpPtr;
821827 }
822828
823− void EncodeOneFrame (int iIdx) {
829+ void MockInputData (uint8_t* pData, int32_t iSize) {
830+ int32_t iCurr = 0;
831+ while (iCurr < iSize) {
832+ * (pData + iCurr) = (* (pData + iCurr) + (rand() % 20) + 256) & 0x00ff;
833+ iCurr++;
834+ }
835+ }
836+
837+ void EncodeOneFrame (bool bMock) {
824838 int iFrameSize = iWidth_ * iHeight_ * 3 / 2;
825839 int iSize = (int) fread (buf_.data(), sizeof (char), iFrameSize, fYuv_);
826840 if (feof (fYuv_) || iSize != iFrameSize) {
@@ -828,6 +842,9 @@ class DecodeParseAPI : public ::testing::TestWithParam<EncodeDecodeFileParamBase · 1 unmodified line
828842 iSize = (int) fread (buf_.data(), sizeof (char), iFrameSize, fYuv_);
829843 ASSERT_TRUE (iSize == iFrameSize);
830844 }
845+ if (bMock) {
846+ MockInputData (buf_.data(), iWidth_ * iHeight_);
847+ }
831848 int rv = encoder_->EncodeFrame (&EncPic, &info);
832849 ASSERT_TRUE (rv == cmResultSuccess || rv == cmUnknownReason);
833850 }
@@ -845,7 +862,7 @@ class DecodeParseAPI : public ::testing::TestWithParam<EncodeDecodeFileParamBase · 11 unmodified lines
845862 SHA1Context ctx_;
846863 };
847864
848−//#define DEBUG_FILE_SAVE
865+//#define DEBUG_FILE_SAVE_PARSEONLY_GENERAL
849866 TEST_F (DecodeParseAPI, ParseOnly_General) {
850867 EncodeDecodeFileParamBase p;
851868 p.width = iWidth_;
@@ -861,7 +878,7 @@ TEST_F (DecodeParseAPI, ParseOnly_General) { · 9 unmodified lines
861878 encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
862879 decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
863880 uint32_t uiTargetLayerId = rand() % kiTotalLayer; //run only once
864−#ifdef DEBUG_FILE_SAVE
881+#ifdef DEBUG_FILE_SAVE_PARSEONLY_GENERAL
865882 FILE* fDec = fopen ("output.264", "wb");
866883 FILE* fEnc = fopen ("enc.264", "wb");
867884 FILE* fExtract = fopen ("extract.264", "wb");
@@ -874,14 +891,14 @@ TEST_F (DecodeParseAPI, ParseOnly_General) { · 6 unmodified lines
874891
875892 while (iFrame < p.numframes) {
876893 //encode
877− EncodeOneFrame (iFrame);
894+ EncodeOneFrame (0);
878895 //extract target layer data
879896 encToDecData (info, iLen);
880−#ifdef DEBUG_FILE_SAVE
897+#ifdef DEBUG_FILE_SAVE_PARSEONLY_GENERAL
881898 fwrite (info.sLayerInfo[0].pBsBuf, iLen, 1, fEnc);
882899 #endif
883900 ExtractDidNal (&info, iLen, &m_SLostSim, uiTargetLayerId);
884−#ifdef DEBUG_FILE_SAVE
901+#ifdef DEBUG_FILE_SAVE_PARSEONLY_GENERAL
885902 fwrite (info.sLayerInfo[0].pBsBuf, iLen, 1, fExtract);
886903 #endif
887904 //parseonly
@@ -896,10 +913,10 @@ TEST_F (DecodeParseAPI, ParseOnly_General) { · 8 unmodified lines
896913 iLen = 0;
897914 int i = 0;
898915 while (i < BsInfo_.iNalNum) {
899− iLen += BsInfo_.iNalLenInByte[i];
916+ iLen += BsInfo_.pNalLenInByte[i];
900917 i++;
901918 }
902−#ifdef DEBUG_FILE_SAVE
919+#ifdef DEBUG_FILE_SAVE_PARSEONLY_GENERAL
903920 fwrite (BsInfo_.pDstBuff, iLen, 1, fDec);
904921 #endif
905922 SHA1Input (&ctx_, BsInfo_.pDstBuff, iLen);
@@ -909,10 +926,10 @@ TEST_F (DecodeParseAPI, ParseOnly_General) { · 3 unmodified lines
909926 unsigned char digest[SHA_DIGEST_LENGTH];
910927 SHA1Result (&ctx_, digest);
911928 if (!HasFatalFailure()) {
912− CompareHashAnyOf (digest, pHashStr[uiTargetLayerId], sizeof *pHashStr / sizeof **pHashStr);
929+ CompareHashAnyOf (digest, pHashStr[uiTargetLayerId], sizeof * pHashStr / sizeof** pHashStr);
913930 }
914931 } //while
915−#ifdef DEBUG_FILE_SAVE
932+#ifdef DEBUG_FILE_SAVE_PARSEONLY_GENERAL
916933 fclose (fEnc);
917934 fclose (fExtract);
918935 fclose (fDec);
@@ -947,7 +964,7 @@ TEST_F (DecodeParseAPI, ParseOnly_SpecSliceLoss) { · 28 unmodified lines
947964
948965 while (iFrame < p.numframes) {
949966 //encode
950− EncodeOneFrame (iFrame);
967+ EncodeOneFrame (0);
951968 //parseonly
952969 if (iFrame == iMissedPicNum) { //make current frame partly missing
953970 //Frame: P, first slice loss
@@ -979,5 +996,197 @@ TEST_F (DecodeParseAPI, ParseOnly_SpecSliceLoss) { · 25 unmodified lines
979996 } //while
980997 }
981998
999+//Test parseonly crash cases
1000+class DecodeParseCrashAPI : public DecodeParseAPI {
1001+ public:
1002+ DecodeParseCrashAPI() {
1003+ }
1004+ void SetUp() {
1005+ DecodeParseAPI::SetUp();
1006+ iWidth_ = 1280;
1007+ iHeight_ = 720;
1008+
1009+ ucBuf_ = NULL;
1010+ ucBuf_ = new unsigned char[1000000];
1011+ ASSERT_TRUE (ucBuf_ != NULL);
1012+
1013+ }
1014+ void TearDown() {
1015+ DecodeParseAPI::TearDown();
1016+ if (NULL != ucBuf_) {
1017+ delete[] ucBuf_;
1018+ ucBuf_ = NULL;
1019+ }
1020+ ASSERT_TRUE (ucBuf_ == NULL);
1021+ }
1022+
1023+ protected:
1024+ unsigned char* ucBuf_;
1025+};
1026+
1027+//#define DEBUG_FILE_SAVE_PARSE_CRA1
1028+TEST_F (DecodeParseCrashAPI, ParseOnlyCrash_General) {
1029+ if (fYuv_)
1030+ fclose (fYuv_);
1031+ const char* sFileName = "res/Cisco_Absolute_Power_1280x720_30fps.yuv";
1032+#if defined(ANDROID_NDK)
1033+ std::string filename = std::string ("/sdcard/") + sFileName;
1034+ ASSERT_TRUE ((fYuv_ = fopen (filename.c_str(), "rb")) != NULL);
1035+#else
1036+ ASSERT_TRUE ((fYuv_ = fopen (sFileName, "rb")) != NULL);
1037+#endif
1038+ uint32_t uiGet;
1039+ encoder_->Uninitialize();
1040+ //do tests until crash
1041+ unsigned int uiLoopRound = 0;
1042+ unsigned char* pucBuf = ucBuf_;
1043+ int iDecAuSize;
1044+#ifdef DEBUG_FILE_SAVE_PARSE_CRA1
1045+ //open file to save tested BS
1046+ FILE* fDataFile = fopen ("test_parseonly_crash.264", "wb");
1047+ FILE* fLenFile = fopen ("test_parseonly_crash_len.log", "w");
1048+ int iFileSize = 0;
1049+#endif
1050+
1051+ do {
1052+#ifdef DEBUG_FILE_SAVE_PARSE_CRA1
1053+ int iTotalFrameNum = (rand() % 1200) + 1;
1054+#else
1055+ int iTotalFrameNum = (rand() % 100) + 1;
1056+#endif
1057+ EncodeDecodeParamBase p = kParamArray[8]; //720p by default
1058+
1059+ //Initialize Encoder
1060+ prepareParam (1, 4, p.width, p.height, p.frameRate, &param_);
1061+ param_.iRCMode = RC_TIMESTAMP_MODE;
1062+ param_.iTargetBitrate = p.iTarBitrate;
1063+ param_.uiIntraPeriod = 0;
1064+ param_.eSpsPpsIdStrategy = CONSTANT_ID;
1065+ param_.bEnableBackgroundDetection = true;
1066+ param_.bEnableSceneChangeDetect = (rand() % 3) ? true : false;
1067+ param_.bPrefixNalAddingCtrl = 0;// (rand() % 2) ? true : false;
1068+ param_.iEntropyCodingModeFlag = 0;
1069+ param_.bEnableFrameSkip = true;
1070+ param_.iMultipleThreadIdc = 0;
1071+ param_.sSpatialLayers[0].iSpatialBitrate = p.iTarBitrate;
1072+ param_.sSpatialLayers[0].iMaxSpatialBitrate = p.iTarBitrate << 1;
1073+ param_.sSpatialLayers[0].sSliceArgument.uiSliceMode =
1074+ SM_FIXEDSLCNUM_SLICE; // (rand() % 2) ? SM_SIZELIMITED_SLICE : SM_SINGLE_SLICE;
1075+ if (param_.sSpatialLayers[0].sSliceArgument.uiSliceMode == SM_SIZELIMITED_SLICE) {
1076+ param_.sSpatialLayers[0].sSliceArgument.uiSliceSizeConstraint = 1400;
1077+ param_.uiMaxNalSize = 1400;
1078+ } else {
1079+ param_.sSpatialLayers[0].sSliceArgument.uiSliceSizeConstraint = 0;
1080+ param_.uiMaxNalSize = 0;
1081+ }
1082+
1083+ int rv = encoder_->InitializeExt (&param_);
1084+ ASSERT_TRUE (rv == cmResultSuccess);
1085+ decoder_->GetOption (DECODER_OPTION_ERROR_CON_IDC, &uiGet);
1086+ EXPECT_EQ (uiGet, (uint32_t)ERROR_CON_DISABLE); //default value should be ERROR_CON_SLICE_COPY
1087+ int32_t iTraceLevel = WELS_LOG_QUIET;
1088+ encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
1089+ decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
1090+
1091+ //Start for enc/dec
1092+ int iIdx = 0;
1093+ unsigned char* pData[3] = { NULL };
1094+
1095+ EncodeDecodeFileParamBase pInput; //to conform with old functions
1096+ pInput.width = p.width;
1097+ pInput.height = p.height;
1098+ pInput.frameRate = p.frameRate;
1099+ prepareEncDecParam (pInput);
1100+ while (iIdx++ < iTotalFrameNum) { // loop in frame
1101+ EncodeOneFrame (1);
1102+#ifdef DEBUG_FILE_SAVE_PARSE_CRA1
1103+ //reset file if file size large
1104+ if ((info.eFrameType == videoFrameTypeIDR) && (iFileSize >= (1 << 25))) {
1105+ fclose (fDataFile);
1106+ fclose (fLenFile);
1107+ fDataFile = fopen ("test_parseonly_crash.264", "wb");
1108+ fLenFile = fopen ("test_parseonly_crash_len.log", "w");
1109+ iFileSize = 0;
1110+ decoder_->Uninitialize();
1111+
1112+ SDecodingParam decParam;
1113+ memset (&decParam, 0, sizeof (SDecodingParam));
1114+ decParam.uiTargetDqLayer = UCHAR_MAX;
1115+ decParam.eEcActiveIdc = ERROR_CON_DISABLE;
1116+ decParam.bParseOnly = true;
1117+ decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
1118+
1119+ rv = decoder_->Initialize (&decParam);
1120+ ASSERT_EQ (0, rv);
1121+ }
1122+#endif
1123+ if (info.eFrameType == videoFrameTypeSkip)
1124+ continue;
1125+ //deal with packets
1126+ unsigned char* pBsBuf;
1127+ iDecAuSize = 0;
1128+ pucBuf = ucBuf_; //init buf start pos for decoder usage
1129+ for (int iLayerNum = 0; iLayerNum < info.iLayerNum; iLayerNum++) {
1130+ SLayerBSInfo* pLayerBsInfo = &info.sLayerInfo[iLayerNum];
1131+ pBsBuf = info.sLayerInfo[iLayerNum].pBsBuf;
1132+ int iTotalNalCnt = pLayerBsInfo->iNalCount;
1133+ for (int iNalCnt = 0; iNalCnt < iTotalNalCnt; iNalCnt++) { //loop in NAL
1134+ int iPacketSize = pLayerBsInfo->pNalLengthInByte[iNalCnt];
1135+ //packet loss
1136+ int iLossRateRange = (uiLoopRound % 20) + 1; //1-100
1137+ int iLossRate = (rand() % iLossRateRange);
1138+ bool bPacketLost = (rand() % 101) > (100 -
1139+ iLossRate); // [0, (100-iLossRate)] indicates NO LOSS, (100-iLossRate, 100] indicates LOSS
1140+ if (!bPacketLost) { //no loss
1141+ memcpy (pucBuf, pBsBuf, iPacketSize);
1142+ pucBuf += iPacketSize;
1143+ iDecAuSize += iPacketSize;
1144+ }
1145+ //update bs info
1146+ pBsBuf += iPacketSize;
1147+ } //nal
1148+ } //layer
1149+
1150+#ifdef DEBUG_FILE_SAVE_PARSE_CRA1
1151+ //save to file
1152+ if (iDecAuSize != 0) {
1153+ fwrite (ucBuf_, 1, iDecAuSize, fDataFile);
1154+ fflush (fDataFile);
1155+ iFileSize += iDecAuSize;
1156+ }
1157+
1158+ //save to len file
1159+ unsigned long ulTmp[4];
1160+ ulTmp[0] = ulTmp[1] = ulTmp[2] = iIdx;
1161+ ulTmp[3] = iDecAuSize;
1162+ fwrite (ulTmp, sizeof (unsigned long), 4, fLenFile); // index, timeStamp, data size
1163+ fflush (fLenFile);
1164+#endif
1165+
1166+ //decode
1167+ pData[0] = pData[1] = pData[2] = 0;
1168+ memset (&BsInfo_, 0, sizeof (SParserBsInfo));
1169+
1170+ rv = decoder_->DecodeParser (ucBuf_, iDecAuSize, &BsInfo_);
1171+ rv = decoder_->DecodeParser (NULL, 0, &BsInfo_); //reconstruction
1172+ //guarantee decoder EC status
1173+ decoder_->GetOption (DECODER_OPTION_ERROR_CON_IDC, &uiGet);
1174+ EXPECT_EQ (uiGet, (uint32_t)ERROR_CON_DISABLE);
1175+ } //frame
1176+ uiLoopRound++;
1177+ if (uiLoopRound >= (1 << 30))
1178+ uiLoopRound = 0;
1179+#ifdef DEBUG_FILE_SAVE_PARSE_CRA1
1180+ if (uiLoopRound % 10 == 0)
1181+ printf ("run %d times.\n", uiLoopRound);
1182+ } while (1);
1183+ fclose (fDataFile);
1184+ fclose (fLenFile);
1185+#else
1186+ }
1187+ while (0);
1188+#endif
1189+
1190+}
9821191
9831192

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t