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