History

Set IDR frame independently for simulcast AVC

Karina committed 10 years ago

Commit 61e66851 parent 28db1bc7 files · +175 −102Browse files

Showing the changes to test/encoder/EncUT_EncoderExt.cpp (1 of 7 files). Show all

Unified · Split

test/encoder/EncUT_EncoderExt.cpp+144−85
@@ -636,6 +636,65 @@ TEST_F (EncoderInterfaceTest, BasicInitializeTestAutoAdjustment) { · 635 unmodified lines
636 EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0);636 EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0);
637}637}
638 638
639TEST_F (EncoderInterfaceTest, ForceIntraFrameSimulCastAVC) {
640 SEncParamExt sEncParamExt;
641 pPtrEnc->GetDefaultParams (&sEncParamExt);
642 sEncParamExt.iUsageType = CAMERA_VIDEO_REAL_TIME;
643 int iSpatialLayerNum = rand() % MAX_SPATIAL_LAYER_NUM;
644 sEncParamExt.iSpatialLayerNum = WELS_CLIP3 (iSpatialLayerNum, 1, MAX_SPATIAL_LAYER_NUM);
645
646
647 sEncParamExt.iPicWidth = 1280;
648 sEncParamExt.iPicHeight = 720;
649 sEncParamExt.iTargetBitrate = 0; //!=0
650 sEncParamExt.iRCMode = RC_BITRATE_MODE; //-1, 0, 1, 2
651 sEncParamExt.bEnableFrameSkip = false;
652 sEncParamExt.fMaxFrameRate = 30; //!=0
653 sEncParamExt.bSimulcastAVC = 1;
654
655 for (int iNum = sEncParamExt.iSpatialLayerNum - 1; iNum >= 0 ; iNum--) {
656 int iScale = 1 << ((sEncParamExt.iSpatialLayerNum - 1) - iNum);
657 sEncParamExt.sSpatialLayers[iNum].iVideoWidth = sEncParamExt.iPicWidth / iScale;
658 sEncParamExt.sSpatialLayers[iNum].iVideoHeight = sEncParamExt.iPicHeight / iScale;
659 sEncParamExt.sSpatialLayers[iNum].iSpatialBitrate = (sEncParamExt.sSpatialLayers[iNum].iVideoWidth *
660 sEncParamExt.sSpatialLayers[iNum].iVideoHeight) / 3;
661 sEncParamExt.iTargetBitrate += sEncParamExt.sSpatialLayers[iNum].iSpatialBitrate;
662 }
663// int uiTraceLevel = WELS_LOG_INFO;
664// pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);
665 int iResult = pPtrEnc->InitializeExt (&sEncParamExt);
666 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess)) << "iUsageType = " << sEncParamExt.iUsageType <<
667 ", iPicWidth = " << sEncParamExt.iPicWidth << ", iPicHeight = " << sEncParamExt.iPicHeight << ", iTargetBitrate = " <<
668 sEncParamExt.iTargetBitrate << ", fMaxFrameRate = " << sEncParamExt.fMaxFrameRate;
669
670 int kiFrameNumber = rand() % 100;
671 if (kiFrameNumber < 20)
672 kiFrameNumber = 20;
673 for (int i = 0; i < kiFrameNumber; i ++) {
674 PrepareOneSrcFrame();
675 bool bForceIdr = (i == (kiFrameNumber / 2));
676 int iLayerNum = rand() % MAX_SPATIAL_LAYER_NUM;
677 iLayerNum = WELS_CLIP3 (iSpatialLayerNum, 0, sEncParamExt.iSpatialLayerNum - 1);
678 if (bForceIdr) {
679 pPtrEnc->ForceIntraFrame (true, iLayerNum);
680 }
681
682 iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
683 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
684 if (bForceIdr) {
685 for (int i = 0; i < sFbi.iLayerNum; ++i) {
686 if (sFbi.sLayerInfo[i].uiSpatialId == iLayerNum) {
687 EXPECT_EQ (sFbi.sLayerInfo[i].eFrameType, static_cast<int> (videoFrameTypeIDR));
688 }
689 }
690 }
691 }
692
693 pPtrEnc->Uninitialize();
694 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
695}
696
697
639TEST_F (EncoderInterfaceTest, ForceIntraFrame) {698TEST_F (EncoderInterfaceTest, ForceIntraFrame) {
640 SEncParamBase sEncParamBase;699 SEncParamBase sEncParamBase;
641 GetValidEncParamBase (&sEncParamBase);700 GetValidEncParamBase (&sEncParamBase);
@@ -1057,96 +1116,96 @@ TEST_F (EncoderInterfaceTest, DiffResolutionCheck) { · 415 unmodified lines
1057}1116}
1058 1117
1059TEST_F (EncoderInterfaceTest, NalSizeChecking) {1118TEST_F (EncoderInterfaceTest, NalSizeChecking) {
1060 // int uiTraceLevel = WELS_LOG_DETAIL;1119 // int uiTraceLevel = WELS_LOG_DETAIL;
1061 // pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);1120 // pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);
1062
1063 pParamExt->iPicWidth = 1280;
1064 pParamExt->iPicHeight = 720;
1065 pParamExt->iPicWidth += (rand() << 1) % IMAGE_VARY_SIZE;
1066 pParamExt->iPicHeight += (rand() << 1) % IMAGE_VARY_SIZE;
1067 pParamExt->fMaxFrameRate = 30;
1068 pParamExt->iTemporalLayerNum = rand()%3;
1069 pParamExt->iSpatialLayerNum = rand()%4;
1070 pParamExt->iNumRefFrame = AUTO_REF_PIC_COUNT;
1071 pParamExt->iSpatialLayerNum = WELS_CLIP3(pParamExt->iSpatialLayerNum,1,4);
1072
1073 pParamExt->iMultipleThreadIdc = 1;//multi-thread can't control size. will be fixed.
1074 pParamExt->iEntropyCodingModeFlag = rand()%2;
1075 int iMaxNalSize =rand()%5000;
1076 iMaxNalSize = WELS_CLIP3(iMaxNalSize,1000,5000);
1077 pParamExt->uiMaxNalSize = iMaxNalSize;
1078 for(int i = 0;i<pParamExt->iSpatialLayerNum;i++){
1079 pParamExt->sSpatialLayers[i].sSliceArgument.uiSliceMode = SM_SIZELIMITED_SLICE;
1080 pParamExt->sSpatialLayers[i].sSliceArgument.uiSliceSizeConstraint = iMaxNalSize;
1081 pParamExt->sSpatialLayers[i].iVideoHeight = pParamExt->iPicHeight;
1082 pParamExt->sSpatialLayers[i].iVideoWidth = pParamExt->iPicWidth;
1083 int bitrate = rand()%3000000;
1084 pParamExt->sSpatialLayers[i].iSpatialBitrate = WELS_CLIP3(bitrate,500000,3000000) ;
1085 pParamExt->iTargetBitrate+= pParamExt->sSpatialLayers[i].iSpatialBitrate;
1086 pParamExt->sSpatialLayers[i].fFrameRate = 30;
1087 }
1088 int iResult = pPtrEnc->InitializeExt (pParamExt);
1089 const int kiFrameNumber = TEST_FRAMES;
1090 1121
1091 m_iWidth = pParamExt->iPicWidth;1122 pParamExt->iPicWidth = 1280;
1092 m_iHeight = pParamExt->iPicHeight;1123 pParamExt->iPicHeight = 720;
1093 m_iPicResSize = m_iWidth * m_iHeight * 3 >> 1;1124 pParamExt->iPicWidth += (rand() << 1) % IMAGE_VARY_SIZE;
1094 if(pYUV)1125 pParamExt->iPicHeight += (rand() << 1) % IMAGE_VARY_SIZE;
1095 delete []pYUV;1126 pParamExt->fMaxFrameRate = 30;
1096 pYUV = new unsigned char [m_iPicResSize];1127 pParamExt->iTemporalLayerNum = rand() % 3;
1097 ASSERT_TRUE (pYUV != NULL);1128 pParamExt->iSpatialLayerNum = rand() % 4;
1098 FileInputStream fileStream;1129 pParamExt->iNumRefFrame = AUTO_REF_PIC_COUNT;
1099 ASSERT_TRUE (fileStream.Open ("res/Cisco_Absolute_Power_1280x720_30fps.yuv"));1130 pParamExt->iSpatialLayerNum = WELS_CLIP3 (pParamExt->iSpatialLayerNum, 1, 4);
1100 PrepareOneSrcFrame();1131
1101 for (int i = 0; i < kiFrameNumber; i ++) {1132 pParamExt->iMultipleThreadIdc = 1;//multi-thread can't control size. will be fixed.
1102 if(fileStream.read (pYUV, m_iPicResSize) != m_iPicResSize){1133 pParamExt->iEntropyCodingModeFlag = rand() % 2;
1103 break;1134 int iMaxNalSize = rand() % 5000;
1104 }1135 iMaxNalSize = WELS_CLIP3 (iMaxNalSize, 1000, 5000);
1105 iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);1136 pParamExt->uiMaxNalSize = iMaxNalSize;
1106 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));1137 for (int i = 0; i < pParamExt->iSpatialLayerNum; i++) {
1107 pSrcPic->uiTimeStamp += 30;1138 pParamExt->sSpatialLayers[i].sSliceArgument.uiSliceMode = SM_SIZELIMITED_SLICE;
1108 1139 pParamExt->sSpatialLayers[i].sSliceArgument.uiSliceSizeConstraint = iMaxNalSize;
1109 for (int i = 0; i < sFbi.iLayerNum; ++i) {1140 pParamExt->sSpatialLayers[i].iVideoHeight = pParamExt->iPicHeight;
1110 for (int j = 0; j < sFbi.sLayerInfo[i].iNalCount; ++j) {1141 pParamExt->sSpatialLayers[i].iVideoWidth = pParamExt->iPicWidth;
1111 int length = sFbi.sLayerInfo[i].pNalLengthInByte[j];1142 int bitrate = rand() % 3000000;
1112 EXPECT_LE (length, iMaxNalSize);1143 pParamExt->sSpatialLayers[i].iSpatialBitrate = WELS_CLIP3 (bitrate, 500000, 3000000) ;
1113 }1144 pParamExt->iTargetBitrate += pParamExt->sSpatialLayers[i].iSpatialBitrate;
1114 }1145 pParamExt->sSpatialLayers[i].fFrameRate = 30;
1146 }
1147 int iResult = pPtrEnc->InitializeExt (pParamExt);
1148 const int kiFrameNumber = TEST_FRAMES;
1115 1149
1116 }1150 m_iWidth = pParamExt->iPicWidth;
1117 pParamExt->iPicWidth = 1280;1151 m_iHeight = pParamExt->iPicHeight;
1118 pParamExt->iPicHeight = 720;1152 m_iPicResSize = m_iWidth * m_iHeight * 3 >> 1;
1119 pParamExt->iPicWidth += (rand() << 1) % IMAGE_VARY_SIZE;1153 if (pYUV)
1120 pParamExt->iPicHeight += (rand() << 1) % IMAGE_VARY_SIZE;
1121 m_iWidth = pParamExt->iPicWidth;
1122 m_iHeight = pParamExt->iPicHeight;
1123 m_iPicResSize = m_iWidth * m_iHeight * 3 >> 1;
1124 delete []pYUV;1154 delete []pYUV;
1125 pYUV = new unsigned char [m_iPicResSize];1155 pYUV = new unsigned char [m_iPicResSize];
1126 ASSERT_TRUE (pYUV != NULL);1156 ASSERT_TRUE (pYUV != NULL);
1127 iResult = pPtrEnc->InitializeExt (pParamExt);1157 FileInputStream fileStream;
1128 PrepareOneSrcFrame();1158 ASSERT_TRUE (fileStream.Open ("res/Cisco_Absolute_Power_1280x720_30fps.yuv"));
1129 1159 PrepareOneSrcFrame();
1130 ENCODER_OPTION eOptionId = ENCODER_OPTION_SVC_ENCODE_PARAM_EXT;1160 for (int i = 0; i < kiFrameNumber; i ++) {
1131 memcpy (pOption, pParamExt, sizeof (SEncParamExt));1161 if (fileStream.read (pYUV, m_iPicResSize) != m_iPicResSize) {
1132 pOption ->iPicWidth = m_iWidth;1162 break;
1133 pOption ->iPicHeight = m_iHeight;1163 }
1134 iResult = pPtrEnc->SetOption (eOptionId, pOption);1164 iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
1135 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));1165 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
1166 pSrcPic->uiTimeStamp += 30;
1136 1167
1137 for (int i = 0; i < kiFrameNumber; i ++) {1168 for (int i = 0; i < sFbi.iLayerNum; ++i) {
1138 PrepareOneSrcFrame();1169 for (int j = 0; j < sFbi.sLayerInfo[i].iNalCount; ++j) {
1139 iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);1170 int length = sFbi.sLayerInfo[i].pNalLengthInByte[j];
1140 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));1171 EXPECT_LE (length, iMaxNalSize);
1141 pSrcPic->uiTimeStamp += 30;1172 }
1142
1143 for (int i = 0; i < sFbi.iLayerNum; ++i) {
1144 for (int j = 0; j < sFbi.sLayerInfo[i].iNalCount; ++j) {
1145 int length = sFbi.sLayerInfo[i].pNalLengthInByte[j];
1146 EXPECT_LE (length, iMaxNalSize);
1147 }
1148 }
1149 }1173 }
1150 iResult = pPtrEnc->Uninitialize();1174
1175 }
1176 pParamExt->iPicWidth = 1280;
1177 pParamExt->iPicHeight = 720;
1178 pParamExt->iPicWidth += (rand() << 1) % IMAGE_VARY_SIZE;
1179 pParamExt->iPicHeight += (rand() << 1) % IMAGE_VARY_SIZE;
1180 m_iWidth = pParamExt->iPicWidth;
1181 m_iHeight = pParamExt->iPicHeight;
1182 m_iPicResSize = m_iWidth * m_iHeight * 3 >> 1;
1183 delete []pYUV;
1184 pYUV = new unsigned char [m_iPicResSize];
1185 ASSERT_TRUE (pYUV != NULL);
1186 iResult = pPtrEnc->InitializeExt (pParamExt);
1187 PrepareOneSrcFrame();
1188
1189 ENCODER_OPTION eOptionId = ENCODER_OPTION_SVC_ENCODE_PARAM_EXT;
1190 memcpy (pOption, pParamExt, sizeof (SEncParamExt));
1191 pOption ->iPicWidth = m_iWidth;
1192 pOption ->iPicHeight = m_iHeight;
1193 iResult = pPtrEnc->SetOption (eOptionId, pOption);
1194 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
1195
1196 for (int i = 0; i < kiFrameNumber; i ++) {
1197 PrepareOneSrcFrame();
1198 iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
1151 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));1199 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
1200 pSrcPic->uiTimeStamp += 30;
1201
1202 for (int i = 0; i < sFbi.iLayerNum; ++i) {
1203 for (int j = 0; j < sFbi.sLayerInfo[i].iNalCount; ++j) {
1204 int length = sFbi.sLayerInfo[i].pNalLengthInByte[j];
1205 EXPECT_LE (length, iMaxNalSize);
1206 }
1207 }
1208 }
1209 iResult = pPtrEnc->Uninitialize();
1210 EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
1152}1211}

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