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 *******************************************************************************
     23 * @file
     24 *  ihevce_stasino_helpers.h
     25 *
     26 * @brief
     27 *
     28 *
     29 * @author
     30 *  Ittiam
     31 *
     32 * @remarks
     33 *  None
     34 *
     35 *******************************************************************************
     36 */
     37 
     38 #ifndef _IHEVCE_STASINO_HELPERS_H_
     39 #define _IHEVCE_STASINO_HELPERS_H_
     40 
     41 #include <math.h>
     42 /****************************************************************************/
     43 /* Constant Macros                                                          */
     44 /****************************************************************************/
     45 
     46 /****************************************************************************/
     47 /* Function Macros                                                          */
     48 /****************************************************************************/
     49 #define MULTIPLY_STIM_WITH_DISTORTION(dist, stimXalpha, stim_q_level, alpha_q_level)               \
     50     {                                                                                              \
     51         ULWORD64 u8_pure_dist = (dist);                                                            \
     52         WORD32 i4_q_level = stim_q_level + alpha_q_level;                                          \
     53                                                                                                    \
     54         u8_pure_dist *= ((1 << (i4_q_level)) - (stimXalpha));                                      \
     55         u8_pure_dist += (1 << ((i4_q_level)-1));                                                   \
     56         (dist) = u8_pure_dist >> (i4_q_level);                                                     \
     57     }
     58 
     59 /****************************************************************************/
     60 /* Typedefs                                                                 */
     61 /****************************************************************************/
     62 
     63 /****************************************************************************/
     64 /* Enums                                                                    */
     65 /****************************************************************************/
     66 
     67 /****************************************************************************/
     68 /* Structure                                                                */
     69 /****************************************************************************/
     70 
     71 /****************************************************************************/
     72 /* Function Prototypes                                                      */
     73 /****************************************************************************/
     74 
     75 void ihevce_calc_variance(
     76     void *pv_input,
     77     WORD32 i4_stride,
     78     WORD32 *pi4_mean,
     79     UWORD32 *pu4_variance,
     80     UWORD8 u1_block_height,
     81     UWORD8 u1_block_width,
     82     UWORD8 u1_is_hbd,
     83     UWORD8 u1_disable_normalization);
     84 
     85 void ihevce_calc_variance_signed(
     86     WORD16 *pv_input,
     87     WORD32 i4_stride,
     88     WORD32 *pi4_mean,
     89     UWORD32 *pu4_variance,
     90     UWORD8 u1_block_height,
     91     UWORD8 u1_block_width);
     92 
     93 void ihevce_calc_chroma_variance(
     94     void *pv_input,
     95     WORD32 i4_stride,
     96     WORD32 *pi4_mean,
     97     UWORD32 *pu4_variance,
     98     UWORD8 u1_block_height,
     99     UWORD8 u1_block_width,
    100     UWORD8 u1_is_hbd,
    101     CHROMA_PLANE_ID_T e_chroma_plane);
    102 
    103 static INLINE UWORD32 ihevce_compute_stim(UWORD32 u4_variance1, UWORD32 u4_variance2)
    104 {
    105     return (u4_variance1 == u4_variance2)
    106                ? (1 << STIM_Q_FORMAT)
    107                : ((UWORD32)(
    108                      ((2 * (double)u4_variance1 * (double)u4_variance2) /
    109                       (pow((double)u4_variance1, 2) + pow((double)u4_variance2, 2))) *
    110                      pow((double)2, STIM_Q_FORMAT)));
    111 }
    112 
    113 LWORD64 ihevce_inject_stim_into_distortion(
    114     void *pv_src,
    115     WORD32 i4_src_stride,
    116     void *pv_pred,
    117     WORD32 i4_pred_stride,
    118     LWORD64 i8_distortion,
    119     WORD32 i4_alpha_stim_multiplier,
    120     UWORD8 u1_blk_size,
    121     UWORD8 u1_is_hbd,
    122     UWORD8 u1_enable_psyRDOPT,
    123     CHROMA_PLANE_ID_T e_chroma_plane);
    124 
    125 static INLINE WORD32 ihevce_derive_noise_weighted_alpha_stim_multiplier(
    126     WORD32 i4_alpha, UWORD32 u4SrcVar, UWORD32 u4PredVar, WORD32 i4_stim)
    127 {
    128     (void)u4SrcVar;
    129     (void)u4PredVar;
    130     (void)i4_stim;
    131     return i4_alpha;
    132 }
    133 
    134 static INLINE WORD32 ihevce_compute_noise_term(WORD32 i4_alpha, UWORD32 u4SrcVar, UWORD32 u4PredVar)
    135 {
    136     if(i4_alpha)
    137     {
    138         WORD32 i4_stim = ihevce_compute_stim(u4SrcVar, u4PredVar);
    139 
    140         ASSERT(i4_stim >= 0);
    141 
    142         i4_alpha = ihevce_derive_noise_weighted_alpha_stim_multiplier(
    143             i4_alpha, u4SrcVar, u4PredVar, i4_stim);
    144 
    145         return i4_stim * i4_alpha;
    146     }
    147     else
    148     {
    149         return 0;
    150     }
    151 }
    152 
    153 UWORD8 ihevce_determine_cu_noise_based_on_8x8Blk_data(
    154     UWORD8 *pu1_is_8x8Blk_noisy, UWORD8 u1_cu_x_pos, UWORD8 u1_cu_y_pos, UWORD8 u1_cu_size);
    155 
    156 LWORD64 ihevce_psy_rd_cost_croma(
    157     LWORD64 *pui4_source_satd,
    158     void *p_recon,
    159     WORD32 recon_stride_vert,
    160     WORD32 recond_stride_horz,
    161     WORD32 cu_size_luma,
    162     WORD32 pic_type,
    163     WORD32 layer_id,
    164     WORD32 lambda,
    165     WORD32 start_index,
    166     WORD32 is_hbd,
    167     WORD32 sub_sampling_type,
    168     ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list
    169 
    170 );
    171 
    172 LWORD64 ihevce_psy_rd_cost(
    173     LWORD64 *pui4_source_satd,
    174     void *pv_recon,
    175     WORD32 recon_stride_vert,
    176     WORD32 recond_stride_horz,
    177     WORD32 cu_size,
    178     WORD32 pic_type,
    179     WORD32 layer_id,
    180     WORD32 lambda,
    181     WORD32 start_index,
    182     WORD32 is_hbd,
    183     UWORD32 u4_psy_strength,
    184     ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list);
    185 
    186 WORD32 ihevce_ctb_noise_detect(
    187     UWORD8 *pu1_l0_ctb,
    188     WORD32 l0_stride,
    189     UWORD8 *pu1_l1_ctb,
    190     WORD32 l1_stride,
    191     WORD32 had_block_size,
    192     WORD32 ctb_width,
    193     WORD32 ctb_height,
    194     ihevce_ctb_noise_params *ps_ctb_noise_params,
    195     WORD32 ctb_height_offset,
    196     WORD32 ctb_width_offset,
    197     WORD32 frame_height,
    198     WORD32 frame_width);
    199 
    200 void ihevce_had4_4x4_noise_detect(
    201     UWORD8 *pu1_src,
    202     WORD32 src_strd,
    203     UWORD8 *pu1_pred,
    204     WORD32 pred_strd,
    205     WORD16 *pi2_dst4x4,
    206     WORD16 *pi2_residue,
    207     WORD32 dst_strd,
    208     WORD32 scaling_for_pred);
    209 
    210 WORD32 ihevce_had_16x16_r_noise_detect(
    211     UWORD8 *pu1_src,
    212     WORD32 src_strd,
    213     UWORD8 *pu1_pred,
    214     WORD32 pred_strd,
    215     WORD16 *pi2_dst,
    216     WORD32 dst_strd,
    217     WORD32 pos_x_y_4x4,
    218     WORD32 num_4x4_in_row,
    219     WORD32 scaling_for_pred);
    220 
    221 UWORD32 ihevce_compute_8x8HAD_using_4x4_noise_detect(
    222     WORD16 *pi2_4x4_had,
    223     WORD32 had4_strd,
    224     WORD16 *pi2_dst,
    225     WORD32 dst_strd,
    226     WORD32 i4_frm_qstep,
    227     WORD32 *pi4_cbf);
    228 
    229 void ihevce_had_8x8_using_4_4x4_noise_detect(
    230     UWORD8 *pu1_src,
    231     WORD32 src_strd,
    232     UWORD8 *pu1_pred,
    233     WORD32 pred_strd,
    234     WORD16 *pi2_dst,
    235     WORD32 dst_strd,
    236     WORD32 pos_x_y_4x4,
    237     WORD32 num_4x4_in_row,
    238     WORD32 scaling_for_pred);
    239 
    240 unsigned long ihevce_calc_stim_injected_variance(
    241     ULWORD64 *pu8_sigmaX,
    242     ULWORD64 *pu8_sigmaXSquared,
    243     ULWORD64 *u8_var,
    244     WORD32 i4_inv_wpred_wt,
    245     WORD32 i4_inv_wt_shift_val,
    246     WORD32 i4_wpred_log_wdc,
    247     WORD32 i4_part_id);
    248 
    249 unsigned long ihevce_calc_variance_for_diff_weights(
    250     ULWORD64 *pu8_sigmaX,
    251     ULWORD64 *pu8_sigmaXSquared,
    252     ULWORD64 *u8_var,
    253     WORD32 *pi4_inv_wt,
    254     WORD32 *pi4_inv_wt_shift_val,
    255     pu_result_t *ps_result,
    256     WORD32 i4_wpred_log_wdc,
    257     PART_ID_T *pe_part_id,
    258     UWORD8 u1_cu_size,
    259     UWORD8 u1_num_parts,
    260     UWORD8 u1_is_for_src);
    261 
    262 #endif /* _IHEVCE_STASINO_HELPERS_H_ */
    263