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