• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <gtest/gtest.h>
2 #include "codec_def.h"
3 #include "utils/BufferedData.h"
4 #include "utils/FileInputStream.h"
5 #include "BaseDecoderTest.h"
6 #include "BaseEncoderTest.h"
7 #include "wels_common_defs.h"
8 #include "utils/HashFunctions.h"
9 #include <string>
10 #include <vector>
11 #include "encode_decode_api_test.h"
12 using namespace WelsCommon;
13 
14 
15 TEST_F (EncodeDecodeTestAPI, LogEncoding) {
16 #define DEBUG_FILE_SAVE
17   //FillInit
18   //int iSpatialLayerNum = $SPATIAL_NUM;
19   //int iWidth       = $SOURCE_WIDTH;
20   //int iHeight      = $SOURCE_HEIGHT;
21   //int iEncFrameNum = $TOTAL_FRMS;
22 
23   //FillFirstParam
24   int iTraceLevel = WELS_LOG_INFO;
25   int rv = encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
26   rv = encoder_->InitializeExt (&param_);
27   EXPECT_TRUE (rv == cmResultSuccess);
28 
29   unsigned char*  pBsBuf[MAX_SPATIAL_LAYER_NUM];
30   int aLen[MAX_SPATIAL_LAYER_NUM] = {0};
31   ISVCDecoder* decoder[MAX_SPATIAL_LAYER_NUM];
32 
33 #ifdef DEBUG_FILE_SAVE
34   FILE* fEnc[MAX_SPATIAL_LAYER_NUM];
35   fEnc[0] = fopen ("enc0.264", "wb");
36   fEnc[1] = fopen ("enc1.264", "wb");
37   fEnc[2] = fopen ("enc2.264", "wb");
38   fEnc[3] = fopen ("enc3.264", "wb");
39 #endif
40 
41   int iIdx = 0;
42 
43   //create decoder
44   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
45     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
46     EXPECT_TRUE (pBsBuf[iIdx] != NULL);
47     aLen[iIdx] = 0;
48 
49     long rv = WelsCreateDecoder (&decoder[iIdx]);
50     EXPECT_TRUE (0 == rv);
51     EXPECT_TRUE (decoder[iIdx] != NULL);
52 
53     SDecodingParam decParam;
54     memset (&decParam, 0, sizeof (SDecodingParam));
55     decParam.uiTargetDqLayer = UCHAR_MAX;
56     decParam.eEcActiveIdc = ERROR_CON_SLICE_COPY;
57     decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
58 
59     rv = decoder[iIdx]->Initialize (&decParam);
60     EXPECT_TRUE (0 == rv);
61   }
62 
63 
64   for (int iFrame = 0; iFrame < iEncFrameNum; iFrame++) {
65     int iResult;
66     int iLayerLen = 0;
67     unsigned char* pData[3] = { NULL };
68 
69 	if (iFrame % 10 == 0) {
70 		printf("current iFrame=%d\n", iFrame);
71 	}
72 
73     //FillParam
74 
75     ASSERT_TRUE (InitialEncDec (param_.iPicWidth, param_.iPicHeight));
76     rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &param_);
77     ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed pParam: rv = " << rv;
78     EncodeOneFrame (0);
79 
80     // init
81     for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
82       aLen[iIdx] = 0;
83     }
84     for (int iLayer = 0; iLayer < info.iLayerNum; ++iLayer) {
85       iLayerLen = 0;
86       const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayer];
87       const int kiFirstNalType = ((* (layerInfo.pBsBuf + 4)) & 0x1f);
88       if (param_.bSimulcastAVC) {
89         ASSERT_TRUE ((kiFirstNalType == NAL_SPS) || (kiFirstNalType == NAL_PPS) || (kiFirstNalType == NAL_SLICE)
90                      || (kiFirstNalType == NAL_SLICE_IDR) || (kiFirstNalType == NAL_SEI));
91       }
92       for (int iNal = 0; iNal < layerInfo.iNalCount; ++iNal) {
93         iLayerLen += layerInfo.pNalLengthInByte[iNal];
94       }
95 
96       if (param_.bSimulcastAVC) {
97         iIdx = layerInfo.uiSpatialId;
98         EXPECT_TRUE (iIdx < iSpatialLayerNum);
99         memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
100         aLen[iIdx] += iLayerLen;
101       } else {
102         if (layerInfo.uiLayerType == NON_VIDEO_CODING_LAYER) {
103           // under SimulcastSVC, need to copy non-VCL to all layers
104           for (iIdx = 0; iIdx < param_.iSpatialLayerNum; iIdx++) {
105             memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
106             aLen[iIdx] += iLayerLen;
107           }
108         } else {
109           iIdx = layerInfo.uiSpatialId;
110           EXPECT_TRUE (iIdx < iSpatialLayerNum);
111           memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
112           aLen[iIdx] += iLayerLen;
113         }
114       }
115     }
116 
117     for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
118       pData[0] = pData[1] = pData[2] = 0;
119       memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
120 
121       if (aLen[iIdx] > 0) {
122 #ifdef DEBUG_FILE_SAVE
123         fwrite (pBsBuf[iIdx], aLen[iIdx], 1, fEnc[iIdx]);
124 #endif
125         iResult = decoder[iIdx]->DecodeFrame2 (pBsBuf[iIdx], aLen[iIdx], pData, &dstBufInfo_);
126         EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << " iFrame = " << iFrame << " LayerIdx=" << iIdx;
127 
128         iResult = decoder[iIdx]->DecodeFrame2 (NULL, 0, pData, &dstBufInfo_);
129         EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << " iFrame = " << iFrame << " LayerIdx=" << iIdx;
130         EXPECT_EQ (dstBufInfo_.iBufferStatus, 1) << "LayerIdx=" << iIdx << " LayerLen=" << aLen[iIdx] << " iFrame = " << iFrame;
131       }
132     }
133   }
134 
135 
136   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
137     free (pBsBuf[iIdx]);
138 
139     if (decoder[iIdx] != NULL) {
140       decoder[iIdx]->Uninitialize();
141       WelsDestroyDecoder (decoder[iIdx]);
142     }
143   }
144 #ifdef DEBUG_FILE_SAVE
145   for (int i = 0; i < MAX_SPATIAL_LAYER_NUM; i++) {
146     fclose (fEnc[i]);
147   }
148 #endif
149 }
150