You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1775 lines
43 KiB

7 months ago
//-----------------------------------------------------------------------------
// COPYRIGHT (C) 2020 CHIPS&MEDIA INC. ALL RIGHTS RESERVED
//
// This file is distributed under BSD 3 clause and LGPL2.1 (dual license)
// SPDX License Identifier: BSD-3-Clause
// SPDX License Identifier: LGPL-2.1-only
//
// The entire notice above must be reproduced on all authorized copies.
//
// Description :
//-----------------------------------------------------------------------------
#ifndef _MAIN_HELPER_H_
#define _MAIN_HELPER_H_
#include <stdio.h>
#include <ctype.h>
#include "config.h"
#include "vpuapifunc.h"
#include "vpuapi.h"
#include "vputypes.h"
#include "nc_video_codec.h"
#ifdef PLATFORM_QNX
#include <sys/stat.h>
#endif
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
#define MATCH_OR_MISMATCH(_expected, _value, _ret) ((_ret=(_expected == _value)) ? "MATCH" : "MISMATCH")
#if defined(WIN32) || defined(WIN64)
/*
( _MSC_VER => 1200 ) 6.0 vs6
( _MSC_VER => 1310 ) 7.1 vs2003
( _MSC_VER => 1400 ) 8.0 vs2005
( _MSC_VER => 1500 ) 9.0 vs2008
( _MSC_VER => 1600 ) 10.0 vs2010
*/
#if (_MSC_VER == 1200)
#define strcasecmp stricmp
#define strncasecmp strnicmp
#else
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
#endif
#define inline _inline
#if (_MSC_VER == 1600)
#define strdup _strdup
#endif
#endif
#define MAX_GETOPT_OPTIONS 100
//extension of option struct in getopt
struct OptionExt
{
const char *name;
int has_arg;
int *flag;
int val;
const char *help;
};
#define MAX_FILE_PATH 256
#define MAX_PIC_SKIP_NUM 5
#define EXTRA_SRC_BUFFER_NUM 0
#define VPU_WAIT_TIME_OUT 10 //should be less than normal decoding time to give a chance to fill stream. if this value happens some problem. we should fix VPU_WaitInterrupt function
#define VPU_WAIT_TIME_OUT_CQ 1
#define VPU_WAIT_TIME_OUT_LONG 5000
#define MAX_NOT_DEC_COUNT 2000
#define COMPARE_RESOLUTION(_src, _dst) (_src->width == _dst->width && _src->height == _dst->height)
typedef union {
struct {
Uint32 ctu_force_mode : 2; //[ 1: 0]
Uint32 ctu_coeff_drop : 1; //[ 2]
Uint32 reserved : 5; //[ 7: 3]
Uint32 sub_ctu_qp_0 : 6; //[13: 8]
Uint32 sub_ctu_qp_1 : 6; //[19:14]
Uint32 sub_ctu_qp_2 : 6; //[25:20]
Uint32 sub_ctu_qp_3 : 6; //[31:26]
Uint32 lambda_sad_0 : 8; //[39:32]
Uint32 lambda_sad_1 : 8; //[47:40]
Uint32 lambda_sad_2 : 8; //[55:48]
Uint32 lambda_sad_3 : 8; //[63:56]
} field;
} EncCustomMap; // for wave5xx custom map (1 CTU = 64bits)
typedef union {
struct {
Uint8 mb_force_mode : 2; //lint !e46 [ 1: 0]
Uint8 mb_qp : 6; //lint !e46 [ 7: 2]
} field;
} AvcEncCustomMap; // for AVC custom map on wave (1 MB = 8bits)
typedef enum {
MODE_YUV_LOAD = 0,
MODE_COMP_JYUV,
MODE_SAVE_JYUV,
MODE_COMP_CONV_YUV,
MODE_SAVE_CONV_YUV,
MODE_SAVE_LOAD_YUV,
MODE_COMP_RECON,
MODE_SAVE_RECON,
MODE_COMP_ENCODED,
MODE_SAVE_ENCODED
} CompSaveMode;
typedef struct {
int picX;
int picY;
int internalBitDepth;
int losslessEnable;
int constIntraPredFlag;
int gopSize;
int numTemporalLayers;
int decodingRefreshType;
int intraQP;
int intraPeriod;
int frameRate;
int confWinTop;
int confWinBot;
int confWinLeft;
int confWinRight;
int independSliceMode;
int independSliceModeArg;
int dependSliceMode;
int dependSliceModeArg;
int intraRefreshMode;
int intraRefreshArg;
int useRecommendEncParam;
int scalingListEnable;
int cuSizeMode;
int tmvpEnable;
int wppenable;
int maxNumMerge;
int disableDeblk;
int lfCrossSliceBoundaryEnable;
int betaOffsetDiv2;
int tcOffsetDiv2;
int skipIntraTrans;
int saoEnable;
int intraNxNEnable;
int rcEnable;
int bitRate;
int bitAllocMode;
int fixedBitRatio[MAX_GOP_NUM];
int cuLevelRCEnable;
int hvsQPEnable;
int hvsQpScale;
int minQp;
int maxQp;
int maxDeltaQp;
int gopPresetIdx;
// CUSTOM_GOP
CustomGopParam gopParam;
// ROI / CTU mode
int roiEnable; /**< It enables ROI map. NOTE: It is valid when rcEnable is on. */
char roiFileName[MAX_FILE_PATH];
char roiQpMapFile[MAX_FILE_PATH];
// VUI
Uint32 numUnitsInTick;
Uint32 timeScale;
Uint32 numTicksPocDiffOne;
int encAUD;
int encEOS;
int encEOB;
int chromaCbQpOffset;
int chromaCrQpOffset;
Uint32 initialRcQp;
Uint32 nrYEnable;
Uint32 nrCbEnable;
Uint32 nrCrEnable;
Uint32 nrNoiseEstEnable;
Uint32 nrNoiseSigmaY;
Uint32 nrNoiseSigmaCb;
Uint32 nrNoiseSigmaCr;
Uint32 nrIntraWeightY;
Uint32 nrIntraWeightCb;
Uint32 nrIntraWeightCr;
Uint32 nrInterWeightY;
Uint32 nrInterWeightCb;
Uint32 nrInterWeightCr;
Uint32 useAsLongtermPeriod;
Uint32 refLongtermPeriod;
// newly added for encoder
Uint32 monochromeEnable;
Uint32 strongIntraSmoothEnable;
Uint32 roiAvgQp;
Uint32 weightPredEnable;
Uint32 bgDetectEnable;
Uint32 bgThrDiff;
Uint32 bgThrMeanDiff;
Uint32 bgLambdaQp;
int bgDeltaQp;
Uint32 lambdaMapEnable;
Uint32 customLambdaEnable;
Uint32 customMDEnable;
int pu04DeltaRate;
int pu08DeltaRate;
int pu16DeltaRate;
int pu32DeltaRate;
int pu04IntraPlanarDeltaRate;
int pu04IntraDcDeltaRate;
int pu04IntraAngleDeltaRate;
int pu08IntraPlanarDeltaRate;
int pu08IntraDcDeltaRate;
int pu08IntraAngleDeltaRate;
int pu16IntraPlanarDeltaRate;
int pu16IntraDcDeltaRate;
int pu16IntraAngleDeltaRate;
int pu32IntraPlanarDeltaRate;
int pu32IntraDcDeltaRate;
int pu32IntraAngleDeltaRate;
int cu08IntraDeltaRate;
int cu08InterDeltaRate;
int cu08MergeDeltaRate;
int cu16IntraDeltaRate;
int cu16InterDeltaRate;
int cu16MergeDeltaRate;
int cu32IntraDeltaRate;
int cu32InterDeltaRate;
int cu32MergeDeltaRate;
int coefClearDisable;
int forcePicSkipStart;
int forcePicSkipEnd;
int forceCoefDropStart;
int forceCoefDropEnd;
char scalingListFileName[MAX_FILE_PATH];
char customLambdaFileName[MAX_FILE_PATH];
Uint32 enStillPicture;
// custom map
int customLambdaMapEnable;
char customLambdaMapFileName[MAX_FILE_PATH];
int customModeMapFlag;
char customModeMapFileName[MAX_FILE_PATH];
char WpParamFileName[MAX_FILE_PATH];
// for H.264 on WAVE
int idrPeriod;
int rdoSkip;
int lambdaScalingEnable;
int transform8x8;
int avcSliceMode;
int avcSliceArg;
int intraMbRefreshMode;
int intraMbRefreshArg;
int mbLevelRc;
int entropyCodingMode;
int s2fmeDisable;
int forceIdrPicIdx;
int forcedIdrHeaderEnable;
Uint32 vuiDataEnable;
Uint32 vuiDataSize;
char vuiDataFileName[MAX_FILE_PATH];
Uint32 hrdInVPS;
Uint32 hrdDataSize;
char hrdDataFileName[MAX_FILE_PATH];
Uint32 prefixSeiEnable;
Uint32 prefixSeiDataSize;
char prefixSeiDataFileName[MAX_FILE_PATH];
Uint32 suffixSeiEnable;
Uint32 suffixSeiDataSize;
char suffixSeiDataFileName[MAX_FILE_PATH];
Uint32 rcWeightParam;
Uint32 rcWeightBuf;
} WAVE_ENC_CFG;
typedef struct {
// ChangePara
int setParaChgFrmNum;
int enableOption;
char cfgName[MAX_FILE_PATH];
} W5ChangeParam;
typedef struct {
char SrcFileName[MAX_FILE_PATH];
char BitStreamFileName[MAX_FILE_PATH];
BOOL srcCbCrInterleave;
int NumFrame;
int PicX;
int PicY;
int FrameRate;
// MPEG4 ONLY
int VerId;
int DataPartEn;
int RevVlcEn;
int ShortVideoHeader;
int AnnexI;
int AnnexJ;
int AnnexK;
int AnnexT;
int IntraDcVlcThr;
int VopQuant;
// H.264 ONLY
int ConstIntraPredFlag;
int DisableDeblk;
int DeblkOffsetA;
int DeblkOffsetB;
int ChromaQpOffset;
int PicQpY;
// H.264 VUI information
int VuiPresFlag;
int VideoSignalTypePresFlag;
char VideoFormat;
char VideoFullRangeFlag;
int ColourDescripPresFlag;
char ColourPrimaries;
char TransferCharacteristics;
char MatrixCoeff;
int NumReorderFrame;
int MaxDecBuffering;
int aud_en;
int level;
// COMMON
int GopPicNum;
int SliceMode;
int SliceSizeMode;
int SliceSizeNum;
// COMMON - RC
int RcEnable;
int RcBitRate;
int RcBitRateBL;
int RcInitDelay;
int VbvBufferSize;
int RcBufSize;
int IntraRefreshNum;
int ConscIntraRefreshEnable;
int frameSkipDisable;
int ConstantIntraQPEnable;
int MaxQpSetEnable;
int MaxQp;
int frameCroppingFlag;
int frameCropLeft;
int frameCropRight;
int frameCropTop;
int frameCropBottom;
//H.264 only
int MaxDeltaQpSetEnable;
int MaxDeltaQp;
int MinQpSetEnable;
int MinQp;
int MinDeltaQpSetEnable;
int MinDeltaQp;
int intraCostWeight;
//MP4 Only
int RCIntraQP;
int HecEnable;
int GammaSetEnable;
int Gamma;
// NEW RC Scheme
int rcIntervalMode;
int RcMBInterval;
int skipPicNums[MAX_PIC_SKIP_NUM];
int SearchRange; // for coda960
int MeUseZeroPmv; // will be removed. must be 264 = 0, mpeg4 = 1 263 = 0
int MeBlkModeEnable; // only api option
int IDRInterval;
int SrcBitDepth;
int Profile;
WAVE_ENC_CFG waveCfg;
int numChangeParam;
W5ChangeParam changeParam[10];
ParamChange coda9ParamChange;
int rcWeightFactor;
} ENC_CFG;
typedef struct {
Uint32 subFrameSyncOn;
Uint32 subFrameSyncSrcWriteMode; /**< It indicates the number of pixel rows to run VPU_EncStartOneFrame() with. (default/min: 64, max: picture height) This is used for test purpose. */
EncSubFrameSyncState subFrameSyncState; /**< representing the status of Subframe Sync(SFS) when SFS works in register-based mode.*/
} ENC_subFrameSyncCfg; /* SFS = SubFrameSync */
void replace_character(char* str,
char c,
char r);
extern Uint32 randomSeed;
/* yuv & md5 */
#define NO_COMPARE 0
#define YUV_COMPARE 1
#define MD5_COMPARE 2
#define STREAM_COMPARE 3
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Performance report */
typedef void* PFCtx;
PFCtx PFMonitorSetup(
Uint32 coreIndex,
Uint32 instanceIndex,
Uint32 referenceClkInMHz,
Uint32 fps,
char* strLogDir,
BOOL isEnc
);
void PFMonitorRelease(
PFCtx context
);
void PFMonitorUpdate(
Uint32 coreIndex,
PFCtx context,
Uint32 cycles,
...
);
void PrepareDecoderTest(
DecHandle decHandle
);
void byte_swap(
unsigned char* data,
int len
);
void word_swap(
unsigned char* data,
int len
);
void dword_swap(
unsigned char* data,
int len
);
void lword_swap(
unsigned char* data,
int len
);
Int32 LoadFirmware(
Int32 productId,
Uint8** retFirmware,
Uint32* retSizeInWord,
const char* path
);
void PrintDecSeqWarningMessages(
Uint32 productId,
DecInitialInfo* seqInfo
);
void DisplayDecodedInformation(
DecHandle handle,
CodStd codec,
Uint32 frameNo,
DecOutputInfo* decodedInfo,
...
);
void
DisplayEncodedInformation(
EncHandle handle,
CodStd codec,
Uint32 frameNo,
EncOutputInfo* encodedInfo,
...
);
void PrintEncSppStatus(
Uint32 coreIdx,
Uint32 productId
);
/*
* VPU Helper functions
*/
/************************************************************************/
/* Video */
/************************************************************************/
#define PUT_BYTE(_p, _b) \
*_p++ = (unsigned char)_b;
#define PUT_BUFFER(_p, _buf, _len) \
osal_memcpy(_p, _buf, _len); \
(_p) += (_len);
#define PUT_LE32(_p, _var) \
*_p++ = (unsigned char)((_var)>>0); \
*_p++ = (unsigned char)((_var)>>8); \
*_p++ = (unsigned char)((_var)>>16); \
*_p++ = (unsigned char)((_var)>>24);
#define PUT_BE32(_p, _var) \
*_p++ = (unsigned char)((_var)>>24); \
*_p++ = (unsigned char)((_var)>>16); \
*_p++ = (unsigned char)((_var)>>8); \
*_p++ = (unsigned char)((_var)>>0);
#define PUT_LE16(_p, _var) \
*_p++ = (unsigned char)((_var)>>0); \
*_p++ = (unsigned char)((_var)>>8);
#define PUT_BE16(_p, _var) \
*_p++ = (unsigned char)((_var)>>8); \
*_p++ = (unsigned char)((_var)>>0);
Int32 ConvFOURCCToMp4Class(
Int32 fourcc
);
Int32 ConvFOURCCToCodStd(
Uint32 fourcc
);
Int32 ConvCodecIdToMp4Class(
Uint32 codecId
);
Int32 ConvCodecIdToCodStd(
Int32 codecId
);
Int32 ConvCodecIdToFourcc(
Int32 codecId
);
/*!
* \brief wrapper function of StoreYuvImageBurstFormat()
*/
Uint8* GetYUVFromFrameBuffer(
DecHandle decHandle,
FrameBuffer* fb,
VpuRect rcFrame,
Uint32* retWidth,
Uint32* retHeight,
Uint32* retBpp,
size_t* retSize
);
/************************************************************************/
/* Queue */
/************************************************************************/
typedef struct {
void* data;
} QueueData;
typedef struct {
Uint8* buffer;
Uint32 size;
Uint32 itemSize;
Uint32 count;
Uint32 front;
Uint32 rear;
osal_mutex_t lock;
} Queue;
Queue* Queue_Create(
Uint32 itemCount,
Uint32 itemSize
);
Queue* Queue_Create_With_Lock(
Uint32 itemCount,
Uint32 itemSize
);
void Queue_Destroy(
Queue* queue
);
/**
* \brief Enqueue with deep copy
*/
BOOL Queue_Enqueue(
Queue* queue,
void* data
);
/**
* \brief Caller has responsibility for releasing the returned data
*/
void* Queue_Dequeue(
Queue* queue
);
void Queue_Flush(
Queue* queue
);
void* Queue_Peek(
Queue* queue
);
Uint32 Queue_Get_Cnt(
Queue* queue
);
/**
* \brief @dstQ is NULL, it allocates Queue structure and then copy from @srcQ.
*/
Queue* Queue_Copy(
Queue* dstQ,
Queue* srcQ
);
/**
* \brief Check the queue is full or not.
*/
BOOL Queue_IsFull(
Queue* queue
);
/************************************************************************/
/* ETC */
/************************************************************************/
Uint32 GetRandom(
Uint32 start,
Uint32 end
);
/************************************************************************/
/* MD5 */
/************************************************************************/
typedef struct MD5state_st {
Uint32 A,B,C,D;
Uint32 Nl,Nh;
Uint32 data[16];
Uint32 num;
} MD5_CTX;
Int32 MD5_Init(
MD5_CTX *c
);
Int32 MD5_Update(
MD5_CTX* c,
const void* data,
size_t len);
Int32 MD5_Final(
Uint8* md,
MD5_CTX* c
);
Uint8* MD5(
const Uint8* d,
size_t n,
Uint8* md
);
void plane_md5(MD5_CTX *md5_ctx,
Uint8 *src,
int src_x,
int src_y,
int out_x,
int out_y,
int stride,
int bpp,
Uint16 zero
);
/************************************************************************/
/* Comparator */
/************************************************************************/
#define COMPARATOR_SKIP 0xF0F0F0F0
typedef enum {
COMPARATOR_CONF_SET_GOLDEN_DATA_SIZE,
COMPARATOR_CONF_SKIP_GOLDEN_DATA, /*!<< 2nd parameter pointer of Queue
containing skip command */
COMPARATOR_CONF_SET_PICINFO, //!<< This command is followed by YUVInfo structure.
COMPARATOR_CONF_SET_MONOCHROME, //!<< It means a monochrome picture
COMPARATOR_CONF_SET_NOT_MONOCHROME, //!<< It means a normal picture
} ComparatorConfType;
typedef void* Comparator;
typedef struct ComparatorImpl {
void* context;
char* filename;
Uint32 curIndex;
Uint32 numOfFrames;
BOOL (*Create)(struct ComparatorImpl* impl, char* path);
BOOL (*Destroy)(struct ComparatorImpl* impl);
BOOL (*Compare)(struct ComparatorImpl* impl, void* data, PhysicalAddress size, Uint32 insNum);
BOOL (*Configure)(struct ComparatorImpl* impl, ComparatorConfType type, void* val);
BOOL (*Rewind)(struct ComparatorImpl* impl);
BOOL eof;
BOOL enableScanMode;
BOOL usePrevDataOneTime;
} ComparatorImpl;
typedef struct {
Uint32 totalFrames;
ComparatorImpl* impl;
} AbstractComparator;
// YUV Comparator
typedef struct {
Uint32 width;
Uint32 height;
FrameBufferFormat format;
BOOL cbcrInterleave;
BOOL isVp9;
} PictureInfo;
Comparator Comparator_Create(
Uint32 type, //!<< 1: yuv
char* goldenPath,
...
);
BOOL Comparator_Destroy(
Comparator comp
);
BOOL Comparator_Act(
Comparator comp,
void* data,
Uint32 size,
Uint32 insNum
);
BOOL Comparator_CheckFrameCount(
Comparator comp
);
BOOL Comparator_SetScanMode(
Comparator comp,
BOOL enable
);
BOOL Comparator_Rewind(
Comparator comp
);
BOOL Comparator_CheckEOF(
Comparator comp
);
Uint32 Comparator_GetFrameCount(
Comparator comp
);
BOOL Comparator_Configure(
Comparator comp,
ComparatorConfType cmd,
void* val
);
BOOL IsEndOfFile(
FILE* fp
);
/************************************************************************/
/* Bitstream Feeder */
/************************************************************************/
typedef enum {
FEEDING_METHOD_FIXED_SIZE,
FEEDING_METHOD_FRAME_SIZE,
FEEDING_METHOD_SIZE_PLUS_ES,
FEEDING_METHOD_MAX
} FeedingMethod;
typedef struct {
void* data;
Uint32 size;
BOOL eos; //!<< End of stream
int seqHeaderSize;
} BSChunk;
typedef void* BSFeeder;
typedef void (*BSFeederHook)(BSFeeder feeder, void* data, Uint32 size, void* arg);
/**
* \brief BitstreamFeeder consumes bitstream and updates information of bitstream buffer of VPU.
* \param handle handle of decoder
* \param path bitstream path
* \param method feeding method. see FeedingMethod.
* \param loopCount If @loopCount is greater than 1 then BistreamFeeder reads the start of bitstream again
* when it encounters the end of stream @loopCount times.
* \param ... FEEDING_METHOD_FIXED_SIZE:
* This value of parameter is size of chunk at a time.
* If the size of chunk is equal to zero than the BitstreamFeeder reads bistream in random size.(1Byte ~ 4MB)
* \return It returns the pointer of handle containing the context of the BitstreamFeeder.
*/
void* BitstreamFeeder_Create(
Uint32 coreIdx,
const char* path,
CodStd codecId,
FeedingMethod method,
EndianMode endian
);
/**
* \brief This is helper function set to simplify the flow that update bit-stream
* to the VPU.
*/
Uint32 BitstreamFeeder_Act(
BSFeeder feeder,
vpu_buffer_t* bsBuffer,
PhysicalAddress wrPtr,
Uint32 room,
PhysicalAddress* newWrPtr
);
BOOL BitstreamFeeder_SetFeedingSize(
BSFeeder feeder,
Uint32 size
);
/**
* \brief Set filling bitstream as ringbuffer mode or linebuffer mode.
* \param mode 0 : auto
* 1 : ringbuffer
* 2 : linebuffer.
*/
#define BSF_FILLING_AUTO 0
#define BSF_FILLING_RINGBUFFER 1
#define BSF_FILLING_LINEBUFFER 2
/* BSF_FILLING_RINBGUFFER_WITH_ENDFLAG:
* Scenario:
* - Application writes 1 ~ 10 frames into bitstream buffer.
* - Set stream end flag by using VPU_DecUpdateBitstreamBuffer(handle, 0).
* - Application clears stream end flag by using VPU_DecUpdateBitstreamBuffer(handle, -1).
* when indexFrameDisplay is equal to -1.
* NOTE:
* - Last frame cannot be a complete frame.
*/
#define BSF_FILLING_RINGBUFFER_WITH_ENDFLAG 3
void BitstreamFeeder_SetFillMode(
BSFeeder feeder,
Uint32 mode
);
BOOL BitstreamFeeder_IsEos(
BSFeeder feeder
);
Uint32 BitstreamFeeder_GetSeqHeaderSize(
BSFeeder feeder
);
BOOL BitstreamFeeder_Destroy(
BSFeeder feeder
);
BOOL BitstreamFeeder_Rewind(
BSFeeder feeder
);
BOOL BitstreamFeeder_SetHook(
BSFeeder feeder,
BSFeederHook hookFunc,
void* arg
);
/************************************************************************/
/* YUV Feeder */
/************************************************************************/
#define SOURCE_YUV 0
#define SOURCE_YUV_WITH_LOADER 2
typedef struct {
Uint32 cbcrInterleave;
Uint32 nv21;
Uint32 i422;
Uint32 packedFormat;
Uint32 srcFormat;
Uint32 srcPlanar;
Uint32 srcStride;
Uint32 srcHeight;
} YuvInfo;
typedef void* YuvFeeder;
typedef struct YuvFeederImpl {
void* context;
BOOL (*Create)(struct YuvFeederImpl* impl, const char* path, Uint32 packed, Uint32 fbStride, Uint32 fbHeight);
BOOL (*Dequeue)(struct YuvFeederImpl* impl, Int32 coreIdx, FrameBuffer *fb, size_t picWidth, size_t picHeight, Uint32 srcFbIndex, ENC_subFrameSyncCfg* subFrameSyncConfig, void* arg);
BOOL (*Mqueue)(struct YuvFeederImpl* impl, Int32 coreIdx, FrameBuffer *fb, size_t picWidth, size_t picHeight, Uint32 srcFbIndex, ENC_subFrameSyncCfg* subFrameSyncConfig, void* arg);
BOOL (*Destroy)(struct YuvFeederImpl* impl);
BOOL (*Configure)(struct YuvFeederImpl* impl, Uint32 cmd, YuvInfo yuv);
EncHandle handle;
} YuvFeederImpl;
typedef struct {
YuvFeederImpl* impl;
Uint8 pYuv;
} AbstractYuvFeeder;
typedef struct {
osal_file_t fp;
Uint8* pYuv;
size_t fbStride;
size_t cbcrInterleave;
BOOL srcPlanar;
} yuvContext;
YuvFeeder YuvFeeder_Create(
Uint32 type,
const char* srcFilePath,
YuvInfo yuvInfo
);
BOOL YuvFeeder_Feed(
YuvFeeder feeder,
Uint32 coreIdx,
FrameBuffer* fb,
size_t picWidth,
size_t picHeight,
Uint32 srcFbIndex,
ENC_subFrameSyncCfg* subFrameSyncConfig,
void* arg
);
BOOL YuvFeeder_Destroy(
YuvFeeder feeder
);
/************************************************************************/
/* CNM video helper */
/************************************************************************/
/**
* \param convertCbcrIntl If this value is TRUE, it stores YUV as NV12 or NV21 to @fb
*/
BOOL LoadYuvImageByYCbCrLine(
EncHandle handle,
Uint32 coreIdx,
Uint8* src,
size_t picWidth,
size_t picHeight,
FrameBuffer* fb,
void *arg,
ENC_subFrameSyncCfg *subFrameSyncConfig,
Uint32 srcFbIndex
);
typedef enum {
SRC_0LINE_WRITE = 0,
SRC_64LINE_WRITE = 64,
SRC_128LINE_WRITE = 128,
SRC_192LINE_WRITE = 192,
//...
REMAIN_SRC_DATA_WRITE = 0x80000000
} SOURCE_LINE_WRITE;
BOOL LoadYuvImageBurstFormat(
Uint32 coreIdx,
Uint8* src,
size_t picWidth,
size_t picHeight,
FrameBuffer *fb,
BOOL convertCbcrIntl
);
int ProcessEncodedBitstreamBurst(
Uint32 core_idx,
osal_file_t fp,
int targetAddr,
PhysicalAddress bsBufStartAddr,
PhysicalAddress bsBufEndAddr,
int size,
int endian,
Comparator comparator
);
BOOL LoadTiledImageYuvBurst(
VpuHandle handle,
Uint32 coreIdx,
BYTE* pYuv,
size_t picWidth,
size_t picHeight,
FrameBuffer* fb,
TiledMapConfig mapCfg
);
Uint32 StoreYuvImageBurstFormat(
Uint32 coreIndex,
FrameBuffer* fbSrc,
TiledMapConfig mapCfg,
Uint8* pDst,
VpuRect cropRect,
BOOL enableCrop
);
/************************************************************************/
/* Bit Reader */
/************************************************************************/
#define BS_RESET_BUF 0
#define BS_RING_BUF 1
#define BUFFER_MODE_TYPE_LINEBUFFER 0
#define BUFFER_MODE_TYPE_RINGBUFFER 1
typedef void* BitstreamReader;
typedef struct BitstreamReaderImpl {
void* context;
BOOL (*Create)(struct BitstreamReaderImpl* impl, const char* path);
Uint32 (*Act)(struct BitstreamReaderImpl* impl, Int32 coreIdx, PhysicalAddress bitstreamBuffer, Uint32 bitstreamBufferSize, int endian, Comparator comparator);
BOOL (*Destroy)(struct BitstreamReaderImpl* impl);
BOOL (*Configure)(struct BitstreamReaderImpl* impl, Uint32 cmd, void* val);
} BitstreamReaderImpl;
typedef struct {
Uint32 type;
EndianMode endian;
BitstreamReaderImpl* impl;
osal_file_t fp;
EncHandle* handle;
Uint32 streamBufFull;
} AbstractBitstreamReader;
/*!
* \param type 0: Linebuffer, 1: Ringbuffer
* \param path output filepath.
* \param endian Endianness of bitstream buffer
* \param handle Pointer of encoder handle
*/
BitstreamReader BitstreamReader_Create(
Uint32 type,
char* path,
EndianMode endian,
EncHandle* handle
);
/*!
* \param bitstreamBuffer base address of bitstream buffer
* \param bitstreamBufferSize size of bitstream buffer
*/
BOOL BitstreamReader_Act(
BitstreamReader reader,
PhysicalAddress bitstreamBuffer,
Uint32 bitstreamBufferSize,
Uint32 defaultsize,
Comparator comparator
);
BOOL BitstreamReader_Destroy(
BitstreamReader reader
);
/************************************************************************/
/* Simple Renderer */
/************************************************************************/
typedef void* Renderer;
typedef enum {
RENDER_DEVICE_NULL,
RENDER_DEVICE_FBDEV,
RENDER_DEVICE_HDMI,
RENDER_DEVICE_MAX
} RenderDeviceType;
typedef struct RenderDevice {
void* context;
DecHandle decHandle;
BOOL (*Open)(struct RenderDevice* device);
void (*Render)(struct RenderDevice* device, DecOutputInfo* fbInfo, Uint8* yuv, Uint32 width, Uint32 height);
BOOL (*Close)(struct RenderDevice* device);
} RenderDevice;
Renderer SimpleRenderer_Create(
DecHandle decHandle,
RenderDeviceType deviceType,
const char* yuvPath //!<< path to store yuv iamge.
);
Uint32 SimpleRenderer_Act(
Renderer renderer,
DecOutputInfo* fbInfo,
Uint8* pYuv,
Uint32 width,
Uint32 height
);
void* SimpleRenderer_GetFreeFrameInfo(
Renderer renderer
);
/* \brief Flush display queues and clear display indexes
*/
void SimpleRenderer_Flush(
Renderer renderer
);
BOOL SimpleRenderer_Destroy(
Renderer renderer
);
BOOL SimpleRenderer_SetFrameRate(
Renderer renderer,
Uint32 fps
);
BOOL MkDir(
const char* path
);
/*******************************************************************************
* DATATYPES AND FUNCTIONS RELATED TO REPORT
*******************************************************************************/
typedef struct VpuReportConfig_t {
PhysicalAddress userDataBufAddr;
BOOL userDataEnable;
Int32 userDataReportMode; // (0 : Int32errupt mode, 1 Int32errupt disable mode)
Int32 userDataBufSize;
} VpuReportConfig_t;
void OpenDecReport(
DecHandle handle,
VpuReportConfig_t* cfg
);
void CloseDecReport(
DecHandle handle
);
void ConfigDecReport(
Uint32 core_idx,
DecHandle handle,
CodStd bitstreamFormat
);
void SaveDecReport(
Uint32 core_idx,
DecHandle handle,
DecOutputInfo* pDecInfo,
CodStd bitstreamFormat,
Uint32 mbNumX,
Uint32 mbNumY
);
void CheckUserDataInterrupt(
Uint32 core_idx,
DecHandle handle,
Int32 decodeIdx,
CodStd bitstreamFormat,
Int32 int_reason
);
Int32 CalculateAuxBufferSize(
AUX_BUF_TYPE type,
CodStd codStd,
Int32 width,
Int32 height
);
RetCode GetFBCOffsetTableSize(
CodStd codStd,
int width,
int height,
int* ysize,
int* csize
);
#define MAX_ROI_LEVEL (8)
#define LOG2_CTB_SIZE (5)
#define CTB_SIZE (1<<LOG2_CTB_SIZE)
#define LAMBDA_SCALE_FACTOR (100000)
#define FLOATING_POINT_LAMBDA (1)
#define TEMP_SCALABLE_RC (1)
#define UI16_MAX (0xFFFF)
#ifndef INT_MAX
#define INT_MAX (2147483647)
#endif
typedef struct {
const char *name;
int min;
int max;
int def;
} WaveCfgInfo;
void PrintVpuVersionInfo(
Uint32 coreIdx
);
void ChangePathStyle(
char *str
);
BOOL CalcYuvSize(
Int32 format,
Int32 picWidth,
Int32 picHeight,
Int32 cbcrInterleave,
size_t *lumaSize,
size_t *chromaSize,
size_t *frameSize,
Int32 *bitDepth,
Int32 *packedFormat,
Int32 *yuv3p4b
);
FrameBufferFormat GetPackedFormat (
int srcBitDepth,
int packedType,
int p10bits,
int msb
);
char* GetDirname(
const char* path
);
char* GetBasename(
const char* pathname
);
char* GetFileExtension(
const char* filename
);
int parseAvcCfgFile(
ENC_CFG* pEncCfg,
char* filename
);
int parseMp4CfgFile(
ENC_CFG* pEncCfg,
char* filename
);
int parseWaveEncCfgFile(
ENC_CFG* pEncCfg,
int bitFormat,
ENCParameter* get_param
);
int parseWaveChangeParamCfgFile(
ENC_CFG* pEncCfg,
char* FileName
);
int parseRoiCtuModeParam(
char* lineStr,
VpuRect* roiRegion,
int* roiLevel,
int picX,
int picY
);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/************************************************************************/
/* Structure */
/************************************************************************/
typedef struct TestDecConfig_struct {
char outputPath[MAX_FILE_PATH];
char inputPath[MAX_FILE_PATH];
char inputSizePath[MAX_FILE_PATH];
Int32 forceOutNum;
CodStd bitFormat;
Int32 reorder;
TiledMapType mapType;
BitStreamMode bitstreamMode;
BOOL enableWTL;
FrameFlag wtlMode;
FrameBufferFormat wtlFormat;
Int32 coreIdx;
ProductId productId;
BOOL enableCrop; //!<< option for saving yuv
BOOL cbcrInterleave; //!<< 0: None, 1: NV12, 2: NV21
BOOL nv21; //!<< FALSE: NV12, TRUE: NV21,
//!<< This variable is valid when cbcrInterleave is TRUE
EndianMode streamEndian;
EndianMode frameEndian;
Uint32 secondaryAXI;
Int32 compareType;
char md5Path[MAX_FILE_PATH];
char fwPath[MAX_FILE_PATH];
char refYuvPath[MAX_FILE_PATH];
RenderDeviceType renderType;
BOOL thumbnailMode;
Int32 skipMode;
size_t bsSize;
BOOL streamEndFlag;
Uint32 scaleDownWidth;
Uint32 scaleDownHeight;
struct {
BOOL enableMvc; //!<< H.264 MVC
BOOL enableTiled2Linear;
FrameFlag tiled2LinearMode;
BOOL enableBWB;
Uint32 rotate; //!<< 0, 90, 180, 270
Uint32 mirror;
BOOL enableDering; //!<< MPEG-2/4
BOOL enableDeblock; //!<< MPEG-2/4
Uint32 mp4class; //!<< MPEG_4
Uint32 frameCacheBypass;
Uint32 frameCacheBurst;
Uint32 frameCacheMerge;
Uint32 frameCacheWayShape;
LowDelayInfo lowDelay; //!<< H.264
} coda9;
struct {
Uint32 numVCores; //!<< This numVCores is valid on PRODUCT_ID_4102 multi-core version
BOOL craAsBla;
Uint32 av1Format;
} wave;
Uint32 pfClock; //!<< performance clock in Hz
BOOL performance;
Uint32 bandwidth;
Uint32 fps;
Uint32 enableUserData;
/* FEEDER */
FeedingMethod feedingMode;
Uint32 feedingSize;
Uint32 loopCount;
BOOL errorInject;
BOOL ignoreHangup;
BOOL nonRefFbcWrite; //!<< If it is TRUE, FBC data of non-reference picture are written into framebuffer. */
ErrorConcealMode errConcealMode;
ErrorConcealUnit errConcealUnit;
} TestDecConfig;
typedef struct {
DecOutputInfo* pOutInfo;
BOOL scaleX;
BOOL scaleY;
} RendererOutInfo;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
void SetDefaultDecTestConfig(
TestDecConfig* testConfig
);
void Coda9SetDefaultDecTestConfig(
TestDecConfig* testConfig
);
struct option* ConvertOptions(
struct OptionExt* cnmOpt,
Uint32 nItems
);
void ReleaseVideoMemory(
DecHandle handle,
vpu_buffer_t* memoryArr,
Uint32 count
);
BOOL AllocateDecFrameBuffer(
DecHandle decHandle,
TestDecConfig* config,
Uint32 tiledFbCount,
Uint32 linearFbCount,
FrameBuffer* retFbArray,
vpu_buffer_t* retFbAddrs,
Uint32* retStride
);
BOOL AllocFBMemory(
Uint32 coreIdx,
vpu_buffer_t *pFbMem,
FrameBuffer *pFb,
Uint32 memSize,
Uint32 memNum,
Int32 memTypes,
Int32 instIndex
);
BOOL Coda9AllocateDecPPUFrameBuffer(
BOOL* pEnablePPU,
DecHandle decHandle,
TestDecConfig* config,
FrameBuffer* retFbArray,
vpu_buffer_t* retFbAddrs,
Queue* ppuQ
);
RetCode SetUpDecoderOpenParam(
DecOpenParam* param,
TestDecConfig* config
);
#define OUTPUT_FP_NUMBER 4
BOOL OpenDisplayBufferFile(
CodStd codec,
char *outputPath,
VpuRect rcDisplay,
TiledMapType mapType,
FILE *fp[]
);
void CloseDisplayBufferFile(
FILE *fp[]
);
void ProcessVc1MultiResolution(
Uint8* image,
Int32 width,
Int32 height,
BOOL horz_half,
BOOL vert_half
);
void SaveDisplayBufferToFile(
DecHandle handle,
CodStd codStd,
RendererOutInfo* rendererOutInfo,
FrameBuffer dispFrame,
VpuRect rcDisplay,
FILE *fp[]
);
void GetUserData(
Int32 coreIdx,
Uint8* pBase,
vpu_buffer_t vbUserData,
DecOutputInfo outputInfo
);
Uint32 CalcScaleDown(
Uint32 origin,
Uint32 scaledValue
);
#ifdef __cplusplus
}
#endif /* __cplusplus */
typedef struct TestEncConfig_struct {
char yuvSourceBaseDir[MAX_FILE_PATH];
char yuvFileName[MAX_FILE_PATH];
char cmdFileName[MAX_FILE_PATH];
char bitstreamFileName[MAX_FILE_PATH];
char huffFileName[MAX_FILE_PATH];
char cInfoFileName[MAX_FILE_PATH];
char qMatFileName[MAX_FILE_PATH];
char qpFileName[MAX_FILE_PATH];
char cfgFileName[MAX_FILE_PATH];
CodStd stdMode;
int picWidth;
int picHeight;
int kbps;
int rotAngle;
int mirDir;
int useRot;
int qpReport;
int ringBufferEnable;
int rcIntraQp;
int outNum;
int skipPicNums[MAX_PIC_SKIP_NUM];
Uint32 coreIdx;
TiledMapType mapType;
// 2D cache option
int lineBufIntEn;
int subFrameSyncEn;
int subFrameSyncMode;
int en_container; //enable container
int container_frame_rate; //framerate for container
int picQpY;
int cbcrInterleave;
int nv21;
int i422;
BOOL needSourceConvert; //!<< If the format of YUV file is YUV planar mode and EncOpenParam::cbcrInterleave or EncOpenParam::nv21 is true
//!<< the value of needSourceConvert should be true.
int packedFormat;
FrameBufferFormat srcFormat;
int secondaryAXI;
EndianMode stream_endian;
int frame_endian;
int source_endian;
ProductId productId;
int compareType;
#define YUV_MODE_YUV 0
#define YUV_MODE_YUV_LOADER 2
#define YUV_MODE_CFBC 3
int yuv_mode;
char ref_stream_path[MAX_FILE_PATH];
int loopCount;
char ref_recon_md5_path[MAX_FILE_PATH];
BOOL nonRefFbcWrite;
BOOL performance;
Uint32 bandwidth;
Uint32 fps;
Uint32 pfClock;
char roi_file_name[MAX_FILE_PATH];
FILE *roi_file;
int roi_enable;
int encAUD;
int encEOS;
int encEOB;
struct {
BOOL enableLinear2Tiled;
FrameFlag linear2TiledMode;
} coda9;
int useAsLongtermPeriod;
int refLongtermPeriod;
// newly added for encoder
FILE* scaling_list_file;
char scaling_list_fileName[MAX_FILE_PATH];
FILE* custom_lambda_file;
char custom_lambda_fileName[MAX_FILE_PATH];
Uint32 roi_avg_qp;
FILE* lambda_map_file;
Uint32 lambda_map_enable;
char lambda_map_fileName[MAX_FILE_PATH];
FILE* mode_map_file;
Uint32 mode_map_flag;
char mode_map_fileName[MAX_FILE_PATH];
FILE* wp_param_file;
Uint32 wp_param_flag;
char wp_param_fileName[MAX_FILE_PATH];
Int32 force_picskip_start;
Int32 force_picskip_end;
Int32 force_coefdrop_start;
Int32 force_coefdrop_end;
Int32 numChangeParam;
W5ChangeParam changeParam[10];
ParamChange coda9ParamChange;
int forceIdrPicIdx;
char optYuvPath[MAX_FILE_PATH];
#ifdef SUPPORT_SOURCE_RELEASE_INTERRUPT
int srcReleaseIntEnable;
#endif
int ringBufferWrapEnable;
HevcSEIDataEnc seiDataEnc;
char hrd_rbsp_file_name[MAX_FILE_PATH];
FILE *hrd_rbsp_fp;
char vui_rbsp_file_name[MAX_FILE_PATH];
FILE *vui_rbsp_fp;
char prefix_sei_nal_file_name[MAX_FILE_PATH];
FILE *prefix_sei_nal_fp;
char suffix_sei_nal_file_name[MAX_FILE_PATH];
FILE *suffix_sei_nal_fp;
} TestEncConfig;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
BOOL SetupEncoderOpenParam(
EncOpenParam* param,
TestEncConfig* config,
ENC_CFG* encConfig,
ENCParameter* get_param
);
Int32 GetEncOpenParam(
EncOpenParam* pEncOP,
TestEncConfig* pEncConfig,
ENC_CFG* pEncCfg,
ENCParameter* get_param
);
Int32 GetEncOpenParamDefault(
EncOpenParam* pEncOP,
TestEncConfig* pEncConfig
);
void GenRegionToMap(
VpuRect *region, /**< The size of the ROI region for H.265 (start X/Y in CTU, end X/Y in CTU) */
int *roiLevel,
int num,
Uint32 mapWidth,
Uint32 mapHeight,
Uint8 *roiCtuMap
);
#define VUI_HRD_RBSP_BUF_SIZE 0x4000
#define SEI_NAL_DATA_BUF_SIZE 0x4000
Int32 writeVuiRbsp(
int coreIdx,
TestEncConfig *encConfig,
EncOpenParam *encOP,
vpu_buffer_t *vbVuiRbsp
);
Int32 writeHrdRbsp(
int coreIdx,
TestEncConfig *encConfig,
EncOpenParam *encOP,
vpu_buffer_t *vbHrdRbsp
);
void setEncBgMode(
EncParam *encParam,
TestEncConfig encConfig
);
void GenRegionToQpMap(
VpuRect *region, /**< The size of the ROI region for H.265 (start X/Y in CTU, end X/Y int CTU) */
int *roiLevel,
int num,
int initQp,
Uint32 mapWidth,
Uint32 mapHeight,
Uint8 *roiCtuMap
);
void CheckParamRestriction(
Uint32 productId,
TestEncConfig *encConfig
);
int openRoiMapFile(
TestEncConfig *encConfig
);
int allocateRoiMapBuf(
EncHandle handle,
TestEncConfig encConfig,
vpu_buffer_t *vbROi,
int srcFbNum,
int ctuNum
);
void SetMapData(
int coreIdx,
TestEncConfig encConfig,
EncOpenParam encOP,
EncParam *encParam,
int srcFrameWidth,
int srcFrameHeight,
unsigned long addrCustomMap
);
RetCode SetChangeParam(
EncHandle handle,
TestEncConfig encConfig,
EncOpenParam encOP,
Int32 changedCount
);
BOOL GetBitstreamToBuffer(
EncHandle handle,
Uint8* pBuffer,
PhysicalAddress rdAddr,
PhysicalAddress wrAddr,
PhysicalAddress streamBufStartAddr,
PhysicalAddress streamBufEndAddr,
Uint32 streamSize,
EndianMode endian,
BOOL enabledRinbuffer
);
int mkdir_recursive(
char *path,
mode_t omode
);
void SetDefaultEncTestConfig(
TestEncConfig* testConfig
);
typedef struct ST_DECODED_DATA{
Uint8 *ptr_decoded_buf;
int32 size;
int32 end_of_file;
} DECODED_DATA;
CODEC_ERR_STATE nc_receive_buf_to_encode(
Uint8 **out_video_buf,
int32 *auto_free
);
CODEC_ERR_STATE nc_receive_buf_to_decode(
DECODED_DATA **out_video_buf,
int32 *auto_free
);
void call_encode_done_callback(Uint8* val, Uint32 size);
void call_decode_done_callback(Uint8* val, Uint32 size);
void call_last_frame_decoded_callback(void);
extern pthread_mutex_t encoded_lock;
extern pthread_mutex_t decoded_lock;
void nc_lock_encoding_done(void);
/************************************************************************/
/* User Parameters (ENCODER) */
/************************************************************************/
// user scaling list
#define SL_NUM_MATRIX (6)
typedef struct
{
Uint8 s4[SL_NUM_MATRIX][16]; // [INTRA_Y/U/V,INTER_Y/U/V][NUM_COEFF]
Uint8 s8[SL_NUM_MATRIX][64];
Uint8 s16[SL_NUM_MATRIX][64];
Uint8 s32[SL_NUM_MATRIX][64];
Uint8 s16dc[SL_NUM_MATRIX];
Uint8 s32dc[2];
}UserScalingList;
enum ScalingListSize
{
SCALING_LIST_4x4 = 0,
SCALING_LIST_8x8,
SCALING_LIST_16x16,
SCALING_LIST_32x32,
SCALING_LIST_SIZE_NUM
};
int parse_user_scaling_list(
UserScalingList* sl,
FILE* fp_sl,
CodStd stdMode
);
// custom lambda
#define NUM_CUSTOM_LAMBDA (2*52)
int parse_custom_lambda(Uint32 buf[NUM_CUSTOM_LAMBDA], FILE* fp);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _MAIN_HELPER_H_ */