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