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