xref: /aosp_15_r20/external/libhevc/encoder/ihevce_ipe_pass.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 ******************************************************************************
23*c83a76b0SSuyog Pawar * \file ihevce_ipe_pass.c
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * \brief
26*c83a76b0SSuyog Pawar *    This file contains interface functions of Intra Prediction Estimation
27*c83a76b0SSuyog Pawar *    module
28*c83a76b0SSuyog Pawar * \date
29*c83a76b0SSuyog Pawar *    18/09/2012
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * \author
32*c83a76b0SSuyog Pawar *    Ittiam
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *
35*c83a76b0SSuyog Pawar * List of Functions
36*c83a76b0SSuyog Pawar *
37*c83a76b0SSuyog Pawar *
38*c83a76b0SSuyog Pawar ******************************************************************************
39*c83a76b0SSuyog Pawar */
40*c83a76b0SSuyog Pawar 
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar /* File Includes                                                             */
43*c83a76b0SSuyog Pawar /*****************************************************************************/
44*c83a76b0SSuyog Pawar /* System include files */
45*c83a76b0SSuyog Pawar #include <stdio.h>
46*c83a76b0SSuyog Pawar #include <string.h>
47*c83a76b0SSuyog Pawar #include <stdlib.h>
48*c83a76b0SSuyog Pawar #include <assert.h>
49*c83a76b0SSuyog Pawar #include <stdarg.h>
50*c83a76b0SSuyog Pawar #include <math.h>
51*c83a76b0SSuyog Pawar 
52*c83a76b0SSuyog Pawar /* User include files */
53*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
54*c83a76b0SSuyog Pawar #include "itt_video_api.h"
55*c83a76b0SSuyog Pawar #include "ihevce_api.h"
56*c83a76b0SSuyog Pawar 
57*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
58*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
59*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
60*c83a76b0SSuyog Pawar 
61*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
62*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
63*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
64*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
65*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
66*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
67*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
68*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
69*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
70*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
71*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
72*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
73*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
74*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
75*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
76*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
77*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
78*c83a76b0SSuyog Pawar #include "ihevc_quant_tables.h"
79*c83a76b0SSuyog Pawar 
80*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
81*c83a76b0SSuyog Pawar #include "ihevce_hle_interface.h"
82*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
83*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
84*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_funcs.h"
85*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
86*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
87*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
88*c83a76b0SSuyog Pawar #include "ihevce_bitstream.h"
89*c83a76b0SSuyog Pawar #include "ihevce_cabac.h"
90*c83a76b0SSuyog Pawar #include "ihevce_rdoq_macros.h"
91*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
92*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
93*c83a76b0SSuyog Pawar #include "ihevce_entropy_structs.h"
94*c83a76b0SSuyog Pawar #include "ihevce_cmn_utils_instr_set_router.h"
95*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_structs.h"
96*c83a76b0SSuyog Pawar #include "ihevce_inter_pred.h"
97*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
98*c83a76b0SSuyog Pawar #include "ihevce_ipe_instr_set_router.h"
99*c83a76b0SSuyog Pawar #include "ihevce_ipe_structs.h"
100*c83a76b0SSuyog Pawar #include "ihevce_ipe_pass.h"
101*c83a76b0SSuyog Pawar #include "ihevce_decomp_pre_intra_structs.h"
102*c83a76b0SSuyog Pawar #include "ihevce_decomp_pre_intra_pass.h"
103*c83a76b0SSuyog Pawar #include "ihevce_recur_bracketing.h"
104*c83a76b0SSuyog Pawar #include "ihevce_nbr_avail.h"
105*c83a76b0SSuyog Pawar #include "ihevce_global_tables.h"
106*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
107*c83a76b0SSuyog Pawar 
108*c83a76b0SSuyog Pawar #include "cast_types.h"
109*c83a76b0SSuyog Pawar #include "osal.h"
110*c83a76b0SSuyog Pawar #include "osal_defaults.h"
111*c83a76b0SSuyog Pawar 
112*c83a76b0SSuyog Pawar /*****************************************************************************/
113*c83a76b0SSuyog Pawar /* Global Tables                                                             */
114*c83a76b0SSuyog Pawar /*****************************************************************************/
115*c83a76b0SSuyog Pawar 
116*c83a76b0SSuyog Pawar /**
117*c83a76b0SSuyog Pawar ******************************************************************************
118*c83a76b0SSuyog Pawar * @brief  Look up table for choosing the appropriate function for
119*c83a76b0SSuyog Pawar *         Intra prediction
120*c83a76b0SSuyog Pawar *
121*c83a76b0SSuyog Pawar * @remarks Same look up table enums are used for luma & chroma but each
122*c83a76b0SSuyog Pawar *          have seperate functions implemented
123*c83a76b0SSuyog Pawar ******************************************************************************
124*c83a76b0SSuyog Pawar */
125*c83a76b0SSuyog Pawar WORD32 g_i4_ipe_funcs[MAX_NUM_IP_MODES] = {
126*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_0, /* Mode 0 */
127*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_1, /* Mode 1 */
128*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_2, /* Mode 2 */
129*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_3TO9, /* Mode 3 */
130*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_3TO9, /* Mode 4 */
131*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_3TO9, /* Mode 5 */
132*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_3TO9, /* Mode 6 */
133*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_3TO9, /* Mode 7 */
134*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_3TO9, /* Mode 8 */
135*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_3TO9, /* Mode 9 */
136*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_10, /* Mode 10 */
137*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_11TO17, /* Mode 11 */
138*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_11TO17, /* Mode 12 */
139*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_11TO17, /* Mode 13 */
140*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_11TO17, /* Mode 14 */
141*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_11TO17, /* Mode 15 */
142*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_11TO17, /* Mode 16 */
143*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_11TO17, /* Mode 17 */
144*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_18_34, /* Mode 18 */
145*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_19TO25, /* Mode 19 */
146*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_19TO25, /* Mode 20 */
147*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_19TO25, /* Mode 21 */
148*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_19TO25, /* Mode 22 */
149*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_19TO25, /* Mode 23 */
150*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_19TO25, /* Mode 24 */
151*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_19TO25, /* Mode 25 */
152*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_26, /* Mode 26 */
153*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_27TO33, /* Mode 27 */
154*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_27TO33, /* Mode 26 */
155*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_27TO33, /* Mode 29 */
156*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_27TO33, /* Mode 30 */
157*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_27TO33, /* Mode 31 */
158*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_27TO33, /* Mode 32 */
159*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_27TO33, /* Mode 33 */
160*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_18_34, /* Mode 34 */
161*c83a76b0SSuyog Pawar };
162*c83a76b0SSuyog Pawar 
163*c83a76b0SSuyog Pawar /**
164*c83a76b0SSuyog Pawar ******************************************************************************
165*c83a76b0SSuyog Pawar * @brief  Look up table for deciding whether to use original samples or
166*c83a76b0SSuyog Pawar *         filtered reference samples for Intra prediction
167*c83a76b0SSuyog Pawar *
168*c83a76b0SSuyog Pawar * @remarks This table has the flags for transform size of 8, 16 and 32
169*c83a76b0SSuyog Pawar *          Input is log2nT - 3 and intra prediction mode
170*c83a76b0SSuyog Pawar ******************************************************************************
171*c83a76b0SSuyog Pawar */
172*c83a76b0SSuyog Pawar UWORD8 gau1_ipe_filter_flag[3][MAX_NUM_IP_MODES] = {
173*c83a76b0SSuyog Pawar     { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
174*c83a76b0SSuyog Pawar       1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
175*c83a76b0SSuyog Pawar     { 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,
176*c83a76b0SSuyog Pawar       1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },
177*c83a76b0SSuyog Pawar     { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
178*c83a76b0SSuyog Pawar       1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 }
179*c83a76b0SSuyog Pawar };
180*c83a76b0SSuyog Pawar 
181*c83a76b0SSuyog Pawar /*****************************************************************************/
182*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
183*c83a76b0SSuyog Pawar /*****************************************************************************/
184*c83a76b0SSuyog Pawar 
185*c83a76b0SSuyog Pawar /*!
186*c83a76b0SSuyog Pawar ******************************************************************************
187*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_recompute_lambda_from_min_8x8_act_in_ctb \endif
188*c83a76b0SSuyog Pawar *
189*c83a76b0SSuyog Pawar * \brief
190*c83a76b0SSuyog Pawar *    This function recomputes lambda using min 8x8 act in CTB
191*c83a76b0SSuyog Pawar *
192*c83a76b0SSuyog Pawar * \author
193*c83a76b0SSuyog Pawar *    Ittiam
194*c83a76b0SSuyog Pawar *
195*c83a76b0SSuyog Pawar * \return
196*c83a76b0SSuyog Pawar *    Nothing
197*c83a76b0SSuyog Pawar *
198*c83a76b0SSuyog Pawar ******************************************************************************
199*c83a76b0SSuyog Pawar */
ihevce_ipe_recompute_lambda_from_min_8x8_act_in_ctb(ihevce_ipe_ctxt_t * ps_ctxt,ihevce_ed_ctb_l1_t * ps_ed_ctb_l1)200*c83a76b0SSuyog Pawar void ihevce_ipe_recompute_lambda_from_min_8x8_act_in_ctb(
201*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt, ihevce_ed_ctb_l1_t *ps_ed_ctb_l1)
202*c83a76b0SSuyog Pawar {
203*c83a76b0SSuyog Pawar     WORD32 i4_cu_qp = 0;
204*c83a76b0SSuyog Pawar #if MODULATE_LAMDA_WHEN_SPATIAL_MOD_ON
205*c83a76b0SSuyog Pawar     WORD32 i4_activity;
206*c83a76b0SSuyog Pawar #endif
207*c83a76b0SSuyog Pawar     WORD32 i4_qscale;
208*c83a76b0SSuyog Pawar     WORD32 i4_curr_satd;
209*c83a76b0SSuyog Pawar     long double ld_avg_satd;
210*c83a76b0SSuyog Pawar 
211*c83a76b0SSuyog Pawar #if LAMDA_BASED_ON_QUANT
212*c83a76b0SSuyog Pawar     i4_curr_satd = ps_ed_ctb_l1->i4_32x32_satd[0][2];
213*c83a76b0SSuyog Pawar     i8_avg_satd = ps_ctxt->i8_curr_frame_32x32_avg_act[2];
214*c83a76b0SSuyog Pawar #else
215*c83a76b0SSuyog Pawar     i4_curr_satd = ps_ed_ctb_l1->i4_32x32_satd[0][3];
216*c83a76b0SSuyog Pawar     ld_avg_satd = 2.0 + ps_ctxt->ld_curr_frame_16x16_log_avg[0];
217*c83a76b0SSuyog Pawar #endif
218*c83a76b0SSuyog Pawar 
219*c83a76b0SSuyog Pawar     if(ps_ctxt->i4_l0ipe_qp_mod)
220*c83a76b0SSuyog Pawar     {
221*c83a76b0SSuyog Pawar #if MODULATE_LAMDA_WHEN_SPATIAL_MOD_ON
222*c83a76b0SSuyog Pawar         i4_cu_qp = ihevce_cu_level_qp_mod(
223*c83a76b0SSuyog Pawar             ps_ctxt->i4_qscale,
224*c83a76b0SSuyog Pawar             i4_curr_satd,
225*c83a76b0SSuyog Pawar             ld_avg_satd,
226*c83a76b0SSuyog Pawar             ps_ctxt->f_strength,
227*c83a76b0SSuyog Pawar             &i4_activity,
228*c83a76b0SSuyog Pawar             &i4_qscale,
229*c83a76b0SSuyog Pawar             ps_ctxt->ps_rc_quant_ctxt);
230*c83a76b0SSuyog Pawar #endif
231*c83a76b0SSuyog Pawar     }
232*c83a76b0SSuyog Pawar     ihevce_get_ipe_ol_cu_lambda_prms(ps_ctxt, i4_cu_qp);
233*c83a76b0SSuyog Pawar }
234*c83a76b0SSuyog Pawar /*!
235*c83a76b0SSuyog Pawar ******************************************************************************
236*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_pass_satd \endif
237*c83a76b0SSuyog Pawar *
238*c83a76b0SSuyog Pawar * \brief
239*c83a76b0SSuyog Pawar *    This function calcuates the SATD for a given size and returns the value
240*c83a76b0SSuyog Pawar *
241*c83a76b0SSuyog Pawar * \date
242*c83a76b0SSuyog Pawar *    18/09/2012
243*c83a76b0SSuyog Pawar *
244*c83a76b0SSuyog Pawar * \author
245*c83a76b0SSuyog Pawar *    Ittiam
246*c83a76b0SSuyog Pawar *
247*c83a76b0SSuyog Pawar * \return
248*c83a76b0SSuyog Pawar *
249*c83a76b0SSuyog Pawar * List of Functions
250*c83a76b0SSuyog Pawar *
251*c83a76b0SSuyog Pawar ******************************************************************************
252*c83a76b0SSuyog Pawar */
ihevce_ipe_pass_satd(WORD16 * pi2_coeff,WORD32 coeff_stride,WORD32 trans_size)253*c83a76b0SSuyog Pawar UWORD32 ihevce_ipe_pass_satd(WORD16 *pi2_coeff, WORD32 coeff_stride, WORD32 trans_size)
254*c83a76b0SSuyog Pawar {
255*c83a76b0SSuyog Pawar     WORD32 i, j, satd;
256*c83a76b0SSuyog Pawar 
257*c83a76b0SSuyog Pawar     satd = 0;
258*c83a76b0SSuyog Pawar 
259*c83a76b0SSuyog Pawar     /* run a loop and find the satd by doing ABS */
260*c83a76b0SSuyog Pawar     for(i = 0; i < trans_size; i++)
261*c83a76b0SSuyog Pawar     {
262*c83a76b0SSuyog Pawar         for(j = 0; j < trans_size; j++)
263*c83a76b0SSuyog Pawar         {
264*c83a76b0SSuyog Pawar             satd += abs(*pi2_coeff++);
265*c83a76b0SSuyog Pawar         }
266*c83a76b0SSuyog Pawar         /* row level update */
267*c83a76b0SSuyog Pawar         pi2_coeff += coeff_stride - trans_size;
268*c83a76b0SSuyog Pawar     }
269*c83a76b0SSuyog Pawar 
270*c83a76b0SSuyog Pawar     {
271*c83a76b0SSuyog Pawar         WORD32 transform_shift;
272*c83a76b0SSuyog Pawar         WORD32 log2_trans_size;
273*c83a76b0SSuyog Pawar 
274*c83a76b0SSuyog Pawar         GETRANGE(log2_trans_size, trans_size);
275*c83a76b0SSuyog Pawar         log2_trans_size -= 1;
276*c83a76b0SSuyog Pawar         transform_shift = MAX_TR_DYNAMIC_RANGE - BIT_DEPTH - log2_trans_size;
277*c83a76b0SSuyog Pawar         satd >>= transform_shift;
278*c83a76b0SSuyog Pawar     }
279*c83a76b0SSuyog Pawar 
280*c83a76b0SSuyog Pawar     return (satd);
281*c83a76b0SSuyog Pawar }
282*c83a76b0SSuyog Pawar 
283*c83a76b0SSuyog Pawar /*!
284*c83a76b0SSuyog Pawar ******************************************************************************
285*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_get_num_mem_recs \endif
286*c83a76b0SSuyog Pawar *
287*c83a76b0SSuyog Pawar * \brief
288*c83a76b0SSuyog Pawar *    Number of memory records are returned for IPE module
289*c83a76b0SSuyog Pawar *
290*c83a76b0SSuyog Pawar *
291*c83a76b0SSuyog Pawar * \return
292*c83a76b0SSuyog Pawar *    None
293*c83a76b0SSuyog Pawar *
294*c83a76b0SSuyog Pawar * \author
295*c83a76b0SSuyog Pawar *  Ittiam
296*c83a76b0SSuyog Pawar *
297*c83a76b0SSuyog Pawar *****************************************************************************
298*c83a76b0SSuyog Pawar */
ihevce_ipe_get_num_mem_recs(void)299*c83a76b0SSuyog Pawar WORD32 ihevce_ipe_get_num_mem_recs(void)
300*c83a76b0SSuyog Pawar {
301*c83a76b0SSuyog Pawar     return (NUM_IPE_MEM_RECS);
302*c83a76b0SSuyog Pawar }
303*c83a76b0SSuyog Pawar 
304*c83a76b0SSuyog Pawar /*!
305*c83a76b0SSuyog Pawar ******************************************************************************
306*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_get_mem_recs \endif
307*c83a76b0SSuyog Pawar *
308*c83a76b0SSuyog Pawar * \brief
309*c83a76b0SSuyog Pawar *    Memory requirements are returned for IPE.
310*c83a76b0SSuyog Pawar *
311*c83a76b0SSuyog Pawar * \param[in,out]  ps_mem_tab : pointer to memory descriptors table
312*c83a76b0SSuyog Pawar * \param[in] ps_init_prms : Create time static parameters
313*c83a76b0SSuyog Pawar * \param[in] i4_num_proc_thrds : Number of processing threads for this module
314*c83a76b0SSuyog Pawar * \param[in] i4_mem_space : memspace in whihc memory request should be done
315*c83a76b0SSuyog Pawar *
316*c83a76b0SSuyog Pawar * \return
317*c83a76b0SSuyog Pawar *    None
318*c83a76b0SSuyog Pawar *
319*c83a76b0SSuyog Pawar * \author
320*c83a76b0SSuyog Pawar *  Ittiam
321*c83a76b0SSuyog Pawar *
322*c83a76b0SSuyog Pawar *****************************************************************************
323*c83a76b0SSuyog Pawar */
324*c83a76b0SSuyog Pawar WORD32
ihevce_ipe_get_mem_recs(iv_mem_rec_t * ps_mem_tab,WORD32 i4_num_proc_thrds,WORD32 i4_mem_space)325*c83a76b0SSuyog Pawar     ihevce_ipe_get_mem_recs(iv_mem_rec_t *ps_mem_tab, WORD32 i4_num_proc_thrds, WORD32 i4_mem_space)
326*c83a76b0SSuyog Pawar {
327*c83a76b0SSuyog Pawar     /* memories should be requested assuming worst case requirememnts */
328*c83a76b0SSuyog Pawar 
329*c83a76b0SSuyog Pawar     /* Module context structure */
330*c83a76b0SSuyog Pawar     ps_mem_tab[IPE_CTXT].i4_mem_size = sizeof(ihevce_ipe_master_ctxt_t);
331*c83a76b0SSuyog Pawar 
332*c83a76b0SSuyog Pawar     ps_mem_tab[IPE_CTXT].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
333*c83a76b0SSuyog Pawar 
334*c83a76b0SSuyog Pawar     ps_mem_tab[IPE_CTXT].i4_mem_alignment = 8;
335*c83a76b0SSuyog Pawar 
336*c83a76b0SSuyog Pawar     /* Threads ctxt structure */
337*c83a76b0SSuyog Pawar     ps_mem_tab[IPE_THRDS_CTXT].i4_mem_size = i4_num_proc_thrds * sizeof(ihevce_ipe_ctxt_t);
338*c83a76b0SSuyog Pawar 
339*c83a76b0SSuyog Pawar     ps_mem_tab[IPE_THRDS_CTXT].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
340*c83a76b0SSuyog Pawar 
341*c83a76b0SSuyog Pawar     ps_mem_tab[IPE_THRDS_CTXT].i4_mem_alignment = 32;
342*c83a76b0SSuyog Pawar 
343*c83a76b0SSuyog Pawar     return (NUM_IPE_MEM_RECS);
344*c83a76b0SSuyog Pawar }
345*c83a76b0SSuyog Pawar 
346*c83a76b0SSuyog Pawar /*!
347*c83a76b0SSuyog Pawar ******************************************************************************
348*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_init \endif
349*c83a76b0SSuyog Pawar *
350*c83a76b0SSuyog Pawar * \brief
351*c83a76b0SSuyog Pawar *    Intialization for IPE context state structure .
352*c83a76b0SSuyog Pawar *
353*c83a76b0SSuyog Pawar * \param[in] ps_mem_tab : pointer to memory descriptors table
354*c83a76b0SSuyog Pawar * \param[in] ps_init_prms : Create time static parameters
355*c83a76b0SSuyog Pawar *
356*c83a76b0SSuyog Pawar * \return
357*c83a76b0SSuyog Pawar *    None
358*c83a76b0SSuyog Pawar *
359*c83a76b0SSuyog Pawar * \author
360*c83a76b0SSuyog Pawar *  Ittiam
361*c83a76b0SSuyog Pawar *
362*c83a76b0SSuyog Pawar *****************************************************************************
363*c83a76b0SSuyog Pawar */
ihevce_ipe_init(iv_mem_rec_t * ps_mem_tab,ihevce_static_cfg_params_t * ps_init_prms,WORD32 i4_num_proc_thrds,WORD32 i4_ref_id,func_selector_t * ps_func_selector,rc_quant_t * ps_rc_quant_ctxt,WORD32 i4_resolution_id,UWORD8 u1_is_popcnt_available)364*c83a76b0SSuyog Pawar void *ihevce_ipe_init(
365*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab,
366*c83a76b0SSuyog Pawar     ihevce_static_cfg_params_t *ps_init_prms,
367*c83a76b0SSuyog Pawar     WORD32 i4_num_proc_thrds,
368*c83a76b0SSuyog Pawar     WORD32 i4_ref_id,
369*c83a76b0SSuyog Pawar     func_selector_t *ps_func_selector,
370*c83a76b0SSuyog Pawar     rc_quant_t *ps_rc_quant_ctxt,
371*c83a76b0SSuyog Pawar     WORD32 i4_resolution_id,
372*c83a76b0SSuyog Pawar     UWORD8 u1_is_popcnt_available)
373*c83a76b0SSuyog Pawar {
374*c83a76b0SSuyog Pawar     WORD32 i4_thrds;
375*c83a76b0SSuyog Pawar     UWORD32 u4_width, u4_ctb_in_a_row;
376*c83a76b0SSuyog Pawar     //  WORD32 i4_ctr;
377*c83a76b0SSuyog Pawar     ihevce_ipe_master_ctxt_t *ps_master_ctxt;
378*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt;
379*c83a76b0SSuyog Pawar 
380*c83a76b0SSuyog Pawar     /* IPE master state structure */
381*c83a76b0SSuyog Pawar     ps_master_ctxt = (ihevce_ipe_master_ctxt_t *)ps_mem_tab[IPE_CTXT].pv_base;
382*c83a76b0SSuyog Pawar 
383*c83a76b0SSuyog Pawar     ps_master_ctxt->i4_num_proc_thrds = i4_num_proc_thrds;
384*c83a76b0SSuyog Pawar 
385*c83a76b0SSuyog Pawar     ps_ctxt = (ihevce_ipe_ctxt_t *)ps_mem_tab[IPE_THRDS_CTXT].pv_base;
386*c83a76b0SSuyog Pawar 
387*c83a76b0SSuyog Pawar     ps_ctxt->ps_rc_quant_ctxt = ps_rc_quant_ctxt;
388*c83a76b0SSuyog Pawar 
389*c83a76b0SSuyog Pawar     /*width of the input YUV to be encoded. */
390*c83a76b0SSuyog Pawar     u4_width = ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width;
391*c83a76b0SSuyog Pawar     /*making the width a multiple of CTB size*/
392*c83a76b0SSuyog Pawar     u4_width += SET_CTB_ALIGN(
393*c83a76b0SSuyog Pawar         ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width, MAX_CTB_SIZE);
394*c83a76b0SSuyog Pawar 
395*c83a76b0SSuyog Pawar     u4_ctb_in_a_row = (u4_width / MAX_CTB_SIZE);
396*c83a76b0SSuyog Pawar 
397*c83a76b0SSuyog Pawar     /* perform all one initialisation here */
398*c83a76b0SSuyog Pawar     for(i4_thrds = 0; i4_thrds < ps_master_ctxt->i4_num_proc_thrds; i4_thrds++)
399*c83a76b0SSuyog Pawar     {
400*c83a76b0SSuyog Pawar         ps_master_ctxt->aps_ipe_thrd_ctxt[i4_thrds] = ps_ctxt;
401*c83a76b0SSuyog Pawar 
402*c83a76b0SSuyog Pawar         /* initialise the CU and TU sizes */
403*c83a76b0SSuyog Pawar         ps_ctxt->u1_ctb_size = (1 << ps_init_prms->s_config_prms.i4_max_log2_cu_size);
404*c83a76b0SSuyog Pawar         ps_ctxt->u1_min_cu_size = (1 << ps_init_prms->s_config_prms.i4_min_log2_cu_size);
405*c83a76b0SSuyog Pawar         ps_ctxt->u1_min_tu_size = (1 << ps_init_prms->s_config_prms.i4_min_log2_tu_size);
406*c83a76b0SSuyog Pawar 
407*c83a76b0SSuyog Pawar         /** Register the function selector pointer*/
408*c83a76b0SSuyog Pawar         ps_ctxt->ps_func_selector = ps_func_selector;
409*c83a76b0SSuyog Pawar 
410*c83a76b0SSuyog Pawar         /* Initiailize the encoder quality preset           */
411*c83a76b0SSuyog Pawar         /* IPE algorithm is controlled based on this preset */
412*c83a76b0SSuyog Pawar         ps_ctxt->i4_quality_preset =
413*c83a76b0SSuyog Pawar             ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset;
414*c83a76b0SSuyog Pawar 
415*c83a76b0SSuyog Pawar         if(ps_ctxt->i4_quality_preset == IHEVCE_QUALITY_P7)
416*c83a76b0SSuyog Pawar         {
417*c83a76b0SSuyog Pawar             ps_ctxt->i4_quality_preset = IHEVCE_QUALITY_P6;
418*c83a76b0SSuyog Pawar         }
419*c83a76b0SSuyog Pawar 
420*c83a76b0SSuyog Pawar         /* initialise all the pointer to start of arrays */
421*c83a76b0SSuyog Pawar         ps_ctxt->ps_ipe_cu_tree = &ps_ctxt->as_ipe_cu_tree[0];
422*c83a76b0SSuyog Pawar 
423*c83a76b0SSuyog Pawar         /* initialize QP */
424*c83a76b0SSuyog Pawar         ps_ctxt->i1_QP =
425*c83a76b0SSuyog Pawar             ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].ai4_frame_qp[i4_ref_id];
426*c83a76b0SSuyog Pawar         ps_ctxt->u1_num_b_frames =
427*c83a76b0SSuyog Pawar             (1 << ps_init_prms->s_coding_tools_prms.i4_max_temporal_layers) - 1;
428*c83a76b0SSuyog Pawar 
429*c83a76b0SSuyog Pawar         ps_ctxt->b_sad_type = IPE_SAD_TYPE;
430*c83a76b0SSuyog Pawar         ps_ctxt->u1_ipe_step_size = IPE_STEP_SIZE;
431*c83a76b0SSuyog Pawar 
432*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_0] =
433*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_planar_fptr;
434*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_1] =
435*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_dc_fptr;
436*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_2] =
437*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_mode2_fptr;
438*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_3TO9] =
439*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_mode_3_to_9_fptr;
440*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_10] =
441*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_horz_fptr;
442*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_11TO17] =
443*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_mode_11_to_17_fptr;
444*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_18_34] =
445*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_mode_18_34_fptr;
446*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_19TO25] =
447*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_mode_19_to_25_fptr;
448*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_26] =
449*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_ver_fptr;
450*c83a76b0SSuyog Pawar         ps_ctxt->apf_ipe_lum_ip[IPE_FUNC_MODE_27TO33] =
451*c83a76b0SSuyog Pawar             ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_mode_27_to_33_fptr;
452*c83a76b0SSuyog Pawar 
453*c83a76b0SSuyog Pawar         /* nbr parameters initialization */
454*c83a76b0SSuyog Pawar         /* perform all one initialisation here */
455*c83a76b0SSuyog Pawar 
456*c83a76b0SSuyog Pawar         ps_ctxt->i4_nbr_map_strd = MAX_PU_IN_CTB_ROW + 1 + 8;
457*c83a76b0SSuyog Pawar 
458*c83a76b0SSuyog Pawar         ps_ctxt->pu1_ctb_nbr_map = ps_ctxt->au1_nbr_ctb_map[0];
459*c83a76b0SSuyog Pawar 
460*c83a76b0SSuyog Pawar         /* move the pointer to 1,2 location */
461*c83a76b0SSuyog Pawar         ps_ctxt->pu1_ctb_nbr_map += ps_ctxt->i4_nbr_map_strd;
462*c83a76b0SSuyog Pawar         ps_ctxt->pu1_ctb_nbr_map++;
463*c83a76b0SSuyog Pawar         ps_ctxt->i4_l0ipe_qp_mod = ps_init_prms->s_config_prms.i4_cu_level_rc & 1;
464*c83a76b0SSuyog Pawar         ps_ctxt->i4_pass = ps_init_prms->s_pass_prms.i4_pass;
465*c83a76b0SSuyog Pawar         if(ps_init_prms->s_coding_tools_prms.i4_use_default_sc_mtx == 0)
466*c83a76b0SSuyog Pawar         {
467*c83a76b0SSuyog Pawar             /* initialise the scale & rescale matricies */
468*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[0] = (WORD16 *)&gi2_flat_scale_mat_4x4[0];
469*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[1] = (WORD16 *)&gi2_flat_scale_mat_4x4[0];
470*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[2] = (WORD16 *)&gi2_flat_scale_mat_8x8[0];
471*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[3] = (WORD16 *)&gi2_flat_scale_mat_16x16[0];
472*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[4] = (WORD16 *)&gi2_flat_scale_mat_32x32[0];
473*c83a76b0SSuyog Pawar             /*init for inter matrix*/
474*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[5] = (WORD16 *)&gi2_flat_scale_mat_4x4[0];
475*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[6] = (WORD16 *)&gi2_flat_scale_mat_4x4[0];
476*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[7] = (WORD16 *)&gi2_flat_scale_mat_8x8[0];
477*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[8] = (WORD16 *)&gi2_flat_scale_mat_16x16[0];
478*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[9] = (WORD16 *)&gi2_flat_scale_mat_32x32[0];
479*c83a76b0SSuyog Pawar 
480*c83a76b0SSuyog Pawar             /*init for rescale matrix*/
481*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[0] = (WORD16 *)&gi2_flat_rescale_mat_4x4[0];
482*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[1] = (WORD16 *)&gi2_flat_rescale_mat_4x4[0];
483*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[2] = (WORD16 *)&gi2_flat_rescale_mat_8x8[0];
484*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[3] = (WORD16 *)&gi2_flat_rescale_mat_16x16[0];
485*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[4] = (WORD16 *)&gi2_flat_rescale_mat_32x32[0];
486*c83a76b0SSuyog Pawar             /*init for rescale inter matrix*/
487*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[5] = (WORD16 *)&gi2_flat_rescale_mat_4x4[0];
488*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[6] = (WORD16 *)&gi2_flat_rescale_mat_4x4[0];
489*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[7] = (WORD16 *)&gi2_flat_rescale_mat_8x8[0];
490*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[8] = (WORD16 *)&gi2_flat_rescale_mat_16x16[0];
491*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[9] = (WORD16 *)&gi2_flat_rescale_mat_32x32[0];
492*c83a76b0SSuyog Pawar         }
493*c83a76b0SSuyog Pawar         else if(ps_init_prms->s_coding_tools_prms.i4_use_default_sc_mtx == 1)
494*c83a76b0SSuyog Pawar         {
495*c83a76b0SSuyog Pawar             /* initialise the scale & rescale matricies */
496*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[0] = (WORD16 *)&gi2_flat_scale_mat_4x4[0];
497*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[1] = (WORD16 *)&gi2_flat_scale_mat_4x4[0];
498*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[2] = (WORD16 *)&gi2_intra_default_scale_mat_8x8[0];
499*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[3] = (WORD16 *)&gi2_intra_default_scale_mat_16x16[0];
500*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[4] = (WORD16 *)&gi2_intra_default_scale_mat_32x32[0];
501*c83a76b0SSuyog Pawar             /*init for inter matrix*/
502*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[5] = (WORD16 *)&gi2_flat_scale_mat_4x4[0];
503*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[6] = (WORD16 *)&gi2_flat_scale_mat_4x4[0];
504*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[7] = (WORD16 *)&gi2_inter_default_scale_mat_8x8[0];
505*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[8] = (WORD16 *)&gi2_inter_default_scale_mat_16x16[0];
506*c83a76b0SSuyog Pawar             ps_ctxt->api2_scal_mat[9] = (WORD16 *)&gi2_inter_default_scale_mat_32x32[0];
507*c83a76b0SSuyog Pawar 
508*c83a76b0SSuyog Pawar             /*init for rescale matrix*/
509*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[0] = (WORD16 *)&gi2_flat_rescale_mat_4x4[0];
510*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[1] = (WORD16 *)&gi2_flat_rescale_mat_4x4[0];
511*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[2] = (WORD16 *)&gi2_intra_default_rescale_mat_8x8[0];
512*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[3] = (WORD16 *)&gi2_intra_default_rescale_mat_16x16[0];
513*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[4] = (WORD16 *)&gi2_intra_default_rescale_mat_32x32[0];
514*c83a76b0SSuyog Pawar             /*init for rescale inter matrix*/
515*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[5] = (WORD16 *)&gi2_flat_rescale_mat_4x4[0];
516*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[6] = (WORD16 *)&gi2_flat_rescale_mat_4x4[0];
517*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[7] = (WORD16 *)&gi2_inter_default_rescale_mat_8x8[0];
518*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[8] = (WORD16 *)&gi2_inter_default_rescale_mat_16x16[0];
519*c83a76b0SSuyog Pawar             ps_ctxt->api2_rescal_mat[9] = (WORD16 *)&gi2_inter_default_rescale_mat_32x32[0];
520*c83a76b0SSuyog Pawar         }
521*c83a76b0SSuyog Pawar         else
522*c83a76b0SSuyog Pawar         {
523*c83a76b0SSuyog Pawar             ASSERT(0);
524*c83a76b0SSuyog Pawar         }
525*c83a76b0SSuyog Pawar 
526*c83a76b0SSuyog Pawar         ps_ctxt->u1_bit_depth = ps_init_prms->s_tgt_lyr_prms.i4_internal_bit_depth;
527*c83a76b0SSuyog Pawar 
528*c83a76b0SSuyog Pawar         /**
529*c83a76b0SSuyog Pawar         * Initialize the intra prediction modes map for the CTB to INTRA_DC
530*c83a76b0SSuyog Pawar         **/
531*c83a76b0SSuyog Pawar         {
532*c83a76b0SSuyog Pawar             WORD32 row, col;
533*c83a76b0SSuyog Pawar             for(row = 0; row < (MAX_TU_ROW_IN_CTB + 1); row++)
534*c83a76b0SSuyog Pawar                 for(col = 0; col < (MAX_TU_COL_IN_CTB + 1); col++)
535*c83a76b0SSuyog Pawar                     ps_ctxt->au1_ctb_mode_map[row][col] = INTRA_DC;
536*c83a76b0SSuyog Pawar         }
537*c83a76b0SSuyog Pawar 
538*c83a76b0SSuyog Pawar         ihevce_cmn_utils_instr_set_router(
539*c83a76b0SSuyog Pawar             &ps_ctxt->s_cmn_opt_func, u1_is_popcnt_available, ps_init_prms->e_arch_type);
540*c83a76b0SSuyog Pawar 
541*c83a76b0SSuyog Pawar         ihevce_ipe_instr_set_router(
542*c83a76b0SSuyog Pawar             &ps_ctxt->s_ipe_optimised_function_list, ps_init_prms->e_arch_type);
543*c83a76b0SSuyog Pawar 
544*c83a76b0SSuyog Pawar         /* increment the thread ctxt pointer */
545*c83a76b0SSuyog Pawar         ps_ctxt++;
546*c83a76b0SSuyog Pawar     }
547*c83a76b0SSuyog Pawar 
548*c83a76b0SSuyog Pawar     /* return the handle to caller */
549*c83a76b0SSuyog Pawar     return ((void *)ps_master_ctxt);
550*c83a76b0SSuyog Pawar }
551*c83a76b0SSuyog Pawar /*!
552*c83a76b0SSuyog Pawar ******************************************************************************
553*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_get_frame_intra_satd_cost \endif
554*c83a76b0SSuyog Pawar *
555*c83a76b0SSuyog Pawar * \brief
556*c83a76b0SSuyog Pawar *    Function to export frame-level accumalated SATD .
557*c83a76b0SSuyog Pawar *
558*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to IPE module
559*c83a76b0SSuyog Pawar *
560*c83a76b0SSuyog Pawar * \return
561*c83a76b0SSuyog Pawar *    None
562*c83a76b0SSuyog Pawar *
563*c83a76b0SSuyog Pawar * \author
564*c83a76b0SSuyog Pawar *  Ittiam
565*c83a76b0SSuyog Pawar *
566*c83a76b0SSuyog Pawar *****************************************************************************
567*c83a76b0SSuyog Pawar */
ihevce_ipe_get_frame_intra_satd_cost(void * pv_ctxt,LWORD64 * pi8_frame_satd_by_qpmod,LWORD64 * pi8_frame_acc_mode_bits_cost,LWORD64 * pi8_frame_acc_activity_factor,LWORD64 * pi8_frame_l0_acc_satd)568*c83a76b0SSuyog Pawar LWORD64 ihevce_ipe_get_frame_intra_satd_cost(
569*c83a76b0SSuyog Pawar     void *pv_ctxt,
570*c83a76b0SSuyog Pawar     LWORD64 *pi8_frame_satd_by_qpmod,
571*c83a76b0SSuyog Pawar     LWORD64 *pi8_frame_acc_mode_bits_cost,
572*c83a76b0SSuyog Pawar     LWORD64 *pi8_frame_acc_activity_factor,
573*c83a76b0SSuyog Pawar     LWORD64 *pi8_frame_l0_acc_satd)
574*c83a76b0SSuyog Pawar {
575*c83a76b0SSuyog Pawar     WORD32 i4_thrds;
576*c83a76b0SSuyog Pawar 
577*c83a76b0SSuyog Pawar     ihevce_ipe_master_ctxt_t *ps_master_ctxt;
578*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt;
579*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_satd_cost = 0;
580*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_satd = 0;
581*c83a76b0SSuyog Pawar     LWORD64 i8_frame_satd_by_qpmod = 0;
582*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_mode_bits_cost = 0;
583*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_activity_factor = 0;
584*c83a76b0SSuyog Pawar     /* IPE master state structure */
585*c83a76b0SSuyog Pawar     ps_master_ctxt = (ihevce_ipe_master_ctxt_t *)pv_ctxt;
586*c83a76b0SSuyog Pawar 
587*c83a76b0SSuyog Pawar     /* perform all one initialisation here */
588*c83a76b0SSuyog Pawar     for(i4_thrds = 0; i4_thrds < ps_master_ctxt->i4_num_proc_thrds; i4_thrds++)
589*c83a76b0SSuyog Pawar     {
590*c83a76b0SSuyog Pawar         ps_ctxt = ps_master_ctxt->aps_ipe_thrd_ctxt[i4_thrds];
591*c83a76b0SSuyog Pawar 
592*c83a76b0SSuyog Pawar         i8_frame_acc_satd_cost += ps_ctxt->i8_frame_acc_satd_cost;
593*c83a76b0SSuyog Pawar         i8_frame_satd_by_qpmod += (ps_ctxt->i8_frame_acc_satd_by_modqp_q10 >> SATD_BY_ACT_Q_FAC);
594*c83a76b0SSuyog Pawar         i8_frame_acc_mode_bits_cost += ps_ctxt->i8_frame_acc_mode_bits_cost;
595*c83a76b0SSuyog Pawar 
596*c83a76b0SSuyog Pawar         i8_frame_acc_activity_factor += ps_ctxt->i8_frame_acc_act_factor;
597*c83a76b0SSuyog Pawar 
598*c83a76b0SSuyog Pawar         i8_frame_acc_satd += ps_ctxt->i8_frame_acc_satd;
599*c83a76b0SSuyog Pawar     }
600*c83a76b0SSuyog Pawar     *pi8_frame_satd_by_qpmod = i8_frame_satd_by_qpmod;
601*c83a76b0SSuyog Pawar 
602*c83a76b0SSuyog Pawar     *pi8_frame_acc_mode_bits_cost = i8_frame_acc_mode_bits_cost;
603*c83a76b0SSuyog Pawar 
604*c83a76b0SSuyog Pawar     *pi8_frame_acc_activity_factor = i8_frame_acc_activity_factor;
605*c83a76b0SSuyog Pawar 
606*c83a76b0SSuyog Pawar     *pi8_frame_l0_acc_satd = i8_frame_acc_satd;
607*c83a76b0SSuyog Pawar 
608*c83a76b0SSuyog Pawar     return (i8_frame_acc_satd_cost);
609*c83a76b0SSuyog Pawar }
610*c83a76b0SSuyog Pawar 
611*c83a76b0SSuyog Pawar /**
612*c83a76b0SSuyog Pawar *******************************************************************************
613*c83a76b0SSuyog Pawar * \if Function name : ihevce_intra_pred_ref_filtering \endif
614*c83a76b0SSuyog Pawar *
615*c83a76b0SSuyog Pawar * \brief
616*c83a76b0SSuyog Pawar *    Intra prediction interpolation filter for ref_filtering for Encoder
617*c83a76b0SSuyog Pawar *
618*c83a76b0SSuyog Pawar * \par Description:
619*c83a76b0SSuyog Pawar *    Reference DC filtering for neighboring samples dependent  on TU size and
620*c83a76b0SSuyog Pawar *    mode  Refer to section 8.4.4.2.3 in the standard
621*c83a76b0SSuyog Pawar *
622*c83a76b0SSuyog Pawar * \param[in] pu1_src pointer to the source
623*c83a76b0SSuyog Pawar * \param[out] pu1_dst pointer to the destination
624*c83a76b0SSuyog Pawar * \param[in] nt integer Transform Block size
625*c83a76b0SSuyog Pawar *
626*c83a76b0SSuyog Pawar * \returns
627*c83a76b0SSuyog Pawar *  none
628*c83a76b0SSuyog Pawar *
629*c83a76b0SSuyog Pawar * \author
630*c83a76b0SSuyog Pawar *  Ittiam
631*c83a76b0SSuyog Pawar *
632*c83a76b0SSuyog Pawar *******************************************************************************
633*c83a76b0SSuyog Pawar */
634*c83a76b0SSuyog Pawar 
635*c83a76b0SSuyog Pawar #if IHEVCE_INTRA_REF_FILTERING == C
ihevce_intra_pred_ref_filtering(UWORD8 * pu1_src,WORD32 nt,UWORD8 * pu1_dst)636*c83a76b0SSuyog Pawar void ihevce_intra_pred_ref_filtering(UWORD8 *pu1_src, WORD32 nt, UWORD8 *pu1_dst)
637*c83a76b0SSuyog Pawar {
638*c83a76b0SSuyog Pawar     WORD32 i; /* Generic indexing variable */
639*c83a76b0SSuyog Pawar     WORD32 four_nt = 4 * nt;
640*c83a76b0SSuyog Pawar 
641*c83a76b0SSuyog Pawar     /* Extremities Untouched*/
642*c83a76b0SSuyog Pawar     pu1_dst[0] = pu1_src[0];
643*c83a76b0SSuyog Pawar     pu1_dst[4 * nt] = pu1_src[4 * nt];
644*c83a76b0SSuyog Pawar     /* Perform bilinear filtering of Reference Samples */
645*c83a76b0SSuyog Pawar     for(i = 0; i < (four_nt - 1); i++)
646*c83a76b0SSuyog Pawar     {
647*c83a76b0SSuyog Pawar         pu1_dst[i + 1] = (pu1_src[i] + 2 * pu1_src[i + 1] + pu1_src[i + 2] + 2) >> 2;
648*c83a76b0SSuyog Pawar     }
649*c83a76b0SSuyog Pawar }
650*c83a76b0SSuyog Pawar #endif
651*c83a76b0SSuyog Pawar 
652*c83a76b0SSuyog Pawar /*!
653*c83a76b0SSuyog Pawar ******************************************************************************
654*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_process_ctb \endif
655*c83a76b0SSuyog Pawar *
656*c83a76b0SSuyog Pawar * \brief
657*c83a76b0SSuyog Pawar *    CTB level IPE function
658*c83a76b0SSuyog Pawar *
659*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to IPE module
660*c83a76b0SSuyog Pawar * \param[in] ps_frm_ctb_prms : CTB characteristics parameters
661*c83a76b0SSuyog Pawar * \param[in] ps_curr_src  : pointer to input yuv buffer (row buffer)
662*c83a76b0SSuyog Pawar * \param[out] ps_ctb_out : pointer to CTB analyse output structure (row buffer)
663*c83a76b0SSuyog Pawar * \param[out] ps_row_cu : pointer to CU analyse output structure (row buffer)
664*c83a76b0SSuyog Pawar *
665*c83a76b0SSuyog Pawar * \return
666*c83a76b0SSuyog Pawar *    None
667*c83a76b0SSuyog Pawar *
668*c83a76b0SSuyog Pawar * Note : This function will receive CTB pointers which may point to
669*c83a76b0SSuyog Pawar * blocks of CTB size or smaller (at the right and bottom edges of the picture)
670*c83a76b0SSuyog Pawar * This function recursively creates smaller square partitions and passes them
671*c83a76b0SSuyog Pawar * on for intra processing estimation
672*c83a76b0SSuyog Pawar *
673*c83a76b0SSuyog Pawar * \author
674*c83a76b0SSuyog Pawar *  Ittiam
675*c83a76b0SSuyog Pawar *
676*c83a76b0SSuyog Pawar *****************************************************************************
677*c83a76b0SSuyog Pawar */
ihevce_ipe_process_ctb(ihevce_ipe_ctxt_t * ps_ctxt,frm_ctb_ctxt_t * ps_frm_ctb_prms,iv_enc_yuv_buf_t * ps_curr_src,ihevce_ipe_cu_tree_t * ps_curr_ctb_node,ipe_l0_ctb_analyse_for_me_t * ps_l0_ipe_out_ctb,ctb_analyse_t * ps_ctb_out,ihevce_ed_blk_t * ps_ed_l1_ctb,ihevce_ed_blk_t * ps_ed_l2_ctb,ihevce_ed_ctb_l1_t * ps_ed_ctb_l1)678*c83a76b0SSuyog Pawar void ihevce_ipe_process_ctb(
679*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt,
680*c83a76b0SSuyog Pawar     frm_ctb_ctxt_t *ps_frm_ctb_prms,
681*c83a76b0SSuyog Pawar     iv_enc_yuv_buf_t *ps_curr_src,
682*c83a76b0SSuyog Pawar     ihevce_ipe_cu_tree_t *ps_curr_ctb_node,
683*c83a76b0SSuyog Pawar     ipe_l0_ctb_analyse_for_me_t *ps_l0_ipe_out_ctb,
684*c83a76b0SSuyog Pawar     ctb_analyse_t *ps_ctb_out,
685*c83a76b0SSuyog Pawar     //cu_analyse_t      *ps_row_cu,
686*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_l1_ctb,
687*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_l2_ctb,
688*c83a76b0SSuyog Pawar     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1)
689*c83a76b0SSuyog Pawar {
690*c83a76b0SSuyog Pawar     /* reset the map buffer to 0*/
691*c83a76b0SSuyog Pawar     memset(
692*c83a76b0SSuyog Pawar         &ps_ctxt->au1_nbr_ctb_map[0][0],
693*c83a76b0SSuyog Pawar         0,
694*c83a76b0SSuyog Pawar         (MAX_PU_IN_CTB_ROW + 1 + 8) * (MAX_PU_IN_CTB_ROW + 1 + 8));
695*c83a76b0SSuyog Pawar 
696*c83a76b0SSuyog Pawar     /* set the CTB neighbour availability flags */
697*c83a76b0SSuyog Pawar     ihevce_set_ctb_nbr(
698*c83a76b0SSuyog Pawar         &ps_ctxt->s_ctb_nbr_avail_flags,
699*c83a76b0SSuyog Pawar         ps_ctxt->pu1_ctb_nbr_map,
700*c83a76b0SSuyog Pawar         ps_ctxt->i4_nbr_map_strd,
701*c83a76b0SSuyog Pawar         ps_ctxt->u2_ctb_num_in_row,
702*c83a76b0SSuyog Pawar         ps_ctxt->u2_ctb_row_num,
703*c83a76b0SSuyog Pawar         ps_frm_ctb_prms);
704*c83a76b0SSuyog Pawar 
705*c83a76b0SSuyog Pawar     /* IPE cu and mode decision */
706*c83a76b0SSuyog Pawar     ihevce_bracketing_analysis(
707*c83a76b0SSuyog Pawar         ps_ctxt,
708*c83a76b0SSuyog Pawar         ps_curr_ctb_node,
709*c83a76b0SSuyog Pawar         ps_curr_src,
710*c83a76b0SSuyog Pawar         ps_ctb_out,
711*c83a76b0SSuyog Pawar         //ps_row_cu,
712*c83a76b0SSuyog Pawar         ps_ed_l1_ctb,
713*c83a76b0SSuyog Pawar         ps_ed_l2_ctb,
714*c83a76b0SSuyog Pawar         ps_ed_ctb_l1,
715*c83a76b0SSuyog Pawar         ps_l0_ipe_out_ctb);
716*c83a76b0SSuyog Pawar 
717*c83a76b0SSuyog Pawar     return;
718*c83a76b0SSuyog Pawar }
719*c83a76b0SSuyog Pawar 
720*c83a76b0SSuyog Pawar /*!
721*c83a76b0SSuyog Pawar ******************************************************************************
722*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_process_row \endif
723*c83a76b0SSuyog Pawar *
724*c83a76b0SSuyog Pawar * \brief
725*c83a76b0SSuyog Pawar *    Row level IPE function
726*c83a76b0SSuyog Pawar *
727*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to IPE module
728*c83a76b0SSuyog Pawar * \param[in] ps_frm_ctb_prms : CTB characteristics parameters
729*c83a76b0SSuyog Pawar * \param[in] ps_curr_src  : pointer to input yuv buffer (row buffer)
730*c83a76b0SSuyog Pawar * \param[out] ps_ctb_out : pointer to CTB analyse output structure (row buffer)
731*c83a76b0SSuyog Pawar * \param[out] ps_cu_out : pointer to CU analyse output structure (row buffer)
732*c83a76b0SSuyog Pawar *\param[out]  pi4_num_ctbs_cur_row  : pointer to store the number of ctbs processed in current row
733*c83a76b0SSuyog Pawar *\param[in]  pi4_num_ctbs_top_row  : pointer to check the number of ctbs processed in top row
734*c83a76b0SSuyog Pawar *
735*c83a76b0SSuyog Pawar * \return
736*c83a76b0SSuyog Pawar *    None
737*c83a76b0SSuyog Pawar *
738*c83a76b0SSuyog Pawar * Note : Currently the frame level calculations done assumes that
739*c83a76b0SSuyog Pawar *        framewidth of the input are excat multiple of ctbsize
740*c83a76b0SSuyog Pawar *
741*c83a76b0SSuyog Pawar * \author
742*c83a76b0SSuyog Pawar *  Ittiam
743*c83a76b0SSuyog Pawar *
744*c83a76b0SSuyog Pawar *****************************************************************************
745*c83a76b0SSuyog Pawar */
ihevce_ipe_process_row(ihevce_ipe_ctxt_t * ps_ctxt,frm_ctb_ctxt_t * ps_frm_ctb_prms,iv_enc_yuv_buf_t * ps_curr_src,ipe_l0_ctb_analyse_for_me_t * ps_ipe_ctb_out_row,ctb_analyse_t * ps_ctb_out,ihevce_ed_blk_t * ps_ed_l1_row,ihevce_ed_blk_t * ps_ed_l2_row,ihevce_ed_ctb_l1_t * ps_ed_ctb_l1_row,WORD32 blk_inc_ctb_l1,WORD32 blk_inc_ctb_l2)746*c83a76b0SSuyog Pawar void ihevce_ipe_process_row(
747*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt,
748*c83a76b0SSuyog Pawar     frm_ctb_ctxt_t *ps_frm_ctb_prms,
749*c83a76b0SSuyog Pawar     iv_enc_yuv_buf_t *ps_curr_src,
750*c83a76b0SSuyog Pawar     ipe_l0_ctb_analyse_for_me_t *ps_ipe_ctb_out_row,
751*c83a76b0SSuyog Pawar     ctb_analyse_t *ps_ctb_out,
752*c83a76b0SSuyog Pawar     //cu_analyse_t   *ps_row_cu,
753*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_l1_row,
754*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_l2_row,
755*c83a76b0SSuyog Pawar     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1_row,
756*c83a76b0SSuyog Pawar     WORD32 blk_inc_ctb_l1,
757*c83a76b0SSuyog Pawar     WORD32 blk_inc_ctb_l2)
758*c83a76b0SSuyog Pawar {
759*c83a76b0SSuyog Pawar     /* local variables */
760*c83a76b0SSuyog Pawar     UWORD16 ctb_ctr;
761*c83a76b0SSuyog Pawar     iv_enc_yuv_buf_t s_curr_src_bufs;
762*c83a76b0SSuyog Pawar     ipe_l0_ctb_analyse_for_me_t *ps_l0_ipe_out_ctb;
763*c83a76b0SSuyog Pawar     UWORD16 u2_pic_wdt;
764*c83a76b0SSuyog Pawar     UWORD16 u2_pic_hgt;
765*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_l1_ctb;
766*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_l2_ctb;
767*c83a76b0SSuyog Pawar     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1;
768*c83a76b0SSuyog Pawar 
769*c83a76b0SSuyog Pawar     UWORD8 u1_ctb_size;
770*c83a76b0SSuyog Pawar 
771*c83a76b0SSuyog Pawar     u2_pic_wdt = ps_frm_ctb_prms->i4_cu_aligned_pic_wd;
772*c83a76b0SSuyog Pawar     u2_pic_hgt = ps_frm_ctb_prms->i4_cu_aligned_pic_ht;
773*c83a76b0SSuyog Pawar 
774*c83a76b0SSuyog Pawar     u1_ctb_size = ps_ctxt->u1_ctb_size;
775*c83a76b0SSuyog Pawar 
776*c83a76b0SSuyog Pawar     /* ----------------------------------------------------- */
777*c83a76b0SSuyog Pawar     /* store the stride and dimensions of source             */
778*c83a76b0SSuyog Pawar     /* buffer pointers will be over written at every CTB row */
779*c83a76b0SSuyog Pawar     /* ----------------------------------------------------- */
780*c83a76b0SSuyog Pawar     memcpy(&s_curr_src_bufs, ps_curr_src, sizeof(iv_enc_yuv_buf_t));
781*c83a76b0SSuyog Pawar     ps_l0_ipe_out_ctb = ps_ipe_ctb_out_row;
782*c83a76b0SSuyog Pawar 
783*c83a76b0SSuyog Pawar     /* --------- Loop over all the CTBs in a row --------------- */
784*c83a76b0SSuyog Pawar     for(ctb_ctr = 0; ctb_ctr < ps_frm_ctb_prms->i4_num_ctbs_horz; ctb_ctr++)
785*c83a76b0SSuyog Pawar     {
786*c83a76b0SSuyog Pawar         //UWORD8            num_cus_in_ctb;
787*c83a76b0SSuyog Pawar 
788*c83a76b0SSuyog Pawar         UWORD8 *pu1_tmp;
789*c83a76b0SSuyog Pawar 
790*c83a76b0SSuyog Pawar         /* Create pointer to ctb node */
791*c83a76b0SSuyog Pawar         ihevce_ipe_cu_tree_t *ps_ctb_node;
792*c83a76b0SSuyog Pawar 
793*c83a76b0SSuyog Pawar         WORD32 nbr_flags;
794*c83a76b0SSuyog Pawar 
795*c83a76b0SSuyog Pawar         WORD32 row;
796*c83a76b0SSuyog Pawar         /* luma src */
797*c83a76b0SSuyog Pawar         pu1_tmp = (UWORD8 *)ps_curr_src->pv_y_buf;
798*c83a76b0SSuyog Pawar         pu1_tmp += (ctb_ctr * ps_frm_ctb_prms->i4_ctb_size);
799*c83a76b0SSuyog Pawar 
800*c83a76b0SSuyog Pawar         s_curr_src_bufs.pv_y_buf = pu1_tmp;
801*c83a76b0SSuyog Pawar 
802*c83a76b0SSuyog Pawar         /* Cb & CR pixel interleaved src */
803*c83a76b0SSuyog Pawar         pu1_tmp = (UWORD8 *)ps_curr_src->pv_u_buf;
804*c83a76b0SSuyog Pawar         pu1_tmp += (ctb_ctr * (ps_frm_ctb_prms->i4_ctb_size >> 1));
805*c83a76b0SSuyog Pawar 
806*c83a76b0SSuyog Pawar         s_curr_src_bufs.pv_u_buf = pu1_tmp;
807*c83a76b0SSuyog Pawar 
808*c83a76b0SSuyog Pawar         /* Store the number of current ctb within row in the context */
809*c83a76b0SSuyog Pawar         ps_ctxt->u2_ctb_num_in_row = ctb_ctr;
810*c83a76b0SSuyog Pawar 
811*c83a76b0SSuyog Pawar         /* Initialize number of coding units in ctb to 0 */
812*c83a76b0SSuyog Pawar         ps_ctb_out->u1_num_cus_in_ctb = 0;
813*c83a76b0SSuyog Pawar         /* Initialize split flag to 0 - No partition  */
814*c83a76b0SSuyog Pawar         ps_ctb_out->u4_cu_split_flags = 0;
815*c83a76b0SSuyog Pawar         /* store the cu pointer for current ctb out */
816*c83a76b0SSuyog Pawar         //ps_ctb_out->ps_coding_units_in_ctb = ps_row_cu;
817*c83a76b0SSuyog Pawar 
818*c83a76b0SSuyog Pawar         /* Initialize the CTB parameters at the root node level */
819*c83a76b0SSuyog Pawar         ps_ctb_node = ps_ctxt->ps_ipe_cu_tree;
820*c83a76b0SSuyog Pawar         ps_ctb_node->ps_parent = NULL;
821*c83a76b0SSuyog Pawar         ps_ctb_node->u1_depth = 0;
822*c83a76b0SSuyog Pawar         ps_ctb_node->u1_cu_size = u1_ctb_size;
823*c83a76b0SSuyog Pawar         ps_ctb_node->u2_x0 = 0;
824*c83a76b0SSuyog Pawar         ps_ctb_node->u2_y0 = 0;
825*c83a76b0SSuyog Pawar 
826*c83a76b0SSuyog Pawar         ps_ctb_node->u2_orig_x = ctb_ctr * ps_ctb_node->u1_cu_size;
827*c83a76b0SSuyog Pawar         ps_ctb_node->u2_orig_y = ps_ctxt->u2_ctb_row_num * ps_ctb_node->u1_cu_size;
828*c83a76b0SSuyog Pawar 
829*c83a76b0SSuyog Pawar         ps_ctb_node->u1_width = u1_ctb_size;
830*c83a76b0SSuyog Pawar         ps_ctb_node->u1_height = u1_ctb_size;
831*c83a76b0SSuyog Pawar #if !(PIC_ALIGN_CTB_SIZE)
832*c83a76b0SSuyog Pawar         if(ps_ctxt->u2_ctb_num_in_row == (ps_frm_ctb_prms->i4_num_ctbs_horz - 1))
833*c83a76b0SSuyog Pawar         {
834*c83a76b0SSuyog Pawar             ps_ctb_node->u1_width = u2_pic_wdt - (ps_ctxt->u2_ctb_num_in_row) * (u1_ctb_size);
835*c83a76b0SSuyog Pawar         }
836*c83a76b0SSuyog Pawar         if(ps_ctxt->u2_ctb_row_num == (ps_frm_ctb_prms->i4_num_ctbs_vert - 1))
837*c83a76b0SSuyog Pawar         {
838*c83a76b0SSuyog Pawar             ps_ctb_node->u1_height = u2_pic_hgt - (ps_ctxt->u2_ctb_row_num) * (u1_ctb_size);
839*c83a76b0SSuyog Pawar         }
840*c83a76b0SSuyog Pawar #endif
841*c83a76b0SSuyog Pawar 
842*c83a76b0SSuyog Pawar         switch(ps_ctb_node->u1_cu_size)
843*c83a76b0SSuyog Pawar         {
844*c83a76b0SSuyog Pawar         case 64:
845*c83a76b0SSuyog Pawar             ps_ctb_node->u1_log2_nt = 6;
846*c83a76b0SSuyog Pawar             ps_ctb_node->u1_part_flag_pos = 0;
847*c83a76b0SSuyog Pawar             break;
848*c83a76b0SSuyog Pawar         case 32:
849*c83a76b0SSuyog Pawar             ps_ctb_node->u1_log2_nt = 5;
850*c83a76b0SSuyog Pawar             ps_ctb_node->u1_part_flag_pos = 4;
851*c83a76b0SSuyog Pawar             break;
852*c83a76b0SSuyog Pawar         case 16:
853*c83a76b0SSuyog Pawar             ps_ctb_node->u1_log2_nt = 4;
854*c83a76b0SSuyog Pawar             ps_ctb_node->u1_part_flag_pos = 8;
855*c83a76b0SSuyog Pawar             break;
856*c83a76b0SSuyog Pawar         }
857*c83a76b0SSuyog Pawar 
858*c83a76b0SSuyog Pawar         /* Set neighbor flags for the CTB */
859*c83a76b0SSuyog Pawar         nbr_flags = 0;
860*c83a76b0SSuyog Pawar 
861*c83a76b0SSuyog Pawar         if(ps_ctxt->u2_ctb_num_in_row != 0)
862*c83a76b0SSuyog Pawar         {
863*c83a76b0SSuyog Pawar             nbr_flags |= LEFT_FLAG; /* Set Left Flag if not in first column */
864*c83a76b0SSuyog Pawar             ps_ctb_node->u1_num_left_avail = ((u2_pic_hgt - ps_ctb_node->u2_orig_y) >= u1_ctb_size)
865*c83a76b0SSuyog Pawar                                                  ? u1_ctb_size
866*c83a76b0SSuyog Pawar                                                  : u2_pic_hgt - ps_ctb_node->u2_orig_y;
867*c83a76b0SSuyog Pawar         }
868*c83a76b0SSuyog Pawar         else
869*c83a76b0SSuyog Pawar         {
870*c83a76b0SSuyog Pawar             ps_ctb_node->u1_num_left_avail = 0;
871*c83a76b0SSuyog Pawar         }
872*c83a76b0SSuyog Pawar 
873*c83a76b0SSuyog Pawar         if((ps_ctxt->u2_ctb_num_in_row != 0) && (ps_ctxt->u2_ctb_row_num != 0))
874*c83a76b0SSuyog Pawar             nbr_flags |= TOP_LEFT_FLAG; /* Set Top-Left Flag if not in first row or first column */
875*c83a76b0SSuyog Pawar 
876*c83a76b0SSuyog Pawar         if(ps_ctxt->u2_ctb_row_num != 0)
877*c83a76b0SSuyog Pawar         {
878*c83a76b0SSuyog Pawar             nbr_flags |= TOP_FLAG; /* Set Top Flag if not in first row */
879*c83a76b0SSuyog Pawar             ps_ctb_node->u1_num_top_avail = ((u2_pic_wdt - ps_ctb_node->u2_orig_x) >= u1_ctb_size)
880*c83a76b0SSuyog Pawar                                                 ? u1_ctb_size
881*c83a76b0SSuyog Pawar                                                 : u2_pic_wdt - ps_ctb_node->u2_orig_x;
882*c83a76b0SSuyog Pawar         }
883*c83a76b0SSuyog Pawar         else
884*c83a76b0SSuyog Pawar         {
885*c83a76b0SSuyog Pawar             ps_ctb_node->u1_num_top_avail = 0;
886*c83a76b0SSuyog Pawar         }
887*c83a76b0SSuyog Pawar 
888*c83a76b0SSuyog Pawar         if(ps_ctxt->u2_ctb_row_num != 0)
889*c83a76b0SSuyog Pawar         {
890*c83a76b0SSuyog Pawar             if(ps_ctxt->u2_ctb_num_in_row == (ps_frm_ctb_prms->i4_num_ctbs_horz - 1))
891*c83a76b0SSuyog Pawar                 ps_ctb_node->u1_num_top_right_avail = 0;
892*c83a76b0SSuyog Pawar             else
893*c83a76b0SSuyog Pawar             {
894*c83a76b0SSuyog Pawar                 ps_ctb_node->u1_num_top_right_avail =
895*c83a76b0SSuyog Pawar                     ((u2_pic_wdt - ps_ctb_node->u2_orig_x - u1_ctb_size) >= u1_ctb_size)
896*c83a76b0SSuyog Pawar                         ? u1_ctb_size
897*c83a76b0SSuyog Pawar                         : u2_pic_wdt - ps_ctb_node->u2_orig_x - u1_ctb_size;
898*c83a76b0SSuyog Pawar                 nbr_flags |=
899*c83a76b0SSuyog Pawar                     TOP_RIGHT_FLAG; /* Set Top-Right Flag if not in first row or last column*/
900*c83a76b0SSuyog Pawar             }
901*c83a76b0SSuyog Pawar         }
902*c83a76b0SSuyog Pawar         else
903*c83a76b0SSuyog Pawar         {
904*c83a76b0SSuyog Pawar             ps_ctb_node->u1_num_top_right_avail = 0;
905*c83a76b0SSuyog Pawar         }
906*c83a76b0SSuyog Pawar 
907*c83a76b0SSuyog Pawar         ps_ctb_node->u1_num_bottom_left_avail = 0;
908*c83a76b0SSuyog Pawar 
909*c83a76b0SSuyog Pawar         ps_ctb_node->i4_nbr_flag = nbr_flags;
910*c83a76b0SSuyog Pawar 
911*c83a76b0SSuyog Pawar         /**
912*c83a76b0SSuyog Pawar         * Update CTB Mode Map
913*c83a76b0SSuyog Pawar         * In case this is first CTB in a row, set left most column to INTRA_DC (NA)
914*c83a76b0SSuyog Pawar         * else copy last column to first column
915*c83a76b0SSuyog Pawar         **/
916*c83a76b0SSuyog Pawar         if(ctb_ctr == 0)
917*c83a76b0SSuyog Pawar         {
918*c83a76b0SSuyog Pawar             for(row = 0; row < (MAX_TU_ROW_IN_CTB + 1); row++)
919*c83a76b0SSuyog Pawar             {
920*c83a76b0SSuyog Pawar                 ps_ctxt->au1_ctb_mode_map[row][0] = INTRA_DC;
921*c83a76b0SSuyog Pawar             }
922*c83a76b0SSuyog Pawar         }
923*c83a76b0SSuyog Pawar         else
924*c83a76b0SSuyog Pawar         {
925*c83a76b0SSuyog Pawar             for(row = 0; row < (MAX_TU_ROW_IN_CTB + 1); row++)
926*c83a76b0SSuyog Pawar             {
927*c83a76b0SSuyog Pawar                 ps_ctxt->au1_ctb_mode_map[row][0] =
928*c83a76b0SSuyog Pawar                     ps_ctxt->au1_ctb_mode_map[row][MAX_TU_COL_IN_CTB];
929*c83a76b0SSuyog Pawar             }
930*c83a76b0SSuyog Pawar         }
931*c83a76b0SSuyog Pawar 
932*c83a76b0SSuyog Pawar         /* --------- IPE call at CTB level ------------------ */
933*c83a76b0SSuyog Pawar 
934*c83a76b0SSuyog Pawar         /* IPE CTB function is expected to Decide on the CUs sizes  */
935*c83a76b0SSuyog Pawar         /* and populate the best intra prediction modes and TX flags*/
936*c83a76b0SSuyog Pawar         /* Interface of this CTb level function is kept open */
937*c83a76b0SSuyog Pawar 
938*c83a76b0SSuyog Pawar         ps_ed_l1_ctb = ps_ed_l1_row + ctb_ctr * blk_inc_ctb_l1;
939*c83a76b0SSuyog Pawar         ps_ed_l2_ctb = ps_ed_l2_row + ctb_ctr * blk_inc_ctb_l2;
940*c83a76b0SSuyog Pawar         ps_ed_ctb_l1 = ps_ed_ctb_l1_row + ctb_ctr;
941*c83a76b0SSuyog Pawar 
942*c83a76b0SSuyog Pawar         if(ps_ctxt->u1_use_lambda_derived_from_min_8x8_act_in_ctb)
943*c83a76b0SSuyog Pawar         {
944*c83a76b0SSuyog Pawar             ihevce_ipe_recompute_lambda_from_min_8x8_act_in_ctb(ps_ctxt, ps_ed_ctb_l1);
945*c83a76b0SSuyog Pawar         }
946*c83a76b0SSuyog Pawar 
947*c83a76b0SSuyog Pawar         ihevce_ipe_process_ctb(
948*c83a76b0SSuyog Pawar             ps_ctxt,
949*c83a76b0SSuyog Pawar             ps_frm_ctb_prms,
950*c83a76b0SSuyog Pawar             &s_curr_src_bufs,
951*c83a76b0SSuyog Pawar             ps_ctb_node,
952*c83a76b0SSuyog Pawar             ps_l0_ipe_out_ctb,
953*c83a76b0SSuyog Pawar             ps_ctb_out,
954*c83a76b0SSuyog Pawar             //ps_row_cu,
955*c83a76b0SSuyog Pawar             ps_ed_l1_ctb,
956*c83a76b0SSuyog Pawar             ps_ed_l2_ctb,
957*c83a76b0SSuyog Pawar             ps_ed_ctb_l1);
958*c83a76b0SSuyog Pawar 
959*c83a76b0SSuyog Pawar         /* -------------- ctb level updates ----------------- */
960*c83a76b0SSuyog Pawar 
961*c83a76b0SSuyog Pawar         ps_l0_ipe_out_ctb++;
962*c83a76b0SSuyog Pawar         //num_cus_in_ctb = ps_ctb_out->u1_num_cus_in_ctb;
963*c83a76b0SSuyog Pawar 
964*c83a76b0SSuyog Pawar         //ps_row_cu += num_cus_in_ctb;
965*c83a76b0SSuyog Pawar 
966*c83a76b0SSuyog Pawar         ps_ctb_out++;
967*c83a76b0SSuyog Pawar     }
968*c83a76b0SSuyog Pawar     return;
969*c83a76b0SSuyog Pawar }
970*c83a76b0SSuyog Pawar 
971*c83a76b0SSuyog Pawar /*!
972*c83a76b0SSuyog Pawar ******************************************************************************
973*c83a76b0SSuyog Pawar * \if Function name : ihevce_ipe_process \endif
974*c83a76b0SSuyog Pawar *
975*c83a76b0SSuyog Pawar * \brief
976*c83a76b0SSuyog Pawar *    Frame level IPE function
977*c83a76b0SSuyog Pawar *
978*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to IPE module
979*c83a76b0SSuyog Pawar * \param[in] ps_frm_ctb_prms : CTB characteristics parameters
980*c83a76b0SSuyog Pawar * \param[in] ps_inp  : pointer to input yuv buffer (frame buffer)
981*c83a76b0SSuyog Pawar * \param[out] ps_ctb_out : pointer to CTB analyse output structure (frame buffer)
982*c83a76b0SSuyog Pawar * \param[out] ps_cu_out : pointer to CU analyse output structure (frame buffer)
983*c83a76b0SSuyog Pawar *
984*c83a76b0SSuyog Pawar * \return
985*c83a76b0SSuyog Pawar *    None
986*c83a76b0SSuyog Pawar *
987*c83a76b0SSuyog Pawar * Note : Currently the frame level calculations done assumes that
988*c83a76b0SSuyog Pawar *        framewidth of the input are excat multiple of ctbsize
989*c83a76b0SSuyog Pawar *
990*c83a76b0SSuyog Pawar * \author
991*c83a76b0SSuyog Pawar *  Ittiam
992*c83a76b0SSuyog Pawar *
993*c83a76b0SSuyog Pawar *****************************************************************************
994*c83a76b0SSuyog Pawar */
ihevce_ipe_process(void * pv_ctxt,frm_ctb_ctxt_t * ps_frm_ctb_prms,frm_lambda_ctxt_t * ps_frm_lamda,ihevce_lap_enc_buf_t * ps_curr_inp,pre_enc_L0_ipe_encloop_ctxt_t * ps_L0_IPE_curr_out_pre_enc,ctb_analyse_t * ps_ctb_out,ipe_l0_ctb_analyse_for_me_t * ps_ipe_ctb_out,void * pv_multi_thrd_ctxt,WORD32 slice_type,ihevce_ed_blk_t * ps_ed_pic_l1,ihevce_ed_blk_t * ps_ed_pic_l2,ihevce_ed_ctb_l1_t * ps_ed_ctb_l1_pic,WORD32 thrd_id,WORD32 i4_ping_pong)995*c83a76b0SSuyog Pawar void ihevce_ipe_process(
996*c83a76b0SSuyog Pawar     void *pv_ctxt,
997*c83a76b0SSuyog Pawar     frm_ctb_ctxt_t *ps_frm_ctb_prms,
998*c83a76b0SSuyog Pawar     frm_lambda_ctxt_t *ps_frm_lamda,
999*c83a76b0SSuyog Pawar     ihevce_lap_enc_buf_t *ps_curr_inp,
1000*c83a76b0SSuyog Pawar     pre_enc_L0_ipe_encloop_ctxt_t *ps_L0_IPE_curr_out_pre_enc,
1001*c83a76b0SSuyog Pawar     ctb_analyse_t *ps_ctb_out,
1002*c83a76b0SSuyog Pawar     //cu_analyse_t               *ps_cu_out,
1003*c83a76b0SSuyog Pawar     ipe_l0_ctb_analyse_for_me_t *ps_ipe_ctb_out,
1004*c83a76b0SSuyog Pawar     void *pv_multi_thrd_ctxt,
1005*c83a76b0SSuyog Pawar     WORD32 slice_type,
1006*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_pic_l1,
1007*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_pic_l2,
1008*c83a76b0SSuyog Pawar     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1_pic,
1009*c83a76b0SSuyog Pawar     WORD32 thrd_id,
1010*c83a76b0SSuyog Pawar     WORD32 i4_ping_pong)
1011*c83a76b0SSuyog Pawar {
1012*c83a76b0SSuyog Pawar     /* local variables */
1013*c83a76b0SSuyog Pawar     ihevce_ipe_master_ctxt_t *ps_master_ctxt;
1014*c83a76b0SSuyog Pawar     iv_enc_yuv_buf_t *ps_inp = &ps_curr_inp->s_lap_out.s_input_buf;
1015*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt;
1016*c83a76b0SSuyog Pawar     iv_enc_yuv_buf_t s_curr_src_bufs;
1017*c83a76b0SSuyog Pawar     WORD32 end_of_frame;
1018*c83a76b0SSuyog Pawar 
1019*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_l1_row;
1020*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_l2_row;
1021*c83a76b0SSuyog Pawar     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1_row;
1022*c83a76b0SSuyog Pawar     WORD32 blk_inc_ctb_l1 = 0;
1023*c83a76b0SSuyog Pawar     WORD32 blk_inc_ctb_l2 = 0;
1024*c83a76b0SSuyog Pawar 
1025*c83a76b0SSuyog Pawar     /* Layer 1 pre intra analysis related initilization.
1026*c83a76b0SSuyog Pawar     * Compute no of 8x8 blks in the ctb which which is
1027*c83a76b0SSuyog Pawar     * same as no of 4x4 blks in the ctb in layer 1 */
1028*c83a76b0SSuyog Pawar     blk_inc_ctb_l1 = ps_frm_ctb_prms->i4_ctb_size >> 3;
1029*c83a76b0SSuyog Pawar     blk_inc_ctb_l1 = blk_inc_ctb_l1 * blk_inc_ctb_l1;
1030*c83a76b0SSuyog Pawar 
1031*c83a76b0SSuyog Pawar     /* Layer 2 pre intra analysis related initilization.
1032*c83a76b0SSuyog Pawar     * Compute no of 16x16 blks in the ctb which which is
1033*c83a76b0SSuyog Pawar     * same as no of 8x8 blks in the ctb in layer 2 */
1034*c83a76b0SSuyog Pawar     blk_inc_ctb_l2 = ps_frm_ctb_prms->i4_ctb_size >> 4;
1035*c83a76b0SSuyog Pawar     blk_inc_ctb_l2 = blk_inc_ctb_l2 * blk_inc_ctb_l2;
1036*c83a76b0SSuyog Pawar 
1037*c83a76b0SSuyog Pawar     /* ----------------------------------------------------- */
1038*c83a76b0SSuyog Pawar     /* store the stride and dimensions of source             */
1039*c83a76b0SSuyog Pawar     /* buffer pointers will be over written at every CTB row */
1040*c83a76b0SSuyog Pawar     /* ----------------------------------------------------- */
1041*c83a76b0SSuyog Pawar     memcpy(&s_curr_src_bufs, ps_inp, sizeof(iv_enc_yuv_buf_t));
1042*c83a76b0SSuyog Pawar 
1043*c83a76b0SSuyog Pawar     ps_master_ctxt = (ihevce_ipe_master_ctxt_t *)pv_ctxt;
1044*c83a76b0SSuyog Pawar     ps_ctxt = ps_master_ctxt->aps_ipe_thrd_ctxt[thrd_id];
1045*c83a76b0SSuyog Pawar     end_of_frame = 0;
1046*c83a76b0SSuyog Pawar 
1047*c83a76b0SSuyog Pawar     if(ISLICE == slice_type)
1048*c83a76b0SSuyog Pawar     {
1049*c83a76b0SSuyog Pawar         ps_ctxt->b_sad_type = IPE_SAD_TYPE;
1050*c83a76b0SSuyog Pawar         ps_ctxt->i4_ol_satd_lambda = ps_frm_lamda->i4_ol_satd_lambda_qf;
1051*c83a76b0SSuyog Pawar         ps_ctxt->i4_ol_sad_lambda = ps_frm_lamda->i4_ol_sad_lambda_qf;
1052*c83a76b0SSuyog Pawar     }
1053*c83a76b0SSuyog Pawar     else
1054*c83a76b0SSuyog Pawar     {
1055*c83a76b0SSuyog Pawar         ps_ctxt->b_sad_type = IPE_SAD_TYPE; /* SAD */
1056*c83a76b0SSuyog Pawar         ps_ctxt->i4_ol_satd_lambda = ps_frm_lamda->i4_ol_satd_lambda_qf;
1057*c83a76b0SSuyog Pawar         ps_ctxt->i4_ol_sad_lambda = ps_frm_lamda->i4_ol_sad_lambda_qf;
1058*c83a76b0SSuyog Pawar     }
1059*c83a76b0SSuyog Pawar 
1060*c83a76b0SSuyog Pawar     ihevce_populate_ipe_ol_cu_lambda_prms(
1061*c83a76b0SSuyog Pawar         (void *)ps_ctxt,
1062*c83a76b0SSuyog Pawar         ps_frm_lamda,
1063*c83a76b0SSuyog Pawar         slice_type,
1064*c83a76b0SSuyog Pawar         ps_curr_inp->s_lap_out.i4_temporal_lyr_id,
1065*c83a76b0SSuyog Pawar         IPE_LAMBDA_TYPE);
1066*c83a76b0SSuyog Pawar 
1067*c83a76b0SSuyog Pawar     /* register the slice type in the ctxt */
1068*c83a76b0SSuyog Pawar     ps_ctxt->i4_slice_type = slice_type;
1069*c83a76b0SSuyog Pawar 
1070*c83a76b0SSuyog Pawar     /** Frame-levelSATD cost accumalator init to 0 */
1071*c83a76b0SSuyog Pawar     ps_ctxt->i8_frame_acc_satd_cost = 0;
1072*c83a76b0SSuyog Pawar 
1073*c83a76b0SSuyog Pawar     /** Frame-levelSATD accumalator init to 0 */
1074*c83a76b0SSuyog Pawar     ps_ctxt->i8_frame_acc_satd = 0;
1075*c83a76b0SSuyog Pawar 
1076*c83a76b0SSuyog Pawar     /** Frame-level Activity factor accumalator init to 1 */
1077*c83a76b0SSuyog Pawar     ps_ctxt->i8_frame_acc_act_factor = 1;
1078*c83a76b0SSuyog Pawar 
1079*c83a76b0SSuyog Pawar     /** Frame-levelMode Bits cost accumalator init to 0 */
1080*c83a76b0SSuyog Pawar     ps_ctxt->i8_frame_acc_mode_bits_cost = 0;
1081*c83a76b0SSuyog Pawar 
1082*c83a76b0SSuyog Pawar     /** Frame -level SATD/qp acc init to 0*/
1083*c83a76b0SSuyog Pawar     ps_ctxt->i8_frame_acc_satd_by_modqp_q10 = 0;
1084*c83a76b0SSuyog Pawar 
1085*c83a76b0SSuyog Pawar     /* ------------ Loop over all the CTB rows --------------- */
1086*c83a76b0SSuyog Pawar     while(0 == end_of_frame)
1087*c83a76b0SSuyog Pawar     {
1088*c83a76b0SSuyog Pawar         UWORD8 *pu1_tmp;
1089*c83a76b0SSuyog Pawar         WORD32 vert_ctr;
1090*c83a76b0SSuyog Pawar         //cu_analyse_t *ps_row_cu;
1091*c83a76b0SSuyog Pawar         ctb_analyse_t *ps_ctb_out_row;
1092*c83a76b0SSuyog Pawar         job_queue_t *ps_job;
1093*c83a76b0SSuyog Pawar         ipe_l0_ctb_analyse_for_me_t *ps_ipe_ctb_out_row;
1094*c83a76b0SSuyog Pawar 
1095*c83a76b0SSuyog Pawar         /* Get the current row from the job queue */
1096*c83a76b0SSuyog Pawar         ps_job = (job_queue_t *)ihevce_pre_enc_grp_get_next_job(
1097*c83a76b0SSuyog Pawar             pv_multi_thrd_ctxt, IPE_JOB_LYR0, 1, i4_ping_pong);
1098*c83a76b0SSuyog Pawar 
1099*c83a76b0SSuyog Pawar         /* If all rows are done, set the end of process flag to 1, */
1100*c83a76b0SSuyog Pawar         /* and the current row to -1 */
1101*c83a76b0SSuyog Pawar         if(NULL == ps_job)
1102*c83a76b0SSuyog Pawar         {
1103*c83a76b0SSuyog Pawar             vert_ctr = -1;
1104*c83a76b0SSuyog Pawar             end_of_frame = 1;
1105*c83a76b0SSuyog Pawar         }
1106*c83a76b0SSuyog Pawar         else
1107*c83a76b0SSuyog Pawar         {
1108*c83a76b0SSuyog Pawar             ASSERT(IPE_JOB_LYR0 == ps_job->i4_pre_enc_task_type);
1109*c83a76b0SSuyog Pawar 
1110*c83a76b0SSuyog Pawar             /* Obtain the current row's details from the job */
1111*c83a76b0SSuyog Pawar             vert_ctr = ps_job->s_job_info.s_ipe_job_info.i4_ctb_row_no;
1112*c83a76b0SSuyog Pawar             //DBG_PRINTF("IPE PASS : Thread id %d, Vert Ctr %d\n",thrd_id,vert_ctr);
1113*c83a76b0SSuyog Pawar 
1114*c83a76b0SSuyog Pawar             /* Update the ipe context with current row number */
1115*c83a76b0SSuyog Pawar             ps_ctxt->u2_ctb_row_num = vert_ctr;
1116*c83a76b0SSuyog Pawar 
1117*c83a76b0SSuyog Pawar             /* derive the current ctb row pointers */
1118*c83a76b0SSuyog Pawar 
1119*c83a76b0SSuyog Pawar             /* luma src */
1120*c83a76b0SSuyog Pawar             pu1_tmp = (UWORD8 *)ps_curr_inp->s_lap_out.s_input_buf.pv_y_buf;
1121*c83a76b0SSuyog Pawar             pu1_tmp += (vert_ctr * ps_frm_ctb_prms->i4_ctb_size * ps_inp->i4_y_strd);
1122*c83a76b0SSuyog Pawar 
1123*c83a76b0SSuyog Pawar             s_curr_src_bufs.pv_y_buf = pu1_tmp;
1124*c83a76b0SSuyog Pawar 
1125*c83a76b0SSuyog Pawar             /* Cb & CR pixel interleaved src */
1126*c83a76b0SSuyog Pawar             pu1_tmp = (UWORD8 *)ps_curr_inp->s_lap_out.s_input_buf.pv_u_buf;
1127*c83a76b0SSuyog Pawar             pu1_tmp += (vert_ctr * (ps_frm_ctb_prms->i4_ctb_size >> 1) * ps_inp->i4_uv_strd);
1128*c83a76b0SSuyog Pawar 
1129*c83a76b0SSuyog Pawar             s_curr_src_bufs.pv_u_buf = pu1_tmp;
1130*c83a76b0SSuyog Pawar 
1131*c83a76b0SSuyog Pawar             /* row intra analyse cost buffer */
1132*c83a76b0SSuyog Pawar             ps_ipe_ctb_out_row = ps_ipe_ctb_out + vert_ctr * ps_frm_ctb_prms->i4_num_ctbs_horz;
1133*c83a76b0SSuyog Pawar 
1134*c83a76b0SSuyog Pawar             /* row ctb out structure */
1135*c83a76b0SSuyog Pawar             ps_ctb_out_row = ps_ctb_out + vert_ctr * ps_frm_ctb_prms->i4_num_ctbs_horz;
1136*c83a76b0SSuyog Pawar 
1137*c83a76b0SSuyog Pawar             /* call the row level processing function */
1138*c83a76b0SSuyog Pawar             ps_ed_l1_row =
1139*c83a76b0SSuyog Pawar                 ps_ed_pic_l1 + ps_frm_ctb_prms->i4_num_ctbs_horz * blk_inc_ctb_l1 * vert_ctr;
1140*c83a76b0SSuyog Pawar             ps_ed_l2_row =
1141*c83a76b0SSuyog Pawar                 ps_ed_pic_l2 + ps_frm_ctb_prms->i4_num_ctbs_horz * blk_inc_ctb_l2 * vert_ctr;
1142*c83a76b0SSuyog Pawar             ps_ed_ctb_l1_row = ps_ed_ctb_l1_pic + ps_frm_ctb_prms->i4_num_ctbs_horz * vert_ctr;
1143*c83a76b0SSuyog Pawar             ihevce_ipe_process_row(
1144*c83a76b0SSuyog Pawar                 ps_ctxt,
1145*c83a76b0SSuyog Pawar                 ps_frm_ctb_prms,
1146*c83a76b0SSuyog Pawar                 &s_curr_src_bufs,
1147*c83a76b0SSuyog Pawar                 ps_ipe_ctb_out_row,
1148*c83a76b0SSuyog Pawar                 ps_ctb_out_row,
1149*c83a76b0SSuyog Pawar                 //ps_row_cu,
1150*c83a76b0SSuyog Pawar                 ps_ed_l1_row,
1151*c83a76b0SSuyog Pawar                 ps_ed_l2_row,
1152*c83a76b0SSuyog Pawar                 ps_ed_ctb_l1_row,
1153*c83a76b0SSuyog Pawar                 blk_inc_ctb_l1,
1154*c83a76b0SSuyog Pawar                 blk_inc_ctb_l2);
1155*c83a76b0SSuyog Pawar 
1156*c83a76b0SSuyog Pawar             memset(
1157*c83a76b0SSuyog Pawar                 ps_ed_l1_row,
1158*c83a76b0SSuyog Pawar                 0,
1159*c83a76b0SSuyog Pawar                 ps_frm_ctb_prms->i4_num_ctbs_horz * blk_inc_ctb_l1 * sizeof(ihevce_ed_blk_t));
1160*c83a76b0SSuyog Pawar             memset(
1161*c83a76b0SSuyog Pawar                 ps_ed_l2_row,
1162*c83a76b0SSuyog Pawar                 0,
1163*c83a76b0SSuyog Pawar                 ps_frm_ctb_prms->i4_num_ctbs_horz * blk_inc_ctb_l2 * sizeof(ihevce_ed_blk_t));
1164*c83a76b0SSuyog Pawar 
1165*c83a76b0SSuyog Pawar             /* set the output dependency */
1166*c83a76b0SSuyog Pawar             ihevce_pre_enc_grp_job_set_out_dep(pv_multi_thrd_ctxt, ps_job, i4_ping_pong);
1167*c83a76b0SSuyog Pawar         }
1168*c83a76b0SSuyog Pawar     }
1169*c83a76b0SSuyog Pawar 
1170*c83a76b0SSuyog Pawar     /* EIID: Print stat regarding how many 16x16 blocks are skipped in the frame, valid for single thread only */
1171*c83a76b0SSuyog Pawar     //DBG_PRINTF("num_16x16_analyze_skipped: %d\n",ps_ctxt->u4_num_16x16_skips_at_L0_IPE);
1172*c83a76b0SSuyog Pawar 
1173*c83a76b0SSuyog Pawar     return;
1174*c83a76b0SSuyog Pawar }
1175*c83a76b0SSuyog Pawar 
1176*c83a76b0SSuyog Pawar /*!
1177*c83a76b0SSuyog Pawar ******************************************************************************
1178*c83a76b0SSuyog Pawar * \if Function name : ihevce_get_frame_lambda_prms \endif
1179*c83a76b0SSuyog Pawar *
1180*c83a76b0SSuyog Pawar * \brief
1181*c83a76b0SSuyog Pawar *    Function whihc calculates the Lambda params for current picture
1182*c83a76b0SSuyog Pawar *
1183*c83a76b0SSuyog Pawar * \param[in] ps_enc_ctxt : encoder ctxt pointer
1184*c83a76b0SSuyog Pawar * \param[in] ps_cur_pic_ctxt : current pic ctxt
1185*c83a76b0SSuyog Pawar * \param[in] i4_cur_frame_qp : current pic QP
1186*c83a76b0SSuyog Pawar * \param[in] first_field : is first field flag
1187*c83a76b0SSuyog Pawar * \param[in] i4_temporal_lyr_id : Current picture layer id
1188*c83a76b0SSuyog Pawar *
1189*c83a76b0SSuyog Pawar * \return
1190*c83a76b0SSuyog Pawar *    None
1191*c83a76b0SSuyog Pawar *
1192*c83a76b0SSuyog Pawar * \author
1193*c83a76b0SSuyog Pawar *  Ittiam
1194*c83a76b0SSuyog Pawar *
1195*c83a76b0SSuyog Pawar *****************************************************************************
1196*c83a76b0SSuyog Pawar */
ihevce_get_ipe_ol_cu_lambda_prms(void * pv_ctxt,WORD32 i4_cur_cu_qp)1197*c83a76b0SSuyog Pawar void ihevce_get_ipe_ol_cu_lambda_prms(void *pv_ctxt, WORD32 i4_cur_cu_qp)
1198*c83a76b0SSuyog Pawar {
1199*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt = (ihevce_ipe_ctxt_t *)pv_ctxt;
1200*c83a76b0SSuyog Pawar     //WORD32 chroma_qp = gau1_ihevc_chroma_qp_scale[i4_cur_cu_qp];
1201*c83a76b0SSuyog Pawar 
1202*c83a76b0SSuyog Pawar     /* Store the params for IPE pass */
1203*c83a76b0SSuyog Pawar     ps_ctxt->i4_ol_satd_lambda = ps_ctxt->i4_ol_satd_lambda_qf_array[i4_cur_cu_qp];
1204*c83a76b0SSuyog Pawar     ps_ctxt->i4_ol_sad_lambda = ps_ctxt->i4_ol_sad_lambda_qf_array[i4_cur_cu_qp];
1205*c83a76b0SSuyog Pawar }
1206*c83a76b0SSuyog Pawar 
1207*c83a76b0SSuyog Pawar /*!
1208*c83a76b0SSuyog Pawar ******************************************************************************
1209*c83a76b0SSuyog Pawar * \if Function name : ihevce_get_frame_lambda_prms \endif
1210*c83a76b0SSuyog Pawar *
1211*c83a76b0SSuyog Pawar * \brief
1212*c83a76b0SSuyog Pawar *    Function whihc calculates the Lambda params for current picture
1213*c83a76b0SSuyog Pawar *
1214*c83a76b0SSuyog Pawar * \param[in] ps_enc_ctxt : encoder ctxt pointer
1215*c83a76b0SSuyog Pawar * \param[in] ps_cur_pic_ctxt : current pic ctxt
1216*c83a76b0SSuyog Pawar * \param[in] i4_cur_frame_qp : current pic QP
1217*c83a76b0SSuyog Pawar * \param[in] first_field : is first field flag
1218*c83a76b0SSuyog Pawar * \param[in] i4_temporal_lyr_id : Current picture layer id
1219*c83a76b0SSuyog Pawar *
1220*c83a76b0SSuyog Pawar * \return
1221*c83a76b0SSuyog Pawar *    None
1222*c83a76b0SSuyog Pawar *
1223*c83a76b0SSuyog Pawar * \author
1224*c83a76b0SSuyog Pawar *  Ittiam
1225*c83a76b0SSuyog Pawar *
1226*c83a76b0SSuyog Pawar *****************************************************************************
1227*c83a76b0SSuyog Pawar */
ihevce_populate_ipe_ol_cu_lambda_prms(void * pv_ctxt,frm_lambda_ctxt_t * ps_frm_lamda,WORD32 i4_slice_type,WORD32 i4_temporal_lyr_id,WORD32 i4_lambda_type)1228*c83a76b0SSuyog Pawar void ihevce_populate_ipe_ol_cu_lambda_prms(
1229*c83a76b0SSuyog Pawar     void *pv_ctxt,
1230*c83a76b0SSuyog Pawar     frm_lambda_ctxt_t *ps_frm_lamda,
1231*c83a76b0SSuyog Pawar     WORD32 i4_slice_type,
1232*c83a76b0SSuyog Pawar     WORD32 i4_temporal_lyr_id,
1233*c83a76b0SSuyog Pawar     WORD32 i4_lambda_type)
1234*c83a76b0SSuyog Pawar {
1235*c83a76b0SSuyog Pawar     WORD32 i4_curr_cu_qp;
1236*c83a76b0SSuyog Pawar     double lambda_modifier;
1237*c83a76b0SSuyog Pawar     double lambda_uv_modifier;
1238*c83a76b0SSuyog Pawar     double lambda;
1239*c83a76b0SSuyog Pawar     double lambda_uv;
1240*c83a76b0SSuyog Pawar 
1241*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt = (ihevce_ipe_ctxt_t *)pv_ctxt;
1242*c83a76b0SSuyog Pawar 
1243*c83a76b0SSuyog Pawar     WORD32 i4_qp_bd_offset = 6 * (ps_ctxt->u1_bit_depth - 8);
1244*c83a76b0SSuyog Pawar 
1245*c83a76b0SSuyog Pawar     for(i4_curr_cu_qp =
1246*c83a76b0SSuyog Pawar             ps_ctxt->ps_rc_quant_ctxt->i2_min_qp + ps_ctxt->ps_rc_quant_ctxt->i1_qp_offset;
1247*c83a76b0SSuyog Pawar         i4_curr_cu_qp <= ps_ctxt->ps_rc_quant_ctxt->i2_max_qp;
1248*c83a76b0SSuyog Pawar         i4_curr_cu_qp++)
1249*c83a76b0SSuyog Pawar     {
1250*c83a76b0SSuyog Pawar         WORD32 chroma_qp = i4_curr_cu_qp;
1251*c83a76b0SSuyog Pawar 
1252*c83a76b0SSuyog Pawar         if((BSLICE == i4_slice_type) && (i4_temporal_lyr_id))
1253*c83a76b0SSuyog Pawar         {
1254*c83a76b0SSuyog Pawar             lambda_modifier = ps_frm_lamda->lambda_modifier *
1255*c83a76b0SSuyog Pawar                               CLIP3((((double)(i4_curr_cu_qp - 12)) / 6.0), 2.00, 4.00);
1256*c83a76b0SSuyog Pawar             lambda_uv_modifier = ps_frm_lamda->lambda_uv_modifier *
1257*c83a76b0SSuyog Pawar                                  CLIP3((((double)(chroma_qp - 12)) / 6.0), 2.00, 4.00);
1258*c83a76b0SSuyog Pawar         }
1259*c83a76b0SSuyog Pawar         else
1260*c83a76b0SSuyog Pawar         {
1261*c83a76b0SSuyog Pawar             lambda_modifier = ps_frm_lamda->lambda_modifier;
1262*c83a76b0SSuyog Pawar             lambda_uv_modifier = ps_frm_lamda->lambda_uv_modifier;
1263*c83a76b0SSuyog Pawar         }
1264*c83a76b0SSuyog Pawar         if(ps_ctxt->i4_use_const_lamda_modifier)
1265*c83a76b0SSuyog Pawar         {
1266*c83a76b0SSuyog Pawar             if(ISLICE == i4_slice_type)
1267*c83a76b0SSuyog Pawar             {
1268*c83a76b0SSuyog Pawar                 lambda_modifier = ps_ctxt->f_i_pic_lamda_modifier;
1269*c83a76b0SSuyog Pawar                 lambda_uv_modifier = ps_ctxt->f_i_pic_lamda_modifier;
1270*c83a76b0SSuyog Pawar             }
1271*c83a76b0SSuyog Pawar             else
1272*c83a76b0SSuyog Pawar             {
1273*c83a76b0SSuyog Pawar                 lambda_modifier = CONST_LAMDA_MOD_VAL;
1274*c83a76b0SSuyog Pawar                 lambda_uv_modifier = CONST_LAMDA_MOD_VAL;
1275*c83a76b0SSuyog Pawar             }
1276*c83a76b0SSuyog Pawar         }
1277*c83a76b0SSuyog Pawar 
1278*c83a76b0SSuyog Pawar         switch(i4_lambda_type)
1279*c83a76b0SSuyog Pawar         {
1280*c83a76b0SSuyog Pawar         case 0:
1281*c83a76b0SSuyog Pawar         {
1282*c83a76b0SSuyog Pawar             i4_qp_bd_offset = 0;
1283*c83a76b0SSuyog Pawar 
1284*c83a76b0SSuyog Pawar             lambda = pow(2.0, (((double)(i4_curr_cu_qp + i4_qp_bd_offset - 12)) / 3.0));
1285*c83a76b0SSuyog Pawar 
1286*c83a76b0SSuyog Pawar             lambda_uv = pow(2.0, (((double)(chroma_qp + i4_qp_bd_offset - 12)) / 3.0));
1287*c83a76b0SSuyog Pawar 
1288*c83a76b0SSuyog Pawar             lambda *= lambda_modifier;
1289*c83a76b0SSuyog Pawar             lambda_uv *= lambda_uv_modifier;
1290*c83a76b0SSuyog Pawar             if(ps_ctxt->i4_use_const_lamda_modifier)
1291*c83a76b0SSuyog Pawar             {
1292*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_lambda_qf_array[i4_curr_cu_qp] =
1293*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
1294*c83a76b0SSuyog Pawar 
1295*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_lambda_qf_array[i4_curr_cu_qp] =
1296*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
1297*c83a76b0SSuyog Pawar             }
1298*c83a76b0SSuyog Pawar             else
1299*c83a76b0SSuyog Pawar             {
1300*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_lambda_qf_array[i4_curr_cu_qp] =
1301*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda) / 2) * (1 << LAMBDA_Q_SHIFT));
1302*c83a76b0SSuyog Pawar 
1303*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_lambda_qf_array[i4_curr_cu_qp] =
1304*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda * 1.9) / 2) * (1 << LAMBDA_Q_SHIFT));
1305*c83a76b0SSuyog Pawar             }
1306*c83a76b0SSuyog Pawar 
1307*c83a76b0SSuyog Pawar             ps_ctxt->i4_ol_sad_type2_lambda_qf_array[i4_curr_cu_qp] =
1308*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_lambda_qf_array[i4_curr_cu_qp];
1309*c83a76b0SSuyog Pawar 
1310*c83a76b0SSuyog Pawar             ps_ctxt->i4_ol_satd_type2_lambda_qf_array[i4_curr_cu_qp] =
1311*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_lambda_qf_array[i4_curr_cu_qp];
1312*c83a76b0SSuyog Pawar 
1313*c83a76b0SSuyog Pawar             break;
1314*c83a76b0SSuyog Pawar         }
1315*c83a76b0SSuyog Pawar         case 1:
1316*c83a76b0SSuyog Pawar         {
1317*c83a76b0SSuyog Pawar             ASSERT(0); /* should not enter the path for IPE*/
1318*c83a76b0SSuyog Pawar             lambda = pow(2.0, (((double)(i4_curr_cu_qp + i4_qp_bd_offset - 12)) / 3.0));
1319*c83a76b0SSuyog Pawar 
1320*c83a76b0SSuyog Pawar             lambda_uv = pow(2.0, (((double)(chroma_qp + i4_qp_bd_offset - 12)) / 3.0));
1321*c83a76b0SSuyog Pawar 
1322*c83a76b0SSuyog Pawar             lambda *= lambda_modifier;
1323*c83a76b0SSuyog Pawar             lambda_uv *= lambda_uv_modifier;
1324*c83a76b0SSuyog Pawar             if(ps_ctxt->i4_use_const_lamda_modifier)
1325*c83a76b0SSuyog Pawar             {
1326*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_lambda_qf_array[i4_curr_cu_qp] =
1327*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
1328*c83a76b0SSuyog Pawar 
1329*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_lambda_qf_array[i4_curr_cu_qp] =
1330*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
1331*c83a76b0SSuyog Pawar             }
1332*c83a76b0SSuyog Pawar             else
1333*c83a76b0SSuyog Pawar             {
1334*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_lambda_qf_array[i4_curr_cu_qp] =
1335*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda) / 2) * (1 << LAMBDA_Q_SHIFT));
1336*c83a76b0SSuyog Pawar 
1337*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_lambda_qf_array[i4_curr_cu_qp] =
1338*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda * 1.9) / 2) * (1 << LAMBDA_Q_SHIFT));
1339*c83a76b0SSuyog Pawar             }
1340*c83a76b0SSuyog Pawar 
1341*c83a76b0SSuyog Pawar             ps_ctxt->i4_ol_sad_type2_lambda_qf_array[i4_curr_cu_qp] =
1342*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_lambda_qf_array[i4_curr_cu_qp];
1343*c83a76b0SSuyog Pawar 
1344*c83a76b0SSuyog Pawar             ps_ctxt->i4_ol_satd_type2_lambda_qf_array[i4_curr_cu_qp] =
1345*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_lambda_qf_array[i4_curr_cu_qp];
1346*c83a76b0SSuyog Pawar 
1347*c83a76b0SSuyog Pawar             break;
1348*c83a76b0SSuyog Pawar         }
1349*c83a76b0SSuyog Pawar         case 2:
1350*c83a76b0SSuyog Pawar         {
1351*c83a76b0SSuyog Pawar             ASSERT(0); /* should not enter the path for IPE*/
1352*c83a76b0SSuyog Pawar             lambda = pow(2.0, (((double)(i4_curr_cu_qp + i4_qp_bd_offset - 12)) / 3.0));
1353*c83a76b0SSuyog Pawar 
1354*c83a76b0SSuyog Pawar             lambda_uv = pow(2.0, (((double)(chroma_qp + i4_qp_bd_offset - 12)) / 3.0));
1355*c83a76b0SSuyog Pawar 
1356*c83a76b0SSuyog Pawar             lambda *= lambda_modifier;
1357*c83a76b0SSuyog Pawar             lambda_uv *= lambda_uv_modifier;
1358*c83a76b0SSuyog Pawar             if(ps_ctxt->i4_use_const_lamda_modifier)
1359*c83a76b0SSuyog Pawar             {
1360*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_lambda_qf_array[i4_curr_cu_qp] =
1361*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
1362*c83a76b0SSuyog Pawar 
1363*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_lambda_qf_array[i4_curr_cu_qp] =
1364*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
1365*c83a76b0SSuyog Pawar             }
1366*c83a76b0SSuyog Pawar             else
1367*c83a76b0SSuyog Pawar             {
1368*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_lambda_qf_array[i4_curr_cu_qp] =
1369*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda) / 2) * (1 << LAMBDA_Q_SHIFT));
1370*c83a76b0SSuyog Pawar 
1371*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_lambda_qf_array[i4_curr_cu_qp] =
1372*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda * 1.9) / 2) * (1 << LAMBDA_Q_SHIFT));
1373*c83a76b0SSuyog Pawar             }
1374*c83a76b0SSuyog Pawar             i4_qp_bd_offset = 0;
1375*c83a76b0SSuyog Pawar 
1376*c83a76b0SSuyog Pawar             lambda = pow(2.0, (((double)(i4_curr_cu_qp + i4_qp_bd_offset - 12)) / 3.0));
1377*c83a76b0SSuyog Pawar 
1378*c83a76b0SSuyog Pawar             lambda_uv = pow(2.0, (((double)(chroma_qp + i4_qp_bd_offset - 12)) / 3.0));
1379*c83a76b0SSuyog Pawar 
1380*c83a76b0SSuyog Pawar             lambda *= lambda_modifier;
1381*c83a76b0SSuyog Pawar             lambda_uv *= lambda_uv_modifier;
1382*c83a76b0SSuyog Pawar             if(ps_ctxt->i4_use_const_lamda_modifier)
1383*c83a76b0SSuyog Pawar             {
1384*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_type2_lambda_qf_array[i4_curr_cu_qp] =
1385*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
1386*c83a76b0SSuyog Pawar 
1387*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_type2_lambda_qf_array[i4_curr_cu_qp] =
1388*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
1389*c83a76b0SSuyog Pawar             }
1390*c83a76b0SSuyog Pawar             else
1391*c83a76b0SSuyog Pawar             {
1392*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_sad_type2_lambda_qf_array[i4_curr_cu_qp] =
1393*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda) / 2) * (1 << LAMBDA_Q_SHIFT));
1394*c83a76b0SSuyog Pawar 
1395*c83a76b0SSuyog Pawar                 ps_ctxt->i4_ol_satd_type2_lambda_qf_array[i4_curr_cu_qp] =
1396*c83a76b0SSuyog Pawar                     (WORD32)((sqrt(lambda * 1.9) / 2) * (1 << LAMBDA_Q_SHIFT));
1397*c83a76b0SSuyog Pawar             }
1398*c83a76b0SSuyog Pawar             break;
1399*c83a76b0SSuyog Pawar         }
1400*c83a76b0SSuyog Pawar         default:
1401*c83a76b0SSuyog Pawar         {
1402*c83a76b0SSuyog Pawar             /* Intended to be a barren wasteland! */
1403*c83a76b0SSuyog Pawar             ASSERT(0);
1404*c83a76b0SSuyog Pawar         }
1405*c83a76b0SSuyog Pawar         }
1406*c83a76b0SSuyog Pawar     }
1407*c83a76b0SSuyog Pawar }
1408*c83a76b0SSuyog Pawar 
1409*c83a76b0SSuyog Pawar #define ME_COST_THRSHOLD 7
1410*c83a76b0SSuyog Pawar /*!
1411*c83a76b0SSuyog Pawar ******************************************************************************
1412*c83a76b0SSuyog Pawar * \if Function name : ihevce_get_frame_lambda_prms \endif
1413*c83a76b0SSuyog Pawar *
1414*c83a76b0SSuyog Pawar * \brief
1415*c83a76b0SSuyog Pawar *    Function whihc calculates the Lambda params for current picture
1416*c83a76b0SSuyog Pawar *
1417*c83a76b0SSuyog Pawar * \param[in] ps_enc_ctxt : encoder ctxt pointer
1418*c83a76b0SSuyog Pawar * \param[in] ps_cur_pic_ctxt : current pic ctxt
1419*c83a76b0SSuyog Pawar * \param[in] i4_cur_frame_qp : current pic QP
1420*c83a76b0SSuyog Pawar * \param[in] first_field : is first field flag
1421*c83a76b0SSuyog Pawar * \param[in] i4_temporal_lyr_id : Current picture layer id
1422*c83a76b0SSuyog Pawar *
1423*c83a76b0SSuyog Pawar * \return
1424*c83a76b0SSuyog Pawar *    None
1425*c83a76b0SSuyog Pawar *
1426*c83a76b0SSuyog Pawar * \author
1427*c83a76b0SSuyog Pawar *  Ittiam
1428*c83a76b0SSuyog Pawar *
1429*c83a76b0SSuyog Pawar *****************************************************************************
1430*c83a76b0SSuyog Pawar */
ihevce_populate_ipe_frame_init(void * pv_ctxt,ihevce_static_cfg_params_t * ps_stat_prms,WORD32 i4_curr_frm_qp,WORD32 i4_slice_type,WORD32 i4_thrd_id,pre_enc_me_ctxt_t * ps_curr_out,WORD8 i1_cu_qp_delta_enabled_flag,rc_quant_t * ps_rc_quant_ctxt,WORD32 i4_quality_preset,WORD32 i4_temporal_lyr_id,ihevce_lap_output_params_t * ps_lap_out)1431*c83a76b0SSuyog Pawar void ihevce_populate_ipe_frame_init(
1432*c83a76b0SSuyog Pawar     void *pv_ctxt,
1433*c83a76b0SSuyog Pawar     ihevce_static_cfg_params_t *ps_stat_prms,
1434*c83a76b0SSuyog Pawar     WORD32 i4_curr_frm_qp,
1435*c83a76b0SSuyog Pawar     WORD32 i4_slice_type,
1436*c83a76b0SSuyog Pawar     WORD32 i4_thrd_id,
1437*c83a76b0SSuyog Pawar     pre_enc_me_ctxt_t *ps_curr_out,
1438*c83a76b0SSuyog Pawar     WORD8 i1_cu_qp_delta_enabled_flag,
1439*c83a76b0SSuyog Pawar     rc_quant_t *ps_rc_quant_ctxt,
1440*c83a76b0SSuyog Pawar     WORD32 i4_quality_preset,
1441*c83a76b0SSuyog Pawar     WORD32 i4_temporal_lyr_id,
1442*c83a76b0SSuyog Pawar     ihevce_lap_output_params_t *ps_lap_out)
1443*c83a76b0SSuyog Pawar {
1444*c83a76b0SSuyog Pawar     ihevce_ipe_master_ctxt_t *ps_master_ctxt = (ihevce_ipe_master_ctxt_t *)pv_ctxt;
1445*c83a76b0SSuyog Pawar     WORD32 i4_i;
1446*c83a76b0SSuyog Pawar     WORD32 ai4_mod_factor_num[2];
1447*c83a76b0SSuyog Pawar 
1448*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *ps_ctxt = ps_master_ctxt->aps_ipe_thrd_ctxt[i4_thrd_id];
1449*c83a76b0SSuyog Pawar     ps_ctxt->i4_hevc_qp = i4_curr_frm_qp;
1450*c83a76b0SSuyog Pawar     ps_ctxt->i4_quality_preset = i4_quality_preset;
1451*c83a76b0SSuyog Pawar     ps_ctxt->i4_temporal_lyr_id = i4_temporal_lyr_id;
1452*c83a76b0SSuyog Pawar     ps_ctxt->ps_rc_quant_ctxt = ps_rc_quant_ctxt;
1453*c83a76b0SSuyog Pawar     ps_ctxt->i4_qscale =
1454*c83a76b0SSuyog Pawar         ps_ctxt->ps_rc_quant_ctxt
1455*c83a76b0SSuyog Pawar             ->pi4_qp_to_qscale[i4_curr_frm_qp + ps_ctxt->ps_rc_quant_ctxt->i1_qp_offset];
1456*c83a76b0SSuyog Pawar 
1457*c83a76b0SSuyog Pawar     ps_ctxt->i4_frm_qp = i4_curr_frm_qp + ps_ctxt->ps_rc_quant_ctxt->i1_qp_offset;
1458*c83a76b0SSuyog Pawar     ps_ctxt->i4_slice_type = i4_slice_type;  //EIID
1459*c83a76b0SSuyog Pawar     ps_ctxt->i4_temporal_layer = ps_lap_out->i4_temporal_lyr_id;
1460*c83a76b0SSuyog Pawar     ps_ctxt->i4_is_ref_pic = ps_lap_out->i4_is_ref_pic;
1461*c83a76b0SSuyog Pawar     ps_ctxt->u4_num_16x16_skips_at_L0_IPE = 0;
1462*c83a76b0SSuyog Pawar     ps_ctxt->i4_use_const_lamda_modifier = USE_CONSTANT_LAMBDA_MODIFIER;
1463*c83a76b0SSuyog Pawar     ps_ctxt->i4_use_const_lamda_modifier =
1464*c83a76b0SSuyog Pawar         ps_ctxt->i4_use_const_lamda_modifier ||
1465*c83a76b0SSuyog Pawar         ((ps_stat_prms->s_coding_tools_prms.i4_vqet &
1466*c83a76b0SSuyog Pawar           (1 << BITPOS_IN_VQ_TOGGLE_FOR_CONTROL_TOGGLER)) &&
1467*c83a76b0SSuyog Pawar          ((ps_stat_prms->s_coding_tools_prms.i4_vqet &
1468*c83a76b0SSuyog Pawar            (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_NOISE_PRESERVATION)) ||
1469*c83a76b0SSuyog Pawar           (ps_stat_prms->s_coding_tools_prms.i4_vqet &
1470*c83a76b0SSuyog Pawar            (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_1)) ||
1471*c83a76b0SSuyog Pawar           (ps_stat_prms->s_coding_tools_prms.i4_vqet &
1472*c83a76b0SSuyog Pawar            (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_2)) ||
1473*c83a76b0SSuyog Pawar           (ps_stat_prms->s_coding_tools_prms.i4_vqet &
1474*c83a76b0SSuyog Pawar            (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_3))));
1475*c83a76b0SSuyog Pawar     {
1476*c83a76b0SSuyog Pawar         ps_ctxt->f_i_pic_lamda_modifier = ps_lap_out->f_i_pic_lamda_modifier;
1477*c83a76b0SSuyog Pawar     }
1478*c83a76b0SSuyog Pawar #if POW_OPT
1479*c83a76b0SSuyog Pawar     for(i4_i = 0; i4_i < 2; i4_i++)
1480*c83a76b0SSuyog Pawar     {
1481*c83a76b0SSuyog Pawar         ps_ctxt->ld_curr_frame_8x8_log_avg[i4_i] = ps_curr_out->ld_curr_frame_8x8_log_avg[i4_i];
1482*c83a76b0SSuyog Pawar         ps_ctxt->ld_curr_frame_16x16_log_avg[i4_i] = ps_curr_out->ld_curr_frame_16x16_log_avg[i4_i];
1483*c83a76b0SSuyog Pawar         ps_ctxt->ld_curr_frame_32x32_log_avg[i4_i] = ps_curr_out->ld_curr_frame_32x32_log_avg[i4_i];
1484*c83a76b0SSuyog Pawar     }
1485*c83a76b0SSuyog Pawar 
1486*c83a76b0SSuyog Pawar     ps_ctxt->ld_curr_frame_16x16_log_avg[2] = ps_curr_out->ld_curr_frame_16x16_log_avg[2];
1487*c83a76b0SSuyog Pawar     ps_ctxt->ld_curr_frame_32x32_log_avg[2] = ps_curr_out->ld_curr_frame_32x32_log_avg[2];
1488*c83a76b0SSuyog Pawar     ps_ctxt->i8_curr_frame_avg_mean_act = ps_curr_out->i8_curr_frame_avg_mean_act;
1489*c83a76b0SSuyog Pawar #else
1490*c83a76b0SSuyog Pawar     for(i4_i = 0; i4_i < 2; i4_i++)
1491*c83a76b0SSuyog Pawar     {
1492*c83a76b0SSuyog Pawar         ps_ctxt->i8_curr_frame_8x8_avg_act[i4_i] = ps_curr_out->i8_curr_frame_8x8_avg_act[i4_i];
1493*c83a76b0SSuyog Pawar         ps_ctxt->i8_curr_frame_16x16_avg_act[i4_i] = ps_curr_out->i8_curr_frame_16x16_avg_act[i4_i];
1494*c83a76b0SSuyog Pawar         ps_ctxt->i8_curr_frame_32x32_avg_act[i4_i] = ps_curr_out->i8_curr_frame_32x32_avg_act[i4_i];
1495*c83a76b0SSuyog Pawar     }
1496*c83a76b0SSuyog Pawar 
1497*c83a76b0SSuyog Pawar     ps_ctxt->i8_curr_frame_16x16_avg_act[2] = ps_curr_out->i8_curr_frame_16x16_avg_act[2];
1498*c83a76b0SSuyog Pawar     ps_ctxt->i8_curr_frame_32x32_avg_act[2] = ps_curr_out->i8_curr_frame_32x32_avg_act[2];
1499*c83a76b0SSuyog Pawar #endif
1500*c83a76b0SSuyog Pawar 
1501*c83a76b0SSuyog Pawar     ps_ctxt->pi2_trans_out =
1502*c83a76b0SSuyog Pawar         (WORD16 *)&ps_ctxt->au1_pred_samples[0];  //overlaying trans coeff memory with pred_samples
1503*c83a76b0SSuyog Pawar     ps_ctxt->pi2_trans_tmp = (WORD16 *)&ps_ctxt->au1_pred_samples[2048];
1504*c83a76b0SSuyog Pawar 
1505*c83a76b0SSuyog Pawar     /*Mod factor NUM */
1506*c83a76b0SSuyog Pawar     ps_ctxt->ai4_mod_factor_derived_by_variance[0] =
1507*c83a76b0SSuyog Pawar         ps_curr_out->ai4_mod_factor_derived_by_variance[0];
1508*c83a76b0SSuyog Pawar     ps_ctxt->ai4_mod_factor_derived_by_variance[1] =
1509*c83a76b0SSuyog Pawar         ps_curr_out->ai4_mod_factor_derived_by_variance[1];
1510*c83a76b0SSuyog Pawar 
1511*c83a76b0SSuyog Pawar     ps_ctxt->f_strength = ps_curr_out->f_strength;
1512*c83a76b0SSuyog Pawar 
1513*c83a76b0SSuyog Pawar     if(ps_stat_prms->s_coding_tools_prms.i4_vqet & (1 << BITPOS_IN_VQ_TOGGLE_FOR_CONTROL_TOGGLER))
1514*c83a76b0SSuyog Pawar     {
1515*c83a76b0SSuyog Pawar         if(ps_stat_prms->s_coding_tools_prms.i4_vqet &
1516*c83a76b0SSuyog Pawar            (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_NOISE_PRESERVATION))
1517*c83a76b0SSuyog Pawar         {
1518*c83a76b0SSuyog Pawar             ps_ctxt->i4_enable_noise_detection = 1;
1519*c83a76b0SSuyog Pawar         }
1520*c83a76b0SSuyog Pawar         else
1521*c83a76b0SSuyog Pawar         {
1522*c83a76b0SSuyog Pawar             ps_ctxt->i4_enable_noise_detection = 0;
1523*c83a76b0SSuyog Pawar         }
1524*c83a76b0SSuyog Pawar     }
1525*c83a76b0SSuyog Pawar     else
1526*c83a76b0SSuyog Pawar     {
1527*c83a76b0SSuyog Pawar         ps_ctxt->i4_enable_noise_detection = 0;
1528*c83a76b0SSuyog Pawar     }
1529*c83a76b0SSuyog Pawar 
1530*c83a76b0SSuyog Pawar     {
1531*c83a76b0SSuyog Pawar         if(ISLICE == ps_ctxt->i4_slice_type)
1532*c83a76b0SSuyog Pawar         {
1533*c83a76b0SSuyog Pawar             ai4_mod_factor_num[0] = INTRA_QP_MOD_FACTOR_NUM;  //16;
1534*c83a76b0SSuyog Pawar             ai4_mod_factor_num[1] = INTRA_QP_MOD_FACTOR_NUM;  //16;
1535*c83a76b0SSuyog Pawar         }
1536*c83a76b0SSuyog Pawar         else
1537*c83a76b0SSuyog Pawar         {
1538*c83a76b0SSuyog Pawar             ai4_mod_factor_num[0] = INTER_QP_MOD_FACTOR_NUM;  //4;
1539*c83a76b0SSuyog Pawar             ai4_mod_factor_num[1] = INTER_QP_MOD_FACTOR_NUM;  //4;
1540*c83a76b0SSuyog Pawar         }
1541*c83a76b0SSuyog Pawar 
1542*c83a76b0SSuyog Pawar #if ENABLE_QP_MOD_BASED_ON_SPATIAL_VARIANCE
1543*c83a76b0SSuyog Pawar         for(i4_i = 0; i4_i < 2; i4_i++)
1544*c83a76b0SSuyog Pawar         {
1545*c83a76b0SSuyog Pawar             WORD32 mod_factor_num_val =
1546*c83a76b0SSuyog Pawar                 ps_ctxt->ai4_mod_factor_derived_by_variance[i4_i] * QP_MOD_FACTOR_DEN;
1547*c83a76b0SSuyog Pawar 
1548*c83a76b0SSuyog Pawar             ai4_mod_factor_num[i4_i] = CLIP3(mod_factor_num_val, 1, ai4_mod_factor_num[i4_i]);
1549*c83a76b0SSuyog Pawar             ps_ctxt->ai4_mod_factor_derived_by_variance[i4_i] = ai4_mod_factor_num[i4_i];
1550*c83a76b0SSuyog Pawar         }
1551*c83a76b0SSuyog Pawar #else
1552*c83a76b0SSuyog Pawar         for(i4_i = 0; i4_i < 2; i4_i++)
1553*c83a76b0SSuyog Pawar         {
1554*c83a76b0SSuyog Pawar             ps_ctxt->ai4_mod_factor_derived_by_variance[i4_i] = ai4_mod_factor_num[i4_i];
1555*c83a76b0SSuyog Pawar         }
1556*c83a76b0SSuyog Pawar #endif
1557*c83a76b0SSuyog Pawar     }
1558*c83a76b0SSuyog Pawar 
1559*c83a76b0SSuyog Pawar     ps_ctxt->u1_use_lambda_derived_from_min_8x8_act_in_ctb = MODULATE_LAMDA_WHEN_SPATIAL_MOD_ON &&
1560*c83a76b0SSuyog Pawar                                                              i1_cu_qp_delta_enabled_flag;
1561*c83a76b0SSuyog Pawar 
1562*c83a76b0SSuyog Pawar     ps_ctxt->u1_use_satd = 1;
1563*c83a76b0SSuyog Pawar     ps_ctxt->u1_level_1_refine_on = 1;
1564*c83a76b0SSuyog Pawar     ps_ctxt->u1_disable_child_cu_decide = 0;
1565*c83a76b0SSuyog Pawar 
1566*c83a76b0SSuyog Pawar #if !OLD_XTREME_SPEED
1567*c83a76b0SSuyog Pawar     if(((ps_ctxt->i4_quality_preset == IHEVCE_QUALITY_P5) ||
1568*c83a76b0SSuyog Pawar         (ps_ctxt->i4_quality_preset == IHEVCE_QUALITY_P6)) &&
1569*c83a76b0SSuyog Pawar        (ps_ctxt->i4_slice_type != ISLICE))
1570*c83a76b0SSuyog Pawar     {
1571*c83a76b0SSuyog Pawar         ps_ctxt->u1_use_satd = 0;
1572*c83a76b0SSuyog Pawar         ps_ctxt->u1_level_1_refine_on = 1;
1573*c83a76b0SSuyog Pawar         ps_ctxt->u1_disable_child_cu_decide = 0;
1574*c83a76b0SSuyog Pawar     }
1575*c83a76b0SSuyog Pawar 
1576*c83a76b0SSuyog Pawar #endif
1577*c83a76b0SSuyog Pawar 
1578*c83a76b0SSuyog Pawar     if((ps_ctxt->i4_quality_preset == IHEVCE_QUALITY_P4) && (ps_ctxt->i4_slice_type != ISLICE))
1579*c83a76b0SSuyog Pawar         ps_ctxt->u1_use_satd = 0;
1580*c83a76b0SSuyog Pawar     if(ps_ctxt->i4_quality_preset > IHEVCE_QUALITY_P3)
1581*c83a76b0SSuyog Pawar         ps_ctxt->u1_use_satd = 0;
1582*c83a76b0SSuyog Pawar }
1583