xref: /aosp_15_r20/external/libhevc/encoder/ihevce_common_utils.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
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_common_utils.c
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    Contains definitions of common utility functions used across encoder
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 * List of Functions
34*c83a76b0SSuyog Pawar *  ihevce_copy_2d()
35*c83a76b0SSuyog Pawar *  ihevce_hbd_copy_2d()
36*c83a76b0SSuyog Pawar *  ihevce_2d_square_copy_luma()
37*c83a76b0SSuyog Pawar *  ihevce_wt_avg_2d()
38*c83a76b0SSuyog Pawar *  ihevce_itrans_recon_dc_compute()
39*c83a76b0SSuyog Pawar *  ihevce_itrans_recon_dc()
40*c83a76b0SSuyog Pawar *  ihevce_hbd_itrans_recon_dc()
41*c83a76b0SSuyog Pawar *  ihevce_truncate_16bit_data_to_8bit()
42*c83a76b0SSuyog Pawar *  ihevce_convert_16bit_recon_to_8bit()
43*c83a76b0SSuyog Pawar *  ihevce_convert_16bit_input_to_8bit()
44*c83a76b0SSuyog Pawar *  ihevce_find_num_clusters_of_identical_points_1D()
45*c83a76b0SSuyog Pawar *  ihevce_hbd_compute_ssd()
46*c83a76b0SSuyog Pawar *  ihevce_compare_pu_mv_t()
47*c83a76b0SSuyog Pawar *  ihevce_set_pred_buf_as_free()
48*c83a76b0SSuyog Pawar *  ihevce_get_free_pred_buf_indices()
49*c83a76b0SSuyog Pawar *  ihevce_scale_mv()
50*c83a76b0SSuyog Pawar *  ihevce_osal_alloc()
51*c83a76b0SSuyog Pawar *  ihevce_osal_free()
52*c83a76b0SSuyog Pawar *  ihevce_osal_init()
53*c83a76b0SSuyog Pawar *  ihevce_osal_delete()
54*c83a76b0SSuyog Pawar *  ihevce_sum_abs_seq()
55*c83a76b0SSuyog Pawar *  ihevce_ssd_calculator()
56*c83a76b0SSuyog Pawar *  ihevce_chroma_interleave_ssd_calculator()
57*c83a76b0SSuyog Pawar *  ihevce_ssd_and_sad_calculator()
58*c83a76b0SSuyog Pawar *  ihevce_chroma_interleave_2d_copy()
59*c83a76b0SSuyog Pawar *  ihevce_hbd_chroma_interleave_2d_copy()
60*c83a76b0SSuyog Pawar *  ihevce_hbd_chroma_interleave_ssd_calculator()
61*c83a76b0SSuyog Pawar *  ihevce_get_chroma_eo_sao_params()
62*c83a76b0SSuyog Pawar *  ihevce_get_chroma_eo_sao_params_hbd()
63*c83a76b0SSuyog Pawar *  ihevce_compute_area_of_valid_cus_in_ctb()
64*c83a76b0SSuyog Pawar *  ihevce_create_cuNode_children()
65*c83a76b0SSuyog Pawar *  ihevce_cu_tree_init()
66*c83a76b0SSuyog Pawar *
67*c83a76b0SSuyog Pawar ******************************************************************************
68*c83a76b0SSuyog Pawar */
69*c83a76b0SSuyog Pawar 
70*c83a76b0SSuyog Pawar /*****************************************************************************/
71*c83a76b0SSuyog Pawar /* File Includes                                                             */
72*c83a76b0SSuyog Pawar /*****************************************************************************/
73*c83a76b0SSuyog Pawar 
74*c83a76b0SSuyog Pawar /* System include files */
75*c83a76b0SSuyog Pawar #include <stdio.h>
76*c83a76b0SSuyog Pawar #include <stdlib.h>
77*c83a76b0SSuyog Pawar #include <assert.h>
78*c83a76b0SSuyog Pawar #include <string.h>
79*c83a76b0SSuyog Pawar 
80*c83a76b0SSuyog Pawar /* User include files */
81*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
82*c83a76b0SSuyog Pawar #include "itt_video_api.h"
83*c83a76b0SSuyog Pawar #include "ihevce_api.h"
84*c83a76b0SSuyog Pawar 
85*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
86*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
87*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
88*c83a76b0SSuyog Pawar 
89*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
90*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
91*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
92*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
93*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
94*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
95*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
96*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
97*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
98*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
99*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
100*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
101*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
102*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
103*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
104*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
105*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
106*c83a76b0SSuyog Pawar 
107*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
108*c83a76b0SSuyog Pawar #include "ihevce_hle_interface.h"
109*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
110*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
111*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
112*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
113*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
114*c83a76b0SSuyog Pawar #include "ihevce_bitstream.h"
115*c83a76b0SSuyog Pawar #include "ihevce_cabac.h"
116*c83a76b0SSuyog Pawar #include "ihevce_rdoq_macros.h"
117*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
118*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
119*c83a76b0SSuyog Pawar #include "ihevce_entropy_structs.h"
120*c83a76b0SSuyog Pawar #include "ihevce_cmn_utils_instr_set_router.h"
121*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_structs.h"
122*c83a76b0SSuyog Pawar #include "ihevce_common_utils.h"
123*c83a76b0SSuyog Pawar #include "ihevce_global_tables.h"
124*c83a76b0SSuyog Pawar 
125*c83a76b0SSuyog Pawar #include "cast_types.h"
126*c83a76b0SSuyog Pawar #include "osal.h"
127*c83a76b0SSuyog Pawar #include "osal_defaults.h"
128*c83a76b0SSuyog Pawar 
129*c83a76b0SSuyog Pawar /*****************************************************************************/
130*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
131*c83a76b0SSuyog Pawar /*****************************************************************************/
132*c83a76b0SSuyog Pawar 
133*c83a76b0SSuyog Pawar /**
134*c83a76b0SSuyog Pawar ******************************************************************************
135*c83a76b0SSuyog Pawar *
136*c83a76b0SSuyog Pawar *  @brief Performs the 2D copy
137*c83a76b0SSuyog Pawar *
138*c83a76b0SSuyog Pawar *  @par   Description
139*c83a76b0SSuyog Pawar *  This routine Performs the 2D copy
140*c83a76b0SSuyog Pawar *
141*c83a76b0SSuyog Pawar *  @param[inout]   pu1_dst
142*c83a76b0SSuyog Pawar *  pointer to the destination buffer
143*c83a76b0SSuyog Pawar *
144*c83a76b0SSuyog Pawar *  @param[in]   dst_strd
145*c83a76b0SSuyog Pawar *  destination stride in terms of the size of input/output unit
146*c83a76b0SSuyog Pawar *
147*c83a76b0SSuyog Pawar *  @param[inout]   pu1_src
148*c83a76b0SSuyog Pawar *  pointer to the source buffer
149*c83a76b0SSuyog Pawar *
150*c83a76b0SSuyog Pawar *  @param[in]   src_strd
151*c83a76b0SSuyog Pawar *  source stride in terms of the size of input/output unit
152*c83a76b0SSuyog Pawar *
153*c83a76b0SSuyog Pawar *  @param[in]   blk_wd
154*c83a76b0SSuyog Pawar *  number of samples to copy in a row
155*c83a76b0SSuyog Pawar *
156*c83a76b0SSuyog Pawar *  @param[in]   blk_ht
157*c83a76b0SSuyog Pawar *  number of rows to copy
158*c83a76b0SSuyog Pawar *
159*c83a76b0SSuyog Pawar ******************************************************************************
160*c83a76b0SSuyog Pawar */
ihevce_copy_2d(UWORD8 * pu1_dst,WORD32 dst_stride,UWORD8 * pu1_src,WORD32 src_stride,WORD32 blk_wd,WORD32 blk_ht)161*c83a76b0SSuyog Pawar void ihevce_copy_2d(
162*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
163*c83a76b0SSuyog Pawar     WORD32 dst_stride,
164*c83a76b0SSuyog Pawar     UWORD8 *pu1_src,
165*c83a76b0SSuyog Pawar     WORD32 src_stride,
166*c83a76b0SSuyog Pawar     WORD32 blk_wd,
167*c83a76b0SSuyog Pawar     WORD32 blk_ht)
168*c83a76b0SSuyog Pawar {
169*c83a76b0SSuyog Pawar     WORD32 i;
170*c83a76b0SSuyog Pawar 
171*c83a76b0SSuyog Pawar     for(i = 0; i < blk_ht; i++)
172*c83a76b0SSuyog Pawar     {
173*c83a76b0SSuyog Pawar         memcpy(pu1_dst, pu1_src, blk_wd);
174*c83a76b0SSuyog Pawar         pu1_dst += dst_stride;
175*c83a76b0SSuyog Pawar         pu1_src += src_stride;
176*c83a76b0SSuyog Pawar     }
177*c83a76b0SSuyog Pawar }
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar /**
180*c83a76b0SSuyog Pawar ******************************************************************************
181*c83a76b0SSuyog Pawar *
182*c83a76b0SSuyog Pawar *  @brief Performs the 2D copy of luma data
183*c83a76b0SSuyog Pawar *
184*c83a76b0SSuyog Pawar *  @par   Description
185*c83a76b0SSuyog Pawar *  This routine performs the 2D square copy of luma data
186*c83a76b0SSuyog Pawar *
187*c83a76b0SSuyog Pawar *  @param[inout]   p_dst
188*c83a76b0SSuyog Pawar *  pointer to the destination buffer
189*c83a76b0SSuyog Pawar *
190*c83a76b0SSuyog Pawar *  @param[in]   dst_strd
191*c83a76b0SSuyog Pawar *  destination stride in terms of the size of input/output unit
192*c83a76b0SSuyog Pawar *
193*c83a76b0SSuyog Pawar *  @param[inout]   p_src
194*c83a76b0SSuyog Pawar *  pointer to the source buffer
195*c83a76b0SSuyog Pawar *
196*c83a76b0SSuyog Pawar *  @param[in]   src_strd
197*c83a76b0SSuyog Pawar *  source stride in terms of the size of input/output unit
198*c83a76b0SSuyog Pawar *
199*c83a76b0SSuyog Pawar *  @param[in]   num_cols_to_copy
200*c83a76b0SSuyog Pawar *  number of units in a line to copy from src to dst buffer
201*c83a76b0SSuyog Pawar *  Assumption : num_cols_to_copy <= min (dst_strd, src_strd)
202*c83a76b0SSuyog Pawar *
203*c83a76b0SSuyog Pawar *  @param[in]   unit_size
204*c83a76b0SSuyog Pawar *  size of the unit in bytes
205*c83a76b0SSuyog Pawar *
206*c83a76b0SSuyog Pawar *  @return      none
207*c83a76b0SSuyog Pawar *
208*c83a76b0SSuyog Pawar *  Assumptions : num_cols_to_copy = num_lines_to_copy,
209*c83a76b0SSuyog Pawar *  num_lines_to_copy can have {4, 16, 32, 64}
210*c83a76b0SSuyog Pawar *
211*c83a76b0SSuyog Pawar ******************************************************************************
212*c83a76b0SSuyog Pawar */
ihevce_2d_square_copy_luma(void * p_dst,WORD32 dst_strd,void * p_src,WORD32 src_strd,WORD32 num_cols_to_copy,WORD32 unit_size)213*c83a76b0SSuyog Pawar void ihevce_2d_square_copy_luma(
214*c83a76b0SSuyog Pawar     void *p_dst,
215*c83a76b0SSuyog Pawar     WORD32 dst_strd,
216*c83a76b0SSuyog Pawar     void *p_src,
217*c83a76b0SSuyog Pawar     WORD32 src_strd,
218*c83a76b0SSuyog Pawar     WORD32 num_cols_to_copy,
219*c83a76b0SSuyog Pawar     WORD32 unit_size)
220*c83a76b0SSuyog Pawar {
221*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst = (UWORD8 *)p_dst;
222*c83a76b0SSuyog Pawar     UWORD8 *pu1_src = (UWORD8 *)p_src;
223*c83a76b0SSuyog Pawar     WORD32 i;
224*c83a76b0SSuyog Pawar 
225*c83a76b0SSuyog Pawar     for(i = 0; i < num_cols_to_copy; i++)
226*c83a76b0SSuyog Pawar     {
227*c83a76b0SSuyog Pawar         memcpy(pu1_dst, pu1_src, (num_cols_to_copy * unit_size));
228*c83a76b0SSuyog Pawar         pu1_dst += (dst_strd * unit_size);
229*c83a76b0SSuyog Pawar         pu1_src += (src_strd * unit_size);
230*c83a76b0SSuyog Pawar     }
231*c83a76b0SSuyog Pawar }
232*c83a76b0SSuyog Pawar 
233*c83a76b0SSuyog Pawar /**
234*c83a76b0SSuyog Pawar ********************************************************************************
235*c83a76b0SSuyog Pawar *
236*c83a76b0SSuyog Pawar *  @brief  Weighted pred of 2 predictor buffers as per spec
237*c83a76b0SSuyog Pawar *
238*c83a76b0SSuyog Pawar *  @param[in] pu1_pred0 : Pred0 buffer
239*c83a76b0SSuyog Pawar *
240*c83a76b0SSuyog Pawar *  @param[in] pu1_pred1 : Pred1 buffer
241*c83a76b0SSuyog Pawar *
242*c83a76b0SSuyog Pawar *  @param[in] pred0_strd : Stride of pred0 buffer
243*c83a76b0SSuyog Pawar *
244*c83a76b0SSuyog Pawar *  @param[in] pred1_strd : Stride of pred1 buffer
245*c83a76b0SSuyog Pawar *
246*c83a76b0SSuyog Pawar *  @param[in] wd : Width of pred block
247*c83a76b0SSuyog Pawar *
248*c83a76b0SSuyog Pawar *  @param[in] ht : Height of pred block
249*c83a76b0SSuyog Pawar *
250*c83a76b0SSuyog Pawar *  @param[out] pu1_dst : Destination buffer that will hold result
251*c83a76b0SSuyog Pawar *
252*c83a76b0SSuyog Pawar *  @param[in] dst_strd : Stride of dest buffer
253*c83a76b0SSuyog Pawar *
254*c83a76b0SSuyog Pawar *  @param[in] w0 : Weighting factor of Pred0
255*c83a76b0SSuyog Pawar *
256*c83a76b0SSuyog Pawar *  @param[in] w1 : weighting factor of pred1
257*c83a76b0SSuyog Pawar *
258*c83a76b0SSuyog Pawar *  @param[in] o0 : offset for pred0
259*c83a76b0SSuyog Pawar *
260*c83a76b0SSuyog Pawar *  @param[in] o1 : offset for pred1
261*c83a76b0SSuyog Pawar *
262*c83a76b0SSuyog Pawar *  @param[in] log_wdc : shift factor as per spec
263*c83a76b0SSuyog Pawar *
264*c83a76b0SSuyog Pawar *  @return none
265*c83a76b0SSuyog Pawar *
266*c83a76b0SSuyog Pawar ********************************************************************************
267*c83a76b0SSuyog Pawar */
ihevce_wt_avg_2d(UWORD8 * pu1_pred0,UWORD8 * pu1_pred1,WORD32 pred0_strd,WORD32 pred1_strd,WORD32 wd,WORD32 ht,UWORD8 * pu1_dst,WORD32 dst_strd,WORD32 w0,WORD32 w1,WORD32 o0,WORD32 o1,WORD32 log_wdc)268*c83a76b0SSuyog Pawar void ihevce_wt_avg_2d(
269*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred0,
270*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred1,
271*c83a76b0SSuyog Pawar     WORD32 pred0_strd,
272*c83a76b0SSuyog Pawar     WORD32 pred1_strd,
273*c83a76b0SSuyog Pawar     WORD32 wd,
274*c83a76b0SSuyog Pawar     WORD32 ht,
275*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
276*c83a76b0SSuyog Pawar     WORD32 dst_strd,
277*c83a76b0SSuyog Pawar     WORD32 w0,
278*c83a76b0SSuyog Pawar     WORD32 w1,
279*c83a76b0SSuyog Pawar     WORD32 o0,
280*c83a76b0SSuyog Pawar     WORD32 o1,
281*c83a76b0SSuyog Pawar     WORD32 log_wdc)
282*c83a76b0SSuyog Pawar {
283*c83a76b0SSuyog Pawar     /* Total Rounding term to be added, including offset */
284*c83a76b0SSuyog Pawar     WORD32 rnd = (o0 + o1 + 1) >> 1;  // << log_wdc;
285*c83a76b0SSuyog Pawar     /* Downshift */
286*c83a76b0SSuyog Pawar     WORD32 shift = log_wdc + 1;
287*c83a76b0SSuyog Pawar     /* loop counters */
288*c83a76b0SSuyog Pawar     WORD32 i, j;
289*c83a76b0SSuyog Pawar 
290*c83a76b0SSuyog Pawar     /* Dst = ((w0*p0 + w1*p1) + ((o0 + o1 + 1) << logWDc)) >> (logWDc + 1) */
291*c83a76b0SSuyog Pawar     /* In above formula, the additive term is constant and is evaluated    */
292*c83a76b0SSuyog Pawar     /* outside loop and stored as "rnd".                                   */
293*c83a76b0SSuyog Pawar     for(i = 0; i < ht; i++)
294*c83a76b0SSuyog Pawar     {
295*c83a76b0SSuyog Pawar         for(j = 0; j < wd; j++)
296*c83a76b0SSuyog Pawar         {
297*c83a76b0SSuyog Pawar             WORD32 tmp;
298*c83a76b0SSuyog Pawar             tmp = IHEVCE_WT_PRED(pu1_pred0[j], pu1_pred1[j], w0, w1, rnd, shift);
299*c83a76b0SSuyog Pawar             pu1_dst[j] = (UWORD8)(CLIP3(tmp, 0, 255));
300*c83a76b0SSuyog Pawar         }
301*c83a76b0SSuyog Pawar         pu1_pred0 += pred0_strd;
302*c83a76b0SSuyog Pawar         pu1_pred1 += pred1_strd;
303*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
304*c83a76b0SSuyog Pawar     }
305*c83a76b0SSuyog Pawar }
306*c83a76b0SSuyog Pawar /**
307*c83a76b0SSuyog Pawar ******************************************************************************
308*c83a76b0SSuyog Pawar *
309*c83a76b0SSuyog Pawar *  @brief Performs the Recon for DC only coefficient case
310*c83a76b0SSuyog Pawar *
311*c83a76b0SSuyog Pawar *  @par   Description
312*c83a76b0SSuyog Pawar *  This routine performs the Recon for DC only coefficient case
313*c83a76b0SSuyog Pawar *
314*c83a76b0SSuyog Pawar *  @param[inout]   pu1_dst
315*c83a76b0SSuyog Pawar *  pointer to the destination buffer
316*c83a76b0SSuyog Pawar *
317*c83a76b0SSuyog Pawar *  @param[in]   pu1_pred
318*c83a76b0SSuyog Pawar *  pointer to the pred buffer
319*c83a76b0SSuyog Pawar *
320*c83a76b0SSuyog Pawar *  @param[in]   dst_strd
321*c83a76b0SSuyog Pawar *  destination stride
322*c83a76b0SSuyog Pawar *
323*c83a76b0SSuyog Pawar *  @param[in]   pred_strd
324*c83a76b0SSuyog Pawar *  pred buffer stride
325*c83a76b0SSuyog Pawar *
326*c83a76b0SSuyog Pawar *  @param[in]   trans_size
327*c83a76b0SSuyog Pawar *  transform size
328*c83a76b0SSuyog Pawar *
329*c83a76b0SSuyog Pawar * @param[in] col_mult
330*c83a76b0SSuyog Pawar *  chroma multiplier
331*c83a76b0SSuyog Pawar *
332*c83a76b0SSuyog Pawar *  @param[in]   dc_value
333*c83a76b0SSuyog Pawar *  residue value
334*c83a76b0SSuyog Pawar *
335*c83a76b0SSuyog Pawar *  @return      none
336*c83a76b0SSuyog Pawar *
337*c83a76b0SSuyog Pawar ******************************************************************************
338*c83a76b0SSuyog Pawar */
ihevce_itrans_recon_dc_compute(UWORD8 * pu1_dst,UWORD8 * pu1_pred,WORD32 dst_strd,WORD32 pred_strd,WORD32 trans_size,WORD32 col_mult,WORD32 dc_value)339*c83a76b0SSuyog Pawar static INLINE void ihevce_itrans_recon_dc_compute(
340*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
341*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred,
342*c83a76b0SSuyog Pawar     WORD32 dst_strd,
343*c83a76b0SSuyog Pawar     WORD32 pred_strd,
344*c83a76b0SSuyog Pawar     WORD32 trans_size,
345*c83a76b0SSuyog Pawar     WORD32 col_mult,
346*c83a76b0SSuyog Pawar     WORD32 dc_value)
347*c83a76b0SSuyog Pawar {
348*c83a76b0SSuyog Pawar     WORD32 row, col;
349*c83a76b0SSuyog Pawar 
350*c83a76b0SSuyog Pawar     for(row = 0; row < trans_size; row++)
351*c83a76b0SSuyog Pawar     {
352*c83a76b0SSuyog Pawar         for(col = 0; col < trans_size; col++)
353*c83a76b0SSuyog Pawar         {
354*c83a76b0SSuyog Pawar             pu1_dst[row * dst_strd + col * col_mult] =
355*c83a76b0SSuyog Pawar                 CLIP_U8(pu1_pred[row * pred_strd + col * col_mult] + dc_value);
356*c83a76b0SSuyog Pawar         }
357*c83a76b0SSuyog Pawar     }
358*c83a76b0SSuyog Pawar }
359*c83a76b0SSuyog Pawar 
360*c83a76b0SSuyog Pawar /**
361*c83a76b0SSuyog Pawar ******************************************************************************
362*c83a76b0SSuyog Pawar *
363*c83a76b0SSuyog Pawar *  @brief Performs the IQ+IT+Recon for DC only coefficient case
364*c83a76b0SSuyog Pawar *
365*c83a76b0SSuyog Pawar *  @par   Description
366*c83a76b0SSuyog Pawar *  This routine performs the IQ+IT+Recon for DC only coefficient case
367*c83a76b0SSuyog Pawar *
368*c83a76b0SSuyog Pawar *  @param[in]   pu1_pred
369*c83a76b0SSuyog Pawar *  pointer to the pred buffer
370*c83a76b0SSuyog Pawar *
371*c83a76b0SSuyog Pawar *  @param[in]   pred_strd
372*c83a76b0SSuyog Pawar *  pred buffer stride
373*c83a76b0SSuyog Pawar *
374*c83a76b0SSuyog Pawar *  @param[inout]   pu1_dst
375*c83a76b0SSuyog Pawar *  pointer to the destination buffer
376*c83a76b0SSuyog Pawar *
377*c83a76b0SSuyog Pawar *  @param[in]   dst_strd
378*c83a76b0SSuyog Pawar *  destination stride
379*c83a76b0SSuyog Pawar *
380*c83a76b0SSuyog Pawar *  @param[in]   trans_size
381*c83a76b0SSuyog Pawar *  transform size
382*c83a76b0SSuyog Pawar *
383*c83a76b0SSuyog Pawar * @param[in] i2_deq_value
384*c83a76b0SSuyog Pawar *  Dequant Coeffs
385*c83a76b0SSuyog Pawar *
386*c83a76b0SSuyog Pawar *  @param[in] chroma plane
387*c83a76b0SSuyog Pawar *  -1 : luma, 0 : chroma U, 1 : chroma V
388*c83a76b0SSuyog Pawar *
389*c83a76b0SSuyog Pawar *  @return      none
390*c83a76b0SSuyog Pawar *
391*c83a76b0SSuyog Pawar ******************************************************************************
392*c83a76b0SSuyog Pawar */
ihevce_itrans_recon_dc(UWORD8 * pu1_pred,WORD32 pred_strd,UWORD8 * pu1_dst,WORD32 dst_strd,WORD32 trans_size,WORD16 i2_deq_value,CHROMA_PLANE_ID_T e_chroma_plane)393*c83a76b0SSuyog Pawar void ihevce_itrans_recon_dc(
394*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred,
395*c83a76b0SSuyog Pawar     WORD32 pred_strd,
396*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
397*c83a76b0SSuyog Pawar     WORD32 dst_strd,
398*c83a76b0SSuyog Pawar     WORD32 trans_size,
399*c83a76b0SSuyog Pawar     WORD16 i2_deq_value,
400*c83a76b0SSuyog Pawar     CHROMA_PLANE_ID_T e_chroma_plane)
401*c83a76b0SSuyog Pawar {
402*c83a76b0SSuyog Pawar     WORD32 add, shift;
403*c83a76b0SSuyog Pawar     WORD32 dc_value;
404*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred_tmp, *pu1_dst_tmp;
405*c83a76b0SSuyog Pawar     WORD32 col_mult;
406*c83a76b0SSuyog Pawar 
407*c83a76b0SSuyog Pawar     assert(e_chroma_plane == NULL_PLANE || e_chroma_plane == U_PLANE || e_chroma_plane == V_PLANE);
408*c83a76b0SSuyog Pawar     if(e_chroma_plane == NULL_PLANE)
409*c83a76b0SSuyog Pawar     {
410*c83a76b0SSuyog Pawar         pu1_pred_tmp = pu1_pred;
411*c83a76b0SSuyog Pawar         pu1_dst_tmp = pu1_dst;
412*c83a76b0SSuyog Pawar         col_mult = 1;
413*c83a76b0SSuyog Pawar     }
414*c83a76b0SSuyog Pawar     else
415*c83a76b0SSuyog Pawar     {
416*c83a76b0SSuyog Pawar         col_mult = 2;
417*c83a76b0SSuyog Pawar         pu1_pred_tmp = pu1_pred + e_chroma_plane;
418*c83a76b0SSuyog Pawar         pu1_dst_tmp = pu1_dst + e_chroma_plane;
419*c83a76b0SSuyog Pawar     }
420*c83a76b0SSuyog Pawar 
421*c83a76b0SSuyog Pawar     shift = IT_SHIFT_STAGE_1;
422*c83a76b0SSuyog Pawar     add = 1 << (shift - 1);
423*c83a76b0SSuyog Pawar     dc_value = CLIP_S16((i2_deq_value * 64 + add) >> shift);
424*c83a76b0SSuyog Pawar     shift = IT_SHIFT_STAGE_2;
425*c83a76b0SSuyog Pawar     add = 1 << (shift - 1);
426*c83a76b0SSuyog Pawar     dc_value = CLIP_S16((dc_value * 64 + add) >> shift);
427*c83a76b0SSuyog Pawar     ihevce_itrans_recon_dc_compute(
428*c83a76b0SSuyog Pawar         pu1_dst_tmp, pu1_pred_tmp, dst_strd, pred_strd, trans_size, col_mult, dc_value);
429*c83a76b0SSuyog Pawar }
430*c83a76b0SSuyog Pawar 
431*c83a76b0SSuyog Pawar /*!
432*c83a76b0SSuyog Pawar ******************************************************************************
433*c83a76b0SSuyog Pawar * \if Function name : ihevce_find_num_clusters_of_identical_points_1D \endif
434*c83a76b0SSuyog Pawar *
435*c83a76b0SSuyog Pawar * \brief
436*c83a76b0SSuyog Pawar *
437*c83a76b0SSuyog Pawar *
438*c83a76b0SSuyog Pawar *****************************************************************************
439*c83a76b0SSuyog Pawar */
ihevce_find_num_clusters_of_identical_points_1D(UWORD8 * pu1_inp_array,UWORD8 * pu1_out_array,UWORD8 * pu1_freq_of_out_data_in_inp,WORD32 i4_num_inp_array_elements)440*c83a76b0SSuyog Pawar WORD32 ihevce_find_num_clusters_of_identical_points_1D(
441*c83a76b0SSuyog Pawar     UWORD8 *pu1_inp_array,
442*c83a76b0SSuyog Pawar     UWORD8 *pu1_out_array,
443*c83a76b0SSuyog Pawar     UWORD8 *pu1_freq_of_out_data_in_inp,
444*c83a76b0SSuyog Pawar     WORD32 i4_num_inp_array_elements)
445*c83a76b0SSuyog Pawar {
446*c83a76b0SSuyog Pawar     WORD32 i;
447*c83a76b0SSuyog Pawar     UWORD8 u1_value = pu1_inp_array[0];
448*c83a76b0SSuyog Pawar     WORD32 i4_num_clusters = i4_num_inp_array_elements;
449*c83a76b0SSuyog Pawar     WORD32 i4_output_array_idx = 1;
450*c83a76b0SSuyog Pawar 
451*c83a76b0SSuyog Pawar     pu1_freq_of_out_data_in_inp[0] = 1;
452*c83a76b0SSuyog Pawar     pu1_out_array[0] = u1_value;
453*c83a76b0SSuyog Pawar 
454*c83a76b0SSuyog Pawar     if(1 == i4_num_inp_array_elements)
455*c83a76b0SSuyog Pawar     {
456*c83a76b0SSuyog Pawar         return 1;
457*c83a76b0SSuyog Pawar     }
458*c83a76b0SSuyog Pawar 
459*c83a76b0SSuyog Pawar     for(i = 1; i < i4_num_inp_array_elements; i++)
460*c83a76b0SSuyog Pawar     {
461*c83a76b0SSuyog Pawar         if(pu1_inp_array[i] == u1_value)
462*c83a76b0SSuyog Pawar         {
463*c83a76b0SSuyog Pawar             pu1_freq_of_out_data_in_inp[0]++;
464*c83a76b0SSuyog Pawar             i4_num_clusters--;
465*c83a76b0SSuyog Pawar         }
466*c83a76b0SSuyog Pawar         else
467*c83a76b0SSuyog Pawar         {
468*c83a76b0SSuyog Pawar             pu1_out_array[i4_output_array_idx] = pu1_inp_array[i];
469*c83a76b0SSuyog Pawar 
470*c83a76b0SSuyog Pawar             i4_output_array_idx++;
471*c83a76b0SSuyog Pawar         }
472*c83a76b0SSuyog Pawar     }
473*c83a76b0SSuyog Pawar 
474*c83a76b0SSuyog Pawar     if(i4_num_clusters > 1)
475*c83a76b0SSuyog Pawar     {
476*c83a76b0SSuyog Pawar         WORD32 i4_num_sub_clusters;
477*c83a76b0SSuyog Pawar 
478*c83a76b0SSuyog Pawar         i4_num_sub_clusters = ihevce_find_num_clusters_of_identical_points_1D(
479*c83a76b0SSuyog Pawar             &pu1_out_array[1],
480*c83a76b0SSuyog Pawar             &pu1_out_array[1],
481*c83a76b0SSuyog Pawar             &pu1_freq_of_out_data_in_inp[1],
482*c83a76b0SSuyog Pawar             i4_num_clusters - 1);
483*c83a76b0SSuyog Pawar 
484*c83a76b0SSuyog Pawar         i4_num_clusters = 1 + i4_num_sub_clusters;
485*c83a76b0SSuyog Pawar     }
486*c83a76b0SSuyog Pawar 
487*c83a76b0SSuyog Pawar     return i4_num_clusters;
488*c83a76b0SSuyog Pawar }
489*c83a76b0SSuyog Pawar 
490*c83a76b0SSuyog Pawar /**
491*c83a76b0SSuyog Pawar *******************************************************************************
492*c83a76b0SSuyog Pawar *
493*c83a76b0SSuyog Pawar * @brief Compare Motion vectors function
494*c83a76b0SSuyog Pawar *
495*c83a76b0SSuyog Pawar * @par Description:
496*c83a76b0SSuyog Pawar *   Checks if MVs and Reference idx are excatly matching.
497*c83a76b0SSuyog Pawar *
498*c83a76b0SSuyog Pawar * @param[inout] ps_1
499*c83a76b0SSuyog Pawar *   motion vector 1 to be compared
500*c83a76b0SSuyog Pawar *
501*c83a76b0SSuyog Pawar * @param[in] ps_2
502*c83a76b0SSuyog Pawar *   motion vector 2 to be compared
503*c83a76b0SSuyog Pawar *
504*c83a76b0SSuyog Pawar * @returns
505*c83a76b0SSuyog Pawar *  0 : if not matching 1 : if matching
506*c83a76b0SSuyog Pawar *
507*c83a76b0SSuyog Pawar * @remarks
508*c83a76b0SSuyog Pawar *
509*c83a76b0SSuyog Pawar *******************************************************************************
510*c83a76b0SSuyog Pawar */
ihevce_compare_pu_mv_t(pu_mv_t * ps_pu_mv_1,pu_mv_t * ps_pu_mv_2,WORD32 i4_pred_mode_1,WORD32 i4_pred_mode_2)511*c83a76b0SSuyog Pawar WORD32 ihevce_compare_pu_mv_t(
512*c83a76b0SSuyog Pawar     pu_mv_t *ps_pu_mv_1, pu_mv_t *ps_pu_mv_2, WORD32 i4_pred_mode_1, WORD32 i4_pred_mode_2)
513*c83a76b0SSuyog Pawar {
514*c83a76b0SSuyog Pawar     WORD32 i4_l0_match, i4_l1_match;
515*c83a76b0SSuyog Pawar     WORD32 i4_pred_l0, i4_pred_l1;
516*c83a76b0SSuyog Pawar 
517*c83a76b0SSuyog Pawar     i4_pred_l0 = (i4_pred_mode_1 != PRED_L1);
518*c83a76b0SSuyog Pawar     i4_pred_l1 = (i4_pred_mode_1 != PRED_L0);
519*c83a76b0SSuyog Pawar 
520*c83a76b0SSuyog Pawar     if(i4_pred_mode_1 != i4_pred_mode_2)
521*c83a76b0SSuyog Pawar         return 0;
522*c83a76b0SSuyog Pawar 
523*c83a76b0SSuyog Pawar     i4_l0_match = 0;
524*c83a76b0SSuyog Pawar     i4_l1_match = 0;
525*c83a76b0SSuyog Pawar 
526*c83a76b0SSuyog Pawar     if(i4_pred_l0)
527*c83a76b0SSuyog Pawar     {
528*c83a76b0SSuyog Pawar         if(ps_pu_mv_1->i1_l0_ref_idx == ps_pu_mv_2->i1_l0_ref_idx)
529*c83a76b0SSuyog Pawar         {
530*c83a76b0SSuyog Pawar             if(0 == memcmp(&ps_pu_mv_1->s_l0_mv, &ps_pu_mv_2->s_l0_mv, sizeof(mv_t)))
531*c83a76b0SSuyog Pawar                 i4_l0_match = 1;
532*c83a76b0SSuyog Pawar         }
533*c83a76b0SSuyog Pawar     }
534*c83a76b0SSuyog Pawar     if(i4_pred_l1)
535*c83a76b0SSuyog Pawar     {
536*c83a76b0SSuyog Pawar         if(ps_pu_mv_1->i1_l1_ref_idx == ps_pu_mv_2->i1_l1_ref_idx)
537*c83a76b0SSuyog Pawar         {
538*c83a76b0SSuyog Pawar             if(0 == memcmp(&ps_pu_mv_1->s_l1_mv, &ps_pu_mv_2->s_l1_mv, sizeof(mv_t)))
539*c83a76b0SSuyog Pawar                 i4_l1_match = 1;
540*c83a76b0SSuyog Pawar         }
541*c83a76b0SSuyog Pawar     }
542*c83a76b0SSuyog Pawar 
543*c83a76b0SSuyog Pawar     if(i4_pred_l0 && i4_pred_l1)
544*c83a76b0SSuyog Pawar         return (i4_l0_match & i4_l1_match);
545*c83a76b0SSuyog Pawar     else if(i4_pred_l0)
546*c83a76b0SSuyog Pawar         return i4_l0_match;
547*c83a76b0SSuyog Pawar     else
548*c83a76b0SSuyog Pawar         return i4_l1_match;
549*c83a76b0SSuyog Pawar 
550*c83a76b0SSuyog Pawar } /* End of ihevce_compare_pu_mv_t */
551*c83a76b0SSuyog Pawar 
552*c83a76b0SSuyog Pawar /*!
553*c83a76b0SSuyog Pawar ******************************************************************************
554*c83a76b0SSuyog Pawar * \if Function name : ihevce_set_pred_buf_as_free \endif
555*c83a76b0SSuyog Pawar *
556*c83a76b0SSuyog Pawar * \brief
557*c83a76b0SSuyog Pawar *    Mark buffer as free
558*c83a76b0SSuyog Pawar *
559*c83a76b0SSuyog Pawar *****************************************************************************
560*c83a76b0SSuyog Pawar */
ihevce_set_pred_buf_as_free(UWORD32 * pu4_idx_array,UWORD8 u1_buf_id)561*c83a76b0SSuyog Pawar void ihevce_set_pred_buf_as_free(UWORD32 *pu4_idx_array, UWORD8 u1_buf_id)
562*c83a76b0SSuyog Pawar {
563*c83a76b0SSuyog Pawar     (*pu4_idx_array) &= ~(1 << u1_buf_id);
564*c83a76b0SSuyog Pawar }
565*c83a76b0SSuyog Pawar 
566*c83a76b0SSuyog Pawar /*!
567*c83a76b0SSuyog Pawar ******************************************************************************
568*c83a76b0SSuyog Pawar * \if Function name : ihevce_get_free_pred_buf_indices \endif
569*c83a76b0SSuyog Pawar *
570*c83a76b0SSuyog Pawar * \brief
571*c83a76b0SSuyog Pawar *    get free buffer indices
572*c83a76b0SSuyog Pawar *
573*c83a76b0SSuyog Pawar *****************************************************************************
574*c83a76b0SSuyog Pawar */
ihevce_get_free_pred_buf_indices(UWORD8 * pu1_idx_array,UWORD32 * pu4_bitfield,UWORD8 u1_num_bufs_requested)575*c83a76b0SSuyog Pawar UWORD8 ihevce_get_free_pred_buf_indices(
576*c83a76b0SSuyog Pawar     UWORD8 *pu1_idx_array, UWORD32 *pu4_bitfield, UWORD8 u1_num_bufs_requested)
577*c83a76b0SSuyog Pawar {
578*c83a76b0SSuyog Pawar     UWORD8 i;
579*c83a76b0SSuyog Pawar 
580*c83a76b0SSuyog Pawar     UWORD8 u1_num_free_bufs_found = 0;
581*c83a76b0SSuyog Pawar     UWORD32 u4_local_bitfield = *pu4_bitfield;
582*c83a76b0SSuyog Pawar 
583*c83a76b0SSuyog Pawar     ASSERT(u1_num_bufs_requested <= (32 - ihevce_num_ones_generic(u4_local_bitfield)));
584*c83a76b0SSuyog Pawar 
585*c83a76b0SSuyog Pawar     for(i = 0; u1_num_free_bufs_found < u1_num_bufs_requested; i++)
586*c83a76b0SSuyog Pawar     {
587*c83a76b0SSuyog Pawar         if(!(u4_local_bitfield & (1 << i)))
588*c83a76b0SSuyog Pawar         {
589*c83a76b0SSuyog Pawar             pu1_idx_array[u1_num_free_bufs_found++] = i;
590*c83a76b0SSuyog Pawar             u4_local_bitfield |= (1 << i);
591*c83a76b0SSuyog Pawar         }
592*c83a76b0SSuyog Pawar     }
593*c83a76b0SSuyog Pawar 
594*c83a76b0SSuyog Pawar     (*pu4_bitfield) = u4_local_bitfield;
595*c83a76b0SSuyog Pawar 
596*c83a76b0SSuyog Pawar     return u1_num_free_bufs_found;
597*c83a76b0SSuyog Pawar }
598*c83a76b0SSuyog Pawar 
599*c83a76b0SSuyog Pawar /*!
600*c83a76b0SSuyog Pawar ******************************************************************************
601*c83a76b0SSuyog Pawar * \if Function name : ihevce_scale_mv \endif
602*c83a76b0SSuyog Pawar *
603*c83a76b0SSuyog Pawar * \brief
604*c83a76b0SSuyog Pawar *    Scale mv basing on displacement of POC
605*c83a76b0SSuyog Pawar *
606*c83a76b0SSuyog Pawar *****************************************************************************
607*c83a76b0SSuyog Pawar */
ihevce_scale_mv(mv_t * ps_mv,WORD32 i4_poc_to,WORD32 i4_poc_from,WORD32 i4_curr_poc)608*c83a76b0SSuyog Pawar void ihevce_scale_mv(mv_t *ps_mv, WORD32 i4_poc_to, WORD32 i4_poc_from, WORD32 i4_curr_poc)
609*c83a76b0SSuyog Pawar {
610*c83a76b0SSuyog Pawar     WORD32 td, tb, tx;
611*c83a76b0SSuyog Pawar     WORD32 dist_scale_factor;
612*c83a76b0SSuyog Pawar     WORD32 mvx, mvy;
613*c83a76b0SSuyog Pawar 
614*c83a76b0SSuyog Pawar     td = CLIP_S8(i4_curr_poc - i4_poc_from);
615*c83a76b0SSuyog Pawar     tb = CLIP_S8(i4_curr_poc - i4_poc_to);
616*c83a76b0SSuyog Pawar 
617*c83a76b0SSuyog Pawar     tx = (16384 + (abs(td) >> 1)) / td;
618*c83a76b0SSuyog Pawar 
619*c83a76b0SSuyog Pawar     dist_scale_factor = (tb * tx + 32) >> 6;
620*c83a76b0SSuyog Pawar     dist_scale_factor = CLIP3(dist_scale_factor, -4096, 4095);
621*c83a76b0SSuyog Pawar 
622*c83a76b0SSuyog Pawar     mvx = ps_mv->i2_mvx;
623*c83a76b0SSuyog Pawar     mvy = ps_mv->i2_mvy;
624*c83a76b0SSuyog Pawar 
625*c83a76b0SSuyog Pawar     mvx = SIGN(dist_scale_factor * mvx) * ((abs(dist_scale_factor * mvx) + 127) >> 8);
626*c83a76b0SSuyog Pawar     mvy = SIGN(dist_scale_factor * mvy) * ((abs(dist_scale_factor * mvy) + 127) >> 8);
627*c83a76b0SSuyog Pawar 
628*c83a76b0SSuyog Pawar     ps_mv->i2_mvx = CLIP_S16(mvx);
629*c83a76b0SSuyog Pawar     ps_mv->i2_mvy = CLIP_S16(mvy);
630*c83a76b0SSuyog Pawar }
631*c83a76b0SSuyog Pawar 
632*c83a76b0SSuyog Pawar /*!
633*c83a76b0SSuyog Pawar ******************************************************************************
634*c83a76b0SSuyog Pawar * \if Function name : ihevce_osal_alloc \endif
635*c83a76b0SSuyog Pawar *
636*c83a76b0SSuyog Pawar * \brief
637*c83a76b0SSuyog Pawar *    Memory allocate call back function passed to OSAL
638*c83a76b0SSuyog Pawar *
639*c83a76b0SSuyog Pawar * \param[in] pv_handle : handle to hle ctxt
640*c83a76b0SSuyog Pawar * \param[in] u4_size : size of memory required
641*c83a76b0SSuyog Pawar *
642*c83a76b0SSuyog Pawar * \return
643*c83a76b0SSuyog Pawar *    Memory pointer
644*c83a76b0SSuyog Pawar *
645*c83a76b0SSuyog Pawar * \author
646*c83a76b0SSuyog Pawar *  Ittiam
647*c83a76b0SSuyog Pawar *
648*c83a76b0SSuyog Pawar *****************************************************************************
649*c83a76b0SSuyog Pawar */
ihevce_osal_alloc(void * pv_handle,UWORD32 u4_size)650*c83a76b0SSuyog Pawar void *ihevce_osal_alloc(void *pv_handle, UWORD32 u4_size)
651*c83a76b0SSuyog Pawar {
652*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_hle_ctxt = (ihevce_hle_ctxt_t *)pv_handle;
653*c83a76b0SSuyog Pawar     iv_mem_rec_t s_mem_tab;
654*c83a76b0SSuyog Pawar 
655*c83a76b0SSuyog Pawar     /* def init of memtab */
656*c83a76b0SSuyog Pawar     s_mem_tab.i4_size = sizeof(iv_mem_rec_t);
657*c83a76b0SSuyog Pawar     s_mem_tab.i4_mem_alignment = 8;
658*c83a76b0SSuyog Pawar     s_mem_tab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
659*c83a76b0SSuyog Pawar 
660*c83a76b0SSuyog Pawar     /* allocate memory for required size */
661*c83a76b0SSuyog Pawar     s_mem_tab.i4_mem_size = u4_size;
662*c83a76b0SSuyog Pawar 
663*c83a76b0SSuyog Pawar     ps_hle_ctxt->ihevce_mem_alloc(
664*c83a76b0SSuyog Pawar         ps_hle_ctxt->pv_mem_mgr_hdl, &ps_hle_ctxt->ps_static_cfg_prms->s_sys_api, &s_mem_tab);
665*c83a76b0SSuyog Pawar 
666*c83a76b0SSuyog Pawar     return (s_mem_tab.pv_base);
667*c83a76b0SSuyog Pawar }
668*c83a76b0SSuyog Pawar 
669*c83a76b0SSuyog Pawar /*!
670*c83a76b0SSuyog Pawar ******************************************************************************
671*c83a76b0SSuyog Pawar * \if Function name : ihevce_osal_free \endif
672*c83a76b0SSuyog Pawar *
673*c83a76b0SSuyog Pawar * \brief
674*c83a76b0SSuyog Pawar *    Memory free call back function passed to OSAL
675*c83a76b0SSuyog Pawar *
676*c83a76b0SSuyog Pawar * \param[in] pv_handle : handle to hle ctxt
677*c83a76b0SSuyog Pawar * \param[in] pv_mem : memory to be freed
678*c83a76b0SSuyog Pawar *
679*c83a76b0SSuyog Pawar * \return
680*c83a76b0SSuyog Pawar *    none
681*c83a76b0SSuyog Pawar *
682*c83a76b0SSuyog Pawar * \author
683*c83a76b0SSuyog Pawar *  Ittiam
684*c83a76b0SSuyog Pawar *
685*c83a76b0SSuyog Pawar *****************************************************************************
686*c83a76b0SSuyog Pawar */
ihevce_osal_free(void * pv_handle,void * pv_mem)687*c83a76b0SSuyog Pawar void ihevce_osal_free(void *pv_handle, void *pv_mem)
688*c83a76b0SSuyog Pawar {
689*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_hle_ctxt = (ihevce_hle_ctxt_t *)pv_handle;
690*c83a76b0SSuyog Pawar     iv_mem_rec_t s_mem_tab;
691*c83a76b0SSuyog Pawar 
692*c83a76b0SSuyog Pawar     /* def init of memtab */
693*c83a76b0SSuyog Pawar     s_mem_tab.i4_size = sizeof(iv_mem_rec_t);
694*c83a76b0SSuyog Pawar     s_mem_tab.i4_mem_alignment = 8;
695*c83a76b0SSuyog Pawar     s_mem_tab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
696*c83a76b0SSuyog Pawar 
697*c83a76b0SSuyog Pawar     /* free memory */
698*c83a76b0SSuyog Pawar     s_mem_tab.pv_base = pv_mem;
699*c83a76b0SSuyog Pawar 
700*c83a76b0SSuyog Pawar     ps_hle_ctxt->ihevce_mem_free(ps_hle_ctxt->pv_mem_mgr_hdl, &s_mem_tab);
701*c83a76b0SSuyog Pawar 
702*c83a76b0SSuyog Pawar     return;
703*c83a76b0SSuyog Pawar }
704*c83a76b0SSuyog Pawar 
705*c83a76b0SSuyog Pawar /*!
706*c83a76b0SSuyog Pawar ******************************************************************************
707*c83a76b0SSuyog Pawar * \if Function name : ihevce_osal_init \endif
708*c83a76b0SSuyog Pawar *
709*c83a76b0SSuyog Pawar * \brief
710*c83a76b0SSuyog Pawar *    Function to initialise OSAL handle
711*c83a76b0SSuyog Pawar *
712*c83a76b0SSuyog Pawar * \return
713*c83a76b0SSuyog Pawar *    None
714*c83a76b0SSuyog Pawar *
715*c83a76b0SSuyog Pawar * \author
716*c83a76b0SSuyog Pawar *  Ittiam
717*c83a76b0SSuyog Pawar *
718*c83a76b0SSuyog Pawar *****************************************************************************
719*c83a76b0SSuyog Pawar */
ihevce_osal_init(void * pv_hle_ctxt)720*c83a76b0SSuyog Pawar WORD32 ihevce_osal_init(void *pv_hle_ctxt)
721*c83a76b0SSuyog Pawar {
722*c83a76b0SSuyog Pawar     /* local variables */
723*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_hle_ctxt;
724*c83a76b0SSuyog Pawar     osal_cb_funcs_t s_cb_funcs;
725*c83a76b0SSuyog Pawar     WORD32 status = 0;
726*c83a76b0SSuyog Pawar     void *pv_osal_handle;
727*c83a76b0SSuyog Pawar     iv_mem_rec_t s_mem_tab;
728*c83a76b0SSuyog Pawar 
729*c83a76b0SSuyog Pawar     ps_hle_ctxt = (ihevce_hle_ctxt_t *)pv_hle_ctxt;
730*c83a76b0SSuyog Pawar 
731*c83a76b0SSuyog Pawar     /* def init of memtab */
732*c83a76b0SSuyog Pawar     s_mem_tab.i4_size = sizeof(iv_mem_rec_t);
733*c83a76b0SSuyog Pawar     s_mem_tab.i4_mem_alignment = 8;
734*c83a76b0SSuyog Pawar     s_mem_tab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
735*c83a76b0SSuyog Pawar 
736*c83a76b0SSuyog Pawar     /* --------------------------------------------------------------------- */
737*c83a76b0SSuyog Pawar     /*                      OSAL Hanndle create                              */
738*c83a76b0SSuyog Pawar     /* --------------------------------------------------------------------- */
739*c83a76b0SSuyog Pawar 
740*c83a76b0SSuyog Pawar     /* Allocate memory for the handle */
741*c83a76b0SSuyog Pawar     s_mem_tab.i4_mem_size = OSAL_HANDLE_SIZE;
742*c83a76b0SSuyog Pawar 
743*c83a76b0SSuyog Pawar     ps_hle_ctxt->ihevce_mem_alloc(
744*c83a76b0SSuyog Pawar         ps_hle_ctxt->pv_mem_mgr_hdl, &ps_hle_ctxt->ps_static_cfg_prms->s_sys_api, &s_mem_tab);
745*c83a76b0SSuyog Pawar     if(NULL == s_mem_tab.pv_base)
746*c83a76b0SSuyog Pawar     {
747*c83a76b0SSuyog Pawar         ps_hle_ctxt->ps_static_cfg_prms->s_sys_api.ihevce_printf(
748*c83a76b0SSuyog Pawar             ps_hle_ctxt->ps_static_cfg_prms->s_sys_api.pv_cb_handle,
749*c83a76b0SSuyog Pawar             "IHEVCE ERROR: Error in OSAL initialization\n");
750*c83a76b0SSuyog Pawar         return (-1);
751*c83a76b0SSuyog Pawar     }
752*c83a76b0SSuyog Pawar 
753*c83a76b0SSuyog Pawar     pv_osal_handle = s_mem_tab.pv_base;
754*c83a76b0SSuyog Pawar 
755*c83a76b0SSuyog Pawar     /* Initialize OSAL call back functions */
756*c83a76b0SSuyog Pawar     s_cb_funcs.mmr_handle = (void *)ps_hle_ctxt;
757*c83a76b0SSuyog Pawar     s_cb_funcs.osal_alloc = &ihevce_osal_alloc;
758*c83a76b0SSuyog Pawar     s_cb_funcs.osal_free = &ihevce_osal_free;
759*c83a76b0SSuyog Pawar 
760*c83a76b0SSuyog Pawar     status = osal_init(pv_osal_handle);
761*c83a76b0SSuyog Pawar     if(OSAL_SUCCESS != status)
762*c83a76b0SSuyog Pawar     {
763*c83a76b0SSuyog Pawar         ps_hle_ctxt->ps_static_cfg_prms->s_sys_api.ihevce_printf(
764*c83a76b0SSuyog Pawar             ps_hle_ctxt->ps_static_cfg_prms->s_sys_api.pv_cb_handle,
765*c83a76b0SSuyog Pawar             "IHEVCE ERROR: Error in OSAL initialization\n");
766*c83a76b0SSuyog Pawar         return (-1);
767*c83a76b0SSuyog Pawar     }
768*c83a76b0SSuyog Pawar 
769*c83a76b0SSuyog Pawar     status = osal_register_callbacks(pv_osal_handle, &s_cb_funcs);
770*c83a76b0SSuyog Pawar     if(OSAL_SUCCESS != status)
771*c83a76b0SSuyog Pawar     {
772*c83a76b0SSuyog Pawar         ps_hle_ctxt->ps_static_cfg_prms->s_sys_api.ihevce_printf(
773*c83a76b0SSuyog Pawar             ps_hle_ctxt->ps_static_cfg_prms->s_sys_api.pv_cb_handle,
774*c83a76b0SSuyog Pawar             "IHEVCE ERROR: Error in OSAL initialization\n");
775*c83a76b0SSuyog Pawar         return (-1);
776*c83a76b0SSuyog Pawar     }
777*c83a76b0SSuyog Pawar     ps_hle_ctxt->pv_osal_handle = pv_osal_handle;
778*c83a76b0SSuyog Pawar 
779*c83a76b0SSuyog Pawar     return (0);
780*c83a76b0SSuyog Pawar }
781*c83a76b0SSuyog Pawar 
782*c83a76b0SSuyog Pawar /*!
783*c83a76b0SSuyog Pawar ******************************************************************************
784*c83a76b0SSuyog Pawar * \if Function name : ihevce_osal_delete \endif
785*c83a76b0SSuyog Pawar *
786*c83a76b0SSuyog Pawar * \brief
787*c83a76b0SSuyog Pawar *    Function to delete OSAL handle
788*c83a76b0SSuyog Pawar *
789*c83a76b0SSuyog Pawar * \return
790*c83a76b0SSuyog Pawar *    None
791*c83a76b0SSuyog Pawar *
792*c83a76b0SSuyog Pawar * \author
793*c83a76b0SSuyog Pawar *  Ittiam
794*c83a76b0SSuyog Pawar *
795*c83a76b0SSuyog Pawar *****************************************************************************
796*c83a76b0SSuyog Pawar */
ihevce_osal_delete(void * pv_hle_ctxt)797*c83a76b0SSuyog Pawar WORD32 ihevce_osal_delete(void *pv_hle_ctxt)
798*c83a76b0SSuyog Pawar {
799*c83a76b0SSuyog Pawar     /* local variables */
800*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_hle_ctxt;
801*c83a76b0SSuyog Pawar     void *pv_osal_handle;
802*c83a76b0SSuyog Pawar     iv_mem_rec_t s_mem_tab;
803*c83a76b0SSuyog Pawar 
804*c83a76b0SSuyog Pawar     ps_hle_ctxt = (ihevce_hle_ctxt_t *)pv_hle_ctxt;
805*c83a76b0SSuyog Pawar     pv_osal_handle = ps_hle_ctxt->pv_osal_handle;
806*c83a76b0SSuyog Pawar 
807*c83a76b0SSuyog Pawar     /* def init of memtab */
808*c83a76b0SSuyog Pawar     s_mem_tab.i4_size = sizeof(iv_mem_rec_t);
809*c83a76b0SSuyog Pawar     s_mem_tab.i4_mem_alignment = 8;
810*c83a76b0SSuyog Pawar     s_mem_tab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
811*c83a76b0SSuyog Pawar 
812*c83a76b0SSuyog Pawar     if(0 != osal_close(pv_osal_handle))
813*c83a76b0SSuyog Pawar     {
814*c83a76b0SSuyog Pawar         ps_hle_ctxt->ps_static_cfg_prms->s_sys_api.ihevce_printf(
815*c83a76b0SSuyog Pawar             ps_hle_ctxt->ps_static_cfg_prms->s_sys_api.pv_cb_handle,
816*c83a76b0SSuyog Pawar             "IHEVCE ERROR>> Unable to close OSAL\n");
817*c83a76b0SSuyog Pawar         return (-1);
818*c83a76b0SSuyog Pawar     }
819*c83a76b0SSuyog Pawar 
820*c83a76b0SSuyog Pawar     /* free osal handle */
821*c83a76b0SSuyog Pawar     s_mem_tab.pv_base = pv_osal_handle;
822*c83a76b0SSuyog Pawar 
823*c83a76b0SSuyog Pawar     ps_hle_ctxt->ihevce_mem_free(ps_hle_ctxt->pv_mem_mgr_hdl, &s_mem_tab);
824*c83a76b0SSuyog Pawar 
825*c83a76b0SSuyog Pawar     return (0);
826*c83a76b0SSuyog Pawar }
827*c83a76b0SSuyog Pawar 
828*c83a76b0SSuyog Pawar /**
829*c83a76b0SSuyog Pawar *******************************************************************************
830*c83a76b0SSuyog Pawar *
831*c83a76b0SSuyog Pawar * @brief
832*c83a76b0SSuyog Pawar *  Compute SSD between two blocks (8 bit input)
833*c83a76b0SSuyog Pawar *
834*c83a76b0SSuyog Pawar * @par Description:
835*c83a76b0SSuyog Pawar *
836*c83a76b0SSuyog Pawar * @param[in] pu1_inp
837*c83a76b0SSuyog Pawar *  UWORD8 pointer to the src block
838*c83a76b0SSuyog Pawar *
839*c83a76b0SSuyog Pawar * @param[in] pu1_ref
840*c83a76b0SSuyog Pawar *  UWORD8 pointer to the ref block
841*c83a76b0SSuyog Pawar *
842*c83a76b0SSuyog Pawar * @param[in] inp_stride
843*c83a76b0SSuyog Pawar *  UWORD32 Source stride
844*c83a76b0SSuyog Pawar *
845*c83a76b0SSuyog Pawar * @param[in] ref_stride
846*c83a76b0SSuyog Pawar *  UWORD32 ref stride
847*c83a76b0SSuyog Pawar *
848*c83a76b0SSuyog Pawar * @param[in] wd
849*c83a76b0SSuyog Pawar *  UWORD32 width of the block
850*c83a76b0SSuyog Pawar *
851*c83a76b0SSuyog Pawar * @param[in] ht
852*c83a76b0SSuyog Pawar *  UWORD32 height of the block
853*c83a76b0SSuyog Pawar *
854*c83a76b0SSuyog Pawar * @returns SSD
855*c83a76b0SSuyog Pawar *
856*c83a76b0SSuyog Pawar * @remarks none
857*c83a76b0SSuyog Pawar *
858*c83a76b0SSuyog Pawar *******************************************************************************
859*c83a76b0SSuyog Pawar */
ihevce_ssd_calculator(UWORD8 * pu1_inp,UWORD8 * pu1_ref,UWORD32 inp_stride,UWORD32 ref_stride,UWORD32 wd,UWORD32 ht,CHROMA_PLANE_ID_T chroma_plane)860*c83a76b0SSuyog Pawar LWORD64 ihevce_ssd_calculator(
861*c83a76b0SSuyog Pawar     UWORD8 *pu1_inp, UWORD8 *pu1_ref, UWORD32 inp_stride, UWORD32 ref_stride, UWORD32 wd,
862*c83a76b0SSuyog Pawar     UWORD32 ht, CHROMA_PLANE_ID_T chroma_plane)
863*c83a76b0SSuyog Pawar {
864*c83a76b0SSuyog Pawar     UWORD32 i, j;
865*c83a76b0SSuyog Pawar     LWORD64 ssd = 0;
866*c83a76b0SSuyog Pawar     UNUSED(chroma_plane);
867*c83a76b0SSuyog Pawar     for(i = 0; i < ht; i++)
868*c83a76b0SSuyog Pawar     {
869*c83a76b0SSuyog Pawar         for(j = 0; j < wd; j++)
870*c83a76b0SSuyog Pawar         {
871*c83a76b0SSuyog Pawar             ssd += (pu1_inp[j] - pu1_ref[j]) * (pu1_inp[j] - pu1_ref[j]);
872*c83a76b0SSuyog Pawar         }
873*c83a76b0SSuyog Pawar 
874*c83a76b0SSuyog Pawar         pu1_inp += inp_stride;
875*c83a76b0SSuyog Pawar         pu1_ref += ref_stride;
876*c83a76b0SSuyog Pawar     }
877*c83a76b0SSuyog Pawar 
878*c83a76b0SSuyog Pawar     return ssd;
879*c83a76b0SSuyog Pawar }
880*c83a76b0SSuyog Pawar 
881*c83a76b0SSuyog Pawar /**
882*c83a76b0SSuyog Pawar *******************************************************************************
883*c83a76b0SSuyog Pawar *
884*c83a76b0SSuyog Pawar * @brief
885*c83a76b0SSuyog Pawar *  Compute SSD between two blocks (8 bit input, chroma interleaved input)
886*c83a76b0SSuyog Pawar *
887*c83a76b0SSuyog Pawar * @par Description:
888*c83a76b0SSuyog Pawar *
889*c83a76b0SSuyog Pawar * @param[in] pu1_inp
890*c83a76b0SSuyog Pawar *  UWORD8 pointer to the src block
891*c83a76b0SSuyog Pawar *
892*c83a76b0SSuyog Pawar * @param[in] pu1_ref
893*c83a76b0SSuyog Pawar *  UWORD8 pointer to the ref block
894*c83a76b0SSuyog Pawar *
895*c83a76b0SSuyog Pawar * @param[in] inp_stride
896*c83a76b0SSuyog Pawar *  UWORD32 Source stride
897*c83a76b0SSuyog Pawar *
898*c83a76b0SSuyog Pawar * @param[in] ref_stride
899*c83a76b0SSuyog Pawar *  UWORD32 ref stride
900*c83a76b0SSuyog Pawar *
901*c83a76b0SSuyog Pawar * @param[in] wd
902*c83a76b0SSuyog Pawar *  UWORD32 width of the block
903*c83a76b0SSuyog Pawar *
904*c83a76b0SSuyog Pawar * @param[in] ht
905*c83a76b0SSuyog Pawar *  UWORD32 height of the block
906*c83a76b0SSuyog Pawar *
907*c83a76b0SSuyog Pawar * @returns SSD
908*c83a76b0SSuyog Pawar *
909*c83a76b0SSuyog Pawar * @remarks none
910*c83a76b0SSuyog Pawar *
911*c83a76b0SSuyog Pawar *******************************************************************************
912*c83a76b0SSuyog Pawar */
ihevce_chroma_interleave_ssd_calculator(UWORD8 * pu1_inp,UWORD8 * pu1_ref,UWORD32 inp_stride,UWORD32 ref_stride,UWORD32 wd,UWORD32 ht,CHROMA_PLANE_ID_T chroma_plane)913*c83a76b0SSuyog Pawar LWORD64 ihevce_chroma_interleave_ssd_calculator(
914*c83a76b0SSuyog Pawar     UWORD8 *pu1_inp, UWORD8 *pu1_ref, UWORD32 inp_stride, UWORD32 ref_stride, UWORD32 wd,
915*c83a76b0SSuyog Pawar     UWORD32 ht, CHROMA_PLANE_ID_T chroma_plane)
916*c83a76b0SSuyog Pawar {
917*c83a76b0SSuyog Pawar     UWORD32 i, j;
918*c83a76b0SSuyog Pawar     LWORD64 ssd = 0;
919*c83a76b0SSuyog Pawar     pu1_inp += chroma_plane;
920*c83a76b0SSuyog Pawar     pu1_ref += chroma_plane;
921*c83a76b0SSuyog Pawar 
922*c83a76b0SSuyog Pawar     /* run a loop and find the ssd by doing diff followed by square */
923*c83a76b0SSuyog Pawar     for(i = 0; i < ht; i++)
924*c83a76b0SSuyog Pawar     {
925*c83a76b0SSuyog Pawar         for(j = 0; j < wd; j++)
926*c83a76b0SSuyog Pawar         {
927*c83a76b0SSuyog Pawar             WORD32 val;
928*c83a76b0SSuyog Pawar 
929*c83a76b0SSuyog Pawar             /* note that chroma is interleaved */
930*c83a76b0SSuyog Pawar             val = pu1_inp[j * 2] - pu1_ref[j * 2];
931*c83a76b0SSuyog Pawar             ssd += val * val;
932*c83a76b0SSuyog Pawar         }
933*c83a76b0SSuyog Pawar         /* row level update */
934*c83a76b0SSuyog Pawar         pu1_inp += inp_stride;
935*c83a76b0SSuyog Pawar         pu1_ref += ref_stride;
936*c83a76b0SSuyog Pawar     }
937*c83a76b0SSuyog Pawar 
938*c83a76b0SSuyog Pawar     return (ssd);
939*c83a76b0SSuyog Pawar }
940*c83a76b0SSuyog Pawar 
941*c83a76b0SSuyog Pawar /**
942*c83a76b0SSuyog Pawar *******************************************************************************
943*c83a76b0SSuyog Pawar *
944*c83a76b0SSuyog Pawar * @brief
945*c83a76b0SSuyog Pawar *  Compute SSD & SAD between two blocks (8 bit input)
946*c83a76b0SSuyog Pawar *
947*c83a76b0SSuyog Pawar * @par Description:
948*c83a76b0SSuyog Pawar *
949*c83a76b0SSuyog Pawar * @param[in] pu1_recon
950*c83a76b0SSuyog Pawar *  UWORD8 pointer to the block 1
951*c83a76b0SSuyog Pawar *
952*c83a76b0SSuyog Pawar * @param[in] recon_strd
953*c83a76b0SSuyog Pawar *  UWORD32 stride of block 1
954*c83a76b0SSuyog Pawar *
955*c83a76b0SSuyog Pawar * @param[in] pu1_src
956*c83a76b0SSuyog Pawar *  UWORD8 pointer to the block 2
957*c83a76b0SSuyog Pawar *
958*c83a76b0SSuyog Pawar * @param[in] src_strd
959*c83a76b0SSuyog Pawar *  UWORD32 stride of block 2
960*c83a76b0SSuyog Pawar *
961*c83a76b0SSuyog Pawar * @param[in] trans_size
962*c83a76b0SSuyog Pawar *  UWORD32 block wd/ht
963*c83a76b0SSuyog Pawar *
964*c83a76b0SSuyog Pawar * @param[out] *pu4_blk_sad
965*c83a76b0SSuyog Pawar *  UWORD32 block SAD
966*c83a76b0SSuyog Pawar *
967*c83a76b0SSuyog Pawar * @returns SSD
968*c83a76b0SSuyog Pawar *
969*c83a76b0SSuyog Pawar * @remarks none
970*c83a76b0SSuyog Pawar *
971*c83a76b0SSuyog Pawar *******************************************************************************
972*c83a76b0SSuyog Pawar */
ihevce_ssd_and_sad_calculator(UWORD8 * pu1_recon,WORD32 recon_strd,UWORD8 * pu1_src,WORD32 src_strd,WORD32 trans_size,UWORD32 * pu4_blk_sad)973*c83a76b0SSuyog Pawar LWORD64 ihevce_ssd_and_sad_calculator(
974*c83a76b0SSuyog Pawar     UWORD8 *pu1_recon,
975*c83a76b0SSuyog Pawar     WORD32 recon_strd,
976*c83a76b0SSuyog Pawar     UWORD8 *pu1_src,
977*c83a76b0SSuyog Pawar     WORD32 src_strd,
978*c83a76b0SSuyog Pawar     WORD32 trans_size,
979*c83a76b0SSuyog Pawar     UWORD32 *pu4_blk_sad)
980*c83a76b0SSuyog Pawar {
981*c83a76b0SSuyog Pawar     WORD32 i, j, sad = 0;
982*c83a76b0SSuyog Pawar     LWORD64 ssd = 0;
983*c83a76b0SSuyog Pawar 
984*c83a76b0SSuyog Pawar     /* run a loop and find the ssd by doing diff followed by square */
985*c83a76b0SSuyog Pawar     for(i = 0; i < trans_size; i++)
986*c83a76b0SSuyog Pawar     {
987*c83a76b0SSuyog Pawar         for(j = 0; j < trans_size; j++)
988*c83a76b0SSuyog Pawar         {
989*c83a76b0SSuyog Pawar             WORD32 val;
990*c83a76b0SSuyog Pawar 
991*c83a76b0SSuyog Pawar             val = *pu1_src++ - *pu1_recon++;
992*c83a76b0SSuyog Pawar             ssd += val * val;
993*c83a76b0SSuyog Pawar             sad += abs(val);
994*c83a76b0SSuyog Pawar         }
995*c83a76b0SSuyog Pawar         /* row level update */
996*c83a76b0SSuyog Pawar         pu1_src += src_strd - trans_size;
997*c83a76b0SSuyog Pawar         pu1_recon += recon_strd - trans_size;
998*c83a76b0SSuyog Pawar     }
999*c83a76b0SSuyog Pawar     *pu4_blk_sad = sad;
1000*c83a76b0SSuyog Pawar 
1001*c83a76b0SSuyog Pawar     /* The return value is of type WORD32 */
1002*c83a76b0SSuyog Pawar     ssd = CLIP3(ssd, 0, 0x7fffffff);
1003*c83a76b0SSuyog Pawar 
1004*c83a76b0SSuyog Pawar     return (ssd);
1005*c83a76b0SSuyog Pawar }
1006*c83a76b0SSuyog Pawar 
1007*c83a76b0SSuyog Pawar /*!
1008*c83a76b0SSuyog Pawar ******************************************************************************
1009*c83a76b0SSuyog Pawar * \if Function name : ihevce_chroma_interleave_2d_copy \endif
1010*c83a76b0SSuyog Pawar *
1011*c83a76b0SSuyog Pawar * \brief
1012*c83a76b0SSuyog Pawar *    This function copies one plane (u/v) of interleaved chroma buffer from
1013*c83a76b0SSuyog Pawar *    source to destination
1014*c83a76b0SSuyog Pawar ******************************************************************************
1015*c83a76b0SSuyog Pawar */
ihevce_chroma_interleave_2d_copy(UWORD8 * pu1_uv_src_bp,WORD32 src_strd,UWORD8 * pu1_uv_dst_bp,WORD32 dst_strd,WORD32 w,WORD32 h,CHROMA_PLANE_ID_T e_chroma_plane)1016*c83a76b0SSuyog Pawar void ihevce_chroma_interleave_2d_copy(
1017*c83a76b0SSuyog Pawar     UWORD8 *pu1_uv_src_bp,
1018*c83a76b0SSuyog Pawar     WORD32 src_strd,
1019*c83a76b0SSuyog Pawar     UWORD8 *pu1_uv_dst_bp,
1020*c83a76b0SSuyog Pawar     WORD32 dst_strd,
1021*c83a76b0SSuyog Pawar     WORD32 w,
1022*c83a76b0SSuyog Pawar     WORD32 h,
1023*c83a76b0SSuyog Pawar     CHROMA_PLANE_ID_T e_chroma_plane)
1024*c83a76b0SSuyog Pawar {
1025*c83a76b0SSuyog Pawar     WORD32 i, j;
1026*c83a76b0SSuyog Pawar 
1027*c83a76b0SSuyog Pawar     UWORD8 *pu1_src = (U_PLANE == e_chroma_plane) ? pu1_uv_src_bp : pu1_uv_src_bp + 1;
1028*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst = (U_PLANE == e_chroma_plane) ? pu1_uv_dst_bp : pu1_uv_dst_bp + 1;
1029*c83a76b0SSuyog Pawar 
1030*c83a76b0SSuyog Pawar     for(i = 0; i < h; i++)
1031*c83a76b0SSuyog Pawar     {
1032*c83a76b0SSuyog Pawar         for(j = 0; j < w; j++)
1033*c83a76b0SSuyog Pawar         {
1034*c83a76b0SSuyog Pawar             /* note that chroma is interleaved */
1035*c83a76b0SSuyog Pawar             pu1_dst[j * 2] = pu1_src[j * 2];
1036*c83a76b0SSuyog Pawar         }
1037*c83a76b0SSuyog Pawar 
1038*c83a76b0SSuyog Pawar         /* row level update */
1039*c83a76b0SSuyog Pawar         pu1_src += src_strd;
1040*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
1041*c83a76b0SSuyog Pawar     }
1042*c83a76b0SSuyog Pawar }
1043*c83a76b0SSuyog Pawar 
1044*c83a76b0SSuyog Pawar /**
1045*c83a76b0SSuyog Pawar *******************************************************************************
1046*c83a76b0SSuyog Pawar *
1047*c83a76b0SSuyog Pawar * @brief
1048*c83a76b0SSuyog Pawar *     Gets edge offset params
1049*c83a76b0SSuyog Pawar *
1050*c83a76b0SSuyog Pawar * @par Description:
1051*c83a76b0SSuyog Pawar *     Given the ctb and sao angle this function will calculate accumulated
1052*c83a76b0SSuyog Pawar *     error between source and recon and the corresponding count for 4 edge
1053*c83a76b0SSuyog Pawar *     indexes one each for peak,valley, half peak and half valley.
1054*c83a76b0SSuyog Pawar *
1055*c83a76b0SSuyog Pawar * @param[in]
1056*c83a76b0SSuyog Pawar *   ps_sao_ctxt:   Pointer to SAO context
1057*c83a76b0SSuyog Pawar *   eo_sao_class: specifies edge offset class
1058*c83a76b0SSuyog Pawar *   pi4_acc_error_category: pointer to an array to store accumulated error between source and recon
1059*c83a76b0SSuyog Pawar *   pi4_category_count    : pointer to an array to store number of peaks,valleys,half peaks and half valleys.
1060*c83a76b0SSuyog Pawar * @returns
1061*c83a76b0SSuyog Pawar *
1062*c83a76b0SSuyog Pawar * @remarks
1063*c83a76b0SSuyog Pawar *  None
1064*c83a76b0SSuyog Pawar *
1065*c83a76b0SSuyog Pawar *******************************************************************************/
ihevce_get_chroma_eo_sao_params(void * pv_sao_ctxt,WORD32 eo_sao_class,WORD32 * pi4_acc_error_category,WORD32 * pi4_category_count)1066*c83a76b0SSuyog Pawar void ihevce_get_chroma_eo_sao_params(
1067*c83a76b0SSuyog Pawar     void *pv_sao_ctxt,
1068*c83a76b0SSuyog Pawar     WORD32 eo_sao_class,
1069*c83a76b0SSuyog Pawar     WORD32 *pi4_acc_error_category,
1070*c83a76b0SSuyog Pawar     WORD32 *pi4_category_count)
1071*c83a76b0SSuyog Pawar {
1072*c83a76b0SSuyog Pawar     WORD32 row_start, row_end, col_start, col_end, row, col;
1073*c83a76b0SSuyog Pawar     WORD32 row_offset = 0, col_offset = 0;
1074*c83a76b0SSuyog Pawar     WORD32 a, b, c, pel_error, edgeidx;
1075*c83a76b0SSuyog Pawar     sao_ctxt_t *ps_sao_ctxt = (sao_ctxt_t *)pv_sao_ctxt;
1076*c83a76b0SSuyog Pawar 
1077*c83a76b0SSuyog Pawar     row_start = 0;
1078*c83a76b0SSuyog Pawar     row_end = ps_sao_ctxt->i4_sao_blk_ht >> 1;
1079*c83a76b0SSuyog Pawar     col_start = 0;
1080*c83a76b0SSuyog Pawar     col_end = ps_sao_ctxt->i4_sao_blk_wd;
1081*c83a76b0SSuyog Pawar 
1082*c83a76b0SSuyog Pawar     if((ps_sao_ctxt->i4_ctb_x == 0) && (eo_sao_class != SAO_EDGE_90_DEG))
1083*c83a76b0SSuyog Pawar     {
1084*c83a76b0SSuyog Pawar         col_start = 2;
1085*c83a76b0SSuyog Pawar     }
1086*c83a76b0SSuyog Pawar 
1087*c83a76b0SSuyog Pawar     if(((ps_sao_ctxt->i4_ctb_x + 1) == ps_sao_ctxt->ps_sps->i2_pic_wd_in_ctb) &&
1088*c83a76b0SSuyog Pawar        (eo_sao_class != SAO_EDGE_90_DEG))
1089*c83a76b0SSuyog Pawar     {
1090*c83a76b0SSuyog Pawar         col_end = ps_sao_ctxt->i4_sao_blk_wd - 2;
1091*c83a76b0SSuyog Pawar     }
1092*c83a76b0SSuyog Pawar 
1093*c83a76b0SSuyog Pawar     if((ps_sao_ctxt->i4_ctb_y == 0) && (eo_sao_class != SAO_EDGE_0_DEG))
1094*c83a76b0SSuyog Pawar     {
1095*c83a76b0SSuyog Pawar         row_start = 1;
1096*c83a76b0SSuyog Pawar     }
1097*c83a76b0SSuyog Pawar 
1098*c83a76b0SSuyog Pawar     if(((ps_sao_ctxt->i4_ctb_y + 1) == ps_sao_ctxt->ps_sps->i2_pic_ht_in_ctb) &&
1099*c83a76b0SSuyog Pawar        (eo_sao_class != SAO_EDGE_0_DEG))
1100*c83a76b0SSuyog Pawar     {
1101*c83a76b0SSuyog Pawar         row_end = row_end - 1;  //ps_sao_ctxt->i4_sao_blk_ht - 1;
1102*c83a76b0SSuyog Pawar     }
1103*c83a76b0SSuyog Pawar 
1104*c83a76b0SSuyog Pawar     if(eo_sao_class == SAO_EDGE_0_DEG)
1105*c83a76b0SSuyog Pawar     {
1106*c83a76b0SSuyog Pawar         row_offset = 0;
1107*c83a76b0SSuyog Pawar         col_offset = 2;
1108*c83a76b0SSuyog Pawar     }
1109*c83a76b0SSuyog Pawar     else if(eo_sao_class == SAO_EDGE_90_DEG)
1110*c83a76b0SSuyog Pawar     {
1111*c83a76b0SSuyog Pawar         row_offset = 1;
1112*c83a76b0SSuyog Pawar         col_offset = 0;
1113*c83a76b0SSuyog Pawar     }
1114*c83a76b0SSuyog Pawar     else if(eo_sao_class == SAO_EDGE_135_DEG)
1115*c83a76b0SSuyog Pawar     {
1116*c83a76b0SSuyog Pawar         row_offset = 1;
1117*c83a76b0SSuyog Pawar         col_offset = 2;
1118*c83a76b0SSuyog Pawar     }
1119*c83a76b0SSuyog Pawar     else if(eo_sao_class == SAO_EDGE_45_DEG)
1120*c83a76b0SSuyog Pawar     {
1121*c83a76b0SSuyog Pawar         row_offset = 1;
1122*c83a76b0SSuyog Pawar         col_offset = -2;
1123*c83a76b0SSuyog Pawar     }
1124*c83a76b0SSuyog Pawar 
1125*c83a76b0SSuyog Pawar     for(row = row_start; row < row_end; row++)
1126*c83a76b0SSuyog Pawar     {
1127*c83a76b0SSuyog Pawar         for(col = col_start; col < col_end; col++)
1128*c83a76b0SSuyog Pawar         {
1129*c83a76b0SSuyog Pawar             c = ps_sao_ctxt
1130*c83a76b0SSuyog Pawar                     ->pu1_cur_chroma_recon_buf[col + row * ps_sao_ctxt->i4_cur_chroma_recon_stride];
1131*c83a76b0SSuyog Pawar             a = ps_sao_ctxt->pu1_cur_chroma_recon_buf
1132*c83a76b0SSuyog Pawar                     [(col - col_offset) +
1133*c83a76b0SSuyog Pawar                      (row - row_offset) * ps_sao_ctxt->i4_cur_chroma_recon_stride];
1134*c83a76b0SSuyog Pawar             b = ps_sao_ctxt->pu1_cur_chroma_recon_buf
1135*c83a76b0SSuyog Pawar                     [(col + col_offset) +
1136*c83a76b0SSuyog Pawar                      (row + row_offset) * ps_sao_ctxt->i4_cur_chroma_recon_stride];
1137*c83a76b0SSuyog Pawar             pel_error =
1138*c83a76b0SSuyog Pawar                 ps_sao_ctxt
1139*c83a76b0SSuyog Pawar                     ->pu1_cur_chroma_src_buf[col + row * ps_sao_ctxt->i4_cur_chroma_src_stride] -
1140*c83a76b0SSuyog Pawar                 ps_sao_ctxt
1141*c83a76b0SSuyog Pawar                     ->pu1_cur_chroma_recon_buf[col + row * ps_sao_ctxt->i4_cur_chroma_recon_stride];
1142*c83a76b0SSuyog Pawar             edgeidx = 2 + SIGN(c - a) + SIGN(c - b);
1143*c83a76b0SSuyog Pawar 
1144*c83a76b0SSuyog Pawar             if(pel_error != 0)
1145*c83a76b0SSuyog Pawar             {
1146*c83a76b0SSuyog Pawar                 pi4_acc_error_category[edgeidx] += pel_error;
1147*c83a76b0SSuyog Pawar                 pi4_category_count[edgeidx]++;
1148*c83a76b0SSuyog Pawar             }
1149*c83a76b0SSuyog Pawar         }
1150*c83a76b0SSuyog Pawar     }
1151*c83a76b0SSuyog Pawar }
1152*c83a76b0SSuyog Pawar 
1153*c83a76b0SSuyog Pawar /**
1154*c83a76b0SSuyog Pawar *******************************************************************************
1155*c83a76b0SSuyog Pawar *
1156*c83a76b0SSuyog Pawar * @brief
1157*c83a76b0SSuyog Pawar *     Gets edge offset params
1158*c83a76b0SSuyog Pawar *
1159*c83a76b0SSuyog Pawar * @par Description:
1160*c83a76b0SSuyog Pawar *     Given the ctb and sao angle this function will calculate accumulated
1161*c83a76b0SSuyog Pawar *     error between source and recon and the coresponding count for 4 edge
1162*c83a76b0SSuyog Pawar *     indexes one each for peak,valley, half peak and half valley.
1163*c83a76b0SSuyog Pawar *
1164*c83a76b0SSuyog Pawar * @param[in]
1165*c83a76b0SSuyog Pawar *   ps_sao_ctxt:   Pointer to SAO context
1166*c83a76b0SSuyog Pawar *   eo_sao_class: specifies edge offset class
1167*c83a76b0SSuyog Pawar *   pi4_acc_error_category: pointer to an array to store accumulated error between source and recon
1168*c83a76b0SSuyog Pawar *   pi4_category_count    : pointer to an array to store number of peaks,valleys,half peaks and half valleys.
1169*c83a76b0SSuyog Pawar * @returns
1170*c83a76b0SSuyog Pawar *
1171*c83a76b0SSuyog Pawar * @remarks
1172*c83a76b0SSuyog Pawar *  None
1173*c83a76b0SSuyog Pawar *
1174*c83a76b0SSuyog Pawar *******************************************************************************/
ihevce_get_luma_eo_sao_params(void * pv_sao_ctxt,WORD32 eo_sao_class,WORD32 * pi4_acc_error_category,WORD32 * pi4_category_count)1175*c83a76b0SSuyog Pawar void ihevce_get_luma_eo_sao_params(
1176*c83a76b0SSuyog Pawar     void *pv_sao_ctxt,
1177*c83a76b0SSuyog Pawar     WORD32 eo_sao_class,
1178*c83a76b0SSuyog Pawar     WORD32 *pi4_acc_error_category,
1179*c83a76b0SSuyog Pawar     WORD32 *pi4_category_count)
1180*c83a76b0SSuyog Pawar {
1181*c83a76b0SSuyog Pawar     WORD32 row_start, row_end, col_start, col_end, row, col;
1182*c83a76b0SSuyog Pawar     WORD32 row_offset = 0, col_offset = 0;
1183*c83a76b0SSuyog Pawar     WORD32 a, b, c, pel_error, edgeidx;
1184*c83a76b0SSuyog Pawar     sao_ctxt_t *ps_sao_ctxt = (sao_ctxt_t *)pv_sao_ctxt;
1185*c83a76b0SSuyog Pawar 
1186*c83a76b0SSuyog Pawar     row_start = 0;
1187*c83a76b0SSuyog Pawar     row_end = ps_sao_ctxt->i4_sao_blk_ht;
1188*c83a76b0SSuyog Pawar     col_start = 0;
1189*c83a76b0SSuyog Pawar     col_end = ps_sao_ctxt->i4_sao_blk_wd;
1190*c83a76b0SSuyog Pawar 
1191*c83a76b0SSuyog Pawar     if((ps_sao_ctxt->i4_ctb_x == 0) && (eo_sao_class != SAO_EDGE_90_DEG))
1192*c83a76b0SSuyog Pawar     {
1193*c83a76b0SSuyog Pawar         col_start = 1;
1194*c83a76b0SSuyog Pawar     }
1195*c83a76b0SSuyog Pawar 
1196*c83a76b0SSuyog Pawar     if(((ps_sao_ctxt->i4_ctb_x + 1) == ps_sao_ctxt->ps_sps->i2_pic_wd_in_ctb) &&
1197*c83a76b0SSuyog Pawar        (eo_sao_class != SAO_EDGE_90_DEG))
1198*c83a76b0SSuyog Pawar     {
1199*c83a76b0SSuyog Pawar         col_end = ps_sao_ctxt->i4_sao_blk_wd - 1;
1200*c83a76b0SSuyog Pawar     }
1201*c83a76b0SSuyog Pawar 
1202*c83a76b0SSuyog Pawar     if((ps_sao_ctxt->i4_ctb_y == 0) && (eo_sao_class != SAO_EDGE_0_DEG))
1203*c83a76b0SSuyog Pawar     {
1204*c83a76b0SSuyog Pawar         row_start = 1;
1205*c83a76b0SSuyog Pawar     }
1206*c83a76b0SSuyog Pawar 
1207*c83a76b0SSuyog Pawar     if(((ps_sao_ctxt->i4_ctb_y + 1) == ps_sao_ctxt->ps_sps->i2_pic_ht_in_ctb) &&
1208*c83a76b0SSuyog Pawar        (eo_sao_class != SAO_EDGE_0_DEG))
1209*c83a76b0SSuyog Pawar     {
1210*c83a76b0SSuyog Pawar         row_end = ps_sao_ctxt->i4_sao_blk_ht - 1;
1211*c83a76b0SSuyog Pawar     }
1212*c83a76b0SSuyog Pawar 
1213*c83a76b0SSuyog Pawar     if(eo_sao_class == SAO_EDGE_0_DEG)
1214*c83a76b0SSuyog Pawar     {
1215*c83a76b0SSuyog Pawar         row_offset = 0;
1216*c83a76b0SSuyog Pawar         col_offset = 1;
1217*c83a76b0SSuyog Pawar     }
1218*c83a76b0SSuyog Pawar     else if(eo_sao_class == SAO_EDGE_90_DEG)
1219*c83a76b0SSuyog Pawar     {
1220*c83a76b0SSuyog Pawar         row_offset = 1;
1221*c83a76b0SSuyog Pawar         col_offset = 0;
1222*c83a76b0SSuyog Pawar     }
1223*c83a76b0SSuyog Pawar     else if(eo_sao_class == SAO_EDGE_135_DEG)
1224*c83a76b0SSuyog Pawar     {
1225*c83a76b0SSuyog Pawar         row_offset = 1;
1226*c83a76b0SSuyog Pawar         col_offset = 1;
1227*c83a76b0SSuyog Pawar     }
1228*c83a76b0SSuyog Pawar     else if(eo_sao_class == SAO_EDGE_45_DEG)
1229*c83a76b0SSuyog Pawar     {
1230*c83a76b0SSuyog Pawar         row_offset = 1;
1231*c83a76b0SSuyog Pawar         col_offset = -1;
1232*c83a76b0SSuyog Pawar     }
1233*c83a76b0SSuyog Pawar 
1234*c83a76b0SSuyog Pawar     for(row = row_start; row < row_end; row++)
1235*c83a76b0SSuyog Pawar     {
1236*c83a76b0SSuyog Pawar         for(col = col_start; col < col_end; col++)
1237*c83a76b0SSuyog Pawar         {
1238*c83a76b0SSuyog Pawar             c = ps_sao_ctxt
1239*c83a76b0SSuyog Pawar                     ->pu1_cur_luma_recon_buf[col + row * ps_sao_ctxt->i4_cur_luma_recon_stride];
1240*c83a76b0SSuyog Pawar             a = ps_sao_ctxt->pu1_cur_luma_recon_buf
1241*c83a76b0SSuyog Pawar                     [(col - col_offset) +
1242*c83a76b0SSuyog Pawar                      (row - row_offset) * ps_sao_ctxt->i4_cur_luma_recon_stride];
1243*c83a76b0SSuyog Pawar             b = ps_sao_ctxt->pu1_cur_luma_recon_buf
1244*c83a76b0SSuyog Pawar                     [(col + col_offset) +
1245*c83a76b0SSuyog Pawar                      (row + row_offset) * ps_sao_ctxt->i4_cur_luma_recon_stride];
1246*c83a76b0SSuyog Pawar             pel_error =
1247*c83a76b0SSuyog Pawar                 ps_sao_ctxt->pu1_cur_luma_src_buf[col + row * ps_sao_ctxt->i4_cur_luma_src_stride] -
1248*c83a76b0SSuyog Pawar                 ps_sao_ctxt
1249*c83a76b0SSuyog Pawar                     ->pu1_cur_luma_recon_buf[col + row * ps_sao_ctxt->i4_cur_luma_recon_stride];
1250*c83a76b0SSuyog Pawar             edgeidx = 2 + SIGN(c - a) + SIGN(c - b);
1251*c83a76b0SSuyog Pawar 
1252*c83a76b0SSuyog Pawar             if(pel_error != 0)
1253*c83a76b0SSuyog Pawar             {
1254*c83a76b0SSuyog Pawar                 pi4_acc_error_category[edgeidx] += pel_error;
1255*c83a76b0SSuyog Pawar                 pi4_category_count[edgeidx]++;
1256*c83a76b0SSuyog Pawar             }
1257*c83a76b0SSuyog Pawar         }
1258*c83a76b0SSuyog Pawar     }
1259*c83a76b0SSuyog Pawar }
1260*c83a76b0SSuyog Pawar 
1261*c83a76b0SSuyog Pawar /*!
1262*c83a76b0SSuyog Pawar ******************************************************************************
1263*c83a76b0SSuyog Pawar * \if Function name : ihevce_compute_area_of_valid_cus_in_ctb \endif
1264*c83a76b0SSuyog Pawar *
1265*c83a76b0SSuyog Pawar * \brief
1266*c83a76b0SSuyog Pawar *
1267*c83a76b0SSuyog Pawar *
1268*c83a76b0SSuyog Pawar *****************************************************************************
1269*c83a76b0SSuyog Pawar */
ihevce_compute_area_of_valid_cus_in_ctb(cur_ctb_cu_tree_t * ps_cu_tree)1270*c83a76b0SSuyog Pawar WORD32 ihevce_compute_area_of_valid_cus_in_ctb(cur_ctb_cu_tree_t *ps_cu_tree)
1271*c83a76b0SSuyog Pawar {
1272*c83a76b0SSuyog Pawar     WORD32 i4_area;
1273*c83a76b0SSuyog Pawar 
1274*c83a76b0SSuyog Pawar     if(NULL == ps_cu_tree)
1275*c83a76b0SSuyog Pawar     {
1276*c83a76b0SSuyog Pawar         return 0;
1277*c83a76b0SSuyog Pawar     }
1278*c83a76b0SSuyog Pawar 
1279*c83a76b0SSuyog Pawar     if(ps_cu_tree->is_node_valid)
1280*c83a76b0SSuyog Pawar     {
1281*c83a76b0SSuyog Pawar         i4_area = ps_cu_tree->u1_cu_size * ps_cu_tree->u1_cu_size;
1282*c83a76b0SSuyog Pawar     }
1283*c83a76b0SSuyog Pawar     else
1284*c83a76b0SSuyog Pawar     {
1285*c83a76b0SSuyog Pawar         i4_area = ihevce_compute_area_of_valid_cus_in_ctb(ps_cu_tree->ps_child_node_tl) +
1286*c83a76b0SSuyog Pawar                   ihevce_compute_area_of_valid_cus_in_ctb(ps_cu_tree->ps_child_node_tr) +
1287*c83a76b0SSuyog Pawar                   ihevce_compute_area_of_valid_cus_in_ctb(ps_cu_tree->ps_child_node_bl) +
1288*c83a76b0SSuyog Pawar                   ihevce_compute_area_of_valid_cus_in_ctb(ps_cu_tree->ps_child_node_br);
1289*c83a76b0SSuyog Pawar     }
1290*c83a76b0SSuyog Pawar 
1291*c83a76b0SSuyog Pawar     return i4_area;
1292*c83a76b0SSuyog Pawar }
1293*c83a76b0SSuyog Pawar 
1294*c83a76b0SSuyog Pawar /*!
1295*c83a76b0SSuyog Pawar ******************************************************************************
1296*c83a76b0SSuyog Pawar * \if Function name : ihevce_create_cuNode_children \endif
1297*c83a76b0SSuyog Pawar *
1298*c83a76b0SSuyog Pawar * \brief
1299*c83a76b0SSuyog Pawar *
1300*c83a76b0SSuyog Pawar *
1301*c83a76b0SSuyog Pawar *****************************************************************************
1302*c83a76b0SSuyog Pawar */
ihevce_create_cuNode_children(cur_ctb_cu_tree_t * ps_cu_tree_root,cur_ctb_cu_tree_t * ps_cu_tree_cur_node,WORD32 nodes_already_created)1303*c83a76b0SSuyog Pawar static WORD32 ihevce_create_cuNode_children(
1304*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree_root,
1305*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree_cur_node,
1306*c83a76b0SSuyog Pawar     WORD32 nodes_already_created)
1307*c83a76b0SSuyog Pawar {
1308*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_tl;
1309*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_tr;
1310*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_bl;
1311*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_br;
1312*c83a76b0SSuyog Pawar 
1313*c83a76b0SSuyog Pawar     ps_tl = ps_cu_tree_root + nodes_already_created;
1314*c83a76b0SSuyog Pawar     ps_tr = ps_tl + 1;
1315*c83a76b0SSuyog Pawar     ps_bl = ps_tr + 1;
1316*c83a76b0SSuyog Pawar     ps_br = ps_bl + 1;
1317*c83a76b0SSuyog Pawar     /*
1318*c83a76b0SSuyog Pawar     ps_tl = (ai4_child_node_enable[0]) ? ps_tl : NULL;
1319*c83a76b0SSuyog Pawar     ps_tr = (ai4_child_node_enable[1]) ? ps_tr : NULL;
1320*c83a76b0SSuyog Pawar     ps_bl = (ai4_child_node_enable[2]) ? ps_bl : NULL;
1321*c83a76b0SSuyog Pawar     ps_br = (ai4_child_node_enable[3]) ? ps_br : NULL;
1322*c83a76b0SSuyog Pawar     */
1323*c83a76b0SSuyog Pawar     ps_cu_tree_cur_node->ps_child_node_tl = ps_tl;
1324*c83a76b0SSuyog Pawar     ps_cu_tree_cur_node->ps_child_node_tr = ps_tr;
1325*c83a76b0SSuyog Pawar     ps_cu_tree_cur_node->ps_child_node_bl = ps_bl;
1326*c83a76b0SSuyog Pawar     ps_cu_tree_cur_node->ps_child_node_br = ps_br;
1327*c83a76b0SSuyog Pawar 
1328*c83a76b0SSuyog Pawar     return 4;
1329*c83a76b0SSuyog Pawar }
1330*c83a76b0SSuyog Pawar 
1331*c83a76b0SSuyog Pawar /*!
1332*c83a76b0SSuyog Pawar ******************************************************************************
1333*c83a76b0SSuyog Pawar * \if Function name : ihevce_cu_tree_init \endif
1334*c83a76b0SSuyog Pawar *
1335*c83a76b0SSuyog Pawar * \brief
1336*c83a76b0SSuyog Pawar *
1337*c83a76b0SSuyog Pawar *
1338*c83a76b0SSuyog Pawar *****************************************************************************
1339*c83a76b0SSuyog Pawar */
ihevce_cu_tree_init(cur_ctb_cu_tree_t * ps_cu_tree,cur_ctb_cu_tree_t * ps_cu_tree_root,WORD32 * pi4_nodes_created_in_cu_tree,WORD32 tree_depth,CU_POS_T e_grandparent_blk_pos,CU_POS_T e_parent_blk_pos,CU_POS_T e_cur_blk_pos)1340*c83a76b0SSuyog Pawar void ihevce_cu_tree_init(
1341*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree,
1342*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree_root,
1343*c83a76b0SSuyog Pawar     WORD32 *pi4_nodes_created_in_cu_tree,
1344*c83a76b0SSuyog Pawar     WORD32 tree_depth,
1345*c83a76b0SSuyog Pawar     CU_POS_T e_grandparent_blk_pos,
1346*c83a76b0SSuyog Pawar     CU_POS_T e_parent_blk_pos,
1347*c83a76b0SSuyog Pawar     CU_POS_T e_cur_blk_pos)
1348*c83a76b0SSuyog Pawar {
1349*c83a76b0SSuyog Pawar     WORD32 cu_pos_x = 0;
1350*c83a76b0SSuyog Pawar     WORD32 cu_pos_y = 0;
1351*c83a76b0SSuyog Pawar     WORD32 cu_size = 0;
1352*c83a76b0SSuyog Pawar 
1353*c83a76b0SSuyog Pawar     WORD32 children_nodes_required = 1;
1354*c83a76b0SSuyog Pawar     WORD32 node_validity = 0;
1355*c83a76b0SSuyog Pawar 
1356*c83a76b0SSuyog Pawar     switch(tree_depth)
1357*c83a76b0SSuyog Pawar     {
1358*c83a76b0SSuyog Pawar     case 0:
1359*c83a76b0SSuyog Pawar     {
1360*c83a76b0SSuyog Pawar         /* 64x64 block */
1361*c83a76b0SSuyog Pawar         cu_size = 64;
1362*c83a76b0SSuyog Pawar         cu_pos_x = 0;
1363*c83a76b0SSuyog Pawar         cu_pos_y = 0;
1364*c83a76b0SSuyog Pawar 
1365*c83a76b0SSuyog Pawar         break;
1366*c83a76b0SSuyog Pawar     }
1367*c83a76b0SSuyog Pawar     case 1:
1368*c83a76b0SSuyog Pawar     {
1369*c83a76b0SSuyog Pawar         /* 32x32 block */
1370*c83a76b0SSuyog Pawar         cu_size = 32;
1371*c83a76b0SSuyog Pawar 
1372*c83a76b0SSuyog Pawar         /* Explanation for logic below - */
1373*c83a76b0SSuyog Pawar         /* * pos_x and pos_y are in units of 8x8 CU's */
1374*c83a76b0SSuyog Pawar         /* * pos_x = 0 for TL and BL children */
1375*c83a76b0SSuyog Pawar         /* * pos_x = 4 for TR and BR children */
1376*c83a76b0SSuyog Pawar         /* * pos_y = 0 for TL and TR children */
1377*c83a76b0SSuyog Pawar         /* * pos_y = 4 for BL and BR children */
1378*c83a76b0SSuyog Pawar         cu_pos_x = (e_cur_blk_pos & 1) << 2;
1379*c83a76b0SSuyog Pawar         cu_pos_y = (e_cur_blk_pos & 2) << 1;
1380*c83a76b0SSuyog Pawar 
1381*c83a76b0SSuyog Pawar         break;
1382*c83a76b0SSuyog Pawar     }
1383*c83a76b0SSuyog Pawar     case 2:
1384*c83a76b0SSuyog Pawar     {
1385*c83a76b0SSuyog Pawar         /* 16x16 block */
1386*c83a76b0SSuyog Pawar         WORD32 cu_pos_x_parent;
1387*c83a76b0SSuyog Pawar         WORD32 cu_pos_y_parent;
1388*c83a76b0SSuyog Pawar 
1389*c83a76b0SSuyog Pawar         cu_size = 16;
1390*c83a76b0SSuyog Pawar 
1391*c83a76b0SSuyog Pawar         /* Explanation for logic below - */
1392*c83a76b0SSuyog Pawar         /* See similar explanation above */
1393*c83a76b0SSuyog Pawar         cu_pos_x_parent = (e_parent_blk_pos & 1) << 2;
1394*c83a76b0SSuyog Pawar         cu_pos_y_parent = (e_parent_blk_pos & 2) << 1;
1395*c83a76b0SSuyog Pawar         cu_pos_x = cu_pos_x_parent + ((e_cur_blk_pos & 1) << 1);
1396*c83a76b0SSuyog Pawar         cu_pos_y = cu_pos_y_parent + (e_cur_blk_pos & 2);
1397*c83a76b0SSuyog Pawar 
1398*c83a76b0SSuyog Pawar         break;
1399*c83a76b0SSuyog Pawar     }
1400*c83a76b0SSuyog Pawar     case 3:
1401*c83a76b0SSuyog Pawar     {
1402*c83a76b0SSuyog Pawar         /* 8x8 block */
1403*c83a76b0SSuyog Pawar         WORD32 cu_pos_x_grandparent;
1404*c83a76b0SSuyog Pawar         WORD32 cu_pos_y_grandparent;
1405*c83a76b0SSuyog Pawar 
1406*c83a76b0SSuyog Pawar         WORD32 cu_pos_x_parent;
1407*c83a76b0SSuyog Pawar         WORD32 cu_pos_y_parent;
1408*c83a76b0SSuyog Pawar 
1409*c83a76b0SSuyog Pawar         cu_size = 8;
1410*c83a76b0SSuyog Pawar 
1411*c83a76b0SSuyog Pawar         cu_pos_x_grandparent = (e_grandparent_blk_pos & 1) << 2;
1412*c83a76b0SSuyog Pawar         cu_pos_y_grandparent = (e_grandparent_blk_pos & 2) << 1;
1413*c83a76b0SSuyog Pawar         cu_pos_x_parent = cu_pos_x_grandparent + ((e_parent_blk_pos & 1) << 1);
1414*c83a76b0SSuyog Pawar         cu_pos_y_parent = cu_pos_y_grandparent + (e_parent_blk_pos & 2);
1415*c83a76b0SSuyog Pawar         cu_pos_x = cu_pos_x_parent + (e_cur_blk_pos & 1);
1416*c83a76b0SSuyog Pawar         cu_pos_y = cu_pos_y_parent + ((e_cur_blk_pos & 2) >> 1);
1417*c83a76b0SSuyog Pawar 
1418*c83a76b0SSuyog Pawar         children_nodes_required = 0;
1419*c83a76b0SSuyog Pawar 
1420*c83a76b0SSuyog Pawar         break;
1421*c83a76b0SSuyog Pawar     }
1422*c83a76b0SSuyog Pawar     }
1423*c83a76b0SSuyog Pawar 
1424*c83a76b0SSuyog Pawar     /* Fill the current cu_tree node */
1425*c83a76b0SSuyog Pawar     CU_TREE_NODE_FILL(ps_cu_tree, node_validity, cu_pos_x, cu_pos_y, cu_size, 1);
1426*c83a76b0SSuyog Pawar 
1427*c83a76b0SSuyog Pawar     if(children_nodes_required)
1428*c83a76b0SSuyog Pawar     {
1429*c83a76b0SSuyog Pawar         tree_depth++;
1430*c83a76b0SSuyog Pawar 
1431*c83a76b0SSuyog Pawar         (*pi4_nodes_created_in_cu_tree) += ihevce_create_cuNode_children(
1432*c83a76b0SSuyog Pawar             ps_cu_tree_root, ps_cu_tree, (*pi4_nodes_created_in_cu_tree));
1433*c83a76b0SSuyog Pawar 
1434*c83a76b0SSuyog Pawar         ihevce_cu_tree_init(
1435*c83a76b0SSuyog Pawar             ps_cu_tree->ps_child_node_tl,
1436*c83a76b0SSuyog Pawar             ps_cu_tree_root,
1437*c83a76b0SSuyog Pawar             pi4_nodes_created_in_cu_tree,
1438*c83a76b0SSuyog Pawar             tree_depth,
1439*c83a76b0SSuyog Pawar             e_parent_blk_pos,
1440*c83a76b0SSuyog Pawar             e_cur_blk_pos,
1441*c83a76b0SSuyog Pawar             POS_TL);
1442*c83a76b0SSuyog Pawar 
1443*c83a76b0SSuyog Pawar         ihevce_cu_tree_init(
1444*c83a76b0SSuyog Pawar             ps_cu_tree->ps_child_node_tr,
1445*c83a76b0SSuyog Pawar             ps_cu_tree_root,
1446*c83a76b0SSuyog Pawar             pi4_nodes_created_in_cu_tree,
1447*c83a76b0SSuyog Pawar             tree_depth,
1448*c83a76b0SSuyog Pawar             e_parent_blk_pos,
1449*c83a76b0SSuyog Pawar             e_cur_blk_pos,
1450*c83a76b0SSuyog Pawar             POS_TR);
1451*c83a76b0SSuyog Pawar 
1452*c83a76b0SSuyog Pawar         ihevce_cu_tree_init(
1453*c83a76b0SSuyog Pawar             ps_cu_tree->ps_child_node_bl,
1454*c83a76b0SSuyog Pawar             ps_cu_tree_root,
1455*c83a76b0SSuyog Pawar             pi4_nodes_created_in_cu_tree,
1456*c83a76b0SSuyog Pawar             tree_depth,
1457*c83a76b0SSuyog Pawar             e_parent_blk_pos,
1458*c83a76b0SSuyog Pawar             e_cur_blk_pos,
1459*c83a76b0SSuyog Pawar             POS_BL);
1460*c83a76b0SSuyog Pawar 
1461*c83a76b0SSuyog Pawar         ihevce_cu_tree_init(
1462*c83a76b0SSuyog Pawar             ps_cu_tree->ps_child_node_br,
1463*c83a76b0SSuyog Pawar             ps_cu_tree_root,
1464*c83a76b0SSuyog Pawar             pi4_nodes_created_in_cu_tree,
1465*c83a76b0SSuyog Pawar             tree_depth,
1466*c83a76b0SSuyog Pawar             e_parent_blk_pos,
1467*c83a76b0SSuyog Pawar             e_cur_blk_pos,
1468*c83a76b0SSuyog Pawar             POS_BR);
1469*c83a76b0SSuyog Pawar     }
1470*c83a76b0SSuyog Pawar     else
1471*c83a76b0SSuyog Pawar     {
1472*c83a76b0SSuyog Pawar         NULLIFY_THE_CHILDREN_NODES(ps_cu_tree);
1473*c83a76b0SSuyog Pawar     }
1474*c83a76b0SSuyog Pawar }
1475