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 ihevce_enc_loop_structs.h 23*c83a76b0SSuyog Pawar * 24*c83a76b0SSuyog Pawar * \brief 25*c83a76b0SSuyog Pawar * This file contains strcutures of enc_loop pass 26*c83a76b0SSuyog Pawar * 27*c83a76b0SSuyog Pawar * \date 28*c83a76b0SSuyog Pawar * 18/09/2012 29*c83a76b0SSuyog Pawar * 30*c83a76b0SSuyog Pawar * \author 31*c83a76b0SSuyog Pawar * Ittiam 32*c83a76b0SSuyog Pawar * 33*c83a76b0SSuyog Pawar ****************************************************************************** 34*c83a76b0SSuyog Pawar */ 35*c83a76b0SSuyog Pawar 36*c83a76b0SSuyog Pawar #ifndef _IHEVCE_ENC_LOOP_STRUCTS_H_ 37*c83a76b0SSuyog Pawar #define _IHEVCE_ENC_LOOP_STRUCTS_H_ 38*c83a76b0SSuyog Pawar 39*c83a76b0SSuyog Pawar #include "ihevc_macros.h" 40*c83a76b0SSuyog Pawar 41*c83a76b0SSuyog Pawar extern UWORD16 gau2_ihevce_cabac_bin_to_bits[64 * 2]; 42*c83a76b0SSuyog Pawar 43*c83a76b0SSuyog Pawar /*****************************************************************************/ 44*c83a76b0SSuyog Pawar /* Constant Macros */ 45*c83a76b0SSuyog Pawar /*****************************************************************************/ 46*c83a76b0SSuyog Pawar /** /breif 4x4 DST, 4x4, 8x8, 16x16, 32x32 */ 47*c83a76b0SSuyog Pawar #define NUM_TRANS_TYPES 5 48*c83a76b0SSuyog Pawar #define INTRA_PLANAR 0 49*c83a76b0SSuyog Pawar #define INTRA_DC 1 50*c83a76b0SSuyog Pawar #define NUM_POSSIBLE_TU_SIZES_CHR_INTRA_SATD 2 51*c83a76b0SSuyog Pawar #define MAX_TU_IN_TU_EQ_DIV_2 4 52*c83a76b0SSuyog Pawar #define MAX_MVP_LIST_CAND 2 53*c83a76b0SSuyog Pawar #define MAX_COST 0x7ffffff 54*c83a76b0SSuyog Pawar #define MAX_COST_64 0x7ffffffffffffff 55*c83a76b0SSuyog Pawar #define NUM_32CU_AND_64CU_IN_CTB 5 /* 4 - 32x32 + 1 64x64*/ 56*c83a76b0SSuyog Pawar #define PING_PONG 2 57*c83a76b0SSuyog Pawar #define MAX_SAO_RD_CAND 10 58*c83a76b0SSuyog Pawar #define SCRATCH_BUF_STRIDE 80 59*c83a76b0SSuyog Pawar 60*c83a76b0SSuyog Pawar /*****************************************************************************/ 61*c83a76b0SSuyog Pawar /* Function Macros */ 62*c83a76b0SSuyog Pawar /*****************************************************************************/ 63*c83a76b0SSuyog Pawar #define INTRA_ANGULAR(x) (x) 64*c83a76b0SSuyog Pawar 65*c83a76b0SSuyog Pawar /** @breif max 30bit value */ 66*c83a76b0SSuyog Pawar #define MAX30 ((1 << 30) - 1) 67*c83a76b0SSuyog Pawar 68*c83a76b0SSuyog Pawar /* @brief macro to clip a data to max of 30bits (assuming unsgined) */ 69*c83a76b0SSuyog Pawar #define CLIP30(x) ((x) > MAX30 ? MAX30 : (x)) 70*c83a76b0SSuyog Pawar 71*c83a76b0SSuyog Pawar /* @brief compute the (lambda * rate) with a qshift and clip result to 30bits */ 72*c83a76b0SSuyog Pawar #define COMPUTE_RATE_COST_CLIP30(r, l, qshift) ((WORD32)CLIP30((ULWORD64)((r) * (l)) >> (qshift))) 73*c83a76b0SSuyog Pawar 74*c83a76b0SSuyog Pawar #define IHEVCE_INV_WT_PRED(inp, wt, off, shift) \ 75*c83a76b0SSuyog Pawar (((((inp) - (off)) << (shift)) * wt + (1 << 14)) >> 15) 76*c83a76b0SSuyog Pawar 77*c83a76b0SSuyog Pawar #define POPULATE_PU_STRUCT(ps_pu, mvx, mvy, offset_x, offset_y, wd, ht, ref_idx, pred_lx) \ 78*c83a76b0SSuyog Pawar { \ 79*c83a76b0SSuyog Pawar (ps_pu)->b4_pos_x = (offset_x) >> 2; \ 80*c83a76b0SSuyog Pawar (ps_pu)->b4_pos_y = (offset_y) >> 2; \ 81*c83a76b0SSuyog Pawar (ps_pu)->b4_wd = ((wd) >> 2) - 1; \ 82*c83a76b0SSuyog Pawar (ps_pu)->b4_ht = ((ht) >> 2) - 1; \ 83*c83a76b0SSuyog Pawar (ps_pu)->b1_intra_flag = 0; \ 84*c83a76b0SSuyog Pawar (ps_pu)->b2_pred_mode = pred_lx; \ 85*c83a76b0SSuyog Pawar if(pred_lx) \ 86*c83a76b0SSuyog Pawar { \ 87*c83a76b0SSuyog Pawar (ps_pu)->mv.i1_l0_ref_idx = -1; \ 88*c83a76b0SSuyog Pawar (ps_pu)->mv.i1_l1_ref_idx = ref_idx; \ 89*c83a76b0SSuyog Pawar (ps_pu)->mv.s_l1_mv.i2_mvx = mvx; \ 90*c83a76b0SSuyog Pawar (ps_pu)->mv.s_l1_mv.i2_mvy = mvy; \ 91*c83a76b0SSuyog Pawar } \ 92*c83a76b0SSuyog Pawar else \ 93*c83a76b0SSuyog Pawar { \ 94*c83a76b0SSuyog Pawar (ps_pu)->mv.i1_l0_ref_idx = ref_idx; \ 95*c83a76b0SSuyog Pawar (ps_pu)->mv.i1_l1_ref_idx = -1; \ 96*c83a76b0SSuyog Pawar (ps_pu)->mv.s_l0_mv.i2_mvx = mvx; \ 97*c83a76b0SSuyog Pawar (ps_pu)->mv.s_l0_mv.i2_mvy = mvy; \ 98*c83a76b0SSuyog Pawar } \ 99*c83a76b0SSuyog Pawar } 100*c83a76b0SSuyog Pawar 101*c83a76b0SSuyog Pawar #define GET_FRAME_QSTEP_FROM_QP(frame_qp, frame_qstep) \ 102*c83a76b0SSuyog Pawar { \ 103*c83a76b0SSuyog Pawar double q_steps[6] = { 0.625, 0.703, 0.79, 0.889, 1.0, 1.125 }; \ 104*c83a76b0SSuyog Pawar \ 105*c83a76b0SSuyog Pawar frame_qstep = (WORD32)((1 << ((frame_qp) / 6)) * q_steps[(frame_qp) % 6]); \ 106*c83a76b0SSuyog Pawar } 107*c83a76b0SSuyog Pawar 108*c83a76b0SSuyog Pawar #define INITIALISE_MERGE_RESULT_STRUCT(ps_merge_data, pas_pu_results) \ 109*c83a76b0SSuyog Pawar { \ 110*c83a76b0SSuyog Pawar WORD32 i, j, k; \ 111*c83a76b0SSuyog Pawar \ 112*c83a76b0SSuyog Pawar for(i = 0; i < TOT_NUM_PARTS; i++) \ 113*c83a76b0SSuyog Pawar { \ 114*c83a76b0SSuyog Pawar (ps_merge_data)->s_pu_results.u1_num_results_per_part_l0[i] = 0; \ 115*c83a76b0SSuyog Pawar (ps_merge_data)->s_pu_results.u1_num_results_per_part_l1[i] = 0; \ 116*c83a76b0SSuyog Pawar } \ 117*c83a76b0SSuyog Pawar for(i = 0; i < 2; i++) \ 118*c83a76b0SSuyog Pawar { \ 119*c83a76b0SSuyog Pawar for(j = 0; j < TOT_NUM_PARTS; j++) \ 120*c83a76b0SSuyog Pawar { \ 121*c83a76b0SSuyog Pawar (ps_merge_data)->s_pu_results.aps_pu_results[i][j] = pas_pu_results[i][j]; \ 122*c83a76b0SSuyog Pawar for(k = 0; k < MAX_NUM_RESULTS_PER_PART_LIST; k++) \ 123*c83a76b0SSuyog Pawar { \ 124*c83a76b0SSuyog Pawar pas_pu_results[i][j][k].i4_tot_cost = MAX_COST; \ 125*c83a76b0SSuyog Pawar pas_pu_results[i][j][k].pu.mv.i1_l0_ref_idx = -1; \ 126*c83a76b0SSuyog Pawar pas_pu_results[i][j][k].pu.mv.i1_l1_ref_idx = -1; \ 127*c83a76b0SSuyog Pawar } \ 128*c83a76b0SSuyog Pawar } \ 129*c83a76b0SSuyog Pawar } \ 130*c83a76b0SSuyog Pawar } 131*c83a76b0SSuyog Pawar 132*c83a76b0SSuyog Pawar #define POPULATE_CTB_PARAMS \ 133*c83a76b0SSuyog Pawar (ps_common_frm_prms, \ 134*c83a76b0SSuyog Pawar apu1_wt_inp, \ 135*c83a76b0SSuyog Pawar i4_ctb_x_off, \ 136*c83a76b0SSuyog Pawar i4_ctb_y_off, \ 137*c83a76b0SSuyog Pawar ppu1_pred, \ 138*c83a76b0SSuyog Pawar cu_size, \ 139*c83a76b0SSuyog Pawar ref_stride, \ 140*c83a76b0SSuyog Pawar bidir_enabled, \ 141*c83a76b0SSuyog Pawar num_refs, \ 142*c83a76b0SSuyog Pawar pps_rec_list_l0, \ 143*c83a76b0SSuyog Pawar pps_rec_list_l1, \ 144*c83a76b0SSuyog Pawar pu1_non_wt_inp, \ 145*c83a76b0SSuyog Pawar lambda, \ 146*c83a76b0SSuyog Pawar lambda_q_shift, \ 147*c83a76b0SSuyog Pawar wpred_log_wdc) \ 148*c83a76b0SSuyog Pawar { \ 149*c83a76b0SSuyog Pawar WORD32 i, j; \ 150*c83a76b0SSuyog Pawar (ps_common_frm_prms)->i4_bidir_enabled = bidir_enabled; \ 151*c83a76b0SSuyog Pawar (ps_common_frm_prms)->i4_ctb_x_off = i4_ctb_x_off; \ 152*c83a76b0SSuyog Pawar (ps_common_frm_prms)->i4_ctb_y_off = i4_ctb_y_off; \ 153*c83a76b0SSuyog Pawar (ps_common_frm_prms)->i4_inp_stride = cu_size; \ 154*c83a76b0SSuyog Pawar (ps_common_frm_prms)->i4_lamda = lambda; \ 155*c83a76b0SSuyog Pawar (ps_common_frm_prms)->i4_pred_stride = cu_size; \ 156*c83a76b0SSuyog Pawar (ps_common_frm_prms)->i4_rec_stride = ref_stride; \ 157*c83a76b0SSuyog Pawar (ps_common_frm_prms)->pps_rec_list_l0 = pps_rec_list_l0; \ 158*c83a76b0SSuyog Pawar (ps_common_frm_prms)->pps_rec_list_l1 = pps_rec_list_l1; \ 159*c83a76b0SSuyog Pawar (ps_common_frm_prms)->ppu1_pred = ppu1_pred; \ 160*c83a76b0SSuyog Pawar (ps_common_frm_prms)->pu1_non_wt_inp = pu1_non_wt_inp; \ 161*c83a76b0SSuyog Pawar (ps_common_frm_prms)->pu1_wkg_mem = NULL; \ 162*c83a76b0SSuyog Pawar (ps_common_frm_prms)->u1_lamda_qshift = lambda_q_shift; \ 163*c83a76b0SSuyog Pawar (ps_common_frm_prms)->u1_num_ref = num_refs; \ 164*c83a76b0SSuyog Pawar (ps_common_frm_prms)->wpred_log_wdc = wpred_log_wdc; \ 165*c83a76b0SSuyog Pawar for(i = 0; i < 2; i++) \ 166*c83a76b0SSuyog Pawar { \ 167*c83a76b0SSuyog Pawar for(j = 0; j < MAX_NUM_REF; j++) \ 168*c83a76b0SSuyog Pawar { \ 169*c83a76b0SSuyog Pawar (ps_common_frm_prms)->apu1_wt_inp = (apu1_wt_inp)[i][j]; \ 170*c83a76b0SSuyog Pawar } \ 171*c83a76b0SSuyog Pawar } \ 172*c83a76b0SSuyog Pawar } 173*c83a76b0SSuyog Pawar 174*c83a76b0SSuyog Pawar #define COMPUTE_MERGE_IDX_COST(merge_idx_0_model, merge_idx, max_merge_cand, lambda, cost) \ 175*c83a76b0SSuyog Pawar { \ 176*c83a76b0SSuyog Pawar WORD32 cab_bits_q12 = 0; \ 177*c83a76b0SSuyog Pawar \ 178*c83a76b0SSuyog Pawar /* sanity checks */ \ 179*c83a76b0SSuyog Pawar ASSERT((merge_idx >= 0) && (merge_idx < max_merge_cand)); \ 180*c83a76b0SSuyog Pawar \ 181*c83a76b0SSuyog Pawar /* encode the merge idx only if required */ \ 182*c83a76b0SSuyog Pawar if(max_merge_cand > 1) \ 183*c83a76b0SSuyog Pawar { \ 184*c83a76b0SSuyog Pawar WORD32 bin = (merge_idx > 0); \ 185*c83a76b0SSuyog Pawar \ 186*c83a76b0SSuyog Pawar /* bits for the context modelled first bin */ \ 187*c83a76b0SSuyog Pawar cab_bits_q12 += gau2_ihevce_cabac_bin_to_bits[merge_idx_0_model ^ bin]; \ 188*c83a76b0SSuyog Pawar \ 189*c83a76b0SSuyog Pawar /* bits for larged merge idx coded as bypass tunary */ \ 190*c83a76b0SSuyog Pawar if((max_merge_cand > 2) && (merge_idx > 0)) \ 191*c83a76b0SSuyog Pawar { \ 192*c83a76b0SSuyog Pawar cab_bits_q12 += (MIN(merge_idx, (max_merge_cand - 2))) << CABAC_FRAC_BITS_Q; \ 193*c83a76b0SSuyog Pawar } \ 194*c83a76b0SSuyog Pawar \ 195*c83a76b0SSuyog Pawar cost = COMPUTE_RATE_COST_CLIP30( \ 196*c83a76b0SSuyog Pawar cab_bits_q12, lambda, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q)); \ 197*c83a76b0SSuyog Pawar } \ 198*c83a76b0SSuyog Pawar else \ 199*c83a76b0SSuyog Pawar { \ 200*c83a76b0SSuyog Pawar cost = 0; \ 201*c83a76b0SSuyog Pawar } \ 202*c83a76b0SSuyog Pawar } 203*c83a76b0SSuyog Pawar 204*c83a76b0SSuyog Pawar /*****************************************************************************/ 205*c83a76b0SSuyog Pawar /* Typedefs */ 206*c83a76b0SSuyog Pawar /*****************************************************************************/ 207*c83a76b0SSuyog Pawar 208*c83a76b0SSuyog Pawar typedef FT_CALC_HAD_SATD_8BIT *pf_res_trans_luma_had_chroma; 209*c83a76b0SSuyog Pawar 210*c83a76b0SSuyog Pawar /** \breif function pointer prototype for residue and transform enc_loop */ 211*c83a76b0SSuyog Pawar typedef UWORD32 (*pf_res_trans_chroma)( 212*c83a76b0SSuyog Pawar UWORD8 *pu1_src, 213*c83a76b0SSuyog Pawar UWORD8 *pu1_pred, 214*c83a76b0SSuyog Pawar WORD32 *pi4_tmp, 215*c83a76b0SSuyog Pawar WORD16 *pi2_dst, 216*c83a76b0SSuyog Pawar WORD32 src_strd, 217*c83a76b0SSuyog Pawar WORD32 pred_strd, 218*c83a76b0SSuyog Pawar WORD32 dst_strd, 219*c83a76b0SSuyog Pawar CHROMA_PLANE_ID_T e_chroma_plane); 220*c83a76b0SSuyog Pawar 221*c83a76b0SSuyog Pawar /** \breif function pointer prototype for quantization and inv Quant for ssd 222*c83a76b0SSuyog Pawar calc. for all transform sizes */ 223*c83a76b0SSuyog Pawar typedef WORD32 (*pf_quant_iquant_ssd)( 224*c83a76b0SSuyog Pawar WORD16 *pi2_coeffs, 225*c83a76b0SSuyog Pawar WORD16 *pi2_quant_coeff, 226*c83a76b0SSuyog Pawar WORD16 *pi2_q_dst, 227*c83a76b0SSuyog Pawar WORD16 *pi2_iq_dst, 228*c83a76b0SSuyog Pawar WORD32 trans_size, 229*c83a76b0SSuyog Pawar WORD32 qp_div, /* qpscaled / 6 */ 230*c83a76b0SSuyog Pawar WORD32 qp_rem, /* qpscaled % 6 */ 231*c83a76b0SSuyog Pawar WORD32 q_add, 232*c83a76b0SSuyog Pawar WORD32 *pi4_quant_round_factor_0_1, 233*c83a76b0SSuyog Pawar WORD32 *pi4_quant_round_factor_1_2, 234*c83a76b0SSuyog Pawar WORD32 src_strd, 235*c83a76b0SSuyog Pawar WORD32 dst_q_strd, 236*c83a76b0SSuyog Pawar WORD32 dst_iq_strd, 237*c83a76b0SSuyog Pawar UWORD8 *csbf, 238*c83a76b0SSuyog Pawar WORD32 csbf_strd, 239*c83a76b0SSuyog Pawar WORD32 *zero_col, 240*c83a76b0SSuyog Pawar WORD32 *zero_row, 241*c83a76b0SSuyog Pawar WORD16 *pi2_dequant_coeff, 242*c83a76b0SSuyog Pawar LWORD64 *pi8_cost); 243*c83a76b0SSuyog Pawar 244*c83a76b0SSuyog Pawar /** \breif function pointer prototype for quantization and inv Quant for ssd 245*c83a76b0SSuyog Pawar calc. for all transform sizes (in case of RDOQ + SBH) */ 246*c83a76b0SSuyog Pawar typedef WORD32 (*pf_quant_iquant_ssd_sbh)( 247*c83a76b0SSuyog Pawar WORD16 *pi2_coeffs, 248*c83a76b0SSuyog Pawar WORD16 *pi2_quant_coeff, 249*c83a76b0SSuyog Pawar WORD16 *pi2_q_dst, 250*c83a76b0SSuyog Pawar WORD16 *pi2_iq_dst, 251*c83a76b0SSuyog Pawar WORD32 trans_size, 252*c83a76b0SSuyog Pawar WORD32 qp_div, /* qpscaled / 6 */ 253*c83a76b0SSuyog Pawar WORD32 qp_rem, /* qpscaled % 6 */ 254*c83a76b0SSuyog Pawar WORD32 q_add, 255*c83a76b0SSuyog Pawar WORD32 src_strd, 256*c83a76b0SSuyog Pawar WORD32 dst_q_strd, 257*c83a76b0SSuyog Pawar WORD32 dst_iq_strd, 258*c83a76b0SSuyog Pawar UWORD8 *csbf, 259*c83a76b0SSuyog Pawar WORD32 csbf_strd, 260*c83a76b0SSuyog Pawar WORD32 *zero_col, 261*c83a76b0SSuyog Pawar WORD32 *zero_row, 262*c83a76b0SSuyog Pawar WORD16 *pi2_dequant_coeff, 263*c83a76b0SSuyog Pawar WORD32 *pi4_cost, 264*c83a76b0SSuyog Pawar WORD32 i4_scan_idx, 265*c83a76b0SSuyog Pawar WORD32 i4_perform_rdoq); 266*c83a76b0SSuyog Pawar 267*c83a76b0SSuyog Pawar /** \breif function pointer prototype for inverse transform and recon 268*c83a76b0SSuyog Pawar for all transform sizes : Luma */ 269*c83a76b0SSuyog Pawar typedef void (*pf_it_recon)( 270*c83a76b0SSuyog Pawar WORD16 *pi2_src, 271*c83a76b0SSuyog Pawar WORD16 *pi2_tmp, 272*c83a76b0SSuyog Pawar UWORD8 *pu1_pred, 273*c83a76b0SSuyog Pawar UWORD8 *pu1_dst, 274*c83a76b0SSuyog Pawar WORD32 src_strd, 275*c83a76b0SSuyog Pawar WORD32 pred_strd, 276*c83a76b0SSuyog Pawar WORD32 dst_strd, 277*c83a76b0SSuyog Pawar WORD32 zero_cols, 278*c83a76b0SSuyog Pawar WORD32 zero_rows); 279*c83a76b0SSuyog Pawar 280*c83a76b0SSuyog Pawar /** \breif function pointer prototype for inverse transform and recon 281*c83a76b0SSuyog Pawar for all transform sizes : Chroma */ 282*c83a76b0SSuyog Pawar typedef void (*pf_it_recon_chroma)( 283*c83a76b0SSuyog Pawar WORD16 *pi2_src, 284*c83a76b0SSuyog Pawar WORD16 *pi2_tmp, 285*c83a76b0SSuyog Pawar UWORD8 *pu1_pred, 286*c83a76b0SSuyog Pawar UWORD8 *pu1_dst, 287*c83a76b0SSuyog Pawar WORD32 src_strd, 288*c83a76b0SSuyog Pawar WORD32 pred_strd, 289*c83a76b0SSuyog Pawar WORD32 dst_strd, 290*c83a76b0SSuyog Pawar WORD32 zero_cols, 291*c83a76b0SSuyog Pawar WORD32 zero_rows); 292*c83a76b0SSuyog Pawar 293*c83a76b0SSuyog Pawar /** \breif function pointer prototype for luma sao. */ 294*c83a76b0SSuyog Pawar typedef void (*pf_sao_luma)( 295*c83a76b0SSuyog Pawar UWORD8 *pu1_src, 296*c83a76b0SSuyog Pawar WORD32 src_strd, 297*c83a76b0SSuyog Pawar UWORD8 *pu1_src_left, 298*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top, 299*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top_left, 300*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top_right, 301*c83a76b0SSuyog Pawar UWORD8 *pu1_src_bot_left, 302*c83a76b0SSuyog Pawar UWORD8 *pu1_avail, 303*c83a76b0SSuyog Pawar WORD8 *pi1_sao_offset, 304*c83a76b0SSuyog Pawar WORD32 wd, 305*c83a76b0SSuyog Pawar WORD32 ht); 306*c83a76b0SSuyog Pawar 307*c83a76b0SSuyog Pawar /** \breif function pointer prototype for chroma sao. */ 308*c83a76b0SSuyog Pawar typedef void (*pf_sao_chroma)( 309*c83a76b0SSuyog Pawar UWORD8 *pu1_src, 310*c83a76b0SSuyog Pawar WORD32 src_strd, 311*c83a76b0SSuyog Pawar UWORD8 *pu1_src_left, 312*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top, 313*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top_left, 314*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top_right, 315*c83a76b0SSuyog Pawar UWORD8 *pu1_src_bot_left, 316*c83a76b0SSuyog Pawar UWORD8 *pu1_avail, 317*c83a76b0SSuyog Pawar WORD8 *pi1_sao_offset_u, 318*c83a76b0SSuyog Pawar WORD8 *pi1_sao_offset_v, 319*c83a76b0SSuyog Pawar WORD32 wd, 320*c83a76b0SSuyog Pawar WORD32 ht); 321*c83a76b0SSuyog Pawar 322*c83a76b0SSuyog Pawar /*****************************************************************************/ 323*c83a76b0SSuyog Pawar /* Enums */ 324*c83a76b0SSuyog Pawar /*****************************************************************************/ 325*c83a76b0SSuyog Pawar 326*c83a76b0SSuyog Pawar typedef enum 327*c83a76b0SSuyog Pawar { 328*c83a76b0SSuyog Pawar IP_FUNC_MODE_0 = 0, 329*c83a76b0SSuyog Pawar IP_FUNC_MODE_1, 330*c83a76b0SSuyog Pawar IP_FUNC_MODE_2, 331*c83a76b0SSuyog Pawar IP_FUNC_MODE_3TO9, 332*c83a76b0SSuyog Pawar IP_FUNC_MODE_10, 333*c83a76b0SSuyog Pawar IP_FUNC_MODE_11TO17, 334*c83a76b0SSuyog Pawar IP_FUNC_MODE_18_34, 335*c83a76b0SSuyog Pawar IP_FUNC_MODE_19TO25, 336*c83a76b0SSuyog Pawar IP_FUNC_MODE_26, 337*c83a76b0SSuyog Pawar IP_FUNC_MODE_27TO33, 338*c83a76b0SSuyog Pawar 339*c83a76b0SSuyog Pawar NUM_IP_FUNCS 340*c83a76b0SSuyog Pawar 341*c83a76b0SSuyog Pawar } IP_FUNCS_T; 342*c83a76b0SSuyog Pawar 343*c83a76b0SSuyog Pawar typedef enum 344*c83a76b0SSuyog Pawar { 345*c83a76b0SSuyog Pawar /* currently only cu and cu/2 modes are supported */ 346*c83a76b0SSuyog Pawar TU_EQ_CU = 0, 347*c83a76b0SSuyog Pawar TU_EQ_CU_DIV2, 348*c83a76b0SSuyog Pawar TU_EQ_SUBCU, /* only applicable for NXN mode at mincusize */ 349*c83a76b0SSuyog Pawar 350*c83a76b0SSuyog Pawar /* support for below modes needs to be added */ 351*c83a76b0SSuyog Pawar TU_EQ_CU_DIV4, 352*c83a76b0SSuyog Pawar TU_EQ_CU_DIV8, 353*c83a76b0SSuyog Pawar TU_EQ_CU_DIV16, 354*c83a76b0SSuyog Pawar 355*c83a76b0SSuyog Pawar NUM_TU_WRT_CU, 356*c83a76b0SSuyog Pawar 357*c83a76b0SSuyog Pawar } TU_SIZE_WRT_CU_T; 358*c83a76b0SSuyog Pawar 359*c83a76b0SSuyog Pawar typedef enum 360*c83a76b0SSuyog Pawar { 361*c83a76b0SSuyog Pawar RDOPT_MODE = 0, 362*c83a76b0SSuyog Pawar RDOPT_SKIP_MODE = 1, 363*c83a76b0SSuyog Pawar 364*c83a76b0SSuyog Pawar NUM_CORE_CALL_MODES, 365*c83a76b0SSuyog Pawar 366*c83a76b0SSuyog Pawar } CORE_FUNC_CALL_MODE_T; 367*c83a76b0SSuyog Pawar 368*c83a76b0SSuyog Pawar typedef enum 369*c83a76b0SSuyog Pawar { 370*c83a76b0SSuyog Pawar ENC_LOOP_CTXT = 0, 371*c83a76b0SSuyog Pawar ENC_LOOP_THRDS_CTXT, 372*c83a76b0SSuyog Pawar ENC_LOOP_SCALE_MAT, 373*c83a76b0SSuyog Pawar ENC_LOOP_RESCALE_MAT, 374*c83a76b0SSuyog Pawar ENC_LOOP_TOP_LUMA, 375*c83a76b0SSuyog Pawar ENC_LOOP_TOP_CHROMA, 376*c83a76b0SSuyog Pawar ENC_LOOP_TOP_NBR4X4, 377*c83a76b0SSuyog Pawar ENC_LOOP_RC_PARAMS, /* memory to dump rate control parameters by each thread for each bit-rate instance */ 378*c83a76b0SSuyog Pawar ENC_LOOP_QP_TOP_4X4, 379*c83a76b0SSuyog Pawar ENC_LOOP_DEBLOCKING, 380*c83a76b0SSuyog Pawar ENC_LOOP_422_CHROMA_INTRA_PRED, 381*c83a76b0SSuyog Pawar ENC_LOOP_INTER_PRED, 382*c83a76b0SSuyog Pawar ENC_LOOP_CHROMA_PRED_INTRA, 383*c83a76b0SSuyog Pawar ENC_LOOP_REF_SUB_OUT, 384*c83a76b0SSuyog Pawar ENC_LOOP_REF_FILT_OUT, 385*c83a76b0SSuyog Pawar ENC_LOOP_CU_RECUR_LUMA_RECON, 386*c83a76b0SSuyog Pawar ENC_LOOP_CU_RECUR_CHROMA_RECON, 387*c83a76b0SSuyog Pawar ENC_LOOP_CU_RECUR_LUMA_PRED, 388*c83a76b0SSuyog Pawar ENC_LOOP_CU_RECUR_CHROMA_PRED, 389*c83a76b0SSuyog Pawar ENC_LOOP_LEFT_LUMA_DATA, 390*c83a76b0SSuyog Pawar ENC_LOOP_LEFT_CHROMA_DATA, 391*c83a76b0SSuyog Pawar ENC_LOOP_SAO, 392*c83a76b0SSuyog Pawar ENC_LOOP_CU_COEFF_DATA, 393*c83a76b0SSuyog Pawar ENC_LOOP_CU_RECUR_COEFF_DATA, 394*c83a76b0SSuyog Pawar ENC_LOOP_CU_DEQUANT_DATA, 395*c83a76b0SSuyog Pawar ENC_LOOP_RECON_DATA_STORE, 396*c83a76b0SSuyog Pawar /* should always be the last entry */ 397*c83a76b0SSuyog Pawar NUM_ENC_LOOP_MEM_RECS 398*c83a76b0SSuyog Pawar 399*c83a76b0SSuyog Pawar } ENC_LOOP_MEM_TABS_T; 400*c83a76b0SSuyog Pawar 401*c83a76b0SSuyog Pawar /** This is for assigning the pred buiffers for luma (2 ping-pong) and 402*c83a76b0SSuyog Pawar chroma(1) */ 403*c83a76b0SSuyog Pawar typedef enum 404*c83a76b0SSuyog Pawar { 405*c83a76b0SSuyog Pawar CU_ME_INTRA_PRED_LUMA_IDX0 = 0, 406*c83a76b0SSuyog Pawar CU_ME_INTRA_PRED_LUMA_IDX1, 407*c83a76b0SSuyog Pawar CU_ME_INTRA_PRED_CHROMA_IDX, 408*c83a76b0SSuyog Pawar 409*c83a76b0SSuyog Pawar /* should be always the last entry */ 410*c83a76b0SSuyog Pawar NUM_CU_ME_INTRA_PRED_IDX 411*c83a76b0SSuyog Pawar 412*c83a76b0SSuyog Pawar } CU_ME_INTRA_PRED_IDX_T; 413*c83a76b0SSuyog Pawar 414*c83a76b0SSuyog Pawar /*****************************************************************************/ 415*c83a76b0SSuyog Pawar /* Structure */ 416*c83a76b0SSuyog Pawar /*****************************************************************************/ 417*c83a76b0SSuyog Pawar 418*c83a76b0SSuyog Pawar /** 419*c83a76b0SSuyog Pawar ****************************************************************************** 420*c83a76b0SSuyog Pawar * @brief Structure to store TU prms req. for enc_loop only 421*c83a76b0SSuyog Pawar ****************************************************************************** 422*c83a76b0SSuyog Pawar */ 423*c83a76b0SSuyog Pawar typedef struct 424*c83a76b0SSuyog Pawar { 425*c83a76b0SSuyog Pawar /** Zero_col info. for the current TU Luma */ 426*c83a76b0SSuyog Pawar UWORD32 u4_luma_zero_col; 427*c83a76b0SSuyog Pawar /** Zero_row info. for the current TU Luma */ 428*c83a76b0SSuyog Pawar UWORD32 u4_luma_zero_row; 429*c83a76b0SSuyog Pawar 430*c83a76b0SSuyog Pawar /** Zero_col info. for the current TU Chroma Cb */ 431*c83a76b0SSuyog Pawar UWORD32 au4_cb_zero_col[2]; 432*c83a76b0SSuyog Pawar /** Zero_row info. for the current TU Chroma Cb */ 433*c83a76b0SSuyog Pawar UWORD32 au4_cb_zero_row[2]; 434*c83a76b0SSuyog Pawar /** Zero_col info. for the current TU Chroma Cr */ 435*c83a76b0SSuyog Pawar UWORD32 au4_cr_zero_col[2]; 436*c83a76b0SSuyog Pawar /** Zero_row info. for the current TU Chroma Cr */ 437*c83a76b0SSuyog Pawar UWORD32 au4_cr_zero_row[2]; 438*c83a76b0SSuyog Pawar 439*c83a76b0SSuyog Pawar /** bytes consumed by the luma ecd data */ 440*c83a76b0SSuyog Pawar WORD16 i2_luma_bytes_consumed; 441*c83a76b0SSuyog Pawar /** bytes consumed by the Cb ecd data */ 442*c83a76b0SSuyog Pawar WORD16 ai2_cb_bytes_consumed[2]; 443*c83a76b0SSuyog Pawar /** bytes consumed by the Cr ecd data */ 444*c83a76b0SSuyog Pawar WORD16 ai2_cr_bytes_consumed[2]; 445*c83a76b0SSuyog Pawar 446*c83a76b0SSuyog Pawar /** flag to re-evaluate IQ and Coeff data of luma in the final_recon 447*c83a76b0SSuyog Pawar function. If zero, uses the data from RDOPT cand. */ 448*c83a76b0SSuyog Pawar UWORD16 b1_eval_luma_iq_and_coeff_data : 1; 449*c83a76b0SSuyog Pawar /** flag to re-evaluate IQ and Coeff data of chroma in the final_recon 450*c83a76b0SSuyog Pawar function. If zero, uses the data from RDOPT cand. */ 451*c83a76b0SSuyog Pawar UWORD16 b1_eval_chroma_iq_and_coeff_data : 1; 452*c83a76b0SSuyog Pawar 453*c83a76b0SSuyog Pawar /* TO DO : No support now, need to add. Always comapre ZERO_CBF cost */ 454*c83a76b0SSuyog Pawar /** Luma ZERO_CBF cost is compared with residue coding cost only if this 455*c83a76b0SSuyog Pawar flag is enabled */ 456*c83a76b0SSuyog Pawar UWORD16 b1_eval_luma_zero_cbf_cost : 1; 457*c83a76b0SSuyog Pawar /** Chroma ZERO_CBF cost is compared with residue coding cost only if this 458*c83a76b0SSuyog Pawar flag is enabled */ 459*c83a76b0SSuyog Pawar UWORD16 b1_eval_chroma_zero_cbf_cost : 1; 460*c83a76b0SSuyog Pawar 461*c83a76b0SSuyog Pawar /** Reserved to make WORD32 alignment */ 462*c83a76b0SSuyog Pawar UWORD16 b12_reserved : 12; 463*c83a76b0SSuyog Pawar 464*c83a76b0SSuyog Pawar } tu_enc_loop_temp_prms_t; 465*c83a76b0SSuyog Pawar 466*c83a76b0SSuyog Pawar typedef struct recon_datastore_t 467*c83a76b0SSuyog Pawar { 468*c83a76b0SSuyog Pawar /* 2 to store current and best */ 469*c83a76b0SSuyog Pawar void *apv_luma_recon_bufs[2]; 470*c83a76b0SSuyog Pawar 471*c83a76b0SSuyog Pawar /* 0 to store cur chroma mode recon */ 472*c83a76b0SSuyog Pawar /* 1 to store winning independent chroma mode with a single TU's recon */ 473*c83a76b0SSuyog Pawar /* 2 to store winning independent chroma mode with 4 TUs' recon */ 474*c83a76b0SSuyog Pawar void *apv_chroma_recon_bufs[3]; 475*c83a76b0SSuyog Pawar 476*c83a76b0SSuyog Pawar /* The following two arrays are used to store the ID's of the buffers */ 477*c83a76b0SSuyog Pawar /* where the winning recon is being stored */ 478*c83a76b0SSuyog Pawar /* For Luma buffers, the permissible values are 0, 1 and UCHAR_MAX */ 479*c83a76b0SSuyog Pawar /* For Chroma buffers, the permissible values are 0, 1, 2 and UCHAR_MAX */ 480*c83a76b0SSuyog Pawar /* The value 'UCHAR_MAX' indicates the absence of Recon for that particular TU */ 481*c83a76b0SSuyog Pawar UWORD8 au1_bufId_with_winning_LumaRecon[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW]; 482*c83a76b0SSuyog Pawar 483*c83a76b0SSuyog Pawar /* 2 - 2 Chroma planes */ 484*c83a76b0SSuyog Pawar /* 2 - 2 possible subTU's */ 485*c83a76b0SSuyog Pawar UWORD8 au1_bufId_with_winning_ChromaRecon[2][MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW][2]; 486*c83a76b0SSuyog Pawar 487*c83a76b0SSuyog Pawar WORD32 i4_lumaRecon_stride; 488*c83a76b0SSuyog Pawar 489*c83a76b0SSuyog Pawar WORD32 i4_chromaRecon_stride; 490*c83a76b0SSuyog Pawar 491*c83a76b0SSuyog Pawar UWORD8 au1_is_chromaRecon_available[3]; 492*c83a76b0SSuyog Pawar 493*c83a76b0SSuyog Pawar UWORD8 u1_is_lumaRecon_available; 494*c83a76b0SSuyog Pawar 495*c83a76b0SSuyog Pawar } recon_datastore_t; 496*c83a76b0SSuyog Pawar 497*c83a76b0SSuyog Pawar typedef struct enc_loop_cu_final_prms_t 498*c83a76b0SSuyog Pawar { 499*c83a76b0SSuyog Pawar recon_datastore_t s_recon_datastore; 500*c83a76b0SSuyog Pawar 501*c83a76b0SSuyog Pawar /** 502*c83a76b0SSuyog Pawar * Cu size of the current cu being processed 503*c83a76b0SSuyog Pawar */ 504*c83a76b0SSuyog Pawar UWORD8 u1_cu_size; 505*c83a76b0SSuyog Pawar /** 506*c83a76b0SSuyog Pawar * flags to indicate the final cu prediction mode 507*c83a76b0SSuyog Pawar */ 508*c83a76b0SSuyog Pawar UWORD8 u1_intra_flag; 509*c83a76b0SSuyog Pawar 510*c83a76b0SSuyog Pawar /** 511*c83a76b0SSuyog Pawar * flags to indicate Skip mode for CU 512*c83a76b0SSuyog Pawar */ 513*c83a76b0SSuyog Pawar UWORD8 u1_skip_flag; 514*c83a76b0SSuyog Pawar 515*c83a76b0SSuyog Pawar /** 516*c83a76b0SSuyog Pawar * number of tu in current cu for a given mode 517*c83a76b0SSuyog Pawar * if skip then this value should be 1 518*c83a76b0SSuyog Pawar */ 519*c83a76b0SSuyog Pawar UWORD16 u2_num_tus_in_cu; 520*c83a76b0SSuyog Pawar 521*c83a76b0SSuyog Pawar /** 522*c83a76b0SSuyog Pawar * number of pu in current cu for a given mode 523*c83a76b0SSuyog Pawar * if skip then this value should be 1 524*c83a76b0SSuyog Pawar */ 525*c83a76b0SSuyog Pawar UWORD16 u2_num_pus_in_cu; 526*c83a76b0SSuyog Pawar 527*c83a76b0SSuyog Pawar /** 528*c83a76b0SSuyog Pawar * total bytes produced in ECD data buffer 529*c83a76b0SSuyog Pawar * if skip then this value should be 0 530*c83a76b0SSuyog Pawar */ 531*c83a76b0SSuyog Pawar WORD32 i4_num_bytes_ecd_data; 532*c83a76b0SSuyog Pawar 533*c83a76b0SSuyog Pawar /** 534*c83a76b0SSuyog Pawar * Partition mode of the best candidate 535*c83a76b0SSuyog Pawar * if skip then this value should be SIZE_2Nx2N 536*c83a76b0SSuyog Pawar * @sa PART_SIZE_E 537*c83a76b0SSuyog Pawar */ 538*c83a76b0SSuyog Pawar UWORD8 u1_part_mode; 539*c83a76b0SSuyog Pawar 540*c83a76b0SSuyog Pawar /** 541*c83a76b0SSuyog Pawar * indicates if inter cu has coded coeffs 1: coded, 0: not coded 542*c83a76b0SSuyog Pawar * if skip then this value shoudl be ignored 543*c83a76b0SSuyog Pawar */ 544*c83a76b0SSuyog Pawar UWORD8 u1_is_cu_coded; 545*c83a76b0SSuyog Pawar 546*c83a76b0SSuyog Pawar /** 547*c83a76b0SSuyog Pawar * Chroma pred mode as signalled in bitstream 548*c83a76b0SSuyog Pawar */ 549*c83a76b0SSuyog Pawar UWORD8 u1_chroma_intra_pred_mode; 550*c83a76b0SSuyog Pawar 551*c83a76b0SSuyog Pawar /** 552*c83a76b0SSuyog Pawar * To store the best chroma mode for TU. Will be same for NxN case. 553*c83a76b0SSuyog Pawar * Actual Chroma pred 554*c83a76b0SSuyog Pawar */ 555*c83a76b0SSuyog Pawar UWORD8 u1_chroma_intra_pred_actual_mode; 556*c83a76b0SSuyog Pawar 557*c83a76b0SSuyog Pawar /** 558*c83a76b0SSuyog Pawar * sad accumulated over all Tus of given CU 559*c83a76b0SSuyog Pawar */ 560*c83a76b0SSuyog Pawar UWORD32 u4_cu_sad; 561*c83a76b0SSuyog Pawar 562*c83a76b0SSuyog Pawar /** 563*c83a76b0SSuyog Pawar * sad accumulated over all Tus of given CU 564*c83a76b0SSuyog Pawar */ 565*c83a76b0SSuyog Pawar LWORD64 i8_cu_ssd; 566*c83a76b0SSuyog Pawar 567*c83a76b0SSuyog Pawar /** 568*c83a76b0SSuyog Pawar * open loop intra sad 569*c83a76b0SSuyog Pawar */ 570*c83a76b0SSuyog Pawar UWORD32 u4_cu_open_intra_sad; 571*c83a76b0SSuyog Pawar 572*c83a76b0SSuyog Pawar /** 573*c83a76b0SSuyog Pawar * header bits of cu estimated during RDO evaluation. 574*c83a76b0SSuyog Pawar * Includes tu splits flags excludes cbf flags 575*c83a76b0SSuyog Pawar */ 576*c83a76b0SSuyog Pawar UWORD32 u4_cu_hdr_bits; 577*c83a76b0SSuyog Pawar /** 578*c83a76b0SSuyog Pawar * luma residual bits of a cu estimated during RDO evaluation. 579*c83a76b0SSuyog Pawar */ 580*c83a76b0SSuyog Pawar UWORD32 u4_cu_luma_res_bits; 581*c83a76b0SSuyog Pawar 582*c83a76b0SSuyog Pawar /** 583*c83a76b0SSuyog Pawar * chroma residual bits of a cu estimated during RDO evaluation. 584*c83a76b0SSuyog Pawar */ 585*c83a76b0SSuyog Pawar UWORD32 u4_cu_chroma_res_bits; 586*c83a76b0SSuyog Pawar 587*c83a76b0SSuyog Pawar /** 588*c83a76b0SSuyog Pawar * cbf bits of a cu estimated during RDO evaluation (considered as part of texture bits later) 589*c83a76b0SSuyog Pawar */ 590*c83a76b0SSuyog Pawar UWORD32 u4_cu_cbf_bits; 591*c83a76b0SSuyog Pawar 592*c83a76b0SSuyog Pawar /** 593*c83a76b0SSuyog Pawar * array of PU for current CU 594*c83a76b0SSuyog Pawar * For Inter PUs this will contain the follwoing 595*c83a76b0SSuyog Pawar * - merge flag 596*c83a76b0SSuyog Pawar * - (MVD and reference indicies) or (Merge Index) 597*c83a76b0SSuyog Pawar * - (if Cu is skipped then Merge index for skip 598*c83a76b0SSuyog Pawar * will be in 1st PU entry in array) 599*c83a76b0SSuyog Pawar * for intra PU only intra flag will be set to 1 600*c83a76b0SSuyog Pawar * 601*c83a76b0SSuyog Pawar */ 602*c83a76b0SSuyog Pawar pu_t as_pu_enc_loop[NUM_PU_PARTS]; 603*c83a76b0SSuyog Pawar 604*c83a76b0SSuyog Pawar /** 605*c83a76b0SSuyog Pawar * array of PU for chroma usage 606*c83a76b0SSuyog Pawar * in case of Merge MVs and reference idx of the final candidate 607*c83a76b0SSuyog Pawar * used by luma need sto be stored 608*c83a76b0SSuyog Pawar * for intra PU this will not be used 609*c83a76b0SSuyog Pawar */ 610*c83a76b0SSuyog Pawar pu_t as_pu_chrm_proc[NUM_PU_PARTS]; 611*c83a76b0SSuyog Pawar 612*c83a76b0SSuyog Pawar /** 613*c83a76b0SSuyog Pawar * array of colocated PU for current CU 614*c83a76b0SSuyog Pawar * MV and Ref pic id should be stored in this 615*c83a76b0SSuyog Pawar * for intra PU only intra flag will be set to 1 616*c83a76b0SSuyog Pawar */ 617*c83a76b0SSuyog Pawar pu_col_mv_t as_col_pu_enc_loop[NUM_INTER_PU_PARTS]; 618*c83a76b0SSuyog Pawar 619*c83a76b0SSuyog Pawar /** array to store the intra mode pred related params 620*c83a76b0SSuyog Pawar * if nxn mode the all 4 lcoations will be used 621*c83a76b0SSuyog Pawar */ 622*c83a76b0SSuyog Pawar intra_prev_rem_flags_t as_intra_prev_rem[NUM_PU_PARTS]; 623*c83a76b0SSuyog Pawar 624*c83a76b0SSuyog Pawar /** 625*c83a76b0SSuyog Pawar * array to store TU propeties of the each tu in a CU 626*c83a76b0SSuyog Pawar */ 627*c83a76b0SSuyog Pawar tu_enc_loop_out_t as_tu_enc_loop[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW]; 628*c83a76b0SSuyog Pawar 629*c83a76b0SSuyog Pawar /** 630*c83a76b0SSuyog Pawar * array to store TU propeties (req. for enc_loop only and not for 631*c83a76b0SSuyog Pawar * entropy) of the each tu in a CU 632*c83a76b0SSuyog Pawar */ 633*c83a76b0SSuyog Pawar tu_enc_loop_temp_prms_t as_tu_enc_loop_temp_prms[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW]; 634*c83a76b0SSuyog Pawar 635*c83a76b0SSuyog Pawar /** 636*c83a76b0SSuyog Pawar * Neighbour flags stored for chroma reuse 637*c83a76b0SSuyog Pawar */ 638*c83a76b0SSuyog Pawar UWORD32 au4_nbr_flags[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW]; 639*c83a76b0SSuyog Pawar 640*c83a76b0SSuyog Pawar /** 641*c83a76b0SSuyog Pawar * intra pred modes stored for chroma reuse 642*c83a76b0SSuyog Pawar */ 643*c83a76b0SSuyog Pawar UWORD8 au1_intra_pred_mode[4]; 644*c83a76b0SSuyog Pawar 645*c83a76b0SSuyog Pawar /** 646*c83a76b0SSuyog Pawar * array for storing coeffs during RD opt stage at CU level. 647*c83a76b0SSuyog Pawar * Luma and chroma together 648*c83a76b0SSuyog Pawar */ 649*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_coeffs; 650*c83a76b0SSuyog Pawar 651*c83a76b0SSuyog Pawar /** 652*c83a76b0SSuyog Pawar * Chroma deq_coeffs start point in the ai2_cu_deq_coeffs buffer. 653*c83a76b0SSuyog Pawar */ 654*c83a76b0SSuyog Pawar WORD32 i4_chrm_cu_coeff_strt_idx; 655*c83a76b0SSuyog Pawar 656*c83a76b0SSuyog Pawar /** 657*c83a76b0SSuyog Pawar * array for storing dequantized vals. during RD opt stage at CU level 658*c83a76b0SSuyog Pawar * Luma and chroma together. 659*c83a76b0SSuyog Pawar * Stride is assumed to be cu_size 660*c83a76b0SSuyog Pawar * u-v interleaved storing is at TU level 661*c83a76b0SSuyog Pawar */ 662*c83a76b0SSuyog Pawar WORD16 *pi2_cu_deq_coeffs; 663*c83a76b0SSuyog Pawar 664*c83a76b0SSuyog Pawar /** 665*c83a76b0SSuyog Pawar * Chroma deq_coeffs start point in the ai2_cu_deq_coeffs buffer. 666*c83a76b0SSuyog Pawar */ 667*c83a76b0SSuyog Pawar WORD32 i4_chrm_deq_coeff_strt_idx; 668*c83a76b0SSuyog Pawar 669*c83a76b0SSuyog Pawar /** 670*c83a76b0SSuyog Pawar * The total RDOPT cost of the CU for the best mode 671*c83a76b0SSuyog Pawar */ 672*c83a76b0SSuyog Pawar LWORD64 i8_best_rdopt_cost; 673*c83a76b0SSuyog Pawar 674*c83a76b0SSuyog Pawar /** 675*c83a76b0SSuyog Pawar * The current running RDOPT cost for the current mode 676*c83a76b0SSuyog Pawar */ 677*c83a76b0SSuyog Pawar LWORD64 i8_curr_rdopt_cost; 678*c83a76b0SSuyog Pawar 679*c83a76b0SSuyog Pawar LWORD64 i8_best_distortion; 680*c83a76b0SSuyog Pawar 681*c83a76b0SSuyog Pawar } enc_loop_cu_final_prms_t; 682*c83a76b0SSuyog Pawar 683*c83a76b0SSuyog Pawar typedef struct 684*c83a76b0SSuyog Pawar { 685*c83a76b0SSuyog Pawar /** Current Cu chroma recon pointer in pic buffer */ 686*c83a76b0SSuyog Pawar UWORD8 *pu1_final_recon; 687*c83a76b0SSuyog Pawar 688*c83a76b0SSuyog Pawar UWORD16 *pu2_final_recon; 689*c83a76b0SSuyog Pawar 690*c83a76b0SSuyog Pawar /** Current Cu chroma source pointer in pic buffer */ 691*c83a76b0SSuyog Pawar UWORD8 *pu1_curr_src; 692*c83a76b0SSuyog Pawar 693*c83a76b0SSuyog Pawar UWORD16 *pu2_curr_src; 694*c83a76b0SSuyog Pawar 695*c83a76b0SSuyog Pawar /** Current CU chroma reocn buffer stride */ 696*c83a76b0SSuyog Pawar WORD32 i4_chrm_recon_stride; 697*c83a76b0SSuyog Pawar 698*c83a76b0SSuyog Pawar /** Current CU chroma source buffer stride */ 699*c83a76b0SSuyog Pawar WORD32 i4_chrm_src_stride; 700*c83a76b0SSuyog Pawar 701*c83a76b0SSuyog Pawar /** Current Cu chroma Left pointer for intra pred */ 702*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_left; 703*c83a76b0SSuyog Pawar 704*c83a76b0SSuyog Pawar UWORD16 *pu2_cu_left; 705*c83a76b0SSuyog Pawar 706*c83a76b0SSuyog Pawar /** Left buffer stride */ 707*c83a76b0SSuyog Pawar WORD32 i4_cu_left_stride; 708*c83a76b0SSuyog Pawar 709*c83a76b0SSuyog Pawar /** Current Cu chroma top pointer for intra pred */ 710*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_top; 711*c83a76b0SSuyog Pawar 712*c83a76b0SSuyog Pawar UWORD16 *pu2_cu_top; 713*c83a76b0SSuyog Pawar 714*c83a76b0SSuyog Pawar /** Current Cu chroma top left pointer for intra pred */ 715*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_top_left; 716*c83a76b0SSuyog Pawar 717*c83a76b0SSuyog Pawar UWORD16 *pu2_cu_top_left; 718*c83a76b0SSuyog Pawar 719*c83a76b0SSuyog Pawar } enc_loop_chrm_cu_buf_prms_t; 720*c83a76b0SSuyog Pawar 721*c83a76b0SSuyog Pawar typedef struct 722*c83a76b0SSuyog Pawar { 723*c83a76b0SSuyog Pawar /** cost of the current satd cand */ 724*c83a76b0SSuyog Pawar WORD32 i4_cost; 725*c83a76b0SSuyog Pawar 726*c83a76b0SSuyog Pawar /** tu size w.r.t to cu of the current satd cand 727*c83a76b0SSuyog Pawar * @sa TU_SIZE_WRT_CU_T 728*c83a76b0SSuyog Pawar */ 729*c83a76b0SSuyog Pawar WORD8 i4_tu_depth; 730*c83a76b0SSuyog Pawar 731*c83a76b0SSuyog Pawar /** 732*c83a76b0SSuyog Pawar * access valid number of entries in this array based on u1_part_size 733*c83a76b0SSuyog Pawar */ 734*c83a76b0SSuyog Pawar UWORD8 au1_intra_luma_modes[NUM_PU_PARTS]; 735*c83a76b0SSuyog Pawar 736*c83a76b0SSuyog Pawar /** @remarks u1_part_size 2Nx2N or NxN */ 737*c83a76b0SSuyog Pawar UWORD8 u1_part_mode; /* @sa: PART_SIZE_E */ 738*c83a76b0SSuyog Pawar 739*c83a76b0SSuyog Pawar /** Flag to indicate whether current candidate needs to be evaluated */ 740*c83a76b0SSuyog Pawar UWORD8 u1_eval_flag; 741*c83a76b0SSuyog Pawar 742*c83a76b0SSuyog Pawar } cu_intra_satd_out_t; 743*c83a76b0SSuyog Pawar 744*c83a76b0SSuyog Pawar /** \brief cu level parameters for SATD / RDOPT function */ 745*c83a76b0SSuyog Pawar 746*c83a76b0SSuyog Pawar typedef struct 747*c83a76b0SSuyog Pawar { 748*c83a76b0SSuyog Pawar /** pointer to source luma pointer 749*c83a76b0SSuyog Pawar * pointer will be pointing to CTB start location 750*c83a76b0SSuyog Pawar * At CU level based on the CU position this pointer 751*c83a76b0SSuyog Pawar * has to appropriately incremented 752*c83a76b0SSuyog Pawar */ 753*c83a76b0SSuyog Pawar UWORD8 *pu1_luma_src; 754*c83a76b0SSuyog Pawar 755*c83a76b0SSuyog Pawar UWORD16 *pu2_luma_src; 756*c83a76b0SSuyog Pawar 757*c83a76b0SSuyog Pawar /** pointer to source chroma pointer 758*c83a76b0SSuyog Pawar * pointer will be pointing to CTB start location 759*c83a76b0SSuyog Pawar * At CU level based on the CU position this pointer 760*c83a76b0SSuyog Pawar * has to appropriately incremented 761*c83a76b0SSuyog Pawar */ 762*c83a76b0SSuyog Pawar UWORD8 *pu1_chrm_src; 763*c83a76b0SSuyog Pawar 764*c83a76b0SSuyog Pawar UWORD16 *pu2_chrm_src; 765*c83a76b0SSuyog Pawar 766*c83a76b0SSuyog Pawar /** pointer to recon luma pointer 767*c83a76b0SSuyog Pawar * pointer will be pointing to CTB start location 768*c83a76b0SSuyog Pawar * At CU level based on the CU position this pointer 769*c83a76b0SSuyog Pawar * has to appropriately incremented 770*c83a76b0SSuyog Pawar */ 771*c83a76b0SSuyog Pawar UWORD8 *pu1_luma_recon; 772*c83a76b0SSuyog Pawar 773*c83a76b0SSuyog Pawar UWORD16 *pu2_luma_recon; 774*c83a76b0SSuyog Pawar 775*c83a76b0SSuyog Pawar /** pointer to recon chroma pointer 776*c83a76b0SSuyog Pawar * pointer will be pointing to CTB start location 777*c83a76b0SSuyog Pawar * At CU level based on the CU position this pointer 778*c83a76b0SSuyog Pawar * has to appropriately incremented 779*c83a76b0SSuyog Pawar */ 780*c83a76b0SSuyog Pawar UWORD8 *pu1_chrm_recon; 781*c83a76b0SSuyog Pawar 782*c83a76b0SSuyog Pawar UWORD16 *pu2_chrm_recon; 783*c83a76b0SSuyog Pawar 784*c83a76b0SSuyog Pawar /*1st pass parallel dpb buffer pointers aimilar to the above*/ 785*c83a76b0SSuyog Pawar UWORD8 *pu1_luma_recon_src; 786*c83a76b0SSuyog Pawar 787*c83a76b0SSuyog Pawar UWORD16 *pu2_luma_recon_src; 788*c83a76b0SSuyog Pawar 789*c83a76b0SSuyog Pawar UWORD8 *pu1_chrm_recon_src; 790*c83a76b0SSuyog Pawar 791*c83a76b0SSuyog Pawar UWORD16 *pu2_chrm_recon_src; 792*c83a76b0SSuyog Pawar 793*c83a76b0SSuyog Pawar /** Pointer to Subpel Plane Buffer */ 794*c83a76b0SSuyog Pawar UWORD8 *pu1_sbpel_hxfy; 795*c83a76b0SSuyog Pawar 796*c83a76b0SSuyog Pawar /** Pointer to Subpel Plane Buffer */ 797*c83a76b0SSuyog Pawar UWORD8 *pu1_sbpel_fxhy; 798*c83a76b0SSuyog Pawar 799*c83a76b0SSuyog Pawar /** Pointer to Subpel Plane Buffer */ 800*c83a76b0SSuyog Pawar UWORD8 *pu1_sbpel_hxhy; 801*c83a76b0SSuyog Pawar 802*c83a76b0SSuyog Pawar /** Luma source stride */ 803*c83a76b0SSuyog Pawar WORD32 i4_luma_src_stride; 804*c83a76b0SSuyog Pawar 805*c83a76b0SSuyog Pawar /** chroma soruce stride */ 806*c83a76b0SSuyog Pawar WORD32 i4_chrm_src_stride; 807*c83a76b0SSuyog Pawar 808*c83a76b0SSuyog Pawar /** Luma recon stride */ 809*c83a76b0SSuyog Pawar WORD32 i4_luma_recon_stride; 810*c83a76b0SSuyog Pawar 811*c83a76b0SSuyog Pawar /** chroma recon stride */ 812*c83a76b0SSuyog Pawar WORD32 i4_chrm_recon_stride; 813*c83a76b0SSuyog Pawar 814*c83a76b0SSuyog Pawar /** ctb size */ 815*c83a76b0SSuyog Pawar WORD32 i4_ctb_size; 816*c83a76b0SSuyog Pawar 817*c83a76b0SSuyog Pawar /** current ctb postion horz */ 818*c83a76b0SSuyog Pawar WORD32 i4_ctb_pos; 819*c83a76b0SSuyog Pawar 820*c83a76b0SSuyog Pawar /** number of PU finalized for curr CU */ 821*c83a76b0SSuyog Pawar WORD32 i4_num_pus_in_cu; 822*c83a76b0SSuyog Pawar 823*c83a76b0SSuyog Pawar /** number of bytes consumed for current in ecd data buf */ 824*c83a76b0SSuyog Pawar WORD32 i4_num_bytes_cons; 825*c83a76b0SSuyog Pawar 826*c83a76b0SSuyog Pawar UWORD8 u1_is_cu_noisy; 827*c83a76b0SSuyog Pawar 828*c83a76b0SSuyog Pawar UWORD8 *pu1_is_8x8Blk_noisy; 829*c83a76b0SSuyog Pawar 830*c83a76b0SSuyog Pawar } enc_loop_cu_prms_t; 831*c83a76b0SSuyog Pawar 832*c83a76b0SSuyog Pawar /** 833*c83a76b0SSuyog Pawar ****************************************************************************** 834*c83a76b0SSuyog Pawar * @brief Pad inter pred recon context 835*c83a76b0SSuyog Pawar ****************************************************************************** 836*c83a76b0SSuyog Pawar */ 837*c83a76b0SSuyog Pawar typedef struct 838*c83a76b0SSuyog Pawar { 839*c83a76b0SSuyog Pawar /** Pointer to Subpel Plane Buffer */ 840*c83a76b0SSuyog Pawar UWORD8 *pu1_sbpel_hxfy; 841*c83a76b0SSuyog Pawar 842*c83a76b0SSuyog Pawar /** Pointer to Subpel Plane Buffer */ 843*c83a76b0SSuyog Pawar UWORD8 *pu1_sbpel_fxhy; 844*c83a76b0SSuyog Pawar 845*c83a76b0SSuyog Pawar /** Pointer to Subpel Plane Buffer */ 846*c83a76b0SSuyog Pawar UWORD8 *pu1_sbpel_hxhy; 847*c83a76b0SSuyog Pawar 848*c83a76b0SSuyog Pawar /** pointer to recon luma pointer 849*c83a76b0SSuyog Pawar * pointer will be pointing to CTB start location 850*c83a76b0SSuyog Pawar * At CU level based on the CU position this pointer 851*c83a76b0SSuyog Pawar * has to appropriately incremented 852*c83a76b0SSuyog Pawar */ 853*c83a76b0SSuyog Pawar UWORD8 *pu1_luma_recon; 854*c83a76b0SSuyog Pawar 855*c83a76b0SSuyog Pawar /** pointer to recon chroma pointer 856*c83a76b0SSuyog Pawar * pointer will be pointing to CTB start location 857*c83a76b0SSuyog Pawar * At CU level based on the CU position this pointer 858*c83a76b0SSuyog Pawar * has to appropriately incremented 859*c83a76b0SSuyog Pawar */ 860*c83a76b0SSuyog Pawar UWORD8 *pu1_chrm_recon; 861*c83a76b0SSuyog Pawar 862*c83a76b0SSuyog Pawar /*FOr recon source 1st pass starts*/ 863*c83a76b0SSuyog Pawar 864*c83a76b0SSuyog Pawar UWORD8 *pu1_luma_recon_src; 865*c83a76b0SSuyog Pawar 866*c83a76b0SSuyog Pawar /** pointer to recon chroma pointer 867*c83a76b0SSuyog Pawar * pointer will be pointing to CTB start location 868*c83a76b0SSuyog Pawar * At CU level based on the CU position this pointer 869*c83a76b0SSuyog Pawar * has to appropriately incremented 870*c83a76b0SSuyog Pawar */ 871*c83a76b0SSuyog Pawar UWORD8 *pu1_chrm_recon_src; 872*c83a76b0SSuyog Pawar /*FOr recon source 1st pass ends */ 873*c83a76b0SSuyog Pawar /** Luma recon stride */ 874*c83a76b0SSuyog Pawar WORD32 i4_luma_recon_stride; 875*c83a76b0SSuyog Pawar 876*c83a76b0SSuyog Pawar /** chroma recon stride */ 877*c83a76b0SSuyog Pawar WORD32 i4_chrm_recon_stride; 878*c83a76b0SSuyog Pawar 879*c83a76b0SSuyog Pawar /** ctb size */ 880*c83a76b0SSuyog Pawar WORD32 i4_ctb_size; 881*c83a76b0SSuyog Pawar 882*c83a76b0SSuyog Pawar /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */ 883*c83a76b0SSuyog Pawar UWORD8 u1_chroma_array_type; 884*c83a76b0SSuyog Pawar 885*c83a76b0SSuyog Pawar } pad_interp_recon_frm_t; 886*c83a76b0SSuyog Pawar 887*c83a76b0SSuyog Pawar /** 888*c83a76b0SSuyog Pawar ****************************************************************************** 889*c83a76b0SSuyog Pawar * @brief inter prediction (MC) context for enc loop 890*c83a76b0SSuyog Pawar ****************************************************************************** 891*c83a76b0SSuyog Pawar */ 892*c83a76b0SSuyog Pawar /*IMPORTANT please keep inter_pred_ctxt_t and inter_pred_me_ctxt_t as identical*/ 893*c83a76b0SSuyog Pawar typedef struct 894*c83a76b0SSuyog Pawar { 895*c83a76b0SSuyog Pawar /** pointer to reference lists */ 896*c83a76b0SSuyog Pawar recon_pic_buf_t *(*ps_ref_list)[HEVCE_MAX_REF_PICS * 2]; 897*c83a76b0SSuyog Pawar 898*c83a76b0SSuyog Pawar /** scratch buffer for horizontal interpolation destination */ 899*c83a76b0SSuyog Pawar WORD16 MEM_ALIGN16 ai2_horz_scratch[MAX_CTB_SIZE * (MAX_CTB_SIZE + 8)]; 900*c83a76b0SSuyog Pawar 901*c83a76b0SSuyog Pawar /** scratch 16 bit buffer for interpolation in l0 direction */ 902*c83a76b0SSuyog Pawar WORD16 MEM_ALIGN16 ai2_scratch_buf_l0[MAX_CTB_SIZE * MAX_CTB_SIZE]; 903*c83a76b0SSuyog Pawar 904*c83a76b0SSuyog Pawar /** scratch 16 bit buffer for interpolation in l1 direction */ 905*c83a76b0SSuyog Pawar WORD16 MEM_ALIGN16 ai2_scratch_buf_l1[MAX_CTB_SIZE * MAX_CTB_SIZE]; 906*c83a76b0SSuyog Pawar 907*c83a76b0SSuyog Pawar /** Pointer to struct containing function pointers to 908*c83a76b0SSuyog Pawar functions in the 'common' library' */ 909*c83a76b0SSuyog Pawar func_selector_t *ps_func_selector; 910*c83a76b0SSuyog Pawar 911*c83a76b0SSuyog Pawar /** common denominator used for luma weights */ 912*c83a76b0SSuyog Pawar WORD32 i4_log2_luma_wght_denom; 913*c83a76b0SSuyog Pawar 914*c83a76b0SSuyog Pawar /** common denominator used for chroma weights */ 915*c83a76b0SSuyog Pawar WORD32 i4_log2_chroma_wght_denom; 916*c83a76b0SSuyog Pawar 917*c83a76b0SSuyog Pawar /** offset w.r.t frame start in horz direction (pels) */ 918*c83a76b0SSuyog Pawar WORD32 i4_ctb_frm_pos_x; 919*c83a76b0SSuyog Pawar 920*c83a76b0SSuyog Pawar /** offset w.r.t frame start in vert direction (pels) */ 921*c83a76b0SSuyog Pawar WORD32 i4_ctb_frm_pos_y; 922*c83a76b0SSuyog Pawar 923*c83a76b0SSuyog Pawar /* Bit Depth of Input */ 924*c83a76b0SSuyog Pawar WORD32 i4_bit_depth; 925*c83a76b0SSuyog Pawar 926*c83a76b0SSuyog Pawar /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */ 927*c83a76b0SSuyog Pawar UWORD8 u1_chroma_array_type; 928*c83a76b0SSuyog Pawar 929*c83a76b0SSuyog Pawar /** weighted_pred_flag */ 930*c83a76b0SSuyog Pawar WORD8 i1_weighted_pred_flag; 931*c83a76b0SSuyog Pawar 932*c83a76b0SSuyog Pawar /** weighted_bipred_flag */ 933*c83a76b0SSuyog Pawar WORD8 i1_weighted_bipred_flag; 934*c83a76b0SSuyog Pawar 935*c83a76b0SSuyog Pawar /** Structure to describe extra CTBs around frame due to search 936*c83a76b0SSuyog Pawar range associated with distributed-mode. Entries are top, left, 937*c83a76b0SSuyog Pawar right and bottom */ 938*c83a76b0SSuyog Pawar WORD32 ai4_tile_xtra_pel[4]; 939*c83a76b0SSuyog Pawar 940*c83a76b0SSuyog Pawar } inter_pred_ctxt_t; 941*c83a76b0SSuyog Pawar /*IMPORTANT please keep inter_pred_ctxt_t and inter_pred_me_ctxt_t as identical*/ 942*c83a76b0SSuyog Pawar 943*c83a76b0SSuyog Pawar typedef IV_API_CALL_STATUS_T (*PF_LUMA_INTER_PRED_PU)( 944*c83a76b0SSuyog Pawar void *pv_inter_pred_ctxt, 945*c83a76b0SSuyog Pawar pu_t *ps_pu, 946*c83a76b0SSuyog Pawar void *pv_dst_buf, 947*c83a76b0SSuyog Pawar WORD32 dst_stride, 948*c83a76b0SSuyog Pawar WORD32 i4_flag_inter_pred_source); 949*c83a76b0SSuyog Pawar 950*c83a76b0SSuyog Pawar /** 951*c83a76b0SSuyog Pawar ****************************************************************************** 952*c83a76b0SSuyog Pawar * @brief Motion predictor context structure 953*c83a76b0SSuyog Pawar ****************************************************************************** 954*c83a76b0SSuyog Pawar */ 955*c83a76b0SSuyog Pawar typedef struct 956*c83a76b0SSuyog Pawar { 957*c83a76b0SSuyog Pawar /** pointer to reference lists */ 958*c83a76b0SSuyog Pawar recon_pic_buf_t *(*ps_ref_list)[HEVCE_MAX_REF_PICS * 2]; 959*c83a76b0SSuyog Pawar 960*c83a76b0SSuyog Pawar /** pointer to the slice header */ 961*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr; 962*c83a76b0SSuyog Pawar 963*c83a76b0SSuyog Pawar /** pointer to SPS */ 964*c83a76b0SSuyog Pawar sps_t *ps_sps; 965*c83a76b0SSuyog Pawar 966*c83a76b0SSuyog Pawar /** CTB x. In CTB unit*/ 967*c83a76b0SSuyog Pawar WORD32 i4_ctb_x; 968*c83a76b0SSuyog Pawar 969*c83a76b0SSuyog Pawar /** CTB y. In CTB unit */ 970*c83a76b0SSuyog Pawar WORD32 i4_ctb_y; 971*c83a76b0SSuyog Pawar 972*c83a76b0SSuyog Pawar /** Log2 Parallel Merge Level - 2 */ 973*c83a76b0SSuyog Pawar WORD32 i4_log2_parallel_merge_level_minus2; 974*c83a76b0SSuyog Pawar 975*c83a76b0SSuyog Pawar /* Number of extra CTBs external to tile due to fetched search-range around Tile */ 976*c83a76b0SSuyog Pawar /* TOP, left, right and bottom */ 977*c83a76b0SSuyog Pawar WORD32 ai4_tile_xtra_ctb[4]; 978*c83a76b0SSuyog Pawar 979*c83a76b0SSuyog Pawar } mv_pred_ctxt_t; 980*c83a76b0SSuyog Pawar 981*c83a76b0SSuyog Pawar /** 982*c83a76b0SSuyog Pawar ****************************************************************************** 983*c83a76b0SSuyog Pawar * @brief Deblocking and Boundary strength CTB level structure 984*c83a76b0SSuyog Pawar ****************************************************************************** 985*c83a76b0SSuyog Pawar */ 986*c83a76b0SSuyog Pawar typedef struct 987*c83a76b0SSuyog Pawar { 988*c83a76b0SSuyog Pawar /** Array to store the packed BS values in horizontal direction */ 989*c83a76b0SSuyog Pawar UWORD32 au4_horz_bs[(MAX_CTB_SIZE >> 3) + 1]; 990*c83a76b0SSuyog Pawar 991*c83a76b0SSuyog Pawar /** Array to store the packed BS values in vertical direction */ 992*c83a76b0SSuyog Pawar UWORD32 au4_vert_bs[(MAX_CTB_SIZE >> 3) + 1]; 993*c83a76b0SSuyog Pawar 994*c83a76b0SSuyog Pawar /** CTB neighbour availability flags for deblocking */ 995*c83a76b0SSuyog Pawar UWORD8 u1_not_first_ctb_col_of_frame; 996*c83a76b0SSuyog Pawar UWORD8 u1_not_first_ctb_row_of_frame; 997*c83a76b0SSuyog Pawar 998*c83a76b0SSuyog Pawar } deblk_bs_ctb_ctxt_t; 999*c83a76b0SSuyog Pawar 1000*c83a76b0SSuyog Pawar /** 1001*c83a76b0SSuyog Pawar ****************************************************************************** 1002*c83a76b0SSuyog Pawar * @brief Deblocking and CTB level structure 1003*c83a76b0SSuyog Pawar ****************************************************************************** 1004*c83a76b0SSuyog Pawar */ 1005*c83a76b0SSuyog Pawar typedef struct 1006*c83a76b0SSuyog Pawar { 1007*c83a76b0SSuyog Pawar /** 1008*c83a76b0SSuyog Pawar * BS of the last vertical 4x4 column of previous CTB 1009*c83a76b0SSuyog Pawar */ 1010*c83a76b0SSuyog Pawar UWORD8 au1_prev_bs[MAX_CTB_SIZE >> 3]; 1011*c83a76b0SSuyog Pawar 1012*c83a76b0SSuyog Pawar /** 1013*c83a76b0SSuyog Pawar * BS of the last vertical 4x4 column of previous CTB 1014*c83a76b0SSuyog Pawar */ 1015*c83a76b0SSuyog Pawar UWORD8 au1_prev_bs_uv[MAX_CTB_SIZE >> 3]; 1016*c83a76b0SSuyog Pawar 1017*c83a76b0SSuyog Pawar /** pointer to top 4x4 ctb nbr structure; for accessing qp */ 1018*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_ctb_nbr_4x4; 1019*c83a76b0SSuyog Pawar 1020*c83a76b0SSuyog Pawar /** pointer to left 4x4 ctb nbr structure; for accessing qp */ 1021*c83a76b0SSuyog Pawar nbr_4x4_t *ps_left_ctb_nbr_4x4; 1022*c83a76b0SSuyog Pawar 1023*c83a76b0SSuyog Pawar /** pointer to current 4x4 ctb nbr structure; for accessing qp */ 1024*c83a76b0SSuyog Pawar nbr_4x4_t *ps_cur_ctb_4x4; 1025*c83a76b0SSuyog Pawar 1026*c83a76b0SSuyog Pawar /** max of 8 such contiguous bs to be computed for 64x64 ctb */ 1027*c83a76b0SSuyog Pawar UWORD32 *pu4_bs_horz; 1028*c83a76b0SSuyog Pawar 1029*c83a76b0SSuyog Pawar /** max of 8 such contiguous bs to be computed for 64x64 ctb */ 1030*c83a76b0SSuyog Pawar UWORD32 *pu4_bs_vert; 1031*c83a76b0SSuyog Pawar 1032*c83a76b0SSuyog Pawar /** ptr to current ctb luma pel in frame */ 1033*c83a76b0SSuyog Pawar UWORD8 *pu1_ctb_y; 1034*c83a76b0SSuyog Pawar 1035*c83a76b0SSuyog Pawar UWORD16 *pu2_ctb_y; 1036*c83a76b0SSuyog Pawar 1037*c83a76b0SSuyog Pawar /** ptr to current ctb sp interleaved chroma pel in frame */ 1038*c83a76b0SSuyog Pawar UWORD8 *pu1_ctb_uv; 1039*c83a76b0SSuyog Pawar 1040*c83a76b0SSuyog Pawar UWORD16 *pu2_ctb_uv; 1041*c83a76b0SSuyog Pawar 1042*c83a76b0SSuyog Pawar func_selector_t *ps_func_selector; 1043*c83a76b0SSuyog Pawar 1044*c83a76b0SSuyog Pawar /** left nbr buffer stride in terms of 4x4 units */ 1045*c83a76b0SSuyog Pawar WORD32 i4_left_nbr_4x4_strd; 1046*c83a76b0SSuyog Pawar 1047*c83a76b0SSuyog Pawar /** current buffer stride in terms of 4x4 units */ 1048*c83a76b0SSuyog Pawar WORD32 i4_cur_4x4_strd; 1049*c83a76b0SSuyog Pawar 1050*c83a76b0SSuyog Pawar /** size in pels 16 / 32 /64 */ 1051*c83a76b0SSuyog Pawar WORD32 i4_ctb_size; 1052*c83a76b0SSuyog Pawar 1053*c83a76b0SSuyog Pawar /** stride for luma */ 1054*c83a76b0SSuyog Pawar WORD32 i4_luma_pic_stride; 1055*c83a76b0SSuyog Pawar 1056*c83a76b0SSuyog Pawar /** stride for chroma */ 1057*c83a76b0SSuyog Pawar WORD32 i4_chroma_pic_stride; 1058*c83a76b0SSuyog Pawar 1059*c83a76b0SSuyog Pawar /** boolean indicating if left ctb edge is to be deblocked or not */ 1060*c83a76b0SSuyog Pawar WORD32 i4_deblock_left_ctb_edge; 1061*c83a76b0SSuyog Pawar 1062*c83a76b0SSuyog Pawar /** boolean indicating if top ctb edge is to be deblocked or not */ 1063*c83a76b0SSuyog Pawar WORD32 i4_deblock_top_ctb_edge; 1064*c83a76b0SSuyog Pawar 1065*c83a76b0SSuyog Pawar /** beta offset index */ 1066*c83a76b0SSuyog Pawar WORD32 i4_beta_offset_div2; 1067*c83a76b0SSuyog Pawar 1068*c83a76b0SSuyog Pawar /** tc offset index */ 1069*c83a76b0SSuyog Pawar WORD32 i4_tc_offset_div2; 1070*c83a76b0SSuyog Pawar 1071*c83a76b0SSuyog Pawar /** chroma cb qp offset index */ 1072*c83a76b0SSuyog Pawar WORD32 i4_cb_qp_indx_offset; 1073*c83a76b0SSuyog Pawar 1074*c83a76b0SSuyog Pawar /** chroma cr qp offset index */ 1075*c83a76b0SSuyog Pawar WORD32 i4_cr_qp_indx_offset; 1076*c83a76b0SSuyog Pawar 1077*c83a76b0SSuyog Pawar WORD32 i4_bit_depth; 1078*c83a76b0SSuyog Pawar 1079*c83a76b0SSuyog Pawar /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */ 1080*c83a76b0SSuyog Pawar UWORD8 u1_chroma_array_type; 1081*c83a76b0SSuyog Pawar 1082*c83a76b0SSuyog Pawar } deblk_ctb_params_t; 1083*c83a76b0SSuyog Pawar 1084*c83a76b0SSuyog Pawar /** 1085*c83a76b0SSuyog Pawar ****************************************************************************** 1086*c83a76b0SSuyog Pawar * @brief Stores the BS and Qp of a CTB row. For CTB-row level deblocking 1087*c83a76b0SSuyog Pawar ****************************************************************************** 1088*c83a76b0SSuyog Pawar */ 1089*c83a76b0SSuyog Pawar typedef struct deblk_ctbrow_prms 1090*c83a76b0SSuyog Pawar { 1091*c83a76b0SSuyog Pawar /** 1092*c83a76b0SSuyog Pawar * Refer to ihevce_enc_loop_get_mem_recs() and 1093*c83a76b0SSuyog Pawar * ihevce_enc_loop_init()for more info 1094*c83a76b0SSuyog Pawar * regarding memory allocation to each one below. 1095*c83a76b0SSuyog Pawar */ 1096*c83a76b0SSuyog Pawar 1097*c83a76b0SSuyog Pawar /** 1098*c83a76b0SSuyog Pawar * Stores the vertical boundary strength of a CTB row. 1099*c83a76b0SSuyog Pawar */ 1100*c83a76b0SSuyog Pawar UWORD32 *pu4_ctb_row_bs_vert; 1101*c83a76b0SSuyog Pawar 1102*c83a76b0SSuyog Pawar /** 1103*c83a76b0SSuyog Pawar * Storage is same as above. Contains horizontal BS. 1104*c83a76b0SSuyog Pawar */ 1105*c83a76b0SSuyog Pawar UWORD32 *pu4_ctb_row_bs_horz; 1106*c83a76b0SSuyog Pawar 1107*c83a76b0SSuyog Pawar /** 1108*c83a76b0SSuyog Pawar * Pointer to the CTB row's Qp storage 1109*c83a76b0SSuyog Pawar */ 1110*c83a76b0SSuyog Pawar WORD8 *pi1_ctb_row_qp; 1111*c83a76b0SSuyog Pawar 1112*c83a76b0SSuyog Pawar /** 1113*c83a76b0SSuyog Pawar * Stride of the pu1_ctb_row_qp_p buffer in WORD32 unit 1114*c83a76b0SSuyog Pawar */ 1115*c83a76b0SSuyog Pawar WORD32 u4_qp_buffer_stride; 1116*c83a76b0SSuyog Pawar 1117*c83a76b0SSuyog Pawar /* 1118*c83a76b0SSuyog Pawar * Pointer to the memory which contains the Qp of 1119*c83a76b0SSuyog Pawar * top4x4 neighbour blocks for each CTB row. 1120*c83a76b0SSuyog Pawar * This memory is at frame level. 1121*c83a76b0SSuyog Pawar */ 1122*c83a76b0SSuyog Pawar WORD8 *api1_qp_top_4x4_ctb_row[MAX_NUM_ENC_LOOP_PARALLEL]; 1123*c83a76b0SSuyog Pawar 1124*c83a76b0SSuyog Pawar /* 1125*c83a76b0SSuyog Pawar * Stride of the above memory location. 1126*c83a76b0SSuyog Pawar * Values in one-stride correspondes to one CTB row. 1127*c83a76b0SSuyog Pawar */ 1128*c83a76b0SSuyog Pawar WORD32 u4_qp_top_4x4_buf_strd; 1129*c83a76b0SSuyog Pawar 1130*c83a76b0SSuyog Pawar /*size of frm level qp buffer*/ 1131*c83a76b0SSuyog Pawar WORD32 u4_qp_top_4x4_buf_size; 1132*c83a76b0SSuyog Pawar 1133*c83a76b0SSuyog Pawar } deblk_ctbrow_prms_t; 1134*c83a76b0SSuyog Pawar 1135*c83a76b0SSuyog Pawar /** 1136*c83a76b0SSuyog Pawar ****************************************************************************** 1137*c83a76b0SSuyog Pawar * @brief Entropy rd opt context for cabac bit estimation and RDO 1138*c83a76b0SSuyog Pawar ****************************************************************************** 1139*c83a76b0SSuyog Pawar */ 1140*c83a76b0SSuyog Pawar typedef struct rdopt_entropy_ctxt 1141*c83a76b0SSuyog Pawar { 1142*c83a76b0SSuyog Pawar /** 1143*c83a76b0SSuyog Pawar * array for entropy contexts during RD opt stage at CU level 1144*c83a76b0SSuyog Pawar * one best and one current is required 1145*c83a76b0SSuyog Pawar */ 1146*c83a76b0SSuyog Pawar entropy_context_t as_cu_entropy_ctxt[2]; 1147*c83a76b0SSuyog Pawar 1148*c83a76b0SSuyog Pawar /** 1149*c83a76b0SSuyog Pawar * init state of entropy context models during CU RD opt stage, 1150*c83a76b0SSuyog Pawar * required for saving and restoring the cabac states 1151*c83a76b0SSuyog Pawar */ 1152*c83a76b0SSuyog Pawar UWORD8 au1_init_cabac_ctxt_states[IHEVC_CAB_CTXT_END]; 1153*c83a76b0SSuyog Pawar 1154*c83a76b0SSuyog Pawar /* 1155*c83a76b0SSuyog Pawar * ptr to top row cu skip flags (1 bit per 8x8CU) 1156*c83a76b0SSuyog Pawar */ 1157*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_skip_top_row; 1158*c83a76b0SSuyog Pawar 1159*c83a76b0SSuyog Pawar /** 1160*c83a76b0SSuyog Pawar * Current entropy ctxt idx 1161*c83a76b0SSuyog Pawar */ 1162*c83a76b0SSuyog Pawar WORD32 i4_curr_buf_idx; 1163*c83a76b0SSuyog Pawar 1164*c83a76b0SSuyog Pawar } rdopt_entropy_ctxt_t; 1165*c83a76b0SSuyog Pawar 1166*c83a76b0SSuyog Pawar /** 1167*c83a76b0SSuyog Pawar ****************************************************************************** 1168*c83a76b0SSuyog Pawar * @brief structure to save predicted data from Inter SATD stage to Inter RD opt stage 1169*c83a76b0SSuyog Pawar ****************************************************************************** 1170*c83a76b0SSuyog Pawar */ 1171*c83a76b0SSuyog Pawar typedef struct 1172*c83a76b0SSuyog Pawar { 1173*c83a76b0SSuyog Pawar /*Buffer to store the predicted data after motion compensation for merge and 1174*c83a76b0SSuyog Pawar * skip candidates. 1175*c83a76b0SSuyog Pawar * [2] Because for a given candidate we do motion compensation for 5 merge candidates. 1176*c83a76b0SSuyog Pawar * store the pred data after mc for the first 2 candidates and from 3rd candidate 1177*c83a76b0SSuyog Pawar * onwards, overwrite the data which has higher SATD cost. 1178*c83a76b0SSuyog Pawar */ 1179*c83a76b0SSuyog Pawar void *apv_pred_data[2]; 1180*c83a76b0SSuyog Pawar 1181*c83a76b0SSuyog Pawar /** Stride to store the predicted data 1182*c83a76b0SSuyog Pawar */ 1183*c83a76b0SSuyog Pawar WORD32 i4_pred_data_stride; 1184*c83a76b0SSuyog Pawar 1185*c83a76b0SSuyog Pawar } merge_skip_pred_data_t; 1186*c83a76b0SSuyog Pawar /** 1187*c83a76b0SSuyog Pawar ****************************************************************************** 1188*c83a76b0SSuyog Pawar * @brief Structure to hold Rate control related parameters 1189*c83a76b0SSuyog Pawar * for each bit-rate instance and each thread 1190*c83a76b0SSuyog Pawar ****************************************************************************** 1191*c83a76b0SSuyog Pawar */ 1192*c83a76b0SSuyog Pawar typedef struct 1193*c83a76b0SSuyog Pawar { 1194*c83a76b0SSuyog Pawar /** 1195*c83a76b0SSuyog Pawar *frame level open loop intra sad 1196*c83a76b0SSuyog Pawar * 1197*c83a76b0SSuyog Pawar */ 1198*c83a76b0SSuyog Pawar LWORD64 i8_frame_open_loop_ssd; 1199*c83a76b0SSuyog Pawar 1200*c83a76b0SSuyog Pawar /** 1201*c83a76b0SSuyog Pawar *frame level open loop intra sad 1202*c83a76b0SSuyog Pawar * 1203*c83a76b0SSuyog Pawar */ 1204*c83a76b0SSuyog Pawar UWORD32 u4_frame_open_loop_intra_sad; 1205*c83a76b0SSuyog Pawar /** 1206*c83a76b0SSuyog Pawar * frame level intra sad accumulator 1207*c83a76b0SSuyog Pawar */ 1208*c83a76b0SSuyog Pawar UWORD32 u4_frame_intra_sad; 1209*c83a76b0SSuyog Pawar 1210*c83a76b0SSuyog Pawar /** 1211*c83a76b0SSuyog Pawar * frame level sad accumulator 1212*c83a76b0SSuyog Pawar */ 1213*c83a76b0SSuyog Pawar UWORD32 u4_frame_sad_acc; 1214*c83a76b0SSuyog Pawar 1215*c83a76b0SSuyog Pawar /** 1216*c83a76b0SSuyog Pawar * frame level intra sad accumulator 1217*c83a76b0SSuyog Pawar */ 1218*c83a76b0SSuyog Pawar UWORD32 u4_frame_inter_sad_acc; 1219*c83a76b0SSuyog Pawar 1220*c83a76b0SSuyog Pawar /** 1221*c83a76b0SSuyog Pawar * frame level inter sad accumulator 1222*c83a76b0SSuyog Pawar */ 1223*c83a76b0SSuyog Pawar UWORD32 u4_frame_intra_sad_acc; 1224*c83a76b0SSuyog Pawar 1225*c83a76b0SSuyog Pawar /** 1226*c83a76b0SSuyog Pawar * frame level cost accumulator 1227*c83a76b0SSuyog Pawar */ 1228*c83a76b0SSuyog Pawar LWORD64 i8_frame_cost_acc; 1229*c83a76b0SSuyog Pawar 1230*c83a76b0SSuyog Pawar /** 1231*c83a76b0SSuyog Pawar * frame level intra cost accumulator 1232*c83a76b0SSuyog Pawar */ 1233*c83a76b0SSuyog Pawar LWORD64 i8_frame_inter_cost_acc; 1234*c83a76b0SSuyog Pawar 1235*c83a76b0SSuyog Pawar /** 1236*c83a76b0SSuyog Pawar * frame level inter cost accumulator 1237*c83a76b0SSuyog Pawar */ 1238*c83a76b0SSuyog Pawar LWORD64 i8_frame_intra_cost_acc; 1239*c83a76b0SSuyog Pawar 1240*c83a76b0SSuyog Pawar /** 1241*c83a76b0SSuyog Pawar * frame level rdopt bits accumulator 1242*c83a76b0SSuyog Pawar */ 1243*c83a76b0SSuyog Pawar UWORD32 u4_frame_rdopt_bits; 1244*c83a76b0SSuyog Pawar 1245*c83a76b0SSuyog Pawar /** 1246*c83a76b0SSuyog Pawar * frame level rdopt header bits accumulator 1247*c83a76b0SSuyog Pawar */ 1248*c83a76b0SSuyog Pawar UWORD32 u4_frame_rdopt_header_bits; 1249*c83a76b0SSuyog Pawar 1250*c83a76b0SSuyog Pawar /* Sum the Qps of each 8*8 block in CU 1251*c83a76b0SSuyog Pawar * 8*8 block is considered as Min CU size possible as per standard is 8 1252*c83a76b0SSuyog Pawar * 0 corresponds to INTER and 1 corresponds to INTRA 1253*c83a76b0SSuyog Pawar */ 1254*c83a76b0SSuyog Pawar WORD32 i4_qp_normalized_8x8_cu_sum[2]; 1255*c83a76b0SSuyog Pawar 1256*c83a76b0SSuyog Pawar /* Count the number of 8x8 blocks in each CU type (INTER/INTRA) 1257*c83a76b0SSuyog Pawar * 0 corresponds to INTER and 1 corresponds to INTRA 1258*c83a76b0SSuyog Pawar */ 1259*c83a76b0SSuyog Pawar WORD32 i4_8x8_cu_sum[2]; 1260*c83a76b0SSuyog Pawar 1261*c83a76b0SSuyog Pawar /* SAD/Qscale accumulated over all CUs. CU size is inherently 1262*c83a76b0SSuyog Pawar * taken care in SAD 1263*c83a76b0SSuyog Pawar */ 1264*c83a76b0SSuyog Pawar LWORD64 i8_sad_by_qscale[2]; 1265*c83a76b0SSuyog Pawar 1266*c83a76b0SSuyog Pawar } enc_loop_rc_params_t; 1267*c83a76b0SSuyog Pawar /** 1268*c83a76b0SSuyog Pawar ****************************************************************************** 1269*c83a76b0SSuyog Pawar * @brief CU information structure. This is to store the 1270*c83a76b0SSuyog Pawar * CU final out after Recursion 1271*c83a76b0SSuyog Pawar ****************************************************************************** 1272*c83a76b0SSuyog Pawar */ 1273*c83a76b0SSuyog Pawar typedef struct ihevce_enc_cu_node_ctxt_t 1274*c83a76b0SSuyog Pawar { 1275*c83a76b0SSuyog Pawar /* CU params */ 1276*c83a76b0SSuyog Pawar /** CU X position in terms of min CU (8x8) units */ 1277*c83a76b0SSuyog Pawar UWORD8 b3_cu_pos_x : 3; 1278*c83a76b0SSuyog Pawar 1279*c83a76b0SSuyog Pawar /** CU Y position in terms of min CU (8x8) units */ 1280*c83a76b0SSuyog Pawar UWORD8 b3_cu_pos_y : 3; 1281*c83a76b0SSuyog Pawar 1282*c83a76b0SSuyog Pawar /** reserved bytes */ 1283*c83a76b0SSuyog Pawar UWORD8 b2_reserved : 2; 1284*c83a76b0SSuyog Pawar 1285*c83a76b0SSuyog Pawar /** CU size 2N (width or height) in pixels */ 1286*c83a76b0SSuyog Pawar UWORD8 u1_cu_size; 1287*c83a76b0SSuyog Pawar 1288*c83a76b0SSuyog Pawar /** 1289*c83a76b0SSuyog Pawar * array for storing cu level final params for a given mode 1290*c83a76b0SSuyog Pawar * one best and one current is required 1291*c83a76b0SSuyog Pawar */ 1292*c83a76b0SSuyog Pawar enc_loop_cu_final_prms_t s_cu_prms; 1293*c83a76b0SSuyog Pawar 1294*c83a76b0SSuyog Pawar /** 1295*c83a76b0SSuyog Pawar * array for storing cu level final params for a given mode 1296*c83a76b0SSuyog Pawar * one best and one current is required 1297*c83a76b0SSuyog Pawar */ 1298*c83a76b0SSuyog Pawar enc_loop_cu_final_prms_t *ps_cu_prms; 1299*c83a76b0SSuyog Pawar 1300*c83a76b0SSuyog Pawar /* flag to indicate if current CU is the first 1301*c83a76b0SSuyog Pawar CU of the Quantisation group*/ 1302*c83a76b0SSuyog Pawar UWORD32 b1_first_cu_in_qg : 1; 1303*c83a76b0SSuyog Pawar 1304*c83a76b0SSuyog Pawar /** qp used during for CU 1305*c83a76b0SSuyog Pawar * @remarks : 1306*c83a76b0SSuyog Pawar */ 1307*c83a76b0SSuyog Pawar WORD8 i1_cu_qp; 1308*c83a76b0SSuyog Pawar 1309*c83a76b0SSuyog Pawar } ihevce_enc_cu_node_ctxt_t; 1310*c83a76b0SSuyog Pawar 1311*c83a76b0SSuyog Pawar typedef struct 1312*c83a76b0SSuyog Pawar { 1313*c83a76b0SSuyog Pawar WORD32 i4_sad; 1314*c83a76b0SSuyog Pawar 1315*c83a76b0SSuyog Pawar WORD32 i4_mv_cost; 1316*c83a76b0SSuyog Pawar 1317*c83a76b0SSuyog Pawar WORD32 i4_tot_cost; 1318*c83a76b0SSuyog Pawar 1319*c83a76b0SSuyog Pawar WORD8 i1_ref_idx; 1320*c83a76b0SSuyog Pawar 1321*c83a76b0SSuyog Pawar mv_t s_mv; 1322*c83a76b0SSuyog Pawar 1323*c83a76b0SSuyog Pawar } block_merge_nodes_t; 1324*c83a76b0SSuyog Pawar 1325*c83a76b0SSuyog Pawar /** 1326*c83a76b0SSuyog Pawar ****************************************************************************** 1327*c83a76b0SSuyog Pawar * @brief This struct is used for storing output of block merge 1328*c83a76b0SSuyog Pawar ****************************************************************************** 1329*c83a76b0SSuyog Pawar */ 1330*c83a76b0SSuyog Pawar typedef struct 1331*c83a76b0SSuyog Pawar { 1332*c83a76b0SSuyog Pawar block_merge_nodes_t *aps_best_results[MAX_NUM_PARTS]; 1333*c83a76b0SSuyog Pawar 1334*c83a76b0SSuyog Pawar /* Contains the best uni dir for each partition type */ 1335*c83a76b0SSuyog Pawar WORD32 ai4_best_uni_dir[MAX_NUM_PARTS]; 1336*c83a76b0SSuyog Pawar 1337*c83a76b0SSuyog Pawar /* Contains the best pred dir for each partition type */ 1338*c83a76b0SSuyog Pawar WORD32 ai4_best_pred_dir[MAX_NUM_PARTS]; 1339*c83a76b0SSuyog Pawar 1340*c83a76b0SSuyog Pawar WORD32 i4_tot_cost; 1341*c83a76b0SSuyog Pawar 1342*c83a76b0SSuyog Pawar PART_TYPE_T e_part_type; 1343*c83a76b0SSuyog Pawar } block_merge_results_t; 1344*c83a76b0SSuyog Pawar 1345*c83a76b0SSuyog Pawar /** 1346*c83a76b0SSuyog Pawar ****************************************************************************** 1347*c83a76b0SSuyog Pawar * @brief This struct is used for storing output of block merge and also 1348*c83a76b0SSuyog Pawar * all of the intermediate results required 1349*c83a76b0SSuyog Pawar ****************************************************************************** 1350*c83a76b0SSuyog Pawar */ 1351*c83a76b0SSuyog Pawar typedef struct 1352*c83a76b0SSuyog Pawar { 1353*c83a76b0SSuyog Pawar block_merge_results_t as_best_results[3 + 1][NUM_BEST_ME_OUTPUTS]; 1354*c83a76b0SSuyog Pawar 1355*c83a76b0SSuyog Pawar block_merge_nodes_t as_nodes[3][TOT_NUM_PARTS][NUM_BEST_ME_OUTPUTS]; 1356*c83a76b0SSuyog Pawar 1357*c83a76b0SSuyog Pawar WORD32 part_mask; 1358*c83a76b0SSuyog Pawar 1359*c83a76b0SSuyog Pawar WORD32 num_results_per_part; 1360*c83a76b0SSuyog Pawar 1361*c83a76b0SSuyog Pawar WORD32 num_best_results; 1362*c83a76b0SSuyog Pawar 1363*c83a76b0SSuyog Pawar /** 1364*c83a76b0SSuyog Pawar * Overall best CU cost, while other entries store CU costs 1365*c83a76b0SSuyog Pawar * in single direction, this is best CU cost, where each 1366*c83a76b0SSuyog Pawar * partition cost is evaluated as best of uni/bi 1367*c83a76b0SSuyog Pawar */ 1368*c83a76b0SSuyog Pawar WORD32 best_cu_cost; 1369*c83a76b0SSuyog Pawar 1370*c83a76b0SSuyog Pawar } block_merge_data_t; 1371*c83a76b0SSuyog Pawar /** 1372*c83a76b0SSuyog Pawar ****************************************************************************** 1373*c83a76b0SSuyog Pawar * @brief CU nbr information structure. This is to store the 1374*c83a76b0SSuyog Pawar * neighbour information for final reconstruction function 1375*c83a76b0SSuyog Pawar ****************************************************************************** 1376*c83a76b0SSuyog Pawar */ 1377*c83a76b0SSuyog Pawar typedef struct 1378*c83a76b0SSuyog Pawar { 1379*c83a76b0SSuyog Pawar /* Pointer to top-left nbr */ 1380*c83a76b0SSuyog Pawar nbr_4x4_t *ps_topleft_nbr_4x4; 1381*c83a76b0SSuyog Pawar /* Pointer to left nbr */ 1382*c83a76b0SSuyog Pawar nbr_4x4_t *ps_left_nbr_4x4; 1383*c83a76b0SSuyog Pawar /* Pointer to top nbr */ 1384*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_nbr_4x4; 1385*c83a76b0SSuyog Pawar /* stride of left_nbr_4x4 */ 1386*c83a76b0SSuyog Pawar WORD32 nbr_4x4_left_strd; 1387*c83a76b0SSuyog Pawar 1388*c83a76b0SSuyog Pawar /* Pointer to CU top */ 1389*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_top; 1390*c83a76b0SSuyog Pawar 1391*c83a76b0SSuyog Pawar UWORD16 *pu2_cu_top; 1392*c83a76b0SSuyog Pawar 1393*c83a76b0SSuyog Pawar /* Pointer to CU top-left */ 1394*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_top_left; 1395*c83a76b0SSuyog Pawar 1396*c83a76b0SSuyog Pawar UWORD16 *pu2_cu_top_left; 1397*c83a76b0SSuyog Pawar 1398*c83a76b0SSuyog Pawar /* Pointer to CU left */ 1399*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_left; 1400*c83a76b0SSuyog Pawar 1401*c83a76b0SSuyog Pawar UWORD16 *pu2_cu_left; 1402*c83a76b0SSuyog Pawar 1403*c83a76b0SSuyog Pawar /* stride of left pointer */ 1404*c83a76b0SSuyog Pawar WORD32 cu_left_stride; 1405*c83a76b0SSuyog Pawar } cu_nbr_prms_t; 1406*c83a76b0SSuyog Pawar 1407*c83a76b0SSuyog Pawar /** Structure to save the flags required for Final mode Reconstruction 1408*c83a76b0SSuyog Pawar function. These flags are set based on quality presets and 1409*c83a76b0SSuyog Pawar the bit-rate we are working on */ 1410*c83a76b0SSuyog Pawar typedef struct 1411*c83a76b0SSuyog Pawar { 1412*c83a76b0SSuyog Pawar /** Flag to indicate whether Luma pred data need to recomputed in the 1413*c83a76b0SSuyog Pawar final_recon function. Now disabled for all modes */ 1414*c83a76b0SSuyog Pawar UWORD8 u1_eval_luma_pred_data; 1415*c83a76b0SSuyog Pawar 1416*c83a76b0SSuyog Pawar /** Flag to indicate whether Chroma pred data need to recomputed in the 1417*c83a76b0SSuyog Pawar final_recon function. Now disabled for MedSpeed only */ 1418*c83a76b0SSuyog Pawar UWORD8 u1_eval_chroma_pred_data; 1419*c83a76b0SSuyog Pawar 1420*c83a76b0SSuyog Pawar /** Flag to indicate whether header data need to recomputed in the 1421*c83a76b0SSuyog Pawar final_recon function. Now disabled for all modes */ 1422*c83a76b0SSuyog Pawar UWORD8 u1_eval_header_data; 1423*c83a76b0SSuyog Pawar 1424*c83a76b0SSuyog Pawar UWORD8 u1_eval_recon_data; 1425*c83a76b0SSuyog Pawar } cu_final_recon_flags_t; 1426*c83a76b0SSuyog Pawar 1427*c83a76b0SSuyog Pawar /** 1428*c83a76b0SSuyog Pawar ****************************************************************************** 1429*c83a76b0SSuyog Pawar * @brief structure to save pred data of ME cand. 1 ping-pong to store the 1430*c83a76b0SSuyog Pawar * the best and current luma cand. 1 buffer to store the best chroma pred 1431*c83a76b0SSuyog Pawar ****************************************************************************** 1432*c83a76b0SSuyog Pawar */ 1433*c83a76b0SSuyog Pawar typedef struct 1434*c83a76b0SSuyog Pawar { 1435*c83a76b0SSuyog Pawar /** Pointers to store luma pred data of me/intra cand.(2) and chroma(1) */ 1436*c83a76b0SSuyog Pawar UWORD8 *pu1_pred_data[NUM_CU_ME_INTRA_PRED_IDX]; 1437*c83a76b0SSuyog Pawar 1438*c83a76b0SSuyog Pawar UWORD16 *pu2_pred_data[NUM_CU_ME_INTRA_PRED_IDX]; 1439*c83a76b0SSuyog Pawar 1440*c83a76b0SSuyog Pawar /** Stride to store the predicted data of me/intra cand.(2) and chroma(1) */ 1441*c83a76b0SSuyog Pawar WORD32 ai4_pred_data_stride[NUM_CU_ME_INTRA_PRED_IDX]; 1442*c83a76b0SSuyog Pawar /** Counter saying how many pointers are assigned */ 1443*c83a76b0SSuyog Pawar WORD32 i4_pointer_count; 1444*c83a76b0SSuyog Pawar 1445*c83a76b0SSuyog Pawar } cu_me_intra_pred_prms_t; 1446*c83a76b0SSuyog Pawar 1447*c83a76b0SSuyog Pawar /** 1448*c83a76b0SSuyog Pawar ****************************************************************************** 1449*c83a76b0SSuyog Pawar * @brief Chroma RDOPT context structure 1450*c83a76b0SSuyog Pawar ****************************************************************************** 1451*c83a76b0SSuyog Pawar */ 1452*c83a76b0SSuyog Pawar typedef struct 1453*c83a76b0SSuyog Pawar { 1454*c83a76b0SSuyog Pawar /** Storing the inverse quantized data (cb) for the special modes*/ 1455*c83a76b0SSuyog Pawar WORD16 ai2_iq_data_cb[(MAX_TU_SIZE * MAX_TU_SIZE) << 1]; 1456*c83a76b0SSuyog Pawar 1457*c83a76b0SSuyog Pawar /** Storing the inverse quantized data (cr) for the special modes*/ 1458*c83a76b0SSuyog Pawar WORD16 ai2_iq_data_cr[(MAX_TU_SIZE * MAX_TU_SIZE) << 1]; 1459*c83a76b0SSuyog Pawar 1460*c83a76b0SSuyog Pawar /** Storing the scan coeffs (cb) for the special modes*/ 1461*c83a76b0SSuyog Pawar UWORD8 au1_scan_coeff_cb[2][(MAX_TU_IN_CTB >> 1) * MAX_SCAN_COEFFS_BYTES_4x4]; 1462*c83a76b0SSuyog Pawar 1463*c83a76b0SSuyog Pawar /** Storing the scan coeffs (cb) for the special modes*/ 1464*c83a76b0SSuyog Pawar UWORD8 au1_scan_coeff_cr[2][(MAX_TU_IN_CTB >> 1) * MAX_SCAN_COEFFS_BYTES_4x4]; 1465*c83a76b0SSuyog Pawar 1466*c83a76b0SSuyog Pawar /** Max number of bytes filled in scan coeff data (cb) per TU*/ 1467*c83a76b0SSuyog Pawar WORD32 ai4_num_bytes_scan_coeff_cb_per_tu[2][MAX_TU_IN_TU_EQ_DIV_2]; 1468*c83a76b0SSuyog Pawar 1469*c83a76b0SSuyog Pawar /** Max number of bytes filled in scan coeff data (cr) per TU*/ 1470*c83a76b0SSuyog Pawar WORD32 ai4_num_bytes_scan_coeff_cr_per_tu[2][MAX_TU_IN_TU_EQ_DIV_2]; 1471*c83a76b0SSuyog Pawar 1472*c83a76b0SSuyog Pawar /** Stride of the iq buffer*/ 1473*c83a76b0SSuyog Pawar WORD32 i4_iq_buff_stride; 1474*c83a76b0SSuyog Pawar 1475*c83a76b0SSuyog Pawar /** Storing the pred data 1476*c83a76b0SSuyog Pawar The predicted data is always interleaved. Therefore the size of this array will be 1477*c83a76b0SSuyog Pawar ((MAX_TU_SIZE * MAX_TU_SIZE) >> 2) * 2)*/ 1478*c83a76b0SSuyog Pawar void *pv_pred_data; 1479*c83a76b0SSuyog Pawar 1480*c83a76b0SSuyog Pawar /** Predicted data stride*/ 1481*c83a76b0SSuyog Pawar WORD32 i4_pred_stride; 1482*c83a76b0SSuyog Pawar 1483*c83a76b0SSuyog Pawar /** Storing the cbfs for each tu 1484*c83a76b0SSuyog Pawar For 1 tu case, only the 0th element will be valid*/ 1485*c83a76b0SSuyog Pawar UWORD8 au1_cbf_cb[2][MAX_TU_IN_TU_EQ_DIV_2]; 1486*c83a76b0SSuyog Pawar 1487*c83a76b0SSuyog Pawar /** Storing the cbfs for each tu 1488*c83a76b0SSuyog Pawar For 1 tu case, only the 0th element will be valid*/ 1489*c83a76b0SSuyog Pawar UWORD8 au1_cbf_cr[2][MAX_TU_IN_TU_EQ_DIV_2]; 1490*c83a76b0SSuyog Pawar 1491*c83a76b0SSuyog Pawar /** To store the cabac ctxt model updated by the RDOPT of best chroma mode 1492*c83a76b0SSuyog Pawar [0] : for 1 TU case, [1] : for 4 TU case */ 1493*c83a76b0SSuyog Pawar UWORD8 au1_chrm_satd_updated_ctxt_models[IHEVC_CAB_CTXT_END]; 1494*c83a76b0SSuyog Pawar 1495*c83a76b0SSuyog Pawar /** Best SATD chroma mode, [0] : for 1 TU case (TU_EQ_CU) , [1] : for 4 TU case 1496*c83a76b0SSuyog Pawar Values : 0(PLANAR), 1(VERT), 2(HOR), 3(DC) chroma mode per each TU */ 1497*c83a76b0SSuyog Pawar UWORD8 u1_best_cr_mode; 1498*c83a76b0SSuyog Pawar 1499*c83a76b0SSuyog Pawar /** Best SATD chroma mode's RDOPT cost, [0] : for 1 TU case, [1] : for 4 TU case */ 1500*c83a76b0SSuyog Pawar LWORD64 i8_chroma_best_rdopt; 1501*c83a76b0SSuyog Pawar 1502*c83a76b0SSuyog Pawar /* Account for coding b3_chroma_intra_pred_mode prefix and suffix bins */ 1503*c83a76b0SSuyog Pawar /* This is done by adding the bits for signalling chroma mode (0-3) */ 1504*c83a76b0SSuyog Pawar /* and subtracting the bits for chroma mode same as luma mode (4) */ 1505*c83a76b0SSuyog Pawar LWORD64 i8_cost_to_encode_chroma_mode; 1506*c83a76b0SSuyog Pawar 1507*c83a76b0SSuyog Pawar /** Best SATD chroma mode's tu bits, [0] : for 1 TU case, [1] : for 4 TU case */ 1508*c83a76b0SSuyog Pawar WORD32 i4_chrm_tu_bits; 1509*c83a76b0SSuyog Pawar 1510*c83a76b0SSuyog Pawar /** Storing the zero col values for each TU for cb*/ 1511*c83a76b0SSuyog Pawar WORD32 ai4_zero_col_cb[2][MAX_TU_IN_TU_EQ_DIV_2]; 1512*c83a76b0SSuyog Pawar 1513*c83a76b0SSuyog Pawar /** Storing the zero col values for each TU for cr*/ 1514*c83a76b0SSuyog Pawar WORD32 ai4_zero_col_cr[2][MAX_TU_IN_TU_EQ_DIV_2]; 1515*c83a76b0SSuyog Pawar 1516*c83a76b0SSuyog Pawar /** Storing the zero row values for each TU for cb*/ 1517*c83a76b0SSuyog Pawar WORD32 ai4_zero_row_cb[2][MAX_TU_IN_TU_EQ_DIV_2]; 1518*c83a76b0SSuyog Pawar 1519*c83a76b0SSuyog Pawar /** Storing the zero row values for each TU for cr*/ 1520*c83a76b0SSuyog Pawar WORD32 ai4_zero_row_cr[2][MAX_TU_IN_TU_EQ_DIV_2]; 1521*c83a76b0SSuyog Pawar } chroma_intra_satd_ctxt_t; 1522*c83a76b0SSuyog Pawar 1523*c83a76b0SSuyog Pawar /** 1524*c83a76b0SSuyog Pawar ****************************************************************************** 1525*c83a76b0SSuyog Pawar * @brief Chroma RDOPT context structure 1526*c83a76b0SSuyog Pawar ****************************************************************************** 1527*c83a76b0SSuyog Pawar */ 1528*c83a76b0SSuyog Pawar typedef struct 1529*c83a76b0SSuyog Pawar { 1530*c83a76b0SSuyog Pawar /** Chroma SATD context structure. It is an array of two to account for the TU_EQ_CU candidate 1531*c83a76b0SSuyog Pawar and the TU_EQ_CU_DIV2 candidate*/ 1532*c83a76b0SSuyog Pawar chroma_intra_satd_ctxt_t as_chr_intra_satd_ctxt[NUM_POSSIBLE_TU_SIZES_CHR_INTRA_SATD]; 1533*c83a76b0SSuyog Pawar 1534*c83a76b0SSuyog Pawar /** Chroma SATD has has to be evaluated only for the HIGH QUALITY */ 1535*c83a76b0SSuyog Pawar UWORD8 u1_eval_chrm_satd; 1536*c83a76b0SSuyog Pawar 1537*c83a76b0SSuyog Pawar /** Chroma RDOPT has to be evaluated only for the HIGH QUALITY / MEDIUM SPEED preset */ 1538*c83a76b0SSuyog Pawar UWORD8 u1_eval_chrm_rdopt; 1539*c83a76b0SSuyog Pawar 1540*c83a76b0SSuyog Pawar } ihevce_chroma_rdopt_ctxt_t; 1541*c83a76b0SSuyog Pawar 1542*c83a76b0SSuyog Pawar typedef struct 1543*c83a76b0SSuyog Pawar { 1544*c83a76b0SSuyog Pawar inter_cu_results_t s_cu_results; 1545*c83a76b0SSuyog Pawar 1546*c83a76b0SSuyog Pawar inter_pu_results_t s_pu_results; 1547*c83a76b0SSuyog Pawar } block_merge_output_t; 1548*c83a76b0SSuyog Pawar 1549*c83a76b0SSuyog Pawar /** 1550*c83a76b0SSuyog Pawar ****************************************************************************** 1551*c83a76b0SSuyog Pawar * @brief Structure to store the Merge/Skip Cand. for EncLoop 1552*c83a76b0SSuyog Pawar ****************************************************************************** 1553*c83a76b0SSuyog Pawar */ 1554*c83a76b0SSuyog Pawar typedef struct 1555*c83a76b0SSuyog Pawar { 1556*c83a76b0SSuyog Pawar /** List of all merge/skip candidates to be evalauted (SATD/RDOPT) for 1557*c83a76b0SSuyog Pawar * this CU 1558*c83a76b0SSuyog Pawar */ 1559*c83a76b0SSuyog Pawar cu_inter_cand_t as_cu_inter_merge_skip_cand[MAX_NUM_CU_MERGE_SKIP_CAND]; 1560*c83a76b0SSuyog Pawar 1561*c83a76b0SSuyog Pawar /** number of merge/skip candidates 1562*c83a76b0SSuyog Pawar */ 1563*c83a76b0SSuyog Pawar UWORD8 u1_num_merge_cands; 1564*c83a76b0SSuyog Pawar 1565*c83a76b0SSuyog Pawar UWORD8 u1_num_skip_cands; 1566*c83a76b0SSuyog Pawar 1567*c83a76b0SSuyog Pawar UWORD8 u1_num_merge_skip_cands; 1568*c83a76b0SSuyog Pawar 1569*c83a76b0SSuyog Pawar } cu_inter_merge_skip_t; 1570*c83a76b0SSuyog Pawar 1571*c83a76b0SSuyog Pawar /** Structure to store the Mixed mode Cand. for EncLoop */ 1572*c83a76b0SSuyog Pawar typedef struct 1573*c83a76b0SSuyog Pawar { 1574*c83a76b0SSuyog Pawar cu_inter_cand_t as_cu_data[MAX_NUM_MIXED_MODE_INTER_RDO_CANDS]; 1575*c83a76b0SSuyog Pawar 1576*c83a76b0SSuyog Pawar UWORD8 u1_num_mixed_mode_type0_cands; 1577*c83a76b0SSuyog Pawar 1578*c83a76b0SSuyog Pawar UWORD8 u1_num_mixed_mode_type1_cands; 1579*c83a76b0SSuyog Pawar 1580*c83a76b0SSuyog Pawar } cu_mixed_mode_inter_t; 1581*c83a76b0SSuyog Pawar 1582*c83a76b0SSuyog Pawar typedef struct 1583*c83a76b0SSuyog Pawar { 1584*c83a76b0SSuyog Pawar /* +2 because an additional buffer is required for */ 1585*c83a76b0SSuyog Pawar /* storing both cur and best during merge eval */ 1586*c83a76b0SSuyog Pawar void *apv_inter_pred_data[MAX_NUM_INTER_RDO_CANDS + 4]; 1587*c83a76b0SSuyog Pawar 1588*c83a76b0SSuyog Pawar /* Bit field used to determine the indices of free bufs in 'apv_pred_data' buf array */ 1589*c83a76b0SSuyog Pawar UWORD32 u4_is_buf_in_use; 1590*c83a76b0SSuyog Pawar 1591*c83a76b0SSuyog Pawar /* Assumption is that the same stride is used for the */ 1592*c83a76b0SSuyog Pawar /* entire set of buffers above and is equal to the */ 1593*c83a76b0SSuyog Pawar /* CU size */ 1594*c83a76b0SSuyog Pawar WORD32 i4_pred_stride; 1595*c83a76b0SSuyog Pawar 1596*c83a76b0SSuyog Pawar } ihevce_inter_pred_buf_data_t; 1597*c83a76b0SSuyog Pawar /** Structure to store the Inter Cand. info in EncLoop */ 1598*c83a76b0SSuyog Pawar typedef struct 1599*c83a76b0SSuyog Pawar { 1600*c83a76b0SSuyog Pawar cu_inter_cand_t *aps_cu_data[MAX_NUM_INTER_RDO_CANDS]; 1601*c83a76b0SSuyog Pawar 1602*c83a76b0SSuyog Pawar UWORD32 au4_cost[MAX_NUM_INTER_RDO_CANDS]; 1603*c83a76b0SSuyog Pawar 1604*c83a76b0SSuyog Pawar UWORD8 au1_pred_buf_idx[MAX_NUM_INTER_RDO_CANDS]; 1605*c83a76b0SSuyog Pawar 1606*c83a76b0SSuyog Pawar UWORD32 u4_src_variance; 1607*c83a76b0SSuyog Pawar 1608*c83a76b0SSuyog Pawar UWORD8 u1_idx_of_worst_cost_in_cost_array; 1609*c83a76b0SSuyog Pawar 1610*c83a76b0SSuyog Pawar UWORD8 u1_idx_of_worst_cost_in_pred_buf_array; 1611*c83a76b0SSuyog Pawar 1612*c83a76b0SSuyog Pawar UWORD8 u1_num_inter_cands; 1613*c83a76b0SSuyog Pawar 1614*c83a76b0SSuyog Pawar } inter_cu_mode_info_t; 1615*c83a76b0SSuyog Pawar typedef struct 1616*c83a76b0SSuyog Pawar { 1617*c83a76b0SSuyog Pawar /*Frame level base pointer of buffers for each ctb row to store the top pixels 1618*c83a76b0SSuyog Pawar *and top left pixel for the next ctb row.These buffers are common accross all threads 1619*c83a76b0SSuyog Pawar */ 1620*c83a76b0SSuyog Pawar UWORD8 *apu1_sao_src_frm_top_luma[MAX_NUM_ENC_LOOP_PARALLEL]; 1621*c83a76b0SSuyog Pawar /*Ctb level pointer to buffer to store the top pixels 1622*c83a76b0SSuyog Pawar *and top left pixel for the next ctb row.These buffers are common accross all threads 1623*c83a76b0SSuyog Pawar */ 1624*c83a76b0SSuyog Pawar UWORD8 *pu1_curr_sao_src_top_luma; 1625*c83a76b0SSuyog Pawar /*Buffer to store the left boundary before 1626*c83a76b0SSuyog Pawar * doing sao on current ctb for the next ctb in the current row 1627*c83a76b0SSuyog Pawar */ 1628*c83a76b0SSuyog Pawar UWORD8 au1_sao_src_left_luma[MAX_CTB_SIZE]; 1629*c83a76b0SSuyog Pawar /*Frame level base pointer of buffers for each ctb row to store the top pixels 1630*c83a76b0SSuyog Pawar *and top left pixel for the next ctb row.These buffers are common accross all threads 1631*c83a76b0SSuyog Pawar */ 1632*c83a76b0SSuyog Pawar UWORD8 *apu1_sao_src_frm_top_chroma[MAX_NUM_ENC_LOOP_PARALLEL]; 1633*c83a76b0SSuyog Pawar 1634*c83a76b0SSuyog Pawar WORD32 i4_frm_top_chroma_buf_stride; 1635*c83a76b0SSuyog Pawar 1636*c83a76b0SSuyog Pawar /*Ctb level pointer to buffer to store the top chroma pixels 1637*c83a76b0SSuyog Pawar *and top left pixel for the next ctb row.These buffers are common accross all threads 1638*c83a76b0SSuyog Pawar */ 1639*c83a76b0SSuyog Pawar UWORD8 *pu1_curr_sao_src_top_chroma; 1640*c83a76b0SSuyog Pawar 1641*c83a76b0SSuyog Pawar /*Scratch buffer to store the left boundary before 1642*c83a76b0SSuyog Pawar * doing sao on current ctb for the next ctb in the current row 1643*c83a76b0SSuyog Pawar */ 1644*c83a76b0SSuyog Pawar UWORD8 au1_sao_src_left_chroma[MAX_CTB_SIZE * 2]; 1645*c83a76b0SSuyog Pawar 1646*c83a76b0SSuyog Pawar /** 1647*c83a76b0SSuyog Pawar * Luma recon buffer 1648*c83a76b0SSuyog Pawar */ 1649*c83a76b0SSuyog Pawar UWORD8 *pu1_frm_luma_recon_buf; 1650*c83a76b0SSuyog Pawar /** 1651*c83a76b0SSuyog Pawar * Chroma recon buffer 1652*c83a76b0SSuyog Pawar */ 1653*c83a76b0SSuyog Pawar UWORD8 *pu1_frm_chroma_recon_buf; 1654*c83a76b0SSuyog Pawar /** 1655*c83a76b0SSuyog Pawar * Luma recon buffer for curr ctb 1656*c83a76b0SSuyog Pawar */ 1657*c83a76b0SSuyog Pawar UWORD8 *pu1_cur_luma_recon_buf; 1658*c83a76b0SSuyog Pawar /** 1659*c83a76b0SSuyog Pawar * Chroma recon buffer for curr ctb 1660*c83a76b0SSuyog Pawar */ 1661*c83a76b0SSuyog Pawar UWORD8 *pu1_cur_chroma_recon_buf; 1662*c83a76b0SSuyog Pawar /** 1663*c83a76b0SSuyog Pawar * Luma src buffer 1664*c83a76b0SSuyog Pawar */ 1665*c83a76b0SSuyog Pawar UWORD8 *pu1_frm_luma_src_buf; 1666*c83a76b0SSuyog Pawar /** 1667*c83a76b0SSuyog Pawar * Chroma src buffer 1668*c83a76b0SSuyog Pawar */ 1669*c83a76b0SSuyog Pawar UWORD8 *pu1_frm_chroma_src_buf; 1670*c83a76b0SSuyog Pawar /** 1671*c83a76b0SSuyog Pawar * Luma src(input yuv) buffer for curr ctb 1672*c83a76b0SSuyog Pawar */ 1673*c83a76b0SSuyog Pawar UWORD8 *pu1_cur_luma_src_buf; 1674*c83a76b0SSuyog Pawar /** 1675*c83a76b0SSuyog Pawar * Chroma src buffer for curr ctb 1676*c83a76b0SSuyog Pawar */ 1677*c83a76b0SSuyog Pawar UWORD8 *pu1_cur_chroma_src_buf; 1678*c83a76b0SSuyog Pawar /* Left luma scratch buffer required for sao RD optimisation*/ 1679*c83a76b0SSuyog Pawar UWORD8 au1_left_luma_scratch[MAX_CTB_SIZE]; 1680*c83a76b0SSuyog Pawar 1681*c83a76b0SSuyog Pawar /* Left chroma scratch buffer required for sao RD optimisation*/ 1682*c83a76b0SSuyog Pawar /* Min size required= MAX_CTB_SIZE/2 * 2 1683*c83a76b0SSuyog Pawar * Multiplied by 2 because size reuired is MAX_CTB_SIZE/2 each for U and V 1684*c83a76b0SSuyog Pawar */ 1685*c83a76b0SSuyog Pawar UWORD8 au1_left_chroma_scratch[MAX_CTB_SIZE * 2]; 1686*c83a76b0SSuyog Pawar 1687*c83a76b0SSuyog Pawar /* Top luma scratch buffer required for sao RD optimisation*/ 1688*c83a76b0SSuyog Pawar UWORD8 au1_top_luma_scratch[MAX_CTB_SIZE + 2]; // +1 for top left pixel and +1 for top right 1689*c83a76b0SSuyog Pawar 1690*c83a76b0SSuyog Pawar /* Top chroma scratch buffer required for sao RD optimisation*/ 1691*c83a76b0SSuyog Pawar UWORD8 au1_top_chroma_scratch[MAX_CTB_SIZE + 4]; // +2 for top left pixel and +2 for top right 1692*c83a76b0SSuyog Pawar 1693*c83a76b0SSuyog Pawar /* Scratch buffer to store the sao'ed output during sao RD optimisation*/ 1694*c83a76b0SSuyog Pawar /* One extra row(bot pixels) is copied to scratch buf but 2d buf copy func copies multiple of 4 ,hence 1695*c83a76b0SSuyog Pawar MAX_CTB _SIZE + 4*/ 1696*c83a76b0SSuyog Pawar UWORD8 au1_sao_luma_scratch[PING_PONG][SCRATCH_BUF_STRIDE * (MAX_CTB_SIZE + 4)]; 1697*c83a76b0SSuyog Pawar 1698*c83a76b0SSuyog Pawar /* Scratch buffer to store the sao'ed output during sao RD optimisation*/ 1699*c83a76b0SSuyog Pawar /* One extra row(bot pixels) is copied to scratch buf but 2d buf copy func copies multiple of 4 ,hence 1700*c83a76b0SSuyog Pawar MAX_CTB _SIZE + 4*/ 1701*c83a76b0SSuyog Pawar UWORD8 au1_sao_chroma_scratch[PING_PONG][SCRATCH_BUF_STRIDE * (MAX_CTB_SIZE + 4)]; 1702*c83a76b0SSuyog Pawar 1703*c83a76b0SSuyog Pawar /** 1704*c83a76b0SSuyog Pawar * CTB size 1705*c83a76b0SSuyog Pawar */ 1706*c83a76b0SSuyog Pawar WORD32 i4_ctb_size; 1707*c83a76b0SSuyog Pawar /** 1708*c83a76b0SSuyog Pawar * Luma recon buffer stride 1709*c83a76b0SSuyog Pawar */ 1710*c83a76b0SSuyog Pawar WORD32 i4_frm_luma_recon_stride; 1711*c83a76b0SSuyog Pawar /** 1712*c83a76b0SSuyog Pawar * Chroma recon buffer stride 1713*c83a76b0SSuyog Pawar */ 1714*c83a76b0SSuyog Pawar WORD32 i4_frm_chroma_recon_stride; 1715*c83a76b0SSuyog Pawar /** 1716*c83a76b0SSuyog Pawar * Luma recon buffer stride for curr ctb 1717*c83a76b0SSuyog Pawar */ 1718*c83a76b0SSuyog Pawar WORD32 i4_cur_luma_recon_stride; 1719*c83a76b0SSuyog Pawar /** 1720*c83a76b0SSuyog Pawar * Chroma recon buffer stride for curr ctb 1721*c83a76b0SSuyog Pawar */ 1722*c83a76b0SSuyog Pawar WORD32 i4_cur_chroma_recon_stride; 1723*c83a76b0SSuyog Pawar /** 1724*c83a76b0SSuyog Pawar * Luma src buffer stride 1725*c83a76b0SSuyog Pawar */ 1726*c83a76b0SSuyog Pawar WORD32 i4_frm_luma_src_stride; 1727*c83a76b0SSuyog Pawar /** 1728*c83a76b0SSuyog Pawar * Chroma src buffer stride 1729*c83a76b0SSuyog Pawar */ 1730*c83a76b0SSuyog Pawar WORD32 i4_frm_chroma_src_stride; 1731*c83a76b0SSuyog Pawar 1732*c83a76b0SSuyog Pawar WORD32 i4_frm_top_luma_buf_stride; 1733*c83a76b0SSuyog Pawar /** 1734*c83a76b0SSuyog Pawar * Luma src buffer stride for curr ctb 1735*c83a76b0SSuyog Pawar */ 1736*c83a76b0SSuyog Pawar WORD32 i4_cur_luma_src_stride; 1737*c83a76b0SSuyog Pawar /** 1738*c83a76b0SSuyog Pawar * Chroma src buffer stride for curr ctb 1739*c83a76b0SSuyog Pawar */ 1740*c83a76b0SSuyog Pawar WORD32 i4_cur_chroma_src_stride; 1741*c83a76b0SSuyog Pawar 1742*c83a76b0SSuyog Pawar /* Top luma buffer size */ 1743*c83a76b0SSuyog Pawar WORD32 i4_top_luma_buf_size; 1744*c83a76b0SSuyog Pawar 1745*c83a76b0SSuyog Pawar /* Top Chroma buffer size */ 1746*c83a76b0SSuyog Pawar WORD32 i4_top_chroma_buf_size; 1747*c83a76b0SSuyog Pawar 1748*c83a76b0SSuyog Pawar /*** Number of CTB units **/ 1749*c83a76b0SSuyog Pawar WORD32 i4_num_ctb_units; 1750*c83a76b0SSuyog Pawar 1751*c83a76b0SSuyog Pawar /** 1752*c83a76b0SSuyog Pawar * CTB x pos 1753*c83a76b0SSuyog Pawar */ 1754*c83a76b0SSuyog Pawar WORD32 i4_ctb_x; 1755*c83a76b0SSuyog Pawar /** 1756*c83a76b0SSuyog Pawar * CTB y pos 1757*c83a76b0SSuyog Pawar */ 1758*c83a76b0SSuyog Pawar WORD32 i4_ctb_y; 1759*c83a76b0SSuyog Pawar /* SAO block width*/ 1760*c83a76b0SSuyog Pawar WORD32 i4_sao_blk_wd; 1761*c83a76b0SSuyog Pawar 1762*c83a76b0SSuyog Pawar /* SAO block height*/ 1763*c83a76b0SSuyog Pawar WORD32 i4_sao_blk_ht; 1764*c83a76b0SSuyog Pawar 1765*c83a76b0SSuyog Pawar /* Last ctb row flag*/ 1766*c83a76b0SSuyog Pawar WORD32 i4_is_last_ctb_row; 1767*c83a76b0SSuyog Pawar 1768*c83a76b0SSuyog Pawar /* Last ctb col flag*/ 1769*c83a76b0SSuyog Pawar WORD32 i4_is_last_ctb_col; 1770*c83a76b0SSuyog Pawar 1771*c83a76b0SSuyog Pawar /* CTB aligned width */ 1772*c83a76b0SSuyog Pawar UWORD32 u4_ctb_aligned_wd; 1773*c83a76b0SSuyog Pawar 1774*c83a76b0SSuyog Pawar /* Number of ctbs in a row*/ 1775*c83a76b0SSuyog Pawar UWORD32 u4_num_ctbs_horz; 1776*c83a76b0SSuyog Pawar 1777*c83a76b0SSuyog Pawar UWORD32 u4_num_ctbs_vert; 1778*c83a76b0SSuyog Pawar /** 1779*c83a76b0SSuyog Pawar * Closed loop SSD Lambda 1780*c83a76b0SSuyog Pawar * This is multiplied with bits for RD cost computations in SSD mode 1781*c83a76b0SSuyog Pawar * This is represented in q format with shift of LAMBDA_Q_SHIFT 1782*c83a76b0SSuyog Pawar */ 1783*c83a76b0SSuyog Pawar LWORD64 i8_cl_ssd_lambda_qf; 1784*c83a76b0SSuyog Pawar 1785*c83a76b0SSuyog Pawar /** 1786*c83a76b0SSuyog Pawar * Closed loop SSD Lambda for chroma (chroma qp is different from luma qp) 1787*c83a76b0SSuyog Pawar * This is multiplied with bits for RD cost computations in SSD mode 1788*c83a76b0SSuyog Pawar * This is represented in q format with shift of LAMBDA_Q_SHIFT 1789*c83a76b0SSuyog Pawar */ 1790*c83a76b0SSuyog Pawar LWORD64 i8_cl_ssd_lambda_chroma_qf; 1791*c83a76b0SSuyog Pawar /** 1792*c83a76b0SSuyog Pawar * Pointer to current PPS 1793*c83a76b0SSuyog Pawar */ 1794*c83a76b0SSuyog Pawar pps_t *ps_pps; //not used currently 1795*c83a76b0SSuyog Pawar /** 1796*c83a76b0SSuyog Pawar * Pointer to current SPS 1797*c83a76b0SSuyog Pawar */ 1798*c83a76b0SSuyog Pawar sps_t *ps_sps; 1799*c83a76b0SSuyog Pawar 1800*c83a76b0SSuyog Pawar /** 1801*c83a76b0SSuyog Pawar * Pointer to current slice header structure 1802*c83a76b0SSuyog Pawar */ 1803*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr; 1804*c83a76b0SSuyog Pawar /** 1805*c83a76b0SSuyog Pawar * Pointer to current frame ctb out array of structures 1806*c83a76b0SSuyog Pawar */ 1807*c83a76b0SSuyog Pawar ctb_enc_loop_out_t *ps_ctb_out; 1808*c83a76b0SSuyog Pawar /** 1809*c83a76b0SSuyog Pawar * context for cabac bit estimation used during rdopt stage 1810*c83a76b0SSuyog Pawar */ 1811*c83a76b0SSuyog Pawar rdopt_entropy_ctxt_t *ps_rdopt_entropy_ctxt; 1812*c83a76b0SSuyog Pawar /** 1813*c83a76b0SSuyog Pawar * Pointer to sao_enc_t for the current ctb 1814*c83a76b0SSuyog Pawar */ 1815*c83a76b0SSuyog Pawar sao_enc_t *ps_sao; 1816*c83a76b0SSuyog Pawar /* 1817*c83a76b0SSuyog Pawar * Pointer to an array to store the sao information of the top ctb 1818*c83a76b0SSuyog Pawar * This is required for to decide top merge 1819*c83a76b0SSuyog Pawar */ 1820*c83a76b0SSuyog Pawar sao_enc_t *aps_frm_top_ctb_sao[MAX_NUM_ENC_LOOP_PARALLEL]; 1821*c83a76b0SSuyog Pawar 1822*c83a76b0SSuyog Pawar /* 1823*c83a76b0SSuyog Pawar * Pointer to structure to store the sao parameters of (x,y)th ctb 1824*c83a76b0SSuyog Pawar * for top merge of (x,y+1)th ctb 1825*c83a76b0SSuyog Pawar */ 1826*c83a76b0SSuyog Pawar sao_enc_t *ps_top_ctb_sao; 1827*c83a76b0SSuyog Pawar 1828*c83a76b0SSuyog Pawar /* structure to store the sao parameters of (x,y)th ctb for 1829*c83a76b0SSuyog Pawar * the left merge of (x+1,y)th ctb 1830*c83a76b0SSuyog Pawar */ 1831*c83a76b0SSuyog Pawar sao_enc_t s_left_ctb_sao; 1832*c83a76b0SSuyog Pawar 1833*c83a76b0SSuyog Pawar /* Array of structures for SAO RDO candidates*/ 1834*c83a76b0SSuyog Pawar sao_enc_t as_sao_rd_cand[MAX_SAO_RD_CAND]; 1835*c83a76b0SSuyog Pawar 1836*c83a76b0SSuyog Pawar /** array of function pointers for luma sao */ 1837*c83a76b0SSuyog Pawar pf_sao_luma apf_sao_luma[4]; 1838*c83a76b0SSuyog Pawar 1839*c83a76b0SSuyog Pawar /** array of function pointers for chroma sao */ 1840*c83a76b0SSuyog Pawar pf_sao_chroma apf_sao_chroma[4]; 1841*c83a76b0SSuyog Pawar 1842*c83a76b0SSuyog Pawar /* Flag to do SAO luma and chroma filtering*/ 1843*c83a76b0SSuyog Pawar WORD8 i1_slice_sao_luma_flag; 1844*c83a76b0SSuyog Pawar 1845*c83a76b0SSuyog Pawar WORD8 i1_slice_sao_chroma_flag; 1846*c83a76b0SSuyog Pawar 1847*c83a76b0SSuyog Pawar #if DISABLE_SAO_WHEN_NOISY 1848*c83a76b0SSuyog Pawar ctb_analyse_t *ps_ctb_data; 1849*c83a76b0SSuyog Pawar 1850*c83a76b0SSuyog Pawar WORD32 i4_ctb_data_stride; 1851*c83a76b0SSuyog Pawar #endif 1852*c83a76b0SSuyog Pawar 1853*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list; 1854*c83a76b0SSuyog Pawar 1855*c83a76b0SSuyog Pawar } sao_ctxt_t; 1856*c83a76b0SSuyog Pawar 1857*c83a76b0SSuyog Pawar /** 1858*c83a76b0SSuyog Pawar ****************************************************************************** 1859*c83a76b0SSuyog Pawar * @brief Encode loop module context structure 1860*c83a76b0SSuyog Pawar ****************************************************************************** 1861*c83a76b0SSuyog Pawar */ 1862*c83a76b0SSuyog Pawar typedef struct 1863*c83a76b0SSuyog Pawar { 1864*c83a76b0SSuyog Pawar #if ENABLE_TU_TREE_DETERMINATION_IN_RDOPT 1865*c83a76b0SSuyog Pawar void *pv_err_func_selector; 1866*c83a76b0SSuyog Pawar #endif 1867*c83a76b0SSuyog Pawar 1868*c83a76b0SSuyog Pawar /** 1869*c83a76b0SSuyog Pawar * Quality preset for comtrolling numbe of RD opt cand 1870*c83a76b0SSuyog Pawar * @sa : IHEVCE_QUALITY_CONFIG_T 1871*c83a76b0SSuyog Pawar */ 1872*c83a76b0SSuyog Pawar WORD32 i4_quality_preset; 1873*c83a76b0SSuyog Pawar /** 1874*c83a76b0SSuyog Pawar * 1875*c83a76b0SSuyog Pawar * 1876*c83a76b0SSuyog Pawar */ 1877*c83a76b0SSuyog Pawar WORD32 i4_rc_pass; 1878*c83a76b0SSuyog Pawar /** 1879*c83a76b0SSuyog Pawar * Lamda to be mulitplied with bits for SATD 1880*c83a76b0SSuyog Pawar * should be equal to Lamda*Qp 1881*c83a76b0SSuyog Pawar */ 1882*c83a76b0SSuyog Pawar WORD32 i4_satd_lamda; 1883*c83a76b0SSuyog Pawar 1884*c83a76b0SSuyog Pawar /** 1885*c83a76b0SSuyog Pawar * Lamda to be mulitplied with bits for SAD 1886*c83a76b0SSuyog Pawar * should be equal to Lamda*Qp 1887*c83a76b0SSuyog Pawar */ 1888*c83a76b0SSuyog Pawar WORD32 i4_sad_lamda; 1889*c83a76b0SSuyog Pawar 1890*c83a76b0SSuyog Pawar /** 1891*c83a76b0SSuyog Pawar * Closed loop SSD Lambda 1892*c83a76b0SSuyog Pawar * This is multiplied with bits for RD cost computations in SSD mode 1893*c83a76b0SSuyog Pawar * This is represented in q format with shift of LAMBDA_Q_SHIFT 1894*c83a76b0SSuyog Pawar */ 1895*c83a76b0SSuyog Pawar LWORD64 i8_cl_ssd_lambda_qf; 1896*c83a76b0SSuyog Pawar 1897*c83a76b0SSuyog Pawar /** 1898*c83a76b0SSuyog Pawar * Closed loop SSD Lambda for chroma (chroma qp is different from luma qp) 1899*c83a76b0SSuyog Pawar * This is multiplied with bits for RD cost computations in SSD mode 1900*c83a76b0SSuyog Pawar * This is represented in q format with shift of LAMBDA_Q_SHIFT 1901*c83a76b0SSuyog Pawar */ 1902*c83a76b0SSuyog Pawar LWORD64 i8_cl_ssd_lambda_chroma_qf; 1903*c83a76b0SSuyog Pawar 1904*c83a76b0SSuyog Pawar /** 1905*c83a76b0SSuyog Pawar * Ratio of Closed loop SSD Lambda and Closed loop SSD Lambda for chroma 1906*c83a76b0SSuyog Pawar * This is multiplied with (1 << CHROMA_COST_WEIGHING_FACTOR_Q_SHIFT) 1907*c83a76b0SSuyog Pawar * to keep the precision of the ratio 1908*c83a76b0SSuyog Pawar */ 1909*c83a76b0SSuyog Pawar UWORD32 u4_chroma_cost_weighing_factor; 1910*c83a76b0SSuyog Pawar /** 1911*c83a76b0SSuyog Pawar * Frame level QP to be used 1912*c83a76b0SSuyog Pawar */ 1913*c83a76b0SSuyog Pawar WORD32 i4_frame_qp; 1914*c83a76b0SSuyog Pawar 1915*c83a76b0SSuyog Pawar WORD32 i4_frame_mod_qp; 1916*c83a76b0SSuyog Pawar 1917*c83a76b0SSuyog Pawar WORD32 i4_frame_qstep; 1918*c83a76b0SSuyog Pawar 1919*c83a76b0SSuyog Pawar UWORD8 u1_max_tr_depth; 1920*c83a76b0SSuyog Pawar 1921*c83a76b0SSuyog Pawar /** 1922*c83a76b0SSuyog Pawar * CU level Qp 1923*c83a76b0SSuyog Pawar */ 1924*c83a76b0SSuyog Pawar WORD32 i4_cu_qp; 1925*c83a76b0SSuyog Pawar 1926*c83a76b0SSuyog Pawar /** 1927*c83a76b0SSuyog Pawar * CU level Qp / 6 1928*c83a76b0SSuyog Pawar */ 1929*c83a76b0SSuyog Pawar WORD32 i4_cu_qp_div6; 1930*c83a76b0SSuyog Pawar 1931*c83a76b0SSuyog Pawar /** 1932*c83a76b0SSuyog Pawar * CU level Qp % 6 1933*c83a76b0SSuyog Pawar */ 1934*c83a76b0SSuyog Pawar WORD32 i4_cu_qp_mod6; 1935*c83a76b0SSuyog Pawar 1936*c83a76b0SSuyog Pawar /** 1937*c83a76b0SSuyog Pawar * CU level QP to be used 1938*c83a76b0SSuyog Pawar */ 1939*c83a76b0SSuyog Pawar WORD32 i4_chrm_cu_qp; 1940*c83a76b0SSuyog Pawar 1941*c83a76b0SSuyog Pawar /** 1942*c83a76b0SSuyog Pawar * CU level Qp / 6 1943*c83a76b0SSuyog Pawar */ 1944*c83a76b0SSuyog Pawar WORD32 i4_chrm_cu_qp_div6; 1945*c83a76b0SSuyog Pawar 1946*c83a76b0SSuyog Pawar /** 1947*c83a76b0SSuyog Pawar * CU level Qp % 6 1948*c83a76b0SSuyog Pawar */ 1949*c83a76b0SSuyog Pawar WORD32 i4_chrm_cu_qp_mod6; 1950*c83a76b0SSuyog Pawar 1951*c83a76b0SSuyog Pawar /** previous cu qp 1952*c83a76b0SSuyog Pawar * @remarks : This needs to be remembered to handle skip cases in deblocking. 1953*c83a76b0SSuyog Pawar */ 1954*c83a76b0SSuyog Pawar WORD32 i4_prev_cu_qp; 1955*c83a76b0SSuyog Pawar 1956*c83a76b0SSuyog Pawar /** chroma qp offset 1957*c83a76b0SSuyog Pawar * @remarks : Used to calculate chroma qp and other qp related parameter at CU level 1958*c83a76b0SSuyog Pawar */ 1959*c83a76b0SSuyog Pawar WORD32 i4_chroma_qp_offset; 1960*c83a76b0SSuyog Pawar 1961*c83a76b0SSuyog Pawar /** 1962*c83a76b0SSuyog Pawar * Buffer Pointer to populate the scale matrix for all transform size 1963*c83a76b0SSuyog Pawar */ 1964*c83a76b0SSuyog Pawar WORD16 *pi2_scal_mat; 1965*c83a76b0SSuyog Pawar 1966*c83a76b0SSuyog Pawar /** 1967*c83a76b0SSuyog Pawar * Buffer Pointer to populate the rescale matrix for all transform size 1968*c83a76b0SSuyog Pawar */ 1969*c83a76b0SSuyog Pawar WORD16 *pi2_rescal_mat; 1970*c83a76b0SSuyog Pawar 1971*c83a76b0SSuyog Pawar /** array of pointer to store the scaling matrices for 1972*c83a76b0SSuyog Pawar * all transform sizes and qp % 6 (pre computed) 1973*c83a76b0SSuyog Pawar */ 1974*c83a76b0SSuyog Pawar WORD16 *api2_scal_mat[NUM_TRANS_TYPES * 2]; 1975*c83a76b0SSuyog Pawar 1976*c83a76b0SSuyog Pawar /** array of pointer to store the re-scaling matrices for 1977*c83a76b0SSuyog Pawar * all transform sizes and qp % 6 (pre computed) 1978*c83a76b0SSuyog Pawar */ 1979*c83a76b0SSuyog Pawar WORD16 *api2_rescal_mat[NUM_TRANS_TYPES * 2]; 1980*c83a76b0SSuyog Pawar 1981*c83a76b0SSuyog Pawar /** array of function pointers for residual and 1982*c83a76b0SSuyog Pawar * forward transform for all transform sizes 1983*c83a76b0SSuyog Pawar */ 1984*c83a76b0SSuyog Pawar pf_res_trans_luma apf_resd_trns[NUM_TRANS_TYPES]; 1985*c83a76b0SSuyog Pawar 1986*c83a76b0SSuyog Pawar /** array of function pointers for residual and 1987*c83a76b0SSuyog Pawar * forward HAD transform for all transform sizes 1988*c83a76b0SSuyog Pawar */ 1989*c83a76b0SSuyog Pawar pf_res_trans_luma_had_chroma apf_chrm_resd_trns_had[NUM_TRANS_TYPES - 2]; 1990*c83a76b0SSuyog Pawar 1991*c83a76b0SSuyog Pawar /** array of function pointers for residual and 1992*c83a76b0SSuyog Pawar * forward transform for all transform sizes 1993*c83a76b0SSuyog Pawar * for chroma 1994*c83a76b0SSuyog Pawar */ 1995*c83a76b0SSuyog Pawar pf_res_trans_chroma apf_chrm_resd_trns[NUM_TRANS_TYPES - 2]; 1996*c83a76b0SSuyog Pawar 1997*c83a76b0SSuyog Pawar /** array of function pointers for qunatization and 1998*c83a76b0SSuyog Pawar * inv Quant for ssd calc. for all transform sizes 1999*c83a76b0SSuyog Pawar */ 2000*c83a76b0SSuyog Pawar pf_quant_iquant_ssd apf_quant_iquant_ssd[4]; 2001*c83a76b0SSuyog Pawar 2002*c83a76b0SSuyog Pawar /** array of function pointers for inv.transform and 2003*c83a76b0SSuyog Pawar * recon for all transform sizes 2004*c83a76b0SSuyog Pawar */ 2005*c83a76b0SSuyog Pawar pf_it_recon apf_it_recon[NUM_TRANS_TYPES]; 2006*c83a76b0SSuyog Pawar 2007*c83a76b0SSuyog Pawar /** array of function pointers for inverse transform 2008*c83a76b0SSuyog Pawar * and recon for all transform sizes for chroma 2009*c83a76b0SSuyog Pawar */ 2010*c83a76b0SSuyog Pawar pf_it_recon_chroma apf_chrm_it_recon[NUM_TRANS_TYPES - 2]; 2011*c83a76b0SSuyog Pawar 2012*c83a76b0SSuyog Pawar /** array of luma intra prediction function pointers */ 2013*c83a76b0SSuyog Pawar pf_intra_pred apf_lum_ip[NUM_IP_FUNCS]; 2014*c83a76b0SSuyog Pawar 2015*c83a76b0SSuyog Pawar /** array of chroma intra prediction function pointers */ 2016*c83a76b0SSuyog Pawar pf_intra_pred apf_chrm_ip[NUM_IP_FUNCS]; 2017*c83a76b0SSuyog Pawar 2018*c83a76b0SSuyog Pawar /* - Function pointer to cu_mode_decide function */ 2019*c83a76b0SSuyog Pawar /* - The 'void *' is used since one of the parameters of */ 2020*c83a76b0SSuyog Pawar /* this class of functions is the current structure */ 2021*c83a76b0SSuyog Pawar /* - This function pointer is used to choose the */ 2022*c83a76b0SSuyog Pawar /* appropriate function depending on whether bit_depth is */ 2023*c83a76b0SSuyog Pawar /* chosen as 8 bits or greater */ 2024*c83a76b0SSuyog Pawar /* - This function pointer's type is defined at the end */ 2025*c83a76b0SSuyog Pawar /* of this file */ 2026*c83a76b0SSuyog Pawar void *pv_cu_mode_decide; 2027*c83a76b0SSuyog Pawar 2028*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2029*c83a76b0SSuyog Pawar void *pv_inter_rdopt_cu_mc_mvp; 2030*c83a76b0SSuyog Pawar 2031*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2032*c83a76b0SSuyog Pawar void *pv_inter_rdopt_cu_ntu; 2033*c83a76b0SSuyog Pawar 2034*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2035*c83a76b0SSuyog Pawar void *pv_intra_chroma_pred_mode_selector; 2036*c83a76b0SSuyog Pawar 2037*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2038*c83a76b0SSuyog Pawar void *pv_intra_rdopt_cu_ntu; 2039*c83a76b0SSuyog Pawar 2040*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2041*c83a76b0SSuyog Pawar void *pv_final_rdopt_mode_prcs; 2042*c83a76b0SSuyog Pawar 2043*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2044*c83a76b0SSuyog Pawar void *pv_store_cu_results; 2045*c83a76b0SSuyog Pawar 2046*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2047*c83a76b0SSuyog Pawar void *pv_enc_loop_cu_bot_copy; 2048*c83a76b0SSuyog Pawar 2049*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2050*c83a76b0SSuyog Pawar void *pv_final_mode_reevaluation_with_modified_cu_qp; 2051*c83a76b0SSuyog Pawar 2052*c83a76b0SSuyog Pawar /* Infer from the comment for the variable 'pv_cu_mode_decide' */ 2053*c83a76b0SSuyog Pawar void *pv_enc_loop_ctb_left_copy; 2054*c83a76b0SSuyog Pawar 2055*c83a76b0SSuyog Pawar /** Qunatization rounding factor for inter and intra CUs */ 2056*c83a76b0SSuyog Pawar WORD32 i4_quant_rnd_factor[2]; 2057*c83a76b0SSuyog Pawar 2058*c83a76b0SSuyog Pawar /** 2059*c83a76b0SSuyog Pawar * Frame Buffer Pointer to store the top row luma data. 2060*c83a76b0SSuyog Pawar * one pixel row in every ctb row 2061*c83a76b0SSuyog Pawar */ 2062*c83a76b0SSuyog Pawar void *apv_frm_top_row_luma[MAX_NUM_ENC_LOOP_PARALLEL]; 2063*c83a76b0SSuyog Pawar 2064*c83a76b0SSuyog Pawar /** 2065*c83a76b0SSuyog Pawar * One CTB row size of Top row luma data buffer 2066*c83a76b0SSuyog Pawar */ 2067*c83a76b0SSuyog Pawar WORD32 i4_top_row_luma_stride; 2068*c83a76b0SSuyog Pawar 2069*c83a76b0SSuyog Pawar /** 2070*c83a76b0SSuyog Pawar * One frm of Top row luma data buffer 2071*c83a76b0SSuyog Pawar */ 2072*c83a76b0SSuyog Pawar WORD32 i4_frm_top_row_luma_size; 2073*c83a76b0SSuyog Pawar 2074*c83a76b0SSuyog Pawar /** 2075*c83a76b0SSuyog Pawar * Current luma row bottom data store pointer 2076*c83a76b0SSuyog Pawar */ 2077*c83a76b0SSuyog Pawar void *pv_bot_row_luma; 2078*c83a76b0SSuyog Pawar 2079*c83a76b0SSuyog Pawar /** 2080*c83a76b0SSuyog Pawar * Top luma row top data access pointer 2081*c83a76b0SSuyog Pawar */ 2082*c83a76b0SSuyog Pawar void *pv_top_row_luma; 2083*c83a76b0SSuyog Pawar 2084*c83a76b0SSuyog Pawar /** 2085*c83a76b0SSuyog Pawar * Frame Buffer Pointer to store the top row chroma data (Cb Cr pixel interleaved ) 2086*c83a76b0SSuyog Pawar * one pixel row in every ctb row 2087*c83a76b0SSuyog Pawar */ 2088*c83a76b0SSuyog Pawar void *apv_frm_top_row_chroma[MAX_NUM_ENC_LOOP_PARALLEL]; 2089*c83a76b0SSuyog Pawar 2090*c83a76b0SSuyog Pawar /** 2091*c83a76b0SSuyog Pawar * One CTB row size of Top row chroma data buffer (Cb Cr pixel interleaved ) 2092*c83a76b0SSuyog Pawar */ 2093*c83a76b0SSuyog Pawar WORD32 i4_top_row_chroma_stride; 2094*c83a76b0SSuyog Pawar 2095*c83a76b0SSuyog Pawar /** 2096*c83a76b0SSuyog Pawar * One frm size of Top row chroma data buffer (Cb Cr pixel interleaved ) 2097*c83a76b0SSuyog Pawar */ 2098*c83a76b0SSuyog Pawar WORD32 i4_frm_top_row_chroma_size; 2099*c83a76b0SSuyog Pawar 2100*c83a76b0SSuyog Pawar /** 2101*c83a76b0SSuyog Pawar * Current chroma row bottom data store pointer 2102*c83a76b0SSuyog Pawar */ 2103*c83a76b0SSuyog Pawar void *pv_bot_row_chroma; 2104*c83a76b0SSuyog Pawar 2105*c83a76b0SSuyog Pawar /** 2106*c83a76b0SSuyog Pawar * Top chroma row top data access pointer 2107*c83a76b0SSuyog Pawar */ 2108*c83a76b0SSuyog Pawar void *pv_top_row_chroma; 2109*c83a76b0SSuyog Pawar 2110*c83a76b0SSuyog Pawar /** 2111*c83a76b0SSuyog Pawar * Frame Buffer Pointer to store the top row neighbour modes stored at 4x4 level 2112*c83a76b0SSuyog Pawar * one 4x4 row in every ctb row 2113*c83a76b0SSuyog Pawar */ 2114*c83a76b0SSuyog Pawar nbr_4x4_t *aps_frm_top_row_nbr[MAX_NUM_ENC_LOOP_PARALLEL]; 2115*c83a76b0SSuyog Pawar 2116*c83a76b0SSuyog Pawar /** 2117*c83a76b0SSuyog Pawar * One CTB row size of Top row nbr 4x4 params buffer 2118*c83a76b0SSuyog Pawar */ 2119*c83a76b0SSuyog Pawar WORD32 i4_top_row_nbr_stride; 2120*c83a76b0SSuyog Pawar 2121*c83a76b0SSuyog Pawar /** 2122*c83a76b0SSuyog Pawar * One frm size of Top row nbr 4x4 params buffer 2123*c83a76b0SSuyog Pawar */ 2124*c83a76b0SSuyog Pawar WORD32 i4_frm_top_row_nbr_size; 2125*c83a76b0SSuyog Pawar 2126*c83a76b0SSuyog Pawar /** 2127*c83a76b0SSuyog Pawar * Current row nbr prms bottom data store pointer 2128*c83a76b0SSuyog Pawar */ 2129*c83a76b0SSuyog Pawar nbr_4x4_t *ps_bot_row_nbr; 2130*c83a76b0SSuyog Pawar 2131*c83a76b0SSuyog Pawar /** 2132*c83a76b0SSuyog Pawar * Top row nbr prms top data access pointer 2133*c83a76b0SSuyog Pawar */ 2134*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_row_nbr; 2135*c83a76b0SSuyog Pawar 2136*c83a76b0SSuyog Pawar /** 2137*c83a76b0SSuyog Pawar * Pointer to (1,1) location in au1_nbr_ctb_map 2138*c83a76b0SSuyog Pawar */ 2139*c83a76b0SSuyog Pawar UWORD8 *pu1_ctb_nbr_map; 2140*c83a76b0SSuyog Pawar 2141*c83a76b0SSuyog Pawar /** 2142*c83a76b0SSuyog Pawar * neigbour map buffer stride; 2143*c83a76b0SSuyog Pawar */ 2144*c83a76b0SSuyog Pawar WORD32 i4_nbr_map_strd; 2145*c83a76b0SSuyog Pawar 2146*c83a76b0SSuyog Pawar /** 2147*c83a76b0SSuyog Pawar * Array at ctb level to store the neighour map 2148*c83a76b0SSuyog Pawar * its size is 25x25 for ctb size of 64x64 2149*c83a76b0SSuyog Pawar */ 2150*c83a76b0SSuyog Pawar UWORD8 au1_nbr_ctb_map[MAX_PU_IN_CTB_ROW + 1 + 8][MAX_PU_IN_CTB_ROW + 1 + 8]; 2151*c83a76b0SSuyog Pawar 2152*c83a76b0SSuyog Pawar /** 2153*c83a76b0SSuyog Pawar * Array to store left ctb data for luma 2154*c83a76b0SSuyog Pawar * some padding is added to take care of unconditional access 2155*c83a76b0SSuyog Pawar */ 2156*c83a76b0SSuyog Pawar void *pv_left_luma_data; 2157*c83a76b0SSuyog Pawar 2158*c83a76b0SSuyog Pawar /** 2159*c83a76b0SSuyog Pawar * Array to store left ctb data for chroma (cb abd cr pixel interleaved 2160*c83a76b0SSuyog Pawar * some padding is added to take care of unconditional access 2161*c83a76b0SSuyog Pawar */ 2162*c83a76b0SSuyog Pawar void *pv_left_chrm_data; 2163*c83a76b0SSuyog Pawar 2164*c83a76b0SSuyog Pawar /** 2165*c83a76b0SSuyog Pawar * Array to store the left neighbour modes at 4x4 level 2166*c83a76b0SSuyog Pawar */ 2167*c83a76b0SSuyog Pawar nbr_4x4_t as_left_col_nbr[MAX_PU_IN_CTB_ROW]; 2168*c83a76b0SSuyog Pawar 2169*c83a76b0SSuyog Pawar /** 2170*c83a76b0SSuyog Pawar * Array to store currrent CTb pred modes at a 4x4 level 2171*c83a76b0SSuyog Pawar * used for prediction inside ctb 2172*c83a76b0SSuyog Pawar */ 2173*c83a76b0SSuyog Pawar nbr_4x4_t as_ctb_nbr_arr[MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW]; 2174*c83a76b0SSuyog Pawar 2175*c83a76b0SSuyog Pawar /** 2176*c83a76b0SSuyog Pawar * array for storing csbf during RD opt stage at CU level 2177*c83a76b0SSuyog Pawar * one best and one current is required 2178*c83a76b0SSuyog Pawar */ 2179*c83a76b0SSuyog Pawar UWORD8 au1_cu_csbf[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW]; 2180*c83a76b0SSuyog Pawar 2181*c83a76b0SSuyog Pawar /** 2182*c83a76b0SSuyog Pawar * Stride of csbf buffer. will be useful for scanning access 2183*c83a76b0SSuyog Pawar * if stored in a 2D order. right now set to max tx size >> 4; 2184*c83a76b0SSuyog Pawar */ 2185*c83a76b0SSuyog Pawar WORD32 i4_cu_csbf_strd; 2186*c83a76b0SSuyog Pawar 2187*c83a76b0SSuyog Pawar /** 2188*c83a76b0SSuyog Pawar * Array to store pred modes during SATD and RD opt stage at CU level 2189*c83a76b0SSuyog Pawar * one best and one current is required 2190*c83a76b0SSuyog Pawar */ 2191*c83a76b0SSuyog Pawar nbr_4x4_t as_cu_nbr[2][MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW]; 2192*c83a76b0SSuyog Pawar 2193*c83a76b0SSuyog Pawar /** 2194*c83a76b0SSuyog Pawar * array to store the output of reference substitution process output 2195*c83a76b0SSuyog Pawar * for intra CUs 2196*c83a76b0SSuyog Pawar * TOP (32 x 2) + Left (32 x 2) + Top left (1) + Alignment (3) 2197*c83a76b0SSuyog Pawar */ 2198*c83a76b0SSuyog Pawar void *pv_ref_sub_out; 2199*c83a76b0SSuyog Pawar 2200*c83a76b0SSuyog Pawar /** 2201*c83a76b0SSuyog Pawar * array to store the filtered reference samples for intra CUs 2202*c83a76b0SSuyog Pawar * TOP (32 x 2) + Left (32 x 2) + Top left (1) + Alignment (3) 2203*c83a76b0SSuyog Pawar */ 2204*c83a76b0SSuyog Pawar void *pv_ref_filt_out; 2205*c83a76b0SSuyog Pawar 2206*c83a76b0SSuyog Pawar /** 2207*c83a76b0SSuyog Pawar * Used for 3 purposes 2208*c83a76b0SSuyog Pawar * 2209*c83a76b0SSuyog Pawar * 1. MC Intermediate buffer 2210*c83a76b0SSuyog Pawar * array for storing intermediate 16-bit value for hxhy subpel 2211*c83a76b0SSuyog Pawar * generation at CTB level (+ 16) for subpel planes boundary 2212*c83a76b0SSuyog Pawar * +4 is for horizontal 4pels 2213*c83a76b0SSuyog Pawar * 2214*c83a76b0SSuyog Pawar * 2. Temprory scratch buffer for transform and coeffs storage 2215*c83a76b0SSuyog Pawar * MAX_TRANS_SIZE *2 for trans_scratch(32bit) and MAX_TRANS_SIZE *1 for trans_values 2216*c83a76b0SSuyog Pawar * The first part i.e. from 0 to MAX_TRANS_SIZE is then reused for storing the quant coeffs 2217*c83a76b0SSuyog Pawar * Max of both are used 2218*c83a76b0SSuyog Pawar * 2219*c83a76b0SSuyog Pawar * 3. MC Intermediate buffer 2220*c83a76b0SSuyog Pawar * buffer for storing intermediate 16 bit values prior to conversion to 8bit in HBD 2221*c83a76b0SSuyog Pawar * 2222*c83a76b0SSuyog Pawar */ 2223*c83a76b0SSuyog Pawar MEM_ALIGN16 WORD16 ai2_scratch[(MAX_CTB_SIZE + 8 + 8) * (MAX_CTB_SIZE + 8 + 8 + 8) * 2]; 2224*c83a76b0SSuyog Pawar 2225*c83a76b0SSuyog Pawar /** 2226*c83a76b0SSuyog Pawar * array for storing cu level final params for a given mode 2227*c83a76b0SSuyog Pawar * one best and one current is required 2228*c83a76b0SSuyog Pawar */ 2229*c83a76b0SSuyog Pawar enc_loop_cu_final_prms_t as_cu_prms[2]; 2230*c83a76b0SSuyog Pawar 2231*c83a76b0SSuyog Pawar /** 2232*c83a76b0SSuyog Pawar * Scan index to be used for any gien transform 2233*c83a76b0SSuyog Pawar * this is a scartch variable used to communicate 2234*c83a76b0SSuyog Pawar * scan idx at every transform level 2235*c83a76b0SSuyog Pawar */ 2236*c83a76b0SSuyog Pawar WORD32 i4_scan_idx; 2237*c83a76b0SSuyog Pawar 2238*c83a76b0SSuyog Pawar /** 2239*c83a76b0SSuyog Pawar * Buffer index in ping pong buffers 2240*c83a76b0SSuyog Pawar * to be used SATD mode evaluations 2241*c83a76b0SSuyog Pawar */ 2242*c83a76b0SSuyog Pawar WORD32 i4_satd_buf_idx; 2243*c83a76b0SSuyog Pawar 2244*c83a76b0SSuyog Pawar /** 2245*c83a76b0SSuyog Pawar * Motion Compensation module context structre 2246*c83a76b0SSuyog Pawar */ 2247*c83a76b0SSuyog Pawar inter_pred_ctxt_t s_mc_ctxt; 2248*c83a76b0SSuyog Pawar 2249*c83a76b0SSuyog Pawar /** 2250*c83a76b0SSuyog Pawar * MV pred module context structre 2251*c83a76b0SSuyog Pawar */ 2252*c83a76b0SSuyog Pawar mv_pred_ctxt_t s_mv_pred_ctxt; 2253*c83a76b0SSuyog Pawar 2254*c83a76b0SSuyog Pawar /** 2255*c83a76b0SSuyog Pawar * Deblock BS ctb structure 2256*c83a76b0SSuyog Pawar */ 2257*c83a76b0SSuyog Pawar deblk_bs_ctb_ctxt_t s_deblk_bs_prms; 2258*c83a76b0SSuyog Pawar 2259*c83a76b0SSuyog Pawar /** 2260*c83a76b0SSuyog Pawar * Deblocking ctb structure 2261*c83a76b0SSuyog Pawar */ 2262*c83a76b0SSuyog Pawar deblk_ctb_params_t s_deblk_prms; 2263*c83a76b0SSuyog Pawar 2264*c83a76b0SSuyog Pawar /** 2265*c83a76b0SSuyog Pawar * Deblocking structure. For ctb-row level 2266*c83a76b0SSuyog Pawar */ 2267*c83a76b0SSuyog Pawar deblk_ctbrow_prms_t s_deblk_ctbrow_prms; 2268*c83a76b0SSuyog Pawar 2269*c83a76b0SSuyog Pawar /** 2270*c83a76b0SSuyog Pawar * Deblocking enable flag 2271*c83a76b0SSuyog Pawar */ 2272*c83a76b0SSuyog Pawar WORD32 i4_deblock_type; 2273*c83a76b0SSuyog Pawar 2274*c83a76b0SSuyog Pawar /** 2275*c83a76b0SSuyog Pawar * context for cabac bit estimation used during rdopt stage 2276*c83a76b0SSuyog Pawar */ 2277*c83a76b0SSuyog Pawar rdopt_entropy_ctxt_t s_rdopt_entropy_ctxt; 2278*c83a76b0SSuyog Pawar 2279*c83a76b0SSuyog Pawar /** 2280*c83a76b0SSuyog Pawar * Context models stored for RDopt store and restore purpose 2281*c83a76b0SSuyog Pawar */ 2282*c83a76b0SSuyog Pawar UWORD8 au1_rdopt_init_ctxt_models[IHEVC_CAB_CTXT_END]; 2283*c83a76b0SSuyog Pawar 2284*c83a76b0SSuyog Pawar /** 2285*c83a76b0SSuyog Pawar * current picture slice type 2286*c83a76b0SSuyog Pawar */ 2287*c83a76b0SSuyog Pawar WORD8 i1_slice_type; 2288*c83a76b0SSuyog Pawar 2289*c83a76b0SSuyog Pawar /** 2290*c83a76b0SSuyog Pawar * strong_intra_smoothing_enable_flag 2291*c83a76b0SSuyog Pawar */ 2292*c83a76b0SSuyog Pawar WORD8 i1_strong_intra_smoothing_enable_flag; 2293*c83a76b0SSuyog Pawar 2294*c83a76b0SSuyog Pawar /** Pointer to Dep Mngr for controlling Top-Right CU dependency */ 2295*c83a76b0SSuyog Pawar void *pv_dep_mngr_enc_loop_cu_top_right; 2296*c83a76b0SSuyog Pawar 2297*c83a76b0SSuyog Pawar /** Pointer to Dep Mngr for controlling Deblocking Top dependency */ 2298*c83a76b0SSuyog Pawar void *pv_dep_mngr_enc_loop_dblk; 2299*c83a76b0SSuyog Pawar 2300*c83a76b0SSuyog Pawar /** Pointer to Dep Mngr for controlling Deblocking Top dependency */ 2301*c83a76b0SSuyog Pawar void *pv_dep_mngr_enc_loop_sao; 2302*c83a76b0SSuyog Pawar 2303*c83a76b0SSuyog Pawar /** pointer to store the cabac states at end of second CTB in current row */ 2304*c83a76b0SSuyog Pawar UWORD8 *pu1_curr_row_cabac_state; 2305*c83a76b0SSuyog Pawar 2306*c83a76b0SSuyog Pawar /** pointer to copy the cabac states at start of first CTB in current row */ 2307*c83a76b0SSuyog Pawar UWORD8 *pu1_top_rt_cabac_state; 2308*c83a76b0SSuyog Pawar /** flag to indicate rate control mode. 2309*c83a76b0SSuyog Pawar * @remarks : To enable CU level qp modulation only when required. 2310*c83a76b0SSuyog Pawar */ 2311*c83a76b0SSuyog Pawar WORD8 i1_cu_qp_delta_enable; 2312*c83a76b0SSuyog Pawar 2313*c83a76b0SSuyog Pawar /** flag to indicate rate control mode. 2314*c83a76b0SSuyog Pawar * @remarks : Entropy sync enable flag 2315*c83a76b0SSuyog Pawar */ 2316*c83a76b0SSuyog Pawar WORD8 i1_entropy_coding_sync_enabled_flag; 2317*c83a76b0SSuyog Pawar 2318*c83a76b0SSuyog Pawar /** Use SATD or SAD for best merge candidate evaluation */ 2319*c83a76b0SSuyog Pawar WORD32 i4_use_satd_for_merge_eval; 2320*c83a76b0SSuyog Pawar 2321*c83a76b0SSuyog Pawar UWORD8 u1_use_early_cbf_data; 2322*c83a76b0SSuyog Pawar 2323*c83a76b0SSuyog Pawar /** Use SATD or SAD for best CU merge candidate evaluation */ 2324*c83a76b0SSuyog Pawar WORD32 i4_use_satd_for_cu_merge; 2325*c83a76b0SSuyog Pawar 2326*c83a76b0SSuyog Pawar /** Maximum number of merge candidates to be evaluated */ 2327*c83a76b0SSuyog Pawar WORD32 i4_max_merge_candidates; 2328*c83a76b0SSuyog Pawar 2329*c83a76b0SSuyog Pawar /** Flag to indicate whether current pictute needs to be deblocked, 2330*c83a76b0SSuyog Pawar padded and hpel planes need to be generated. 2331*c83a76b0SSuyog Pawar These are turned off typically in non referecne pictures when psnr 2332*c83a76b0SSuyog Pawar and recon dump is disabled 2333*c83a76b0SSuyog Pawar */ 2334*c83a76b0SSuyog Pawar WORD32 i4_deblk_pad_hpel_cur_pic; 2335*c83a76b0SSuyog Pawar 2336*c83a76b0SSuyog Pawar /* Array of structures for storing mc predicted data for 2337*c83a76b0SSuyog Pawar * merge and skip modes 2338*c83a76b0SSuyog Pawar */ 2339*c83a76b0SSuyog Pawar merge_skip_pred_data_t as_merge_skip_pred_data[MAX_NUM_CU_MERGE_SKIP_CAND]; 2340*c83a76b0SSuyog Pawar 2341*c83a76b0SSuyog Pawar /* Sum the Qps of each 8*8 block in CU 2342*c83a76b0SSuyog Pawar * 8*8 block is considered as Min CU size possible as per standard is 8 2343*c83a76b0SSuyog Pawar * 0 corresponds to INTER and 1 corresponds to INTRA 2344*c83a76b0SSuyog Pawar */ 2345*c83a76b0SSuyog Pawar LWORD64 i8_cl_ssd_lambda_qf_array[MAX_HEVC_QP_12bit + 1]; 2346*c83a76b0SSuyog Pawar UWORD32 au4_chroma_cost_weighing_factor_array[MAX_HEVC_QP_12bit + 1]; 2347*c83a76b0SSuyog Pawar LWORD64 i8_cl_ssd_lambda_chroma_qf_array[MAX_HEVC_QP_12bit + 1]; 2348*c83a76b0SSuyog Pawar WORD32 i4_satd_lamda_array[MAX_HEVC_QP_12bit + 1]; 2349*c83a76b0SSuyog Pawar WORD32 i4_sad_lamda_array[MAX_HEVC_QP_12bit + 1]; 2350*c83a76b0SSuyog Pawar 2351*c83a76b0SSuyog Pawar /************************************************************************/ 2352*c83a76b0SSuyog Pawar /* The fields with the string 'type2' in their names are required */ 2353*c83a76b0SSuyog Pawar /* when both 8bit and hbd lambdas are needed. The lambdas corresponding */ 2354*c83a76b0SSuyog Pawar /* to the bit_depth != internal_bit_depth are stored in these fields */ 2355*c83a76b0SSuyog Pawar /************************************************************************/ 2356*c83a76b0SSuyog Pawar LWORD64 i8_cl_ssd_type2_lambda_qf_array[MAX_HEVC_QP_12bit + 1]; 2357*c83a76b0SSuyog Pawar LWORD64 i8_cl_ssd_type2_lambda_chroma_qf_array[MAX_HEVC_QP_12bit + 1]; 2358*c83a76b0SSuyog Pawar WORD32 i4_satd_type2_lamda_array[MAX_HEVC_QP_12bit + 1]; 2359*c83a76b0SSuyog Pawar WORD32 i4_sad_type2_lamda_array[MAX_HEVC_QP_12bit + 1]; 2360*c83a76b0SSuyog Pawar 2361*c83a76b0SSuyog Pawar /* Lokesh: Added to find if the CU is the first to be coded in the group */ 2362*c83a76b0SSuyog Pawar WORD32 i4_is_first_cu_qg_coded; 2363*c83a76b0SSuyog Pawar 2364*c83a76b0SSuyog Pawar /* Chroma RDOPT related parameters */ 2365*c83a76b0SSuyog Pawar ihevce_chroma_rdopt_ctxt_t s_chroma_rdopt_ctxt; 2366*c83a76b0SSuyog Pawar 2367*c83a76b0SSuyog Pawar /* Structure to save pred data of ME/Intra cand */ 2368*c83a76b0SSuyog Pawar cu_me_intra_pred_prms_t s_cu_me_intra_pred_prms; 2369*c83a76b0SSuyog Pawar 2370*c83a76b0SSuyog Pawar /* Structure to save the flags required for Final mode Reconstruction 2371*c83a76b0SSuyog Pawar function. These flags are set based on quality presets and bit-rate 2372*c83a76b0SSuyog Pawar we are working on */ 2373*c83a76b0SSuyog Pawar cu_final_recon_flags_t s_cu_final_recon_flags; 2374*c83a76b0SSuyog Pawar 2375*c83a76b0SSuyog Pawar /* Parameter to how at which level RDOQ will be implemented: 2376*c83a76b0SSuyog Pawar 0 - RDOQ disbaled 2377*c83a76b0SSuyog Pawar 1 - RDOQ enabled during RDOPT for all candidates 2378*c83a76b0SSuyog Pawar 2 - RDOQ enabled only for the final candidate*/ 2379*c83a76b0SSuyog Pawar WORD32 i4_rdoq_level; 2380*c83a76b0SSuyog Pawar 2381*c83a76b0SSuyog Pawar /* Parameter to how at which level Quant rounding factors are computed: 2382*c83a76b0SSuyog Pawar FIXED_QUANT_ROUNDING : Fixed Quant rounding values are used 2383*c83a76b0SSuyog Pawar NCTB_LEVEL_QUANT_ROUNDING : NCTB level Cmputed Quant rounding values are used 2384*c83a76b0SSuyog Pawar CTB_LEVEL_QUANT_ROUNDING : CTB level Cmputed Quant rounding values are used 2385*c83a76b0SSuyog Pawar CU_LEVEL_QUANT_ROUNDING : CU level Cmputed Quant rounding values are used 2386*c83a76b0SSuyog Pawar TU_LEVEL_QUANT_ROUNDING : TU level Cmputed Quant rounding values are used*/ 2387*c83a76b0SSuyog Pawar WORD32 i4_quant_rounding_level; 2388*c83a76b0SSuyog Pawar 2389*c83a76b0SSuyog Pawar /* Parameter to how at which level Quant rounding factors are computed: 2390*c83a76b0SSuyog Pawar CHROMA_QUANT_ROUNDING : Chroma Quant rounding values are used for chroma */ 2391*c83a76b0SSuyog Pawar WORD32 i4_chroma_quant_rounding_level; 2392*c83a76b0SSuyog Pawar 2393*c83a76b0SSuyog Pawar /* Parameter to how at which level RDOQ will be implemented: 2394*c83a76b0SSuyog Pawar 0 - SBH disbaled 2395*c83a76b0SSuyog Pawar 1 - SBH enabled during RDOPT for all candidates 2396*c83a76b0SSuyog Pawar 2 - SBH enabled only for the final candidate*/ 2397*c83a76b0SSuyog Pawar WORD32 i4_sbh_level; 2398*c83a76b0SSuyog Pawar 2399*c83a76b0SSuyog Pawar /* Parameter to how at which level ZERO CBF RDO will be implemented: 2400*c83a76b0SSuyog Pawar 0 - ZCBF disbaled 2401*c83a76b0SSuyog Pawar 1 - ZCBF enabled during RDOPT for all candidates 2402*c83a76b0SSuyog Pawar 2 - ZCBF enabled only for the final candidate 2403*c83a76b0SSuyog Pawar */ 2404*c83a76b0SSuyog Pawar WORD32 i4_zcbf_rdo_level; 2405*c83a76b0SSuyog Pawar 2406*c83a76b0SSuyog Pawar /*RDOQ-SBH context structure*/ 2407*c83a76b0SSuyog Pawar rdoq_sbh_ctxt_t s_rdoq_sbh_ctxt; 2408*c83a76b0SSuyog Pawar 2409*c83a76b0SSuyog Pawar /** Structure to store the Merge/Skip Cand. for EncLoop */ 2410*c83a76b0SSuyog Pawar cu_inter_merge_skip_t s_cu_inter_merge_skip; 2411*c83a76b0SSuyog Pawar /** Structure to store the Mixed mode Cand. for EncLoop */ 2412*c83a76b0SSuyog Pawar cu_mixed_mode_inter_t s_mixed_mode_inter_cu; 2413*c83a76b0SSuyog Pawar 2414*c83a76b0SSuyog Pawar ihevce_inter_pred_buf_data_t s_pred_buf_data; 2415*c83a76b0SSuyog Pawar 2416*c83a76b0SSuyog Pawar void *pv_422_chroma_intra_pred_buf; 2417*c83a76b0SSuyog Pawar 2418*c83a76b0SSuyog Pawar WORD32 i4_max_num_inter_rdopt_cands; 2419*c83a76b0SSuyog Pawar 2420*c83a76b0SSuyog Pawar /* Output Struct per each CU during recursions */ 2421*c83a76b0SSuyog Pawar ihevce_enc_cu_node_ctxt_t as_enc_cu_ctxt[MAX_CU_IN_CTB + 1]; 2422*c83a76b0SSuyog Pawar 2423*c83a76b0SSuyog Pawar /* Used to store best inter candidate. Used only when */ 2424*c83a76b0SSuyog Pawar /* 'CU modulated QP override' is enabled */ 2425*c83a76b0SSuyog Pawar cu_inter_cand_t as_best_cand[MAX_CU_IN_CTB + 1]; 2426*c83a76b0SSuyog Pawar 2427*c83a76b0SSuyog Pawar cu_inter_cand_t *ps_best_cand; 2428*c83a76b0SSuyog Pawar 2429*c83a76b0SSuyog Pawar UWORD8 au1_cu_init_cabac_state_a_priori[MAX_CU_IN_CTB + 1][IHEVC_CAB_CTXT_END]; 2430*c83a76b0SSuyog Pawar 2431*c83a76b0SSuyog Pawar UWORD8 (*pau1_curr_cu_a_priori_cabac_state)[IHEVC_CAB_CTXT_END]; 2432*c83a76b0SSuyog Pawar 2433*c83a76b0SSuyog Pawar /* Used to store pred data of each CU in the CTB. */ 2434*c83a76b0SSuyog Pawar /* Used only when 'CU modulated QP override' is enabled */ 2435*c83a76b0SSuyog Pawar void *pv_CTB_pred_luma; 2436*c83a76b0SSuyog Pawar 2437*c83a76b0SSuyog Pawar void *pv_CTB_pred_chroma; 2438*c83a76b0SSuyog Pawar 2439*c83a76b0SSuyog Pawar /** 2440*c83a76b0SSuyog Pawar * array for storing recon during SATD and RD opt stage at CU level 2441*c83a76b0SSuyog Pawar * one best and one current is required.Luma and chroma together 2442*c83a76b0SSuyog Pawar */ 2443*c83a76b0SSuyog Pawar void *pv_cu_luma_recon; 2444*c83a76b0SSuyog Pawar 2445*c83a76b0SSuyog Pawar /** 2446*c83a76b0SSuyog Pawar * array for storing recon during SATD and RD opt stage at CU level 2447*c83a76b0SSuyog Pawar * one best and one current is required.Luma and chroma together 2448*c83a76b0SSuyog Pawar */ 2449*c83a76b0SSuyog Pawar void *pv_cu_chrma_recon; 2450*c83a76b0SSuyog Pawar 2451*c83a76b0SSuyog Pawar /** 2452*c83a76b0SSuyog Pawar * Array to store pred modes during SATD and RD opt stage at CU level 2453*c83a76b0SSuyog Pawar * one best and one current is required 2454*c83a76b0SSuyog Pawar */ 2455*c83a76b0SSuyog Pawar nbr_4x4_t as_cu_recur_nbr[MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW]; 2456*c83a76b0SSuyog Pawar 2457*c83a76b0SSuyog Pawar /** 2458*c83a76b0SSuyog Pawar * Pointer to Array to store pred modes during SATD and RD opt stage at CU level 2459*c83a76b0SSuyog Pawar * one best and one current is required 2460*c83a76b0SSuyog Pawar */ 2461*c83a76b0SSuyog Pawar nbr_4x4_t *ps_cu_recur_nbr; 2462*c83a76b0SSuyog Pawar 2463*c83a76b0SSuyog Pawar /** 2464*c83a76b0SSuyog Pawar * Context models stored for CU recursion parent evaluation 2465*c83a76b0SSuyog Pawar */ 2466*c83a76b0SSuyog Pawar UWORD8 au1_rdopt_recur_ctxt_models[4][IHEVC_CAB_CTXT_END]; 2467*c83a76b0SSuyog Pawar 2468*c83a76b0SSuyog Pawar ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt; 2469*c83a76b0SSuyog Pawar 2470*c83a76b0SSuyog Pawar /** 2471*c83a76b0SSuyog Pawar * array for storing coeffs during RD opt stage at CU level 2472*c83a76b0SSuyog Pawar * one best and one current is required. Luma and chroma together 2473*c83a76b0SSuyog Pawar */ 2474*c83a76b0SSuyog Pawar /*UWORD8 au1_cu_recur_coeffs[MAX_LUMA_COEFFS_CTB + MAX_CHRM_COEFFS_CTB];*/ 2475*c83a76b0SSuyog Pawar 2476*c83a76b0SSuyog Pawar UWORD8 *pu1_cu_recur_coeffs; 2477*c83a76b0SSuyog Pawar 2478*c83a76b0SSuyog Pawar UWORD8 *apu1_cu_level_pingpong_coeff_buf_addr[2]; 2479*c83a76b0SSuyog Pawar 2480*c83a76b0SSuyog Pawar WORD16 *api2_cu_level_pingpong_deq_buf_addr[2]; 2481*c83a76b0SSuyog Pawar 2482*c83a76b0SSuyog Pawar UWORD8 *pu1_ecd_data; 2483*c83a76b0SSuyog Pawar 2484*c83a76b0SSuyog Pawar /* OPT: flag to skip parent CU=4TU eval during recursion */ 2485*c83a76b0SSuyog Pawar UWORD8 is_parent_cu_rdopt; 2486*c83a76b0SSuyog Pawar 2487*c83a76b0SSuyog Pawar /** 2488*c83a76b0SSuyog Pawar * Array of structs containing block merge data for 2489*c83a76b0SSuyog Pawar * 4 32x32 CU's in indices 1 - 4 and 64x64 CU at 0 2490*c83a76b0SSuyog Pawar */ 2491*c83a76b0SSuyog Pawar UWORD8 u1_cabac_states_next_row_copied_flag; 2492*c83a76b0SSuyog Pawar 2493*c83a76b0SSuyog Pawar UWORD8 u1_cabac_states_first_cu_copied_flag; 2494*c83a76b0SSuyog Pawar 2495*c83a76b0SSuyog Pawar UWORD32 u4_cur_ctb_wd; 2496*c83a76b0SSuyog Pawar 2497*c83a76b0SSuyog Pawar UWORD32 u4_cur_ctb_ht; 2498*c83a76b0SSuyog Pawar 2499*c83a76b0SSuyog Pawar /* thread id of the current context */ 2500*c83a76b0SSuyog Pawar WORD32 thrd_id; 2501*c83a76b0SSuyog Pawar 2502*c83a76b0SSuyog Pawar /** Number of processing threads created run time */ 2503*c83a76b0SSuyog Pawar WORD32 i4_num_proc_thrds; 2504*c83a76b0SSuyog Pawar 2505*c83a76b0SSuyog Pawar /* Instance number of bit-rate for multiple bit-rate encode */ 2506*c83a76b0SSuyog Pawar WORD32 i4_bitrate_instance_num; 2507*c83a76b0SSuyog Pawar 2508*c83a76b0SSuyog Pawar WORD32 i4_num_bitrates; 2509*c83a76b0SSuyog Pawar 2510*c83a76b0SSuyog Pawar WORD32 i4_enc_frm_id; 2511*c83a76b0SSuyog Pawar 2512*c83a76b0SSuyog Pawar /* Flag to indicate if chroma needs to be considered for cost calculation */ 2513*c83a76b0SSuyog Pawar WORD32 i4_consider_chroma_cost; 2514*c83a76b0SSuyog Pawar 2515*c83a76b0SSuyog Pawar /* Number of modes to be evaluated for intra */ 2516*c83a76b0SSuyog Pawar WORD32 i4_num_modes_to_evaluate_intra; 2517*c83a76b0SSuyog Pawar 2518*c83a76b0SSuyog Pawar /* Number of modes to be evaluated for inter */ 2519*c83a76b0SSuyog Pawar WORD32 i4_num_modes_to_evaluate_inter; 2520*c83a76b0SSuyog Pawar /*pointers for struct to hold RC parameters for each bit-rate instance */ 2521*c83a76b0SSuyog Pawar enc_loop_rc_params_t 2522*c83a76b0SSuyog Pawar *aaps_enc_loop_rc_params[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES]; 2523*c83a76b0SSuyog Pawar 2524*c83a76b0SSuyog Pawar /** Pointer to structure containing function pointers of common*/ 2525*c83a76b0SSuyog Pawar func_selector_t *ps_func_selector; 2526*c83a76b0SSuyog Pawar 2527*c83a76b0SSuyog Pawar /* Flag to control Top Right Sync for during Merge */ 2528*c83a76b0SSuyog Pawar UWORD8 u1_use_top_at_ctb_boundary; 2529*c83a76b0SSuyog Pawar 2530*c83a76b0SSuyog Pawar UWORD8 u1_is_input_data_hbd; 2531*c83a76b0SSuyog Pawar 2532*c83a76b0SSuyog Pawar UWORD8 u1_bit_depth; 2533*c83a76b0SSuyog Pawar 2534*c83a76b0SSuyog Pawar /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */ 2535*c83a76b0SSuyog Pawar UWORD8 u1_chroma_array_type; 2536*c83a76b0SSuyog Pawar 2537*c83a76b0SSuyog Pawar rc_quant_t *ps_rc_quant_ctxt; 2538*c83a76b0SSuyog Pawar 2539*c83a76b0SSuyog Pawar sao_ctxt_t s_sao_ctxt_t; 2540*c83a76b0SSuyog Pawar 2541*c83a76b0SSuyog Pawar /* Offset to get the Qp for the last CU of upper CTB-row. 2542*c83a76b0SSuyog Pawar This offset is from the current tile top row QP map start. 2543*c83a76b0SSuyog Pawar This will only be consumed by the first CU of current CTB-row 2544*c83a76b0SSuyog Pawar iff [it is skip && entropy sync is off] */ 2545*c83a76b0SSuyog Pawar WORD32 *pi4_offset_for_last_cu_qp; 2546*c83a76b0SSuyog Pawar 2547*c83a76b0SSuyog Pawar double i4_lamda_modifier; 2548*c83a76b0SSuyog Pawar double i4_uv_lamda_modifier; 2549*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer_id; 2550*c83a76b0SSuyog Pawar 2551*c83a76b0SSuyog Pawar UWORD8 u1_disable_intra_eval; 2552*c83a76b0SSuyog Pawar 2553*c83a76b0SSuyog Pawar WORD32 i4_quant_round_tu[2][32 * 32]; 2554*c83a76b0SSuyog Pawar 2555*c83a76b0SSuyog Pawar WORD32 *pi4_quant_round_factor_tu_0_1[5]; 2556*c83a76b0SSuyog Pawar WORD32 *pi4_quant_round_factor_tu_1_2[5]; 2557*c83a76b0SSuyog Pawar 2558*c83a76b0SSuyog Pawar WORD32 i4_quant_round_4x4[2][4 * 4]; 2559*c83a76b0SSuyog Pawar WORD32 i4_quant_round_8x8[2][8 * 8]; 2560*c83a76b0SSuyog Pawar WORD32 i4_quant_round_16x16[2][16 * 16]; 2561*c83a76b0SSuyog Pawar WORD32 i4_quant_round_32x32[2][32 * 32]; 2562*c83a76b0SSuyog Pawar 2563*c83a76b0SSuyog Pawar WORD32 *pi4_quant_round_factor_cu_ctb_0_1[5]; 2564*c83a76b0SSuyog Pawar WORD32 *pi4_quant_round_factor_cu_ctb_1_2[5]; 2565*c83a76b0SSuyog Pawar 2566*c83a76b0SSuyog Pawar WORD32 i4_quant_round_cr_4x4[2][4 * 4]; 2567*c83a76b0SSuyog Pawar WORD32 i4_quant_round_cr_8x8[2][8 * 8]; 2568*c83a76b0SSuyog Pawar WORD32 i4_quant_round_cr_16x16[2][16 * 16]; 2569*c83a76b0SSuyog Pawar 2570*c83a76b0SSuyog Pawar WORD32 *pi4_quant_round_factor_cr_cu_ctb_0_1[3]; 2571*c83a76b0SSuyog Pawar WORD32 *pi4_quant_round_factor_cr_cu_ctb_1_2[3]; 2572*c83a76b0SSuyog Pawar /* cost for not coding cu residue i.e forcing no residue syntax as 1 */ 2573*c83a76b0SSuyog Pawar LWORD64 i8_cu_not_coded_cost; 2574*c83a76b0SSuyog Pawar 2575*c83a76b0SSuyog Pawar /* dependency manager for forward ME sync */ 2576*c83a76b0SSuyog Pawar void *pv_dep_mngr_encloop_dep_me; 2577*c83a76b0SSuyog Pawar 2578*c83a76b0SSuyog Pawar LWORD64 ai4_source_satd_8x8[64]; 2579*c83a76b0SSuyog Pawar 2580*c83a76b0SSuyog Pawar LWORD64 ai4_source_chroma_satd[256]; 2581*c83a76b0SSuyog Pawar 2582*c83a76b0SSuyog Pawar UWORD8 u1_is_refPic; 2583*c83a76b0SSuyog Pawar 2584*c83a76b0SSuyog Pawar WORD32 i4_qp_mod; 2585*c83a76b0SSuyog Pawar 2586*c83a76b0SSuyog Pawar WORD32 i4_is_ref_pic; 2587*c83a76b0SSuyog Pawar 2588*c83a76b0SSuyog Pawar WORD32 i4_chroma_format; 2589*c83a76b0SSuyog Pawar 2590*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer; 2591*c83a76b0SSuyog Pawar 2592*c83a76b0SSuyog Pawar WORD32 i4_use_const_lamda_modifier; 2593*c83a76b0SSuyog Pawar 2594*c83a76b0SSuyog Pawar double f_i_pic_lamda_modifier; 2595*c83a76b0SSuyog Pawar 2596*c83a76b0SSuyog Pawar LWORD64 i8_distortion; 2597*c83a76b0SSuyog Pawar 2598*c83a76b0SSuyog Pawar WORD32 i4_use_ctb_level_lamda; 2599*c83a76b0SSuyog Pawar 2600*c83a76b0SSuyog Pawar float f_str_ratio; 2601*c83a76b0SSuyog Pawar 2602*c83a76b0SSuyog Pawar /* Flag to indicate if current frame is to be shared with other clients. 2603*c83a76b0SSuyog Pawar Used only in distributed-encoding */ 2604*c83a76b0SSuyog Pawar WORD32 i4_share_flag; 2605*c83a76b0SSuyog Pawar 2606*c83a76b0SSuyog Pawar /* Pointer to the current recon being processed. 2607*c83a76b0SSuyog Pawar Needed for enabling TMVP in dist-encoding */ 2608*c83a76b0SSuyog Pawar void *pv_frm_recon; 2609*c83a76b0SSuyog Pawar 2610*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t s_cmn_opt_func; 2611*c83a76b0SSuyog Pawar 2612*c83a76b0SSuyog Pawar /* The ME analogue to the struct above was not included since */ 2613*c83a76b0SSuyog Pawar /* that would have entailed inclusion of all ME specific */ 2614*c83a76b0SSuyog Pawar /* header files */ 2615*c83a76b0SSuyog Pawar /*FT_SAD_EVALUATOR **/ 2616*c83a76b0SSuyog Pawar 2617*c83a76b0SSuyog Pawar /*FT_SAD_EVALUATOR **/ 2618*c83a76b0SSuyog Pawar void *pv_evalsad_pt_npu_mxn_8bit; 2619*c83a76b0SSuyog Pawar UWORD8 u1_enable_psyRDOPT; 2620*c83a76b0SSuyog Pawar 2621*c83a76b0SSuyog Pawar UWORD8 u1_is_stasino_enabled; 2622*c83a76b0SSuyog Pawar 2623*c83a76b0SSuyog Pawar UWORD32 u4_psy_strength; 2624*c83a76b0SSuyog Pawar /*Sub PIC rc context */ 2625*c83a76b0SSuyog Pawar 2626*c83a76b0SSuyog Pawar WORD32 i4_sub_pic_level_rc; 2627*c83a76b0SSuyog Pawar WORD32 i4_num_ctb_for_out_scale; 2628*c83a76b0SSuyog Pawar 2629*c83a76b0SSuyog Pawar /** 2630*c83a76b0SSuyog Pawar * Accumalated bits of all cu for required CTBS estimated during RDO evaluation. 2631*c83a76b0SSuyog Pawar * Required for sup pic level RC. Reset when required CU/CTB count is reached. 2632*c83a76b0SSuyog Pawar */ 2633*c83a76b0SSuyog Pawar UWORD32 u4_total_cu_bits; 2634*c83a76b0SSuyog Pawar 2635*c83a76b0SSuyog Pawar UWORD32 u4_total_cu_bits_mul_qs; 2636*c83a76b0SSuyog Pawar 2637*c83a76b0SSuyog Pawar UWORD32 u4_total_cu_hdr_bits; 2638*c83a76b0SSuyog Pawar 2639*c83a76b0SSuyog Pawar UWORD32 u4_cu_tot_bits_into_qscale; 2640*c83a76b0SSuyog Pawar 2641*c83a76b0SSuyog Pawar UWORD32 u4_cu_tot_bits; 2642*c83a76b0SSuyog Pawar 2643*c83a76b0SSuyog Pawar /*Scale added to the current qscale, output from sub pic rc*/ 2644*c83a76b0SSuyog Pawar WORD32 i4_cu_qp_sub_pic_rc; 2645*c83a76b0SSuyog Pawar 2646*c83a76b0SSuyog Pawar /*Frame level L1 IPE sad*/ 2647*c83a76b0SSuyog Pawar LWORD64 i8_frame_l1_ipe_sad; 2648*c83a76b0SSuyog Pawar 2649*c83a76b0SSuyog Pawar /*Frame level L0 IPE satd*/ 2650*c83a76b0SSuyog Pawar LWORD64 i8_frame_l0_ipe_satd; 2651*c83a76b0SSuyog Pawar 2652*c83a76b0SSuyog Pawar /*Frame level L1 ME sad*/ 2653*c83a76b0SSuyog Pawar LWORD64 i8_frame_l1_me_sad; 2654*c83a76b0SSuyog Pawar 2655*c83a76b0SSuyog Pawar /*Frame level L1 activity factor*/ 2656*c83a76b0SSuyog Pawar LWORD64 i8_frame_l1_activity_fact; 2657*c83a76b0SSuyog Pawar /*bits esimated for frame calulated for sub pic rc bit control */ 2658*c83a76b0SSuyog Pawar WORD32 ai4_frame_bits_estimated[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES]; 2659*c83a76b0SSuyog Pawar /** I Scene cut */ 2660*c83a76b0SSuyog Pawar WORD32 i4_is_I_scenecut; 2661*c83a76b0SSuyog Pawar 2662*c83a76b0SSuyog Pawar /** Non Scene cut */ 2663*c83a76b0SSuyog Pawar WORD32 i4_is_non_I_scenecut; 2664*c83a76b0SSuyog Pawar 2665*c83a76b0SSuyog Pawar /** Frames for which online/offline model is not valid */ 2666*c83a76b0SSuyog Pawar WORD32 i4_is_model_valid; 2667*c83a76b0SSuyog Pawar 2668*c83a76b0SSuyog Pawar /** Steady State Frame */ 2669*c83a76b0SSuyog Pawar //WORD32 i4_is_steady_state; 2670*c83a76b0SSuyog Pawar 2671*c83a76b0SSuyog Pawar WORD32 i4_is_first_query; 2672*c83a76b0SSuyog Pawar 2673*c83a76b0SSuyog Pawar /* Pointer to Tile params base */ 2674*c83a76b0SSuyog Pawar void *pv_tile_params_base; 2675*c83a76b0SSuyog Pawar 2676*c83a76b0SSuyog Pawar /** The index of column tile for which it is working */ 2677*c83a76b0SSuyog Pawar WORD32 i4_tile_col_idx; 2678*c83a76b0SSuyog Pawar 2679*c83a76b0SSuyog Pawar WORD32 i4_max_search_range_horizontal; 2680*c83a76b0SSuyog Pawar 2681*c83a76b0SSuyog Pawar WORD32 i4_max_search_range_vertical; 2682*c83a76b0SSuyog Pawar 2683*c83a76b0SSuyog Pawar WORD32 i4_is_ctb_qp_modified; 2684*c83a76b0SSuyog Pawar 2685*c83a76b0SSuyog Pawar WORD32 i4_display_num; 2686*c83a76b0SSuyog Pawar 2687*c83a76b0SSuyog Pawar WORD32 i4_pred_qp; 2688*c83a76b0SSuyog Pawar 2689*c83a76b0SSuyog Pawar /*assumption of qg size is 8x8 block size*/ 2690*c83a76b0SSuyog Pawar WORD32 ai4_qp_qg[8 * 8]; 2691*c83a76b0SSuyog Pawar 2692*c83a76b0SSuyog Pawar WORD32 i4_last_cu_qp_from_prev_ctb; 2693*c83a76b0SSuyog Pawar 2694*c83a76b0SSuyog Pawar WORD32 i4_prev_QP; 2695*c83a76b0SSuyog Pawar 2696*c83a76b0SSuyog Pawar UWORD8 u1_max_inter_tr_depth; 2697*c83a76b0SSuyog Pawar 2698*c83a76b0SSuyog Pawar UWORD8 u1_max_intra_tr_depth; 2699*c83a76b0SSuyog Pawar 2700*c83a76b0SSuyog Pawar } ihevce_enc_loop_ctxt_t; 2701*c83a76b0SSuyog Pawar 2702*c83a76b0SSuyog Pawar /*****************************************************************************/ 2703*c83a76b0SSuyog Pawar /* Enums */ 2704*c83a76b0SSuyog Pawar /*****************************************************************************/ 2705*c83a76b0SSuyog Pawar 2706*c83a76b0SSuyog Pawar /** @brief RDOQ_LEVELS_T: This enumeration specifies the RDOQ mode of operation 2707*c83a76b0SSuyog Pawar * 2708*c83a76b0SSuyog Pawar * NO_RDOQ : RDOQ is not performed 2709*c83a76b0SSuyog Pawar * BEST_CAND_RDOQ : RDOQ for final candidate only 2710*c83a76b0SSuyog Pawar * ALL_CAND_RDOQ : RDOQ for all candidates 2711*c83a76b0SSuyog Pawar */ 2712*c83a76b0SSuyog Pawar typedef enum 2713*c83a76b0SSuyog Pawar { 2714*c83a76b0SSuyog Pawar NO_RDOQ, 2715*c83a76b0SSuyog Pawar BEST_CAND_RDOQ, 2716*c83a76b0SSuyog Pawar ALL_CAND_RDOQ, 2717*c83a76b0SSuyog Pawar } RDOQ_LEVELS_T; 2718*c83a76b0SSuyog Pawar 2719*c83a76b0SSuyog Pawar /** @brief QUANT_ROUNDING_COEFF_LEVELS_T: This enumeration specifies the Coef level RDOQ mode of operation 2720*c83a76b0SSuyog Pawar * 2721*c83a76b0SSuyog Pawar * FIXED_QUANT_ROUNDING : Fixed Quant rounding values are used 2722*c83a76b0SSuyog Pawar * NCTB_LEVEL_QUANT_ROUNDING : NCTB level Cmputed Quant rounding values are used 2723*c83a76b0SSuyog Pawar * CTB_LEVEL_QUANT_ROUNDING : CTB level Cmputed Quant rounding values are used 2724*c83a76b0SSuyog Pawar * CU_LEVEL_QUANT_ROUNDING : CU level Cmputed Quant rounding values are used 2725*c83a76b0SSuyog Pawar * TU_LEVEL_QUANT_ROUNDING : TU level Cmputed Quant rounding values are used 2726*c83a76b0SSuyog Pawar * Defaulat for all candidtes, based on RDOQ_LEVELS_T choose to best candidate 2727*c83a76b0SSuyog Pawar */ 2728*c83a76b0SSuyog Pawar typedef enum 2729*c83a76b0SSuyog Pawar { 2730*c83a76b0SSuyog Pawar FIXED_QUANT_ROUNDING, 2731*c83a76b0SSuyog Pawar NCTB_LEVEL_QUANT_ROUNDING, 2732*c83a76b0SSuyog Pawar CTB_LEVEL_QUANT_ROUNDING, 2733*c83a76b0SSuyog Pawar CU_LEVEL_QUANT_ROUNDING, 2734*c83a76b0SSuyog Pawar TU_LEVEL_QUANT_ROUNDING, 2735*c83a76b0SSuyog Pawar CHROMA_QUANT_ROUNDING 2736*c83a76b0SSuyog Pawar } QUANT_ROUNDING_COEFF_LEVELS_T; 2737*c83a76b0SSuyog Pawar 2738*c83a76b0SSuyog Pawar /*****************************************************************************/ 2739*c83a76b0SSuyog Pawar /* Enums */ 2740*c83a76b0SSuyog Pawar /*****************************************************************************/ 2741*c83a76b0SSuyog Pawar 2742*c83a76b0SSuyog Pawar /** @brief SBH_LEVELS_T: This enumeration specifies the RDOQ mode of operation 2743*c83a76b0SSuyog Pawar * 2744*c83a76b0SSuyog Pawar * NO_SBH : SBH is not performed 2745*c83a76b0SSuyog Pawar * BEST_CAND_SBH : SBH for final candidate only 2746*c83a76b0SSuyog Pawar * ALL_CAND_SBH : SBH for all candidates 2747*c83a76b0SSuyog Pawar */ 2748*c83a76b0SSuyog Pawar typedef enum 2749*c83a76b0SSuyog Pawar { 2750*c83a76b0SSuyog Pawar NO_SBH, 2751*c83a76b0SSuyog Pawar BEST_CAND_SBH, 2752*c83a76b0SSuyog Pawar ALL_CAND_SBH, 2753*c83a76b0SSuyog Pawar } SBH_LEVELS_T; 2754*c83a76b0SSuyog Pawar 2755*c83a76b0SSuyog Pawar /** @brief ZCBF_LEVELS_T: This enumeration specifies the ZeroCBF RDO mode of operation 2756*c83a76b0SSuyog Pawar * 2757*c83a76b0SSuyog Pawar * NO_ZCBF : ZCBF RDO is not performed 2758*c83a76b0SSuyog Pawar * ALL_CAND_ZCBF : ZCBF RDO for all candidates 2759*c83a76b0SSuyog Pawar */ 2760*c83a76b0SSuyog Pawar typedef enum 2761*c83a76b0SSuyog Pawar { 2762*c83a76b0SSuyog Pawar NO_ZCBF, 2763*c83a76b0SSuyog Pawar ZCBF_ENABLE, 2764*c83a76b0SSuyog Pawar } ZCBF_LEVELS_T; 2765*c83a76b0SSuyog Pawar 2766*c83a76b0SSuyog Pawar /** 2767*c83a76b0SSuyog Pawar ****************************************************************************** 2768*c83a76b0SSuyog Pawar * @brief Encode loop master context structure 2769*c83a76b0SSuyog Pawar ****************************************************************************** 2770*c83a76b0SSuyog Pawar */ 2771*c83a76b0SSuyog Pawar typedef struct 2772*c83a76b0SSuyog Pawar { 2773*c83a76b0SSuyog Pawar /** Array of encode loop structure */ 2774*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *aps_enc_loop_thrd_ctxt[MAX_NUM_FRM_PROC_THRDS_ENC]; 2775*c83a76b0SSuyog Pawar 2776*c83a76b0SSuyog Pawar /** Number of processing threads created run time */ 2777*c83a76b0SSuyog Pawar WORD32 i4_num_proc_thrds; 2778*c83a76b0SSuyog Pawar 2779*c83a76b0SSuyog Pawar /** 2780*c83a76b0SSuyog Pawar * Array of top row cu skip flags (1 bit per 8x8CU) 2781*c83a76b0SSuyog Pawar */ 2782*c83a76b0SSuyog Pawar UWORD8 au1_cu_skip_top_row[HEVCE_MAX_WIDTH >> 6]; 2783*c83a76b0SSuyog Pawar 2784*c83a76b0SSuyog Pawar /** Context models stored at the end of second CTB in a row) 2785*c83a76b0SSuyog Pawar * stored in packed form pState[bits6-1] | MPS[bit0] 2786*c83a76b0SSuyog Pawar * for each CTB row 2787*c83a76b0SSuyog Pawar * using entropy sync model in RD opt 2788*c83a76b0SSuyog Pawar */ 2789*c83a76b0SSuyog Pawar UWORD8 au1_ctxt_models[MAX_NUM_CTB_ROWS_FRM][IHEVC_CAB_CTXT_END]; 2790*c83a76b0SSuyog Pawar 2791*c83a76b0SSuyog Pawar /** Dependency manager for controlling EncLoop Top-Right CU dependency 2792*c83a76b0SSuyog Pawar * One per each bit-rate and one per each frame in parallel 2793*c83a76b0SSuyog Pawar */ 2794*c83a76b0SSuyog Pawar void *aapv_dep_mngr_enc_loop_cu_top_right[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES]; 2795*c83a76b0SSuyog Pawar 2796*c83a76b0SSuyog Pawar /** Dependency manager for controlling Deblocking Top dependency 2797*c83a76b0SSuyog Pawar * One per each bit-rate and one per each frame in parallel 2798*c83a76b0SSuyog Pawar */ 2799*c83a76b0SSuyog Pawar void *aapv_dep_mngr_enc_loop_dblk[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES]; 2800*c83a76b0SSuyog Pawar 2801*c83a76b0SSuyog Pawar /** Dependency manager for controlling Sao Top dependency 2802*c83a76b0SSuyog Pawar * One per each bit-rate and one per each frame in parallel 2803*c83a76b0SSuyog Pawar */ 2804*c83a76b0SSuyog Pawar void *aapv_dep_mngr_enc_loop_sao[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES]; 2805*c83a76b0SSuyog Pawar 2806*c83a76b0SSuyog Pawar /** number of bit-rate instances running */ 2807*c83a76b0SSuyog Pawar WORD32 i4_num_bitrates; 2808*c83a76b0SSuyog Pawar 2809*c83a76b0SSuyog Pawar /** number of enc frames running in parallel */ 2810*c83a76b0SSuyog Pawar WORD32 i4_num_enc_loop_frm_pllel; 2811*c83a76b0SSuyog Pawar 2812*c83a76b0SSuyog Pawar /* Pointer to Tile params base */ 2813*c83a76b0SSuyog Pawar void *pv_tile_params_base; 2814*c83a76b0SSuyog Pawar /* Offset to get the Qp for the last CU of upper CTB-row. 2815*c83a76b0SSuyog Pawar This offset is from the current tile top row QP map start. 2816*c83a76b0SSuyog Pawar 2817*c83a76b0SSuyog Pawar This will only be consumed by the first CU of current CTB-row 2818*c83a76b0SSuyog Pawar iff [it is skip && entropy sync is off] 2819*c83a76b0SSuyog Pawar There is one entry of every tile-column bcoz offset remains constant 2820*c83a76b0SSuyog Pawar for all tiles lying in a tile-column */ 2821*c83a76b0SSuyog Pawar WORD32 ai4_offset_for_last_cu_qp[MAX_TILE_COLUMNS]; 2822*c83a76b0SSuyog Pawar } ihevce_enc_loop_master_ctxt_t; 2823*c83a76b0SSuyog Pawar 2824*c83a76b0SSuyog Pawar /** 2825*c83a76b0SSuyog Pawar ****************************************************************************** 2826*c83a76b0SSuyog Pawar * @brief This struct is used for storing data required by the block merge 2827*c83a76b0SSuyog Pawar * function 2828*c83a76b0SSuyog Pawar ****************************************************************************** 2829*c83a76b0SSuyog Pawar */ 2830*c83a76b0SSuyog Pawar typedef struct 2831*c83a76b0SSuyog Pawar { 2832*c83a76b0SSuyog Pawar block_data_8x8_t *ps_8x8_data; 2833*c83a76b0SSuyog Pawar 2834*c83a76b0SSuyog Pawar block_data_16x16_t *ps_16x16_data; 2835*c83a76b0SSuyog Pawar 2836*c83a76b0SSuyog Pawar block_data_32x32_t *ps_32x32_data; 2837*c83a76b0SSuyog Pawar 2838*c83a76b0SSuyog Pawar block_data_64x64_t *ps_64x64_data; 2839*c83a76b0SSuyog Pawar 2840*c83a76b0SSuyog Pawar part_type_results_t **ps_32x32_results; 2841*c83a76b0SSuyog Pawar 2842*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree; 2843*c83a76b0SSuyog Pawar 2844*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb; 2845*c83a76b0SSuyog Pawar 2846*c83a76b0SSuyog Pawar mv_pred_ctxt_t *ps_mv_pred_ctxt; 2847*c83a76b0SSuyog Pawar 2848*c83a76b0SSuyog Pawar recon_pic_buf_t *(*aps_ref_list)[HEVCE_MAX_REF_PICS * 2]; 2849*c83a76b0SSuyog Pawar 2850*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_nbr_4x4; 2851*c83a76b0SSuyog Pawar 2852*c83a76b0SSuyog Pawar nbr_4x4_t *ps_left_nbr_4x4; 2853*c83a76b0SSuyog Pawar 2854*c83a76b0SSuyog Pawar nbr_4x4_t *ps_curr_nbr_4x4; 2855*c83a76b0SSuyog Pawar 2856*c83a76b0SSuyog Pawar UWORD8 *pu1_inp; 2857*c83a76b0SSuyog Pawar 2858*c83a76b0SSuyog Pawar UWORD8 *pu1_ctb_nbr_map; 2859*c83a76b0SSuyog Pawar 2860*c83a76b0SSuyog Pawar WORD32 i4_nbr_map_strd; 2861*c83a76b0SSuyog Pawar 2862*c83a76b0SSuyog Pawar WORD32 inp_stride; 2863*c83a76b0SSuyog Pawar 2864*c83a76b0SSuyog Pawar WORD32 i4_ctb_x_off; 2865*c83a76b0SSuyog Pawar 2866*c83a76b0SSuyog Pawar WORD32 i4_ctb_y_off; 2867*c83a76b0SSuyog Pawar 2868*c83a76b0SSuyog Pawar WORD32 use_satd_for_err_calc; 2869*c83a76b0SSuyog Pawar 2870*c83a76b0SSuyog Pawar WORD32 lambda; 2871*c83a76b0SSuyog Pawar 2872*c83a76b0SSuyog Pawar WORD32 lambda_q_shift; 2873*c83a76b0SSuyog Pawar 2874*c83a76b0SSuyog Pawar WORD32 frm_qstep; 2875*c83a76b0SSuyog Pawar 2876*c83a76b0SSuyog Pawar WORD32 num_4x4_in_ctb; 2877*c83a76b0SSuyog Pawar 2878*c83a76b0SSuyog Pawar UWORD8 *pu1_wkg_mem; 2879*c83a76b0SSuyog Pawar 2880*c83a76b0SSuyog Pawar UWORD8 **ppu1_pred; 2881*c83a76b0SSuyog Pawar 2882*c83a76b0SSuyog Pawar UWORD8 u1_bidir_enabled; 2883*c83a76b0SSuyog Pawar 2884*c83a76b0SSuyog Pawar UWORD8 u1_max_tr_depth; 2885*c83a76b0SSuyog Pawar 2886*c83a76b0SSuyog Pawar WORD32 i4_ctb_pos; 2887*c83a76b0SSuyog Pawar 2888*c83a76b0SSuyog Pawar WORD32 i4_ctb_size; 2889*c83a76b0SSuyog Pawar 2890*c83a76b0SSuyog Pawar UWORD8 *apu1_wt_inp[MAX_REFS_SEARCHABLE + 1]; 2891*c83a76b0SSuyog Pawar 2892*c83a76b0SSuyog Pawar /** Pointer of Dep Mngr for EncLoop Top-Right CU dependency */ 2893*c83a76b0SSuyog Pawar void *pv_dep_mngr_enc_loop_cu_top_right; 2894*c83a76b0SSuyog Pawar /** The current cu row no. for Dep Manager to Check */ 2895*c83a76b0SSuyog Pawar WORD32 i4_dep_mngr_cur_cu_row_no; 2896*c83a76b0SSuyog Pawar /** The Top cu row no. for Dep Manager to Check */ 2897*c83a76b0SSuyog Pawar WORD32 i4_dep_mngr_top_cu_row_no; 2898*c83a76b0SSuyog Pawar 2899*c83a76b0SSuyog Pawar WORD8 i1_quality_preset; 2900*c83a76b0SSuyog Pawar 2901*c83a76b0SSuyog Pawar /* Flag to control Top Right Sync for during Merge */ 2902*c83a76b0SSuyog Pawar UWORD8 u1_use_top_at_ctb_boundary; 2903*c83a76b0SSuyog Pawar 2904*c83a76b0SSuyog Pawar } block_merge_input_t; 2905*c83a76b0SSuyog Pawar 2906*c83a76b0SSuyog Pawar /* Structure which stores the info regarding the TU's present in the CU*/ 2907*c83a76b0SSuyog Pawar typedef struct tu_prms_t 2908*c83a76b0SSuyog Pawar { 2909*c83a76b0SSuyog Pawar UWORD8 u1_tu_size; 2910*c83a76b0SSuyog Pawar 2911*c83a76b0SSuyog Pawar UWORD8 u1_x_off; 2912*c83a76b0SSuyog Pawar 2913*c83a76b0SSuyog Pawar UWORD8 u1_y_off; 2914*c83a76b0SSuyog Pawar 2915*c83a76b0SSuyog Pawar WORD32 i4_tu_cost; 2916*c83a76b0SSuyog Pawar 2917*c83a76b0SSuyog Pawar WORD32 i4_early_cbf; 2918*c83a76b0SSuyog Pawar 2919*c83a76b0SSuyog Pawar } tu_prms_t; 2920*c83a76b0SSuyog Pawar 2921*c83a76b0SSuyog Pawar typedef struct 2922*c83a76b0SSuyog Pawar { 2923*c83a76b0SSuyog Pawar cu_enc_loop_out_t **pps_cu_final; 2924*c83a76b0SSuyog Pawar 2925*c83a76b0SSuyog Pawar pu_t **pps_row_pu; 2926*c83a76b0SSuyog Pawar 2927*c83a76b0SSuyog Pawar tu_enc_loop_out_t **pps_row_tu; 2928*c83a76b0SSuyog Pawar 2929*c83a76b0SSuyog Pawar UWORD8 **ppu1_row_ecd_data; 2930*c83a76b0SSuyog Pawar 2931*c83a76b0SSuyog Pawar WORD32 *pi4_num_pus_in_ctb; 2932*c83a76b0SSuyog Pawar 2933*c83a76b0SSuyog Pawar WORD32 *pi4_last_cu_pos_in_ctb; 2934*c83a76b0SSuyog Pawar 2935*c83a76b0SSuyog Pawar WORD32 *pi4_last_cu_size; 2936*c83a76b0SSuyog Pawar 2937*c83a76b0SSuyog Pawar UWORD8 *pu1_num_cus_in_ctb_out; 2938*c83a76b0SSuyog Pawar 2939*c83a76b0SSuyog Pawar } cu_final_update_prms; 2940*c83a76b0SSuyog Pawar 2941*c83a76b0SSuyog Pawar typedef struct 2942*c83a76b0SSuyog Pawar { 2943*c83a76b0SSuyog Pawar cu_nbr_prms_t *ps_cu_nbr_prms; 2944*c83a76b0SSuyog Pawar 2945*c83a76b0SSuyog Pawar cu_inter_cand_t *ps_best_inter_cand; 2946*c83a76b0SSuyog Pawar 2947*c83a76b0SSuyog Pawar enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms; 2948*c83a76b0SSuyog Pawar 2949*c83a76b0SSuyog Pawar WORD32 packed_pred_mode; 2950*c83a76b0SSuyog Pawar 2951*c83a76b0SSuyog Pawar WORD32 rd_opt_best_idx; 2952*c83a76b0SSuyog Pawar 2953*c83a76b0SSuyog Pawar void *pv_src; 2954*c83a76b0SSuyog Pawar 2955*c83a76b0SSuyog Pawar WORD32 src_strd; 2956*c83a76b0SSuyog Pawar 2957*c83a76b0SSuyog Pawar void *pv_pred; 2958*c83a76b0SSuyog Pawar 2959*c83a76b0SSuyog Pawar WORD32 pred_strd; 2960*c83a76b0SSuyog Pawar 2961*c83a76b0SSuyog Pawar void *pv_pred_chrm; 2962*c83a76b0SSuyog Pawar 2963*c83a76b0SSuyog Pawar WORD32 pred_chrm_strd; 2964*c83a76b0SSuyog Pawar 2965*c83a76b0SSuyog Pawar UWORD8 *pu1_final_ecd_data; 2966*c83a76b0SSuyog Pawar 2967*c83a76b0SSuyog Pawar UWORD8 *pu1_csbf_buf; 2968*c83a76b0SSuyog Pawar 2969*c83a76b0SSuyog Pawar WORD32 csbf_strd; 2970*c83a76b0SSuyog Pawar 2971*c83a76b0SSuyog Pawar void *pv_luma_recon; 2972*c83a76b0SSuyog Pawar 2973*c83a76b0SSuyog Pawar WORD32 recon_luma_strd; 2974*c83a76b0SSuyog Pawar 2975*c83a76b0SSuyog Pawar void *pv_chrm_recon; 2976*c83a76b0SSuyog Pawar 2977*c83a76b0SSuyog Pawar WORD32 recon_chrma_strd; 2978*c83a76b0SSuyog Pawar 2979*c83a76b0SSuyog Pawar UWORD8 u1_cu_pos_x; 2980*c83a76b0SSuyog Pawar 2981*c83a76b0SSuyog Pawar UWORD8 u1_cu_pos_y; 2982*c83a76b0SSuyog Pawar 2983*c83a76b0SSuyog Pawar UWORD8 u1_cu_size; 2984*c83a76b0SSuyog Pawar 2985*c83a76b0SSuyog Pawar WORD8 i1_cu_qp; 2986*c83a76b0SSuyog Pawar 2987*c83a76b0SSuyog Pawar UWORD8 u1_will_cabac_state_change; 2988*c83a76b0SSuyog Pawar 2989*c83a76b0SSuyog Pawar UWORD8 u1_recompute_sbh_and_rdoq; 2990*c83a76b0SSuyog Pawar 2991*c83a76b0SSuyog Pawar UWORD8 u1_is_first_pass; 2992*c83a76b0SSuyog Pawar 2993*c83a76b0SSuyog Pawar #if USE_NOISE_TERM_IN_ZERO_CODING_DECISION_ALGORITHMS 2994*c83a76b0SSuyog Pawar UWORD8 u1_is_cu_noisy; 2995*c83a76b0SSuyog Pawar #endif 2996*c83a76b0SSuyog Pawar 2997*c83a76b0SSuyog Pawar } final_mode_process_prms_t; 2998*c83a76b0SSuyog Pawar 2999*c83a76b0SSuyog Pawar typedef struct 3000*c83a76b0SSuyog Pawar { 3001*c83a76b0SSuyog Pawar cu_inter_cand_t s_best_cand; 3002*c83a76b0SSuyog Pawar 3003*c83a76b0SSuyog Pawar /* The size is twice of what is required to ensure availability */ 3004*c83a76b0SSuyog Pawar /* of adequate space for 'HBD' case */ 3005*c83a76b0SSuyog Pawar UWORD8 au1_pred_luma[MAX_CU_SIZE * MAX_CU_SIZE * 2]; 3006*c83a76b0SSuyog Pawar 3007*c83a76b0SSuyog Pawar /* The size is twice of what is required to ensure availability */ 3008*c83a76b0SSuyog Pawar /* of adequate space for 422 case */ 3009*c83a76b0SSuyog Pawar UWORD8 au1_pred_chroma[MAX_CU_SIZE * MAX_CU_SIZE * 2]; 3010*c83a76b0SSuyog Pawar } final_mode_state_t; 3011*c83a76b0SSuyog Pawar 3012*c83a76b0SSuyog Pawar typedef struct 3013*c83a76b0SSuyog Pawar { 3014*c83a76b0SSuyog Pawar cu_mixed_mode_inter_t *ps_mixed_modes_datastore; 3015*c83a76b0SSuyog Pawar 3016*c83a76b0SSuyog Pawar cu_inter_cand_t *ps_me_cands; 3017*c83a76b0SSuyog Pawar 3018*c83a76b0SSuyog Pawar cu_inter_cand_t *ps_merge_cands; 3019*c83a76b0SSuyog Pawar 3020*c83a76b0SSuyog Pawar mv_pred_ctxt_t *ps_mv_pred_ctxt; 3021*c83a76b0SSuyog Pawar 3022*c83a76b0SSuyog Pawar inter_pred_ctxt_t *ps_mc_ctxt; 3023*c83a76b0SSuyog Pawar 3024*c83a76b0SSuyog Pawar UWORD8 *pu1_ctb_nbr_map; 3025*c83a76b0SSuyog Pawar 3026*c83a76b0SSuyog Pawar void *pv_src; 3027*c83a76b0SSuyog Pawar 3028*c83a76b0SSuyog Pawar nbr_4x4_t *ps_cu_nbr_buf; 3029*c83a76b0SSuyog Pawar 3030*c83a76b0SSuyog Pawar nbr_4x4_t *ps_left_nbr_4x4; 3031*c83a76b0SSuyog Pawar 3032*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_nbr_4x4; 3033*c83a76b0SSuyog Pawar 3034*c83a76b0SSuyog Pawar nbr_4x4_t *ps_topleft_nbr_4x4; 3035*c83a76b0SSuyog Pawar 3036*c83a76b0SSuyog Pawar WORD32 i4_ctb_nbr_map_stride; 3037*c83a76b0SSuyog Pawar 3038*c83a76b0SSuyog Pawar WORD32 i4_src_strd; 3039*c83a76b0SSuyog Pawar 3040*c83a76b0SSuyog Pawar WORD32 i4_nbr_4x4_left_strd; 3041*c83a76b0SSuyog Pawar 3042*c83a76b0SSuyog Pawar UWORD8 u1_cu_size; 3043*c83a76b0SSuyog Pawar 3044*c83a76b0SSuyog Pawar UWORD8 u1_cu_pos_x; 3045*c83a76b0SSuyog Pawar 3046*c83a76b0SSuyog Pawar UWORD8 u1_cu_pos_y; 3047*c83a76b0SSuyog Pawar 3048*c83a76b0SSuyog Pawar UWORD8 u1_num_me_cands; 3049*c83a76b0SSuyog Pawar 3050*c83a76b0SSuyog Pawar UWORD8 u1_num_merge_cands; 3051*c83a76b0SSuyog Pawar 3052*c83a76b0SSuyog Pawar UWORD8 u1_max_num_mixed_mode_cands_to_select; 3053*c83a76b0SSuyog Pawar 3054*c83a76b0SSuyog Pawar UWORD8 u1_max_merge_candidates; 3055*c83a76b0SSuyog Pawar 3056*c83a76b0SSuyog Pawar UWORD8 u1_use_satd_for_merge_eval; 3057*c83a76b0SSuyog Pawar 3058*c83a76b0SSuyog Pawar } ihevce_mixed_inter_modes_selector_prms_t; 3059*c83a76b0SSuyog Pawar 3060*c83a76b0SSuyog Pawar typedef struct 3061*c83a76b0SSuyog Pawar { 3062*c83a76b0SSuyog Pawar LWORD64 i8_ssd; 3063*c83a76b0SSuyog Pawar 3064*c83a76b0SSuyog Pawar LWORD64 i8_cost; 3065*c83a76b0SSuyog Pawar 3066*c83a76b0SSuyog Pawar #if ENABLE_INTER_ZCU_COST 3067*c83a76b0SSuyog Pawar LWORD64 i8_not_coded_cost; 3068*c83a76b0SSuyog Pawar #endif 3069*c83a76b0SSuyog Pawar 3070*c83a76b0SSuyog Pawar UWORD32 u4_sad; 3071*c83a76b0SSuyog Pawar 3072*c83a76b0SSuyog Pawar WORD32 i4_bits; 3073*c83a76b0SSuyog Pawar 3074*c83a76b0SSuyog Pawar WORD32 i4_num_bytes_used_for_ecd; 3075*c83a76b0SSuyog Pawar 3076*c83a76b0SSuyog Pawar WORD32 i4_zero_col; 3077*c83a76b0SSuyog Pawar 3078*c83a76b0SSuyog Pawar WORD32 i4_zero_row; 3079*c83a76b0SSuyog Pawar 3080*c83a76b0SSuyog Pawar UWORD8 u1_cbf; 3081*c83a76b0SSuyog Pawar 3082*c83a76b0SSuyog Pawar UWORD8 u1_reconBufId; 3083*c83a76b0SSuyog Pawar 3084*c83a76b0SSuyog Pawar UWORD8 u1_is_valid_node; 3085*c83a76b0SSuyog Pawar 3086*c83a76b0SSuyog Pawar UWORD8 u1_size; 3087*c83a76b0SSuyog Pawar 3088*c83a76b0SSuyog Pawar UWORD8 u1_posx; 3089*c83a76b0SSuyog Pawar 3090*c83a76b0SSuyog Pawar UWORD8 u1_posy; 3091*c83a76b0SSuyog Pawar } tu_node_data_t; 3092*c83a76b0SSuyog Pawar 3093*c83a76b0SSuyog Pawar typedef struct tu_tree_node_t 3094*c83a76b0SSuyog Pawar { 3095*c83a76b0SSuyog Pawar struct tu_tree_node_t *ps_child_node_tl; 3096*c83a76b0SSuyog Pawar 3097*c83a76b0SSuyog Pawar struct tu_tree_node_t *ps_child_node_tr; 3098*c83a76b0SSuyog Pawar 3099*c83a76b0SSuyog Pawar struct tu_tree_node_t *ps_child_node_bl; 3100*c83a76b0SSuyog Pawar 3101*c83a76b0SSuyog Pawar struct tu_tree_node_t *ps_child_node_br; 3102*c83a76b0SSuyog Pawar 3103*c83a76b0SSuyog Pawar tu_node_data_t s_luma_data; 3104*c83a76b0SSuyog Pawar 3105*c83a76b0SSuyog Pawar /* 2 because of the 2 subTU's when input is 422 */ 3106*c83a76b0SSuyog Pawar tu_node_data_t as_cb_data[2]; 3107*c83a76b0SSuyog Pawar 3108*c83a76b0SSuyog Pawar tu_node_data_t as_cr_data[2]; 3109*c83a76b0SSuyog Pawar 3110*c83a76b0SSuyog Pawar UWORD8 u1_is_valid_node; 3111*c83a76b0SSuyog Pawar 3112*c83a76b0SSuyog Pawar } tu_tree_node_t; 3113*c83a76b0SSuyog Pawar 3114*c83a76b0SSuyog Pawar /*****************************************************************************/ 3115*c83a76b0SSuyog Pawar /* Extern Variable Declarations */ 3116*c83a76b0SSuyog Pawar /*****************************************************************************/ 3117*c83a76b0SSuyog Pawar 3118*c83a76b0SSuyog Pawar /*****************************************************************************/ 3119*c83a76b0SSuyog Pawar /* Extern Function Declarations */ 3120*c83a76b0SSuyog Pawar /*****************************************************************************/ 3121*c83a76b0SSuyog Pawar 3122*c83a76b0SSuyog Pawar /*****************************************************************************/ 3123*c83a76b0SSuyog Pawar /* Typedefs */ 3124*c83a76b0SSuyog Pawar /*****************************************************************************/ 3125*c83a76b0SSuyog Pawar typedef LWORD64 (*pf_cu_mode_decide)( 3126*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, 3127*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms, 3128*c83a76b0SSuyog Pawar cu_analyse_t *ps_cu_analyse, 3129*c83a76b0SSuyog Pawar final_mode_state_t *ps_final_mode_state, 3130*c83a76b0SSuyog Pawar UWORD8 *pu1_ecd_data, 3131*c83a76b0SSuyog Pawar pu_col_mv_t *ps_col_pu, 3132*c83a76b0SSuyog Pawar UWORD8 *pu1_col_pu_map, 3133*c83a76b0SSuyog Pawar WORD32 col_start_pu_idx); 3134*c83a76b0SSuyog Pawar 3135*c83a76b0SSuyog Pawar typedef LWORD64 (*pf_inter_rdopt_cu_mc_mvp)( 3136*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, 3137*c83a76b0SSuyog Pawar cu_inter_cand_t *ps_inter_cand, 3138*c83a76b0SSuyog Pawar WORD32 cu_size, 3139*c83a76b0SSuyog Pawar WORD32 cu_pos_x, 3140*c83a76b0SSuyog Pawar WORD32 cu_pos_y, 3141*c83a76b0SSuyog Pawar nbr_4x4_t *ps_left_nbr_4x4, 3142*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_nbr_4x4, 3143*c83a76b0SSuyog Pawar nbr_4x4_t *ps_topleft_nbr_4x4, 3144*c83a76b0SSuyog Pawar WORD32 nbr_4x4_left_strd, 3145*c83a76b0SSuyog Pawar WORD32 curr_buf_idx); 3146*c83a76b0SSuyog Pawar 3147*c83a76b0SSuyog Pawar typedef LWORD64 (*pf_inter_rdopt_cu_ntu)( 3148*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, 3149*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms, 3150*c83a76b0SSuyog Pawar void *pv_src, 3151*c83a76b0SSuyog Pawar WORD32 cu_size, 3152*c83a76b0SSuyog Pawar WORD32 cu_pos_x, 3153*c83a76b0SSuyog Pawar WORD32 cu_pos_y, 3154*c83a76b0SSuyog Pawar WORD32 curr_buf_idx, 3155*c83a76b0SSuyog Pawar enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms, 3156*c83a76b0SSuyog Pawar cu_inter_cand_t *ps_inter_cand, 3157*c83a76b0SSuyog Pawar cu_analyse_t *ps_cu_analyse, 3158*c83a76b0SSuyog Pawar WORD32 i4_alpha_stim_multiplier); 3159*c83a76b0SSuyog Pawar 3160*c83a76b0SSuyog Pawar typedef void (*pf_intra_chroma_pred_mode_selector)( 3161*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, 3162*c83a76b0SSuyog Pawar enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms, 3163*c83a76b0SSuyog Pawar cu_analyse_t *ps_cu_analyse, 3164*c83a76b0SSuyog Pawar WORD32 rd_opt_curr_idx, 3165*c83a76b0SSuyog Pawar WORD32 tu_mode, 3166*c83a76b0SSuyog Pawar WORD32 i4_alpha_stim_multiplier, 3167*c83a76b0SSuyog Pawar UWORD8 u1_is_cu_noisy); 3168*c83a76b0SSuyog Pawar 3169*c83a76b0SSuyog Pawar typedef LWORD64 (*pf_intra_rdopt_cu_ntu)( 3170*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, 3171*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms, 3172*c83a76b0SSuyog Pawar void *pv_pred_org, 3173*c83a76b0SSuyog Pawar WORD32 pred_strd_org, 3174*c83a76b0SSuyog Pawar enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms, 3175*c83a76b0SSuyog Pawar UWORD8 *pu1_luma_mode, 3176*c83a76b0SSuyog Pawar cu_analyse_t *ps_cu_analyse, 3177*c83a76b0SSuyog Pawar void *pv_curr_src, 3178*c83a76b0SSuyog Pawar void *pv_cu_left, 3179*c83a76b0SSuyog Pawar void *pv_cu_top, 3180*c83a76b0SSuyog Pawar void *pv_cu_top_left, 3181*c83a76b0SSuyog Pawar nbr_4x4_t *ps_left_nbr_4x4, 3182*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_nbr_4x4, 3183*c83a76b0SSuyog Pawar WORD32 nbr_4x4_left_strd, 3184*c83a76b0SSuyog Pawar WORD32 cu_left_stride, 3185*c83a76b0SSuyog Pawar WORD32 curr_buf_idx, 3186*c83a76b0SSuyog Pawar WORD32 func_proc_mode, 3187*c83a76b0SSuyog Pawar WORD32 i4_alpha_stim_multiplier); 3188*c83a76b0SSuyog Pawar 3189*c83a76b0SSuyog Pawar typedef void (*pf_final_rdopt_mode_prcs)( 3190*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, final_mode_process_prms_t *ps_prms); 3191*c83a76b0SSuyog Pawar 3192*c83a76b0SSuyog Pawar typedef void (*pf_store_cu_results)( 3193*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, 3194*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms, 3195*c83a76b0SSuyog Pawar final_mode_state_t *ps_final_state); 3196*c83a76b0SSuyog Pawar 3197*c83a76b0SSuyog Pawar typedef void (*pf_enc_loop_cu_bot_copy)( 3198*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, 3199*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms, 3200*c83a76b0SSuyog Pawar ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt, 3201*c83a76b0SSuyog Pawar WORD32 curr_cu_pos_in_row, 3202*c83a76b0SSuyog Pawar WORD32 curr_cu_pos_in_ctb); 3203*c83a76b0SSuyog Pawar 3204*c83a76b0SSuyog Pawar typedef void (*pf_enc_loop_ctb_left_copy)( 3205*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, enc_loop_cu_prms_t *ps_cu_prms); 3206*c83a76b0SSuyog Pawar 3207*c83a76b0SSuyog Pawar #endif /* _IHEVCE_ENC_LOOP_STRUCTS_H_ */ 3208