| #include <gtest/gtest.h> |
| #include "codec_def.h" |
| #include "utils/BufferedData.h" |
| #include "utils/FileInputStream.h" |
| #include "BaseDecoderTest.h" |
| #include "BaseEncoderTest.h" |
| #include "wels_common_defs.h" |
| #include "utils/HashFunctions.h" |
| #include <string> |
| #include <vector> |
| #include "encode_decode_api_test.h" |
| using namespace WelsCommon; |
| |
| |
| TEST_F (EncodeDecodeTestAPI, LogEncoding) { |
| #define DEBUG_FILE_SAVE |
| //FillInit |
| //int iSpatialLayerNum = $SPATIAL_NUM; |
| //int iWidth = $SOURCE_WIDTH; |
| //int iHeight = $SOURCE_HEIGHT; |
| //int iEncFrameNum = $TOTAL_FRMS; |
| |
| //FillFirstParam |
| int iTraceLevel = WELS_LOG_INFO; |
| int rv = encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel); |
| rv = encoder_->InitializeExt (¶m_); |
| EXPECT_TRUE (rv == cmResultSuccess); |
| |
| unsigned char* pBsBuf[MAX_SPATIAL_LAYER_NUM]; |
| int aLen[MAX_SPATIAL_LAYER_NUM] = {0}; |
| ISVCDecoder* decoder[MAX_SPATIAL_LAYER_NUM]; |
| |
| #ifdef DEBUG_FILE_SAVE |
| FILE* fEnc[MAX_SPATIAL_LAYER_NUM]; |
| fEnc[0] = fopen ("enc0.264", "wb"); |
| fEnc[1] = fopen ("enc1.264", "wb"); |
| fEnc[2] = fopen ("enc2.264", "wb"); |
| fEnc[3] = fopen ("enc3.264", "wb"); |
| #endif |
| |
| int iIdx = 0; |
| |
| //create decoder |
| for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) { |
| pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2)); |
| EXPECT_TRUE (pBsBuf[iIdx] != NULL); |
| aLen[iIdx] = 0; |
| |
| long rv = WelsCreateDecoder (&decoder[iIdx]); |
| EXPECT_TRUE (0 == rv); |
| EXPECT_TRUE (decoder[iIdx] != NULL); |
| |
| SDecodingParam decParam; |
| memset (&decParam, 0, sizeof (SDecodingParam)); |
| decParam.uiTargetDqLayer = UCHAR_MAX; |
| decParam.eEcActiveIdc = ERROR_CON_SLICE_COPY; |
| decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT; |
| |
| rv = decoder[iIdx]->Initialize (&decParam); |
| EXPECT_TRUE (0 == rv); |
| } |
| |
| |
| for (int iFrame = 0; iFrame < iEncFrameNum; iFrame++) { |
| int iResult; |
| int iLayerLen = 0; |
| unsigned char* pData[3] = { NULL }; |
| |
| if (iFrame % 10 == 0) { |
| printf("current iFrame=%d\n", iFrame); |
| } |
| |
| //FillParam |
| |
| ASSERT_TRUE (InitialEncDec (param_.iPicWidth, param_.iPicHeight)); |
| rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, ¶m_); |
| ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed pParam: rv = " << rv; |
| EncodeOneFrame (0); |
| |
| // init |
| for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) { |
| aLen[iIdx] = 0; |
| } |
| for (int iLayer = 0; iLayer < info.iLayerNum; ++iLayer) { |
| iLayerLen = 0; |
| const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayer]; |
| const int kiFirstNalType = ((* (layerInfo.pBsBuf + 4)) & 0x1f); |
| if (param_.bSimulcastAVC) { |
| ASSERT_TRUE ((kiFirstNalType == NAL_SPS) || (kiFirstNalType == NAL_PPS) || (kiFirstNalType == NAL_SLICE) |
| || (kiFirstNalType == NAL_SLICE_IDR) || (kiFirstNalType == NAL_SEI)); |
| } |
| for (int iNal = 0; iNal < layerInfo.iNalCount; ++iNal) { |
| iLayerLen += layerInfo.pNalLengthInByte[iNal]; |
| } |
| |
| if (param_.bSimulcastAVC) { |
| iIdx = layerInfo.uiSpatialId; |
| EXPECT_TRUE (iIdx < iSpatialLayerNum); |
| memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char)); |
| aLen[iIdx] += iLayerLen; |
| } else { |
| if (layerInfo.uiLayerType == NON_VIDEO_CODING_LAYER) { |
| // under SimulcastSVC, need to copy non-VCL to all layers |
| for (iIdx = 0; iIdx < param_.iSpatialLayerNum; iIdx++) { |
| memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char)); |
| aLen[iIdx] += iLayerLen; |
| } |
| } else { |
| iIdx = layerInfo.uiSpatialId; |
| EXPECT_TRUE (iIdx < iSpatialLayerNum); |
| memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char)); |
| aLen[iIdx] += iLayerLen; |
| } |
| } |
| } |
| |
| for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) { |
| pData[0] = pData[1] = pData[2] = 0; |
| memset (&dstBufInfo_, 0, sizeof (SBufferInfo)); |
| |
| if (aLen[iIdx] > 0) { |
| #ifdef DEBUG_FILE_SAVE |
| fwrite (pBsBuf[iIdx], aLen[iIdx], 1, fEnc[iIdx]); |
| #endif |
| iResult = decoder[iIdx]->DecodeFrame2 (pBsBuf[iIdx], aLen[iIdx], pData, &dstBufInfo_); |
| EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << " iFrame = " << iFrame << " LayerIdx=" << iIdx; |
| |
| iResult = decoder[iIdx]->DecodeFrame2 (NULL, 0, pData, &dstBufInfo_); |
| EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << " iFrame = " << iFrame << " LayerIdx=" << iIdx; |
| EXPECT_EQ (dstBufInfo_.iBufferStatus, 1) << "LayerIdx=" << iIdx << " LayerLen=" << aLen[iIdx] << " iFrame = " << iFrame; |
| } |
| } |
| } |
| |
| |
| for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) { |
| free (pBsBuf[iIdx]); |
| |
| if (decoder[iIdx] != NULL) { |
| decoder[iIdx]->Uninitialize(); |
| WelsDestroyDecoder (decoder[iIdx]); |
| } |
| } |
| #ifdef DEBUG_FILE_SAVE |
| for (int i = 0; i < MAX_SPATIAL_LAYER_NUM; i++) { |
| fclose (fEnc[i]); |
| } |
| #endif |
| } |