/* 
 | 
 * Copyright 2015 Rockchip Electronics Co. LTD 
 | 
 * 
 | 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 | 
 * you may not use this file except in compliance with the License. 
 | 
 * You may obtain a copy of the License at 
 | 
 * 
 | 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 | 
 * 
 | 
 * Unless required by applicable law or agreed to in writing, software 
 | 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 | 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 | 
 * See the License for the specific language governing permissions and 
 | 
 * limitations under the License. 
 | 
 */ 
 | 
  
 | 
#ifndef __RK_VENC_CMD_H__ 
 | 
#define __RK_VENC_CMD_H__ 
 | 
  
 | 
#include "mpp_frame.h" 
 | 
#include "rk_venc_rc.h" 
 | 
  
 | 
/* 
 | 
 * Configure of encoder is very complicated. So we divide configures into 
 | 
 * four parts: 
 | 
 * 
 | 
 * 1. Rate control parameter 
 | 
 *    This is quality and bitrate request from user. 
 | 
 * 
 | 
 * 2. Data source MppFrame parameter 
 | 
 *    This is data source buffer information. 
 | 
 *    Now it is PreP config 
 | 
 *    PreP  : Encoder Preprocess configuration 
 | 
 * 
 | 
 * 3. Video codec infomation 
 | 
 *    This is user custormized stream information. 
 | 
 *    including: 
 | 
 *    H.264 / H.265 / vp8 / mjpeg 
 | 
 * 
 | 
 * 4. Misc parameter 
 | 
 *    including: 
 | 
 *    Split : Slice split configuration 
 | 
 *    GopRef: Reference gop configuration 
 | 
 *    ROI   : Region Of Interest 
 | 
 *    OSD   : On Screen Display 
 | 
 *    MD    : Motion Detection 
 | 
 * 
 | 
 * The module transcation flow is as follows: 
 | 
 * 
 | 
 *                 +                      + 
 | 
 *     User        |      Mpi/Mpp         |          EncImpl 
 | 
 *                 |                      |            Hal 
 | 
 *                 |                      | 
 | 
 * +----------+    |    +---------+       |       +-----------+ 
 | 
 * |          |    |    |         +-----RcCfg----->           | 
 | 
 * |  RcCfg   +--------->         |       |       |  EncImpl  | 
 | 
 * |          |    |    |         |   +-Frame----->           | 
 | 
 * +----------+    |    |         |   |   |       +--+-----^--+ 
 | 
 *                 |    |         |   |   |          |     | 
 | 
 *                 |    |         |   |   |          |     | 
 | 
 * +----------+    |    |         |   |   |       syntax   | 
 | 
 * |          |    |    |         |   |   |          |     | 
 | 
 * | MppFrame +--------->  MppEnc +---+   |          |   result 
 | 
 * |          |    |    |         |   |   |          |     | 
 | 
 * +----------+    |    |         |   |   |          |     | 
 | 
 *                 |    |         |   |   |       +--v-----+--+ 
 | 
 *                 |    |         |   +-Frame----->           | 
 | 
 * +----------+    |    |         |       |       |           | 
 | 
 * |          |    |    |         +---CodecCfg---->    Hal    | 
 | 
 * | CodecCfg +--------->         |       |       |           | 
 | 
 * |          |    |    |         <-----Extra----->           | 
 | 
 * +----------+    |    +---------+       |       +-----------+ 
 | 
 *                 |                      | 
 | 
 *                 |                      | 
 | 
 *                 +                      + 
 | 
 * 
 | 
 * The function call flow is shown below: 
 | 
 * 
 | 
 *  mpi                      mpp_enc         controller                  hal 
 | 
 *   +                          +                 +                       + 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   +----------init------------>                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   |         PrepCfg          |                 |                       | 
 | 
 *   +---------control---------->     PrepCfg     |                       | 
 | 
 *   |                          +-----control----->                       | 
 | 
 *   |                          |                 |        PrepCfg        | 
 | 
 *   |                          +--------------------------control--------> 
 | 
 *   |                          |                 |                    allocate 
 | 
 *   |                          |                 |                     buffer 
 | 
 *   |                          |                 |                       | 
 | 
 *   |          RcCfg           |                 |                       | 
 | 
 *   +---------control---------->      RcCfg      |                       | 
 | 
 *   |                          +-----control----->                       | 
 | 
 *   |                          |              rc_init                    | 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   |         CodecCfg         |                 |                       | 
 | 
 *   +---------control---------->                 |        CodecCfg       | 
 | 
 *   |                          +--------------------------control--------> 
 | 
 *   |                          |                 |                    generate 
 | 
 *   |                          |                 |                    sps/pps 
 | 
 *   |                          |                 |     Get extra info    | 
 | 
 *   |                          +--------------------------control--------> 
 | 
 *   |      Get extra info      |                 |                       | 
 | 
 *   +---------control---------->                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   |         ROICfg           |                 |                       | 
 | 
 *   +---------control---------->                 |        ROICfg         | 
 | 
 *   |                          +--------------------------control--------> 
 | 
 *   |                          |                 |                       | 
 | 
 *   |         OSDCfg           |                 |                       | 
 | 
 *   +---------control---------->                 |        OSDCfg         | 
 | 
 *   |                          +--------------------------control--------> 
 | 
 *   |                          |                 |                       | 
 | 
 *   |          MDCfg           |                 |                       | 
 | 
 *   +---------control---------->                 |         MDCfg         | 
 | 
 *   |                          +--------------------------control--------> 
 | 
 *   |                          |                 |                       | 
 | 
 *   |      Set extra info      |                 |                       | 
 | 
 *   +---------control---------->                 |     Set extra info    | 
 | 
 *   |                          +--------------------------control--------> 
 | 
 *   |                          |                 |                       | 
 | 
 *   |           task           |                 |                       | 
 | 
 *   +----------encode---------->      task       |                       | 
 | 
 *   |                          +-----encode------>                       | 
 | 
 *   |                          |              encode                     | 
 | 
 *   |                          |                 |        syntax         | 
 | 
 *   |                          +--------------------------gen_reg--------> 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          +---------------------------start---------> 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          +---------------------------wait----------> 
 | 
 *   |                          |                 |                       | 
 | 
 *   |                          |    callback     |                       | 
 | 
 *   |                          +----------------->                       | 
 | 
 *   +--OSD-MD--encode---------->                 |                       | 
 | 
 *   |             .            |                 |                       | 
 | 
 *   |             .            |                 |                       | 
 | 
 *   |             .            |                 |                       | 
 | 
 *   +--OSD-MD--encode---------->                 |                       | 
 | 
 *   |                          |                 |                       | 
 | 
 *   +----------deinit---------->                 |                       | 
 | 
 *   +                          +                 +                       + 
 | 
 */ 
 | 
  
 | 
/* 
 | 
 * encoder query interface is only for debug usage 
 | 
 */ 
 | 
#define MPP_ENC_QUERY_STATUS        (0x00000001) 
 | 
#define MPP_ENC_QUERY_WAIT          (0x00000002) 
 | 
#define MPP_ENC_QUERY_FPS           (0x00000004) 
 | 
#define MPP_ENC_QUERY_BPS           (0x00000008) 
 | 
#define MPP_ENC_QUERY_ENC_IN_FRM    (0x00000010) 
 | 
#define MPP_ENC_QUERY_ENC_WORK      (0x00000020) 
 | 
#define MPP_ENC_QUERY_ENC_OUT_PKT   (0x00000040) 
 | 
  
 | 
#define MPP_ENC_QUERY_ALL           (MPP_ENC_QUERY_STATUS       | \ 
 | 
                                     MPP_ENC_QUERY_WAIT         | \ 
 | 
                                     MPP_ENC_QUERY_FPS          | \ 
 | 
                                     MPP_ENC_QUERY_BPS          | \ 
 | 
                                     MPP_ENC_QUERY_ENC_IN_FRM   | \ 
 | 
                                     MPP_ENC_QUERY_ENC_WORK     | \ 
 | 
                                     MPP_ENC_QUERY_ENC_OUT_PKT) 
 | 
  
 | 
typedef struct MppEncQueryCfg_t { 
 | 
    /* 
 | 
     * 32 bit query flag for query data check 
 | 
     * Each bit represent a query data switch. 
 | 
     * bit 0 - for querying encoder runtime status 
 | 
     * bit 1 - for querying encoder runtime waiting status 
 | 
     * bit 2 - for querying encoder realtime encode fps 
 | 
     * bit 3 - for querying encoder realtime output bps 
 | 
     * bit 4 - for querying encoder input frame count 
 | 
     * bit 5 - for querying encoder start hardware times 
 | 
     * bit 6 - for querying encoder output packet count 
 | 
     */ 
 | 
    RK_U32      query_flag; 
 | 
  
 | 
    /* 64 bit query data output */ 
 | 
    RK_U32      rt_status; 
 | 
    RK_U32      rt_wait; 
 | 
    RK_U32      rt_fps; 
 | 
    RK_U32      rt_bps; 
 | 
    RK_U32      enc_in_frm_cnt; 
 | 
    RK_U32      enc_hw_run_cnt; 
 | 
    RK_U32      enc_out_pkt_cnt; 
 | 
} MppEncQueryCfg; 
 | 
  
 | 
/* 
 | 
 * base working mode parameter 
 | 
 */ 
 | 
typedef enum MppEncBaseCfgChange_e { 
 | 
    MPP_ENC_BASE_CFG_CHANGE_LOW_DELAY   = (1 << 0), 
 | 
    MPP_ENC_BASE_CFG_CHANGE_ALL         = (0xFFFFFFFF), 
 | 
} MppEncBaseCfgChange; 
 | 
  
 | 
typedef struct MppEncBaseCfg_t { 
 | 
    RK_U32  change; 
 | 
  
 | 
    RK_S32  low_delay; 
 | 
} MppEncBaseCfg; 
 | 
  
 | 
/* 
 | 
 * Rate control parameter 
 | 
 */ 
 | 
typedef enum MppEncRcCfgChange_e { 
 | 
    MPP_ENC_RC_CFG_CHANGE_RC_MODE       = (1 << 0), 
 | 
    MPP_ENC_RC_CFG_CHANGE_QUALITY       = (1 << 1), 
 | 
    MPP_ENC_RC_CFG_CHANGE_BPS           = (1 << 2),     /* change on bps target / max / min */ 
 | 
    MPP_ENC_RC_CFG_CHANGE_FPS_IN        = (1 << 5),     /* change on fps in  flex / numerator / denorminator */ 
 | 
    MPP_ENC_RC_CFG_CHANGE_FPS_OUT       = (1 << 6),     /* change on fps out flex / numerator / denorminator */ 
 | 
    MPP_ENC_RC_CFG_CHANGE_GOP           = (1 << 7), 
 | 
    MPP_ENC_RC_CFG_CHANGE_SKIP_CNT      = (1 << 8), 
 | 
    MPP_ENC_RC_CFG_CHANGE_MAX_REENC     = (1 << 9), 
 | 
    MPP_ENC_RC_CFG_CHANGE_DROP_FRM      = (1 << 10), 
 | 
    MPP_ENC_RC_CFG_CHANGE_MAX_I_PROP    = (1 << 11), 
 | 
    MPP_ENC_RC_CFG_CHANGE_MIN_I_PROP    = (1 << 12), 
 | 
    MPP_ENC_RC_CFG_CHANGE_INIT_IP_RATIO = (1 << 13), 
 | 
    MPP_ENC_RC_CFG_CHANGE_PRIORITY      = (1 << 14), 
 | 
    MPP_ENC_RC_CFG_CHANGE_SUPER_FRM     = (1 << 15), 
 | 
    /* qp related change flag */ 
 | 
    MPP_ENC_RC_CFG_CHANGE_QP_INIT       = (1 << 16), 
 | 
    MPP_ENC_RC_CFG_CHANGE_QP_RANGE      = (1 << 17), 
 | 
    MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I    = (1 << 18), 
 | 
    MPP_ENC_RC_CFG_CHANGE_QP_MAX_STEP   = (1 << 19), 
 | 
    MPP_ENC_RC_CFG_CHANGE_QP_IP         = (1 << 20), 
 | 
    MPP_ENC_RC_CFG_CHANGE_QP_VI         = (1 << 21), 
 | 
    MPP_ENC_RC_CFG_CHANGE_QP_ROW        = (1 << 22), 
 | 
    MPP_ENC_RC_CFG_CHANGE_QP_ROW_I      = (1 << 23), 
 | 
    MPP_ENC_RC_CFG_CHANGE_DEBREATH      = (1 << 24), 
 | 
    MPP_ENC_RC_CFG_CHANGE_HIER_QP       = (1 << 25), 
 | 
    MPP_ENC_RC_CFG_CHANGE_ST_TIME       = (1 << 26), 
 | 
    MPP_ENC_RC_CFG_CHANGE_ALL           = (0xFFFFFFFF), 
 | 
} MppEncRcCfgChange; 
 | 
  
 | 
typedef enum MppEncRcQuality_e { 
 | 
    MPP_ENC_RC_QUALITY_WORST, 
 | 
    MPP_ENC_RC_QUALITY_WORSE, 
 | 
    MPP_ENC_RC_QUALITY_MEDIUM, 
 | 
    MPP_ENC_RC_QUALITY_BETTER, 
 | 
    MPP_ENC_RC_QUALITY_BEST, 
 | 
    MPP_ENC_RC_QUALITY_CQP, 
 | 
    MPP_ENC_RC_QUALITY_AQ_ONLY, 
 | 
    MPP_ENC_RC_QUALITY_BUTT 
 | 
} MppEncRcQuality; 
 | 
  
 | 
typedef struct MppEncRcCfg_t { 
 | 
    RK_U32  change; 
 | 
  
 | 
    /* 
 | 
     * rc_mode - rate control mode 
 | 
     * 
 | 
     * mpp provide two rate control mode: 
 | 
     * 
 | 
     * Constant Bit Rate (CBR) mode 
 | 
     * - paramter 'bps*' define target bps 
 | 
     * - paramter quality and qp will not take effect 
 | 
     * 
 | 
     * Variable Bit Rate (VBR) mode 
 | 
     * - paramter 'quality' define 5 quality levels 
 | 
     * - paramter 'bps*' is used as reference but not strict condition 
 | 
     * - special Constant QP (CQP) mode is under VBR mode 
 | 
     *   CQP mode will work with qp in CodecCfg. But only use for test 
 | 
     * 
 | 
     * default: CBR 
 | 
     */ 
 | 
    MppEncRcMode rc_mode; 
 | 
  
 | 
    /* 
 | 
     * quality - quality parameter, only takes effect in VBR mode 
 | 
     * 
 | 
     * Mpp does not give the direct parameter in different protocol. 
 | 
     * 
 | 
     * Mpp provide total 5 quality level: 
 | 
     * Worst - worse - Medium - better - best 
 | 
     * 
 | 
     * extra CQP level means special constant-qp (CQP) mode 
 | 
     * 
 | 
     * default value: Medium 
 | 
     */ 
 | 
    MppEncRcQuality quality; 
 | 
  
 | 
    /* 
 | 
     * bit rate parameters 
 | 
     * mpp gives three bit rate control parameter for control 
 | 
     * bps_target   - target  bit rate, unit: bit per second 
 | 
     * bps_max      - maximun bit rate, unit: bit per second 
 | 
     * bps_min      - minimun bit rate, unit: bit per second 
 | 
     * if user need constant bit rate set parameters to the similar value 
 | 
     * if user need variable bit rate set parameters as they need 
 | 
     */ 
 | 
    RK_S32  bps_target; 
 | 
    RK_S32  bps_max; 
 | 
    RK_S32  bps_min; 
 | 
  
 | 
    /* 
 | 
     * frame rate parameters have great effect on rate control 
 | 
     * 
 | 
     * fps_in_flex 
 | 
     * 0 - fix input frame rate 
 | 
     * 1 - variable input frame rate 
 | 
     * 
 | 
     * fps_in_num 
 | 
     * input frame rate numerator, if 0 then default 30 
 | 
     * 
 | 
     * fps_in_denorm 
 | 
     * input frame rate denorminator, if 0 then default 1 
 | 
     * 
 | 
     * fps_out_flex 
 | 
     * 0 - fix output frame rate 
 | 
     * 1 - variable output frame rate 
 | 
     * 
 | 
     * fps_out_num 
 | 
     * output frame rate numerator, if 0 then default 30 
 | 
     * 
 | 
     * fps_out_denorm 
 | 
     * output frame rate denorminator, if 0 then default 1 
 | 
     */ 
 | 
    RK_S32  fps_in_flex; 
 | 
    RK_S32  fps_in_num; 
 | 
    RK_S32  fps_in_denorm; 
 | 
    RK_S32  fps_out_flex; 
 | 
    RK_S32  fps_out_num; 
 | 
    RK_S32  fps_out_denorm; 
 | 
  
 | 
    /* 
 | 
     * gop - group of picture, gap between Intra frame 
 | 
     * 0 for only 1 I frame the rest are all P frames 
 | 
     * 1 for all I frame 
 | 
     * 2 for I P I P I P 
 | 
     * 3 for I P P I P P 
 | 
     * etc... 
 | 
     */ 
 | 
    RK_S32  gop; 
 | 
  
 | 
    /* 
 | 
     * skip_cnt - max continuous frame skip count 
 | 
     * 0 - frame skip is not allow 
 | 
     */ 
 | 
    RK_S32  skip_cnt; 
 | 
  
 | 
    /* 
 | 
     * max_reenc_times - max reencode time for one frame 
 | 
     * 0 - reencode is not allowed 
 | 
     * 1~3 max reencode time is limited to 3 
 | 
     */ 
 | 
    RK_U32  max_reenc_times; 
 | 
  
 | 
    /* 
 | 
     * stats_time   - the time of bitrate statistics 
 | 
     */ 
 | 
    RK_S32  stats_time; 
 | 
  
 | 
    /* 
 | 
     * drop frame parameters 
 | 
     * used on bitrate is far over the max bitrate 
 | 
     * 
 | 
     * drop_mode 
 | 
     * 
 | 
     * MPP_ENC_RC_DROP_FRM_DISABLED 
 | 
     * - do not drop frame when bitrate overflow. 
 | 
     * MPP_ENC_RC_DROP_FRM_NORMAL 
 | 
     * - do not encode the dropped frame when bitrate overflow. 
 | 
     * MPP_ENC_RC_DROP_FRM_PSKIP 
 | 
     * - encode a all skip frame when bitrate overflow. 
 | 
     * 
 | 
     * drop_threshold 
 | 
     * 
 | 
     * The percentage threshold over max_bitrate for trigger frame drop. 
 | 
     * 
 | 
     * drop_gap 
 | 
     * The max continuous frame drop number 
 | 
     */ 
 | 
    MppEncRcDropFrmMode     drop_mode; 
 | 
    RK_U32                  drop_threshold; 
 | 
    RK_U32                  drop_gap; 
 | 
  
 | 
    MppEncRcSuperFrameMode  super_mode; 
 | 
    RK_U32                  super_i_thd; 
 | 
    RK_U32                  super_p_thd; 
 | 
  
 | 
    MppEncRcPriority        rc_priority; 
 | 
  
 | 
    RK_U32                  debreath_en; 
 | 
    RK_U32                  debre_strength; 
 | 
    RK_S32                  max_i_prop; 
 | 
    RK_S32                  min_i_prop; 
 | 
    RK_S32                  init_ip_ratio; 
 | 
  
 | 
    /* general qp control */ 
 | 
    RK_S32                  qp_init; 
 | 
    RK_S32                  qp_max; 
 | 
    RK_S32                  qp_max_i; 
 | 
    RK_S32                  qp_min; 
 | 
    RK_S32                  qp_min_i; 
 | 
    RK_S32                  qp_max_step;                /* delta qp between each two P frame */ 
 | 
    RK_S32                  qp_delta_ip;                /* delta qp between I and P */ 
 | 
    RK_S32                  qp_delta_vi;                /* delta qp between vi and P */ 
 | 
  
 | 
    RK_S32                  hier_qp_en; 
 | 
    RK_S32                  hier_qp_delta[4]; 
 | 
    RK_S32                  hier_frame_num[4]; 
 | 
} MppEncRcCfg; 
 | 
  
 | 
  
 | 
typedef enum MppEncHwCfgChange_e { 
 | 
    /* qp related hardware config flag */ 
 | 
    MPP_ENC_HW_CFG_CHANGE_QP_ROW        = (1 << 0), 
 | 
    MPP_ENC_HW_CFG_CHANGE_QP_ROW_I      = (1 << 1), 
 | 
    MPP_ENC_HW_CFG_CHANGE_AQ_THRD_I     = (1 << 2), 
 | 
    MPP_ENC_HW_CFG_CHANGE_AQ_THRD_P     = (1 << 3), 
 | 
    MPP_ENC_HW_CFG_CHANGE_AQ_STEP_I     = (1 << 4), 
 | 
    MPP_ENC_HW_CFG_CHANGE_AQ_STEP_P     = (1 << 5), 
 | 
    MPP_ENC_HW_CFG_CHANGE_MB_RC         = (1 << 6), 
 | 
    MPP_ENC_HW_CFG_CHANGE_ALL           = (0xFFFFFFFF), 
 | 
} MppEncHwCfgChange; 
 | 
  
 | 
/* 
 | 
 * Hardware related rate control config 
 | 
 * 
 | 
 * This config will open some detail feature to external user to control 
 | 
 * hardware behavior directly. 
 | 
 */ 
 | 
typedef struct MppEncHwCfg_t { 
 | 
    RK_U32                  change; 
 | 
  
 | 
    /* vepu541/vepu540 */ 
 | 
    RK_S32                  qp_delta_row;               /* delta qp between two row in P frame */ 
 | 
    RK_S32                  qp_delta_row_i;             /* delta qp between two row in I frame */ 
 | 
    RK_U32                  aq_thrd_i[16]; 
 | 
    RK_U32                  aq_thrd_p[16]; 
 | 
    RK_S32                  aq_step_i[16]; 
 | 
    RK_S32                  aq_step_p[16]; 
 | 
  
 | 
    /* vepu1/2 */ 
 | 
    RK_S32                  mb_rc_disable; 
 | 
  
 | 
    /* vepu580 */ 
 | 
    RK_S32                  extra_buf; 
 | 
} MppEncHwCfg; 
 | 
  
 | 
/* 
 | 
 * Mpp preprocess parameter 
 | 
 */ 
 | 
typedef enum MppEncPrepCfgChange_e { 
 | 
    MPP_ENC_PREP_CFG_CHANGE_INPUT       = (1 << 0),     /* change on input config */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_FORMAT      = (1 << 2),     /* change on format */ 
 | 
    /* transform parameter */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_ROTATION    = (1 << 4),     /* change on ration */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_MIRRORING   = (1 << 5),     /* change on mirroring */ 
 | 
    /* enhancement parameter */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_DENOISE     = (1 << 8),     /* change on denoise */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_SHARPEN     = (1 << 9),     /* change on denoise */ 
 | 
    /* color related parameter */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_COLOR_RANGE = (1 << 16),    /* change on color range */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_COLOR_SPACE = (1 << 17),    /* change on color range */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_COLOR_PRIME = (1 << 18),    /* change on color primaries */ 
 | 
    MPP_ENC_PREP_CFG_CHANGE_COLOR_TRC   = (1 << 19),    /* change on color transfer  */ 
 | 
  
 | 
    MPP_ENC_PREP_CFG_CHANGE_ALL         = (0xFFFFFFFF), 
 | 
} MppEncPrepCfgChange; 
 | 
  
 | 
/* 
 | 
 * Preprocess sharpen parameter 
 | 
 * 
 | 
 * 5x5 sharpen core 
 | 
 * 
 | 
 * enable_y  - enable luma sharpen 
 | 
 * enable_uv - enable chroma sharpen 
 | 
 */ 
 | 
typedef struct { 
 | 
    RK_U32              enable_y; 
 | 
    RK_U32              enable_uv; 
 | 
    RK_S32              coef[5]; 
 | 
    RK_S32              div; 
 | 
    RK_S32              threshold; 
 | 
} MppEncPrepSharpenCfg; 
 | 
  
 | 
/* 
 | 
 * input frame rotation parameter 
 | 
 * 0 - disable rotation 
 | 
 * 1 - 90 degree 
 | 
 * 2 - 180 degree 
 | 
 * 3 - 270 degree 
 | 
 */ 
 | 
typedef enum MppEncRotationCfg_e { 
 | 
    MPP_ENC_ROT_0, 
 | 
    MPP_ENC_ROT_90, 
 | 
    MPP_ENC_ROT_180, 
 | 
    MPP_ENC_ROT_270, 
 | 
    MPP_ENC_ROT_BUTT 
 | 
} MppEncRotationCfg; 
 | 
  
 | 
typedef struct MppEncPrepCfg_t { 
 | 
    RK_U32              change; 
 | 
  
 | 
    /* 
 | 
     * Mpp encoder input data dimension config 
 | 
     * 
 | 
     * width / height / hor_stride / ver_stride / format 
 | 
     * These information will be used for buffer allocation and rc config init 
 | 
     * The output format is always YUV420. So if input is RGB then color 
 | 
     * conversion will be done internally 
 | 
     */ 
 | 
    RK_S32              width; 
 | 
    RK_S32              height; 
 | 
    RK_S32              hor_stride; 
 | 
    RK_S32              ver_stride; 
 | 
  
 | 
    /* 
 | 
     * Mpp encoder input data format config 
 | 
     */ 
 | 
    MppFrameFormat      format; 
 | 
    MppFrameColorSpace  color; 
 | 
    MppFrameColorPrimaries colorprim; 
 | 
    MppFrameColorTransferCharacteristic colortrc; 
 | 
    MppFrameColorRange  range; 
 | 
  
 | 
    MppEncRotationCfg   rotation; 
 | 
  
 | 
    /* 
 | 
     * input frame mirroring parameter 
 | 
     * 0 - disable mirroring 
 | 
     * 1 - horizontal mirroring 
 | 
     * 2 - vertical mirroring 
 | 
     */ 
 | 
    RK_S32              mirroring; 
 | 
  
 | 
    /* 
 | 
     * TODO: 
 | 
     */ 
 | 
    RK_S32              denoise; 
 | 
  
 | 
    MppEncPrepSharpenCfg sharpen; 
 | 
} MppEncPrepCfg; 
 | 
  
 | 
/* 
 | 
 * Mpp Motion Detection parameter 
 | 
 * 
 | 
 * Mpp can output Motion Detection infomation for each frame. 
 | 
 * If user euqueue a encode task with KEY_MOTION_INFO by following function 
 | 
 * then encoder will output Motion Detection information to the buffer. 
 | 
 * 
 | 
 * mpp_task_meta_set_buffer(task, KEY_MOTION_INFO, buffer); 
 | 
 * 
 | 
 * Motion Detection information will be organized in this way: 
 | 
 * 1. Each 16x16 block will have a 32 bit block information which contains 
 | 
 *    15 bit SAD(Sum of Abstract Difference value 
 | 
 *    9 bit signed horizontal motion vector 
 | 
 *    8 bit signed vertical motion vector 
 | 
 * 2. The sequence of MD information in the buffer is corresponding to the 
 | 
 *    block position in the frame, left-to right, top-to-bottom. 
 | 
 * 3. If the width of the frame is not a multiple of 256 pixels (16 macro 
 | 
 *    blocks), DMA would extend the frame to a multiple of 256 pixels and 
 | 
 *    the extended blocks' MD information are 32'h0000_0000. 
 | 
 * 4. Buffer must be ion buffer and 1024 byte aligned. 
 | 
 */ 
 | 
typedef struct MppEncMDBlkInfo_t { 
 | 
    RK_U32              sad     : 15;   /* bit  0~14 - SAD */ 
 | 
    RK_S32              mvx     : 9;    /* bit 15~23 - signed horizontal mv */ 
 | 
    RK_S32              mvy     : 8;    /* bit 24~31 - signed vertical mv */ 
 | 
} MppEncMDBlkInfo; 
 | 
  
 | 
typedef enum MppEncHeaderMode_e { 
 | 
    /* default mode: attach vps/sps/pps only on first frame */ 
 | 
    MPP_ENC_HEADER_MODE_DEFAULT, 
 | 
    /* IDR mode: attach vps/sps/pps on each IDR frame */ 
 | 
    MPP_ENC_HEADER_MODE_EACH_IDR, 
 | 
    MPP_ENC_HEADER_MODE_BUTT, 
 | 
} MppEncHeaderMode; 
 | 
  
 | 
typedef enum MppEncSeiMode_e { 
 | 
    MPP_ENC_SEI_MODE_DISABLE,                /* default mode, SEI writing is disabled */ 
 | 
    MPP_ENC_SEI_MODE_ONE_SEQ,                /* one sequence has only one SEI */ 
 | 
    MPP_ENC_SEI_MODE_ONE_FRAME               /* one frame may have one SEI, if SEI info has changed */ 
 | 
} MppEncSeiMode; 
 | 
  
 | 
/* 
 | 
 * Mpp codec parameter 
 | 
 * parameter is defined from here 
 | 
 */ 
 | 
  
 | 
/* 
 | 
 * H.264 configurable parameter 
 | 
 */ 
 | 
typedef enum MppEncH264CfgChange_e { 
 | 
    /* change on stream type */ 
 | 
    MPP_ENC_H264_CFG_STREAM_TYPE            = (1 << 0), 
 | 
    /* change on svc / profile / level */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_PROFILE         = (1 << 1), 
 | 
    /* change on entropy_coding_mode / cabac_init_idc */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_ENTROPY         = (1 << 2), 
 | 
  
 | 
    /* change on transform8x8_mode */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_TRANS_8x8       = (1 << 4), 
 | 
    /* change on constrained_intra_pred_mode */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_CONST_INTRA     = (1 << 5), 
 | 
    /* change on chroma_cb_qp_offset/ chroma_cr_qp_offset */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_CHROMA_QP       = (1 << 6), 
 | 
    /* change on deblock_disable / deblock_offset_alpha / deblock_offset_beta */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_DEBLOCKING      = (1 << 7), 
 | 
    /* change on use_longterm */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_LONG_TERM       = (1 << 8), 
 | 
    /* change on scaling_list_mode */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_SCALING_LIST    = (1 << 9), 
 | 
    /* change on poc type */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_POC_TYPE        = (1 << 10), 
 | 
    /* change on log2 max poc lsb minus 4 */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_MAX_POC_LSB     = (1 << 11), 
 | 
    /* change on log2 max frame number minus 4 */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_MAX_FRM_NUM     = (1 << 12), 
 | 
    /* change on gaps_in_frame_num_value_allowed_flag */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_GAPS_IN_FRM_NUM = (1 << 13), 
 | 
  
 | 
    /* change on max_qp / min_qp */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_QP_LIMIT        = (1 << 16), 
 | 
    /* change on max_qp_i / min_qp_i */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I      = (1 << 17), 
 | 
    /* change on max_qp_step */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_MAX_QP_STEP     = (1 << 18), 
 | 
    /* change on qp_delta_ip */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_QP_DELTA        = (1 << 19), 
 | 
    /* change on intra_refresh_mode / intra_refresh_arg */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH   = (1 << 20), 
 | 
    /* change on max long-term reference frame count */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_MAX_LTR         = (1 << 21), 
 | 
    /* change on max temporal id */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_MAX_TID         = (1 << 22), 
 | 
    /* change on adding prefix nal */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_ADD_PREFIX      = (1 << 23), 
 | 
    /* change on base layer priority id */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_BASE_LAYER_PID  = (1 << 24), 
 | 
  
 | 
    /* change on vui */ 
 | 
    MPP_ENC_H264_CFG_CHANGE_VUI             = (1 << 28), 
 | 
    MPP_ENC_H264_CFG_CHANGE_ALL             = (0xFFFFFFFF), 
 | 
} MppEncH264CfgChange; 
 | 
  
 | 
typedef struct MppEncH264Cfg_t { 
 | 
    RK_U32              change; 
 | 
  
 | 
    /* 
 | 
     * H.264 stream format 
 | 
     * 0 - H.264 Annex B: NAL unit starts with '00 00 00 01' 
 | 
     * 1 - Plain NAL units without startcode 
 | 
     */ 
 | 
    RK_S32              stream_type; 
 | 
  
 | 
    /* 
 | 
     * H.264 codec syntax config 
 | 
     * 
 | 
     * do NOT setup the three option below unless you are familiar with encoder detail 
 | 
     * poc_type             - picture order count type 0 ~ 2 
 | 
     * log2_max_poc_lsb     - used in sps with poc_type 0, 
 | 
     * log2_max_frame_num   - used in sps 
 | 
     */ 
 | 
    RK_U32              poc_type; 
 | 
    RK_U32              log2_max_poc_lsb; 
 | 
    RK_U32              log2_max_frame_num; 
 | 
    RK_U32              gaps_not_allowed; 
 | 
  
 | 
    /* 
 | 
     * H.264 profile_idc parameter 
 | 
     * 66  - Baseline profile 
 | 
     * 77  - Main profile 
 | 
     * 100 - High profile 
 | 
     */ 
 | 
    RK_S32              profile; 
 | 
  
 | 
    /* 
 | 
     * H.264 level_idc parameter 
 | 
     * 10 / 11 / 12 / 13    - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps 
 | 
     * 20 / 21 / 22         - cif@30fps / half-D1@@25fps / D1@12.5fps 
 | 
     * 30 / 31 / 32         - D1@25fps / 720p@30fps / 720p@60fps 
 | 
     * 40 / 41 / 42         - 1080p@30fps / 1080p@30fps / 1080p@60fps 
 | 
     * 50 / 51 / 52         - 4K@30fps 
 | 
     */ 
 | 
    RK_S32              level; 
 | 
  
 | 
    /* 
 | 
     * H.264 entropy coding method 
 | 
     * 0 - CAVLC 
 | 
     * 1 - CABAC 
 | 
     * When CABAC is select cabac_init_idc can be range 0~2 
 | 
     */ 
 | 
    RK_S32              entropy_coding_mode; 
 | 
    RK_S32              cabac_init_idc; 
 | 
  
 | 
    /* 
 | 
     * 8x8 intra prediction and 8x8 transform enable flag 
 | 
     * This flag can only be enable under High profile 
 | 
     * 0 : disable (BP/MP) 
 | 
     * 1 : enable  (HP) 
 | 
     */ 
 | 
    RK_S32              transform8x8_mode; 
 | 
  
 | 
    /* 
 | 
     * 0 : disable 
 | 
     * 1 : enable 
 | 
     */ 
 | 
    RK_S32              constrained_intra_pred_mode; 
 | 
  
 | 
    /* 
 | 
     * 0 : flat scaling list 
 | 
     * 1 : default scaling list for all cases 
 | 
     * 2 : customized scaling list (not supported) 
 | 
     */ 
 | 
    RK_S32              scaling_list_mode; 
 | 
  
 | 
    /* 
 | 
     * chroma qp offset (-12 - 12) 
 | 
     */ 
 | 
    RK_S32              chroma_cb_qp_offset; 
 | 
    RK_S32              chroma_cr_qp_offset; 
 | 
  
 | 
    /* 
 | 
     * H.264 deblock filter mode flag 
 | 
     * 0 : enable 
 | 
     * 1 : disable 
 | 
     * 2 : disable deblocking filter at slice boundaries 
 | 
     * 
 | 
     * deblock filter offset alpha (-6 - 6) 
 | 
     * deblock filter offset beta  (-6 - 6) 
 | 
     */ 
 | 
    RK_S32              deblock_disable; 
 | 
    RK_S32              deblock_offset_alpha; 
 | 
    RK_S32              deblock_offset_beta; 
 | 
  
 | 
    /* 
 | 
     * H.264 long term reference picture enable flag 
 | 
     * 0 - disable 
 | 
     * 1 - enable 
 | 
     */ 
 | 
    RK_S32              use_longterm; 
 | 
  
 | 
    /* 
 | 
     * quality config 
 | 
     * qp_max       - 8  ~ 51 
 | 
     * qp_max_i     - 10 ~ 40 
 | 
     * qp_min       - 8  ~ 48 
 | 
     * qp_min_i     - 10 ~ 40 
 | 
     * qp_max_step  - max delta qp step between two frames 
 | 
     */ 
 | 
    RK_S32              qp_init; 
 | 
    RK_S16              qp_max; 
 | 
    RK_S16              qp_max_i; 
 | 
    RK_S16              qp_min; 
 | 
    RK_S16              qp_min_i; 
 | 
    RK_S16              qp_max_step; 
 | 
    RK_S16              qp_delta_ip; 
 | 
  
 | 
    /* 
 | 
     * intra fresh config 
 | 
     * 
 | 
     * intra_refresh_mode 
 | 
     * 0 - no intra refresh 
 | 
     * 1 - intra refresh by MB row 
 | 
     * 2 - intra refresh by MB column 
 | 
     * 3 - intra refresh by MB gap 
 | 
     * 
 | 
     * intra_refresh_arg 
 | 
     * mode 0 - no effect 
 | 
     * mode 1 - refresh MB row number 
 | 
     * mode 2 - refresh MB colmn number 
 | 
     * mode 3 - refresh MB gap count 
 | 
     */ 
 | 
    RK_S32              intra_refresh_mode; 
 | 
    RK_S32              intra_refresh_arg; 
 | 
  
 | 
    /* extra mode config */ 
 | 
    RK_S32              max_ltr_frames; 
 | 
    RK_S32              max_tid; 
 | 
    RK_S32              prefix_mode; 
 | 
    RK_S32              base_layer_pid; 
 | 
} MppEncH264Cfg; 
 | 
  
 | 
#define H265E_MAX_ROI_NUMBER  64 
 | 
  
 | 
typedef struct H265eRect_t { 
 | 
    RK_S32              left; 
 | 
    RK_S32              right; 
 | 
    RK_S32              top; 
 | 
    RK_S32              bottom; 
 | 
} H265eRect; 
 | 
  
 | 
typedef struct H265eRoi_Region_t { 
 | 
    RK_U8               level; 
 | 
    H265eRect           rect; 
 | 
} H265eRoiRegion; 
 | 
  
 | 
/* 
 | 
 * roi region only can be setting when rc_enable = 1 
 | 
 */ 
 | 
typedef struct MppEncH265RoiCfg_t { 
 | 
    /* 
 | 
     * the value is defined by H265eCtuMethod 
 | 
     */ 
 | 
  
 | 
    RK_U8               method; 
 | 
    /* 
 | 
     * the number of roi,the value must less than H265E_MAX_ROI_NUMBER 
 | 
     */ 
 | 
    RK_S32              num; 
 | 
  
 | 
    /* delat qp using in roi region*/ 
 | 
    RK_U32              delta_qp; 
 | 
  
 | 
    /* roi region */ 
 | 
    H265eRoiRegion      region[H265E_MAX_ROI_NUMBER]; 
 | 
} MppEncH265RoiCfg; 
 | 
  
 | 
typedef struct H265eCtuQp_t { 
 | 
    /* the qp value using in ctu region */ 
 | 
    RK_U32              qp; 
 | 
  
 | 
    /* 
 | 
     * define the ctu region 
 | 
     * method = H265E_METHOD_CUT_SIZE, the value of rect is in ctu size 
 | 
     * method = H264E_METHOD_COORDINATE,the value of rect is in coordinates 
 | 
     */ 
 | 
    H265eRect           rect; 
 | 
} H265eCtu; 
 | 
  
 | 
typedef struct H265eCtuRegion_t { 
 | 
    /* 
 | 
     * the value is defined by H265eCtuMethod 
 | 
     */ 
 | 
    RK_U8               method; 
 | 
  
 | 
    /* 
 | 
     * the number of ctu,the value must less than H265E_MAX_ROI_NUMBER 
 | 
     */ 
 | 
    RK_S32              num; 
 | 
  
 | 
    /* ctu region */ 
 | 
    H265eCtu            ctu[H265E_MAX_ROI_NUMBER]; 
 | 
} MppEncH265CtuCfg; 
 | 
  
 | 
/* 
 | 
 * define the method when set CTU/ROI parameters 
 | 
 * this value is using by method in H265eCtuRegion or H265eRoi struct 
 | 
 */ 
 | 
typedef enum { 
 | 
    H265E_METHOD_CTU_SIZE, 
 | 
    H264E_METHOD_COORDINATE, 
 | 
} H265eCtuMethod; 
 | 
  
 | 
/* 
 | 
 * H.265 configurable parameter 
 | 
 */ 
 | 
typedef struct MppEncH265VuiCfg_t { 
 | 
    RK_U32              change; 
 | 
    RK_S32              vui_present; 
 | 
    RK_S32              vui_aspect_ratio; 
 | 
    RK_S32              vui_sar_size; 
 | 
    RK_S32              full_range; 
 | 
    RK_S32              time_scale; 
 | 
} MppEncH265VuiCfg; 
 | 
  
 | 
typedef enum MppEncH265CfgChange_e { 
 | 
    /* change on stream type */ 
 | 
    MPP_ENC_H265_CFG_PROFILE_LEVEL_TILER_CHANGE = (1 << 0), 
 | 
    MPP_ENC_H265_CFG_INTRA_QP_CHANGE            = (1 << 1), 
 | 
    MPP_ENC_H265_CFG_FRAME_RATE_CHANGE          = (1 << 2), 
 | 
    MPP_ENC_H265_CFG_BITRATE_CHANGE             = (1 << 3), 
 | 
    MPP_ENC_H265_CFG_GOP_SIZE                   = (1 << 4), 
 | 
    MPP_ENC_H265_CFG_RC_QP_CHANGE               = (1 << 5), 
 | 
    MPP_ENC_H265_CFG_INTRA_REFRESH_CHANGE       = (1 << 6), 
 | 
    MPP_ENC_H265_CFG_INDEPEND_SLICE_CHANGE      = (1 << 7), 
 | 
    MPP_ENC_H265_CFG_DEPEND_SLICE_CHANGE        = (1 << 8), 
 | 
    MPP_ENC_H265_CFG_CTU_CHANGE                 = (1 << 9), 
 | 
    MPP_ENC_H265_CFG_ROI_CHANGE                 = (1 << 10), 
 | 
    MPP_ENC_H265_CFG_CU_CHANGE                  = (1 << 11), 
 | 
    MPP_ENC_H265_CFG_DBLK_CHANGE                = (1 << 12), 
 | 
    MPP_ENC_H265_CFG_SAO_CHANGE                 = (1 << 13), 
 | 
    MPP_ENC_H265_CFG_TRANS_CHANGE               = (1 << 14), 
 | 
    MPP_ENC_H265_CFG_SLICE_CHANGE               = (1 << 15), 
 | 
    MPP_ENC_H265_CFG_ENTROPY_CHANGE             = (1 << 16), 
 | 
    MPP_ENC_H265_CFG_MERGE_CHANGE               = (1 << 17), 
 | 
    MPP_ENC_H265_CFG_CHANGE_VUI                 = (1 << 18), 
 | 
    MPP_ENC_H265_CFG_RC_I_QP_CHANGE             = (1 << 19), 
 | 
    MPP_ENC_H265_CFG_RC_MAX_QP_STEP_CHANGE      = (1 << 21), 
 | 
    MPP_ENC_H265_CFG_RC_IP_DELTA_QP_CHANGE      = (1 << 20), 
 | 
    MPP_ENC_H265_CFG_CHANGE_ALL                 = (0xFFFFFFFF), 
 | 
} MppEncH265CfgChange; 
 | 
  
 | 
typedef struct MppEncH265SliceCfg_t { 
 | 
    /* default value: 0, means no slice split*/ 
 | 
    RK_U32  split_enable; 
 | 
  
 | 
    /* 0: by bits number; 1: by lcu line number*/ 
 | 
    RK_U32  split_mode; 
 | 
  
 | 
    /* 
 | 
     * when splitmode is 0, this value presents bits number, 
 | 
     * when splitmode is 1, this value presents lcu line number 
 | 
     */ 
 | 
    RK_U32  slice_size; 
 | 
    RK_U32  slice_out; 
 | 
    RK_U32  loop_filter_across_slices_enabled_flag; 
 | 
} MppEncH265SliceCfg; 
 | 
  
 | 
typedef struct MppEncH265CuCfg_t { 
 | 
    RK_U32  cu32x32_en;                             /*default: 1 */ 
 | 
    RK_U32  cu16x16_en;                             /*default: 1 */ 
 | 
    RK_U32  cu8x8_en;                               /*default: 1 */ 
 | 
    RK_U32  cu4x4_en;                               /*default: 1 */ 
 | 
  
 | 
    // intra pred 
 | 
    RK_U32  constrained_intra_pred_flag;            /*default: 0 */ 
 | 
    RK_U32  strong_intra_smoothing_enabled_flag;    /*INTRA_SMOOTH*/ 
 | 
    RK_U32  pcm_enabled_flag;                       /*default: 0, enable ipcm*/ 
 | 
    RK_U32  pcm_loop_filter_disabled_flag; 
 | 
  
 | 
} MppEncH265CuCfg; 
 | 
  
 | 
typedef struct MppEncH265RefCfg_t { 
 | 
    RK_U32  num_lt_ref_pic;                         /*default: 0*/ 
 | 
} MppEncH265RefCfg; 
 | 
  
 | 
  
 | 
typedef struct MppEncH265DblkCfg_t { 
 | 
    RK_U32  slice_deblocking_filter_disabled_flag;  /* default value: 0. {0,1} */ 
 | 
    RK_S32  slice_beta_offset_div2;                 /* default value: 0. [-6,+6] */ 
 | 
    RK_S32  slice_tc_offset_div2;                   /* default value: 0. [-6,+6] */ 
 | 
} MppEncH265DblkCfg_t; 
 | 
  
 | 
typedef struct MppEncH265SaoCfg_t { 
 | 
    RK_U32  slice_sao_luma_disable; 
 | 
    RK_U32  slice_sao_chroma_disable; 
 | 
} MppEncH265SaoCfg; 
 | 
  
 | 
typedef struct MppEncH265TransCfg_t { 
 | 
    RK_U32  transquant_bypass_enabled_flag; 
 | 
    RK_U32  transform_skip_enabled_flag; 
 | 
    RK_U32  defalut_ScalingList_enable;             /* default: 0 */ 
 | 
    RK_S32  cb_qp_offset; 
 | 
    RK_S32  cr_qp_offset; 
 | 
} MppEncH265TransCfg; 
 | 
  
 | 
typedef struct MppEncH265MergeCfg_t { 
 | 
    RK_U32  max_mrg_cnd; 
 | 
    RK_U32  merge_up_flag; 
 | 
    RK_U32  merge_left_flag; 
 | 
} MppEncH265MergesCfg; 
 | 
  
 | 
typedef struct MppEncH265EntropyCfg_t { 
 | 
    RK_U32  cabac_init_flag;                        /* default: 0 */ 
 | 
} MppEncH265EntropyCfg; 
 | 
  
 | 
typedef struct MppEncH265Cfg_t { 
 | 
    RK_U32              change; 
 | 
  
 | 
    /* H.265 codec syntax config */ 
 | 
    RK_S32              profile; 
 | 
    RK_S32              level; 
 | 
    RK_S32              tier; 
 | 
  
 | 
    /* constraint intra prediction flag */ 
 | 
    RK_S32              const_intra_pred; 
 | 
    RK_S32              ctu_size; 
 | 
    RK_S32              max_cu_size; 
 | 
    RK_S32              tmvp_enable; 
 | 
    RK_S32              amp_enable; 
 | 
    RK_S32              wpp_enable; 
 | 
    RK_S32              merge_range; 
 | 
    RK_S32              sao_enable; 
 | 
    RK_U32              num_ref; 
 | 
  
 | 
    /* quality config */ 
 | 
    RK_S32              max_qp; 
 | 
    RK_S32              min_qp; 
 | 
    RK_S32              max_i_qp; 
 | 
    RK_S32              min_i_qp; 
 | 
    RK_S32              ip_qp_delta; 
 | 
    RK_S32              max_delta_qp; 
 | 
    RK_S32              intra_qp; 
 | 
    RK_S32              gop_delta_qp; 
 | 
    RK_S32              qp_init; 
 | 
    RK_S32              qp_max_step; 
 | 
    RK_S32              raw_dealt_qp; 
 | 
    RK_U8               qpmax_map[8]; 
 | 
    RK_U8               qpmin_map[8]; 
 | 
    RK_S32              qpmap_mode; 
 | 
  
 | 
    /* intra fresh config */ 
 | 
    RK_S32              intra_refresh_mode; 
 | 
    RK_S32              intra_refresh_arg; 
 | 
  
 | 
    /* slice mode config */ 
 | 
    RK_S32              independ_slice_mode; 
 | 
    RK_S32              independ_slice_arg; 
 | 
    RK_S32              depend_slice_mode; 
 | 
    RK_S32              depend_slice_arg; 
 | 
  
 | 
    MppEncH265CuCfg      cu_cfg; 
 | 
    MppEncH265SliceCfg   slice_cfg; 
 | 
    MppEncH265EntropyCfg entropy_cfg; 
 | 
    MppEncH265TransCfg   trans_cfg; 
 | 
    MppEncH265SaoCfg     sao_cfg; 
 | 
    MppEncH265DblkCfg_t  dblk_cfg; 
 | 
    MppEncH265RefCfg     ref_cfg; 
 | 
    MppEncH265MergesCfg  merge_cfg; 
 | 
  
 | 
    /* extra info */ 
 | 
    MppEncH265VuiCfg    vui; 
 | 
  
 | 
    MppEncH265CtuCfg    ctu; 
 | 
    MppEncH265RoiCfg    roi; 
 | 
} MppEncH265Cfg; 
 | 
  
 | 
/* 
 | 
 * motion jpeg configurable parameter 
 | 
 */ 
 | 
typedef enum MppEncJpegCfgChange_e { 
 | 
    /* change on quant parameter */ 
 | 
    MPP_ENC_JPEG_CFG_CHANGE_QP              = (1 << 0), 
 | 
    MPP_ENC_JPEG_CFG_CHANGE_QTABLE          = (1 << 1), 
 | 
    MPP_ENC_JPEG_CFG_CHANGE_QFACTOR         = (1 << 2), 
 | 
    MPP_ENC_JPEG_CFG_CHANGE_ALL             = (0xFFFFFFFF), 
 | 
} MppEncJpegCfgChange; 
 | 
  
 | 
typedef struct MppEncJpegCfg_t { 
 | 
    RK_U32              change; 
 | 
    RK_S32              quant; 
 | 
    /* 
 | 
     * quality factor config 
 | 
     * 
 | 
     * q_factor     - 1  ~ 99 
 | 
     * qf_max       - 1  ~ 99 
 | 
     * qf_min       - 1  ~ 99 
 | 
     * qtable_y: qtable for luma 
 | 
     * qtable_u: qtable for chroma 
 | 
     * qtable_v: default equal qtable_u 
 | 
     */ 
 | 
    RK_S32              q_factor; 
 | 
    RK_S32              qf_max; 
 | 
    RK_S32              qf_min; 
 | 
    RK_U8               *qtable_y; 
 | 
    RK_U8               *qtable_u; 
 | 
    RK_U8               *qtable_v; 
 | 
} MppEncJpegCfg; 
 | 
  
 | 
/* 
 | 
 * vp8 configurable parameter 
 | 
 */ 
 | 
typedef enum MppEncVP8CfgChange_e { 
 | 
    MPP_ENC_VP8_CFG_CHANGE_QP              = (1 << 0), 
 | 
    MPP_ENC_VP8_CFG_CHANGE_DIS_IVF         = (1 << 1), 
 | 
    MPP_ENC_VP8_CFG_CHANGE_ALL             = (0xFFFFFFFF), 
 | 
} MppEncVP8CfgChange; 
 | 
  
 | 
typedef struct MppEncVp8Cfg_t { 
 | 
    RK_U32              change; 
 | 
    RK_S32              quant; 
 | 
  
 | 
    RK_S32              qp_init; 
 | 
    RK_S32              qp_max; 
 | 
    RK_S32              qp_max_i; 
 | 
    RK_S32              qp_min; 
 | 
    RK_S32              qp_min_i; 
 | 
    RK_S32              qp_max_step; 
 | 
    RK_S32              disable_ivf; 
 | 
} MppEncVp8Cfg; 
 | 
  
 | 
/** 
 | 
 * @ingroup rk_mpi 
 | 
 * @brief MPP encoder codec configuration parameters 
 | 
 * @details The encoder codec configuration parameters are different for each 
 | 
 *          compression codings. For example, H.264 encoder can configure 
 | 
 *          profile, level, qp, etc. while jpeg encoder can configure qp 
 | 
 *          only. The detailed parameters can refer the corresponding data 
 | 
 *          structure such as MppEncH264Cfg and MppEncJpegCfg. This data 
 | 
 *          structure is associated with MPP_ENC_SET_CODEC_CFG command. 
 | 
 */ 
 | 
typedef struct MppEncCodecCfg_t { 
 | 
    MppCodingType       coding; 
 | 
  
 | 
    union { 
 | 
        RK_U32          change; 
 | 
        MppEncH264Cfg   h264; 
 | 
        MppEncH265Cfg   h265; 
 | 
        MppEncJpegCfg   jpeg; 
 | 
        MppEncVp8Cfg    vp8; 
 | 
    }; 
 | 
} MppEncCodecCfg; 
 | 
  
 | 
typedef enum MppEncSliceSplit_e { 
 | 
    /* change on quant parameter */ 
 | 
    MPP_ENC_SPLIT_CFG_CHANGE_MODE           = (1 << 0), 
 | 
    MPP_ENC_SPLIT_CFG_CHANGE_ARG            = (1 << 1), 
 | 
    MPP_ENC_SPLIT_CFG_CHANGE_OUTPUT         = (1 << 2), 
 | 
    MPP_ENC_SPLIT_CFG_CHANGE_ALL            = (0xFFFFFFFF), 
 | 
} MppEncSliceSplitChange; 
 | 
  
 | 
typedef enum MppEncSplitMode_e { 
 | 
    MPP_ENC_SPLIT_NONE, 
 | 
    MPP_ENC_SPLIT_BY_BYTE, 
 | 
    MPP_ENC_SPLIT_BY_CTU, 
 | 
} MppEncSplitMode; 
 | 
  
 | 
typedef struct MppEncSliceSplit_t { 
 | 
    RK_U32  change; 
 | 
  
 | 
    /* 
 | 
     * slice split mode 
 | 
     * 
 | 
     * MPP_ENC_SPLIT_NONE    - No slice is split 
 | 
     * MPP_ENC_SPLIT_BY_BYTE - Slice is split by byte number 
 | 
     * MPP_ENC_SPLIT_BY_CTU  - Slice is split by macroblock / ctu number 
 | 
     */ 
 | 
    RK_U32  split_mode; 
 | 
  
 | 
    /* 
 | 
     * slice split size parameter 
 | 
     * 
 | 
     * When split by byte number this value is the max byte number for each 
 | 
     * slice. 
 | 
     * When split by macroblock / ctu number this value is the MB/CTU number 
 | 
     * for each slice. 
 | 
     */ 
 | 
    RK_U32  split_arg; 
 | 
  
 | 
    /* 
 | 
     * slice split output mode 
 | 
     * 
 | 
     * 0    - output all slice in one packet 
 | 
     * 1    - output each slice in a single packet 
 | 
     */ 
 | 
    RK_U32  split_out; 
 | 
} MppEncSliceSplit; 
 | 
  
 | 
/** 
 | 
 * @brief Mpp ROI parameter 
 | 
 *        Region configure define a rectangle as ROI 
 | 
 * @note  x, y, w, h are calculated in pixels, which had better be 16-pixel aligned. 
 | 
 *        These parameters MUST retain in memory when encoder is running. 
 | 
 *        Both absolute qp and relative qp are supported in vepu541. 
 | 
 *        Only absolute qp is supported in rv1108 
 | 
 */ 
 | 
typedef struct MppEncROIRegion_t { 
 | 
    RK_U16              x;              /**< horizontal position of top left corner */ 
 | 
    RK_U16              y;              /**< vertical position of top left corner */ 
 | 
    RK_U16              w;              /**< width of ROI rectangle */ 
 | 
    RK_U16              h;              /**< height of ROI rectangle */ 
 | 
    RK_U16              intra;          /**< flag of forced intra macroblock */ 
 | 
    RK_S16              quality;        /**< absolute / relative qp of macroblock */ 
 | 
    RK_U16              qp_area_idx;    /**< qp min max area select*/ 
 | 
    RK_U8               area_map_en;    /**< enable area map */ 
 | 
    RK_U8               abs_qp_en;      /**< absolute qp enable flag*/ 
 | 
} MppEncROIRegion; 
 | 
  
 | 
/** 
 | 
 * @brief MPP encoder's ROI configuration 
 | 
 */ 
 | 
typedef struct MppEncROICfg_t { 
 | 
    RK_U32              number;        /**< ROI rectangle number */ 
 | 
    MppEncROIRegion     *regions;      /**< ROI parameters */ 
 | 
} MppEncROICfg; 
 | 
  
 | 
/** 
 | 
 * @brief Mpp ROI parameter for vepu54x / vepu58x 
 | 
 * @note  These encoders have more complex roi configure structure. 
 | 
 *        User need to generate roi structure data for different soc. 
 | 
 *        And send buffers to encoder through metadata. 
 | 
 */ 
 | 
typedef struct MppEncROICfg2_t { 
 | 
    MppBuffer          base_cfg_buf; 
 | 
    MppBuffer          qp_cfg_buf; 
 | 
    MppBuffer          amv_cfg_buf; 
 | 
    MppBuffer          mv_cfg_buf; 
 | 
  
 | 
    RK_U32             roi_qp_en    : 1; 
 | 
    RK_U32             roi_amv_en   : 1; 
 | 
    RK_U32             roi_mv_en    : 1; 
 | 
    RK_U32             reserve_bits : 29; 
 | 
    RK_U32             reserve[3]; 
 | 
} MppEncROICfg2; 
 | 
  
 | 
/* 
 | 
 * Mpp OSD parameter 
 | 
 * 
 | 
 * Mpp OSD support total 8 regions 
 | 
 * Mpp OSD support 256-color palette two mode palette: 
 | 
 * 1. Configurable OSD palette 
 | 
 *    When palette is set. 
 | 
 * 2. fixed OSD palette 
 | 
 *    When palette is NULL. 
 | 
 * 
 | 
 * if MppEncOSDPlt.buf != NULL , palette includes maximun 256 levels, 
 | 
 * every level composed of 32 bits defined below: 
 | 
 * Y     : 8 bits 
 | 
 * U     : 8 bits 
 | 
 * V     : 8 bits 
 | 
 * alpha : 8 bits 
 | 
 */ 
 | 
#define MPP_ENC_OSD_PLT_WHITE           ((255<<24)|(128<<16)|(128<<8)|235) 
 | 
#define MPP_ENC_OSD_PLT_YELLOW          ((255<<24)|(146<<16)|( 16<<8)|210) 
 | 
#define MPP_ENC_OSD_PLT_CYAN            ((255<<24)|( 16<<16)|(166<<8)|170) 
 | 
#define MPP_ENC_OSD_PLT_GREEN           ((255<<24)|( 34<<16)|( 54<<8)|145) 
 | 
#define MPP_ENC_OSD_PLT_TRANS           ((  0<<24)|(222<<16)|(202<<8)|106) 
 | 
#define MPP_ENC_OSD_PLT_RED             ((255<<24)|(240<<16)|( 90<<8)| 81) 
 | 
#define MPP_ENC_OSD_PLT_BLUE            ((255<<24)|(110<<16)|(240<<8)| 41) 
 | 
#define MPP_ENC_OSD_PLT_BLACK           ((255<<24)|(128<<16)|(128<<8)| 16) 
 | 
  
 | 
typedef enum MppEncOSDPltType_e { 
 | 
    MPP_ENC_OSD_PLT_TYPE_DEFAULT, 
 | 
    MPP_ENC_OSD_PLT_TYPE_USERDEF, 
 | 
    MPP_ENC_OSD_PLT_TYPE_BUTT, 
 | 
} MppEncOSDPltType; 
 | 
  
 | 
/* OSD palette value define */ 
 | 
typedef union MppEncOSDPltVal_u { 
 | 
    struct { 
 | 
        RK_U32          v       : 8; 
 | 
        RK_U32          u       : 8; 
 | 
        RK_U32          y       : 8; 
 | 
        RK_U32          alpha   : 8; 
 | 
    }; 
 | 
    RK_U32              val; 
 | 
} MppEncOSDPltVal; 
 | 
  
 | 
typedef struct MppEncOSDPlt_t { 
 | 
    MppEncOSDPltVal     data[256]; 
 | 
} MppEncOSDPlt; 
 | 
  
 | 
typedef enum MppEncOSDPltCfgChange_e { 
 | 
    MPP_ENC_OSD_PLT_CFG_CHANGE_MODE     = (1 << 0),     /* change osd plt type */ 
 | 
    MPP_ENC_OSD_PLT_CFG_CHANGE_PLT_VAL  = (1 << 1),     /* change osd plt table value */ 
 | 
    MPP_ENC_OSD_PLT_CFG_CHANGE_ALL      = (0xFFFFFFFF), 
 | 
} MppEncOSDPltCfgChange; 
 | 
  
 | 
typedef struct MppEncOSDPltCfg_t { 
 | 
    RK_U32              change; 
 | 
    MppEncOSDPltType    type; 
 | 
    MppEncOSDPlt        *plt; 
 | 
} MppEncOSDPltCfg; 
 | 
  
 | 
/* position info is unit in 16 pixels(one MB), and 
 | 
 * x-directon range in pixels = (rd_pos_x - lt_pos_x + 1) * 16; 
 | 
 * y-directon range in pixels = (rd_pos_y - lt_pos_y + 1) * 16; 
 | 
 */ 
 | 
typedef struct MppEncOSDRegion_t { 
 | 
    RK_U32              enable; 
 | 
    RK_U32              inverse; 
 | 
    RK_U32              start_mb_x; 
 | 
    RK_U32              start_mb_y; 
 | 
    RK_U32              num_mb_x; 
 | 
    RK_U32              num_mb_y; 
 | 
    RK_U32              buf_offset; 
 | 
} MppEncOSDRegion; 
 | 
  
 | 
/* if num_region > 0 && region==NULL 
 | 
 * use old osd data 
 | 
 */ 
 | 
typedef struct MppEncOSDData_t { 
 | 
    MppBuffer           buf; 
 | 
    RK_U32              num_region; 
 | 
    MppEncOSDRegion     region[8]; 
 | 
} MppEncOSDData; 
 | 
  
 | 
typedef struct MppEncOSDRegion2_t { 
 | 
    RK_U32              enable; 
 | 
    RK_U32              inverse; 
 | 
    RK_U32              start_mb_x; 
 | 
    RK_U32              start_mb_y; 
 | 
    RK_U32              num_mb_x; 
 | 
    RK_U32              num_mb_y; 
 | 
    RK_U32              buf_offset; 
 | 
    MppBuffer           buf; 
 | 
} MppEncOSDRegion2; 
 | 
  
 | 
typedef struct MppEncOSDData2_t { 
 | 
    RK_U32              num_region; 
 | 
    MppEncOSDRegion2    region[8]; 
 | 
} MppEncOSDData2; 
 | 
  
 | 
typedef struct MppEncUserData_t { 
 | 
    RK_U32              len; 
 | 
    void                *pdata; 
 | 
} MppEncUserData; 
 | 
  
 | 
typedef struct MppEncUserDataFull_t { 
 | 
    RK_U32              len; 
 | 
    RK_U8               *uuid; 
 | 
    void                *pdata; 
 | 
} MppEncUserDataFull; 
 | 
  
 | 
typedef struct MppEncUserDataSet_t { 
 | 
    RK_U32              count; 
 | 
    MppEncUserDataFull  *datas; 
 | 
} MppEncUserDataSet; 
 | 
  
 | 
typedef enum MppEncSceneMode_e { 
 | 
    MPP_ENC_SCENE_MODE_DEFAULT, 
 | 
    MPP_ENC_SCENE_MODE_IPC, 
 | 
    MPP_ENC_SCENE_MODE_BUTT, 
 | 
} MppEncSceneMode; 
 | 
  
 | 
typedef enum MppEncFineTuneCfgChange_e { 
 | 
    /* change on scene mode */ 
 | 
    MPP_ENC_TUNE_CFG_CHANGE_SCENE_MODE      = (1 << 0), 
 | 
} MppEncFineTuneCfgChange; 
 | 
  
 | 
typedef struct MppEncFineTuneCfg_t { 
 | 
    RK_U32              change; 
 | 
  
 | 
    MppEncSceneMode     scene_mode; 
 | 
} MppEncFineTuneCfg; 
 | 
  
 | 
#endif /*__RK_VENC_CMD_H__*/ 
 |