xref: /rockchip-linux_mpp/mpp/hal/vpu/h264e/hal_h264e_vepu_v2.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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