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_ipe_structs.h 23*c83a76b0SSuyog Pawar * 24*c83a76b0SSuyog Pawar * \brief 25*c83a76b0SSuyog Pawar * This file contains strcutures of ipe 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_IPE_STRUCTS_H_ 37*c83a76b0SSuyog Pawar #define _IHEVCE_IPE_STRUCTS_H_ 38*c83a76b0SSuyog Pawar 39*c83a76b0SSuyog Pawar /*****************************************************************************/ 40*c83a76b0SSuyog Pawar /* Constant Macros */ 41*c83a76b0SSuyog Pawar /*****************************************************************************/ 42*c83a76b0SSuyog Pawar #define MAX_FAST_IP_MODES 23 43*c83a76b0SSuyog Pawar #define NUM_INTRA_RDOPT_MODES 1 44*c83a76b0SSuyog Pawar #if 1 // FAST_PART_WITH_OPTION_4 45*c83a76b0SSuyog Pawar #define MAX_TREE_NODES \ 46*c83a76b0SSuyog Pawar ((MAX_CTB_SIZE == MIN_TU_SIZE) \ 47*c83a76b0SSuyog Pawar ? 1 \ 48*c83a76b0SSuyog Pawar : (MAX_CTB_SIZE == (MIN_TU_SIZE << 1) \ 49*c83a76b0SSuyog Pawar ? 5 \ 50*c83a76b0SSuyog Pawar : (MAX_CTB_SIZE == (MIN_TU_SIZE << 2) \ 51*c83a76b0SSuyog Pawar ? 21 \ 52*c83a76b0SSuyog Pawar : (MAX_CTB_SIZE == (MIN_TU_SIZE << 3) ? 37 : 53)))) 53*c83a76b0SSuyog Pawar #else // FAST_PART_WITH_OPTION_4 54*c83a76b0SSuyog Pawar #define MAX_TREE_NODES \ 55*c83a76b0SSuyog Pawar ((MAX_CTB_SIZE == MIN_TU_SIZE) \ 56*c83a76b0SSuyog Pawar ? 1 \ 57*c83a76b0SSuyog Pawar : (MAX_CTB_SIZE == (MIN_TU_SIZE << 1) \ 58*c83a76b0SSuyog Pawar ? 5 \ 59*c83a76b0SSuyog Pawar : (MAX_CTB_SIZE == (MIN_TU_SIZE << 2) \ 60*c83a76b0SSuyog Pawar ? 9 \ 61*c83a76b0SSuyog Pawar : (MAX_CTB_SIZE == (MIN_TU_SIZE << 3) ? 13 : 17)))) 62*c83a76b0SSuyog Pawar #endif // FAST_PART_WITH_OPTION_4 63*c83a76b0SSuyog Pawar #define BOTTOM_LEFT_FLAG 0x0000000F 64*c83a76b0SSuyog Pawar #define LEFT_FLAG 0x000000F0 65*c83a76b0SSuyog Pawar #define TOP_LEFT_FLAG 0x00010000 66*c83a76b0SSuyog Pawar #define TOP_FLAG 0x00000F00 67*c83a76b0SSuyog Pawar #define TOP_RIGHT_FLAG 0x0000F000 68*c83a76b0SSuyog Pawar #define MAX_UWORD8 0xFF 69*c83a76b0SSuyog Pawar #define MAX_DOUBLE 1.7e+308 ///< max. value of double-type value 70*c83a76b0SSuyog Pawar #define MAX_INTRA_COST_IPE 0x0F7F7F7F 71*c83a76b0SSuyog Pawar 72*c83a76b0SSuyog Pawar #define MAX_TU_ROW_IN_CTB (MAX_CTB_SIZE >> 2) 73*c83a76b0SSuyog Pawar #define MAX_TU_COL_IN_CTB (MAX_CTB_SIZE >> 2) 74*c83a76b0SSuyog Pawar 75*c83a76b0SSuyog Pawar #define BIT_DEPTH 8 76*c83a76b0SSuyog Pawar 77*c83a76b0SSuyog Pawar #define FAST_PARTITION_WITH_TRANSFORM 1 78*c83a76b0SSuyog Pawar 79*c83a76b0SSuyog Pawar #define IHEVCE_INTRA_REF_FILTERING C 80*c83a76b0SSuyog Pawar #define IHEVCE_INTRA_LUMA_REF_SUBSTITUTION C 81*c83a76b0SSuyog Pawar /*****************************************************************************/ 82*c83a76b0SSuyog Pawar /* Constant Macros */ 83*c83a76b0SSuyog Pawar /*****************************************************************************/ 84*c83a76b0SSuyog Pawar /** /breif 4x4 DST, 4x4, 8x8, 16x16, 32x32 */ 85*c83a76b0SSuyog Pawar #define NUM_TRANS_TYPES 5 86*c83a76b0SSuyog Pawar #define INTRA_PLANAR 0 87*c83a76b0SSuyog Pawar #define INTRA_DC 1 88*c83a76b0SSuyog Pawar 89*c83a76b0SSuyog Pawar /*****************************************************************************/ 90*c83a76b0SSuyog Pawar /* Function Macros */ 91*c83a76b0SSuyog Pawar /*****************************************************************************/ 92*c83a76b0SSuyog Pawar #define INTRA_ANGULAR(x) (x) 93*c83a76b0SSuyog Pawar 94*c83a76b0SSuyog Pawar /** @breif max 30bit value */ 95*c83a76b0SSuyog Pawar #define MAX30 ((1 << 30) - 1) 96*c83a76b0SSuyog Pawar 97*c83a76b0SSuyog Pawar /* @bried macro to clip a data to max of 30bits (assuming unsgined) */ 98*c83a76b0SSuyog Pawar #define CLIP30(x) ((x) > MAX30 ? MAX30 : (x)) 99*c83a76b0SSuyog Pawar 100*c83a76b0SSuyog Pawar /* @bried compute the (lambda * rate) with a qshift and clip result to 30bits */ 101*c83a76b0SSuyog Pawar #define COMPUTE_RATE_COST_CLIP30(r, l, qshift) ((WORD32)CLIP30((ULWORD64)((r) * (l)) >> (qshift))) 102*c83a76b0SSuyog Pawar 103*c83a76b0SSuyog Pawar /*****************************************************************************/ 104*c83a76b0SSuyog Pawar /* Typedefs */ 105*c83a76b0SSuyog Pawar /*****************************************************************************/ 106*c83a76b0SSuyog Pawar typedef UWORD32 (*pf_res_trans_luma_had)( 107*c83a76b0SSuyog Pawar UWORD8 *pu1_origin, 108*c83a76b0SSuyog Pawar WORD32 src_strd, 109*c83a76b0SSuyog Pawar UWORD8 *pu1_pred_buf, 110*c83a76b0SSuyog Pawar WORD32 pred_strd, 111*c83a76b0SSuyog Pawar WORD16 *pi2_dst, 112*c83a76b0SSuyog Pawar WORD32 dst_strd, 113*c83a76b0SSuyog Pawar WORD32 size); 114*c83a76b0SSuyog Pawar 115*c83a76b0SSuyog Pawar typedef void (*pf_ipe_intra_pred)( 116*c83a76b0SSuyog Pawar UWORD8 *pu1_ref, WORD32 src_strd, UWORD8 *pu1_dst, WORD32 dst_strd, WORD32 nt, WORD32 mode); 117*c83a76b0SSuyog Pawar 118*c83a76b0SSuyog Pawar typedef UWORD32 (*pf_ipe_res_trans)( 119*c83a76b0SSuyog Pawar UWORD8 *pu1_src, 120*c83a76b0SSuyog Pawar UWORD8 *pu1_pred, 121*c83a76b0SSuyog Pawar WORD16 *pi2_tmp, 122*c83a76b0SSuyog Pawar WORD16 *pi2_dst, 123*c83a76b0SSuyog Pawar WORD32 src_strd, 124*c83a76b0SSuyog Pawar WORD32 pred_strd, 125*c83a76b0SSuyog Pawar WORD32 dst_strd, 126*c83a76b0SSuyog Pawar WORD32 chroma_flag); 127*c83a76b0SSuyog Pawar 128*c83a76b0SSuyog Pawar typedef FT_CALC_HAD_SATD_8BIT *pf_ipe_res_trans_had; 129*c83a76b0SSuyog Pawar /*****************************************************************************/ 130*c83a76b0SSuyog Pawar /* Enums */ 131*c83a76b0SSuyog Pawar /*****************************************************************************/ 132*c83a76b0SSuyog Pawar 133*c83a76b0SSuyog Pawar typedef enum 134*c83a76b0SSuyog Pawar { 135*c83a76b0SSuyog Pawar 136*c83a76b0SSuyog Pawar IPE_CTXT = 0, 137*c83a76b0SSuyog Pawar IPE_THRDS_CTXT, 138*c83a76b0SSuyog Pawar 139*c83a76b0SSuyog Pawar /* should be last entry */ 140*c83a76b0SSuyog Pawar NUM_IPE_MEM_RECS 141*c83a76b0SSuyog Pawar 142*c83a76b0SSuyog Pawar } IPE_MEM_TABS_T; 143*c83a76b0SSuyog Pawar 144*c83a76b0SSuyog Pawar typedef enum 145*c83a76b0SSuyog Pawar { 146*c83a76b0SSuyog Pawar IPE_FUNC_MODE_0 = 0, 147*c83a76b0SSuyog Pawar IPE_FUNC_MODE_1, 148*c83a76b0SSuyog Pawar IPE_FUNC_MODE_2, 149*c83a76b0SSuyog Pawar IPE_FUNC_MODE_3TO9, 150*c83a76b0SSuyog Pawar IPE_FUNC_MODE_10, 151*c83a76b0SSuyog Pawar IPE_FUNC_MODE_11TO17, 152*c83a76b0SSuyog Pawar IPE_FUNC_MODE_18_34, 153*c83a76b0SSuyog Pawar IPE_FUNC_MODE_19TO25, 154*c83a76b0SSuyog Pawar IPE_FUNC_MODE_26, 155*c83a76b0SSuyog Pawar IPE_FUNC_MODE_27TO33, 156*c83a76b0SSuyog Pawar 157*c83a76b0SSuyog Pawar NUM_IPE_FUNCS 158*c83a76b0SSuyog Pawar 159*c83a76b0SSuyog Pawar } IPE_FUNCS_T; 160*c83a76b0SSuyog Pawar 161*c83a76b0SSuyog Pawar /*****************************************************************************/ 162*c83a76b0SSuyog Pawar /* Structure */ 163*c83a76b0SSuyog Pawar /*****************************************************************************/ 164*c83a76b0SSuyog Pawar /** 165*c83a76b0SSuyog Pawar ****************************************************************************** 166*c83a76b0SSuyog Pawar * @brief IPE CTB to CU and TU Quadtree Recursive Structure 167*c83a76b0SSuyog Pawar ****************************************************************************** 168*c83a76b0SSuyog Pawar */ 169*c83a76b0SSuyog Pawar 170*c83a76b0SSuyog Pawar typedef struct ihevce_ipe_cu_tree_t ihevce_ipe_cu_tree_t; 171*c83a76b0SSuyog Pawar 172*c83a76b0SSuyog Pawar typedef struct ihevce_ipe_cu_tree_t 173*c83a76b0SSuyog Pawar { 174*c83a76b0SSuyog Pawar /** 175*c83a76b0SSuyog Pawar * Origin of current coding unit relative to top-left of CTB 176*c83a76b0SSuyog Pawar */ 177*c83a76b0SSuyog Pawar UWORD16 u2_x0; 178*c83a76b0SSuyog Pawar 179*c83a76b0SSuyog Pawar UWORD16 u2_y0; 180*c83a76b0SSuyog Pawar 181*c83a76b0SSuyog Pawar /** 182*c83a76b0SSuyog Pawar * Origin of current coding unit relative to top-left of Picture 183*c83a76b0SSuyog Pawar */ 184*c83a76b0SSuyog Pawar UWORD16 u2_orig_x; 185*c83a76b0SSuyog Pawar 186*c83a76b0SSuyog Pawar UWORD16 u2_orig_y; 187*c83a76b0SSuyog Pawar 188*c83a76b0SSuyog Pawar /** 189*c83a76b0SSuyog Pawar * Size of current coding unit in luma pixels 190*c83a76b0SSuyog Pawar */ 191*c83a76b0SSuyog Pawar UWORD8 u1_cu_size; 192*c83a76b0SSuyog Pawar 193*c83a76b0SSuyog Pawar UWORD8 u1_width; 194*c83a76b0SSuyog Pawar 195*c83a76b0SSuyog Pawar UWORD8 u1_height; 196*c83a76b0SSuyog Pawar 197*c83a76b0SSuyog Pawar UWORD8 u1_depth; 198*c83a76b0SSuyog Pawar 199*c83a76b0SSuyog Pawar UWORD8 u1_part_flag_pos; 200*c83a76b0SSuyog Pawar 201*c83a76b0SSuyog Pawar UWORD8 u1_log2_nt; 202*c83a76b0SSuyog Pawar 203*c83a76b0SSuyog Pawar WORD32 i4_nbr_flag; 204*c83a76b0SSuyog Pawar 205*c83a76b0SSuyog Pawar /** 206*c83a76b0SSuyog Pawar * Recursive Bracketing Parameters 207*c83a76b0SSuyog Pawar */ 208*c83a76b0SSuyog Pawar UWORD8 best_mode; 209*c83a76b0SSuyog Pawar 210*c83a76b0SSuyog Pawar WORD32 best_satd; 211*c83a76b0SSuyog Pawar 212*c83a76b0SSuyog Pawar WORD32 best_cost; 213*c83a76b0SSuyog Pawar 214*c83a76b0SSuyog Pawar /** 215*c83a76b0SSuyog Pawar * Number of pixels available in these neighbors 216*c83a76b0SSuyog Pawar */ 217*c83a76b0SSuyog Pawar UWORD8 u1_num_left_avail; 218*c83a76b0SSuyog Pawar 219*c83a76b0SSuyog Pawar UWORD8 u1_num_top_avail; 220*c83a76b0SSuyog Pawar 221*c83a76b0SSuyog Pawar UWORD8 u1_num_top_right_avail; 222*c83a76b0SSuyog Pawar 223*c83a76b0SSuyog Pawar UWORD8 u1_num_bottom_left_avail; 224*c83a76b0SSuyog Pawar 225*c83a76b0SSuyog Pawar UWORD8 au1_best_mode_1tu[NUM_BEST_MODES]; 226*c83a76b0SSuyog Pawar 227*c83a76b0SSuyog Pawar WORD32 au4_best_cost_1tu[NUM_BEST_MODES]; 228*c83a76b0SSuyog Pawar 229*c83a76b0SSuyog Pawar UWORD8 au1_best_mode_4tu[NUM_BEST_MODES]; 230*c83a76b0SSuyog Pawar 231*c83a76b0SSuyog Pawar WORD32 au4_best_cost_4tu[NUM_BEST_MODES]; 232*c83a76b0SSuyog Pawar 233*c83a76b0SSuyog Pawar ihevce_ipe_cu_tree_t *ps_parent; 234*c83a76b0SSuyog Pawar 235*c83a76b0SSuyog Pawar ihevce_ipe_cu_tree_t *ps_sub_cu[4]; 236*c83a76b0SSuyog Pawar 237*c83a76b0SSuyog Pawar /* best mode bits cost */ 238*c83a76b0SSuyog Pawar UWORD16 u2_mode_bits_cost; 239*c83a76b0SSuyog Pawar 240*c83a76b0SSuyog Pawar } ihevce_ipe_cu_tree_node_t; 241*c83a76b0SSuyog Pawar 242*c83a76b0SSuyog Pawar /** 243*c83a76b0SSuyog Pawar ****************************************************************************** 244*c83a76b0SSuyog Pawar * @brief IPE module context memory 245*c83a76b0SSuyog Pawar ****************************************************************************** 246*c83a76b0SSuyog Pawar */ 247*c83a76b0SSuyog Pawar typedef struct 248*c83a76b0SSuyog Pawar { 249*c83a76b0SSuyog Pawar ihevce_ipe_cu_tree_t *ps_ipe_cu_tree; 250*c83a76b0SSuyog Pawar 251*c83a76b0SSuyog Pawar /* one parent and four children */ 252*c83a76b0SSuyog Pawar ihevce_ipe_cu_tree_t as_ipe_cu_tree[5]; 253*c83a76b0SSuyog Pawar 254*c83a76b0SSuyog Pawar UWORD8 au1_ctb_mode_map[MAX_TU_ROW_IN_CTB + 1][MAX_TU_COL_IN_CTB + 1]; 255*c83a76b0SSuyog Pawar 256*c83a76b0SSuyog Pawar UWORD8 au1_cand_mode_list[3]; 257*c83a76b0SSuyog Pawar 258*c83a76b0SSuyog Pawar /** Pointer to structure containing function pointers of common*/ 259*c83a76b0SSuyog Pawar func_selector_t *ps_func_selector; 260*c83a76b0SSuyog Pawar 261*c83a76b0SSuyog Pawar /** 262*c83a76b0SSuyog Pawar * CU level Qp / 6 263*c83a76b0SSuyog Pawar */ 264*c83a76b0SSuyog Pawar WORD32 i4_cu_qp_div6; 265*c83a76b0SSuyog Pawar 266*c83a76b0SSuyog Pawar /** 267*c83a76b0SSuyog Pawar * CU level Qp % 6 268*c83a76b0SSuyog Pawar */ 269*c83a76b0SSuyog Pawar WORD32 i4_cu_qp_mod6; 270*c83a76b0SSuyog Pawar 271*c83a76b0SSuyog Pawar /** array of luma intra prediction function pointers */ 272*c83a76b0SSuyog Pawar pf_ipe_intra_pred apf_ipe_lum_ip[NUM_IPE_FUNCS]; 273*c83a76b0SSuyog Pawar 274*c83a76b0SSuyog Pawar /** array of function pointers for residual and 275*c83a76b0SSuyog Pawar * forward transform for all transform sizes 276*c83a76b0SSuyog Pawar */ 277*c83a76b0SSuyog Pawar pf_res_trans_luma apf_resd_trns[NUM_TRANS_TYPES]; 278*c83a76b0SSuyog Pawar 279*c83a76b0SSuyog Pawar /** array of function pointers for residual and 280*c83a76b0SSuyog Pawar * forward transform for all transform sizes 281*c83a76b0SSuyog Pawar */ 282*c83a76b0SSuyog Pawar pf_res_trans_luma_had apf_resd_trns_had[NUM_TRANS_TYPES]; 283*c83a76b0SSuyog Pawar 284*c83a76b0SSuyog Pawar /** array of pointer to store the scaling matrices for 285*c83a76b0SSuyog Pawar * all transform sizes and qp % 6 (pre computed) 286*c83a76b0SSuyog Pawar */ 287*c83a76b0SSuyog Pawar WORD16 *api2_scal_mat[NUM_TRANS_TYPES * 2]; 288*c83a76b0SSuyog Pawar 289*c83a76b0SSuyog Pawar /** array of pointer to store the re-scaling matrices for 290*c83a76b0SSuyog Pawar * all transform sizes and qp % 6 (pre computed) 291*c83a76b0SSuyog Pawar */ 292*c83a76b0SSuyog Pawar WORD16 *api2_rescal_mat[NUM_TRANS_TYPES * 2]; 293*c83a76b0SSuyog Pawar 294*c83a76b0SSuyog Pawar /** Qunatization rounding factor for inter and intra CUs */ 295*c83a76b0SSuyog Pawar WORD32 i4_quant_rnd_factor[2]; 296*c83a76b0SSuyog Pawar 297*c83a76b0SSuyog Pawar UWORD8 u1_ctb_size; 298*c83a76b0SSuyog Pawar 299*c83a76b0SSuyog Pawar UWORD8 u1_min_cu_size; 300*c83a76b0SSuyog Pawar 301*c83a76b0SSuyog Pawar UWORD8 u1_min_tu_size; 302*c83a76b0SSuyog Pawar 303*c83a76b0SSuyog Pawar UWORD16 u2_ctb_row_num; 304*c83a76b0SSuyog Pawar 305*c83a76b0SSuyog Pawar UWORD16 u2_ctb_num_in_row; 306*c83a76b0SSuyog Pawar 307*c83a76b0SSuyog Pawar WORD8 i1_QP; 308*c83a76b0SSuyog Pawar 309*c83a76b0SSuyog Pawar UWORD8 u1_num_b_frames; 310*c83a76b0SSuyog Pawar 311*c83a76b0SSuyog Pawar UWORD8 b_sad_type; 312*c83a76b0SSuyog Pawar 313*c83a76b0SSuyog Pawar UWORD8 u1_ipe_step_size; 314*c83a76b0SSuyog Pawar 315*c83a76b0SSuyog Pawar WORD32 i4_ol_satd_lambda; 316*c83a76b0SSuyog Pawar 317*c83a76b0SSuyog Pawar WORD32 i4_ol_sad_lambda; 318*c83a76b0SSuyog Pawar 319*c83a76b0SSuyog Pawar UWORD8 au1_nbr_ctb_map[MAX_PU_IN_CTB_ROW + 1 + 8][MAX_PU_IN_CTB_ROW + 1 + 8]; 320*c83a76b0SSuyog Pawar 321*c83a76b0SSuyog Pawar /** 322*c83a76b0SSuyog Pawar * Pointer to (1,1) location in au1_nbr_ctb_map 323*c83a76b0SSuyog Pawar */ 324*c83a76b0SSuyog Pawar UWORD8 *pu1_ctb_nbr_map; 325*c83a76b0SSuyog Pawar 326*c83a76b0SSuyog Pawar /** 327*c83a76b0SSuyog Pawar * neigbour map buffer stride; 328*c83a76b0SSuyog Pawar */ 329*c83a76b0SSuyog Pawar WORD32 i4_nbr_map_strd; 330*c83a76b0SSuyog Pawar 331*c83a76b0SSuyog Pawar /** CTB neighbour availability flags */ 332*c83a76b0SSuyog Pawar nbr_avail_flags_t s_ctb_nbr_avail_flags; 333*c83a76b0SSuyog Pawar 334*c83a76b0SSuyog Pawar /** Slice Type of the current picture being processed */ 335*c83a76b0SSuyog Pawar WORD32 i4_slice_type; 336*c83a76b0SSuyog Pawar 337*c83a76b0SSuyog Pawar /** Temporal ID of the current picture being processed */ 338*c83a76b0SSuyog Pawar WORD32 i4_temporal_lyr_id; 339*c83a76b0SSuyog Pawar 340*c83a76b0SSuyog Pawar WORD32 i4_ol_sad_lambda_qf_array[MAX_HEVC_QP_10bit + 1]; 341*c83a76b0SSuyog Pawar WORD32 i4_ol_satd_lambda_qf_array[MAX_HEVC_QP_10bit + 1]; 342*c83a76b0SSuyog Pawar 343*c83a76b0SSuyog Pawar /************************************************************************/ 344*c83a76b0SSuyog Pawar /* The fields with the string 'type2' in their names are required */ 345*c83a76b0SSuyog Pawar /* when both 8bit and hbd lambdas are needed. The lambdas corresponding */ 346*c83a76b0SSuyog Pawar /* to the bit_depth != internal_bit_depth are stored in these fields */ 347*c83a76b0SSuyog Pawar /************************************************************************/ 348*c83a76b0SSuyog Pawar WORD32 i4_ol_sad_type2_lambda_qf_array[MAX_HEVC_QP_10bit + 1]; 349*c83a76b0SSuyog Pawar WORD32 i4_ol_satd_type2_lambda_qf_array[MAX_HEVC_QP_10bit + 1]; 350*c83a76b0SSuyog Pawar 351*c83a76b0SSuyog Pawar /*Store the HEVC frame level qp for level modulation*/ 352*c83a76b0SSuyog Pawar WORD32 i4_hevc_qp; 353*c83a76b0SSuyog Pawar /*Store the frame level qscale for level modulation*/ 354*c83a76b0SSuyog Pawar WORD32 i4_qscale; 355*c83a76b0SSuyog Pawar #if POW_OPT 356*c83a76b0SSuyog Pawar /* Averge activity of 8x8 blocks from previous frame 357*c83a76b0SSuyog Pawar * If L1, maps to 16*16 in L0 358*c83a76b0SSuyog Pawar */ 359*c83a76b0SSuyog Pawar long double ld_curr_frame_8x8_log_avg[2]; 360*c83a76b0SSuyog Pawar 361*c83a76b0SSuyog Pawar /* Averge activity of 16x16 blocks from previous frame 362*c83a76b0SSuyog Pawar * If L1, maps to 32*32 in L0 363*c83a76b0SSuyog Pawar */ 364*c83a76b0SSuyog Pawar long double ld_curr_frame_16x16_log_avg[3]; 365*c83a76b0SSuyog Pawar 366*c83a76b0SSuyog Pawar /* Averge activity of 32x32 blocks from previous frame 367*c83a76b0SSuyog Pawar * If L1, maps to 64*64 in L0 368*c83a76b0SSuyog Pawar */ 369*c83a76b0SSuyog Pawar long double ld_curr_frame_32x32_log_avg[3]; 370*c83a76b0SSuyog Pawar #else 371*c83a76b0SSuyog Pawar /* Averge activity of 8x8 blocks from previous frame 372*c83a76b0SSuyog Pawar * If L1, maps to 16*16 in L0 373*c83a76b0SSuyog Pawar */ 374*c83a76b0SSuyog Pawar LWORD64 i8_curr_frame_8x8_avg_act[2]; 375*c83a76b0SSuyog Pawar 376*c83a76b0SSuyog Pawar /* Averge activity of 16x16 blocks from previous frame 377*c83a76b0SSuyog Pawar * If L1, maps to 32*32 in L0 378*c83a76b0SSuyog Pawar */ 379*c83a76b0SSuyog Pawar LWORD64 i8_curr_frame_16x16_avg_act[3]; 380*c83a76b0SSuyog Pawar 381*c83a76b0SSuyog Pawar /* Averge activity of 32x32 blocks from previous frame 382*c83a76b0SSuyog Pawar * If L1, maps to 64*64 in L0 383*c83a76b0SSuyog Pawar */ 384*c83a76b0SSuyog Pawar LWORD64 i8_curr_frame_32x32_avg_act[3]; 385*c83a76b0SSuyog Pawar #endif 386*c83a76b0SSuyog Pawar /** Frame-levelSATD cost accumalator */ 387*c83a76b0SSuyog Pawar LWORD64 i8_frame_acc_satd_cost; 388*c83a76b0SSuyog Pawar 389*c83a76b0SSuyog Pawar /** Frame-levelSATD accumalator */ 390*c83a76b0SSuyog Pawar LWORD64 i8_frame_acc_satd; 391*c83a76b0SSuyog Pawar 392*c83a76b0SSuyog Pawar /** Frame-level activity factor for CU 8x8 accumalator */ 393*c83a76b0SSuyog Pawar LWORD64 i8_frame_acc_act_factor; 394*c83a76b0SSuyog Pawar 395*c83a76b0SSuyog Pawar /** Frame-level Mode Bits cost accumalator */ 396*c83a76b0SSuyog Pawar LWORD64 i8_frame_acc_mode_bits_cost; 397*c83a76b0SSuyog Pawar 398*c83a76b0SSuyog Pawar /** Encoder quality preset : See IHEVCE_QUALITY_CONFIG_T for presets */ 399*c83a76b0SSuyog Pawar WORD32 i4_quality_preset; 400*c83a76b0SSuyog Pawar 401*c83a76b0SSuyog Pawar /** Frame-level SATD/qp accumulator in q10 format*/ 402*c83a76b0SSuyog Pawar LWORD64 i8_frame_acc_satd_by_modqp_q10; 403*c83a76b0SSuyog Pawar 404*c83a76b0SSuyog Pawar /** For testing EIID only. */ 405*c83a76b0SSuyog Pawar UWORD32 u4_num_16x16_skips_at_L0_IPE; 406*c83a76b0SSuyog Pawar 407*c83a76b0SSuyog Pawar /** Reference sample array. Used as local variable in mode_eval_filtering */ 408*c83a76b0SSuyog Pawar UWORD8 au1_ref_samples[1028]; 409*c83a76b0SSuyog Pawar /** filtered reference sample array. Used as local variable in mode_eval_filtering */ 410*c83a76b0SSuyog Pawar UWORD8 au1_filt_ref_samples[1028]; 411*c83a76b0SSuyog Pawar /** array for the modes to be evaluated. Used as local variable in mode_eval_filtering */ 412*c83a76b0SSuyog Pawar UWORD8 au1_modes_to_eval[MAX_NUM_IP_MODES]; 413*c83a76b0SSuyog Pawar /** temp array for the modes to be evaluated. Used as local variable in mode_eval_filtering */ 414*c83a76b0SSuyog Pawar UWORD8 au1_modes_to_eval_temp[MAX_NUM_IP_MODES]; 415*c83a76b0SSuyog Pawar /** pred samples array. Used as local variable in mode_eval_filtering */ 416*c83a76b0SSuyog Pawar MEM_ALIGN32 UWORD8 au1_pred_samples[4096]; 417*c83a76b0SSuyog Pawar /** array for storing satd cost. Used as local variable in mode_eval_filtering*/ 418*c83a76b0SSuyog Pawar UWORD16 au2_mode_bits_satd_cost[MAX_NUM_IP_MODES]; 419*c83a76b0SSuyog Pawar /** array for storing satd values. used as local variable in mode_eval_filtering */ 420*c83a76b0SSuyog Pawar UWORD16 au2_mode_bits_satd[MAX_NUM_IP_MODES]; 421*c83a76b0SSuyog Pawar 422*c83a76b0SSuyog Pawar /** reference data, local for pu_calc_8x8 */ 423*c83a76b0SSuyog Pawar UWORD8 au1_ref_8x8pu[4][18]; 424*c83a76b0SSuyog Pawar /** mode_bits_cost, local for pu_calc_8x8 */ 425*c83a76b0SSuyog Pawar UWORD16 au2_mode_bits_cost_8x8pu[4][MAX_NUM_IP_MODES]; 426*c83a76b0SSuyog Pawar /** mode_bits, local for pu_calc_8x8 */ 427*c83a76b0SSuyog Pawar UWORD16 au2_mode_bits_8x8_pu[MAX_NUM_IP_MODES]; 428*c83a76b0SSuyog Pawar 429*c83a76b0SSuyog Pawar /** tranform coeff temp, local to ihevce_pu_calc_4x4_blk */ 430*c83a76b0SSuyog Pawar WORD16 *pi2_trans_tmp; //this memory is overlayed with au1_pred_samples[4096]. First half. 431*c83a76b0SSuyog Pawar 432*c83a76b0SSuyog Pawar /** tranform coeff out, local to ihevce_pu_calc_4x4_blk */ 433*c83a76b0SSuyog Pawar WORD16 *pi2_trans_out; //this memory is overlayed with au1_pred_samples[4096]. Second half. 434*c83a76b0SSuyog Pawar 435*c83a76b0SSuyog Pawar UWORD8 u1_use_lambda_derived_from_min_8x8_act_in_ctb; 436*c83a76b0SSuyog Pawar 437*c83a76b0SSuyog Pawar UWORD8 u1_bit_depth; 438*c83a76b0SSuyog Pawar 439*c83a76b0SSuyog Pawar rc_quant_t *ps_rc_quant_ctxt; 440*c83a76b0SSuyog Pawar /** Flag that specifies whether to use SATD or SAD in L0 IPE */ 441*c83a76b0SSuyog Pawar UWORD8 u1_use_satd; 442*c83a76b0SSuyog Pawar 443*c83a76b0SSuyog Pawar /** Flag that specifies level of refinement */ 444*c83a76b0SSuyog Pawar UWORD8 u1_level_1_refine_on; 445*c83a76b0SSuyog Pawar 446*c83a76b0SSuyog Pawar /** Flag indicates that child mode decision is disabled in L0 IPE recur bracketing */ 447*c83a76b0SSuyog Pawar UWORD8 u1_disable_child_cu_decide; 448*c83a76b0SSuyog Pawar 449*c83a76b0SSuyog Pawar /*Modulation factor*/ 450*c83a76b0SSuyog Pawar WORD32 ai4_mod_factor_derived_by_variance[2]; 451*c83a76b0SSuyog Pawar float f_strength; 452*c83a76b0SSuyog Pawar WORD32 i4_l0ipe_qp_mod; 453*c83a76b0SSuyog Pawar 454*c83a76b0SSuyog Pawar WORD32 i4_frm_qp; 455*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer; 456*c83a76b0SSuyog Pawar WORD32 i4_pass; 457*c83a76b0SSuyog Pawar 458*c83a76b0SSuyog Pawar double f_i_pic_lamda_modifier; 459*c83a76b0SSuyog Pawar WORD32 i4_use_const_lamda_modifier; 460*c83a76b0SSuyog Pawar WORD32 i4_is_ref_pic; 461*c83a76b0SSuyog Pawar LWORD64 i8_curr_frame_avg_mean_act; 462*c83a76b0SSuyog Pawar WORD32 i4_enable_noise_detection; 463*c83a76b0SSuyog Pawar 464*c83a76b0SSuyog Pawar ihevce_ipe_optimised_function_list_t s_ipe_optimised_function_list; 465*c83a76b0SSuyog Pawar 466*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t s_cmn_opt_func; 467*c83a76b0SSuyog Pawar 468*c83a76b0SSuyog Pawar } ihevce_ipe_ctxt_t; 469*c83a76b0SSuyog Pawar 470*c83a76b0SSuyog Pawar /** 471*c83a76b0SSuyog Pawar ****************************************************************************** 472*c83a76b0SSuyog Pawar * @brief IPE module overall context 473*c83a76b0SSuyog Pawar ****************************************************************************** 474*c83a76b0SSuyog Pawar */ 475*c83a76b0SSuyog Pawar typedef struct 476*c83a76b0SSuyog Pawar { 477*c83a76b0SSuyog Pawar /*array of ipe ctxt */ 478*c83a76b0SSuyog Pawar ihevce_ipe_ctxt_t *aps_ipe_thrd_ctxt[MAX_NUM_FRM_PROC_THRDS_PRE_ENC]; 479*c83a76b0SSuyog Pawar 480*c83a76b0SSuyog Pawar /** Number of processing threads created run time */ 481*c83a76b0SSuyog Pawar WORD32 i4_num_proc_thrds; 482*c83a76b0SSuyog Pawar 483*c83a76b0SSuyog Pawar } ihevce_ipe_master_ctxt_t; 484*c83a76b0SSuyog Pawar 485*c83a76b0SSuyog Pawar /*****************************************************************************/ 486*c83a76b0SSuyog Pawar /* Extern Variable Declarations */ 487*c83a76b0SSuyog Pawar /*****************************************************************************/ 488*c83a76b0SSuyog Pawar 489*c83a76b0SSuyog Pawar /*****************************************************************************/ 490*c83a76b0SSuyog Pawar /* Extern Function Declarations */ 491*c83a76b0SSuyog Pawar /*****************************************************************************/ 492*c83a76b0SSuyog Pawar void ihevce_ipe_analyse_update_cost( 493*c83a76b0SSuyog Pawar ihevce_ipe_cu_tree_t *ps_cu_node, UWORD8 u1_mode, DOUBLE lf_cost); 494*c83a76b0SSuyog Pawar #endif /* _IHEVCE_IPE_STRUCTS_H_ */ 495