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
3921 }3921 }
3922}3922}
3923 3923
3924
3925TEST_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