1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * Copyright 2017 Rockchip Electronics Co. LTD 3*437bfbebSnyanmisaka * 4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 6*437bfbebSnyanmisaka * You may obtain a copy of the License at 7*437bfbebSnyanmisaka * 8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 9*437bfbebSnyanmisaka * 10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 14*437bfbebSnyanmisaka * limitations under the License. 15*437bfbebSnyanmisaka */ 16*437bfbebSnyanmisaka 17*437bfbebSnyanmisaka #ifndef __HAL_H264E_VEPU_V2_H__ 18*437bfbebSnyanmisaka #define __HAL_H264E_VEPU_V2_H__ 19*437bfbebSnyanmisaka 20*437bfbebSnyanmisaka #include "mpp_enc_cfg.h" 21*437bfbebSnyanmisaka #include "mpp_rc.h" 22*437bfbebSnyanmisaka #include "vepu_common.h" 23*437bfbebSnyanmisaka 24*437bfbebSnyanmisaka #define H264E_HAL_SET_REG(reg, addr, val) \ 25*437bfbebSnyanmisaka do { \ 26*437bfbebSnyanmisaka reg[(addr)>>2] = (RK_U32)(val); \ 27*437bfbebSnyanmisaka if (hal_h264e_debug & 0/*H264E_HAL_LOG_INFO*/) \ 28*437bfbebSnyanmisaka mpp_log("line(%d) set reg[%03d/%03x]: %08x", __LINE__, (addr)>>2, addr, val); \ 29*437bfbebSnyanmisaka } while (0) 30*437bfbebSnyanmisaka 31*437bfbebSnyanmisaka typedef enum H264eVpuFrameType_t { 32*437bfbebSnyanmisaka H264E_VPU_FRAME_P = 0, 33*437bfbebSnyanmisaka H264E_VPU_FRAME_I = 1 34*437bfbebSnyanmisaka } H264eVpuFrameType; 35*437bfbebSnyanmisaka 36*437bfbebSnyanmisaka #define VEPU_CTRL_LEVELS 7 37*437bfbebSnyanmisaka #define VEPU_CHECK_POINTS_MAX 10 38*437bfbebSnyanmisaka 39*437bfbebSnyanmisaka typedef struct HalH264eVepuInput_t { 40*437bfbebSnyanmisaka /* Hardware config format */ 41*437bfbebSnyanmisaka RK_S32 src_fmt; 42*437bfbebSnyanmisaka RK_S32 src_w; 43*437bfbebSnyanmisaka RK_S32 src_h; 44*437bfbebSnyanmisaka 45*437bfbebSnyanmisaka VepuStrideCfg stride_cfg; 46*437bfbebSnyanmisaka RK_S32 pixel_stride; 47*437bfbebSnyanmisaka 48*437bfbebSnyanmisaka size_t size_y; 49*437bfbebSnyanmisaka size_t size_c; 50*437bfbebSnyanmisaka 51*437bfbebSnyanmisaka RK_U32 offset_cb; 52*437bfbebSnyanmisaka RK_U32 offset_cr; 53*437bfbebSnyanmisaka 54*437bfbebSnyanmisaka RK_U8 r_mask_msb; 55*437bfbebSnyanmisaka RK_U8 g_mask_msb; 56*437bfbebSnyanmisaka RK_U8 b_mask_msb; 57*437bfbebSnyanmisaka RK_U8 swap_8_in; 58*437bfbebSnyanmisaka RK_U8 swap_16_in; 59*437bfbebSnyanmisaka RK_U8 swap_32_in; 60*437bfbebSnyanmisaka 61*437bfbebSnyanmisaka RK_U32 color_conversion_coeff_a; 62*437bfbebSnyanmisaka RK_U32 color_conversion_coeff_b; 63*437bfbebSnyanmisaka RK_U32 color_conversion_coeff_c; 64*437bfbebSnyanmisaka RK_U32 color_conversion_coeff_e; 65*437bfbebSnyanmisaka RK_U32 color_conversion_coeff_f; 66*437bfbebSnyanmisaka 67*437bfbebSnyanmisaka RK_U32 rotation; 68*437bfbebSnyanmisaka } HalH264eVepuPrep; 69*437bfbebSnyanmisaka 70*437bfbebSnyanmisaka typedef struct HalH264eVepuFrmAddr_t { 71*437bfbebSnyanmisaka // original frame Y/Cb/Cr/RGB address 72*437bfbebSnyanmisaka RK_U32 orig[3]; 73*437bfbebSnyanmisaka // reconstruction frame 74*437bfbebSnyanmisaka RK_U32 recn[2]; 75*437bfbebSnyanmisaka RK_U32 refr[2]; 76*437bfbebSnyanmisaka } HalH264eVepuAddr; 77*437bfbebSnyanmisaka 78*437bfbebSnyanmisaka /* 79*437bfbebSnyanmisaka * Vepu buffer allocater 80*437bfbebSnyanmisaka * There are three internal buffer for Vepu encoder: 81*437bfbebSnyanmisaka * 1. cabac table input buffer 82*437bfbebSnyanmisaka * 2. nal size table output buffer 83*437bfbebSnyanmisaka * 3. recon / refer frame buffer 84*437bfbebSnyanmisaka */ 85*437bfbebSnyanmisaka typedef struct HalH264eVepuBufs_t { 86*437bfbebSnyanmisaka MppBufferGroup group; 87*437bfbebSnyanmisaka 88*437bfbebSnyanmisaka /* cabac table buffer */ 89*437bfbebSnyanmisaka RK_S32 cabac_init_idc; 90*437bfbebSnyanmisaka MppBuffer cabac_table; 91*437bfbebSnyanmisaka 92*437bfbebSnyanmisaka /* 93*437bfbebSnyanmisaka * nal size table buffer 94*437bfbebSnyanmisaka * table size must be 64-bit multiple, space for zero at the end of table 95*437bfbebSnyanmisaka * Atleast 1 macroblock row in every slice 96*437bfbebSnyanmisaka */ 97*437bfbebSnyanmisaka RK_S32 mb_h; 98*437bfbebSnyanmisaka RK_S32 nal_tab_size; 99*437bfbebSnyanmisaka MppBuffer nal_size_table; 100*437bfbebSnyanmisaka 101*437bfbebSnyanmisaka /* 102*437bfbebSnyanmisaka * recon / refer frame buffer 103*437bfbebSnyanmisaka * sync with encoder using slot index 104*437bfbebSnyanmisaka */ 105*437bfbebSnyanmisaka size_t frm_size; 106*437bfbebSnyanmisaka size_t yuv_size; 107*437bfbebSnyanmisaka RK_S32 frm_cnt; 108*437bfbebSnyanmisaka MppBuffer frm_buf[H264E_MAX_REFS_CNT + 1]; 109*437bfbebSnyanmisaka } HalH264eVepuBufs; 110*437bfbebSnyanmisaka 111*437bfbebSnyanmisaka typedef struct HalH264eVepuMbRc_t { 112*437bfbebSnyanmisaka /* VEPU MB rate control parameter for config to hardware */ 113*437bfbebSnyanmisaka RK_S32 qp_init; 114*437bfbebSnyanmisaka RK_S32 qp_min; 115*437bfbebSnyanmisaka RK_S32 qp_max; 116*437bfbebSnyanmisaka 117*437bfbebSnyanmisaka /* 118*437bfbebSnyanmisaka * VEPU MB can have max 10 check points (cp). 119*437bfbebSnyanmisaka * 120*437bfbebSnyanmisaka * On each check point hardware will check the target bit and 121*437bfbebSnyanmisaka * error bits and change qp according to delta qp step 122*437bfbebSnyanmisaka * 123*437bfbebSnyanmisaka * cp_distance_mbs check point distance in mbs (0 = disabled) 124*437bfbebSnyanmisaka * cp_target bitrate target at each check point 125*437bfbebSnyanmisaka * cp_error error bit level step for each delta qp 126*437bfbebSnyanmisaka * cp_delta_qp delta qp applied on when on bit rate error amount 127*437bfbebSnyanmisaka */ 128*437bfbebSnyanmisaka RK_S32 cp_distance_mbs; 129*437bfbebSnyanmisaka RK_S32 cp_target[VEPU_CHECK_POINTS_MAX]; 130*437bfbebSnyanmisaka RK_S32 cp_error[VEPU_CTRL_LEVELS]; 131*437bfbebSnyanmisaka RK_S32 cp_delta_qp[VEPU_CTRL_LEVELS]; 132*437bfbebSnyanmisaka 133*437bfbebSnyanmisaka /* 134*437bfbebSnyanmisaka * MAD based QP adjustment 135*437bfbebSnyanmisaka * mad_qp_change [-8..7] 136*437bfbebSnyanmisaka * mad_threshold MAD threshold div256 137*437bfbebSnyanmisaka */ 138*437bfbebSnyanmisaka RK_S32 mad_qp_change; 139*437bfbebSnyanmisaka RK_S32 mad_threshold; 140*437bfbebSnyanmisaka 141*437bfbebSnyanmisaka /* slice split by mb row (0 = one slice) */ 142*437bfbebSnyanmisaka RK_S32 slice_size_mb_rows; 143*437bfbebSnyanmisaka 144*437bfbebSnyanmisaka /* favor and penalty for mode decision */ 145*437bfbebSnyanmisaka 146*437bfbebSnyanmisaka /* 147*437bfbebSnyanmisaka * VEPU MB rate control parameter which is read from hardware 148*437bfbebSnyanmisaka * out_strm_size output stream size (bits) 149*437bfbebSnyanmisaka * qp_sum QP Sum div2 output 150*437bfbebSnyanmisaka * rlc_count RLC codeword count div4 output max 255*255*384/4 151*437bfbebSnyanmisaka */ 152*437bfbebSnyanmisaka RK_U32 hdr_strm_size; 153*437bfbebSnyanmisaka RK_U32 hdr_free_size; 154*437bfbebSnyanmisaka RK_U32 out_strm_size; 155*437bfbebSnyanmisaka RK_S32 qp_sum; 156*437bfbebSnyanmisaka RK_S32 rlc_count; 157*437bfbebSnyanmisaka 158*437bfbebSnyanmisaka RK_S32 cp_usage[VEPU_CHECK_POINTS_MAX]; 159*437bfbebSnyanmisaka /* Macroblock count with MAD value under threshold output */ 160*437bfbebSnyanmisaka RK_S32 less_mad_count; 161*437bfbebSnyanmisaka /* MB count output */ 162*437bfbebSnyanmisaka RK_S32 mb_count; 163*437bfbebSnyanmisaka 164*437bfbebSnyanmisaka /* hardware encoding status 0 - corret 1 - error */ 165*437bfbebSnyanmisaka RK_U32 hw_status; 166*437bfbebSnyanmisaka } HalH264eVepuMbRc; 167*437bfbebSnyanmisaka 168*437bfbebSnyanmisaka typedef void *HalH264eVepuMbRcCtx; 169*437bfbebSnyanmisaka 170*437bfbebSnyanmisaka 171*437bfbebSnyanmisaka 172*437bfbebSnyanmisaka #ifdef __cplusplus 173*437bfbebSnyanmisaka extern "C" { 174*437bfbebSnyanmisaka #endif 175*437bfbebSnyanmisaka 176*437bfbebSnyanmisaka RK_S32 exp_golomb_signed(RK_S32 val); 177*437bfbebSnyanmisaka 178*437bfbebSnyanmisaka /* buffer management function */ 179*437bfbebSnyanmisaka MPP_RET h264e_vepu_buf_init(HalH264eVepuBufs *bufs); 180*437bfbebSnyanmisaka MPP_RET h264e_vepu_buf_deinit(HalH264eVepuBufs *bufs); 181*437bfbebSnyanmisaka 182*437bfbebSnyanmisaka MPP_RET h264e_vepu_buf_set_cabac_idc(HalH264eVepuBufs *bufs, RK_S32 idc); 183*437bfbebSnyanmisaka MPP_RET h264e_vepu_buf_set_frame_size(HalH264eVepuBufs *bufs, RK_S32 w, RK_S32 h); 184*437bfbebSnyanmisaka 185*437bfbebSnyanmisaka MppBuffer h264e_vepu_buf_get_nal_size_table(HalH264eVepuBufs *bufs); 186*437bfbebSnyanmisaka MppBuffer h264e_vepu_buf_get_frame_buffer(HalH264eVepuBufs *bufs, RK_S32 index); 187*437bfbebSnyanmisaka 188*437bfbebSnyanmisaka /* preprocess setup function */ 189*437bfbebSnyanmisaka MPP_RET h264e_vepu_prep_setup(HalH264eVepuPrep *prep, MppEncPrepCfg *cfg); 190*437bfbebSnyanmisaka MPP_RET h264e_vepu_prep_get_addr(HalH264eVepuPrep *prep, MppBuffer buffer, 191*437bfbebSnyanmisaka RK_U32 (*addr)[3]); 192*437bfbebSnyanmisaka 193*437bfbebSnyanmisaka /* macroblock bitrate control function */ 194*437bfbebSnyanmisaka MPP_RET h264e_vepu_mbrc_init(HalH264eVepuMbRcCtx *ctx, HalH264eVepuMbRc *mbrc); 195*437bfbebSnyanmisaka MPP_RET h264e_vepu_mbrc_deinit(HalH264eVepuMbRcCtx ctx); 196*437bfbebSnyanmisaka 197*437bfbebSnyanmisaka MPP_RET h264e_vepu_mbrc_setup(HalH264eVepuMbRcCtx ctx, MppEncCfgSet *cfg); 198*437bfbebSnyanmisaka MPP_RET h264e_vepu_slice_split_cfg(H264eSlice *slice, HalH264eVepuMbRc *mbrc, 199*437bfbebSnyanmisaka EncRcTask *rc_task, MppEncCfgSet *set_cfg); 200*437bfbebSnyanmisaka 201*437bfbebSnyanmisaka /* 202*437bfbebSnyanmisaka * generate hardware MB rc config by: 203*437bfbebSnyanmisaka * 1 - HalH264eVepuMbRcCtx ctx 204*437bfbebSnyanmisaka * The previous frame encoding status 205*437bfbebSnyanmisaka * 2 - RcSyntax 206*437bfbebSnyanmisaka * Provide current frame target bitrate related info 207*437bfbebSnyanmisaka * 3 - EncFrmStatus 208*437bfbebSnyanmisaka * Provide dpb related info like I / P frame, temporal id, refer distance 209*437bfbebSnyanmisaka * 210*437bfbebSnyanmisaka * Then output the HalH264eVepuMbRc for register generation 211*437bfbebSnyanmisaka */ 212*437bfbebSnyanmisaka MPP_RET h264e_vepu_mbrc_prepare(HalH264eVepuMbRcCtx ctx, HalH264eVepuMbRc *mbrc, 213*437bfbebSnyanmisaka EncRcTask *rc_task); 214*437bfbebSnyanmisaka MPP_RET h264e_vepu_mbrc_update(HalH264eVepuMbRcCtx ctx, HalH264eVepuMbRc *mbrc); 215*437bfbebSnyanmisaka 216*437bfbebSnyanmisaka #ifdef __cplusplus 217*437bfbebSnyanmisaka } 218*437bfbebSnyanmisaka #endif 219*437bfbebSnyanmisaka 220*437bfbebSnyanmisaka #endif 221