xref: /aosp_15_r20/external/libhevc/encoder/cbr_buffer_control.h (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 cbr_buffer_control.h
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    This file contains all the necessary declarations for
26*c83a76b0SSuyog Pawar *    cbr_buffer_control functions
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * \date
29*c83a76b0SSuyog Pawar * 06/05/2008
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * \author
32*c83a76b0SSuyog Pawar *    ittiam
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar ******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar #ifndef CBR_BUFFER_CONTROL_H
37*c83a76b0SSuyog Pawar #define CBR_BUFFER_CONTROL_H
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar /*  Macros                                                           */
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar /* Macro for clipping a number between to extremes */
43*c83a76b0SSuyog Pawar #define CLIP(Number, Max, Min)                                                                     \
44*c83a76b0SSuyog Pawar     if((Number) > (Max))                                                                           \
45*c83a76b0SSuyog Pawar         (Number) = (Max);                                                                          \
46*c83a76b0SSuyog Pawar     else if((Number) < (Min))                                                                      \
47*c83a76b0SSuyog Pawar         (Number) = (Min);
48*c83a76b0SSuyog Pawar /*****************************************************************************/
49*c83a76b0SSuyog Pawar /* Structure                                                                 */
50*c83a76b0SSuyog Pawar /*****************************************************************************/
51*c83a76b0SSuyog Pawar typedef struct cbr_buffer_t *cbr_buffer_handle;
52*c83a76b0SSuyog Pawar 
53*c83a76b0SSuyog Pawar /*****************************************************************************/
54*c83a76b0SSuyog Pawar /* Function Declarations                                                     */
55*c83a76b0SSuyog Pawar /*****************************************************************************/
56*c83a76b0SSuyog Pawar WORD32 cbr_buffer_num_fill_use_free_memtab(
57*c83a76b0SSuyog Pawar     cbr_buffer_handle *pps_cbr_buffer, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type);
58*c83a76b0SSuyog Pawar /* Initialize the cbr Buffer*/
59*c83a76b0SSuyog Pawar void init_cbr_buffer(
60*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer,
61*c83a76b0SSuyog Pawar     WORD32 i4_buffer_delay,
62*c83a76b0SSuyog Pawar     WORD32 i4_tgt_frm_rate,
63*c83a76b0SSuyog Pawar     UWORD32 u4_bit_rate,
64*c83a76b0SSuyog Pawar     UWORD32 *u4_num_pics_in_delay_prd,
65*c83a76b0SSuyog Pawar     UWORD32 u4_vbv_buf_size,
66*c83a76b0SSuyog Pawar     UWORD32 u4_intra_frm_int,
67*c83a76b0SSuyog Pawar     rc_type_e u4_rc_type,
68*c83a76b0SSuyog Pawar     UWORD32 u4_peak_bit_rate,
69*c83a76b0SSuyog Pawar     UWORD32 u4_num_frames_in_delay,
70*c83a76b0SSuyog Pawar     float f_max_peak_rate_dur,
71*c83a76b0SSuyog Pawar     LWORD64 i8_num_frames_to_encode,
72*c83a76b0SSuyog Pawar     WORD32 i4_inter_frm_int,
73*c83a76b0SSuyog Pawar     WORD32 i4_cbr_rc_pass,
74*c83a76b0SSuyog Pawar     WORD32 i4_capped_vbr_flag);
75*c83a76b0SSuyog Pawar 
76*c83a76b0SSuyog Pawar /* Check for tgt bits with in CBR buffer*/
77*c83a76b0SSuyog Pawar WORD32 cbr_buffer_constraint_check(
78*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer,
79*c83a76b0SSuyog Pawar     WORD32 i4_tgt_bits,
80*c83a76b0SSuyog Pawar     picture_type_e e_pic_type,
81*c83a76b0SSuyog Pawar     WORD32 *pi4_max_tgt_bits,
82*c83a76b0SSuyog Pawar     WORD32 *pi4_min_tgt_bits);
83*c83a76b0SSuyog Pawar 
84*c83a76b0SSuyog Pawar /* Get the buffer status with the current consumed bits*/
85*c83a76b0SSuyog Pawar vbv_buf_status_e get_cbr_buffer_status(
86*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer,
87*c83a76b0SSuyog Pawar     WORD32 i4_tot_consumed_bits,
88*c83a76b0SSuyog Pawar     WORD32 *pi4_num_bits_to_prevent_overflow,
89*c83a76b0SSuyog Pawar     picture_type_e e_pic_type,
90*c83a76b0SSuyog Pawar     rc_type_e e_rc_type);
91*c83a76b0SSuyog Pawar 
92*c83a76b0SSuyog Pawar /* Update the CBR buffer at the end of the VOP*/
93*c83a76b0SSuyog Pawar void update_cbr_buffer(
94*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer, WORD32 i4_tot_consumed_bits, picture_type_e e_pic_type);
95*c83a76b0SSuyog Pawar 
96*c83a76b0SSuyog Pawar /*Get the bits needed to stuff in case of Underflow*/
97*c83a76b0SSuyog Pawar WORD32 get_cbr_bits_to_stuff(
98*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer, WORD32 i4_tot_consumed_bits, picture_type_e e_pic_type);
99*c83a76b0SSuyog Pawar WORD32 get_cbr_buffer_delay(cbr_buffer_handle ps_cbr_buffer);
100*c83a76b0SSuyog Pawar WORD32 get_cbr_buffer_size(cbr_buffer_handle ps_cbr_buffer);
101*c83a76b0SSuyog Pawar WORD32 get_cbr_ebf(cbr_buffer_handle ps_cbr_buffer);
102*c83a76b0SSuyog Pawar WORD32 get_cbr_max_ebf(cbr_buffer_handle ps_cbr_buffer);
103*c83a76b0SSuyog Pawar void update_cbr_buf_mismatch_bit(cbr_buffer_handle ps_cbr_buffer, WORD32 i4_error_bits);
104*c83a76b0SSuyog Pawar 
105*c83a76b0SSuyog Pawar WORD32 get_error_bits_for_desired_buf(
106*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer, WORD32 i4_lap_complexity_q7, WORD32 i4_bit_alloc_period);
107*c83a76b0SSuyog Pawar 
108*c83a76b0SSuyog Pawar WORD32 get_buf_max_drain_rate(cbr_buffer_handle ps_cbr_buffer);
109*c83a76b0SSuyog Pawar 
110*c83a76b0SSuyog Pawar WORD32 vbr_stream_buffer_constraint_check(
111*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer,
112*c83a76b0SSuyog Pawar     WORD32 i4_tgt_bits,
113*c83a76b0SSuyog Pawar     picture_type_e e_pic_type,
114*c83a76b0SSuyog Pawar     WORD32 *pi4_max_tgt_bits,
115*c83a76b0SSuyog Pawar     WORD32 *pi4_min_tgt_bits);
116*c83a76b0SSuyog Pawar 
117*c83a76b0SSuyog Pawar void change_cbr_vbv_bit_rate(
118*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer, WORD32 *i4_bit_rate, WORD32 i4_peak_bitrate);
119*c83a76b0SSuyog Pawar void change_cbr_vbv_tgt_frame_rate(cbr_buffer_handle ps_cbr_buffer, WORD32 i4_tgt_frm_rate);
120*c83a76b0SSuyog Pawar void change_cbr_vbv_num_pics_in_delay_period(
121*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer, UWORD32 *u4_num_pics_in_delay_prd);
122*c83a76b0SSuyog Pawar void change_cbr_buffer_delay(cbr_buffer_handle ps_cbr_buffer, WORD32 i4_buffer_delay);
123*c83a76b0SSuyog Pawar void set_cbr_ebf(cbr_buffer_handle ps_cbr_buffer, WORD32 i32_init_ebf);
124*c83a76b0SSuyog Pawar LWORD64 get_num_frms_encoded(cbr_buffer_handle ps_cbr_buffer);
125*c83a76b0SSuyog Pawar 
126*c83a76b0SSuyog Pawar LWORD64 get_num_frms_to_encode(cbr_buffer_handle ps_cbr_buffer);
127*c83a76b0SSuyog Pawar 
128*c83a76b0SSuyog Pawar WORD32 get_vbv_buffer_based_excess(
129*c83a76b0SSuyog Pawar     cbr_buffer_handle ps_cbr_buffer,
130*c83a76b0SSuyog Pawar     float f_complexity_peak_rate,
131*c83a76b0SSuyog Pawar     float f_cur_bits_complexity,
132*c83a76b0SSuyog Pawar     WORD32 bit_alloc_period,
133*c83a76b0SSuyog Pawar     WORD32 i4_num_gops_for_excess);
134*c83a76b0SSuyog Pawar 
135*c83a76b0SSuyog Pawar rc_type_e get_rc_type(cbr_buffer_handle ps_cbr_buffer);
136*c83a76b0SSuyog Pawar 
137*c83a76b0SSuyog Pawar void cbr_modify_ebf_estimate(cbr_buffer_handle ps_cbr_buffer, WORD32 i4_bit_error);
138*c83a76b0SSuyog Pawar 
139*c83a76b0SSuyog Pawar UWORD32 cbr_get_delay_frames(cbr_buffer_handle ps_cbr_buffer);
140*c83a76b0SSuyog Pawar #endif /* CBR_BUFFER_CONTROL_H */
141