xref: /aosp_15_r20/external/libhevc/encoder/rc_common.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 rc_common.h
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    This file contains common macro used by rate control module
26*c83a76b0SSuyog Pawar *
27*c83a76b0SSuyog Pawar * \date
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * \author
30*c83a76b0SSuyog Pawar *    ittiam
31*c83a76b0SSuyog Pawar *
32*c83a76b0SSuyog Pawar ******************************************************************************
33*c83a76b0SSuyog Pawar */
34*c83a76b0SSuyog Pawar #ifndef _RC_COMMON_H_
35*c83a76b0SSuyog Pawar #define _RC_COMMON_H_
36*c83a76b0SSuyog Pawar 
37*c83a76b0SSuyog Pawar /*****************************************************************************/
38*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar /****************************************************************************
41*c83a76b0SSuyog Pawar    NOTE : Put only those things into this file which are common across many
42*c83a76b0SSuyog Pawar           files, say I_TO_P_BIT_RATIO macro is used across bit_allocation.c
43*c83a76b0SSuyog Pawar           and rate_control_api.c.If anything is exclusive only to one file,
44*c83a76b0SSuyog Pawar           define it in the same file
45*c83a76b0SSuyog Pawar 
46*c83a76b0SSuyog Pawar           This file is an RC private file. It should not be exported to Codec
47*c83a76b0SSuyog Pawar  ****************************************************************************/
48*c83a76b0SSuyog Pawar 
49*c83a76b0SSuyog Pawar /* Defines the maximum and the minimum quantizer allowed in the stream.*/
50*c83a76b0SSuyog Pawar #define MAX_MPEG2_QP (4095) /*255*/ /* 127*/
51*c83a76b0SSuyog Pawar #define ERR_2PASS_DISTR_GOP 5
52*c83a76b0SSuyog Pawar 
53*c83a76b0SSuyog Pawar #define ENABLE_SSD_CALC_RC 0
54*c83a76b0SSuyog Pawar 
55*c83a76b0SSuyog Pawar #ifdef ARM9
56*c83a76b0SSuyog Pawar /* Mem tab alignment to 4 bytes  */
57*c83a76b0SSuyog Pawar #define MEM_TAB_ALIGNMENT 32 /*ALIGN_WORD32*/
58*c83a76b0SSuyog Pawar #else /* ARM968 */
59*c83a76b0SSuyog Pawar /* Mem tab alignment to 128 bytes  */
60*c83a76b0SSuyog Pawar #define MEM_TAB_ALIGNMENT ALIGN_128_BYTE
61*c83a76b0SSuyog Pawar #endif /* ARM968 */
62*c83a76b0SSuyog Pawar 
63*c83a76b0SSuyog Pawar #define COMP_TO_BITS_MAP(X, factor)                                                                \
64*c83a76b0SSuyog Pawar     ((-1.7561f * (X * X * X * X) + (2.5547f * X * X * X) - 0.3408f * (X * X) + (0.5343f * X) -     \
65*c83a76b0SSuyog Pawar       0.003f) *                                                                                    \
66*c83a76b0SSuyog Pawar      factor)
67*c83a76b0SSuyog Pawar 
68*c83a76b0SSuyog Pawar #define COMP_TO_BITS_MAP_2_PASS(X, factor)                                                         \
69*c83a76b0SSuyog Pawar     ((-1.7561f * (X * X * X * X) + (2.5547f * X * X * X) - 0.3408f * (X * X) + (0.5343f * X) -     \
70*c83a76b0SSuyog Pawar       0.003f) *                                                                                    \
71*c83a76b0SSuyog Pawar      factor)
72*c83a76b0SSuyog Pawar /* Calculates P = (X*Y/Z) (Assuming all the four are in integers)*/
73*c83a76b0SSuyog Pawar #define X_PROD_Y_DIV_Z(X1, Y1, Z1, P1)                                                             \
74*c83a76b0SSuyog Pawar     {                                                                                              \
75*c83a76b0SSuyog Pawar         number_t vq_a, vq_b, vq_c;                                                                 \
76*c83a76b0SSuyog Pawar         SET_VAR_Q(vq_a, (X1), 0);                                                                  \
77*c83a76b0SSuyog Pawar         SET_VAR_Q(vq_b, (Y1), 0);                                                                  \
78*c83a76b0SSuyog Pawar         SET_VAR_Q(vq_c, (Z1), 0);                                                                  \
79*c83a76b0SSuyog Pawar         mult32_var_q(vq_a, vq_b, &vq_a);                                                           \
80*c83a76b0SSuyog Pawar         div32_var_q(vq_a, vq_c, &vq_a);                                                            \
81*c83a76b0SSuyog Pawar         number_t_to_word32(vq_a, &(P1));                                                           \
82*c83a76b0SSuyog Pawar     }
83*c83a76b0SSuyog Pawar 
84*c83a76b0SSuyog Pawar /* Maximum number of drain-rates supported. Currently a maximum of only 2
85*c83a76b0SSuyog Pawar    drain-rates supported. One for
86*c83a76b0SSuyog Pawar    I pictures and the other for P & B pictures */
87*c83a76b0SSuyog Pawar #define MAX_NUM_DRAIN_RATES 2
88*c83a76b0SSuyog Pawar 
89*c83a76b0SSuyog Pawar /* The ratios between I to P and P to B Qp is specified here */
90*c83a76b0SSuyog Pawar #define K_Q 4
91*c83a76b0SSuyog Pawar #define I_TO_P_RATIO (18) /*(16)*/ /* In K_Q Q factor */
92*c83a76b0SSuyog Pawar #define P_TO_B_RATIO (18) /* In K_Q Q factor */
93*c83a76b0SSuyog Pawar #define B_TO_B1_RATIO (18)
94*c83a76b0SSuyog Pawar #define B1_TO_B2_RATIO (18)
95*c83a76b0SSuyog Pawar #define P_TO_I_RATIO (14)
96*c83a76b0SSuyog Pawar #define I_TO_B_RATIO ((P_TO_B_RATIO * I_TO_P_RATIO) >> K_Q)
97*c83a76b0SSuyog Pawar #define I_TO_B1_RATIO ((B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q))
98*c83a76b0SSuyog Pawar #define I_TO_B2_RATIO                                                                              \
99*c83a76b0SSuyog Pawar     ((B1_TO_B2_RATIO * B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q + K_Q))
100*c83a76b0SSuyog Pawar 
101*c83a76b0SSuyog Pawar #define P_TO_B_RATIO_HBR (16)
102*c83a76b0SSuyog Pawar #define I_TO_P_RATIO_LOW_MOTION (20)
103*c83a76b0SSuyog Pawar #define I_TO_P_RATIO_VLOW_MOTION (23)
104*c83a76b0SSuyog Pawar #define I_TO_P_RATIO_VVLOW_MOTION (26)
105*c83a76b0SSuyog Pawar 
106*c83a76b0SSuyog Pawar /* #define I_TO_P_RATIO (16)  In K_Q Q factor */
107*c83a76b0SSuyog Pawar /* #define P_TO_B_RATIO (16)  In K_Q Q factor */
108*c83a76b0SSuyog Pawar 
109*c83a76b0SSuyog Pawar /*Ratio of I frame bit consumptin vs average bit consumption for rest of the GOP
110*c83a76b0SSuyog Pawar  * This is based on experimaental runs over different seqience(same resolution scaled)*/
111*c83a76b0SSuyog Pawar #define I_TO_AVG_REST_GOP_BIT (8)
112*c83a76b0SSuyog Pawar #define MINIMUM_VISIBILITY_B4_STATIC_I                                                             \
113*c83a76b0SSuyog Pawar     (18)  //assumes this minimum lap window for bit allocation of static frame
114*c83a76b0SSuyog Pawar #define MINIMUM_FRM_I_TO_REST_LAP_ENABLED (8)
115*c83a76b0SSuyog Pawar #define I_TO_AVG_REST_GOP_BIT_MIN (1)
116*c83a76b0SSuyog Pawar #define I_TO_AVG_REST_GOP_BIT_MAX (20)
117*c83a76b0SSuyog Pawar #define I_TO_AVG_REST_GOP_BIT_MAX_INFINITE (80)
118*c83a76b0SSuyog Pawar #define I_TO_AVG_REST_GOP_BIT_MAX_2_PASS (40)
119*c83a76b0SSuyog Pawar #define I_TO_AVG_REST_GOP_BIT_MIN_2_PASS (0.5f)
120*c83a76b0SSuyog Pawar 
121*c83a76b0SSuyog Pawar #define UPPER_THRESHOLD_EBF_Q4 (15)
122*c83a76b0SSuyog Pawar #define STATIC_I_TO_REST_MULTIPLIER (6)
123*c83a76b0SSuyog Pawar 
124*c83a76b0SSuyog Pawar /*also present in encoder herader file with same name*/
125*c83a76b0SSuyog Pawar #define MAX_LAP_COMPLEXITY_Q7 (90)
126*c83a76b0SSuyog Pawar #define DEFAULT_TEX_PERCENTAGE_Q5 24
127*c83a76b0SSuyog Pawar 
128*c83a76b0SSuyog Pawar #ifdef DISABLE_NON_STEADY_STATE_CODE
129*c83a76b0SSuyog Pawar #define NON_STEADSTATE_CODE (0)
130*c83a76b0SSuyog Pawar #else
131*c83a76b0SSuyog Pawar #define NON_STEADSTATE_CODE (1)
132*c83a76b0SSuyog Pawar #endif
133*c83a76b0SSuyog Pawar 
134*c83a76b0SSuyog Pawar /*HEVC_hierarchy*/
135*c83a76b0SSuyog Pawar #define I_TO_P_BIT_RATIO (6)
136*c83a76b0SSuyog Pawar #define P_TO_B_BIT_RATIO (2)
137*c83a76b0SSuyog Pawar #define B_TO_B1_BIT_RATO0 (2)
138*c83a76b0SSuyog Pawar #define B1_TO_B2_BIT_RATIO (2)
139*c83a76b0SSuyog Pawar 
140*c83a76b0SSuyog Pawar /*define static I_TO_P ratio for all pic types*/
141*c83a76b0SSuyog Pawar /* Trying to detect a static content and fixing the quality for that content. The trigger for such a
142*c83a76b0SSuyog Pawar content is if the ratio between the estimated I frame to that of P is more than 18 times. If such
143*c83a76b0SSuyog Pawar a simple content is detected then the bit ditribution is fixed to a ration of 36:2:1 (I:P:B) */
144*c83a76b0SSuyog Pawar #define STATIC_I_TO_B2_RATIO (100)  //(24)
145*c83a76b0SSuyog Pawar #define STATIC_P_TO_B2_RATIO (2)
146*c83a76b0SSuyog Pawar #define STATIC_B_TO_B2_RATIO (1)
147*c83a76b0SSuyog Pawar #define STATIC_B1_TO_B2_RATIO (1)
148*c83a76b0SSuyog Pawar 
149*c83a76b0SSuyog Pawar /*Fsim limits*/
150*c83a76b0SSuyog Pawar #define RC_FSIM_LOW_THR_SCD 64
151*c83a76b0SSuyog Pawar 
152*c83a76b0SSuyog Pawar #define RC_FSIM_HIGH_THR_STATIC 115
153*c83a76b0SSuyog Pawar 
154*c83a76b0SSuyog Pawar #endif /* _RC_COMMON_H_ */
155