#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 <string>#include <vector>using namespace WelsCommon; //TODO: some content here in this file is the same with encode_decode_api_test.cpp//plan to combine them after some on-going code reviews in that file to avoid merging conflict #define TRY_TIME_RANGE (10)#define ENCODE_FRAME_NUM (30)#define LEVEL_ID_RANGE (18)#define MAX_WIDTH (4096)#define MAX_HEIGHT (2304)#define MAX_FRAME_RATE (30)#define MIN_FRAME_RATE (1)#define FRAME_RATE_RANGE (2*MAX_FRAME_RATE)#define RC_MODE_RANGE (4)#define BIT_RATE_RANGE (10000)#define MAX_QP (51)#define MIN_QP (0)#define QP_RANGE (2*MAX_QP)#define SPATIAL_LAYER_NUM_RANGE (2*MAX_SPATIAL_LAYER_NUM)#define TEMPORAL_LAYER_NUM_RANGE (2*MAX_TEMPORAL_LAYER_NUM)#define SAVED_NALUNIT_NUM ( (MAX_SPATIAL_LAYER_NUM*MAX_QUALITY_LAYER_NUM) + 1 + MAX_SPATIAL_LAYER_NUM )#define MAX_SLICES_NUM ( ( MAX_NAL_UNITS_IN_LAYER - SAVED_NALUNIT_NUM ) / 3 )#define SLICE_MODE_NUM (SM_RESERVED)#define LOOP_FILTER_IDC_NUM (3)#define LOOF_FILTER_OFFSET_RANGE (6)#define MAX_REF_PIC_COUNT (16)#define MIN_REF_PIC_COUNT (1)#define LONG_TERM_REF_NUM (2)#define LONG_TERM_REF_NUM_SCREEN (4)#define MAX_REFERENCE_PICTURE_COUNT_NUM_CAMERA (6)#define MAX_REFERENCE_PICTURE_COUNT_NUM_SCREEN (8)#define VALID_SIZE(iSize) (((iSize)>16)?(iSize):16)#define GET_MB_WIDTH(x) (((x) + 15)/16) typedef struct SLost_Sim { WelsCommon::EWelsNalUnitType eNalType; bool isLost;} SLostSim; struct EncodeDecodeFileParamBase { int numframes; int width; int height; float frameRate; int slicenum; bool bLostPara; const char* pLossSequence;}; static void welsStderrTraceOrigin (void* ctx, int level, const char* string) { fprintf (stderr, "%s\n", string);} typedef struct STrace_Unit { int iTarLevel;} STraceUnit; class EncodeDecodeTestBase : public BaseEncoderTest, public BaseDecoderTest { public: uint8_t iRandValue; public: virtual void SetUp() { BaseEncoderTest::SetUp(); BaseDecoderTest::SetUp(); pFunc = welsStderrTraceOrigin; pTraceInfo = NULL; encoder_->SetOption (ENCODER_OPTION_TRACE_CALLBACK, &pFunc); encoder_->SetOption (ENCODER_OPTION_TRACE_CALLBACK_CONTEXT, &pTraceInfo); decoder_->SetOption (DECODER_OPTION_TRACE_CALLBACK, &pFunc); decoder_->SetOption (DECODER_OPTION_TRACE_CALLBACK_CONTEXT, &pTraceInfo); } virtual void TearDown() { BaseEncoderTest::TearDown(); BaseDecoderTest::TearDown(); } virtual void prepareParam (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam); virtual bool prepareEncDecParam (const EncodeDecodeFileParamBase EncDecFileParam); virtual void encToDecData (const SFrameBSInfo& info, int& len); virtual void encToDecSliceData (const int iLayerNum, const int iSliceNum, const SFrameBSInfo& info, int& len); virtual int GetRandWidth() { return WelsClip3 ((((rand() % MAX_WIDTH) >> 1) + 1) << 1, 16, MAX_WIDTH); } virtual int GetRandHeight() { return WelsClip3 ((((rand() % MAX_HEIGHT) >> 1) + 1) << 1, 16, MAX_HEIGHT); } protected: SEncParamExt param_; BufferedData buf_; SSourcePicture EncPic; SFrameBSInfo info; SBufferInfo dstBufInfo_; std::vector<SLostSim> m_SLostSim; WelsTraceCallback pFunc; STraceUnit sTrace; STraceUnit* pTraceInfo;}; class EncodeDecodeTestAPIBase : public EncodeDecodeTestBase { public: uint8_t iRandValue; public: void SetUp() { EncodeDecodeTestBase::SetUp(); } void TearDown() { EncodeDecodeTestBase::TearDown(); } void prepareParam0 (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam); void prepareParamDefault (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam); bool InitialEncDec (int iWidth, int iHeight); void RandomParamExtCombination(); void ValidateParamExtCombination(); void SliceParamValidationForMode2 (int iSpatialIdx); void SliceParamValidationForMode3 (int iSpatialIdx); void SliceParamValidationForMode4(); void EncodeOneFrame (int iCheckTypeIndex); bool EncDecOneFrame (const int iWidth, const int iHeight, const int iFrame, FILE* pfEnc); bool TestOneSimulcastAVC (SEncParamExt* pParam, ISVCDecoder** decoder, unsigned char** pBsBuf, int iSpatialLayerNum, int iEncFrameNum, int iCallTimes);}; class EncodeDecodeTestAPI : public ::testing::TestWithParam<EncodeDecodeFileParamBase>, public EncodeDecodeTestAPIBase { void SetUp() { EncodeDecodeTestAPIBase::SetUp(); } void TearDown() { EncodeDecodeTestAPIBase::TearDown(); }}; bool ToRemainDidNal (const unsigned char* pSrc, EWelsNalUnitType eNalType, int iTarDid);void ExtractDidNal (SFrameBSInfo* pBsInfo, int& iSrcLen, std::vector<SLostSim>* p_SLostSim, int iTarDid);int SimulateNALLoss (const unsigned char* pSrc, int& iSrcLen, std::vector<SLostSim>* p_SLostSim, const char* pLossChars, bool bLossPara, int& iLossIdx, bool& bVCLLoss); long IsKeyFrameLost (ISVCDecoder* pDecoder, SLTRRecoverRequest* p_LTR_Recover_Request, long hr);bool IsLTRMarking (ISVCDecoder* pDecoder);void LTRRecoveryRequest (ISVCDecoder* pDecoder, ISVCEncoder* pEncoder, SLTRRecoverRequest* p_LTR_Recover_Request, long hr, bool m_P2PmodeFlag);void LTRMarkFeedback (ISVCDecoder* pDecoder, ISVCEncoder* pEncoder, SLTRMarkingFeedback* p_LTR_Marking_Feedback, long hr);
#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 <string>
#include <vector>
using namespace WelsCommon;
//TODO: some content here in this file is the same with encode_decode_api_test.cpp
//plan to combine them after some on-going code reviews in that file to avoid merging conflict
#define TRY_TIME_RANGE (10)
#define ENCODE_FRAME_NUM (30)
#define LEVEL_ID_RANGE (18)
#define MAX_WIDTH (4096)
#define MAX_HEIGHT (2304)
#define MAX_FRAME_RATE (30)
#define MIN_FRAME_RATE (1)
#define FRAME_RATE_RANGE (2*MAX_FRAME_RATE)
#define RC_MODE_RANGE (4)
#define BIT_RATE_RANGE (10000)
#define MAX_QP (51)
#define MIN_QP (0)
#define QP_RANGE (2*MAX_QP)
#define SPATIAL_LAYER_NUM_RANGE (2*MAX_SPATIAL_LAYER_NUM)
#define TEMPORAL_LAYER_NUM_RANGE (2*MAX_TEMPORAL_LAYER_NUM)
#define SAVED_NALUNIT_NUM ( (MAX_SPATIAL_LAYER_NUM*MAX_QUALITY_LAYER_NUM) + 1 + MAX_SPATIAL_LAYER_NUM )
#define MAX_SLICES_NUM ( ( MAX_NAL_UNITS_IN_LAYER - SAVED_NALUNIT_NUM ) / 3 )
#define SLICE_MODE_NUM (SM_RESERVED)
#define LOOP_FILTER_IDC_NUM (3)
#define LOOF_FILTER_OFFSET_RANGE (6)
#define MAX_REF_PIC_COUNT (16)
#define MIN_REF_PIC_COUNT (1)
#define LONG_TERM_REF_NUM (2)
#define LONG_TERM_REF_NUM_SCREEN (4)
#define MAX_REFERENCE_PICTURE_COUNT_NUM_CAMERA (6)
#define MAX_REFERENCE_PICTURE_COUNT_NUM_SCREEN (8)
#define VALID_SIZE(iSize) (((iSize)>16)?(iSize):16)
#define GET_MB_WIDTH(x) (((x) + 15)/16)
typedef struct SLost_Sim {
WelsCommon::EWelsNalUnitType eNalType;
bool isLost;
} SLostSim;
struct EncodeDecodeFileParamBase {
int numframes;
int width;
int height;
float frameRate;
int slicenum;
bool bLostPara;
const char* pLossSequence;
};
static void welsStderrTraceOrigin (void* ctx, int level, const char* string) {
fprintf (stderr, "%s\n", string);
}
typedef struct STrace_Unit {
int iTarLevel;
} STraceUnit;
class EncodeDecodeTestBase : public BaseEncoderTest, public BaseDecoderTest {
public:
uint8_t iRandValue;
public:
virtual void SetUp() {
BaseEncoderTest::SetUp();
BaseDecoderTest::SetUp();
pFunc = welsStderrTraceOrigin;
pTraceInfo = NULL;
encoder_->SetOption (ENCODER_OPTION_TRACE_CALLBACK, &pFunc);
encoder_->SetOption (ENCODER_OPTION_TRACE_CALLBACK_CONTEXT, &pTraceInfo);
decoder_->SetOption (DECODER_OPTION_TRACE_CALLBACK, &pFunc);
decoder_->SetOption (DECODER_OPTION_TRACE_CALLBACK_CONTEXT, &pTraceInfo);
}
virtual void TearDown() {
BaseEncoderTest::TearDown();
BaseDecoderTest::TearDown();
}
virtual void prepareParam (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam);
virtual bool prepareEncDecParam (const EncodeDecodeFileParamBase EncDecFileParam);
virtual void encToDecData (const SFrameBSInfo& info, int& len);
virtual void encToDecSliceData (const int iLayerNum, const int iSliceNum, const SFrameBSInfo& info, int& len);
virtual int GetRandWidth() {
return WelsClip3 ((((rand() % MAX_WIDTH) >> 1) + 1) << 1, 16, MAX_WIDTH);
}
virtual int GetRandHeight() {
return WelsClip3 ((((rand() % MAX_HEIGHT) >> 1) + 1) << 1, 16, MAX_HEIGHT);
}
protected:
SEncParamExt param_;
BufferedData buf_;
SSourcePicture EncPic;
SFrameBSInfo info;
SBufferInfo dstBufInfo_;
std::vector<SLostSim> m_SLostSim;
WelsTraceCallback pFunc;
STraceUnit sTrace;
STraceUnit* pTraceInfo;
};
class EncodeDecodeTestAPIBase : public EncodeDecodeTestBase {
public:
uint8_t iRandValue;
public:
void SetUp() {
EncodeDecodeTestBase::SetUp();
}
void TearDown() {
EncodeDecodeTestBase::TearDown();
}
void prepareParam0 (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam);
void prepareParamDefault (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam);
bool InitialEncDec (int iWidth, int iHeight);
void RandomParamExtCombination();
void ValidateParamExtCombination();
void SliceParamValidationForMode2 (int iSpatialIdx);
void SliceParamValidationForMode3 (int iSpatialIdx);
void SliceParamValidationForMode4();
void EncodeOneFrame (int iCheckTypeIndex);
bool EncDecOneFrame (const int iWidth, const int iHeight, const int iFrame, FILE* pfEnc);
bool TestOneSimulcastAVC (SEncParamExt* pParam, ISVCDecoder** decoder, unsigned char** pBsBuf, int iSpatialLayerNum,
int iEncFrameNum,
int iCallTimes);
};
class EncodeDecodeTestAPI : public ::testing::TestWithParam<EncodeDecodeFileParamBase>, public EncodeDecodeTestAPIBase {
void SetUp() {
EncodeDecodeTestAPIBase::SetUp();
}
void TearDown() {
EncodeDecodeTestAPIBase::TearDown();
}
};
bool ToRemainDidNal (const unsigned char* pSrc, EWelsNalUnitType eNalType, int iTarDid);
void ExtractDidNal (SFrameBSInfo* pBsInfo, int& iSrcLen, std::vector<SLostSim>* p_SLostSim, int iTarDid);
int SimulateNALLoss (const unsigned char* pSrc, int& iSrcLen, std::vector<SLostSim>* p_SLostSim,
const char* pLossChars, bool bLossPara, int& iLossIdx, bool& bVCLLoss);
long IsKeyFrameLost (ISVCDecoder* pDecoder, SLTRRecoverRequest* p_LTR_Recover_Request, long hr);
bool IsLTRMarking (ISVCDecoder* pDecoder);
void LTRRecoveryRequest (ISVCDecoder* pDecoder, ISVCEncoder* pEncoder, SLTRRecoverRequest* p_LTR_Recover_Request,
long hr, bool m_P2PmodeFlag);
void LTRMarkFeedback (ISVCDecoder* pDecoder, ISVCEncoder* pEncoder, SLTRMarkingFeedback* p_LTR_Marking_Feedback,
long hr);