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