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 __RK_VENC_CMD_H__ 18*4882a593Smuzhiyun #define __RK_VENC_CMD_H__ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include "mpp_frame.h" 21*4882a593Smuzhiyun #include "rk_venc_rc.h" 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* 24*4882a593Smuzhiyun * Configure of encoder is very complicated. So we divide configures into 25*4882a593Smuzhiyun * four parts: 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * 1. Rate control parameter 28*4882a593Smuzhiyun * This is quality and bitrate request from user. 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun * 2. Data source MppFrame parameter 31*4882a593Smuzhiyun * This is data source buffer information. 32*4882a593Smuzhiyun * Now it is PreP config 33*4882a593Smuzhiyun * PreP : Encoder Preprocess configuration 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * 3. Video codec infomation 36*4882a593Smuzhiyun * This is user custormized stream information. 37*4882a593Smuzhiyun * including: 38*4882a593Smuzhiyun * H.264 / H.265 / vp8 / mjpeg 39*4882a593Smuzhiyun * 40*4882a593Smuzhiyun * 4. Misc parameter 41*4882a593Smuzhiyun * including: 42*4882a593Smuzhiyun * Split : Slice split configuration 43*4882a593Smuzhiyun * GopRef: Reference gop configuration 44*4882a593Smuzhiyun * ROI : Region Of Interest 45*4882a593Smuzhiyun * OSD : On Screen Display 46*4882a593Smuzhiyun * MD : Motion Detection 47*4882a593Smuzhiyun * 48*4882a593Smuzhiyun * The module transcation flow is as follows: 49*4882a593Smuzhiyun * 50*4882a593Smuzhiyun * + + 51*4882a593Smuzhiyun * User | Mpi/Mpp | EncImpl 52*4882a593Smuzhiyun * | | Hal 53*4882a593Smuzhiyun * | | 54*4882a593Smuzhiyun * +----------+ | +---------+ | +-----------+ 55*4882a593Smuzhiyun * | | | | +-----RcCfg-----> | 56*4882a593Smuzhiyun * | RcCfg +---------> | | | EncImpl | 57*4882a593Smuzhiyun * | | | | | +-Frame-----> | 58*4882a593Smuzhiyun * +----------+ | | | | | +--+-----^--+ 59*4882a593Smuzhiyun * | | | | | | | 60*4882a593Smuzhiyun * | | | | | | | 61*4882a593Smuzhiyun * +----------+ | | | | | syntax | 62*4882a593Smuzhiyun * | | | | | | | | | 63*4882a593Smuzhiyun * | MppFrame +---------> MppEnc +---+ | | result 64*4882a593Smuzhiyun * | | | | | | | | | 65*4882a593Smuzhiyun * +----------+ | | | | | | | 66*4882a593Smuzhiyun * | | | | | +--v-----+--+ 67*4882a593Smuzhiyun * | | | +-Frame-----> | 68*4882a593Smuzhiyun * +----------+ | | | | | | 69*4882a593Smuzhiyun * | | | | +---CodecCfg----> Hal | 70*4882a593Smuzhiyun * | CodecCfg +---------> | | | | 71*4882a593Smuzhiyun * | | | | <-----Extra-----> | 72*4882a593Smuzhiyun * +----------+ | +---------+ | +-----------+ 73*4882a593Smuzhiyun * | | 74*4882a593Smuzhiyun * | | 75*4882a593Smuzhiyun * + + 76*4882a593Smuzhiyun * 77*4882a593Smuzhiyun * The function call flow is shown below: 78*4882a593Smuzhiyun * 79*4882a593Smuzhiyun * mpi mpp_enc controller hal 80*4882a593Smuzhiyun * + + + + 81*4882a593Smuzhiyun * | | | | 82*4882a593Smuzhiyun * | | | | 83*4882a593Smuzhiyun * +----------init------------> | | 84*4882a593Smuzhiyun * | | | | 85*4882a593Smuzhiyun * | | | | 86*4882a593Smuzhiyun * | PrepCfg | | | 87*4882a593Smuzhiyun * +---------control----------> PrepCfg | | 88*4882a593Smuzhiyun * | +-----control-----> | 89*4882a593Smuzhiyun * | | | PrepCfg | 90*4882a593Smuzhiyun * | +--------------------------control--------> 91*4882a593Smuzhiyun * | | | allocate 92*4882a593Smuzhiyun * | | | buffer 93*4882a593Smuzhiyun * | | | | 94*4882a593Smuzhiyun * | RcCfg | | | 95*4882a593Smuzhiyun * +---------control----------> RcCfg | | 96*4882a593Smuzhiyun * | +-----control-----> | 97*4882a593Smuzhiyun * | | rc_init | 98*4882a593Smuzhiyun * | | | | 99*4882a593Smuzhiyun * | | | | 100*4882a593Smuzhiyun * | CodecCfg | | | 101*4882a593Smuzhiyun * +---------control----------> | CodecCfg | 102*4882a593Smuzhiyun * | +--------------------------control--------> 103*4882a593Smuzhiyun * | | | generate 104*4882a593Smuzhiyun * | | | sps/pps 105*4882a593Smuzhiyun * | | | Get extra info | 106*4882a593Smuzhiyun * | +--------------------------control--------> 107*4882a593Smuzhiyun * | Get extra info | | | 108*4882a593Smuzhiyun * +---------control----------> | | 109*4882a593Smuzhiyun * | | | | 110*4882a593Smuzhiyun * | | | | 111*4882a593Smuzhiyun * | ROICfg | | | 112*4882a593Smuzhiyun * +---------control----------> | ROICfg | 113*4882a593Smuzhiyun * | +--------------------------control--------> 114*4882a593Smuzhiyun * | | | | 115*4882a593Smuzhiyun * | OSDCfg | | | 116*4882a593Smuzhiyun * +---------control----------> | OSDCfg | 117*4882a593Smuzhiyun * | +--------------------------control--------> 118*4882a593Smuzhiyun * | | | | 119*4882a593Smuzhiyun * | MDCfg | | | 120*4882a593Smuzhiyun * +---------control----------> | MDCfg | 121*4882a593Smuzhiyun * | +--------------------------control--------> 122*4882a593Smuzhiyun * | | | | 123*4882a593Smuzhiyun * | Set extra info | | | 124*4882a593Smuzhiyun * +---------control----------> | Set extra info | 125*4882a593Smuzhiyun * | +--------------------------control--------> 126*4882a593Smuzhiyun * | | | | 127*4882a593Smuzhiyun * | task | | | 128*4882a593Smuzhiyun * +----------encode----------> task | | 129*4882a593Smuzhiyun * | +-----encode------> | 130*4882a593Smuzhiyun * | | encode | 131*4882a593Smuzhiyun * | | | syntax | 132*4882a593Smuzhiyun * | +--------------------------gen_reg--------> 133*4882a593Smuzhiyun * | | | | 134*4882a593Smuzhiyun * | | | | 135*4882a593Smuzhiyun * | +---------------------------start---------> 136*4882a593Smuzhiyun * | | | | 137*4882a593Smuzhiyun * | | | | 138*4882a593Smuzhiyun * | +---------------------------wait----------> 139*4882a593Smuzhiyun * | | | | 140*4882a593Smuzhiyun * | | callback | | 141*4882a593Smuzhiyun * | +-----------------> | 142*4882a593Smuzhiyun * +--OSD-MD--encode----------> | | 143*4882a593Smuzhiyun * | . | | | 144*4882a593Smuzhiyun * | . | | | 145*4882a593Smuzhiyun * | . | | | 146*4882a593Smuzhiyun * +--OSD-MD--encode----------> | | 147*4882a593Smuzhiyun * | | | | 148*4882a593Smuzhiyun * +----------deinit----------> | | 149*4882a593Smuzhiyun * + + + + 150*4882a593Smuzhiyun */ 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* 153*4882a593Smuzhiyun * encoder query interface is only for debug usage 154*4882a593Smuzhiyun */ 155*4882a593Smuzhiyun #define MPP_ENC_QUERY_STATUS (0x00000001) 156*4882a593Smuzhiyun #define MPP_ENC_QUERY_WAIT (0x00000002) 157*4882a593Smuzhiyun #define MPP_ENC_QUERY_FPS (0x00000004) 158*4882a593Smuzhiyun #define MPP_ENC_QUERY_BPS (0x00000008) 159*4882a593Smuzhiyun #define MPP_ENC_QUERY_ENC_IN_FRM (0x00000010) 160*4882a593Smuzhiyun #define MPP_ENC_QUERY_ENC_WORK (0x00000020) 161*4882a593Smuzhiyun #define MPP_ENC_QUERY_ENC_OUT_PKT (0x00000040) 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #define MPP_ENC_QUERY_ALL (MPP_ENC_QUERY_STATUS | \ 164*4882a593Smuzhiyun MPP_ENC_QUERY_WAIT | \ 165*4882a593Smuzhiyun MPP_ENC_QUERY_FPS | \ 166*4882a593Smuzhiyun MPP_ENC_QUERY_BPS | \ 167*4882a593Smuzhiyun MPP_ENC_QUERY_ENC_IN_FRM | \ 168*4882a593Smuzhiyun MPP_ENC_QUERY_ENC_WORK | \ 169*4882a593Smuzhiyun MPP_ENC_QUERY_ENC_OUT_PKT) 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun typedef struct MppEncQueryCfg_t { 172*4882a593Smuzhiyun /* 173*4882a593Smuzhiyun * 32 bit query flag for query data check 174*4882a593Smuzhiyun * Each bit represent a query data switch. 175*4882a593Smuzhiyun * bit 0 - for querying encoder runtime status 176*4882a593Smuzhiyun * bit 1 - for querying encoder runtime waiting status 177*4882a593Smuzhiyun * bit 2 - for querying encoder realtime encode fps 178*4882a593Smuzhiyun * bit 3 - for querying encoder realtime output bps 179*4882a593Smuzhiyun * bit 4 - for querying encoder input frame count 180*4882a593Smuzhiyun * bit 5 - for querying encoder start hardware times 181*4882a593Smuzhiyun * bit 6 - for querying encoder output packet count 182*4882a593Smuzhiyun */ 183*4882a593Smuzhiyun RK_U32 query_flag; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* 64 bit query data output */ 186*4882a593Smuzhiyun RK_U32 rt_status; 187*4882a593Smuzhiyun RK_U32 rt_wait; 188*4882a593Smuzhiyun RK_U32 rt_fps; 189*4882a593Smuzhiyun RK_U32 rt_bps; 190*4882a593Smuzhiyun RK_U32 enc_in_frm_cnt; 191*4882a593Smuzhiyun RK_U32 enc_hw_run_cnt; 192*4882a593Smuzhiyun RK_U32 enc_out_pkt_cnt; 193*4882a593Smuzhiyun } MppEncQueryCfg; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun /* 196*4882a593Smuzhiyun * base working mode parameter 197*4882a593Smuzhiyun */ 198*4882a593Smuzhiyun typedef enum MppEncBaseCfgChange_e { 199*4882a593Smuzhiyun MPP_ENC_BASE_CFG_CHANGE_LOW_DELAY = (1 << 0), 200*4882a593Smuzhiyun MPP_ENC_BASE_CFG_CHANGE_ALL = (0xFFFFFFFF), 201*4882a593Smuzhiyun } MppEncBaseCfgChange; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun typedef struct MppEncBaseCfg_t { 204*4882a593Smuzhiyun RK_U32 change; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun RK_S32 low_delay; 207*4882a593Smuzhiyun } MppEncBaseCfg; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /* 210*4882a593Smuzhiyun * Rate control parameter 211*4882a593Smuzhiyun */ 212*4882a593Smuzhiyun typedef enum MppEncRcCfgChange_e { 213*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_RC_MODE = (1 << 0), 214*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QUALITY = (1 << 1), 215*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_BPS = (1 << 2), /* change on bps target / max / min */ 216*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_FPS_IN = (1 << 5), /* change on fps in flex / numerator / denorminator */ 217*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_FPS_OUT = (1 << 6), /* change on fps out flex / numerator / denorminator */ 218*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_GOP = (1 << 7), 219*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_SKIP_CNT = (1 << 8), 220*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_MAX_REENC = (1 << 9), 221*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_DROP_FRM = (1 << 10), 222*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_MAX_I_PROP = (1 << 11), 223*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_MIN_I_PROP = (1 << 12), 224*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_INIT_IP_RATIO = (1 << 13), 225*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_PRIORITY = (1 << 14), 226*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_SUPER_FRM = (1 << 15), 227*4882a593Smuzhiyun /* qp related change flag */ 228*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QP_INIT = (1 << 16), 229*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QP_RANGE = (1 << 17), 230*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I = (1 << 18), 231*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QP_MAX_STEP = (1 << 19), 232*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QP_IP = (1 << 20), 233*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QP_VI = (1 << 21), 234*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QP_ROW = (1 << 22), 235*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_QP_ROW_I = (1 << 23), 236*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_DEBREATH = (1 << 24), 237*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_HIER_QP = (1 << 25), 238*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_ST_TIME = (1 << 26), 239*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_REFRESH = (1 << 27), 240*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_GOP_REF_CFG = (1 << 28), 241*4882a593Smuzhiyun MPP_ENC_RC_CFG_CHANGE_ALL = (0xFFFFFFFF), 242*4882a593Smuzhiyun } MppEncRcCfgChange; 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun typedef enum MppEncRcQuality_e { 245*4882a593Smuzhiyun MPP_ENC_RC_QUALITY_WORST, 246*4882a593Smuzhiyun MPP_ENC_RC_QUALITY_WORSE, 247*4882a593Smuzhiyun MPP_ENC_RC_QUALITY_MEDIUM, 248*4882a593Smuzhiyun MPP_ENC_RC_QUALITY_BETTER, 249*4882a593Smuzhiyun MPP_ENC_RC_QUALITY_BEST, 250*4882a593Smuzhiyun MPP_ENC_RC_QUALITY_CQP, 251*4882a593Smuzhiyun MPP_ENC_RC_QUALITY_AQ_ONLY, 252*4882a593Smuzhiyun MPP_ENC_RC_QUALITY_BUTT 253*4882a593Smuzhiyun } MppEncRcQuality; 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun typedef struct MppEncRcCfg_t { 256*4882a593Smuzhiyun RK_U32 change; 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun /* 259*4882a593Smuzhiyun * rc_mode - rate control mode 260*4882a593Smuzhiyun * 261*4882a593Smuzhiyun * mpp provide two rate control mode: 262*4882a593Smuzhiyun * 263*4882a593Smuzhiyun * Constant Bit Rate (CBR) mode 264*4882a593Smuzhiyun * - paramter 'bps*' define target bps 265*4882a593Smuzhiyun * - paramter quality and qp will not take effect 266*4882a593Smuzhiyun * 267*4882a593Smuzhiyun * Variable Bit Rate (VBR) mode 268*4882a593Smuzhiyun * - paramter 'quality' define 5 quality levels 269*4882a593Smuzhiyun * - paramter 'bps*' is used as reference but not strict condition 270*4882a593Smuzhiyun * - special Constant QP (CQP) mode is under VBR mode 271*4882a593Smuzhiyun * CQP mode will work with qp in CodecCfg. But only use for test 272*4882a593Smuzhiyun * 273*4882a593Smuzhiyun * default: CBR 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun MppEncRcMode rc_mode; 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun /* 278*4882a593Smuzhiyun * quality - quality parameter, only takes effect in VBR mode 279*4882a593Smuzhiyun * 280*4882a593Smuzhiyun * Mpp does not give the direct parameter in different protocol. 281*4882a593Smuzhiyun * 282*4882a593Smuzhiyun * Mpp provide total 5 quality level: 283*4882a593Smuzhiyun * Worst - worse - Medium - better - best 284*4882a593Smuzhiyun * 285*4882a593Smuzhiyun * extra CQP level means special constant-qp (CQP) mode 286*4882a593Smuzhiyun * 287*4882a593Smuzhiyun * default value: Medium 288*4882a593Smuzhiyun */ 289*4882a593Smuzhiyun MppEncRcQuality quality; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun /* 292*4882a593Smuzhiyun * bit rate parameters 293*4882a593Smuzhiyun * mpp gives three bit rate control parameter for control 294*4882a593Smuzhiyun * bps_target - target bit rate, unit: bit per second 295*4882a593Smuzhiyun * bps_max - maximun bit rate, unit: bit per second 296*4882a593Smuzhiyun * bps_min - minimun bit rate, unit: bit per second 297*4882a593Smuzhiyun * if user need constant bit rate set parameters to the similar value 298*4882a593Smuzhiyun * if user need variable bit rate set parameters as they need 299*4882a593Smuzhiyun */ 300*4882a593Smuzhiyun RK_S32 bps_target; 301*4882a593Smuzhiyun RK_S32 bps_max; 302*4882a593Smuzhiyun RK_S32 bps_min; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* 305*4882a593Smuzhiyun * frame rate parameters have great effect on rate control 306*4882a593Smuzhiyun * 307*4882a593Smuzhiyun * fps_in_flex 308*4882a593Smuzhiyun * 0 - fix input frame rate 309*4882a593Smuzhiyun * 1 - variable input frame rate 310*4882a593Smuzhiyun * 311*4882a593Smuzhiyun * fps_in_num 312*4882a593Smuzhiyun * input frame rate numerator, if 0 then default 30 313*4882a593Smuzhiyun * 314*4882a593Smuzhiyun * fps_in_denorm 315*4882a593Smuzhiyun * input frame rate denorminator, if 0 then default 1 316*4882a593Smuzhiyun * 317*4882a593Smuzhiyun * fps_out_flex 318*4882a593Smuzhiyun * 0 - fix output frame rate 319*4882a593Smuzhiyun * 1 - variable output frame rate 320*4882a593Smuzhiyun * 321*4882a593Smuzhiyun * fps_out_num 322*4882a593Smuzhiyun * output frame rate numerator, if 0 then default 30 323*4882a593Smuzhiyun * 324*4882a593Smuzhiyun * fps_out_denorm 325*4882a593Smuzhiyun * output frame rate denorminator, if 0 then default 1 326*4882a593Smuzhiyun */ 327*4882a593Smuzhiyun RK_S32 fps_in_flex; 328*4882a593Smuzhiyun RK_S32 fps_in_num; 329*4882a593Smuzhiyun RK_S32 fps_in_denorm; 330*4882a593Smuzhiyun RK_S32 fps_out_flex; 331*4882a593Smuzhiyun RK_S32 fps_out_num; 332*4882a593Smuzhiyun RK_S32 fps_out_denorm; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun /* 335*4882a593Smuzhiyun * gop - group of picture, gap between Intra frame 336*4882a593Smuzhiyun * 0 for only 1 I frame the rest are all P frames 337*4882a593Smuzhiyun * 1 for all I frame 338*4882a593Smuzhiyun * 2 for I P I P I P 339*4882a593Smuzhiyun * 3 for I P P I P P 340*4882a593Smuzhiyun * etc... 341*4882a593Smuzhiyun */ 342*4882a593Smuzhiyun RK_S32 gop; 343*4882a593Smuzhiyun void *ref_cfg; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun /* 346*4882a593Smuzhiyun * skip_cnt - max continuous frame skip count 347*4882a593Smuzhiyun * 0 - frame skip is not allow 348*4882a593Smuzhiyun */ 349*4882a593Smuzhiyun RK_S32 skip_cnt; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun /* 352*4882a593Smuzhiyun * max_reenc_times - max reencode time for one frame 353*4882a593Smuzhiyun * 0 - reencode is not allowed 354*4882a593Smuzhiyun * 1~3 max reencode time is limited to 3 355*4882a593Smuzhiyun */ 356*4882a593Smuzhiyun RK_U32 max_reenc_times; 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun /* 359*4882a593Smuzhiyun * stats_time - the time of bitrate statistics 360*4882a593Smuzhiyun */ 361*4882a593Smuzhiyun RK_S32 stats_time; 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun /* 364*4882a593Smuzhiyun * drop frame parameters 365*4882a593Smuzhiyun * used on bitrate is far over the max bitrate 366*4882a593Smuzhiyun * 367*4882a593Smuzhiyun * drop_mode 368*4882a593Smuzhiyun * 369*4882a593Smuzhiyun * MPP_ENC_RC_DROP_FRM_DISABLED 370*4882a593Smuzhiyun * - do not drop frame when bitrate overflow. 371*4882a593Smuzhiyun * MPP_ENC_RC_DROP_FRM_NORMAL 372*4882a593Smuzhiyun * - do not encode the dropped frame when bitrate overflow. 373*4882a593Smuzhiyun * MPP_ENC_RC_DROP_FRM_PSKIP 374*4882a593Smuzhiyun * - encode a all skip frame when bitrate overflow. 375*4882a593Smuzhiyun * 376*4882a593Smuzhiyun * drop_threshold 377*4882a593Smuzhiyun * 378*4882a593Smuzhiyun * The percentage threshold over max_bitrate for trigger frame drop. 379*4882a593Smuzhiyun * 380*4882a593Smuzhiyun * drop_gap 381*4882a593Smuzhiyun * The max continuous frame drop number 382*4882a593Smuzhiyun */ 383*4882a593Smuzhiyun MppEncRcDropFrmMode drop_mode; 384*4882a593Smuzhiyun RK_U32 drop_threshold; 385*4882a593Smuzhiyun RK_U32 drop_gap; 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun MppEncRcSuperFrameMode super_mode; 388*4882a593Smuzhiyun RK_U32 super_i_thd; 389*4882a593Smuzhiyun RK_U32 super_p_thd; 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun MppEncRcPriority rc_priority; 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun RK_U32 debreath_en; 394*4882a593Smuzhiyun RK_U32 debre_strength; 395*4882a593Smuzhiyun RK_S32 max_i_prop; 396*4882a593Smuzhiyun RK_S32 min_i_prop; 397*4882a593Smuzhiyun RK_S32 init_ip_ratio; 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun /* general qp control */ 400*4882a593Smuzhiyun RK_S32 qp_init; 401*4882a593Smuzhiyun RK_S32 qp_max; 402*4882a593Smuzhiyun RK_S32 qp_max_i; 403*4882a593Smuzhiyun RK_S32 qp_min; 404*4882a593Smuzhiyun RK_S32 qp_min_i; 405*4882a593Smuzhiyun RK_S32 qp_max_step; /* delta qp between each two P frame */ 406*4882a593Smuzhiyun RK_S32 qp_delta_ip; /* delta qp between I and P */ 407*4882a593Smuzhiyun RK_S32 qp_delta_vi; /* delta qp between vi and P */ 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun RK_S32 hier_qp_en; 410*4882a593Smuzhiyun RK_S32 hier_qp_delta[4]; 411*4882a593Smuzhiyun RK_S32 hier_frame_num[4]; 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun RK_U32 refresh_en; 414*4882a593Smuzhiyun MppEncRcRefreshMode refresh_mode; 415*4882a593Smuzhiyun RK_U32 refresh_num; 416*4882a593Smuzhiyun RK_S32 refresh_length; 417*4882a593Smuzhiyun } MppEncRcCfg; 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun typedef enum MppEncHwCfgChange_e { 421*4882a593Smuzhiyun /* qp related hardware config flag */ 422*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_QP_ROW = (1 << 0), 423*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_QP_ROW_I = (1 << 1), 424*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_AQ_THRD_I = (1 << 2), 425*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_AQ_THRD_P = (1 << 3), 426*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_AQ_STEP_I = (1 << 4), 427*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_AQ_STEP_P = (1 << 5), 428*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_MB_RC = (1 << 6), 429*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_CU_MODE_BIAS = (1 << 8), 430*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_CU_SKIP_BIAS = (1 << 9), 431*4882a593Smuzhiyun MPP_ENC_HW_CFG_CHANGE_ALL = (0xFFFFFFFF), 432*4882a593Smuzhiyun } MppEncHwCfgChange; 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun /* 435*4882a593Smuzhiyun * Hardware related rate control config 436*4882a593Smuzhiyun * 437*4882a593Smuzhiyun * This config will open some detail feature to external user to control 438*4882a593Smuzhiyun * hardware behavior directly. 439*4882a593Smuzhiyun */ 440*4882a593Smuzhiyun typedef struct MppEncHwCfg_t { 441*4882a593Smuzhiyun RK_U32 change; 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun /* vepu541/vepu540 */ 444*4882a593Smuzhiyun RK_S32 qp_delta_row; /* delta qp between two row in P frame */ 445*4882a593Smuzhiyun RK_S32 qp_delta_row_i; /* delta qp between two row in I frame */ 446*4882a593Smuzhiyun RK_U32 aq_thrd_i[16]; 447*4882a593Smuzhiyun RK_U32 aq_thrd_p[16]; 448*4882a593Smuzhiyun RK_S32 aq_step_i[16]; 449*4882a593Smuzhiyun RK_S32 aq_step_p[16]; 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun /* vepu1/2 */ 452*4882a593Smuzhiyun RK_S32 mb_rc_disable; 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun /* vepu580 */ 455*4882a593Smuzhiyun RK_S32 extra_buf; 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun /* 458*4882a593Smuzhiyun * block mode decision bias config 459*4882a593Smuzhiyun * 0 - intra32x32 460*4882a593Smuzhiyun * 1 - intra16x16 461*4882a593Smuzhiyun * 2 - intra8x8 462*4882a593Smuzhiyun * 3 - intra4x4 463*4882a593Smuzhiyun * 4 - inter64x64 464*4882a593Smuzhiyun * 5 - inter32x32 465*4882a593Smuzhiyun * 6 - inter16x16 466*4882a593Smuzhiyun * 7 - inter8x8 467*4882a593Smuzhiyun * value range 0 ~ 15, default : 8 468*4882a593Smuzhiyun * If the value is smaller then encoder will be more likely to encode corresponding block mode. 469*4882a593Smuzhiyun */ 470*4882a593Smuzhiyun RK_S32 mode_bias[8]; 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun /* 473*4882a593Smuzhiyun * skip mode bias config 474*4882a593Smuzhiyun * skip_bias_en - enable flag for skip bias config 475*4882a593Smuzhiyun * skip_sad - sad threshold for skip / non-skip 476*4882a593Smuzhiyun * skip_bias - tendency for skip, value range 0 ~ 15, default : 8 477*4882a593Smuzhiyun * If the value is smaller then encoder will be more likely to encode skip block. 478*4882a593Smuzhiyun */ 479*4882a593Smuzhiyun RK_S32 skip_bias_en; 480*4882a593Smuzhiyun RK_S32 skip_sad; 481*4882a593Smuzhiyun RK_S32 skip_bias; 482*4882a593Smuzhiyun } MppEncHwCfg; 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun /* 485*4882a593Smuzhiyun * Mpp preprocess parameter 486*4882a593Smuzhiyun */ 487*4882a593Smuzhiyun typedef enum MppEncPrepCfgChange_e { 488*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_INPUT = (1 << 0), /* change on input config */ 489*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_FORMAT = (1 << 2), /* change on format */ 490*4882a593Smuzhiyun /* transform parameter */ 491*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_ROTATION = (1 << 4), /* change on rotation */ 492*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_MIRRORING = (1 << 5), /* change on mirroring */ 493*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_FLIP = (1 << 6), /* change on flip */ 494*4882a593Smuzhiyun /* enhancement parameter */ 495*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_DENOISE = (1 << 8), /* change on denoise */ 496*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_SHARPEN = (1 << 9), /* change on denoise */ 497*4882a593Smuzhiyun /* color related parameter */ 498*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_COLOR_RANGE = (1 << 16), /* change on color range */ 499*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_COLOR_SPACE = (1 << 17), /* change on color range */ 500*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_COLOR_PRIME = (1 << 18), /* change on color primaries */ 501*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_COLOR_TRC = (1 << 19), /* change on color transfer */ 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun MPP_ENC_PREP_CFG_CHANGE_ALL = (0xFFFFFFFF), 504*4882a593Smuzhiyun } MppEncPrepCfgChange; 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun /* 507*4882a593Smuzhiyun * Preprocess sharpen parameter 508*4882a593Smuzhiyun * 509*4882a593Smuzhiyun * 5x5 sharpen core 510*4882a593Smuzhiyun * 511*4882a593Smuzhiyun * enable_y - enable luma sharpen 512*4882a593Smuzhiyun * enable_uv - enable chroma sharpen 513*4882a593Smuzhiyun */ 514*4882a593Smuzhiyun typedef struct { 515*4882a593Smuzhiyun RK_U32 enable_y; 516*4882a593Smuzhiyun RK_U32 enable_uv; 517*4882a593Smuzhiyun RK_S32 coef[5]; 518*4882a593Smuzhiyun RK_S32 div; 519*4882a593Smuzhiyun RK_S32 threshold; 520*4882a593Smuzhiyun } MppEncPrepSharpenCfg; 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun /* 523*4882a593Smuzhiyun * input frame rotation parameter 524*4882a593Smuzhiyun * 0 - disable rotation 525*4882a593Smuzhiyun * 1 - 90 degree 526*4882a593Smuzhiyun * 2 - 180 degree 527*4882a593Smuzhiyun * 3 - 270 degree 528*4882a593Smuzhiyun */ 529*4882a593Smuzhiyun typedef enum MppEncRotationCfg_e { 530*4882a593Smuzhiyun MPP_ENC_ROT_0, 531*4882a593Smuzhiyun MPP_ENC_ROT_90, 532*4882a593Smuzhiyun MPP_ENC_ROT_180, 533*4882a593Smuzhiyun MPP_ENC_ROT_270, 534*4882a593Smuzhiyun MPP_ENC_ROT_BUTT 535*4882a593Smuzhiyun } MppEncRotationCfg; 536*4882a593Smuzhiyun 537*4882a593Smuzhiyun typedef struct MppEncPrepCfg_t { 538*4882a593Smuzhiyun RK_U32 change; 539*4882a593Smuzhiyun 540*4882a593Smuzhiyun /* 541*4882a593Smuzhiyun * Mpp encoder input data dimension config 542*4882a593Smuzhiyun * 543*4882a593Smuzhiyun * width / height / hor_stride / ver_stride / format 544*4882a593Smuzhiyun * These information will be used for buffer allocation and rc config init 545*4882a593Smuzhiyun * The output format is always YUV420. So if input is RGB then color 546*4882a593Smuzhiyun * conversion will be done internally 547*4882a593Smuzhiyun */ 548*4882a593Smuzhiyun RK_S32 width; 549*4882a593Smuzhiyun RK_S32 height; 550*4882a593Smuzhiyun RK_S32 hor_stride; 551*4882a593Smuzhiyun RK_S32 ver_stride; 552*4882a593Smuzhiyun 553*4882a593Smuzhiyun /* 554*4882a593Smuzhiyun * Mpp encoder input data format config 555*4882a593Smuzhiyun */ 556*4882a593Smuzhiyun MppFrameFormat format; 557*4882a593Smuzhiyun MppFrameColorSpace color; 558*4882a593Smuzhiyun MppFrameColorPrimaries colorprim; 559*4882a593Smuzhiyun MppFrameColorTransferCharacteristic colortrc; 560*4882a593Smuzhiyun MppFrameColorRange range; 561*4882a593Smuzhiyun 562*4882a593Smuzhiyun /* suffix ext means the user set config externally */ 563*4882a593Smuzhiyun MppEncRotationCfg rotation; 564*4882a593Smuzhiyun MppEncRotationCfg rotation_ext; 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun /* 567*4882a593Smuzhiyun * input frame mirroring parameter 568*4882a593Smuzhiyun * 0 - disable mirroring 569*4882a593Smuzhiyun * 1 - horizontal mirroring 570*4882a593Smuzhiyun */ 571*4882a593Smuzhiyun RK_S32 mirroring; 572*4882a593Smuzhiyun RK_S32 mirroring_ext; 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun /* 575*4882a593Smuzhiyun * input frame flip parameter 576*4882a593Smuzhiyun * 0 - disable flip 577*4882a593Smuzhiyun * 1 - flip, vertical mirror transformation 578*4882a593Smuzhiyun */ 579*4882a593Smuzhiyun RK_S32 flip; 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun /* 582*4882a593Smuzhiyun * TODO: 583*4882a593Smuzhiyun */ 584*4882a593Smuzhiyun RK_S32 denoise; 585*4882a593Smuzhiyun 586*4882a593Smuzhiyun MppEncPrepSharpenCfg sharpen; 587*4882a593Smuzhiyun } MppEncPrepCfg; 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun /* 590*4882a593Smuzhiyun * Mpp Motion Detection parameter 591*4882a593Smuzhiyun * 592*4882a593Smuzhiyun * Mpp can output Motion Detection infomation for each frame. 593*4882a593Smuzhiyun * If user euqueue a encode task with KEY_MOTION_INFO by following function 594*4882a593Smuzhiyun * then encoder will output Motion Detection information to the buffer. 595*4882a593Smuzhiyun * 596*4882a593Smuzhiyun * mpp_task_meta_set_buffer(task, KEY_MOTION_INFO, buffer); 597*4882a593Smuzhiyun * 598*4882a593Smuzhiyun * Motion Detection information will be organized in this way: 599*4882a593Smuzhiyun * 1. Each 16x16 block will have a 32 bit block information which contains 600*4882a593Smuzhiyun * 15 bit SAD(Sum of Abstract Difference value 601*4882a593Smuzhiyun * 9 bit signed horizontal motion vector 602*4882a593Smuzhiyun * 8 bit signed vertical motion vector 603*4882a593Smuzhiyun * 2. The sequence of MD information in the buffer is corresponding to the 604*4882a593Smuzhiyun * block position in the frame, left-to right, top-to-bottom. 605*4882a593Smuzhiyun * 3. If the width of the frame is not a multiple of 256 pixels (16 macro 606*4882a593Smuzhiyun * blocks), DMA would extend the frame to a multiple of 256 pixels and 607*4882a593Smuzhiyun * the extended blocks' MD information are 32'h0000_0000. 608*4882a593Smuzhiyun * 4. Buffer must be ion buffer and 1024 byte aligned. 609*4882a593Smuzhiyun */ 610*4882a593Smuzhiyun typedef struct MppEncMDBlkInfo_t { 611*4882a593Smuzhiyun RK_U32 sad : 15; /* bit 0~14 - SAD */ 612*4882a593Smuzhiyun RK_S32 mvx : 9; /* bit 15~23 - signed horizontal mv */ 613*4882a593Smuzhiyun RK_S32 mvy : 8; /* bit 24~31 - signed vertical mv */ 614*4882a593Smuzhiyun } MppEncMDBlkInfo; 615*4882a593Smuzhiyun 616*4882a593Smuzhiyun typedef enum MppEncHeaderMode_e { 617*4882a593Smuzhiyun /* default mode: attach vps/sps/pps only on first frame */ 618*4882a593Smuzhiyun MPP_ENC_HEADER_MODE_DEFAULT, 619*4882a593Smuzhiyun /* IDR mode: attach vps/sps/pps on each IDR frame */ 620*4882a593Smuzhiyun MPP_ENC_HEADER_MODE_EACH_IDR, 621*4882a593Smuzhiyun MPP_ENC_HEADER_MODE_BUTT, 622*4882a593Smuzhiyun } MppEncHeaderMode; 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun typedef enum MppEncSeiMode_e { 625*4882a593Smuzhiyun MPP_ENC_SEI_MODE_DISABLE, /* default mode, SEI writing is disabled */ 626*4882a593Smuzhiyun MPP_ENC_SEI_MODE_ONE_SEQ, /* one sequence has only one SEI */ 627*4882a593Smuzhiyun MPP_ENC_SEI_MODE_ONE_FRAME /* one frame may have one SEI, if SEI info has changed */ 628*4882a593Smuzhiyun } MppEncSeiMode; 629*4882a593Smuzhiyun 630*4882a593Smuzhiyun /* 631*4882a593Smuzhiyun * Mpp codec parameter 632*4882a593Smuzhiyun * parameter is defined from here 633*4882a593Smuzhiyun */ 634*4882a593Smuzhiyun 635*4882a593Smuzhiyun /* 636*4882a593Smuzhiyun * H.264 configurable parameter 637*4882a593Smuzhiyun */ 638*4882a593Smuzhiyun typedef enum MppEncH264CfgChange_e { 639*4882a593Smuzhiyun /* change on stream type */ 640*4882a593Smuzhiyun MPP_ENC_H264_CFG_STREAM_TYPE = (1 << 0), 641*4882a593Smuzhiyun /* change on svc / profile / level */ 642*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_PROFILE = (1 << 1), 643*4882a593Smuzhiyun /* change on entropy_coding_mode / cabac_init_idc */ 644*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_ENTROPY = (1 << 2), 645*4882a593Smuzhiyun 646*4882a593Smuzhiyun /* change on transform8x8_mode */ 647*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_TRANS_8x8 = (1 << 4), 648*4882a593Smuzhiyun /* change on constrained_intra_pred_mode */ 649*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_CONST_INTRA = (1 << 5), 650*4882a593Smuzhiyun /* change on chroma_cb_qp_offset/ chroma_cr_qp_offset */ 651*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_CHROMA_QP = (1 << 6), 652*4882a593Smuzhiyun /* change on deblock_disable / deblock_offset_alpha / deblock_offset_beta */ 653*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_DEBLOCKING = (1 << 7), 654*4882a593Smuzhiyun /* change on use_longterm */ 655*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_LONG_TERM = (1 << 8), 656*4882a593Smuzhiyun /* change on scaling_list_mode */ 657*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_SCALING_LIST = (1 << 9), 658*4882a593Smuzhiyun /* change on poc type */ 659*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_POC_TYPE = (1 << 10), 660*4882a593Smuzhiyun /* change on log2 max poc lsb minus 4 */ 661*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_MAX_POC_LSB = (1 << 11), 662*4882a593Smuzhiyun /* change on log2 max frame number minus 4 */ 663*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_MAX_FRM_NUM = (1 << 12), 664*4882a593Smuzhiyun /* change on gaps_in_frame_num_value_allowed_flag */ 665*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_GAPS_IN_FRM_NUM = (1 << 13), 666*4882a593Smuzhiyun 667*4882a593Smuzhiyun /* change on max_qp / min_qp */ 668*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_QP_LIMIT = (1 << 16), 669*4882a593Smuzhiyun /* change on max_qp_i / min_qp_i */ 670*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I = (1 << 17), 671*4882a593Smuzhiyun /* change on max_qp_step */ 672*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_MAX_QP_STEP = (1 << 18), 673*4882a593Smuzhiyun /* change on qp_delta_ip */ 674*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_QP_DELTA = (1 << 19), 675*4882a593Smuzhiyun /* change on intra_refresh_mode / intra_refresh_arg */ 676*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH = (1 << 20), 677*4882a593Smuzhiyun /* change on max long-term reference frame count */ 678*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_MAX_LTR = (1 << 21), 679*4882a593Smuzhiyun /* change on max temporal id */ 680*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_MAX_TID = (1 << 22), 681*4882a593Smuzhiyun /* change on adding prefix nal */ 682*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_ADD_PREFIX = (1 << 23), 683*4882a593Smuzhiyun /* change on base layer priority id */ 684*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_BASE_LAYER_PID = (1 << 24), 685*4882a593Smuzhiyun 686*4882a593Smuzhiyun /* change on vui */ 687*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_VUI = (1 << 28), 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun /* change on constraint */ 690*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_CONSTRAINT_SET = (1 << 29), 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun MPP_ENC_H264_CFG_CHANGE_ALL = (0xFFFFFFFF), 693*4882a593Smuzhiyun } MppEncH264CfgChange; 694*4882a593Smuzhiyun 695*4882a593Smuzhiyun /* default H.264 hardware config */ 696*4882a593Smuzhiyun typedef struct MppEncH264HwCfg_t { 697*4882a593Smuzhiyun /* 698*4882a593Smuzhiyun * VEPU 1/2 : 2 699*4882a593Smuzhiyun * others : 0 700*4882a593Smuzhiyun */ 701*4882a593Smuzhiyun RK_U32 hw_poc_type; 702*4882a593Smuzhiyun /* 703*4882a593Smuzhiyun * VEPU 1/2 : fixed to 12 704*4882a593Smuzhiyun * others : changeable, default 12 705*4882a593Smuzhiyun */ 706*4882a593Smuzhiyun RK_U32 hw_log2_max_frame_num_minus4; 707*4882a593Smuzhiyun } MppEncH264HwCfg; 708*4882a593Smuzhiyun 709*4882a593Smuzhiyun typedef struct MppEncH264Cfg_t { 710*4882a593Smuzhiyun RK_U32 change; 711*4882a593Smuzhiyun 712*4882a593Smuzhiyun /* 713*4882a593Smuzhiyun * H.264 stream format 714*4882a593Smuzhiyun * 0 - H.264 Annex B: NAL unit starts with '00 00 00 01' 715*4882a593Smuzhiyun * 1 - Plain NAL units without startcode 716*4882a593Smuzhiyun */ 717*4882a593Smuzhiyun RK_S32 stream_type; 718*4882a593Smuzhiyun 719*4882a593Smuzhiyun /* 720*4882a593Smuzhiyun * H.264 codec syntax config 721*4882a593Smuzhiyun * 722*4882a593Smuzhiyun * do NOT setup the three option below unless you are familiar with encoder detail 723*4882a593Smuzhiyun * poc_type - picture order count type 0 ~ 2 724*4882a593Smuzhiyun * log2_max_poc_lsb - used in sps with poc_type 0, 725*4882a593Smuzhiyun * log2_max_frame_num - used in sps 726*4882a593Smuzhiyun */ 727*4882a593Smuzhiyun RK_U32 poc_type; 728*4882a593Smuzhiyun RK_U32 log2_max_poc_lsb; 729*4882a593Smuzhiyun RK_U32 log2_max_frame_num; /* actually log2_max_frame_num_minus4 */ 730*4882a593Smuzhiyun RK_U32 gaps_not_allowed; 731*4882a593Smuzhiyun 732*4882a593Smuzhiyun MppEncH264HwCfg hw_cfg; 733*4882a593Smuzhiyun 734*4882a593Smuzhiyun /* 735*4882a593Smuzhiyun * H.264 profile_idc parameter 736*4882a593Smuzhiyun * 66 - Baseline profile 737*4882a593Smuzhiyun * 77 - Main profile 738*4882a593Smuzhiyun * 100 - High profile 739*4882a593Smuzhiyun */ 740*4882a593Smuzhiyun RK_S32 profile; 741*4882a593Smuzhiyun 742*4882a593Smuzhiyun /* 743*4882a593Smuzhiyun * H.264 level_idc parameter 744*4882a593Smuzhiyun * 10 / 11 / 12 / 13 - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps 745*4882a593Smuzhiyun * 20 / 21 / 22 - cif@30fps / half-D1@@25fps / D1@12.5fps 746*4882a593Smuzhiyun * 30 / 31 / 32 - D1@25fps / 720p@30fps / 720p@60fps 747*4882a593Smuzhiyun * 40 / 41 / 42 - 1080p@30fps / 1080p@30fps / 1080p@60fps 748*4882a593Smuzhiyun * 50 / 51 / 52 - 4K@30fps 749*4882a593Smuzhiyun */ 750*4882a593Smuzhiyun RK_S32 level; 751*4882a593Smuzhiyun 752*4882a593Smuzhiyun /* 753*4882a593Smuzhiyun * H.264 entropy coding method 754*4882a593Smuzhiyun * 0 - CAVLC 755*4882a593Smuzhiyun * 1 - CABAC 756*4882a593Smuzhiyun * When CABAC is select cabac_init_idc can be range 0~2 757*4882a593Smuzhiyun */ 758*4882a593Smuzhiyun RK_S32 entropy_coding_mode; 759*4882a593Smuzhiyun RK_S32 entropy_coding_mode_ex; 760*4882a593Smuzhiyun RK_S32 cabac_init_idc; 761*4882a593Smuzhiyun RK_S32 cabac_init_idc_ex; 762*4882a593Smuzhiyun 763*4882a593Smuzhiyun /* 764*4882a593Smuzhiyun * 8x8 intra prediction and 8x8 transform enable flag 765*4882a593Smuzhiyun * This flag can only be enable under High profile 766*4882a593Smuzhiyun * 0 : disable (BP/MP) 767*4882a593Smuzhiyun * 1 : enable (HP) 768*4882a593Smuzhiyun */ 769*4882a593Smuzhiyun RK_S32 transform8x8_mode; 770*4882a593Smuzhiyun RK_S32 transform8x8_mode_ex; 771*4882a593Smuzhiyun 772*4882a593Smuzhiyun /* 773*4882a593Smuzhiyun * 0 : disable 774*4882a593Smuzhiyun * 1 : enable 775*4882a593Smuzhiyun */ 776*4882a593Smuzhiyun RK_S32 constrained_intra_pred_mode; 777*4882a593Smuzhiyun 778*4882a593Smuzhiyun /* 779*4882a593Smuzhiyun * 0 : flat scaling list 780*4882a593Smuzhiyun * 1 : default scaling list for all cases 781*4882a593Smuzhiyun * 2 : customized scaling list (not supported) 782*4882a593Smuzhiyun */ 783*4882a593Smuzhiyun RK_S32 scaling_list_mode; 784*4882a593Smuzhiyun 785*4882a593Smuzhiyun /* 786*4882a593Smuzhiyun * chroma qp offset (-12 - 12) 787*4882a593Smuzhiyun */ 788*4882a593Smuzhiyun RK_S32 chroma_cb_qp_offset; 789*4882a593Smuzhiyun RK_S32 chroma_cr_qp_offset; 790*4882a593Smuzhiyun 791*4882a593Smuzhiyun /* 792*4882a593Smuzhiyun * H.264 deblock filter mode flag 793*4882a593Smuzhiyun * 0 : enable 794*4882a593Smuzhiyun * 1 : disable 795*4882a593Smuzhiyun * 2 : disable deblocking filter at slice boundaries 796*4882a593Smuzhiyun * 797*4882a593Smuzhiyun * deblock filter offset alpha (-6 - 6) 798*4882a593Smuzhiyun * deblock filter offset beta (-6 - 6) 799*4882a593Smuzhiyun */ 800*4882a593Smuzhiyun RK_S32 deblock_disable; 801*4882a593Smuzhiyun RK_S32 deblock_offset_alpha; 802*4882a593Smuzhiyun RK_S32 deblock_offset_beta; 803*4882a593Smuzhiyun 804*4882a593Smuzhiyun /* 805*4882a593Smuzhiyun * H.264 long term reference picture enable flag 806*4882a593Smuzhiyun * 0 - disable 807*4882a593Smuzhiyun * 1 - enable 808*4882a593Smuzhiyun */ 809*4882a593Smuzhiyun RK_S32 use_longterm; 810*4882a593Smuzhiyun 811*4882a593Smuzhiyun /* 812*4882a593Smuzhiyun * quality config 813*4882a593Smuzhiyun * qp_max - 8 ~ 51 814*4882a593Smuzhiyun * qp_max_i - 10 ~ 40 815*4882a593Smuzhiyun * qp_min - 8 ~ 48 816*4882a593Smuzhiyun * qp_min_i - 10 ~ 40 817*4882a593Smuzhiyun * qp_max_step - max delta qp step between two frames 818*4882a593Smuzhiyun */ 819*4882a593Smuzhiyun RK_S32 qp_init; 820*4882a593Smuzhiyun RK_S16 qp_max; 821*4882a593Smuzhiyun RK_S16 qp_max_i; 822*4882a593Smuzhiyun RK_S16 qp_min; 823*4882a593Smuzhiyun RK_S16 qp_min_i; 824*4882a593Smuzhiyun RK_S16 qp_max_step; 825*4882a593Smuzhiyun RK_S16 qp_delta_ip; 826*4882a593Smuzhiyun 827*4882a593Smuzhiyun /* 828*4882a593Smuzhiyun * intra fresh config 829*4882a593Smuzhiyun * 830*4882a593Smuzhiyun * intra_refresh_mode 831*4882a593Smuzhiyun * 0 - no intra refresh 832*4882a593Smuzhiyun * 1 - intra refresh by MB row 833*4882a593Smuzhiyun * 2 - intra refresh by MB column 834*4882a593Smuzhiyun * 3 - intra refresh by MB gap 835*4882a593Smuzhiyun * 836*4882a593Smuzhiyun * intra_refresh_arg 837*4882a593Smuzhiyun * mode 0 - no effect 838*4882a593Smuzhiyun * mode 1 - refresh MB row number 839*4882a593Smuzhiyun * mode 2 - refresh MB colmn number 840*4882a593Smuzhiyun * mode 3 - refresh MB gap count 841*4882a593Smuzhiyun */ 842*4882a593Smuzhiyun RK_S32 intra_refresh_mode; 843*4882a593Smuzhiyun RK_S32 intra_refresh_arg; 844*4882a593Smuzhiyun 845*4882a593Smuzhiyun /* extra mode config */ 846*4882a593Smuzhiyun RK_S32 max_ltr_frames; 847*4882a593Smuzhiyun RK_S32 max_tid; 848*4882a593Smuzhiyun RK_S32 prefix_mode; 849*4882a593Smuzhiyun RK_S32 base_layer_pid; 850*4882a593Smuzhiyun /* 851*4882a593Smuzhiyun * Mpp encoder constraint_set parameter 852*4882a593Smuzhiyun * Mpp encoder constraint_set controls constraint_setx_flag in AVC. 853*4882a593Smuzhiyun * Mpp encoder constraint_set uses type RK_U32 to store force_flag and constraint_force as followed. 854*4882a593Smuzhiyun * | 00 | force_flag | 00 | constraint_force | 855*4882a593Smuzhiyun * As for force_flag and constraint_force, only low 6 bits are valid, 856*4882a593Smuzhiyun * corresponding to constraint_setx_flag from 5 to 0. 857*4882a593Smuzhiyun * If force_flag bit is enabled, constraint_setx_flag will be set correspondingly. 858*4882a593Smuzhiyun * Otherwise, constraint_setx_flag will use default value. 859*4882a593Smuzhiyun */ 860*4882a593Smuzhiyun RK_U32 constraint_set; 861*4882a593Smuzhiyun } MppEncH264Cfg; 862*4882a593Smuzhiyun 863*4882a593Smuzhiyun #define H265E_MAX_ROI_NUMBER 64 864*4882a593Smuzhiyun 865*4882a593Smuzhiyun typedef struct H265eRect_t { 866*4882a593Smuzhiyun RK_S32 left; 867*4882a593Smuzhiyun RK_S32 right; 868*4882a593Smuzhiyun RK_S32 top; 869*4882a593Smuzhiyun RK_S32 bottom; 870*4882a593Smuzhiyun } H265eRect; 871*4882a593Smuzhiyun 872*4882a593Smuzhiyun typedef struct H265eRoi_Region_t { 873*4882a593Smuzhiyun RK_U8 level; 874*4882a593Smuzhiyun H265eRect rect; 875*4882a593Smuzhiyun } H265eRoiRegion; 876*4882a593Smuzhiyun 877*4882a593Smuzhiyun /* 878*4882a593Smuzhiyun * roi region only can be setting when rc_enable = 1 879*4882a593Smuzhiyun */ 880*4882a593Smuzhiyun typedef struct MppEncH265RoiCfg_t { 881*4882a593Smuzhiyun /* 882*4882a593Smuzhiyun * the value is defined by H265eCtuMethod 883*4882a593Smuzhiyun */ 884*4882a593Smuzhiyun 885*4882a593Smuzhiyun RK_U8 method; 886*4882a593Smuzhiyun /* 887*4882a593Smuzhiyun * the number of roi,the value must less than H265E_MAX_ROI_NUMBER 888*4882a593Smuzhiyun */ 889*4882a593Smuzhiyun RK_S32 num; 890*4882a593Smuzhiyun 891*4882a593Smuzhiyun /* delat qp using in roi region*/ 892*4882a593Smuzhiyun RK_U32 delta_qp; 893*4882a593Smuzhiyun 894*4882a593Smuzhiyun /* roi region */ 895*4882a593Smuzhiyun H265eRoiRegion region[H265E_MAX_ROI_NUMBER]; 896*4882a593Smuzhiyun } MppEncH265RoiCfg; 897*4882a593Smuzhiyun 898*4882a593Smuzhiyun typedef struct H265eCtuQp_t { 899*4882a593Smuzhiyun /* the qp value using in ctu region */ 900*4882a593Smuzhiyun RK_U32 qp; 901*4882a593Smuzhiyun 902*4882a593Smuzhiyun /* 903*4882a593Smuzhiyun * define the ctu region 904*4882a593Smuzhiyun * method = H265E_METHOD_CUT_SIZE, the value of rect is in ctu size 905*4882a593Smuzhiyun * method = H264E_METHOD_COORDINATE,the value of rect is in coordinates 906*4882a593Smuzhiyun */ 907*4882a593Smuzhiyun H265eRect rect; 908*4882a593Smuzhiyun } H265eCtu; 909*4882a593Smuzhiyun 910*4882a593Smuzhiyun typedef struct H265eCtuRegion_t { 911*4882a593Smuzhiyun /* 912*4882a593Smuzhiyun * the value is defined by H265eCtuMethod 913*4882a593Smuzhiyun */ 914*4882a593Smuzhiyun RK_U8 method; 915*4882a593Smuzhiyun 916*4882a593Smuzhiyun /* 917*4882a593Smuzhiyun * the number of ctu,the value must less than H265E_MAX_ROI_NUMBER 918*4882a593Smuzhiyun */ 919*4882a593Smuzhiyun RK_S32 num; 920*4882a593Smuzhiyun 921*4882a593Smuzhiyun /* ctu region */ 922*4882a593Smuzhiyun H265eCtu ctu[H265E_MAX_ROI_NUMBER]; 923*4882a593Smuzhiyun } MppEncH265CtuCfg; 924*4882a593Smuzhiyun 925*4882a593Smuzhiyun /* 926*4882a593Smuzhiyun * define the method when set CTU/ROI parameters 927*4882a593Smuzhiyun * this value is using by method in H265eCtuRegion or H265eRoi struct 928*4882a593Smuzhiyun */ 929*4882a593Smuzhiyun typedef enum { 930*4882a593Smuzhiyun H265E_METHOD_CTU_SIZE, 931*4882a593Smuzhiyun H264E_METHOD_COORDINATE, 932*4882a593Smuzhiyun } H265eCtuMethod; 933*4882a593Smuzhiyun 934*4882a593Smuzhiyun /* 935*4882a593Smuzhiyun * H.265 configurable parameter 936*4882a593Smuzhiyun */ 937*4882a593Smuzhiyun typedef struct MppEncH265VuiCfg_t { 938*4882a593Smuzhiyun RK_U32 change; 939*4882a593Smuzhiyun RK_S32 vui_present; 940*4882a593Smuzhiyun RK_S32 vui_aspect_ratio; 941*4882a593Smuzhiyun RK_S32 vui_sar_size; 942*4882a593Smuzhiyun RK_S32 full_range; 943*4882a593Smuzhiyun RK_S32 time_scale; 944*4882a593Smuzhiyun } MppEncH265VuiCfg; 945*4882a593Smuzhiyun 946*4882a593Smuzhiyun typedef enum MppEncH265CfgChange_e { 947*4882a593Smuzhiyun /* change on stream type */ 948*4882a593Smuzhiyun MPP_ENC_H265_CFG_PROFILE_LEVEL_TILER_CHANGE = (1 << 0), 949*4882a593Smuzhiyun MPP_ENC_H265_CFG_INTRA_QP_CHANGE = (1 << 1), 950*4882a593Smuzhiyun MPP_ENC_H265_CFG_FRAME_RATE_CHANGE = (1 << 2), 951*4882a593Smuzhiyun MPP_ENC_H265_CFG_BITRATE_CHANGE = (1 << 3), 952*4882a593Smuzhiyun MPP_ENC_H265_CFG_GOP_SIZE = (1 << 4), 953*4882a593Smuzhiyun MPP_ENC_H265_CFG_RC_QP_CHANGE = (1 << 5), 954*4882a593Smuzhiyun MPP_ENC_H265_CFG_INTRA_REFRESH_CHANGE = (1 << 6), 955*4882a593Smuzhiyun MPP_ENC_H265_CFG_INDEPEND_SLICE_CHANGE = (1 << 7), 956*4882a593Smuzhiyun MPP_ENC_H265_CFG_DEPEND_SLICE_CHANGE = (1 << 8), 957*4882a593Smuzhiyun MPP_ENC_H265_CFG_CTU_CHANGE = (1 << 9), 958*4882a593Smuzhiyun MPP_ENC_H265_CFG_ROI_CHANGE = (1 << 10), 959*4882a593Smuzhiyun MPP_ENC_H265_CFG_CU_CHANGE = (1 << 11), 960*4882a593Smuzhiyun MPP_ENC_H265_CFG_DBLK_CHANGE = (1 << 12), 961*4882a593Smuzhiyun MPP_ENC_H265_CFG_SAO_CHANGE = (1 << 13), 962*4882a593Smuzhiyun MPP_ENC_H265_CFG_TRANS_CHANGE = (1 << 14), 963*4882a593Smuzhiyun MPP_ENC_H265_CFG_SLICE_CHANGE = (1 << 15), 964*4882a593Smuzhiyun MPP_ENC_H265_CFG_ENTROPY_CHANGE = (1 << 16), 965*4882a593Smuzhiyun MPP_ENC_H265_CFG_MERGE_CHANGE = (1 << 17), 966*4882a593Smuzhiyun MPP_ENC_H265_CFG_CHANGE_VUI = (1 << 18), 967*4882a593Smuzhiyun MPP_ENC_H265_CFG_RC_I_QP_CHANGE = (1 << 19), 968*4882a593Smuzhiyun MPP_ENC_H265_CFG_RC_MAX_QP_STEP_CHANGE = (1 << 21), 969*4882a593Smuzhiyun MPP_ENC_H265_CFG_RC_IP_DELTA_QP_CHANGE = (1 << 20), 970*4882a593Smuzhiyun MPP_ENC_H265_CFG_TILE_CHANGE = (1 << 22), 971*4882a593Smuzhiyun MPP_ENC_H265_CFG_SLICE_LPFACS_CHANGE = (1 << 23), 972*4882a593Smuzhiyun MPP_ENC_H265_CFG_TILE_LPFACS_CHANGE = (1 << 24), 973*4882a593Smuzhiyun MPP_ENC_H265_CFG_CHANGE_ALL = (0xFFFFFFFF), 974*4882a593Smuzhiyun } MppEncH265CfgChange; 975*4882a593Smuzhiyun 976*4882a593Smuzhiyun typedef struct MppEncH265SliceCfg_t { 977*4882a593Smuzhiyun /* default value: 0, means no slice split*/ 978*4882a593Smuzhiyun RK_U32 split_enable; 979*4882a593Smuzhiyun 980*4882a593Smuzhiyun /* 0: by bits number; 1: by lcu line number*/ 981*4882a593Smuzhiyun RK_U32 split_mode; 982*4882a593Smuzhiyun 983*4882a593Smuzhiyun /* 984*4882a593Smuzhiyun * when splitmode is 0, this value presents bits number, 985*4882a593Smuzhiyun * when splitmode is 1, this value presents lcu line number 986*4882a593Smuzhiyun */ 987*4882a593Smuzhiyun RK_U32 slice_size; 988*4882a593Smuzhiyun RK_U32 slice_out; 989*4882a593Smuzhiyun } MppEncH265SliceCfg; 990*4882a593Smuzhiyun 991*4882a593Smuzhiyun typedef struct MppEncH265CuCfg_t { 992*4882a593Smuzhiyun RK_U32 cu32x32_en; /*default: 1 */ 993*4882a593Smuzhiyun RK_U32 cu16x16_en; /*default: 1 */ 994*4882a593Smuzhiyun RK_U32 cu8x8_en; /*default: 1 */ 995*4882a593Smuzhiyun RK_U32 cu4x4_en; /*default: 1 */ 996*4882a593Smuzhiyun 997*4882a593Smuzhiyun // intra pred 998*4882a593Smuzhiyun RK_U32 constrained_intra_pred_flag; /*default: 0 */ 999*4882a593Smuzhiyun RK_U32 strong_intra_smoothing_enabled_flag; /*INTRA_SMOOTH*/ 1000*4882a593Smuzhiyun RK_U32 pcm_enabled_flag; /*default: 0, enable ipcm*/ 1001*4882a593Smuzhiyun RK_U32 pcm_loop_filter_disabled_flag; 1002*4882a593Smuzhiyun 1003*4882a593Smuzhiyun } MppEncH265CuCfg; 1004*4882a593Smuzhiyun 1005*4882a593Smuzhiyun typedef struct MppEncH265RefCfg_t { 1006*4882a593Smuzhiyun RK_U32 num_lt_ref_pic; /*default: 0*/ 1007*4882a593Smuzhiyun } MppEncH265RefCfg; 1008*4882a593Smuzhiyun 1009*4882a593Smuzhiyun 1010*4882a593Smuzhiyun typedef struct MppEncH265DblkCfg_t { 1011*4882a593Smuzhiyun RK_U32 slice_deblocking_filter_disabled_flag; /* default value: 0. {0,1} */ 1012*4882a593Smuzhiyun RK_S32 slice_beta_offset_div2; /* default value: 0. [-6,+6] */ 1013*4882a593Smuzhiyun RK_S32 slice_tc_offset_div2; /* default value: 0. [-6,+6] */ 1014*4882a593Smuzhiyun } MppEncH265DblkCfg_t; 1015*4882a593Smuzhiyun 1016*4882a593Smuzhiyun typedef struct MppEncH265SaoCfg_t { 1017*4882a593Smuzhiyun RK_U32 slice_sao_luma_disable; 1018*4882a593Smuzhiyun RK_U32 slice_sao_chroma_disable; 1019*4882a593Smuzhiyun } MppEncH265SaoCfg; 1020*4882a593Smuzhiyun 1021*4882a593Smuzhiyun typedef struct MppEncH265TransCfg_t { 1022*4882a593Smuzhiyun RK_U32 transquant_bypass_enabled_flag; 1023*4882a593Smuzhiyun RK_U32 transform_skip_enabled_flag; 1024*4882a593Smuzhiyun RK_U32 defalut_ScalingList_enable; /* default: 0 */ 1025*4882a593Smuzhiyun RK_S32 cb_qp_offset; 1026*4882a593Smuzhiyun RK_S32 cr_qp_offset; 1027*4882a593Smuzhiyun } MppEncH265TransCfg; 1028*4882a593Smuzhiyun 1029*4882a593Smuzhiyun typedef struct MppEncH265MergeCfg_t { 1030*4882a593Smuzhiyun RK_U32 max_mrg_cnd; 1031*4882a593Smuzhiyun RK_U32 merge_up_flag; 1032*4882a593Smuzhiyun RK_U32 merge_left_flag; 1033*4882a593Smuzhiyun } MppEncH265MergesCfg; 1034*4882a593Smuzhiyun 1035*4882a593Smuzhiyun typedef struct MppEncH265EntropyCfg_t { 1036*4882a593Smuzhiyun RK_U32 cabac_init_flag; /* default: 0 */ 1037*4882a593Smuzhiyun } MppEncH265EntropyCfg; 1038*4882a593Smuzhiyun 1039*4882a593Smuzhiyun typedef struct MppEncH265Cfg_t { 1040*4882a593Smuzhiyun RK_U32 change; 1041*4882a593Smuzhiyun 1042*4882a593Smuzhiyun /* H.265 codec syntax config */ 1043*4882a593Smuzhiyun RK_S32 profile; 1044*4882a593Smuzhiyun RK_S32 level; 1045*4882a593Smuzhiyun RK_S32 tier; 1046*4882a593Smuzhiyun 1047*4882a593Smuzhiyun /* constraint intra prediction flag */ 1048*4882a593Smuzhiyun RK_S32 const_intra_pred; 1049*4882a593Smuzhiyun RK_S32 ctu_size; 1050*4882a593Smuzhiyun RK_S32 max_cu_size; 1051*4882a593Smuzhiyun RK_S32 tmvp_enable; 1052*4882a593Smuzhiyun RK_S32 amp_enable; 1053*4882a593Smuzhiyun RK_S32 wpp_enable; 1054*4882a593Smuzhiyun RK_S32 merge_range; 1055*4882a593Smuzhiyun RK_S32 sao_enable; 1056*4882a593Smuzhiyun RK_U32 num_ref; 1057*4882a593Smuzhiyun 1058*4882a593Smuzhiyun /* quality config */ 1059*4882a593Smuzhiyun RK_S32 max_qp; 1060*4882a593Smuzhiyun RK_S32 min_qp; 1061*4882a593Smuzhiyun RK_S32 max_i_qp; 1062*4882a593Smuzhiyun RK_S32 min_i_qp; 1063*4882a593Smuzhiyun RK_S32 ip_qp_delta; 1064*4882a593Smuzhiyun RK_S32 max_delta_qp; 1065*4882a593Smuzhiyun RK_S32 intra_qp; 1066*4882a593Smuzhiyun RK_S32 gop_delta_qp; 1067*4882a593Smuzhiyun RK_S32 qp_init; 1068*4882a593Smuzhiyun RK_S32 qp_max_step; 1069*4882a593Smuzhiyun RK_S32 raw_dealt_qp; 1070*4882a593Smuzhiyun RK_U8 qpmax_map[8]; 1071*4882a593Smuzhiyun RK_U8 qpmin_map[8]; 1072*4882a593Smuzhiyun RK_S32 qpmap_mode; 1073*4882a593Smuzhiyun 1074*4882a593Smuzhiyun /* intra fresh config */ 1075*4882a593Smuzhiyun RK_S32 intra_refresh_mode; 1076*4882a593Smuzhiyun RK_S32 intra_refresh_arg; 1077*4882a593Smuzhiyun 1078*4882a593Smuzhiyun /* slice mode config */ 1079*4882a593Smuzhiyun RK_S32 independ_slice_mode; 1080*4882a593Smuzhiyun RK_S32 independ_slice_arg; 1081*4882a593Smuzhiyun RK_S32 depend_slice_mode; 1082*4882a593Smuzhiyun RK_S32 depend_slice_arg; 1083*4882a593Smuzhiyun 1084*4882a593Smuzhiyun MppEncH265CuCfg cu_cfg; 1085*4882a593Smuzhiyun MppEncH265SliceCfg slice_cfg; 1086*4882a593Smuzhiyun MppEncH265EntropyCfg entropy_cfg; 1087*4882a593Smuzhiyun MppEncH265TransCfg trans_cfg; 1088*4882a593Smuzhiyun MppEncH265SaoCfg sao_cfg; 1089*4882a593Smuzhiyun MppEncH265DblkCfg_t dblk_cfg; 1090*4882a593Smuzhiyun MppEncH265RefCfg ref_cfg; 1091*4882a593Smuzhiyun MppEncH265MergesCfg merge_cfg; 1092*4882a593Smuzhiyun RK_S32 auto_tile; 1093*4882a593Smuzhiyun RK_U32 lpf_acs_sli_en; 1094*4882a593Smuzhiyun RK_U32 lpf_acs_tile_disable; 1095*4882a593Smuzhiyun 1096*4882a593Smuzhiyun /* extra info */ 1097*4882a593Smuzhiyun MppEncH265VuiCfg vui; 1098*4882a593Smuzhiyun 1099*4882a593Smuzhiyun MppEncH265CtuCfg ctu; 1100*4882a593Smuzhiyun MppEncH265RoiCfg roi; 1101*4882a593Smuzhiyun } MppEncH265Cfg; 1102*4882a593Smuzhiyun 1103*4882a593Smuzhiyun /* 1104*4882a593Smuzhiyun * motion jpeg configurable parameter 1105*4882a593Smuzhiyun */ 1106*4882a593Smuzhiyun typedef enum MppEncJpegCfgChange_e { 1107*4882a593Smuzhiyun /* change on quant parameter */ 1108*4882a593Smuzhiyun MPP_ENC_JPEG_CFG_CHANGE_QP = (1 << 0), 1109*4882a593Smuzhiyun MPP_ENC_JPEG_CFG_CHANGE_QTABLE = (1 << 1), 1110*4882a593Smuzhiyun MPP_ENC_JPEG_CFG_CHANGE_QFACTOR = (1 << 2), 1111*4882a593Smuzhiyun MPP_ENC_JPEG_CFG_CHANGE_ALL = (0xFFFFFFFF), 1112*4882a593Smuzhiyun } MppEncJpegCfgChange; 1113*4882a593Smuzhiyun 1114*4882a593Smuzhiyun typedef struct MppEncJpegCfg_t { 1115*4882a593Smuzhiyun RK_U32 change; 1116*4882a593Smuzhiyun RK_S32 quant; 1117*4882a593Smuzhiyun /* 1118*4882a593Smuzhiyun * quality factor config 1119*4882a593Smuzhiyun * 1120*4882a593Smuzhiyun * q_factor - 1 ~ 99 1121*4882a593Smuzhiyun * qf_max - 1 ~ 99 1122*4882a593Smuzhiyun * qf_min - 1 ~ 99 1123*4882a593Smuzhiyun * qtable_y: qtable for luma 1124*4882a593Smuzhiyun * qtable_u: qtable for chroma 1125*4882a593Smuzhiyun * qtable_v: default equal qtable_u 1126*4882a593Smuzhiyun */ 1127*4882a593Smuzhiyun RK_S32 q_factor; 1128*4882a593Smuzhiyun RK_S32 qf_max; 1129*4882a593Smuzhiyun RK_S32 qf_min; 1130*4882a593Smuzhiyun RK_U8 *qtable_y; 1131*4882a593Smuzhiyun RK_U8 *qtable_u; 1132*4882a593Smuzhiyun RK_U8 *qtable_v; 1133*4882a593Smuzhiyun } MppEncJpegCfg; 1134*4882a593Smuzhiyun 1135*4882a593Smuzhiyun /* 1136*4882a593Smuzhiyun * vp8 configurable parameter 1137*4882a593Smuzhiyun */ 1138*4882a593Smuzhiyun typedef enum MppEncVP8CfgChange_e { 1139*4882a593Smuzhiyun MPP_ENC_VP8_CFG_CHANGE_QP = (1 << 0), 1140*4882a593Smuzhiyun MPP_ENC_VP8_CFG_CHANGE_DIS_IVF = (1 << 1), 1141*4882a593Smuzhiyun MPP_ENC_VP8_CFG_CHANGE_ALL = (0xFFFFFFFF), 1142*4882a593Smuzhiyun } MppEncVP8CfgChange; 1143*4882a593Smuzhiyun 1144*4882a593Smuzhiyun typedef struct MppEncVp8Cfg_t { 1145*4882a593Smuzhiyun RK_U32 change; 1146*4882a593Smuzhiyun RK_S32 quant; 1147*4882a593Smuzhiyun 1148*4882a593Smuzhiyun RK_S32 qp_init; 1149*4882a593Smuzhiyun RK_S32 qp_max; 1150*4882a593Smuzhiyun RK_S32 qp_max_i; 1151*4882a593Smuzhiyun RK_S32 qp_min; 1152*4882a593Smuzhiyun RK_S32 qp_min_i; 1153*4882a593Smuzhiyun RK_S32 qp_max_step; 1154*4882a593Smuzhiyun RK_S32 disable_ivf; 1155*4882a593Smuzhiyun } MppEncVp8Cfg; 1156*4882a593Smuzhiyun 1157*4882a593Smuzhiyun /** 1158*4882a593Smuzhiyun * @ingroup rk_mpi 1159*4882a593Smuzhiyun * @brief MPP encoder codec configuration parameters 1160*4882a593Smuzhiyun * @details The encoder codec configuration parameters are different for each 1161*4882a593Smuzhiyun * compression codings. For example, H.264 encoder can configure 1162*4882a593Smuzhiyun * profile, level, qp, etc. while jpeg encoder can configure qp 1163*4882a593Smuzhiyun * only. The detailed parameters can refer the corresponding data 1164*4882a593Smuzhiyun * structure such as MppEncH264Cfg and MppEncJpegCfg. This data 1165*4882a593Smuzhiyun * structure is associated with MPP_ENC_SET_CODEC_CFG command. 1166*4882a593Smuzhiyun */ 1167*4882a593Smuzhiyun typedef struct MppEncCodecCfg_t { 1168*4882a593Smuzhiyun MppCodingType coding; 1169*4882a593Smuzhiyun 1170*4882a593Smuzhiyun union { 1171*4882a593Smuzhiyun RK_U32 change; 1172*4882a593Smuzhiyun MppEncH264Cfg h264; 1173*4882a593Smuzhiyun MppEncH265Cfg h265; 1174*4882a593Smuzhiyun MppEncJpegCfg jpeg; 1175*4882a593Smuzhiyun MppEncVp8Cfg vp8; 1176*4882a593Smuzhiyun }; 1177*4882a593Smuzhiyun } MppEncCodecCfg; 1178*4882a593Smuzhiyun 1179*4882a593Smuzhiyun typedef enum MppEncSliceSplit_e { 1180*4882a593Smuzhiyun /* change on quant parameter */ 1181*4882a593Smuzhiyun MPP_ENC_SPLIT_CFG_CHANGE_MODE = (1 << 0), 1182*4882a593Smuzhiyun MPP_ENC_SPLIT_CFG_CHANGE_ARG = (1 << 1), 1183*4882a593Smuzhiyun MPP_ENC_SPLIT_CFG_CHANGE_OUTPUT = (1 << 2), 1184*4882a593Smuzhiyun MPP_ENC_SPLIT_CFG_CHANGE_ALL = (0xFFFFFFFF), 1185*4882a593Smuzhiyun } MppEncSliceSplitChange; 1186*4882a593Smuzhiyun 1187*4882a593Smuzhiyun typedef enum MppEncSplitMode_e { 1188*4882a593Smuzhiyun MPP_ENC_SPLIT_NONE, 1189*4882a593Smuzhiyun MPP_ENC_SPLIT_BY_BYTE, 1190*4882a593Smuzhiyun MPP_ENC_SPLIT_BY_CTU, 1191*4882a593Smuzhiyun } MppEncSplitMode; 1192*4882a593Smuzhiyun 1193*4882a593Smuzhiyun typedef enum MppEncSplitOutMode_e { 1194*4882a593Smuzhiyun MPP_ENC_SPLIT_OUT_LOWDELAY = (1 << 0), 1195*4882a593Smuzhiyun MPP_ENC_SPLIT_OUT_SEGMENT = (1 << 1), 1196*4882a593Smuzhiyun } MppEncSplitOutMode; 1197*4882a593Smuzhiyun 1198*4882a593Smuzhiyun typedef struct MppEncSliceSplit_t { 1199*4882a593Smuzhiyun RK_U32 change; 1200*4882a593Smuzhiyun 1201*4882a593Smuzhiyun /* 1202*4882a593Smuzhiyun * slice split mode 1203*4882a593Smuzhiyun * 1204*4882a593Smuzhiyun * MPP_ENC_SPLIT_NONE - No slice is split 1205*4882a593Smuzhiyun * MPP_ENC_SPLIT_BY_BYTE - Slice is split by byte number 1206*4882a593Smuzhiyun * MPP_ENC_SPLIT_BY_CTU - Slice is split by macroblock / ctu number 1207*4882a593Smuzhiyun */ 1208*4882a593Smuzhiyun RK_U32 split_mode; 1209*4882a593Smuzhiyun 1210*4882a593Smuzhiyun /* 1211*4882a593Smuzhiyun * slice split size parameter 1212*4882a593Smuzhiyun * 1213*4882a593Smuzhiyun * When split by byte number this value is the max byte number for each 1214*4882a593Smuzhiyun * slice. 1215*4882a593Smuzhiyun * When split by macroblock / ctu number this value is the MB/CTU number 1216*4882a593Smuzhiyun * for each slice. 1217*4882a593Smuzhiyun */ 1218*4882a593Smuzhiyun RK_U32 split_arg; 1219*4882a593Smuzhiyun 1220*4882a593Smuzhiyun /* 1221*4882a593Smuzhiyun * slice split output mode 1222*4882a593Smuzhiyun * 1223*4882a593Smuzhiyun * MPP_ENC_SPLIT_OUT_LOWDELAY 1224*4882a593Smuzhiyun * - When enabled encoder will lowdelay output each slice in a single packet 1225*4882a593Smuzhiyun * MPP_ENC_SPLIT_OUT_SEGMENT 1226*4882a593Smuzhiyun * - When enabled encoder will packet with segment info for each slice 1227*4882a593Smuzhiyun */ 1228*4882a593Smuzhiyun RK_U32 split_out; 1229*4882a593Smuzhiyun } MppEncSliceSplit; 1230*4882a593Smuzhiyun 1231*4882a593Smuzhiyun /** 1232*4882a593Smuzhiyun * @brief Mpp ROI parameter 1233*4882a593Smuzhiyun * Region configure define a rectangle as ROI 1234*4882a593Smuzhiyun * @note x, y, w, h are calculated in pixels, which had better be 16-pixel aligned. 1235*4882a593Smuzhiyun * These parameters MUST retain in memory when encoder is running. 1236*4882a593Smuzhiyun * Both absolute qp and relative qp are supported in vepu541. 1237*4882a593Smuzhiyun * Only absolute qp is supported in rv1108 1238*4882a593Smuzhiyun */ 1239*4882a593Smuzhiyun typedef struct MppEncROIRegion_t { 1240*4882a593Smuzhiyun RK_U16 x; /**< horizontal position of top left corner */ 1241*4882a593Smuzhiyun RK_U16 y; /**< vertical position of top left corner */ 1242*4882a593Smuzhiyun RK_U16 w; /**< width of ROI rectangle */ 1243*4882a593Smuzhiyun RK_U16 h; /**< height of ROI rectangle */ 1244*4882a593Smuzhiyun RK_U16 intra; /**< flag of forced intra macroblock */ 1245*4882a593Smuzhiyun RK_S16 quality; /**< absolute / relative qp of macroblock */ 1246*4882a593Smuzhiyun RK_U16 qp_area_idx; /**< qp min max area select*/ 1247*4882a593Smuzhiyun RK_U8 area_map_en; /**< enable area map */ 1248*4882a593Smuzhiyun RK_U8 abs_qp_en; /**< absolute qp enable flag*/ 1249*4882a593Smuzhiyun } MppEncROIRegion; 1250*4882a593Smuzhiyun 1251*4882a593Smuzhiyun /** 1252*4882a593Smuzhiyun * @brief MPP encoder's ROI configuration 1253*4882a593Smuzhiyun */ 1254*4882a593Smuzhiyun typedef struct MppEncROICfg_t { 1255*4882a593Smuzhiyun RK_U32 number; /**< ROI rectangle number */ 1256*4882a593Smuzhiyun MppEncROIRegion *regions; /**< ROI parameters */ 1257*4882a593Smuzhiyun } MppEncROICfg; 1258*4882a593Smuzhiyun 1259*4882a593Smuzhiyun /** 1260*4882a593Smuzhiyun * @brief Mpp ROI parameter for vepu54x / vepu58x 1261*4882a593Smuzhiyun * @note These encoders have more complex roi configure structure. 1262*4882a593Smuzhiyun * User need to generate roi structure data for different soc. 1263*4882a593Smuzhiyun * And send buffers to encoder through metadata. 1264*4882a593Smuzhiyun */ 1265*4882a593Smuzhiyun typedef struct MppEncROICfg2_t { 1266*4882a593Smuzhiyun MppBuffer base_cfg_buf; 1267*4882a593Smuzhiyun MppBuffer qp_cfg_buf; 1268*4882a593Smuzhiyun MppBuffer amv_cfg_buf; 1269*4882a593Smuzhiyun MppBuffer mv_cfg_buf; 1270*4882a593Smuzhiyun 1271*4882a593Smuzhiyun RK_U32 roi_qp_en : 1; 1272*4882a593Smuzhiyun RK_U32 roi_amv_en : 1; 1273*4882a593Smuzhiyun RK_U32 roi_mv_en : 1; 1274*4882a593Smuzhiyun RK_U32 reserve_bits : 29; 1275*4882a593Smuzhiyun RK_U32 reserve[3]; 1276*4882a593Smuzhiyun } MppEncROICfg2; 1277*4882a593Smuzhiyun 1278*4882a593Smuzhiyun /* 1279*4882a593Smuzhiyun * Mpp OSD parameter 1280*4882a593Smuzhiyun * 1281*4882a593Smuzhiyun * Mpp OSD support total 8 regions 1282*4882a593Smuzhiyun * Mpp OSD support 256-color palette two mode palette: 1283*4882a593Smuzhiyun * 1. Configurable OSD palette 1284*4882a593Smuzhiyun * When palette is set. 1285*4882a593Smuzhiyun * 2. fixed OSD palette 1286*4882a593Smuzhiyun * When palette is NULL. 1287*4882a593Smuzhiyun * 1288*4882a593Smuzhiyun * if MppEncOSDPlt.buf != NULL , palette includes maximun 256 levels, 1289*4882a593Smuzhiyun * every level composed of 32 bits defined below: 1290*4882a593Smuzhiyun * Y : 8 bits 1291*4882a593Smuzhiyun * U : 8 bits 1292*4882a593Smuzhiyun * V : 8 bits 1293*4882a593Smuzhiyun * alpha : 8 bits 1294*4882a593Smuzhiyun */ 1295*4882a593Smuzhiyun #define MPP_ENC_OSD_PLT_WHITE ((255<<24)|(128<<16)|(128<<8)|235) 1296*4882a593Smuzhiyun #define MPP_ENC_OSD_PLT_YELLOW ((255<<24)|(146<<16)|( 16<<8)|210) 1297*4882a593Smuzhiyun #define MPP_ENC_OSD_PLT_CYAN ((255<<24)|( 16<<16)|(166<<8)|170) 1298*4882a593Smuzhiyun #define MPP_ENC_OSD_PLT_GREEN ((255<<24)|( 34<<16)|( 54<<8)|145) 1299*4882a593Smuzhiyun #define MPP_ENC_OSD_PLT_TRANS (( 0<<24)|(222<<16)|(202<<8)|106) 1300*4882a593Smuzhiyun #define MPP_ENC_OSD_PLT_RED ((255<<24)|(240<<16)|( 90<<8)| 81) 1301*4882a593Smuzhiyun #define MPP_ENC_OSD_PLT_BLUE ((255<<24)|(110<<16)|(240<<8)| 41) 1302*4882a593Smuzhiyun #define MPP_ENC_OSD_PLT_BLACK ((255<<24)|(128<<16)|(128<<8)| 16) 1303*4882a593Smuzhiyun 1304*4882a593Smuzhiyun typedef enum MppEncOSDPltType_e { 1305*4882a593Smuzhiyun MPP_ENC_OSD_PLT_TYPE_DEFAULT, 1306*4882a593Smuzhiyun MPP_ENC_OSD_PLT_TYPE_USERDEF, 1307*4882a593Smuzhiyun MPP_ENC_OSD_PLT_TYPE_BUTT, 1308*4882a593Smuzhiyun } MppEncOSDPltType; 1309*4882a593Smuzhiyun 1310*4882a593Smuzhiyun /* OSD palette value define */ 1311*4882a593Smuzhiyun typedef union MppEncOSDPltVal_u { 1312*4882a593Smuzhiyun struct { 1313*4882a593Smuzhiyun RK_U32 v : 8; 1314*4882a593Smuzhiyun RK_U32 u : 8; 1315*4882a593Smuzhiyun RK_U32 y : 8; 1316*4882a593Smuzhiyun RK_U32 alpha : 8; 1317*4882a593Smuzhiyun }; 1318*4882a593Smuzhiyun RK_U32 val; 1319*4882a593Smuzhiyun } MppEncOSDPltVal; 1320*4882a593Smuzhiyun 1321*4882a593Smuzhiyun typedef struct MppEncOSDPlt_t { 1322*4882a593Smuzhiyun MppEncOSDPltVal data[256]; 1323*4882a593Smuzhiyun } MppEncOSDPlt; 1324*4882a593Smuzhiyun 1325*4882a593Smuzhiyun typedef enum MppEncOSDPltCfgChange_e { 1326*4882a593Smuzhiyun MPP_ENC_OSD_PLT_CFG_CHANGE_MODE = (1 << 0), /* change osd plt type */ 1327*4882a593Smuzhiyun MPP_ENC_OSD_PLT_CFG_CHANGE_PLT_VAL = (1 << 1), /* change osd plt table value */ 1328*4882a593Smuzhiyun MPP_ENC_OSD_PLT_CFG_CHANGE_ALL = (0xFFFFFFFF), 1329*4882a593Smuzhiyun } MppEncOSDPltCfgChange; 1330*4882a593Smuzhiyun 1331*4882a593Smuzhiyun typedef struct MppEncOSDPltCfg_t { 1332*4882a593Smuzhiyun RK_U32 change; 1333*4882a593Smuzhiyun MppEncOSDPltType type; 1334*4882a593Smuzhiyun MppEncOSDPlt *plt; 1335*4882a593Smuzhiyun } MppEncOSDPltCfg; 1336*4882a593Smuzhiyun 1337*4882a593Smuzhiyun /* position info is unit in 16 pixels(one MB), and 1338*4882a593Smuzhiyun * x-directon range in pixels = (rd_pos_x - lt_pos_x + 1) * 16; 1339*4882a593Smuzhiyun * y-directon range in pixels = (rd_pos_y - lt_pos_y + 1) * 16; 1340*4882a593Smuzhiyun */ 1341*4882a593Smuzhiyun typedef struct MppEncOSDRegion_t { 1342*4882a593Smuzhiyun RK_U32 enable; 1343*4882a593Smuzhiyun RK_U32 inverse; 1344*4882a593Smuzhiyun RK_U32 start_mb_x; 1345*4882a593Smuzhiyun RK_U32 start_mb_y; 1346*4882a593Smuzhiyun RK_U32 num_mb_x; 1347*4882a593Smuzhiyun RK_U32 num_mb_y; 1348*4882a593Smuzhiyun RK_U32 buf_offset; 1349*4882a593Smuzhiyun } MppEncOSDRegion; 1350*4882a593Smuzhiyun 1351*4882a593Smuzhiyun /* if num_region > 0 && region==NULL 1352*4882a593Smuzhiyun * use old osd data 1353*4882a593Smuzhiyun */ 1354*4882a593Smuzhiyun typedef struct MppEncOSDData_t { 1355*4882a593Smuzhiyun MppBuffer buf; 1356*4882a593Smuzhiyun RK_U32 num_region; 1357*4882a593Smuzhiyun MppEncOSDRegion region[8]; 1358*4882a593Smuzhiyun } MppEncOSDData; 1359*4882a593Smuzhiyun 1360*4882a593Smuzhiyun typedef struct MppEncOSDRegion2_t { 1361*4882a593Smuzhiyun RK_U32 enable; 1362*4882a593Smuzhiyun RK_U32 inverse; 1363*4882a593Smuzhiyun RK_U32 start_mb_x; 1364*4882a593Smuzhiyun RK_U32 start_mb_y; 1365*4882a593Smuzhiyun RK_U32 num_mb_x; 1366*4882a593Smuzhiyun RK_U32 num_mb_y; 1367*4882a593Smuzhiyun RK_U32 buf_offset; 1368*4882a593Smuzhiyun MppBuffer buf; 1369*4882a593Smuzhiyun } MppEncOSDRegion2; 1370*4882a593Smuzhiyun 1371*4882a593Smuzhiyun typedef struct MppEncOSDData2_t { 1372*4882a593Smuzhiyun RK_U32 num_region; 1373*4882a593Smuzhiyun MppEncOSDRegion2 region[8]; 1374*4882a593Smuzhiyun } MppEncOSDData2; 1375*4882a593Smuzhiyun 1376*4882a593Smuzhiyun typedef struct MppEncUserData_t { 1377*4882a593Smuzhiyun RK_U32 len; 1378*4882a593Smuzhiyun void *pdata; 1379*4882a593Smuzhiyun } MppEncUserData; 1380*4882a593Smuzhiyun 1381*4882a593Smuzhiyun typedef struct MppEncUserDataFull_t { 1382*4882a593Smuzhiyun RK_U32 len; 1383*4882a593Smuzhiyun RK_U8 *uuid; 1384*4882a593Smuzhiyun void *pdata; 1385*4882a593Smuzhiyun } MppEncUserDataFull; 1386*4882a593Smuzhiyun 1387*4882a593Smuzhiyun typedef struct MppEncUserDataSet_t { 1388*4882a593Smuzhiyun RK_U32 count; 1389*4882a593Smuzhiyun MppEncUserDataFull *datas; 1390*4882a593Smuzhiyun } MppEncUserDataSet; 1391*4882a593Smuzhiyun 1392*4882a593Smuzhiyun typedef enum MppEncSceneMode_e { 1393*4882a593Smuzhiyun MPP_ENC_SCENE_MODE_DEFAULT, 1394*4882a593Smuzhiyun MPP_ENC_SCENE_MODE_IPC, 1395*4882a593Smuzhiyun MPP_ENC_SCENE_MODE_BUTT, 1396*4882a593Smuzhiyun } MppEncSceneMode; 1397*4882a593Smuzhiyun 1398*4882a593Smuzhiyun typedef enum MppEncFineTuneCfgChange_e { 1399*4882a593Smuzhiyun /* change on scene mode */ 1400*4882a593Smuzhiyun MPP_ENC_TUNE_CFG_CHANGE_SCENE_MODE = (1 << 0), 1401*4882a593Smuzhiyun } MppEncFineTuneCfgChange; 1402*4882a593Smuzhiyun 1403*4882a593Smuzhiyun typedef struct MppEncFineTuneCfg_t { 1404*4882a593Smuzhiyun RK_U32 change; 1405*4882a593Smuzhiyun 1406*4882a593Smuzhiyun MppEncSceneMode scene_mode; 1407*4882a593Smuzhiyun } MppEncFineTuneCfg; 1408*4882a593Smuzhiyun 1409*4882a593Smuzhiyun #endif /*__RK_VENC_CMD_H__*/ 1410