History

Merge pull request #1756 from sijchen/savc4

[Encoder] Implementation of bSimulcastAVC and UT

ruil2 committed 11 years ago

Commit 1b48e6c2 parents f404ce2 deccd1e3 files · +416 −69Browse files

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

Unified · Split

test/api/encode_decode_api_test.cpp+222−0
@@ -3020,3 +3020,225 @@ TEST_F (EncodeDecodeTestAPI, ParameterSetStrategy_SPS_PPS_LISTING3) { · 3019 unmodified lines
3020#endif3020#endif
3021}3021}
3022 3022
3023
3024TEST_F (EncodeDecodeTestAPI, SimulcastSVC) {
3025#define LAYER_NUM (4)
3026 int iSpatialLayerNum = WelsClip3 ((rand() % LAYER_NUM), 2, LAYER_NUM);;
3027 int iWidth = WelsClip3 ((((rand() % MAX_WIDTH) >> 1) + 1) << 1, 1 << iSpatialLayerNum, MAX_WIDTH);
3028 int iHeight = WelsClip3 ((((rand() % MAX_HEIGHT) >> 1) + 1) << 1, 1 << iSpatialLayerNum, MAX_HEIGHT);
3029 float fFrameRate = rand() + 0.5f;
3030 int iEncFrameNum = WelsClip3 ((rand() % ENCODE_FRAME_NUM) + 1, 1, ENCODE_FRAME_NUM);
3031 int iSliceNum = 1;
3032 encoder_->GetDefaultParams (&param_);
3033 prepareParam (iSpatialLayerNum, iSliceNum, iWidth, iHeight, fFrameRate, &param_);
3034
3035 int rv = encoder_->InitializeExt (&param_);
3036 ASSERT_TRUE (rv == cmResultSuccess);
3037
3038 unsigned char* pBsBuf[LAYER_NUM];
3039 int aLen[LAYER_NUM] = {0};
3040 ISVCDecoder* decoder[LAYER_NUM];
3041
3042#ifdef DEBUG_FILE_SAVE2
3043 FILE* fEnc[LAYER_NUM] = { NULL };
3044 fEnc[0] = fopen ("enc0.264", "wb");
3045 fEnc[1] = fopen ("enc1.264", "wb");
3046 fEnc[2] = fopen ("enc2.264", "wb");
3047 fEnc[3] = fopen ("enc3.264", "wb");
3048#endif
3049
3050 // init decoders
3051 int iIdx = 0;
3052 for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3053 pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
3054 aLen[iIdx] = 0;
3055
3056 long rv = WelsCreateDecoder (&decoder[iIdx]);
3057 ASSERT_EQ (0, rv);
3058 ASSERT_TRUE (decoder[iIdx] != NULL);
3059
3060 SDecodingParam decParam;
3061 memset (&decParam, 0, sizeof (SDecodingParam));
3062 decParam.eOutputColorFormat = videoFormatI420;
3063 decParam.uiTargetDqLayer = UCHAR_MAX;
3064 decParam.eEcActiveIdc = ERROR_CON_SLICE_COPY;
3065 decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
3066
3067 rv = decoder[iIdx]->Initialize (&decParam);
3068 ASSERT_EQ (0, rv);
3069 }
3070
3071 for (int iFrame = 0; iFrame < iEncFrameNum; iFrame++) {
3072 int iResult;
3073 int iLayerLen = 0;
3074 unsigned char* pData[3] = { NULL };
3075
3076 InitialEncDec (param_.iPicWidth, param_.iPicHeight);
3077 EncodeOneFrame (0);
3078
3079 iLayerLen = 0;
3080 for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3081 aLen[iIdx] = 0;
3082 }
3083 for (int iLayer = 0; iLayer < info.iLayerNum; ++iLayer) {
3084 iLayerLen = 0;
3085 const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayer];
3086 for (int iNal = 0; iNal < layerInfo.iNalCount; ++iNal) {
3087 iLayerLen += layerInfo.pNalLengthInByte[iNal];
3088 }
3089
3090 if (layerInfo.uiLayerType == NON_VIDEO_CODING_LAYER) {
3091 // under SimulcastSVC, need to copy non-VCL to all layers
3092 for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3093 memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
3094 aLen[iIdx] += iLayerLen;
3095 }
3096 } else {
3097 iIdx = layerInfo.uiSpatialId;
3098 EXPECT_TRUE (iIdx < iSpatialLayerNum);
3099 memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
3100 aLen[iIdx] += iLayerLen;
3101 }
3102 }
3103
3104 for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3105 pData[0] = pData[1] = pData[2] = 0;
3106 memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
3107
3108#ifdef DEBUG_FILE_SAVE2
3109 fwrite (pBsBuf[iIdx], aLen[iIdx], 1, fEnc[iIdx]);
3110#endif
3111 iResult = decoder[iIdx]->DecodeFrame2 (pBsBuf[iIdx], aLen[iIdx], pData, &dstBufInfo_);
3112 EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << "LayerIdx=" << iIdx;
3113 iResult = decoder[iIdx]->DecodeFrame2 (NULL, 0, pData, &dstBufInfo_);
3114 EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << "LayerIdx=" << iIdx;
3115 EXPECT_EQ (dstBufInfo_.iBufferStatus, 1) << "LayerIdx=" << iIdx;
3116 }
3117 }
3118
3119 // free all
3120 for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3121 if (pBsBuf[iIdx]) {
3122 free (pBsBuf[iIdx]);
3123 }
3124
3125 if (decoder[iIdx] != NULL) {
3126 decoder[iIdx]->Uninitialize();
3127 WelsDestroyDecoder (decoder[iIdx]);
3128 }
3129
3130#ifdef DEBUG_FILE_SAVE2
3131 fclose (fEnc[iIdx]);
3132#endif
3133 }
3134
3135}
3136
3137TEST_F (EncodeDecodeTestAPI, SimulcastAVC) {
3138//#define DEBUG_FILE_SAVE3
3139#define LAYER_NUM (4)
3140 int iSpatialLayerNum = WelsClip3 ((rand() % LAYER_NUM), 2, LAYER_NUM);;
3141 int iWidth = WelsClip3 ((((rand() % MAX_WIDTH) >> 1) + 1) << 1, 1 << iSpatialLayerNum, MAX_WIDTH);
3142 int iHeight = WelsClip3 ((((rand() % MAX_HEIGHT) >> 1) + 1) << 1, 1 << iSpatialLayerNum, MAX_HEIGHT);
3143 float fFrameRate = rand() + 0.5f;
3144 int iEncFrameNum = WelsClip3 ((rand() % ENCODE_FRAME_NUM) + 1, 1, ENCODE_FRAME_NUM);
3145 int iSliceNum = 1;
3146 encoder_->GetDefaultParams (&param_);
3147 prepareParam (iSpatialLayerNum, iSliceNum, iWidth, iHeight, fFrameRate, &param_);
3148
3149 //set flag of bSimulcastAVC
3150 param_.bSimulcastAVC = true;
3151
3152 int rv = encoder_->InitializeExt (&param_);
3153 ASSERT_TRUE (rv == cmResultSuccess);
3154
3155 unsigned char* pBsBuf[LAYER_NUM];
3156 int aLen[LAYER_NUM] = {0};
3157 ISVCDecoder* decoder[LAYER_NUM];
3158
3159#ifdef DEBUG_FILE_SAVE3
3160 FILE* fEnc[LAYER_NUM];
3161 fEnc[0] = fopen ("enc0.264", "wb");
3162 fEnc[1] = fopen ("enc1.264", "wb");
3163 fEnc[2] = fopen ("enc2.264", "wb");
3164 fEnc[3] = fopen ("enc3.264", "wb");
3165#endif
3166
3167 int iIdx = 0;
3168
3169 //create decoder
3170 for (int iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3171 pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
3172 aLen[iIdx] = 0;
3173
3174 long rv = WelsCreateDecoder (&decoder[iIdx]);
3175 ASSERT_EQ (0, rv);
3176 ASSERT_TRUE (decoder[iIdx] != NULL);
3177
3178 SDecodingParam decParam;
3179 memset (&decParam, 0, sizeof (SDecodingParam));
3180 decParam.eOutputColorFormat = videoFormatI420;
3181 decParam.uiTargetDqLayer = UCHAR_MAX;
3182 decParam.eEcActiveIdc = ERROR_CON_SLICE_COPY;
3183 decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
3184
3185 rv = decoder[iIdx]->Initialize (&decParam);
3186 ASSERT_EQ (0, rv);
3187 }
3188
3189 iEncFrameNum = 1;
3190 for (int iFrame = 0; iFrame < iEncFrameNum; iFrame++) {
3191 int iResult;
3192 int iLayerLen = 0;
3193 unsigned char* pData[3] = { NULL };
3194
3195 InitialEncDec (param_.iPicWidth, param_.iPicHeight);
3196 EncodeOneFrame (0);
3197
3198 // init
3199 for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3200 aLen[iIdx] = 0;
3201 }
3202 for (int iLayer = 0; iLayer < info.iLayerNum; ++iLayer) {
3203 iLayerLen = 0;
3204 const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayer];
3205 for (int iNal = 0; iNal < layerInfo.iNalCount; ++iNal) {
3206 iLayerLen += layerInfo.pNalLengthInByte[iNal];
3207 }
3208
3209 iIdx = layerInfo.uiSpatialId;
3210 EXPECT_TRUE (iIdx < iSpatialLayerNum);
3211 memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
3212 aLen[iIdx] += iLayerLen;
3213 }
3214
3215 for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3216 pData[0] = pData[1] = pData[2] = 0;
3217 memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
3218
3219#ifdef DEBUG_FILE_SAVE3
3220 fwrite (pBsBuf[iIdx], aLen[iIdx], 1, fEnc[iIdx]);
3221#endif
3222 iResult = decoder[iIdx]->DecodeFrame2 (pBsBuf[iIdx], aLen[iIdx], pData, &dstBufInfo_);
3223 EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << "LayerIdx=" << iIdx;
3224
3225 iResult = decoder[iIdx]->DecodeFrame2 (NULL, 0, pData, &dstBufInfo_);
3226 EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << "LayerIdx=" << iIdx;
3227 EXPECT_EQ (dstBufInfo_.iBufferStatus, 1) << "LayerIdx=" << iIdx;
3228 }
3229
3230 }
3231
3232 for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
3233 free (pBsBuf[iIdx]);
3234
3235 if (decoder[iIdx] != NULL) {
3236 decoder[iIdx]->Uninitialize();
3237 WelsDestroyDecoder (decoder[iIdx]);
3238 }
3239#ifdef DEBUG_FILE_SAVE3
3240 fclose (fEnc[iIdx]);
3241#endif
3242 }
3243}
3244

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