xref: /aosp_15_r20/external/libhevc/encoder/ihevce_rc_interface.h (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar  *
5*c83a76b0SSuyog Pawar  * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar  * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar  * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar  *
9*c83a76b0SSuyog Pawar  * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar  *
11*c83a76b0SSuyog Pawar  * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar  * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar  * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar  * limitations under the License.
16*c83a76b0SSuyog Pawar  *
17*c83a76b0SSuyog Pawar  *****************************************************************************
18*c83a76b0SSuyog Pawar  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar 
21*c83a76b0SSuyog Pawar /*!
22*c83a76b0SSuyog Pawar ******************************************************************************
23*c83a76b0SSuyog Pawar * \file ihevce_rc_interface.h
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * \brief
26*c83a76b0SSuyog Pawar *    This file contains interface defination of HEVC Rate control library
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * \date
29*c83a76b0SSuyog Pawar *    18/09/2012
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * \author
32*c83a76b0SSuyog Pawar *    Ittiam
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar ******************************************************************************/
35*c83a76b0SSuyog Pawar 
36*c83a76b0SSuyog Pawar #ifndef _IHEVCE_RC_INTERFACE_H_
37*c83a76b0SSuyog Pawar #define _IHEVCE_RC_INTERFACE_H_
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar #define ES_TO_PQ_FACTOR (1.0)
43*c83a76b0SSuyog Pawar 
44*c83a76b0SSuyog Pawar /*****************************************************************************/
45*c83a76b0SSuyog Pawar /* Function Macros                                                           */
46*c83a76b0SSuyog Pawar /*****************************************************************************/
47*c83a76b0SSuyog Pawar 
48*c83a76b0SSuyog Pawar /*****************************************************************************/
49*c83a76b0SSuyog Pawar /* Typedefs                                                                  */
50*c83a76b0SSuyog Pawar /*****************************************************************************/
51*c83a76b0SSuyog Pawar 
52*c83a76b0SSuyog Pawar /*****************************************************************************/
53*c83a76b0SSuyog Pawar /* Enums                                                                     */
54*c83a76b0SSuyog Pawar /*****************************************************************************/
55*c83a76b0SSuyog Pawar /*call type to distinguish call from enc/ preenc stage*/
56*c83a76b0SSuyog Pawar typedef enum
57*c83a76b0SSuyog Pawar {
58*c83a76b0SSuyog Pawar     ENC_GET_QP = 0,
59*c83a76b0SSuyog Pawar     PRE_ENC_GET_QP
60*c83a76b0SSuyog Pawar } IHEVCE_RC_CALL_TYPE;
61*c83a76b0SSuyog Pawar 
62*c83a76b0SSuyog Pawar /*****************************************************************************/
63*c83a76b0SSuyog Pawar /* Structure                                                                 */
64*c83a76b0SSuyog Pawar /*****************************************************************************/
65*c83a76b0SSuyog Pawar 
66*c83a76b0SSuyog Pawar /*****************************************************************************/
67*c83a76b0SSuyog Pawar /* Extern Variable Declarations                                              */
68*c83a76b0SSuyog Pawar /*****************************************************************************/
69*c83a76b0SSuyog Pawar 
70*c83a76b0SSuyog Pawar /*****************************************************************************/
71*c83a76b0SSuyog Pawar /* Extern Function Declarations                                              */
72*c83a76b0SSuyog Pawar /*****************************************************************************/
73*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_num_mem_recs(void);
74*c83a76b0SSuyog Pawar 
75*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_mem_recs(
76*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab,
77*c83a76b0SSuyog Pawar     ihevce_static_cfg_params_t *ps_init_prms,
78*c83a76b0SSuyog Pawar     WORD32 mem_space,
79*c83a76b0SSuyog Pawar     ihevce_sys_api_t *ps_sys_api);
80*c83a76b0SSuyog Pawar 
81*c83a76b0SSuyog Pawar void *ihevce_rc_mem_init(
82*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab,
83*c83a76b0SSuyog Pawar     ihevce_static_cfg_params_t *ps_init_prms,
84*c83a76b0SSuyog Pawar     WORD32 i4_bitrate_instance_id,
85*c83a76b0SSuyog Pawar     rc_quant_t *ps_rc_quant,
86*c83a76b0SSuyog Pawar     WORD32 i4_resolution_id,
87*c83a76b0SSuyog Pawar     WORD32 i4_look_ahead_frames_in_first_pass);
88*c83a76b0SSuyog Pawar 
89*c83a76b0SSuyog Pawar void ihevce_rc_init(
90*c83a76b0SSuyog Pawar     void *pv_ctxt,
91*c83a76b0SSuyog Pawar     ihevce_src_params_t *ps_run_time_src_param,
92*c83a76b0SSuyog Pawar     ihevce_tgt_params_t *ps_tgt_params,
93*c83a76b0SSuyog Pawar     rc_quant_t *ps_rc_quant,
94*c83a76b0SSuyog Pawar     ihevce_sys_api_t *ps_sys_api,
95*c83a76b0SSuyog Pawar     ihevce_lap_params_t *ps_lap_prms,
96*c83a76b0SSuyog Pawar     WORD32 i4_num_frame_parallel);
97*c83a76b0SSuyog Pawar 
98*c83a76b0SSuyog Pawar void ihevce_rc_update_pic_info(
99*c83a76b0SSuyog Pawar     void *pv_ctxt,
100*c83a76b0SSuyog Pawar     UWORD32 u4_total_bits_consumed,
101*c83a76b0SSuyog Pawar     UWORD32 u4_total_header_bits,
102*c83a76b0SSuyog Pawar     UWORD32 u4_frame_sad,
103*c83a76b0SSuyog Pawar     UWORD32 u4_frame_intra_sad,
104*c83a76b0SSuyog Pawar     IV_PICTURE_CODING_TYPE_T pic_type,
105*c83a76b0SSuyog Pawar     WORD32 i4_avg_frame_qp,
106*c83a76b0SSuyog Pawar     WORD32 i4_suppress_bpic_update,
107*c83a76b0SSuyog Pawar     WORD32 *pi4_qp_normalized_8x8_cu_sum,
108*c83a76b0SSuyog Pawar     WORD32 *pi4_8x8_cu_sum,
109*c83a76b0SSuyog Pawar     LWORD64 *pi8_sad_by_qscale,
110*c83a76b0SSuyog Pawar     ihevce_lap_output_params_t *ps_lap_out,
111*c83a76b0SSuyog Pawar     rc_lap_out_params_t *ps_rc_lap_out,
112*c83a76b0SSuyog Pawar     WORD32 i4_buf_id,
113*c83a76b0SSuyog Pawar     UWORD32 u4_open_loop_intra_sad,
114*c83a76b0SSuyog Pawar     LWORD64 i8_total_ssd_frame,
115*c83a76b0SSuyog Pawar     WORD32 i4_enc_frm_id);
116*c83a76b0SSuyog Pawar 
117*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_pic_quant(
118*c83a76b0SSuyog Pawar     void *pv_ctxt,
119*c83a76b0SSuyog Pawar     rc_lap_out_params_t *ps_rc_lap_out,
120*c83a76b0SSuyog Pawar     IHEVCE_RC_CALL_TYPE call_type,
121*c83a76b0SSuyog Pawar     WORD32 i4_enc_frm_id,
122*c83a76b0SSuyog Pawar     WORD32 i4_update_delay,
123*c83a76b0SSuyog Pawar     WORD32 *pi4_curr_bits_estimated);
124*c83a76b0SSuyog Pawar 
125*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_cu_quant(WORD32 i4_frame_qp, WORD32 i4_cu_size);
126*c83a76b0SSuyog Pawar 
127*c83a76b0SSuyog Pawar void ihevce_rc_update_cur_frm_intra_satd(
128*c83a76b0SSuyog Pawar     void *pv_ctxt, LWORD64 i8_cur_frm_intra_satd, WORD32 i4_enc_frm_id);
129*c83a76b0SSuyog Pawar 
130*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_mpeg2_qp(WORD32 i4_frame_qp, rc_quant_t *ps_rc_quant_ctxt);
131*c83a76b0SSuyog Pawar 
132*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_mpeg2_qp_q6(WORD32 i4_frame_qp, UWORD8 u1_bit_depth);
133*c83a76b0SSuyog Pawar 
134*c83a76b0SSuyog Pawar /*funtion top return hevce qp when input mpeg2 qp is in q6 format*/
135*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_hevce_qp_q6(WORD32 i4_frame_qp_q6, UWORD8 u1_bit_depth);
136*c83a76b0SSuyog Pawar 
137*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_hevce_qp_q3(WORD32 i4_frame_qp, UWORD8 u1_bit_depth);
138*c83a76b0SSuyog Pawar 
139*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_scaled_hevc_qp_from_qs_q3(WORD32 i4_frame_qs_q3, rc_quant_t *ps_rc_quant_ctxt);
140*c83a76b0SSuyog Pawar 
141*c83a76b0SSuyog Pawar /* Functions dependent on lap input*/
142*c83a76b0SSuyog Pawar WORD32 ihevce_rc_lap_get_scene_type(rc_lap_out_params_t *ps_rc_lap_out);
143*c83a76b0SSuyog Pawar 
144*c83a76b0SSuyog Pawar /*funciton that calculates scene change qp based on offline stat*/
145*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_new_scene_qp(
146*c83a76b0SSuyog Pawar     WORD32 i4_est_texture_bits,
147*c83a76b0SSuyog Pawar     LWORD64 i8_satd_by_act_accum,
148*c83a76b0SSuyog Pawar     WORD32 i4_variance,
149*c83a76b0SSuyog Pawar     WORD32 i4_num_pixel);
150*c83a76b0SSuyog Pawar /* Function to be called in entropy thread to account for error between rdopt bits
151*c83a76b0SSuyog Pawar     estimate and actual bits generated in entropy thread*/
152*c83a76b0SSuyog Pawar void ihevce_rc_rdopt_entropy_bit_correct(
153*c83a76b0SSuyog Pawar     void *pv_rc_ctxt, WORD32 i4_cur_entropy_consumption, WORD32 i4_cur_time_stamp_low);
154*c83a76b0SSuyog Pawar /*Funciton to get qp after L1 analysis using estimated L0 sadt/act so that L1 can happen with closer qp as that will be used by enc*/
155*c83a76b0SSuyog Pawar WORD32 ihevce_get_L0_est_satd_based_scd_qp(
156*c83a76b0SSuyog Pawar     void *pv_rc_ctxt,
157*c83a76b0SSuyog Pawar     rc_lap_out_params_t *ps_rc_lap_out,
158*c83a76b0SSuyog Pawar     LWORD64 i8_est_L0_satd_act,
159*c83a76b0SSuyog Pawar     float i_to_avg_rest_ratio);
160*c83a76b0SSuyog Pawar 
161*c83a76b0SSuyog Pawar /*Function to calculate L0 satd using L1 satd based on offline stat*/
162*c83a76b0SSuyog Pawar LWORD64 ihevce_get_L0_satd_based_on_L1(
163*c83a76b0SSuyog Pawar     LWORD64 i8_satd_by_act_L1, WORD32 i4_num_pixel, WORD32 i4_cur_q_scale);
164*c83a76b0SSuyog Pawar 
165*c83a76b0SSuyog Pawar /*Function to get qp for Lap-1 to get qp for L1 analysis*/
166*c83a76b0SSuyog Pawar WORD32 ihevce_rc_get_bpp_based_frame_qp(void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out);
167*c83a76b0SSuyog Pawar 
168*c83a76b0SSuyog Pawar /*L1 data is registred so that L1 qp can be computed assuming previous frame data*/
169*c83a76b0SSuyog Pawar void ihevce_rc_register_L1_analysis_data(
170*c83a76b0SSuyog Pawar     void *pv_rc_ctxt,
171*c83a76b0SSuyog Pawar     rc_lap_out_params_t *ps_rc_lap_out,
172*c83a76b0SSuyog Pawar     LWORD64 i8_est_L0_satd_by_act,
173*c83a76b0SSuyog Pawar     LWORD64 i8_pre_intra_sad,
174*c83a76b0SSuyog Pawar     LWORD64 i8_l1_hme_sad);
175*c83a76b0SSuyog Pawar 
176*c83a76b0SSuyog Pawar /*populates qp for future frames for all possible pic type*/
177*c83a76b0SSuyog Pawar void ihevce_rc_cal_pre_enc_qp(void *pv_rc_ctxt);
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar WORD32 ihevce_rc_pre_enc_qp_query(
180*c83a76b0SSuyog Pawar     void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out, WORD32 i4_update_delay);
181*c83a76b0SSuyog Pawar /*In flush mode L0 IPE has to wait till encoder populates pre-enc*/
182*c83a76b0SSuyog Pawar /*THIS FUNCTION IS MEANT TO BE CALLED WITHOUT MUTEX LOCK*/
183*c83a76b0SSuyog Pawar WORD32 ihevce_rc_check_is_pre_enc_qp_valid(void *pv_rc_ctxt, volatile WORD32 *pi4_force_end_flag);
184*c83a76b0SSuyog Pawar 
185*c83a76b0SSuyog Pawar float ihevce_get_i_to_avg_ratio(
186*c83a76b0SSuyog Pawar     void *pv_rc_ctxt,
187*c83a76b0SSuyog Pawar     rc_lap_out_params_t *ps_rc_lap_out,
188*c83a76b0SSuyog Pawar     WORD32 i_to_p_qp_offset,
189*c83a76b0SSuyog Pawar     WORD32 i4_offset_flag,
190*c83a76b0SSuyog Pawar     WORD32 i4_call_type,
191*c83a76b0SSuyog Pawar     WORD32 ai4_qp_offsets[4],
192*c83a76b0SSuyog Pawar     WORD32 i4_update_delay);
193*c83a76b0SSuyog Pawar 
194*c83a76b0SSuyog Pawar /*funtion to detect scene change inside LAP*/
195*c83a76b0SSuyog Pawar void ihevce_rc_check_non_lap_scd(void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out);
196*c83a76b0SSuyog Pawar 
197*c83a76b0SSuyog Pawar void ihevce_get_dbf_buffer_size(
198*c83a76b0SSuyog Pawar     void *pv_rc_ctxt, UWORD32 *pi4_buffer_size, UWORD32 *pi4_dbf, UWORD32 *pi4_bit_rate);
199*c83a76b0SSuyog Pawar 
200*c83a76b0SSuyog Pawar void ihevce_vbv_compliance_frame_level_update(
201*c83a76b0SSuyog Pawar     void *pv_rc_ctxt,
202*c83a76b0SSuyog Pawar     WORD32 i4_bits_generated,
203*c83a76b0SSuyog Pawar     WORD32 i4_resolution_id,
204*c83a76b0SSuyog Pawar     WORD32 i4_appln_bitrate_inst,
205*c83a76b0SSuyog Pawar     UWORD32 u4_cur_cpb_removal_delay_minus1);
206*c83a76b0SSuyog Pawar 
207*c83a76b0SSuyog Pawar void ihevce_vbv_complaince_init_level(void *pv_ctxt, vui_t *ps_vui);
208*c83a76b0SSuyog Pawar 
209*c83a76b0SSuyog Pawar void ihevce_rc_register_dyn_change_bitrate(
210*c83a76b0SSuyog Pawar     void *pv_ctxt, LWORD64 i8_new_bitrate, LWORD64 i8_new_peak_bitrate);
211*c83a76b0SSuyog Pawar LWORD64 ihevce_rc_get_new_bitrate(void *pv_ctxt);
212*c83a76b0SSuyog Pawar 
213*c83a76b0SSuyog Pawar LWORD64 ihevce_rc_get_new_peak_bitrate(void *pv_ctxt);
214*c83a76b0SSuyog Pawar 
215*c83a76b0SSuyog Pawar LWORD64 ihevce_rc_change_avg_bitrate(void *pv_ctxt);
216*c83a76b0SSuyog Pawar 
217*c83a76b0SSuyog Pawar LWORD64 ihevce_rc_change_rate_factor(void *pv_ctxt);
218*c83a76b0SSuyog Pawar 
219*c83a76b0SSuyog Pawar void get_avg_bitrate_bufsize(void *pv_ctxt, LWORD64 *pi8_bitrate, LWORD64 *pi8_ebf);
220*c83a76b0SSuyog Pawar 
221*c83a76b0SSuyog Pawar void change_bitrate_vbv_complaince(void *pv_ctxt, LWORD64 i8_new_bitrate, LWORD64 i8_buffer_size);
222*c83a76b0SSuyog Pawar 
223*c83a76b0SSuyog Pawar void ihevce_compute_temporal_complexity_reset_Kp_Kb(
224*c83a76b0SSuyog Pawar     rc_lap_out_params_t *ps_rc_lap_out, void *pv_rc_ctxt, WORD32 i4_Kp_Kb_reset_flag);
225*c83a76b0SSuyog Pawar 
226*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
227*c83a76b0SSuyog Pawar void ihevce_rc_interface_update(
228*c83a76b0SSuyog Pawar     void *pv_ctxt,
229*c83a76b0SSuyog Pawar     IV_PICTURE_CODING_TYPE_T pic_type,
230*c83a76b0SSuyog Pawar     rc_lap_out_params_t *ps_rc_lap_out,
231*c83a76b0SSuyog Pawar     WORD32 i4_avg_frame_hevc_qp,
232*c83a76b0SSuyog Pawar     WORD32 i4_enc_frm_id);
233*c83a76b0SSuyog Pawar 
234*c83a76b0SSuyog Pawar void ihevce_rc_store_retrive_update_info(
235*c83a76b0SSuyog Pawar     void *pv_ctxt,
236*c83a76b0SSuyog Pawar     rc_bits_sad_t *ps_rc_frame_stat,
237*c83a76b0SSuyog Pawar     WORD32 i4_enc_frm_id,
238*c83a76b0SSuyog Pawar     WORD32 bit_rate_id,
239*c83a76b0SSuyog Pawar     WORD32 i4_store_retrive,
240*c83a76b0SSuyog Pawar     WORD32 *pout_buf_id,
241*c83a76b0SSuyog Pawar     WORD32 *pi4_pic_type,
242*c83a76b0SSuyog Pawar     WORD32 *pcur_qp,
243*c83a76b0SSuyog Pawar     void *ps_lap_out,
244*c83a76b0SSuyog Pawar     void *ps_rc_lap_out);
245*c83a76b0SSuyog Pawar 
246*c83a76b0SSuyog Pawar void ihevce_set_L0_scd_qp(void *pv_rc_ctxt, WORD32 i4_scd_qp);
247*c83a76b0SSuyog Pawar 
248*c83a76b0SSuyog Pawar void rc_set_gop_inter_complexity(void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out);
249*c83a76b0SSuyog Pawar 
250*c83a76b0SSuyog Pawar void rc_set_subgop_inter_complexity(void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out);
251*c83a76b0SSuyog Pawar 
252*c83a76b0SSuyog Pawar void rc_set_gop_complexity_for_bit_allocation(void *pv_rc_ctxt, rc_lap_out_params_t *ps_rc_lap_out);
253*c83a76b0SSuyog Pawar 
254*c83a76b0SSuyog Pawar float rc_get_buffer_level_unclip(void *pv_rc_ctxt);
255*c83a76b0SSuyog Pawar 
256*c83a76b0SSuyog Pawar void ihevce_rc_populate_common_params(
257*c83a76b0SSuyog Pawar     ihevce_lap_output_params_t *ps_lap_out, rc_lap_out_params_t *ps_rc_lap_out);
258*c83a76b0SSuyog Pawar #endif
259