xref: /OK3568_Linux_fs/external/mpp/inc/vpu_api.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2015 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef __VPU_API_H__
18*4882a593Smuzhiyun #define __VPU_API_H__
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include "rk_type.h"
21*4882a593Smuzhiyun #include "mpp_err.h"
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /**
24*4882a593Smuzhiyun  * @brief rockchip media process interface
25*4882a593Smuzhiyun  */
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define VPU_API_NOPTS_VALUE          (0x8000000000000000LL)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /*
30*4882a593Smuzhiyun  * bit definition of ColorType in structure VPU_FRAME
31*4882a593Smuzhiyun  */
32*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_TYPE_MASK                 (0x0000ffff)
33*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_ARGB8888                  (0x00000000)
34*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_ABGR8888                  (0x00000001)
35*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_RGB888                    (0x00000002)
36*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_RGB565                    (0x00000003)
37*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_RGB555                    (0x00000004)
38*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_YUV420_SEMIPLANAR         (0x00000005)
39*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_YUV420_PLANAR             (0x00000006)
40*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_YUV422                    (0x00000007)
41*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_YUV444                    (0x00000008)
42*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_YCH420                    (0x00000009)
43*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_BIT_MASK                  (0x000f0000)
44*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_BIT_8                     (0x00000000)
45*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_BIT_10                    (0x00010000)
46*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_BIT_12                    (0x00020000)
47*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_BIT_14                    (0x00030000)
48*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_BIT_16                    (0x00040000)
49*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_FBC_MASK                  (0x00f00000)
50*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_FBC_AFBC_V1               (0x00100000)
51*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_FBC_AFBC_V2               (0x00200000)
52*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_DYNCRANGE_MASK            (0x0f000000)
53*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_DYNCRANGE_SDR             (0x00000000)
54*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR10           (0x01000000)
55*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR_HLG         (0x02000000)
56*4882a593Smuzhiyun #define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR_DOLBY       (0x03000000)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /**
59*4882a593Smuzhiyun  * @brief input picture type
60*4882a593Smuzhiyun  */
61*4882a593Smuzhiyun typedef enum {
62*4882a593Smuzhiyun     ENC_INPUT_YUV420_PLANAR = 0,              /**< YYYY... UUUU... VVVV */
63*4882a593Smuzhiyun     ENC_INPUT_YUV420_SEMIPLANAR = 1,          /**< YYYY... UVUVUV...    */
64*4882a593Smuzhiyun     ENC_INPUT_YUV422_INTERLEAVED_YUYV = 2,    /**< YUYVYUYV...          */
65*4882a593Smuzhiyun     ENC_INPUT_YUV422_INTERLEAVED_UYVY = 3,    /**< UYVYUYVY...          */
66*4882a593Smuzhiyun     ENC_INPUT_RGB565 = 4,                     /**< 16-bit RGB           */
67*4882a593Smuzhiyun     ENC_INPUT_BGR565 = 5,                     /**< 16-bit RGB           */
68*4882a593Smuzhiyun     ENC_INPUT_RGB555 = 6,                     /**< 15-bit RGB           */
69*4882a593Smuzhiyun     ENC_INPUT_BGR555 = 7,                     /**< 15-bit RGB           */
70*4882a593Smuzhiyun     ENC_INPUT_RGB444 = 8,                     /**< 12-bit RGB           */
71*4882a593Smuzhiyun     ENC_INPUT_BGR444 = 9,                     /**< 12-bit RGB           */
72*4882a593Smuzhiyun     ENC_INPUT_RGB888 = 10,                    /**< 24-bit RGB           */
73*4882a593Smuzhiyun     ENC_INPUT_BGR888 = 11,                    /**< 24-bit RGB           */
74*4882a593Smuzhiyun     ENC_INPUT_RGB101010 = 12,                 /**< 30-bit RGB           */
75*4882a593Smuzhiyun     ENC_INPUT_BGR101010 = 13                  /**< 30-bit RGB           */
76*4882a593Smuzhiyun } EncInputPictureType;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun typedef enum VPU_API_CMD {
79*4882a593Smuzhiyun     VPU_API_ENC_SETCFG,
80*4882a593Smuzhiyun     VPU_API_ENC_GETCFG,
81*4882a593Smuzhiyun     VPU_API_ENC_SETFORMAT,
82*4882a593Smuzhiyun     VPU_API_ENC_SETIDRFRAME,
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun     VPU_API_ENABLE_DEINTERLACE,
85*4882a593Smuzhiyun     VPU_API_SET_VPUMEM_CONTEXT,
86*4882a593Smuzhiyun     VPU_API_USE_PRESENT_TIME_ORDER,
87*4882a593Smuzhiyun     VPU_API_SET_DEFAULT_WIDTH_HEIGH,
88*4882a593Smuzhiyun     VPU_API_SET_INFO_CHANGE,
89*4882a593Smuzhiyun     VPU_API_USE_FAST_MODE,
90*4882a593Smuzhiyun     VPU_API_DEC_GET_STREAM_COUNT,
91*4882a593Smuzhiyun     VPU_API_GET_VPUMEM_USED_COUNT,
92*4882a593Smuzhiyun     VPU_API_GET_FRAME_INFO,
93*4882a593Smuzhiyun     VPU_API_SET_OUTPUT_BLOCK,
94*4882a593Smuzhiyun     VPU_API_GET_EOS_STATUS,
95*4882a593Smuzhiyun     VPU_API_SET_OUTPUT_MODE,
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun     /* get sps/pps header */
98*4882a593Smuzhiyun     VPU_API_GET_EXTRA_INFO = 0x200,
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     VPU_API_SET_IMMEDIATE_OUT = 0x1000,
101*4882a593Smuzhiyun     VPU_API_SET_PARSER_SPLIT_MODE,          /* NOTE: should control before init */
102*4882a593Smuzhiyun     VPU_API_DEC_OUT_FRM_STRUCT_TYPE,
103*4882a593Smuzhiyun     VPU_API_DEC_EN_THUMBNAIL,
104*4882a593Smuzhiyun     VPU_API_DEC_EN_HDR_META,
105*4882a593Smuzhiyun     VPU_API_DEC_EN_MVC,
106*4882a593Smuzhiyun     VPU_API_DEC_EN_FBC_HDR_256_ODD,
107*4882a593Smuzhiyun     VPU_API_SET_INPUT_BLOCK,
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun     /* set pkt/frm ready callback */
110*4882a593Smuzhiyun     VPU_API_SET_PKT_RDY_CB = 0x1100,
111*4882a593Smuzhiyun     VPU_API_SET_FRM_RDY_CB,
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun     VPU_API_ENC_VEPU22_START = 0x2000,
114*4882a593Smuzhiyun     VPU_API_ENC_SET_VEPU22_CFG,
115*4882a593Smuzhiyun     VPU_API_ENC_GET_VEPU22_CFG,
116*4882a593Smuzhiyun     VPU_API_ENC_SET_VEPU22_CTU_QP,
117*4882a593Smuzhiyun     VPU_API_ENC_SET_VEPU22_ROI,
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun     VPU_API_ENC_MPP        = 0x3000,
120*4882a593Smuzhiyun     VPU_API_ENC_MPP_SETCFG,
121*4882a593Smuzhiyun     VPU_API_ENC_MPP_GETCFG,
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun     /* mlvec dynamic configure */
124*4882a593Smuzhiyun     VPU_API_ENC_MLVEC_CFG = 0x4000,
125*4882a593Smuzhiyun     VPU_API_ENC_SET_MAX_TID,
126*4882a593Smuzhiyun     VPU_API_ENC_SET_MARK_LTR,
127*4882a593Smuzhiyun     VPU_API_ENC_SET_USE_LTR,
128*4882a593Smuzhiyun     VPU_API_ENC_SET_FRAME_QP,
129*4882a593Smuzhiyun     VPU_API_ENC_SET_BASE_LAYER_PID,
130*4882a593Smuzhiyun } VPU_API_CMD;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun typedef struct {
133*4882a593Smuzhiyun     RK_U32   TimeLow;
134*4882a593Smuzhiyun     RK_U32   TimeHigh;
135*4882a593Smuzhiyun } TIME_STAMP;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun typedef struct {
138*4882a593Smuzhiyun     RK_U32   CodecType;
139*4882a593Smuzhiyun     RK_U32   ImgWidth;
140*4882a593Smuzhiyun     RK_U32   ImgHeight;
141*4882a593Smuzhiyun     RK_U32   ImgHorStride;
142*4882a593Smuzhiyun     RK_U32   ImgVerStride;
143*4882a593Smuzhiyun     RK_U32   BufSize;
144*4882a593Smuzhiyun } VPU_GENERIC;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun typedef struct VPUMem {
147*4882a593Smuzhiyun     RK_U32  phy_addr;
148*4882a593Smuzhiyun     RK_U32 *vir_addr;
149*4882a593Smuzhiyun     RK_U32  size;
150*4882a593Smuzhiyun     RK_U32 *offset;
151*4882a593Smuzhiyun } VPUMemLinear_t;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun typedef struct tVPU_FRAME {
154*4882a593Smuzhiyun     RK_U32              FrameBusAddr[2];    // 0: Y address; 1: UV address;
155*4882a593Smuzhiyun     RK_U32              FrameWidth;         // buffer horizontal stride
156*4882a593Smuzhiyun     RK_U32              FrameHeight;        // buffer vertical   stride
157*4882a593Smuzhiyun     RK_U32              OutputWidth;        // deprecated
158*4882a593Smuzhiyun     RK_U32              OutputHeight;       // deprecated
159*4882a593Smuzhiyun     RK_U32              DisplayWidth;       // valid width  for display
160*4882a593Smuzhiyun     RK_U32              DisplayHeight;      // valid height for display
161*4882a593Smuzhiyun     RK_U32              CodingType;
162*4882a593Smuzhiyun     RK_U32              FrameType;          // frame; top_field_first; bot_field_first
163*4882a593Smuzhiyun     RK_U32              ColorType;
164*4882a593Smuzhiyun     RK_U32              DecodeFrmNum;
165*4882a593Smuzhiyun     TIME_STAMP          ShowTime;
166*4882a593Smuzhiyun     RK_U32              ErrorInfo;          // error information
167*4882a593Smuzhiyun     RK_U32              employ_cnt;
168*4882a593Smuzhiyun     VPUMemLinear_t      vpumem;
169*4882a593Smuzhiyun     struct tVPU_FRAME  *next_frame;
170*4882a593Smuzhiyun     union {
171*4882a593Smuzhiyun         struct {
172*4882a593Smuzhiyun             RK_U32      Res0[2];
173*4882a593Smuzhiyun             struct {
174*4882a593Smuzhiyun                 RK_U32      ColorPrimaries : 8;
175*4882a593Smuzhiyun                 RK_U32      ColorTransfer  : 8;
176*4882a593Smuzhiyun                 RK_U32      ColorCoeffs    : 8;
177*4882a593Smuzhiyun                 RK_U32      ColorRange     : 1;
178*4882a593Smuzhiyun                 RK_U32      Res1           : 7;
179*4882a593Smuzhiyun             };
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun             RK_U32      Res2;
182*4882a593Smuzhiyun         };
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun         RK_U32          Res[4];
185*4882a593Smuzhiyun     };
186*4882a593Smuzhiyun } VPU_FRAME;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun typedef struct FrameThumbInfo {
189*4882a593Smuzhiyun     RK_U32      enable;
190*4882a593Smuzhiyun     RK_U32      yOffset;
191*4882a593Smuzhiyun     RK_U32      uvOffset;
192*4882a593Smuzhiyun } FrameThumbInfo_t;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun typedef struct FrameHdrInfo {
195*4882a593Smuzhiyun     RK_U32      isHdr;
196*4882a593Smuzhiyun     RK_U32      offset;
197*4882a593Smuzhiyun     RK_U32      size;
198*4882a593Smuzhiyun } FrameHdrInfo_t;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun typedef struct VideoFrame {
201*4882a593Smuzhiyun     VPU_FRAME        vpuFrame;
202*4882a593Smuzhiyun     FrameThumbInfo_t thumbInfo;
203*4882a593Smuzhiyun     FrameHdrInfo_t   hdrInfo;
204*4882a593Smuzhiyun     RK_U32           viewId;
205*4882a593Smuzhiyun     RK_U32           reserved[16];
206*4882a593Smuzhiyun } VideoFrame_t;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun typedef struct VideoPacket {
209*4882a593Smuzhiyun     RK_S64 pts;                /* with unit of us*/
210*4882a593Smuzhiyun     RK_S64 dts;                /* with unit of us*/
211*4882a593Smuzhiyun     RK_U8 *data;
212*4882a593Smuzhiyun     RK_S32 size;
213*4882a593Smuzhiyun     RK_U32 capability;
214*4882a593Smuzhiyun     RK_U32 nFlags;
215*4882a593Smuzhiyun } VideoPacket_t;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun typedef struct DecoderOut {
218*4882a593Smuzhiyun     RK_U8 *data;
219*4882a593Smuzhiyun     RK_U32 size;
220*4882a593Smuzhiyun     RK_S64 timeUs;
221*4882a593Smuzhiyun     RK_S32 nFlags;
222*4882a593Smuzhiyun } DecoderOut_t;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun typedef struct ParserOut {
225*4882a593Smuzhiyun     RK_U8 *data;
226*4882a593Smuzhiyun     RK_U32 size;
227*4882a593Smuzhiyun     RK_S64 timeUs;
228*4882a593Smuzhiyun     RK_U32 nFlags;
229*4882a593Smuzhiyun     RK_U32 width;
230*4882a593Smuzhiyun     RK_U32 height;
231*4882a593Smuzhiyun } ParserOut_t;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun typedef struct EncInputStream {
234*4882a593Smuzhiyun     RK_U8 *buf;
235*4882a593Smuzhiyun     RK_S32 size;
236*4882a593Smuzhiyun     RK_U32 bufPhyAddr;
237*4882a593Smuzhiyun     RK_S64 timeUs;
238*4882a593Smuzhiyun     RK_U32 nFlags;
239*4882a593Smuzhiyun } EncInputStream_t;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun typedef struct EncoderOut {
242*4882a593Smuzhiyun     RK_U8 *data;
243*4882a593Smuzhiyun     RK_S32 size;
244*4882a593Smuzhiyun     RK_S64 timeUs;
245*4882a593Smuzhiyun     RK_S32 keyFrame;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun } EncoderOut_t;
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun typedef RK_S32 (*VpuFrmRdyCbFunc)(void *cb_ctx);
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun typedef struct {
252*4882a593Smuzhiyun     VpuFrmRdyCbFunc cb;
253*4882a593Smuzhiyun     void           *cbCtx;
254*4882a593Smuzhiyun } FrameRdyCB;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun /*
257*4882a593Smuzhiyun  * @brief Enumeration used to define the possible video compression codings.
258*4882a593Smuzhiyun  * @note  This essentially refers to file extensions. If the coding is
259*4882a593Smuzhiyun  *        being used to specify the ENCODE type, then additional work
260*4882a593Smuzhiyun  *        must be done to configure the exact flavor of the compression
261*4882a593Smuzhiyun  *        to be used.  For decode cases where the user application can
262*4882a593Smuzhiyun  *        not differentiate between MPEG-4 and H.264 bit streams, it is
263*4882a593Smuzhiyun  *        up to the codec to handle this.
264*4882a593Smuzhiyun  *
265*4882a593Smuzhiyun  *        sync with the omx_video.h
266*4882a593Smuzhiyun  */
267*4882a593Smuzhiyun typedef enum OMX_RK_VIDEO_CODINGTYPE {
268*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingUnused,                          /**< Value when coding is N/A */
269*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingAutoDetect,                      /**< Autodetection of coding type */
270*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingMPEG2,                           /**< AKA: H.262 */
271*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingH263,                            /**< H.263 */
272*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingMPEG4,                           /**< MPEG-4 */
273*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingWMV,                             /**< Windows Media Video (WMV1,WMV2,WMV3)*/
274*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingRV,                              /**< all versions of Real Video */
275*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingAVC,                             /**< H.264/AVC */
276*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingMJPEG,                           /**< Motion JPEG */
277*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingVP8,                             /**< VP8 */
278*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingVP9,                             /**< VP9 */
279*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingVC1 = 0x01000000,                /**< Windows Media Video (WMV1,WMV2,WMV3)*/
280*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingFLV1,                            /**< Sorenson H.263 */
281*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingDIVX3,                           /**< DIVX3 */
282*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingVP6,
283*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingHEVC,                            /**< H.265/HEVC */
284*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingAVSPLUS,                         /**< AVS+ profile 0x48 */
285*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingAVS,                             /**< AVS  profile 0x20 */
286*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingAVS2,                            /**< AVS2 */
287*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingAV1,                             /**< av1 */
288*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingKhronosExtensions = 0x6F000000,  /**< Reserved region for introducing Khronos Standard Extensions */
289*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingVendorStartUnused = 0x7F000000,  /**< Reserved region for introducing Vendor Extensions */
290*4882a593Smuzhiyun     OMX_RK_VIDEO_CodingMax = 0x7FFFFFFF
291*4882a593Smuzhiyun } OMX_RK_VIDEO_CODINGTYPE;
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun typedef enum CODEC_TYPE {
294*4882a593Smuzhiyun     CODEC_NONE,
295*4882a593Smuzhiyun     CODEC_DECODER,
296*4882a593Smuzhiyun     CODEC_ENCODER,
297*4882a593Smuzhiyun     CODEC_BUTT,
298*4882a593Smuzhiyun } CODEC_TYPE;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun typedef enum VPU_API_ERR {
301*4882a593Smuzhiyun     VPU_API_OK                      = 0,
302*4882a593Smuzhiyun     VPU_API_ERR_UNKNOW              = -1,
303*4882a593Smuzhiyun     VPU_API_ERR_BASE                = -1000,
304*4882a593Smuzhiyun     VPU_API_ERR_LIST_STREAM         = VPU_API_ERR_BASE - 1,
305*4882a593Smuzhiyun     VPU_API_ERR_INIT                = VPU_API_ERR_BASE - 2,
306*4882a593Smuzhiyun     VPU_API_ERR_VPU_CODEC_INIT      = VPU_API_ERR_BASE - 3,
307*4882a593Smuzhiyun     VPU_API_ERR_STREAM              = VPU_API_ERR_BASE - 4,
308*4882a593Smuzhiyun     VPU_API_ERR_FATAL_THREAD        = VPU_API_ERR_BASE - 5,
309*4882a593Smuzhiyun     VPU_API_EOS_STREAM_REACHED      = VPU_API_ERR_BASE - 11,
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun     VPU_API_ERR_BUTT,
312*4882a593Smuzhiyun } VPU_API_ERR;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun typedef enum VPU_FRAME_ERR {
315*4882a593Smuzhiyun     VPU_FRAME_ERR_UNKNOW           = 0x0001,
316*4882a593Smuzhiyun     VPU_FRAME_ERR_UNSUPPORT        = 0x0002,
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun } VPU_FRAME_ERR;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun typedef struct EncParameter {
321*4882a593Smuzhiyun     RK_S32 width;
322*4882a593Smuzhiyun     RK_S32 height;
323*4882a593Smuzhiyun     RK_S32 rc_mode;                 /* 0 - CQP mode; 1 - CBR mode; 2 - FIXQP mode*/
324*4882a593Smuzhiyun     RK_S32 bitRate;                 /* target bitrate */
325*4882a593Smuzhiyun     RK_S32 framerate;
326*4882a593Smuzhiyun     RK_S32 qp;
327*4882a593Smuzhiyun     RK_S32 enableCabac;
328*4882a593Smuzhiyun     RK_S32 cabacInitIdc;
329*4882a593Smuzhiyun     RK_S32 format;
330*4882a593Smuzhiyun     RK_S32 intraPicRate;
331*4882a593Smuzhiyun     RK_S32 framerateout;
332*4882a593Smuzhiyun     RK_S32 profileIdc;
333*4882a593Smuzhiyun     RK_S32 levelIdc;
334*4882a593Smuzhiyun     RK_S32 reserved[3];
335*4882a593Smuzhiyun } EncParameter_t;
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun typedef struct EXtraCfg {
338*4882a593Smuzhiyun     RK_S32 vc1extra_size;
339*4882a593Smuzhiyun     RK_S32 vp6codeid;
340*4882a593Smuzhiyun     RK_S32 tsformat;
341*4882a593Smuzhiyun     RK_U32 ori_vpu; /* use origin vpu framework */
342*4882a593Smuzhiyun     /* below used in decode */
343*4882a593Smuzhiyun     RK_U32 mpp_mode;     /* use mpp framework */
344*4882a593Smuzhiyun     RK_U32 bit_depth;    /* 8 or 10 bit */
345*4882a593Smuzhiyun     RK_U32 yuv_format;   /* 0:420 1:422 2:444 */
346*4882a593Smuzhiyun     RK_U32 reserved[16];
347*4882a593Smuzhiyun } EXtraCfg_t;
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun /**
350*4882a593Smuzhiyun  * @brief vpu function interface
351*4882a593Smuzhiyun  */
352*4882a593Smuzhiyun typedef struct VpuCodecContext {
353*4882a593Smuzhiyun     void* vpuApiObj;
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun     CODEC_TYPE codecType;
356*4882a593Smuzhiyun     OMX_RK_VIDEO_CODINGTYPE videoCoding;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun     RK_U32 width;
359*4882a593Smuzhiyun     RK_U32 height;
360*4882a593Smuzhiyun     void  *extradata;
361*4882a593Smuzhiyun     RK_S32 extradata_size;
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun     RK_U8  enableparsing;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun     RK_S32 no_thread;
366*4882a593Smuzhiyun     EXtraCfg_t extra_cfg;
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun     void* private_data;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun     /*
371*4882a593Smuzhiyun      ** 1: error state(not working)  0: working
372*4882a593Smuzhiyun     */
373*4882a593Smuzhiyun     RK_S32 decoder_err;
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun     /**
377*4882a593Smuzhiyun      * Allocate and initialize an VpuCodecContext.
378*4882a593Smuzhiyun      *
379*4882a593Smuzhiyun      * @param ctx The context of vpu api, allocated in this function.
380*4882a593Smuzhiyun      * @param extraData The extra data of codec, some codecs need / can
381*4882a593Smuzhiyun      *        use extradata like Huffman tables, also live VC1 codec can
382*4882a593Smuzhiyun      *        use extradata to initialize itself.
383*4882a593Smuzhiyun      * @param extra_size The size of extra data.
384*4882a593Smuzhiyun      *
385*4882a593Smuzhiyun      * @return 0 for init success, others for failure.
386*4882a593Smuzhiyun      * @note check whether ctx has been allocated success after you do init.
387*4882a593Smuzhiyun      */
388*4882a593Smuzhiyun     RK_S32 (*init)(struct VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_size);
389*4882a593Smuzhiyun     /**
390*4882a593Smuzhiyun      * @brief both send video stream packet to decoder and get video frame from
391*4882a593Smuzhiyun      *        decoder at the same time
392*4882a593Smuzhiyun      * @param ctx The context of vpu codec
393*4882a593Smuzhiyun      * @param pkt[in] Stream to be decoded
394*4882a593Smuzhiyun      * @param aDecOut[out] Decoding frame
395*4882a593Smuzhiyun      * @return 0 for decode success, others for failure.
396*4882a593Smuzhiyun      */
397*4882a593Smuzhiyun     RK_S32 (*decode)(struct VpuCodecContext *ctx, VideoPacket_t *pkt, DecoderOut_t *aDecOut);
398*4882a593Smuzhiyun     /**
399*4882a593Smuzhiyun      * @brief both send video frame to encoder and get encoded video stream from
400*4882a593Smuzhiyun      *        encoder at the same time.
401*4882a593Smuzhiyun      * @param ctx The context of vpu codec
402*4882a593Smuzhiyun      * @param aEncInStrm[in] Frame to be encoded
403*4882a593Smuzhiyun      * @param aEncOut[out] Encoding stream
404*4882a593Smuzhiyun      * @return 0 for encode success, others for failure.
405*4882a593Smuzhiyun      */
406*4882a593Smuzhiyun     RK_S32 (*encode)(struct VpuCodecContext *ctx, EncInputStream_t *aEncInStrm, EncoderOut_t *aEncOut);
407*4882a593Smuzhiyun     /**
408*4882a593Smuzhiyun      * @brief flush codec while do fast forward playing.
409*4882a593Smuzhiyun      * @param ctx The context of vpu codec
410*4882a593Smuzhiyun      * @return 0 for flush success, others for failure.
411*4882a593Smuzhiyun      */
412*4882a593Smuzhiyun     RK_S32 (*flush)(struct VpuCodecContext *ctx);
413*4882a593Smuzhiyun     RK_S32 (*control)(struct VpuCodecContext *ctx, VPU_API_CMD cmdType, void* param);
414*4882a593Smuzhiyun     /**
415*4882a593Smuzhiyun      * @brief send video stream packet to decoder only, async interface
416*4882a593Smuzhiyun      * @param ctx The context of vpu codec
417*4882a593Smuzhiyun      * @param pkt Stream to be decoded
418*4882a593Smuzhiyun      * @return 0 for success, others for failure.
419*4882a593Smuzhiyun      */
420*4882a593Smuzhiyun     RK_S32 (*decode_sendstream)(struct VpuCodecContext *ctx, VideoPacket_t *pkt);
421*4882a593Smuzhiyun     /**
422*4882a593Smuzhiyun      * @brief get video frame from decoder only, async interface
423*4882a593Smuzhiyun      * @param ctx The context of vpu codec
424*4882a593Smuzhiyun      * @param aDecOut Decoding frame
425*4882a593Smuzhiyun      * @return 0 for success, others for failure.
426*4882a593Smuzhiyun      */
427*4882a593Smuzhiyun     RK_S32 (*decode_getframe)(struct VpuCodecContext *ctx, DecoderOut_t *aDecOut);
428*4882a593Smuzhiyun     /**
429*4882a593Smuzhiyun      * @brief send video frame to encoder only, async interface
430*4882a593Smuzhiyun      * @param ctx The context of vpu codec
431*4882a593Smuzhiyun      * @param aEncInStrm Frame to be encoded
432*4882a593Smuzhiyun      * @return 0 for success, others for failure.
433*4882a593Smuzhiyun      */
434*4882a593Smuzhiyun     RK_S32 (*encoder_sendframe)(struct VpuCodecContext *ctx, EncInputStream_t *aEncInStrm);
435*4882a593Smuzhiyun     /**
436*4882a593Smuzhiyun      * @brief get encoded video packet from encoder only, async interface
437*4882a593Smuzhiyun      * @param ctx The context of vpu codec
438*4882a593Smuzhiyun      * @param aEncOut Encoding stream
439*4882a593Smuzhiyun      * @return 0 for success, others for failure.
440*4882a593Smuzhiyun      */
441*4882a593Smuzhiyun     RK_S32 (*encoder_getstream)(struct VpuCodecContext *ctx, EncoderOut_t *aEncOut);
442*4882a593Smuzhiyun } VpuCodecContext_t;
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun /* allocated vpu codec context */
445*4882a593Smuzhiyun #ifdef __cplusplus
446*4882a593Smuzhiyun extern "C"
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun #endif
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun /**
451*4882a593Smuzhiyun  * @brief open context of vpu
452*4882a593Smuzhiyun  * @param ctx pointer of vpu codec context
453*4882a593Smuzhiyun  */
454*4882a593Smuzhiyun RK_S32 vpu_open_context(struct VpuCodecContext **ctx);
455*4882a593Smuzhiyun /**
456*4882a593Smuzhiyun  * @brief close context of vpu
457*4882a593Smuzhiyun  * @param ctx pointer of vpu codec context
458*4882a593Smuzhiyun  */
459*4882a593Smuzhiyun RK_S32 vpu_close_context(struct VpuCodecContext **ctx);
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun #ifdef __cplusplus
462*4882a593Smuzhiyun }
463*4882a593Smuzhiyun #endif
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun /*
466*4882a593Smuzhiyun  * vpu_mem api
467*4882a593Smuzhiyun  */
468*4882a593Smuzhiyun #define vpu_display_mem_pool_FIELDS \
469*4882a593Smuzhiyun     RK_S32 (*commit_hdl)(vpu_display_mem_pool *p, RK_S32 hdl, RK_S32 size); \
470*4882a593Smuzhiyun     void* (*get_free)(vpu_display_mem_pool *p); \
471*4882a593Smuzhiyun     RK_S32 (*inc_used)(vpu_display_mem_pool *p, void *hdl); \
472*4882a593Smuzhiyun     RK_S32 (*put_used)(vpu_display_mem_pool *p, void *hdl); \
473*4882a593Smuzhiyun     RK_S32 (*reset)(vpu_display_mem_pool *p); \
474*4882a593Smuzhiyun     RK_S32 (*get_unused_num)(vpu_display_mem_pool *p); \
475*4882a593Smuzhiyun     RK_S32 buff_size;\
476*4882a593Smuzhiyun     float version; \
477*4882a593Smuzhiyun     RK_S32 res[18];
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun typedef struct vpu_display_mem_pool vpu_display_mem_pool;
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun struct vpu_display_mem_pool {
482*4882a593Smuzhiyun     vpu_display_mem_pool_FIELDS
483*4882a593Smuzhiyun };
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun #ifdef __cplusplus
486*4882a593Smuzhiyun extern "C"
487*4882a593Smuzhiyun {
488*4882a593Smuzhiyun #endif
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun /*
491*4882a593Smuzhiyun  * vpu memory handle interface
492*4882a593Smuzhiyun  */
493*4882a593Smuzhiyun RK_S32 VPUMemJudgeIommu(void);
494*4882a593Smuzhiyun RK_S32 VPUMallocLinear(VPUMemLinear_t *p, RK_U32 size);
495*4882a593Smuzhiyun RK_S32 VPUFreeLinear(VPUMemLinear_t *p);
496*4882a593Smuzhiyun RK_S32 VPUMemDuplicate(VPUMemLinear_t *dst, VPUMemLinear_t *src);
497*4882a593Smuzhiyun RK_S32 VPUMemLink(VPUMemLinear_t *p);
498*4882a593Smuzhiyun RK_S32 VPUMemFlush(VPUMemLinear_t *p);
499*4882a593Smuzhiyun RK_S32 VPUMemClean(VPUMemLinear_t *p);
500*4882a593Smuzhiyun RK_S32 VPUMemInvalidate(VPUMemLinear_t *p);
501*4882a593Smuzhiyun RK_S32 VPUMemGetFD(VPUMemLinear_t *p);
502*4882a593Smuzhiyun RK_S32 VPUMallocLinearFromRender(VPUMemLinear_t *p, RK_U32 size, void *ctx);
503*4882a593Smuzhiyun 
504*4882a593Smuzhiyun /*
505*4882a593Smuzhiyun  * vpu memory allocator and manager interface
506*4882a593Smuzhiyun  */
507*4882a593Smuzhiyun vpu_display_mem_pool* open_vpu_memory_pool(void);
508*4882a593Smuzhiyun void close_vpu_memory_pool(vpu_display_mem_pool *p);
509*4882a593Smuzhiyun int create_vpu_memory_pool_allocator(vpu_display_mem_pool **ipool, int num, int size);
510*4882a593Smuzhiyun void release_vpu_memory_pool_allocator(vpu_display_mem_pool *ipool);
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun #ifdef __cplusplus
513*4882a593Smuzhiyun }
514*4882a593Smuzhiyun #endif
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun #endif /*__VPU_API_H__*/
517