SmartAudio/package/allwinner/tina_multimedia/libcedarc/include/vencoder.h

1132 lines
36 KiB
C
Executable File

/*
* Copyright (c) 2008-2016 Allwinner Technology Co. Ltd.
* All rights reserved.
*
* File : vencoder.h
* Description :
* History :
* Author : fangning <fangning@allwinnertech.com>
* Date : 2016/04/13
* Comment :
*
*
*/
/*
*this software is based in part on the work
* of the Independent JPEG Group
*/
#include "sc_interface.h"
#include "veInterface.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifndef _VENCODER_H_
#define _VENCODER_H_
#define DATA_TIME_LENGTH 24
#define INFO_LENGTH 64
#define GPS_PROCESS_METHOD_LENGTH 100
#define DESCRIPTOR_INFO 128
#define PROC_BUF_LEN 1024
#define MAX_CHANNEL_NUM 16
#define MAX_FRM_NUM 5
#define MAX_GOP_SIZE 63
#define MAX_OVERLAY_SIZE 64
#define VENC_BUFFERFLAG_KEYFRAME 0x00000001
#define VENC_BUFFERFLAG_EOS 0x00000002
#define H264_VERSION2_USE64 0
typedef enum {
PSKIP = 0,
BSKIP_DIRECT = 0,
P16x16 = 1,
P16x8 = 2,
P8x16 = 3,
SMB8x8 = 4,
SMB8x4 = 5,
SMB4x8 = 6,
SMB4x4 = 7,
P8x8 = 8,
I4MB = 9,
I16MB = 10,
IBLOCK = 11,
SI4MB = 12,
I8MB = 13,
IPCM = 14,
MAXMODE = 15
}MB_TYPE;
typedef struct {
short mv_x;
short mv_y;
int mode;
unsigned char lt_flag;
unsigned short depth;
} VencMotionVector;
typedef struct {
MB_TYPE mb_type;
VencMotionVector mb_mv;
}MbMvList;
typedef struct rational_t {
unsigned int num;
unsigned int den;
}rational_t;
typedef struct srational_t {
int num;
int den;
}srational_t;
typedef enum ExifMeteringModeType {
UNKNOWN_AW_EXIF,
AVERAGE_AW_EXIF,
CENTER_AW_EXIF,
SPOT_AW_EXIF,
MULTISPOT_AW_EXIF,
PATTERN_AW_EXIF,
PARTIAL_AW_EXIF,
OTHER_AW_EXIF = 255,
} ExifMeteringModeType;
typedef enum ExifExposureModeType {
EXPOSURE_AUTO_AW_EXIF,
EXPOSURE_MANUAL_AW_EXIF,
EXPOSURE_AUTO_BRACKET_AW_EXIF,
}ExifExposureModeType;
typedef enum {
UNKNOWN = 0,
SUNLIGHT = 1,
TUNGSTEN_LAMP = 2,
FILAMENT_LAMP = 3,
FLASH_LAMP = 4,
OVERCAST = 9,
CLOUDY = 10,
SHADOW = 11,
INCANDESCENT_LAMP = 12,
WHITE_DAY_FLUORESCENT_LAMP = 13,
COOL_COLOUR_FLUORESCENT_LAMP = 14,
WHITE_FLUORESCENT_LAMP = 15,
STANDARD_LAMP_A = 17,
STANDARD_LAMP_B = 18,
STANDARD_lAMP_C = 19,
D55 = 20,
D65 = 21,
D75 = 22,
D50= 23,
PROJECTION_ROOM_LAMP = 24,
OTHERS = 255
}ExifLightSource;
typedef struct EXIFInfo {
unsigned char CameraMake[INFO_LENGTH];
unsigned char CameraModel[INFO_LENGTH];
unsigned char DateTime[DATA_TIME_LENGTH];
unsigned int ThumbWidth;
unsigned int ThumbHeight;
unsigned char* ThumbAddrVir;
unsigned int ThumbLen;
int Orientation; //value can be 0,90,180,270 degree
rational_t ExposureTime; //tag 0x829A
rational_t FNumber; //tag 0x829D
short ISOSpeed;//tag 0x8827
srational_t ShutterSpeedValue; //tag 0x9201
//srational_t BrightnessValue; //tag 0x9203
srational_t ExposureBiasValue; //tag 0x9204
short MeteringMode; //tag 0x9207
short LightSource; //tag 0x9208
short FlashUsed; //tag 0x9209
rational_t FocalLength; //tag 0x920A
rational_t DigitalZoomRatio; // tag 0xA404
short WhiteBalance; //tag 0xA403
short ExposureMode; //tag 0xA402
// gps info
int enableGpsInfo;
double gps_latitude;
double gps_longitude;
double gps_altitude;
long gps_timestamp;
unsigned char gpsProcessingMethod[GPS_PROCESS_METHOD_LENGTH];
unsigned char CameraSerialNum[128]; //tag 0xA431 (exif 2.3 version)
short FocalLengthIn35mmFilm; // tag 0xA405
unsigned char ImageName[128]; //tag 0x010D
unsigned char ImageDescription[128]; //tag 0x010E
short ImageWidth; //tag 0xA002
short ImageHeight; //tag 0xA003
int thumb_quality;
}EXIFInfo;
typedef struct VencRect {
int nLeft;
int nTop;
int nWidth;
int nHeight;
}VencRect;
typedef enum VENC_YUV2YUV {
VENC_YCCToBT601,
VENC_BT601ToYCC,
}VENC_YUV2YUV;
typedef enum VENC_CODING_MODE {
VENC_FRAME_CODING = 0,
VENC_FIELD_CODING = 1,
}VENC_CODING_MODE;
//* The Amount of Temporal SVC Layers
typedef enum {
NO_T_SVC = 0,
T_LAYER_2 = 2,
T_LAYER_3 = 3,
T_LAYER_4 = 4
}T_LAYER;
//* The Multiple of Skip_Frame
typedef enum {
NO_SKIP = 0,
SKIP_2 = 2,
SKIP_4 = 4,
SKIP_8 = 8
}SKIP_FRAME;
typedef enum VENC_CODEC_TYPE {
VENC_CODEC_H264,
VENC_CODEC_JPEG,
VENC_CODEC_H264_VER2,
VENC_CODEC_H265,
VENC_CODEC_VP8,
}VENC_CODEC_TYPE;
typedef enum VENC_PIXEL_FMT {
VENC_PIXEL_YUV420SP,
VENC_PIXEL_YVU420SP,
VENC_PIXEL_YUV420P,
VENC_PIXEL_YVU420P,
VENC_PIXEL_YUV422SP,
VENC_PIXEL_YVU422SP,
VENC_PIXEL_YUV422P,
VENC_PIXEL_YVU422P,
VENC_PIXEL_YUYV422,
VENC_PIXEL_UYVY422,
VENC_PIXEL_YVYU422,
VENC_PIXEL_VYUY422,
VENC_PIXEL_ARGB,
VENC_PIXEL_RGBA,
VENC_PIXEL_ABGR,
VENC_PIXEL_BGRA,
VENC_PIXEL_TILE_32X32,
VENC_PIXEL_TILE_128X32,
VENC_PIXEL_AFBC_AW,
}VENC_PIXEL_FMT;
typedef enum E_ISP_SCALER_RATIO {
VENC_ISP_SCALER_0 = 0, //no write back
VENC_ISP_SCALER_EIGHTH = 1, //scaler 1/8 write back
VENC_ISP_SCALER_HALF = 2, //scaler 1/2 write back
VENC_ISP_SCALER_QUARTER = 3, //scaler 1/4 write back
}E_ISP_SCALER_RATIO;
typedef struct VencThumbInfo {
unsigned int nThumbSize;
unsigned char* pThumbBuf;
}VencThumbInfo;
typedef struct VencBaseConfig {
unsigned int nInputWidth;
unsigned int nInputHeight;
unsigned int nDstWidth;
unsigned int nDstHeight;
unsigned int nStride;
VENC_PIXEL_FMT eInputFormat;
struct ScMemOpsS *memops;
VeOpsS* veOpsS;
void* pVeOpsSelf;
unsigned char bOnlyWbFlag;
}VencBaseConfig;
/**
* H264 profile types
*/
typedef enum VENC_H264PROFILETYPE {
VENC_H264ProfileBaseline = 66, /**< Baseline profile */
VENC_H264ProfileMain = 77, /**< Main profile */
VENC_H264ProfileHigh = 100, /**< High profile */
}VENC_H264PROFILETYPE;
/**
* H264 level types
*/
typedef enum VENC_H264LEVELTYPE {
VENC_H264Level1 = 10, /**< Level 1 */
VENC_H264Level11 = 11, /**< Level 1.1 */
VENC_H264Level12 = 12, /**< Level 1.2 */
VENC_H264Level13 = 13, /**< Level 1.3 */
VENC_H264Level2 = 20, /**< Level 2 */
VENC_H264Level21 = 21, /**< Level 2.1 */
VENC_H264Level22 = 22, /**< Level 2.2 */
VENC_H264Level3 = 30, /**< Level 3 */
VENC_H264Level31 = 31, /**< Level 3.1 */
VENC_H264Level32 = 32, /**< Level 3.2 */
VENC_H264Level4 = 40, /**< Level 4 */
VENC_H264Level41 = 41, /**< Level 4.1 */
VENC_H264Level42 = 42, /**< Level 4.2 */
VENC_H264Level5 = 50, /**< Level 5 */
VENC_H264Level51 = 51, /**< Level 5.1 */
}VENC_H264LEVELTYPE;
typedef struct VencH264ProfileLevel {
VENC_H264PROFILETYPE nProfile;
VENC_H264LEVELTYPE nLevel;
}VencH264ProfileLevel;
typedef struct VencQPRange {
int nMaxqp;
int nMinqp;
}VencQPRange;
typedef struct MotionParam {
int nMotionDetectEnable;
int nMotionDetectRatio; /* 0~12, advise set 0 */
int nStaticDetectRatio; /* 0~12, should be larger than nMotionDetectRatio, advise set 2 */
int nMaxNumStaticFrame; /* advise set 4 */
double nStaticBitsRatio; /* advise set 0.2~0.3 at daytime, set 0.1 at night */
double nMV64x64Ratio; /* advise set 0.01 */
short nMVXTh; /* advise set 6 */
short nMVYTh; /* advise set 6 */
}MotionParam;
typedef struct VencHeaderData {
unsigned char* pBuffer;
unsigned int nLength;
}VencHeaderData;
/* support 4 ROI region */
typedef struct VencROIConfig {
int bEnable;
int index; /* (0~3) */
int nQPoffset;
unsigned char roi_abs_flag;
VencRect sRect;
}VencROIConfig;
typedef struct VencH264FixQP {
int bEnable;
int nIQp;
int nPQp;
}VencH264FixQP;
typedef enum {
AW_CBR = 0,
AW_VBR = 1,
AW_AVBR = 2,
}VENC_RC_MODE;
typedef struct VencInputBuffer {
unsigned long nID;
long long nPts;
unsigned int nFlag;
unsigned char* pAddrPhyY;
unsigned char* pAddrPhyC;
unsigned char* pAddrVirY;
unsigned char* pAddrVirC;
int bEnableCorp;
VencRect sCropInfo;
int ispPicVar;
int ispPicVarChroma; //chroma filter coef[0-63], from isp
int bUseInputBufferRoi;
VencROIConfig roi_param[8];
int bAllocMemSelf;
int nShareBufFd;
unsigned char bUseCsiColorFormat;
VENC_PIXEL_FMT eCsiColorFormat;
int envLV;
}VencInputBuffer;
typedef struct FrameInfo {
int CurrQp;
int avQp;
int nGopIndex;
int nFrameIndex;
int nTotalIndex;
}FrameInfo;
typedef struct VeProcSet {
unsigned char bProcEnable;
unsigned int nProcFreq;
unsigned int nStatisBitRateTime;
unsigned int nStatisFrRateTime;
}VeProcSet;
typedef struct VeProcEncInfo {
unsigned int nChannelNum;
unsigned int nProfileIdc;
int nIDRItl;
int nBitRate;
int nFrameRate;
unsigned int nInputWidth;
unsigned int nInputHeight;
unsigned int nDstWidth;
unsigned int nDstHeight;
unsigned int nStride;
int eSliceType;
int nCurrQp;
int nGopIndex;
int nFrameIndex;
int nTotalIndex;
unsigned int uMaxBitRate;
int nMinStaticPercent;
VENC_RC_MODE eRcMode;
VencH264FixQP fix_qp;
int i_qp_offset;
int qp_max;
int qp_min;
unsigned int AFBC_Enable;
unsigned int rot_angle;
unsigned char filter3d_level;
int crop_left;
int crop_top;
int crop_width;
int crop_height;
unsigned int qp_offset1;
unsigned int qp_offset2;
unsigned int qp_offset3;
unsigned int qp_offset4;
unsigned int qp_offset5;
unsigned int qp_offset6;
unsigned int qp_offset7;
unsigned int qp_offset8;
unsigned int avr_bit_rate;
unsigned int real_bit_rate;
unsigned int avr_frame_rate;
unsigned int real_frame_rate;
int vbv_size;
int UnusedBufferSize;
int nValidFrameNum;
int nValidDataSize;
}VeProcEncInfo;
typedef struct VencOutputBuffer {
int nID;
long long nPts;
unsigned int nFlag;
unsigned int nSize0;
unsigned int nSize1;
unsigned char* pData0;
unsigned char* pData1;
FrameInfo frame_info;
}VencOutputBuffer;
typedef struct VencAllocateBufferParam {
unsigned int nBufferNum;
unsigned int nSizeY;
unsigned int nSizeC;
}VencAllocateBufferParam;
#define EXTENDED_SAR 255
typedef struct VencH264AspectRatio {
unsigned char aspect_ratio_idc;
unsigned short sar_width;
unsigned short sar_height;
}VencH264AspectRatio;
typedef struct VencSaveBSFile {
char filename[256];
unsigned char save_bsfile_flag;
unsigned int save_start_time;
unsigned int save_end_time;
}VencSaveBSFile;
typedef enum VENC_COLOR_SPACE {
RESERVED0 = 0,
VENC_BT709 = 1, /* bt709 */
RESERVED1 = 2,
RESERVED2 = 3,
RESERVED3 = 4,
VENC_BT601 = 5, /* bt601-625 default use this colorspace */
BT601_525 = 6, /* bt601-525 */
RESERVED4 = 7,
VENC_YCC = 8, /* YCC: full range BT.601 */
}VENC_COLOR_SPACE;
typedef enum VENC_VIDEO_FORMAT {
COMPONENT = 0, /* component */
PAL = 1, /* pal*/
NTSC = 2, /* ntsc */
SECAM = 3, /* secam */
MAC = 4, /* mac */
DEFAULT = 5, /* Unspecified video format */
}VENC_VIDEO_FORMAT;
typedef struct VencJpegVideoSignal {
VENC_COLOR_SPACE src_colour_primaries;
VENC_COLOR_SPACE dst_colour_primaries;
}VencJpegVideoSignal;
typedef struct VencH264VideoSignal {
VENC_VIDEO_FORMAT video_format;
unsigned char full_range_flag;
VENC_COLOR_SPACE src_colour_primaries;
VENC_COLOR_SPACE dst_colour_primaries;
}VencH264VideoSignal;
typedef struct VencH264VideoTiming {
unsigned long num_units_in_tick;
unsigned long time_scale;
unsigned int fixed_frame_rate_flag;
}VencH264VideoTiming;
// Add for setting SVC and Skip_Frame
typedef struct VencH264SVCSkip {
T_LAYER nTemporalSVC;
SKIP_FRAME nSkipFrame;
int bEnableLayerRatio;
unsigned int nLayerRatio[4];
}VencH264SVCSkip;
typedef struct VencCyclicIntraRefresh {
int bEnable;
int nBlockNumber;
}VencCyclicIntraRefresh;
typedef struct VencSize {
int nWidth;
int nHeight;
}VencSize;
typedef enum VENC_VIDEO_GOP_MODE {
AW_NORMALP = 0, //one p ref frame
AW_DOUBLEP = 1, //double p ref frames
AW_SMARTP = 2, //double p ref frames and use virtual i frame
}VENC_VIDEO_GOP_MODE;
typedef struct VencAdvancedRefParam {
unsigned char bAdvancedRefEn; //advanced ref frame mode, 0:not use , 1:use
unsigned int nBase; //base frame num
unsigned int nEnhance; //enhance frame num
unsigned char bRefBaseEn; //ctrl base frame ref base frame, 0:enable, 1:disable
}VencAdvancedRefParam;
typedef struct VencGopParam {
unsigned char bUseGopCtrlEn; //use user set gop mode
VENC_VIDEO_GOP_MODE eGopMode; //gop mode
unsigned int nVirtualIFrameInterval;
unsigned int nSpInterval; //user set special p frame ref interval
VencAdvancedRefParam sRefParam; //user set advanced ref frame mode
}VencGopParam;
typedef struct VencH264Param {
VencH264ProfileLevel sProfileLevel;
int bEntropyCodingCABAC; /* 0:CAVLC 1:CABAC*/
VencQPRange sQPRange;
int nFramerate; /* fps*/
int nBitrate; /* bps*/
int nMaxKeyInterval;
VENC_CODING_MODE nCodingMode;
unsigned char bLongRefEnable;
int nLongRefPoc;
VencGopParam sGopParam;
}VencH264Param;
typedef struct VencCheckColorFormat {
int index;
VENC_PIXEL_FMT eColorFormat;
}VencCheckColorFormat;
typedef struct VencVP8Param {
int nFramerate; /* fps*/
int nBitrate; /* bps*/
int nMaxKeyInterval;
}VencVP8Param;
typedef enum VENC_SUPERFRAME_MODE {
VENC_SUPERFRAME_NONE,
VENC_SUPERFRAME_DISCARD,
VENC_SUPERFRAME_REENCODE,
}VENC_SUPERFRAME_MODE;
typedef struct VencSuperFrameConfig {
VENC_SUPERFRAME_MODE eSuperFrameMode;
unsigned int nMaxIFrameBits;
unsigned int nMaxPFrameBits;
}VencSuperFrameConfig;
typedef struct VencBitRateRange {
int bitRateMax;
int bitRateMin;
}VencBitRateRange;
typedef struct VencRoiBgFrameRate {
int nSrcFrameRate;
int nDstFrameRate;
}VencRoiBgFrameRate;
typedef struct VencAlterFrameRateInfo {
unsigned char bEnable;
unsigned char bUseUserSetRoiInfo; //0:use csi roi info; 1:use user set roi info
VencRoiBgFrameRate sRoiBgFrameRate;
VencROIConfig roi_param[8];
}VencAlterFrameRateInfo;
typedef struct VencH265TranS {
/*** unsigned char transquant_bypass_enabled_flag; not support ***/
//0:disable transform skip; 1:enable transform skip
unsigned char transform_skip_enabled_flag;
//chroma_qp= sliece_qp+chroma_qp_offset
char chroma_qp_offset;
}VencH265TranS;
typedef struct VencH265SaoS {
//0:disable luma sao filter; 1:enable luma sao filter
unsigned char slice_sao_luma_flag;
//0:disable chroma sao filter; 1:enable chroma sao filter
unsigned char slice_sao_chroma_flag;
}VencH265SaoS;
typedef struct VencH265DblkS {
//0:enable deblock filter; 1:disable deblock filter
unsigned char slice_deblocking_filter_disabled_flag;
char slice_beta_offset_div2; //range: [-6,6]
char slice_tc_offset_div2; //range: [-6,6]
}VencH265DblkS;
typedef struct VencH265TimingS {
//0:stream without timing info; 1:stream with timing info
unsigned char timing_info_present_flag;
unsigned int num_units_in_tick; //time_scale/frameRate
unsigned int time_scale; //1second is average divided by time_scale
unsigned int num_ticks_poc_diff_one; //num ticks of diff frame
}VencH265TimingS;
typedef enum VENC_OVERLAY_ARGB_TYPE {
VENC_OVERLAY_ARGB_MIN = -1,
VENC_OVERLAY_ARGB8888 = 0,
VENC_OVERLAY_ARGB4444 = 1,
VENC_OVERLAY_ARGB1555 = 2,
VENC_OVERLAY_ARGB_MAX = 3,
}VENC_OVERLAY_ARGB_TYPE;
typedef enum VENC_OVERLAY_TYPE {
NORMAL_OVERLAY = 0, //normal overlay
COVER_OVERLAY = 1, //use the setting yuv to cover region
LUMA_REVERSE_OVERLAY = 2, //normal overlay and luma reverse
}VENC_OVERLAY_TYPE;
typedef struct VencOverlayCoverYuvS {
//1:use the cover yuv; 0:transform the argb data to yuv and cover
unsigned char use_cover_yuv_flag;
unsigned char cover_y; //the value of cover y
unsigned char cover_u; //the value of cover u
unsigned char cover_v; //the value of cover v
}VencOverlayCoverYuvS;
typedef struct VencOverlayHeaderS {
unsigned short start_mb_x; //horizonal value of start points divided by 16
unsigned short end_mb_x; //horizonal value of end points divided by 16
unsigned short start_mb_y; //vertical value of start points divided by 16
unsigned short end_mb_y; //vertical value of end points divided by 16
unsigned char extra_alpha_flag; //0:no use extra_alpha; 1:use extra_alpha
unsigned char extra_alpha; //use user set extra_alpha, range is [0, 15]
VencOverlayCoverYuvS cover_yuv; //when use COVER_OVERLAY should set the cover yuv
VENC_OVERLAY_TYPE overlay_type; //reference define of VENC_OVERLAY_TYPE
unsigned char* overlay_blk_addr; //the vir addr of overlay block
unsigned int bitmap_size; //the size of bitmap
}VencOverlayHeaderS;
typedef struct VencOverlayInfoS {
unsigned char blk_num; //num of overlay region
VENC_OVERLAY_ARGB_TYPE argb_type;//reference define of VENC_ARGB_TYPE
VencOverlayHeaderS overlayHeaderList[MAX_OVERLAY_SIZE];
}VencOverlayInfoS;
typedef struct VencBrightnessS {
unsigned int dark_th; //dark threshold, default 60, range[0, 255]
unsigned int bright_th; //bright threshold, default 200, range[0, 255]
}VencBrightnessS;
typedef struct VencEncodeTimeS {
unsigned int frame_num; //current frame num
unsigned int curr_enc_time; //current frame encoder time
unsigned int curr_empty_time; //the time between current frame and last frame
unsigned int avr_enc_time; //average encoder time
unsigned int avr_empty_time; //average empty time
unsigned int max_enc_time;
unsigned int max_enc_time_frame_num;
unsigned int max_empty_time;
unsigned int max_empty_time_frame_num;
}VencEncodeTimeS;
typedef enum VENC_INDEXTYPE {
VENC_IndexParamBitrate = 0x0,
/**< reference type: int */
VENC_IndexParamFramerate,
/**< reference type: int */
VENC_IndexParamMaxKeyInterval,
/**< reference type: int */
VENC_IndexParamIfilter,
/**< reference type: int */
VENC_IndexParamRotation,
/**< reference type: int */
VENC_IndexParamSliceHeight,
/**< reference type: int */
VENC_IndexParamForceKeyFrame,
/**< reference type: int (write only)*/
VENC_IndexParamMotionDetectEnable,
/**< reference type: MotionParam(write only) */
VENC_IndexParamMotionDetectStatus,
/**< reference type: int(read only) */
VENC_IndexParamRgb2Yuv,
/**< reference type: VENC_COLOR_SPACE */
VENC_IndexParamYuv2Yuv,
/**< reference type: VENC_YUV2YUV */
VENC_IndexParamROIConfig,
/**< reference type: VencROIConfig */
VENC_IndexParamStride,
/**< reference type: int */
VENC_IndexParamColorFormat,
/**< reference type: VENC_PIXEL_FMT */
VENC_IndexParamSize,
/**< reference type: VencSize(read only) */
VENC_IndexParamSetVbvSize,
/**< reference type: setVbvSize(write only) */
VENC_IndexParamVbvInfo,
/**< reference type: getVbvInfo(read only) */
VENC_IndexParamSuperFrameConfig,
/**< reference type: VencSuperFrameConfig */
VENC_IndexParamSetPSkip,
/**< reference type: unsigned int */
VENC_IndexParamResetEnc,
/**< reference type: */
VENC_IndexParamSaveBSFile,
/**< reference type: VencSaveBSFile */
VENC_IndexParamHorizonFlip,
/**< reference type: unsigned int */
/* check capabiliy */
VENC_IndexParamMAXSupportSize,
/**< reference type: VencSize(read only) */
VENC_IndexParamCheckColorFormat,
/**< reference type: VencCheckFormat(read only) */
/* H264 param */
VENC_IndexParamH264Param = 0x100,
/**< reference type: VencH264Param */
VENC_IndexParamH264SPSPPS,
/**< reference type: VencHeaderData (read only)*/
VENC_IndexParamH264QPRange,
/**< reference type: VencQPRange */
VENC_IndexParamH264ProfileLevel,
/**< reference type: VencProfileLevel */
VENC_IndexParamH264EntropyCodingCABAC,
/**< reference type: int(0:CAVLC 1:CABAC) */
VENC_IndexParamH264CyclicIntraRefresh,
/**< reference type: VencCyclicIntraRefresh */
VENC_IndexParamH264FixQP,
/**< reference type: VencH264FixQP */
VENC_IndexParamH264SVCSkip,
/**< reference type: VencH264SVCSkip */
VENC_IndexParamH264AspectRatio,
/**< reference type: VencH264AspectRatio */
VENC_IndexParamFastEnc,
/**< reference type: int */
VENC_IndexParamH264VideoSignal,
/**< reference type: VencH264VideoSignal */
VENC_IndexParamH264VideoTiming,
/**< reference type: VencH264VideoTiming */
VENC_IndexParamChmoraGray,
/**< reference type: unsigned char */
VENC_IndexParamIQpOffset,
/**< reference type: int */
/* jpeg param */
VENC_IndexParamJpegQuality = 0x200,
/**< reference type: int (1~100) */
VENC_IndexParamJpegExifInfo,
/**< reference type: EXIFInfo */
VENC_IndexParamJpegEncMode,
/**< reference type: 0:jpeg; 1:motion_jepg */
VENC_IndexParamJpegVideoSignal,
/**< reference type: VencJpegVideoSignal */
/* VP8 param */
VENC_IndexParamVP8Param,
/* max one frame length */
VENC_IndexParamSetFrameLenThreshold,
/**< reference type: int */
/* decrease the a20 dram bands */
VENC_IndexParamSetA20LowBands,
/**< reference type: 0:disable; 1:enable */
VENC_IndexParamSetBitRateRange,
/**< reference type: VencBitRateRange */
VENC_IndexParamLongTermReference,
/**< reference type: 0:disable; 1:enable, default:enable */
/* h265 param */
VENC_IndexParamH265Param = 0x300,
VENC_IndexParamH265Gop,
VENC_IndexParamH265ToalFramesNum,
VENC_IndexParamH26xUpdateLTRef,
VENC_IndexParamH265Header,
VENC_IndexParamH265TendRatioCoef,
VENC_IndexParamH265Trans,
/**< reference type: VencH265TranS */
VENC_IndexParamH265Sao,
/**< reference type: VencH265SaoS */
VENC_IndexParamH265Dblk,
/**< reference type: VencH265DblkS */
VENC_IndexParamH265Timing,
/**< reference type: VencH265TimingS */
VENC_IndexParamIntraPeriod,
VENC_IndexParamMBModeCtrl,
VENC_IndexParamMBSumInfoOutput,
VENC_IndexParamMBInfoOutput,
VENC_IndexParamVUIAspectRatio,
VENC_IndexParamVUIVideoSignal,
VENC_IndexParamVUIChromaLoc,
VENC_IndexParamVUIDisplayWindow,
VENC_IndexParamVUIBitstreamRestriction,
VENC_IndexParamAlterFrame = 0x400,
/**< reference type: unsigned int */
VENC_IndexParamVirtualIFrame,
VENC_IndexParamChannelNum,
VENC_IndexParamProcSet,
/**< reference type: VencOverlayInfoS */
VENC_IndexParamSetOverlay,
/**< reference type: unsigned char */
VENC_IndexParamAllParams,
/**< reference type:VencBrightnessS */
VENC_IndexParamBright,
/**< reference type:VencSmartFun */
VENC_IndexParamSmartFuntion,
/**< reference type: VencHVS */
VENC_IndexParamHVS,
/**< reference type: unsigned char */
VENC_IndexParamSkipTend,
/**< reference type: unsigned char */
VENC_IndexParamHighPassFilter,
/**< reference type: unsigned char */
VENC_IndexParamPFrameIntraEn,
/**< reference type: unsigned char */
VENC_IndexParamEncodeTimeEn,
/**< reference type: VencEncodeTimeS */
VENC_IndexParamGetEncodeTime,
/**< reference type: unsigned char */
VENC_IndexParam3DFilter,
/**< reference type: unsigned char */
VENC_IndexParamIntra4x4En,
/**< reference type: unsigned int */
VENC_IndexParamSetNullFrame = 0x500,
/**< reference type: VencThumbInfo */
VENC_IndexParamGetThumbYUV,
/**< reference type: E_ISP_SCALER_RATIO */
VENC_IndexParamSetThumbScaler,
}VENC_INDEXTYPE;
typedef enum VENC_RESULT_TYPE {
VENC_RESULT_ERROR = -1,
VENC_RESULT_OK = 0,
VENC_RESULT_NO_FRAME_BUFFER = 1,
VENC_RESULT_BITSTREAM_IS_FULL = 2,
VENC_RESULT_ILLEGAL_PARAM = 3,
VENC_RESULT_NOT_SUPPORT = 4,
VENC_RESULT_BITSTREAM_IS_EMPTY = 5,
VENC_RESULT_NO_MEMORY = 6,
}VENC_RESULT_TYPE;
typedef enum {
H265_B_SLICE = 0x0,
H265_P_SLICE = 0x1,
H265_I_SLICE = 0x2,
H265_IDR_SLICE = 0x12
}VENC_H265_CODE_TYPE;
typedef struct JpegEncInfo {
VencBaseConfig sBaseInfo;
int bNoUseAddrPhy;
unsigned char* pAddrPhyY;
unsigned char* pAddrPhyC;
unsigned char* pAddrVirY;
unsigned char* pAddrVirC;
int bEnableCorp;
VencRect sCropInfo;
int quality;
int nShareBufFd;
}JpegEncInfo;
typedef struct VbvInfo {
unsigned int vbv_size;
unsigned int coded_frame_num;
unsigned int coded_size;
unsigned int maxFrameLen;
}VbvInfo;
typedef enum {
VENC_H265ProfileMain = 1,
VENC_H265ProfileMain10 = 2,
VENC_H264ProfileMainStill = 3
}VENC_H265PROFILETYPE;
typedef enum {
VENC_H265Level1 = 30, /**< Level 1 */
VENC_H265Level2 = 60, /**< Level 2 */
VENC_H265Level21 = 63, /**< Level 2.1 */
VENC_H265Level3 = 90, /**< Level 3 */
VENC_H265Level31 = 93, /**< Level 3.1 */
VENC_H265Level41 = 123, /**< Level 4.1 */
VENC_H265Level5 = 150, /**< Level 5 */
VENC_H265Level51 = 153, /**< Level 5.1 */
VENC_H265Level52 = 156, /**< Level 5.2 */
VENC_H265Level6 = 180, /**< Level 6 */
VENC_H265Level61 = 183, /**< Level 6.1 */
VENC_H265Level62 = 186 /**< Level 6.2 */
}VENC_H265LEVELTYPE;
typedef enum {
REF_IDC_DISCARD = 0,
REF_IDC_CURRENT_USE = 1,
REF_IDC_FUTURE_USE = 2,
REF_IDC_LONG_TERM = 4,
REF_IDC_CURRENT_REF = 8,
}ReferenceIdc;
typedef struct {
VENC_H265PROFILETYPE nProfile;
VENC_H265LEVELTYPE nLevel;
}VencH265ProfileLevel;
typedef struct {
VENC_RC_MODE eRcMode;
unsigned int uStatTime;
unsigned int uInputFrmRate;
unsigned int uOutputFrmRate;
unsigned int uMaxBitRate;
unsigned int uMinIprop;
unsigned int uMaxIprop;
int nMaxReEncodeTimes;
unsigned char bQpMapEn;
int nMinStaticPercent;
unsigned int uMaxStaticIQp;
unsigned int uMinIQp;
unsigned int uMaxIQp;
}VencRcParam;
typedef struct {
int idr_period;
VencH265ProfileLevel sProfileLevel;
int bLongTermRef;
VencQPRange sQPRange;
int nFramerate; /* fps*/
int nBitrate; /* bps*/
int nIntraPeriod;
int nGopSize;
int nQPInit; /* qp of first IDR_frame if use rate control */
VencRcParam sRcParam;
VencGopParam sGopParam;
}VencH265Param;
typedef struct {
unsigned int slice_type;
int poc; // dispaly order of the frame within a GOP, ranging from 1 to gop_size
int qp_offset;
#if 0
float qp_factor; // used for RDO weighting,the bigger value means the lower quality
// and less bits, ranging from 0.3 to 1.0
#endif
int tc_offset_div2; // offset of LoopFilterTcOffsetDiv2, ranging from -6 to 6
int beta_offset_div2; // offset of LoopFilterTcOffsetDiv2, ranging from -6 to 6
unsigned int num_ref_pics; // number of ref_frames reserved for cur_frame and future frames
unsigned int num_ref_pics_active; // number of ref_frames is permited to be used in L0 or L1
int reference_pics[MAX_FRM_NUM-1]; // = ref_frame_poc - cur_frame_poc
// = discard_frame_poc - cur_frame_poc, means derlta_poc of ref_frames which are discarded
int discard_pics[MAX_FRM_NUM-1];
unsigned char lt_ref_flag; // 1: enable cur_frame use long term ref_frame
int lt_ref_poc; // poc of lt_ref_frame of cur_frame
// 0 means next 4 member parameters are ignored; 1 means next 3 member parameters are need
// this parameter of the first frame of a GOP must be 0
unsigned char predict;
unsigned int delta_rps_idx; // = cur_frame_encoding_idx - predictor_frame_encoding_idx
int delta_rps; // = predictor_frame_poc - cur_frame_poc
// num of ref_idcs to encoder for the current frame, the value is equal to
// the value of num_st_ref_pics of the predictor_frame + 1 + lt_ref_flag
unsigned int num_ref_idcs;
// [][0]=(ref_frame_poc or discard_frame_poc) - cur_frame_poc
// [][1]indicating the ref_pictures reserved in ref_list_buffer:
// [][1]=0: will not be a ref_picture anymore
// [][1]=1: is a ref_picture used by cur_picture
// [][1]=2: is a ref_picture used by future_picture
// [][1]=3: is a long term ref_picture
int reference_idcs[MAX_FRM_NUM][2];
}RefPicSet;
typedef struct {
int gop_size;
int intra_period;
int max_num_ref_pics;
unsigned char num_ref_idx_l0_default_active;
unsigned char num_ref_idx_l1_default_active;
RefPicSet ref_str[MAX_GOP_SIZE + 2]; // just when custom_rps_flag is 1, it should be set
unsigned char use_sps_rps_flag; // if it is 1, rps will not occur in slice_header
unsigned char use_lt_ref_flag;
unsigned char custom_rps_flag; // 0: default ref_str will be use; 1: user should set ref_str[]
}VencH265GopStruct;
#define MAX_NUM_MB (65536)
typedef struct {
unsigned char mb_mad;
unsigned char mb_qp;
unsigned int mb_sse;
double mb_psnr;
}VencMBInfoPara;
typedef struct {
unsigned int num_mb;
VencMBInfoPara *p_para;
}VencMBInfo;
typedef struct {
unsigned int sum_mad;
unsigned int sum_qp;
unsigned long long sum_sse;
}VencMBSumInfo;
typedef struct {
unsigned char mb_qp : 6; // {5:0}
unsigned char mb_skip_flag : 1; // {6}
unsigned char mb_en : 1; // {7}
}VencMBModeCtrlInfo;
typedef struct {
unsigned char mode_ctrl_en;
VencMBModeCtrlInfo *p_info;
}VencMBModeCtrl;
typedef struct {
unsigned char hp_filter_en;
unsigned int hpf_coef_shift;
unsigned int hpf_coef_th;
unsigned int hpf_mad_th;
unsigned int hpf_contrast_th;
}VencHighPassFilter;
typedef struct {
unsigned char hvs_en;
unsigned int th_dir;
unsigned int th_coef_shift;
}VencHVS;
typedef struct {
unsigned int inter_tend;
unsigned int skip_tend;
unsigned int merge_tend;
}VencH265TendRatioCoef;
typedef struct {
unsigned char smart_fun_en;
unsigned char img_bin_en;
unsigned int img_bin_th;
unsigned int shift_bits;
}VencSmartFun;
typedef struct {
unsigned int chroma_sample_top;
unsigned int chroma_sample_bottom;
}VencVUIChromaLoc;
typedef struct {
unsigned int win_left_offset;
unsigned int win_right_offset;
unsigned int win_top_offset;
unsigned int win_bottom_offset;
}VencVUIDisplayWindow;
typedef struct {
unsigned char tiles_fixed_structure_flag;
unsigned char mv_over_pic_boundaries_flag;
unsigned char restricted_ref_pic_lists_flag;
unsigned int min_spatial_seg_idc;
unsigned int max_bytes_per_pic_denom;
unsigned int max_bits_per_min_cu_denom;
unsigned int log2_max_mv_len_hor;
unsigned int log2_max_mv_len_ver;
}VencVUIBitstreamRestriction;
int AWJpecEnc(JpegEncInfo* pJpegInfo, EXIFInfo* pExifInfo,
void* pOutBuffer, int* pOutBufferSize);
typedef void* VideoEncoder;
VideoEncoder* VideoEncCreate(VENC_CODEC_TYPE eCodecType);
void VideoEncDestroy(VideoEncoder* pEncoder);
int VideoEncInit(VideoEncoder* pEncoder, VencBaseConfig* pConfig);
int VideoEncUnInit(VideoEncoder* pEncoder);
int AllocInputBuffer(VideoEncoder* pEncoder, VencAllocateBufferParam *pBufferParam);
int GetOneAllocInputBuffer(VideoEncoder* pEncoder, VencInputBuffer* pInputbuffer);
int FlushCacheAllocInputBuffer(VideoEncoder* pEncoder, VencInputBuffer *pInputbuffer);
int ReturnOneAllocInputBuffer(VideoEncoder* pEncoder, VencInputBuffer *pInputbuffer);
int ReleaseAllocInputBuffer(VideoEncoder* pEncoder);
int AddOneInputBuffer(VideoEncoder* pEncoder, VencInputBuffer* pInputbuffer);
int VideoEncodeOneFrame(VideoEncoder* pEncoder);
int AlreadyUsedInputBuffer(VideoEncoder* pEncoder, VencInputBuffer* pBuffer);
int ValidBitstreamFrameNum(VideoEncoder* pEncoder);
int GetOneBitstreamFrame(VideoEncoder* pEncoder, VencOutputBuffer* pBuffer);
int FreeOneBitStreamFrame(VideoEncoder* pEncoder, VencOutputBuffer* pBuffer);
int VideoEncGetParameter(VideoEncoder* pEncoder, VENC_INDEXTYPE indexType, void* paramData);
int VideoEncSetParameter(VideoEncoder* pEncoder, VENC_INDEXTYPE indexType, void* paramData);
int VideoEncoderReset(VideoEncoder* pEncoder);
unsigned int VideoEncoderGetUnencodedBufferNum(VideoEncoder* pEncoder);
void VideoEncoderGetVeIommuAddr(VideoEncoder* pEncoder, struct user_iommu_param *pIommuBuf);
void VideoEncoderFreeVeIommuAddr(VideoEncoder* pEncoder, struct user_iommu_param *pIommuBuf);
int VideoEncoderSetFreq(VideoEncoder* pEncoder, int nVeFreq);
#endif //_VENCODER_H_
#ifdef __cplusplus
}
#endif /* __cplusplus */