irc_vbr_storage_vbv.c revision a2b49e5f0574dee76f81507f288143d83a4b7c1a
1/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20
21/*****************************************************************************/
22/* Includes */
23/*****************************************************************************/
24
25/* System include files */
26#include <stdio.h>
27
28/* User include files */
29#include "irc_datatypes.h"
30#include "irc_common.h"
31#include "irc_cntrl_param.h"
32#include "irc_mem_req_and_acq.h"
33#include "irc_fixed_point_error_bits.h"
34#include "irc_vbr_storage_vbv.h"
35#include "irc_trace_support.h"
36
37#define MAX(x, y)  ((x) > (y) ? (x) : (y))
38
39typedef struct vbr_storage_vbv_t
40{
41    WORD32 i4_max_buf_size;
42    WORD32 i4_cur_buf_size;
43    WORD32 i4_max_bits_inflow_per_frm_period;
44    WORD32 i4_max_bits_per_tgt_frm;
45    /* Storing input variables */
46    WORD32 i4_max_bit_rate;
47    WORD32 i4_max_frame_rate;
48    /* Error bits calculation module */
49    error_bits_handle ps_error_bits;
50
51} vbr_storage_vbv_t;
52
53static void overflow_avoided_summation(WORD32 *pi4_accumulator, WORD32 i4_input)
54{
55    if((pi4_accumulator[0] > 0)
56                    && (((int)0x7fffffff - pi4_accumulator[0]) < i4_input))
57    {
58        pi4_accumulator[0] = 0x7fffffff;
59    }
60    else if((pi4_accumulator[0] < 0)
61                    && (((int)0x80000000 - pi4_accumulator[0]) > i4_input))
62    {
63        pi4_accumulator[0] = 0x80000000;
64    }
65    else
66    {
67        pi4_accumulator[0] += i4_input;
68    }
69}
70
71WORD32 irc_vbr_vbv_num_fill_use_free_memtab(vbr_storage_vbv_t **pps_vbr_storage_vbv,
72                                            itt_memtab_t *ps_memtab,
73                                            ITT_FUNC_TYPE_E e_func_type)
74{
75    WORD32 i4_mem_tab_idx = 0;
76    static vbr_storage_vbv_t s_vbr_storage_vbv_temp;
77
78    /*
79     * Hack for al alloc, during which we don't have any state memory.
80     * Dereferencing can cause issues
81     */
82    if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
83        (*pps_vbr_storage_vbv) = &s_vbr_storage_vbv_temp;
84
85    /*for src rate control state structure*/
86    if(e_func_type != GET_NUM_MEMTAB)
87    {
88        fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(vbr_storage_vbv_t),
89                    ALIGN_128_BYTE, PERSISTENT, DDR);
90        use_or_fill_base(&ps_memtab[0], (void**)pps_vbr_storage_vbv,
91                         e_func_type);
92    }
93    i4_mem_tab_idx++;
94
95    i4_mem_tab_idx += irc_error_bits_num_fill_use_free_memtab(
96                    &pps_vbr_storage_vbv[0]->ps_error_bits,
97                    &ps_memtab[i4_mem_tab_idx], e_func_type);
98    return (i4_mem_tab_idx);
99}
100
101void irc_init_vbr_vbv(vbr_storage_vbv_t *ps_vbr_storage_vbv,
102                      WORD32 i4_max_bit_rate,
103                      WORD32 i4_frm_rate,
104                      WORD32 i4_max_vbv_buff_size)
105{
106    ps_vbr_storage_vbv->i4_max_buf_size = i4_max_vbv_buff_size;
107    ps_vbr_storage_vbv->i4_cur_buf_size = i4_max_vbv_buff_size;
108
109    /*
110     * Calculate the max number of bits that flow into the decoder
111     * in the interval of two frames
112     */
113    X_PROD_Y_DIV_Z(i4_max_bit_rate, 1000, i4_frm_rate,
114                   ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period);
115
116    /* init error bits */
117    irc_init_error_bits(ps_vbr_storage_vbv->ps_error_bits, i4_frm_rate,
118                        i4_max_bit_rate);
119
120    /* Storing the input values */
121    ps_vbr_storage_vbv->i4_max_bits_per_tgt_frm =
122                    ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period;
123    ps_vbr_storage_vbv->i4_max_bit_rate = i4_max_bit_rate;
124    ps_vbr_storage_vbv->i4_max_frame_rate = i4_frm_rate;
125}
126
127void irc_update_vbr_vbv(vbr_storage_vbv_t *ps_vbr_storage_vbv,
128                        WORD32 i4_total_bits_decoded)
129{
130    WORD32 i4_error_bits = irc_get_error_bits(
131                    ps_vbr_storage_vbv->ps_error_bits);
132    /*
133     * In the time interval between two decoded frames the buffer would have been
134     * filled up by the max_bits_inflow_per_frm_period.
135     */
136    overflow_avoided_summation(
137                    &ps_vbr_storage_vbv->i4_cur_buf_size,
138                    (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period
139                                    + i4_error_bits));
140
141    if(ps_vbr_storage_vbv->i4_cur_buf_size
142                    > ps_vbr_storage_vbv->i4_max_buf_size)
143    {
144        ps_vbr_storage_vbv->i4_cur_buf_size =
145                        ps_vbr_storage_vbv->i4_max_buf_size;
146    }
147
148    ps_vbr_storage_vbv->i4_cur_buf_size -= i4_total_bits_decoded;
149
150    /* Update the error bits state */
151    irc_update_error_bits(ps_vbr_storage_vbv->ps_error_bits);
152
153}
154
155WORD32 irc_get_max_target_bits(vbr_storage_vbv_t *ps_vbr_storage_vbv)
156{
157    WORD32 i4_cur_buf_size = ps_vbr_storage_vbv->i4_cur_buf_size;
158    WORD32 i4_error_bits = irc_get_error_bits(
159                    ps_vbr_storage_vbv->ps_error_bits);
160
161    /* The buffer size when the next frame is decoded */
162    overflow_avoided_summation(
163                    &i4_cur_buf_size,
164                    (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period
165                                    + i4_error_bits));
166    if(i4_cur_buf_size > ps_vbr_storage_vbv->i4_max_buf_size)
167    {
168        i4_cur_buf_size = ps_vbr_storage_vbv->i4_max_buf_size;
169    }
170
171    /*
172     * Thus for the next frame the maximum number of bits the decoder can consume
173     * without underflow is i4_cur_buf_size
174     */
175    return i4_cur_buf_size;
176}
177
178/****************************************************************************
179 Function Name : irc_get_buffer_status
180 Description   : Gets the state of VBV buffer
181 Inputs        : Rate control API , header and texture bits
182 Outputs       : 0 = normal, 1 = underflow, 2= overflow
183 Returns       : vbv_buf_status_e
184 *****************************************************************************/
185vbv_buf_status_e irc_get_vbv_buffer_status(vbr_storage_vbv_t *ps_vbr_storage_vbv,
186                                           WORD32 i4_total_frame_bits,
187                                           WORD32 *pi4_num_bits_to_prevent_vbv_underflow)
188{
189    vbv_buf_status_e e_buf_status;
190    WORD32 i4_cur_buf;
191    WORD32 i4_error_bits = irc_get_error_bits(
192                    ps_vbr_storage_vbv->ps_error_bits);
193
194    /* error bits due to fixed point computation of drain rate*/
195    i4_cur_buf = ps_vbr_storage_vbv->i4_cur_buf_size;
196    overflow_avoided_summation(
197                    &i4_cur_buf,
198                    (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period
199                                    + i4_error_bits));
200
201    if(i4_cur_buf > ps_vbr_storage_vbv->i4_max_buf_size)
202    {
203        i4_cur_buf = ps_vbr_storage_vbv->i4_max_buf_size;
204    }
205
206    pi4_num_bits_to_prevent_vbv_underflow[0] = i4_cur_buf;
207
208    i4_cur_buf -= i4_total_frame_bits;
209    if(i4_cur_buf < 0)
210    {
211        e_buf_status = VBV_UNDERFLOW;
212    }
213    else if(i4_cur_buf > ps_vbr_storage_vbv->i4_max_buf_size)
214    {
215        e_buf_status = VBV_OVERFLOW;
216    }
217    else if(i4_cur_buf < (ps_vbr_storage_vbv->i4_max_buf_size >> 2))
218    {
219        e_buf_status = VBR_CAUTION;
220    }
221    else
222    {
223        e_buf_status = VBV_NORMAL;
224    }
225
226    return e_buf_status;
227}
228
229UWORD8 irc_restrict_swing_dvd_comp(vbr_storage_vbv_t *ps_vbr_storage_vbv)
230{
231    UWORD8 u1_restrict_swing = 1;
232
233    if(ps_vbr_storage_vbv->i4_cur_buf_size
234                    < (ps_vbr_storage_vbv->i4_max_buf_size >> 1))
235    {
236        u1_restrict_swing = 0;
237    }
238
239    return (u1_restrict_swing);
240}
241
242WORD32 irc_get_max_vbv_buf_size(vbr_storage_vbv_t *ps_vbr_storage_vbv)
243{
244    return (ps_vbr_storage_vbv->i4_max_buf_size);
245}
246
247WORD32 irc_get_cur_vbv_buf_size(vbr_storage_vbv_t *ps_vbr_storage_vbv)
248{
249    return (ps_vbr_storage_vbv->i4_cur_buf_size);
250}
251
252WORD32 irc_get_max_bits_inflow_per_frm_periode(vbr_storage_vbv_t *ps_vbr_storage_vbv)
253{
254    return (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period);
255}
256
257WORD32 irc_get_max_bits_per_tgt_frm(vbr_storage_vbv_t *ps_vbr_storage_vbv)
258{
259    return (ps_vbr_storage_vbv->i4_max_bits_per_tgt_frm);
260}
261
262WORD32 irc_vbv_get_vbv_buf_fullness(vbr_storage_vbv_t *ps_vbr_storage_vbv,
263                                    UWORD32 u4_bits)
264{
265    WORD32 i4_error_bits = irc_get_error_bits(
266                    ps_vbr_storage_vbv->ps_error_bits);
267    WORD32 i4_cur_buf_size = ps_vbr_storage_vbv->i4_cur_buf_size;
268
269    overflow_avoided_summation(
270                    &i4_cur_buf_size,
271                    (ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period
272                                    + i4_error_bits));
273
274    if(i4_cur_buf_size > ps_vbr_storage_vbv->i4_max_buf_size)
275    {
276        i4_cur_buf_size = ps_vbr_storage_vbv->i4_max_buf_size;
277    }
278
279    i4_cur_buf_size -= u4_bits;
280
281    return (i4_cur_buf_size);
282}
283
284WORD32 irc_get_max_tgt_bits_dvd_comp(vbr_storage_vbv_t *ps_vbr_storage_vbv,
285                                     WORD32 i4_rem_bits_in_gop,
286                                     WORD32 i4_rem_frms_in_gop,
287                                     picture_type_e e_pic_type)
288{
289    WORD32 i4_dbf_max, i4_dbf_min, i4_dbf_prev, i4_vbv_size, i4_dbf_desired;
290    WORD32 i4_max_tgt_bits;
291
292    i4_vbv_size = ps_vbr_storage_vbv->i4_max_buf_size;
293    i4_dbf_max = 95 * i4_vbv_size / 100;
294    i4_dbf_min = 10 * i4_vbv_size / 100;
295    i4_dbf_prev = ps_vbr_storage_vbv->i4_cur_buf_size;
296
297    if(i4_rem_bits_in_gop < 0)
298        i4_rem_bits_in_gop = 0;
299    if(i4_rem_frms_in_gop <= 0)
300        i4_rem_frms_in_gop = 1;
301
302    if(e_pic_type == I_PIC)
303    {
304        i4_dbf_desired = i4_dbf_min;
305    }
306    else
307    {
308        i4_dbf_desired = (i4_dbf_max - i4_rem_bits_in_gop / i4_rem_frms_in_gop
309                        - i4_dbf_prev) / i4_rem_frms_in_gop;
310        i4_dbf_desired += i4_dbf_prev;
311    }
312
313    i4_dbf_prev += ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period;
314    if(i4_dbf_prev > ps_vbr_storage_vbv->i4_max_buf_size)
315    {
316        i4_dbf_prev = ps_vbr_storage_vbv->i4_max_buf_size;
317    }
318
319    i4_max_tgt_bits = MAX(0, (i4_dbf_prev - i4_dbf_desired));
320    return (i4_max_tgt_bits);
321}
322
323void irc_change_vbr_vbv_frame_rate(vbr_storage_vbv_t *ps_vbr_storage_vbv,
324                                   WORD32 i4_frm_rate)
325{
326    /*
327     * Calculate the max number of bits that flow into the decoder
328     * in the interval of two frames
329     */
330    X_PROD_Y_DIV_Z(ps_vbr_storage_vbv->i4_max_bit_rate, 1000, i4_frm_rate,
331                   ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period);
332
333    /* Update the lower modules */
334    irc_change_frm_rate_in_error_bits(ps_vbr_storage_vbv->ps_error_bits,
335                                      i4_frm_rate);
336    /* Storing the input values */
337    ps_vbr_storage_vbv->i4_max_frame_rate = i4_frm_rate;
338}
339
340void irc_change_vbr_vbv_bit_rate(vbr_storage_vbv_t *ps_vbr_storage_vbv,
341                                 WORD32 i4_max_bit_rate)
342{
343    /*
344     * Calculate the max number of bits that flow into the decoder
345     * in the interval of two frames
346     */
347    X_PROD_Y_DIV_Z(i4_max_bit_rate, 1000, ps_vbr_storage_vbv->i4_max_frame_rate,
348                   ps_vbr_storage_vbv->i4_max_bits_inflow_per_frm_period);
349
350    /* update the lower modules */
351    irc_change_bitrate_in_error_bits(ps_vbr_storage_vbv->ps_error_bits,
352                                     i4_max_bit_rate);
353
354    /* Storing the input values */
355    ps_vbr_storage_vbv->i4_max_bit_rate = i4_max_bit_rate;
356}
357
358void irc_change_vbr_max_bits_per_tgt_frm(vbr_storage_vbv_t *ps_vbr_storage_vbv,
359                                         WORD32 i4_tgt_frm_rate)
360{
361    /*
362     * Calculate the max number of bits that flow into the decoder
363     * in the interval of two frames
364     */
365    X_PROD_Y_DIV_Z(ps_vbr_storage_vbv->i4_max_bit_rate, 1000, i4_tgt_frm_rate,
366                   ps_vbr_storage_vbv->i4_max_bits_per_tgt_frm);
367
368}
369