1*4882a593Smuzhiyun /* GPL-2.0 WITH Linux-syscall-note OR Apache 2.0 */ 2*4882a593Smuzhiyun /* Copyright (c) 2021 Fuzhou Rockchip Electronics Co., Ltd */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef INCLUDE_RT_MPI_RK_COMM_VDEC_H_ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #define INCLUDE_RT_MPI_RK_COMM_VDEC_H_ 7*4882a593Smuzhiyun #include "rk_type.h" 8*4882a593Smuzhiyun #include "rk_common.h" 9*4882a593Smuzhiyun #include "rk_errno.h" 10*4882a593Smuzhiyun #include "rk_comm_video.h" 11*4882a593Smuzhiyun #include "rk_comm_mb.h" 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifdef __cplusplus 14*4882a593Smuzhiyun #if __cplusplus 15*4882a593Smuzhiyun extern "C" { 16*4882a593Smuzhiyun #endif 17*4882a593Smuzhiyun #endif /* End of #ifdef __cplusplus */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define RK_IO_BLOCK RK_TRUE 20*4882a593Smuzhiyun #define RK_IO_NOBLOCK RK_FALSE 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun typedef enum rkVIDEO_DEC_MODE_E { 23*4882a593Smuzhiyun VIDEO_DEC_MODE_IPB = 0, 24*4882a593Smuzhiyun VIDEO_DEC_MODE_IP, 25*4882a593Smuzhiyun VIDEO_DEC_MODE_I, 26*4882a593Smuzhiyun VIDEO_DEC_MODE_BUTT 27*4882a593Smuzhiyun } VIDEO_DEC_MODE_E; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun typedef enum rkVIDEO_OUTPUT_ORDER_E { 30*4882a593Smuzhiyun VIDEO_OUTPUT_ORDER_DISP = 0, 31*4882a593Smuzhiyun VIDEO_OUTPUT_ORDER_DEC, 32*4882a593Smuzhiyun VIDEO_OUTPUT_ORDER_BUTT 33*4882a593Smuzhiyun } VIDEO_OUTPUT_ORDER_E; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun typedef enum rkVIDEO_MODE_E { 36*4882a593Smuzhiyun VIDEO_MODE_STREAM = 0, /* send by stream */ 37*4882a593Smuzhiyun VIDEO_MODE_FRAME, /* send by frame */ 38*4882a593Smuzhiyun VIDEO_MODE_COMPAT, /* One frame supports multiple packets sending. */ 39*4882a593Smuzhiyun /* The current frame is considered to end when bEndOfFrame is equal to RK_TRUE */ 40*4882a593Smuzhiyun VIDEO_MODE_BUTT 41*4882a593Smuzhiyun } VIDEO_MODE_E; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun typedef struct rkVDEC_PARAM_VIDEO_S { 44*4882a593Smuzhiyun RK_BOOL bDeiEn; /* RW, deinterlace enable */ 45*4882a593Smuzhiyun RK_S32 s32ErrThreshold; /* RW, Range: [0, 100]; */ 46*4882a593Smuzhiyun /* threshold for stream error process, 0: discard with any error, 100 : keep data with any error */ 47*4882a593Smuzhiyun VIDEO_DEC_MODE_E enDecMode; /* RW; */ 48*4882a593Smuzhiyun /* decode mode , 0: deocde IPB frames, 1: only decode I frame & P frame , 2: only decode I frame */ 49*4882a593Smuzhiyun VIDEO_OUTPUT_ORDER_E enOutputOrder; /* RW; */ 50*4882a593Smuzhiyun /* frames output order ,0: the same with display order , 1: the same width decoder order */ 51*4882a593Smuzhiyun COMPRESS_MODE_E enCompressMode; /* RW; compress mode */ 52*4882a593Smuzhiyun VIDEO_FORMAT_E enVideoFormat; /* RW; video format */ 53*4882a593Smuzhiyun } VDEC_PARAM_VIDEO_S; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun typedef struct rkVDEC_PARAM_PICTURE_S { 56*4882a593Smuzhiyun PIXEL_FORMAT_E enPixelFormat; /* RW; out put pixel format */ 57*4882a593Smuzhiyun RK_U32 u32Alpha; /* RW, Range: [0, 255]; value 0 is transparent. */ 58*4882a593Smuzhiyun /* [0 ,127] is deemed to transparent when enPixelFormat is ARGB1555 or ABGR1555 59*4882a593Smuzhiyun * [128 ,256] is deemed to non-transparent when enPixelFormat is ARGB1555 or ABGR1555 60*4882a593Smuzhiyun */ 61*4882a593Smuzhiyun } VDEC_PARAM_PICTURE_S; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun typedef struct rkVDEC_CHN_PARAM_S { 64*4882a593Smuzhiyun RK_CODEC_ID_E enType; /* RW; video type to be decoded */ 65*4882a593Smuzhiyun RK_U32 u32DisplayFrameNum; /* RW, Range: [0, 16]; display frame num */ 66*4882a593Smuzhiyun union { 67*4882a593Smuzhiyun VDEC_PARAM_VIDEO_S stVdecVideoParam; /* structure with video ( h265/h264/mpeg2/mpeg4) */ 68*4882a593Smuzhiyun VDEC_PARAM_PICTURE_S stVdecPictureParam; /* structure with picture (jpeg/mjpeg ) */ 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun } VDEC_CHN_PARAM_S; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun typedef struct rkVDEC_ATTR_VIDEO_S { 73*4882a593Smuzhiyun RK_U32 u32RefFrameNum; /* RW, Range: [0, 16]; reference frame num. */ 74*4882a593Smuzhiyun RK_BOOL bTemporalMvpEnable; /* RW; */ 75*4882a593Smuzhiyun /* specifies whether temporal motion vector predictors can be used for inter prediction */ 76*4882a593Smuzhiyun RK_U32 u32TmvBufSize; /* RW; tmv buffer size(Byte) */ 77*4882a593Smuzhiyun } VDEC_ATTR_VIDEO_S; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun typedef struct rkVDEC_CHN_ATTR_S { 80*4882a593Smuzhiyun VIDEO_MODE_E enMode; 81*4882a593Smuzhiyun RK_CODEC_ID_E enType; /* RW; video type to be decoded */ 82*4882a593Smuzhiyun RK_U32 u32PicWidth; /* RW; pic width */ 83*4882a593Smuzhiyun RK_U32 u32PicHeight; /* RW; pic height */ 84*4882a593Smuzhiyun RK_U32 u32PicVirWidth; /* RW; pic virtual width */ 85*4882a593Smuzhiyun RK_U32 u32PicVirHeight; /* RW; pic virtual height */ 86*4882a593Smuzhiyun RK_U32 u32StreamBufSize; /* RW; stream buffer size(Byte) */ 87*4882a593Smuzhiyun RK_U32 u32FrameBufSize; /* RW; frame buffer size(Byte) */ 88*4882a593Smuzhiyun RK_U32 u32FrameBufCnt; /* RW; frame buffer cnt */ 89*4882a593Smuzhiyun RK_U32 u32StreamBufCnt; /* RW; stream buffer cnt */ 90*4882a593Smuzhiyun union { 91*4882a593Smuzhiyun VDEC_ATTR_VIDEO_S stVdecVideoAttr; /* structure with video ( h264/h265) */ 92*4882a593Smuzhiyun }; 93*4882a593Smuzhiyun } VDEC_CHN_ATTR_S; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun typedef struct rkVDEC_STREAM_S { 96*4882a593Smuzhiyun MB_BLK pMbBlk; 97*4882a593Smuzhiyun RK_U32 u32Len; /* W; stream len */ 98*4882a593Smuzhiyun RK_U64 u64PTS; /* W; time stamp */ 99*4882a593Smuzhiyun RK_BOOL bEndOfStream; /* W; is the end of all stream */ 100*4882a593Smuzhiyun RK_BOOL bEndOfFrame; /* W; is the end of frame */ 101*4882a593Smuzhiyun RK_BOOL bBypassMbBlk; /* FALSE: copy, TRUE: MbBlock owned by internal */ 102*4882a593Smuzhiyun } VDEC_STREAM_S; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun typedef struct rkVDEC_DECODE_ERROR_S { 105*4882a593Smuzhiyun RK_S32 s32FormatErr; /* R; format error. eg: do not support filed */ 106*4882a593Smuzhiyun RK_S32 s32PicSizeErrSet; /* R; picture width or height is larger than chnnel width or height */ 107*4882a593Smuzhiyun RK_S32 s32StreamUnsprt; /* R; unsupport the stream specification */ 108*4882a593Smuzhiyun RK_S32 s32PackErr; /* R; stream package error */ 109*4882a593Smuzhiyun RK_S32 s32PrtclNumErrSet; /* R; protocol num is not enough. eg: slice, pps, sps */ 110*4882a593Smuzhiyun RK_S32 s32RefErrSet; /* R; refrence num is not enough */ 111*4882a593Smuzhiyun RK_S32 s32PicBufSizeErrSet; /* R; the buffer size of picture is not enough */ 112*4882a593Smuzhiyun RK_S32 s32StreamSizeOver; /* R; the stream size is too big and and force discard stream */ 113*4882a593Smuzhiyun RK_S32 s32VdecStreamNotRelease; /* R; the stream not released for too long time */ 114*4882a593Smuzhiyun } VDEC_DECODE_ERROR_S; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun typedef struct rkVDEC_CHN_STATUS_S { 117*4882a593Smuzhiyun RK_CODEC_ID_E enType; /* R; video type to be decoded */ 118*4882a593Smuzhiyun RK_U32 u32LeftStreamBytes; /* R; left stream bytes waiting for decode */ 119*4882a593Smuzhiyun RK_U32 u32LeftStreamFrames; /* R; left frames waiting for decode,only valid for VIDEO_MODE_FRAME */ 120*4882a593Smuzhiyun RK_U32 u32LeftPics; /* R; pics waiting for output */ 121*4882a593Smuzhiyun RK_BOOL bStartRecvStream; /* R; had started recv stream? */ 122*4882a593Smuzhiyun RK_U32 u32RecvStreamFrames; /* R; how many frames of stream has been received. valid when send by frame. */ 123*4882a593Smuzhiyun RK_U32 u32DecodeStreamFrames; /* R; how many frames of stream has been decoded. valid when send by frame. */ 124*4882a593Smuzhiyun VDEC_DECODE_ERROR_S stVdecDecErr; /* R; information about decode error */ 125*4882a593Smuzhiyun RK_U32 u32Width; 126*4882a593Smuzhiyun RK_U32 u32Height; 127*4882a593Smuzhiyun } VDEC_CHN_STATUS_S; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun typedef enum rkVDEC_EVNT_E { 130*4882a593Smuzhiyun VDEC_EVNT_STREAM_ERR = 1, 131*4882a593Smuzhiyun VDEC_EVNT_UNSUPPORT, 132*4882a593Smuzhiyun VDEC_EVNT_OVER_REFTHR, 133*4882a593Smuzhiyun VDEC_EVNT_REF_NUM_OVER, 134*4882a593Smuzhiyun VDEC_EVNT_SLICE_NUM_OVER, 135*4882a593Smuzhiyun VDEC_EVNT_SPS_NUM_OVER, 136*4882a593Smuzhiyun VDEC_EVNT_PPS_NUM_OVER, 137*4882a593Smuzhiyun VDEC_EVNT_PICBUF_SIZE_ERR, 138*4882a593Smuzhiyun VDEC_EVNT_SIZE_OVER, 139*4882a593Smuzhiyun VDEC_EVNT_IMG_SIZE_CHANGE, 140*4882a593Smuzhiyun VDEC_EVNT_VPS_NUM_OVER, 141*4882a593Smuzhiyun VDEC_EVNT_BUTT 142*4882a593Smuzhiyun } VDEC_EVNT_E; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun typedef struct rkVDEC_PICTURE_MOD_PARAM_S { 145*4882a593Smuzhiyun RK_U32 u32MaxPicWidth; 146*4882a593Smuzhiyun RK_U32 u32MaxPicHeight; 147*4882a593Smuzhiyun RK_BOOL bSupportProgressive; 148*4882a593Smuzhiyun RK_BOOL bDynamicAllocate; 149*4882a593Smuzhiyun } VDEC_PICTURE_MOD_PARAM_S; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun typedef struct rkVDEC_VIDEO_MOD_PARAM_S { 152*4882a593Smuzhiyun RK_U32 u32MaxPicWidth; 153*4882a593Smuzhiyun RK_U32 u32MaxPicHeight; 154*4882a593Smuzhiyun RK_U32 u32MaxSliceNum; 155*4882a593Smuzhiyun RK_U32 u32VdhMsgNum; 156*4882a593Smuzhiyun RK_U32 u32VdhBinSize; 157*4882a593Smuzhiyun RK_U32 u32VdhExtMemLevel; 158*4882a593Smuzhiyun } VDEC_VIDEO_MOD_PARAM_S; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun typedef struct rkVDEC_MOD_PARAM_S { 161*4882a593Smuzhiyun MB_SOURCE_E enVdecMBSource; /* RW, Range: [1, 3]; frame buffer mode */ 162*4882a593Smuzhiyun RK_U32 u32MiniBufMode; /* RW, Range: [0, 1]; stream buffer mode */ 163*4882a593Smuzhiyun RK_U32 u32ParallelMode; /* RW, Range: [0, 1]; VDH working mode */ 164*4882a593Smuzhiyun VDEC_VIDEO_MOD_PARAM_S stVideoModParam; 165*4882a593Smuzhiyun VDEC_PICTURE_MOD_PARAM_S stPictureModParam; 166*4882a593Smuzhiyun } VDEC_MOD_PARAM_S; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /*********************************************************************************************/ 169*4882a593Smuzhiyun /* invlalid channel ID */ 170*4882a593Smuzhiyun #define RK_ERR_VDEC_INVALID_CHNID RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_INVALID_CHNID) 171*4882a593Smuzhiyun /* at lease one parameter is illagal ,eg, an illegal enumeration value */ 172*4882a593Smuzhiyun #define RK_ERR_VDEC_ILLEGAL_PARAM RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_ILLEGAL_PARAM) 173*4882a593Smuzhiyun /* channel exists */ 174*4882a593Smuzhiyun #define RK_ERR_VDEC_EXIST RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_EXIST) 175*4882a593Smuzhiyun /* using a NULL point */ 176*4882a593Smuzhiyun #define RK_ERR_VDEC_NULL_PTR RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NULL_PTR) 177*4882a593Smuzhiyun /* try to enable or initialize system,device or channel, before configing attribute */ 178*4882a593Smuzhiyun #define RK_ERR_VDEC_NOT_CONFIG RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_CONFIG) 179*4882a593Smuzhiyun /* operation is not supported by NOW */ 180*4882a593Smuzhiyun #define RK_ERR_VDEC_NOT_SUPPORT RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_SUPPORT) 181*4882a593Smuzhiyun /* operation is not permitted ,eg, try to change stati attribute */ 182*4882a593Smuzhiyun #define RK_ERR_VDEC_NOT_PERM RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_PERM) 183*4882a593Smuzhiyun /* the channle is not existed */ 184*4882a593Smuzhiyun #define RK_ERR_VDEC_UNEXIST RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_UNEXIST) 185*4882a593Smuzhiyun /* failure caused by malloc memory */ 186*4882a593Smuzhiyun #define RK_ERR_VDEC_NOMEM RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOMEM) 187*4882a593Smuzhiyun /* failure caused by malloc buffer */ 188*4882a593Smuzhiyun #define RK_ERR_VDEC_NOBUF RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOBUF) 189*4882a593Smuzhiyun /* no data in buffer */ 190*4882a593Smuzhiyun #define RK_ERR_VDEC_BUF_EMPTY RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_BUF_EMPTY) 191*4882a593Smuzhiyun /* no buffer for new data */ 192*4882a593Smuzhiyun #define RK_ERR_VDEC_BUF_FULL RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_BUF_FULL) 193*4882a593Smuzhiyun /* system is not ready,had not initialed or loaded */ 194*4882a593Smuzhiyun #define RK_ERR_VDEC_SYS_NOTREADY RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOTREADY) 195*4882a593Smuzhiyun /* system busy */ 196*4882a593Smuzhiyun #define RK_ERR_VDEC_BUSY RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_BUSY) 197*4882a593Smuzhiyun /* bad address, eg. used for copy_from_user & copy_to_user */ 198*4882a593Smuzhiyun #define RK_ERR_VDEC_BADADDR RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_BADADDR) 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #ifdef __cplusplus 201*4882a593Smuzhiyun #if __cplusplus 202*4882a593Smuzhiyun } 203*4882a593Smuzhiyun #endif 204*4882a593Smuzhiyun #endif /* End of #ifdef __cplusplus */ 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun #endif /* End of #ifndef INCLUDE_RT_MPI_RK_COMM_VDEC_H_ */ 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun 209