xref: /OK3568_Linux_fs/external/rockit/mpi/sdk/include/rk_comm_vdec.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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