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