xref: /aosp_15_r20/external/libavc/encoder/irc_common.h (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker #ifndef _RC_COMMON_H_
22*495ae853SAndroid Build Coastguard Worker #define _RC_COMMON_H_
23*495ae853SAndroid Build Coastguard Worker 
24*495ae853SAndroid Build Coastguard Worker /****************************************************************************
25*495ae853SAndroid Build Coastguard Worker  NOTE : Put only those things into this file which are common across many
26*495ae853SAndroid Build Coastguard Worker  files, say I_TO_P_BIT_RATIO macro is used across irc_bit_allocation.c
27*495ae853SAndroid Build Coastguard Worker  and irc_rate_control_api.c.If anything is exclusive only to one file,
28*495ae853SAndroid Build Coastguard Worker  define it in the same file
29*495ae853SAndroid Build Coastguard Worker 
30*495ae853SAndroid Build Coastguard Worker  This file is an RC private file. It should not be exported to Codec
31*495ae853SAndroid Build Coastguard Worker  ****************************************************************************/
32*495ae853SAndroid Build Coastguard Worker 
33*495ae853SAndroid Build Coastguard Worker #define UNUSED(x) ((void)(x))
34*495ae853SAndroid Build Coastguard Worker 
35*495ae853SAndroid Build Coastguard Worker typedef float number_t;
36*495ae853SAndroid Build Coastguard Worker 
37*495ae853SAndroid Build Coastguard Worker #define mult32_var_q(a,b,c) *c = a * b
38*495ae853SAndroid Build Coastguard Worker 
39*495ae853SAndroid Build Coastguard Worker #define div32_var_q(a,b,c) (*c = ((b == 0)? a : (a / b)))
40*495ae853SAndroid Build Coastguard Worker 
41*495ae853SAndroid Build Coastguard Worker #define add32_var_q(a,b,c) *c = a + b
42*495ae853SAndroid Build Coastguard Worker 
43*495ae853SAndroid Build Coastguard Worker #define sub32_var_q(a,b,c) *c = a - b
44*495ae853SAndroid Build Coastguard Worker 
45*495ae853SAndroid Build Coastguard Worker #define sqrt32_var_q(a, c) *c = sqrt(a)
46*495ae853SAndroid Build Coastguard Worker 
47*495ae853SAndroid Build Coastguard Worker #define number_t_to_word32(num_a, a) *a = (WORD32)num_a
48*495ae853SAndroid Build Coastguard Worker 
49*495ae853SAndroid Build Coastguard Worker #define convert_float_to_fix(a_f, a) *a = (WORD32)a_f
50*495ae853SAndroid Build Coastguard Worker 
51*495ae853SAndroid Build Coastguard Worker #define convert_fix_to_float(a, a_f) *a_f = (float) a
52*495ae853SAndroid Build Coastguard Worker 
53*495ae853SAndroid Build Coastguard Worker #define SET_VAR_Q(a,b,c) {a = (float) b;}
54*495ae853SAndroid Build Coastguard Worker 
55*495ae853SAndroid Build Coastguard Worker 
56*495ae853SAndroid Build Coastguard Worker /* Defines the maximum and the minimum quantizer allowed in the stream.*/
57*495ae853SAndroid Build Coastguard Worker #define MAX_MPEG2_QP        255 /* 127*/
58*495ae853SAndroid Build Coastguard Worker 
59*495ae853SAndroid Build Coastguard Worker /* Bits ratio between I and P frame */
60*495ae853SAndroid Build Coastguard Worker #define I_TO_P_BIT_RATIO 5
61*495ae853SAndroid Build Coastguard Worker 
62*495ae853SAndroid Build Coastguard Worker /* Calculates P = (X*Y/Z) (Assuming all the four are in integers)*/
63*495ae853SAndroid Build Coastguard Worker #define X_PROD_Y_DIV_Z(X1,Y1,Z1,P1)\
64*495ae853SAndroid Build Coastguard Worker {\
65*495ae853SAndroid Build Coastguard Worker     number_t vq_a,vq_b,vq_c;\
66*495ae853SAndroid Build Coastguard Worker     SET_VAR_Q(vq_a,(X1),0);\
67*495ae853SAndroid Build Coastguard Worker     SET_VAR_Q(vq_b,(Y1),0);\
68*495ae853SAndroid Build Coastguard Worker     SET_VAR_Q(vq_c,(Z1),0);\
69*495ae853SAndroid Build Coastguard Worker     mult32_var_q(vq_a,vq_b,&vq_a);\
70*495ae853SAndroid Build Coastguard Worker     div32_var_q(vq_a,vq_c,&vq_a);\
71*495ae853SAndroid Build Coastguard Worker     number_t_to_word32(vq_a,&(P1));\
72*495ae853SAndroid Build Coastguard Worker }
73*495ae853SAndroid Build Coastguard Worker #define VQ_A_LT_VQ_B(A,B, Z) Z = A < B;
74*495ae853SAndroid Build Coastguard Worker #define VQ_A_GT_VQ_B(A,B, Z) Z = A > B;
75*495ae853SAndroid Build Coastguard Worker 
76*495ae853SAndroid Build Coastguard Worker /* Z=MAX(A,B) where A, B  and Z are var_q variables */
77*495ae853SAndroid Build Coastguard Worker #define MAX_VARQ(A,B, Z)\
78*495ae853SAndroid Build Coastguard Worker {\
79*495ae853SAndroid Build Coastguard Worker     WORD32 a_gt_b;\
80*495ae853SAndroid Build Coastguard Worker     VQ_A_GT_VQ_B((A), (B), a_gt_b);\
81*495ae853SAndroid Build Coastguard Worker     (Z) = (a_gt_b) ? (A) : (B);\
82*495ae853SAndroid Build Coastguard Worker }
83*495ae853SAndroid Build Coastguard Worker 
84*495ae853SAndroid Build Coastguard Worker /* Z=MIN(A,B) where A, B  and Z are var_q variables */
85*495ae853SAndroid Build Coastguard Worker #define MIN_VARQ(A,B, Z)\
86*495ae853SAndroid Build Coastguard Worker {\
87*495ae853SAndroid Build Coastguard Worker     WORD32 a_lt_b;\
88*495ae853SAndroid Build Coastguard Worker     VQ_A_LT_VQ_B((A), (B), a_lt_b);\
89*495ae853SAndroid Build Coastguard Worker     (Z) = (a_lt_b) ? (A) : (B);\
90*495ae853SAndroid Build Coastguard Worker }
91*495ae853SAndroid Build Coastguard Worker 
92*495ae853SAndroid Build Coastguard Worker /* Maximum number of drain-rates supported. Currently a maximum of only 2
93*495ae853SAndroid Build Coastguard Worker  drain-rates supported. One for
94*495ae853SAndroid Build Coastguard Worker  I pictures and the other for P & B pictures */
95*495ae853SAndroid Build Coastguard Worker #define MAX_NUM_DRAIN_RATES 2
96*495ae853SAndroid Build Coastguard Worker 
97*495ae853SAndroid Build Coastguard Worker /* The ratios between I to P and P to B Qp is specified here */
98*495ae853SAndroid Build Coastguard Worker #define K_Q 4
99*495ae853SAndroid Build Coastguard Worker #define I_TO_P_RATIO (19) /* In K_Q Q factor */
100*495ae853SAndroid Build Coastguard Worker #define P_TO_B_RATIO (32) /* In K_Q Q factor */
101*495ae853SAndroid Build Coastguard Worker #define P_TO_I_RATIO (13) /* In K_Q Q factor */
102*495ae853SAndroid Build Coastguard Worker 
103*495ae853SAndroid Build Coastguard Worker #endif /* _RC_COMMON_H_ */
104*495ae853SAndroid Build Coastguard Worker 
105