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 /****************************************************************************** 24 VBR STORAGE (VBV): 25 Max. buffer filling rate: Rmax 26 Max. buffer size: Bmax (as specified by level and profile) 27 Current Buffer Level: Bcur 28 Frame Rate: F 29 30 For a storage scenario, the initial buffer size is assumed to be max. For every 31 frame the Maximum bits filled in to the buffer is given by Rmaxfrm = Rmax/F. If 32 the 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 58 Overflow Scenario: In VBR case, since we have only a max filling rate (or input bit rate) 59 buffer overflow is not a issue (since the buffer filling rate can be reduced to any value 60 below this rate) 61 62 Underflow Scenario: B'(i) should always be > 0. If not then, the buffer underflows. To 63 prevent this condition the number bits that needs to be decoded must be equal to B"(i) 64 which is equal to Min( Bmax, B'(i-1) + Rmaxfrm) 65 ****************************************************************************************/ 66 67 typedef struct vbr_storage_vbv_t* vbr_storage_vbv_handle; 68 69 WORD32 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 */ 74 void 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 */ 80 void 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 */ 84 WORD32 irc_get_max_target_bits(vbr_storage_vbv_handle ps_vbr_storage_vbv); 85 86 WORD32 irc_get_max_bits_inflow_per_frm_periode(vbr_storage_vbv_handle ps_vbr_storage_vbv); 87 88 WORD32 irc_get_max_bits_per_tgt_frm(vbr_storage_vbv_handle ps_vbr_storage_vbv); 89 90 WORD32 irc_get_cur_vbv_buf_size(vbr_storage_vbv_handle ps_vbr_storage_vbv); 91 92 /* Queries the VBV buffer for the buffer status */ 93 vbv_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 97 UWORD8 irc_restrict_swing_dvd_comp(vbr_storage_vbv_handle ps_vbr_storage_vbv); 98 99 WORD32 irc_get_max_vbv_buf_size(vbr_storage_vbv_handle ps_vbr_storage_vbv); 100 101 WORD32 irc_vbv_get_vbv_buf_fullness(vbr_storage_vbv_handle ps_vbr_storage_vbv, 102 UWORD32 u4_bits); 103 104 WORD32 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 */ 110 void irc_change_vbr_vbv_bit_rate(vbr_storage_vbv_handle ps_vbr_storage_vbv, 111 WORD32 i4_max_bit_rate); 112 113 void irc_change_vbr_vbv_frame_rate(vbr_storage_vbv_handle ps_vbr_storage_vbv, 114 WORD32 i4_frm_rate); 115 116 void 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