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#ifndef _VBR_STORAGE_VBV_H_
22#define _VBR_STORAGE_VBV_H_
23/******************************************************************************
24VBR STORAGE (VBV):
25Max. buffer filling rate: Rmax
26Max. buffer size: Bmax (as specified by level and profile)
27Current Buffer Level: Bcur
28Frame Rate: F
29
30For a storage scenario, the initial buffer size is assumed to be max. For every
31frame the Maximum bits filled in to the buffer is given by Rmaxfrm = Rmax/F. If
32the buffer overflows then the buffer is thresholded to the max buffer size.
33
34               (overflow)
35   B(0)            /|
36---|--------------/-|------------------------------ Bmax
37   |             /  |
38   |          /|/   |
39   |  /|     /      |
40   | / |  /|/       |
41   |/  | /          | /|
42       |/           |/ |
43                       |
44                       |
45-----------------------|---------------------------
46   |<->|               |
47(1/F)=>1/frame_rate (underflow)
48
49
50   B"(i) - Bits in buffer just before decoding a frame.
51   B'(i) - Bits in buffer just after decoding a frame.
52
53
54   B(0) (initBuffer size) = Bmax.
55   B'(i) = B"(i) - bits_decoded
56   B"(i) = Min( Bmax, B'(i-1) + Rmaxfrm)
57
58Overflow Scenario: In VBR case, since we have only a max filling rate (or input bit rate)
59buffer overflow is not a issue (since the buffer filling rate can be reduced to any value
60below this rate)
61
62Underflow Scenario: B'(i) should always be > 0. If not then, the buffer underflows. To
63prevent this condition the number bits that needs to be decoded must be equal to B"(i)
64which is equal to Min( Bmax, B'(i-1) + Rmaxfrm)
65****************************************************************************************/
66
67typedef struct vbr_storage_vbv_t* vbr_storage_vbv_handle;
68
69WORD32 irc_vbr_vbv_num_fill_use_free_memtab(vbr_storage_vbv_handle *pps_vbr_storage_vbv,
70                                            itt_memtab_t *ps_memtab,
71                                            ITT_FUNC_TYPE_E e_func_type);
72
73/* Initalises the vbv buffer status */
74void irc_init_vbr_vbv(vbr_storage_vbv_handle ps_vbr_storage_vbv,
75                      WORD32 max_bit_rate, /* In bits/sec*/
76                      WORD32 max_frm_rate, /* In frames/1000 sec*/
77                      WORD32 i4_max_vbv_buff_size); /* in bits*/
78
79/* Updates the buffer after decoding a frame */
80void irc_update_vbr_vbv(vbr_storage_vbv_handle ps_vbr_storage_vbv,
81                        WORD32 i4_total_bits_decoded);
82
83/* gets the max_number of bits that can be decoded out of the VBV without underflow */
84WORD32 irc_get_max_target_bits(vbr_storage_vbv_handle ps_vbr_storage_vbv);
85
86WORD32 irc_get_max_bits_inflow_per_frm_periode(vbr_storage_vbv_handle ps_vbr_storage_vbv);
87
88WORD32 irc_get_max_bits_per_tgt_frm(vbr_storage_vbv_handle ps_vbr_storage_vbv);
89
90WORD32 irc_get_cur_vbv_buf_size(vbr_storage_vbv_handle ps_vbr_storage_vbv);
91
92/* Queries the VBV buffer for the buffer status */
93vbv_buf_status_e irc_get_vbv_buffer_status(vbr_storage_vbv_handle ps_vbr_storage_vbv,
94                                           WORD32 i4_total_frame_bits,
95                                           WORD32 *pi4_num_bits_to_prevent_vbv_underflow);
96
97UWORD8 irc_restrict_swing_dvd_comp(vbr_storage_vbv_handle ps_vbr_storage_vbv);
98
99WORD32 irc_get_max_vbv_buf_size(vbr_storage_vbv_handle ps_vbr_storage_vbv);
100
101WORD32 irc_vbv_get_vbv_buf_fullness(vbr_storage_vbv_handle ps_vbr_storage_vbv,
102                                    UWORD32 u4_bits);
103
104WORD32 irc_get_max_tgt_bits_dvd_comp(vbr_storage_vbv_handle ps_vbr_storage_vbv,
105                                     WORD32 i4_rem_bits_in_gop,
106                                     WORD32 i4_rem_frms_in_gop,
107                                     picture_type_e e_pic_type);
108
109/* Changing input values at run time */
110void irc_change_vbr_vbv_bit_rate(vbr_storage_vbv_handle ps_vbr_storage_vbv,
111                                 WORD32 i4_max_bit_rate);
112
113void irc_change_vbr_vbv_frame_rate(vbr_storage_vbv_handle ps_vbr_storage_vbv,
114                                   WORD32 i4_frm_rate);
115
116void irc_change_vbr_max_bits_per_tgt_frm(vbr_storage_vbv_handle ps_vbr_storage_vbv,
117                                         WORD32 i4_tgt_frm_rate);
118#endif
119
120