History

fix the missing loadbalancing part

sijchen committed 11 years ago

Commit e508c861 parent beacba78 files · +159 −20Browse files

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

Unified · Split

test/api/encode_decode_api_test.cpp+119−0
@@ -3921,3 +3921,122 @@ TEST_F (EncodeDecodeTestAPI, ThreadNumAndSliceNum) { · 3920 unmodified lines
39213921 }
39223922 }
39233923
3924+
3925+TEST_F (EncodeDecodeTestAPI, TriggerLoadBalancing) {
3926+ int iSpatialLayerNum = 1;
3927+ int iWidth = WelsClip3 ((((rand() % MAX_WIDTH) >> 1) + 1) << 1, (64 << 2), MAX_WIDTH);
3928+ int iHeight = WelsClip3 ((((rand() % MAX_HEIGHT) >> 1) + 1) << 1, (64 << 2),
3929+ 2240);//TODO: use MAX_HEIGHT after the limit is removed
3930+ float fFrameRate = rand() + 0.5f;
3931+ int iEncFrameNum = WelsClip3 ((rand() % ENCODE_FRAME_NUM) + 1, 1, ENCODE_FRAME_NUM);
3932+
3933+ // prepare params
3934+ SEncParamExt sParam;
3935+ encoder_->GetDefaultParams (&sParam);
3936+ prepareParamDefault (iSpatialLayerNum, 1, iWidth, iHeight, fFrameRate, &sParam);
3937+ sParam.iMultipleThreadIdc = (rand() % 8) + 1;
3938+ sParam.bSimulcastAVC = 1;
3939+ sParam.sSpatialLayers[0].iVideoWidth = iWidth;
3940+ sParam.sSpatialLayers[0].iVideoHeight = iHeight;
3941+ sParam.sSpatialLayers[0].sSliceArgument.uiSliceMode = SM_FIXEDSLCNUM_SLICE;
3942+ sParam.sSpatialLayers[0].sSliceArgument.uiSliceNum = sParam.iMultipleThreadIdc;
3943+
3944+ int rv = encoder_->InitializeExt (&sParam);
3945+ ASSERT_TRUE (rv == cmResultSuccess) << "Init Failed sParam: rv = " << rv;;
3946+
3947+ unsigned char* pBsBuf[MAX_SPATIAL_LAYER_NUM];
3948+ ISVCDecoder* decoder[MAX_SPATIAL_LAYER_NUM];
3949+
3950+ int iIdx = 0;
3951+ int aLen[MAX_SPATIAL_LAYER_NUM] = {};
3952+
3953+ //create decoder
3954+ for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3955+ pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
3956+ EXPECT_TRUE (pBsBuf[iIdx] != NULL);
3957+
3958+ long rv = WelsCreateDecoder (&decoder[iIdx]);
3959+ ASSERT_EQ (0, rv);
3960+ EXPECT_TRUE (decoder[iIdx] != NULL);
3961+
3962+ SDecodingParam decParam;
3963+ memset (&decParam, 0, sizeof (SDecodingParam));
3964+ decParam.eOutputColorFormat = videoFormatI420;
3965+ decParam.uiTargetDqLayer = UCHAR_MAX;
3966+ decParam.eEcActiveIdc = ERROR_CON_SLICE_COPY;
3967+ decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
3968+
3969+ rv = decoder[iIdx]->Initialize (&decParam);
3970+ ASSERT_EQ (0, rv);
3971+ }
3972+
3973+ rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam);
3974+ ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed pParam: rv = " << rv;
3975+
3976+ //begin testing
3977+ for (int iFrame = 0; iFrame < iEncFrameNum; iFrame++) {
3978+ int iResult;
3979+ int iLayerLen = 0;
3980+ unsigned char* pData[3] = { NULL };
3981+
3982+ InitialEncDec (sParam.iPicWidth, sParam.iPicHeight);
3983+ int frameSize = EncPic.iPicWidth * EncPic.iPicHeight * 3 / 2;
3984+ memset (buf_.data(), rand() % 256, (frameSize >> 2));
3985+ memset (buf_.data() + (frameSize >> 2), rand() % 256, (frameSize - (frameSize >> 2)));
3986+
3987+ int iStartStrip = 0;
3988+ //during first half the complex strip is at top, then during the second half it is at bottom
3989+ if (iFrame > iEncFrameNum / 2) {
3990+ iStartStrip = EncPic.iPicHeight * EncPic.iPicWidth;
3991+ }
3992+ for (int k = 0; k < (EncPic.iPicHeight / 2); k++) {
3993+ memset (buf_.data() + k * EncPic.iPicWidth + iStartStrip, rand() % 256, (EncPic.iPicWidth));
3994+ }
3995+
3996+ int rv = encoder_->EncodeFrame (&EncPic, &info);
3997+ ASSERT_TRUE (rv == cmResultSuccess);
3998+
3999+ // init
4000+ for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
4001+ aLen[iIdx] = 0;
4002+ }
4003+ for (int iLayer = 0; iLayer < info.iLayerNum; ++iLayer) {
4004+ iLayerLen = 0;
4005+ const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayer];
4006+ for (int iNal = 0; iNal < layerInfo.iNalCount; ++iNal) {
4007+ iLayerLen += layerInfo.pNalLengthInByte[iNal];
4008+ }
4009+
4010+ iIdx = layerInfo.uiSpatialId;
4011+ EXPECT_TRUE (iIdx < iSpatialLayerNum) << "iIdx = " << iIdx << ", iSpatialLayerNum = " << iSpatialLayerNum;
4012+ memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
4013+ aLen[iIdx] += iLayerLen;
4014+ }
4015+
4016+ for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
4017+ pData[0] = pData[1] = pData[2] = 0;
4018+ memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
4019+
4020+#ifdef DEBUG_FILE_SAVE4
4021+ fwrite (pBsBuf[iIdx], aLen[iIdx], 1, fEnc[iIdx]);
4022+#endif
4023+ iResult = decoder[iIdx]->DecodeFrame2 (pBsBuf[iIdx], aLen[iIdx], pData, &dstBufInfo_);
4024+ EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << ", LayerIdx=" << iIdx;
4025+
4026+ iResult = decoder[iIdx]->DecodeFrame2 (NULL, 0, pData, &dstBufInfo_);
4027+ EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << ", LayerIdx=" << iIdx;
4028+ EXPECT_EQ (dstBufInfo_.iBufferStatus, 1) << "LayerIdx=" << iIdx;
4029+ }
4030+ }
4031+
4032+ for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
4033+ free (pBsBuf[iIdx]);
4034+
4035+ if (decoder[iIdx] != NULL) {
4036+ decoder[iIdx]->Uninitialize();
4037+ WelsDestroyDecoder (decoder[iIdx]);
4038+ }
4039+
4040+ }
4041+}
4042+

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