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_me_pass.c
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * \brief
26*c83a76b0SSuyog Pawar * Converts the language of the encoder to language of me. This is an i/f
27*c83a76b0SSuyog Pawar * between the encoder style APIs and ME style APIs. This is basically
28*c83a76b0SSuyog Pawar * a memoryless glue layer.
29*c83a76b0SSuyog Pawar *
30*c83a76b0SSuyog Pawar * \date
31*c83a76b0SSuyog Pawar * 22/10/2012
32*c83a76b0SSuyog Pawar *
33*c83a76b0SSuyog Pawar * \author
34*c83a76b0SSuyog Pawar * Ittiam
35*c83a76b0SSuyog Pawar *
36*c83a76b0SSuyog Pawar *
37*c83a76b0SSuyog Pawar * List of Functions
38*c83a76b0SSuyog Pawar *
39*c83a76b0SSuyog Pawar *
40*c83a76b0SSuyog Pawar ******************************************************************************
41*c83a76b0SSuyog Pawar */
42*c83a76b0SSuyog Pawar
43*c83a76b0SSuyog Pawar /*****************************************************************************/
44*c83a76b0SSuyog Pawar /* File Includes */
45*c83a76b0SSuyog Pawar /*****************************************************************************/
46*c83a76b0SSuyog Pawar /* System include files */
47*c83a76b0SSuyog Pawar #include <stdio.h>
48*c83a76b0SSuyog Pawar #include <string.h>
49*c83a76b0SSuyog Pawar #include <stdlib.h>
50*c83a76b0SSuyog Pawar #include <assert.h>
51*c83a76b0SSuyog Pawar #include <stdarg.h>
52*c83a76b0SSuyog Pawar #include <math.h>
53*c83a76b0SSuyog Pawar
54*c83a76b0SSuyog Pawar /* User include files */
55*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
56*c83a76b0SSuyog Pawar #include "itt_video_api.h"
57*c83a76b0SSuyog Pawar #include "ihevce_api.h"
58*c83a76b0SSuyog Pawar
59*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
60*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
61*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
62*c83a76b0SSuyog Pawar
63*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
64*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
65*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
66*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
67*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
68*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
69*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
70*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
71*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
72*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
73*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
74*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
75*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
76*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
77*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
78*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
79*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
80*c83a76b0SSuyog Pawar
81*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
82*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
83*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
84*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
85*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
86*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
87*c83a76b0SSuyog Pawar #include "ihevce_bitstream.h"
88*c83a76b0SSuyog Pawar #include "ihevce_cabac.h"
89*c83a76b0SSuyog Pawar #include "ihevce_rdoq_macros.h"
90*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
91*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
92*c83a76b0SSuyog Pawar #include "ihevce_entropy_structs.h"
93*c83a76b0SSuyog Pawar #include "ihevce_cmn_utils_instr_set_router.h"
94*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_structs.h"
95*c83a76b0SSuyog Pawar #include "ihevce_inter_pred.h"
96*c83a76b0SSuyog Pawar
97*c83a76b0SSuyog Pawar #include "hme_datatype.h"
98*c83a76b0SSuyog Pawar #include "hme_interface.h"
99*c83a76b0SSuyog Pawar #include "hme_common_defs.h"
100*c83a76b0SSuyog Pawar #include "hme_defs.h"
101*c83a76b0SSuyog Pawar #include "ihevce_me_instr_set_router.h"
102*c83a76b0SSuyog Pawar #include "hme_utils.h"
103*c83a76b0SSuyog Pawar #include "hme_coarse.h"
104*c83a76b0SSuyog Pawar #include "hme_refine.h"
105*c83a76b0SSuyog Pawar #include "hme_function_selector.h"
106*c83a76b0SSuyog Pawar #include "ihevce_me_pass.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 /* Macros */
114*c83a76b0SSuyog Pawar /*****************************************************************************/
115*c83a76b0SSuyog Pawar
116*c83a76b0SSuyog Pawar /** orig simple five tap scaler */
117*c83a76b0SSuyog Pawar #define FIVE_TAP_ORIG_SCALER 0
118*c83a76b0SSuyog Pawar
119*c83a76b0SSuyog Pawar /** simple gaussian filter, blurs the image a bit */
120*c83a76b0SSuyog Pawar #define SIMPLE_GAUSSIAN_SCALER 0
121*c83a76b0SSuyog Pawar
122*c83a76b0SSuyog Pawar /** lanczos scaler gives sharper images */
123*c83a76b0SSuyog Pawar #define LANCZOS_SCALER 1
124*c83a76b0SSuyog Pawar
125*c83a76b0SSuyog Pawar // Saturated addition z = x + y
126*c83a76b0SSuyog Pawar // overflow condition: z<x or z<y
127*c83a76b0SSuyog Pawar #define SATURATED_ADD(z, x, y) \
128*c83a76b0SSuyog Pawar { \
129*c83a76b0SSuyog Pawar (z) = (x) + (y); \
130*c83a76b0SSuyog Pawar if(((z) < (x)) || ((z) < (y))) \
131*c83a76b0SSuyog Pawar (z) = MAX_INTRA_COST_IPE; \
132*c83a76b0SSuyog Pawar }
133*c83a76b0SSuyog Pawar
134*c83a76b0SSuyog Pawar #define SATURATED_SUB(z, x, y) \
135*c83a76b0SSuyog Pawar { \
136*c83a76b0SSuyog Pawar (z) = (x) - (y); \
137*c83a76b0SSuyog Pawar if((z) < 0) /*if (((z) > (x)) || ((z) > (y))) */ \
138*c83a76b0SSuyog Pawar (z) = 0; \
139*c83a76b0SSuyog Pawar }
140*c83a76b0SSuyog Pawar
141*c83a76b0SSuyog Pawar #if(FIVE_TAP_ORIG_SCALER + SIMPLE_GAUSSIAN_SCALER + LANCZOS_SCALER) > 1
142*c83a76b0SSuyog Pawar #error "HME ERROR: Only one scaler can be enabled at a time"
143*c83a76b0SSuyog Pawar #endif
144*c83a76b0SSuyog Pawar
145*c83a76b0SSuyog Pawar /*****************************************************************************/
146*c83a76b0SSuyog Pawar /* Function Definitions */
147*c83a76b0SSuyog Pawar /*****************************************************************************/
148*c83a76b0SSuyog Pawar
149*c83a76b0SSuyog Pawar /*!
150*c83a76b0SSuyog Pawar ******************************************************************************
151*c83a76b0SSuyog Pawar * \if Function name : ihevce_me_get_num_mem_recs \endif
152*c83a76b0SSuyog Pawar *
153*c83a76b0SSuyog Pawar * \brief
154*c83a76b0SSuyog Pawar * Number of memory records are returned for ME module
155*c83a76b0SSuyog Pawar * Note : Include TOT MEM. req. for ME + TOT MEM. req. for Dep Mngr for L0 ME
156*c83a76b0SSuyog Pawar *
157*c83a76b0SSuyog Pawar * \return
158*c83a76b0SSuyog Pawar * Number of memory records
159*c83a76b0SSuyog Pawar *
160*c83a76b0SSuyog Pawar * \author
161*c83a76b0SSuyog Pawar * Ittiam
162*c83a76b0SSuyog Pawar *
163*c83a76b0SSuyog Pawar *****************************************************************************
164*c83a76b0SSuyog Pawar */
ihevce_me_get_num_mem_recs(WORD32 i4_num_me_frm_pllel)165*c83a76b0SSuyog Pawar WORD32 ihevce_me_get_num_mem_recs(WORD32 i4_num_me_frm_pllel)
166*c83a76b0SSuyog Pawar {
167*c83a76b0SSuyog Pawar WORD32 me_mem_recs = hme_enc_num_alloc(i4_num_me_frm_pllel);
168*c83a76b0SSuyog Pawar
169*c83a76b0SSuyog Pawar return (me_mem_recs);
170*c83a76b0SSuyog Pawar }
171*c83a76b0SSuyog Pawar
ihevce_derive_me_init_prms(ihevce_static_cfg_params_t * ps_init_prms,hme_init_prms_t * ps_hme_init_prms,S32 i4_num_proc_thrds,S32 i4_resolution_id)172*c83a76b0SSuyog Pawar void ihevce_derive_me_init_prms(
173*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_init_prms,
174*c83a76b0SSuyog Pawar hme_init_prms_t *ps_hme_init_prms,
175*c83a76b0SSuyog Pawar S32 i4_num_proc_thrds,
176*c83a76b0SSuyog Pawar S32 i4_resolution_id)
177*c83a76b0SSuyog Pawar {
178*c83a76b0SSuyog Pawar WORD32 i4_field_pic = ps_init_prms->s_src_prms.i4_field_pic;
179*c83a76b0SSuyog Pawar WORD32 min_cu_size;
180*c83a76b0SSuyog Pawar
181*c83a76b0SSuyog Pawar /* max number of ref frames. This should be > ref frms sent any frm */
182*c83a76b0SSuyog Pawar ps_hme_init_prms->max_num_ref = ((DEFAULT_MAX_REFERENCE_PICS) << i4_field_pic);
183*c83a76b0SSuyog Pawar
184*c83a76b0SSuyog Pawar /* get the min cu size from config params */
185*c83a76b0SSuyog Pawar min_cu_size = ps_init_prms->s_config_prms.i4_min_log2_cu_size;
186*c83a76b0SSuyog Pawar
187*c83a76b0SSuyog Pawar min_cu_size = 1 << min_cu_size;
188*c83a76b0SSuyog Pawar
189*c83a76b0SSuyog Pawar /* Width and height for the layer being encoded */
190*c83a76b0SSuyog Pawar ps_hme_init_prms->a_wd[0] =
191*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width +
192*c83a76b0SSuyog Pawar SET_CTB_ALIGN(
193*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width, min_cu_size);
194*c83a76b0SSuyog Pawar
195*c83a76b0SSuyog Pawar ps_hme_init_prms->a_ht[0] =
196*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_height +
197*c83a76b0SSuyog Pawar SET_CTB_ALIGN(
198*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_height, min_cu_size);
199*c83a76b0SSuyog Pawar
200*c83a76b0SSuyog Pawar /* we store 4 results in coarsest layer per blk. 8x4L, 8x4R, 4x8T, 4x8B */
201*c83a76b0SSuyog Pawar ps_hme_init_prms->max_num_results_coarse = 4;
202*c83a76b0SSuyog Pawar
203*c83a76b0SSuyog Pawar /* Every refinement layer stores a max of 2 results per partition */
204*c83a76b0SSuyog Pawar ps_hme_init_prms->max_num_results = 2;
205*c83a76b0SSuyog Pawar
206*c83a76b0SSuyog Pawar /* Assuming abt 4 layers for 1080p, we do explicit search across all ref */
207*c83a76b0SSuyog Pawar /* frames in all but final layer In final layer, it could be 1/2 */
208*c83a76b0SSuyog Pawar ps_hme_init_prms->num_layers_explicit_search = 3;
209*c83a76b0SSuyog Pawar
210*c83a76b0SSuyog Pawar /* Populate the max_tr_depth for Inter */
211*c83a76b0SSuyog Pawar ps_hme_init_prms->u1_max_tr_depth = ps_init_prms->s_config_prms.i4_max_tr_tree_depth_nI;
212*c83a76b0SSuyog Pawar
213*c83a76b0SSuyog Pawar ps_hme_init_prms->log_ctb_size = ps_init_prms->s_config_prms.i4_max_log2_cu_size;
214*c83a76b0SSuyog Pawar ASSERT(ps_hme_init_prms->log_ctb_size == 6);
215*c83a76b0SSuyog Pawar
216*c83a76b0SSuyog Pawar /* currently encoding only 1 layer */
217*c83a76b0SSuyog Pawar ps_hme_init_prms->num_simulcast_layers = 1;
218*c83a76b0SSuyog Pawar
219*c83a76b0SSuyog Pawar /* this feature not yet supported */
220*c83a76b0SSuyog Pawar ps_hme_init_prms->segment_higher_layers = 0;
221*c83a76b0SSuyog Pawar
222*c83a76b0SSuyog Pawar /* Allow 4x4 in refinement layers. Unconditionally enabled in coarse lyr */
223*c83a76b0SSuyog Pawar /* And not enabled in encode layers, this is just for intermediate refine*/
224*c83a76b0SSuyog Pawar /* layers, where it could be used for better accuracy of motion. */
225*c83a76b0SSuyog Pawar
226*c83a76b0SSuyog Pawar #if !OLD_XTREME_SPEED
227*c83a76b0SSuyog Pawar if((IHEVCE_QUALITY_P6 ==
228*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset) ||
229*c83a76b0SSuyog Pawar (IHEVCE_QUALITY_P7 ==
230*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset) ||
231*c83a76b0SSuyog Pawar (IHEVCE_QUALITY_P5 ==
232*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset) ||
233*c83a76b0SSuyog Pawar (IHEVCE_QUALITY_P4 ==
234*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset))
235*c83a76b0SSuyog Pawar ps_hme_init_prms->use_4x4 = 0;
236*c83a76b0SSuyog Pawar else
237*c83a76b0SSuyog Pawar ps_hme_init_prms->use_4x4 = 1;
238*c83a76b0SSuyog Pawar #else
239*c83a76b0SSuyog Pawar ps_hme_init_prms->use_4x4 = 1;
240*c83a76b0SSuyog Pawar #endif
241*c83a76b0SSuyog Pawar
242*c83a76b0SSuyog Pawar ps_hme_init_prms->num_b_frms =
243*c83a76b0SSuyog Pawar (1 << ps_init_prms->s_coding_tools_prms.i4_max_temporal_layers) - 1;
244*c83a76b0SSuyog Pawar
245*c83a76b0SSuyog Pawar ps_hme_init_prms->i4_num_proc_thrds = i4_num_proc_thrds;
246*c83a76b0SSuyog Pawar
247*c83a76b0SSuyog Pawar if(IHEVCE_QUALITY_P0 ==
248*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset)
249*c83a76b0SSuyog Pawar {
250*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.e_me_quality_presets = ME_PRISTINE_QUALITY;
251*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_hpel_refine = 3;
252*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_qpel_refine = 3;
253*c83a76b0SSuyog Pawar }
254*c83a76b0SSuyog Pawar else if(
255*c83a76b0SSuyog Pawar IHEVCE_QUALITY_P2 ==
256*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset)
257*c83a76b0SSuyog Pawar {
258*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.e_me_quality_presets = ME_HIGH_QUALITY;
259*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_hpel_refine = 3;
260*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_qpel_refine = 3;
261*c83a76b0SSuyog Pawar }
262*c83a76b0SSuyog Pawar else if(
263*c83a76b0SSuyog Pawar IHEVCE_QUALITY_P3 ==
264*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset)
265*c83a76b0SSuyog Pawar {
266*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.e_me_quality_presets = ME_MEDIUM_SPEED;
267*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_hpel_refine = 2;
268*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_qpel_refine = 2;
269*c83a76b0SSuyog Pawar }
270*c83a76b0SSuyog Pawar else if(
271*c83a76b0SSuyog Pawar IHEVCE_QUALITY_P4 ==
272*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset)
273*c83a76b0SSuyog Pawar {
274*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.e_me_quality_presets = ME_HIGH_SPEED;
275*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_hpel_refine = 1;
276*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_qpel_refine = 1;
277*c83a76b0SSuyog Pawar }
278*c83a76b0SSuyog Pawar else if(
279*c83a76b0SSuyog Pawar IHEVCE_QUALITY_P5 ==
280*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset)
281*c83a76b0SSuyog Pawar {
282*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.e_me_quality_presets = ME_XTREME_SPEED;
283*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_hpel_refine = 1;
284*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_qpel_refine = 1;
285*c83a76b0SSuyog Pawar }
286*c83a76b0SSuyog Pawar else if(
287*c83a76b0SSuyog Pawar IHEVCE_QUALITY_P6 ==
288*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset)
289*c83a76b0SSuyog Pawar {
290*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.e_me_quality_presets = ME_XTREME_SPEED_25;
291*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_hpel_refine = 1;
292*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_qpel_refine = 1;
293*c83a76b0SSuyog Pawar }
294*c83a76b0SSuyog Pawar else if(
295*c83a76b0SSuyog Pawar IHEVCE_QUALITY_P7 ==
296*c83a76b0SSuyog Pawar ps_init_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset)
297*c83a76b0SSuyog Pawar {
298*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.e_me_quality_presets = ME_XTREME_SPEED_25;
299*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_hpel_refine = 1;
300*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.i4_num_steps_qpel_refine = 0;
301*c83a76b0SSuyog Pawar }
302*c83a76b0SSuyog Pawar
303*c83a76b0SSuyog Pawar ps_hme_init_prms->s_me_coding_tools.u1_l0_me_controlled_via_cmd_line = 0;
304*c83a76b0SSuyog Pawar
305*c83a76b0SSuyog Pawar /* Register the search range params from static params */
306*c83a76b0SSuyog Pawar ps_hme_init_prms->max_horz_search_range = ps_init_prms->s_config_prms.i4_max_search_range_horz;
307*c83a76b0SSuyog Pawar ps_hme_init_prms->max_vert_search_range = ps_init_prms->s_config_prms.i4_max_search_range_vert;
308*c83a76b0SSuyog Pawar ps_hme_init_prms->e_arch_type = ps_init_prms->e_arch_type;
309*c83a76b0SSuyog Pawar ps_hme_init_prms->is_interlaced = (ps_init_prms->s_src_prms.i4_field_pic == IV_INTERLACED);
310*c83a76b0SSuyog Pawar
311*c83a76b0SSuyog Pawar ps_hme_init_prms->u1_is_stasino_enabled =
312*c83a76b0SSuyog Pawar ((ps_init_prms->s_coding_tools_prms.i4_vqet &
313*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_CONTROL_TOGGLER)) &&
314*c83a76b0SSuyog Pawar (ps_init_prms->s_coding_tools_prms.i4_vqet &
315*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_NOISE_PRESERVATION)));
316*c83a76b0SSuyog Pawar }
317*c83a76b0SSuyog Pawar
318*c83a76b0SSuyog Pawar /*!
319*c83a76b0SSuyog Pawar ******************************************************************************
320*c83a76b0SSuyog Pawar * \if Function name : ihevce_me_get_mem_recs \endif
321*c83a76b0SSuyog Pawar *
322*c83a76b0SSuyog Pawar * \brief
323*c83a76b0SSuyog Pawar * Memory requirements are returned for ME.
324*c83a76b0SSuyog Pawar *
325*c83a76b0SSuyog Pawar * \param[in,out] ps_mem_tab : pointer to memory descriptors table
326*c83a76b0SSuyog Pawar * \param[in] ps_init_prms : Create time static parameters
327*c83a76b0SSuyog Pawar * \param[in] i4_num_proc_thrds : Number of processing threads for this module
328*c83a76b0SSuyog Pawar * \param[in] i4_mem_space : memspace in whihc memory request should be done
329*c83a76b0SSuyog Pawar *
330*c83a76b0SSuyog Pawar * \return
331*c83a76b0SSuyog Pawar * Number of records
332*c83a76b0SSuyog Pawar *
333*c83a76b0SSuyog Pawar * \author
334*c83a76b0SSuyog Pawar * Ittiam
335*c83a76b0SSuyog Pawar *
336*c83a76b0SSuyog Pawar *****************************************************************************
337*c83a76b0SSuyog Pawar */
ihevce_me_get_mem_recs(iv_mem_rec_t * ps_mem_tab,ihevce_static_cfg_params_t * ps_init_prms,WORD32 i4_num_proc_thrds,WORD32 i4_mem_space,WORD32 i4_resolution_id,WORD32 i4_num_me_frm_pllel)338*c83a76b0SSuyog Pawar WORD32 ihevce_me_get_mem_recs(
339*c83a76b0SSuyog Pawar iv_mem_rec_t *ps_mem_tab,
340*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_init_prms,
341*c83a76b0SSuyog Pawar WORD32 i4_num_proc_thrds,
342*c83a76b0SSuyog Pawar WORD32 i4_mem_space,
343*c83a76b0SSuyog Pawar WORD32 i4_resolution_id,
344*c83a76b0SSuyog Pawar WORD32 i4_num_me_frm_pllel)
345*c83a76b0SSuyog Pawar {
346*c83a76b0SSuyog Pawar hme_memtab_t as_memtabs[MAX_HME_ENC_TOT_MEMTABS];
347*c83a76b0SSuyog Pawar WORD32 n_tabs, i;
348*c83a76b0SSuyog Pawar
349*c83a76b0SSuyog Pawar /* Init prms structure specific to HME */
350*c83a76b0SSuyog Pawar hme_init_prms_t s_hme_init_prms;
351*c83a76b0SSuyog Pawar
352*c83a76b0SSuyog Pawar /*************************************************************************/
353*c83a76b0SSuyog Pawar /* code flow: we call hme alloc function and then remap those memtabs */
354*c83a76b0SSuyog Pawar /* to a different type of memtab structure. */
355*c83a76b0SSuyog Pawar /*************************************************************************/
356*c83a76b0SSuyog Pawar if(i4_num_me_frm_pllel > 1)
357*c83a76b0SSuyog Pawar {
358*c83a76b0SSuyog Pawar ASSERT(MAX_HME_ENC_TOT_MEMTABS >= hme_enc_num_alloc(i4_num_me_frm_pllel));
359*c83a76b0SSuyog Pawar }
360*c83a76b0SSuyog Pawar else
361*c83a76b0SSuyog Pawar {
362*c83a76b0SSuyog Pawar ASSERT(MIN_HME_ENC_TOT_MEMTABS >= hme_enc_num_alloc(i4_num_me_frm_pllel));
363*c83a76b0SSuyog Pawar }
364*c83a76b0SSuyog Pawar
365*c83a76b0SSuyog Pawar /*************************************************************************/
366*c83a76b0SSuyog Pawar /* POPULATE THE HME INIT PRMS */
367*c83a76b0SSuyog Pawar /*************************************************************************/
368*c83a76b0SSuyog Pawar ihevce_derive_me_init_prms(ps_init_prms, &s_hme_init_prms, i4_num_proc_thrds, i4_resolution_id);
369*c83a76b0SSuyog Pawar
370*c83a76b0SSuyog Pawar /*************************************************************************/
371*c83a76b0SSuyog Pawar /* CALL THE ME FUNCTION TO GET MEMTABS */
372*c83a76b0SSuyog Pawar /*************************************************************************/
373*c83a76b0SSuyog Pawar n_tabs = hme_enc_alloc(&as_memtabs[0], &s_hme_init_prms, i4_num_me_frm_pllel);
374*c83a76b0SSuyog Pawar ASSERT(n_tabs == hme_enc_num_alloc(i4_num_me_frm_pllel));
375*c83a76b0SSuyog Pawar
376*c83a76b0SSuyog Pawar /*************************************************************************/
377*c83a76b0SSuyog Pawar /* REMAP RESULTS TO ENCODER MEMTAB STRUCTURE */
378*c83a76b0SSuyog Pawar /*************************************************************************/
379*c83a76b0SSuyog Pawar for(i = 0; i < n_tabs; i++)
380*c83a76b0SSuyog Pawar {
381*c83a76b0SSuyog Pawar ps_mem_tab[i].i4_mem_size = as_memtabs[i].size;
382*c83a76b0SSuyog Pawar ps_mem_tab[i].i4_mem_alignment = as_memtabs[i].align;
383*c83a76b0SSuyog Pawar ps_mem_tab[i].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
384*c83a76b0SSuyog Pawar ps_mem_tab[i].i4_size = sizeof(iv_mem_rec_t);
385*c83a76b0SSuyog Pawar }
386*c83a76b0SSuyog Pawar
387*c83a76b0SSuyog Pawar /*************************************************************************/
388*c83a76b0SSuyog Pawar /* --- L0 ME sync Dep Mngr Mem requests -- */
389*c83a76b0SSuyog Pawar /*************************************************************************/
390*c83a76b0SSuyog Pawar ps_mem_tab += n_tabs;
391*c83a76b0SSuyog Pawar
392*c83a76b0SSuyog Pawar return (n_tabs);
393*c83a76b0SSuyog Pawar }
394*c83a76b0SSuyog Pawar
395*c83a76b0SSuyog Pawar /*!
396*c83a76b0SSuyog Pawar ******************************************************************************
397*c83a76b0SSuyog Pawar * \if Function name : ihevce_me_init \endif
398*c83a76b0SSuyog Pawar *
399*c83a76b0SSuyog Pawar * \brief
400*c83a76b0SSuyog Pawar * Intialization for ME context state structure .
401*c83a76b0SSuyog Pawar *
402*c83a76b0SSuyog Pawar * \param[in] ps_mem_tab : pointer to memory descriptors table
403*c83a76b0SSuyog Pawar * \param[in] ps_init_prms : Create time static parameters
404*c83a76b0SSuyog Pawar * \param[in] pv_osal_handle : Osal handle
405*c83a76b0SSuyog Pawar *
406*c83a76b0SSuyog Pawar * \return
407*c83a76b0SSuyog Pawar * Handle to the ME context
408*c83a76b0SSuyog Pawar *
409*c83a76b0SSuyog Pawar * \author
410*c83a76b0SSuyog Pawar * Ittiam
411*c83a76b0SSuyog Pawar *
412*c83a76b0SSuyog Pawar *****************************************************************************
413*c83a76b0SSuyog Pawar */
ihevce_me_init(iv_mem_rec_t * ps_mem_tab,ihevce_static_cfg_params_t * ps_init_prms,WORD32 i4_num_proc_thrds,void * pv_osal_handle,rc_quant_t * ps_rc_quant_ctxt,void * pv_tile_params_base,WORD32 i4_resolution_id,WORD32 i4_num_me_frm_pllel,UWORD8 u1_is_popcnt_available)414*c83a76b0SSuyog Pawar void *ihevce_me_init(
415*c83a76b0SSuyog Pawar iv_mem_rec_t *ps_mem_tab,
416*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_init_prms,
417*c83a76b0SSuyog Pawar WORD32 i4_num_proc_thrds,
418*c83a76b0SSuyog Pawar void *pv_osal_handle,
419*c83a76b0SSuyog Pawar rc_quant_t *ps_rc_quant_ctxt,
420*c83a76b0SSuyog Pawar void *pv_tile_params_base,
421*c83a76b0SSuyog Pawar WORD32 i4_resolution_id,
422*c83a76b0SSuyog Pawar WORD32 i4_num_me_frm_pllel,
423*c83a76b0SSuyog Pawar UWORD8 u1_is_popcnt_available)
424*c83a76b0SSuyog Pawar {
425*c83a76b0SSuyog Pawar /* ME handle to be returned */
426*c83a76b0SSuyog Pawar void *pv_me_ctxt;
427*c83a76b0SSuyog Pawar WORD32 status;
428*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_me_ctxt;
429*c83a76b0SSuyog Pawar IV_ARCH_T e_arch_type;
430*c83a76b0SSuyog Pawar
431*c83a76b0SSuyog Pawar /* Init prms structure specific to HME */
432*c83a76b0SSuyog Pawar hme_init_prms_t s_hme_init_prms;
433*c83a76b0SSuyog Pawar
434*c83a76b0SSuyog Pawar /* memtabs to be passed to hme */
435*c83a76b0SSuyog Pawar hme_memtab_t as_memtabs[MAX_HME_ENC_TOT_MEMTABS];
436*c83a76b0SSuyog Pawar WORD32 n_tabs, i;
437*c83a76b0SSuyog Pawar
438*c83a76b0SSuyog Pawar /*************************************************************************/
439*c83a76b0SSuyog Pawar /* POPULATE THE HME INIT PRMS */
440*c83a76b0SSuyog Pawar /*************************************************************************/
441*c83a76b0SSuyog Pawar ihevce_derive_me_init_prms(ps_init_prms, &s_hme_init_prms, i4_num_proc_thrds, i4_resolution_id);
442*c83a76b0SSuyog Pawar
443*c83a76b0SSuyog Pawar /*************************************************************************/
444*c83a76b0SSuyog Pawar /* Ensure local declaration is sufficient */
445*c83a76b0SSuyog Pawar /*************************************************************************/
446*c83a76b0SSuyog Pawar n_tabs = hme_enc_num_alloc(i4_num_me_frm_pllel);
447*c83a76b0SSuyog Pawar
448*c83a76b0SSuyog Pawar if(i4_num_me_frm_pllel > 1)
449*c83a76b0SSuyog Pawar {
450*c83a76b0SSuyog Pawar ASSERT(MAX_HME_ENC_TOT_MEMTABS >= n_tabs);
451*c83a76b0SSuyog Pawar }
452*c83a76b0SSuyog Pawar else
453*c83a76b0SSuyog Pawar {
454*c83a76b0SSuyog Pawar ASSERT(MIN_HME_ENC_TOT_MEMTABS >= n_tabs);
455*c83a76b0SSuyog Pawar }
456*c83a76b0SSuyog Pawar
457*c83a76b0SSuyog Pawar /*************************************************************************/
458*c83a76b0SSuyog Pawar /* MAP RESULTS TO HME MEMTAB STRUCTURE */
459*c83a76b0SSuyog Pawar /*************************************************************************/
460*c83a76b0SSuyog Pawar for(i = 0; i < n_tabs; i++)
461*c83a76b0SSuyog Pawar {
462*c83a76b0SSuyog Pawar as_memtabs[i].size = ps_mem_tab[i].i4_mem_size;
463*c83a76b0SSuyog Pawar as_memtabs[i].align = ps_mem_tab[i].i4_mem_alignment;
464*c83a76b0SSuyog Pawar as_memtabs[i].pu1_mem = (U08 *)ps_mem_tab[i].pv_base;
465*c83a76b0SSuyog Pawar }
466*c83a76b0SSuyog Pawar /*************************************************************************/
467*c83a76b0SSuyog Pawar /* CALL THE ME FUNCTION TO GET MEMTABS */
468*c83a76b0SSuyog Pawar /*************************************************************************/
469*c83a76b0SSuyog Pawar pv_me_ctxt = (void *)as_memtabs[0].pu1_mem;
470*c83a76b0SSuyog Pawar ps_me_ctxt = (me_master_ctxt_t *)pv_me_ctxt;
471*c83a76b0SSuyog Pawar /* Store Tile params base into ME context */
472*c83a76b0SSuyog Pawar ps_me_ctxt->pv_tile_params_base = pv_tile_params_base;
473*c83a76b0SSuyog Pawar
474*c83a76b0SSuyog Pawar status = hme_enc_init(
475*c83a76b0SSuyog Pawar pv_me_ctxt, &as_memtabs[0], &s_hme_init_prms, ps_rc_quant_ctxt, i4_num_me_frm_pllel);
476*c83a76b0SSuyog Pawar
477*c83a76b0SSuyog Pawar if(status == -1)
478*c83a76b0SSuyog Pawar return NULL;
479*c83a76b0SSuyog Pawar
480*c83a76b0SSuyog Pawar /*************************************************************************/
481*c83a76b0SSuyog Pawar /* --- L0 ME sync Dep Mngr Mem init -- */
482*c83a76b0SSuyog Pawar /*************************************************************************/
483*c83a76b0SSuyog Pawar /* Update numer of ME frames running in parallel in me master context */
484*c83a76b0SSuyog Pawar ps_me_ctxt->i4_num_me_frm_pllel = i4_num_me_frm_pllel;
485*c83a76b0SSuyog Pawar
486*c83a76b0SSuyog Pawar e_arch_type = ps_init_prms->e_arch_type;
487*c83a76b0SSuyog Pawar
488*c83a76b0SSuyog Pawar hme_init_function_ptr(ps_me_ctxt, e_arch_type);
489*c83a76b0SSuyog Pawar
490*c83a76b0SSuyog Pawar ihevce_me_instr_set_router(
491*c83a76b0SSuyog Pawar (ihevce_me_optimised_function_list_t *)ps_me_ctxt->pv_me_optimised_function_list,
492*c83a76b0SSuyog Pawar e_arch_type);
493*c83a76b0SSuyog Pawar
494*c83a76b0SSuyog Pawar ihevce_cmn_utils_instr_set_router(
495*c83a76b0SSuyog Pawar &ps_me_ctxt->s_cmn_opt_func, u1_is_popcnt_available, e_arch_type);
496*c83a76b0SSuyog Pawar
497*c83a76b0SSuyog Pawar ps_mem_tab += n_tabs;
498*c83a76b0SSuyog Pawar
499*c83a76b0SSuyog Pawar return (pv_me_ctxt);
500*c83a76b0SSuyog Pawar }
501*c83a76b0SSuyog Pawar
502*c83a76b0SSuyog Pawar /**
503*c83a76b0SSuyog Pawar *******************************************************************************
504*c83a76b0SSuyog Pawar * \if Function name : ihevce_me_set_resolution \endif
505*c83a76b0SSuyog Pawar *
506*c83a76b0SSuyog Pawar * \brief
507*c83a76b0SSuyog Pawar * Sets the resolution for ME state
508*c83a76b0SSuyog Pawar *
509*c83a76b0SSuyog Pawar * \par Description:
510*c83a76b0SSuyog Pawar * ME requires information of resolution to prime up its layer descriptors
511*c83a76b0SSuyog Pawar * and contexts. This API is called whenever a control call from application
512*c83a76b0SSuyog Pawar * causes a change of resolution. Has to be called once initially before
513*c83a76b0SSuyog Pawar * processing any frame. Again this is just a glue function and calls the
514*c83a76b0SSuyog Pawar * actual ME API for the same.
515*c83a76b0SSuyog Pawar *
516*c83a76b0SSuyog Pawar * \param[in,out] pv_me_ctxt: Handle to the ME context
517*c83a76b0SSuyog Pawar * \param[in] n_enc_layers: Number of layers getting encoded
518*c83a76b0SSuyog Pawar * \param[in] p_wd : Pointer containing widths of each layer getting encoded.
519*c83a76b0SSuyog Pawar * \param[in] p_ht : Pointer containing heights of each layer getting encoded.
520*c83a76b0SSuyog Pawar *
521*c83a76b0SSuyog Pawar * \returns
522*c83a76b0SSuyog Pawar * none
523*c83a76b0SSuyog Pawar *
524*c83a76b0SSuyog Pawar * \author
525*c83a76b0SSuyog Pawar * Ittiam
526*c83a76b0SSuyog Pawar *
527*c83a76b0SSuyog Pawar *******************************************************************************
528*c83a76b0SSuyog Pawar */
ihevce_me_set_resolution(void * pv_me_ctxt,WORD32 n_enc_layers,WORD32 * p_wd,WORD32 * p_ht)529*c83a76b0SSuyog Pawar void ihevce_me_set_resolution(void *pv_me_ctxt, WORD32 n_enc_layers, WORD32 *p_wd, WORD32 *p_ht)
530*c83a76b0SSuyog Pawar {
531*c83a76b0SSuyog Pawar /* local variables */
532*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt = (me_master_ctxt_t *)pv_me_ctxt;
533*c83a76b0SSuyog Pawar WORD32 thrds;
534*c83a76b0SSuyog Pawar WORD32 i;
535*c83a76b0SSuyog Pawar
536*c83a76b0SSuyog Pawar for(thrds = 0; thrds < ps_master_ctxt->i4_num_proc_thrds; thrds++)
537*c83a76b0SSuyog Pawar {
538*c83a76b0SSuyog Pawar me_ctxt_t *ps_me_thrd_ctxt;
539*c83a76b0SSuyog Pawar
540*c83a76b0SSuyog Pawar ps_me_thrd_ctxt = ps_master_ctxt->aps_me_ctxt[thrds];
541*c83a76b0SSuyog Pawar
542*c83a76b0SSuyog Pawar for(i = 0; i < MAX_NUM_ME_PARALLEL; i++)
543*c83a76b0SSuyog Pawar {
544*c83a76b0SSuyog Pawar hme_set_resolution((void *)ps_me_thrd_ctxt, n_enc_layers, p_wd, p_ht, i);
545*c83a76b0SSuyog Pawar }
546*c83a76b0SSuyog Pawar }
547*c83a76b0SSuyog Pawar }
548*c83a76b0SSuyog Pawar
ihevce_populate_me_ctb_data(me_ctxt_t * ps_ctxt,me_frm_ctxt_t * ps_frm_ctxt,cur_ctb_cu_tree_t * ps_cu_tree,me_ctb_data_t * ps_me_ctb_data,CU_POS_T e_grandparent_blk_pos,CU_POS_T e_parent_blk_pos,CU_POS_T e_cur_blk_pos)549*c83a76b0SSuyog Pawar void ihevce_populate_me_ctb_data(
550*c83a76b0SSuyog Pawar me_ctxt_t *ps_ctxt,
551*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_frm_ctxt,
552*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree,
553*c83a76b0SSuyog Pawar me_ctb_data_t *ps_me_ctb_data,
554*c83a76b0SSuyog Pawar CU_POS_T e_grandparent_blk_pos,
555*c83a76b0SSuyog Pawar CU_POS_T e_parent_blk_pos,
556*c83a76b0SSuyog Pawar CU_POS_T e_cur_blk_pos)
557*c83a76b0SSuyog Pawar {
558*c83a76b0SSuyog Pawar inter_cu_results_t *ps_cu_results;
559*c83a76b0SSuyog Pawar
560*c83a76b0SSuyog Pawar switch(ps_cu_tree->u1_cu_size)
561*c83a76b0SSuyog Pawar {
562*c83a76b0SSuyog Pawar case 64:
563*c83a76b0SSuyog Pawar {
564*c83a76b0SSuyog Pawar block_data_64x64_t *ps_data = &ps_me_ctb_data->s_64x64_block_data;
565*c83a76b0SSuyog Pawar
566*c83a76b0SSuyog Pawar ps_cu_results = &ps_frm_ctxt->s_cu64x64_results;
567*c83a76b0SSuyog Pawar ps_data->num_best_results = (ps_cu_tree->is_node_valid) ? ps_cu_results->u1_num_best_results
568*c83a76b0SSuyog Pawar : 0;
569*c83a76b0SSuyog Pawar
570*c83a76b0SSuyog Pawar break;
571*c83a76b0SSuyog Pawar }
572*c83a76b0SSuyog Pawar case 32:
573*c83a76b0SSuyog Pawar {
574*c83a76b0SSuyog Pawar block_data_32x32_t *ps_data = &ps_me_ctb_data->as_32x32_block_data[e_cur_blk_pos];
575*c83a76b0SSuyog Pawar
576*c83a76b0SSuyog Pawar ps_cu_results = &ps_frm_ctxt->as_cu32x32_results[e_cur_blk_pos];
577*c83a76b0SSuyog Pawar ps_data->num_best_results = (ps_cu_tree->is_node_valid) ? ps_cu_results->u1_num_best_results
578*c83a76b0SSuyog Pawar : 0;
579*c83a76b0SSuyog Pawar
580*c83a76b0SSuyog Pawar break;
581*c83a76b0SSuyog Pawar }
582*c83a76b0SSuyog Pawar case 16:
583*c83a76b0SSuyog Pawar {
584*c83a76b0SSuyog Pawar WORD32 i4_blk_id = e_cur_blk_pos + (e_parent_blk_pos << 2);
585*c83a76b0SSuyog Pawar
586*c83a76b0SSuyog Pawar block_data_16x16_t *ps_data = &ps_me_ctb_data->as_block_data[i4_blk_id];
587*c83a76b0SSuyog Pawar
588*c83a76b0SSuyog Pawar ps_cu_results = &ps_frm_ctxt->as_cu16x16_results[i4_blk_id];
589*c83a76b0SSuyog Pawar ps_data->num_best_results = (ps_cu_tree->is_node_valid) ? ps_cu_results->u1_num_best_results
590*c83a76b0SSuyog Pawar : 0;
591*c83a76b0SSuyog Pawar
592*c83a76b0SSuyog Pawar break;
593*c83a76b0SSuyog Pawar }
594*c83a76b0SSuyog Pawar case 8:
595*c83a76b0SSuyog Pawar {
596*c83a76b0SSuyog Pawar WORD32 i4_blk_id = e_cur_blk_pos + (e_parent_blk_pos << 2) + (e_grandparent_blk_pos << 4);
597*c83a76b0SSuyog Pawar
598*c83a76b0SSuyog Pawar block_data_8x8_t *ps_data = &ps_me_ctb_data->as_8x8_block_data[i4_blk_id];
599*c83a76b0SSuyog Pawar
600*c83a76b0SSuyog Pawar ps_cu_results = &ps_frm_ctxt->as_cu8x8_results[i4_blk_id];
601*c83a76b0SSuyog Pawar ps_data->num_best_results = (ps_cu_tree->is_node_valid) ? ps_cu_results->u1_num_best_results
602*c83a76b0SSuyog Pawar : 0;
603*c83a76b0SSuyog Pawar
604*c83a76b0SSuyog Pawar break;
605*c83a76b0SSuyog Pawar }
606*c83a76b0SSuyog Pawar }
607*c83a76b0SSuyog Pawar
608*c83a76b0SSuyog Pawar if(ps_cu_tree->is_node_valid)
609*c83a76b0SSuyog Pawar {
610*c83a76b0SSuyog Pawar if((ps_ctxt->s_init_prms.s_me_coding_tools.e_me_quality_presets == ME_PRISTINE_QUALITY) &&
611*c83a76b0SSuyog Pawar (ps_cu_tree->u1_cu_size != 8))
612*c83a76b0SSuyog Pawar {
613*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
614*c83a76b0SSuyog Pawar ps_ctxt,
615*c83a76b0SSuyog Pawar ps_frm_ctxt,
616*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_tl,
617*c83a76b0SSuyog Pawar ps_me_ctb_data,
618*c83a76b0SSuyog Pawar e_parent_blk_pos,
619*c83a76b0SSuyog Pawar e_cur_blk_pos,
620*c83a76b0SSuyog Pawar POS_TL);
621*c83a76b0SSuyog Pawar
622*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
623*c83a76b0SSuyog Pawar ps_ctxt,
624*c83a76b0SSuyog Pawar ps_frm_ctxt,
625*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_tr,
626*c83a76b0SSuyog Pawar ps_me_ctb_data,
627*c83a76b0SSuyog Pawar e_parent_blk_pos,
628*c83a76b0SSuyog Pawar e_cur_blk_pos,
629*c83a76b0SSuyog Pawar POS_TR);
630*c83a76b0SSuyog Pawar
631*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
632*c83a76b0SSuyog Pawar ps_ctxt,
633*c83a76b0SSuyog Pawar ps_frm_ctxt,
634*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_bl,
635*c83a76b0SSuyog Pawar ps_me_ctb_data,
636*c83a76b0SSuyog Pawar e_parent_blk_pos,
637*c83a76b0SSuyog Pawar e_cur_blk_pos,
638*c83a76b0SSuyog Pawar POS_BL);
639*c83a76b0SSuyog Pawar
640*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
641*c83a76b0SSuyog Pawar ps_ctxt,
642*c83a76b0SSuyog Pawar ps_frm_ctxt,
643*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_br,
644*c83a76b0SSuyog Pawar ps_me_ctb_data,
645*c83a76b0SSuyog Pawar e_parent_blk_pos,
646*c83a76b0SSuyog Pawar e_cur_blk_pos,
647*c83a76b0SSuyog Pawar POS_BR);
648*c83a76b0SSuyog Pawar }
649*c83a76b0SSuyog Pawar }
650*c83a76b0SSuyog Pawar else if(ps_cu_tree->u1_cu_size != 8)
651*c83a76b0SSuyog Pawar {
652*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
653*c83a76b0SSuyog Pawar ps_ctxt,
654*c83a76b0SSuyog Pawar ps_frm_ctxt,
655*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_tl,
656*c83a76b0SSuyog Pawar ps_me_ctb_data,
657*c83a76b0SSuyog Pawar e_parent_blk_pos,
658*c83a76b0SSuyog Pawar e_cur_blk_pos,
659*c83a76b0SSuyog Pawar POS_TL);
660*c83a76b0SSuyog Pawar
661*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
662*c83a76b0SSuyog Pawar ps_ctxt,
663*c83a76b0SSuyog Pawar ps_frm_ctxt,
664*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_tr,
665*c83a76b0SSuyog Pawar ps_me_ctb_data,
666*c83a76b0SSuyog Pawar e_parent_blk_pos,
667*c83a76b0SSuyog Pawar e_cur_blk_pos,
668*c83a76b0SSuyog Pawar POS_TR);
669*c83a76b0SSuyog Pawar
670*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
671*c83a76b0SSuyog Pawar ps_ctxt,
672*c83a76b0SSuyog Pawar ps_frm_ctxt,
673*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_bl,
674*c83a76b0SSuyog Pawar ps_me_ctb_data,
675*c83a76b0SSuyog Pawar e_parent_blk_pos,
676*c83a76b0SSuyog Pawar e_cur_blk_pos,
677*c83a76b0SSuyog Pawar POS_BL);
678*c83a76b0SSuyog Pawar
679*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
680*c83a76b0SSuyog Pawar ps_ctxt,
681*c83a76b0SSuyog Pawar ps_frm_ctxt,
682*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_br,
683*c83a76b0SSuyog Pawar ps_me_ctb_data,
684*c83a76b0SSuyog Pawar e_parent_blk_pos,
685*c83a76b0SSuyog Pawar e_cur_blk_pos,
686*c83a76b0SSuyog Pawar POS_BR);
687*c83a76b0SSuyog Pawar }
688*c83a76b0SSuyog Pawar }
689*c83a76b0SSuyog Pawar
ihevce_me_update_ctb_results(void * pv_me_ctxt,void * pv_me_frm_ctxt,WORD32 i4_ctb_x,WORD32 i4_ctb_y)690*c83a76b0SSuyog Pawar void ihevce_me_update_ctb_results(
691*c83a76b0SSuyog Pawar void *pv_me_ctxt, void *pv_me_frm_ctxt, WORD32 i4_ctb_x, WORD32 i4_ctb_y)
692*c83a76b0SSuyog Pawar {
693*c83a76b0SSuyog Pawar ctb_analyse_t *ps_ctb_out;
694*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree;
695*c83a76b0SSuyog Pawar me_ctb_data_t *ps_me_ctb_data;
696*c83a76b0SSuyog Pawar
697*c83a76b0SSuyog Pawar me_ctxt_t *ps_ctxt = (me_ctxt_t *)pv_me_ctxt;
698*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_frm_ctxt = (me_frm_ctxt_t *)pv_me_frm_ctxt;
699*c83a76b0SSuyog Pawar
700*c83a76b0SSuyog Pawar ps_ctb_out = ps_frm_ctxt->ps_ctb_analyse_curr_row + i4_ctb_x;
701*c83a76b0SSuyog Pawar
702*c83a76b0SSuyog Pawar ps_me_ctb_data = ps_frm_ctxt->ps_me_ctb_data_curr_row + i4_ctb_x;
703*c83a76b0SSuyog Pawar ps_cu_tree = ps_frm_ctxt->ps_cu_tree_curr_row + (i4_ctb_x * MAX_NUM_NODES_CU_TREE);
704*c83a76b0SSuyog Pawar
705*c83a76b0SSuyog Pawar ps_ctb_out->ps_cu_tree = ps_cu_tree;
706*c83a76b0SSuyog Pawar ps_ctb_out->ps_me_ctb_data = ps_me_ctb_data;
707*c83a76b0SSuyog Pawar
708*c83a76b0SSuyog Pawar ihevce_populate_me_ctb_data(
709*c83a76b0SSuyog Pawar ps_ctxt, ps_frm_ctxt, ps_cu_tree, ps_me_ctb_data, POS_NA, POS_NA, POS_NA);
710*c83a76b0SSuyog Pawar }
711*c83a76b0SSuyog Pawar
ihevce_me_find_poc_in_list(recon_pic_buf_t ** pps_rec_list,WORD32 poc,WORD32 i4_idr_gop_num,WORD32 num_ref)712*c83a76b0SSuyog Pawar WORD32 ihevce_me_find_poc_in_list(
713*c83a76b0SSuyog Pawar recon_pic_buf_t **pps_rec_list, WORD32 poc, WORD32 i4_idr_gop_num, WORD32 num_ref)
714*c83a76b0SSuyog Pawar {
715*c83a76b0SSuyog Pawar WORD32 i;
716*c83a76b0SSuyog Pawar
717*c83a76b0SSuyog Pawar for(i = 0; i < num_ref; i++)
718*c83a76b0SSuyog Pawar {
719*c83a76b0SSuyog Pawar if(pps_rec_list[i]->i4_poc == poc && pps_rec_list[i]->i4_idr_gop_num == i4_idr_gop_num)
720*c83a76b0SSuyog Pawar return (i);
721*c83a76b0SSuyog Pawar }
722*c83a76b0SSuyog Pawar
723*c83a76b0SSuyog Pawar /* should never come here */
724*c83a76b0SSuyog Pawar ASSERT(0);
725*c83a76b0SSuyog Pawar return (-1);
726*c83a76b0SSuyog Pawar }
ihevc_me_update_ref_desc(hme_ref_desc_t * ps_ref_desc,recon_pic_buf_t * ps_recon_pic,WORD32 ref_id_l0,WORD32 ref_id_l1,WORD32 ref_id_lc,WORD32 is_fwd)727*c83a76b0SSuyog Pawar void ihevc_me_update_ref_desc(
728*c83a76b0SSuyog Pawar hme_ref_desc_t *ps_ref_desc,
729*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_recon_pic,
730*c83a76b0SSuyog Pawar WORD32 ref_id_l0,
731*c83a76b0SSuyog Pawar WORD32 ref_id_l1,
732*c83a76b0SSuyog Pawar WORD32 ref_id_lc,
733*c83a76b0SSuyog Pawar WORD32 is_fwd)
734*c83a76b0SSuyog Pawar {
735*c83a76b0SSuyog Pawar hme_ref_buf_info_t *ps_ref_info = &ps_ref_desc->as_ref_info[0];
736*c83a76b0SSuyog Pawar iv_enc_yuv_buf_t *ps_yuv_desc = (iv_enc_yuv_buf_t *)&ps_recon_pic->s_yuv_buf_desc;
737*c83a76b0SSuyog Pawar iv_enc_yuv_buf_t *ps_src_yuv_desc = (iv_enc_yuv_buf_t *)&ps_recon_pic->s_yuv_buf_desc_src;
738*c83a76b0SSuyog Pawar S32 offset;
739*c83a76b0SSuyog Pawar
740*c83a76b0SSuyog Pawar /* Padding beyond 64 is not of use to ME */
741*c83a76b0SSuyog Pawar ps_ref_info->u1_pad_x = MIN(64, PAD_HORZ);
742*c83a76b0SSuyog Pawar ps_ref_info->u1_pad_y = MIN(64, PAD_VERT);
743*c83a76b0SSuyog Pawar
744*c83a76b0SSuyog Pawar /* Luma stride and offset. Assuming here that supplied ptr is */
745*c83a76b0SSuyog Pawar /* 0, 0 position and hence setting offset to 0. In fact, it is */
746*c83a76b0SSuyog Pawar /* not used inside ME as of now. */
747*c83a76b0SSuyog Pawar ps_ref_info->luma_stride = ps_yuv_desc->i4_y_strd;
748*c83a76b0SSuyog Pawar ps_ref_info->luma_offset = 0;
749*c83a76b0SSuyog Pawar
750*c83a76b0SSuyog Pawar /* 4 planes, fxfy is the direct recon buf, others are from subpel planes */
751*c83a76b0SSuyog Pawar //offset = ps_ref_info->luma_stride * PAD_VERT + PAD_HORZ;
752*c83a76b0SSuyog Pawar offset = 0;
753*c83a76b0SSuyog Pawar ps_ref_info->pu1_rec_fxfy = (UWORD8 *)ps_yuv_desc->pv_y_buf + offset;
754*c83a76b0SSuyog Pawar ps_ref_info->pu1_rec_hxfy = ps_recon_pic->apu1_y_sub_pel_planes[0] + offset;
755*c83a76b0SSuyog Pawar ps_ref_info->pu1_rec_fxhy = ps_recon_pic->apu1_y_sub_pel_planes[1] + offset;
756*c83a76b0SSuyog Pawar ps_ref_info->pu1_rec_hxhy = ps_recon_pic->apu1_y_sub_pel_planes[2] + offset;
757*c83a76b0SSuyog Pawar ps_ref_info->pu1_ref_src = (UWORD8 *)ps_src_yuv_desc->pv_y_buf + offset;
758*c83a76b0SSuyog Pawar
759*c83a76b0SSuyog Pawar /* U V ptrs though they are not used */
760*c83a76b0SSuyog Pawar ps_ref_info->pu1_rec_u = (U08 *)ps_yuv_desc->pv_u_buf;
761*c83a76b0SSuyog Pawar ps_ref_info->pu1_rec_v = (U08 *)ps_yuv_desc->pv_v_buf;
762*c83a76b0SSuyog Pawar
763*c83a76b0SSuyog Pawar /* uv offsets and strides, same treatment sa luma */
764*c83a76b0SSuyog Pawar ps_ref_info->chroma_offset = 0;
765*c83a76b0SSuyog Pawar ps_ref_info->chroma_stride = ps_yuv_desc->i4_uv_strd;
766*c83a76b0SSuyog Pawar
767*c83a76b0SSuyog Pawar ps_ref_info->pv_dep_mngr = ps_recon_pic->pv_dep_mngr_recon;
768*c83a76b0SSuyog Pawar
769*c83a76b0SSuyog Pawar /* L0, L1 and LC id. */
770*c83a76b0SSuyog Pawar ps_ref_desc->i1_ref_id_l0 = ref_id_l0;
771*c83a76b0SSuyog Pawar ps_ref_desc->i1_ref_id_l1 = ref_id_l1;
772*c83a76b0SSuyog Pawar ps_ref_desc->i1_ref_id_lc = ref_id_lc;
773*c83a76b0SSuyog Pawar
774*c83a76b0SSuyog Pawar /* POC of the ref pic */
775*c83a76b0SSuyog Pawar ps_ref_desc->i4_poc = ps_recon_pic->i4_poc;
776*c83a76b0SSuyog Pawar
777*c83a76b0SSuyog Pawar /* Display num of the ref pic */
778*c83a76b0SSuyog Pawar ps_ref_desc->i4_display_num = ps_recon_pic->i4_display_num;
779*c83a76b0SSuyog Pawar
780*c83a76b0SSuyog Pawar /* GOP number of the reference pic*/
781*c83a76b0SSuyog Pawar ps_ref_desc->i4_GOP_num = ps_recon_pic->i4_idr_gop_num;
782*c83a76b0SSuyog Pawar
783*c83a76b0SSuyog Pawar /* Whether this picture is in past (fwd) or future (bck) */
784*c83a76b0SSuyog Pawar ps_ref_desc->u1_is_fwd = is_fwd;
785*c83a76b0SSuyog Pawar
786*c83a76b0SSuyog Pawar /* store the weight and offsets fo refernce picture */
787*c83a76b0SSuyog Pawar ps_ref_desc->i2_weight = ps_recon_pic->s_weight_offset.i2_luma_weight;
788*c83a76b0SSuyog Pawar ps_ref_desc->i2_offset = ps_recon_pic->s_weight_offset.i2_luma_offset;
789*c83a76b0SSuyog Pawar }
790*c83a76b0SSuyog Pawar
791*c83a76b0SSuyog Pawar /* Create the reference map for ME */
ihevce_me_create_ref_map(recon_pic_buf_t ** pps_rec_list_l0,recon_pic_buf_t ** pps_rec_list_l1,WORD32 num_ref_l0_active,WORD32 num_ref_l1_active,WORD32 num_ref,hme_ref_map_t * ps_ref_map)792*c83a76b0SSuyog Pawar void ihevce_me_create_ref_map(
793*c83a76b0SSuyog Pawar recon_pic_buf_t **pps_rec_list_l0,
794*c83a76b0SSuyog Pawar recon_pic_buf_t **pps_rec_list_l1,
795*c83a76b0SSuyog Pawar WORD32 num_ref_l0_active,
796*c83a76b0SSuyog Pawar WORD32 num_ref_l1_active,
797*c83a76b0SSuyog Pawar WORD32 num_ref,
798*c83a76b0SSuyog Pawar hme_ref_map_t *ps_ref_map)
799*c83a76b0SSuyog Pawar {
800*c83a76b0SSuyog Pawar WORD32 min_ref, i, poc, ref_id_l0, ref_id_l1;
801*c83a76b0SSuyog Pawar
802*c83a76b0SSuyog Pawar /* tracks running count of ref pics */
803*c83a76b0SSuyog Pawar WORD32 ref_count = 0, i4_idr_gop_num;
804*c83a76b0SSuyog Pawar
805*c83a76b0SSuyog Pawar /* points to One instance of a ref pic structure */
806*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_recon_pic;
807*c83a76b0SSuyog Pawar
808*c83a76b0SSuyog Pawar /* points to one instance of ref desc str used by ME */
809*c83a76b0SSuyog Pawar hme_ref_desc_t *ps_ref_desc;
810*c83a76b0SSuyog Pawar
811*c83a76b0SSuyog Pawar min_ref = MIN(num_ref_l0_active, num_ref_l1_active);
812*c83a76b0SSuyog Pawar
813*c83a76b0SSuyog Pawar for(i = 0; i < min_ref; i++)
814*c83a76b0SSuyog Pawar {
815*c83a76b0SSuyog Pawar /* Create interleaved L0 and L1 entries */
816*c83a76b0SSuyog Pawar ps_ref_desc = &ps_ref_map->as_ref_desc[ref_count];
817*c83a76b0SSuyog Pawar ps_recon_pic = pps_rec_list_l0[i];
818*c83a76b0SSuyog Pawar poc = ps_recon_pic->i4_poc;
819*c83a76b0SSuyog Pawar i4_idr_gop_num = ps_recon_pic->i4_idr_gop_num;
820*c83a76b0SSuyog Pawar ref_id_l0 = i;
821*c83a76b0SSuyog Pawar ref_id_l1 = ihevce_me_find_poc_in_list(pps_rec_list_l1, poc, i4_idr_gop_num, num_ref);
822*c83a76b0SSuyog Pawar ihevc_me_update_ref_desc(ps_ref_desc, ps_recon_pic, ref_id_l0, ref_id_l1, 2 * i, 1);
823*c83a76b0SSuyog Pawar
824*c83a76b0SSuyog Pawar ref_count++;
825*c83a76b0SSuyog Pawar
826*c83a76b0SSuyog Pawar ps_ref_desc = &ps_ref_map->as_ref_desc[ref_count];
827*c83a76b0SSuyog Pawar ps_recon_pic = pps_rec_list_l1[i];
828*c83a76b0SSuyog Pawar poc = ps_recon_pic->i4_poc;
829*c83a76b0SSuyog Pawar i4_idr_gop_num = ps_recon_pic->i4_idr_gop_num;
830*c83a76b0SSuyog Pawar ref_id_l1 = i;
831*c83a76b0SSuyog Pawar ref_id_l0 = ihevce_me_find_poc_in_list(pps_rec_list_l0, poc, i4_idr_gop_num, num_ref);
832*c83a76b0SSuyog Pawar ihevc_me_update_ref_desc(ps_ref_desc, ps_recon_pic, ref_id_l0, ref_id_l1, 2 * i + 1, 0);
833*c83a76b0SSuyog Pawar
834*c83a76b0SSuyog Pawar ref_count++;
835*c83a76b0SSuyog Pawar }
836*c83a76b0SSuyog Pawar
837*c83a76b0SSuyog Pawar if(num_ref_l0_active > min_ref)
838*c83a76b0SSuyog Pawar {
839*c83a76b0SSuyog Pawar for(i = 0; i < (num_ref_l0_active - min_ref); i++)
840*c83a76b0SSuyog Pawar {
841*c83a76b0SSuyog Pawar ps_ref_desc = &ps_ref_map->as_ref_desc[ref_count];
842*c83a76b0SSuyog Pawar ref_id_l0 = i + min_ref;
843*c83a76b0SSuyog Pawar ps_recon_pic = pps_rec_list_l0[ref_id_l0];
844*c83a76b0SSuyog Pawar poc = ps_recon_pic->i4_poc;
845*c83a76b0SSuyog Pawar i4_idr_gop_num = ps_recon_pic->i4_idr_gop_num;
846*c83a76b0SSuyog Pawar ref_id_l1 = ihevce_me_find_poc_in_list(pps_rec_list_l1, poc, i4_idr_gop_num, num_ref);
847*c83a76b0SSuyog Pawar ihevc_me_update_ref_desc(
848*c83a76b0SSuyog Pawar ps_ref_desc, ps_recon_pic, ref_id_l0, ref_id_l1, 2 * min_ref + i, 1);
849*c83a76b0SSuyog Pawar ref_count++;
850*c83a76b0SSuyog Pawar }
851*c83a76b0SSuyog Pawar }
852*c83a76b0SSuyog Pawar else
853*c83a76b0SSuyog Pawar {
854*c83a76b0SSuyog Pawar for(i = 0; i < (num_ref_l1_active - min_ref); i++)
855*c83a76b0SSuyog Pawar {
856*c83a76b0SSuyog Pawar ps_ref_desc = &ps_ref_map->as_ref_desc[ref_count];
857*c83a76b0SSuyog Pawar ref_id_l1 = i + min_ref;
858*c83a76b0SSuyog Pawar ps_recon_pic = pps_rec_list_l1[ref_id_l1];
859*c83a76b0SSuyog Pawar poc = ps_recon_pic->i4_poc;
860*c83a76b0SSuyog Pawar i4_idr_gop_num = ps_recon_pic->i4_idr_gop_num;
861*c83a76b0SSuyog Pawar ref_id_l0 = ihevce_me_find_poc_in_list(pps_rec_list_l0, poc, i4_idr_gop_num, num_ref);
862*c83a76b0SSuyog Pawar ihevc_me_update_ref_desc(
863*c83a76b0SSuyog Pawar ps_ref_desc, ps_recon_pic, ref_id_l0, ref_id_l1, 2 * min_ref + i, 0);
864*c83a76b0SSuyog Pawar ref_count++;
865*c83a76b0SSuyog Pawar }
866*c83a76b0SSuyog Pawar }
867*c83a76b0SSuyog Pawar
868*c83a76b0SSuyog Pawar ps_ref_map->i4_num_ref = ref_count;
869*c83a76b0SSuyog Pawar ASSERT(ref_count == (num_ref_l0_active + num_ref_l1_active));
870*c83a76b0SSuyog Pawar
871*c83a76b0SSuyog Pawar /* TODO : Fill better values in lambda depending on ref dist */
872*c83a76b0SSuyog Pawar for(i = 0; i < ps_ref_map->i4_num_ref; i++)
873*c83a76b0SSuyog Pawar ps_ref_map->as_ref_desc[i].lambda = 20;
874*c83a76b0SSuyog Pawar }
875*c83a76b0SSuyog Pawar
876*c83a76b0SSuyog Pawar /*!
877*c83a76b0SSuyog Pawar ******************************************************************************
878*c83a76b0SSuyog Pawar * \if Function name : ihevce_me_process \endif
879*c83a76b0SSuyog Pawar *
880*c83a76b0SSuyog Pawar * \brief
881*c83a76b0SSuyog Pawar * Frame level ME function
882*c83a76b0SSuyog Pawar *
883*c83a76b0SSuyog Pawar * \par Description:
884*c83a76b0SSuyog Pawar * Processing of all layers starting from coarse and going
885*c83a76b0SSuyog Pawar * to the refinement layers, all layers
886*c83a76b0SSuyog Pawar * that are encoded go CTB by CTB. Outputs of this function are populated
887*c83a76b0SSuyog Pawar * ctb_analyse_t structures, one per CTB.
888*c83a76b0SSuyog Pawar *
889*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to ME module
890*c83a76b0SSuyog Pawar * \param[in] ps_enc_lap_inp : pointer to input yuv buffer (frame buffer)
891*c83a76b0SSuyog Pawar * \param[in,out] ps_ctb_out : pointer to CTB analyse output structure (frame buffer)
892*c83a76b0SSuyog Pawar * \param[out] ps_cu_out : pointer to CU analyse output structure (frame buffer)
893*c83a76b0SSuyog Pawar * \param[in] pd_intra_costs : pointerto intra cost buffer
894*c83a76b0SSuyog Pawar * \param[in] ps_multi_thrd_ctxt : pointer to multi thread ctxt
895*c83a76b0SSuyog Pawar * \param[in] thrd_id : Thread id of the current thrd in which function is executed
896*c83a76b0SSuyog Pawar *
897*c83a76b0SSuyog Pawar * \return
898*c83a76b0SSuyog Pawar * None
899*c83a76b0SSuyog Pawar *
900*c83a76b0SSuyog Pawar * \author
901*c83a76b0SSuyog Pawar * Ittiam
902*c83a76b0SSuyog Pawar *
903*c83a76b0SSuyog Pawar *****************************************************************************
904*c83a76b0SSuyog Pawar */
ihevce_me_process(void * pv_me_ctxt,ihevce_lap_enc_buf_t * ps_enc_lap_inp,ctb_analyse_t * ps_ctb_out,me_enc_rdopt_ctxt_t * ps_cur_out_me_prms,double * pd_intra_costs,ipe_l0_ctb_analyse_for_me_t * ps_ipe_analyse_ctb,pre_enc_L0_ipe_encloop_ctxt_t * ps_l0_ipe_input,void * pv_coarse_layer,multi_thrd_ctxt_t * ps_multi_thrd_ctxt,WORD32 i4_frame_parallelism_level,WORD32 thrd_id,WORD32 i4_me_frm_id)905*c83a76b0SSuyog Pawar void ihevce_me_process(
906*c83a76b0SSuyog Pawar void *pv_me_ctxt,
907*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_enc_lap_inp,
908*c83a76b0SSuyog Pawar ctb_analyse_t *ps_ctb_out,
909*c83a76b0SSuyog Pawar me_enc_rdopt_ctxt_t *ps_cur_out_me_prms,
910*c83a76b0SSuyog Pawar double *pd_intra_costs,
911*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_ipe_analyse_ctb,
912*c83a76b0SSuyog Pawar pre_enc_L0_ipe_encloop_ctxt_t *ps_l0_ipe_input,
913*c83a76b0SSuyog Pawar void *pv_coarse_layer,
914*c83a76b0SSuyog Pawar multi_thrd_ctxt_t *ps_multi_thrd_ctxt,
915*c83a76b0SSuyog Pawar WORD32 i4_frame_parallelism_level,
916*c83a76b0SSuyog Pawar WORD32 thrd_id,
917*c83a76b0SSuyog Pawar WORD32 i4_me_frm_id)
918*c83a76b0SSuyog Pawar {
919*c83a76b0SSuyog Pawar me_ctxt_t *ps_thrd_ctxt;
920*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_ctxt;
921*c83a76b0SSuyog Pawar
922*c83a76b0SSuyog Pawar PF_EXT_UPDATE_FXN_T pf_ext_update_fxn;
923*c83a76b0SSuyog Pawar
924*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt = (me_master_ctxt_t *)pv_me_ctxt;
925*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_out = ps_cur_out_me_prms->ps_cur_ctb_cu_tree;
926*c83a76b0SSuyog Pawar me_ctb_data_t *ps_me_ctb_data_out = ps_cur_out_me_prms->ps_cur_ctb_me_data;
927*c83a76b0SSuyog Pawar layer_ctxt_t *ps_coarse_layer = (layer_ctxt_t *)pv_coarse_layer;
928*c83a76b0SSuyog Pawar
929*c83a76b0SSuyog Pawar pf_ext_update_fxn = (PF_EXT_UPDATE_FXN_T)ihevce_me_update_ctb_results;
930*c83a76b0SSuyog Pawar
931*c83a76b0SSuyog Pawar /* get the current thread ctxt pointer */
932*c83a76b0SSuyog Pawar ps_thrd_ctxt = ps_master_ctxt->aps_me_ctxt[thrd_id];
933*c83a76b0SSuyog Pawar ps_ctxt = ps_thrd_ctxt->aps_me_frm_prms[i4_me_frm_id];
934*c83a76b0SSuyog Pawar ps_ctxt->thrd_id = thrd_id;
935*c83a76b0SSuyog Pawar
936*c83a76b0SSuyog Pawar /* store the ctb out and cu out base pointers */
937*c83a76b0SSuyog Pawar ps_ctxt->ps_ctb_analyse_base = ps_ctb_out;
938*c83a76b0SSuyog Pawar
939*c83a76b0SSuyog Pawar ps_ctxt->ps_cu_tree_base = ps_cu_tree_out;
940*c83a76b0SSuyog Pawar ps_ctxt->ps_ipe_l0_ctb_frm_base = ps_ipe_analyse_ctb;
941*c83a76b0SSuyog Pawar ps_ctxt->ps_me_ctb_data_base = ps_me_ctb_data_out;
942*c83a76b0SSuyog Pawar ps_ctxt->ps_func_selector = &ps_master_ctxt->s_func_selector;
943*c83a76b0SSuyog Pawar
944*c83a76b0SSuyog Pawar /** currently in master context. Copying that to me context **/
945*c83a76b0SSuyog Pawar /* frame level processing function */
946*c83a76b0SSuyog Pawar hme_process_frm(
947*c83a76b0SSuyog Pawar (void *)ps_thrd_ctxt,
948*c83a76b0SSuyog Pawar ps_l0_ipe_input,
949*c83a76b0SSuyog Pawar &ps_master_ctxt->as_ref_map[i4_me_frm_id],
950*c83a76b0SSuyog Pawar &pd_intra_costs,
951*c83a76b0SSuyog Pawar &ps_master_ctxt->as_frm_prms[i4_me_frm_id],
952*c83a76b0SSuyog Pawar pf_ext_update_fxn,
953*c83a76b0SSuyog Pawar ps_coarse_layer,
954*c83a76b0SSuyog Pawar ps_multi_thrd_ctxt,
955*c83a76b0SSuyog Pawar i4_frame_parallelism_level,
956*c83a76b0SSuyog Pawar thrd_id,
957*c83a76b0SSuyog Pawar i4_me_frm_id);
958*c83a76b0SSuyog Pawar }
959*c83a76b0SSuyog Pawar /*!
960*c83a76b0SSuyog Pawar ******************************************************************************
961*c83a76b0SSuyog Pawar * \if Function name : ihevce_me_frame_dpb_update \endif
962*c83a76b0SSuyog Pawar *
963*c83a76b0SSuyog Pawar * \brief
964*c83a76b0SSuyog Pawar * Frame level ME initialisation function
965*c83a76b0SSuyog Pawar *
966*c83a76b0SSuyog Pawar * \par Description:
967*c83a76b0SSuyog Pawar * Updation of ME's internal DPB
968*c83a76b0SSuyog Pawar * based on available ref list information
969*c83a76b0SSuyog Pawar *
970*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to ME module
971*c83a76b0SSuyog Pawar * \param[in] num_ref_l0 : Number of reference pics in L0 list
972*c83a76b0SSuyog Pawar * \param[in] num_ref_l1 : Number of reference pics in L1 list
973*c83a76b0SSuyog Pawar * \param[in] pps_rec_list_l0 : List of recon pics in L0 list
974*c83a76b0SSuyog Pawar * \param[in] pps_rec_list_l1 : List of recon pics in L1 list
975*c83a76b0SSuyog Pawar *
976*c83a76b0SSuyog Pawar * \return
977*c83a76b0SSuyog Pawar * None
978*c83a76b0SSuyog Pawar *
979*c83a76b0SSuyog Pawar * \author
980*c83a76b0SSuyog Pawar * Ittiam
981*c83a76b0SSuyog Pawar *
982*c83a76b0SSuyog Pawar *****************************************************************************
983*c83a76b0SSuyog Pawar */
ihevce_me_frame_dpb_update(void * pv_me_ctxt,WORD32 num_ref_l0,WORD32 num_ref_l1,recon_pic_buf_t ** pps_rec_list_l0,recon_pic_buf_t ** pps_rec_list_l1,WORD32 i4_thrd_id)984*c83a76b0SSuyog Pawar void ihevce_me_frame_dpb_update(
985*c83a76b0SSuyog Pawar void *pv_me_ctxt,
986*c83a76b0SSuyog Pawar WORD32 num_ref_l0,
987*c83a76b0SSuyog Pawar WORD32 num_ref_l1,
988*c83a76b0SSuyog Pawar recon_pic_buf_t **pps_rec_list_l0,
989*c83a76b0SSuyog Pawar recon_pic_buf_t **pps_rec_list_l1,
990*c83a76b0SSuyog Pawar WORD32 i4_thrd_id)
991*c83a76b0SSuyog Pawar {
992*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt = (me_master_ctxt_t *)pv_me_ctxt;
993*c83a76b0SSuyog Pawar me_ctxt_t *ps_thrd0_ctxt;
994*c83a76b0SSuyog Pawar WORD32 a_pocs_to_remove[MAX_NUM_REF + 2];
995*c83a76b0SSuyog Pawar WORD32 i, i4_is_buffer_full;
996*c83a76b0SSuyog Pawar WORD32 i4_least_POC = 0x7FFFFFFF;
997*c83a76b0SSuyog Pawar WORD32 i4_least_GOP_num = 0x7FFFFFFF;
998*c83a76b0SSuyog Pawar me_ctxt_t *ps_ctxt;
999*c83a76b0SSuyog Pawar
1000*c83a76b0SSuyog Pawar /* All processing done using shared / common memory across */
1001*c83a76b0SSuyog Pawar /* threads is done using thrd ctxt */
1002*c83a76b0SSuyog Pawar ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[i4_thrd_id];
1003*c83a76b0SSuyog Pawar
1004*c83a76b0SSuyog Pawar ps_ctxt = (me_ctxt_t *)ps_thrd0_ctxt;
1005*c83a76b0SSuyog Pawar a_pocs_to_remove[0] = INVALID_POC;
1006*c83a76b0SSuyog Pawar /*************************************************************************/
1007*c83a76b0SSuyog Pawar /* Updation of ME's DPB list. This involves the following steps: */
1008*c83a76b0SSuyog Pawar /* 1. Obtain list of active POCs maintained within ME. */
1009*c83a76b0SSuyog Pawar /* 2. Search each of them in the ref list. Whatever is not found goes to */
1010*c83a76b0SSuyog Pawar /* the list to be removed. Note: a_pocs_buffered_in_me holds the */
1011*c83a76b0SSuyog Pawar /* currently active POC list within ME. a_pocs_to_remove holds the */
1012*c83a76b0SSuyog Pawar /* list of POCs to be removed, terminated by -1. */
1013*c83a76b0SSuyog Pawar /*************************************************************************/
1014*c83a76b0SSuyog Pawar i4_is_buffer_full =
1015*c83a76b0SSuyog Pawar hme_get_active_pocs_list((void *)ps_thrd0_ctxt, ps_master_ctxt->i4_num_me_frm_pllel);
1016*c83a76b0SSuyog Pawar
1017*c83a76b0SSuyog Pawar if(i4_is_buffer_full)
1018*c83a76b0SSuyog Pawar {
1019*c83a76b0SSuyog Pawar /* remove if any non-reference pictures are present */
1020*c83a76b0SSuyog Pawar for(i = 0;
1021*c83a76b0SSuyog Pawar i <
1022*c83a76b0SSuyog Pawar (ps_ctxt->aps_me_frm_prms[0]->max_num_ref * ps_master_ctxt->i4_num_me_frm_pllel) + 1;
1023*c83a76b0SSuyog Pawar i++)
1024*c83a76b0SSuyog Pawar {
1025*c83a76b0SSuyog Pawar if(ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_is_reference == 0 &&
1026*c83a76b0SSuyog Pawar ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_non_ref_free == 1)
1027*c83a76b0SSuyog Pawar {
1028*c83a76b0SSuyog Pawar i4_least_POC = ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_poc;
1029*c83a76b0SSuyog Pawar i4_least_GOP_num = ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_idr_gop_num;
1030*c83a76b0SSuyog Pawar }
1031*c83a76b0SSuyog Pawar }
1032*c83a76b0SSuyog Pawar /* if all non reference pictures are removed, then find the least poc
1033*c83a76b0SSuyog Pawar in the least gop number*/
1034*c83a76b0SSuyog Pawar if(i4_least_POC == 0x7FFFFFFF)
1035*c83a76b0SSuyog Pawar {
1036*c83a76b0SSuyog Pawar ASSERT(i4_least_GOP_num == 0x7FFFFFFF);
1037*c83a76b0SSuyog Pawar for(i = 0; i < (ps_ctxt->aps_me_frm_prms[0]->max_num_ref *
1038*c83a76b0SSuyog Pawar ps_master_ctxt->i4_num_me_frm_pllel) +
1039*c83a76b0SSuyog Pawar 1;
1040*c83a76b0SSuyog Pawar i++)
1041*c83a76b0SSuyog Pawar {
1042*c83a76b0SSuyog Pawar if(i4_least_GOP_num > ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_idr_gop_num)
1043*c83a76b0SSuyog Pawar {
1044*c83a76b0SSuyog Pawar i4_least_GOP_num = ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_idr_gop_num;
1045*c83a76b0SSuyog Pawar }
1046*c83a76b0SSuyog Pawar }
1047*c83a76b0SSuyog Pawar for(i = 0; i < (ps_ctxt->aps_me_frm_prms[0]->max_num_ref *
1048*c83a76b0SSuyog Pawar ps_master_ctxt->i4_num_me_frm_pllel) +
1049*c83a76b0SSuyog Pawar 1;
1050*c83a76b0SSuyog Pawar i++)
1051*c83a76b0SSuyog Pawar {
1052*c83a76b0SSuyog Pawar if(i4_least_POC > ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_poc &&
1053*c83a76b0SSuyog Pawar ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_idr_gop_num == i4_least_GOP_num)
1054*c83a76b0SSuyog Pawar {
1055*c83a76b0SSuyog Pawar i4_least_POC = ps_ctxt->as_ref_descr[i].aps_layers[0]->i4_poc;
1056*c83a76b0SSuyog Pawar }
1057*c83a76b0SSuyog Pawar }
1058*c83a76b0SSuyog Pawar }
1059*c83a76b0SSuyog Pawar ASSERT(i4_least_POC != 0x7FFFFFFF);
1060*c83a76b0SSuyog Pawar a_pocs_to_remove[0] = i4_least_POC;
1061*c83a76b0SSuyog Pawar a_pocs_to_remove[1] = INVALID_POC;
1062*c83a76b0SSuyog Pawar }
1063*c83a76b0SSuyog Pawar
1064*c83a76b0SSuyog Pawar /* Call the ME API to remove "outdated" POCs */
1065*c83a76b0SSuyog Pawar hme_discard_frm(
1066*c83a76b0SSuyog Pawar ps_thrd0_ctxt, a_pocs_to_remove, i4_least_GOP_num, ps_master_ctxt->i4_num_me_frm_pllel);
1067*c83a76b0SSuyog Pawar }
1068*c83a76b0SSuyog Pawar /*!
1069*c83a76b0SSuyog Pawar ******************************************************************************
1070*c83a76b0SSuyog Pawar * \if Function name : ihevce_me_frame_init \endif
1071*c83a76b0SSuyog Pawar *
1072*c83a76b0SSuyog Pawar * \brief
1073*c83a76b0SSuyog Pawar * Frame level ME initialisation function
1074*c83a76b0SSuyog Pawar *
1075*c83a76b0SSuyog Pawar * \par Description:
1076*c83a76b0SSuyog Pawar * The following pre-conditions exist for this function: a. We have the input
1077*c83a76b0SSuyog Pawar * pic ready for encode, b. We have the reference list with POC, L0/L1 IDs
1078*c83a76b0SSuyog Pawar * and ref ptrs ready for this picture and c. ihevce_me_set_resolution has
1079*c83a76b0SSuyog Pawar * been called atleast once. Once these are supplied, the following are
1080*c83a76b0SSuyog Pawar * done here: a. Input pyramid creation, b. Updation of ME's internal DPB
1081*c83a76b0SSuyog Pawar * based on available ref list information
1082*c83a76b0SSuyog Pawar *
1083*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to ME module
1084*c83a76b0SSuyog Pawar * \param[in] ps_frm_ctb_prms : CTB characteristics parameters
1085*c83a76b0SSuyog Pawar * \param[in] ps_frm_lamda : Frame level Lambda params
1086*c83a76b0SSuyog Pawar * \param[in] num_ref_l0 : Number of reference pics in L0 list
1087*c83a76b0SSuyog Pawar * \param[in] num_ref_l1 : Number of reference pics in L1 list
1088*c83a76b0SSuyog Pawar * \param[in] num_ref_l0_active : Active reference pics in L0 dir for current frame (shall be <= num_ref_l0)
1089*c83a76b0SSuyog Pawar * \param[in] num_ref_l1_active : Active reference pics in L1 dir for current frame (shall be <= num_ref_l1)
1090*c83a76b0SSuyog Pawar * \param[in] pps_rec_list_l0 : List of recon pics in L0 list
1091*c83a76b0SSuyog Pawar * \param[in] pps_rec_list_l1 : List of recon pics in L1 list
1092*c83a76b0SSuyog Pawar * \param[in] ps_enc_lap_inp : pointer to input yuv buffer (frame buffer)
1093*c83a76b0SSuyog Pawar * \param[in] i4_frm_qp : current picture QP
1094*c83a76b0SSuyog Pawar *
1095*c83a76b0SSuyog Pawar * \return
1096*c83a76b0SSuyog Pawar * None
1097*c83a76b0SSuyog Pawar *
1098*c83a76b0SSuyog Pawar * \author
1099*c83a76b0SSuyog Pawar * Ittiam
1100*c83a76b0SSuyog Pawar *
1101*c83a76b0SSuyog Pawar *****************************************************************************
1102*c83a76b0SSuyog Pawar */
ihevce_me_frame_init(void * pv_me_ctxt,me_enc_rdopt_ctxt_t * ps_cur_out_me_prms,ihevce_static_cfg_params_t * ps_stat_prms,frm_ctb_ctxt_t * ps_frm_ctb_prms,frm_lambda_ctxt_t * ps_frm_lamda,WORD32 num_ref_l0,WORD32 num_ref_l1,WORD32 num_ref_l0_active,WORD32 num_ref_l1_active,recon_pic_buf_t ** pps_rec_list_l0,recon_pic_buf_t ** pps_rec_list_l1,recon_pic_buf_t * (* aps_ref_list)[HEVCE_MAX_REF_PICS * 2],func_selector_t * ps_func_selector,ihevce_lap_enc_buf_t * ps_enc_lap_inp,void * pv_coarse_layer,WORD32 i4_me_frm_id,WORD32 i4_thrd_id,WORD32 i4_frm_qp,WORD32 i4_temporal_layer_id,WORD8 i1_cu_qp_delta_enabled_flag,void * pv_dep_mngr_encloop_dep_me)1103*c83a76b0SSuyog Pawar void ihevce_me_frame_init(
1104*c83a76b0SSuyog Pawar void *pv_me_ctxt,
1105*c83a76b0SSuyog Pawar me_enc_rdopt_ctxt_t *ps_cur_out_me_prms,
1106*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_stat_prms,
1107*c83a76b0SSuyog Pawar frm_ctb_ctxt_t *ps_frm_ctb_prms,
1108*c83a76b0SSuyog Pawar frm_lambda_ctxt_t *ps_frm_lamda,
1109*c83a76b0SSuyog Pawar WORD32 num_ref_l0,
1110*c83a76b0SSuyog Pawar WORD32 num_ref_l1,
1111*c83a76b0SSuyog Pawar WORD32 num_ref_l0_active,
1112*c83a76b0SSuyog Pawar WORD32 num_ref_l1_active,
1113*c83a76b0SSuyog Pawar recon_pic_buf_t **pps_rec_list_l0,
1114*c83a76b0SSuyog Pawar recon_pic_buf_t **pps_rec_list_l1,
1115*c83a76b0SSuyog Pawar recon_pic_buf_t *(*aps_ref_list)[HEVCE_MAX_REF_PICS * 2],
1116*c83a76b0SSuyog Pawar func_selector_t *ps_func_selector,
1117*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_enc_lap_inp,
1118*c83a76b0SSuyog Pawar void *pv_coarse_layer,
1119*c83a76b0SSuyog Pawar WORD32 i4_me_frm_id,
1120*c83a76b0SSuyog Pawar WORD32 i4_thrd_id,
1121*c83a76b0SSuyog Pawar WORD32 i4_frm_qp,
1122*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer_id,
1123*c83a76b0SSuyog Pawar WORD8 i1_cu_qp_delta_enabled_flag,
1124*c83a76b0SSuyog Pawar void *pv_dep_mngr_encloop_dep_me)
1125*c83a76b0SSuyog Pawar {
1126*c83a76b0SSuyog Pawar me_ctxt_t *ps_thrd_ctxt;
1127*c83a76b0SSuyog Pawar me_ctxt_t *ps_thrd0_ctxt;
1128*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_ctxt;
1129*c83a76b0SSuyog Pawar hme_inp_desc_t s_inp_desc;
1130*c83a76b0SSuyog Pawar
1131*c83a76b0SSuyog Pawar WORD32 inp_poc, num_ref;
1132*c83a76b0SSuyog Pawar WORD32 i;
1133*c83a76b0SSuyog Pawar
1134*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt = (me_master_ctxt_t *)pv_me_ctxt;
1135*c83a76b0SSuyog Pawar layer_ctxt_t *ps_coarse_layer = (layer_ctxt_t *)pv_coarse_layer;
1136*c83a76b0SSuyog Pawar
1137*c83a76b0SSuyog Pawar /* Input POC is derived from input buffer */
1138*c83a76b0SSuyog Pawar inp_poc = ps_enc_lap_inp->s_lap_out.i4_poc;
1139*c83a76b0SSuyog Pawar num_ref = num_ref_l0 + num_ref_l1;
1140*c83a76b0SSuyog Pawar
1141*c83a76b0SSuyog Pawar /* All processing done using shared / common memory across */
1142*c83a76b0SSuyog Pawar /* threads is done using thrd ctxt */
1143*c83a76b0SSuyog Pawar ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[i4_thrd_id];
1144*c83a76b0SSuyog Pawar
1145*c83a76b0SSuyog Pawar ps_ctxt = ps_thrd0_ctxt->aps_me_frm_prms[i4_me_frm_id];
1146*c83a76b0SSuyog Pawar
1147*c83a76b0SSuyog Pawar /* Update the paarameters "num_ref_l0_active" and "num_ref_l1_active" in hme_frm_prms */
1148*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].u1_num_active_ref_l0 = num_ref_l0_active;
1149*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].u1_num_active_ref_l1 = num_ref_l1_active;
1150*c83a76b0SSuyog Pawar
1151*c83a76b0SSuyog Pawar /*************************************************************************/
1152*c83a76b0SSuyog Pawar /* Add the current input to ME's DPB. This will also create the pyramids */
1153*c83a76b0SSuyog Pawar /* for the HME layers tha are not "encoded". */
1154*c83a76b0SSuyog Pawar /*************************************************************************/
1155*c83a76b0SSuyog Pawar s_inp_desc.i4_poc = inp_poc;
1156*c83a76b0SSuyog Pawar s_inp_desc.i4_idr_gop_num = ps_enc_lap_inp->s_lap_out.i4_idr_gop_num;
1157*c83a76b0SSuyog Pawar s_inp_desc.i4_is_reference = ps_enc_lap_inp->s_lap_out.i4_is_ref_pic;
1158*c83a76b0SSuyog Pawar s_inp_desc.s_layer_desc[0].pu1_y = (UWORD8 *)ps_enc_lap_inp->s_lap_out.s_input_buf.pv_y_buf;
1159*c83a76b0SSuyog Pawar s_inp_desc.s_layer_desc[0].pu1_u = (UWORD8 *)ps_enc_lap_inp->s_lap_out.s_input_buf.pv_u_buf;
1160*c83a76b0SSuyog Pawar s_inp_desc.s_layer_desc[0].pu1_v = (UWORD8 *)ps_enc_lap_inp->s_lap_out.s_input_buf.pv_v_buf;
1161*c83a76b0SSuyog Pawar
1162*c83a76b0SSuyog Pawar s_inp_desc.s_layer_desc[0].luma_stride = ps_enc_lap_inp->s_lap_out.s_input_buf.i4_y_strd;
1163*c83a76b0SSuyog Pawar s_inp_desc.s_layer_desc[0].chroma_stride = ps_enc_lap_inp->s_lap_out.s_input_buf.i4_uv_strd;
1164*c83a76b0SSuyog Pawar
1165*c83a76b0SSuyog Pawar hme_add_inp(pv_me_ctxt, &s_inp_desc, i4_me_frm_id, i4_thrd_id);
1166*c83a76b0SSuyog Pawar
1167*c83a76b0SSuyog Pawar /* store the frm ctb ctxt to all the thrd ctxt */
1168*c83a76b0SSuyog Pawar {
1169*c83a76b0SSuyog Pawar WORD32 num_thrds;
1170*c83a76b0SSuyog Pawar
1171*c83a76b0SSuyog Pawar /* initialise the parameters for all the threads */
1172*c83a76b0SSuyog Pawar for(num_thrds = 0; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
1173*c83a76b0SSuyog Pawar {
1174*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_me_tmp_frm_ctxt;
1175*c83a76b0SSuyog Pawar
1176*c83a76b0SSuyog Pawar ps_thrd_ctxt = ps_master_ctxt->aps_me_ctxt[num_thrds];
1177*c83a76b0SSuyog Pawar
1178*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt = ps_thrd_ctxt->aps_me_frm_prms[i4_me_frm_id];
1179*c83a76b0SSuyog Pawar
1180*c83a76b0SSuyog Pawar ps_thrd_ctxt->pv_ext_frm_prms = (void *)ps_frm_ctb_prms;
1181*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->i4_l0me_qp_mod = ps_stat_prms->s_config_prms.i4_cu_level_rc & 1;
1182*c83a76b0SSuyog Pawar
1183*c83a76b0SSuyog Pawar /* intialize the inter pred (MC) context at frame level */
1184*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.ps_ref_list = aps_ref_list;
1185*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.i1_weighted_pred_flag =
1186*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_lap_out.i1_weighted_pred_flag;
1187*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.i1_weighted_bipred_flag =
1188*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_lap_out.i1_weighted_bipred_flag;
1189*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.i4_log2_luma_wght_denom =
1190*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_lap_out.i4_log2_luma_wght_denom;
1191*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.i4_log2_chroma_wght_denom =
1192*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_lap_out.i4_log2_chroma_wght_denom;
1193*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.i4_bit_depth = 8;
1194*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.u1_chroma_array_type = 1;
1195*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.ps_func_selector = ps_func_selector;
1196*c83a76b0SSuyog Pawar /* Initiallization for non-distributed mode */
1197*c83a76b0SSuyog Pawar memset(
1198*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_mc_ctxt.ai4_tile_xtra_pel,
1199*c83a76b0SSuyog Pawar 0,
1200*c83a76b0SSuyog Pawar sizeof(ps_me_tmp_frm_ctxt->s_mc_ctxt.ai4_tile_xtra_pel));
1201*c83a76b0SSuyog Pawar
1202*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->i4_pic_type = ps_enc_lap_inp->s_lap_out.i4_pic_type;
1203*c83a76b0SSuyog Pawar
1204*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->i4_rc_pass = ps_stat_prms->s_pass_prms.i4_pass;
1205*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->i4_temporal_layer = ps_enc_lap_inp->s_lap_out.i4_temporal_lyr_id;
1206*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->i4_use_const_lamda_modifier = USE_CONSTANT_LAMBDA_MODIFIER;
1207*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->i4_use_const_lamda_modifier =
1208*c83a76b0SSuyog Pawar ps_ctxt->i4_use_const_lamda_modifier ||
1209*c83a76b0SSuyog Pawar ((ps_stat_prms->s_coding_tools_prms.i4_vqet &
1210*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_CONTROL_TOGGLER)) &&
1211*c83a76b0SSuyog Pawar ((ps_stat_prms->s_coding_tools_prms.i4_vqet &
1212*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_NOISE_PRESERVATION)) ||
1213*c83a76b0SSuyog Pawar (ps_stat_prms->s_coding_tools_prms.i4_vqet &
1214*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_1)) ||
1215*c83a76b0SSuyog Pawar (ps_stat_prms->s_coding_tools_prms.i4_vqet &
1216*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_2)) ||
1217*c83a76b0SSuyog Pawar (ps_stat_prms->s_coding_tools_prms.i4_vqet &
1218*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_3))));
1219*c83a76b0SSuyog Pawar {
1220*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->f_i_pic_lamda_modifier =
1221*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_lap_out.f_i_pic_lamda_modifier;
1222*c83a76b0SSuyog Pawar }
1223*c83a76b0SSuyog Pawar /* weighted pred enable flag */
1224*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->i4_wt_pred_enable_flag =
1225*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_lap_out.i1_weighted_pred_flag |
1226*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_lap_out.i1_weighted_bipred_flag;
1227*c83a76b0SSuyog Pawar
1228*c83a76b0SSuyog Pawar if(1 == ps_me_tmp_frm_ctxt->i4_wt_pred_enable_flag)
1229*c83a76b0SSuyog Pawar {
1230*c83a76b0SSuyog Pawar /* log2 weight denom */
1231*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_wt_pred.wpred_log_wdc =
1232*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_lap_out.i4_log2_luma_wght_denom;
1233*c83a76b0SSuyog Pawar }
1234*c83a76b0SSuyog Pawar else
1235*c83a76b0SSuyog Pawar {
1236*c83a76b0SSuyog Pawar /* default value */
1237*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->s_wt_pred.wpred_log_wdc = DENOM_DEFAULT;
1238*c83a76b0SSuyog Pawar }
1239*c83a76b0SSuyog Pawar
1240*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->u1_is_curFrame_a_refFrame = ps_enc_lap_inp->s_lap_out.i4_is_ref_pic;
1241*c83a76b0SSuyog Pawar
1242*c83a76b0SSuyog Pawar ps_thrd_ctxt->pv_me_optimised_function_list =
1243*c83a76b0SSuyog Pawar ps_master_ctxt->pv_me_optimised_function_list;
1244*c83a76b0SSuyog Pawar ps_thrd_ctxt->ps_cmn_utils_optimised_function_list = &ps_master_ctxt->s_cmn_opt_func;
1245*c83a76b0SSuyog Pawar }
1246*c83a76b0SSuyog Pawar }
1247*c83a76b0SSuyog Pawar
1248*c83a76b0SSuyog Pawar /* Create the reference map for ME */
1249*c83a76b0SSuyog Pawar ihevce_me_create_ref_map(
1250*c83a76b0SSuyog Pawar pps_rec_list_l0,
1251*c83a76b0SSuyog Pawar pps_rec_list_l1,
1252*c83a76b0SSuyog Pawar num_ref_l0_active,
1253*c83a76b0SSuyog Pawar num_ref_l1_active,
1254*c83a76b0SSuyog Pawar num_ref,
1255*c83a76b0SSuyog Pawar &ps_master_ctxt->as_ref_map[i4_me_frm_id]);
1256*c83a76b0SSuyog Pawar
1257*c83a76b0SSuyog Pawar /** Remember the pointers to recon list parmas for L0 and L1 lists in the context */
1258*c83a76b0SSuyog Pawar ps_ctxt->ps_hme_ref_map->pps_rec_list_l0 = pps_rec_list_l0;
1259*c83a76b0SSuyog Pawar ps_ctxt->ps_hme_ref_map->pps_rec_list_l1 = pps_rec_list_l1;
1260*c83a76b0SSuyog Pawar
1261*c83a76b0SSuyog Pawar /*************************************************************************/
1262*c83a76b0SSuyog Pawar /* Call the ME frame level processing for further actiion. */
1263*c83a76b0SSuyog Pawar /* ToDo: Support Row Level API. */
1264*c83a76b0SSuyog Pawar /*************************************************************************/
1265*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].i2_mv_range_x =
1266*c83a76b0SSuyog Pawar ps_thrd0_ctxt->s_init_prms.max_horz_search_range;
1267*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].i2_mv_range_y =
1268*c83a76b0SSuyog Pawar ps_thrd0_ctxt->s_init_prms.max_vert_search_range;
1269*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].is_i_pic = 0;
1270*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].is_pic_second_field =
1271*c83a76b0SSuyog Pawar (!(ps_enc_lap_inp->s_input_buf.i4_bottom_field ^
1272*c83a76b0SSuyog Pawar ps_enc_lap_inp->s_input_buf.i4_topfield_first));
1273*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].i4_temporal_layer_id = i4_temporal_layer_id;
1274*c83a76b0SSuyog Pawar {
1275*c83a76b0SSuyog Pawar S32 pic_type = ps_enc_lap_inp->s_lap_out.i4_pic_type;
1276*c83a76b0SSuyog Pawar
1277*c83a76b0SSuyog Pawar /*********************************************************************/
1278*c83a76b0SSuyog Pawar /* For I Pic, we do not call update fn at ctb level, instead we do */
1279*c83a76b0SSuyog Pawar /* one shot update for entire picture. */
1280*c83a76b0SSuyog Pawar /*********************************************************************/
1281*c83a76b0SSuyog Pawar if((pic_type == IV_I_FRAME) || (pic_type == IV_II_FRAME) || (pic_type == IV_IDR_FRAME))
1282*c83a76b0SSuyog Pawar {
1283*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].is_i_pic = 1;
1284*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].bidir_enabled = 0;
1285*c83a76b0SSuyog Pawar }
1286*c83a76b0SSuyog Pawar
1287*c83a76b0SSuyog Pawar else if((pic_type == IV_P_FRAME) || (pic_type == IV_PP_FRAME))
1288*c83a76b0SSuyog Pawar {
1289*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].bidir_enabled = 0;
1290*c83a76b0SSuyog Pawar }
1291*c83a76b0SSuyog Pawar else if((pic_type == IV_B_FRAME) || (pic_type == IV_BB_FRAME))
1292*c83a76b0SSuyog Pawar {
1293*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].bidir_enabled = 1;
1294*c83a76b0SSuyog Pawar }
1295*c83a76b0SSuyog Pawar else
1296*c83a76b0SSuyog Pawar {
1297*c83a76b0SSuyog Pawar /* not sure whether we need to handle mixed frames like IP, */
1298*c83a76b0SSuyog Pawar /* they should ideally come as single field. */
1299*c83a76b0SSuyog Pawar /* TODO : resolve thsi ambiguity */
1300*c83a76b0SSuyog Pawar ASSERT(0);
1301*c83a76b0SSuyog Pawar }
1302*c83a76b0SSuyog Pawar }
1303*c83a76b0SSuyog Pawar /************************************************************************/
1304*c83a76b0SSuyog Pawar /* Lambda calculations moved outside ME and to one place, so as to have */
1305*c83a76b0SSuyog Pawar /* consistent lambda across ME, IPE, CL RDOPT etc */
1306*c83a76b0SSuyog Pawar /************************************************************************/
1307*c83a76b0SSuyog Pawar
1308*c83a76b0SSuyog Pawar {
1309*c83a76b0SSuyog Pawar double d_q_factor;
1310*c83a76b0SSuyog Pawar
1311*c83a76b0SSuyog Pawar d_q_factor = pow(2.0, (i4_frm_qp / 6.)) * 5.0 / 8.0;
1312*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].qstep = (WORD32)(d_q_factor + .5);
1313*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].i4_frame_qp = i4_frm_qp;
1314*c83a76b0SSuyog Pawar
1315*c83a76b0SSuyog Pawar /* Qstep multiplied by 256, to work at higher precision:
1316*c83a76b0SSuyog Pawar 5/6 is the rounding factor. Multiplied by 2 for the Had vs DCT
1317*c83a76b0SSuyog Pawar cost variation */
1318*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].qstep_ls8 =
1319*c83a76b0SSuyog Pawar (WORD32)((((d_q_factor * 256) * 5) / 3) + .5);
1320*c83a76b0SSuyog Pawar }
1321*c83a76b0SSuyog Pawar
1322*c83a76b0SSuyog Pawar /* Frame level init of all threads of ME */
1323*c83a76b0SSuyog Pawar {
1324*c83a76b0SSuyog Pawar WORD32 num_thrds;
1325*c83a76b0SSuyog Pawar
1326*c83a76b0SSuyog Pawar /* initialise the parameters for all the threads */
1327*c83a76b0SSuyog Pawar for(num_thrds = 0; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
1328*c83a76b0SSuyog Pawar {
1329*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_tmp_frm_ctxt;
1330*c83a76b0SSuyog Pawar
1331*c83a76b0SSuyog Pawar ps_thrd_ctxt = ps_master_ctxt->aps_me_ctxt[num_thrds];
1332*c83a76b0SSuyog Pawar
1333*c83a76b0SSuyog Pawar ps_tmp_frm_ctxt = ps_thrd_ctxt->aps_me_frm_prms[i4_me_frm_id];
1334*c83a76b0SSuyog Pawar
1335*c83a76b0SSuyog Pawar hme_process_frm_init(
1336*c83a76b0SSuyog Pawar (void *)ps_thrd_ctxt,
1337*c83a76b0SSuyog Pawar ps_tmp_frm_ctxt->ps_hme_ref_map,
1338*c83a76b0SSuyog Pawar ps_tmp_frm_ctxt->ps_hme_frm_prms,
1339*c83a76b0SSuyog Pawar i4_me_frm_id,
1340*c83a76b0SSuyog Pawar ps_master_ctxt->i4_num_me_frm_pllel);
1341*c83a76b0SSuyog Pawar
1342*c83a76b0SSuyog Pawar ps_tmp_frm_ctxt->s_frm_lambda_ctxt = *ps_frm_lamda;
1343*c83a76b0SSuyog Pawar ps_tmp_frm_ctxt->pv_dep_mngr_encloop_dep_me = pv_dep_mngr_encloop_dep_me;
1344*c83a76b0SSuyog Pawar }
1345*c83a76b0SSuyog Pawar }
1346*c83a76b0SSuyog Pawar
1347*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].i4_cl_sad_lambda_qf =
1348*c83a76b0SSuyog Pawar ps_frm_lamda->i4_cl_sad_lambda_qf;
1349*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].i4_cl_satd_lambda_qf =
1350*c83a76b0SSuyog Pawar ps_frm_lamda->i4_cl_satd_lambda_qf;
1351*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].i4_ol_sad_lambda_qf =
1352*c83a76b0SSuyog Pawar ps_frm_lamda->i4_ol_sad_lambda_qf;
1353*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].i4_ol_satd_lambda_qf =
1354*c83a76b0SSuyog Pawar ps_frm_lamda->i4_ol_satd_lambda_qf;
1355*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].lambda_q_shift = LAMBDA_Q_SHIFT;
1356*c83a76b0SSuyog Pawar
1357*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].u1_is_cu_qp_delta_enabled =
1358*c83a76b0SSuyog Pawar i1_cu_qp_delta_enabled_flag;
1359*c83a76b0SSuyog Pawar
1360*c83a76b0SSuyog Pawar /*************************************************************************/
1361*c83a76b0SSuyog Pawar /* If num ref is 0, that means that it has to be coded as I. Do nothing */
1362*c83a76b0SSuyog Pawar /* However mv bank update needs to happen with "intra" mv. */
1363*c83a76b0SSuyog Pawar /*************************************************************************/
1364*c83a76b0SSuyog Pawar if(ps_master_ctxt->as_ref_map[i4_me_frm_id].i4_num_ref == 0 ||
1365*c83a76b0SSuyog Pawar ps_master_ctxt->as_frm_prms[i4_me_frm_id].is_i_pic)
1366*c83a76b0SSuyog Pawar {
1367*c83a76b0SSuyog Pawar for(i = 0; i < 1; i++)
1368*c83a76b0SSuyog Pawar {
1369*c83a76b0SSuyog Pawar layer_ctxt_t *ps_layer_ctxt = ps_ctxt->ps_curr_descr->aps_layers[i];
1370*c83a76b0SSuyog Pawar BLK_SIZE_T e_blk_size;
1371*c83a76b0SSuyog Pawar S32 use_4x4;
1372*c83a76b0SSuyog Pawar
1373*c83a76b0SSuyog Pawar /* The mv bank is filled with "intra" mv */
1374*c83a76b0SSuyog Pawar use_4x4 = hme_get_mv_blk_size(
1375*c83a76b0SSuyog Pawar ps_thrd0_ctxt->s_init_prms.use_4x4, i, ps_ctxt->num_layers, ps_ctxt->u1_encode[i]);
1376*c83a76b0SSuyog Pawar e_blk_size = use_4x4 ? BLK_4x4 : BLK_8x8;
1377*c83a76b0SSuyog Pawar hme_init_mv_bank(ps_layer_ctxt, e_blk_size, 2, 1, ps_ctxt->u1_encode[i]);
1378*c83a76b0SSuyog Pawar hme_fill_mvbank_intra(ps_layer_ctxt);
1379*c83a76b0SSuyog Pawar
1380*c83a76b0SSuyog Pawar /* Clear out the global mvs */
1381*c83a76b0SSuyog Pawar memset(
1382*c83a76b0SSuyog Pawar ps_layer_ctxt->s_global_mv,
1383*c83a76b0SSuyog Pawar 0,
1384*c83a76b0SSuyog Pawar sizeof(hme_mv_t) * ps_ctxt->max_num_ref * NUM_GMV_LOBES);
1385*c83a76b0SSuyog Pawar }
1386*c83a76b0SSuyog Pawar
1387*c83a76b0SSuyog Pawar return;
1388*c83a76b0SSuyog Pawar }
1389*c83a76b0SSuyog Pawar
1390*c83a76b0SSuyog Pawar /*************************************************************************/
1391*c83a76b0SSuyog Pawar /* Encode layer frame init */
1392*c83a76b0SSuyog Pawar /*************************************************************************/
1393*c83a76b0SSuyog Pawar {
1394*c83a76b0SSuyog Pawar refine_prms_t s_refine_prms;
1395*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer;
1396*c83a76b0SSuyog Pawar S16 i2_max;
1397*c83a76b0SSuyog Pawar S32 layer_id;
1398*c83a76b0SSuyog Pawar
1399*c83a76b0SSuyog Pawar layer_id = 0;
1400*c83a76b0SSuyog Pawar i2_max = ps_ctxt->ps_curr_descr->aps_layers[layer_id]->i2_max_mv_x;
1401*c83a76b0SSuyog Pawar i2_max = MAX(i2_max, ps_ctxt->ps_curr_descr->aps_layers[layer_id]->i2_max_mv_y);
1402*c83a76b0SSuyog Pawar
1403*c83a76b0SSuyog Pawar ps_curr_layer = ps_ctxt->ps_curr_descr->aps_layers[layer_id];
1404*c83a76b0SSuyog Pawar
1405*c83a76b0SSuyog Pawar {
1406*c83a76b0SSuyog Pawar hme_set_refine_prms(
1407*c83a76b0SSuyog Pawar &s_refine_prms,
1408*c83a76b0SSuyog Pawar ps_ctxt->u1_encode[layer_id],
1409*c83a76b0SSuyog Pawar ps_master_ctxt->as_ref_map[i4_me_frm_id].i4_num_ref,
1410*c83a76b0SSuyog Pawar layer_id,
1411*c83a76b0SSuyog Pawar ps_ctxt->num_layers,
1412*c83a76b0SSuyog Pawar ps_ctxt->num_layers_explicit_search,
1413*c83a76b0SSuyog Pawar ps_thrd0_ctxt->s_init_prms.use_4x4,
1414*c83a76b0SSuyog Pawar &ps_master_ctxt->as_frm_prms[i4_me_frm_id],
1415*c83a76b0SSuyog Pawar NULL,
1416*c83a76b0SSuyog Pawar &ps_thrd0_ctxt->s_init_prms
1417*c83a76b0SSuyog Pawar .s_me_coding_tools); /* during frm init Intra cost Pointer is not required */
1418*c83a76b0SSuyog Pawar
1419*c83a76b0SSuyog Pawar hme_refine_frm_init(ps_curr_layer, &s_refine_prms, ps_coarse_layer);
1420*c83a76b0SSuyog Pawar }
1421*c83a76b0SSuyog Pawar }
1422*c83a76b0SSuyog Pawar }
1423*c83a76b0SSuyog Pawar
1424*c83a76b0SSuyog Pawar /*!
1425*c83a76b0SSuyog Pawar ******************************************************************************
1426*c83a76b0SSuyog Pawar * \if Function name : ihevce_l0_me_frame_end \endif
1427*c83a76b0SSuyog Pawar *
1428*c83a76b0SSuyog Pawar * \brief
1429*c83a76b0SSuyog Pawar * End of frame update function performs
1430*c83a76b0SSuyog Pawar * - Dynamic Search Range collation
1431*c83a76b0SSuyog Pawar *
1432*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to ME module
1433*c83a76b0SSuyog Pawar *
1434*c83a76b0SSuyog Pawar * \return
1435*c83a76b0SSuyog Pawar * None
1436*c83a76b0SSuyog Pawar *
1437*c83a76b0SSuyog Pawar * \author
1438*c83a76b0SSuyog Pawar * Ittiam
1439*c83a76b0SSuyog Pawar *
1440*c83a76b0SSuyog Pawar *****************************************************************************
1441*c83a76b0SSuyog Pawar */
1442*c83a76b0SSuyog Pawar
ihevce_l0_me_frame_end(void * pv_me_ctxt,WORD32 i4_idx_dvsr_p,WORD32 i4_display_num,WORD32 me_frm_id)1443*c83a76b0SSuyog Pawar void ihevce_l0_me_frame_end(
1444*c83a76b0SSuyog Pawar void *pv_me_ctxt, WORD32 i4_idx_dvsr_p, WORD32 i4_display_num, WORD32 me_frm_id)
1445*c83a76b0SSuyog Pawar {
1446*c83a76b0SSuyog Pawar WORD32 i4_num_ref = 0, num_ref, num_thrds, cur_poc, frm_num;
1447*c83a76b0SSuyog Pawar
1448*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt = (me_master_ctxt_t *)pv_me_ctxt;
1449*c83a76b0SSuyog Pawar me_ctxt_t *ps_thrd0_ctxt;
1450*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_frm_ctxt;
1451*c83a76b0SSuyog Pawar WORD32 prev_me_frm_id;
1452*c83a76b0SSuyog Pawar
1453*c83a76b0SSuyog Pawar ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[0];
1454*c83a76b0SSuyog Pawar ps_frm_ctxt = ps_thrd0_ctxt->aps_me_frm_prms[me_frm_id];
1455*c83a76b0SSuyog Pawar
1456*c83a76b0SSuyog Pawar /* Deriving the previous poc from previous frames context */
1457*c83a76b0SSuyog Pawar if(me_frm_id == 0)
1458*c83a76b0SSuyog Pawar prev_me_frm_id = (MAX_NUM_ME_PARALLEL - 1);
1459*c83a76b0SSuyog Pawar else
1460*c83a76b0SSuyog Pawar prev_me_frm_id = me_frm_id - 1;
1461*c83a76b0SSuyog Pawar
1462*c83a76b0SSuyog Pawar /* Getting the max num references value */
1463*c83a76b0SSuyog Pawar for(num_thrds = 0; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
1464*c83a76b0SSuyog Pawar {
1465*c83a76b0SSuyog Pawar i4_num_ref =
1466*c83a76b0SSuyog Pawar MAX(i4_num_ref,
1467*c83a76b0SSuyog Pawar ps_master_ctxt->aps_me_ctxt[num_thrds]
1468*c83a76b0SSuyog Pawar ->aps_me_frm_prms[me_frm_id]
1469*c83a76b0SSuyog Pawar ->as_l0_dyn_range_prms[i4_idx_dvsr_p]
1470*c83a76b0SSuyog Pawar .i4_num_act_ref_in_l0);
1471*c83a76b0SSuyog Pawar }
1472*c83a76b0SSuyog Pawar
1473*c83a76b0SSuyog Pawar /* No processing is required if current pic is I pic */
1474*c83a76b0SSuyog Pawar if(1 == ps_master_ctxt->as_frm_prms[me_frm_id].is_i_pic)
1475*c83a76b0SSuyog Pawar {
1476*c83a76b0SSuyog Pawar return;
1477*c83a76b0SSuyog Pawar }
1478*c83a76b0SSuyog Pawar
1479*c83a76b0SSuyog Pawar /* If a B/b pic, then the previous frame ctxts dyn search prms should be copied ito the latest ctxt */
1480*c83a76b0SSuyog Pawar if(1 == ps_frm_ctxt->s_frm_prms.bidir_enabled)
1481*c83a76b0SSuyog Pawar {
1482*c83a76b0SSuyog Pawar return;
1483*c83a76b0SSuyog Pawar }
1484*c83a76b0SSuyog Pawar
1485*c83a76b0SSuyog Pawar /* Only for P pic. For P, both are 0, I&B has them mut. exclusive */
1486*c83a76b0SSuyog Pawar ASSERT(ps_frm_ctxt->s_frm_prms.is_i_pic == ps_frm_ctxt->s_frm_prms.bidir_enabled);
1487*c83a76b0SSuyog Pawar
1488*c83a76b0SSuyog Pawar /* use thrd 0 ctxt to collate the Dynamic Search Range across all threads */
1489*c83a76b0SSuyog Pawar for(num_ref = 0; num_ref < i4_num_ref; num_ref++)
1490*c83a76b0SSuyog Pawar {
1491*c83a76b0SSuyog Pawar dyn_range_prms_t *ps_dyn_range_prms_thrd0;
1492*c83a76b0SSuyog Pawar
1493*c83a76b0SSuyog Pawar ps_dyn_range_prms_thrd0 =
1494*c83a76b0SSuyog Pawar &ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].as_dyn_range_prms[num_ref];
1495*c83a76b0SSuyog Pawar
1496*c83a76b0SSuyog Pawar /* run a loop over all the other threads to update the dynamical search range */
1497*c83a76b0SSuyog Pawar for(num_thrds = 1; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
1498*c83a76b0SSuyog Pawar {
1499*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_me_tmp_frm_ctxt;
1500*c83a76b0SSuyog Pawar
1501*c83a76b0SSuyog Pawar dyn_range_prms_t *ps_dyn_range_prms;
1502*c83a76b0SSuyog Pawar
1503*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt = ps_master_ctxt->aps_me_ctxt[num_thrds]->aps_me_frm_prms[me_frm_id];
1504*c83a76b0SSuyog Pawar
1505*c83a76b0SSuyog Pawar /* get current thrd dynamical search range param. pointer */
1506*c83a76b0SSuyog Pawar ps_dyn_range_prms =
1507*c83a76b0SSuyog Pawar &ps_me_tmp_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].as_dyn_range_prms[num_ref];
1508*c83a76b0SSuyog Pawar
1509*c83a76b0SSuyog Pawar /* TODO : This calls can be optimized further. No need for min in 1st call and max in 2nd call */
1510*c83a76b0SSuyog Pawar hme_update_dynamic_search_params(
1511*c83a76b0SSuyog Pawar ps_dyn_range_prms_thrd0, ps_dyn_range_prms->i2_dyn_max_y);
1512*c83a76b0SSuyog Pawar
1513*c83a76b0SSuyog Pawar hme_update_dynamic_search_params(
1514*c83a76b0SSuyog Pawar ps_dyn_range_prms_thrd0, ps_dyn_range_prms->i2_dyn_min_y);
1515*c83a76b0SSuyog Pawar }
1516*c83a76b0SSuyog Pawar }
1517*c83a76b0SSuyog Pawar
1518*c83a76b0SSuyog Pawar /*************************************************************************/
1519*c83a76b0SSuyog Pawar /* Get the MAX/MIN per POC distance based on the all the ref. pics */
1520*c83a76b0SSuyog Pawar /*************************************************************************/
1521*c83a76b0SSuyog Pawar cur_poc = ps_frm_ctxt->i4_curr_poc;
1522*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_max_y_per_poc = 0;
1523*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_min_y_per_poc = 0;
1524*c83a76b0SSuyog Pawar /*populate display num*/
1525*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i4_display_num = i4_display_num;
1526*c83a76b0SSuyog Pawar
1527*c83a76b0SSuyog Pawar for(num_ref = 0; num_ref < i4_num_ref; num_ref++)
1528*c83a76b0SSuyog Pawar {
1529*c83a76b0SSuyog Pawar WORD16 i2_mv_per_poc;
1530*c83a76b0SSuyog Pawar WORD32 ref_poc, poc_diff;
1531*c83a76b0SSuyog Pawar dyn_range_prms_t *ps_dyn_range_prms_thrd0;
1532*c83a76b0SSuyog Pawar ps_dyn_range_prms_thrd0 =
1533*c83a76b0SSuyog Pawar &ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].as_dyn_range_prms[num_ref];
1534*c83a76b0SSuyog Pawar
1535*c83a76b0SSuyog Pawar ref_poc = ps_dyn_range_prms_thrd0->i4_poc;
1536*c83a76b0SSuyog Pawar /* Should be cleaned up for ME llsm */
1537*c83a76b0SSuyog Pawar poc_diff = (cur_poc - ref_poc);
1538*c83a76b0SSuyog Pawar poc_diff = MAX(1, poc_diff);
1539*c83a76b0SSuyog Pawar
1540*c83a76b0SSuyog Pawar /* cur. ref. pic. max y per POC */
1541*c83a76b0SSuyog Pawar i2_mv_per_poc = (ps_dyn_range_prms_thrd0->i2_dyn_max_y + (poc_diff - 1)) / poc_diff;
1542*c83a76b0SSuyog Pawar /* update the max y per POC */
1543*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_max_y_per_poc = MAX(
1544*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_max_y_per_poc, i2_mv_per_poc);
1545*c83a76b0SSuyog Pawar
1546*c83a76b0SSuyog Pawar /* cur. ref. pic. min y per POC */
1547*c83a76b0SSuyog Pawar i2_mv_per_poc = (ps_dyn_range_prms_thrd0->i2_dyn_min_y - (poc_diff - 1)) / poc_diff;
1548*c83a76b0SSuyog Pawar /* update the min y per POC */
1549*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_min_y_per_poc = MIN(
1550*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_min_y_per_poc, i2_mv_per_poc);
1551*c83a76b0SSuyog Pawar }
1552*c83a76b0SSuyog Pawar
1553*c83a76b0SSuyog Pawar /*************************************************************************/
1554*c83a76b0SSuyog Pawar /* Populate the results to all thread ctxt */
1555*c83a76b0SSuyog Pawar /*************************************************************************/
1556*c83a76b0SSuyog Pawar for(num_thrds = 1; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
1557*c83a76b0SSuyog Pawar {
1558*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_me_tmp_frm_ctxt;
1559*c83a76b0SSuyog Pawar
1560*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt = ps_master_ctxt->aps_me_ctxt[num_thrds]->aps_me_frm_prms[me_frm_id];
1561*c83a76b0SSuyog Pawar
1562*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_max_y_per_poc =
1563*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_max_y_per_poc;
1564*c83a76b0SSuyog Pawar
1565*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_min_y_per_poc =
1566*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i2_dyn_min_y_per_poc;
1567*c83a76b0SSuyog Pawar
1568*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i4_display_num =
1569*c83a76b0SSuyog Pawar ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i4_display_num;
1570*c83a76b0SSuyog Pawar }
1571*c83a76b0SSuyog Pawar
1572*c83a76b0SSuyog Pawar /* Copy the dynamic search paramteres into the other Frame cotexts in parallel */
1573*c83a76b0SSuyog Pawar for(num_thrds = 0; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
1574*c83a76b0SSuyog Pawar {
1575*c83a76b0SSuyog Pawar l0_dyn_range_prms_t *ps_dyn_range_prms_thrd0;
1576*c83a76b0SSuyog Pawar
1577*c83a76b0SSuyog Pawar ps_frm_ctxt = ps_thrd0_ctxt->aps_me_frm_prms[me_frm_id];
1578*c83a76b0SSuyog Pawar
1579*c83a76b0SSuyog Pawar i4_num_ref = ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p].i4_num_act_ref_in_l0;
1580*c83a76b0SSuyog Pawar
1581*c83a76b0SSuyog Pawar ps_dyn_range_prms_thrd0 = &ps_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p];
1582*c83a76b0SSuyog Pawar
1583*c83a76b0SSuyog Pawar for(frm_num = 0; frm_num < MAX_NUM_ME_PARALLEL; frm_num++)
1584*c83a76b0SSuyog Pawar {
1585*c83a76b0SSuyog Pawar if(me_frm_id != frm_num)
1586*c83a76b0SSuyog Pawar {
1587*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_me_tmp_frm_ctxt;
1588*c83a76b0SSuyog Pawar
1589*c83a76b0SSuyog Pawar l0_dyn_range_prms_t *ps_dyn_range_prms;
1590*c83a76b0SSuyog Pawar
1591*c83a76b0SSuyog Pawar ps_me_tmp_frm_ctxt =
1592*c83a76b0SSuyog Pawar ps_master_ctxt->aps_me_ctxt[num_thrds]->aps_me_frm_prms[frm_num];
1593*c83a76b0SSuyog Pawar
1594*c83a76b0SSuyog Pawar /* get current thrd dynamical search range param. pointer */
1595*c83a76b0SSuyog Pawar ps_dyn_range_prms = &ps_me_tmp_frm_ctxt->as_l0_dyn_range_prms[i4_idx_dvsr_p];
1596*c83a76b0SSuyog Pawar
1597*c83a76b0SSuyog Pawar memcpy(ps_dyn_range_prms, ps_dyn_range_prms_thrd0, sizeof(l0_dyn_range_prms_t));
1598*c83a76b0SSuyog Pawar }
1599*c83a76b0SSuyog Pawar }
1600*c83a76b0SSuyog Pawar }
1601*c83a76b0SSuyog Pawar }
1602