142 lines
4.5 KiB
Plaintext
142 lines
4.5 KiB
Plaintext
#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 rv = encoder_->InitializeExt (¶m_);
|
|
ASSERT_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]);
|
|
ASSERT_EQ (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);
|
|
ASSERT_EQ (0, rv);
|
|
}
|
|
|
|
|
|
for (int iFrame = 0; iFrame < iEncFrameNum; iFrame++) {
|
|
int iResult;
|
|
int iLayerLen = 0;
|
|
unsigned char* pData[3] = { NULL };
|
|
|
|
//FillParam
|
|
|
|
InitialEncDec (param_.iPicWidth, param_.iPicHeight);
|
|
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 < 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 << "LayerIdx=" << iIdx;
|
|
|
|
iResult = decoder[iIdx]->DecodeFrame2 (NULL, 0, pData, &dstBufInfo_);
|
|
EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << "LayerIdx=" << iIdx;
|
|
EXPECT_EQ (dstBufInfo_.iBufferStatus, 1) << "LayerIdx=" << iIdx;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
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
|
|
}
|