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