xref: /aosp_15_r20/external/libhevc/encoder/ihevce_rdoq_macros.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
23*c83a76b0SSuyog Pawar *  ihevc_rdoq_macros.h
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * @brief
26*c83a76b0SSuyog Pawar *  Macros used for RDOQ algorthm
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * @author
29*c83a76b0SSuyog Pawar *  Ittiam
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * @remarks
32*c83a76b0SSuyog Pawar *  None
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar #ifndef IHEVC_RDOQ_MACROS_H_
37*c83a76b0SSuyog Pawar #define IHEVC_RDOQ_MACROS_H_
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar /*Used for calculating the distortion in the transform domain*/
43*c83a76b0SSuyog Pawar #define CALC_SSD_IN_TRANS_DOMAIN(a, b, i4_round_val, i4_shift_val)                                 \
44*c83a76b0SSuyog Pawar     (SHR_NEG(((((a) - (b)) * ((a) - (b))) + i4_round_val), i4_shift_val))
45*c83a76b0SSuyog Pawar #define CALC_CUMMUL_SSD_IN_TRANS_DOMAIN(a, b, i4_round_val, i4_shift_val)                          \
46*c83a76b0SSuyog Pawar     (SHR_NEG((((a) - (b)) + i4_round_val), i4_shift_val))
47*c83a76b0SSuyog Pawar 
48*c83a76b0SSuyog Pawar #define MAX_INT 0x7FFFFFFF
49*c83a76b0SSuyog Pawar 
50*c83a76b0SSuyog Pawar #define COMPUTE_RATE_COST_CLIP30_RDOQ(r, l, qshift)                                                \
51*c83a76b0SSuyog Pawar     ((WORD32)CLIP30((((ULWORD64)r) * ((ULWORD64)l)) >> (qshift)))
52*c83a76b0SSuyog Pawar 
53*c83a76b0SSuyog Pawar /*This macro is required to test the RDOQ changes*/
54*c83a76b0SSuyog Pawar /*1 implies cabac context validation using the test-bench*/
55*c83a76b0SSuyog Pawar /*Also prints some debug information*/
56*c83a76b0SSuyog Pawar #define TEST_BENCH_RDOQ 0
57*c83a76b0SSuyog Pawar 
58*c83a76b0SSuyog Pawar /*Macro to enable and disable coefficient RDOQ. When 1, coefficient RDOQ is enabled*/
59*c83a76b0SSuyog Pawar #define COEFF_RDOQ 0
60*c83a76b0SSuyog Pawar 
61*c83a76b0SSuyog Pawar /*Macro to optimize the copying of cabac states across various temp/scratch cabac contexts
62*c83a76b0SSuyog Pawar   Should always be 0 when COEFF_RDOQ is 1*/
63*c83a76b0SSuyog Pawar #define OPT_MEMCPY 1
64*c83a76b0SSuyog Pawar 
65*c83a76b0SSuyog Pawar /** Macro which accounts subtracts 4096 bits from the total bits generated per TU in the RDOPT stage
66*c83a76b0SSuyog Pawar     if SBH is on*/
67*c83a76b0SSuyog Pawar #define ACCOUNT_SIGN_BITS 0
68*c83a76b0SSuyog Pawar 
69*c83a76b0SSuyog Pawar /*Macro defining the maximum number of context elements in the cabac state*/
70*c83a76b0SSuyog Pawar //#define MAX_NUM_CONTEXT_ELEMENTS 5
71*c83a76b0SSuyog Pawar 
72*c83a76b0SSuyog Pawar /*****************************************************************************/
73*c83a76b0SSuyog Pawar /* Enum                                                                      */
74*c83a76b0SSuyog Pawar /*****************************************************************************/
75*c83a76b0SSuyog Pawar /*Enum to indicate which context element in the cabac state is currently being altered*/
76*c83a76b0SSuyog Pawar typedef enum
77*c83a76b0SSuyog Pawar {
78*c83a76b0SSuyog Pawar     LASTXY,
79*c83a76b0SSuyog Pawar     SUB_BLK_CODED_FLAG,
80*c83a76b0SSuyog Pawar     SIG_COEFF,
81*c83a76b0SSuyog Pawar     GRTR_THAN_1,
82*c83a76b0SSuyog Pawar     GRTR_THAN_2,
83*c83a76b0SSuyog Pawar     MAX_NUM_CONTEXT_ELEMENTS
84*c83a76b0SSuyog Pawar } BACKUP_CTXT_ELEMENTS;
85*c83a76b0SSuyog Pawar 
86*c83a76b0SSuyog Pawar /*****************************************************************************/
87*c83a76b0SSuyog Pawar /* Structures                                                                */
88*c83a76b0SSuyog Pawar /*****************************************************************************/
89*c83a76b0SSuyog Pawar 
90*c83a76b0SSuyog Pawar /*Structure defined to optimize copying of cabac states across various temporary/scratch cabac states*/
91*c83a76b0SSuyog Pawar typedef struct
92*c83a76b0SSuyog Pawar {
93*c83a76b0SSuyog Pawar     // clang-format off
94*c83a76b0SSuyog Pawar     /**
95*c83a76b0SSuyog Pawar     ai4_ctxt_to_backup[x] tells us if xth element has been altered. where
96*c83a76b0SSuyog Pawar     x       context element                 Meaning
97*c83a76b0SSuyog Pawar     0       IHEVC_CAB_COEFFX_PREFIX         lastx last y has been coded
98*c83a76b0SSuyog Pawar     1       IHEVC_CAB_CODED_SUBLK_IDX       sub-blk coded or not flag has been coded
99*c83a76b0SSuyog Pawar     2       IHEVC_CAB_COEFF_FLAG            sigcoeff has been coded
100*c83a76b0SSuyog Pawar     3       IHEVC_CAB_COEFABS_GRTR1_FLAG    greater than 1 bin has been coded
101*c83a76b0SSuyog Pawar     4       IHEVC_CAB_COEFABS_GRTR2_FLAG    greater than 2 bin has been coded
102*c83a76b0SSuyog Pawar     */
103*c83a76b0SSuyog Pawar     // clang-format on
104*c83a76b0SSuyog Pawar     UWORD8 au1_ctxt_to_backup[MAX_NUM_CONTEXT_ELEMENTS];
105*c83a76b0SSuyog Pawar 
106*c83a76b0SSuyog Pawar     /** Number of bits generated */
107*c83a76b0SSuyog Pawar     WORD32 i4_num_bits;
108*c83a76b0SSuyog Pawar } backup_ctxt_t;
109*c83a76b0SSuyog Pawar 
110*c83a76b0SSuyog Pawar /**
111*c83a76b0SSuyog Pawar ******************************************************************************
112*c83a76b0SSuyog Pawar * @brief Structure to store the position of the coefficient to be changed
113*c83a76b0SSuyog Pawar          through SBH
114*c83a76b0SSuyog Pawar ******************************************************************************
115*c83a76b0SSuyog Pawar  */
116*c83a76b0SSuyog Pawar typedef struct
117*c83a76b0SSuyog Pawar {
118*c83a76b0SSuyog Pawar     UWORD8 x;
119*c83a76b0SSuyog Pawar     UWORD8 y;
120*c83a76b0SSuyog Pawar     UWORD8 is_valid_pos;
121*c83a76b0SSuyog Pawar     WORD16 i2_old_coeff;
122*c83a76b0SSuyog Pawar } s_sbh_coeff_pos_t;
123*c83a76b0SSuyog Pawar 
124*c83a76b0SSuyog Pawar /**
125*c83a76b0SSuyog Pawar ******************************************************************************
126*c83a76b0SSuyog Pawar  *  @brief  RDOQ SBH context for cabac bit estimation etc
127*c83a76b0SSuyog Pawar ******************************************************************************
128*c83a76b0SSuyog Pawar  */
129*c83a76b0SSuyog Pawar 
130*c83a76b0SSuyog Pawar typedef struct
131*c83a76b0SSuyog Pawar {
132*c83a76b0SSuyog Pawar     /** TU size */
133*c83a76b0SSuyog Pawar     WORD32 i4_trans_size;
134*c83a76b0SSuyog Pawar 
135*c83a76b0SSuyog Pawar     /** Log 2 TU size */
136*c83a76b0SSuyog Pawar     WORD32 i4_log2_trans_size;
137*c83a76b0SSuyog Pawar 
138*c83a76b0SSuyog Pawar     /**
139*c83a76b0SSuyog Pawar      * Boolean value representing if the current TU is luma or not.
140*c83a76b0SSuyog Pawar      * 1 => Luma
141*c83a76b0SSuyog Pawar      */
142*c83a76b0SSuyog Pawar     WORD32 i4_is_luma;
143*c83a76b0SSuyog Pawar 
144*c83a76b0SSuyog Pawar     /**
145*c83a76b0SSuyog Pawar      * Calculate rounding and shifting values required for normalizing original
146*c83a76b0SSuyog Pawar      * and inverse quantized transform coefficients (for calculation of SSD in
147*c83a76b0SSuyog Pawar      * transform domain)
148*c83a76b0SSuyog Pawar      */
149*c83a76b0SSuyog Pawar     WORD32 i4_round_val_ssd_in_td;
150*c83a76b0SSuyog Pawar     WORD32 i4_shift_val_ssd_in_td;
151*c83a76b0SSuyog Pawar 
152*c83a76b0SSuyog Pawar     /** Matrix used in inverse quantization */
153*c83a76b0SSuyog Pawar     WORD32 quant_scale_mat_offset;
154*c83a76b0SSuyog Pawar 
155*c83a76b0SSuyog Pawar     /** Index of the csb within the TU*/
156*c83a76b0SSuyog Pawar     WORD32 i4_trans_idx;
157*c83a76b0SSuyog Pawar 
158*c83a76b0SSuyog Pawar     /** value of lambda used in the D+Rlambda metric*/
159*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_lambda_qf;
160*c83a76b0SSuyog Pawar 
161*c83a76b0SSuyog Pawar     /** Used while inverse quantizing*/
162*c83a76b0SSuyog Pawar     WORD16 i2_qp_rem;
163*c83a76b0SSuyog Pawar     WORD32 i4_qp_div;
164*c83a76b0SSuyog Pawar 
165*c83a76b0SSuyog Pawar     /** Scan index of the csbs within the TU   */
166*c83a76b0SSuyog Pawar     WORD32 i4_scan_idx;
167*c83a76b0SSuyog Pawar 
168*c83a76b0SSuyog Pawar     /** Pointer to the csbf buf. This buffer will contain 1 if the csb is coded
169*c83a76b0SSuyog Pawar      *  and 0 if it is not*/
170*c83a76b0SSuyog Pawar     UWORD8 *pu1_csbf_buf;
171*c83a76b0SSuyog Pawar 
172*c83a76b0SSuyog Pawar     /** Boolean value which is 1 if any of the csbs in the current TU are
173*c83a76b0SSuyog Pawar      * coded*/
174*c83a76b0SSuyog Pawar     UWORD8 i1_tu_is_coded;
175*c83a76b0SSuyog Pawar 
176*c83a76b0SSuyog Pawar     /**
177*c83a76b0SSuyog Pawar      * Pointer to an array of pointer to store the scaling matrices for
178*c83a76b0SSuyog Pawar      * all transform sizes and qp % 6 (pre computed)
179*c83a76b0SSuyog Pawar      */
180*c83a76b0SSuyog Pawar     WORD16 *pi2_dequant_coeff;
181*c83a76b0SSuyog Pawar 
182*c83a76b0SSuyog Pawar     /** Pointer to the quantized coeffs*/
183*c83a76b0SSuyog Pawar     WORD16 *pi2_quant_coeffs;
184*c83a76b0SSuyog Pawar 
185*c83a76b0SSuyog Pawar     /** Pointer to the inverse quantized values*/
186*c83a76b0SSuyog Pawar     WORD16 *pi2_iquant_coeffs;
187*c83a76b0SSuyog Pawar 
188*c83a76b0SSuyog Pawar     /** Pointer ot the transformed values(before quantization) */
189*c83a76b0SSuyog Pawar     WORD16 *pi2_trans_values;
190*c83a76b0SSuyog Pawar 
191*c83a76b0SSuyog Pawar     /** Stride of the inverse quant data*/
192*c83a76b0SSuyog Pawar     WORD32 i4_iq_data_strd;
193*c83a76b0SSuyog Pawar 
194*c83a76b0SSuyog Pawar     /** Stride of the quant data*/
195*c83a76b0SSuyog Pawar     WORD32 i4_q_data_strd;
196*c83a76b0SSuyog Pawar 
197*c83a76b0SSuyog Pawar     /** Intermediate array to store transform output for RDOQ*/
198*c83a76b0SSuyog Pawar     WORD16 ai2_trans_values[MAX_TRANS_SIZE];
199*c83a76b0SSuyog Pawar 
200*c83a76b0SSuyog Pawar     /** Pointer to zero rows and zero cols*/
201*c83a76b0SSuyog Pawar     WORD32 *pi4_zero_row;
202*c83a76b0SSuyog Pawar     WORD32 *pi4_zero_col;
203*c83a76b0SSuyog Pawar 
204*c83a76b0SSuyog Pawar     /** Array containing information about the position of the coefficient
205*c83a76b0SSuyog Pawar      * to be altered during SBH
206*c83a76b0SSuyog Pawar      */
207*c83a76b0SSuyog Pawar     s_sbh_coeff_pos_t s_best_pos[(MAX_TU_SIZE * MAX_TU_SIZE / 4 / 4) + 1];
208*c83a76b0SSuyog Pawar 
209*c83a76b0SSuyog Pawar     /** SSD cost for this particular TU*/
210*c83a76b0SSuyog Pawar     LWORD64 i8_ssd_cost;
211*c83a76b0SSuyog Pawar 
212*c83a76b0SSuyog Pawar     WORD32 i4_perform_all_cand_rdoq;
213*c83a76b0SSuyog Pawar     WORD32 i4_perform_best_cand_rdoq;
214*c83a76b0SSuyog Pawar     WORD32 i4_perform_all_cand_sbh;
215*c83a76b0SSuyog Pawar     WORD32 i4_perform_best_cand_sbh;
216*c83a76b0SSuyog Pawar 
217*c83a76b0SSuyog Pawar     WORD32 i4_bit_depth;
218*c83a76b0SSuyog Pawar 
219*c83a76b0SSuyog Pawar     WORD32 *pi4_subBlock2csbfId_map;
220*c83a76b0SSuyog Pawar 
221*c83a76b0SSuyog Pawar } rdoq_sbh_ctxt_t;
222*c83a76b0SSuyog Pawar 
223*c83a76b0SSuyog Pawar /*****************************************************************************/
224*c83a76b0SSuyog Pawar /* Extern Function Declarations                                              */
225*c83a76b0SSuyog Pawar /*****************************************************************************/
226*c83a76b0SSuyog Pawar 
227*c83a76b0SSuyog Pawar void ihevce_sign_data_hiding(rdoq_sbh_ctxt_t *ps_rdoq_sbh_params);
228*c83a76b0SSuyog Pawar 
229*c83a76b0SSuyog Pawar #endif /* IHEVC_RDOQ_MACROS_H_ */
230