xref: /aosp_15_r20/external/libhevc/encoder/vbr_storage_vbv.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar  *
5*c83a76b0SSuyog Pawar  * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar  * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar  * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar  *
9*c83a76b0SSuyog Pawar  * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar  *
11*c83a76b0SSuyog Pawar  * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar  * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar  * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar  * limitations under the License.
16*c83a76b0SSuyog Pawar  *
17*c83a76b0SSuyog Pawar  *****************************************************************************
18*c83a76b0SSuyog Pawar  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar /*!
21*c83a76b0SSuyog Pawar ******************************************************************************
22*c83a76b0SSuyog Pawar * \file vbr_storage_vbv.c
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    This file contain functions related to VBV buffer
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 
40*c83a76b0SSuyog Pawar /* User include files */
41*c83a76b0SSuyog Pawar #include "ittiam_datatypes.h"
42*c83a76b0SSuyog Pawar #include "mem_req_and_acq.h"
43*c83a76b0SSuyog Pawar #include "rc_common.h"
44*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
45*c83a76b0SSuyog Pawar #include "var_q_operator.h"
46*c83a76b0SSuyog Pawar #include "fixed_point_error_bits.h"
47*c83a76b0SSuyog Pawar #include "cbr_buffer_control.h"
48*c83a76b0SSuyog Pawar #include "rc_rd_model.h"
49*c83a76b0SSuyog Pawar #include "est_sad.h"
50*c83a76b0SSuyog Pawar #include "cbr_buffer_control.h"
51*c83a76b0SSuyog Pawar #include "picture_type.h"
52*c83a76b0SSuyog Pawar #include "bit_allocation.h"
53*c83a76b0SSuyog Pawar #include "vbr_storage_vbv.h"
54*c83a76b0SSuyog Pawar #include "trace_support.h"
55*c83a76b0SSuyog Pawar 
56*c83a76b0SSuyog Pawar #define MAX(x, y) ((x) > (y) ? (x) : (y))
57*c83a76b0SSuyog Pawar 
58*c83a76b0SSuyog Pawar typedef struct vbr_storage_vbv_t
59*c83a76b0SSuyog Pawar {
60*c83a76b0SSuyog Pawar     WORD32 i4_max_buf_size;
61*c83a76b0SSuyog Pawar     WORD32 i4_cur_buf_size;
62*c83a76b0SSuyog Pawar     WORD32 i4_max_bits_inflow_per_frm_period;
63*c83a76b0SSuyog Pawar     /* Storing input variables */
64*c83a76b0SSuyog Pawar     WORD32 i4_max_bit_rate;
65*c83a76b0SSuyog Pawar     WORD32 i4_max_frame_rate;
66*c83a76b0SSuyog Pawar     /* Error bits calculation module */
67*c83a76b0SSuyog Pawar     error_bits_handle ps_error_bits;
68*c83a76b0SSuyog Pawar } vbr_storage_vbv_t;
69*c83a76b0SSuyog Pawar 
70*c83a76b0SSuyog Pawar #if NON_STEADSTATE_CODE
71*c83a76b0SSuyog Pawar 
vbr_vbv_num_fill_use_free_memtab(vbr_storage_vbv_t ** pps_vbr_storage_vbv,itt_memtab_t * ps_memtab,ITT_FUNC_TYPE_E e_func_type)72*c83a76b0SSuyog Pawar WORD32 vbr_vbv_num_fill_use_free_memtab(
73*c83a76b0SSuyog Pawar     vbr_storage_vbv_t **pps_vbr_storage_vbv, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type)
74*c83a76b0SSuyog Pawar {
75*c83a76b0SSuyog Pawar     WORD32 i4_mem_tab_idx = 0;
76*c83a76b0SSuyog Pawar     static vbr_storage_vbv_t s_vbr_storage_vbv_temp;
77*c83a76b0SSuyog Pawar 
78*c83a76b0SSuyog Pawar     /* Hack for al alloc, during which we dont have any state memory.
79*c83a76b0SSuyog Pawar       Dereferencing can cause issues */
80*c83a76b0SSuyog Pawar     if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
81*c83a76b0SSuyog Pawar         (*pps_vbr_storage_vbv) = &s_vbr_storage_vbv_temp;
82*c83a76b0SSuyog Pawar 
83*c83a76b0SSuyog Pawar     /*for src rate control state structure*/
84*c83a76b0SSuyog Pawar     if(e_func_type != GET_NUM_MEMTAB)
85*c83a76b0SSuyog Pawar     {
86*c83a76b0SSuyog Pawar         fill_memtab(
87*c83a76b0SSuyog Pawar             &ps_memtab[i4_mem_tab_idx],
88*c83a76b0SSuyog Pawar             sizeof(vbr_storage_vbv_t),
89*c83a76b0SSuyog Pawar             MEM_TAB_ALIGNMENT,
90*c83a76b0SSuyog Pawar             PERSISTENT,
91*c83a76b0SSuyog Pawar             DDR);
92*c83a76b0SSuyog Pawar         use_or_fill_base(&ps_memtab[0], (void **)pps_vbr_storage_vbv, e_func_type);
93*c83a76b0SSuyog Pawar     }
94*c83a76b0SSuyog Pawar     i4_mem_tab_idx++;
95*c83a76b0SSuyog Pawar 
96*c83a76b0SSuyog Pawar     i4_mem_tab_idx += error_bits_num_fill_use_free_memtab(
97*c83a76b0SSuyog Pawar         &pps_vbr_storage_vbv[0]->ps_error_bits, &ps_memtab[i4_mem_tab_idx], e_func_type);
98*c83a76b0SSuyog Pawar     return (i4_mem_tab_idx);
99*c83a76b0SSuyog Pawar }
100*c83a76b0SSuyog Pawar /******************************************************************************
101*c83a76b0SSuyog Pawar   Function Name   : init_vbr_vbv
102*c83a76b0SSuyog Pawar   Description     :
103*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
104*c83a76b0SSuyog Pawar   Return Values   : void
105*c83a76b0SSuyog Pawar   Revision History:
106*c83a76b0SSuyog Pawar                     Creation
107*c83a76b0SSuyog Pawar *****************************************************************************/
init_vbr_vbv(vbr_storage_vbv_t * ps_vbr_storage_vbv,WORD32 i4_max_bit_rate,WORD32 i4_frm_rate,WORD32 i4_max_vbv_buff_size)108*c83a76b0SSuyog Pawar void init_vbr_vbv(
109*c83a76b0SSuyog Pawar     vbr_storage_vbv_t *ps_vbr_storage_vbv,
110*c83a76b0SSuyog Pawar     WORD32 i4_max_bit_rate,
111*c83a76b0SSuyog Pawar     WORD32 i4_frm_rate,
112*c83a76b0SSuyog Pawar     WORD32 i4_max_vbv_buff_size)
113*c83a76b0SSuyog Pawar {
114*c83a76b0SSuyog Pawar     ps_vbr_storage_vbv->i4_max_buf_size = i4_max_vbv_buff_size;
115*c83a76b0SSuyog Pawar     ps_vbr_storage_vbv->i4_cur_buf_size = i4_max_vbv_buff_size;
116*c83a76b0SSuyog Pawar 
117*c83a76b0SSuyog Pawar     /* Calculate the max number of bits that flow into the decoder
118*c83a76b0SSuyog Pawar     in the interval of two frames */
119*c83a76b0SSuyog Pawar     X_PROD_Y_DIV_Z(
120*c83a76b0SSuyog Pawar         i4_max_bit_rate, 1000, i4_frm_rate, ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period);
121*c83a76b0SSuyog Pawar 
122*c83a76b0SSuyog Pawar     /* init error bits */
123*c83a76b0SSuyog Pawar     init_error_bits(ps_vbr_storage_vbv->ps_error_bits, i4_frm_rate, i4_max_bit_rate);
124*c83a76b0SSuyog Pawar 
125*c83a76b0SSuyog Pawar     /* Storing the input values */
126*c83a76b0SSuyog Pawar     ps_vbr_storage_vbv->i4_max_bit_rate = i4_max_bit_rate;
127*c83a76b0SSuyog Pawar     ps_vbr_storage_vbv->i4_max_frame_rate = i4_frm_rate;
128*c83a76b0SSuyog Pawar }
129*c83a76b0SSuyog Pawar #endif /* #if NON_STEADSTATE_CODE */
130*c83a76b0SSuyog Pawar /******************************************************************************
131*c83a76b0SSuyog Pawar   Function Name   : update_vbr_vbv
132*c83a76b0SSuyog Pawar   Description     :
133*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
134*c83a76b0SSuyog Pawar   Return Values   : void
135*c83a76b0SSuyog Pawar   Revision History:
136*c83a76b0SSuyog Pawar                     Creation
137*c83a76b0SSuyog Pawar *****************************************************************************/
update_vbr_vbv(vbr_storage_vbv_t * ps_vbr_storage_vbv,WORD32 i4_total_bits_decoded)138*c83a76b0SSuyog Pawar void update_vbr_vbv(vbr_storage_vbv_t *ps_vbr_storage_vbv, WORD32 i4_total_bits_decoded)
139*c83a76b0SSuyog Pawar {
140*c83a76b0SSuyog Pawar     WORD32 i4_error_bits = get_error_bits(ps_vbr_storage_vbv->ps_error_bits);
141*c83a76b0SSuyog Pawar     /* In the time interval between two decoded frames the buffer would have been
142*c83a76b0SSuyog Pawar        filled up by the max_bits_inflow_per_frm_period.*/
143*c83a76b0SSuyog Pawar     overflow_avoided_summation(
144*c83a76b0SSuyog Pawar         &ps_vbr_storage_vbv->i4_cur_buf_size,
145*c83a76b0SSuyog Pawar         (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period + i4_error_bits));
146*c83a76b0SSuyog Pawar 
147*c83a76b0SSuyog Pawar     if(ps_vbr_storage_vbv->i4_cur_buf_size > ps_vbr_storage_vbv->i4_max_buf_size)
148*c83a76b0SSuyog Pawar     {
149*c83a76b0SSuyog Pawar         ps_vbr_storage_vbv->i4_cur_buf_size = ps_vbr_storage_vbv->i4_max_buf_size;
150*c83a76b0SSuyog Pawar     }
151*c83a76b0SSuyog Pawar 
152*c83a76b0SSuyog Pawar     ps_vbr_storage_vbv->i4_cur_buf_size -= i4_total_bits_decoded;
153*c83a76b0SSuyog Pawar 
154*c83a76b0SSuyog Pawar     /* Update the error bits state */
155*c83a76b0SSuyog Pawar     update_error_bits(ps_vbr_storage_vbv->ps_error_bits);
156*c83a76b0SSuyog Pawar 
157*c83a76b0SSuyog Pawar #define PRINT_UNDERFLOW 0
158*c83a76b0SSuyog Pawar #if PRINT_UNDERFLOW
159*c83a76b0SSuyog Pawar     if(ps_vbr_storage_vbv->i4_cur_buf_size < 0)
160*c83a76b0SSuyog Pawar         printf("The buffer underflows \n");
161*c83a76b0SSuyog Pawar #endif
162*c83a76b0SSuyog Pawar }
163*c83a76b0SSuyog Pawar /******************************************************************************
164*c83a76b0SSuyog Pawar   Function Name   : get_max_target_bits
165*c83a76b0SSuyog Pawar   Description     :
166*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
167*c83a76b0SSuyog Pawar   Return Values   : void
168*c83a76b0SSuyog Pawar   Revision History:
169*c83a76b0SSuyog Pawar                     Creation
170*c83a76b0SSuyog Pawar *****************************************************************************/
get_max_target_bits(vbr_storage_vbv_t * ps_vbr_storage_vbv)171*c83a76b0SSuyog Pawar WORD32 get_max_target_bits(vbr_storage_vbv_t *ps_vbr_storage_vbv)
172*c83a76b0SSuyog Pawar {
173*c83a76b0SSuyog Pawar     WORD32 i4_cur_buf_size = ps_vbr_storage_vbv->i4_cur_buf_size;
174*c83a76b0SSuyog Pawar     WORD32 i4_error_bits = get_error_bits(ps_vbr_storage_vbv->ps_error_bits);
175*c83a76b0SSuyog Pawar 
176*c83a76b0SSuyog Pawar     /* The buffer size when the next frame is decoded */
177*c83a76b0SSuyog Pawar     overflow_avoided_summation(
178*c83a76b0SSuyog Pawar         &i4_cur_buf_size, (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period + i4_error_bits));
179*c83a76b0SSuyog Pawar     if(i4_cur_buf_size > ps_vbr_storage_vbv->i4_max_buf_size)
180*c83a76b0SSuyog Pawar     {
181*c83a76b0SSuyog Pawar         i4_cur_buf_size = ps_vbr_storage_vbv->i4_max_buf_size;
182*c83a76b0SSuyog Pawar     }
183*c83a76b0SSuyog Pawar 
184*c83a76b0SSuyog Pawar     /* Thus for the next frame the maximum number of bits the decoder can consume
185*c83a76b0SSuyog Pawar     without underflow is i4_cur_buf_size */
186*c83a76b0SSuyog Pawar     return i4_cur_buf_size;
187*c83a76b0SSuyog Pawar }
188*c83a76b0SSuyog Pawar 
189*c83a76b0SSuyog Pawar /****************************************************************************
190*c83a76b0SSuyog Pawar Function Name : get_buffer_status
191*c83a76b0SSuyog Pawar Description   : Gets the state of VBV buffer
192*c83a76b0SSuyog Pawar Inputs        : Rate control API , header and texture bits
193*c83a76b0SSuyog Pawar Globals       :
194*c83a76b0SSuyog Pawar Processing    :
195*c83a76b0SSuyog Pawar Outputs       : 0 = normal, 1 = underflow, 2= overflow
196*c83a76b0SSuyog Pawar Returns       : vbv_buf_status_e
197*c83a76b0SSuyog Pawar Issues        :
198*c83a76b0SSuyog Pawar Revision History:
199*c83a76b0SSuyog Pawar DD MM YYYY   Author(s)       Changes (Describe the changes made)
200*c83a76b0SSuyog Pawar *****************************************************************************/
get_vbv_buffer_status(vbr_storage_vbv_t * ps_vbr_storage_vbv,WORD32 i4_total_frame_bits,WORD32 * pi4_num_bits_to_prevent_vbv_underflow)201*c83a76b0SSuyog Pawar vbv_buf_status_e get_vbv_buffer_status(
202*c83a76b0SSuyog Pawar     vbr_storage_vbv_t *ps_vbr_storage_vbv,
203*c83a76b0SSuyog Pawar     WORD32 i4_total_frame_bits, /* Total frame bits consumed */
204*c83a76b0SSuyog Pawar     WORD32 *pi4_num_bits_to_prevent_vbv_underflow) /* The curent buffer status after updation */
205*c83a76b0SSuyog Pawar {
206*c83a76b0SSuyog Pawar     vbv_buf_status_e e_buf_status;
207*c83a76b0SSuyog Pawar     WORD32 i4_cur_buf;
208*c83a76b0SSuyog Pawar     WORD32 i4_error_bits = get_error_bits(ps_vbr_storage_vbv->ps_error_bits);
209*c83a76b0SSuyog Pawar 
210*c83a76b0SSuyog Pawar     /* error bits due to fixed point computation of drain rate*/
211*c83a76b0SSuyog Pawar     i4_cur_buf = ps_vbr_storage_vbv->i4_cur_buf_size;
212*c83a76b0SSuyog Pawar     overflow_avoided_summation(
213*c83a76b0SSuyog Pawar         &i4_cur_buf, (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period + i4_error_bits));
214*c83a76b0SSuyog Pawar 
215*c83a76b0SSuyog Pawar     if(i4_cur_buf > ps_vbr_storage_vbv->i4_max_buf_size)
216*c83a76b0SSuyog Pawar     {
217*c83a76b0SSuyog Pawar         i4_cur_buf = ps_vbr_storage_vbv->i4_max_buf_size;
218*c83a76b0SSuyog Pawar     }
219*c83a76b0SSuyog Pawar 
220*c83a76b0SSuyog Pawar     pi4_num_bits_to_prevent_vbv_underflow[0] = i4_cur_buf;
221*c83a76b0SSuyog Pawar 
222*c83a76b0SSuyog Pawar     i4_cur_buf -= i4_total_frame_bits;
223*c83a76b0SSuyog Pawar     if(i4_cur_buf < 0)
224*c83a76b0SSuyog Pawar     {
225*c83a76b0SSuyog Pawar         e_buf_status = VBV_UNDERFLOW;
226*c83a76b0SSuyog Pawar     }
227*c83a76b0SSuyog Pawar     else if(i4_cur_buf > ps_vbr_storage_vbv->i4_max_buf_size)
228*c83a76b0SSuyog Pawar     {
229*c83a76b0SSuyog Pawar         e_buf_status = VBV_OVERFLOW;
230*c83a76b0SSuyog Pawar     }
231*c83a76b0SSuyog Pawar     else if(i4_cur_buf < (ps_vbr_storage_vbv->i4_max_buf_size >> 2))
232*c83a76b0SSuyog Pawar     {
233*c83a76b0SSuyog Pawar         e_buf_status = VBR_CAUTION;
234*c83a76b0SSuyog Pawar     }
235*c83a76b0SSuyog Pawar     else
236*c83a76b0SSuyog Pawar     {
237*c83a76b0SSuyog Pawar         e_buf_status = VBV_NORMAL;
238*c83a76b0SSuyog Pawar     }
239*c83a76b0SSuyog Pawar 
240*c83a76b0SSuyog Pawar     return e_buf_status;
241*c83a76b0SSuyog Pawar }
242*c83a76b0SSuyog Pawar /******************************************************************************
243*c83a76b0SSuyog Pawar   Function Name   : get_max_vbv_buf_size
244*c83a76b0SSuyog Pawar   Description     :
245*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
246*c83a76b0SSuyog Pawar   Return Values   : void
247*c83a76b0SSuyog Pawar   Revision History:
248*c83a76b0SSuyog Pawar                     Creation
249*c83a76b0SSuyog Pawar *****************************************************************************/
get_max_vbv_buf_size(vbr_storage_vbv_t * ps_vbr_storage_vbv)250*c83a76b0SSuyog Pawar WORD32 get_max_vbv_buf_size(vbr_storage_vbv_t *ps_vbr_storage_vbv)
251*c83a76b0SSuyog Pawar {
252*c83a76b0SSuyog Pawar     return (ps_vbr_storage_vbv->i4_max_buf_size);
253*c83a76b0SSuyog Pawar }
254*c83a76b0SSuyog Pawar /******************************************************************************
255*c83a76b0SSuyog Pawar   Function Name   : get_cur_vbv_buf_size
256*c83a76b0SSuyog Pawar   Description     :
257*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
258*c83a76b0SSuyog Pawar   Return Values   : void
259*c83a76b0SSuyog Pawar   Revision History:
260*c83a76b0SSuyog Pawar                     Creation
261*c83a76b0SSuyog Pawar *****************************************************************************/
get_cur_vbv_buf_size(vbr_storage_vbv_t * ps_vbr_storage_vbv)262*c83a76b0SSuyog Pawar WORD32 get_cur_vbv_buf_size(vbr_storage_vbv_t *ps_vbr_storage_vbv)
263*c83a76b0SSuyog Pawar {
264*c83a76b0SSuyog Pawar     return (ps_vbr_storage_vbv->i4_cur_buf_size);
265*c83a76b0SSuyog Pawar }
266*c83a76b0SSuyog Pawar /******************************************************************************
267*c83a76b0SSuyog Pawar   Function Name   : get_max_bits_inflow_per_frm_periode
268*c83a76b0SSuyog Pawar   Description     :
269*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
270*c83a76b0SSuyog Pawar   Return Values   : void
271*c83a76b0SSuyog Pawar   Revision History:
272*c83a76b0SSuyog Pawar                     Creation
273*c83a76b0SSuyog Pawar *****************************************************************************/
get_max_bits_inflow_per_frm_periode(vbr_storage_vbv_t * ps_vbr_storage_vbv)274*c83a76b0SSuyog Pawar WORD32 get_max_bits_inflow_per_frm_periode(vbr_storage_vbv_t *ps_vbr_storage_vbv)
275*c83a76b0SSuyog Pawar {
276*c83a76b0SSuyog Pawar     return (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period);
277*c83a76b0SSuyog Pawar }
278*c83a76b0SSuyog Pawar 
279*c83a76b0SSuyog Pawar /******************************************************************************
280*c83a76b0SSuyog Pawar   Function Name   : get_vbv_buf_fullness
281*c83a76b0SSuyog Pawar   Description     :
282*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
283*c83a76b0SSuyog Pawar   Return Values   : void
284*c83a76b0SSuyog Pawar   Revision History:
285*c83a76b0SSuyog Pawar                     Creation
286*c83a76b0SSuyog Pawar *****************************************************************************/
get_vbv_buf_fullness(vbr_storage_vbv_t * ps_vbr_storage_vbv,UWORD32 u4_bits)287*c83a76b0SSuyog Pawar WORD32 get_vbv_buf_fullness(vbr_storage_vbv_t *ps_vbr_storage_vbv, UWORD32 u4_bits)
288*c83a76b0SSuyog Pawar {
289*c83a76b0SSuyog Pawar     WORD32 i4_error_bits = get_error_bits(ps_vbr_storage_vbv->ps_error_bits);
290*c83a76b0SSuyog Pawar     WORD32 i4_cur_buf_size = ps_vbr_storage_vbv->i4_cur_buf_size;
291*c83a76b0SSuyog Pawar 
292*c83a76b0SSuyog Pawar     overflow_avoided_summation(
293*c83a76b0SSuyog Pawar         &i4_cur_buf_size, (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period + i4_error_bits));
294*c83a76b0SSuyog Pawar 
295*c83a76b0SSuyog Pawar     if(i4_cur_buf_size > ps_vbr_storage_vbv->i4_max_buf_size)
296*c83a76b0SSuyog Pawar     {
297*c83a76b0SSuyog Pawar         i4_cur_buf_size = ps_vbr_storage_vbv->i4_max_buf_size;
298*c83a76b0SSuyog Pawar     }
299*c83a76b0SSuyog Pawar 
300*c83a76b0SSuyog Pawar     i4_cur_buf_size -= u4_bits;
301*c83a76b0SSuyog Pawar 
302*c83a76b0SSuyog Pawar #if PRINT_UNDERFLOW
303*c83a76b0SSuyog Pawar     if(i4_cur_buf_size < 0)
304*c83a76b0SSuyog Pawar         printf("The buffer underflows \n");
305*c83a76b0SSuyog Pawar #endif
306*c83a76b0SSuyog Pawar     return (i4_cur_buf_size);
307*c83a76b0SSuyog Pawar }
308*c83a76b0SSuyog Pawar /******************************************************************************
309*c83a76b0SSuyog Pawar   Function Name   : get_max_tgt_bits_dvd_comp
310*c83a76b0SSuyog Pawar   Description     :
311*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
312*c83a76b0SSuyog Pawar   Return Values   : void
313*c83a76b0SSuyog Pawar   Revision History:
314*c83a76b0SSuyog Pawar                     Creation
315*c83a76b0SSuyog Pawar *****************************************************************************/
get_max_tgt_bits_dvd_comp(vbr_storage_vbv_t * ps_vbr_storage_vbv,WORD32 i4_rem_bits_in_gop,WORD32 i4_rem_frms_in_gop,picture_type_e e_pic_type)316*c83a76b0SSuyog Pawar WORD32 get_max_tgt_bits_dvd_comp(
317*c83a76b0SSuyog Pawar     vbr_storage_vbv_t *ps_vbr_storage_vbv,
318*c83a76b0SSuyog Pawar     WORD32 i4_rem_bits_in_gop,
319*c83a76b0SSuyog Pawar     WORD32 i4_rem_frms_in_gop,
320*c83a76b0SSuyog Pawar     picture_type_e e_pic_type)
321*c83a76b0SSuyog Pawar {
322*c83a76b0SSuyog Pawar     WORD32 i4_dbf_max, i4_dbf_min, i4_dbf_prev, i4_vbv_size, i4_dbf_desired;
323*c83a76b0SSuyog Pawar     WORD32 i4_max_tgt_bits;
324*c83a76b0SSuyog Pawar 
325*c83a76b0SSuyog Pawar     i4_vbv_size = ps_vbr_storage_vbv->i4_max_buf_size;
326*c83a76b0SSuyog Pawar     i4_dbf_max = 95 * i4_vbv_size / 100;
327*c83a76b0SSuyog Pawar     i4_dbf_min = 10 * i4_vbv_size / 100;
328*c83a76b0SSuyog Pawar     i4_dbf_prev = ps_vbr_storage_vbv->i4_cur_buf_size;
329*c83a76b0SSuyog Pawar 
330*c83a76b0SSuyog Pawar     if(i4_rem_bits_in_gop < 0)
331*c83a76b0SSuyog Pawar         i4_rem_bits_in_gop = 0;
332*c83a76b0SSuyog Pawar     if(i4_rem_frms_in_gop <= 0)
333*c83a76b0SSuyog Pawar         i4_rem_frms_in_gop = 1;
334*c83a76b0SSuyog Pawar 
335*c83a76b0SSuyog Pawar     if(e_pic_type == I_PIC)
336*c83a76b0SSuyog Pawar     {
337*c83a76b0SSuyog Pawar         i4_dbf_desired = i4_dbf_min;
338*c83a76b0SSuyog Pawar     }
339*c83a76b0SSuyog Pawar     else
340*c83a76b0SSuyog Pawar     {
341*c83a76b0SSuyog Pawar         i4_dbf_desired = (i4_dbf_max - i4_rem_bits_in_gop / i4_rem_frms_in_gop - i4_dbf_prev) /
342*c83a76b0SSuyog Pawar                          i4_rem_frms_in_gop;
343*c83a76b0SSuyog Pawar         i4_dbf_desired += i4_dbf_prev;
344*c83a76b0SSuyog Pawar     }
345*c83a76b0SSuyog Pawar 
346*c83a76b0SSuyog Pawar     i4_dbf_prev += ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period;
347*c83a76b0SSuyog Pawar     if(i4_dbf_prev > ps_vbr_storage_vbv->i4_max_buf_size)
348*c83a76b0SSuyog Pawar     {
349*c83a76b0SSuyog Pawar         i4_dbf_prev = ps_vbr_storage_vbv->i4_max_buf_size;
350*c83a76b0SSuyog Pawar     }
351*c83a76b0SSuyog Pawar 
352*c83a76b0SSuyog Pawar     i4_max_tgt_bits = MAX(0, (i4_dbf_prev - i4_dbf_desired));
353*c83a76b0SSuyog Pawar     return (i4_max_tgt_bits);
354*c83a76b0SSuyog Pawar }
355*c83a76b0SSuyog Pawar 
356*c83a76b0SSuyog Pawar #if NON_STEADSTATE_CODE
357*c83a76b0SSuyog Pawar /******************************************************************************
358*c83a76b0SSuyog Pawar   Function Name   : change_vbr_vbv_frame_rate
359*c83a76b0SSuyog Pawar   Description     :
360*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
361*c83a76b0SSuyog Pawar   Return Values   : void
362*c83a76b0SSuyog Pawar   Revision History:
363*c83a76b0SSuyog Pawar                     Creation
364*c83a76b0SSuyog Pawar *****************************************************************************/
change_vbr_vbv_frame_rate(vbr_storage_vbv_t * ps_vbr_storage_vbv,WORD32 i4_frm_rate)365*c83a76b0SSuyog Pawar void change_vbr_vbv_frame_rate(vbr_storage_vbv_t *ps_vbr_storage_vbv, WORD32 i4_frm_rate)
366*c83a76b0SSuyog Pawar {
367*c83a76b0SSuyog Pawar     /* Calculate the max number of bits that flow into the decoder
368*c83a76b0SSuyog Pawar     in the interval of two frames */
369*c83a76b0SSuyog Pawar     X_PROD_Y_DIV_Z(
370*c83a76b0SSuyog Pawar         ps_vbr_storage_vbv->i4_max_bit_rate,
371*c83a76b0SSuyog Pawar         1000,
372*c83a76b0SSuyog Pawar         i4_frm_rate,
373*c83a76b0SSuyog Pawar         ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period);
374*c83a76b0SSuyog Pawar 
375*c83a76b0SSuyog Pawar     /* update the lower modules */
376*c83a76b0SSuyog Pawar     change_frm_rate_in_error_bits(ps_vbr_storage_vbv->ps_error_bits, i4_frm_rate);
377*c83a76b0SSuyog Pawar     /* Storing the input values */
378*c83a76b0SSuyog Pawar     ps_vbr_storage_vbv->i4_max_frame_rate = i4_frm_rate;
379*c83a76b0SSuyog Pawar }
380*c83a76b0SSuyog Pawar /******************************************************************************
381*c83a76b0SSuyog Pawar   Function Name   : change_vbr_vbv_bit_rate
382*c83a76b0SSuyog Pawar   Description     :
383*c83a76b0SSuyog Pawar   Arguments       : ps_vbr_storage_vbv
384*c83a76b0SSuyog Pawar   Return Values   : void
385*c83a76b0SSuyog Pawar   Revision History:
386*c83a76b0SSuyog Pawar                     Creation
387*c83a76b0SSuyog Pawar *****************************************************************************/
change_vbr_vbv_bit_rate(vbr_storage_vbv_t * ps_vbr_storage_vbv,WORD32 i4_max_bit_rate)388*c83a76b0SSuyog Pawar void change_vbr_vbv_bit_rate(vbr_storage_vbv_t *ps_vbr_storage_vbv, WORD32 i4_max_bit_rate)
389*c83a76b0SSuyog Pawar {
390*c83a76b0SSuyog Pawar     /* Calculate the max number of bits that flow into the decoder
391*c83a76b0SSuyog Pawar     in the interval of two frames */
392*c83a76b0SSuyog Pawar     X_PROD_Y_DIV_Z(
393*c83a76b0SSuyog Pawar         i4_max_bit_rate,
394*c83a76b0SSuyog Pawar         1000,
395*c83a76b0SSuyog Pawar         ps_vbr_storage_vbv->i4_max_frame_rate,
396*c83a76b0SSuyog Pawar         ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period);
397*c83a76b0SSuyog Pawar 
398*c83a76b0SSuyog Pawar     /* update the lower modules */
399*c83a76b0SSuyog Pawar     change_bitrate_in_error_bits(ps_vbr_storage_vbv->ps_error_bits, i4_max_bit_rate);
400*c83a76b0SSuyog Pawar 
401*c83a76b0SSuyog Pawar     /* Storing the input values */
402*c83a76b0SSuyog Pawar     ps_vbr_storage_vbv->i4_max_bit_rate = i4_max_bit_rate;
403*c83a76b0SSuyog Pawar }
404*c83a76b0SSuyog Pawar #endif /* #if NON_STEADSTATE_CODE */
405