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