1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD 3*437bfbebSnyanmisaka * 4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 6*437bfbebSnyanmisaka * You may obtain a copy of the License at 7*437bfbebSnyanmisaka * 8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 9*437bfbebSnyanmisaka * 10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 14*437bfbebSnyanmisaka * limitations under the License. 15*437bfbebSnyanmisaka */ 16*437bfbebSnyanmisaka 17*437bfbebSnyanmisaka #ifndef __RK_MPI_H__ 18*437bfbebSnyanmisaka #define __RK_MPI_H__ 19*437bfbebSnyanmisaka 20*437bfbebSnyanmisaka /** 21*437bfbebSnyanmisaka * @addtogroup rk_mpi 22*437bfbebSnyanmisaka * @brief Rockchip Media Process Interface 23*437bfbebSnyanmisaka * @details Media Process Platform(MPP) provides application programming 24*437bfbebSnyanmisaka * interface for the application layer, by which applications can 25*437bfbebSnyanmisaka * call hardware encode and decode. Current MPP fully supports 26*437bfbebSnyanmisaka * chipset RK3288/RK3228/RK3229/RK3399/RK3328/RV1108. Old chipset 27*437bfbebSnyanmisaka * like RK29xx/RK30xx/RK31XX/RK3368 is partly supported due to lack 28*437bfbebSnyanmisaka * of some hardware register generation module. 29*437bfbebSnyanmisaka */ 30*437bfbebSnyanmisaka 31*437bfbebSnyanmisaka #include "rk_mpi_cmd.h" 32*437bfbebSnyanmisaka #include "mpp_task.h" 33*437bfbebSnyanmisaka 34*437bfbebSnyanmisaka /** 35*437bfbebSnyanmisaka * @ingroup rk_mpi 36*437bfbebSnyanmisaka * @brief MPP main work function set 37*437bfbebSnyanmisaka * @details all api function are seperated into two sets: data io api set 38*437bfbebSnyanmisaka * and control api set 39*437bfbebSnyanmisaka * 40*437bfbebSnyanmisaka * (1). the data api set is for data input/output flow including: 41*437bfbebSnyanmisaka * 42*437bfbebSnyanmisaka * (1.1) simple data api set: 43*437bfbebSnyanmisaka * 44*437bfbebSnyanmisaka * decode : both send video stream packet to decoder and get video frame from 45*437bfbebSnyanmisaka * decoder at the same time. 46*437bfbebSnyanmisaka * 47*437bfbebSnyanmisaka * encode : both send video frame to encoder and get encoded video stream from 48*437bfbebSnyanmisaka * encoder at the same time. 49*437bfbebSnyanmisaka * 50*437bfbebSnyanmisaka * decode_put_packet: send video stream packet to decoder only, async interface 51*437bfbebSnyanmisaka * 52*437bfbebSnyanmisaka * decode_get_frame : get video frame from decoder only, async interface 53*437bfbebSnyanmisaka * 54*437bfbebSnyanmisaka * encode_put_frame : send video frame to encoder only, async interface 55*437bfbebSnyanmisaka * 56*437bfbebSnyanmisaka * encode_get_packet: get encoded video packet from encoder only, async interface 57*437bfbebSnyanmisaka * 58*437bfbebSnyanmisaka * (1.2) advanced task api set: 59*437bfbebSnyanmisaka * 60*437bfbebSnyanmisaka * poll : poll port for dequeue 61*437bfbebSnyanmisaka * 62*437bfbebSnyanmisaka * dequeue : pop a task from mpp task queue 63*437bfbebSnyanmisaka * 64*437bfbebSnyanmisaka * enqueue : push a task to mpp task queue 65*437bfbebSnyanmisaka * 66*437bfbebSnyanmisaka * (2). the control api set is for mpp context control including: 67*437bfbebSnyanmisaka * 68*437bfbebSnyanmisaka * control : similiar to ioctl in kernel driver, setup or get mpp internal parameter 69*437bfbebSnyanmisaka * 70*437bfbebSnyanmisaka * reset : clear all data in mpp context, discard all packet and frame, 71*437bfbebSnyanmisaka * reset all components to initialized status 72*437bfbebSnyanmisaka */ 73*437bfbebSnyanmisaka typedef struct MppApi_t { 74*437bfbebSnyanmisaka /** 75*437bfbebSnyanmisaka * @brief size of struct MppApi 76*437bfbebSnyanmisaka */ 77*437bfbebSnyanmisaka RK_U32 size; 78*437bfbebSnyanmisaka /** 79*437bfbebSnyanmisaka * @brief mpp api version, generated by Git 80*437bfbebSnyanmisaka */ 81*437bfbebSnyanmisaka RK_U32 version; 82*437bfbebSnyanmisaka 83*437bfbebSnyanmisaka // simple data flow interface 84*437bfbebSnyanmisaka /** 85*437bfbebSnyanmisaka * @brief both send video stream packet to decoder and get video frame from 86*437bfbebSnyanmisaka * decoder at the same time 87*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 88*437bfbebSnyanmisaka * by mpp_init(). 89*437bfbebSnyanmisaka * @param[in] packet The input video stream, its usage can refer mpp_packet.h. 90*437bfbebSnyanmisaka * @param[out] frame The output picture, its usage can refer mpp_frame.h. 91*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 92*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 93*437bfbebSnyanmisaka */ 94*437bfbebSnyanmisaka MPP_RET (*decode)(MppCtx ctx, MppPacket packet, MppFrame *frame); 95*437bfbebSnyanmisaka /** 96*437bfbebSnyanmisaka * @brief send video stream packet to decoder only, async interface 97*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 98*437bfbebSnyanmisaka * by mpp_init(). 99*437bfbebSnyanmisaka * @param[in] packet The input video stream, its usage can refer mpp_packet.h. 100*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 101*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 102*437bfbebSnyanmisaka */ 103*437bfbebSnyanmisaka MPP_RET (*decode_put_packet)(MppCtx ctx, MppPacket packet); 104*437bfbebSnyanmisaka /** 105*437bfbebSnyanmisaka * @brief get video frame from decoder only, async interface 106*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 107*437bfbebSnyanmisaka * by mpp_init(). 108*437bfbebSnyanmisaka * @param[out] frame The output picture, its usage can refer mpp_frame.h. 109*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 110*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 111*437bfbebSnyanmisaka */ 112*437bfbebSnyanmisaka MPP_RET (*decode_get_frame)(MppCtx ctx, MppFrame *frame); 113*437bfbebSnyanmisaka /** 114*437bfbebSnyanmisaka * @brief both send video frame to encoder and get encoded video stream from 115*437bfbebSnyanmisaka * encoder at the same time 116*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 117*437bfbebSnyanmisaka * by mpp_init(). 118*437bfbebSnyanmisaka * @param[in] frame The input video data, its usage can refer mpp_frame.h. 119*437bfbebSnyanmisaka * @param[out] packet The output compressed data, its usage can refer mpp_packet.h. 120*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 121*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 122*437bfbebSnyanmisaka */ 123*437bfbebSnyanmisaka MPP_RET (*encode)(MppCtx ctx, MppFrame frame, MppPacket *packet); 124*437bfbebSnyanmisaka /** 125*437bfbebSnyanmisaka * @brief send video frame to encoder only, async interface 126*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 127*437bfbebSnyanmisaka * by mpp_init(). 128*437bfbebSnyanmisaka * @param[in] frame The input video data, its usage can refer mpp_frame.h. 129*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 130*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 131*437bfbebSnyanmisaka */ 132*437bfbebSnyanmisaka MPP_RET (*encode_put_frame)(MppCtx ctx, MppFrame frame); 133*437bfbebSnyanmisaka /** 134*437bfbebSnyanmisaka * @brief get encoded video packet from encoder only, async interface 135*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 136*437bfbebSnyanmisaka * by mpp_init(). 137*437bfbebSnyanmisaka * @param[out] packet The output compressed data, its usage can refer mpp_packet.h. 138*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 139*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 140*437bfbebSnyanmisaka */ 141*437bfbebSnyanmisaka MPP_RET (*encode_get_packet)(MppCtx ctx, MppPacket *packet); 142*437bfbebSnyanmisaka 143*437bfbebSnyanmisaka /** 144*437bfbebSnyanmisaka * @brief ISP interface, will be supported in the future. 145*437bfbebSnyanmisaka */ 146*437bfbebSnyanmisaka MPP_RET (*isp)(MppCtx ctx, MppFrame dst, MppFrame src); 147*437bfbebSnyanmisaka /** 148*437bfbebSnyanmisaka * @brief ISP interface, will be supported in the future. 149*437bfbebSnyanmisaka */ 150*437bfbebSnyanmisaka MPP_RET (*isp_put_frame)(MppCtx ctx, MppFrame frame); 151*437bfbebSnyanmisaka /** 152*437bfbebSnyanmisaka * @brief ISP interface, will be supported in the future. 153*437bfbebSnyanmisaka */ 154*437bfbebSnyanmisaka MPP_RET (*isp_get_frame)(MppCtx ctx, MppFrame *frame); 155*437bfbebSnyanmisaka 156*437bfbebSnyanmisaka // advance data flow interface 157*437bfbebSnyanmisaka /** 158*437bfbebSnyanmisaka * @brief poll port for dequeue 159*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 160*437bfbebSnyanmisaka * by mpp_init(). 161*437bfbebSnyanmisaka * @param[in] type input port or output port which are both for data transaction 162*437bfbebSnyanmisaka * @param[in] timeout mpp poll type, its usage can refer mpp_task.h. 163*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 164*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 165*437bfbebSnyanmisaka */ 166*437bfbebSnyanmisaka MPP_RET (*poll)(MppCtx ctx, MppPortType type, MppPollType timeout); 167*437bfbebSnyanmisaka /** 168*437bfbebSnyanmisaka * @brief dequeue MppTask, pop a task from mpp task queue 169*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 170*437bfbebSnyanmisaka * by mpp_init(). 171*437bfbebSnyanmisaka * @param[in] type input port or output port which are both for data transaction 172*437bfbebSnyanmisaka * @param[out] task MppTask popped from mpp task queue, its usage can refer mpp_task.h. 173*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 174*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 175*437bfbebSnyanmisaka */ 176*437bfbebSnyanmisaka MPP_RET (*dequeue)(MppCtx ctx, MppPortType type, MppTask *task); 177*437bfbebSnyanmisaka /** 178*437bfbebSnyanmisaka * @brief enqueue MppTask, push a task to mpp task queue 179*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 180*437bfbebSnyanmisaka * by mpp_init(). 181*437bfbebSnyanmisaka * @param[in] type input port or output port which are both for data transaction 182*437bfbebSnyanmisaka * @param[in] task MppTask which is sent to mpp for process, its usage can refer mpp_task.h. 183*437bfbebSnyanmisaka * @return 0 and positive for success, negative for failure. The return 184*437bfbebSnyanmisaka * value is an error code. For details, please refer mpp_err.h. 185*437bfbebSnyanmisaka */ 186*437bfbebSnyanmisaka MPP_RET (*enqueue)(MppCtx ctx, MppPortType type, MppTask task); 187*437bfbebSnyanmisaka 188*437bfbebSnyanmisaka // control interface 189*437bfbebSnyanmisaka /** 190*437bfbebSnyanmisaka * @brief discard all packet and frame, reset all component, 191*437bfbebSnyanmisaka * for both decoder and encoder 192*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 193*437bfbebSnyanmisaka * by mpp_init(). 194*437bfbebSnyanmisaka * @return 0 for success, others for failure. The return value is an 195*437bfbebSnyanmisaka * error code. For details, please refer mpp_err.h. 196*437bfbebSnyanmisaka */ 197*437bfbebSnyanmisaka MPP_RET (*reset)(MppCtx ctx); 198*437bfbebSnyanmisaka /** 199*437bfbebSnyanmisaka * @brief control function for mpp property setting 200*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create() and initiated 201*437bfbebSnyanmisaka * by mpp_init(). 202*437bfbebSnyanmisaka * @param[in] cmd The mpi command, its definition can refer rk_mpi_cmd.h. 203*437bfbebSnyanmisaka * @param[in,out] param The mpi command parameter 204*437bfbebSnyanmisaka * @return 0 for success, others for failure. The return value is an 205*437bfbebSnyanmisaka * error code. For details, please refer mpp_err.h. 206*437bfbebSnyanmisaka */ 207*437bfbebSnyanmisaka MPP_RET (*control)(MppCtx ctx, MpiCmd cmd, MppParam param); 208*437bfbebSnyanmisaka 209*437bfbebSnyanmisaka /** 210*437bfbebSnyanmisaka * @brief The reserved segment, may be used in the future 211*437bfbebSnyanmisaka */ 212*437bfbebSnyanmisaka RK_U32 reserv[16]; 213*437bfbebSnyanmisaka } MppApi; 214*437bfbebSnyanmisaka 215*437bfbebSnyanmisaka 216*437bfbebSnyanmisaka #ifdef __cplusplus 217*437bfbebSnyanmisaka extern "C" { 218*437bfbebSnyanmisaka #endif 219*437bfbebSnyanmisaka 220*437bfbebSnyanmisaka /** 221*437bfbebSnyanmisaka * @ingroup rk_mpi 222*437bfbebSnyanmisaka * @brief Create empty context structure and mpi function pointers. 223*437bfbebSnyanmisaka * Use functions in MppApi to access mpp services. 224*437bfbebSnyanmisaka * @param[in,out] ctx pointer of the mpp context, refer to MpiImpl_t. 225*437bfbebSnyanmisaka * @param[in,out] mpi pointer of mpi function, refer to MppApi. 226*437bfbebSnyanmisaka * @return 0 for success, others for failure. The return value is an 227*437bfbebSnyanmisaka * error code. For details, please refer mpp_err.h. 228*437bfbebSnyanmisaka * @note This interface creates base flow context, all function calls 229*437bfbebSnyanmisaka * are based on it. 230*437bfbebSnyanmisaka */ 231*437bfbebSnyanmisaka MPP_RET mpp_create(MppCtx *ctx, MppApi **mpi); 232*437bfbebSnyanmisaka /** 233*437bfbebSnyanmisaka * @ingroup rk_mpi 234*437bfbebSnyanmisaka * @brief Call after mpp_create to setup mpp type and video format. 235*437bfbebSnyanmisaka * This function will call internal context init function. 236*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create(). 237*437bfbebSnyanmisaka * @param[in] type specify decoder or encoder, refer to MppCtxType. 238*437bfbebSnyanmisaka * @param[in] coding specify video compression coding, refer to MppCodingType. 239*437bfbebSnyanmisaka * @return 0 for success, others for failure. The return value is an 240*437bfbebSnyanmisaka * error code. For details, please refer mpp_err.h. 241*437bfbebSnyanmisaka */ 242*437bfbebSnyanmisaka MPP_RET mpp_init(MppCtx ctx, MppCtxType type, MppCodingType coding); 243*437bfbebSnyanmisaka /** 244*437bfbebSnyanmisaka * @ingroup rk_mpi 245*437bfbebSnyanmisaka * @brief Destroy mpp context and free both context and mpi structure, 246*437bfbebSnyanmisaka * it matches with mpp_init(). 247*437bfbebSnyanmisaka * @param[in] ctx The context of mpp, created by mpp_create(). 248*437bfbebSnyanmisaka * @return 0 for success, others for failure. The return value is an 249*437bfbebSnyanmisaka * error code. For details, please refer mpp_err.h. 250*437bfbebSnyanmisaka */ 251*437bfbebSnyanmisaka MPP_RET mpp_destroy(MppCtx ctx); 252*437bfbebSnyanmisaka /** 253*437bfbebSnyanmisaka * @ingroup rk_mpi 254*437bfbebSnyanmisaka * @brief judge given format is supported or not by MPP. 255*437bfbebSnyanmisaka * @param[in] type specify decoder or encoder, refer to MppCtxType. 256*437bfbebSnyanmisaka * @param[in] coding specify video compression coding, refer to MppCodingType. 257*437bfbebSnyanmisaka * @return 0 for support, -1 for unsupported. 258*437bfbebSnyanmisaka */ 259*437bfbebSnyanmisaka MPP_RET mpp_check_support_format(MppCtxType type, MppCodingType coding); 260*437bfbebSnyanmisaka /** 261*437bfbebSnyanmisaka * @ingroup rk_mpi 262*437bfbebSnyanmisaka * @brief List all formats supported by MPP 263*437bfbebSnyanmisaka * @param NULL no need to input parameter 264*437bfbebSnyanmisaka * @return No return value. This function just prints format information supported 265*437bfbebSnyanmisaka * by MPP on standard output. 266*437bfbebSnyanmisaka */ 267*437bfbebSnyanmisaka void mpp_show_support_format(void); 268*437bfbebSnyanmisaka void mpp_show_color_format(void); 269*437bfbebSnyanmisaka 270*437bfbebSnyanmisaka #ifdef __cplusplus 271*437bfbebSnyanmisaka } 272*437bfbebSnyanmisaka #endif 273*437bfbebSnyanmisaka 274*437bfbebSnyanmisaka #endif /*__RK_MPI_H__*/ 275