#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}
#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
}