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 * \file rate_control_api.c
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar * This file contain rate control API functions
26*c83a76b0SSuyog Pawar *
27*c83a76b0SSuyog Pawar * \date
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * \author
30*c83a76b0SSuyog Pawar * ittiam
31*c83a76b0SSuyog Pawar *
32*c83a76b0SSuyog Pawar ******************************************************************************
33*c83a76b0SSuyog Pawar */
34*c83a76b0SSuyog Pawar /*****************************************************************************/
35*c83a76b0SSuyog Pawar /* File Includes */
36*c83a76b0SSuyog Pawar /*****************************************************************************/
37*c83a76b0SSuyog Pawar /* System include files */
38*c83a76b0SSuyog Pawar #include <stdio.h>
39*c83a76b0SSuyog Pawar #include <stdlib.h>
40*c83a76b0SSuyog Pawar #include <string.h>
41*c83a76b0SSuyog Pawar #include <assert.h>
42*c83a76b0SSuyog Pawar #include <math.h>
43*c83a76b0SSuyog Pawar
44*c83a76b0SSuyog Pawar /* User include files */
45*c83a76b0SSuyog Pawar #include "ittiam_datatypes.h"
46*c83a76b0SSuyog Pawar /* Lower module include files. These inclusion can be removed by having
47*c83a76b0SSuyog Pawar fwd declaration for each and every module*/
48*c83a76b0SSuyog Pawar #include "rc_common.h"
49*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
50*c83a76b0SSuyog Pawar #include "mem_req_and_acq.h"
51*c83a76b0SSuyog Pawar #include "var_q_operator.h"
52*c83a76b0SSuyog Pawar #include "rc_rd_model.h"
53*c83a76b0SSuyog Pawar #include "est_sad.h"
54*c83a76b0SSuyog Pawar #include "fixed_point_error_bits.h"
55*c83a76b0SSuyog Pawar #include "vbr_storage_vbv.h"
56*c83a76b0SSuyog Pawar #include "picture_type.h"
57*c83a76b0SSuyog Pawar #include "cbr_buffer_control.h"
58*c83a76b0SSuyog Pawar #include "bit_allocation.h"
59*c83a76b0SSuyog Pawar #include "mb_model_based.h"
60*c83a76b0SSuyog Pawar #include "vbr_str_prms.h"
61*c83a76b0SSuyog Pawar #include "init_qp.h"
62*c83a76b0SSuyog Pawar #include "rc_sad_acc.h"
63*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
64*c83a76b0SSuyog Pawar #include "rate_control_api.h"
65*c83a76b0SSuyog Pawar #include "rate_control_api_structs.h"
66*c83a76b0SSuyog Pawar #include "trace_support.h"
67*c83a76b0SSuyog Pawar
68*c83a76b0SSuyog Pawar /** Macros **/
69*c83a76b0SSuyog Pawar #define MIN(x, y) ((x) < (y)) ? (x) : (y)
70*c83a76b0SSuyog Pawar #define MAX(x, y) ((x) < (y)) ? (y) : (x)
71*c83a76b0SSuyog Pawar #define CLIP3RC(x, min, max) (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x)))
72*c83a76b0SSuyog Pawar
73*c83a76b0SSuyog Pawar #define DEV_Q 4 /*Q format(Shift) for Deviation range factor */
74*c83a76b0SSuyog Pawar #define HI_DEV_FCTR 26 //23//32 /* 1.4*16 */
75*c83a76b0SSuyog Pawar #define LO_DEV_B_FCTR 10 //temp change to avoid stuffing12 /* 0.75*16 */
76*c83a76b0SSuyog Pawar #define LO_DEV_FCTR_1B 14 //8 /* 0.75*16 */
77*c83a76b0SSuyog Pawar //#define LO_DEV_FCTR_7B 10//8 /* 0.75*16 */
78*c83a76b0SSuyog Pawar #define LO_DEV_FCTR_3B 12 //8 /* 0.75*16 */
79*c83a76b0SSuyog Pawar #define LO_DEV_FCTR_7B 12 //8 /* 0.75*16 */
80*c83a76b0SSuyog Pawar #define GET_HI_DEV_QP(Qprev) ((((WORD32)Qprev) * HI_DEV_FCTR + (1 << (DEV_Q - 1))) >> DEV_Q)
81*c83a76b0SSuyog Pawar
82*c83a76b0SSuyog Pawar #define GET_LO_DEV_QP(Qprev, i4_num_active_pic_types)((i4_num_active_pic_types <= B1_PIC)?(((((WORD32) Qprev)*LO_DEV_FCTR_1B + (1<<(DEV_Q-1)))>>DEV_Q): \
83*c83a76b0SSuyog Pawar ((i4_num_active_pic_types == B2_PIC)? ((((WORD32) Qprev)*LO_DEV_FCTR_3B + (1<<(DEV_Q-1)))>>DEV_Q) \
84*c83a76b0SSuyog Pawar ((((WORD32) Qprev)*LO_DEV_FCTR_7B + (1<<(DEV_Q-1)))>>DEV_Q))))
85*c83a76b0SSuyog Pawar
86*c83a76b0SSuyog Pawar #define GET_LO_DEV_QP_B(Qprev) ((((WORD32)Qprev) * LO_DEV_B_FCTR + (1 << (DEV_Q - 1))) >> DEV_Q)
87*c83a76b0SSuyog Pawar #define CLIP_QP(Qc, hi_d, lo_d) (((Qc) < (lo_d)) ? ((lo_d)) : (((Qc) > (hi_d)) ? (hi_d) : (Qc)))
88*c83a76b0SSuyog Pawar
89*c83a76b0SSuyog Pawar /*below macors are used when qp is already in q format so adding 0.5 for rounding is not required*/
90*c83a76b0SSuyog Pawar #define GET_HI_DEV_QP_QFAC(Qprev) ((((WORD32)Qprev) * HI_DEV_FCTR) >> DEV_Q)
91*c83a76b0SSuyog Pawar #define GET_LO_DEV_QP_QFAC(Qprev, i4_num_active_pic_types) \
92*c83a76b0SSuyog Pawar ((i4_num_active_pic_types <= B1_PIC) \
93*c83a76b0SSuyog Pawar ? ((((WORD32)Qprev) * LO_DEV_FCTR_1B) >> DEV_Q) \
94*c83a76b0SSuyog Pawar : ((i4_num_active_pic_types == B2_PIC) ? ((((WORD32)Qprev) * LO_DEV_FCTR_3B) >> DEV_Q) \
95*c83a76b0SSuyog Pawar : ((((WORD32)Qprev) * LO_DEV_FCTR_7B) >> DEV_Q)))
96*c83a76b0SSuyog Pawar
97*c83a76b0SSuyog Pawar #define GET_LO_DEV_QP_QFAC_B_PIC(Qprev) ((((WORD32)Qprev) * LO_DEV_FCTR_3B) >> DEV_Q)
98*c83a76b0SSuyog Pawar
99*c83a76b0SSuyog Pawar #define GET_LO_DEV_QP_B_QFAC(Qprev) ((((WORD32)Qprev) * LO_DEV_B_FCTR) >> DEV_Q)
100*c83a76b0SSuyog Pawar
101*c83a76b0SSuyog Pawar #define P_TO_I_RATIO_Q_FACTOR (9)
102*c83a76b0SSuyog Pawar #define MULT_FACTOR_SATD (4)
103*c83a76b0SSuyog Pawar #define GET_L0_SATD_BY_ACT_MAX_PER_PIXEL(i4_num_pixel) \
104*c83a76b0SSuyog Pawar ((5.4191f * i4_num_pixel + 4000000.0f) / i4_num_pixel)
105*c83a76b0SSuyog Pawar #define GET_WEIGH_FACTOR_FOR_MIN_SCD_Q_SCALE(normal_satd_act, f_satd_by_Act_norm) \
106*c83a76b0SSuyog Pawar (MULT_FACTOR_SATD * normal_satd_act + f_satd_by_Act_norm) / \
107*c83a76b0SSuyog Pawar (normal_satd_act + MULT_FACTOR_SATD * f_satd_by_Act_norm)
108*c83a76b0SSuyog Pawar
109*c83a76b0SSuyog Pawar void SET_NETRA_TRACE(UWORD8 tag[], WORD32 value);
110*c83a76b0SSuyog Pawar #define NETRA_TRACE (0)
111*c83a76b0SSuyog Pawar #if NETRA_TRACE
112*c83a76b0SSuyog Pawar #else
113*c83a76b0SSuyog Pawar #define SET_NETRA_TRACE(x, y)
114*c83a76b0SSuyog Pawar #endif
115*c83a76b0SSuyog Pawar
116*c83a76b0SSuyog Pawar /*****************************************************************************/
117*c83a76b0SSuyog Pawar /* Restricts the quantisation parameter variation within delta */
118*c83a76b0SSuyog Pawar /*****************************************************************************/
119*c83a76b0SSuyog Pawar /* static WORD32 restrict_swing(WORD32 cur_qp, WORD32 prev_qp, WORD32 delta_qp)
120*c83a76b0SSuyog Pawar {
121*c83a76b0SSuyog Pawar if((cur_qp) - (prev_qp) > (delta_qp)) (cur_qp) = (prev_qp) + (delta_qp) ;
122*c83a76b0SSuyog Pawar if((prev_qp) - (cur_qp) > (delta_qp)) (cur_qp) = (prev_qp) - (delta_qp) ;
123*c83a76b0SSuyog Pawar return cur_qp;
124*c83a76b0SSuyog Pawar }*/
125*c83a76b0SSuyog Pawar
126*c83a76b0SSuyog Pawar /*****************************************************************************
127*c83a76b0SSuyog Pawar Function Name : rate_control_get_init_free_memtab
128*c83a76b0SSuyog Pawar Description : Takes or gives memtab
129*c83a76b0SSuyog Pawar Inputs : pps_rate_control_api - pointer to RC api pointer
130*c83a76b0SSuyog Pawar ps_memtab - Memtab pointer
131*c83a76b0SSuyog Pawar i4_use_base - Set during init, else 0
132*c83a76b0SSuyog Pawar i4_fill_base - Set during free, else 0
133*c83a76b0SSuyog Pawar Globals :
134*c83a76b0SSuyog Pawar Processing :
135*c83a76b0SSuyog Pawar Outputs :
136*c83a76b0SSuyog Pawar Returns :
137*c83a76b0SSuyog Pawar Issues :
138*c83a76b0SSuyog Pawar Revision History:
139*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
140*c83a76b0SSuyog Pawar
141*c83a76b0SSuyog Pawar *****************************************************************************/
142*c83a76b0SSuyog Pawar #if NON_STEADSTATE_CODE
rate_control_num_fill_use_free_memtab(rate_control_handle * pps_rate_control_api,itt_memtab_t * ps_memtab,ITT_FUNC_TYPE_E e_func_type)143*c83a76b0SSuyog Pawar WORD32 rate_control_num_fill_use_free_memtab(
144*c83a76b0SSuyog Pawar rate_control_handle *pps_rate_control_api, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type)
145*c83a76b0SSuyog Pawar {
146*c83a76b0SSuyog Pawar WORD32 i4_mem_tab_idx = 0, i;
147*c83a76b0SSuyog Pawar static rate_control_api_t s_temp_rc_api;
148*c83a76b0SSuyog Pawar
149*c83a76b0SSuyog Pawar /* Hack for al alloc, during which we dont have any state memory.
150*c83a76b0SSuyog Pawar Dereferencing can cause issues */
151*c83a76b0SSuyog Pawar if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
152*c83a76b0SSuyog Pawar (*pps_rate_control_api) = &s_temp_rc_api;
153*c83a76b0SSuyog Pawar
154*c83a76b0SSuyog Pawar /*for src rate control state structure*/
155*c83a76b0SSuyog Pawar if(e_func_type != GET_NUM_MEMTAB)
156*c83a76b0SSuyog Pawar {
157*c83a76b0SSuyog Pawar fill_memtab(
158*c83a76b0SSuyog Pawar &ps_memtab[i4_mem_tab_idx],
159*c83a76b0SSuyog Pawar sizeof(rate_control_api_t),
160*c83a76b0SSuyog Pawar MEM_TAB_ALIGNMENT,
161*c83a76b0SSuyog Pawar PERSISTENT,
162*c83a76b0SSuyog Pawar DDR);
163*c83a76b0SSuyog Pawar use_or_fill_base(&ps_memtab[0], (void **)pps_rate_control_api, e_func_type);
164*c83a76b0SSuyog Pawar }
165*c83a76b0SSuyog Pawar i4_mem_tab_idx++;
166*c83a76b0SSuyog Pawar
167*c83a76b0SSuyog Pawar /* Get the memory requirement of lower modules */
168*c83a76b0SSuyog Pawar i4_mem_tab_idx += bit_allocation_num_fill_use_free_memtab(
169*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->ps_bit_allocation, &ps_memtab[i4_mem_tab_idx], e_func_type);
170*c83a76b0SSuyog Pawar
171*c83a76b0SSuyog Pawar i4_mem_tab_idx += cbr_buffer_num_fill_use_free_memtab(
172*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->ps_cbr_buffer, &ps_memtab[i4_mem_tab_idx], e_func_type);
173*c83a76b0SSuyog Pawar
174*c83a76b0SSuyog Pawar i4_mem_tab_idx += est_sad_num_fill_use_free_memtab(
175*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->ps_est_sad, &ps_memtab[i4_mem_tab_idx], e_func_type);
176*c83a76b0SSuyog Pawar
177*c83a76b0SSuyog Pawar i4_mem_tab_idx += mbrc_num_fill_use_free_memtab(
178*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->ps_mb_rate_control, &ps_memtab[i4_mem_tab_idx], e_func_type);
179*c83a76b0SSuyog Pawar
180*c83a76b0SSuyog Pawar i4_mem_tab_idx += vbr_vbv_num_fill_use_free_memtab(
181*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->ps_vbr_storage_vbv, &ps_memtab[i4_mem_tab_idx], e_func_type);
182*c83a76b0SSuyog Pawar
183*c83a76b0SSuyog Pawar i4_mem_tab_idx += init_qp_num_fill_use_free_memtab(
184*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->ps_init_qp, &ps_memtab[i4_mem_tab_idx], e_func_type);
185*c83a76b0SSuyog Pawar
186*c83a76b0SSuyog Pawar i4_mem_tab_idx += sad_acc_num_fill_use_free_memtab(
187*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->ps_sad_acc, &ps_memtab[i4_mem_tab_idx], e_func_type);
188*c83a76b0SSuyog Pawar
189*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
190*c83a76b0SSuyog Pawar {
191*c83a76b0SSuyog Pawar i4_mem_tab_idx += rc_rd_model_num_fill_use_free_memtab(
192*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->aps_rd_model[i], &ps_memtab[i4_mem_tab_idx], e_func_type);
193*c83a76b0SSuyog Pawar }
194*c83a76b0SSuyog Pawar i4_mem_tab_idx += pic_handling_num_fill_use_free_memtab(
195*c83a76b0SSuyog Pawar &pps_rate_control_api[0]->ps_pic_handling, &ps_memtab[i4_mem_tab_idx], e_func_type);
196*c83a76b0SSuyog Pawar return (i4_mem_tab_idx);
197*c83a76b0SSuyog Pawar }
198*c83a76b0SSuyog Pawar
199*c83a76b0SSuyog Pawar /*****************************************************************************
200*c83a76b0SSuyog Pawar Function Name : initialise_rate_control
201*c83a76b0SSuyog Pawar Description : Initialise the rate control structure
202*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api - api struct
203*c83a76b0SSuyog Pawar e_rate_control_type - VBR, CBR (NLDRC/LDRC), VBR_STREAMING
204*c83a76b0SSuyog Pawar u1_is_mb_level_rc_on - enabling mb level RC
205*c83a76b0SSuyog Pawar u4_avg_bit_rate - bit rate to achieved across the entire file size
206*c83a76b0SSuyog Pawar u4_peak_bit_rate - max possible drain rate
207*c83a76b0SSuyog Pawar u4_frame_rate - number of frames in 1000 seconds
208*c83a76b0SSuyog Pawar u4_intra_frame_interval - num frames between two I frames
209*c83a76b0SSuyog Pawar *au1_init_qp - init_qp for I,P,B
210*c83a76b0SSuyog Pawar
211*c83a76b0SSuyog Pawar
212*c83a76b0SSuyog Pawar Globals :
213*c83a76b0SSuyog Pawar Processing :
214*c83a76b0SSuyog Pawar Outputs :
215*c83a76b0SSuyog Pawar Returns :
216*c83a76b0SSuyog Pawar Issues :
217*c83a76b0SSuyog Pawar Revision History:
218*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
219*c83a76b0SSuyog Pawar
220*c83a76b0SSuyog Pawar *****************************************************************************/
initialise_rate_control(rate_control_api_t * ps_rate_control_api,rc_type_e e_rate_control_type,UWORD8 u1_is_mb_level_rc_on,UWORD32 u4_avg_bit_rate,UWORD32 * pu4_peak_bit_rate,UWORD32 u4_min_bit_rate,UWORD32 u4_frame_rate,UWORD32 u4_max_delay,UWORD32 u4_intra_frame_interval,UWORD32 u4_idr_period,WORD32 * pi4_init_qp,UWORD32 u4_max_vbv_buff_size,WORD32 i4_max_inter_frm_int,WORD32 i4_is_gop_closed,WORD32 * pi4_min_max_qp,WORD32 i4_use_est_intra_sad,UWORD32 u4_src_ticks,UWORD32 u4_tgt_ticks,WORD32 i4_frame_height,WORD32 i4_frame_width,WORD32 i4_num_active_pic_type,WORD32 i4_field_pic,WORD32 i4_quality_preset,WORD32 i4_lap_window,WORD32 i4_initial_decoder_delay_frames,float f_max_peak_rate_sustain_dur,LWORD64 i8_num_frames_to_encode,UWORD32 u4_min_scd_hevc_qp,UWORD8 u1_bit_depth,FILE * pf_rc_stat_file,WORD32 i4_pass_num,void * pv_gop_stat,LWORD64 i8_num_gop_mem_alloc,WORD32 i4_is_infinite_gop,WORD32 i4_size_of_lap_out,WORD32 i4_size_of_rc_lap_out,void * pv_sys_rc_api,WORD32 i4_fp_bit_alloc_in_sp,WORD32 i4_num_frame_parallel,WORD32 i4_capped_vbr_flag)221*c83a76b0SSuyog Pawar void initialise_rate_control(
222*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
223*c83a76b0SSuyog Pawar rc_type_e e_rate_control_type,
224*c83a76b0SSuyog Pawar UWORD8 u1_is_mb_level_rc_on,
225*c83a76b0SSuyog Pawar UWORD32 u4_avg_bit_rate,
226*c83a76b0SSuyog Pawar UWORD32 *pu4_peak_bit_rate,
227*c83a76b0SSuyog Pawar UWORD32 u4_min_bit_rate,
228*c83a76b0SSuyog Pawar UWORD32 u4_frame_rate,
229*c83a76b0SSuyog Pawar UWORD32 u4_max_delay,
230*c83a76b0SSuyog Pawar UWORD32 u4_intra_frame_interval,
231*c83a76b0SSuyog Pawar UWORD32 u4_idr_period,
232*c83a76b0SSuyog Pawar WORD32 *pi4_init_qp,
233*c83a76b0SSuyog Pawar UWORD32 u4_max_vbv_buff_size,
234*c83a76b0SSuyog Pawar WORD32 i4_max_inter_frm_int,
235*c83a76b0SSuyog Pawar WORD32 i4_is_gop_closed,
236*c83a76b0SSuyog Pawar WORD32 *pi4_min_max_qp,
237*c83a76b0SSuyog Pawar WORD32 i4_use_est_intra_sad,
238*c83a76b0SSuyog Pawar UWORD32 u4_src_ticks,
239*c83a76b0SSuyog Pawar UWORD32 u4_tgt_ticks,
240*c83a76b0SSuyog Pawar WORD32 i4_frame_height,
241*c83a76b0SSuyog Pawar WORD32 i4_frame_width,
242*c83a76b0SSuyog Pawar WORD32 i4_num_active_pic_type,
243*c83a76b0SSuyog Pawar WORD32 i4_field_pic,
244*c83a76b0SSuyog Pawar WORD32 i4_quality_preset,
245*c83a76b0SSuyog Pawar WORD32 i4_lap_window,
246*c83a76b0SSuyog Pawar WORD32 i4_initial_decoder_delay_frames,
247*c83a76b0SSuyog Pawar float f_max_peak_rate_sustain_dur,
248*c83a76b0SSuyog Pawar LWORD64 i8_num_frames_to_encode,
249*c83a76b0SSuyog Pawar UWORD32 u4_min_scd_hevc_qp,
250*c83a76b0SSuyog Pawar UWORD8 u1_bit_depth,
251*c83a76b0SSuyog Pawar FILE *pf_rc_stat_file,
252*c83a76b0SSuyog Pawar WORD32 i4_pass_num,
253*c83a76b0SSuyog Pawar void *pv_gop_stat,
254*c83a76b0SSuyog Pawar LWORD64 i8_num_gop_mem_alloc,
255*c83a76b0SSuyog Pawar WORD32 i4_is_infinite_gop,
256*c83a76b0SSuyog Pawar WORD32 i4_size_of_lap_out,
257*c83a76b0SSuyog Pawar WORD32 i4_size_of_rc_lap_out,
258*c83a76b0SSuyog Pawar void *pv_sys_rc_api,
259*c83a76b0SSuyog Pawar WORD32 i4_fp_bit_alloc_in_sp,
260*c83a76b0SSuyog Pawar WORD32 i4_num_frame_parallel,
261*c83a76b0SSuyog Pawar WORD32 i4_capped_vbr_flag)
262*c83a76b0SSuyog Pawar {
263*c83a76b0SSuyog Pawar WORD32 i, i4_temp;
264*c83a76b0SSuyog Pawar UWORD32 u4_frms_in_delay_prd = (u4_frame_rate * u4_max_delay) / 1000000;
265*c83a76b0SSuyog Pawar UWORD32 i4_cbr_bit_alloc_period;
266*c83a76b0SSuyog Pawar float f_bit_depth_based_max_qp;
267*c83a76b0SSuyog Pawar UWORD32 u4_bit_depth_based_max_qp;
268*c83a76b0SSuyog Pawar WORD32 i4_pels_in_frame = (3 * (i4_frame_height * i4_frame_width) >> 1);
269*c83a76b0SSuyog Pawar
270*c83a76b0SSuyog Pawar if(u4_intra_frame_interval ==
271*c83a76b0SSuyog Pawar 1) /*i_only: Set bit allocation period to 15( currently not configurable) for i only mode*/
272*c83a76b0SSuyog Pawar {
273*c83a76b0SSuyog Pawar i4_cbr_bit_alloc_period = u4_frame_rate / 1000; /*changed */
274*c83a76b0SSuyog Pawar }
275*c83a76b0SSuyog Pawar else
276*c83a76b0SSuyog Pawar {
277*c83a76b0SSuyog Pawar i4_cbr_bit_alloc_period = 1;
278*c83a76b0SSuyog Pawar }
279*c83a76b0SSuyog Pawar
280*c83a76b0SSuyog Pawar if(CBR_NLDRC_HBR == e_rate_control_type)
281*c83a76b0SSuyog Pawar {
282*c83a76b0SSuyog Pawar e_rate_control_type = CBR_NLDRC;
283*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_hbr = 1;
284*c83a76b0SSuyog Pawar }
285*c83a76b0SSuyog Pawar else
286*c83a76b0SSuyog Pawar {
287*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_hbr = 0;
288*c83a76b0SSuyog Pawar }
289*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type = e_rate_control_type;
290*c83a76b0SSuyog Pawar ps_rate_control_api->i4_capped_vbr_flag = i4_capped_vbr_flag;
291*c83a76b0SSuyog Pawar ps_rate_control_api->u1_is_mb_level_rc_on = u1_is_mb_level_rc_on;
292*c83a76b0SSuyog Pawar ps_rate_control_api->i4_num_active_pic_type = i4_num_active_pic_type;
293*c83a76b0SSuyog Pawar ps_rate_control_api->i4_quality_preset = i4_quality_preset;
294*c83a76b0SSuyog Pawar ps_rate_control_api->i4_scd_I_frame_estimated_tot_bits = 0;
295*c83a76b0SSuyog Pawar ps_rate_control_api->i4_I_frame_qp_model = 0;
296*c83a76b0SSuyog Pawar ps_rate_control_api->u4_min_scd_hevc_qp = u4_min_scd_hevc_qp;
297*c83a76b0SSuyog Pawar ps_rate_control_api->pf_rc_stat_file = pf_rc_stat_file;
298*c83a76b0SSuyog Pawar ps_rate_control_api->i4_rc_pass = i4_pass_num;
299*c83a76b0SSuyog Pawar ps_rate_control_api->i4_max_frame_height = i4_frame_height;
300*c83a76b0SSuyog Pawar ps_rate_control_api->i4_max_frame_width = i4_frame_width;
301*c83a76b0SSuyog Pawar ps_rate_control_api->i4_underflow_warning = 0;
302*c83a76b0SSuyog Pawar ps_rate_control_api->f_p_to_i_comp_ratio = 1.0f;
303*c83a76b0SSuyog Pawar ps_rate_control_api->i4_scd_in_period_2_pass = 0;
304*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_infinite_gop = i4_is_infinite_gop;
305*c83a76b0SSuyog Pawar ps_rate_control_api->i4_frames_since_last_scd = 0;
306*c83a76b0SSuyog Pawar ps_rate_control_api->i4_num_frame_parallel = i4_num_frame_parallel;
307*c83a76b0SSuyog Pawar
308*c83a76b0SSuyog Pawar /*The memory for gop level summary struct is stored only for 2 pass*/
309*c83a76b0SSuyog Pawar if(i4_pass_num == 2)
310*c83a76b0SSuyog Pawar {
311*c83a76b0SSuyog Pawar ps_rate_control_api->pv_2pass_gop_summary = pv_gop_stat;
312*c83a76b0SSuyog Pawar }
313*c83a76b0SSuyog Pawar else
314*c83a76b0SSuyog Pawar {
315*c83a76b0SSuyog Pawar ps_rate_control_api->pv_2pass_gop_summary = NULL;
316*c83a76b0SSuyog Pawar }
317*c83a76b0SSuyog Pawar /*Initialize the call back funcitons for file related operations*/
318*c83a76b0SSuyog Pawar ps_rate_control_api->pv_rc_sys_api = pv_sys_rc_api;
319*c83a76b0SSuyog Pawar
320*c83a76b0SSuyog Pawar ps_rate_control_api->u1_bit_depth = u1_bit_depth;
321*c83a76b0SSuyog Pawar
322*c83a76b0SSuyog Pawar f_bit_depth_based_max_qp = (float)((51 + (6 * (u1_bit_depth - 8))) - 4) / 6;
323*c83a76b0SSuyog Pawar u4_bit_depth_based_max_qp = (UWORD32)pow(2.0f, f_bit_depth_based_max_qp);
324*c83a76b0SSuyog Pawar
325*c83a76b0SSuyog Pawar ps_rate_control_api->u4_bit_depth_based_max_qp = u4_bit_depth_based_max_qp;
326*c83a76b0SSuyog Pawar
327*c83a76b0SSuyog Pawar trace_printf("RC type = %d\n", e_rate_control_type);
328*c83a76b0SSuyog Pawar
329*c83a76b0SSuyog Pawar /* Set the avg_bitrate_changed flag for each pic_type to 0 */
330*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
331*c83a76b0SSuyog Pawar {
332*c83a76b0SSuyog Pawar ps_rate_control_api->au1_avg_bitrate_changed[i] = 0;
333*c83a76b0SSuyog Pawar }
334*c83a76b0SSuyog Pawar
335*c83a76b0SSuyog Pawar /* Initialize the pic_handling module */
336*c83a76b0SSuyog Pawar init_pic_handling(
337*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling, /*ps_pic_handling*/
338*c83a76b0SSuyog Pawar (WORD32)u4_intra_frame_interval, /*i4_intra_frm_int,*/
339*c83a76b0SSuyog Pawar i4_max_inter_frm_int, /*i4_max_inter_frm_int,*/
340*c83a76b0SSuyog Pawar i4_is_gop_closed,
341*c83a76b0SSuyog Pawar (WORD32)u4_idr_period,
342*c83a76b0SSuyog Pawar ps_rate_control_api->i4_num_active_pic_type,
343*c83a76b0SSuyog Pawar i4_field_pic); /*gop_struct_e*/
344*c83a76b0SSuyog Pawar
345*c83a76b0SSuyog Pawar /* initialise the init Qp module */
346*c83a76b0SSuyog Pawar init_init_qp(
347*c83a76b0SSuyog Pawar ps_rate_control_api->ps_init_qp,
348*c83a76b0SSuyog Pawar pi4_min_max_qp,
349*c83a76b0SSuyog Pawar i4_pels_in_frame,
350*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_hbr);
351*c83a76b0SSuyog Pawar
352*c83a76b0SSuyog Pawar /*** Initialize the rate control modules ***/
353*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type != CONST_QP)
354*c83a76b0SSuyog Pawar {
355*c83a76b0SSuyog Pawar UWORD32 au4_num_pics_in_delay_prd[MAX_PIC_TYPE] = { 0 };
356*c83a76b0SSuyog Pawar
357*c83a76b0SSuyog Pawar /* Initialise the model parameter structures */
358*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
359*c83a76b0SSuyog Pawar {
360*c83a76b0SSuyog Pawar init_frm_rc_rd_model(ps_rate_control_api->aps_rd_model[i], MAX_FRAMES_MODELLED);
361*c83a76b0SSuyog Pawar }
362*c83a76b0SSuyog Pawar
363*c83a76b0SSuyog Pawar /* Initialize the buffer mechanism */
364*c83a76b0SSuyog Pawar if((ps_rate_control_api->e_rc_type == VBR_STORAGE) ||
365*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP))
366*c83a76b0SSuyog Pawar {
367*c83a76b0SSuyog Pawar /* Assuming both the peak bit rates are same for a VBR_STORAGE and
368*c83a76b0SSuyog Pawar VBR_STORAGE_DVD_COMP */
369*c83a76b0SSuyog Pawar if(pu4_peak_bit_rate[0] != pu4_peak_bit_rate[1])
370*c83a76b0SSuyog Pawar {
371*c83a76b0SSuyog Pawar trace_printf("For VBR_STORAGE and VBR_STORAGE_DVD_COMP the peak bit "
372*c83a76b0SSuyog Pawar "rates should be same\n");
373*c83a76b0SSuyog Pawar }
374*c83a76b0SSuyog Pawar init_vbr_vbv(
375*c83a76b0SSuyog Pawar ps_rate_control_api->ps_vbr_storage_vbv,
376*c83a76b0SSuyog Pawar (WORD32)pu4_peak_bit_rate[0],
377*c83a76b0SSuyog Pawar (WORD32)u4_frame_rate,
378*c83a76b0SSuyog Pawar (WORD32)u4_max_vbv_buff_size);
379*c83a76b0SSuyog Pawar }
380*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == CBR_NLDRC)
381*c83a76b0SSuyog Pawar {
382*c83a76b0SSuyog Pawar UWORD32 u4_avg_bit_rate_copy[MAX_NUM_DRAIN_RATES];
383*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
384*c83a76b0SSuyog Pawar {
385*c83a76b0SSuyog Pawar u4_avg_bit_rate_copy[i] = u4_avg_bit_rate;
386*c83a76b0SSuyog Pawar }
387*c83a76b0SSuyog Pawar
388*c83a76b0SSuyog Pawar init_cbr_buffer(
389*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
390*c83a76b0SSuyog Pawar u4_max_delay,
391*c83a76b0SSuyog Pawar u4_frame_rate,
392*c83a76b0SSuyog Pawar u4_avg_bit_rate,
393*c83a76b0SSuyog Pawar au4_num_pics_in_delay_prd,
394*c83a76b0SSuyog Pawar u4_max_vbv_buff_size,
395*c83a76b0SSuyog Pawar u4_intra_frame_interval,
396*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type,
397*c83a76b0SSuyog Pawar pu4_peak_bit_rate[0],
398*c83a76b0SSuyog Pawar i4_initial_decoder_delay_frames,
399*c83a76b0SSuyog Pawar f_max_peak_rate_sustain_dur,
400*c83a76b0SSuyog Pawar i8_num_frames_to_encode,
401*c83a76b0SSuyog Pawar i4_max_inter_frm_int,
402*c83a76b0SSuyog Pawar i4_pass_num,
403*c83a76b0SSuyog Pawar 0 /*capped vbr off */);
404*c83a76b0SSuyog Pawar }
405*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == VBR_STREAMING)
406*c83a76b0SSuyog Pawar {
407*c83a76b0SSuyog Pawar init_vbv_str_prms(
408*c83a76b0SSuyog Pawar &ps_rate_control_api->s_vbr_str_prms,
409*c83a76b0SSuyog Pawar u4_intra_frame_interval,
410*c83a76b0SSuyog Pawar u4_src_ticks,
411*c83a76b0SSuyog Pawar u4_tgt_ticks,
412*c83a76b0SSuyog Pawar u4_frms_in_delay_prd);
413*c83a76b0SSuyog Pawar
414*c83a76b0SSuyog Pawar init_cbr_buffer(
415*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
416*c83a76b0SSuyog Pawar u4_max_delay,
417*c83a76b0SSuyog Pawar u4_frame_rate,
418*c83a76b0SSuyog Pawar u4_avg_bit_rate,
419*c83a76b0SSuyog Pawar au4_num_pics_in_delay_prd,
420*c83a76b0SSuyog Pawar u4_max_vbv_buff_size,
421*c83a76b0SSuyog Pawar u4_intra_frame_interval,
422*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type,
423*c83a76b0SSuyog Pawar pu4_peak_bit_rate[0],
424*c83a76b0SSuyog Pawar i4_initial_decoder_delay_frames,
425*c83a76b0SSuyog Pawar f_max_peak_rate_sustain_dur,
426*c83a76b0SSuyog Pawar i8_num_frames_to_encode,
427*c83a76b0SSuyog Pawar i4_max_inter_frm_int,
428*c83a76b0SSuyog Pawar i4_pass_num,
429*c83a76b0SSuyog Pawar ps_rate_control_api->i4_capped_vbr_flag);
430*c83a76b0SSuyog Pawar }
431*c83a76b0SSuyog Pawar
432*c83a76b0SSuyog Pawar /* Initalise the SAD estimation module */
433*c83a76b0SSuyog Pawar init_est_sad(ps_rate_control_api->ps_est_sad, i4_use_est_intra_sad);
434*c83a76b0SSuyog Pawar
435*c83a76b0SSuyog Pawar /* Initialise the bit allocation module according to VBR or CBR */
436*c83a76b0SSuyog Pawar if((ps_rate_control_api->e_rc_type == VBR_STORAGE) ||
437*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type == VBR_STREAMING) ||
438*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP))
439*c83a76b0SSuyog Pawar {
440*c83a76b0SSuyog Pawar /*UWORD32 u4_scaled_avg_bit_rate;*/
441*c83a76b0SSuyog Pawar /*X_PROD_Y_DIV_Z (u4_avg_bit_rate,1126,1024,u4_scaled_avg_bit_rate);*/
442*c83a76b0SSuyog Pawar init_bit_allocation(
443*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
444*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
445*c83a76b0SSuyog Pawar i4_cbr_bit_alloc_period,
446*c83a76b0SSuyog Pawar u4_avg_bit_rate /*u4_scaled_avg_bit_rate*/,
447*c83a76b0SSuyog Pawar u4_frame_rate,
448*c83a76b0SSuyog Pawar (WORD32 *)pu4_peak_bit_rate,
449*c83a76b0SSuyog Pawar u4_min_bit_rate,
450*c83a76b0SSuyog Pawar i4_pels_in_frame,
451*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_hbr,
452*c83a76b0SSuyog Pawar ps_rate_control_api->i4_num_active_pic_type,
453*c83a76b0SSuyog Pawar i4_lap_window,
454*c83a76b0SSuyog Pawar i4_field_pic,
455*c83a76b0SSuyog Pawar i4_pass_num,
456*c83a76b0SSuyog Pawar (i4_frame_height * i4_frame_width),
457*c83a76b0SSuyog Pawar i4_fp_bit_alloc_in_sp);
458*c83a76b0SSuyog Pawar }
459*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == CBR_NLDRC)
460*c83a76b0SSuyog Pawar {
461*c83a76b0SSuyog Pawar init_bit_allocation(
462*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
463*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
464*c83a76b0SSuyog Pawar i4_cbr_bit_alloc_period, //i_onlyCBR_BIT_ALLOC_PERIOD,
465*c83a76b0SSuyog Pawar u4_avg_bit_rate,
466*c83a76b0SSuyog Pawar u4_frame_rate,
467*c83a76b0SSuyog Pawar (WORD32 *)pu4_peak_bit_rate,
468*c83a76b0SSuyog Pawar u4_min_bit_rate,
469*c83a76b0SSuyog Pawar i4_pels_in_frame,
470*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_hbr,
471*c83a76b0SSuyog Pawar ps_rate_control_api->i4_num_active_pic_type,
472*c83a76b0SSuyog Pawar i4_lap_window,
473*c83a76b0SSuyog Pawar i4_field_pic,
474*c83a76b0SSuyog Pawar i4_pass_num,
475*c83a76b0SSuyog Pawar (i4_frame_height * i4_frame_width),
476*c83a76b0SSuyog Pawar i4_fp_bit_alloc_in_sp);
477*c83a76b0SSuyog Pawar }
478*c83a76b0SSuyog Pawar }
479*c83a76b0SSuyog Pawar else
480*c83a76b0SSuyog Pawar {
481*c83a76b0SSuyog Pawar UWORD32 au4_num_pics_in_delay_prd[MAX_PIC_TYPE];
482*c83a76b0SSuyog Pawar
483*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
484*c83a76b0SSuyog Pawar au4_num_pics_in_delay_prd[i] = 0;
485*c83a76b0SSuyog Pawar
486*c83a76b0SSuyog Pawar init_cbr_buffer(
487*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
488*c83a76b0SSuyog Pawar u4_max_delay,
489*c83a76b0SSuyog Pawar u4_frame_rate,
490*c83a76b0SSuyog Pawar u4_avg_bit_rate,
491*c83a76b0SSuyog Pawar au4_num_pics_in_delay_prd,
492*c83a76b0SSuyog Pawar u4_max_vbv_buff_size,
493*c83a76b0SSuyog Pawar u4_intra_frame_interval,
494*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type,
495*c83a76b0SSuyog Pawar pu4_peak_bit_rate[0],
496*c83a76b0SSuyog Pawar i4_initial_decoder_delay_frames,
497*c83a76b0SSuyog Pawar f_max_peak_rate_sustain_dur,
498*c83a76b0SSuyog Pawar i8_num_frames_to_encode,
499*c83a76b0SSuyog Pawar i4_max_inter_frm_int,
500*c83a76b0SSuyog Pawar i4_pass_num,
501*c83a76b0SSuyog Pawar 0 /*capped vbr off */);
502*c83a76b0SSuyog Pawar }
503*c83a76b0SSuyog Pawar
504*c83a76b0SSuyog Pawar /* Initialize the init_qp */
505*c83a76b0SSuyog Pawar for(i4_temp = 0; i4_temp < MAX_SCENE_NUM_RC; i4_temp++)
506*c83a76b0SSuyog Pawar {
507*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
508*c83a76b0SSuyog Pawar {
509*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_temp][i] = 0x7FFFFFFF; //pi4_init_qp[i];
510*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_temp][i] =
511*c83a76b0SSuyog Pawar 0x7FFFFFFF; //pi4_init_qp[i] << QSCALE_Q_FAC;
512*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_min_qp[i] = pi4_min_max_qp[(i << 1)];
513*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_max_qp[i] = pi4_min_max_qp[(i << 1) + 1];
514*c83a76b0SSuyog Pawar }
515*c83a76b0SSuyog Pawar }
516*c83a76b0SSuyog Pawar /*init min and max qp in qscale*/
517*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
518*c83a76b0SSuyog Pawar {
519*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_min_qp_q6[i] = MIN_QSCALE_Q6;
520*c83a76b0SSuyog Pawar //ps_rate_control_api->ai4_max_qp_q6[i] = (228 << QSCALE_Q_FAC);
521*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_max_qp_q6[i] = (u4_bit_depth_based_max_qp << QSCALE_Q_FAC);
522*c83a76b0SSuyog Pawar }
523*c83a76b0SSuyog Pawar
524*c83a76b0SSuyog Pawar /* Initialize the is_first_frm_encoded */
525*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
526*c83a76b0SSuyog Pawar {
527*c83a76b0SSuyog Pawar ps_rate_control_api->au1_is_first_frm_coded[i] = 0;
528*c83a76b0SSuyog Pawar }
529*c83a76b0SSuyog Pawar ps_rate_control_api->u1_is_first_frm = 1;
530*c83a76b0SSuyog Pawar ps_rate_control_api->i4_prev_ref_is_scd = 0;
531*c83a76b0SSuyog Pawar
532*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NUM_FRAME_PARALLEL; i++)
533*c83a76b0SSuyog Pawar {
534*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_est_tot_bits[i] =
535*c83a76b0SSuyog Pawar get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer);
536*c83a76b0SSuyog Pawar }
537*c83a76b0SSuyog Pawar
538*c83a76b0SSuyog Pawar /* Control flag for delayed impact after a change in peak bitrate has been made */
539*c83a76b0SSuyog Pawar ps_rate_control_api->u4_frms_in_delay_prd_for_peak_bit_rate_change = 0;
540*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
541*c83a76b0SSuyog Pawar {
542*c83a76b0SSuyog Pawar ps_rate_control_api->au4_new_peak_bit_rate[i] = pu4_peak_bit_rate[i];
543*c83a76b0SSuyog Pawar }
544*c83a76b0SSuyog Pawar
545*c83a76b0SSuyog Pawar /* initialise the mb level rate control module */
546*c83a76b0SSuyog Pawar init_mb_level_rc(ps_rate_control_api->ps_mb_rate_control);
547*c83a76b0SSuyog Pawar ps_rate_control_api->i4_prev_frm_est_bits = u4_avg_bit_rate / (u4_frame_rate / 1000);
548*c83a76b0SSuyog Pawar
549*c83a76b0SSuyog Pawar ps_rate_control_api->prev_ref_pic_type = I_PIC;
550*c83a76b0SSuyog Pawar ps_rate_control_api->i4_P_to_I_ratio = (1 << (P_TO_I_RATIO_Q_FACTOR + K_Q)) / I_TO_P_RATIO;
551*c83a76b0SSuyog Pawar
552*c83a76b0SSuyog Pawar /* Initialise sad accumulator */
553*c83a76b0SSuyog Pawar init_sad_acc(ps_rate_control_api->ps_sad_acc);
554*c83a76b0SSuyog Pawar
555*c83a76b0SSuyog Pawar rc_get_max_hme_sad_per_pixel(ps_rate_control_api, i4_frame_height * i4_frame_width);
556*c83a76b0SSuyog Pawar }
557*c83a76b0SSuyog Pawar #endif /* #if NON_STEADSTATE_CODE */
558*c83a76b0SSuyog Pawar
559*c83a76b0SSuyog Pawar /****************************************************************************
560*c83a76b0SSuyog Pawar *Function Name : add_picture_to_stack
561*c83a76b0SSuyog Pawar *Description : calls add_pic_to_stack
562*c83a76b0SSuyog Pawar *Inputs :
563*c83a76b0SSuyog Pawar *Globals :
564*c83a76b0SSuyog Pawar *Processing :
565*c83a76b0SSuyog Pawar *Outputs :
566*c83a76b0SSuyog Pawar *Returns :
567*c83a76b0SSuyog Pawar *Issues :
568*c83a76b0SSuyog Pawar *Revision History:d
569*c83a76b0SSuyog Pawar *DD MM YYYY Author(s) Changes (Describe the changes made)
570*c83a76b0SSuyog Pawar *
571*c83a76b0SSuyog Pawar *****************************************************************************/
add_picture_to_stack(rate_control_api_t * rate_control_api,WORD32 i4_enc_pic_id,WORD32 i4_rc_in_pic)572*c83a76b0SSuyog Pawar void add_picture_to_stack(
573*c83a76b0SSuyog Pawar rate_control_api_t *rate_control_api, WORD32 i4_enc_pic_id, WORD32 i4_rc_in_pic)
574*c83a76b0SSuyog Pawar {
575*c83a76b0SSuyog Pawar /* Call the routine to add the pic to stack in encode order */
576*c83a76b0SSuyog Pawar add_pic_to_stack(rate_control_api->ps_pic_handling, i4_enc_pic_id, i4_rc_in_pic);
577*c83a76b0SSuyog Pawar }
578*c83a76b0SSuyog Pawar
579*c83a76b0SSuyog Pawar /****************************************************************************
580*c83a76b0SSuyog Pawar Function Name : add_picture_to_stack_re_enc
581*c83a76b0SSuyog Pawar Description :
582*c83a76b0SSuyog Pawar Inputs :
583*c83a76b0SSuyog Pawar Globals :
584*c83a76b0SSuyog Pawar Processing :
585*c83a76b0SSuyog Pawar Outputs :
586*c83a76b0SSuyog Pawar Returns :
587*c83a76b0SSuyog Pawar Issues :
588*c83a76b0SSuyog Pawar Revision History:
589*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
590*c83a76b0SSuyog Pawar
591*c83a76b0SSuyog Pawar *****************************************************************************/
add_picture_to_stack_re_enc(rate_control_api_t * rate_control_api,WORD32 i4_enc_pic_id,picture_type_e e_pic_type)592*c83a76b0SSuyog Pawar void add_picture_to_stack_re_enc(
593*c83a76b0SSuyog Pawar rate_control_api_t *rate_control_api, WORD32 i4_enc_pic_id, picture_type_e e_pic_type)
594*c83a76b0SSuyog Pawar {
595*c83a76b0SSuyog Pawar /* In case of a re-encoder, the pics will come in the encode order itself.
596*c83a76b0SSuyog Pawar So, there is no need to buffer the pics up */
597*c83a76b0SSuyog Pawar add_pic_to_stack_re_enc(rate_control_api->ps_pic_handling, i4_enc_pic_id, e_pic_type);
598*c83a76b0SSuyog Pawar }
599*c83a76b0SSuyog Pawar
600*c83a76b0SSuyog Pawar /****************************************************************************
601*c83a76b0SSuyog Pawar Function Name : get_picture_details
602*c83a76b0SSuyog Pawar Description : decides the picture type based on the state
603*c83a76b0SSuyog Pawar Inputs :
604*c83a76b0SSuyog Pawar Globals :
605*c83a76b0SSuyog Pawar Processing :
606*c83a76b0SSuyog Pawar Outputs :
607*c83a76b0SSuyog Pawar Returns :
608*c83a76b0SSuyog Pawar Issues :
609*c83a76b0SSuyog Pawar Revision History:
610*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
611*c83a76b0SSuyog Pawar
612*c83a76b0SSuyog Pawar *****************************************************************************/
get_picture_details(rate_control_handle rate_control_api,WORD32 * pi4_pic_id,WORD32 * pi4_pic_disp_order_no,picture_type_e * pe_pic_type,WORD32 * pi4_is_scd)613*c83a76b0SSuyog Pawar void get_picture_details(
614*c83a76b0SSuyog Pawar rate_control_handle rate_control_api,
615*c83a76b0SSuyog Pawar WORD32 *pi4_pic_id,
616*c83a76b0SSuyog Pawar WORD32 *pi4_pic_disp_order_no,
617*c83a76b0SSuyog Pawar picture_type_e *pe_pic_type,
618*c83a76b0SSuyog Pawar WORD32 *pi4_is_scd)
619*c83a76b0SSuyog Pawar {
620*c83a76b0SSuyog Pawar /* Call to get the pic_details */
621*c83a76b0SSuyog Pawar get_pic_from_stack(
622*c83a76b0SSuyog Pawar rate_control_api->ps_pic_handling,
623*c83a76b0SSuyog Pawar pi4_pic_id,
624*c83a76b0SSuyog Pawar pi4_pic_disp_order_no,
625*c83a76b0SSuyog Pawar pe_pic_type,
626*c83a76b0SSuyog Pawar pi4_is_scd);
627*c83a76b0SSuyog Pawar }
628*c83a76b0SSuyog Pawar
629*c83a76b0SSuyog Pawar /****************************************************************************
630*c83a76b0SSuyog Pawar Function Name : get_min_max_bits_based_on_buffer
631*c83a76b0SSuyog Pawar Description :
632*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
633*c83a76b0SSuyog Pawar
634*c83a76b0SSuyog Pawar Globals :
635*c83a76b0SSuyog Pawar Processing :
636*c83a76b0SSuyog Pawar Outputs :
637*c83a76b0SSuyog Pawar Returns :
638*c83a76b0SSuyog Pawar Issues :
639*c83a76b0SSuyog Pawar Revision History:
640*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
641*c83a76b0SSuyog Pawar
642*c83a76b0SSuyog Pawar *****************************************************************************/
get_min_max_bits_based_on_buffer(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type,WORD32 * pi4_min_bits,WORD32 * pi4_max_bits,WORD32 i4_get_error)643*c83a76b0SSuyog Pawar static void get_min_max_bits_based_on_buffer(
644*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
645*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
646*c83a76b0SSuyog Pawar WORD32 *pi4_min_bits,
647*c83a76b0SSuyog Pawar WORD32 *pi4_max_bits,
648*c83a76b0SSuyog Pawar WORD32 i4_get_error)
649*c83a76b0SSuyog Pawar {
650*c83a76b0SSuyog Pawar WORD32 i4_min_bits = 0, i4_max_bits = 0;
651*c83a76b0SSuyog Pawar
652*c83a76b0SSuyog Pawar cbr_modify_ebf_estimate(ps_rate_control_api->ps_cbr_buffer, i4_get_error); //ELP_RC
653*c83a76b0SSuyog Pawar
654*c83a76b0SSuyog Pawar /* Find the min and max bits that can be consumed based on the buffer condition */
655*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type == VBR_STORAGE)
656*c83a76b0SSuyog Pawar {
657*c83a76b0SSuyog Pawar i4_max_bits = get_max_target_bits(ps_rate_control_api->ps_vbr_storage_vbv);
658*c83a76b0SSuyog Pawar }
659*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP)
660*c83a76b0SSuyog Pawar {
661*c83a76b0SSuyog Pawar WORD32 i4_rem_bits_in_gop, i4_rem_frms_in_gop;
662*c83a76b0SSuyog Pawar /* WORD32 ai4_rem_frms_in_gop[MAX_PIC_TYPE]; */
663*c83a76b0SSuyog Pawar i4_rem_frms_in_gop = pic_type_get_rem_frms_in_gop(ps_rate_control_api->ps_pic_handling);
664*c83a76b0SSuyog Pawar i4_rem_bits_in_gop = rc_get_rem_bits_in_period(ps_rate_control_api);
665*c83a76b0SSuyog Pawar
666*c83a76b0SSuyog Pawar i4_max_bits = get_max_tgt_bits_dvd_comp(
667*c83a76b0SSuyog Pawar ps_rate_control_api->ps_vbr_storage_vbv,
668*c83a76b0SSuyog Pawar i4_rem_bits_in_gop,
669*c83a76b0SSuyog Pawar i4_rem_frms_in_gop,
670*c83a76b0SSuyog Pawar e_pic_type);
671*c83a76b0SSuyog Pawar }
672*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == CBR_NLDRC)
673*c83a76b0SSuyog Pawar {
674*c83a76b0SSuyog Pawar cbr_buffer_constraint_check(
675*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer, 0, e_pic_type, &i4_max_bits, &i4_min_bits);
676*c83a76b0SSuyog Pawar }
677*c83a76b0SSuyog Pawar else /* if(ps_rate_control_api->e_rc_type == VBR_STREAMING) */
678*c83a76b0SSuyog Pawar {
679*c83a76b0SSuyog Pawar vbr_stream_buffer_constraint_check(
680*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer, 0, e_pic_type, &i4_max_bits, &i4_min_bits);
681*c83a76b0SSuyog Pawar }
682*c83a76b0SSuyog Pawar /* Fill the min and max bits consumed */
683*c83a76b0SSuyog Pawar if(1 != ps_rate_control_api->i4_capped_vbr_flag)
684*c83a76b0SSuyog Pawar {
685*c83a76b0SSuyog Pawar pi4_min_bits[0] = i4_min_bits;
686*c83a76b0SSuyog Pawar }
687*c83a76b0SSuyog Pawar else
688*c83a76b0SSuyog Pawar {
689*c83a76b0SSuyog Pawar /* Capped VBR case */
690*c83a76b0SSuyog Pawar pi4_min_bits[0] = 0;
691*c83a76b0SSuyog Pawar }
692*c83a76b0SSuyog Pawar pi4_max_bits[0] = i4_max_bits;
693*c83a76b0SSuyog Pawar }
694*c83a76b0SSuyog Pawar
695*c83a76b0SSuyog Pawar /****************************************************************************
696*c83a76b0SSuyog Pawar Function Name : is_first_frame_coded
697*c83a76b0SSuyog Pawar Description :
698*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
699*c83a76b0SSuyog Pawar Revision History:
700*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
701*c83a76b0SSuyog Pawar
702*c83a76b0SSuyog Pawar *****************************************************************************/
is_first_frame_coded(rate_control_handle ps_rate_control_api)703*c83a76b0SSuyog Pawar WORD32 is_first_frame_coded(rate_control_handle ps_rate_control_api)
704*c83a76b0SSuyog Pawar {
705*c83a76b0SSuyog Pawar WORD32 i4_is_first_frame_coded = 1, i;
706*c83a76b0SSuyog Pawar /* Check whether atleast one frame of a each picture type gets encoded */
707*c83a76b0SSuyog Pawar /* Check whether it is an IPP or IPB kind of encoding */
708*c83a76b0SSuyog Pawar if(pic_type_get_intra_frame_interval(ps_rate_control_api->ps_pic_handling) == 1)
709*c83a76b0SSuyog Pawar {
710*c83a76b0SSuyog Pawar i4_is_first_frame_coded = ps_rate_control_api->au1_is_first_frm_coded[I_PIC];
711*c83a76b0SSuyog Pawar }
712*c83a76b0SSuyog Pawar else /*HEVC_hierarchy*/
713*c83a76b0SSuyog Pawar {
714*c83a76b0SSuyog Pawar if(pic_type_get_field_pic(ps_rate_control_api->ps_pic_handling))
715*c83a76b0SSuyog Pawar {
716*c83a76b0SSuyog Pawar i4_is_first_frame_coded &= ps_rate_control_api->au1_is_first_frm_coded[I_PIC];
717*c83a76b0SSuyog Pawar
718*c83a76b0SSuyog Pawar for(i = 1; i < ps_rate_control_api->i4_num_active_pic_type; i++)
719*c83a76b0SSuyog Pawar {
720*c83a76b0SSuyog Pawar i4_is_first_frame_coded &= ps_rate_control_api->au1_is_first_frm_coded[i];
721*c83a76b0SSuyog Pawar i4_is_first_frame_coded &=
722*c83a76b0SSuyog Pawar ps_rate_control_api->au1_is_first_frm_coded[i + FIELD_OFFSET];
723*c83a76b0SSuyog Pawar }
724*c83a76b0SSuyog Pawar }
725*c83a76b0SSuyog Pawar else
726*c83a76b0SSuyog Pawar {
727*c83a76b0SSuyog Pawar for(i = 0; i < ps_rate_control_api->i4_num_active_pic_type; i++)
728*c83a76b0SSuyog Pawar {
729*c83a76b0SSuyog Pawar i4_is_first_frame_coded &= ps_rate_control_api->au1_is_first_frm_coded[i];
730*c83a76b0SSuyog Pawar }
731*c83a76b0SSuyog Pawar }
732*c83a76b0SSuyog Pawar }
733*c83a76b0SSuyog Pawar
734*c83a76b0SSuyog Pawar return i4_is_first_frame_coded;
735*c83a76b0SSuyog Pawar }
736*c83a76b0SSuyog Pawar
737*c83a76b0SSuyog Pawar /****************************************************************************
738*c83a76b0SSuyog Pawar Function Name : get_min_max_qp
739*c83a76b0SSuyog Pawar Description :
740*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
741*c83a76b0SSuyog Pawar Revision History:
742*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
743*c83a76b0SSuyog Pawar
744*c83a76b0SSuyog Pawar *****************************************************************************/
745*c83a76b0SSuyog Pawar
get_min_max_qp(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type,WORD32 * pi4_hi_dev_qp_q6,WORD32 * pi4_lo_dev_qp_q6,WORD32 i4_complexity_bin,WORD32 i4_scene_num)746*c83a76b0SSuyog Pawar static void get_min_max_qp(
747*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
748*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
749*c83a76b0SSuyog Pawar WORD32 *pi4_hi_dev_qp_q6,
750*c83a76b0SSuyog Pawar WORD32 *pi4_lo_dev_qp_q6,
751*c83a76b0SSuyog Pawar WORD32 i4_complexity_bin,
752*c83a76b0SSuyog Pawar WORD32 i4_scene_num)
753*c83a76b0SSuyog Pawar {
754*c83a76b0SSuyog Pawar WORD32 prev_qp_q6, prev_I_qp_q6;
755*c83a76b0SSuyog Pawar WORD32 hi_dev_qp_q6, lo_dev_qp_q6, hi_dev_qp_temp_q6;
756*c83a76b0SSuyog Pawar WORD32 i4_intra_frm_int, prev_qp_for_high_dev_q6,
757*c83a76b0SSuyog Pawar use_I_frame_qp_high_dev = 0; /*i_only : to detect i only case*/
758*c83a76b0SSuyog Pawar float per_pixel_p_hme_sad =
759*c83a76b0SSuyog Pawar (float)ps_rate_control_api->i8_per_pixel_p_frm_hme_sad_q10 / (1 << 10);
760*c83a76b0SSuyog Pawar
761*c83a76b0SSuyog Pawar i4_intra_frm_int = pic_type_get_intra_frame_interval(ps_rate_control_api->ps_pic_handling);
762*c83a76b0SSuyog Pawar
763*c83a76b0SSuyog Pawar /* Restricting the Quant swing */
764*c83a76b0SSuyog Pawar prev_qp_q6 = ps_rate_control_api
765*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[i4_scene_num][ps_rate_control_api->prev_ref_pic_type];
766*c83a76b0SSuyog Pawar prev_qp_for_high_dev_q6 = prev_qp_q6;
767*c83a76b0SSuyog Pawar prev_I_qp_q6 = ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC];
768*c83a76b0SSuyog Pawar if(ps_rate_control_api->prev_ref_pic_type != e_pic_type)
769*c83a76b0SSuyog Pawar {
770*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC)
771*c83a76b0SSuyog Pawar {
772*c83a76b0SSuyog Pawar /* Constrain I-frame QP to be within specified limit of prev_ref_qp/Kp */
773*c83a76b0SSuyog Pawar // SS - suppressing this assuming re-encode will take care
774*c83a76b0SSuyog Pawar /* prev_qp = i4_frame_qp; */
775*c83a76b0SSuyog Pawar prev_qp_q6 = (ps_rate_control_api->i4_P_to_I_ratio * (LWORD64)prev_qp_q6) >>
776*c83a76b0SSuyog Pawar P_TO_I_RATIO_Q_FACTOR;
777*c83a76b0SSuyog Pawar }
778*c83a76b0SSuyog Pawar else if(e_pic_type == P_PIC || e_pic_type == P1_PIC)
779*c83a76b0SSuyog Pawar {
780*c83a76b0SSuyog Pawar /* Constrain P-frame QP to be within specified limit of Kp*prev_ref_qp */
781*c83a76b0SSuyog Pawar prev_qp_q6 = (I_TO_P_RATIO * (LWORD64)prev_qp_q6) >> K_Q;
782*c83a76b0SSuyog Pawar use_I_frame_qp_high_dev = 1;
783*c83a76b0SSuyog Pawar }
784*c83a76b0SSuyog Pawar else if(ps_rate_control_api->prev_ref_pic_type == P_PIC)
785*c83a76b0SSuyog Pawar {
786*c83a76b0SSuyog Pawar /* current frame is B-pic */
787*c83a76b0SSuyog Pawar /* Constrain B-frame QP to be within specified limit of prev_ref_qp/Kb */
788*c83a76b0SSuyog Pawar if(!ps_rate_control_api->i4_is_hbr)
789*c83a76b0SSuyog Pawar {
790*c83a76b0SSuyog Pawar prev_qp_q6 = (P_TO_B_RATIO * (LWORD64)prev_qp_q6) >> (K_Q);
791*c83a76b0SSuyog Pawar }
792*c83a76b0SSuyog Pawar else
793*c83a76b0SSuyog Pawar {
794*c83a76b0SSuyog Pawar prev_qp_q6 = (P_TO_B_RATIO_HBR * (LWORD64)prev_qp_q6) >> (K_Q);
795*c83a76b0SSuyog Pawar }
796*c83a76b0SSuyog Pawar }
797*c83a76b0SSuyog Pawar else /* if(ps_rate_control_api->prev_ref_pic_type == I_PIC) */
798*c83a76b0SSuyog Pawar {
799*c83a76b0SSuyog Pawar /* current frame is B-pic */
800*c83a76b0SSuyog Pawar /* Constrain B-frame QP to be within specified limit of prev_ref_qp/Kb */
801*c83a76b0SSuyog Pawar if(!ps_rate_control_api->i4_is_hbr)
802*c83a76b0SSuyog Pawar {
803*c83a76b0SSuyog Pawar prev_qp_q6 = (P_TO_B_RATIO * I_TO_P_RATIO * (LWORD64)prev_qp_q6) >> (K_Q + K_Q);
804*c83a76b0SSuyog Pawar }
805*c83a76b0SSuyog Pawar else
806*c83a76b0SSuyog Pawar {
807*c83a76b0SSuyog Pawar prev_qp_q6 = (P_TO_B_RATIO_HBR * I_TO_P_RATIO * (LWORD64)prev_qp_q6) >> (K_Q + K_Q);
808*c83a76b0SSuyog Pawar }
809*c83a76b0SSuyog Pawar }
810*c83a76b0SSuyog Pawar }
811*c83a76b0SSuyog Pawar
812*c83a76b0SSuyog Pawar /*if (1)//e_pic_type != B_PIC)*/
813*c83a76b0SSuyog Pawar {
814*c83a76b0SSuyog Pawar if(use_I_frame_qp_high_dev)
815*c83a76b0SSuyog Pawar {
816*c83a76b0SSuyog Pawar /*For P pic if previous reference was I then pre_qp = I qp + 1, Then +4 high dev is allowed. To avoid P frame to be +5 off comapared to previous I*/
817*c83a76b0SSuyog Pawar hi_dev_qp_q6 = GET_HI_DEV_QP_QFAC(prev_qp_for_high_dev_q6);
818*c83a76b0SSuyog Pawar }
819*c83a76b0SSuyog Pawar else
820*c83a76b0SSuyog Pawar {
821*c83a76b0SSuyog Pawar hi_dev_qp_q6 = GET_HI_DEV_QP_QFAC(prev_qp_q6);
822*c83a76b0SSuyog Pawar }
823*c83a76b0SSuyog Pawar
824*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC || e_pic_type == P_PIC || e_pic_type == P1_PIC)
825*c83a76b0SSuyog Pawar {
826*c83a76b0SSuyog Pawar lo_dev_qp_q6 =
827*c83a76b0SSuyog Pawar GET_LO_DEV_QP_QFAC(prev_qp_q6, ps_rate_control_api->i4_num_active_pic_type);
828*c83a76b0SSuyog Pawar }
829*c83a76b0SSuyog Pawar else
830*c83a76b0SSuyog Pawar {
831*c83a76b0SSuyog Pawar lo_dev_qp_q6 = GET_LO_DEV_QP_QFAC_B_PIC(prev_qp_q6);
832*c83a76b0SSuyog Pawar }
833*c83a76b0SSuyog Pawar }
834*c83a76b0SSuyog Pawar /* For lower QPs due to scale factor and fixed point arithmetic, the
835*c83a76b0SSuyog Pawar hi_dev_qp can be same as that of the prev qp and in which case it gets stuck
836*c83a76b0SSuyog Pawar in the lower most qp and thus not allowing QPs not to change. To avoid this,
837*c83a76b0SSuyog Pawar for lower qps the hi_dev_qp should be made slightly more than prev_qp */
838*c83a76b0SSuyog Pawar if(prev_qp_q6 == hi_dev_qp_q6)
839*c83a76b0SSuyog Pawar {
840*c83a76b0SSuyog Pawar hi_dev_qp_q6 = ((LWORD64)hi_dev_qp_q6 * 18) >> 4;
841*c83a76b0SSuyog Pawar }
842*c83a76b0SSuyog Pawar /*minimum qp should atleast be 1 less than previous*/
843*c83a76b0SSuyog Pawar if(prev_qp_q6 == lo_dev_qp_q6 && lo_dev_qp_q6 > (1 << QSCALE_Q_FAC))
844*c83a76b0SSuyog Pawar {
845*c83a76b0SSuyog Pawar lo_dev_qp_q6 = ((LWORD64)lo_dev_qp_q6 * 14) >> 4;
846*c83a76b0SSuyog Pawar }
847*c83a76b0SSuyog Pawar /*for shorter GOP make sure the P does not get better than I , NEED TO BE REVIEWED as gains seen in bq terrace after this change was with wrong config*/
848*c83a76b0SSuyog Pawar /*Anything with per pixel sad < 1 is considered static. Since the hme sad is at L1 resolution, the threshold chosen is 0.25*/
849*c83a76b0SSuyog Pawar if((per_pixel_p_hme_sad < 0.25f) && (ps_rate_control_api->i4_is_infinite_gop != 1))
850*c83a76b0SSuyog Pawar {
851*c83a76b0SSuyog Pawar if(e_pic_type == P_PIC && ps_rate_control_api->i4_I_frame_qp_model)
852*c83a76b0SSuyog Pawar {
853*c83a76b0SSuyog Pawar /*P is not allowed to get too better compared to previous I in static content*/
854*c83a76b0SSuyog Pawar if(lo_dev_qp_q6<(prev_I_qp_q6 * 14)>> 4)
855*c83a76b0SSuyog Pawar lo_dev_qp_q6 = ((LWORD64)prev_I_qp_q6 * 14) >> 4;
856*c83a76b0SSuyog Pawar /*If previous reference is I then it cannot get better than I in static case*/
857*c83a76b0SSuyog Pawar if(lo_dev_qp_q6 < prev_I_qp_q6)
858*c83a76b0SSuyog Pawar lo_dev_qp_q6 = prev_I_qp_q6;
859*c83a76b0SSuyog Pawar }
860*c83a76b0SSuyog Pawar }
861*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC &&
862*c83a76b0SSuyog Pawar i4_intra_frm_int !=
863*c83a76b0SSuyog Pawar 1) /*i_only: In this case P frame Qp will be arbitrary value hence avoiding max_dev_qp to be independent of it*/
864*c83a76b0SSuyog Pawar {
865*c83a76b0SSuyog Pawar //WORD32 i4_p_qp = ps_rate_control_api->ai4_prev_frm_qp[P_PIC];
866*c83a76b0SSuyog Pawar WORD32 i4_p_qp_q6 = ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][P_PIC];
867*c83a76b0SSuyog Pawar switch(i4_complexity_bin)
868*c83a76b0SSuyog Pawar {
869*c83a76b0SSuyog Pawar case 0:
870*c83a76b0SSuyog Pawar hi_dev_qp_temp_q6 = (WORD32)(
871*c83a76b0SSuyog Pawar ((LWORD64)i4_p_qp_q6 * I_TO_P_RATIO * I_TO_P_RATIO * I_TO_P_RATIO) >>
872*c83a76b0SSuyog Pawar (K_Q + K_Q + K_Q));
873*c83a76b0SSuyog Pawar break;
874*c83a76b0SSuyog Pawar case 1:
875*c83a76b0SSuyog Pawar hi_dev_qp_temp_q6 =
876*c83a76b0SSuyog Pawar (WORD32)(((LWORD64)i4_p_qp_q6 * I_TO_P_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q));
877*c83a76b0SSuyog Pawar break;
878*c83a76b0SSuyog Pawar case 2:
879*c83a76b0SSuyog Pawar hi_dev_qp_temp_q6 = (WORD32)(((LWORD64)i4_p_qp_q6 * I_TO_P_RATIO) >> (K_Q));
880*c83a76b0SSuyog Pawar break;
881*c83a76b0SSuyog Pawar case 3:
882*c83a76b0SSuyog Pawar hi_dev_qp_temp_q6 = i4_p_qp_q6;
883*c83a76b0SSuyog Pawar break;
884*c83a76b0SSuyog Pawar default:
885*c83a76b0SSuyog Pawar hi_dev_qp_temp_q6 = (WORD32)(((LWORD64)i4_p_qp_q6 * P_TO_I_RATIO) >> (K_Q));
886*c83a76b0SSuyog Pawar break;
887*c83a76b0SSuyog Pawar }
888*c83a76b0SSuyog Pawar hi_dev_qp_q6 = (hi_dev_qp_q6 > hi_dev_qp_temp_q6) ? hi_dev_qp_temp_q6 : hi_dev_qp_q6;
889*c83a76b0SSuyog Pawar }
890*c83a76b0SSuyog Pawar pi4_hi_dev_qp_q6[0] = hi_dev_qp_q6;
891*c83a76b0SSuyog Pawar pi4_lo_dev_qp_q6[0] = lo_dev_qp_q6;
892*c83a76b0SSuyog Pawar }
893*c83a76b0SSuyog Pawar
894*c83a76b0SSuyog Pawar /****************************************************************************
895*c83a76b0SSuyog Pawar Function Name : get_min
896*c83a76b0SSuyog Pawar Description :
897*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
898*c83a76b0SSuyog Pawar Revision History:
899*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
900*c83a76b0SSuyog Pawar
901*c83a76b0SSuyog Pawar *****************************************************************************/
get_min(WORD32 a,WORD32 b,WORD32 c,WORD32 d)902*c83a76b0SSuyog Pawar static WORD32 get_min(WORD32 a, WORD32 b, WORD32 c, WORD32 d)
903*c83a76b0SSuyog Pawar {
904*c83a76b0SSuyog Pawar WORD32 min = a;
905*c83a76b0SSuyog Pawar if(b < min)
906*c83a76b0SSuyog Pawar min = b;
907*c83a76b0SSuyog Pawar if(c < min)
908*c83a76b0SSuyog Pawar min = c;
909*c83a76b0SSuyog Pawar if(d < min)
910*c83a76b0SSuyog Pawar min = d;
911*c83a76b0SSuyog Pawar return min;
912*c83a76b0SSuyog Pawar }
913*c83a76b0SSuyog Pawar
914*c83a76b0SSuyog Pawar /****************************************************************************
915*c83a76b0SSuyog Pawar Function Name : get_max
916*c83a76b0SSuyog Pawar Description :
917*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
918*c83a76b0SSuyog Pawar Revision History:
919*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
920*c83a76b0SSuyog Pawar
921*c83a76b0SSuyog Pawar *****************************************************************************/
get_max(WORD32 a,WORD32 b,WORD32 c)922*c83a76b0SSuyog Pawar static WORD32 get_max(WORD32 a, WORD32 b, WORD32 c)
923*c83a76b0SSuyog Pawar {
924*c83a76b0SSuyog Pawar WORD32 max = a;
925*c83a76b0SSuyog Pawar if(b > max)
926*c83a76b0SSuyog Pawar max = b;
927*c83a76b0SSuyog Pawar if(c > max)
928*c83a76b0SSuyog Pawar max = c;
929*c83a76b0SSuyog Pawar return max;
930*c83a76b0SSuyog Pawar }
931*c83a76b0SSuyog Pawar /****************************************************************************
932*c83a76b0SSuyog Pawar Function Name : rc_modify_est_tot
933*c83a76b0SSuyog Pawar Description : Adds latest Estimated total bits to the loop .
934*c83a76b0SSuyog Pawar Inputs :
935*c83a76b0SSuyog Pawar Globals :
936*c83a76b0SSuyog Pawar Processing :
937*c83a76b0SSuyog Pawar Outputs :
938*c83a76b0SSuyog Pawar Returns :
939*c83a76b0SSuyog Pawar Issues :
940*c83a76b0SSuyog Pawar Revision History:
941*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
942*c83a76b0SSuyog Pawar
943*c83a76b0SSuyog Pawar *****************************************************************************/
rc_modify_est_tot(rate_control_api_t * ps_rate_control_api,WORD32 i4_tot_est_bits)944*c83a76b0SSuyog Pawar void rc_modify_est_tot(rate_control_api_t *ps_rate_control_api, WORD32 i4_tot_est_bits) //ELP_RC
945*c83a76b0SSuyog Pawar {
946*c83a76b0SSuyog Pawar WORD32 i4_num_frm_parallel, i;
947*c83a76b0SSuyog Pawar i4_num_frm_parallel = ps_rate_control_api->i4_num_frame_parallel;
948*c83a76b0SSuyog Pawar
949*c83a76b0SSuyog Pawar if(i4_num_frm_parallel) //for CPU i4_num_frm_parallel=0
950*c83a76b0SSuyog Pawar {
951*c83a76b0SSuyog Pawar for(i = 1; i < (i4_num_frm_parallel - 1); i++)
952*c83a76b0SSuyog Pawar {
953*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_est_tot_bits[i - 1] = ps_rate_control_api->ai4_est_tot_bits[i];
954*c83a76b0SSuyog Pawar }
955*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_est_tot_bits[i - 1] = i4_tot_est_bits;
956*c83a76b0SSuyog Pawar }
957*c83a76b0SSuyog Pawar }
958*c83a76b0SSuyog Pawar /****************************************************************************
959*c83a76b0SSuyog Pawar Function Name : rc_get_estimate_bit_error
960*c83a76b0SSuyog Pawar Description : function returns the estimated bit error using estimated total
961*c83a76b0SSuyog Pawar bits for the Enc Loop Parallelism based Encoder.
962*c83a76b0SSuyog Pawar Inputs :
963*c83a76b0SSuyog Pawar Globals :
964*c83a76b0SSuyog Pawar Processing :
965*c83a76b0SSuyog Pawar Outputs :
966*c83a76b0SSuyog Pawar Returns :
967*c83a76b0SSuyog Pawar Issues :
968*c83a76b0SSuyog Pawar Revision History:
969*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
970*c83a76b0SSuyog Pawar
971*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_estimate_bit_error(rate_control_api_t * ps_rate_control_api)972*c83a76b0SSuyog Pawar static WORD32 rc_get_estimate_bit_error(rate_control_api_t *ps_rate_control_api)
973*c83a76b0SSuyog Pawar {
974*c83a76b0SSuyog Pawar WORD32 i4_error_bits = 0, i, i4_bits_per_frame;
975*c83a76b0SSuyog Pawar i4_bits_per_frame = get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer);
976*c83a76b0SSuyog Pawar if(ps_rate_control_api->i4_num_frame_parallel >
977*c83a76b0SSuyog Pawar 0) // for CPU ps_rate_control_api->i4_num_frame_parallel =0;
978*c83a76b0SSuyog Pawar {
979*c83a76b0SSuyog Pawar for(i = 0; i < (ps_rate_control_api->i4_num_frame_parallel - 1); i++)
980*c83a76b0SSuyog Pawar {
981*c83a76b0SSuyog Pawar i4_error_bits += (ps_rate_control_api->ai4_est_tot_bits[i] - i4_bits_per_frame);
982*c83a76b0SSuyog Pawar }
983*c83a76b0SSuyog Pawar }
984*c83a76b0SSuyog Pawar return i4_error_bits;
985*c83a76b0SSuyog Pawar }
986*c83a76b0SSuyog Pawar
987*c83a76b0SSuyog Pawar /****************************************************************************
988*c83a76b0SSuyog Pawar Function Name : get_est_hdr_bits
989*c83a76b0SSuyog Pawar Description :
990*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
991*c83a76b0SSuyog Pawar Revision History:
992*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
993*c83a76b0SSuyog Pawar
994*c83a76b0SSuyog Pawar *****************************************************************************/
get_est_hdr_bits(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type)995*c83a76b0SSuyog Pawar WORD32 get_est_hdr_bits(rate_control_api_t *ps_rate_control_api, picture_type_e e_pic_type)
996*c83a76b0SSuyog Pawar {
997*c83a76b0SSuyog Pawar return (get_cur_frm_est_header_bits(ps_rate_control_api->ps_bit_allocation, e_pic_type));
998*c83a76b0SSuyog Pawar }
999*c83a76b0SSuyog Pawar
1000*c83a76b0SSuyog Pawar /****************************************************************************
1001*c83a76b0SSuyog Pawar Function Name : model_availability
1002*c83a76b0SSuyog Pawar Description :
1003*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
1004*c83a76b0SSuyog Pawar Revision History:
1005*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
1006*c83a76b0SSuyog Pawar
1007*c83a76b0SSuyog Pawar *****************************************************************************/
model_availability(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type)1008*c83a76b0SSuyog Pawar WORD32 model_availability(rate_control_api_t *ps_rate_control_api, picture_type_e e_pic_type)
1009*c83a76b0SSuyog Pawar {
1010*c83a76b0SSuyog Pawar return (is_model_valid(ps_rate_control_api->aps_rd_model[e_pic_type]));
1011*c83a76b0SSuyog Pawar }
1012*c83a76b0SSuyog Pawar
1013*c83a76b0SSuyog Pawar /****************************************************************************
1014*c83a76b0SSuyog Pawar Function Name : clip_qp_based_on_prev_ref
1015*c83a76b0SSuyog Pawar Description :
1016*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
1017*c83a76b0SSuyog Pawar Revision History:
1018*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
1019*c83a76b0SSuyog Pawar
1020*c83a76b0SSuyog Pawar *****************************************************************************/
clip_qp_based_on_prev_ref(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type,WORD32 i4_call_type,WORD32 i4_scene_num)1021*c83a76b0SSuyog Pawar WORD32 clip_qp_based_on_prev_ref(
1022*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
1023*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
1024*c83a76b0SSuyog Pawar WORD32 i4_call_type,
1025*c83a76b0SSuyog Pawar WORD32 i4_scene_num)
1026*c83a76b0SSuyog Pawar {
1027*c83a76b0SSuyog Pawar /* WORD32 i4_bpp_based_qp; */
1028*c83a76b0SSuyog Pawar /* If the number pf pels is set to zero it uses the value set during init time */
1029*c83a76b0SSuyog Pawar /* i4_frame_qp = get_init_qp_using_pels_bits_per_frame(ps_rate_control_api->ps_init_qp,
1030*c83a76b0SSuyog Pawar e_pic_type, i4_est_tex_bits, 0); */
1031*c83a76b0SSuyog Pawar WORD32 i4_frame_qp, i4_frame_qp_q6 = 0, i4_min_Kp_Kb_factor = 0;
1032*c83a76b0SSuyog Pawar WORD32 Kp_kb_factor = get_Kp_Kb(ps_rate_control_api->ps_bit_allocation, e_pic_type);
1033*c83a76b0SSuyog Pawar WORD32 kp_kb_ref_ref =
1034*c83a76b0SSuyog Pawar get_Kp_Kb(ps_rate_control_api->ps_bit_allocation, ps_rate_control_api->prev_ref_pic_type);
1035*c83a76b0SSuyog Pawar
1036*c83a76b0SSuyog Pawar {
1037*c83a76b0SSuyog Pawar WORD32 i4_drain_bits_per_frame = get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer),
1038*c83a76b0SSuyog Pawar i4_ebf;
1039*c83a76b0SSuyog Pawar WORD32 i4_delay = cbr_get_delay_frames(ps_rate_control_api->ps_cbr_buffer),
1040*c83a76b0SSuyog Pawar max_buffer_level = 0, rc_type = get_rc_type(ps_rate_control_api->ps_cbr_buffer);
1041*c83a76b0SSuyog Pawar
1042*c83a76b0SSuyog Pawar if(rc_type == VBR_STREAMING)
1043*c83a76b0SSuyog Pawar max_buffer_level = i4_drain_bits_per_frame * i4_delay;
1044*c83a76b0SSuyog Pawar else
1045*c83a76b0SSuyog Pawar max_buffer_level = get_cbr_buffer_size(ps_rate_control_api->ps_cbr_buffer);
1046*c83a76b0SSuyog Pawar
1047*c83a76b0SSuyog Pawar i4_ebf = get_cbr_ebf(ps_rate_control_api->ps_cbr_buffer);
1048*c83a76b0SSuyog Pawar
1049*c83a76b0SSuyog Pawar if(i4_ebf > (WORD32)(0.9f * max_buffer_level))
1050*c83a76b0SSuyog Pawar {
1051*c83a76b0SSuyog Pawar switch(e_pic_type)
1052*c83a76b0SSuyog Pawar {
1053*c83a76b0SSuyog Pawar case P_PIC:
1054*c83a76b0SSuyog Pawar case P1_PIC:
1055*c83a76b0SSuyog Pawar i4_min_Kp_Kb_factor = I_TO_P_RATIO;
1056*c83a76b0SSuyog Pawar break;
1057*c83a76b0SSuyog Pawar case B_PIC:
1058*c83a76b0SSuyog Pawar case BB_PIC:
1059*c83a76b0SSuyog Pawar i4_min_Kp_Kb_factor = I_TO_B_RATIO;
1060*c83a76b0SSuyog Pawar break;
1061*c83a76b0SSuyog Pawar case B1_PIC:
1062*c83a76b0SSuyog Pawar case B11_PIC:
1063*c83a76b0SSuyog Pawar i4_min_Kp_Kb_factor = I_TO_B1_RATIO;
1064*c83a76b0SSuyog Pawar break;
1065*c83a76b0SSuyog Pawar default:
1066*c83a76b0SSuyog Pawar i4_min_Kp_Kb_factor = I_TO_B2_RATIO;
1067*c83a76b0SSuyog Pawar break;
1068*c83a76b0SSuyog Pawar }
1069*c83a76b0SSuyog Pawar }
1070*c83a76b0SSuyog Pawar }
1071*c83a76b0SSuyog Pawar if((e_pic_type == I_PIC) &&
1072*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] == 0x7FFFFFFF))
1073*c83a76b0SSuyog Pawar {
1074*c83a76b0SSuyog Pawar /*Is this a valid case?*/
1075*c83a76b0SSuyog Pawar ASSERT(0);
1076*c83a76b0SSuyog Pawar }
1077*c83a76b0SSuyog Pawar /*If there is a scene cut I frame followed by a scene cut I frame, non scene cut I frame
1078*c83a76b0SSuyog Pawar better assume the Qp of the I frame same as before instead of using bpp based qp*/
1079*c83a76b0SSuyog Pawar else if(
1080*c83a76b0SSuyog Pawar (e_pic_type == I_PIC) &&
1081*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] != 0x7FFFFFFF))
1082*c83a76b0SSuyog Pawar {
1083*c83a76b0SSuyog Pawar i4_frame_qp = ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC];
1084*c83a76b0SSuyog Pawar i4_frame_qp_q6 = ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC];
1085*c83a76b0SSuyog Pawar }
1086*c83a76b0SSuyog Pawar else /*! ISlice*/
1087*c83a76b0SSuyog Pawar {
1088*c83a76b0SSuyog Pawar if((Kp_kb_factor < i4_min_Kp_Kb_factor) && (i4_call_type == 1))
1089*c83a76b0SSuyog Pawar {
1090*c83a76b0SSuyog Pawar Kp_kb_factor = i4_min_Kp_Kb_factor;
1091*c83a76b0SSuyog Pawar trace_printf("Kp_kb_factor %d", Kp_kb_factor);
1092*c83a76b0SSuyog Pawar }
1093*c83a76b0SSuyog Pawar if((kp_kb_ref_ref > Kp_kb_factor) && (i4_call_type == 1))
1094*c83a76b0SSuyog Pawar {
1095*c83a76b0SSuyog Pawar kp_kb_ref_ref = Kp_kb_factor;
1096*c83a76b0SSuyog Pawar }
1097*c83a76b0SSuyog Pawar
1098*c83a76b0SSuyog Pawar if(ps_rate_control_api
1099*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[i4_scene_num][ps_rate_control_api->prev_ref_pic_type] ==
1100*c83a76b0SSuyog Pawar 0x7FFFFFFF)
1101*c83a76b0SSuyog Pawar {
1102*c83a76b0SSuyog Pawar ps_rate_control_api
1103*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[i4_scene_num][ps_rate_control_api->prev_ref_pic_type] =
1104*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC];
1105*c83a76b0SSuyog Pawar kp_kb_ref_ref = 16;
1106*c83a76b0SSuyog Pawar }
1107*c83a76b0SSuyog Pawar
1108*c83a76b0SSuyog Pawar i4_frame_qp_q6 =
1109*c83a76b0SSuyog Pawar ((ps_rate_control_api
1110*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[i4_scene_num][ps_rate_control_api->prev_ref_pic_type] *
1111*c83a76b0SSuyog Pawar Kp_kb_factor) /
1112*c83a76b0SSuyog Pawar kp_kb_ref_ref);
1113*c83a76b0SSuyog Pawar }
1114*c83a76b0SSuyog Pawar return i4_frame_qp_q6;
1115*c83a76b0SSuyog Pawar }
1116*c83a76b0SSuyog Pawar
1117*c83a76b0SSuyog Pawar /****************************************************************************
1118*c83a76b0SSuyog Pawar Function Name : get_frame_level_qp
1119*c83a76b0SSuyog Pawar Description : Get frame qp from the estimated bits
1120*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
1121*c83a76b0SSuyog Pawar i_to_avg_ratio
1122*c83a76b0SSuyog Pawar
1123*c83a76b0SSuyog Pawar Revision History:
1124*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
1125*c83a76b0SSuyog Pawar
1126*c83a76b0SSuyog Pawar *****************************************************************************/
get_frame_level_qp(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type,WORD32 i4_ud_max_bits,WORD32 * pi4_cur_est_texture_bits,float af_sum_weigh[MAX_PIC_TYPE][3],WORD32 i4_call_type,float i_to_avg_ratio,frame_info_t * ps_frame_stat,WORD32 i4_complexity_bin,WORD32 i4_scene_num,WORD32 * pi4_tot_bits_estimated,WORD32 * pi4_is_model_valid,WORD32 * pi4_vbv_buf_max_bits,WORD32 * pi4_est_tex_bits,WORD32 * pi4_cur_est_header_bits,WORD32 * pi4_maxEbfQP,WORD32 * pi4_modelQP,WORD32 * pi4_estimate_to_calc_frm_error)1127*c83a76b0SSuyog Pawar WORD32 get_frame_level_qp(
1128*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
1129*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
1130*c83a76b0SSuyog Pawar WORD32 i4_ud_max_bits,
1131*c83a76b0SSuyog Pawar WORD32 *pi4_cur_est_texture_bits,
1132*c83a76b0SSuyog Pawar float af_sum_weigh[MAX_PIC_TYPE][3],
1133*c83a76b0SSuyog Pawar WORD32 i4_call_type,
1134*c83a76b0SSuyog Pawar float i_to_avg_ratio,
1135*c83a76b0SSuyog Pawar frame_info_t *ps_frame_stat,
1136*c83a76b0SSuyog Pawar WORD32 i4_complexity_bin,
1137*c83a76b0SSuyog Pawar WORD32 i4_scene_num,
1138*c83a76b0SSuyog Pawar WORD32 *pi4_tot_bits_estimated,
1139*c83a76b0SSuyog Pawar WORD32 *pi4_is_model_valid,
1140*c83a76b0SSuyog Pawar WORD32 *pi4_vbv_buf_max_bits,
1141*c83a76b0SSuyog Pawar WORD32 *pi4_est_tex_bits,
1142*c83a76b0SSuyog Pawar WORD32 *pi4_cur_est_header_bits,
1143*c83a76b0SSuyog Pawar WORD32 *pi4_maxEbfQP,
1144*c83a76b0SSuyog Pawar WORD32 *pi4_modelQP,
1145*c83a76b0SSuyog Pawar WORD32 *pi4_estimate_to_calc_frm_error)
1146*c83a76b0SSuyog Pawar {
1147*c83a76b0SSuyog Pawar /* UWORD8 u1_frame_qp; */
1148*c83a76b0SSuyog Pawar WORD32 i4_frame_qp /*,i4_min_frame_qp = 1,i4_max_frame_qp = MAX_MPEG2_QP*/;
1149*c83a76b0SSuyog Pawar WORD32 i4_max_frame_qp_q6 = (MAX_MPEG2_QP << QSCALE_Q_FAC),
1150*c83a76b0SSuyog Pawar i4_min_frame_qp_q6 = MIN_QSCALE_Q6; /*0.707 in q6 corresponds to hevc qp = 1*/
1151*c83a76b0SSuyog Pawar WORD32 i4_is_first_frame_coded = 1;
1152*c83a76b0SSuyog Pawar WORD32 i4_is_model_valid = 0;
1153*c83a76b0SSuyog Pawar WORD32 i4_frame_qp_q6, i4_cur_est_header_bits, i4_frame_qp_q6_based_max_vbv_bits;
1154*c83a76b0SSuyog Pawar WORD32 i4_bit_alloc_est_tex_bits = 0, i4_bit_alloc_est_tex_bits_for_invalid_model = 0,
1155*c83a76b0SSuyog Pawar i4_est_tex_bits, i4_qp_based_min_est_tex_bits, i4_qp_based_max_est_tex_bits,
1156*c83a76b0SSuyog Pawar i4_buf_based_min_bits, i4_buf_based_max_bits;
1157*c83a76b0SSuyog Pawar UWORD32 u4_estimated_sad;
1158*c83a76b0SSuyog Pawar WORD32 i4_buffer_based_max_qp_clip_flag = 0;
1159*c83a76b0SSuyog Pawar WORD32 i4_min_Kp_Kb_factor = 0;
1160*c83a76b0SSuyog Pawar WORD32 i4_steady_state_texture_case = 0;
1161*c83a76b0SSuyog Pawar
1162*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1163*c83a76b0SSuyog Pawar {
1164*c83a76b0SSuyog Pawar *pi4_maxEbfQP = INVALID_QP;
1165*c83a76b0SSuyog Pawar *pi4_modelQP = INVALID_QP;
1166*c83a76b0SSuyog Pawar }
1167*c83a76b0SSuyog Pawar
1168*c83a76b0SSuyog Pawar if((ps_rate_control_api->e_rc_type != VBR_STORAGE) &&
1169*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type != VBR_STORAGE_DVD_COMP) &&
1170*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type != CBR_NLDRC) &&
1171*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type != CONST_QP) &&
1172*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type != VBR_STREAMING))
1173*c83a76b0SSuyog Pawar {
1174*c83a76b0SSuyog Pawar return (0);
1175*c83a76b0SSuyog Pawar }
1176*c83a76b0SSuyog Pawar
1177*c83a76b0SSuyog Pawar i4_is_first_frame_coded = is_first_frame_coded(ps_rate_control_api);
1178*c83a76b0SSuyog Pawar
1179*c83a76b0SSuyog Pawar assign_complexity_coeffs(ps_rate_control_api->ps_bit_allocation, af_sum_weigh);
1180*c83a76b0SSuyog Pawar
1181*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type == CONST_QP)
1182*c83a76b0SSuyog Pawar {
1183*c83a76b0SSuyog Pawar i4_frame_qp = ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][e_pic_type];
1184*c83a76b0SSuyog Pawar i4_frame_qp_q6 =
1185*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][e_pic_type] >> QSCALE_Q_FAC);
1186*c83a76b0SSuyog Pawar }
1187*c83a76b0SSuyog Pawar else
1188*c83a76b0SSuyog Pawar {
1189*c83a76b0SSuyog Pawar i4_cur_est_header_bits =
1190*c83a76b0SSuyog Pawar get_cur_frm_est_header_bits(ps_rate_control_api->ps_bit_allocation, e_pic_type);
1191*c83a76b0SSuyog Pawar u4_estimated_sad = get_est_sad(ps_rate_control_api->ps_est_sad, e_pic_type);
1192*c83a76b0SSuyog Pawar /* Constraining the qp variations based on bits allocated */
1193*c83a76b0SSuyog Pawar /* Step 1: Getting the bits based on bit allocation module */
1194*c83a76b0SSuyog Pawar /*check if model has atleast one data point, otherwise go with default qp*/
1195*c83a76b0SSuyog Pawar i4_is_model_valid = is_model_valid(ps_rate_control_api->aps_rd_model[e_pic_type]);
1196*c83a76b0SSuyog Pawar
1197*c83a76b0SSuyog Pawar if(i4_is_model_valid == 1)
1198*c83a76b0SSuyog Pawar {
1199*c83a76b0SSuyog Pawar i4_bit_alloc_est_tex_bits = get_cur_frm_est_texture_bits(
1200*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
1201*c83a76b0SSuyog Pawar ps_rate_control_api->aps_rd_model,
1202*c83a76b0SSuyog Pawar ps_rate_control_api->ps_est_sad,
1203*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
1204*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
1205*c83a76b0SSuyog Pawar e_pic_type,
1206*c83a76b0SSuyog Pawar i4_is_first_frame_coded,
1207*c83a76b0SSuyog Pawar 0,
1208*c83a76b0SSuyog Pawar i4_call_type,
1209*c83a76b0SSuyog Pawar i_to_avg_ratio,
1210*c83a76b0SSuyog Pawar i4_is_model_valid);
1211*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1212*c83a76b0SSuyog Pawar {
1213*c83a76b0SSuyog Pawar *pi4_estimate_to_calc_frm_error =
1214*c83a76b0SSuyog Pawar i4_bit_alloc_est_tex_bits + i4_cur_est_header_bits;
1215*c83a76b0SSuyog Pawar }
1216*c83a76b0SSuyog Pawar
1217*c83a76b0SSuyog Pawar /* vbv buffer position based error correction to keep away encoder buffer overflow at layer 0 pictures*/
1218*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC || e_pic_type == P_PIC || e_pic_type == P1_PIC)
1219*c83a76b0SSuyog Pawar {
1220*c83a76b0SSuyog Pawar WORD32 i4_cur_ebf = get_cbr_ebf(ps_rate_control_api->ps_cbr_buffer);
1221*c83a76b0SSuyog Pawar WORD32 i4_vbv_size = get_cbr_buffer_size(ps_rate_control_api->ps_cbr_buffer);
1222*c83a76b0SSuyog Pawar WORD32 i4_max_ebf = (WORD32)(i4_vbv_size * MAX_THRESHOLD_VBV_FRM_ERROR);
1223*c83a76b0SSuyog Pawar WORD32 i4_drain_rate = get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer);
1224*c83a76b0SSuyog Pawar WORD32 i4_total_bits_allocted = i4_bit_alloc_est_tex_bits + i4_cur_est_header_bits;
1225*c83a76b0SSuyog Pawar WORD32 i4_total_bits_to_be_alloc;
1226*c83a76b0SSuyog Pawar WORD32 i4_expected_ebf = (i4_cur_ebf + i4_total_bits_allocted - i4_drain_rate);
1227*c83a76b0SSuyog Pawar /*if expected ebf is greater than max threashold, correct the allocation such that it never cross max
1228*c83a76b0SSuyog Pawar but if it less than drain rate, atleast give drainrate bits*/
1229*c83a76b0SSuyog Pawar if(i4_expected_ebf > i4_max_ebf)
1230*c83a76b0SSuyog Pawar {
1231*c83a76b0SSuyog Pawar i4_total_bits_to_be_alloc = MAX(
1232*c83a76b0SSuyog Pawar i4_drain_rate, (i4_total_bits_allocted - (i4_expected_ebf - i4_max_ebf)));
1233*c83a76b0SSuyog Pawar i4_bit_alloc_est_tex_bits = i4_total_bits_to_be_alloc - i4_cur_est_header_bits;
1234*c83a76b0SSuyog Pawar }
1235*c83a76b0SSuyog Pawar }
1236*c83a76b0SSuyog Pawar }
1237*c83a76b0SSuyog Pawar else
1238*c83a76b0SSuyog Pawar {
1239*c83a76b0SSuyog Pawar i4_bit_alloc_est_tex_bits_for_invalid_model = get_cur_frm_est_texture_bits(
1240*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
1241*c83a76b0SSuyog Pawar ps_rate_control_api->aps_rd_model,
1242*c83a76b0SSuyog Pawar ps_rate_control_api->ps_est_sad,
1243*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
1244*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
1245*c83a76b0SSuyog Pawar e_pic_type,
1246*c83a76b0SSuyog Pawar i4_is_first_frame_coded,
1247*c83a76b0SSuyog Pawar 0,
1248*c83a76b0SSuyog Pawar i4_call_type,
1249*c83a76b0SSuyog Pawar i_to_avg_ratio,
1250*c83a76b0SSuyog Pawar i4_is_model_valid);
1251*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1252*c83a76b0SSuyog Pawar {
1253*c83a76b0SSuyog Pawar *pi4_estimate_to_calc_frm_error =
1254*c83a76b0SSuyog Pawar i4_bit_alloc_est_tex_bits_for_invalid_model + i4_cur_est_header_bits;
1255*c83a76b0SSuyog Pawar }
1256*c83a76b0SSuyog Pawar }
1257*c83a76b0SSuyog Pawar
1258*c83a76b0SSuyog Pawar #if 1 /*model_low_bitrate_bug*/
1259*c83a76b0SSuyog Pawar /* This condition is added to use the model for cases when the estimated bits is less than zero.
1260*c83a76b0SSuyog Pawar We assume some bits of the header are used for texture and calcualte the qp */
1261*c83a76b0SSuyog Pawar if(i4_bit_alloc_est_tex_bits <= (i4_cur_est_header_bits >> 3))
1262*c83a76b0SSuyog Pawar {
1263*c83a76b0SSuyog Pawar i4_bit_alloc_est_tex_bits = (i4_cur_est_header_bits >> 3);
1264*c83a76b0SSuyog Pawar }
1265*c83a76b0SSuyog Pawar #endif
1266*c83a76b0SSuyog Pawar
1267*c83a76b0SSuyog Pawar /* Step 2: Getting the min and max texture bits based on min and max qp */
1268*c83a76b0SSuyog Pawar if(i4_is_model_valid && ps_rate_control_api->au1_avg_bitrate_changed[e_pic_type] == 0)
1269*c83a76b0SSuyog Pawar {
1270*c83a76b0SSuyog Pawar WORD32 /*i4_min_qp, i4_max_qp,*/ i4_max_qp_q6, i4_min_qp_q6;
1271*c83a76b0SSuyog Pawar number_t s_lin_coeff_wo_int =
1272*c83a76b0SSuyog Pawar get_linear_coefficient(ps_rate_control_api->aps_rd_model[e_pic_type]);
1273*c83a76b0SSuyog Pawar
1274*c83a76b0SSuyog Pawar if(s_lin_coeff_wo_int.sm != 0)
1275*c83a76b0SSuyog Pawar {
1276*c83a76b0SSuyog Pawar /* Get the min and max qp deviation allowed based on prev frame qp */
1277*c83a76b0SSuyog Pawar get_min_max_qp(
1278*c83a76b0SSuyog Pawar ps_rate_control_api,
1279*c83a76b0SSuyog Pawar e_pic_type,
1280*c83a76b0SSuyog Pawar &i4_max_qp_q6,
1281*c83a76b0SSuyog Pawar &i4_min_qp_q6,
1282*c83a76b0SSuyog Pawar i4_complexity_bin,
1283*c83a76b0SSuyog Pawar i4_scene_num);
1284*c83a76b0SSuyog Pawar
1285*c83a76b0SSuyog Pawar /* Estimate the max bits based on min qp */
1286*c83a76b0SSuyog Pawar i4_qp_based_min_est_tex_bits = estimate_bits_for_qp(
1287*c83a76b0SSuyog Pawar ps_rate_control_api->aps_rd_model[e_pic_type], u4_estimated_sad, i4_max_qp_q6);
1288*c83a76b0SSuyog Pawar /* Estimate the min bits based on max qp */
1289*c83a76b0SSuyog Pawar i4_qp_based_max_est_tex_bits = estimate_bits_for_qp(
1290*c83a76b0SSuyog Pawar ps_rate_control_api->aps_rd_model[e_pic_type], u4_estimated_sad, i4_min_qp_q6);
1291*c83a76b0SSuyog Pawar /*disable qp based min and max swing restriction*/
1292*c83a76b0SSuyog Pawar i4_min_frame_qp_q6 = i4_min_qp_q6;
1293*c83a76b0SSuyog Pawar i4_max_frame_qp_q6 = i4_max_qp_q6;
1294*c83a76b0SSuyog Pawar i4_qp_based_max_est_tex_bits = i4_bit_alloc_est_tex_bits;
1295*c83a76b0SSuyog Pawar i4_qp_based_min_est_tex_bits = i4_bit_alloc_est_tex_bits;
1296*c83a76b0SSuyog Pawar }
1297*c83a76b0SSuyog Pawar else
1298*c83a76b0SSuyog Pawar {
1299*c83a76b0SSuyog Pawar i4_qp_based_min_est_tex_bits = i4_bit_alloc_est_tex_bits;
1300*c83a76b0SSuyog Pawar i4_qp_based_max_est_tex_bits = i4_bit_alloc_est_tex_bits;
1301*c83a76b0SSuyog Pawar }
1302*c83a76b0SSuyog Pawar }
1303*c83a76b0SSuyog Pawar else
1304*c83a76b0SSuyog Pawar {
1305*c83a76b0SSuyog Pawar i4_qp_based_min_est_tex_bits = i4_bit_alloc_est_tex_bits_for_invalid_model;
1306*c83a76b0SSuyog Pawar i4_qp_based_max_est_tex_bits = i4_bit_alloc_est_tex_bits_for_invalid_model;
1307*c83a76b0SSuyog Pawar ps_rate_control_api->au1_avg_bitrate_changed[e_pic_type] = 0;
1308*c83a76b0SSuyog Pawar }
1309*c83a76b0SSuyog Pawar
1310*c83a76b0SSuyog Pawar /* Step 3: Getting the min and max texture bits based on buffer fullness */
1311*c83a76b0SSuyog Pawar
1312*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1313*c83a76b0SSuyog Pawar {
1314*c83a76b0SSuyog Pawar WORD32 i4_get_error;
1315*c83a76b0SSuyog Pawar
1316*c83a76b0SSuyog Pawar i4_get_error = rc_get_estimate_bit_error(ps_rate_control_api);
1317*c83a76b0SSuyog Pawar
1318*c83a76b0SSuyog Pawar get_min_max_bits_based_on_buffer(
1319*c83a76b0SSuyog Pawar ps_rate_control_api,
1320*c83a76b0SSuyog Pawar e_pic_type,
1321*c83a76b0SSuyog Pawar &i4_buf_based_min_bits,
1322*c83a76b0SSuyog Pawar &i4_buf_based_max_bits,
1323*c83a76b0SSuyog Pawar i4_get_error);
1324*c83a76b0SSuyog Pawar
1325*c83a76b0SSuyog Pawar /*In case buffer limitation will come, no need to reduce the QP further because of warning flag*/
1326*c83a76b0SSuyog Pawar if(i4_bit_alloc_est_tex_bits < (i4_buf_based_min_bits - i4_cur_est_header_bits))
1327*c83a76b0SSuyog Pawar ps_rate_control_api->i4_underflow_warning = 0;
1328*c83a76b0SSuyog Pawar
1329*c83a76b0SSuyog Pawar if(i4_buf_based_max_bits < (i4_bit_alloc_est_tex_bits + i4_cur_est_header_bits))
1330*c83a76b0SSuyog Pawar {
1331*c83a76b0SSuyog Pawar i4_buffer_based_max_qp_clip_flag = 1;
1332*c83a76b0SSuyog Pawar }
1333*c83a76b0SSuyog Pawar trace_printf(
1334*c83a76b0SSuyog Pawar "i4_buf_based_min_bits %d i4_buf_based_max_bits %d",
1335*c83a76b0SSuyog Pawar i4_buf_based_min_bits,
1336*c83a76b0SSuyog Pawar i4_buf_based_max_bits);
1337*c83a76b0SSuyog Pawar trace_printf(
1338*c83a76b0SSuyog Pawar "Prev I frame qp q6 %d P frame qp q6 %d",
1339*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[I_PIC],
1340*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[P_PIC]);
1341*c83a76b0SSuyog Pawar }
1342*c83a76b0SSuyog Pawar else
1343*c83a76b0SSuyog Pawar {
1344*c83a76b0SSuyog Pawar i4_buf_based_min_bits = i4_qp_based_min_est_tex_bits;
1345*c83a76b0SSuyog Pawar i4_buf_based_max_bits = i4_qp_based_max_est_tex_bits;
1346*c83a76b0SSuyog Pawar }
1347*c83a76b0SSuyog Pawar /* for I frame the max bits is not restricted based on the user input */
1348*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC)
1349*c83a76b0SSuyog Pawar {
1350*c83a76b0SSuyog Pawar i4_ud_max_bits = 0x7fffffff; /* i4_bit_alloc_est_tex_bits + i4_cur_est_header_bits; */
1351*c83a76b0SSuyog Pawar }
1352*c83a76b0SSuyog Pawar
1353*c83a76b0SSuyog Pawar /* Step 4: Clip the bits allocated based on
1354*c83a76b0SSuyog Pawar 1) FinalBits = Max of (BitallocBits, MinBitsMaxQp, MinBufferBits)
1355*c83a76b0SSuyog Pawar 2) FinalBits = Min of (MaxBitsMinQp, MaxBufferBits, MaxUserDefBits, FinalBits)
1356*c83a76b0SSuyog Pawar Note that max is done after min to prevent over-consumption */
1357*c83a76b0SSuyog Pawar /* Finding the max of all the minimum bits */
1358*c83a76b0SSuyog Pawar i4_est_tex_bits = get_max(
1359*c83a76b0SSuyog Pawar i4_bit_alloc_est_tex_bits,
1360*c83a76b0SSuyog Pawar i4_qp_based_min_est_tex_bits,
1361*c83a76b0SSuyog Pawar (i4_buf_based_min_bits - i4_cur_est_header_bits));
1362*c83a76b0SSuyog Pawar i4_est_tex_bits = get_min(
1363*c83a76b0SSuyog Pawar i4_est_tex_bits,
1364*c83a76b0SSuyog Pawar i4_qp_based_max_est_tex_bits,
1365*c83a76b0SSuyog Pawar (i4_ud_max_bits - i4_cur_est_header_bits),
1366*c83a76b0SSuyog Pawar (i4_buf_based_max_bits - i4_cur_est_header_bits));
1367*c83a76b0SSuyog Pawar
1368*c83a76b0SSuyog Pawar /*Highest priority given to min and max qp followed by buffer based min and max to prevent overconsumption in process of preventing stuffing*/
1369*c83a76b0SSuyog Pawar CLIP(
1370*c83a76b0SSuyog Pawar i4_est_tex_bits,
1371*c83a76b0SSuyog Pawar i4_buf_based_max_bits - i4_cur_est_header_bits,
1372*c83a76b0SSuyog Pawar i4_buf_based_min_bits - i4_cur_est_header_bits);
1373*c83a76b0SSuyog Pawar
1374*c83a76b0SSuyog Pawar {
1375*c83a76b0SSuyog Pawar WORD32 i4_drain_bits_per_frame =
1376*c83a76b0SSuyog Pawar get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer),
1377*c83a76b0SSuyog Pawar i4_ebf;
1378*c83a76b0SSuyog Pawar WORD32 i4_delay = cbr_get_delay_frames(ps_rate_control_api->ps_cbr_buffer),
1379*c83a76b0SSuyog Pawar max_buffer_level = 0, rc_type = get_rc_type(ps_rate_control_api->ps_cbr_buffer);
1380*c83a76b0SSuyog Pawar
1381*c83a76b0SSuyog Pawar if(rc_type == VBR_STREAMING)
1382*c83a76b0SSuyog Pawar max_buffer_level = i4_drain_bits_per_frame * i4_delay;
1383*c83a76b0SSuyog Pawar else
1384*c83a76b0SSuyog Pawar max_buffer_level = get_cbr_buffer_size(ps_rate_control_api->ps_cbr_buffer);
1385*c83a76b0SSuyog Pawar
1386*c83a76b0SSuyog Pawar i4_ebf = get_cbr_ebf(ps_rate_control_api->ps_cbr_buffer);
1387*c83a76b0SSuyog Pawar
1388*c83a76b0SSuyog Pawar if(i4_ebf > (WORD32)(0.9f * max_buffer_level))
1389*c83a76b0SSuyog Pawar {
1390*c83a76b0SSuyog Pawar i4_buffer_based_max_qp_clip_flag = 1;
1391*c83a76b0SSuyog Pawar switch(e_pic_type)
1392*c83a76b0SSuyog Pawar {
1393*c83a76b0SSuyog Pawar case P_PIC:
1394*c83a76b0SSuyog Pawar case P1_PIC:
1395*c83a76b0SSuyog Pawar i4_min_Kp_Kb_factor = I_TO_P_RATIO;
1396*c83a76b0SSuyog Pawar break;
1397*c83a76b0SSuyog Pawar case B_PIC:
1398*c83a76b0SSuyog Pawar case BB_PIC:
1399*c83a76b0SSuyog Pawar i4_min_Kp_Kb_factor = I_TO_B_RATIO;
1400*c83a76b0SSuyog Pawar break;
1401*c83a76b0SSuyog Pawar case B1_PIC:
1402*c83a76b0SSuyog Pawar case B11_PIC:
1403*c83a76b0SSuyog Pawar i4_min_Kp_Kb_factor = I_TO_B1_RATIO;
1404*c83a76b0SSuyog Pawar break;
1405*c83a76b0SSuyog Pawar default:
1406*c83a76b0SSuyog Pawar i4_min_Kp_Kb_factor = I_TO_B2_RATIO;
1407*c83a76b0SSuyog Pawar break;
1408*c83a76b0SSuyog Pawar }
1409*c83a76b0SSuyog Pawar }
1410*c83a76b0SSuyog Pawar }
1411*c83a76b0SSuyog Pawar /*i4_is_first_frame_coded will be considered only in 2 pass, since 2 pass precise I to rest is calcuated considering first sug-gop and full sub-gop complexity separately. Using offset based
1412*c83a76b0SSuyog Pawar qp instead of single frame model(with default bit allocation)*/
1413*c83a76b0SSuyog Pawar /* Step 6: Estimate the qp generated for the given texture bits */
1414*c83a76b0SSuyog Pawar if((!i4_is_first_frame_coded /* && ps_rate_control_api->i4_rc_pass == 2*/) ||
1415*c83a76b0SSuyog Pawar !i4_is_model_valid) //ELP_RC
1416*c83a76b0SSuyog Pawar {
1417*c83a76b0SSuyog Pawar /* WORD32 i4_bpp_based_qp; */
1418*c83a76b0SSuyog Pawar /* If the number pf pels is set to zero it uses the value set during init time */
1419*c83a76b0SSuyog Pawar /* i4_frame_qp = get_init_qp_using_pels_bits_per_frame(ps_rate_control_api->ps_init_qp,
1420*c83a76b0SSuyog Pawar e_pic_type, i4_est_tex_bits, 0); */
1421*c83a76b0SSuyog Pawar WORD32 Kp_kb_factor = get_Kp_Kb(ps_rate_control_api->ps_bit_allocation, e_pic_type);
1422*c83a76b0SSuyog Pawar WORD32 kp_kb_ref_ref = get_Kp_Kb(
1423*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation, ps_rate_control_api->prev_ref_pic_type);
1424*c83a76b0SSuyog Pawar
1425*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC &&
1426*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] == 0x7FFFFFFF)
1427*c83a76b0SSuyog Pawar {
1428*c83a76b0SSuyog Pawar /*Is this a valid case?*/
1429*c83a76b0SSuyog Pawar ASSERT(0);
1430*c83a76b0SSuyog Pawar i4_frame_qp = get_init_qp_using_pels_bits_per_frame(
1431*c83a76b0SSuyog Pawar ps_rate_control_api->ps_init_qp, e_pic_type, i4_est_tex_bits, 0);
1432*c83a76b0SSuyog Pawar i4_frame_qp_q6 = i4_frame_qp << QSCALE_Q_FAC;
1433*c83a76b0SSuyog Pawar }
1434*c83a76b0SSuyog Pawar /*If there is a scene cut I frame followed by a scene cut I frame, non scene cut I frame
1435*c83a76b0SSuyog Pawar better assume the Qp of the I frame same as before instead of using bpp based qp*/
1436*c83a76b0SSuyog Pawar else if(
1437*c83a76b0SSuyog Pawar e_pic_type == I_PIC &&
1438*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] != 0x7FFFFFFF)
1439*c83a76b0SSuyog Pawar {
1440*c83a76b0SSuyog Pawar i4_frame_qp = ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC];
1441*c83a76b0SSuyog Pawar i4_frame_qp_q6 = ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC];
1442*c83a76b0SSuyog Pawar }
1443*c83a76b0SSuyog Pawar else /*! ISlice*/
1444*c83a76b0SSuyog Pawar {
1445*c83a76b0SSuyog Pawar if((Kp_kb_factor < i4_min_Kp_Kb_factor) && (i4_call_type == 1))
1446*c83a76b0SSuyog Pawar {
1447*c83a76b0SSuyog Pawar Kp_kb_factor = i4_min_Kp_Kb_factor;
1448*c83a76b0SSuyog Pawar trace_printf("Kp_kb_factor %d", Kp_kb_factor);
1449*c83a76b0SSuyog Pawar }
1450*c83a76b0SSuyog Pawar if((kp_kb_ref_ref > Kp_kb_factor) && (i4_call_type == 1))
1451*c83a76b0SSuyog Pawar {
1452*c83a76b0SSuyog Pawar kp_kb_ref_ref = Kp_kb_factor;
1453*c83a76b0SSuyog Pawar }
1454*c83a76b0SSuyog Pawar
1455*c83a76b0SSuyog Pawar if(ps_rate_control_api
1456*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[i4_scene_num][ps_rate_control_api->prev_ref_pic_type] ==
1457*c83a76b0SSuyog Pawar 0x7FFFFFFF)
1458*c83a76b0SSuyog Pawar {
1459*c83a76b0SSuyog Pawar ps_rate_control_api
1460*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[i4_scene_num][ps_rate_control_api->prev_ref_pic_type] =
1461*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC];
1462*c83a76b0SSuyog Pawar kp_kb_ref_ref = 16;
1463*c83a76b0SSuyog Pawar }
1464*c83a76b0SSuyog Pawar
1465*c83a76b0SSuyog Pawar i4_frame_qp_q6 =
1466*c83a76b0SSuyog Pawar ((ps_rate_control_api
1467*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[i4_scene_num][ps_rate_control_api->prev_ref_pic_type] *
1468*c83a76b0SSuyog Pawar Kp_kb_factor) /
1469*c83a76b0SSuyog Pawar kp_kb_ref_ref);
1470*c83a76b0SSuyog Pawar }
1471*c83a76b0SSuyog Pawar
1472*c83a76b0SSuyog Pawar /*HEVC_hierarchy: Breaks pause to resume logic if any and also the HBR mode concept as bit ratios are not known. It is now quaranteed that all frames
1473*c83a76b0SSuyog Pawar encoded after scene cut will belong to new scene(B pic of first sub-gop)Hence the below logic of using max of either current estimate
1474*c83a76b0SSuyog Pawar or previous B frame qp is not required*/
1475*c83a76b0SSuyog Pawar /* Since precise SCD position at B-pic level is not known, take the MAX of earlier B-QP and scaled I_QP after SCD */
1476*c83a76b0SSuyog Pawar /*HEVC_RC : Since precise SCD location is known and it is guranteed that pic encoded after I pic belongs to new scene*/
1477*c83a76b0SSuyog Pawar
1478*c83a76b0SSuyog Pawar {
1479*c83a76b0SSuyog Pawar WORD32 i4_bits_per_frame;
1480*c83a76b0SSuyog Pawar i4_bits_per_frame = get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer);
1481*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1482*c83a76b0SSuyog Pawar {
1483*c83a76b0SSuyog Pawar rc_modify_est_tot(ps_rate_control_api, i4_bits_per_frame);
1484*c83a76b0SSuyog Pawar }
1485*c83a76b0SSuyog Pawar }
1486*c83a76b0SSuyog Pawar }
1487*c83a76b0SSuyog Pawar /* The check is becaue the model gives a negative QP when the
1488*c83a76b0SSuyog Pawar i4_est_tex_bits is less than or equal to 0
1489*c83a76b0SSuyog Pawar [This is a bug in the model]. As a temporary fix, the frame QP
1490*c83a76b0SSuyog Pawar is being set to the max QP allowed */
1491*c83a76b0SSuyog Pawar else if(i4_est_tex_bits > 0)
1492*c83a76b0SSuyog Pawar {
1493*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1494*c83a76b0SSuyog Pawar {
1495*c83a76b0SSuyog Pawar rc_modify_est_tot(ps_rate_control_api, (i4_est_tex_bits + i4_cur_est_header_bits));
1496*c83a76b0SSuyog Pawar }
1497*c83a76b0SSuyog Pawar i4_steady_state_texture_case = 1;
1498*c83a76b0SSuyog Pawar /* Query the model for the Qp for the corresponding frame*/
1499*c83a76b0SSuyog Pawar i4_frame_qp_q6_based_max_vbv_bits = find_qp_for_target_bits(
1500*c83a76b0SSuyog Pawar ps_rate_control_api->aps_rd_model[e_pic_type],
1501*c83a76b0SSuyog Pawar i4_buf_based_max_bits - i4_cur_est_header_bits,
1502*c83a76b0SSuyog Pawar u4_estimated_sad,
1503*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_max_qp_q6[e_pic_type]),
1504*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_min_qp_q6[e_pic_type]));
1505*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1506*c83a76b0SSuyog Pawar {
1507*c83a76b0SSuyog Pawar *pi4_maxEbfQP = ihevce_rc_get_scaled_hevce_qp_q6(
1508*c83a76b0SSuyog Pawar i4_frame_qp_q6_based_max_vbv_bits, ps_rate_control_api->u1_bit_depth);
1509*c83a76b0SSuyog Pawar }
1510*c83a76b0SSuyog Pawar /* Query the model for the Qp for the corresponding frame*/
1511*c83a76b0SSuyog Pawar i4_frame_qp_q6 = find_qp_for_target_bits(
1512*c83a76b0SSuyog Pawar ps_rate_control_api->aps_rd_model[e_pic_type],
1513*c83a76b0SSuyog Pawar i4_est_tex_bits,
1514*c83a76b0SSuyog Pawar u4_estimated_sad,
1515*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_max_qp_q6[e_pic_type]),
1516*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_min_qp_q6[e_pic_type]));
1517*c83a76b0SSuyog Pawar i4_frame_qp = ((i4_frame_qp_q6 + (1 << (QSCALE_Q_FAC - 1))) >> QSCALE_Q_FAC);
1518*c83a76b0SSuyog Pawar }
1519*c83a76b0SSuyog Pawar else
1520*c83a76b0SSuyog Pawar {
1521*c83a76b0SSuyog Pawar {
1522*c83a76b0SSuyog Pawar WORD32 i4_bits_per_frame;
1523*c83a76b0SSuyog Pawar i4_bits_per_frame = get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer);
1524*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1525*c83a76b0SSuyog Pawar {
1526*c83a76b0SSuyog Pawar rc_modify_est_tot(ps_rate_control_api, i4_bits_per_frame);
1527*c83a76b0SSuyog Pawar }
1528*c83a76b0SSuyog Pawar }
1529*c83a76b0SSuyog Pawar i4_frame_qp = ps_rate_control_api->ai4_max_qp[e_pic_type];
1530*c83a76b0SSuyog Pawar i4_frame_qp_q6 = ps_rate_control_api->ai4_max_qp_q6[e_pic_type];
1531*c83a76b0SSuyog Pawar }
1532*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1533*c83a76b0SSuyog Pawar {
1534*c83a76b0SSuyog Pawar *pi4_modelQP =
1535*c83a76b0SSuyog Pawar ihevce_rc_get_scaled_hevce_qp_q6(i4_frame_qp_q6, ps_rate_control_api->u1_bit_depth);
1536*c83a76b0SSuyog Pawar }
1537*c83a76b0SSuyog Pawar {
1538*c83a76b0SSuyog Pawar /*This clip is added to prevent the change in qp close to scene cuts i.e even though the buffer
1539*c83a76b0SSuyog Pawar allows the qp to go low the bit alloc model has a problem of having the denominator considering
1540*c83a76b0SSuyog Pawar the previous subgop complexity and giving bits*/
1541*c83a76b0SSuyog Pawar WORD32 i4_clip_flag =
1542*c83a76b0SSuyog Pawar ((i4_call_type == 1) && (i4_is_model_valid == 1) &&
1543*c83a76b0SSuyog Pawar (ps_rate_control_api->i4_rc_pass == 2) &&
1544*c83a76b0SSuyog Pawar (i4_buf_based_max_bits > i4_est_tex_bits));
1545*c83a76b0SSuyog Pawar WORD32 i4_ebf = rc_get_ebf(ps_rate_control_api),
1546*c83a76b0SSuyog Pawar i4_max_ebf = i4_ebf + i4_buf_based_max_bits;
1547*c83a76b0SSuyog Pawar WORD32 i4_inter_frame_interval =
1548*c83a76b0SSuyog Pawar pic_type_get_inter_frame_interval(ps_rate_control_api->ps_pic_handling);
1549*c83a76b0SSuyog Pawar float f_buffer_fullness = (float)i4_ebf / i4_max_ebf;
1550*c83a76b0SSuyog Pawar i4_clip_flag = i4_clip_flag && (ps_rate_control_api->i4_scd_in_period_2_pass == 1);
1551*c83a76b0SSuyog Pawar i4_clip_flag = i4_clip_flag && (i4_ebf < (i4_max_ebf * 0.5f));
1552*c83a76b0SSuyog Pawar i4_clip_flag = i4_clip_flag && (ps_rate_control_api->e_rc_type == VBR_STREAMING);
1553*c83a76b0SSuyog Pawar
1554*c83a76b0SSuyog Pawar i4_clip_flag = i4_clip_flag && (ps_rate_control_api->i4_frames_since_last_scd >
1555*c83a76b0SSuyog Pawar i4_inter_frame_interval);
1556*c83a76b0SSuyog Pawar
1557*c83a76b0SSuyog Pawar if(i4_clip_flag == 1)
1558*c83a76b0SSuyog Pawar {
1559*c83a76b0SSuyog Pawar WORD32 i4_prev_frame_tot_est_bits = ba_get_prev_frame_tot_est_bits(
1560*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation, (WORD32)ps_rate_control_api->e_rc_type);
1561*c83a76b0SSuyog Pawar WORD32 i4_prev_frame_tot_bits = ba_get_prev_frame_tot_bits(
1562*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation, (WORD32)ps_rate_control_api->e_rc_type);
1563*c83a76b0SSuyog Pawar float i4_consumption_ratio =
1564*c83a76b0SSuyog Pawar (float)i4_prev_frame_tot_bits / i4_prev_frame_tot_est_bits;
1565*c83a76b0SSuyog Pawar if(i4_consumption_ratio > 0.7f && i4_consumption_ratio < 1.5f)
1566*c83a76b0SSuyog Pawar i4_clip_flag = 1;
1567*c83a76b0SSuyog Pawar else
1568*c83a76b0SSuyog Pawar i4_clip_flag = 0;
1569*c83a76b0SSuyog Pawar }
1570*c83a76b0SSuyog Pawar if(i4_clip_flag == 1)
1571*c83a76b0SSuyog Pawar {
1572*c83a76b0SSuyog Pawar trace_printf("Clipped");
1573*c83a76b0SSuyog Pawar trace_printf("Before %d", i4_frame_qp_q6);
1574*c83a76b0SSuyog Pawar if(af_sum_weigh[e_pic_type][0] > 1.0f)
1575*c83a76b0SSuyog Pawar {
1576*c83a76b0SSuyog Pawar /*Complex followed by simple*/
1577*c83a76b0SSuyog Pawar if(i4_frame_qp_q6 >
1578*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][e_pic_type])
1579*c83a76b0SSuyog Pawar {
1580*c83a76b0SSuyog Pawar if(f_buffer_fullness < 0.3f)
1581*c83a76b0SSuyog Pawar {
1582*c83a76b0SSuyog Pawar i4_frame_qp_q6 =
1583*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][e_pic_type];
1584*c83a76b0SSuyog Pawar }
1585*c83a76b0SSuyog Pawar else
1586*c83a76b0SSuyog Pawar {
1587*c83a76b0SSuyog Pawar if(i4_frame_qp_q6 >
1588*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][e_pic_type] *
1589*c83a76b0SSuyog Pawar 72 * 3))
1590*c83a76b0SSuyog Pawar i4_frame_qp_q6 =
1591*c83a76b0SSuyog Pawar (ps_rate_control_api
1592*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[i4_scene_num][e_pic_type] *
1593*c83a76b0SSuyog Pawar 72 * 3);
1594*c83a76b0SSuyog Pawar }
1595*c83a76b0SSuyog Pawar }
1596*c83a76b0SSuyog Pawar }
1597*c83a76b0SSuyog Pawar if(af_sum_weigh[e_pic_type][0] < 1.0f)
1598*c83a76b0SSuyog Pawar {
1599*c83a76b0SSuyog Pawar /*Simple followed by complex*/
1600*c83a76b0SSuyog Pawar if(i4_frame_qp_q6 <
1601*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][e_pic_type])
1602*c83a76b0SSuyog Pawar {
1603*c83a76b0SSuyog Pawar /*i4_frame_qp_q6 = ps_rate_control_api->ai4_prev_frm_qp_q6[e_pic_type];*/
1604*c83a76b0SSuyog Pawar }
1605*c83a76b0SSuyog Pawar }
1606*c83a76b0SSuyog Pawar trace_printf("After %d", i4_frame_qp_q6);
1607*c83a76b0SSuyog Pawar }
1608*c83a76b0SSuyog Pawar }
1609*c83a76b0SSuyog Pawar
1610*c83a76b0SSuyog Pawar /*swing restriciton based on previous frame qp swing*/
1611*c83a76b0SSuyog Pawar {
1612*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1613*c83a76b0SSuyog Pawar {
1614*c83a76b0SSuyog Pawar trace_printf(
1615*c83a76b0SSuyog Pawar "Before i4_frame_qp_q6 = %d min qp = %d max_qp = %d "
1616*c83a76b0SSuyog Pawar "bufclip %d",
1617*c83a76b0SSuyog Pawar i4_frame_qp_q6,
1618*c83a76b0SSuyog Pawar (i4_min_frame_qp_q6),
1619*c83a76b0SSuyog Pawar (i4_max_frame_qp_q6),
1620*c83a76b0SSuyog Pawar i4_buffer_based_max_qp_clip_flag);
1621*c83a76b0SSuyog Pawar }
1622*c83a76b0SSuyog Pawar if(i4_frame_qp_q6 < i4_min_frame_qp_q6)
1623*c83a76b0SSuyog Pawar i4_frame_qp_q6 = i4_min_frame_qp_q6;
1624*c83a76b0SSuyog Pawar
1625*c83a76b0SSuyog Pawar /*removed low side clipping to avoid HRD compliance issue*/
1626*c83a76b0SSuyog Pawar if(i4_steady_state_texture_case)
1627*c83a76b0SSuyog Pawar {
1628*c83a76b0SSuyog Pawar if(i4_frame_qp_q6 > i4_max_frame_qp_q6)
1629*c83a76b0SSuyog Pawar {
1630*c83a76b0SSuyog Pawar if(i4_max_frame_qp_q6 > (i4_frame_qp_q6_based_max_vbv_bits))
1631*c83a76b0SSuyog Pawar {
1632*c83a76b0SSuyog Pawar i4_frame_qp_q6 = i4_max_frame_qp_q6;
1633*c83a76b0SSuyog Pawar }
1634*c83a76b0SSuyog Pawar else
1635*c83a76b0SSuyog Pawar {
1636*c83a76b0SSuyog Pawar i4_frame_qp_q6 = i4_frame_qp_q6_based_max_vbv_bits;
1637*c83a76b0SSuyog Pawar }
1638*c83a76b0SSuyog Pawar }
1639*c83a76b0SSuyog Pawar }
1640*c83a76b0SSuyog Pawar }
1641*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1642*c83a76b0SSuyog Pawar {
1643*c83a76b0SSuyog Pawar trace_printf("After i4_frame_qp_q6 = %d", i4_frame_qp_q6);
1644*c83a76b0SSuyog Pawar }
1645*c83a76b0SSuyog Pawar
1646*c83a76b0SSuyog Pawar /* SS - Following done to restore this after pause to resume detect - 0.25 is for syntax bits */
1647*c83a76b0SSuyog Pawar ps_rate_control_api->i4_orig_frm_est_bits = (i4_est_tex_bits * 5) >> 2;
1648*c83a76b0SSuyog Pawar ps_rate_control_api->i4_prev_frm_est_bits = (i4_est_tex_bits + i4_cur_est_header_bits);
1649*c83a76b0SSuyog Pawar pi4_cur_est_texture_bits[0] = i4_est_tex_bits;
1650*c83a76b0SSuyog Pawar
1651*c83a76b0SSuyog Pawar /*For frames after SCD, when neither online or offline model can estimate the bits,
1652*c83a76b0SSuyog Pawar use the remaining bits in period as max bits*/
1653*c83a76b0SSuyog Pawar *pi4_is_model_valid = i4_is_model_valid;
1654*c83a76b0SSuyog Pawar
1655*c83a76b0SSuyog Pawar if(0 == i4_is_model_valid)
1656*c83a76b0SSuyog Pawar {
1657*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated =
1658*c83a76b0SSuyog Pawar i4_bit_alloc_est_tex_bits_for_invalid_model; //(i4_buf_based_max_bits * 0.80);
1659*c83a76b0SSuyog Pawar }
1660*c83a76b0SSuyog Pawar else
1661*c83a76b0SSuyog Pawar {
1662*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = i4_est_tex_bits + i4_cur_est_header_bits;
1663*c83a76b0SSuyog Pawar }
1664*c83a76b0SSuyog Pawar
1665*c83a76b0SSuyog Pawar /*For B pics assigning a non-zero value to avoid asser */
1666*c83a76b0SSuyog Pawar if(*pi4_tot_bits_estimated == 0)
1667*c83a76b0SSuyog Pawar {
1668*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = 1;
1669*c83a76b0SSuyog Pawar }
1670*c83a76b0SSuyog Pawar ASSERT(*pi4_tot_bits_estimated != 0);
1671*c83a76b0SSuyog Pawar /*Underflow prevention*/
1672*c83a76b0SSuyog Pawar if((ps_rate_control_api->i4_underflow_warning == 1) &&
1673*c83a76b0SSuyog Pawar (i4_est_tex_bits < (i4_buf_based_max_bits - i4_cur_est_header_bits)) &&
1674*c83a76b0SSuyog Pawar (i4_call_type == 1))
1675*c83a76b0SSuyog Pawar {
1676*c83a76b0SSuyog Pawar //printf("\nUnderflow warning\n");
1677*c83a76b0SSuyog Pawar /*Decrement the hevc_qp by 1 for underflow prevention*/
1678*c83a76b0SSuyog Pawar i4_frame_qp_q6 = (WORD32)((float)i4_frame_qp_q6 / (float)1.125f);
1679*c83a76b0SSuyog Pawar ps_rate_control_api->i4_underflow_warning = 0;
1680*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1681*c83a76b0SSuyog Pawar {
1682*c83a76b0SSuyog Pawar trace_printf("\nUnderflow warning");
1683*c83a76b0SSuyog Pawar }
1684*c83a76b0SSuyog Pawar }
1685*c83a76b0SSuyog Pawar }
1686*c83a76b0SSuyog Pawar
1687*c83a76b0SSuyog Pawar /* Clip the frame qp within Min and Max QP */
1688*c83a76b0SSuyog Pawar if(i4_frame_qp_q6 < ps_rate_control_api->ai4_min_qp_q6[e_pic_type])
1689*c83a76b0SSuyog Pawar {
1690*c83a76b0SSuyog Pawar i4_frame_qp_q6 = ps_rate_control_api->ai4_min_qp_q6[e_pic_type];
1691*c83a76b0SSuyog Pawar }
1692*c83a76b0SSuyog Pawar else if(i4_frame_qp_q6 > ps_rate_control_api->ai4_max_qp_q6[e_pic_type])
1693*c83a76b0SSuyog Pawar {
1694*c83a76b0SSuyog Pawar i4_frame_qp_q6 = ps_rate_control_api->ai4_max_qp_q6[e_pic_type];
1695*c83a76b0SSuyog Pawar }
1696*c83a76b0SSuyog Pawar if(i4_call_type == 1)
1697*c83a76b0SSuyog Pawar {
1698*c83a76b0SSuyog Pawar *pi4_vbv_buf_max_bits = i4_buf_based_max_bits;
1699*c83a76b0SSuyog Pawar *pi4_est_tex_bits = i4_est_tex_bits;
1700*c83a76b0SSuyog Pawar *pi4_cur_est_header_bits = i4_cur_est_header_bits;
1701*c83a76b0SSuyog Pawar }
1702*c83a76b0SSuyog Pawar return (i4_frame_qp_q6);
1703*c83a76b0SSuyog Pawar }
1704*c83a76b0SSuyog Pawar
1705*c83a76b0SSuyog Pawar /****************************************************************************
1706*c83a76b0SSuyog Pawar Function Name : get_bits_for_final_qp
1707*c83a76b0SSuyog Pawar Description :
1708*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
1709*c83a76b0SSuyog Pawar Revision History:
1710*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
1711*c83a76b0SSuyog Pawar
1712*c83a76b0SSuyog Pawar *****************************************************************************/
1713*c83a76b0SSuyog Pawar
get_bits_for_final_qp(rate_control_api_t * ps_rate_control_api,WORD32 * pi4_modelQP,WORD32 * pi4_maxEbfQP,LWORD64 * pi8_bits_from_finalQP,WORD32 i4_clipQP,WORD32 i4_frame_qp_q6,WORD32 i4_cur_est_header_bits,WORD32 i4_est_tex_bits,WORD32 i4_buf_based_max_bits,picture_type_e e_pic_type,WORD32 i4_display_num)1714*c83a76b0SSuyog Pawar void get_bits_for_final_qp(
1715*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
1716*c83a76b0SSuyog Pawar WORD32 *pi4_modelQP,
1717*c83a76b0SSuyog Pawar WORD32 *pi4_maxEbfQP,
1718*c83a76b0SSuyog Pawar LWORD64 *pi8_bits_from_finalQP,
1719*c83a76b0SSuyog Pawar WORD32 i4_clipQP,
1720*c83a76b0SSuyog Pawar WORD32 i4_frame_qp_q6,
1721*c83a76b0SSuyog Pawar WORD32 i4_cur_est_header_bits,
1722*c83a76b0SSuyog Pawar WORD32 i4_est_tex_bits,
1723*c83a76b0SSuyog Pawar WORD32 i4_buf_based_max_bits,
1724*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
1725*c83a76b0SSuyog Pawar WORD32 i4_display_num)
1726*c83a76b0SSuyog Pawar {
1727*c83a76b0SSuyog Pawar UWORD32 u4_estimated_sad;
1728*c83a76b0SSuyog Pawar u4_estimated_sad = get_est_sad(ps_rate_control_api->ps_est_sad, e_pic_type);
1729*c83a76b0SSuyog Pawar {
1730*c83a76b0SSuyog Pawar //printf("%d:\ti4_modelQP = %d\t i4_maxEbfQP = %d\t i4_clipQP = %d\t bits = %d\n",i4_display_num,*pi4_modelQP,*pi4_maxEbfQP,i4_clipQP,*pi8_bits_from_finalQP);
1731*c83a76b0SSuyog Pawar if((*pi4_modelQP != INVALID_QP) && (*pi4_maxEbfQP != INVALID_QP) &&
1732*c83a76b0SSuyog Pawar /*(*pi4_modelQP >= i4_clipQP) &&*/
1733*c83a76b0SSuyog Pawar (i4_clipQP > *pi4_maxEbfQP))
1734*c83a76b0SSuyog Pawar {
1735*c83a76b0SSuyog Pawar WORD32 i4_loop = 0, i4_error, i4_prev_error = 0x7FFFFFFF;
1736*c83a76b0SSuyog Pawar WORD32 i4_frame_qp_q6_temp;
1737*c83a76b0SSuyog Pawar WORD32 i4_buf_max_text_bits = i4_buf_based_max_bits - i4_cur_est_header_bits;
1738*c83a76b0SSuyog Pawar WORD32 i4_min_bits = i4_est_tex_bits, i4_max_bits = i4_buf_max_text_bits;
1739*c83a76b0SSuyog Pawar WORD32 i4_temp_bits = (i4_min_bits + i4_max_bits) >> 1;
1740*c83a76b0SSuyog Pawar if(*pi4_modelQP == i4_clipQP)
1741*c83a76b0SSuyog Pawar {
1742*c83a76b0SSuyog Pawar *pi8_bits_from_finalQP = i4_est_tex_bits + i4_cur_est_header_bits;
1743*c83a76b0SSuyog Pawar //printf("%d:\ti4_modelQP = %d\t i4_maxEbfQP = %d\t i4_clipQP = %d\t bits = %d\n",i4_display_num,*pi4_modelQP,*pi4_maxEbfQP,i4_clipQP,*pi8_bits_from_finalQP);
1744*c83a76b0SSuyog Pawar return;
1745*c83a76b0SSuyog Pawar }
1746*c83a76b0SSuyog Pawar //printf("%d:\ti4_modelQP = %d\t i4_maxEbfQP = %d\t i4_clipQP = %d\t bits = %d\n",i4_display_num,*pi4_modelQP,*pi4_maxEbfQP,i4_clipQP,*pi8_bits_from_finalQP);
1747*c83a76b0SSuyog Pawar /*binary search to find out bits corresponds to final QP(clipped)*/
1748*c83a76b0SSuyog Pawar while(i4_loop < 30)
1749*c83a76b0SSuyog Pawar {
1750*c83a76b0SSuyog Pawar i4_frame_qp_q6_temp = find_qp_for_target_bits(
1751*c83a76b0SSuyog Pawar ps_rate_control_api->aps_rd_model[e_pic_type],
1752*c83a76b0SSuyog Pawar i4_temp_bits,
1753*c83a76b0SSuyog Pawar u4_estimated_sad,
1754*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_max_qp_q6[e_pic_type]),
1755*c83a76b0SSuyog Pawar (ps_rate_control_api->ai4_min_qp_q6[e_pic_type]));
1756*c83a76b0SSuyog Pawar i4_error = abs(i4_frame_qp_q6_temp - i4_frame_qp_q6);
1757*c83a76b0SSuyog Pawar if(i4_error < i4_prev_error)
1758*c83a76b0SSuyog Pawar {
1759*c83a76b0SSuyog Pawar *pi8_bits_from_finalQP = i4_temp_bits + i4_cur_est_header_bits;
1760*c83a76b0SSuyog Pawar i4_prev_error = i4_error;
1761*c83a76b0SSuyog Pawar //printf("*pi8_bits_from_finalQP = %d\n",*pi8_bits_from_finalQP);
1762*c83a76b0SSuyog Pawar }
1763*c83a76b0SSuyog Pawar if(i4_frame_qp_q6_temp < i4_frame_qp_q6)
1764*c83a76b0SSuyog Pawar {
1765*c83a76b0SSuyog Pawar i4_max_bits = i4_temp_bits;
1766*c83a76b0SSuyog Pawar }
1767*c83a76b0SSuyog Pawar else
1768*c83a76b0SSuyog Pawar {
1769*c83a76b0SSuyog Pawar i4_min_bits = i4_temp_bits;
1770*c83a76b0SSuyog Pawar }
1771*c83a76b0SSuyog Pawar i4_temp_bits = (i4_min_bits + i4_max_bits) >> 1;
1772*c83a76b0SSuyog Pawar i4_loop++;
1773*c83a76b0SSuyog Pawar }
1774*c83a76b0SSuyog Pawar }
1775*c83a76b0SSuyog Pawar else
1776*c83a76b0SSuyog Pawar {
1777*c83a76b0SSuyog Pawar /* when est bits is less than 0 , max ebfQP is not updated, hence invalid
1778*c83a76b0SSuyog Pawar as estimated bits are less it will not cause any buffer trouble*/
1779*c83a76b0SSuyog Pawar if(((*pi4_maxEbfQP == INVALID_QP) && (*pi4_modelQP == i4_clipQP)))
1780*c83a76b0SSuyog Pawar {
1781*c83a76b0SSuyog Pawar *pi8_bits_from_finalQP = i4_est_tex_bits + i4_cur_est_header_bits;
1782*c83a76b0SSuyog Pawar }
1783*c83a76b0SSuyog Pawar else
1784*c83a76b0SSuyog Pawar {
1785*c83a76b0SSuyog Pawar *pi8_bits_from_finalQP = i4_buf_based_max_bits;
1786*c83a76b0SSuyog Pawar }
1787*c83a76b0SSuyog Pawar }
1788*c83a76b0SSuyog Pawar }
1789*c83a76b0SSuyog Pawar return;
1790*c83a76b0SSuyog Pawar }
1791*c83a76b0SSuyog Pawar /****************************************************************************
1792*c83a76b0SSuyog Pawar *Function Name : get_buffer_status
1793*c83a76b0SSuyog Pawar *Description : Gets the state of VBV buffer
1794*c83a76b0SSuyog Pawar *Inputs : Rate control API , header and texture bits
1795*c83a76b0SSuyog Pawar *Globals :
1796*c83a76b0SSuyog Pawar *Processing :
1797*c83a76b0SSuyog Pawar *Outputs : 0 = normal, 1 = underflow, 2= overflow
1798*c83a76b0SSuyog Pawar *Returns : vbv_buf_status_e
1799*c83a76b0SSuyog Pawar *Issues :
1800*c83a76b0SSuyog Pawar *Revision History:
1801*c83a76b0SSuyog Pawar *DD MM YYYY Author(s) Changes (Describe the changes made)
1802*c83a76b0SSuyog Pawar *
1803*c83a76b0SSuyog Pawar ********************************************************************************/
get_buffer_status(rate_control_api_t * ps_rate_control_api,WORD32 i4_total_frame_bits,picture_type_e e_pic_type,WORD32 * pi4_num_bits_to_prevent_vbv_underflow)1804*c83a76b0SSuyog Pawar vbv_buf_status_e get_buffer_status(
1805*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
1806*c83a76b0SSuyog Pawar WORD32 i4_total_frame_bits, /* Total frame bits consumed */
1807*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
1808*c83a76b0SSuyog Pawar WORD32 *pi4_num_bits_to_prevent_vbv_underflow)
1809*c83a76b0SSuyog Pawar {
1810*c83a76b0SSuyog Pawar vbv_buf_status_e e_buf_status = VBV_NORMAL;
1811*c83a76b0SSuyog Pawar
1812*c83a76b0SSuyog Pawar /* Get the buffer status for the current total consumed bits and error bits*/
1813*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP)
1814*c83a76b0SSuyog Pawar {
1815*c83a76b0SSuyog Pawar e_buf_status = get_vbv_buffer_status(
1816*c83a76b0SSuyog Pawar ps_rate_control_api->ps_vbr_storage_vbv,
1817*c83a76b0SSuyog Pawar i4_total_frame_bits,
1818*c83a76b0SSuyog Pawar pi4_num_bits_to_prevent_vbv_underflow);
1819*c83a76b0SSuyog Pawar }
1820*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == VBR_STORAGE)
1821*c83a76b0SSuyog Pawar {
1822*c83a76b0SSuyog Pawar /* For VBR case since there is not underflow returning the max value */
1823*c83a76b0SSuyog Pawar pi4_num_bits_to_prevent_vbv_underflow[0] =
1824*c83a76b0SSuyog Pawar get_max_vbv_buf_size(ps_rate_control_api->ps_vbr_storage_vbv);
1825*c83a76b0SSuyog Pawar e_buf_status = VBV_NORMAL;
1826*c83a76b0SSuyog Pawar }
1827*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == CBR_NLDRC)
1828*c83a76b0SSuyog Pawar {
1829*c83a76b0SSuyog Pawar e_buf_status = get_cbr_buffer_status(
1830*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
1831*c83a76b0SSuyog Pawar i4_total_frame_bits,
1832*c83a76b0SSuyog Pawar pi4_num_bits_to_prevent_vbv_underflow,
1833*c83a76b0SSuyog Pawar e_pic_type,
1834*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type);
1835*c83a76b0SSuyog Pawar }
1836*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == VBR_STREAMING)
1837*c83a76b0SSuyog Pawar {
1838*c83a76b0SSuyog Pawar /* For VBR_streaming the error bits are computed according to peak bitrate*/
1839*c83a76b0SSuyog Pawar e_buf_status = get_cbr_buffer_status(
1840*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
1841*c83a76b0SSuyog Pawar i4_total_frame_bits,
1842*c83a76b0SSuyog Pawar pi4_num_bits_to_prevent_vbv_underflow,
1843*c83a76b0SSuyog Pawar e_pic_type,
1844*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type);
1845*c83a76b0SSuyog Pawar }
1846*c83a76b0SSuyog Pawar return e_buf_status;
1847*c83a76b0SSuyog Pawar }
1848*c83a76b0SSuyog Pawar /****************************************************************************
1849*c83a76b0SSuyog Pawar Function Name : update_pic_handling_state
1850*c83a76b0SSuyog Pawar Description : If the forward path and the backward path of rate control
1851*c83a76b0SSuyog Pawar Inputs :
1852*c83a76b0SSuyog Pawar Globals :
1853*c83a76b0SSuyog Pawar Processing :
1854*c83a76b0SSuyog Pawar Outputs :
1855*c83a76b0SSuyog Pawar Returns :
1856*c83a76b0SSuyog Pawar Issues :
1857*c83a76b0SSuyog Pawar Revision History:
1858*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
1859*c83a76b0SSuyog Pawar KJN Original
1860*c83a76b0SSuyog Pawar *****************************************************************************/
update_pic_handling_state(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type)1861*c83a76b0SSuyog Pawar void update_pic_handling_state(rate_control_api_t *ps_rate_control_api, picture_type_e e_pic_type)
1862*c83a76b0SSuyog Pawar {
1863*c83a76b0SSuyog Pawar WORD32 i4_is_non_ref_pic = 0;
1864*c83a76b0SSuyog Pawar update_pic_handling(ps_rate_control_api->ps_pic_handling, e_pic_type, i4_is_non_ref_pic, 0);
1865*c83a76b0SSuyog Pawar }
get_gop_bits(rate_control_api_t * ps_rate_control_api)1866*c83a76b0SSuyog Pawar LWORD64 get_gop_bits(rate_control_api_t *ps_rate_control_api)
1867*c83a76b0SSuyog Pawar {
1868*c83a76b0SSuyog Pawar return (ba_get_gop_bits(ps_rate_control_api->ps_bit_allocation));
1869*c83a76b0SSuyog Pawar }
get_gop_sad(rate_control_api_t * ps_rate_control_api)1870*c83a76b0SSuyog Pawar LWORD64 get_gop_sad(rate_control_api_t *ps_rate_control_api)
1871*c83a76b0SSuyog Pawar {
1872*c83a76b0SSuyog Pawar return (ba_get_gop_sad(ps_rate_control_api->ps_bit_allocation));
1873*c83a76b0SSuyog Pawar }
check_if_current_GOP_is_simple(rate_control_api_t * ps_rate_control_api)1874*c83a76b0SSuyog Pawar WORD32 check_if_current_GOP_is_simple(rate_control_api_t *ps_rate_control_api)
1875*c83a76b0SSuyog Pawar {
1876*c83a76b0SSuyog Pawar LWORD64 i8_buffer_play_bits =
1877*c83a76b0SSuyog Pawar ba_get_buffer_play_bits_for_cur_gop(ps_rate_control_api->ps_bit_allocation);
1878*c83a76b0SSuyog Pawar if(i8_buffer_play_bits)
1879*c83a76b0SSuyog Pawar {
1880*c83a76b0SSuyog Pawar if((i8_buffer_play_bits + get_cbr_ebf(ps_rate_control_api->ps_cbr_buffer)) >
1881*c83a76b0SSuyog Pawar (0.6 * get_cbr_buffer_size(ps_rate_control_api->ps_cbr_buffer)))
1882*c83a76b0SSuyog Pawar {
1883*c83a76b0SSuyog Pawar return 0;
1884*c83a76b0SSuyog Pawar }
1885*c83a76b0SSuyog Pawar else
1886*c83a76b0SSuyog Pawar {
1887*c83a76b0SSuyog Pawar return 1;
1888*c83a76b0SSuyog Pawar }
1889*c83a76b0SSuyog Pawar }
1890*c83a76b0SSuyog Pawar else
1891*c83a76b0SSuyog Pawar {
1892*c83a76b0SSuyog Pawar return 1;
1893*c83a76b0SSuyog Pawar }
1894*c83a76b0SSuyog Pawar }
rc_get_rbip_and_num_frames(rate_control_api_t * ps_rate_control_api,WORD32 * pi4_num_frames)1895*c83a76b0SSuyog Pawar LWORD64 rc_get_rbip_and_num_frames(rate_control_api_t *ps_rate_control_api, WORD32 *pi4_num_frames)
1896*c83a76b0SSuyog Pawar {
1897*c83a76b0SSuyog Pawar return (ba_get_rbip_and_num_frames(
1898*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
1899*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
1900*c83a76b0SSuyog Pawar pi4_num_frames));
1901*c83a76b0SSuyog Pawar }
1902*c83a76b0SSuyog Pawar /****************************************************************************
1903*c83a76b0SSuyog Pawar Function Name : update_frame_level_info
1904*c83a76b0SSuyog Pawar Description : Updates the frame level information into the rate control structure
1905*c83a76b0SSuyog Pawar Inputs :
1906*c83a76b0SSuyog Pawar Globals :
1907*c83a76b0SSuyog Pawar Processing :
1908*c83a76b0SSuyog Pawar Outputs :
1909*c83a76b0SSuyog Pawar Returns :
1910*c83a76b0SSuyog Pawar Issues :
1911*c83a76b0SSuyog Pawar Revision History:
1912*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
1913*c83a76b0SSuyog Pawar KJN Original
1914*c83a76b0SSuyog Pawar 25 04 2008 Sushmita Added support to get different bits for model
1915*c83a76b0SSuyog Pawar updation & buffer updation.May be used,in case encoder
1916*c83a76b0SSuyog Pawar decides to follow strict VBV compliance and hence
1917*c83a76b0SSuyog Pawar skips a picture after encoding it.Since it has
1918*c83a76b0SSuyog Pawar statistics of the current picture also we update
1919*c83a76b0SSuyog Pawar the model based on the discarded picture's stats
1920*c83a76b0SSuyog Pawar and the buffer model on the basis of actual bits
1921*c83a76b0SSuyog Pawar consumed by skipped picture
1922*c83a76b0SSuyog Pawar *****************************************************************************/
update_frame_level_info(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type,LWORD64 * pi8_mb_type_sad,WORD32 i4_total_frame_bits,WORD32 i4_model_updation_hdr_bits,WORD32 * pi4_mb_type_tex_bits,LWORD64 * pi8_tot_mb_type_qp_q6,WORD32 * pi4_tot_mb_in_type,WORD32 i4_avg_activity,UWORD8 u1_is_scd,WORD32 i4_is_it_a_skip,WORD32 i4_intra_frm_cost,WORD32 i4_is_pic_handling_done,WORD32 i4_suppress_bpic_update,WORD32 i4_bits_to_be_stuffed,WORD32 i4_is_pause_to_resume,WORD32 i4_lap_window_comp,WORD32 i4_is_end_of_period,WORD32 i4_lap_based_comp_reset,frame_info_t * ps_frame_info,WORD32 i4_is_rc_model_needs_to_be_updated,WORD8 i1_qp_offset,WORD32 i4_scene_num,WORD32 i4_num_frm_enc_in_scene,WORD32 i4_est_text_bits_ctr_update_qp)1923*c83a76b0SSuyog Pawar void update_frame_level_info(
1924*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
1925*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
1926*c83a76b0SSuyog Pawar LWORD64 *pi8_mb_type_sad, /* Frame level SAD for each type of MB[Intra/Inter] */
1927*c83a76b0SSuyog Pawar WORD32 i4_total_frame_bits, /* Total frame bits actually consumed */
1928*c83a76b0SSuyog Pawar WORD32 i4_model_updation_hdr_bits, /*header bits for model updation*/
1929*c83a76b0SSuyog Pawar WORD32 *
1930*c83a76b0SSuyog Pawar pi4_mb_type_tex_bits, /* Total texture bits consumed for each type of MB[Intra/Inter] used for model */
1931*c83a76b0SSuyog Pawar LWORD64 *pi8_tot_mb_type_qp_q6, /* Total qp of all MBs based on mb type */
1932*c83a76b0SSuyog Pawar WORD32 *pi4_tot_mb_in_type, /* total number of mbs in each mb type */
1933*c83a76b0SSuyog Pawar WORD32 i4_avg_activity, /* Average mb activity in frame */
1934*c83a76b0SSuyog Pawar UWORD8 u1_is_scd, /* Is a scene change detected at the current frame */
1935*c83a76b0SSuyog Pawar WORD32 i4_is_it_a_skip,
1936*c83a76b0SSuyog Pawar WORD32 i4_intra_frm_cost,
1937*c83a76b0SSuyog Pawar WORD32
1938*c83a76b0SSuyog Pawar i4_is_pic_handling_done, /* If picture handling is not done then update pic handling module. Special case for staggered endcoding */
1939*c83a76b0SSuyog Pawar WORD32 i4_suppress_bpic_update,
1940*c83a76b0SSuyog Pawar WORD32 i4_bits_to_be_stuffed,
1941*c83a76b0SSuyog Pawar WORD32 i4_is_pause_to_resume,
1942*c83a76b0SSuyog Pawar WORD32 i4_lap_window_comp,
1943*c83a76b0SSuyog Pawar WORD32 i4_is_end_of_period,
1944*c83a76b0SSuyog Pawar WORD32 i4_lap_based_comp_reset,
1945*c83a76b0SSuyog Pawar frame_info_t *ps_frame_info,
1946*c83a76b0SSuyog Pawar WORD32 i4_is_rc_model_needs_to_be_updated,
1947*c83a76b0SSuyog Pawar WORD8 i1_qp_offset,
1948*c83a76b0SSuyog Pawar WORD32 i4_scene_num,
1949*c83a76b0SSuyog Pawar WORD32 i4_num_frm_enc_in_scene,
1950*c83a76b0SSuyog Pawar WORD32 i4_est_text_bits_ctr_update_qp)
1951*c83a76b0SSuyog Pawar {
1952*c83a76b0SSuyog Pawar UWORD8 u1_num_skips = 0;
1953*c83a76b0SSuyog Pawar WORD32 i;
1954*c83a76b0SSuyog Pawar /*picture_type_e e_orig_pic_type = e_pic_type;*/
1955*c83a76b0SSuyog Pawar LWORD64 i8_frame_sad = 0; /* Frame level SAD */
1956*c83a76b0SSuyog Pawar WORD32 i4_tot_texture_bits = 0; /* Total texture bits consumed */
1957*c83a76b0SSuyog Pawar WORD32 i4_tot_mbs = 0; /* Total number of mbs in frame */
1958*c83a76b0SSuyog Pawar LWORD64 i8_avg_qp = 0, i8_avg_qp_q6 = 0;
1959*c83a76b0SSuyog Pawar WORD32 i4_flag_rc_model_update = (i4_is_rc_model_needs_to_be_updated == 1);
1960*c83a76b0SSuyog Pawar WORD32 i4_gop_correction = 0, i4_new_correction = 0;
1961*c83a76b0SSuyog Pawar
1962*c83a76b0SSuyog Pawar ps_frame_info->i4_flag_rc_model_update = i4_flag_rc_model_update;
1963*c83a76b0SSuyog Pawar ps_frame_info->i4_num_entries++;
1964*c83a76b0SSuyog Pawar trace_printf(
1965*c83a76b0SSuyog Pawar "update pic_type = %d tbc = %d hbc = %d\n",
1966*c83a76b0SSuyog Pawar e_pic_type,
1967*c83a76b0SSuyog Pawar (i4_total_frame_bits - i4_model_updation_hdr_bits),
1968*c83a76b0SSuyog Pawar i4_model_updation_hdr_bits);
1969*c83a76b0SSuyog Pawar /* NOTE KJN: SCD not supported in case of B Frames */
1970*c83a76b0SSuyog Pawar if(u1_is_scd && (e_pic_type != I_PIC && e_pic_type != P_PIC))
1971*c83a76b0SSuyog Pawar {
1972*c83a76b0SSuyog Pawar u1_is_scd = 0;
1973*c83a76b0SSuyog Pawar }
1974*c83a76b0SSuyog Pawar
1975*c83a76b0SSuyog Pawar /*if both pause to resume and scene cut is signalled then ignore pause to resume flag*/
1976*c83a76b0SSuyog Pawar if(u1_is_scd && i4_is_pause_to_resume)
1977*c83a76b0SSuyog Pawar i4_is_pause_to_resume = 0;
1978*c83a76b0SSuyog Pawar
1979*c83a76b0SSuyog Pawar if(!i4_is_it_a_skip && !i4_is_pic_handling_done)
1980*c83a76b0SSuyog Pawar {
1981*c83a76b0SSuyog Pawar /* Update the pic_handling struct */
1982*c83a76b0SSuyog Pawar /*: do not update pic handling even in case of non-reference B-PIC*/
1983*c83a76b0SSuyog Pawar update_pic_handling(
1984*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling, e_pic_type, i4_suppress_bpic_update, u1_is_scd);
1985*c83a76b0SSuyog Pawar }
1986*c83a76b0SSuyog Pawar {
1987*c83a76b0SSuyog Pawar WORD32 *pi4_qp_array =
1988*c83a76b0SSuyog Pawar ps_rate_control_api
1989*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp[(i4_scene_num + HALF_MAX_SCENE_NUM_RC) % MAX_SCENE_NUM_RC];
1990*c83a76b0SSuyog Pawar WORD32 *pi4_qp_array_q6 =
1991*c83a76b0SSuyog Pawar ps_rate_control_api
1992*c83a76b0SSuyog Pawar ->ai4_prev_frm_qp_q6[(i4_scene_num + HALF_MAX_SCENE_NUM_RC) % MAX_SCENE_NUM_RC];
1993*c83a76b0SSuyog Pawar WORD32 i4_i;
1994*c83a76b0SSuyog Pawar for(i4_i = 0; i4_i < MAX_PIC_TYPE; i4_i++)
1995*c83a76b0SSuyog Pawar {
1996*c83a76b0SSuyog Pawar pi4_qp_array[i4_i] = 0x7FFFFFFF;
1997*c83a76b0SSuyog Pawar pi4_qp_array_q6[i4_i] = 0x7FFFFFFF;
1998*c83a76b0SSuyog Pawar }
1999*c83a76b0SSuyog Pawar }
2000*c83a76b0SSuyog Pawar
2001*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type == CONST_QP)
2002*c83a76b0SSuyog Pawar {
2003*c83a76b0SSuyog Pawar if(!i4_is_it_a_skip)
2004*c83a76b0SSuyog Pawar {
2005*c83a76b0SSuyog Pawar /******************************************************************
2006*c83a76b0SSuyog Pawar Calculate the total values from the individual values
2007*c83a76b0SSuyog Pawar ******************************************************************/
2008*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2009*c83a76b0SSuyog Pawar i8_frame_sad += pi8_mb_type_sad[i];
2010*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2011*c83a76b0SSuyog Pawar i4_tot_texture_bits += pi4_mb_type_tex_bits[i];
2012*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2013*c83a76b0SSuyog Pawar i8_avg_qp += (pi8_tot_mb_type_qp_q6[i] >> 6);
2014*c83a76b0SSuyog Pawar
2015*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2016*c83a76b0SSuyog Pawar i8_avg_qp_q6 += pi8_tot_mb_type_qp_q6[i];
2017*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2018*c83a76b0SSuyog Pawar i4_tot_mbs += pi4_tot_mb_in_type[i];
2019*c83a76b0SSuyog Pawar i8_avg_qp /= i4_tot_mbs; /* Calculate the average QP */
2020*c83a76b0SSuyog Pawar i8_avg_qp_q6 /= i4_tot_mbs;
2021*c83a76b0SSuyog Pawar
2022*c83a76b0SSuyog Pawar if(ps_rate_control_api->u1_is_mb_level_rc_on)
2023*c83a76b0SSuyog Pawar {
2024*c83a76b0SSuyog Pawar /* The model needs to take into consideration the average activity of the
2025*c83a76b0SSuyog Pawar entire frame while estimating the QP. Thus the frame sad values are scaled by
2026*c83a76b0SSuyog Pawar the average activity before updating it into the model.*/
2027*c83a76b0SSuyog Pawar if(!i4_avg_activity)
2028*c83a76b0SSuyog Pawar i4_avg_activity = 1;
2029*c83a76b0SSuyog Pawar i4_intra_frm_cost /= i4_avg_activity;
2030*c83a76b0SSuyog Pawar i8_frame_sad /= i4_avg_activity;
2031*c83a76b0SSuyog Pawar }
2032*c83a76b0SSuyog Pawar
2033*c83a76b0SSuyog Pawar ps_frame_info->i8_frame_num = get_num_frms_encoded(ps_rate_control_api->ps_cbr_buffer);
2034*c83a76b0SSuyog Pawar ps_frame_info->i4_num_entries++;
2035*c83a76b0SSuyog Pawar
2036*c83a76b0SSuyog Pawar update_cbr_buffer(
2037*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
2038*c83a76b0SSuyog Pawar (i4_total_frame_bits + i4_bits_to_be_stuffed),
2039*c83a76b0SSuyog Pawar e_pic_type);
2040*c83a76b0SSuyog Pawar }
2041*c83a76b0SSuyog Pawar }
2042*c83a76b0SSuyog Pawar
2043*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type != CONST_QP)
2044*c83a76b0SSuyog Pawar {
2045*c83a76b0SSuyog Pawar /* For improving CBR streams quality */
2046*c83a76b0SSuyog Pawar WORD32 i4_buffer_based_bit_error = 0;
2047*c83a76b0SSuyog Pawar
2048*c83a76b0SSuyog Pawar if(!i4_is_it_a_skip)
2049*c83a76b0SSuyog Pawar {
2050*c83a76b0SSuyog Pawar WORD32 i4_new_period_flag;
2051*c83a76b0SSuyog Pawar /******************************************************************
2052*c83a76b0SSuyog Pawar Calculate the total values from the individual values
2053*c83a76b0SSuyog Pawar ******************************************************************/
2054*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2055*c83a76b0SSuyog Pawar i8_frame_sad += pi8_mb_type_sad[i];
2056*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2057*c83a76b0SSuyog Pawar i4_tot_texture_bits += pi4_mb_type_tex_bits[i];
2058*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2059*c83a76b0SSuyog Pawar i8_avg_qp += (pi8_tot_mb_type_qp_q6[i] >> 6);
2060*c83a76b0SSuyog Pawar
2061*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2062*c83a76b0SSuyog Pawar i8_avg_qp_q6 += pi8_tot_mb_type_qp_q6[i];
2063*c83a76b0SSuyog Pawar for(i = 0; i < MAX_MB_TYPE; i++)
2064*c83a76b0SSuyog Pawar i4_tot_mbs += pi4_tot_mb_in_type[i];
2065*c83a76b0SSuyog Pawar i8_avg_qp /= i4_tot_mbs; /* Calculate the average QP */
2066*c83a76b0SSuyog Pawar i8_avg_qp_q6 /= i4_tot_mbs;
2067*c83a76b0SSuyog Pawar
2068*c83a76b0SSuyog Pawar if(ps_rate_control_api->u1_is_mb_level_rc_on)
2069*c83a76b0SSuyog Pawar {
2070*c83a76b0SSuyog Pawar /* The model needs to take into consideration the average activity of the
2071*c83a76b0SSuyog Pawar entire frame while estimating the QP. Thus the frame sad values are scaled by
2072*c83a76b0SSuyog Pawar the average activity before updating it into the model.*/
2073*c83a76b0SSuyog Pawar if(!i4_avg_activity)
2074*c83a76b0SSuyog Pawar i4_avg_activity = 1;
2075*c83a76b0SSuyog Pawar i4_intra_frm_cost /= i4_avg_activity;
2076*c83a76b0SSuyog Pawar i8_frame_sad /= i4_avg_activity;
2077*c83a76b0SSuyog Pawar }
2078*c83a76b0SSuyog Pawar
2079*c83a76b0SSuyog Pawar ps_frame_info->i8_frame_num = get_num_frms_encoded(ps_rate_control_api->ps_cbr_buffer);
2080*c83a76b0SSuyog Pawar ps_frame_info->i4_num_entries++;
2081*c83a76b0SSuyog Pawar /******************************************************************
2082*c83a76b0SSuyog Pawar Update the bit allocation module
2083*c83a76b0SSuyog Pawar NOTE: For bit allocation module, the pic_type should not be modified
2084*c83a76b0SSuyog Pawar to that of 'I', in case of a SCD.
2085*c83a76b0SSuyog Pawar ******************************************************************/
2086*c83a76b0SSuyog Pawar i4_new_period_flag = is_last_frame_in_gop(ps_rate_control_api->ps_pic_handling);
2087*c83a76b0SSuyog Pawar
2088*c83a76b0SSuyog Pawar update_cur_frm_consumed_bits(
2089*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
2090*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
2091*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
2092*c83a76b0SSuyog Pawar i4_total_frame_bits,
2093*c83a76b0SSuyog Pawar /*((ps_rate_control_api->e_rc_type == CBR_NLDRC)?(i4_total_frame_bits + i4_bits_to_be_stuffed):i4_total_frame_bits)*/ //account for stuffing bits even when encoder does not stuff in case of CBR
2094*c83a76b0SSuyog Pawar i4_model_updation_hdr_bits,
2095*c83a76b0SSuyog Pawar e_pic_type,
2096*c83a76b0SSuyog Pawar u1_is_scd,
2097*c83a76b0SSuyog Pawar i4_is_end_of_period,
2098*c83a76b0SSuyog Pawar i4_lap_based_comp_reset,
2099*c83a76b0SSuyog Pawar i4_suppress_bpic_update,
2100*c83a76b0SSuyog Pawar i4_buffer_based_bit_error,
2101*c83a76b0SSuyog Pawar i4_bits_to_be_stuffed,
2102*c83a76b0SSuyog Pawar i4_lap_window_comp,
2103*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type,
2104*c83a76b0SSuyog Pawar ps_rate_control_api->i4_num_gop,
2105*c83a76b0SSuyog Pawar i4_is_pause_to_resume,
2106*c83a76b0SSuyog Pawar i4_est_text_bits_ctr_update_qp,
2107*c83a76b0SSuyog Pawar &i4_gop_correction,
2108*c83a76b0SSuyog Pawar &i4_new_correction);
2109*c83a76b0SSuyog Pawar if(1 == i4_new_period_flag &&
2110*c83a76b0SSuyog Pawar ((ps_rate_control_api->e_rc_type == VBR_STORAGE) ||
2111*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP)))
2112*c83a76b0SSuyog Pawar {
2113*c83a76b0SSuyog Pawar check_and_update_bit_allocation(
2114*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
2115*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
2116*c83a76b0SSuyog Pawar get_max_bits_inflow_per_frm_periode(ps_rate_control_api->ps_vbr_storage_vbv));
2117*c83a76b0SSuyog Pawar }
2118*c83a76b0SSuyog Pawar }
2119*c83a76b0SSuyog Pawar
2120*c83a76b0SSuyog Pawar /******************************************************************
2121*c83a76b0SSuyog Pawar Update the buffer status
2122*c83a76b0SSuyog Pawar ******************************************************************/
2123*c83a76b0SSuyog Pawar /* This updation is done after overflow and underflow handling to
2124*c83a76b0SSuyog Pawar account for the actual bits dumped*/
2125*c83a76b0SSuyog Pawar if((ps_rate_control_api->e_rc_type == VBR_STORAGE) ||
2126*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP))
2127*c83a76b0SSuyog Pawar {
2128*c83a76b0SSuyog Pawar update_vbr_vbv(ps_rate_control_api->ps_vbr_storage_vbv, i4_total_frame_bits);
2129*c83a76b0SSuyog Pawar }
2130*c83a76b0SSuyog Pawar else if(
2131*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type == CBR_NLDRC ||
2132*c83a76b0SSuyog Pawar ps_rate_control_api->e_rc_type == VBR_STREAMING)
2133*c83a76b0SSuyog Pawar {
2134*c83a76b0SSuyog Pawar update_cbr_buffer(
2135*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
2136*c83a76b0SSuyog Pawar (i4_total_frame_bits + i4_bits_to_be_stuffed),
2137*c83a76b0SSuyog Pawar e_pic_type);
2138*c83a76b0SSuyog Pawar }
2139*c83a76b0SSuyog Pawar
2140*c83a76b0SSuyog Pawar if(e_pic_type != B_PIC || e_pic_type != B1_PIC || e_pic_type != B2_PIC)
2141*c83a76b0SSuyog Pawar {
2142*c83a76b0SSuyog Pawar ps_rate_control_api->i4_prev_ref_is_scd = 0;
2143*c83a76b0SSuyog Pawar }
2144*c83a76b0SSuyog Pawar
2145*c83a76b0SSuyog Pawar if(!i4_is_it_a_skip)
2146*c83a76b0SSuyog Pawar {
2147*c83a76b0SSuyog Pawar /******************************************************************
2148*c83a76b0SSuyog Pawar Handle the SCENE CHANGE DETECTED
2149*c83a76b0SSuyog Pawar 1) Make the picture type as I, so that updation happens as if it is
2150*c83a76b0SSuyog Pawar a I frame
2151*c83a76b0SSuyog Pawar 2) Reset model, SAD and flag to restart the estimation process
2152*c83a76b0SSuyog Pawar ******************************************************************/
2153*c83a76b0SSuyog Pawar if(u1_is_scd || ps_rate_control_api->u1_is_first_frm)
2154*c83a76b0SSuyog Pawar {
2155*c83a76b0SSuyog Pawar e_pic_type = I_PIC;
2156*c83a76b0SSuyog Pawar
2157*c83a76b0SSuyog Pawar /* Reset the SAD estimation module */
2158*c83a76b0SSuyog Pawar reset_est_sad(ps_rate_control_api->ps_est_sad);
2159*c83a76b0SSuyog Pawar
2160*c83a76b0SSuyog Pawar /*remember the previous reference as SCD. This is required to trigger quering model for B
2161*c83a76b0SSuyog Pawar * frames with delay one sub-gop*/
2162*c83a76b0SSuyog Pawar ps_rate_control_api->i4_prev_ref_is_scd = 1;
2163*c83a76b0SSuyog Pawar
2164*c83a76b0SSuyog Pawar /* Reset the MB Rate control */
2165*c83a76b0SSuyog Pawar init_mb_level_rc(ps_rate_control_api->ps_mb_rate_control);
2166*c83a76b0SSuyog Pawar
2167*c83a76b0SSuyog Pawar /* Adjust the average QP for the frame based on bits consumption */
2168*c83a76b0SSuyog Pawar /* Initialize the QP for each picture type according to the average QP of the SCD pic */
2169*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] = (WORD32)i8_avg_qp;
2170*c83a76b0SSuyog Pawar
2171*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC] = (WORD32)i8_avg_qp_q6;
2172*c83a76b0SSuyog Pawar
2173*c83a76b0SSuyog Pawar ps_rate_control_api->i4_frames_since_last_scd = 0;
2174*c83a76b0SSuyog Pawar
2175*c83a76b0SSuyog Pawar ps_rate_control_api->f_p_to_i_comp_ratio = 1.0f;
2176*c83a76b0SSuyog Pawar /* Reset the number of header bits in a scene change */
2177*c83a76b0SSuyog Pawar //init_prev_header_bits(ps_rate_control_api->ps_bit_allocation, ps_rate_control_api->ps_pic_handling);
2178*c83a76b0SSuyog Pawar }
2179*c83a76b0SSuyog Pawar else if(i4_is_pause_to_resume)
2180*c83a76b0SSuyog Pawar {
2181*c83a76b0SSuyog Pawar reset_frm_rc_rd_model(ps_rate_control_api->aps_rd_model[e_pic_type]); //ELP_RC
2182*c83a76b0SSuyog Pawar }
2183*c83a76b0SSuyog Pawar if(i8_frame_sad && (!i4_suppress_bpic_update))
2184*c83a76b0SSuyog Pawar {
2185*c83a76b0SSuyog Pawar /********************************************************************
2186*c83a76b0SSuyog Pawar Update the model of the correponding picture type
2187*c83a76b0SSuyog Pawar NOTE: For SCD, we force the frame type from 'P' to that of a 'I'
2188*c83a76b0SSuyog Pawar *********************************************************************/
2189*c83a76b0SSuyog Pawar /* For very simple sequences no bits are consumed by texture. These frames
2190*c83a76b0SSuyog Pawar do not add any information to the model and so not added.
2191*c83a76b0SSuyog Pawar Update the model only when there is atleast 1 texture bit for every mb in a frame */
2192*c83a76b0SSuyog Pawar WORD32 i4_tot_texture_bits_added_to_model = i4_tot_texture_bits;
2193*c83a76b0SSuyog Pawar /*update the model only if bits consumed are zero. If this is zero qp for next frame has to be reduced until
2194*c83a76b0SSuyog Pawar * it provides some texture bits to update model*/
2195*c83a76b0SSuyog Pawar
2196*c83a76b0SSuyog Pawar if(i4_tot_texture_bits_added_to_model > 0 && (i4_flag_rc_model_update == 1))
2197*c83a76b0SSuyog Pawar {
2198*c83a76b0SSuyog Pawar add_frame_to_rd_model(
2199*c83a76b0SSuyog Pawar ps_rate_control_api->aps_rd_model[e_pic_type],
2200*c83a76b0SSuyog Pawar i4_tot_texture_bits_added_to_model,
2201*c83a76b0SSuyog Pawar (WORD32)i8_avg_qp_q6,
2202*c83a76b0SSuyog Pawar i8_frame_sad,
2203*c83a76b0SSuyog Pawar u1_num_skips);
2204*c83a76b0SSuyog Pawar
2205*c83a76b0SSuyog Pawar {
2206*c83a76b0SSuyog Pawar number_t temp =
2207*c83a76b0SSuyog Pawar get_linear_coefficient(ps_rate_control_api->aps_rd_model[e_pic_type]);
2208*c83a76b0SSuyog Pawar ps_frame_info->model_coeff_a_lin_wo_int.e = temp.e;
2209*c83a76b0SSuyog Pawar ps_frame_info->model_coeff_a_lin_wo_int.sm = temp.sm;
2210*c83a76b0SSuyog Pawar }
2211*c83a76b0SSuyog Pawar }
2212*c83a76b0SSuyog Pawar
2213*c83a76b0SSuyog Pawar /******************************************************************
2214*c83a76b0SSuyog Pawar Update the sad estimation module
2215*c83a76b0SSuyog Pawar NOTE: For SCD, we force the frame type from 'P' to that of a 'I'
2216*c83a76b0SSuyog Pawar ******************************************************************/
2217*c83a76b0SSuyog Pawar update_actual_sad(
2218*c83a76b0SSuyog Pawar ps_rate_control_api->ps_est_sad, (UWORD32)i8_frame_sad, e_pic_type);
2219*c83a76b0SSuyog Pawar /*: This will update I pic sad with current pic intra SAD. Now for non I-PIC the intra sad is coming same as
2220*c83a76b0SSuyog Pawar *best sad. This will corrupt intra frame sad. So not updating this. I frame SAD is updated only at I pic */
2221*c83a76b0SSuyog Pawar
2222*c83a76b0SSuyog Pawar /* Atleast one proper frame in added into the model. Until that
2223*c83a76b0SSuyog Pawar keep using the initial QP */
2224*c83a76b0SSuyog Pawar
2225*c83a76b0SSuyog Pawar /*B frames immediatly encoded after scene cut may still belong to previous content, When B frames encoded after one P frame after SCD are guranteed to belong
2226*c83a76b0SSuyog Pawar * new scene, modeling these frames wrt previous B frames might give wrong results. To avoid this model for B frame is not queried unless it is guranteed that one B frame
2227*c83a76b0SSuyog Pawar * has been modeled with new content. So setting is_first_frm_coded for B frames with delay of one frame*/
2228*c83a76b0SSuyog Pawar /*In HEVC implementation it is guranteed to encode new scene after scene cut I pic*/
2229*c83a76b0SSuyog Pawar ps_rate_control_api->au1_is_first_frm_coded[e_pic_type] = 1;
2230*c83a76b0SSuyog Pawar }
2231*c83a76b0SSuyog Pawar
2232*c83a76b0SSuyog Pawar if(i4_avg_activity)
2233*c83a76b0SSuyog Pawar {
2234*c83a76b0SSuyog Pawar /* Update the mb_level model */
2235*c83a76b0SSuyog Pawar mb_update_frame_level(ps_rate_control_api->ps_mb_rate_control, i4_avg_activity);
2236*c83a76b0SSuyog Pawar }
2237*c83a76b0SSuyog Pawar /* Update the variable which denotes that a frame has been encountered */
2238*c83a76b0SSuyog Pawar ps_rate_control_api->u1_is_first_frm = 0;
2239*c83a76b0SSuyog Pawar ps_rate_control_api->i4_frames_since_last_scd++;
2240*c83a76b0SSuyog Pawar }
2241*c83a76b0SSuyog Pawar }
2242*c83a76b0SSuyog Pawar return;
2243*c83a76b0SSuyog Pawar }
2244*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
2245*c83a76b0SSuyog Pawar /****************************************************************************
2246*c83a76b0SSuyog Pawar Function Name : update_frame_rc_get_frame_qp_info
2247*c83a76b0SSuyog Pawar Description :
2248*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2249*c83a76b0SSuyog Pawar Revision History:
2250*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2251*c83a76b0SSuyog Pawar
2252*c83a76b0SSuyog Pawar *****************************************************************************/
update_frame_rc_get_frame_qp_info(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type,WORD32 i4_is_scd,WORD32 i4_is_pause_to_resume,WORD32 i4_avg_frame_qp_q6,WORD32 i4_suppress_bpic_update,WORD32 i4_scene_num,WORD32 i4_num_frm_enc_in_scene)2253*c83a76b0SSuyog Pawar void update_frame_rc_get_frame_qp_info(
2254*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
2255*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
2256*c83a76b0SSuyog Pawar WORD32 i4_is_scd,
2257*c83a76b0SSuyog Pawar WORD32 i4_is_pause_to_resume,
2258*c83a76b0SSuyog Pawar WORD32 i4_avg_frame_qp_q6,
2259*c83a76b0SSuyog Pawar WORD32 i4_suppress_bpic_update,
2260*c83a76b0SSuyog Pawar WORD32 i4_scene_num,
2261*c83a76b0SSuyog Pawar WORD32 i4_num_frm_enc_in_scene)
2262*c83a76b0SSuyog Pawar {
2263*c83a76b0SSuyog Pawar WORD32 i4_avg_qp = 0, i4_avg_qp_q6 = 0;
2264*c83a76b0SSuyog Pawar
2265*c83a76b0SSuyog Pawar i4_avg_qp = (i4_avg_frame_qp_q6 >> 6);
2266*c83a76b0SSuyog Pawar i4_avg_qp_q6 = i4_avg_frame_qp_q6;
2267*c83a76b0SSuyog Pawar
2268*c83a76b0SSuyog Pawar if(i4_is_scd && (e_pic_type != I_PIC && e_pic_type != P_PIC))
2269*c83a76b0SSuyog Pawar {
2270*c83a76b0SSuyog Pawar i4_is_scd = 0;
2271*c83a76b0SSuyog Pawar }
2272*c83a76b0SSuyog Pawar
2273*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC)
2274*c83a76b0SSuyog Pawar {
2275*c83a76b0SSuyog Pawar ps_rate_control_api->i4_I_frame_qp_model = is_first_frame_coded(ps_rate_control_api);
2276*c83a76b0SSuyog Pawar }
2277*c83a76b0SSuyog Pawar if((i4_is_scd && i4_is_pause_to_resume)) //KISH
2278*c83a76b0SSuyog Pawar i4_is_pause_to_resume = 0;
2279*c83a76b0SSuyog Pawar
2280*c83a76b0SSuyog Pawar if(i4_is_scd || ps_rate_control_api->u1_is_first_frm)
2281*c83a76b0SSuyog Pawar {
2282*c83a76b0SSuyog Pawar /* Save previous B-QP since some B-pics may follow detection of SCD */
2283*c83a76b0SSuyog Pawar
2284*c83a76b0SSuyog Pawar e_pic_type = I_PIC;
2285*c83a76b0SSuyog Pawar
2286*c83a76b0SSuyog Pawar /* Reset the SAD estimation module */
2287*c83a76b0SSuyog Pawar reset_est_sad(ps_rate_control_api->ps_est_sad);
2288*c83a76b0SSuyog Pawar
2289*c83a76b0SSuyog Pawar /*remember the previous reference as SCD. This is required to trigger quering model for B
2290*c83a76b0SSuyog Pawar * frames with delay one sub-gop*/
2291*c83a76b0SSuyog Pawar ps_rate_control_api->i4_prev_ref_is_scd = 1;
2292*c83a76b0SSuyog Pawar
2293*c83a76b0SSuyog Pawar /* Reset the MB Rate control */
2294*c83a76b0SSuyog Pawar init_mb_level_rc(ps_rate_control_api->ps_mb_rate_control);
2295*c83a76b0SSuyog Pawar
2296*c83a76b0SSuyog Pawar /* Adjust the average QP for the frame based on bits consumption */
2297*c83a76b0SSuyog Pawar /* Initialize the QP for each picture type according to the average QP of the SCD pic */
2298*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] = i4_avg_qp;
2299*c83a76b0SSuyog Pawar
2300*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC] = i4_avg_qp_q6;
2301*c83a76b0SSuyog Pawar }
2302*c83a76b0SSuyog Pawar else if(i4_is_pause_to_resume)
2303*c83a76b0SSuyog Pawar {
2304*c83a76b0SSuyog Pawar /*pause to resume is guranteed to be P_PIC*/
2305*c83a76b0SSuyog Pawar ASSERT(e_pic_type != I_PIC);
2306*c83a76b0SSuyog Pawar
2307*c83a76b0SSuyog Pawar /* re-set all models eccept for I PIC model */
2308*c83a76b0SSuyog Pawar /*for(i=1;i<MAX_PIC_TYPE;i++)
2309*c83a76b0SSuyog Pawar {
2310*c83a76b0SSuyog Pawar reset_frm_rc_rd_model(ps_rate_control_api->aps_rd_model[i]);
2311*c83a76b0SSuyog Pawar ps_rate_control_api->au1_is_first_frm_coded[i] = 0;
2312*c83a76b0SSuyog Pawar }*/
2313*c83a76b0SSuyog Pawar /*resetting only current frame model instead of resetting all models*/
2314*c83a76b0SSuyog Pawar /*TO DO: i4_is_pause_to_resume is misnomer, as even non I scd are also handled in similar way*/
2315*c83a76b0SSuyog Pawar //reset_frm_rc_rd_model(ps_rate_control_api->aps_rd_model[e_pic_type]);
2316*c83a76b0SSuyog Pawar ps_rate_control_api->au1_is_first_frm_coded[e_pic_type] = 0;
2317*c83a76b0SSuyog Pawar ps_rate_control_api->i4_frames_since_last_scd = 0;
2318*c83a76b0SSuyog Pawar
2319*c83a76b0SSuyog Pawar {
2320*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][e_pic_type] = i4_avg_qp;
2321*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][e_pic_type] = i4_avg_qp_q6;
2322*c83a76b0SSuyog Pawar }
2323*c83a76b0SSuyog Pawar /*also reset previous I pic Qp since it uses I frame qp for qp determination when model is reset*/
2324*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC)
2325*c83a76b0SSuyog Pawar {
2326*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] = i4_avg_qp;
2327*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC] = i4_avg_qp_q6;
2328*c83a76b0SSuyog Pawar }
2329*c83a76b0SSuyog Pawar else if(e_pic_type == P_PIC || e_pic_type == P1_PIC)
2330*c83a76b0SSuyog Pawar {
2331*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] =
2332*c83a76b0SSuyog Pawar ((LWORD64)i4_avg_qp * P_TO_I_RATIO) >> K_Q;
2333*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC] =
2334*c83a76b0SSuyog Pawar ((LWORD64)i4_avg_qp_q6 * P_TO_I_RATIO) >> K_Q;
2335*c83a76b0SSuyog Pawar }
2336*c83a76b0SSuyog Pawar else if(e_pic_type == B_PIC || e_pic_type == BB_PIC)
2337*c83a76b0SSuyog Pawar {
2338*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] =
2339*c83a76b0SSuyog Pawar ((LWORD64)i4_avg_qp * P_TO_I_RATIO * P_TO_I_RATIO) >> (K_Q + K_Q);
2340*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC] =
2341*c83a76b0SSuyog Pawar ((LWORD64)i4_avg_qp_q6 * P_TO_I_RATIO * P_TO_I_RATIO) >> (K_Q + K_Q);
2342*c83a76b0SSuyog Pawar }
2343*c83a76b0SSuyog Pawar else if(e_pic_type == B1_PIC || e_pic_type == B11_PIC)
2344*c83a76b0SSuyog Pawar {
2345*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] =
2346*c83a76b0SSuyog Pawar ((LWORD64)i4_avg_qp * P_TO_I_RATIO * P_TO_I_RATIO * P_TO_I_RATIO) >>
2347*c83a76b0SSuyog Pawar (K_Q + K_Q + K_Q);
2348*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC] =
2349*c83a76b0SSuyog Pawar ((LWORD64)i4_avg_qp_q6 * P_TO_I_RATIO * P_TO_I_RATIO * P_TO_I_RATIO) >>
2350*c83a76b0SSuyog Pawar (K_Q + K_Q + K_Q);
2351*c83a76b0SSuyog Pawar }
2352*c83a76b0SSuyog Pawar else if(e_pic_type == B2_PIC || e_pic_type == B22_PIC)
2353*c83a76b0SSuyog Pawar {
2354*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][I_PIC] =
2355*c83a76b0SSuyog Pawar ((LWORD64)i4_avg_qp * P_TO_I_RATIO * P_TO_I_RATIO * P_TO_I_RATIO * P_TO_I_RATIO) >>
2356*c83a76b0SSuyog Pawar (K_Q + K_Q + K_Q + K_Q);
2357*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][I_PIC] =
2358*c83a76b0SSuyog Pawar ((LWORD64)i4_avg_qp_q6 * P_TO_I_RATIO * P_TO_I_RATIO * P_TO_I_RATIO *
2359*c83a76b0SSuyog Pawar P_TO_I_RATIO) >>
2360*c83a76b0SSuyog Pawar (K_Q + K_Q + K_Q + K_Q);
2361*c83a76b0SSuyog Pawar }
2362*c83a76b0SSuyog Pawar }
2363*c83a76b0SSuyog Pawar else
2364*c83a76b0SSuyog Pawar {
2365*c83a76b0SSuyog Pawar #if 1 /* Prev QP updation has happened at the end of the get frame qp call itself */
2366*c83a76b0SSuyog Pawar /******************************************************************
2367*c83a76b0SSuyog Pawar Update the Qp used by the current frame
2368*c83a76b0SSuyog Pawar ******************************************************************/
2369*c83a76b0SSuyog Pawar if(!i4_suppress_bpic_update)
2370*c83a76b0SSuyog Pawar {
2371*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][e_pic_type] = i4_avg_qp;
2372*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][e_pic_type] = i4_avg_qp_q6;
2373*c83a76b0SSuyog Pawar trace_printf("Prev frame qp q6 update %d pic type %d", i4_avg_qp_q6, e_pic_type);
2374*c83a76b0SSuyog Pawar }
2375*c83a76b0SSuyog Pawar #endif
2376*c83a76b0SSuyog Pawar }
2377*c83a76b0SSuyog Pawar
2378*c83a76b0SSuyog Pawar if(i4_num_frm_enc_in_scene == 1)
2379*c83a76b0SSuyog Pawar {
2380*c83a76b0SSuyog Pawar WORD32 i4_i = 0;
2381*c83a76b0SSuyog Pawar for(i4_i = 0; i4_i < MAX_PIC_TYPE; i4_i++)
2382*c83a76b0SSuyog Pawar {
2383*c83a76b0SSuyog Pawar if(ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][i4_i] == 0x7FFFFFFF)
2384*c83a76b0SSuyog Pawar {
2385*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][i4_i] = i4_avg_qp;
2386*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp_q6[i4_scene_num][i4_i] = i4_avg_qp_q6;
2387*c83a76b0SSuyog Pawar }
2388*c83a76b0SSuyog Pawar }
2389*c83a76b0SSuyog Pawar }
2390*c83a76b0SSuyog Pawar
2391*c83a76b0SSuyog Pawar if((!i4_suppress_bpic_update))
2392*c83a76b0SSuyog Pawar {
2393*c83a76b0SSuyog Pawar /*B frames immediatly encoded after scene cut may still belong to previous content, When B frames encoded after one P frame after SCD are guranteed to belong
2394*c83a76b0SSuyog Pawar * new scene, modeling these frames wrt previous B frames might give wrong results. To avoid this model for B frame is not queried unless it is guranteed that one B frame
2395*c83a76b0SSuyog Pawar * has been modeled with new content. So setting is_first_frm_coded for B frames with delay of one frame*/
2396*c83a76b0SSuyog Pawar /*In HEVC implementation it is guranteed to encode new scene after scene cut I pic*/
2397*c83a76b0SSuyog Pawar //ps_rate_control_api->au1_is_first_frm_coded[e_pic_type] = 1; //KISH_ELP
2398*c83a76b0SSuyog Pawar }
2399*c83a76b0SSuyog Pawar
2400*c83a76b0SSuyog Pawar /* Update the variable which denotes that a frame has been encountered */
2401*c83a76b0SSuyog Pawar ps_rate_control_api->u1_is_first_frm = 0;
2402*c83a76b0SSuyog Pawar
2403*c83a76b0SSuyog Pawar /* Store the prev encoded picture type for restricting Qp swing */
2404*c83a76b0SSuyog Pawar if((e_pic_type == I_PIC) || (e_pic_type == P_PIC))
2405*c83a76b0SSuyog Pawar {
2406*c83a76b0SSuyog Pawar ps_rate_control_api->prev_ref_pic_type = e_pic_type;
2407*c83a76b0SSuyog Pawar }
2408*c83a76b0SSuyog Pawar
2409*c83a76b0SSuyog Pawar return;
2410*c83a76b0SSuyog Pawar }
2411*c83a76b0SSuyog Pawar
2412*c83a76b0SSuyog Pawar /*update previous frame intra sad */
2413*c83a76b0SSuyog Pawar /****************************************************************************
2414*c83a76b0SSuyog Pawar Function Name : rc_update_prev_frame_intra_sad
2415*c83a76b0SSuyog Pawar Description :
2416*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2417*c83a76b0SSuyog Pawar Revision History:
2418*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2419*c83a76b0SSuyog Pawar
2420*c83a76b0SSuyog Pawar *****************************************************************************/
rc_update_prev_frame_intra_sad(rate_control_api_t * ps_rate_control_api,WORD32 i4_intra_frame_sad)2421*c83a76b0SSuyog Pawar void rc_update_prev_frame_intra_sad(
2422*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, WORD32 i4_intra_frame_sad)
2423*c83a76b0SSuyog Pawar {
2424*c83a76b0SSuyog Pawar update_prev_frame_intra_sad(ps_rate_control_api->ps_est_sad, i4_intra_frame_sad);
2425*c83a76b0SSuyog Pawar }
2426*c83a76b0SSuyog Pawar /****************************************************************************
2427*c83a76b0SSuyog Pawar Function Name : rc_get_prev_frame_intra_sad
2428*c83a76b0SSuyog Pawar Description :
2429*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2430*c83a76b0SSuyog Pawar Revision History:
2431*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2432*c83a76b0SSuyog Pawar
2433*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_prev_frame_intra_sad(rate_control_api_t * ps_rate_control_api)2434*c83a76b0SSuyog Pawar WORD32 rc_get_prev_frame_intra_sad(rate_control_api_t *ps_rate_control_api)
2435*c83a76b0SSuyog Pawar {
2436*c83a76b0SSuyog Pawar return get_prev_frame_intra_sad(ps_rate_control_api->ps_est_sad);
2437*c83a76b0SSuyog Pawar }
2438*c83a76b0SSuyog Pawar /*update previous frame sad */
2439*c83a76b0SSuyog Pawar /****************************************************************************
2440*c83a76b0SSuyog Pawar Function Name : rc_update_prev_frame_sad
2441*c83a76b0SSuyog Pawar Description :
2442*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2443*c83a76b0SSuyog Pawar Revision History:
2444*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2445*c83a76b0SSuyog Pawar
2446*c83a76b0SSuyog Pawar *****************************************************************************/
rc_update_prev_frame_sad(rate_control_api_t * ps_rate_control_api,WORD32 i4_frame_sad,picture_type_e e_pic_type)2447*c83a76b0SSuyog Pawar void rc_update_prev_frame_sad(
2448*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, WORD32 i4_frame_sad, picture_type_e e_pic_type)
2449*c83a76b0SSuyog Pawar {
2450*c83a76b0SSuyog Pawar update_prev_frame_sad(ps_rate_control_api->ps_est_sad, i4_frame_sad, e_pic_type);
2451*c83a76b0SSuyog Pawar }
2452*c83a76b0SSuyog Pawar /****************************************************************************
2453*c83a76b0SSuyog Pawar Function Name : rc_get_prev_frame_sad
2454*c83a76b0SSuyog Pawar Description :
2455*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2456*c83a76b0SSuyog Pawar Revision History:
2457*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2458*c83a76b0SSuyog Pawar
2459*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_prev_frame_sad(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type)2460*c83a76b0SSuyog Pawar WORD32 rc_get_prev_frame_sad(rate_control_api_t *ps_rate_control_api, picture_type_e e_pic_type)
2461*c83a76b0SSuyog Pawar {
2462*c83a76b0SSuyog Pawar return get_prev_frame_sad(ps_rate_control_api->ps_est_sad, e_pic_type);
2463*c83a76b0SSuyog Pawar }
2464*c83a76b0SSuyog Pawar
2465*c83a76b0SSuyog Pawar /****************************************************************************
2466*c83a76b0SSuyog Pawar Function Name : reset_rc_for_pause_to_play_transition
2467*c83a76b0SSuyog Pawar Description : In this mode it resets RC only for P and B picture, since the
2468*c83a76b0SSuyog Pawar sequece has not changed but only the motion related changes would
2469*c83a76b0SSuyog Pawar take impact
2470*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2471*c83a76b0SSuyog Pawar Revision History:
2472*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2473*c83a76b0SSuyog Pawar
2474*c83a76b0SSuyog Pawar *****************************************************************************/
reset_rc_for_pause_to_play_transition(rate_control_api_t * ps_rate_control_api)2475*c83a76b0SSuyog Pawar void reset_rc_for_pause_to_play_transition(rate_control_api_t *ps_rate_control_api)
2476*c83a76b0SSuyog Pawar {
2477*c83a76b0SSuyog Pawar WORD32 i;
2478*c83a76b0SSuyog Pawar /* re-set model only for P and B frame */
2479*c83a76b0SSuyog Pawar for(i = 1; i < MAX_PIC_TYPE; i++)
2480*c83a76b0SSuyog Pawar {
2481*c83a76b0SSuyog Pawar reset_frm_rc_rd_model(ps_rate_control_api->aps_rd_model[i]);
2482*c83a76b0SSuyog Pawar }
2483*c83a76b0SSuyog Pawar /* Reset flag */
2484*c83a76b0SSuyog Pawar for(i = 1; i < MAX_PIC_TYPE; i++)
2485*c83a76b0SSuyog Pawar {
2486*c83a76b0SSuyog Pawar ps_rate_control_api->au1_is_first_frm_coded[i] = 0;
2487*c83a76b0SSuyog Pawar }
2488*c83a76b0SSuyog Pawar }
2489*c83a76b0SSuyog Pawar /****************************************************************************
2490*c83a76b0SSuyog Pawar Function Name : get_rc_target_bits
2491*c83a76b0SSuyog Pawar Description :
2492*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2493*c83a76b0SSuyog Pawar Revision History:
2494*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2495*c83a76b0SSuyog Pawar
2496*c83a76b0SSuyog Pawar *****************************************************************************/
get_rc_target_bits(rate_control_api_t * ps_rate_control_api)2497*c83a76b0SSuyog Pawar WORD32 get_rc_target_bits(rate_control_api_t *ps_rate_control_api)
2498*c83a76b0SSuyog Pawar {
2499*c83a76b0SSuyog Pawar return (ps_rate_control_api->i4_prev_frm_est_bits);
2500*c83a76b0SSuyog Pawar }
2501*c83a76b0SSuyog Pawar /****************************************************************************
2502*c83a76b0SSuyog Pawar Function Name : get_orig_rc_target_bits
2503*c83a76b0SSuyog Pawar Description :
2504*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2505*c83a76b0SSuyog Pawar Revision History:
2506*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2507*c83a76b0SSuyog Pawar
2508*c83a76b0SSuyog Pawar *****************************************************************************/
get_orig_rc_target_bits(rate_control_api_t * ps_rate_control_api)2509*c83a76b0SSuyog Pawar WORD32 get_orig_rc_target_bits(rate_control_api_t *ps_rate_control_api)
2510*c83a76b0SSuyog Pawar {
2511*c83a76b0SSuyog Pawar return (ps_rate_control_api->i4_orig_frm_est_bits);
2512*c83a76b0SSuyog Pawar }
2513*c83a76b0SSuyog Pawar
2514*c83a76b0SSuyog Pawar #if NON_STEADSTATE_CODE
2515*c83a76b0SSuyog Pawar /******************************************************************************
2516*c83a76b0SSuyog Pawar MB Level API functions
2517*c83a76b0SSuyog Pawar ******************************************************************************/
2518*c83a76b0SSuyog Pawar /****************************************************************************
2519*c83a76b0SSuyog Pawar Function Name : init_mb_rc_frame_level
2520*c83a76b0SSuyog Pawar Description : Initialise the frame level details required for a mb level
2521*c83a76b0SSuyog Pawar Inputs : u1_frame_qp - Frame Qp that is to be used to the current frame
2522*c83a76b0SSuyog Pawar Globals :
2523*c83a76b0SSuyog Pawar Processing :
2524*c83a76b0SSuyog Pawar Outputs :
2525*c83a76b0SSuyog Pawar Returns :
2526*c83a76b0SSuyog Pawar Issues :
2527*c83a76b0SSuyog Pawar Revision History:
2528*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2529*c83a76b0SSuyog Pawar
2530*c83a76b0SSuyog Pawar *****************************************************************************/
2531*c83a76b0SSuyog Pawar
init_mb_rc_frame_level(rate_control_api_t * ps_rate_control_api,UWORD8 u1_frame_qp)2532*c83a76b0SSuyog Pawar void init_mb_rc_frame_level(rate_control_api_t *ps_rate_control_api, UWORD8 u1_frame_qp)
2533*c83a76b0SSuyog Pawar {
2534*c83a76b0SSuyog Pawar mb_init_frame_level(ps_rate_control_api->ps_mb_rate_control, u1_frame_qp);
2535*c83a76b0SSuyog Pawar }
2536*c83a76b0SSuyog Pawar #endif /* #if NON_STEADSTATE_CODE */
2537*c83a76b0SSuyog Pawar
2538*c83a76b0SSuyog Pawar /****************************************************************************
2539*c83a76b0SSuyog Pawar Function Name : get_bits_to_stuff
2540*c83a76b0SSuyog Pawar Description : Gets the bits to stuff to prevent Underflow of Encoder Buffer
2541*c83a76b0SSuyog Pawar Inputs : Rate control API ctxt , total consumed bits
2542*c83a76b0SSuyog Pawar Globals :
2543*c83a76b0SSuyog Pawar Processing :
2544*c83a76b0SSuyog Pawar Outputs : number of bits to stuff
2545*c83a76b0SSuyog Pawar Returns : i4_bits_to_stuff
2546*c83a76b0SSuyog Pawar Issues :
2547*c83a76b0SSuyog Pawar Revision History:
2548*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2549*c83a76b0SSuyog Pawar
2550*c83a76b0SSuyog Pawar *****************************************************************************/
get_bits_to_stuff(rate_control_api_t * ps_rate_control_api,WORD32 i4_tot_consumed_bits,picture_type_e e_pic_type)2551*c83a76b0SSuyog Pawar WORD32 get_bits_to_stuff(
2552*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, WORD32 i4_tot_consumed_bits, picture_type_e e_pic_type)
2553*c83a76b0SSuyog Pawar {
2554*c83a76b0SSuyog Pawar WORD32 i4_bits_to_stuff;
2555*c83a76b0SSuyog Pawar /* Get the CBR bits to stuff*/
2556*c83a76b0SSuyog Pawar i4_bits_to_stuff =
2557*c83a76b0SSuyog Pawar get_cbr_bits_to_stuff(ps_rate_control_api->ps_cbr_buffer, i4_tot_consumed_bits, e_pic_type);
2558*c83a76b0SSuyog Pawar return i4_bits_to_stuff;
2559*c83a76b0SSuyog Pawar }
2560*c83a76b0SSuyog Pawar
2561*c83a76b0SSuyog Pawar /****************************************************************************
2562*c83a76b0SSuyog Pawar Function Name : get_prev_frm_est_bits
2563*c83a76b0SSuyog Pawar Description : Returns previous frame estimated bits
2564*c83a76b0SSuyog Pawar Inputs : Rate control API ctxt
2565*c83a76b0SSuyog Pawar Globals :
2566*c83a76b0SSuyog Pawar Processing :
2567*c83a76b0SSuyog Pawar Outputs : previous frame estimated bits
2568*c83a76b0SSuyog Pawar Returns : i4_prev_frm_est_bits
2569*c83a76b0SSuyog Pawar Issues :
2570*c83a76b0SSuyog Pawar Revision History:
2571*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2572*c83a76b0SSuyog Pawar
2573*c83a76b0SSuyog Pawar *****************************************************************************/
get_prev_frm_est_bits(rate_control_api_t * ps_rate_control_api)2574*c83a76b0SSuyog Pawar WORD32 get_prev_frm_est_bits(rate_control_api_t *ps_rate_control_api)
2575*c83a76b0SSuyog Pawar {
2576*c83a76b0SSuyog Pawar return (ps_rate_control_api->i4_prev_frm_est_bits);
2577*c83a76b0SSuyog Pawar }
2578*c83a76b0SSuyog Pawar
2579*c83a76b0SSuyog Pawar /****************************************************************************
2580*c83a76b0SSuyog Pawar Function Name : change_frm_rate_for_bit_alloc
2581*c83a76b0SSuyog Pawar Description : Does the necessary changes only in the bit_allocation module
2582*c83a76b0SSuyog Pawar there is a change in frame rate
2583*c83a76b0SSuyog Pawar Inputs : u4_frame_rate - new frame rate to be used
2584*c83a76b0SSuyog Pawar Globals :
2585*c83a76b0SSuyog Pawar Processing :
2586*c83a76b0SSuyog Pawar Outputs :
2587*c83a76b0SSuyog Pawar Returns :
2588*c83a76b0SSuyog Pawar Issues :
2589*c83a76b0SSuyog Pawar Revision History:
2590*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2591*c83a76b0SSuyog Pawar
2592*c83a76b0SSuyog Pawar *****************************************************************************/
change_frm_rate_for_bit_alloc(rate_control_api_t * ps_rate_control_api,UWORD32 u4_frame_rate)2593*c83a76b0SSuyog Pawar void change_frm_rate_for_bit_alloc(rate_control_api_t *ps_rate_control_api, UWORD32 u4_frame_rate)
2594*c83a76b0SSuyog Pawar {
2595*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type != CONST_QP)
2596*c83a76b0SSuyog Pawar {
2597*c83a76b0SSuyog Pawar /* Bit Allocation Module: distribute the excess/deficit bits between the
2598*c83a76b0SSuyog Pawar old and the new frame rate to all the remaining frames */
2599*c83a76b0SSuyog Pawar change_remaining_bits_in_period(
2600*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
2601*c83a76b0SSuyog Pawar ba_get_bit_rate(ps_rate_control_api->ps_bit_allocation),
2602*c83a76b0SSuyog Pawar u4_frame_rate,
2603*c83a76b0SSuyog Pawar (WORD32 *)(ps_rate_control_api->au4_new_peak_bit_rate));
2604*c83a76b0SSuyog Pawar }
2605*c83a76b0SSuyog Pawar }
2606*c83a76b0SSuyog Pawar
2607*c83a76b0SSuyog Pawar /****************************************************************************
2608*c83a76b0SSuyog Pawar * Function Name : rc_get_rem_bits_in_gop
2609*c83a76b0SSuyog Pawar * Description : API call to get remaining bits in GOP
2610*c83a76b0SSuyog Pawar * *****************************************************************************/
rc_get_rem_bits_in_period(rate_control_api_t * ps_rate_control_api)2611*c83a76b0SSuyog Pawar WORD32 rc_get_rem_bits_in_period(rate_control_api_t *ps_rate_control_api)
2612*c83a76b0SSuyog Pawar {
2613*c83a76b0SSuyog Pawar return (get_rem_bits_in_period(
2614*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation, ps_rate_control_api->ps_pic_handling));
2615*c83a76b0SSuyog Pawar }
2616*c83a76b0SSuyog Pawar
2617*c83a76b0SSuyog Pawar /****************************************************************************
2618*c83a76b0SSuyog Pawar Function Name : flush_buf_frames
2619*c83a76b0SSuyog Pawar Description : API call to flush the buffered up frames
2620*c83a76b0SSuyog Pawar Inputs :
2621*c83a76b0SSuyog Pawar Globals :
2622*c83a76b0SSuyog Pawar Processing :
2623*c83a76b0SSuyog Pawar Outputs :
2624*c83a76b0SSuyog Pawar Returns :
2625*c83a76b0SSuyog Pawar Issues :
2626*c83a76b0SSuyog Pawar Revision History:
2627*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2628*c83a76b0SSuyog Pawar *****************************************************************************/
flush_buf_frames(rate_control_api_t * ps_rate_control_api)2629*c83a76b0SSuyog Pawar void flush_buf_frames(rate_control_api_t *ps_rate_control_api)
2630*c83a76b0SSuyog Pawar {
2631*c83a76b0SSuyog Pawar flush_frame_from_pic_stack(ps_rate_control_api->ps_pic_handling);
2632*c83a76b0SSuyog Pawar }
2633*c83a76b0SSuyog Pawar
2634*c83a76b0SSuyog Pawar /****************************************************************************
2635*c83a76b0SSuyog Pawar Function Name : rc_get_prev_header_bits
2636*c83a76b0SSuyog Pawar Description :
2637*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2638*c83a76b0SSuyog Pawar Revision History:
2639*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2640*c83a76b0SSuyog Pawar
2641*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_prev_header_bits(rate_control_api_t * ps_rate_control_api,WORD32 pic_type)2642*c83a76b0SSuyog Pawar WORD32 rc_get_prev_header_bits(rate_control_api_t *ps_rate_control_api, WORD32 pic_type)
2643*c83a76b0SSuyog Pawar {
2644*c83a76b0SSuyog Pawar return (get_prev_header_bits(ps_rate_control_api->ps_bit_allocation, pic_type));
2645*c83a76b0SSuyog Pawar }
2646*c83a76b0SSuyog Pawar /****************************************************************************
2647*c83a76b0SSuyog Pawar Function Name : rc_get_prev_P_QP
2648*c83a76b0SSuyog Pawar Description :
2649*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2650*c83a76b0SSuyog Pawar Revision History:
2651*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2652*c83a76b0SSuyog Pawar
2653*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_prev_P_QP(rate_control_api_t * ps_rate_control_api,WORD32 i4_scene_num)2654*c83a76b0SSuyog Pawar WORD32 rc_get_prev_P_QP(rate_control_api_t *ps_rate_control_api, WORD32 i4_scene_num)
2655*c83a76b0SSuyog Pawar {
2656*c83a76b0SSuyog Pawar WORD32 i4_prev_qp = ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][P_PIC];
2657*c83a76b0SSuyog Pawar i4_prev_qp =
2658*c83a76b0SSuyog Pawar (ps_rate_control_api->i4_P_to_I_ratio * i4_prev_qp + (1 << (P_TO_I_RATIO_Q_FACTOR - 1))) >>
2659*c83a76b0SSuyog Pawar P_TO_I_RATIO_Q_FACTOR;
2660*c83a76b0SSuyog Pawar return (i4_prev_qp);
2661*c83a76b0SSuyog Pawar }
2662*c83a76b0SSuyog Pawar /****************************************************************************
2663*c83a76b0SSuyog Pawar Function Name : rc_put_sad
2664*c83a76b0SSuyog Pawar Description :
2665*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2666*c83a76b0SSuyog Pawar Revision History:
2667*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2668*c83a76b0SSuyog Pawar
2669*c83a76b0SSuyog Pawar *****************************************************************************/
rc_put_sad(rate_control_api_t * ps_rate_control_api,WORD32 i4_cur_intra_sad,WORD32 i4_cur_sad,WORD32 i4_cur_pic_type)2670*c83a76b0SSuyog Pawar void rc_put_sad(
2671*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
2672*c83a76b0SSuyog Pawar WORD32 i4_cur_intra_sad,
2673*c83a76b0SSuyog Pawar WORD32 i4_cur_sad,
2674*c83a76b0SSuyog Pawar WORD32 i4_cur_pic_type)
2675*c83a76b0SSuyog Pawar {
2676*c83a76b0SSuyog Pawar sad_acc_put_sad(ps_rate_control_api->ps_sad_acc, i4_cur_intra_sad, i4_cur_sad, i4_cur_pic_type);
2677*c83a76b0SSuyog Pawar }
2678*c83a76b0SSuyog Pawar /****************************************************************************
2679*c83a76b0SSuyog Pawar Function Name : rc_get_sad
2680*c83a76b0SSuyog Pawar Description :
2681*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2682*c83a76b0SSuyog Pawar Revision History:
2683*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2684*c83a76b0SSuyog Pawar
2685*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_sad(rate_control_api_t * ps_rate_control_api,WORD32 * pi4_sad)2686*c83a76b0SSuyog Pawar void rc_get_sad(rate_control_api_t *ps_rate_control_api, WORD32 *pi4_sad)
2687*c83a76b0SSuyog Pawar {
2688*c83a76b0SSuyog Pawar sad_acc_get_sad(ps_rate_control_api->ps_sad_acc, pi4_sad);
2689*c83a76b0SSuyog Pawar }
2690*c83a76b0SSuyog Pawar /****************************************************************************
2691*c83a76b0SSuyog Pawar Function Name : rc_update_ppic_sad
2692*c83a76b0SSuyog Pawar Description :
2693*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2694*c83a76b0SSuyog Pawar Revision History:
2695*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2696*c83a76b0SSuyog Pawar
2697*c83a76b0SSuyog Pawar *****************************************************************************/
rc_update_ppic_sad(rate_control_api_t * ps_rate_control_api,WORD32 i4_est_sad,WORD32 i4_prev_ppic_sad)2698*c83a76b0SSuyog Pawar WORD32 rc_update_ppic_sad(
2699*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, WORD32 i4_est_sad, WORD32 i4_prev_ppic_sad)
2700*c83a76b0SSuyog Pawar {
2701*c83a76b0SSuyog Pawar return (update_ppic_sad(ps_rate_control_api->ps_est_sad, i4_est_sad, i4_prev_ppic_sad));
2702*c83a76b0SSuyog Pawar }
2703*c83a76b0SSuyog Pawar /****************************************************************************
2704*c83a76b0SSuyog Pawar Function Name : change_avg_bit_rate
2705*c83a76b0SSuyog Pawar Description : Whenever the average bit rate changes, the excess bits is
2706*c83a76b0SSuyog Pawar between the changed bit rate and the old one is re-distributed
2707*c83a76b0SSuyog Pawar in the bit allocation module
2708*c83a76b0SSuyog Pawar Inputs : u4_average_bit_rate - new average bit rate to be used
2709*c83a76b0SSuyog Pawar : u4_peak_bit_rate - new peak bit rate to be used
2710*c83a76b0SSuyog Pawar Globals :
2711*c83a76b0SSuyog Pawar Processing :
2712*c83a76b0SSuyog Pawar Outputs :
2713*c83a76b0SSuyog Pawar Returns :
2714*c83a76b0SSuyog Pawar Issues :
2715*c83a76b0SSuyog Pawar Revision History:
2716*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2717*c83a76b0SSuyog Pawar
2718*c83a76b0SSuyog Pawar *****************************************************************************/
change_avg_bit_rate(rate_control_api_t * ps_rate_control_api,UWORD32 u4_average_bit_rate,UWORD32 u4_peak_bit_rate)2719*c83a76b0SSuyog Pawar void change_avg_bit_rate(
2720*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, UWORD32 u4_average_bit_rate, UWORD32 u4_peak_bit_rate)
2721*c83a76b0SSuyog Pawar {
2722*c83a76b0SSuyog Pawar int i;
2723*c83a76b0SSuyog Pawar
2724*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type != CONST_QP)
2725*c83a76b0SSuyog Pawar {
2726*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type == CBR_NLDRC)
2727*c83a76b0SSuyog Pawar {
2728*c83a76b0SSuyog Pawar ps_rate_control_api->au4_new_peak_bit_rate[0] = u4_average_bit_rate;
2729*c83a76b0SSuyog Pawar ps_rate_control_api->au4_new_peak_bit_rate[1] = u4_average_bit_rate;
2730*c83a76b0SSuyog Pawar }
2731*c83a76b0SSuyog Pawar else
2732*c83a76b0SSuyog Pawar {
2733*c83a76b0SSuyog Pawar ps_rate_control_api->au4_new_peak_bit_rate[0] = u4_peak_bit_rate;
2734*c83a76b0SSuyog Pawar ps_rate_control_api->au4_new_peak_bit_rate[1] = u4_peak_bit_rate;
2735*c83a76b0SSuyog Pawar }
2736*c83a76b0SSuyog Pawar /* Bit Allocation Module: distribute the excess/deficit bits between the
2737*c83a76b0SSuyog Pawar old and the new frame rate to all the remaining frames */
2738*c83a76b0SSuyog Pawar change_remaining_bits_in_period(
2739*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
2740*c83a76b0SSuyog Pawar u4_average_bit_rate,
2741*c83a76b0SSuyog Pawar ba_get_frame_rate(ps_rate_control_api->ps_bit_allocation),
2742*c83a76b0SSuyog Pawar (WORD32 *)(ps_rate_control_api->au4_new_peak_bit_rate));
2743*c83a76b0SSuyog Pawar }
2744*c83a76b0SSuyog Pawar //if(ps_rate_control_api->e_rc_type == CBR_NLDRC)
2745*c83a76b0SSuyog Pawar {
2746*c83a76b0SSuyog Pawar UWORD32 u4_average_bit_rate_copy[MAX_NUM_DRAIN_RATES];
2747*c83a76b0SSuyog Pawar /*DYNAMIC_RC*/
2748*c83a76b0SSuyog Pawar //ps_rate_control_api->au4_new_peak_bit_rate[0]=u4_average_bit_rate;
2749*c83a76b0SSuyog Pawar //ps_rate_control_api->au4_new_peak_bit_rate[1]=u4_average_bit_rate;
2750*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
2751*c83a76b0SSuyog Pawar {
2752*c83a76b0SSuyog Pawar u4_average_bit_rate_copy[i] = u4_average_bit_rate;
2753*c83a76b0SSuyog Pawar }
2754*c83a76b0SSuyog Pawar change_cbr_vbv_bit_rate(
2755*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
2756*c83a76b0SSuyog Pawar (WORD32 *)(u4_average_bit_rate_copy),
2757*c83a76b0SSuyog Pawar (WORD32)ps_rate_control_api->au4_new_peak_bit_rate[0]);
2758*c83a76b0SSuyog Pawar }
2759*c83a76b0SSuyog Pawar
2760*c83a76b0SSuyog Pawar /* This is done only for average bitrate changing somewhere after the model stabilises.
2761*c83a76b0SSuyog Pawar Here it is assumed that user will not do this call after first few frames.
2762*c83a76b0SSuyog Pawar If we dont have this check, what would happen is since the model has not stabilised, also
2763*c83a76b0SSuyog Pawar bitrate has changed before the first frame, we dont restrict the qp. Qp can go to
2764*c83a76b0SSuyog Pawar very bad values after init qp since if swing is disabled
2765*c83a76b0SSuyog Pawar
2766*c83a76b0SSuyog Pawar */
2767*c83a76b0SSuyog Pawar if(ps_rate_control_api->u1_is_first_frm == 0)
2768*c83a76b0SSuyog Pawar {
2769*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
2770*c83a76b0SSuyog Pawar {
2771*c83a76b0SSuyog Pawar /*This also makes sure the qp swing restrictions wont be applied at boundary of bitrate change*/
2772*c83a76b0SSuyog Pawar ps_rate_control_api->au1_avg_bitrate_changed[i] = 1;
2773*c83a76b0SSuyog Pawar }
2774*c83a76b0SSuyog Pawar }
2775*c83a76b0SSuyog Pawar }
2776*c83a76b0SSuyog Pawar
2777*c83a76b0SSuyog Pawar #if NON_STEADSTATE_CODE
2778*c83a76b0SSuyog Pawar /******************************************************************************
2779*c83a76b0SSuyog Pawar Control Level API functions
2780*c83a76b0SSuyog Pawar Logic: The control call sets the state structure of the rate control api
2781*c83a76b0SSuyog Pawar accordingly such that the next process call would implement the same.
2782*c83a76b0SSuyog Pawar ******************************************************************************/
2783*c83a76b0SSuyog Pawar
2784*c83a76b0SSuyog Pawar /******************************************************************************
2785*c83a76b0SSuyog Pawar Function Name : change_inter_frm_int_call
2786*c83a76b0SSuyog Pawar Description :
2787*c83a76b0SSuyog Pawar Arguments :
2788*c83a76b0SSuyog Pawar Return Values : void
2789*c83a76b0SSuyog Pawar Revision History:
2790*c83a76b0SSuyog Pawar Creation
2791*c83a76b0SSuyog Pawar
2792*c83a76b0SSuyog Pawar Assumptions -
2793*c83a76b0SSuyog Pawar
2794*c83a76b0SSuyog Pawar Checks -
2795*c83a76b0SSuyog Pawar *****************************************************************************/
change_inter_frm_int_call(rate_control_api_t * ps_rate_control_api,WORD32 i4_inter_frm_int)2796*c83a76b0SSuyog Pawar void change_inter_frm_int_call(rate_control_api_t *ps_rate_control_api, WORD32 i4_inter_frm_int)
2797*c83a76b0SSuyog Pawar {
2798*c83a76b0SSuyog Pawar pic_handling_register_new_inter_frm_interval(
2799*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling, i4_inter_frm_int);
2800*c83a76b0SSuyog Pawar }
2801*c83a76b0SSuyog Pawar /******************************************************************************
2802*c83a76b0SSuyog Pawar Function Name : change_intra_frm_int_call
2803*c83a76b0SSuyog Pawar Description :
2804*c83a76b0SSuyog Pawar Arguments :
2805*c83a76b0SSuyog Pawar Return Values : void
2806*c83a76b0SSuyog Pawar Revision History:
2807*c83a76b0SSuyog Pawar Creation
2808*c83a76b0SSuyog Pawar
2809*c83a76b0SSuyog Pawar Assumptions -
2810*c83a76b0SSuyog Pawar
2811*c83a76b0SSuyog Pawar Checks -
2812*c83a76b0SSuyog Pawar *****************************************************************************/
change_intra_frm_int_call(rate_control_api_t * ps_rate_control_api,WORD32 i4_intra_frm_int)2813*c83a76b0SSuyog Pawar void change_intra_frm_int_call(rate_control_api_t *ps_rate_control_api, WORD32 i4_intra_frm_int)
2814*c83a76b0SSuyog Pawar {
2815*c83a76b0SSuyog Pawar pic_handling_register_new_int_frm_interval(
2816*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling, i4_intra_frm_int);
2817*c83a76b0SSuyog Pawar
2818*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type == VBR_STREAMING)
2819*c83a76b0SSuyog Pawar {
2820*c83a76b0SSuyog Pawar change_vsp_ifi(&ps_rate_control_api->s_vbr_str_prms, i4_intra_frm_int);
2821*c83a76b0SSuyog Pawar }
2822*c83a76b0SSuyog Pawar }
2823*c83a76b0SSuyog Pawar
2824*c83a76b0SSuyog Pawar /****************************************************************************
2825*c83a76b0SSuyog Pawar Function Name : change_frame_rate
2826*c83a76b0SSuyog Pawar Description : Does the necessary changes whenever there is a change in
2827*c83a76b0SSuyog Pawar frame rate
2828*c83a76b0SSuyog Pawar Inputs : u4_frame_rate - new frame rate to be used
2829*c83a76b0SSuyog Pawar Globals :
2830*c83a76b0SSuyog Pawar Processing :
2831*c83a76b0SSuyog Pawar Outputs :
2832*c83a76b0SSuyog Pawar Returns :
2833*c83a76b0SSuyog Pawar Issues :
2834*c83a76b0SSuyog Pawar Revision History:
2835*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2836*c83a76b0SSuyog Pawar
2837*c83a76b0SSuyog Pawar *****************************************************************************/
change_frame_rate(rate_control_api_t * ps_rate_control_api,UWORD32 u4_frame_rate,UWORD32 u4_src_ticks,UWORD32 u4_tgt_ticks)2838*c83a76b0SSuyog Pawar void change_frame_rate(
2839*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
2840*c83a76b0SSuyog Pawar UWORD32 u4_frame_rate,
2841*c83a76b0SSuyog Pawar UWORD32 u4_src_ticks,
2842*c83a76b0SSuyog Pawar UWORD32 u4_tgt_ticks)
2843*c83a76b0SSuyog Pawar {
2844*c83a76b0SSuyog Pawar if(ps_rate_control_api->e_rc_type != CONST_QP)
2845*c83a76b0SSuyog Pawar {
2846*c83a76b0SSuyog Pawar UWORD32 u4_frms_in_delay_prd =
2847*c83a76b0SSuyog Pawar ((u4_frame_rate * get_cbr_buffer_delay(ps_rate_control_api->ps_cbr_buffer)) / 1000000);
2848*c83a76b0SSuyog Pawar if((ps_rate_control_api->e_rc_type == VBR_STORAGE) ||
2849*c83a76b0SSuyog Pawar (ps_rate_control_api->e_rc_type == VBR_STORAGE_DVD_COMP))
2850*c83a76b0SSuyog Pawar {
2851*c83a76b0SSuyog Pawar change_vbr_vbv_frame_rate(ps_rate_control_api->ps_vbr_storage_vbv, u4_frame_rate);
2852*c83a76b0SSuyog Pawar }
2853*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == CBR_NLDRC)
2854*c83a76b0SSuyog Pawar {
2855*c83a76b0SSuyog Pawar change_cbr_vbv_tgt_frame_rate(ps_rate_control_api->ps_cbr_buffer, u4_frame_rate);
2856*c83a76b0SSuyog Pawar }
2857*c83a76b0SSuyog Pawar else if(ps_rate_control_api->e_rc_type == VBR_STREAMING)
2858*c83a76b0SSuyog Pawar {
2859*c83a76b0SSuyog Pawar UWORD32 au4_num_pics_in_delay_prd[MAX_PIC_TYPE];
2860*c83a76b0SSuyog Pawar change_vsp_tgt_ticks(&ps_rate_control_api->s_vbr_str_prms, u4_tgt_ticks);
2861*c83a76b0SSuyog Pawar change_vsp_src_ticks(&ps_rate_control_api->s_vbr_str_prms, u4_src_ticks);
2862*c83a76b0SSuyog Pawar change_vsp_fidp(&ps_rate_control_api->s_vbr_str_prms, u4_frms_in_delay_prd);
2863*c83a76b0SSuyog Pawar
2864*c83a76b0SSuyog Pawar change_cbr_vbv_tgt_frame_rate(ps_rate_control_api->ps_cbr_buffer, u4_frame_rate);
2865*c83a76b0SSuyog Pawar change_cbr_vbv_num_pics_in_delay_period(
2866*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer, au4_num_pics_in_delay_prd);
2867*c83a76b0SSuyog Pawar }
2868*c83a76b0SSuyog Pawar
2869*c83a76b0SSuyog Pawar /* Bit Allocation Module: distribute the excess/deficit bits between the
2870*c83a76b0SSuyog Pawar old and the new frame rate to all the remaining frames */
2871*c83a76b0SSuyog Pawar change_remaining_bits_in_period(
2872*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
2873*c83a76b0SSuyog Pawar ba_get_bit_rate(ps_rate_control_api->ps_bit_allocation),
2874*c83a76b0SSuyog Pawar u4_frame_rate,
2875*c83a76b0SSuyog Pawar (WORD32 *)(ps_rate_control_api->au4_new_peak_bit_rate));
2876*c83a76b0SSuyog Pawar }
2877*c83a76b0SSuyog Pawar }
2878*c83a76b0SSuyog Pawar /****************************************************************************
2879*c83a76b0SSuyog Pawar Function Name : change_init_qp
2880*c83a76b0SSuyog Pawar Description :
2881*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2882*c83a76b0SSuyog Pawar Revision History:
2883*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2884*c83a76b0SSuyog Pawar
2885*c83a76b0SSuyog Pawar *****************************************************************************/
change_init_qp(rate_control_api_t * ps_rate_control_api,WORD32 * pi4_init_qp,WORD32 i4_scene_num)2886*c83a76b0SSuyog Pawar void change_init_qp(
2887*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, WORD32 *pi4_init_qp, WORD32 i4_scene_num)
2888*c83a76b0SSuyog Pawar {
2889*c83a76b0SSuyog Pawar WORD32 i;
2890*c83a76b0SSuyog Pawar /* Initialize the init_qp */
2891*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
2892*c83a76b0SSuyog Pawar {
2893*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_prev_frm_qp[i4_scene_num][i] = pi4_init_qp[i];
2894*c83a76b0SSuyog Pawar }
2895*c83a76b0SSuyog Pawar }
2896*c83a76b0SSuyog Pawar
2897*c83a76b0SSuyog Pawar /****************************************************************************
2898*c83a76b0SSuyog Pawar Function Name : change_min_max_qp
2899*c83a76b0SSuyog Pawar Description :
2900*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2901*c83a76b0SSuyog Pawar Revision History:
2902*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2903*c83a76b0SSuyog Pawar
2904*c83a76b0SSuyog Pawar *****************************************************************************/
change_min_max_qp(rate_control_api_t * ps_rate_control_api,WORD32 * pi4_min_max_qp)2905*c83a76b0SSuyog Pawar void change_min_max_qp(rate_control_api_t *ps_rate_control_api, WORD32 *pi4_min_max_qp)
2906*c83a76b0SSuyog Pawar {
2907*c83a76b0SSuyog Pawar WORD32 i;
2908*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
2909*c83a76b0SSuyog Pawar {
2910*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_min_qp[i] = pi4_min_max_qp[(i << 1)];
2911*c83a76b0SSuyog Pawar ps_rate_control_api->ai4_max_qp[i] = pi4_min_max_qp[(i << 1) + 1];
2912*c83a76b0SSuyog Pawar }
2913*c83a76b0SSuyog Pawar
2914*c83a76b0SSuyog Pawar change_init_qp_max_qp(ps_rate_control_api->ps_init_qp, pi4_min_max_qp);
2915*c83a76b0SSuyog Pawar }
2916*c83a76b0SSuyog Pawar /****************************************************************************
2917*c83a76b0SSuyog Pawar Function Name : rc_get_frame_rate
2918*c83a76b0SSuyog Pawar Description :
2919*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2920*c83a76b0SSuyog Pawar Revision History:
2921*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2922*c83a76b0SSuyog Pawar
2923*c83a76b0SSuyog Pawar *****************************************************************************/
2924*c83a76b0SSuyog Pawar /* Getter functions to get the current rate control parameters */
rc_get_frame_rate(rate_control_api_t * ps_rate_control_api)2925*c83a76b0SSuyog Pawar UWORD32 rc_get_frame_rate(rate_control_api_t *ps_rate_control_api)
2926*c83a76b0SSuyog Pawar {
2927*c83a76b0SSuyog Pawar return (ba_get_frame_rate(ps_rate_control_api->ps_bit_allocation));
2928*c83a76b0SSuyog Pawar }
2929*c83a76b0SSuyog Pawar /****************************************************************************
2930*c83a76b0SSuyog Pawar Function Name : rc_get_bit_rate
2931*c83a76b0SSuyog Pawar Description :
2932*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2933*c83a76b0SSuyog Pawar Revision History:
2934*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2935*c83a76b0SSuyog Pawar
2936*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_bit_rate(rate_control_api_t * ps_rate_control_api)2937*c83a76b0SSuyog Pawar UWORD32 rc_get_bit_rate(rate_control_api_t *ps_rate_control_api)
2938*c83a76b0SSuyog Pawar {
2939*c83a76b0SSuyog Pawar return (ba_get_bit_rate(ps_rate_control_api->ps_bit_allocation));
2940*c83a76b0SSuyog Pawar }
2941*c83a76b0SSuyog Pawar /****************************************************************************
2942*c83a76b0SSuyog Pawar Function Name : rc_get_peak_bit_rate
2943*c83a76b0SSuyog Pawar Description :
2944*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2945*c83a76b0SSuyog Pawar Revision History:
2946*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2947*c83a76b0SSuyog Pawar
2948*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_peak_bit_rate(rate_control_api_t * ps_rate_control_api,WORD32 i4_index)2949*c83a76b0SSuyog Pawar UWORD32 rc_get_peak_bit_rate(rate_control_api_t *ps_rate_control_api, WORD32 i4_index)
2950*c83a76b0SSuyog Pawar {
2951*c83a76b0SSuyog Pawar return (ps_rate_control_api->au4_new_peak_bit_rate[i4_index]);
2952*c83a76b0SSuyog Pawar }
2953*c83a76b0SSuyog Pawar /****************************************************************************
2954*c83a76b0SSuyog Pawar Function Name : rc_get_intra_frame_interval
2955*c83a76b0SSuyog Pawar Description :
2956*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2957*c83a76b0SSuyog Pawar Revision History:
2958*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2959*c83a76b0SSuyog Pawar
2960*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_intra_frame_interval(rate_control_api_t * ps_rate_control_api)2961*c83a76b0SSuyog Pawar UWORD32 rc_get_intra_frame_interval(rate_control_api_t *ps_rate_control_api)
2962*c83a76b0SSuyog Pawar {
2963*c83a76b0SSuyog Pawar return (pic_type_get_intra_frame_interval(ps_rate_control_api->ps_pic_handling));
2964*c83a76b0SSuyog Pawar }
2965*c83a76b0SSuyog Pawar /****************************************************************************
2966*c83a76b0SSuyog Pawar Function Name : rc_get_inter_frame_interval
2967*c83a76b0SSuyog Pawar Description :
2968*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2969*c83a76b0SSuyog Pawar Revision History:
2970*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2971*c83a76b0SSuyog Pawar
2972*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_inter_frame_interval(rate_control_api_t * ps_rate_control_api)2973*c83a76b0SSuyog Pawar UWORD32 rc_get_inter_frame_interval(rate_control_api_t *ps_rate_control_api)
2974*c83a76b0SSuyog Pawar {
2975*c83a76b0SSuyog Pawar return (pic_type_get_inter_frame_interval(ps_rate_control_api->ps_pic_handling));
2976*c83a76b0SSuyog Pawar }
2977*c83a76b0SSuyog Pawar /****************************************************************************
2978*c83a76b0SSuyog Pawar Function Name : rc_get_rc_type
2979*c83a76b0SSuyog Pawar Description :
2980*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2981*c83a76b0SSuyog Pawar Revision History:
2982*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2983*c83a76b0SSuyog Pawar
2984*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_rc_type(rate_control_api_t * ps_rate_control_api)2985*c83a76b0SSuyog Pawar rc_type_e rc_get_rc_type(rate_control_api_t *ps_rate_control_api)
2986*c83a76b0SSuyog Pawar {
2987*c83a76b0SSuyog Pawar return (ps_rate_control_api->e_rc_type);
2988*c83a76b0SSuyog Pawar }
2989*c83a76b0SSuyog Pawar /****************************************************************************
2990*c83a76b0SSuyog Pawar Function Name : rc_get_bits_per_frame
2991*c83a76b0SSuyog Pawar Description :
2992*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
2993*c83a76b0SSuyog Pawar Revision History:
2994*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2995*c83a76b0SSuyog Pawar
2996*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_bits_per_frame(rate_control_api_t * ps_rate_control_api)2997*c83a76b0SSuyog Pawar WORD32 rc_get_bits_per_frame(rate_control_api_t *ps_rate_control_api)
2998*c83a76b0SSuyog Pawar {
2999*c83a76b0SSuyog Pawar WORD32 i4_bits_per_frm;
3000*c83a76b0SSuyog Pawar
3001*c83a76b0SSuyog Pawar X_PROD_Y_DIV_Z(
3002*c83a76b0SSuyog Pawar ba_get_bit_rate(ps_rate_control_api->ps_bit_allocation),
3003*c83a76b0SSuyog Pawar (UWORD32)1000,
3004*c83a76b0SSuyog Pawar ba_get_frame_rate(ps_rate_control_api->ps_bit_allocation),
3005*c83a76b0SSuyog Pawar i4_bits_per_frm);
3006*c83a76b0SSuyog Pawar
3007*c83a76b0SSuyog Pawar return (i4_bits_per_frm);
3008*c83a76b0SSuyog Pawar }
3009*c83a76b0SSuyog Pawar /****************************************************************************
3010*c83a76b0SSuyog Pawar Function Name : rc_get_max_delay
3011*c83a76b0SSuyog Pawar Description :
3012*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3013*c83a76b0SSuyog Pawar Revision History:
3014*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3015*c83a76b0SSuyog Pawar
3016*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_max_delay(rate_control_api_t * ps_rate_control_api)3017*c83a76b0SSuyog Pawar UWORD32 rc_get_max_delay(rate_control_api_t *ps_rate_control_api)
3018*c83a76b0SSuyog Pawar {
3019*c83a76b0SSuyog Pawar return (get_cbr_buffer_delay(ps_rate_control_api->ps_cbr_buffer));
3020*c83a76b0SSuyog Pawar }
3021*c83a76b0SSuyog Pawar /****************************************************************************
3022*c83a76b0SSuyog Pawar Function Name : rc_get_seq_no
3023*c83a76b0SSuyog Pawar Description :
3024*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3025*c83a76b0SSuyog Pawar Revision History:
3026*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3027*c83a76b0SSuyog Pawar
3028*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_seq_no(rate_control_api_t * ps_rate_control_api)3029*c83a76b0SSuyog Pawar UWORD32 rc_get_seq_no(rate_control_api_t *ps_rate_control_api)
3030*c83a76b0SSuyog Pawar {
3031*c83a76b0SSuyog Pawar return (pic_type_get_disp_order_no(ps_rate_control_api->ps_pic_handling));
3032*c83a76b0SSuyog Pawar }
3033*c83a76b0SSuyog Pawar /****************************************************************************
3034*c83a76b0SSuyog Pawar Function Name : rc_get_rem_frames_in_gop
3035*c83a76b0SSuyog Pawar Description :
3036*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3037*c83a76b0SSuyog Pawar Revision History:
3038*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3039*c83a76b0SSuyog Pawar
3040*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_rem_frames_in_gop(rate_control_api_t * ps_rate_control_api)3041*c83a76b0SSuyog Pawar UWORD32 rc_get_rem_frames_in_gop(rate_control_api_t *ps_rate_control_api)
3042*c83a76b0SSuyog Pawar {
3043*c83a76b0SSuyog Pawar /* Get the rem_frms_in_gop & the frms_in_gop from the pic_type state struct */
3044*c83a76b0SSuyog Pawar return (pic_type_get_rem_frms_in_gop(ps_rate_control_api->ps_pic_handling));
3045*c83a76b0SSuyog Pawar }
3046*c83a76b0SSuyog Pawar
3047*c83a76b0SSuyog Pawar /****************************************************************************
3048*c83a76b0SSuyog Pawar Function Name : flush_buf_frames
3049*c83a76b0SSuyog Pawar Description : API call to flush the buffered up frames
3050*c83a76b0SSuyog Pawar Inputs :
3051*c83a76b0SSuyog Pawar Globals :
3052*c83a76b0SSuyog Pawar Processing :
3053*c83a76b0SSuyog Pawar Outputs :
3054*c83a76b0SSuyog Pawar Returns :
3055*c83a76b0SSuyog Pawar Issues :
3056*c83a76b0SSuyog Pawar Revision History:
3057*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3058*c83a76b0SSuyog Pawar *****************************************************************************/
post_encode_frame_skip(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type)3059*c83a76b0SSuyog Pawar void post_encode_frame_skip(rate_control_api_t *ps_rate_control_api, picture_type_e e_pic_type)
3060*c83a76b0SSuyog Pawar {
3061*c83a76b0SSuyog Pawar skip_encoded_frame(ps_rate_control_api->ps_pic_handling, e_pic_type);
3062*c83a76b0SSuyog Pawar }
3063*c83a76b0SSuyog Pawar
3064*c83a76b0SSuyog Pawar /****************************************************************************
3065*c83a76b0SSuyog Pawar Function Name : force_I_frame
3066*c83a76b0SSuyog Pawar Description : API call to force an I frame
3067*c83a76b0SSuyog Pawar *****************************************************************************/
force_I_frame(rate_control_api_t * ps_rate_control_api)3068*c83a76b0SSuyog Pawar void force_I_frame(rate_control_api_t *ps_rate_control_api)
3069*c83a76b0SSuyog Pawar {
3070*c83a76b0SSuyog Pawar set_force_I_frame_flag(ps_rate_control_api->ps_pic_handling);
3071*c83a76b0SSuyog Pawar }
3072*c83a76b0SSuyog Pawar
3073*c83a76b0SSuyog Pawar /****************************************************************************
3074*c83a76b0SSuyog Pawar * Function Name : rc_get_vbv_buf_fullness
3075*c83a76b0SSuyog Pawar * Description : API call to get VBV buffer fullness
3076*c83a76b0SSuyog Pawar ******************************************************************************/
rc_get_vbv_buf_fullness(rate_control_api_t * ps_rate_control_api)3077*c83a76b0SSuyog Pawar WORD32 rc_get_vbv_buf_fullness(rate_control_api_t *ps_rate_control_api)
3078*c83a76b0SSuyog Pawar {
3079*c83a76b0SSuyog Pawar return (get_cur_vbv_buf_size(ps_rate_control_api->ps_vbr_storage_vbv));
3080*c83a76b0SSuyog Pawar }
3081*c83a76b0SSuyog Pawar /****************************************************************************
3082*c83a76b0SSuyog Pawar * Function Name : rc_get_cur_peak_factor_2pass
3083*c83a76b0SSuyog Pawar * Description : API call to get current peak factor
3084*c83a76b0SSuyog Pawar ******************************************************************************/
rc_get_cur_peak_factor_2pass(rate_control_api_t * ps_rate_control_api)3085*c83a76b0SSuyog Pawar float rc_get_cur_peak_factor_2pass(rate_control_api_t *ps_rate_control_api)
3086*c83a76b0SSuyog Pawar {
3087*c83a76b0SSuyog Pawar return (get_cur_peak_factor_2pass(ps_rate_control_api->ps_bit_allocation));
3088*c83a76b0SSuyog Pawar }
3089*c83a76b0SSuyog Pawar /****************************************************************************
3090*c83a76b0SSuyog Pawar * Function Name : rc_get_min_complexity_factor_2pass
3091*c83a76b0SSuyog Pawar * Description : API call to get minimm complexity factor
3092*c83a76b0SSuyog Pawar ******************************************************************************/
rc_get_min_complexity_factor_2pass(rate_control_api_t * ps_rate_control_api)3093*c83a76b0SSuyog Pawar float rc_get_min_complexity_factor_2pass(rate_control_api_t *ps_rate_control_api)
3094*c83a76b0SSuyog Pawar {
3095*c83a76b0SSuyog Pawar return (get_cur_min_complexity_factor_2pass(ps_rate_control_api->ps_bit_allocation));
3096*c83a76b0SSuyog Pawar }
3097*c83a76b0SSuyog Pawar /****************************************************************************
3098*c83a76b0SSuyog Pawar * Function Name : rc_get_vbv_buf_size
3099*c83a76b0SSuyog Pawar * Description : API call to get VBV buffer size
3100*c83a76b0SSuyog Pawar ******************************************************************************/
rc_get_vbv_buf_size(rate_control_api_t * ps_rate_control_api)3101*c83a76b0SSuyog Pawar WORD32 rc_get_vbv_buf_size(rate_control_api_t *ps_rate_control_api)
3102*c83a76b0SSuyog Pawar {
3103*c83a76b0SSuyog Pawar return (get_cbr_buffer_size(ps_rate_control_api->ps_cbr_buffer));
3104*c83a76b0SSuyog Pawar }
3105*c83a76b0SSuyog Pawar /****************************************************************************
3106*c83a76b0SSuyog Pawar * Function Name : rc_get_vbv_fulness_with_cur_bits
3107*c83a76b0SSuyog Pawar * Description : API call to get VBV buffer fullness with current bits
3108*c83a76b0SSuyog Pawar ******************************************************************************/
rc_get_vbv_fulness_with_cur_bits(rate_control_api_t * ps_rate_control_api,UWORD32 u4_bits)3109*c83a76b0SSuyog Pawar WORD32 rc_get_vbv_fulness_with_cur_bits(rate_control_api_t *ps_rate_control_api, UWORD32 u4_bits)
3110*c83a76b0SSuyog Pawar {
3111*c83a76b0SSuyog Pawar return (get_vbv_buf_fullness(ps_rate_control_api->ps_vbr_storage_vbv, u4_bits));
3112*c83a76b0SSuyog Pawar }
3113*c83a76b0SSuyog Pawar /****************************************************************************
3114*c83a76b0SSuyog Pawar * Function Name : rc_set_avg_mb_act
3115*c83a76b0SSuyog Pawar * Description :
3116*c83a76b0SSuyog Pawar ******************************************************************************/
rc_set_avg_mb_act(rate_control_api_t * ps_rate_control_api,WORD32 i4_avg_activity)3117*c83a76b0SSuyog Pawar void rc_set_avg_mb_act(rate_control_api_t *ps_rate_control_api, WORD32 i4_avg_activity)
3118*c83a76b0SSuyog Pawar {
3119*c83a76b0SSuyog Pawar mb_update_frame_level(ps_rate_control_api->ps_mb_rate_control, i4_avg_activity);
3120*c83a76b0SSuyog Pawar return;
3121*c83a76b0SSuyog Pawar }
3122*c83a76b0SSuyog Pawar /****************************************************************************
3123*c83a76b0SSuyog Pawar * Function Name : rc_init_set_ebf
3124*c83a76b0SSuyog Pawar * Description : API call to set EBF
3125*c83a76b0SSuyog Pawar ******************************************************************************/
rc_init_set_ebf(rate_control_api_t * ps_rate_control_api,WORD32 i32_init_ebf)3126*c83a76b0SSuyog Pawar void rc_init_set_ebf(rate_control_api_t *ps_rate_control_api, WORD32 i32_init_ebf)
3127*c83a76b0SSuyog Pawar {
3128*c83a76b0SSuyog Pawar set_cbr_ebf(ps_rate_control_api->ps_cbr_buffer, i32_init_ebf);
3129*c83a76b0SSuyog Pawar }
3130*c83a76b0SSuyog Pawar #endif /* #if NON_STEADSTATE_CODE */
3131*c83a76b0SSuyog Pawar
3132*c83a76b0SSuyog Pawar /****************************************************************************
3133*c83a76b0SSuyog Pawar Function Name : rc_get_qp_scene_change_bits
3134*c83a76b0SSuyog Pawar Description : HEVC specific function to get scene change qp at scene cut location
3135*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3136*c83a76b0SSuyog Pawar
3137*c83a76b0SSuyog Pawar Revision History:
3138*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3139*c83a76b0SSuyog Pawar *****************************************************************************/
3140*c83a76b0SSuyog Pawar
rc_get_qp_scene_change_bits(rate_control_handle ps_rate_control_api,WORD32 i4_total_bits,LWORD64 i8_satd_by_act_accum,WORD32 i4_num_pixel,void * offline_model_coeff,float f_i_to_average_rest,WORD32 i4_call_type)3141*c83a76b0SSuyog Pawar WORD32 rc_get_qp_scene_change_bits(
3142*c83a76b0SSuyog Pawar rate_control_handle ps_rate_control_api,
3143*c83a76b0SSuyog Pawar WORD32 i4_total_bits,
3144*c83a76b0SSuyog Pawar LWORD64 i8_satd_by_act_accum,
3145*c83a76b0SSuyog Pawar WORD32 i4_num_pixel,
3146*c83a76b0SSuyog Pawar void *offline_model_coeff,
3147*c83a76b0SSuyog Pawar float f_i_to_average_rest,
3148*c83a76b0SSuyog Pawar WORD32 i4_call_type)
3149*c83a76b0SSuyog Pawar {
3150*c83a76b0SSuyog Pawar float f_trial_q_scale;
3151*c83a76b0SSuyog Pawar WORD32 i4_tex_bits = 0, i4_header_bits = 0;
3152*c83a76b0SSuyog Pawar WORD32 error = 0, min_error = 0x7FFFFFFF, i4_is_high_bitrate = 0;
3153*c83a76b0SSuyog Pawar double *model_coeff, min_error_q_scale = (double)127;
3154*c83a76b0SSuyog Pawar double min_scd_qscale, max_scd_q_scale;
3155*c83a76b0SSuyog Pawar WORD32 i4_QP, i4_max_Qp, i4_min_Qp, i4_qp_selection_flag = 0;
3156*c83a76b0SSuyog Pawar WORD32 i4_prev_best = -1;
3157*c83a76b0SSuyog Pawar
3158*c83a76b0SSuyog Pawar /*The qp calculation here is based on offline generated stat for around 30 frames belonging to different scene
3159*c83a76b0SSuyog Pawar The I only mode of encode was done for the above sequence for qp range {8,51}. A quadratic and cubic curve was obtained
3160*c83a76b0SSuyog Pawar based on the stat geneated.
3161*c83a76b0SSuyog Pawar eq coeff*/
3162*c83a76b0SSuyog Pawar float coeff_a, coeff_b, coeff_c, coeff_d, X, tex_bpp;
3163*c83a76b0SSuyog Pawar float min_qp_qscale_multiplier =
3164*c83a76b0SSuyog Pawar 1; /*For fade-in fade-out case where scene starts with blank frame have higher min frame qp*/
3165*c83a76b0SSuyog Pawar //float head_per;
3166*c83a76b0SSuyog Pawar float normal_satd_act;
3167*c83a76b0SSuyog Pawar float bpp = (float)get_bits_per_frame(ps_rate_control_api->ps_bit_allocation) / i4_num_pixel;
3168*c83a76b0SSuyog Pawar
3169*c83a76b0SSuyog Pawar if(i4_num_pixel > 5000000) /*UHD*/
3170*c83a76b0SSuyog Pawar {
3171*c83a76b0SSuyog Pawar if(bpp > 0.12) /*30mbp 2160 30p*/
3172*c83a76b0SSuyog Pawar i4_is_high_bitrate = 1;
3173*c83a76b0SSuyog Pawar else if(bpp > 0.06)
3174*c83a76b0SSuyog Pawar i4_is_high_bitrate = 2;
3175*c83a76b0SSuyog Pawar else if(bpp > 0.03)
3176*c83a76b0SSuyog Pawar i4_is_high_bitrate = 3;
3177*c83a76b0SSuyog Pawar }
3178*c83a76b0SSuyog Pawar else
3179*c83a76b0SSuyog Pawar {
3180*c83a76b0SSuyog Pawar if(bpp > 0.16) /*10mbps 1080 30p*/
3181*c83a76b0SSuyog Pawar i4_is_high_bitrate = 1;
3182*c83a76b0SSuyog Pawar else if(bpp > 0.08)
3183*c83a76b0SSuyog Pawar i4_is_high_bitrate = 2;
3184*c83a76b0SSuyog Pawar else if(bpp > 0.04)
3185*c83a76b0SSuyog Pawar i4_is_high_bitrate = 3;
3186*c83a76b0SSuyog Pawar }
3187*c83a76b0SSuyog Pawar /*Min qp and Max qp at scene cut is critical since offline models are not reliable always*/
3188*c83a76b0SSuyog Pawar /*During fade-in fade-out when LAP places I frame on blank pictures but the content slowly changes to complicated content, Due to low
3189*c83a76b0SSuyog Pawar spatial complxity of I pic a very low SCD qp will be allocated, qp swing restriction will not give enough frames to increase qp to high value
3190*c83a76b0SSuyog Pawar to encode such fast motion inter pictiures .Hence whenever temporal complexity is very high assume some least spatial complexity so that very low qp
3191*c83a76b0SSuyog Pawar is not chosen*/
3192*c83a76b0SSuyog Pawar if(f_i_to_average_rest < I_TO_REST_VVFAST &&
3193*c83a76b0SSuyog Pawar (i4_is_high_bitrate !=
3194*c83a76b0SSuyog Pawar 1)) /*The I_TO_AVERAGE RATIO generally comes very low, hence this wont be measure of extent on motion in inter pictures*/
3195*c83a76b0SSuyog Pawar {
3196*c83a76b0SSuyog Pawar WORD32 i4_min_num_pixel = i4_num_pixel;
3197*c83a76b0SSuyog Pawar
3198*c83a76b0SSuyog Pawar if(i4_num_pixel > 5000000)
3199*c83a76b0SSuyog Pawar {
3200*c83a76b0SSuyog Pawar i4_min_num_pixel = i4_min_num_pixel / 2;
3201*c83a76b0SSuyog Pawar }
3202*c83a76b0SSuyog Pawar
3203*c83a76b0SSuyog Pawar if(i8_satd_by_act_accum <
3204*c83a76b0SSuyog Pawar i4_num_pixel) /*In very fast motion case have min threshold for I frame, Assume atleast one unit per pixel sad*/
3205*c83a76b0SSuyog Pawar {
3206*c83a76b0SSuyog Pawar if(i4_is_high_bitrate == 2)
3207*c83a76b0SSuyog Pawar {
3208*c83a76b0SSuyog Pawar i8_satd_by_act_accum = (LWORD64)(i4_min_num_pixel / 2);
3209*c83a76b0SSuyog Pawar }
3210*c83a76b0SSuyog Pawar else if(i4_is_high_bitrate == 3)
3211*c83a76b0SSuyog Pawar {
3212*c83a76b0SSuyog Pawar i8_satd_by_act_accum = (LWORD64)(i4_min_num_pixel * 3.0f / 4.0f);
3213*c83a76b0SSuyog Pawar }
3214*c83a76b0SSuyog Pawar else
3215*c83a76b0SSuyog Pawar i8_satd_by_act_accum = (LWORD64)(i4_min_num_pixel);
3216*c83a76b0SSuyog Pawar
3217*c83a76b0SSuyog Pawar min_qp_qscale_multiplier = (float)pow(
3218*c83a76b0SSuyog Pawar (float)1.125f,
3219*c83a76b0SSuyog Pawar (WORD32)6); //this will make min qp for simple frame with high moiton 24 instead of 18
3220*c83a76b0SSuyog Pawar }
3221*c83a76b0SSuyog Pawar }
3222*c83a76b0SSuyog Pawar min_scd_qscale = pow(2, (double)(ps_rate_control_api->u4_min_scd_hevc_qp - 4) / 6) *
3223*c83a76b0SSuyog Pawar min_qp_qscale_multiplier;
3224*c83a76b0SSuyog Pawar max_scd_q_scale = pow(2, (double)(SCD_MAX_HEVC_QP - 4) / 6);
3225*c83a76b0SSuyog Pawar i4_max_Qp = MAX_HEVC_QP;
3226*c83a76b0SSuyog Pawar i4_min_Qp = ps_rate_control_api->u4_min_scd_hevc_qp;
3227*c83a76b0SSuyog Pawar if((ps_rate_control_api->u1_bit_depth > 8) && (i4_call_type == 1))
3228*c83a76b0SSuyog Pawar {
3229*c83a76b0SSuyog Pawar i8_satd_by_act_accum = i8_satd_by_act_accum << (ps_rate_control_api->u1_bit_depth - 8);
3230*c83a76b0SSuyog Pawar i4_max_Qp = i4_max_Qp + (6 * (ps_rate_control_api->u1_bit_depth - 8));
3231*c83a76b0SSuyog Pawar i4_min_Qp = i4_min_Qp + (6 * (ps_rate_control_api->u1_bit_depth - 8));
3232*c83a76b0SSuyog Pawar max_scd_q_scale = max_scd_q_scale * (1 << (ps_rate_control_api->u1_bit_depth - 8));
3233*c83a76b0SSuyog Pawar }
3234*c83a76b0SSuyog Pawar
3235*c83a76b0SSuyog Pawar normal_satd_act = (float)i8_satd_by_act_accum / i4_num_pixel;
3236*c83a76b0SSuyog Pawar
3237*c83a76b0SSuyog Pawar {
3238*c83a76b0SSuyog Pawar /* Max satd/act at L0 was taken at qp 18 for
3239*c83a76b0SSuyog Pawar 480p - 4410520
3240*c83a76b0SSuyog Pawar 720p - 9664235
3241*c83a76b0SSuyog Pawar 1080p - 15735650
3242*c83a76b0SSuyog Pawar 4k - 50316472
3243*c83a76b0SSuyog Pawar A curve was generated using these points
3244*c83a76b0SSuyog Pawar */
3245*c83a76b0SSuyog Pawar
3246*c83a76b0SSuyog Pawar float f_satd_by_Act_norm = GET_L0_SATD_BY_ACT_MAX_PER_PIXEL(i4_num_pixel);
3247*c83a76b0SSuyog Pawar float f_weigh_factor = 0.0f;
3248*c83a76b0SSuyog Pawar f_satd_by_Act_norm = f_satd_by_Act_norm * 0.75f;
3249*c83a76b0SSuyog Pawar f_weigh_factor = GET_WEIGH_FACTOR_FOR_MIN_SCD_Q_SCALE(normal_satd_act, f_satd_by_Act_norm);
3250*c83a76b0SSuyog Pawar CLIP(f_weigh_factor, 1.0f, 1.0f / MULT_FACTOR_SATD);
3251*c83a76b0SSuyog Pawar min_scd_qscale = min_scd_qscale * f_weigh_factor;
3252*c83a76b0SSuyog Pawar CLIP(min_scd_qscale, max_scd_q_scale, 1);
3253*c83a76b0SSuyog Pawar }
3254*c83a76b0SSuyog Pawar
3255*c83a76b0SSuyog Pawar /*coeff value based on input resolution
3256*c83a76b0SSuyog Pawar 1920x1090 -> 207360,1280x720->921600,720x480->345600(unlike for I_REST_AVG_BIT_RATIO here 720x480 was considered as low resolution)
3257*c83a76b0SSuyog Pawar ultra high res = num_pixek > 5000000
3258*c83a76b0SSuyog Pawar high_res = num_pxel > 1500000
3259*c83a76b0SSuyog Pawar mid res = num_pixel > 600000
3260*c83a76b0SSuyog Pawar low_res = num_pixel < 600000
3261*c83a76b0SSuyog Pawar The fit is based on HEVC qp value between 18 and 48 inclusive
3262*c83a76b0SSuyog Pawar */
3263*c83a76b0SSuyog Pawar /*adding coeff for ultra HD resolution*/
3264*c83a76b0SSuyog Pawar /*
3265*c83a76b0SSuyog Pawar High quality bpp vs nor satd/act/qp
3266*c83a76b0SSuyog Pawar --------------------------------------
3267*c83a76b0SSuyog Pawar 480p y = -0.1823x3 + 0.5258x2 + 1.7707x - 0.0394
3268*c83a76b0SSuyog Pawar 720p y = -0.1458x3 + 0.4039x2 + 1.8817x - 0.0648
3269*c83a76b0SSuyog Pawar 1080p y = -0.4712x3 + 1.3818x2 + 1.2797x - 0.0262
3270*c83a76b0SSuyog Pawar 2160p y = -1.1234x3 + 2.6328x2 + 0.8817x - 0.0047
3271*c83a76b0SSuyog Pawar
3272*c83a76b0SSuyog Pawar
3273*c83a76b0SSuyog Pawar Medium speed
3274*c83a76b0SSuyog Pawar ------------
3275*c83a76b0SSuyog Pawar 480p y = -0.1567x3 + 0.4222x2 + 1.8899x - 0.0537
3276*c83a76b0SSuyog Pawar 720p y = -0.1417x3 + 0.3699x2 + 1.9611x - 0.0766
3277*c83a76b0SSuyog Pawar 1080p y = -0.4841x3 + 1.4123x2 + 1.2981x - 0.0321
3278*c83a76b0SSuyog Pawar 2160p y = -1.1989x3 + 2.7935x2 + 0.8648x - 0.0074
3279*c83a76b0SSuyog Pawar
3280*c83a76b0SSuyog Pawar High speed
3281*c83a76b0SSuyog Pawar -------------
3282*c83a76b0SSuyog Pawar 480p y = -0.1611x3 + 0.4418x2 + 1.8754x - 0.0524
3283*c83a76b0SSuyog Pawar 720p y = -0.1455x3 + 0.3854x2 + 1.951x - 0.0753
3284*c83a76b0SSuyog Pawar 1080p y = -0.4908x3 + 1.4344x2 + 1.2848x - 0.031
3285*c83a76b0SSuyog Pawar 2160p y = -1.2037x3 + 2.8062x2 + 0.8551x - 0.0067
3286*c83a76b0SSuyog Pawar */
3287*c83a76b0SSuyog Pawar model_coeff = (double *)offline_model_coeff;
3288*c83a76b0SSuyog Pawar coeff_a = (float)model_coeff[0];
3289*c83a76b0SSuyog Pawar coeff_b = (float)model_coeff[1];
3290*c83a76b0SSuyog Pawar coeff_c = (float)model_coeff[2];
3291*c83a76b0SSuyog Pawar coeff_d = (float)model_coeff[3];
3292*c83a76b0SSuyog Pawar for(i4_QP = i4_min_Qp; i4_QP < i4_max_Qp; i4_QP++)
3293*c83a76b0SSuyog Pawar {
3294*c83a76b0SSuyog Pawar /*needs to use the array for qp to qscale */
3295*c83a76b0SSuyog Pawar
3296*c83a76b0SSuyog Pawar f_trial_q_scale = (float)(pow(2.0, (i4_QP - 4.0) / 6.0));
3297*c83a76b0SSuyog Pawar /* curve fit for texture bits*/
3298*c83a76b0SSuyog Pawar X = (float)normal_satd_act / f_trial_q_scale;
3299*c83a76b0SSuyog Pawar tex_bpp = ((coeff_a * X * X * X) + (coeff_b * X * X) + (coeff_c * X) + coeff_d);
3300*c83a76b0SSuyog Pawar if(tex_bpp < (float)((1 << 30)) / i4_num_pixel)
3301*c83a76b0SSuyog Pawar i4_tex_bits = (tex_bpp * i4_num_pixel);
3302*c83a76b0SSuyog Pawar else
3303*c83a76b0SSuyog Pawar i4_tex_bits = (1 << 30);
3304*c83a76b0SSuyog Pawar i4_header_bits = 0;
3305*c83a76b0SSuyog Pawar if(i4_tex_bits > 0)
3306*c83a76b0SSuyog Pawar {
3307*c83a76b0SSuyog Pawar /*QP increase can't cause increase in bits*/
3308*c83a76b0SSuyog Pawar if(i4_prev_best != -1 && (i4_tex_bits > i4_prev_best))
3309*c83a76b0SSuyog Pawar {
3310*c83a76b0SSuyog Pawar min_error = 0x7FFFFFFF;
3311*c83a76b0SSuyog Pawar i4_qp_selection_flag = 0;
3312*c83a76b0SSuyog Pawar }
3313*c83a76b0SSuyog Pawar /*consider texture bits to get header bits using obtained header percentage. Using header bits on overall bits targetted might not be correct*/
3314*c83a76b0SSuyog Pawar error = i4_total_bits - (i4_tex_bits + i4_header_bits);
3315*c83a76b0SSuyog Pawar if(abs(error) < abs(min_error))
3316*c83a76b0SSuyog Pawar {
3317*c83a76b0SSuyog Pawar min_error = error;
3318*c83a76b0SSuyog Pawar min_error_q_scale = f_trial_q_scale;
3319*c83a76b0SSuyog Pawar i4_qp_selection_flag = 1;
3320*c83a76b0SSuyog Pawar i4_prev_best = i4_tex_bits;
3321*c83a76b0SSuyog Pawar }
3322*c83a76b0SSuyog Pawar }
3323*c83a76b0SSuyog Pawar }
3324*c83a76b0SSuyog Pawar if(!i4_qp_selection_flag)
3325*c83a76b0SSuyog Pawar {
3326*c83a76b0SSuyog Pawar min_error_q_scale = (WORD32)(min_scd_qscale + 0.5);
3327*c83a76b0SSuyog Pawar }
3328*c83a76b0SSuyog Pawar //if((ps_rate_control_api->u1_bit_depth > 8)&& (i4_call_type == 1))
3329*c83a76b0SSuyog Pawar // min_error_q_scale = min_error_q_scale / (1 << (ps_rate_control_api->u1_bit_depth - 8));
3330*c83a76b0SSuyog Pawar
3331*c83a76b0SSuyog Pawar /*offline stat generation range considered is mpeg2qp 5 to 161 or hevc qp 18 to 48*/
3332*c83a76b0SSuyog Pawar CLIP(min_error_q_scale, (WORD32)(max_scd_q_scale + 0.5), (WORD32)(min_scd_qscale + .5));
3333*c83a76b0SSuyog Pawar return ((WORD32)(min_error_q_scale * (1 << QSCALE_Q_FAC_3)));
3334*c83a76b0SSuyog Pawar }
3335*c83a76b0SSuyog Pawar
3336*c83a76b0SSuyog Pawar /****************************************************************************
3337*c83a76b0SSuyog Pawar Function Name : rc_get_qp_for_scd_frame
3338*c83a76b0SSuyog Pawar Description : Get qp for a scene cut frame
3339*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3340*c83a76b0SSuyog Pawar
3341*c83a76b0SSuyog Pawar Revision History:
3342*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3343*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_qp_for_scd_frame(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type,LWORD64 i8_satd_act_accum,WORD32 i4_num_pels_in_frame,WORD32 i4_est_I_pic_head_bits,WORD32 i4_f_sim_lap_avg,void * offline_model_coeff,float i_to_avg_ratio,WORD32 i4_true_scd,float af_sum_weigh[MAX_PIC_TYPE][3],frame_info_t * ps_frame_stat,WORD32 i4_rc_2_pass,WORD32 i4_is_not_an_I_pic,WORD32 i4_ref_first_pass,WORD32 i4_call_type,WORD32 * pi4_cur_est_tot_bits,WORD32 * pi4_tot_bits_estimated,WORD32 i4_use_offline_model_2pass,LWORD64 * pi8_i_tex_bits,float * pf_i_qs,WORD32 i4_best_br_id,WORD32 * pi4_estimate_to_calc_frm_error)3344*c83a76b0SSuyog Pawar WORD32 rc_get_qp_for_scd_frame(
3345*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
3346*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
3347*c83a76b0SSuyog Pawar LWORD64 i8_satd_act_accum,
3348*c83a76b0SSuyog Pawar WORD32 i4_num_pels_in_frame,
3349*c83a76b0SSuyog Pawar WORD32 i4_est_I_pic_head_bits,
3350*c83a76b0SSuyog Pawar WORD32 i4_f_sim_lap_avg,
3351*c83a76b0SSuyog Pawar void *offline_model_coeff,
3352*c83a76b0SSuyog Pawar float i_to_avg_ratio,
3353*c83a76b0SSuyog Pawar WORD32 i4_true_scd,
3354*c83a76b0SSuyog Pawar float af_sum_weigh[MAX_PIC_TYPE][3],
3355*c83a76b0SSuyog Pawar frame_info_t *ps_frame_stat,
3356*c83a76b0SSuyog Pawar WORD32 i4_rc_2_pass,
3357*c83a76b0SSuyog Pawar WORD32 i4_is_not_an_I_pic,
3358*c83a76b0SSuyog Pawar WORD32 i4_ref_first_pass,
3359*c83a76b0SSuyog Pawar WORD32 i4_call_type,
3360*c83a76b0SSuyog Pawar WORD32 *pi4_cur_est_tot_bits,
3361*c83a76b0SSuyog Pawar WORD32 *pi4_tot_bits_estimated,
3362*c83a76b0SSuyog Pawar WORD32 i4_use_offline_model_2pass,
3363*c83a76b0SSuyog Pawar LWORD64 *pi8_i_tex_bits,
3364*c83a76b0SSuyog Pawar float *pf_i_qs,
3365*c83a76b0SSuyog Pawar WORD32 i4_best_br_id,
3366*c83a76b0SSuyog Pawar WORD32 *pi4_estimate_to_calc_frm_error)
3367*c83a76b0SSuyog Pawar {
3368*c83a76b0SSuyog Pawar WORD32 i4_qs_q3, i4_buf_based_min_bits, i4_buf_based_max_bits, i4_cur_est_tot_bits,
3369*c83a76b0SSuyog Pawar i4_est_texture_bits, i4_get_error = 0;
3370*c83a76b0SSuyog Pawar float f_bits_ratio;
3371*c83a76b0SSuyog Pawar
3372*c83a76b0SSuyog Pawar assign_complexity_coeffs(ps_rate_control_api->ps_bit_allocation, af_sum_weigh);
3373*c83a76b0SSuyog Pawar
3374*c83a76b0SSuyog Pawar i4_cur_est_tot_bits = get_scene_change_tot_frm_bits(
3375*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
3376*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
3377*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
3378*c83a76b0SSuyog Pawar i4_num_pels_in_frame,
3379*c83a76b0SSuyog Pawar i4_f_sim_lap_avg,
3380*c83a76b0SSuyog Pawar i_to_avg_ratio,
3381*c83a76b0SSuyog Pawar i4_call_type,
3382*c83a76b0SSuyog Pawar i4_is_not_an_I_pic,
3383*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_infinite_gop);
3384*c83a76b0SSuyog Pawar if(i4_call_type == 1)
3385*c83a76b0SSuyog Pawar {
3386*c83a76b0SSuyog Pawar *pi4_estimate_to_calc_frm_error = i4_cur_est_tot_bits;
3387*c83a76b0SSuyog Pawar }
3388*c83a76b0SSuyog Pawar
3389*c83a76b0SSuyog Pawar /* vbv buffer position based error correction to keep away encoder buffer overflow at layer 0 pictures*/
3390*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC || e_pic_type == P_PIC || e_pic_type == P1_PIC)
3391*c83a76b0SSuyog Pawar {
3392*c83a76b0SSuyog Pawar WORD32 i4_cur_ebf = get_cbr_ebf(ps_rate_control_api->ps_cbr_buffer);
3393*c83a76b0SSuyog Pawar WORD32 i4_vbv_size = get_cbr_buffer_size(ps_rate_control_api->ps_cbr_buffer);
3394*c83a76b0SSuyog Pawar WORD32 i4_max_ebf = (WORD32)(i4_vbv_size * MAX_THRESHOLD_VBV_FRM_ERROR);
3395*c83a76b0SSuyog Pawar WORD32 i4_drain_rate = get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer);
3396*c83a76b0SSuyog Pawar WORD32 i4_total_bits_allocted = i4_cur_est_tot_bits;
3397*c83a76b0SSuyog Pawar WORD32 i4_total_bits_to_be_alloc;
3398*c83a76b0SSuyog Pawar WORD32 i4_expected_ebf = (i4_cur_ebf + i4_total_bits_allocted - i4_drain_rate);
3399*c83a76b0SSuyog Pawar /*if expected ebf is greater than max threashold, correct the allocation such that it never cross max
3400*c83a76b0SSuyog Pawar but if it less than drain rate, atleast give drainrate bits*/
3401*c83a76b0SSuyog Pawar if(i4_expected_ebf > i4_max_ebf)
3402*c83a76b0SSuyog Pawar {
3403*c83a76b0SSuyog Pawar i4_total_bits_to_be_alloc =
3404*c83a76b0SSuyog Pawar MAX(i4_drain_rate, (i4_total_bits_allocted - (i4_expected_ebf - i4_max_ebf)));
3405*c83a76b0SSuyog Pawar i4_cur_est_tot_bits = i4_total_bits_to_be_alloc;
3406*c83a76b0SSuyog Pawar }
3407*c83a76b0SSuyog Pawar }
3408*c83a76b0SSuyog Pawar if(i4_call_type == 1)
3409*c83a76b0SSuyog Pawar {
3410*c83a76b0SSuyog Pawar i4_get_error = rc_get_estimate_bit_error(ps_rate_control_api);
3411*c83a76b0SSuyog Pawar }
3412*c83a76b0SSuyog Pawar if(i4_est_I_pic_head_bits != -1)
3413*c83a76b0SSuyog Pawar /*get constraints from buffer*/
3414*c83a76b0SSuyog Pawar {
3415*c83a76b0SSuyog Pawar get_min_max_bits_based_on_buffer(
3416*c83a76b0SSuyog Pawar ps_rate_control_api,
3417*c83a76b0SSuyog Pawar e_pic_type,
3418*c83a76b0SSuyog Pawar &i4_buf_based_min_bits,
3419*c83a76b0SSuyog Pawar &i4_buf_based_max_bits,
3420*c83a76b0SSuyog Pawar i4_get_error);
3421*c83a76b0SSuyog Pawar if(i4_cur_est_tot_bits > i4_buf_based_max_bits)
3422*c83a76b0SSuyog Pawar i4_cur_est_tot_bits = i4_buf_based_max_bits;
3423*c83a76b0SSuyog Pawar if((i4_cur_est_tot_bits < i4_buf_based_min_bits) && (i_to_avg_ratio > 8.0))
3424*c83a76b0SSuyog Pawar i4_cur_est_tot_bits = i4_buf_based_min_bits;
3425*c83a76b0SSuyog Pawar }
3426*c83a76b0SSuyog Pawar if(i4_est_I_pic_head_bits <
3427*c83a76b0SSuyog Pawar 0) //indicates header bits data is not available. Assume default ratio
3428*c83a76b0SSuyog Pawar {
3429*c83a76b0SSuyog Pawar i4_est_texture_bits = (i4_cur_est_tot_bits * DEFAULT_TEX_PERCENTAGE_Q5) >> 5;
3430*c83a76b0SSuyog Pawar i4_est_I_pic_head_bits = i4_cur_est_tot_bits - i4_est_texture_bits;
3431*c83a76b0SSuyog Pawar }
3432*c83a76b0SSuyog Pawar if((i4_cur_est_tot_bits - i4_est_I_pic_head_bits) < 0)
3433*c83a76b0SSuyog Pawar i4_cur_est_tot_bits = i4_est_I_pic_head_bits;
3434*c83a76b0SSuyog Pawar
3435*c83a76b0SSuyog Pawar *pi4_tot_bits_estimated = i4_cur_est_tot_bits;
3436*c83a76b0SSuyog Pawar
3437*c83a76b0SSuyog Pawar if(i4_true_scd)
3438*c83a76b0SSuyog Pawar {
3439*c83a76b0SSuyog Pawar /*texture bits should be atleast 25% of header bits*/
3440*c83a76b0SSuyog Pawar if(i4_cur_est_tot_bits < (1.25 * i4_est_I_pic_head_bits))
3441*c83a76b0SSuyog Pawar i4_cur_est_tot_bits = (WORD32)(1.25 * i4_est_I_pic_head_bits);
3442*c83a76b0SSuyog Pawar
3443*c83a76b0SSuyog Pawar ps_rate_control_api->i4_scd_I_frame_estimated_tot_bits = i4_cur_est_tot_bits;
3444*c83a76b0SSuyog Pawar }
3445*c83a76b0SSuyog Pawar
3446*c83a76b0SSuyog Pawar /* Get qp for scene cut frame based on offline generated data*/
3447*c83a76b0SSuyog Pawar
3448*c83a76b0SSuyog Pawar i4_qs_q3 = rc_get_qp_scene_change_bits(
3449*c83a76b0SSuyog Pawar ps_rate_control_api,
3450*c83a76b0SSuyog Pawar (i4_cur_est_tot_bits - i4_est_I_pic_head_bits),
3451*c83a76b0SSuyog Pawar i8_satd_act_accum,
3452*c83a76b0SSuyog Pawar i4_num_pels_in_frame,
3453*c83a76b0SSuyog Pawar offline_model_coeff,
3454*c83a76b0SSuyog Pawar i_to_avg_ratio,
3455*c83a76b0SSuyog Pawar i4_call_type);
3456*c83a76b0SSuyog Pawar
3457*c83a76b0SSuyog Pawar if(i4_call_type)
3458*c83a76b0SSuyog Pawar trace_printf(
3459*c83a76b0SSuyog Pawar "i4_qp %d, i8_satd_act_accum %I64d,i_to_avg_ratio %f, "
3460*c83a76b0SSuyog Pawar "i4_est_I_pic_head_bits %d i4_cur_est_tot_bits %d\n",
3461*c83a76b0SSuyog Pawar i4_qp,
3462*c83a76b0SSuyog Pawar i8_satd_act_accum,
3463*c83a76b0SSuyog Pawar i_to_avg_ratio,
3464*c83a76b0SSuyog Pawar i4_est_I_pic_head_bits,
3465*c83a76b0SSuyog Pawar i4_cur_est_tot_bits);
3466*c83a76b0SSuyog Pawar
3467*c83a76b0SSuyog Pawar *pi4_cur_est_tot_bits = i4_cur_est_tot_bits;
3468*c83a76b0SSuyog Pawar
3469*c83a76b0SSuyog Pawar return (i4_qs_q3);
3470*c83a76b0SSuyog Pawar }
3471*c83a76b0SSuyog Pawar
3472*c83a76b0SSuyog Pawar /****************************************************************************
3473*c83a76b0SSuyog Pawar Function Name : rc_set_num_scd_in_lap_window
3474*c83a76b0SSuyog Pawar Description :
3475*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3476*c83a76b0SSuyog Pawar
3477*c83a76b0SSuyog Pawar Revision History:
3478*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3479*c83a76b0SSuyog Pawar *****************************************************************************/
rc_set_num_scd_in_lap_window(rate_control_api_t * ps_rate_control_api,WORD32 i4_num_scd_in_lap_window,WORD32 i4_num_frames_b4_scd)3480*c83a76b0SSuyog Pawar void rc_set_num_scd_in_lap_window(
3481*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
3482*c83a76b0SSuyog Pawar WORD32 i4_num_scd_in_lap_window,
3483*c83a76b0SSuyog Pawar WORD32 i4_num_frames_b4_scd)
3484*c83a76b0SSuyog Pawar {
3485*c83a76b0SSuyog Pawar bit_allocation_set_num_scd_lap_window(
3486*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation, i4_num_scd_in_lap_window, i4_num_frames_b4_scd);
3487*c83a76b0SSuyog Pawar }
3488*c83a76b0SSuyog Pawar /****************************************************************************
3489*c83a76b0SSuyog Pawar Function Name : rc_set_next_sc_i_in_rc_look_ahead
3490*c83a76b0SSuyog Pawar Description :
3491*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3492*c83a76b0SSuyog Pawar
3493*c83a76b0SSuyog Pawar Revision History:
3494*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3495*c83a76b0SSuyog Pawar *****************************************************************************/
rc_set_next_sc_i_in_rc_look_ahead(rate_control_api_t * ps_rate_control_api,WORD32 i4_next_sc_i_in_rc_look_ahead)3496*c83a76b0SSuyog Pawar void rc_set_next_sc_i_in_rc_look_ahead(
3497*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, WORD32 i4_next_sc_i_in_rc_look_ahead)
3498*c83a76b0SSuyog Pawar {
3499*c83a76b0SSuyog Pawar bit_allocation_set_sc_i_in_rc_look_ahead(
3500*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation, i4_next_sc_i_in_rc_look_ahead);
3501*c83a76b0SSuyog Pawar }
3502*c83a76b0SSuyog Pawar
3503*c83a76b0SSuyog Pawar /****************************************************************************
3504*c83a76b0SSuyog Pawar * Function Name : rc_update_mismatch_error
3505*c83a76b0SSuyog Pawar * Description : API call to update remaining bits in period based on error
3506*c83a76b0SSuyog Pawar * between rdopt bits estimate and actual bits produced in entorpy
3507*c83a76b0SSuyog Pawar * *****************************************************************************/
rc_update_mismatch_error(rate_control_api_t * ps_rate_control_api,WORD32 i4_error_bits)3508*c83a76b0SSuyog Pawar void rc_update_mismatch_error(rate_control_api_t *ps_rate_control_api, WORD32 i4_error_bits)
3509*c83a76b0SSuyog Pawar {
3510*c83a76b0SSuyog Pawar bit_allocation_update_gop_level_bit_error(
3511*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation, i4_error_bits);
3512*c83a76b0SSuyog Pawar /*Also alter the encoder buffer fullness based on the error*/
3513*c83a76b0SSuyog Pawar /*error = rdopt - entropy hence subtract form current buffer fullness*/
3514*c83a76b0SSuyog Pawar update_cbr_buf_mismatch_bit(ps_rate_control_api->ps_cbr_buffer, i4_error_bits);
3515*c83a76b0SSuyog Pawar }
3516*c83a76b0SSuyog Pawar /****************************************************************************
3517*c83a76b0SSuyog Pawar Function Name : rc_set_estimate_status
3518*c83a76b0SSuyog Pawar Description :
3519*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3520*c83a76b0SSuyog Pawar
3521*c83a76b0SSuyog Pawar Revision History:
3522*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3523*c83a76b0SSuyog Pawar *****************************************************************************/
rc_set_estimate_status(rate_control_api_t * ps_rate_control_api,WORD32 i4_tex_bits,WORD32 i4_hdr_bits,WORD32 i4_est_text_bits_ctr_get_qp)3524*c83a76b0SSuyog Pawar WORD32 rc_set_estimate_status(
3525*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
3526*c83a76b0SSuyog Pawar WORD32 i4_tex_bits,
3527*c83a76b0SSuyog Pawar WORD32 i4_hdr_bits,
3528*c83a76b0SSuyog Pawar WORD32 i4_est_text_bits_ctr_get_qp)
3529*c83a76b0SSuyog Pawar {
3530*c83a76b0SSuyog Pawar update_estimate_status(
3531*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
3532*c83a76b0SSuyog Pawar i4_tex_bits,
3533*c83a76b0SSuyog Pawar i4_hdr_bits,
3534*c83a76b0SSuyog Pawar i4_est_text_bits_ctr_get_qp);
3535*c83a76b0SSuyog Pawar
3536*c83a76b0SSuyog Pawar return i4_tex_bits;
3537*c83a76b0SSuyog Pawar }
3538*c83a76b0SSuyog Pawar /****************************************************************************
3539*c83a76b0SSuyog Pawar Function Name : rc_get_bpp_based_scene_cut_qp
3540*c83a76b0SSuyog Pawar Description : bpp based qp for a scene cut frame
3541*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3542*c83a76b0SSuyog Pawar
3543*c83a76b0SSuyog Pawar Revision History:
3544*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3545*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_bpp_based_scene_cut_qp(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type,WORD32 i4_num_pels_in_frame,WORD32 i4_f_sim_lap,float af_sum_weigh[MAX_PIC_TYPE][3],WORD32 i4_call_type)3546*c83a76b0SSuyog Pawar WORD32 rc_get_bpp_based_scene_cut_qp(
3547*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
3548*c83a76b0SSuyog Pawar picture_type_e e_pic_type,
3549*c83a76b0SSuyog Pawar WORD32 i4_num_pels_in_frame,
3550*c83a76b0SSuyog Pawar WORD32 i4_f_sim_lap,
3551*c83a76b0SSuyog Pawar float af_sum_weigh[MAX_PIC_TYPE][3],
3552*c83a76b0SSuyog Pawar WORD32 i4_call_type)
3553*c83a76b0SSuyog Pawar {
3554*c83a76b0SSuyog Pawar WORD32 i4_cur_est_texture_bits, i4_cur_est_header_bits, i4_qp, i4_tot_bits,
3555*c83a76b0SSuyog Pawar i4_buf_based_min_bits, i4_buf_based_max_bits;
3556*c83a76b0SSuyog Pawar
3557*c83a76b0SSuyog Pawar /* Reset the number of header bits in a scene change */
3558*c83a76b0SSuyog Pawar //init_prev_header_bits(ps_rate_control_api->ps_bit_allocation, ps_rate_control_api->ps_pic_handling);
3559*c83a76b0SSuyog Pawar
3560*c83a76b0SSuyog Pawar /* Get the estimated header bits for the current encoded frame */
3561*c83a76b0SSuyog Pawar
3562*c83a76b0SSuyog Pawar assign_complexity_coeffs(ps_rate_control_api->ps_bit_allocation, af_sum_weigh);
3563*c83a76b0SSuyog Pawar i4_cur_est_header_bits =
3564*c83a76b0SSuyog Pawar get_cur_frm_est_header_bits(ps_rate_control_api->ps_bit_allocation, e_pic_type);
3565*c83a76b0SSuyog Pawar
3566*c83a76b0SSuyog Pawar /*get estimate of total bits that can be allocated to I frame based on offline generated data*/
3567*c83a76b0SSuyog Pawar i4_tot_bits = get_scene_change_tot_frm_bits(
3568*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
3569*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
3570*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
3571*c83a76b0SSuyog Pawar i4_num_pels_in_frame,
3572*c83a76b0SSuyog Pawar i4_f_sim_lap,
3573*c83a76b0SSuyog Pawar (float)8.00,
3574*c83a76b0SSuyog Pawar 0,
3575*c83a76b0SSuyog Pawar 0,
3576*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_infinite_gop);
3577*c83a76b0SSuyog Pawar
3578*c83a76b0SSuyog Pawar /* Getting the min and max texture bits based on buffer fullness and constraining the
3579*c83a76b0SSuyog Pawar bit allocation based on this */
3580*c83a76b0SSuyog Pawar if(i4_call_type == 1)
3581*c83a76b0SSuyog Pawar {
3582*c83a76b0SSuyog Pawar get_min_max_bits_based_on_buffer(
3583*c83a76b0SSuyog Pawar ps_rate_control_api, e_pic_type, &i4_buf_based_min_bits, &i4_buf_based_max_bits, 0);
3584*c83a76b0SSuyog Pawar if(i4_tot_bits > i4_buf_based_max_bits)
3585*c83a76b0SSuyog Pawar i4_tot_bits = i4_buf_based_max_bits;
3586*c83a76b0SSuyog Pawar if(i4_tot_bits < i4_buf_based_min_bits)
3587*c83a76b0SSuyog Pawar i4_tot_bits = i4_buf_based_min_bits;
3588*c83a76b0SSuyog Pawar }
3589*c83a76b0SSuyog Pawar /*Assume 30 percent header bits*/
3590*c83a76b0SSuyog Pawar i4_cur_est_texture_bits = (i4_tot_bits * DEFAULT_TEX_PERCENTAGE_Q5) >> 5;
3591*c83a76b0SSuyog Pawar
3592*c83a76b0SSuyog Pawar /* Get the texture bits assigned to the current frame */
3593*c83a76b0SSuyog Pawar i4_cur_est_header_bits = i4_tot_bits - i4_cur_est_texture_bits;
3594*c83a76b0SSuyog Pawar
3595*c83a76b0SSuyog Pawar if(i4_cur_est_texture_bits < 0)
3596*c83a76b0SSuyog Pawar i4_cur_est_texture_bits = 0;
3597*c83a76b0SSuyog Pawar
3598*c83a76b0SSuyog Pawar /* Get the qp for the remaining bits allocated for that frame based on buffer status */
3599*c83a76b0SSuyog Pawar i4_qp = get_init_qp_using_pels_bits_per_frame(
3600*c83a76b0SSuyog Pawar ps_rate_control_api->ps_init_qp, I_PIC, i4_cur_est_texture_bits, i4_num_pels_in_frame);
3601*c83a76b0SSuyog Pawar /* Make sure the qp is with in range */
3602*c83a76b0SSuyog Pawar if(i4_qp < ps_rate_control_api->ai4_min_qp[e_pic_type])
3603*c83a76b0SSuyog Pawar {
3604*c83a76b0SSuyog Pawar i4_qp = ps_rate_control_api->ai4_min_qp[e_pic_type];
3605*c83a76b0SSuyog Pawar }
3606*c83a76b0SSuyog Pawar else if(i4_qp > ps_rate_control_api->ai4_max_qp[e_pic_type])
3607*c83a76b0SSuyog Pawar {
3608*c83a76b0SSuyog Pawar i4_qp = ps_rate_control_api->ai4_max_qp[e_pic_type];
3609*c83a76b0SSuyog Pawar }
3610*c83a76b0SSuyog Pawar
3611*c83a76b0SSuyog Pawar return (i4_qp);
3612*c83a76b0SSuyog Pawar }
3613*c83a76b0SSuyog Pawar /****************************************************************************
3614*c83a76b0SSuyog Pawar Function Name : rc_reset_pic_model
3615*c83a76b0SSuyog Pawar Description :
3616*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3617*c83a76b0SSuyog Pawar
3618*c83a76b0SSuyog Pawar Revision History:
3619*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3620*c83a76b0SSuyog Pawar *****************************************************************************/
rc_reset_pic_model(rate_control_api_t * ps_rate_control_api,picture_type_e pic_type)3621*c83a76b0SSuyog Pawar void rc_reset_pic_model(rate_control_api_t *ps_rate_control_api, picture_type_e pic_type)
3622*c83a76b0SSuyog Pawar {
3623*c83a76b0SSuyog Pawar reset_frm_rc_rd_model(ps_rate_control_api->aps_rd_model[pic_type]);
3624*c83a76b0SSuyog Pawar }
3625*c83a76b0SSuyog Pawar /****************************************************************************
3626*c83a76b0SSuyog Pawar Function Name : rc_reset_first_frame_coded_flag
3627*c83a76b0SSuyog Pawar Description :
3628*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3629*c83a76b0SSuyog Pawar
3630*c83a76b0SSuyog Pawar Revision History:
3631*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3632*c83a76b0SSuyog Pawar *****************************************************************************/
rc_reset_first_frame_coded_flag(rate_control_api_t * ps_rate_control_api,picture_type_e pic_type)3633*c83a76b0SSuyog Pawar void rc_reset_first_frame_coded_flag(
3634*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, picture_type_e pic_type)
3635*c83a76b0SSuyog Pawar {
3636*c83a76b0SSuyog Pawar ps_rate_control_api->au1_is_first_frm_coded[pic_type] = 0;
3637*c83a76b0SSuyog Pawar }
3638*c83a76b0SSuyog Pawar /****************************************************************************
3639*c83a76b0SSuyog Pawar Function Name : rc_get_scene_change_est_header_bits
3640*c83a76b0SSuyog Pawar Description :
3641*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3642*c83a76b0SSuyog Pawar
3643*c83a76b0SSuyog Pawar Revision History:
3644*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3645*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_scene_change_est_header_bits(rate_control_api_t * ps_rate_control_api,WORD32 i4_num_pixels,WORD32 i4_fsim_lap,float af_sum_weigh[MAX_PIC_TYPE][3],float i_to_avg_ratio)3646*c83a76b0SSuyog Pawar WORD32 rc_get_scene_change_est_header_bits(
3647*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
3648*c83a76b0SSuyog Pawar WORD32 i4_num_pixels,
3649*c83a76b0SSuyog Pawar WORD32 i4_fsim_lap,
3650*c83a76b0SSuyog Pawar float af_sum_weigh[MAX_PIC_TYPE][3],
3651*c83a76b0SSuyog Pawar float i_to_avg_ratio)
3652*c83a76b0SSuyog Pawar {
3653*c83a76b0SSuyog Pawar WORD32 i4_est_tot_bits;
3654*c83a76b0SSuyog Pawar
3655*c83a76b0SSuyog Pawar assign_complexity_coeffs(ps_rate_control_api->ps_bit_allocation, af_sum_weigh);
3656*c83a76b0SSuyog Pawar
3657*c83a76b0SSuyog Pawar i4_est_tot_bits = get_scene_change_tot_frm_bits(
3658*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
3659*c83a76b0SSuyog Pawar ps_rate_control_api->ps_pic_handling,
3660*c83a76b0SSuyog Pawar ps_rate_control_api->ps_cbr_buffer,
3661*c83a76b0SSuyog Pawar i4_num_pixels,
3662*c83a76b0SSuyog Pawar i4_fsim_lap,
3663*c83a76b0SSuyog Pawar i_to_avg_ratio,
3664*c83a76b0SSuyog Pawar 0,
3665*c83a76b0SSuyog Pawar 0,
3666*c83a76b0SSuyog Pawar ps_rate_control_api->i4_is_infinite_gop);
3667*c83a76b0SSuyog Pawar /*return header bits based on default percentage*/
3668*c83a76b0SSuyog Pawar return (i4_est_tot_bits - ((i4_est_tot_bits * DEFAULT_TEX_PERCENTAGE_Q5) >> 5));
3669*c83a76b0SSuyog Pawar }
3670*c83a76b0SSuyog Pawar /****************************************************************************
3671*c83a76b0SSuyog Pawar Function Name : rc_put_temp_comp_lap
3672*c83a76b0SSuyog Pawar Description :
3673*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3674*c83a76b0SSuyog Pawar
3675*c83a76b0SSuyog Pawar Revision History:
3676*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3677*c83a76b0SSuyog Pawar *****************************************************************************/
rc_put_temp_comp_lap(rate_control_api_t * ps_rate_control_api,WORD32 i4_lap_fsim,LWORD64 i8_per_pixel_frm_hme_sad_q10,picture_type_e e_pic_type)3678*c83a76b0SSuyog Pawar void rc_put_temp_comp_lap(
3679*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
3680*c83a76b0SSuyog Pawar WORD32 i4_lap_fsim,
3681*c83a76b0SSuyog Pawar LWORD64 i8_per_pixel_frm_hme_sad_q10,
3682*c83a76b0SSuyog Pawar picture_type_e e_pic_type)
3683*c83a76b0SSuyog Pawar {
3684*c83a76b0SSuyog Pawar ps_rate_control_api->i4_lap_f_sim = i4_lap_fsim;
3685*c83a76b0SSuyog Pawar if(e_pic_type == P_PIC)
3686*c83a76b0SSuyog Pawar {
3687*c83a76b0SSuyog Pawar ps_rate_control_api->i8_per_pixel_p_frm_hme_sad_q10 = i8_per_pixel_frm_hme_sad_q10;
3688*c83a76b0SSuyog Pawar }
3689*c83a76b0SSuyog Pawar }
3690*c83a76b0SSuyog Pawar /****************************************************************************
3691*c83a76b0SSuyog Pawar Function Name : rc_get_pic_distribution
3692*c83a76b0SSuyog Pawar Description :
3693*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3694*c83a76b0SSuyog Pawar
3695*c83a76b0SSuyog Pawar Revision History:
3696*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3697*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_pic_distribution(rate_control_api_t * ps_rate_control_api,WORD32 * ai4_pic_type)3698*c83a76b0SSuyog Pawar void rc_get_pic_distribution(rate_control_api_t *ps_rate_control_api, WORD32 *ai4_pic_type)
3699*c83a76b0SSuyog Pawar {
3700*c83a76b0SSuyog Pawar pic_type_get_frms_in_gop(ps_rate_control_api->ps_pic_handling, ai4_pic_type);
3701*c83a76b0SSuyog Pawar }
3702*c83a76b0SSuyog Pawar /****************************************************************************
3703*c83a76b0SSuyog Pawar Function Name : rc_get_actual_pic_distribution
3704*c83a76b0SSuyog Pawar Description :
3705*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3706*c83a76b0SSuyog Pawar
3707*c83a76b0SSuyog Pawar Revision History:
3708*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3709*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_actual_pic_distribution(rate_control_api_t * ps_rate_control_api,WORD32 * ai4_pic_type)3710*c83a76b0SSuyog Pawar void rc_get_actual_pic_distribution(rate_control_api_t *ps_rate_control_api, WORD32 *ai4_pic_type)
3711*c83a76b0SSuyog Pawar {
3712*c83a76b0SSuyog Pawar pic_type_get_actual_frms_in_gop(ps_rate_control_api->ps_pic_handling, ai4_pic_type);
3713*c83a76b0SSuyog Pawar }
3714*c83a76b0SSuyog Pawar /****************************************************************************
3715*c83a76b0SSuyog Pawar Function Name : rc_reset_Kp_Kb
3716*c83a76b0SSuyog Pawar Description :
3717*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3718*c83a76b0SSuyog Pawar
3719*c83a76b0SSuyog Pawar Revision History:
3720*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3721*c83a76b0SSuyog Pawar *****************************************************************************/
rc_reset_Kp_Kb(rate_control_api_t * ps_rate_control_api,float f_i_to_avg_rest,WORD32 i4_num_active_pic_type,float f_curr_hme_sad_per_pixel,WORD32 * pi4_complexity_bin,WORD32 i4_rc_pass)3722*c83a76b0SSuyog Pawar void rc_reset_Kp_Kb(
3723*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
3724*c83a76b0SSuyog Pawar float f_i_to_avg_rest,
3725*c83a76b0SSuyog Pawar WORD32 i4_num_active_pic_type,
3726*c83a76b0SSuyog Pawar float f_curr_hme_sad_per_pixel,
3727*c83a76b0SSuyog Pawar WORD32 *pi4_complexity_bin,
3728*c83a76b0SSuyog Pawar WORD32 i4_rc_pass)
3729*c83a76b0SSuyog Pawar {
3730*c83a76b0SSuyog Pawar reset_Kp_Kb(
3731*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation,
3732*c83a76b0SSuyog Pawar f_i_to_avg_rest,
3733*c83a76b0SSuyog Pawar i4_num_active_pic_type,
3734*c83a76b0SSuyog Pawar f_curr_hme_sad_per_pixel,
3735*c83a76b0SSuyog Pawar ps_rate_control_api->f_max_hme_sad_per_pixel,
3736*c83a76b0SSuyog Pawar pi4_complexity_bin,
3737*c83a76b0SSuyog Pawar i4_rc_pass);
3738*c83a76b0SSuyog Pawar }
3739*c83a76b0SSuyog Pawar
3740*c83a76b0SSuyog Pawar /****************************************************************************
3741*c83a76b0SSuyog Pawar Function Name : rc_reset_Kp_Kb
3742*c83a76b0SSuyog Pawar Description : Get Kp and Kb values for offset at scene cut
3743*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3744*c83a76b0SSuyog Pawar
3745*c83a76b0SSuyog Pawar Revision History:
3746*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3747*c83a76b0SSuyog Pawar *****************************************************************************/
3748*c83a76b0SSuyog Pawar
rc_get_kp_kb(rate_control_api_t * ps_rate_control_api,picture_type_e e_pic_type)3749*c83a76b0SSuyog Pawar WORD32 rc_get_kp_kb(rate_control_api_t *ps_rate_control_api, picture_type_e e_pic_type)
3750*c83a76b0SSuyog Pawar {
3751*c83a76b0SSuyog Pawar return get_Kp_Kb(ps_rate_control_api->ps_bit_allocation, e_pic_type);
3752*c83a76b0SSuyog Pawar }
3753*c83a76b0SSuyog Pawar /****************************************************************************
3754*c83a76b0SSuyog Pawar Function Name : rc_get_ebf
3755*c83a76b0SSuyog Pawar Description :
3756*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3757*c83a76b0SSuyog Pawar
3758*c83a76b0SSuyog Pawar Revision History:
3759*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3760*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_ebf(rate_control_api_t * ps_rate_control_api)3761*c83a76b0SSuyog Pawar WORD32 rc_get_ebf(rate_control_api_t *ps_rate_control_api)
3762*c83a76b0SSuyog Pawar {
3763*c83a76b0SSuyog Pawar return (get_cbr_ebf(ps_rate_control_api->ps_cbr_buffer));
3764*c83a76b0SSuyog Pawar }
3765*c83a76b0SSuyog Pawar
3766*c83a76b0SSuyog Pawar /****************************************************************************
3767*c83a76b0SSuyog Pawar Function Name : rc_get_offline_normalized_complexity
3768*c83a76b0SSuyog Pawar Description : The complexities of L1 are normalized with the highest offline
3769*c83a76b0SSuyog Pawar global complexity
3770*c83a76b0SSuyog Pawar Inputs :
3771*c83a76b0SSuyog Pawar Globals :
3772*c83a76b0SSuyog Pawar Processing :
3773*c83a76b0SSuyog Pawar Outputs :
3774*c83a76b0SSuyog Pawar Returns :
3775*c83a76b0SSuyog Pawar Issues :
3776*c83a76b0SSuyog Pawar Revision History:
3777*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3778*c83a76b0SSuyog Pawar
3779*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_offline_normalized_complexity(WORD32 i4_intra_period,WORD32 i4_luma_pels,float f_per_pixel_complexity,WORD32 i4_pass_number)3780*c83a76b0SSuyog Pawar float rc_get_offline_normalized_complexity(
3781*c83a76b0SSuyog Pawar WORD32 i4_intra_period, WORD32 i4_luma_pels, float f_per_pixel_complexity, WORD32 i4_pass_number)
3782*c83a76b0SSuyog Pawar {
3783*c83a76b0SSuyog Pawar {
3784*c83a76b0SSuyog Pawar if((i4_luma_pels) > 1500000)
3785*c83a76b0SSuyog Pawar {
3786*c83a76b0SSuyog Pawar if(i4_intra_period == 1)
3787*c83a76b0SSuyog Pawar {
3788*c83a76b0SSuyog Pawar f_per_pixel_complexity /= (float)3.69;
3789*c83a76b0SSuyog Pawar }
3790*c83a76b0SSuyog Pawar else
3791*c83a76b0SSuyog Pawar {
3792*c83a76b0SSuyog Pawar /*Full HD and above: Based on running few content, exact data needs to be plugged in*/
3793*c83a76b0SSuyog Pawar f_per_pixel_complexity /= (float)2.25;
3794*c83a76b0SSuyog Pawar }
3795*c83a76b0SSuyog Pawar }
3796*c83a76b0SSuyog Pawar else if((i4_luma_pels) > 700000)
3797*c83a76b0SSuyog Pawar {
3798*c83a76b0SSuyog Pawar if(i4_intra_period == 1)
3799*c83a76b0SSuyog Pawar {
3800*c83a76b0SSuyog Pawar f_per_pixel_complexity /= (float)4.28;
3801*c83a76b0SSuyog Pawar }
3802*c83a76b0SSuyog Pawar else
3803*c83a76b0SSuyog Pawar {
3804*c83a76b0SSuyog Pawar f_per_pixel_complexity /=
3805*c83a76b0SSuyog Pawar (float)2.6109; //the max complexity observed for 720p content of netflix_fountain
3806*c83a76b0SSuyog Pawar }
3807*c83a76b0SSuyog Pawar }
3808*c83a76b0SSuyog Pawar else
3809*c83a76b0SSuyog Pawar {
3810*c83a76b0SSuyog Pawar if(i4_intra_period == 1)
3811*c83a76b0SSuyog Pawar f_per_pixel_complexity /= (float)4.91;
3812*c83a76b0SSuyog Pawar else
3813*c83a76b0SSuyog Pawar f_per_pixel_complexity /=
3814*c83a76b0SSuyog Pawar (float)3; //the max complexity observed for 720p content of netflix_fountain
3815*c83a76b0SSuyog Pawar }
3816*c83a76b0SSuyog Pawar }
3817*c83a76b0SSuyog Pawar if(f_per_pixel_complexity > 1.0)
3818*c83a76b0SSuyog Pawar f_per_pixel_complexity = 1;
3819*c83a76b0SSuyog Pawar return f_per_pixel_complexity;
3820*c83a76b0SSuyog Pawar }
3821*c83a76b0SSuyog Pawar
3822*c83a76b0SSuyog Pawar /****************************************************************************
3823*c83a76b0SSuyog Pawar Function Name : rc_bit_alloc_detect_ebf_stuff_scenario
3824*c83a76b0SSuyog Pawar Description : To estimate whether there will be a case of underflow based on
3825*c83a76b0SSuyog Pawar estimated bit consumption and drain rate if there is probability
3826*c83a76b0SSuyog Pawar of underflow then we will lower the HEVC qp's by 1 based
3827*c83a76b0SSuyog Pawar on the warning flag.
3828*c83a76b0SSuyog Pawar Inputs :
3829*c83a76b0SSuyog Pawar Globals :
3830*c83a76b0SSuyog Pawar Processing :
3831*c83a76b0SSuyog Pawar Outputs :
3832*c83a76b0SSuyog Pawar Returns :
3833*c83a76b0SSuyog Pawar Issues :
3834*c83a76b0SSuyog Pawar Revision History:
3835*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3836*c83a76b0SSuyog Pawar
3837*c83a76b0SSuyog Pawar *****************************************************************************/
3838*c83a76b0SSuyog Pawar
rc_bit_alloc_detect_ebf_stuff_scenario(rate_control_api_t * ps_rate_control_api,WORD32 i4_num_frm_bef_scd_lap2,LWORD64 i8_total_bits_est_consu_lap2,WORD32 i4_max_inter_frm_int)3839*c83a76b0SSuyog Pawar void rc_bit_alloc_detect_ebf_stuff_scenario(
3840*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
3841*c83a76b0SSuyog Pawar WORD32 i4_num_frm_bef_scd_lap2,
3842*c83a76b0SSuyog Pawar LWORD64 i8_total_bits_est_consu_lap2,
3843*c83a76b0SSuyog Pawar WORD32 i4_max_inter_frm_int)
3844*c83a76b0SSuyog Pawar {
3845*c83a76b0SSuyog Pawar WORD32 i4_peak_drain_rate;
3846*c83a76b0SSuyog Pawar LWORD64 i8_ebf, i8_estimate_ebf_at_end;
3847*c83a76b0SSuyog Pawar i4_peak_drain_rate = get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer);
3848*c83a76b0SSuyog Pawar i8_ebf = rc_get_ebf(ps_rate_control_api);
3849*c83a76b0SSuyog Pawar i8_estimate_ebf_at_end =
3850*c83a76b0SSuyog Pawar i8_ebf - (i4_num_frm_bef_scd_lap2 * i4_peak_drain_rate) + i8_total_bits_est_consu_lap2;
3851*c83a76b0SSuyog Pawar
3852*c83a76b0SSuyog Pawar ps_rate_control_api->i4_underflow_warning = 0;
3853*c83a76b0SSuyog Pawar
3854*c83a76b0SSuyog Pawar if(i8_estimate_ebf_at_end < (i4_max_inter_frm_int * i4_peak_drain_rate))
3855*c83a76b0SSuyog Pawar {
3856*c83a76b0SSuyog Pawar /*If underflow is imminent give a flag*/
3857*c83a76b0SSuyog Pawar ps_rate_control_api->i4_underflow_warning = 1;
3858*c83a76b0SSuyog Pawar }
3859*c83a76b0SSuyog Pawar }
3860*c83a76b0SSuyog Pawar
3861*c83a76b0SSuyog Pawar /****************************************************************************
3862*c83a76b0SSuyog Pawar Function Name : bit_alloc_get_estimated_bits_for_pic
3863*c83a76b0SSuyog Pawar Description :
3864*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3865*c83a76b0SSuyog Pawar
3866*c83a76b0SSuyog Pawar Revision History:
3867*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3868*c83a76b0SSuyog Pawar *****************************************************************************/
3869*c83a76b0SSuyog Pawar
bit_alloc_get_estimated_bits_for_pic(rate_control_api_t * ps_rate_contro_api,WORD32 i4_cur_frm_est_cl_sad,WORD32 i4_prev_frm_cl_sad,picture_type_e e_pic_type)3870*c83a76b0SSuyog Pawar WORD32 bit_alloc_get_estimated_bits_for_pic(
3871*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_contro_api,
3872*c83a76b0SSuyog Pawar WORD32 i4_cur_frm_est_cl_sad,
3873*c83a76b0SSuyog Pawar WORD32 i4_prev_frm_cl_sad,
3874*c83a76b0SSuyog Pawar picture_type_e e_pic_type)
3875*c83a76b0SSuyog Pawar {
3876*c83a76b0SSuyog Pawar WORD32 i4_prev_frame_bits, i4_curnt_frame_est_bits, i4_prev_frame_header_bits;
3877*c83a76b0SSuyog Pawar get_prev_frame_total_header_bits(
3878*c83a76b0SSuyog Pawar ps_rate_contro_api->ps_bit_allocation,
3879*c83a76b0SSuyog Pawar &i4_prev_frame_bits,
3880*c83a76b0SSuyog Pawar &i4_prev_frame_header_bits,
3881*c83a76b0SSuyog Pawar e_pic_type);
3882*c83a76b0SSuyog Pawar
3883*c83a76b0SSuyog Pawar i4_curnt_frame_est_bits = (WORD32)(
3884*c83a76b0SSuyog Pawar ((float)(i4_prev_frame_bits - i4_prev_frame_header_bits) * (float)i4_cur_frm_est_cl_sad /
3885*c83a76b0SSuyog Pawar (float)i4_prev_frm_cl_sad) +
3886*c83a76b0SSuyog Pawar i4_prev_frame_header_bits);
3887*c83a76b0SSuyog Pawar return (i4_curnt_frame_est_bits);
3888*c83a76b0SSuyog Pawar }
3889*c83a76b0SSuyog Pawar
3890*c83a76b0SSuyog Pawar /****************************************************************************
3891*c83a76b0SSuyog Pawar Function Name : rc_get_max_hme_sad_per_pixel
3892*c83a76b0SSuyog Pawar Description : At init time based on parameters we pick the max hme sad per pixel.
3893*c83a76b0SSuyog Pawar Inputs :
3894*c83a76b0SSuyog Pawar Globals :
3895*c83a76b0SSuyog Pawar Processing :
3896*c83a76b0SSuyog Pawar Outputs :
3897*c83a76b0SSuyog Pawar Returns :
3898*c83a76b0SSuyog Pawar Issues :
3899*c83a76b0SSuyog Pawar Revision History:
3900*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3901*c83a76b0SSuyog Pawar
3902*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_max_hme_sad_per_pixel(rate_control_api_t * ps_rate_control_api,WORD32 i4_total_pixels)3903*c83a76b0SSuyog Pawar void rc_get_max_hme_sad_per_pixel(rate_control_api_t *ps_rate_control_api, WORD32 i4_total_pixels)
3904*c83a76b0SSuyog Pawar {
3905*c83a76b0SSuyog Pawar WORD32 i, i4_error = 0x7FFFFFFF, i4_temp_error, i4_res_index = 0, i4_br_index = 0;
3906*c83a76b0SSuyog Pawar WORD32 i4_num_temporal_layers;
3907*c83a76b0SSuyog Pawar /*Max hme sad per pixel based on resolutions, num. of temporal layers (0-3) and also bpp-> whether low bitrate or high bitrate*/
3908*c83a76b0SSuyog Pawar float af_offline_hme_sad_per_pixel_480p[4][2] = {
3909*c83a76b0SSuyog Pawar { 2.94f, 2.63f }, { 2.96f, 2.44f }, { 2.72f, 1.94f }, { 2.70f, 2.04f }
3910*c83a76b0SSuyog Pawar };
3911*c83a76b0SSuyog Pawar float af_offline_hme_sad_per_pixel_720p[4][2] = {
3912*c83a76b0SSuyog Pawar { 3.37f, 2.97f }, { 3.35f, 2.77f }, { 3.18f, 2.40f }, { 2.94f, 1.83f }
3913*c83a76b0SSuyog Pawar };
3914*c83a76b0SSuyog Pawar float af_offline_hme_sad_per_pixel_1080p[4][2] = {
3915*c83a76b0SSuyog Pawar { 3.24f, 2.78f }, { 3.17f, 2.46f }, { 2.91f, 1.98f }, { 2.75f, 1.65f }
3916*c83a76b0SSuyog Pawar };
3917*c83a76b0SSuyog Pawar float af_offline_hme_sad_per_pixel_2160p[4][2] = {
3918*c83a76b0SSuyog Pawar { 2.56f, 2.11f }, { 2.47f, 1.92f }, { 2.19f, 1.46f }, { 2.00f, 1.21f }
3919*c83a76b0SSuyog Pawar };
3920*c83a76b0SSuyog Pawar
3921*c83a76b0SSuyog Pawar /*Low BR or HBR is decided by comparing the bpp values as below*/
3922*c83a76b0SSuyog Pawar float af_offline_bpp[4][2] = {
3923*c83a76b0SSuyog Pawar { 0.30f, 0.09f }, { 0.25f, 0.06f }, { 0.16f, 0.04f }, { 0.12f, 0.02f }
3924*c83a76b0SSuyog Pawar };
3925*c83a76b0SSuyog Pawar
3926*c83a76b0SSuyog Pawar /*Number of pixels in the picture for picking the closest resolution*/
3927*c83a76b0SSuyog Pawar WORD32 ai4_pixels_res[4] = { 307200, 921600, 2073600, 8294400 };
3928*c83a76b0SSuyog Pawar
3929*c83a76b0SSuyog Pawar float f_bpp =
3930*c83a76b0SSuyog Pawar (float)get_bits_per_frame(ps_rate_control_api->ps_bit_allocation) / i4_total_pixels;
3931*c83a76b0SSuyog Pawar float f_max_hme_sad_per_pixel;
3932*c83a76b0SSuyog Pawar
3933*c83a76b0SSuyog Pawar i4_num_temporal_layers = ps_rate_control_api->i4_num_active_pic_type - 2;
3934*c83a76b0SSuyog Pawar
3935*c83a76b0SSuyog Pawar CLIP(i4_num_temporal_layers, 3, 0);
3936*c83a76b0SSuyog Pawar
3937*c83a76b0SSuyog Pawar /*Pick the closest resolution based on error*/
3938*c83a76b0SSuyog Pawar for(i = 0; i < 4; i++)
3939*c83a76b0SSuyog Pawar {
3940*c83a76b0SSuyog Pawar i4_temp_error = abs(i4_total_pixels - ai4_pixels_res[i]);
3941*c83a76b0SSuyog Pawar
3942*c83a76b0SSuyog Pawar if(i4_temp_error < i4_error)
3943*c83a76b0SSuyog Pawar {
3944*c83a76b0SSuyog Pawar i4_error = i4_temp_error;
3945*c83a76b0SSuyog Pawar i4_res_index = i;
3946*c83a76b0SSuyog Pawar }
3947*c83a76b0SSuyog Pawar }
3948*c83a76b0SSuyog Pawar
3949*c83a76b0SSuyog Pawar /*Decide whether LBR or HBR*/
3950*c83a76b0SSuyog Pawar if((fabs(af_offline_bpp[i4_res_index][0] - f_bpp)) >
3951*c83a76b0SSuyog Pawar (fabs(af_offline_bpp[i4_res_index][1] - f_bpp)))
3952*c83a76b0SSuyog Pawar {
3953*c83a76b0SSuyog Pawar i4_br_index = 1;
3954*c83a76b0SSuyog Pawar }
3955*c83a76b0SSuyog Pawar else
3956*c83a76b0SSuyog Pawar {
3957*c83a76b0SSuyog Pawar i4_br_index = 0;
3958*c83a76b0SSuyog Pawar }
3959*c83a76b0SSuyog Pawar
3960*c83a76b0SSuyog Pawar /*After that pick the max hme sad*/
3961*c83a76b0SSuyog Pawar switch(i4_res_index)
3962*c83a76b0SSuyog Pawar {
3963*c83a76b0SSuyog Pawar case 0:
3964*c83a76b0SSuyog Pawar f_max_hme_sad_per_pixel =
3965*c83a76b0SSuyog Pawar af_offline_hme_sad_per_pixel_480p[i4_num_temporal_layers][i4_br_index];
3966*c83a76b0SSuyog Pawar break;
3967*c83a76b0SSuyog Pawar case 1:
3968*c83a76b0SSuyog Pawar f_max_hme_sad_per_pixel =
3969*c83a76b0SSuyog Pawar af_offline_hme_sad_per_pixel_720p[i4_num_temporal_layers][i4_br_index];
3970*c83a76b0SSuyog Pawar break;
3971*c83a76b0SSuyog Pawar case 2:
3972*c83a76b0SSuyog Pawar f_max_hme_sad_per_pixel =
3973*c83a76b0SSuyog Pawar af_offline_hme_sad_per_pixel_1080p[i4_num_temporal_layers][i4_br_index];
3974*c83a76b0SSuyog Pawar break;
3975*c83a76b0SSuyog Pawar case 3:
3976*c83a76b0SSuyog Pawar f_max_hme_sad_per_pixel =
3977*c83a76b0SSuyog Pawar af_offline_hme_sad_per_pixel_2160p[i4_num_temporal_layers][i4_br_index];
3978*c83a76b0SSuyog Pawar break;
3979*c83a76b0SSuyog Pawar default:
3980*c83a76b0SSuyog Pawar f_max_hme_sad_per_pixel =
3981*c83a76b0SSuyog Pawar af_offline_hme_sad_per_pixel_1080p[i4_num_temporal_layers][i4_br_index];
3982*c83a76b0SSuyog Pawar break;
3983*c83a76b0SSuyog Pawar }
3984*c83a76b0SSuyog Pawar
3985*c83a76b0SSuyog Pawar ps_rate_control_api->f_max_hme_sad_per_pixel = f_max_hme_sad_per_pixel;
3986*c83a76b0SSuyog Pawar }
3987*c83a76b0SSuyog Pawar
3988*c83a76b0SSuyog Pawar /****************************************************************************
3989*c83a76b0SSuyog Pawar Function Name : rc_update_pic_distn_lap_to_rc
3990*c83a76b0SSuyog Pawar Description :
3991*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
3992*c83a76b0SSuyog Pawar
3993*c83a76b0SSuyog Pawar Revision History:
3994*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
3995*c83a76b0SSuyog Pawar *****************************************************************************/
rc_update_pic_distn_lap_to_rc(rate_control_api_t * ps_rate_contro_api,WORD32 ai4_num_pic_type[MAX_PIC_TYPE])3996*c83a76b0SSuyog Pawar void rc_update_pic_distn_lap_to_rc(
3997*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_contro_api, WORD32 ai4_num_pic_type[MAX_PIC_TYPE])
3998*c83a76b0SSuyog Pawar {
3999*c83a76b0SSuyog Pawar pic_type_update_frms_in_gop(ps_rate_contro_api->ps_pic_handling, ai4_num_pic_type);
4000*c83a76b0SSuyog Pawar }
4001*c83a76b0SSuyog Pawar
4002*c83a76b0SSuyog Pawar /****************************************************************************
4003*c83a76b0SSuyog Pawar Function Name : rc_set_bits_based_on_complexity
4004*c83a76b0SSuyog Pawar Description :
4005*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4006*c83a76b0SSuyog Pawar
4007*c83a76b0SSuyog Pawar Revision History:
4008*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4009*c83a76b0SSuyog Pawar *****************************************************************************/
rc_set_bits_based_on_complexity(rate_control_api_t * ps_rate_contro_api,WORD32 i4_lap_window_comp,WORD32 i4_num_frames)4010*c83a76b0SSuyog Pawar void rc_set_bits_based_on_complexity(
4011*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_contro_api, WORD32 i4_lap_window_comp, WORD32 i4_num_frames)
4012*c83a76b0SSuyog Pawar {
4013*c83a76b0SSuyog Pawar set_bit_allocation_i_frames(
4014*c83a76b0SSuyog Pawar ps_rate_contro_api->ps_bit_allocation,
4015*c83a76b0SSuyog Pawar ps_rate_contro_api->ps_cbr_buffer,
4016*c83a76b0SSuyog Pawar ps_rate_contro_api->ps_pic_handling,
4017*c83a76b0SSuyog Pawar i4_lap_window_comp,
4018*c83a76b0SSuyog Pawar i4_num_frames);
4019*c83a76b0SSuyog Pawar }
4020*c83a76b0SSuyog Pawar /****************************************************************************
4021*c83a76b0SSuyog Pawar Function Name : rc_set_avg_qscale_first_pass
4022*c83a76b0SSuyog Pawar Description : Set the average qscale from first pass
4023*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4024*c83a76b0SSuyog Pawar
4025*c83a76b0SSuyog Pawar Revision History:
4026*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4027*c83a76b0SSuyog Pawar *****************************************************************************/
4028*c83a76b0SSuyog Pawar
rc_set_avg_qscale_first_pass(rate_control_api_t * ps_rate_control_api,float f_average_qscale_1st_pass)4029*c83a76b0SSuyog Pawar void rc_set_avg_qscale_first_pass(
4030*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, float f_average_qscale_1st_pass)
4031*c83a76b0SSuyog Pawar {
4032*c83a76b0SSuyog Pawar ba_set_avg_qscale_first_pass(ps_rate_control_api->ps_bit_allocation, f_average_qscale_1st_pass);
4033*c83a76b0SSuyog Pawar }
4034*c83a76b0SSuyog Pawar /****************************************************************************
4035*c83a76b0SSuyog Pawar Function Name : rc_set_max_avg_qscale_first_pass
4036*c83a76b0SSuyog Pawar Description : Set the maximum avergae Qscale in second pass as average Qscale
4037*c83a76b0SSuyog Pawar of first pass + 6 This is for simple contents
4038*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4039*c83a76b0SSuyog Pawar
4040*c83a76b0SSuyog Pawar Revision History:
4041*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4042*c83a76b0SSuyog Pawar *****************************************************************************/
4043*c83a76b0SSuyog Pawar
rc_set_max_avg_qscale_first_pass(rate_control_api_t * ps_rate_control_api,float f_max_average_qscale_1st_pass)4044*c83a76b0SSuyog Pawar void rc_set_max_avg_qscale_first_pass(
4045*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, float f_max_average_qscale_1st_pass)
4046*c83a76b0SSuyog Pawar {
4047*c83a76b0SSuyog Pawar ba_set_max_avg_qscale_first_pass(
4048*c83a76b0SSuyog Pawar ps_rate_control_api->ps_bit_allocation, f_max_average_qscale_1st_pass);
4049*c83a76b0SSuyog Pawar }
4050*c83a76b0SSuyog Pawar /****************************************************************************
4051*c83a76b0SSuyog Pawar Function Name : rc_set_i_to_sum_api_ba
4052*c83a76b0SSuyog Pawar Description :
4053*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4054*c83a76b0SSuyog Pawar
4055*c83a76b0SSuyog Pawar Revision History:
4056*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4057*c83a76b0SSuyog Pawar *****************************************************************************/
rc_set_i_to_sum_api_ba(rate_control_api_t * ps_rate_control_api,float f_curr_i_to_sum)4058*c83a76b0SSuyog Pawar void rc_set_i_to_sum_api_ba(rate_control_api_t *ps_rate_control_api, float f_curr_i_to_sum)
4059*c83a76b0SSuyog Pawar {
4060*c83a76b0SSuyog Pawar bit_alloc_set_curr_i_to_sum_i(ps_rate_control_api->ps_bit_allocation, f_curr_i_to_sum);
4061*c83a76b0SSuyog Pawar }
4062*c83a76b0SSuyog Pawar /****************************************************************************
4063*c83a76b0SSuyog Pawar Function Name : rc_set_p_to_i_complexity_ratio
4064*c83a76b0SSuyog Pawar Description :
4065*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4066*c83a76b0SSuyog Pawar
4067*c83a76b0SSuyog Pawar Revision History:
4068*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4069*c83a76b0SSuyog Pawar *****************************************************************************/
rc_set_p_to_i_complexity_ratio(rate_control_api_t * ps_rate_control_api,float f_p_to_i_ratio)4070*c83a76b0SSuyog Pawar void rc_set_p_to_i_complexity_ratio(rate_control_api_t *ps_rate_control_api, float f_p_to_i_ratio)
4071*c83a76b0SSuyog Pawar {
4072*c83a76b0SSuyog Pawar ps_rate_control_api->f_p_to_i_comp_ratio = f_p_to_i_ratio;
4073*c83a76b0SSuyog Pawar }
4074*c83a76b0SSuyog Pawar /****************************************************************************
4075*c83a76b0SSuyog Pawar Function Name : rc_set_scd_in_period
4076*c83a76b0SSuyog Pawar Description :
4077*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4078*c83a76b0SSuyog Pawar
4079*c83a76b0SSuyog Pawar Revision History:
4080*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4081*c83a76b0SSuyog Pawar *****************************************************************************/
rc_set_scd_in_period(rate_control_api_t * ps_rate_control_api,WORD32 i4_scd_in_period)4082*c83a76b0SSuyog Pawar void rc_set_scd_in_period(rate_control_api_t *ps_rate_control_api, WORD32 i4_scd_in_period)
4083*c83a76b0SSuyog Pawar {
4084*c83a76b0SSuyog Pawar ps_rate_control_api->i4_scd_in_period_2_pass = i4_scd_in_period;
4085*c83a76b0SSuyog Pawar }
4086*c83a76b0SSuyog Pawar /****************************************************************************
4087*c83a76b0SSuyog Pawar Function Name : rc_ba_get_qp_offset_offline_data
4088*c83a76b0SSuyog Pawar Description :
4089*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4090*c83a76b0SSuyog Pawar
4091*c83a76b0SSuyog Pawar Revision History:
4092*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4093*c83a76b0SSuyog Pawar *****************************************************************************/
rc_ba_get_qp_offset_offline_data(rate_control_api_t * ps_rate_control_api,WORD32 ai4_offsets[5],float f_hme_sad_per_pixel,WORD32 i4_num_active_pic_type,WORD32 * pi4_complexity_bin)4094*c83a76b0SSuyog Pawar void rc_ba_get_qp_offset_offline_data(
4095*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
4096*c83a76b0SSuyog Pawar WORD32 ai4_offsets[5],
4097*c83a76b0SSuyog Pawar float f_hme_sad_per_pixel,
4098*c83a76b0SSuyog Pawar WORD32 i4_num_active_pic_type,
4099*c83a76b0SSuyog Pawar WORD32 *pi4_complexity_bin)
4100*c83a76b0SSuyog Pawar {
4101*c83a76b0SSuyog Pawar WORD32 i4_ratio;
4102*c83a76b0SSuyog Pawar float f_ratio;
4103*c83a76b0SSuyog Pawar
4104*c83a76b0SSuyog Pawar CLIP(f_hme_sad_per_pixel, ps_rate_control_api->f_max_hme_sad_per_pixel, 0.01f);
4105*c83a76b0SSuyog Pawar
4106*c83a76b0SSuyog Pawar i4_ratio = (WORD32)(ps_rate_control_api->f_max_hme_sad_per_pixel / f_hme_sad_per_pixel);
4107*c83a76b0SSuyog Pawar f_ratio = ps_rate_control_api->f_max_hme_sad_per_pixel / f_hme_sad_per_pixel;
4108*c83a76b0SSuyog Pawar
4109*c83a76b0SSuyog Pawar ba_get_qp_offset_offline_data(
4110*c83a76b0SSuyog Pawar ai4_offsets, i4_ratio, f_ratio, i4_num_active_pic_type, pi4_complexity_bin);
4111*c83a76b0SSuyog Pawar }
4112*c83a76b0SSuyog Pawar /****************************************************************************
4113*c83a76b0SSuyog Pawar Function Name : rc_api_gop_level_averagae_q_scale_without_offset
4114*c83a76b0SSuyog Pawar Description : Find the GOP level average of the Qscale
4115*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4116*c83a76b0SSuyog Pawar
4117*c83a76b0SSuyog Pawar Revision History:
4118*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4119*c83a76b0SSuyog Pawar *****************************************************************************/
4120*c83a76b0SSuyog Pawar
rc_api_gop_level_averagae_q_scale_without_offset(rate_control_api_t * ps_rate_control_api)4121*c83a76b0SSuyog Pawar float rc_api_gop_level_averagae_q_scale_without_offset(rate_control_api_t *ps_rate_control_api)
4122*c83a76b0SSuyog Pawar {
4123*c83a76b0SSuyog Pawar float f_hbd_qscale =
4124*c83a76b0SSuyog Pawar ba_gop_info_average_qscale_gop_without_offset(ps_rate_control_api->ps_bit_allocation);
4125*c83a76b0SSuyog Pawar
4126*c83a76b0SSuyog Pawar return (f_hbd_qscale);
4127*c83a76b0SSuyog Pawar }
4128*c83a76b0SSuyog Pawar
4129*c83a76b0SSuyog Pawar /****************************************************************************
4130*c83a76b0SSuyog Pawar Function Name : rc_getprev_ref_pic_type
4131*c83a76b0SSuyog Pawar Description :
4132*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4133*c83a76b0SSuyog Pawar
4134*c83a76b0SSuyog Pawar Revision History:
4135*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4136*c83a76b0SSuyog Pawar *****************************************************************************/
rc_getprev_ref_pic_type(rate_control_api_t * ps_rate_control_api)4137*c83a76b0SSuyog Pawar picture_type_e rc_getprev_ref_pic_type(rate_control_api_t *ps_rate_control_api)
4138*c83a76b0SSuyog Pawar {
4139*c83a76b0SSuyog Pawar return (ps_rate_control_api->prev_ref_pic_type);
4140*c83a76b0SSuyog Pawar }
4141*c83a76b0SSuyog Pawar /****************************************************************************
4142*c83a76b0SSuyog Pawar Function Name : rc_get_actual_intra_frame_int
4143*c83a76b0SSuyog Pawar Description :
4144*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4145*c83a76b0SSuyog Pawar
4146*c83a76b0SSuyog Pawar Revision History:
4147*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4148*c83a76b0SSuyog Pawar *****************************************************************************/
rc_get_actual_intra_frame_int(rate_control_api_t * ps_rate_control_api)4149*c83a76b0SSuyog Pawar WORD32 rc_get_actual_intra_frame_int(rate_control_api_t *ps_rate_control_api)
4150*c83a76b0SSuyog Pawar {
4151*c83a76b0SSuyog Pawar WORD32 i4_int = pic_type_get_actual_intra_frame_interval(ps_rate_control_api->ps_pic_handling);
4152*c83a76b0SSuyog Pawar return (i4_int);
4153*c83a76b0SSuyog Pawar }
4154*c83a76b0SSuyog Pawar /****************************************************************************
4155*c83a76b0SSuyog Pawar Function Name : rc_get_qscale_max_clip_in_second_pass
4156*c83a76b0SSuyog Pawar Description : Get maximum qscale that is allowed based on average Qp for simple contents
4157*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4158*c83a76b0SSuyog Pawar
4159*c83a76b0SSuyog Pawar Revision History:
4160*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4161*c83a76b0SSuyog Pawar *****************************************************************************/
4162*c83a76b0SSuyog Pawar
rc_get_qscale_max_clip_in_second_pass(rate_control_api_t * ps_rate_control_api)4163*c83a76b0SSuyog Pawar float rc_get_qscale_max_clip_in_second_pass(rate_control_api_t *ps_rate_control_api)
4164*c83a76b0SSuyog Pawar {
4165*c83a76b0SSuyog Pawar float i4_max_qscale =
4166*c83a76b0SSuyog Pawar ba_get_qscale_max_clip_in_second_pass(ps_rate_control_api->ps_bit_allocation);
4167*c83a76b0SSuyog Pawar return (i4_max_qscale);
4168*c83a76b0SSuyog Pawar }
4169*c83a76b0SSuyog Pawar /****************************************************************************
4170*c83a76b0SSuyog Pawar Function Name : rc_set_2pass_total_frames
4171*c83a76b0SSuyog Pawar Description : Set the total number of frames in the stream
4172*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4173*c83a76b0SSuyog Pawar
4174*c83a76b0SSuyog Pawar Revision History:
4175*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4176*c83a76b0SSuyog Pawar *****************************************************************************/
4177*c83a76b0SSuyog Pawar
rc_set_2pass_total_frames(rate_control_api_t * ps_rate_control_api,WORD32 i4_total_2pass_frames)4178*c83a76b0SSuyog Pawar void rc_set_2pass_total_frames(rate_control_api_t *ps_rate_control_api, WORD32 i4_total_2pass_frames)
4179*c83a76b0SSuyog Pawar {
4180*c83a76b0SSuyog Pawar bit_alloc_set_2pass_total_frames(ps_rate_control_api->ps_bit_allocation, i4_total_2pass_frames);
4181*c83a76b0SSuyog Pawar }
4182*c83a76b0SSuyog Pawar /****************************************************************************
4183*c83a76b0SSuyog Pawar Function Name : rc_set_2pass_avg_bit_rate
4184*c83a76b0SSuyog Pawar Description : Set the average bit-rate based on consumption so far
4185*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4186*c83a76b0SSuyog Pawar
4187*c83a76b0SSuyog Pawar Revision History:
4188*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4189*c83a76b0SSuyog Pawar *****************************************************************************/
4190*c83a76b0SSuyog Pawar
rc_set_2pass_avg_bit_rate(rate_control_api_t * ps_rate_control_api,LWORD64 i8_2pass_avg_bit_rate)4191*c83a76b0SSuyog Pawar void rc_set_2pass_avg_bit_rate(
4192*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api, LWORD64 i8_2pass_avg_bit_rate)
4193*c83a76b0SSuyog Pawar {
4194*c83a76b0SSuyog Pawar ba_set_2pass_avg_bit_rate(ps_rate_control_api->ps_bit_allocation, i8_2pass_avg_bit_rate);
4195*c83a76b0SSuyog Pawar }
4196*c83a76b0SSuyog Pawar /****************************************************************************
4197*c83a76b0SSuyog Pawar Function Name : rc_set_enable_look_ahead
4198*c83a76b0SSuyog Pawar Description :
4199*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4200*c83a76b0SSuyog Pawar
4201*c83a76b0SSuyog Pawar Revision History:
4202*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4203*c83a76b0SSuyog Pawar *****************************************************************************/
rc_set_enable_look_ahead(rate_control_api_t * ps_rate_control_api,WORD32 i4_enable_look_ahead)4204*c83a76b0SSuyog Pawar void rc_set_enable_look_ahead(rate_control_api_t *ps_rate_control_api, WORD32 i4_enable_look_ahead)
4205*c83a76b0SSuyog Pawar {
4206*c83a76b0SSuyog Pawar ba_set_enable_look_ahead(ps_rate_control_api->ps_bit_allocation, i4_enable_look_ahead);
4207*c83a76b0SSuyog Pawar }
4208*c83a76b0SSuyog Pawar /****************************************************************************
4209*c83a76b0SSuyog Pawar Function Name : rc_add_est_tot
4210*c83a76b0SSuyog Pawar Description :
4211*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4212*c83a76b0SSuyog Pawar
4213*c83a76b0SSuyog Pawar Revision History:
4214*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4215*c83a76b0SSuyog Pawar *****************************************************************************/
rc_add_est_tot(rate_control_api_t * ps_rate_control_api,WORD32 i4_tot_tex_bits)4216*c83a76b0SSuyog Pawar void rc_add_est_tot(rate_control_api_t *ps_rate_control_api, WORD32 i4_tot_tex_bits)
4217*c83a76b0SSuyog Pawar {
4218*c83a76b0SSuyog Pawar rc_modify_est_tot(ps_rate_control_api, i4_tot_tex_bits);
4219*c83a76b0SSuyog Pawar }
4220*c83a76b0SSuyog Pawar /****************************************************************************
4221*c83a76b0SSuyog Pawar Function Name : rc_init_buffer_info
4222*c83a76b0SSuyog Pawar Description :
4223*c83a76b0SSuyog Pawar Inputs : ps_rate_control_api
4224*c83a76b0SSuyog Pawar
4225*c83a76b0SSuyog Pawar Revision History:
4226*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
4227*c83a76b0SSuyog Pawar *****************************************************************************/
rc_init_buffer_info(rate_control_api_t * ps_rate_control_api,WORD32 * pi4_vbv_buffer_size,WORD32 * pi4_currEbf,WORD32 * pi4_maxEbf,WORD32 * pi4_drain_rate)4228*c83a76b0SSuyog Pawar void rc_init_buffer_info(
4229*c83a76b0SSuyog Pawar rate_control_api_t *ps_rate_control_api,
4230*c83a76b0SSuyog Pawar WORD32 *pi4_vbv_buffer_size,
4231*c83a76b0SSuyog Pawar WORD32 *pi4_currEbf,
4232*c83a76b0SSuyog Pawar WORD32 *pi4_maxEbf,
4233*c83a76b0SSuyog Pawar WORD32 *pi4_drain_rate)
4234*c83a76b0SSuyog Pawar {
4235*c83a76b0SSuyog Pawar *pi4_vbv_buffer_size = get_cbr_buffer_size(ps_rate_control_api->ps_cbr_buffer);
4236*c83a76b0SSuyog Pawar *pi4_currEbf = get_cbr_ebf(ps_rate_control_api->ps_cbr_buffer) +
4237*c83a76b0SSuyog Pawar rc_get_estimate_bit_error(ps_rate_control_api);
4238*c83a76b0SSuyog Pawar *pi4_maxEbf = get_cbr_max_ebf(ps_rate_control_api->ps_cbr_buffer);
4239*c83a76b0SSuyog Pawar *pi4_drain_rate = get_buf_max_drain_rate(ps_rate_control_api->ps_cbr_buffer);
4240*c83a76b0SSuyog Pawar return;
4241*c83a76b0SSuyog Pawar }
4242