13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
33d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
53d0407baSopenharmony_ci * You may obtain a copy of the License at
63d0407baSopenharmony_ci *
73d0407baSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83d0407baSopenharmony_ci *
93d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123d0407baSopenharmony_ci * See the License for the specific language governing permissions and
133d0407baSopenharmony_ci * limitations under the License.
143d0407baSopenharmony_ci */
153d0407baSopenharmony_ci
163d0407baSopenharmony_ci#ifndef __VPU_API_H__
173d0407baSopenharmony_ci#define __VPU_API_H__
183d0407baSopenharmony_ci
193d0407baSopenharmony_ci#include "rk_type.h"
203d0407baSopenharmony_ci#include "mpp_err.h"
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci/**
233d0407baSopenharmony_ci * @brief rockchip media process interface
243d0407baSopenharmony_ci */
253d0407baSopenharmony_ci
263d0407baSopenharmony_ci#define VPU_API_NOPTS_VALUE          (0x8000000000000000LL)
273d0407baSopenharmony_ci
283d0407baSopenharmony_ci/*
293d0407baSopenharmony_ci * bit definition of ColorType in structure VPU_FRAME
303d0407baSopenharmony_ci */
313d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_TYPE_MASK                 (0x0000ffff)
323d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_ARGB8888                  (0x00000000)
333d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_ABGR8888                  (0x00000001)
343d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_RGB888                    (0x00000002)
353d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_RGB565                    (0x00000003)
363d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_RGB555                    (0x00000004)
373d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_YUV420_SEMIPLANAR         (0x00000005)
383d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_YUV420_PLANAR             (0x00000006)
393d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_YUV422                    (0x00000007)
403d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_YUV444                    (0x00000008)
413d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_YCH420                    (0x00000009)
423d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_BIT_MASK                  (0x000f0000)
433d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_BIT_8                     (0x00000000)
443d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_BIT_10                    (0x00010000)
453d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_BIT_12                    (0x00020000)
463d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_BIT_14                    (0x00030000)
473d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_BIT_16                    (0x00040000)
483d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_COLORSPACE_MASK           (0x00f00000)
493d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_COLORSPACE_BT709          (0x00100000)
503d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_COLORSPACE_BT2020         (0x00200000)
513d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_DYNCRANGE_MASK            (0x0f000000)
523d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_DYNCRANGE_SDR             (0x00000000)
533d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR10           (0x01000000)
543d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR_HLG         (0x02000000)
553d0407baSopenharmony_ci#define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR_DOLBY       (0x03000000)
563d0407baSopenharmony_ci
573d0407baSopenharmony_ci/**
583d0407baSopenharmony_ci * @brief input picture type
593d0407baSopenharmony_ci */
603d0407baSopenharmony_citypedef enum {
613d0407baSopenharmony_ci    ENC_INPUT_YUV420_PLANAR = 0,              /**< YYYY... UUUU... VVVV */
623d0407baSopenharmony_ci    ENC_INPUT_YUV420_SEMIPLANAR = 1,          /**< YYYY... UVUVUV...    */
633d0407baSopenharmony_ci    ENC_INPUT_YUV422_INTERLEAVED_YUYV = 2,    /**< YUYVYUYV...          */
643d0407baSopenharmony_ci    ENC_INPUT_YUV422_INTERLEAVED_UYVY = 3,    /**< UYVYUYVY...          */
653d0407baSopenharmony_ci    ENC_INPUT_RGB565 = 4,                     /**< 16-bit RGB           */
663d0407baSopenharmony_ci    ENC_INPUT_BGR565 = 5,                     /**< 16-bit RGB           */
673d0407baSopenharmony_ci    ENC_INPUT_RGB555 = 6,                     /**< 15-bit RGB           */
683d0407baSopenharmony_ci    ENC_INPUT_BGR555 = 7,                     /**< 15-bit RGB           */
693d0407baSopenharmony_ci    ENC_INPUT_RGB444 = 8,                     /**< 12-bit RGB           */
703d0407baSopenharmony_ci    ENC_INPUT_BGR444 = 9,                     /**< 12-bit RGB           */
713d0407baSopenharmony_ci    ENC_INPUT_RGB888 = 10,                    /**< 24-bit RGB           */
723d0407baSopenharmony_ci    ENC_INPUT_BGR888 = 11,                    /**< 24-bit RGB           */
733d0407baSopenharmony_ci    ENC_INPUT_RGB101010 = 12,                 /**< 30-bit RGB           */
743d0407baSopenharmony_ci    ENC_INPUT_BGR101010 = 13                  /**< 30-bit RGB           */
753d0407baSopenharmony_ci} EncInputPictureType;
763d0407baSopenharmony_ci
773d0407baSopenharmony_citypedef enum VPU_API_CMD {
783d0407baSopenharmony_ci    VPU_API_ENC_SETCFG,
793d0407baSopenharmony_ci    VPU_API_ENC_GETCFG,
803d0407baSopenharmony_ci    VPU_API_ENC_SETFORMAT,
813d0407baSopenharmony_ci    VPU_API_ENC_SETIDRFRAME,
823d0407baSopenharmony_ci
833d0407baSopenharmony_ci    VPU_API_ENABLE_DEINTERLACE,
843d0407baSopenharmony_ci    VPU_API_SET_VPUMEM_CONTEXT,
853d0407baSopenharmony_ci    VPU_API_USE_PRESENT_TIME_ORDER,
863d0407baSopenharmony_ci    VPU_API_SET_DEFAULT_WIDTH_HEIGH,
873d0407baSopenharmony_ci    VPU_API_SET_INFO_CHANGE,
883d0407baSopenharmony_ci    VPU_API_USE_FAST_MODE,
893d0407baSopenharmony_ci    VPU_API_DEC_GET_STREAM_COUNT,
903d0407baSopenharmony_ci    VPU_API_GET_VPUMEM_USED_COUNT,
913d0407baSopenharmony_ci    VPU_API_GET_FRAME_INFO,
923d0407baSopenharmony_ci    VPU_API_SET_OUTPUT_BLOCK,
933d0407baSopenharmony_ci    VPU_API_GET_EOS_STATUS,
943d0407baSopenharmony_ci    VPU_API_SET_OUTPUT_MODE,
953d0407baSopenharmony_ci
963d0407baSopenharmony_ci    VPU_API_DEC_GET_DPB_SIZE = 0X100,
973d0407baSopenharmony_ci
983d0407baSopenharmony_ci    /* get sps/pps header */
993d0407baSopenharmony_ci    VPU_API_GET_EXTRA_INFO = 0x200,
1003d0407baSopenharmony_ci
1013d0407baSopenharmony_ci    VPU_API_SET_IMMEDIATE_OUT = 0x1000,
1023d0407baSopenharmony_ci    VPU_API_SET_PARSER_SPLIT_MODE,          /* NOTE: should control before init */
1033d0407baSopenharmony_ci
1043d0407baSopenharmony_ci    VPU_API_ENC_VEPU22_START = 0x2000,
1053d0407baSopenharmony_ci    VPU_API_ENC_SET_VEPU22_CFG,
1063d0407baSopenharmony_ci    VPU_API_ENC_GET_VEPU22_CFG,
1073d0407baSopenharmony_ci    VPU_API_ENC_SET_VEPU22_CTU_QP,
1083d0407baSopenharmony_ci    VPU_API_ENC_SET_VEPU22_ROI,
1093d0407baSopenharmony_ci
1103d0407baSopenharmony_ci    /* mlvec dynamic configure */
1113d0407baSopenharmony_ci    VPU_API_ENC_MLVEC_CFG = 0x4000,
1123d0407baSopenharmony_ci    VPU_API_ENC_SET_MAX_TID,
1133d0407baSopenharmony_ci    VPU_API_ENC_SET_MARK_LTR,
1143d0407baSopenharmony_ci    VPU_API_ENC_SET_USE_LTR,
1153d0407baSopenharmony_ci    VPU_API_ENC_SET_FRAME_QP,
1163d0407baSopenharmony_ci    VPU_API_ENC_SET_BASE_LAYER_PID,
1173d0407baSopenharmony_ci} VPU_API_CMD;
1183d0407baSopenharmony_ci
1193d0407baSopenharmony_citypedef struct {
1203d0407baSopenharmony_ci    RK_U32   TimeLow;
1213d0407baSopenharmony_ci    RK_U32   TimeHigh;
1223d0407baSopenharmony_ci} TIME_STAMP;
1233d0407baSopenharmony_ci
1243d0407baSopenharmony_citypedef struct {
1253d0407baSopenharmony_ci    RK_U32   CodecType;
1263d0407baSopenharmony_ci    RK_U32   ImgWidth;
1273d0407baSopenharmony_ci    RK_U32   ImgHeight;
1283d0407baSopenharmony_ci    RK_U32   ImgHorStride;
1293d0407baSopenharmony_ci    RK_U32   ImgVerStride;
1303d0407baSopenharmony_ci    RK_U32   BufSize;
1313d0407baSopenharmony_ci} VPU_GENERIC;
1323d0407baSopenharmony_ci
1333d0407baSopenharmony_citypedef struct VPUMem {
1343d0407baSopenharmony_ci    RK_U32  phy_addr;
1353d0407baSopenharmony_ci    RK_U32 *vir_addr;
1363d0407baSopenharmony_ci    RK_U32  size;
1373d0407baSopenharmony_ci    RK_U32 *offset;
1383d0407baSopenharmony_ci} VPUMemLinear_t;
1393d0407baSopenharmony_ci
1403d0407baSopenharmony_citypedef struct tVPU_FRAME {
1413d0407baSopenharmony_ci    RK_U32              FrameBusAddr[2];    // 0: Y address; 1: UV address;
1423d0407baSopenharmony_ci    RK_U32              FrameWidth;         // buffer horizontal stride
1433d0407baSopenharmony_ci    RK_U32              FrameHeight;        // buffer vertical   stride
1443d0407baSopenharmony_ci    RK_U32              OutputWidth;        // deprecated
1453d0407baSopenharmony_ci    RK_U32              OutputHeight;       // deprecated
1463d0407baSopenharmony_ci    RK_U32              DisplayWidth;       // valid width  for display
1473d0407baSopenharmony_ci    RK_U32              DisplayHeight;      // valid height for display
1483d0407baSopenharmony_ci    RK_U32              CodingType;
1493d0407baSopenharmony_ci    RK_U32              FrameType;          // frame; top_field_first; bot_field_first
1503d0407baSopenharmony_ci    RK_U32              ColorType;
1513d0407baSopenharmony_ci    RK_U32              DecodeFrmNum;
1523d0407baSopenharmony_ci    TIME_STAMP          ShowTime;
1533d0407baSopenharmony_ci    RK_U32              ErrorInfo;          // error information
1543d0407baSopenharmony_ci    RK_U32              employ_cnt;
1553d0407baSopenharmony_ci    VPUMemLinear_t      vpumem;
1563d0407baSopenharmony_ci    struct tVPU_FRAME  *next_frame;
1573d0407baSopenharmony_ci    union {
1583d0407baSopenharmony_ci        struct {
1593d0407baSopenharmony_ci            RK_U32      Res0[2];
1603d0407baSopenharmony_ci            struct {
1613d0407baSopenharmony_ci                RK_U32      ColorPrimaries : 8;
1623d0407baSopenharmony_ci                RK_U32      ColorTransfer  : 8;
1633d0407baSopenharmony_ci                RK_U32      ColorCoeffs    : 8;
1643d0407baSopenharmony_ci                RK_U32      ColorRange     : 1;
1653d0407baSopenharmony_ci                RK_U32      Res1           : 7;
1663d0407baSopenharmony_ci            };
1673d0407baSopenharmony_ci
1683d0407baSopenharmony_ci            RK_U32      Res2;
1693d0407baSopenharmony_ci        };
1703d0407baSopenharmony_ci
1713d0407baSopenharmony_ci        RK_U32          Res[4];
1723d0407baSopenharmony_ci    };
1733d0407baSopenharmony_ci} VPU_FRAME;
1743d0407baSopenharmony_ci
1753d0407baSopenharmony_citypedef struct VideoPacket {
1763d0407baSopenharmony_ci    RK_S64 pts;                /* with unit of us */
1773d0407baSopenharmony_ci    RK_S64 dts;                /* with unit of us */
1783d0407baSopenharmony_ci    RK_U8 *data;
1793d0407baSopenharmony_ci    RK_S32 size;
1803d0407baSopenharmony_ci    RK_U32 capability;
1813d0407baSopenharmony_ci    RK_U32 nFlags;
1823d0407baSopenharmony_ci} VideoPacket_t;
1833d0407baSopenharmony_ci
1843d0407baSopenharmony_citypedef struct DecoderOut {
1853d0407baSopenharmony_ci    RK_U8 *data;
1863d0407baSopenharmony_ci    RK_U32 size;
1873d0407baSopenharmony_ci    RK_S64 timeUs;
1883d0407baSopenharmony_ci    RK_S32 nFlags;
1893d0407baSopenharmony_ci} DecoderOut_t;
1903d0407baSopenharmony_ci
1913d0407baSopenharmony_citypedef struct ParserOut {
1923d0407baSopenharmony_ci    RK_U8 *data;
1933d0407baSopenharmony_ci    RK_U32 size;
1943d0407baSopenharmony_ci    RK_S64 timeUs;
1953d0407baSopenharmony_ci    RK_U32 nFlags;
1963d0407baSopenharmony_ci    RK_U32 width;
1973d0407baSopenharmony_ci    RK_U32 height;
1983d0407baSopenharmony_ci} ParserOut_t;
1993d0407baSopenharmony_ci
2003d0407baSopenharmony_citypedef struct EncInputStream {
2013d0407baSopenharmony_ci    RK_U8 *buf;
2023d0407baSopenharmony_ci    RK_S32 size;
2033d0407baSopenharmony_ci    RK_U32 bufPhyAddr;
2043d0407baSopenharmony_ci    RK_S64 timeUs;
2053d0407baSopenharmony_ci    RK_U32 nFlags;
2063d0407baSopenharmony_ci} EncInputStream_t;
2073d0407baSopenharmony_ci
2083d0407baSopenharmony_citypedef struct EncoderOut {
2093d0407baSopenharmony_ci    RK_U8 *data;
2103d0407baSopenharmony_ci    RK_S32 size;
2113d0407baSopenharmony_ci    RK_S64 timeUs;
2123d0407baSopenharmony_ci    RK_S32 keyFrame;
2133d0407baSopenharmony_ci} EncoderOut_t;
2143d0407baSopenharmony_ci
2153d0407baSopenharmony_ci/*
2163d0407baSopenharmony_ci * @brief Enumeration used to define the possible video compression codings.
2173d0407baSopenharmony_ci * @note  This essentially refers to file extensions. If the coding is
2183d0407baSopenharmony_ci *        being used to specify the ENCODE type, then additional work
2193d0407baSopenharmony_ci *        must be done to configure the exact flavor of the compression
2203d0407baSopenharmony_ci *        to be used.  For decode cases where the user application can
2213d0407baSopenharmony_ci *        not differentiate between MPEG-4 and H.264 bit streams, it is
2223d0407baSopenharmony_ci *        up to the codec to handle this.
2233d0407baSopenharmony_ci *
2243d0407baSopenharmony_ci *        sync with the omx_video.h
2253d0407baSopenharmony_ci */
2263d0407baSopenharmony_citypedef enum OMX_RK_VIDEO_CODINGTYPE {
2273d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingUnused,                          /**< Value when coding is N/A */
2283d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingAutoDetect,                      /**< Autodetection of coding type */
2293d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingMPEG2,                           /**< AKA: H.262 */
2303d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingH263,                            /**< H.263 */
2313d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingMPEG4,                           /**< MPEG-4 */
2323d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingWMV,                             /**< Windows Media Video (WMV1,WMV2,WMV3)*/
2333d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingRV,                              /**< all versions of Real Video */
2343d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingAVC,                             /**< H.264/AVC */
2353d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingMJPEG,                           /**< Motion JPEG */
2363d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingVP8,                             /**< VP8 */
2373d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingVP9,                             /**< VP9 */
2383d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingVC1 = 0x01000000,                /**< Windows Media Video (WMV1,WMV2,WMV3)*/
2393d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingFLV1,                            /**< Sorenson H.263 */
2403d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingDIVX3,                           /**< DIVX3 */
2413d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingVP6,
2423d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingHEVC,                            /**< H.265/HEVC */
2433d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingAVS,                             /**< AVS+ */
2443d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingKhronosExtensions = 0x6F000000,
2453d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingVendorStartUnused = 0x7F000000,
2463d0407baSopenharmony_ci    OMX_RK_VIDEO_CodingMax = 0x7FFFFFFF
2473d0407baSopenharmony_ci} OMX_RK_VIDEO_CODINGTYPE;
2483d0407baSopenharmony_ci
2493d0407baSopenharmony_citypedef enum CODEC_TYPE {
2503d0407baSopenharmony_ci    CODEC_NONE,
2513d0407baSopenharmony_ci    CODEC_DECODER,
2523d0407baSopenharmony_ci    CODEC_ENCODER,
2533d0407baSopenharmony_ci    CODEC_BUTT,
2543d0407baSopenharmony_ci} CODEC_TYPE;
2553d0407baSopenharmony_ci
2563d0407baSopenharmony_citypedef enum VPU_API_ERR {
2573d0407baSopenharmony_ci    VPU_API_OK                      = 0,
2583d0407baSopenharmony_ci    VPU_API_ERR_UNKNOW              = -1,
2593d0407baSopenharmony_ci    VPU_API_ERR_BASE                = -1000,
2603d0407baSopenharmony_ci    VPU_API_ERR_LIST_STREAM         = VPU_API_ERR_BASE - 1,
2613d0407baSopenharmony_ci    VPU_API_ERR_INIT                = VPU_API_ERR_BASE - 2,
2623d0407baSopenharmony_ci    VPU_API_ERR_VPU_CODEC_INIT      = VPU_API_ERR_BASE - 3,
2633d0407baSopenharmony_ci    VPU_API_ERR_STREAM              = VPU_API_ERR_BASE - 4,
2643d0407baSopenharmony_ci    VPU_API_ERR_FATAL_THREAD        = VPU_API_ERR_BASE - 5,
2653d0407baSopenharmony_ci    VPU_API_EOS_STREAM_REACHED      = VPU_API_ERR_BASE - 11,
2663d0407baSopenharmony_ci
2673d0407baSopenharmony_ci    VPU_API_ERR_BUTT,
2683d0407baSopenharmony_ci} VPU_API_ERR;
2693d0407baSopenharmony_ci
2703d0407baSopenharmony_citypedef enum VPU_FRAME_ERR {
2713d0407baSopenharmony_ci    VPU_FRAME_ERR_UNKNOW           = 0x0001,
2723d0407baSopenharmony_ci    VPU_FRAME_ERR_UNSUPPORT        = 0x0002,
2733d0407baSopenharmony_ci
2743d0407baSopenharmony_ci} VPU_FRAME_ERR;
2753d0407baSopenharmony_ci
2763d0407baSopenharmony_citypedef struct EncParameter {
2773d0407baSopenharmony_ci    RK_S32 width;
2783d0407baSopenharmony_ci    RK_S32 height;
2793d0407baSopenharmony_ci    RK_S32 rc_mode;                 /* 0 - CQP mode; 1 - CBR mode; 2 - FIXQP mode */
2803d0407baSopenharmony_ci    RK_S32 bitRate;                 /* target bitrate */
2813d0407baSopenharmony_ci    RK_S32 framerate;
2823d0407baSopenharmony_ci    RK_S32 qp;
2833d0407baSopenharmony_ci    RK_S32 enableCabac;
2843d0407baSopenharmony_ci    RK_S32 cabacInitIdc;
2853d0407baSopenharmony_ci    RK_S32 format;
2863d0407baSopenharmony_ci    RK_S32 intraPicRate;
2873d0407baSopenharmony_ci    RK_S32 framerateout;
2883d0407baSopenharmony_ci    RK_S32 profileIdc;
2893d0407baSopenharmony_ci    RK_S32 levelIdc;
2903d0407baSopenharmony_ci    RK_S32 reserved[3];
2913d0407baSopenharmony_ci} EncParameter_t;
2923d0407baSopenharmony_ci
2933d0407baSopenharmony_citypedef struct EXtraCfg {
2943d0407baSopenharmony_ci    RK_S32 vc1extra_size;
2953d0407baSopenharmony_ci    RK_S32 vp6codeid;
2963d0407baSopenharmony_ci    RK_S32 tsformat;
2973d0407baSopenharmony_ci    RK_U32 ori_vpu; /* use origin vpu framework */
2983d0407baSopenharmony_ci    /* below used in decode */
2993d0407baSopenharmony_ci    RK_U32 mpp_mode;     /* use mpp framework */
3003d0407baSopenharmony_ci    RK_U32 bit_depth;    /* 8 or 10 bit */
3013d0407baSopenharmony_ci    RK_U32 yuv_format;   /* 0:420 1:422 2:444 */
3023d0407baSopenharmony_ci    RK_U32 reserved[16];
3033d0407baSopenharmony_ci} EXtraCfg_t;
3043d0407baSopenharmony_ci
3053d0407baSopenharmony_ci/**
3063d0407baSopenharmony_ci * @brief vpu function interface
3073d0407baSopenharmony_ci */
3083d0407baSopenharmony_citypedef struct VpuCodecContext {
3093d0407baSopenharmony_ci    void* vpuApiObj;
3103d0407baSopenharmony_ci
3113d0407baSopenharmony_ci    CODEC_TYPE codecType;
3123d0407baSopenharmony_ci    OMX_RK_VIDEO_CODINGTYPE videoCoding;
3133d0407baSopenharmony_ci
3143d0407baSopenharmony_ci    RK_U32 width;
3153d0407baSopenharmony_ci    RK_U32 height;
3163d0407baSopenharmony_ci    void  *extradata;
3173d0407baSopenharmony_ci    RK_S32 extradata_size;
3183d0407baSopenharmony_ci
3193d0407baSopenharmony_ci    RK_U8  enableparsing;
3203d0407baSopenharmony_ci
3213d0407baSopenharmony_ci    RK_S32 no_thread;
3223d0407baSopenharmony_ci    EXtraCfg_t extra_cfg;
3233d0407baSopenharmony_ci
3243d0407baSopenharmony_ci    void* private_data;
3253d0407baSopenharmony_ci
3263d0407baSopenharmony_ci    /*
3273d0407baSopenharmony_ci     ** 1: error state(not working)  0: working
3283d0407baSopenharmony_ci    */
3293d0407baSopenharmony_ci    RK_S32 decoder_err;
3303d0407baSopenharmony_ci
3313d0407baSopenharmony_ci    /**
3323d0407baSopenharmony_ci     * Allocate and initialize an VpuCodecContext.
3333d0407baSopenharmony_ci     *
3343d0407baSopenharmony_ci     * @param ctx The context of vpu api, allocated in this function.
3353d0407baSopenharmony_ci     * @param extraData The extra data of codec, some codecs need / can
3363d0407baSopenharmony_ci     *        use extradata like Huffman tables, also live VC1 codec can
3373d0407baSopenharmony_ci     *        use extradata to initialize itself.
3383d0407baSopenharmony_ci     * @param extra_size The size of extra data.
3393d0407baSopenharmony_ci     *
3403d0407baSopenharmony_ci     * @return 0 for init success, others for failure.
3413d0407baSopenharmony_ci     * @note check whether ctx has been allocated success after you do init.
3423d0407baSopenharmony_ci     */
3433d0407baSopenharmony_ci    RK_S32 (*init)(struct VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_size);
3443d0407baSopenharmony_ci    /**
3453d0407baSopenharmony_ci     * @brief both send video stream packet to decoder and get video frame from
3463d0407baSopenharmony_ci     *        decoder at the same time
3473d0407baSopenharmony_ci     * @param ctx The context of vpu codec
3483d0407baSopenharmony_ci     * @param pkt[in] Stream to be decoded
3493d0407baSopenharmony_ci     * @param aDecOut[out] Decoding frame
3503d0407baSopenharmony_ci     * @return 0 for decode success, others for failure.
3513d0407baSopenharmony_ci     */
3523d0407baSopenharmony_ci    RK_S32 (*decode)(struct VpuCodecContext *ctx, VideoPacket_t *pkt, DecoderOut_t *aDecOut);
3533d0407baSopenharmony_ci    /**
3543d0407baSopenharmony_ci     * @brief both send video frame to encoder and get encoded video stream from
3553d0407baSopenharmony_ci     *        encoder at the same time.
3563d0407baSopenharmony_ci     * @param ctx The context of vpu codec
3573d0407baSopenharmony_ci     * @param aEncInStrm[in] Frame to be encoded
3583d0407baSopenharmony_ci     * @param aEncOut[out] Encoding stream
3593d0407baSopenharmony_ci     * @return 0 for encode success, others for failure.
3603d0407baSopenharmony_ci     */
3613d0407baSopenharmony_ci    RK_S32 (*encode)(struct VpuCodecContext *ctx, EncInputStream_t *aEncInStrm, EncoderOut_t *aEncOut);
3623d0407baSopenharmony_ci    /**
3633d0407baSopenharmony_ci     * @brief flush codec while do fast forward playing.
3643d0407baSopenharmony_ci     * @param ctx The context of vpu codec
3653d0407baSopenharmony_ci     * @return 0 for flush success, others for failure.
3663d0407baSopenharmony_ci     */
3673d0407baSopenharmony_ci    RK_S32 (*flush)(struct VpuCodecContext *ctx);
3683d0407baSopenharmony_ci    RK_S32 (*control)(struct VpuCodecContext *ctx, VPU_API_CMD cmdType, void* param);
3693d0407baSopenharmony_ci    /**
3703d0407baSopenharmony_ci     * @brief send video stream packet to decoder only, async interface
3713d0407baSopenharmony_ci     * @param ctx The context of vpu codec
3723d0407baSopenharmony_ci     * @param pkt Stream to be decoded
3733d0407baSopenharmony_ci     * @return 0 for success, others for failure.
3743d0407baSopenharmony_ci     */
3753d0407baSopenharmony_ci    RK_S32 (*decode_sendstream)(struct VpuCodecContext *ctx, VideoPacket_t *pkt);
3763d0407baSopenharmony_ci    /**
3773d0407baSopenharmony_ci     * @brief get video frame from decoder only, async interface
3783d0407baSopenharmony_ci     * @param ctx The context of vpu codec
3793d0407baSopenharmony_ci     * @param aDecOut Decoding frame
3803d0407baSopenharmony_ci     * @return 0 for success, others for failure.
3813d0407baSopenharmony_ci     */
3823d0407baSopenharmony_ci    RK_S32 (*decode_getframe)(struct VpuCodecContext *ctx, DecoderOut_t *aDecOut);
3833d0407baSopenharmony_ci    /**
3843d0407baSopenharmony_ci     * @brief send video frame to encoder only, async interface
3853d0407baSopenharmony_ci     * @param ctx The context of vpu codec
3863d0407baSopenharmony_ci     * @param aEncInStrm Frame to be encoded
3873d0407baSopenharmony_ci     * @return 0 for success, others for failure.
3883d0407baSopenharmony_ci     */
3893d0407baSopenharmony_ci    RK_S32 (*encoder_sendframe)(struct VpuCodecContext *ctx, EncInputStream_t *aEncInStrm);
3903d0407baSopenharmony_ci    /**
3913d0407baSopenharmony_ci     * @brief get encoded video packet from encoder only, async interface
3923d0407baSopenharmony_ci     * @param ctx The context of vpu codec
3933d0407baSopenharmony_ci     * @param aEncOut Encoding stream
3943d0407baSopenharmony_ci     * @return 0 for success, others for failure.
3953d0407baSopenharmony_ci     */
3963d0407baSopenharmony_ci    RK_S32 (*encoder_getstream)(struct VpuCodecContext *ctx, EncoderOut_t *aEncOut);
3973d0407baSopenharmony_ci} VpuCodecContext_t;
3983d0407baSopenharmony_ci
3993d0407baSopenharmony_ci/* allocated vpu codec context */
4003d0407baSopenharmony_ci#ifdef __cplusplus
4013d0407baSopenharmony_ciextern "C"
4023d0407baSopenharmony_ci{
4033d0407baSopenharmony_ci#endif
4043d0407baSopenharmony_ci
4053d0407baSopenharmony_ci/**
4063d0407baSopenharmony_ci * @brief open context of vpu
4073d0407baSopenharmony_ci * @param ctx pointer of vpu codec context
4083d0407baSopenharmony_ci */
4093d0407baSopenharmony_ciRK_S32 vpu_open_context(struct VpuCodecContext **ctx);
4103d0407baSopenharmony_ci/**
4113d0407baSopenharmony_ci * @brief close context of vpu
4123d0407baSopenharmony_ci * @param ctx pointer of vpu codec context
4133d0407baSopenharmony_ci */
4143d0407baSopenharmony_ciRK_S32 vpu_close_context(struct VpuCodecContext **ctx);
4153d0407baSopenharmony_ci
4163d0407baSopenharmony_ci#ifdef __cplusplus
4173d0407baSopenharmony_ci}
4183d0407baSopenharmony_ci#endif
4193d0407baSopenharmony_ci
4203d0407baSopenharmony_ci/*
4213d0407baSopenharmony_ci * vpu_mem api
4223d0407baSopenharmony_ci */
4233d0407baSopenharmony_ci#define vpu_display_mem_pool_FIELDS \
4243d0407baSopenharmony_ci    RK_S32 (*commit_hdl)(vpu_display_mem_pool *p, RK_S32 hdl, RK_S32 size); \
4253d0407baSopenharmony_ci    void* (*get_free)(vpu_display_mem_pool *p); \
4263d0407baSopenharmony_ci    RK_S32 (*inc_used)(vpu_display_mem_pool *p, void *hdl); \
4273d0407baSopenharmony_ci    RK_S32 (*put_used)(vpu_display_mem_pool *p, void *hdl); \
4283d0407baSopenharmony_ci    RK_S32 (*reset)(vpu_display_mem_pool *p); \
4293d0407baSopenharmony_ci    RK_S32 (*get_unused_num)(vpu_display_mem_pool *p); \
4303d0407baSopenharmony_ci    RK_S32 buff_size; \
4313d0407baSopenharmony_ci    float version; \
4323d0407baSopenharmony_ci    RK_S32 res[18];
4333d0407baSopenharmony_ci
4343d0407baSopenharmony_citypedef struct vpu_display_mem_pool vpu_display_mem_pool;
4353d0407baSopenharmony_ci
4363d0407baSopenharmony_cistruct vpu_display_mem_pool {
4373d0407baSopenharmony_ci    vpu_display_mem_pool_FIELDS
4383d0407baSopenharmony_ci};
4393d0407baSopenharmony_ci
4403d0407baSopenharmony_ci#ifdef __cplusplus
4413d0407baSopenharmony_ciextern "C"
4423d0407baSopenharmony_ci{
4433d0407baSopenharmony_ci#endif
4443d0407baSopenharmony_ci
4453d0407baSopenharmony_ci/*
4463d0407baSopenharmony_ci * vpu memory handle interface
4473d0407baSopenharmony_ci */
4483d0407baSopenharmony_ciRK_S32 VPUMemJudgeIommu(void);
4493d0407baSopenharmony_ciRK_S32 VPUMallocLinear(VPUMemLinear_t *p, RK_U32 size);
4503d0407baSopenharmony_ciRK_S32 VPUFreeLinear(VPUMemLinear_t *p);
4513d0407baSopenharmony_ciRK_S32 VPUMemDuplicate(VPUMemLinear_t *dst, VPUMemLinear_t *src);
4523d0407baSopenharmony_ciRK_S32 VPUMemLink(VPUMemLinear_t *p);
4533d0407baSopenharmony_ciRK_S32 VPUMemFlush(VPUMemLinear_t *p);
4543d0407baSopenharmony_ciRK_S32 VPUMemClean(VPUMemLinear_t *p);
4553d0407baSopenharmony_ciRK_S32 VPUMemInvalidate(VPUMemLinear_t *p);
4563d0407baSopenharmony_ciRK_S32 VPUMemGetFD(VPUMemLinear_t *p);
4573d0407baSopenharmony_ciRK_S32 VPUMallocLinearFromRender(VPUMemLinear_t *p, RK_U32 size, void *ctx);
4583d0407baSopenharmony_ci
4593d0407baSopenharmony_ci/*
4603d0407baSopenharmony_ci * vpu memory allocator and manager interface
4613d0407baSopenharmony_ci */
4623d0407baSopenharmony_civpu_display_mem_pool* open_vpu_memory_pool(void);
4633d0407baSopenharmony_civoid close_vpu_memory_pool(vpu_display_mem_pool *p);
4643d0407baSopenharmony_ciint create_vpu_memory_pool_allocator(vpu_display_mem_pool **ipool, int num, int size);
4653d0407baSopenharmony_civoid release_vpu_memory_pool_allocator(vpu_display_mem_pool *ipool);
4663d0407baSopenharmony_ci
4673d0407baSopenharmony_ci#ifdef __cplusplus
4683d0407baSopenharmony_ci}
4693d0407baSopenharmony_ci#endif
4703d0407baSopenharmony_ci
4713d0407baSopenharmony_ci#endif
472