ref: c511746e0b8b186bb9ea7b1a933c5f36eb268570
dir: /test/api/encode_decode_api_test.h/
#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);