| /****************************************************************************** |
| * |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ***************************************************************************** |
| * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
| */ |
| |
| /** |
| ******************************************************************************* |
| * @file |
| * ihevce_stasino_helpers.h |
| * |
| * @brief |
| * |
| * |
| * @author |
| * Ittiam |
| * |
| * @remarks |
| * None |
| * |
| ******************************************************************************* |
| */ |
| |
| #ifndef _IHEVCE_STASINO_HELPERS_H_ |
| #define _IHEVCE_STASINO_HELPERS_H_ |
| |
| #include <math.h> |
| /****************************************************************************/ |
| /* Constant Macros */ |
| /****************************************************************************/ |
| |
| /****************************************************************************/ |
| /* Function Macros */ |
| /****************************************************************************/ |
| #define MULTIPLY_STIM_WITH_DISTORTION(dist, stimXalpha, stim_q_level, alpha_q_level) \ |
| { \ |
| ULWORD64 u8_pure_dist = (dist); \ |
| WORD32 i4_q_level = stim_q_level + alpha_q_level; \ |
| \ |
| u8_pure_dist *= ((1 << (i4_q_level)) - (stimXalpha)); \ |
| u8_pure_dist += (1 << ((i4_q_level)-1)); \ |
| (dist) = u8_pure_dist >> (i4_q_level); \ |
| } |
| |
| /****************************************************************************/ |
| /* Typedefs */ |
| /****************************************************************************/ |
| |
| /****************************************************************************/ |
| /* Enums */ |
| /****************************************************************************/ |
| |
| /****************************************************************************/ |
| /* Structure */ |
| /****************************************************************************/ |
| |
| /****************************************************************************/ |
| /* Function Prototypes */ |
| /****************************************************************************/ |
| |
| void ihevce_calc_variance( |
| void *pv_input, |
| WORD32 i4_stride, |
| WORD32 *pi4_mean, |
| UWORD32 *pu4_variance, |
| UWORD8 u1_block_height, |
| UWORD8 u1_block_width, |
| UWORD8 u1_is_hbd, |
| UWORD8 u1_disable_normalization); |
| |
| void ihevce_calc_variance_signed( |
| WORD16 *pv_input, |
| WORD32 i4_stride, |
| WORD32 *pi4_mean, |
| UWORD32 *pu4_variance, |
| UWORD8 u1_block_height, |
| UWORD8 u1_block_width); |
| |
| void ihevce_calc_chroma_variance( |
| void *pv_input, |
| WORD32 i4_stride, |
| WORD32 *pi4_mean, |
| UWORD32 *pu4_variance, |
| UWORD8 u1_block_height, |
| UWORD8 u1_block_width, |
| UWORD8 u1_is_hbd, |
| CHROMA_PLANE_ID_T e_chroma_plane); |
| |
| static INLINE UWORD32 ihevce_compute_stim(UWORD32 u4_variance1, UWORD32 u4_variance2) |
| { |
| return (u4_variance1 == u4_variance2) |
| ? (1 << STIM_Q_FORMAT) |
| : ((UWORD32)( |
| ((2 * (double)u4_variance1 * (double)u4_variance2) / |
| (pow((double)u4_variance1, 2) + pow((double)u4_variance2, 2))) * |
| pow((double)2, STIM_Q_FORMAT))); |
| } |
| |
| LWORD64 ihevce_inject_stim_into_distortion( |
| void *pv_src, |
| WORD32 i4_src_stride, |
| void *pv_pred, |
| WORD32 i4_pred_stride, |
| LWORD64 i8_distortion, |
| WORD32 i4_alpha_stim_multiplier, |
| UWORD8 u1_blk_size, |
| UWORD8 u1_is_hbd, |
| UWORD8 u1_enable_psyRDOPT, |
| CHROMA_PLANE_ID_T e_chroma_plane); |
| |
| static INLINE WORD32 ihevce_derive_noise_weighted_alpha_stim_multiplier( |
| WORD32 i4_alpha, UWORD32 u4SrcVar, UWORD32 u4PredVar, WORD32 i4_stim) |
| { |
| (void)u4SrcVar; |
| (void)u4PredVar; |
| (void)i4_stim; |
| return i4_alpha; |
| } |
| |
| static INLINE WORD32 ihevce_compute_noise_term(WORD32 i4_alpha, UWORD32 u4SrcVar, UWORD32 u4PredVar) |
| { |
| if(i4_alpha) |
| { |
| WORD32 i4_stim = ihevce_compute_stim(u4SrcVar, u4PredVar); |
| |
| ASSERT(i4_stim >= 0); |
| |
| i4_alpha = ihevce_derive_noise_weighted_alpha_stim_multiplier( |
| i4_alpha, u4SrcVar, u4PredVar, i4_stim); |
| |
| return i4_stim * i4_alpha; |
| } |
| else |
| { |
| return 0; |
| } |
| } |
| |
| UWORD8 ihevce_determine_cu_noise_based_on_8x8Blk_data( |
| UWORD8 *pu1_is_8x8Blk_noisy, UWORD8 u1_cu_x_pos, UWORD8 u1_cu_y_pos, UWORD8 u1_cu_size); |
| |
| LWORD64 ihevce_psy_rd_cost_croma( |
| LWORD64 *pui4_source_satd, |
| void *p_recon, |
| WORD32 recon_stride_vert, |
| WORD32 recond_stride_horz, |
| WORD32 cu_size_luma, |
| WORD32 pic_type, |
| WORD32 layer_id, |
| WORD32 lambda, |
| WORD32 start_index, |
| WORD32 is_hbd, |
| WORD32 sub_sampling_type, |
| ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list |
| |
| ); |
| |
| LWORD64 ihevce_psy_rd_cost( |
| LWORD64 *pui4_source_satd, |
| void *pv_recon, |
| WORD32 recon_stride_vert, |
| WORD32 recond_stride_horz, |
| WORD32 cu_size, |
| WORD32 pic_type, |
| WORD32 layer_id, |
| WORD32 lambda, |
| WORD32 start_index, |
| WORD32 is_hbd, |
| UWORD32 u4_psy_strength, |
| ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list); |
| |
| WORD32 ihevce_ctb_noise_detect( |
| UWORD8 *pu1_l0_ctb, |
| WORD32 l0_stride, |
| UWORD8 *pu1_l1_ctb, |
| WORD32 l1_stride, |
| WORD32 had_block_size, |
| WORD32 ctb_width, |
| WORD32 ctb_height, |
| ihevce_ctb_noise_params *ps_ctb_noise_params, |
| WORD32 ctb_height_offset, |
| WORD32 ctb_width_offset, |
| WORD32 frame_height, |
| WORD32 frame_width); |
| |
| void ihevce_had4_4x4_noise_detect( |
| UWORD8 *pu1_src, |
| WORD32 src_strd, |
| UWORD8 *pu1_pred, |
| WORD32 pred_strd, |
| WORD16 *pi2_dst4x4, |
| WORD16 *pi2_residue, |
| WORD32 dst_strd, |
| WORD32 scaling_for_pred); |
| |
| WORD32 ihevce_had_16x16_r_noise_detect( |
| UWORD8 *pu1_src, |
| WORD32 src_strd, |
| UWORD8 *pu1_pred, |
| WORD32 pred_strd, |
| WORD16 *pi2_dst, |
| WORD32 dst_strd, |
| WORD32 pos_x_y_4x4, |
| WORD32 num_4x4_in_row, |
| WORD32 scaling_for_pred); |
| |
| UWORD32 ihevce_compute_8x8HAD_using_4x4_noise_detect( |
| WORD16 *pi2_4x4_had, |
| WORD32 had4_strd, |
| WORD16 *pi2_dst, |
| WORD32 dst_strd, |
| WORD32 i4_frm_qstep, |
| WORD32 *pi4_cbf); |
| |
| void ihevce_had_8x8_using_4_4x4_noise_detect( |
| UWORD8 *pu1_src, |
| WORD32 src_strd, |
| UWORD8 *pu1_pred, |
| WORD32 pred_strd, |
| WORD16 *pi2_dst, |
| WORD32 dst_strd, |
| WORD32 pos_x_y_4x4, |
| WORD32 num_4x4_in_row, |
| WORD32 scaling_for_pred); |
| |
| unsigned long ihevce_calc_stim_injected_variance( |
| ULWORD64 *pu8_sigmaX, |
| ULWORD64 *pu8_sigmaXSquared, |
| ULWORD64 *u8_var, |
| WORD32 i4_inv_wpred_wt, |
| WORD32 i4_inv_wt_shift_val, |
| WORD32 i4_wpred_log_wdc, |
| WORD32 i4_part_id); |
| |
| unsigned long ihevce_calc_variance_for_diff_weights( |
| ULWORD64 *pu8_sigmaX, |
| ULWORD64 *pu8_sigmaXSquared, |
| ULWORD64 *u8_var, |
| WORD32 *pi4_inv_wt, |
| WORD32 *pi4_inv_wt_shift_val, |
| pu_result_t *ps_result, |
| WORD32 i4_wpred_log_wdc, |
| PART_ID_T *pe_part_id, |
| UWORD8 u1_cu_size, |
| UWORD8 u1_num_parts, |
| UWORD8 u1_is_for_src); |
| |
| #endif /* _IHEVCE_STASINO_HELPERS_H_ */ |