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 _RC_COMMON_H_
22 #define _RC_COMMON_H_
23 
24 /****************************************************************************
25  NOTE : Put only those things into this file which are common across many
26  files, say I_TO_P_BIT_RATIO macro is used across irc_bit_allocation.c
27  and irc_rate_control_api.c.If anything is exclusive only to one file,
28  define it in the same file
29 
30  This file is an RC private file. It should not be exported to Codec
31  ****************************************************************************/
32 
33 #define UNUSED(x) ((void)(x))
34 
35 typedef float number_t;
36 
37 #define mult32_var_q(a,b,c) *c = a * b
38 
39 #define div32_var_q(a,b,c) (*c = ((b == 0)? a : (a / b)))
40 
41 #define add32_var_q(a,b,c) *c = a + b
42 
43 #define sub32_var_q(a,b,c) *c = a - b
44 
45 #define sqrt32_var_q(a, c) *c = sqrt(a)
46 
47 #define number_t_to_word32(num_a, a) *a = (WORD32)num_a
48 
49 #define convert_float_to_fix(a_f, a) *a = (WORD32)a_f
50 
51 #define convert_fix_to_float(a, a_f) *a_f = (float) a
52 
53 #define SET_VAR_Q(a,b,c) {a = (float) b;}
54 
55 
56 /* Defines the maximum and the minimum quantizer allowed in the stream.*/
57 #define MAX_MPEG2_QP        255 /* 127*/
58 
59 /* Bits ratio between I and P frame */
60 #define I_TO_P_BIT_RATIO 5
61 
62 /* Calculates P = (X*Y/Z) (Assuming all the four are in integers)*/
63 #define X_PROD_Y_DIV_Z(X1,Y1,Z1,P1)\
64 {\
65     number_t vq_a,vq_b,vq_c;\
66     SET_VAR_Q(vq_a,(X1),0);\
67     SET_VAR_Q(vq_b,(Y1),0);\
68     SET_VAR_Q(vq_c,(Z1),0);\
69     mult32_var_q(vq_a,vq_b,&vq_a);\
70     div32_var_q(vq_a,vq_c,&vq_a);\
71     number_t_to_word32(vq_a,&(P1));\
72 }
73 #define VQ_A_LT_VQ_B(A,B, Z) Z = A < B;
74 #define VQ_A_GT_VQ_B(A,B, Z) Z = A > B;
75 
76 /* Z=MAX(A,B) where A, B  and Z are var_q variables */
77 #define MAX_VARQ(A,B, Z)\
78 {\
79     WORD32 a_gt_b;\
80     VQ_A_GT_VQ_B((A), (B), a_gt_b);\
81     (Z) = (a_gt_b) ? (A) : (B);\
82 }
83 
84 /* Z=MIN(A,B) where A, B  and Z are var_q variables */
85 #define MIN_VARQ(A,B, Z)\
86 {\
87     WORD32 a_lt_b;\
88     VQ_A_LT_VQ_B((A), (B), a_lt_b);\
89     (Z) = (a_lt_b) ? (A) : (B);\
90 }
91 
92 /* Maximum number of drain-rates supported. Currently a maximum of only 2
93  drain-rates supported. One for
94  I pictures and the other for P & B pictures */
95 #define MAX_NUM_DRAIN_RATES 2
96 
97 /* The ratios between I to P and P to B Qp is specified here */
98 #define K_Q 4
99 #define I_TO_P_RATIO (19) /* In K_Q Q factor */
100 #define P_TO_B_RATIO (32) /* In K_Q Q factor */
101 #define P_TO_I_RATIO (13) /* In K_Q Q factor */
102 
103 #endif /* _RC_COMMON_H_ */
104 
105