xref: /aosp_15_r20/external/libhevc/encoder/ihevce_coarse_me_pass.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar  *
5*c83a76b0SSuyog Pawar  * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar  * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar  * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar  *
9*c83a76b0SSuyog Pawar  * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar  *
11*c83a76b0SSuyog Pawar  * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar  * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar  * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar  * limitations under the License.
16*c83a76b0SSuyog Pawar  *
17*c83a76b0SSuyog Pawar  *****************************************************************************
18*c83a76b0SSuyog Pawar  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar 
21*c83a76b0SSuyog Pawar /*!
22*c83a76b0SSuyog Pawar ******************************************************************************
23*c83a76b0SSuyog Pawar * \file ihevce_coarse_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_defs.h"
64*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
65*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
66*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
67*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
68*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
69*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
70*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
71*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
72*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
73*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
74*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
75*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
76*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
77*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
78*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
79*c83a76b0SSuyog Pawar 
80*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
81*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
82*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
83*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
84*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
85*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
86*c83a76b0SSuyog Pawar #include "ihevce_bitstream.h"
87*c83a76b0SSuyog Pawar #include "ihevce_cabac.h"
88*c83a76b0SSuyog Pawar #include "ihevce_rdoq_macros.h"
89*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
90*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
91*c83a76b0SSuyog Pawar #include "ihevce_entropy_structs.h"
92*c83a76b0SSuyog Pawar #include "ihevce_cmn_utils_instr_set_router.h"
93*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_structs.h"
94*c83a76b0SSuyog Pawar #include "ihevce_bs_compute_ctb.h"
95*c83a76b0SSuyog Pawar #include "ihevce_global_tables.h"
96*c83a76b0SSuyog Pawar #include "ihevce_dep_mngr_interface.h"
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 "ihevce_ipe_instr_set_router.h"
103*c83a76b0SSuyog Pawar #include "ihevce_ipe_structs.h"
104*c83a76b0SSuyog Pawar #include "hme_globals.h"
105*c83a76b0SSuyog Pawar #include "hme_utils.h"
106*c83a76b0SSuyog Pawar #include "hme_coarse.h"
107*c83a76b0SSuyog Pawar #include "hme_refine.h"
108*c83a76b0SSuyog Pawar #include "ihevce_me_pass.h"
109*c83a76b0SSuyog Pawar #include "ihevce_coarse_me_pass.h"
110*c83a76b0SSuyog Pawar 
111*c83a76b0SSuyog Pawar /*****************************************************************************/
112*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
113*c83a76b0SSuyog Pawar /*****************************************************************************/
114*c83a76b0SSuyog Pawar 
115*c83a76b0SSuyog Pawar /*!
116*c83a76b0SSuyog Pawar ******************************************************************************
117*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_get_num_mem_recs \endif
118*c83a76b0SSuyog Pawar *
119*c83a76b0SSuyog Pawar * \brief
120*c83a76b0SSuyog Pawar *    Number of memory records are returned for ME module
121*c83a76b0SSuyog Pawar *    Note : Include total mem. req. for HME + Total mem. req. for Dep Mngr for HME
122*c83a76b0SSuyog Pawar *
123*c83a76b0SSuyog Pawar * \return
124*c83a76b0SSuyog Pawar *    Number of memory records
125*c83a76b0SSuyog Pawar *
126*c83a76b0SSuyog Pawar * \author
127*c83a76b0SSuyog Pawar *  Ittiam
128*c83a76b0SSuyog Pawar *
129*c83a76b0SSuyog Pawar *****************************************************************************
130*c83a76b0SSuyog Pawar */
ihevce_coarse_me_get_num_mem_recs()131*c83a76b0SSuyog Pawar WORD32 ihevce_coarse_me_get_num_mem_recs()
132*c83a76b0SSuyog Pawar {
133*c83a76b0SSuyog Pawar     WORD32 hme_mem_recs = hme_coarse_num_alloc();
134*c83a76b0SSuyog Pawar     WORD32 hme_dep_mngr_mem_recs = hme_coarse_dep_mngr_num_alloc();
135*c83a76b0SSuyog Pawar 
136*c83a76b0SSuyog Pawar     return ((hme_mem_recs + hme_dep_mngr_mem_recs));
137*c83a76b0SSuyog Pawar }
138*c83a76b0SSuyog Pawar 
139*c83a76b0SSuyog Pawar /*!
140*c83a76b0SSuyog Pawar ******************************************************************************
141*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_get_mem_recs \endif
142*c83a76b0SSuyog Pawar *
143*c83a76b0SSuyog Pawar * \brief
144*c83a76b0SSuyog Pawar *    Memory requirements are returned for coarse ME.
145*c83a76b0SSuyog Pawar *
146*c83a76b0SSuyog Pawar * \param[in,out]  ps_mem_tab : pointer to memory descriptors table
147*c83a76b0SSuyog Pawar * \param[in] ps_init_prms : Create time static parameters
148*c83a76b0SSuyog Pawar * \param[in] i4_num_proc_thrds : Number of processing threads for this module
149*c83a76b0SSuyog Pawar * \param[in] i4_mem_space : memspace in whihc memory request should be done
150*c83a76b0SSuyog Pawar *
151*c83a76b0SSuyog Pawar * \return
152*c83a76b0SSuyog Pawar *    Number of records
153*c83a76b0SSuyog Pawar *
154*c83a76b0SSuyog Pawar * \author
155*c83a76b0SSuyog Pawar *  Ittiam
156*c83a76b0SSuyog Pawar *
157*c83a76b0SSuyog Pawar *****************************************************************************
158*c83a76b0SSuyog Pawar */
ihevce_coarse_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)159*c83a76b0SSuyog Pawar WORD32 ihevce_coarse_me_get_mem_recs(
160*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab,
161*c83a76b0SSuyog Pawar     ihevce_static_cfg_params_t *ps_init_prms,
162*c83a76b0SSuyog Pawar     WORD32 i4_num_proc_thrds,
163*c83a76b0SSuyog Pawar     WORD32 i4_mem_space,
164*c83a76b0SSuyog Pawar     WORD32 i4_resolution_id)
165*c83a76b0SSuyog Pawar {
166*c83a76b0SSuyog Pawar     hme_memtab_t as_memtabs[HME_COARSE_TOT_MEMTABS];
167*c83a76b0SSuyog Pawar     WORD32 n_tabs, i;
168*c83a76b0SSuyog Pawar 
169*c83a76b0SSuyog Pawar     /* Init prms structure specific to HME */
170*c83a76b0SSuyog Pawar     hme_init_prms_t s_hme_init_prms;
171*c83a76b0SSuyog Pawar 
172*c83a76b0SSuyog Pawar     //return (ihevce_coarse_me_get_num_mem_recs());
173*c83a76b0SSuyog Pawar     /*************************************************************************/
174*c83a76b0SSuyog Pawar     /* code flow: we call hme alloc function and then remap those memtabs    */
175*c83a76b0SSuyog Pawar     /* to a different type of memtab structure.                              */
176*c83a76b0SSuyog Pawar     /*************************************************************************/
177*c83a76b0SSuyog Pawar     ASSERT(HME_COARSE_TOT_MEMTABS >= hme_coarse_num_alloc());
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar     /*************************************************************************/
180*c83a76b0SSuyog Pawar     /* POPULATE THE HME INIT PRMS                                            */
181*c83a76b0SSuyog Pawar     /*************************************************************************/
182*c83a76b0SSuyog Pawar     ihevce_derive_me_init_prms(ps_init_prms, &s_hme_init_prms, i4_num_proc_thrds, i4_resolution_id);
183*c83a76b0SSuyog Pawar 
184*c83a76b0SSuyog Pawar     /*************************************************************************/
185*c83a76b0SSuyog Pawar     /* CALL THE ME FUNCTION TO GET MEMTABS                                   */
186*c83a76b0SSuyog Pawar     /*************************************************************************/
187*c83a76b0SSuyog Pawar     n_tabs = hme_coarse_alloc(&as_memtabs[0], &s_hme_init_prms);
188*c83a76b0SSuyog Pawar     ASSERT(n_tabs == hme_coarse_num_alloc());
189*c83a76b0SSuyog Pawar 
190*c83a76b0SSuyog Pawar     /*************************************************************************/
191*c83a76b0SSuyog Pawar     /* REMAP RESULTS TO ENCODER MEMTAB STRUCTURE                             */
192*c83a76b0SSuyog Pawar     /*************************************************************************/
193*c83a76b0SSuyog Pawar     for(i = 0; i < n_tabs; i++)
194*c83a76b0SSuyog Pawar     {
195*c83a76b0SSuyog Pawar         ps_mem_tab[i].i4_mem_size = as_memtabs[i].size;
196*c83a76b0SSuyog Pawar         ps_mem_tab[i].i4_mem_alignment = as_memtabs[i].align;
197*c83a76b0SSuyog Pawar         ps_mem_tab[i].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
198*c83a76b0SSuyog Pawar         ps_mem_tab[i].i4_size = sizeof(iv_mem_rec_t);
199*c83a76b0SSuyog Pawar     }
200*c83a76b0SSuyog Pawar 
201*c83a76b0SSuyog Pawar     /*************************************************************************/
202*c83a76b0SSuyog Pawar     /* --- HME Coarse sync Dep Mngr Mem requests --                          */
203*c83a76b0SSuyog Pawar     /*************************************************************************/
204*c83a76b0SSuyog Pawar     {
205*c83a76b0SSuyog Pawar         WORD32 n_dep_tabs;
206*c83a76b0SSuyog Pawar 
207*c83a76b0SSuyog Pawar         ps_mem_tab += n_tabs;
208*c83a76b0SSuyog Pawar 
209*c83a76b0SSuyog Pawar         n_dep_tabs = hme_coarse_dep_mngr_alloc(
210*c83a76b0SSuyog Pawar             ps_mem_tab, ps_init_prms, i4_mem_space, i4_num_proc_thrds, i4_resolution_id);
211*c83a76b0SSuyog Pawar 
212*c83a76b0SSuyog Pawar         ASSERT(n_dep_tabs == hme_coarse_dep_mngr_num_alloc());
213*c83a76b0SSuyog Pawar 
214*c83a76b0SSuyog Pawar         /* Update the total no. of mem tabs */
215*c83a76b0SSuyog Pawar         n_tabs += n_dep_tabs;
216*c83a76b0SSuyog Pawar     }
217*c83a76b0SSuyog Pawar 
218*c83a76b0SSuyog Pawar     return (n_tabs);
219*c83a76b0SSuyog Pawar }
220*c83a76b0SSuyog Pawar 
221*c83a76b0SSuyog Pawar /*!
222*c83a76b0SSuyog Pawar ******************************************************************************
223*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_init \endif
224*c83a76b0SSuyog Pawar *
225*c83a76b0SSuyog Pawar * \brief
226*c83a76b0SSuyog Pawar *    Intialization for ME context state structure .
227*c83a76b0SSuyog Pawar *
228*c83a76b0SSuyog Pawar * \param[in] ps_mem_tab : pointer to memory descriptors table
229*c83a76b0SSuyog Pawar * \param[in] ps_init_prms : Create time static parameters
230*c83a76b0SSuyog Pawar * \param[in] pv_osal_handle : Osal handle
231*c83a76b0SSuyog Pawar *
232*c83a76b0SSuyog Pawar * \return
233*c83a76b0SSuyog Pawar *    Handle to the ME context
234*c83a76b0SSuyog Pawar *
235*c83a76b0SSuyog Pawar * \author
236*c83a76b0SSuyog Pawar *  Ittiam
237*c83a76b0SSuyog Pawar *
238*c83a76b0SSuyog Pawar *****************************************************************************
239*c83a76b0SSuyog Pawar */
ihevce_coarse_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,WORD32 i4_resolution_id,UWORD8 u1_is_popcnt_available)240*c83a76b0SSuyog Pawar void *ihevce_coarse_me_init(
241*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab,
242*c83a76b0SSuyog Pawar     ihevce_static_cfg_params_t *ps_init_prms,
243*c83a76b0SSuyog Pawar     WORD32 i4_num_proc_thrds,
244*c83a76b0SSuyog Pawar     void *pv_osal_handle,
245*c83a76b0SSuyog Pawar     WORD32 i4_resolution_id,
246*c83a76b0SSuyog Pawar     UWORD8 u1_is_popcnt_available)
247*c83a76b0SSuyog Pawar {
248*c83a76b0SSuyog Pawar     /* ME handle to be returned */
249*c83a76b0SSuyog Pawar     void *pv_me_ctxt;
250*c83a76b0SSuyog Pawar     WORD32 status;
251*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_ctxt;
252*c83a76b0SSuyog Pawar 
253*c83a76b0SSuyog Pawar     /* Init prms structure specific to HME */
254*c83a76b0SSuyog Pawar     hme_init_prms_t s_hme_init_prms;
255*c83a76b0SSuyog Pawar 
256*c83a76b0SSuyog Pawar     /* memtabs to be passed to hme */
257*c83a76b0SSuyog Pawar     hme_memtab_t as_memtabs[HME_COARSE_TOT_MEMTABS];
258*c83a76b0SSuyog Pawar     WORD32 n_tabs, n_dep_tabs, i;
259*c83a76b0SSuyog Pawar 
260*c83a76b0SSuyog Pawar     /*************************************************************************/
261*c83a76b0SSuyog Pawar     /* POPULATE THE HME INIT PRMS                                            */
262*c83a76b0SSuyog Pawar     /*************************************************************************/
263*c83a76b0SSuyog Pawar     ihevce_derive_me_init_prms(ps_init_prms, &s_hme_init_prms, i4_num_proc_thrds, i4_resolution_id);
264*c83a76b0SSuyog Pawar 
265*c83a76b0SSuyog Pawar     /*************************************************************************/
266*c83a76b0SSuyog Pawar     /* Ensure local declaration is sufficient                                */
267*c83a76b0SSuyog Pawar     /*************************************************************************/
268*c83a76b0SSuyog Pawar     n_tabs = hme_coarse_num_alloc();
269*c83a76b0SSuyog Pawar     ASSERT(HME_COARSE_TOT_MEMTABS >= n_tabs);
270*c83a76b0SSuyog Pawar 
271*c83a76b0SSuyog Pawar     /*************************************************************************/
272*c83a76b0SSuyog Pawar     /* MAP RESULTS TO HME MEMTAB STRUCTURE                                   */
273*c83a76b0SSuyog Pawar     /*************************************************************************/
274*c83a76b0SSuyog Pawar     for(i = 0; i < n_tabs; i++)
275*c83a76b0SSuyog Pawar     {
276*c83a76b0SSuyog Pawar         as_memtabs[i].size = ps_mem_tab[i].i4_mem_size;
277*c83a76b0SSuyog Pawar         as_memtabs[i].align = ps_mem_tab[i].i4_mem_alignment;
278*c83a76b0SSuyog Pawar         as_memtabs[i].pu1_mem = (U08 *)ps_mem_tab[i].pv_base;
279*c83a76b0SSuyog Pawar     }
280*c83a76b0SSuyog Pawar     /*************************************************************************/
281*c83a76b0SSuyog Pawar     /* CALL THE ME FUNCTION TO GET MEMTABS                                   */
282*c83a76b0SSuyog Pawar     /*************************************************************************/
283*c83a76b0SSuyog Pawar     pv_me_ctxt = (void *)as_memtabs[0].pu1_mem;
284*c83a76b0SSuyog Pawar     status = hme_coarse_init(pv_me_ctxt, &as_memtabs[0], &s_hme_init_prms);
285*c83a76b0SSuyog Pawar     ps_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
286*c83a76b0SSuyog Pawar     if(status == -1)
287*c83a76b0SSuyog Pawar         return NULL;
288*c83a76b0SSuyog Pawar 
289*c83a76b0SSuyog Pawar     /*************************************************************************/
290*c83a76b0SSuyog Pawar     /* --- HME sync Dep Mngr Mem init --                                     */
291*c83a76b0SSuyog Pawar     /*************************************************************************/
292*c83a76b0SSuyog Pawar 
293*c83a76b0SSuyog Pawar     ps_mem_tab += n_tabs;
294*c83a76b0SSuyog Pawar 
295*c83a76b0SSuyog Pawar     n_dep_tabs = hme_coarse_dep_mngr_init(
296*c83a76b0SSuyog Pawar         ps_mem_tab, ps_init_prms, pv_me_ctxt, pv_osal_handle, i4_num_proc_thrds, i4_resolution_id);
297*c83a76b0SSuyog Pawar     ASSERT(n_dep_tabs <= hme_coarse_dep_mngr_num_alloc());
298*c83a76b0SSuyog Pawar 
299*c83a76b0SSuyog Pawar     n_tabs += n_dep_tabs;
300*c83a76b0SSuyog Pawar 
301*c83a76b0SSuyog Pawar     ihevce_me_instr_set_router(
302*c83a76b0SSuyog Pawar         (ihevce_me_optimised_function_list_t *)ps_ctxt->pv_me_optimised_function_list,
303*c83a76b0SSuyog Pawar         ps_init_prms->e_arch_type);
304*c83a76b0SSuyog Pawar 
305*c83a76b0SSuyog Pawar     ihevce_cmn_utils_instr_set_router(
306*c83a76b0SSuyog Pawar         &ps_ctxt->s_cmn_opt_func, u1_is_popcnt_available, ps_init_prms->e_arch_type);
307*c83a76b0SSuyog Pawar 
308*c83a76b0SSuyog Pawar     return (pv_me_ctxt);
309*c83a76b0SSuyog Pawar }
310*c83a76b0SSuyog Pawar 
311*c83a76b0SSuyog Pawar /*!
312*c83a76b0SSuyog Pawar ******************************************************************************
313*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_reg_thrds_sem \endif
314*c83a76b0SSuyog Pawar *
315*c83a76b0SSuyog Pawar * \brief
316*c83a76b0SSuyog Pawar *    Intialization for ME context state structure with semaphores .
317*c83a76b0SSuyog Pawar *
318*c83a76b0SSuyog Pawar * \param[in] pv_me_ctxt : pointer to Coarse ME ctxt
319*c83a76b0SSuyog Pawar * \param[in] ppv_sem_hdls : Array of semaphore handles
320*c83a76b0SSuyog Pawar * \param[in] i4_num_proc_thrds : Number of processing threads
321*c83a76b0SSuyog Pawar *
322*c83a76b0SSuyog Pawar * \return
323*c83a76b0SSuyog Pawar *   none
324*c83a76b0SSuyog Pawar *
325*c83a76b0SSuyog Pawar * \author
326*c83a76b0SSuyog Pawar *  Ittiam
327*c83a76b0SSuyog Pawar *
328*c83a76b0SSuyog Pawar *****************************************************************************
329*c83a76b0SSuyog Pawar */
ihevce_coarse_me_reg_thrds_sem(void * pv_me_ctxt,void ** ppv_sem_hdls,WORD32 i4_num_proc_thrds)330*c83a76b0SSuyog Pawar void ihevce_coarse_me_reg_thrds_sem(void *pv_me_ctxt, void **ppv_sem_hdls, WORD32 i4_num_proc_thrds)
331*c83a76b0SSuyog Pawar {
332*c83a76b0SSuyog Pawar     hme_coarse_dep_mngr_reg_sem(pv_me_ctxt, ppv_sem_hdls, i4_num_proc_thrds);
333*c83a76b0SSuyog Pawar 
334*c83a76b0SSuyog Pawar     return;
335*c83a76b0SSuyog Pawar }
336*c83a76b0SSuyog Pawar 
337*c83a76b0SSuyog Pawar /*!
338*c83a76b0SSuyog Pawar ******************************************************************************
339*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_delete \endif
340*c83a76b0SSuyog Pawar *
341*c83a76b0SSuyog Pawar * \brief
342*c83a76b0SSuyog Pawar *    Destroy Coarse ME module
343*c83a76b0SSuyog Pawar * Note : Only Destroys the resources allocated in the module like
344*c83a76b0SSuyog Pawar *   semaphore,etc. Memory free is done Separately using memtabs
345*c83a76b0SSuyog Pawar *
346*c83a76b0SSuyog Pawar * \param[in] pv_me_ctxt : pointer to Coarse ME ctxt
347*c83a76b0SSuyog Pawar * \param[in] ps_init_prms : Create time static parameters
348*c83a76b0SSuyog Pawar * \param[in] pv_osal_handle : Osal handle
349*c83a76b0SSuyog Pawar *
350*c83a76b0SSuyog Pawar * \return
351*c83a76b0SSuyog Pawar *    None
352*c83a76b0SSuyog Pawar *
353*c83a76b0SSuyog Pawar * \author
354*c83a76b0SSuyog Pawar *  Ittiam
355*c83a76b0SSuyog Pawar *
356*c83a76b0SSuyog Pawar *****************************************************************************
357*c83a76b0SSuyog Pawar */
ihevce_coarse_me_delete(void * pv_me_ctxt,ihevce_static_cfg_params_t * ps_init_prms,WORD32 i4_resolution_id)358*c83a76b0SSuyog Pawar void ihevce_coarse_me_delete(
359*c83a76b0SSuyog Pawar     void *pv_me_ctxt, ihevce_static_cfg_params_t *ps_init_prms, WORD32 i4_resolution_id)
360*c83a76b0SSuyog Pawar {
361*c83a76b0SSuyog Pawar     /* --- HME sync Dep Mngr Delete --*/
362*c83a76b0SSuyog Pawar     hme_coarse_dep_mngr_delete(pv_me_ctxt, ps_init_prms, i4_resolution_id);
363*c83a76b0SSuyog Pawar }
364*c83a76b0SSuyog Pawar 
365*c83a76b0SSuyog Pawar /**
366*c83a76b0SSuyog Pawar *******************************************************************************
367*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_set_resolution \endif
368*c83a76b0SSuyog Pawar *
369*c83a76b0SSuyog Pawar * \brief
370*c83a76b0SSuyog Pawar *    Sets the resolution for ME state
371*c83a76b0SSuyog Pawar *
372*c83a76b0SSuyog Pawar * \par Description:
373*c83a76b0SSuyog Pawar *    ME requires information of resolution to prime up its layer descriptors
374*c83a76b0SSuyog Pawar *    and contexts. This API is called whenever a control call from application
375*c83a76b0SSuyog Pawar *    causes a change of resolution. Has to be called once initially before
376*c83a76b0SSuyog Pawar *    processing any frame. Again this is just a glue function and calls the
377*c83a76b0SSuyog Pawar *    actual ME API for the same.
378*c83a76b0SSuyog Pawar *
379*c83a76b0SSuyog Pawar * \param[in,out] pv_me_ctxt: Handle to the ME context
380*c83a76b0SSuyog Pawar * \param[in] n_enc_layers: Number of layers getting encoded
381*c83a76b0SSuyog Pawar * \param[in] p_wd : Pointer containing widths of each layer getting encoded.
382*c83a76b0SSuyog Pawar * \param[in] p_ht : Pointer containing heights of each layer getting encoded.
383*c83a76b0SSuyog Pawar *
384*c83a76b0SSuyog Pawar * \returns
385*c83a76b0SSuyog Pawar *  none
386*c83a76b0SSuyog Pawar *
387*c83a76b0SSuyog Pawar * \author
388*c83a76b0SSuyog Pawar *  Ittiam
389*c83a76b0SSuyog Pawar *
390*c83a76b0SSuyog Pawar *******************************************************************************
391*c83a76b0SSuyog Pawar */
ihevce_coarse_me_set_resolution(void * pv_me_ctxt,WORD32 n_enc_layers,WORD32 * p_wd,WORD32 * p_ht)392*c83a76b0SSuyog Pawar void ihevce_coarse_me_set_resolution(
393*c83a76b0SSuyog Pawar     void *pv_me_ctxt, WORD32 n_enc_layers, WORD32 *p_wd, WORD32 *p_ht)
394*c83a76b0SSuyog Pawar {
395*c83a76b0SSuyog Pawar     /* local variables */
396*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
397*c83a76b0SSuyog Pawar     WORD32 thrds;
398*c83a76b0SSuyog Pawar 
399*c83a76b0SSuyog Pawar     for(thrds = 0; thrds < ps_master_ctxt->i4_num_proc_thrds; thrds++)
400*c83a76b0SSuyog Pawar     {
401*c83a76b0SSuyog Pawar         coarse_me_ctxt_t *ps_me_thrd_ctxt;
402*c83a76b0SSuyog Pawar 
403*c83a76b0SSuyog Pawar         ps_me_thrd_ctxt = ps_master_ctxt->aps_me_ctxt[thrds];
404*c83a76b0SSuyog Pawar 
405*c83a76b0SSuyog Pawar         hme_coarse_set_resolution((void *)ps_me_thrd_ctxt, n_enc_layers, p_wd, p_ht);
406*c83a76b0SSuyog Pawar     }
407*c83a76b0SSuyog Pawar }
ihevce_coarse_me_get_rc_param(void * pv_me_ctxt,LWORD64 * i8_acc_frame_hme_cost,LWORD64 * i8_acc_frame_hme_sad,LWORD64 * i8_acc_num_blks_higher_sad,LWORD64 * i8_total_blks,WORD32 i4_is_prev_pic_same_scene)408*c83a76b0SSuyog Pawar void ihevce_coarse_me_get_rc_param(
409*c83a76b0SSuyog Pawar     void *pv_me_ctxt,
410*c83a76b0SSuyog Pawar     LWORD64 *i8_acc_frame_hme_cost,
411*c83a76b0SSuyog Pawar     LWORD64 *i8_acc_frame_hme_sad,
412*c83a76b0SSuyog Pawar     LWORD64 *i8_acc_num_blks_higher_sad,
413*c83a76b0SSuyog Pawar     LWORD64 *i8_total_blks,
414*c83a76b0SSuyog Pawar     WORD32 i4_is_prev_pic_same_scene)
415*c83a76b0SSuyog Pawar {
416*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
417*c83a76b0SSuyog Pawar     WORD32 thrds;
418*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_me_thrd_ctxt;
419*c83a76b0SSuyog Pawar 
420*c83a76b0SSuyog Pawar     *i8_acc_frame_hme_cost = 0;
421*c83a76b0SSuyog Pawar     *i8_acc_frame_hme_sad = 0;
422*c83a76b0SSuyog Pawar 
423*c83a76b0SSuyog Pawar     for(thrds = 0; thrds < ps_master_ctxt->i4_num_proc_thrds; thrds++)
424*c83a76b0SSuyog Pawar     {
425*c83a76b0SSuyog Pawar         ps_me_thrd_ctxt = ps_master_ctxt->aps_me_ctxt[thrds];
426*c83a76b0SSuyog Pawar         *i8_acc_frame_hme_cost += ps_me_thrd_ctxt->i4_L1_hme_best_cost;
427*c83a76b0SSuyog Pawar 
428*c83a76b0SSuyog Pawar         /*Calculate me cost wrt. to ref only for P frame */
429*c83a76b0SSuyog Pawar         if(ps_me_thrd_ctxt->s_frm_prms.is_i_pic == ps_me_thrd_ctxt->s_frm_prms.bidir_enabled)
430*c83a76b0SSuyog Pawar         {
431*c83a76b0SSuyog Pawar             *i8_acc_num_blks_higher_sad += ps_me_thrd_ctxt->i4_num_blks_high_sad;
432*c83a76b0SSuyog Pawar             *i8_total_blks += ps_me_thrd_ctxt->i4_num_blks;
433*c83a76b0SSuyog Pawar         }
434*c83a76b0SSuyog Pawar 
435*c83a76b0SSuyog Pawar         *i8_acc_frame_hme_sad += ps_me_thrd_ctxt->i4_L1_hme_sad;
436*c83a76b0SSuyog Pawar     }
437*c83a76b0SSuyog Pawar }
438*c83a76b0SSuyog Pawar 
439*c83a76b0SSuyog Pawar /*!
440*c83a76b0SSuyog Pawar ******************************************************************************
441*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_process \endif
442*c83a76b0SSuyog Pawar *
443*c83a76b0SSuyog Pawar * \brief
444*c83a76b0SSuyog Pawar *    Frame level ME function
445*c83a76b0SSuyog Pawar *
446*c83a76b0SSuyog Pawar * \par Description:
447*c83a76b0SSuyog Pawar *    Processing of all layers starting from coarse and going
448*c83a76b0SSuyog Pawar *    to the refinement layers, except enocde layer
449*c83a76b0SSuyog Pawar *
450*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to ME module
451*c83a76b0SSuyog Pawar * \param[in] ps_enc_lap_inp  : pointer to input yuv buffer (frame buffer)
452*c83a76b0SSuyog Pawar * \param[in,out] ps_ctb_out : pointer to CTB analyse output structure (frame buffer)
453*c83a76b0SSuyog Pawar * \param[out] ps_cu_out : pointer to CU analyse output structure (frame buffer)
454*c83a76b0SSuyog Pawar * \param[in]  pd_intra_costs : pointerto intra cost buffer
455*c83a76b0SSuyog Pawar * \param[in]  ps_multi_thrd_ctxt : pointer to multi thread ctxt
456*c83a76b0SSuyog Pawar * \param[in]  thrd_id : Thread id of the current thrd in which function is executed
457*c83a76b0SSuyog Pawar *
458*c83a76b0SSuyog Pawar * \return
459*c83a76b0SSuyog Pawar *    None
460*c83a76b0SSuyog Pawar *
461*c83a76b0SSuyog Pawar * \author
462*c83a76b0SSuyog Pawar *  Ittiam
463*c83a76b0SSuyog Pawar *
464*c83a76b0SSuyog Pawar *****************************************************************************
465*c83a76b0SSuyog Pawar */
ihevce_coarse_me_process(void * pv_me_ctxt,ihevce_lap_enc_buf_t * ps_enc_lap_inp,multi_thrd_ctxt_t * ps_multi_thrd_ctxt,WORD32 thrd_id,WORD32 i4_ping_pong)466*c83a76b0SSuyog Pawar void ihevce_coarse_me_process(
467*c83a76b0SSuyog Pawar     void *pv_me_ctxt,
468*c83a76b0SSuyog Pawar     ihevce_lap_enc_buf_t *ps_enc_lap_inp,
469*c83a76b0SSuyog Pawar     multi_thrd_ctxt_t *ps_multi_thrd_ctxt,
470*c83a76b0SSuyog Pawar     WORD32 thrd_id,
471*c83a76b0SSuyog Pawar     WORD32 i4_ping_pong)
472*c83a76b0SSuyog Pawar 
473*c83a76b0SSuyog Pawar {
474*c83a76b0SSuyog Pawar     /* local variables */
475*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
476*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_thrd_ctxt;
477*c83a76b0SSuyog Pawar 
478*c83a76b0SSuyog Pawar     /* get the current thread ctxt pointer */
479*c83a76b0SSuyog Pawar     ps_thrd_ctxt = ps_master_ctxt->aps_me_ctxt[thrd_id];
480*c83a76b0SSuyog Pawar     ps_thrd_ctxt->thrd_id = thrd_id;
481*c83a76b0SSuyog Pawar 
482*c83a76b0SSuyog Pawar     /* frame level processing function */
483*c83a76b0SSuyog Pawar     hme_coarse_process_frm(
484*c83a76b0SSuyog Pawar         (void *)ps_thrd_ctxt,
485*c83a76b0SSuyog Pawar         &ps_master_ctxt->s_ref_map,
486*c83a76b0SSuyog Pawar         &ps_master_ctxt->s_frm_prms,
487*c83a76b0SSuyog Pawar         ps_multi_thrd_ctxt,
488*c83a76b0SSuyog Pawar         i4_ping_pong,
489*c83a76b0SSuyog Pawar         &ps_master_ctxt->apv_dep_mngr_hme_sync[0]);
490*c83a76b0SSuyog Pawar 
491*c83a76b0SSuyog Pawar     return;
492*c83a76b0SSuyog Pawar }
493*c83a76b0SSuyog Pawar 
494*c83a76b0SSuyog Pawar /*!
495*c83a76b0SSuyog Pawar ******************************************************************************
496*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_frame_end \endif
497*c83a76b0SSuyog Pawar *
498*c83a76b0SSuyog Pawar * \brief
499*c83a76b0SSuyog Pawar *    End of frame update function performs
500*c83a76b0SSuyog Pawar *       - GMV collation
501*c83a76b0SSuyog Pawar *       - Dynamic Search Range collation
502*c83a76b0SSuyog Pawar *
503*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to ME module
504*c83a76b0SSuyog Pawar *
505*c83a76b0SSuyog Pawar * \return
506*c83a76b0SSuyog Pawar *    None
507*c83a76b0SSuyog Pawar *
508*c83a76b0SSuyog Pawar * \author
509*c83a76b0SSuyog Pawar *  Ittiam
510*c83a76b0SSuyog Pawar *
511*c83a76b0SSuyog Pawar *****************************************************************************
512*c83a76b0SSuyog Pawar */
ihevce_coarse_me_frame_end(void * pv_me_ctxt)513*c83a76b0SSuyog Pawar void ihevce_coarse_me_frame_end(void *pv_me_ctxt)
514*c83a76b0SSuyog Pawar {
515*c83a76b0SSuyog Pawar     /* local variables */
516*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
517*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_thrd0_ctxt;
518*c83a76b0SSuyog Pawar     layer_ctxt_t *ps_curr_layer;
519*c83a76b0SSuyog Pawar     WORD32 num_ref, num_thrds, cur_poc;
520*c83a76b0SSuyog Pawar     WORD32 coarse_layer_id;
521*c83a76b0SSuyog Pawar     WORD32 i4_num_ref;
522*c83a76b0SSuyog Pawar     ME_QUALITY_PRESETS_T e_me_quality_preset;
523*c83a76b0SSuyog Pawar 
524*c83a76b0SSuyog Pawar     /* GMV collation is done for coarse Layer only */
525*c83a76b0SSuyog Pawar     ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[0];
526*c83a76b0SSuyog Pawar     coarse_layer_id = ps_thrd0_ctxt->num_layers - 1;
527*c83a76b0SSuyog Pawar     ps_curr_layer = ps_thrd0_ctxt->ps_curr_descr->aps_layers[coarse_layer_id];
528*c83a76b0SSuyog Pawar     i4_num_ref = ps_master_ctxt->s_ref_map.i4_num_ref;
529*c83a76b0SSuyog Pawar     e_me_quality_preset = ps_thrd0_ctxt->s_init_prms.s_me_coding_tools.e_me_quality_presets;
530*c83a76b0SSuyog Pawar 
531*c83a76b0SSuyog Pawar     /* No processing is required if current pic is I pic */
532*c83a76b0SSuyog Pawar     if(1 == ps_master_ctxt->s_frm_prms.is_i_pic)
533*c83a76b0SSuyog Pawar     {
534*c83a76b0SSuyog Pawar         return;
535*c83a76b0SSuyog Pawar     }
536*c83a76b0SSuyog Pawar 
537*c83a76b0SSuyog Pawar     /* use thrd 0 ctxt to collate the GMVs histogram and Dynamic Search Range */
538*c83a76b0SSuyog Pawar     /* across all threads */
539*c83a76b0SSuyog Pawar     for(num_ref = 0; num_ref < i4_num_ref; num_ref++)
540*c83a76b0SSuyog Pawar     {
541*c83a76b0SSuyog Pawar         WORD32 i4_offset, i4_lobe_size, i4_layer_id;
542*c83a76b0SSuyog Pawar         mv_hist_t *ps_hist_thrd0;
543*c83a76b0SSuyog Pawar         dyn_range_prms_t *aps_dyn_range_prms_thrd0[MAX_NUM_LAYERS];
544*c83a76b0SSuyog Pawar 
545*c83a76b0SSuyog Pawar         ps_hist_thrd0 = ps_thrd0_ctxt->aps_mv_hist[num_ref];
546*c83a76b0SSuyog Pawar 
547*c83a76b0SSuyog Pawar         /* Only for P pic. For P, both are 0, I&B has them mut. exclusive */
548*c83a76b0SSuyog Pawar         if(ps_thrd0_ctxt->s_frm_prms.is_i_pic == ps_thrd0_ctxt->s_frm_prms.bidir_enabled)
549*c83a76b0SSuyog Pawar         {
550*c83a76b0SSuyog Pawar             for(i4_layer_id = coarse_layer_id; i4_layer_id > 0; i4_layer_id--)
551*c83a76b0SSuyog Pawar             {
552*c83a76b0SSuyog Pawar                 aps_dyn_range_prms_thrd0[i4_layer_id] =
553*c83a76b0SSuyog Pawar                     &ps_thrd0_ctxt->s_coarse_dyn_range_prms.as_dyn_range_prms[i4_layer_id][num_ref];
554*c83a76b0SSuyog Pawar             }
555*c83a76b0SSuyog Pawar         }
556*c83a76b0SSuyog Pawar 
557*c83a76b0SSuyog Pawar         i4_lobe_size = ps_hist_thrd0->i4_lobe1_size;
558*c83a76b0SSuyog Pawar         i4_offset = i4_lobe_size >> 1;
559*c83a76b0SSuyog Pawar 
560*c83a76b0SSuyog Pawar         /* run a loop over all the other threads to add up the histogram */
561*c83a76b0SSuyog Pawar         /* and to update the dynamical search range                      */
562*c83a76b0SSuyog Pawar         for(num_thrds = 1; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
563*c83a76b0SSuyog Pawar         {
564*c83a76b0SSuyog Pawar             dyn_range_prms_t *ps_dyn_range_prms;
565*c83a76b0SSuyog Pawar 
566*c83a76b0SSuyog Pawar             if(ME_XTREME_SPEED_25 != e_me_quality_preset)
567*c83a76b0SSuyog Pawar             {
568*c83a76b0SSuyog Pawar                 mv_hist_t *ps_hist;
569*c83a76b0SSuyog Pawar                 WORD32 i4_y, i4_x;
570*c83a76b0SSuyog Pawar                 /* get current thrd histogram pointer */
571*c83a76b0SSuyog Pawar                 ps_hist = ps_master_ctxt->aps_me_ctxt[num_thrds]->aps_mv_hist[num_ref];
572*c83a76b0SSuyog Pawar 
573*c83a76b0SSuyog Pawar                 /* Accumalate the Bin count for all the thread */
574*c83a76b0SSuyog Pawar                 for(i4_y = 0; i4_y < ps_hist_thrd0->i4_num_rows; i4_y++)
575*c83a76b0SSuyog Pawar                 {
576*c83a76b0SSuyog Pawar                     for(i4_x = 0; i4_x < ps_hist_thrd0->i4_num_cols; i4_x++)
577*c83a76b0SSuyog Pawar                     {
578*c83a76b0SSuyog Pawar                         S32 i4_bin_id;
579*c83a76b0SSuyog Pawar 
580*c83a76b0SSuyog Pawar                         i4_bin_id = i4_x + (i4_y * ps_hist_thrd0->i4_num_cols);
581*c83a76b0SSuyog Pawar 
582*c83a76b0SSuyog Pawar                         ps_hist_thrd0->ai4_bin_count[i4_bin_id] +=
583*c83a76b0SSuyog Pawar                             ps_hist->ai4_bin_count[i4_bin_id];
584*c83a76b0SSuyog Pawar                     }
585*c83a76b0SSuyog Pawar                 }
586*c83a76b0SSuyog Pawar             }
587*c83a76b0SSuyog Pawar 
588*c83a76b0SSuyog Pawar             /* Update the dynamical search range for each Layer              */
589*c83a76b0SSuyog Pawar             /* Only for P pic. For P, both are 0, I&B has them mut. exclusive */
590*c83a76b0SSuyog Pawar             if(ps_thrd0_ctxt->s_frm_prms.is_i_pic == ps_thrd0_ctxt->s_frm_prms.bidir_enabled)
591*c83a76b0SSuyog Pawar             {
592*c83a76b0SSuyog Pawar                 for(i4_layer_id = coarse_layer_id; i4_layer_id > 0; i4_layer_id--)
593*c83a76b0SSuyog Pawar                 {
594*c83a76b0SSuyog Pawar                     /* get current thrd, layer dynamical search range param. pointer */
595*c83a76b0SSuyog Pawar                     ps_dyn_range_prms =
596*c83a76b0SSuyog Pawar                         &ps_master_ctxt->aps_me_ctxt[num_thrds]
597*c83a76b0SSuyog Pawar                              ->s_coarse_dyn_range_prms.as_dyn_range_prms[i4_layer_id][num_ref];
598*c83a76b0SSuyog Pawar                     /* TODO : This calls can be optimized further. No need for min in 1st call and max in 2nd call */
599*c83a76b0SSuyog Pawar                     hme_update_dynamic_search_params(
600*c83a76b0SSuyog Pawar                         aps_dyn_range_prms_thrd0[i4_layer_id], ps_dyn_range_prms->i2_dyn_max_y);
601*c83a76b0SSuyog Pawar 
602*c83a76b0SSuyog Pawar                     hme_update_dynamic_search_params(
603*c83a76b0SSuyog Pawar                         aps_dyn_range_prms_thrd0[i4_layer_id], ps_dyn_range_prms->i2_dyn_min_y);
604*c83a76b0SSuyog Pawar                 }
605*c83a76b0SSuyog Pawar             }
606*c83a76b0SSuyog Pawar         }
607*c83a76b0SSuyog Pawar     }
608*c83a76b0SSuyog Pawar 
609*c83a76b0SSuyog Pawar     /*************************************************************************/
610*c83a76b0SSuyog Pawar     /* Get the MAX/MIN per POC distance based on the all the ref. pics       */
611*c83a76b0SSuyog Pawar     /*************************************************************************/
612*c83a76b0SSuyog Pawar     /* Only for P pic. For P, both are 0, I&B has them mut. exclusive */
613*c83a76b0SSuyog Pawar     if(ps_thrd0_ctxt->s_frm_prms.is_i_pic == ps_thrd0_ctxt->s_frm_prms.bidir_enabled)
614*c83a76b0SSuyog Pawar     {
615*c83a76b0SSuyog Pawar         WORD32 i4_layer_id;
616*c83a76b0SSuyog Pawar         cur_poc = ps_thrd0_ctxt->i4_curr_poc;
617*c83a76b0SSuyog Pawar 
618*c83a76b0SSuyog Pawar         for(i4_layer_id = coarse_layer_id; i4_layer_id > 0; i4_layer_id--)
619*c83a76b0SSuyog Pawar         {
620*c83a76b0SSuyog Pawar             ps_thrd0_ctxt->s_coarse_dyn_range_prms.i2_dyn_max_y_per_poc[i4_layer_id] = 0;
621*c83a76b0SSuyog Pawar             ps_thrd0_ctxt->s_coarse_dyn_range_prms.i2_dyn_min_y_per_poc[i4_layer_id] = 0;
622*c83a76b0SSuyog Pawar         }
623*c83a76b0SSuyog Pawar 
624*c83a76b0SSuyog Pawar         for(num_ref = 0; num_ref < i4_num_ref; num_ref++)
625*c83a76b0SSuyog Pawar         {
626*c83a76b0SSuyog Pawar             for(i4_layer_id = coarse_layer_id; i4_layer_id > 0; i4_layer_id--)
627*c83a76b0SSuyog Pawar             {
628*c83a76b0SSuyog Pawar                 WORD16 i2_mv_per_poc;
629*c83a76b0SSuyog Pawar                 WORD32 ref_poc, poc_diff;
630*c83a76b0SSuyog Pawar                 dyn_range_prms_t *ps_dyn_range_prms_thrd0;
631*c83a76b0SSuyog Pawar 
632*c83a76b0SSuyog Pawar                 ps_dyn_range_prms_thrd0 =
633*c83a76b0SSuyog Pawar                     &ps_thrd0_ctxt->s_coarse_dyn_range_prms.as_dyn_range_prms[i4_layer_id][num_ref];
634*c83a76b0SSuyog Pawar 
635*c83a76b0SSuyog Pawar                 ref_poc = ps_dyn_range_prms_thrd0->i4_poc;
636*c83a76b0SSuyog Pawar                 ASSERT(ref_poc < cur_poc);
637*c83a76b0SSuyog Pawar                 poc_diff = (cur_poc - ref_poc);
638*c83a76b0SSuyog Pawar 
639*c83a76b0SSuyog Pawar                 /* cur. ref. pic. max y per POC */
640*c83a76b0SSuyog Pawar                 i2_mv_per_poc = (ps_dyn_range_prms_thrd0->i2_dyn_max_y + (poc_diff - 1)) / poc_diff;
641*c83a76b0SSuyog Pawar                 /* update the max y per POC */
642*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->s_coarse_dyn_range_prms.i2_dyn_max_y_per_poc[i4_layer_id] =
643*c83a76b0SSuyog Pawar                     MAX(ps_thrd0_ctxt->s_coarse_dyn_range_prms.i2_dyn_max_y_per_poc[i4_layer_id],
644*c83a76b0SSuyog Pawar                         i2_mv_per_poc);
645*c83a76b0SSuyog Pawar 
646*c83a76b0SSuyog Pawar                 /* cur. ref. pic. min y per POC */
647*c83a76b0SSuyog Pawar                 i2_mv_per_poc = (ps_dyn_range_prms_thrd0->i2_dyn_min_y - (poc_diff - 1)) / poc_diff;
648*c83a76b0SSuyog Pawar                 /* update the min y per POC */
649*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->s_coarse_dyn_range_prms.i2_dyn_min_y_per_poc[i4_layer_id] =
650*c83a76b0SSuyog Pawar                     MIN(ps_thrd0_ctxt->s_coarse_dyn_range_prms.i2_dyn_min_y_per_poc[i4_layer_id],
651*c83a76b0SSuyog Pawar                         i2_mv_per_poc);
652*c83a76b0SSuyog Pawar             }
653*c83a76b0SSuyog Pawar         }
654*c83a76b0SSuyog Pawar 
655*c83a76b0SSuyog Pawar         /*************************************************************************/
656*c83a76b0SSuyog Pawar         /* Populate the results to all thread ctxt                               */
657*c83a76b0SSuyog Pawar         /*************************************************************************/
658*c83a76b0SSuyog Pawar         for(num_thrds = 1; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
659*c83a76b0SSuyog Pawar         {
660*c83a76b0SSuyog Pawar             for(i4_layer_id = coarse_layer_id; i4_layer_id > 0; i4_layer_id--)
661*c83a76b0SSuyog Pawar             {
662*c83a76b0SSuyog Pawar                 ps_master_ctxt->aps_me_ctxt[num_thrds]
663*c83a76b0SSuyog Pawar                     ->s_coarse_dyn_range_prms.i2_dyn_max_y_per_poc[i4_layer_id] =
664*c83a76b0SSuyog Pawar                     ps_thrd0_ctxt->s_coarse_dyn_range_prms.i2_dyn_max_y_per_poc[i4_layer_id];
665*c83a76b0SSuyog Pawar 
666*c83a76b0SSuyog Pawar                 ps_master_ctxt->aps_me_ctxt[num_thrds]
667*c83a76b0SSuyog Pawar                     ->s_coarse_dyn_range_prms.i2_dyn_min_y_per_poc[i4_layer_id] =
668*c83a76b0SSuyog Pawar                     ps_thrd0_ctxt->s_coarse_dyn_range_prms.i2_dyn_min_y_per_poc[i4_layer_id];
669*c83a76b0SSuyog Pawar             }
670*c83a76b0SSuyog Pawar         }
671*c83a76b0SSuyog Pawar     }
672*c83a76b0SSuyog Pawar 
673*c83a76b0SSuyog Pawar     if(ME_XTREME_SPEED_25 != e_me_quality_preset)
674*c83a76b0SSuyog Pawar     {
675*c83a76b0SSuyog Pawar         /* call the function which calcualtes the GMV    */
676*c83a76b0SSuyog Pawar         /* layer pointer is shared across all threads    */
677*c83a76b0SSuyog Pawar         /* hence all threads will have access to updated */
678*c83a76b0SSuyog Pawar         /* GMVs populated using thread 0 ctxt            */
679*c83a76b0SSuyog Pawar         for(num_ref = 0; num_ref < i4_num_ref; num_ref++)
680*c83a76b0SSuyog Pawar         {
681*c83a76b0SSuyog Pawar             hme_calculate_global_mv(
682*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->aps_mv_hist[num_ref],
683*c83a76b0SSuyog Pawar                 &ps_curr_layer->s_global_mv[num_ref][GMV_THICK_LOBE],
684*c83a76b0SSuyog Pawar                 GMV_THICK_LOBE);
685*c83a76b0SSuyog Pawar         }
686*c83a76b0SSuyog Pawar     }
687*c83a76b0SSuyog Pawar     return;
688*c83a76b0SSuyog Pawar }
689*c83a76b0SSuyog Pawar 
690*c83a76b0SSuyog Pawar /*!
691*c83a76b0SSuyog Pawar ******************************************************************************
692*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_frame_dpb_update \endif
693*c83a76b0SSuyog Pawar *
694*c83a76b0SSuyog Pawar * \brief
695*c83a76b0SSuyog Pawar *    Frame level ME initialisation function
696*c83a76b0SSuyog Pawar *
697*c83a76b0SSuyog Pawar * \par Description:
698*c83a76b0SSuyog Pawar *   Updation of ME's internal DPB
699*c83a76b0SSuyog Pawar *    based on available ref list information
700*c83a76b0SSuyog Pawar *
701*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to ME module
702*c83a76b0SSuyog Pawar * \param[in] num_ref_l0 : Number of reference pics in L0 list
703*c83a76b0SSuyog Pawar * \param[in] num_ref_l1 : Number of reference pics in L1 list
704*c83a76b0SSuyog Pawar * \param[in] pps_rec_list_l0 : List of recon pics in L0 list
705*c83a76b0SSuyog Pawar * \param[in] pps_rec_list_l1 : List of recon pics in L1 list
706*c83a76b0SSuyog Pawar *
707*c83a76b0SSuyog Pawar * \return
708*c83a76b0SSuyog Pawar *    None
709*c83a76b0SSuyog Pawar *
710*c83a76b0SSuyog Pawar * \author
711*c83a76b0SSuyog Pawar *  Ittiam
712*c83a76b0SSuyog Pawar *
713*c83a76b0SSuyog Pawar *****************************************************************************
714*c83a76b0SSuyog Pawar */
ihevce_coarse_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)715*c83a76b0SSuyog Pawar void ihevce_coarse_me_frame_dpb_update(
716*c83a76b0SSuyog Pawar     void *pv_me_ctxt,
717*c83a76b0SSuyog Pawar     WORD32 num_ref_l0,
718*c83a76b0SSuyog Pawar     WORD32 num_ref_l1,
719*c83a76b0SSuyog Pawar     recon_pic_buf_t **pps_rec_list_l0,
720*c83a76b0SSuyog Pawar     recon_pic_buf_t **pps_rec_list_l1)
721*c83a76b0SSuyog Pawar {
722*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
723*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_thrd0_ctxt;
724*c83a76b0SSuyog Pawar     WORD32 a_pocs_buffered_in_me[MAX_NUM_REF + 1];
725*c83a76b0SSuyog Pawar     WORD32 a_pocs_to_remove[MAX_NUM_REF + 2];
726*c83a76b0SSuyog Pawar     WORD32 poc_remove_id = 0;
727*c83a76b0SSuyog Pawar     WORD32 i, count;
728*c83a76b0SSuyog Pawar 
729*c83a76b0SSuyog Pawar     /* All processing done using shared / common memory across */
730*c83a76b0SSuyog Pawar     /* threads is done using thrd ctxt */
731*c83a76b0SSuyog Pawar     ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[0];
732*c83a76b0SSuyog Pawar 
733*c83a76b0SSuyog Pawar     /*************************************************************************/
734*c83a76b0SSuyog Pawar     /* Updation of ME's DPB list. This involves the following steps:         */
735*c83a76b0SSuyog Pawar     /* 1. Obtain list of active POCs maintained within ME.                   */
736*c83a76b0SSuyog Pawar     /* 2. Search each of them in the ref list. Whatever is not found goes to */
737*c83a76b0SSuyog Pawar     /*     the list to be removed. Note: a_pocs_buffered_in_me holds the     */
738*c83a76b0SSuyog Pawar     /*    currently active POC list within ME. a_pocs_to_remove holds the    */
739*c83a76b0SSuyog Pawar     /*    list of POCs to be removed, terminated by -1.                      */
740*c83a76b0SSuyog Pawar     /*************************************************************************/
741*c83a76b0SSuyog Pawar     hme_coarse_get_active_pocs_list((void *)ps_thrd0_ctxt, a_pocs_buffered_in_me);
742*c83a76b0SSuyog Pawar 
743*c83a76b0SSuyog Pawar     count = 0;
744*c83a76b0SSuyog Pawar     while(a_pocs_buffered_in_me[count] != -1)
745*c83a76b0SSuyog Pawar     {
746*c83a76b0SSuyog Pawar         WORD32 poc_to_search = a_pocs_buffered_in_me[count];
747*c83a76b0SSuyog Pawar         WORD32 match_found_flag = 0;
748*c83a76b0SSuyog Pawar 
749*c83a76b0SSuyog Pawar         /*********************************************************************/
750*c83a76b0SSuyog Pawar         /* Search in any one list (L0/L1) since both lists contain all the   */
751*c83a76b0SSuyog Pawar         /* active ref pics.                                                  */
752*c83a76b0SSuyog Pawar         /*********************************************************************/
753*c83a76b0SSuyog Pawar         for(i = 0; i < num_ref_l0; i++)
754*c83a76b0SSuyog Pawar         {
755*c83a76b0SSuyog Pawar             if(poc_to_search == pps_rec_list_l0[i]->i4_poc)
756*c83a76b0SSuyog Pawar             {
757*c83a76b0SSuyog Pawar                 match_found_flag = 1;
758*c83a76b0SSuyog Pawar                 break;
759*c83a76b0SSuyog Pawar             }
760*c83a76b0SSuyog Pawar         }
761*c83a76b0SSuyog Pawar         for(i = 0; i < num_ref_l1; i++)
762*c83a76b0SSuyog Pawar         {
763*c83a76b0SSuyog Pawar             if(poc_to_search == pps_rec_list_l1[i]->i4_poc)
764*c83a76b0SSuyog Pawar             {
765*c83a76b0SSuyog Pawar                 match_found_flag = 1;
766*c83a76b0SSuyog Pawar                 break;
767*c83a76b0SSuyog Pawar             }
768*c83a76b0SSuyog Pawar         }
769*c83a76b0SSuyog Pawar 
770*c83a76b0SSuyog Pawar         if(0 == match_found_flag)
771*c83a76b0SSuyog Pawar         {
772*c83a76b0SSuyog Pawar             /*****************************************************************/
773*c83a76b0SSuyog Pawar             /* POC buffered inside ME but not part of ref list given by DPB  */
774*c83a76b0SSuyog Pawar             /* Hence this needs to be flagged to ME for removal.             */
775*c83a76b0SSuyog Pawar             /*****************************************************************/
776*c83a76b0SSuyog Pawar             a_pocs_to_remove[poc_remove_id] = poc_to_search;
777*c83a76b0SSuyog Pawar             poc_remove_id++;
778*c83a76b0SSuyog Pawar         }
779*c83a76b0SSuyog Pawar         count++;
780*c83a76b0SSuyog Pawar     }
781*c83a76b0SSuyog Pawar 
782*c83a76b0SSuyog Pawar     /* List termination */
783*c83a76b0SSuyog Pawar     a_pocs_to_remove[poc_remove_id] = -1;
784*c83a76b0SSuyog Pawar 
785*c83a76b0SSuyog Pawar     /* Call the ME API to remove "outdated" POCs */
786*c83a76b0SSuyog Pawar     hme_coarse_discard_frm(ps_thrd0_ctxt, a_pocs_to_remove);
787*c83a76b0SSuyog Pawar }
788*c83a76b0SSuyog Pawar 
789*c83a76b0SSuyog Pawar /*!
790*c83a76b0SSuyog Pawar ******************************************************************************
791*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_frame_init \endif
792*c83a76b0SSuyog Pawar *
793*c83a76b0SSuyog Pawar * \brief
794*c83a76b0SSuyog Pawar *    Coarse Frame level ME initialisation function
795*c83a76b0SSuyog Pawar *
796*c83a76b0SSuyog Pawar * \par Description:
797*c83a76b0SSuyog Pawar *    The following pre-conditions exist for this function: a. We have the input
798*c83a76b0SSuyog Pawar *    pic ready for encode, b. We have the reference list with POC, L0/L1 IDs
799*c83a76b0SSuyog Pawar *    and ref ptrs ready for this picture and c. ihevce_me_set_resolution has
800*c83a76b0SSuyog Pawar *    been called atleast once. Once these are supplied, the following are
801*c83a76b0SSuyog Pawar *    done here: a. Input pyramid creation, b. Updation of ME's internal DPB
802*c83a76b0SSuyog Pawar *    based on available ref list information
803*c83a76b0SSuyog Pawar *
804*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to ME module
805*c83a76b0SSuyog Pawar * \param[in] ps_frm_ctb_prms : CTB characteristics parameters
806*c83a76b0SSuyog Pawar * \param[in] ps_frm_lamda : Frame level Lambda params
807*c83a76b0SSuyog Pawar * \param[in] num_ref_l0 : Number of reference pics in L0 list
808*c83a76b0SSuyog Pawar * \param[in] num_ref_l1 : Number of reference pics in L1 list
809*c83a76b0SSuyog Pawar * \param[in] num_ref_l0_active : Active reference pics in L0 dir for current frame (shall be <= num_ref_l0)
810*c83a76b0SSuyog Pawar * \param[in] num_ref_l1_active : Active reference pics in L1 dir for current frame (shall be <= num_ref_l1)
811*c83a76b0SSuyog Pawar * \param[in] pps_rec_list_l0 : List of recon pics in L0 list
812*c83a76b0SSuyog Pawar * \param[in] pps_rec_list_l1 : List of recon pics in L1 list
813*c83a76b0SSuyog Pawar * \param[in] ps_enc_lap_inp  : pointer to input yuv buffer (frame buffer)
814*c83a76b0SSuyog Pawar * \param[in] i4_frm_qp       : current picture QP
815*c83a76b0SSuyog Pawar *
816*c83a76b0SSuyog Pawar * \return
817*c83a76b0SSuyog Pawar *    None
818*c83a76b0SSuyog Pawar *
819*c83a76b0SSuyog Pawar * \author
820*c83a76b0SSuyog Pawar *  Ittiam
821*c83a76b0SSuyog Pawar *
822*c83a76b0SSuyog Pawar *****************************************************************************
823*c83a76b0SSuyog Pawar */
ihevce_coarse_me_frame_init(void * pv_me_ctxt,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,ihevce_lap_enc_buf_t * ps_enc_lap_inp,WORD32 i4_frm_qp,ihevce_ed_blk_t * ps_layer1_buf,ihevce_ed_ctb_l1_t * ps_ed_ctb_l1,UWORD8 * pu1_me_reverse_map_info,WORD32 i4_temporal_layer_id)824*c83a76b0SSuyog Pawar void ihevce_coarse_me_frame_init(
825*c83a76b0SSuyog Pawar     void *pv_me_ctxt,
826*c83a76b0SSuyog Pawar     ihevce_static_cfg_params_t *ps_stat_prms,
827*c83a76b0SSuyog Pawar     frm_ctb_ctxt_t *ps_frm_ctb_prms,
828*c83a76b0SSuyog Pawar     frm_lambda_ctxt_t *ps_frm_lamda,
829*c83a76b0SSuyog Pawar     WORD32 num_ref_l0,
830*c83a76b0SSuyog Pawar     WORD32 num_ref_l1,
831*c83a76b0SSuyog Pawar     WORD32 num_ref_l0_active,
832*c83a76b0SSuyog Pawar     WORD32 num_ref_l1_active,
833*c83a76b0SSuyog Pawar     recon_pic_buf_t **pps_rec_list_l0,
834*c83a76b0SSuyog Pawar     recon_pic_buf_t **pps_rec_list_l1,
835*c83a76b0SSuyog Pawar     ihevce_lap_enc_buf_t *ps_enc_lap_inp,
836*c83a76b0SSuyog Pawar     WORD32 i4_frm_qp,
837*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_layer1_buf,  //EIID
838*c83a76b0SSuyog Pawar     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1,
839*c83a76b0SSuyog Pawar     UWORD8 *pu1_me_reverse_map_info,
840*c83a76b0SSuyog Pawar     WORD32 i4_temporal_layer_id)
841*c83a76b0SSuyog Pawar {
842*c83a76b0SSuyog Pawar     /* local variables */
843*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
844*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_ctxt;
845*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_thrd0_ctxt;
846*c83a76b0SSuyog Pawar     WORD32 inp_poc, num_ref;
847*c83a76b0SSuyog Pawar     WORD32 i;
848*c83a76b0SSuyog Pawar 
849*c83a76b0SSuyog Pawar     /* Input POC is derived from input buffer */
850*c83a76b0SSuyog Pawar     inp_poc = ps_enc_lap_inp->s_lap_out.i4_poc;
851*c83a76b0SSuyog Pawar     num_ref = num_ref_l0 + num_ref_l1;
852*c83a76b0SSuyog Pawar 
853*c83a76b0SSuyog Pawar     /* All processing done using shared / common memory across */
854*c83a76b0SSuyog Pawar     /* threads is done using thrd 0 ctxt */
855*c83a76b0SSuyog Pawar     ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[0];
856*c83a76b0SSuyog Pawar 
857*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.u1_num_active_ref_l0 = num_ref_l0_active;
858*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.u1_num_active_ref_l1 = num_ref_l1_active;
859*c83a76b0SSuyog Pawar 
860*c83a76b0SSuyog Pawar     /* store the frm ctb ctxt to all the thrd ctxt */
861*c83a76b0SSuyog Pawar     {
862*c83a76b0SSuyog Pawar         WORD32 num_thrds;
863*c83a76b0SSuyog Pawar 
864*c83a76b0SSuyog Pawar         /* initialise the parameters for all the threads */
865*c83a76b0SSuyog Pawar         for(num_thrds = 0; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
866*c83a76b0SSuyog Pawar         {
867*c83a76b0SSuyog Pawar             ps_ctxt = ps_master_ctxt->aps_me_ctxt[num_thrds];
868*c83a76b0SSuyog Pawar             ps_ctxt->pv_ext_frm_prms = (void *)ps_frm_ctb_prms;
869*c83a76b0SSuyog Pawar             /*EIID: early decision buffer pointer */
870*c83a76b0SSuyog Pawar             ps_ctxt->ps_ed_blk = ps_layer1_buf;
871*c83a76b0SSuyog Pawar             ps_ctxt->ps_ed_ctb_l1 = ps_ed_ctb_l1;
872*c83a76b0SSuyog Pawar 
873*c83a76b0SSuyog Pawar             /* weighted pred enable flag */
874*c83a76b0SSuyog Pawar             ps_ctxt->i4_wt_pred_enable_flag = ps_enc_lap_inp->s_lap_out.i1_weighted_pred_flag |
875*c83a76b0SSuyog Pawar                                               ps_enc_lap_inp->s_lap_out.i1_weighted_bipred_flag;
876*c83a76b0SSuyog Pawar 
877*c83a76b0SSuyog Pawar             if(1 == ps_ctxt->i4_wt_pred_enable_flag)
878*c83a76b0SSuyog Pawar             {
879*c83a76b0SSuyog Pawar                 /* log2 weight denom  */
880*c83a76b0SSuyog Pawar                 ps_ctxt->s_wt_pred.wpred_log_wdc =
881*c83a76b0SSuyog Pawar                     ps_enc_lap_inp->s_lap_out.i4_log2_luma_wght_denom;
882*c83a76b0SSuyog Pawar             }
883*c83a76b0SSuyog Pawar             else
884*c83a76b0SSuyog Pawar             {
885*c83a76b0SSuyog Pawar                 /* default value */
886*c83a76b0SSuyog Pawar                 ps_ctxt->s_wt_pred.wpred_log_wdc = DENOM_DEFAULT;
887*c83a76b0SSuyog Pawar             }
888*c83a76b0SSuyog Pawar             ps_ctxt->i4_L1_hme_best_cost = 0;
889*c83a76b0SSuyog Pawar             ps_ctxt->i4_L1_hme_sad = 0;
890*c83a76b0SSuyog Pawar             ps_ctxt->i4_num_blks_high_sad = 0;
891*c83a76b0SSuyog Pawar             ps_ctxt->i4_num_blks = 0;
892*c83a76b0SSuyog Pawar 
893*c83a76b0SSuyog Pawar             ps_ctxt->pv_me_optimised_function_list = ps_master_ctxt->pv_me_optimised_function_list;
894*c83a76b0SSuyog Pawar             ps_ctxt->ps_cmn_utils_optimised_function_list = &ps_master_ctxt->s_cmn_opt_func;
895*c83a76b0SSuyog Pawar         }
896*c83a76b0SSuyog Pawar     }
897*c83a76b0SSuyog Pawar     /* Create the reference map for ME */
898*c83a76b0SSuyog Pawar     ihevce_me_create_ref_map(
899*c83a76b0SSuyog Pawar         pps_rec_list_l0,
900*c83a76b0SSuyog Pawar         pps_rec_list_l1,
901*c83a76b0SSuyog Pawar         num_ref_l0_active,
902*c83a76b0SSuyog Pawar         num_ref_l1_active,
903*c83a76b0SSuyog Pawar         num_ref,
904*c83a76b0SSuyog Pawar         &ps_master_ctxt->s_ref_map);
905*c83a76b0SSuyog Pawar     /*************************************************************************/
906*c83a76b0SSuyog Pawar     /* Call the ME frame level processing for further actiion.               */
907*c83a76b0SSuyog Pawar     /* ToDo: Support Row Level API.                                          */
908*c83a76b0SSuyog Pawar     /*************************************************************************/
909*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.i2_mv_range_x = ps_thrd0_ctxt->s_init_prms.max_horz_search_range;
910*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.i2_mv_range_y = ps_thrd0_ctxt->s_init_prms.max_vert_search_range;
911*c83a76b0SSuyog Pawar 
912*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.is_i_pic = 0;
913*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.i4_temporal_layer_id = i4_temporal_layer_id;
914*c83a76b0SSuyog Pawar 
915*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.is_pic_second_field =
916*c83a76b0SSuyog Pawar         (!(ps_enc_lap_inp->s_input_buf.i4_bottom_field ^
917*c83a76b0SSuyog Pawar            ps_enc_lap_inp->s_input_buf.i4_topfield_first));
918*c83a76b0SSuyog Pawar     {
919*c83a76b0SSuyog Pawar         S32 pic_type = ps_enc_lap_inp->s_lap_out.i4_pic_type;
920*c83a76b0SSuyog Pawar 
921*c83a76b0SSuyog Pawar         /*********************************************************************/
922*c83a76b0SSuyog Pawar         /* For I Pic, we do not call update fn at ctb level, instead we do   */
923*c83a76b0SSuyog Pawar         /* one shot update for entire picture.                               */
924*c83a76b0SSuyog Pawar         /*********************************************************************/
925*c83a76b0SSuyog Pawar         if((pic_type == IV_I_FRAME) || (pic_type == IV_II_FRAME) || (pic_type == IV_IDR_FRAME))
926*c83a76b0SSuyog Pawar         {
927*c83a76b0SSuyog Pawar             ps_master_ctxt->s_frm_prms.is_i_pic = 1;
928*c83a76b0SSuyog Pawar             ps_master_ctxt->s_frm_prms.bidir_enabled = 0;
929*c83a76b0SSuyog Pawar         }
930*c83a76b0SSuyog Pawar         else if((pic_type == IV_P_FRAME) || (pic_type == IV_PP_FRAME))
931*c83a76b0SSuyog Pawar         {
932*c83a76b0SSuyog Pawar             ps_master_ctxt->s_frm_prms.bidir_enabled = 0;
933*c83a76b0SSuyog Pawar         }
934*c83a76b0SSuyog Pawar         else if((pic_type == IV_B_FRAME) || (pic_type == IV_BB_FRAME))
935*c83a76b0SSuyog Pawar         {
936*c83a76b0SSuyog Pawar             ps_master_ctxt->s_frm_prms.bidir_enabled = 1;
937*c83a76b0SSuyog Pawar         }
938*c83a76b0SSuyog Pawar         else
939*c83a76b0SSuyog Pawar         {
940*c83a76b0SSuyog Pawar             /* not sure whether we need to handle mixed frames like IP, */
941*c83a76b0SSuyog Pawar             /* they should ideally come as single field. */
942*c83a76b0SSuyog Pawar             /* TODO : resolve thsi ambiguity */
943*c83a76b0SSuyog Pawar             ASSERT(0);
944*c83a76b0SSuyog Pawar         }
945*c83a76b0SSuyog Pawar     }
946*c83a76b0SSuyog Pawar     /************************************************************************/
947*c83a76b0SSuyog Pawar     /* Lambda calculations moved outside ME and to one place, so as to have */
948*c83a76b0SSuyog Pawar     /* consistent lambda across ME, IPE, CL RDOPT etc                       */
949*c83a76b0SSuyog Pawar     /************************************************************************/
950*c83a76b0SSuyog Pawar 
951*c83a76b0SSuyog Pawar     {
952*c83a76b0SSuyog Pawar #define CLIP3_F(min, max, val) (((val) < (min)) ? (min) : (((val) > (max)) ? (max) : (val)))
953*c83a76b0SSuyog Pawar         double q_steps[6] = { 0.625, 0.703, 0.79, 0.889, 1.0, 1.125 };
954*c83a76b0SSuyog Pawar         double d_b_pic_factor;
955*c83a76b0SSuyog Pawar         double d_q_factor;
956*c83a76b0SSuyog Pawar         //double d_lambda;
957*c83a76b0SSuyog Pawar         UWORD8 u1_temp_hier = ps_enc_lap_inp->s_lap_out.i4_temporal_lyr_id;
958*c83a76b0SSuyog Pawar 
959*c83a76b0SSuyog Pawar         if(u1_temp_hier)
960*c83a76b0SSuyog Pawar         {
961*c83a76b0SSuyog Pawar             d_b_pic_factor = CLIP3_F(2.0, 4.0, (i4_frm_qp - 12.0) / 6.0);
962*c83a76b0SSuyog Pawar         }
963*c83a76b0SSuyog Pawar         else
964*c83a76b0SSuyog Pawar             d_b_pic_factor = 1.0;
965*c83a76b0SSuyog Pawar 
966*c83a76b0SSuyog Pawar         d_q_factor = (1 << (i4_frm_qp / 6)) * q_steps[i4_frm_qp % 6];
967*c83a76b0SSuyog Pawar         ps_master_ctxt->s_frm_prms.qstep = (WORD32)d_q_factor;
968*c83a76b0SSuyog Pawar         ps_master_ctxt->s_frm_prms.i4_frame_qp = i4_frm_qp;
969*c83a76b0SSuyog Pawar     }
970*c83a76b0SSuyog Pawar 
971*c83a76b0SSuyog Pawar     /* HME Dependency Manager : Reset the num ctb processed in every row */
972*c83a76b0SSuyog Pawar     /* for ME sync in every layer                                        */
973*c83a76b0SSuyog Pawar     {
974*c83a76b0SSuyog Pawar         WORD32 ctr;
975*c83a76b0SSuyog Pawar         for(ctr = 1; ctr < ps_thrd0_ctxt->num_layers; ctr++)
976*c83a76b0SSuyog Pawar         {
977*c83a76b0SSuyog Pawar             void *pv_dep_mngr_state;
978*c83a76b0SSuyog Pawar             pv_dep_mngr_state = ps_master_ctxt->apv_dep_mngr_hme_sync[ctr - 1];
979*c83a76b0SSuyog Pawar 
980*c83a76b0SSuyog Pawar             ihevce_dmgr_rst_row_row_sync(pv_dep_mngr_state);
981*c83a76b0SSuyog Pawar         }
982*c83a76b0SSuyog Pawar     }
983*c83a76b0SSuyog Pawar 
984*c83a76b0SSuyog Pawar     /* Frame level init of all threads of ME */
985*c83a76b0SSuyog Pawar     {
986*c83a76b0SSuyog Pawar         WORD32 num_thrds;
987*c83a76b0SSuyog Pawar 
988*c83a76b0SSuyog Pawar         /* initialise the parameters for all the threads */
989*c83a76b0SSuyog Pawar         for(num_thrds = 0; num_thrds < ps_master_ctxt->i4_num_proc_thrds; num_thrds++)
990*c83a76b0SSuyog Pawar         {
991*c83a76b0SSuyog Pawar             ps_ctxt = ps_master_ctxt->aps_me_ctxt[num_thrds];
992*c83a76b0SSuyog Pawar 
993*c83a76b0SSuyog Pawar             hme_coarse_process_frm_init(
994*c83a76b0SSuyog Pawar                 (void *)ps_ctxt, ps_ctxt->ps_hme_ref_map, ps_ctxt->ps_hme_frm_prms);
995*c83a76b0SSuyog Pawar         }
996*c83a76b0SSuyog Pawar     }
997*c83a76b0SSuyog Pawar 
998*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.i4_cl_sad_lambda_qf = ps_frm_lamda->i4_cl_sad_lambda_qf;
999*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.i4_cl_satd_lambda_qf = ps_frm_lamda->i4_cl_satd_lambda_qf;
1000*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.i4_ol_sad_lambda_qf = ps_frm_lamda->i4_ol_sad_lambda_qf;
1001*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.i4_ol_satd_lambda_qf = ps_frm_lamda->i4_ol_satd_lambda_qf;
1002*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.lambda_q_shift = LAMBDA_Q_SHIFT;
1003*c83a76b0SSuyog Pawar 
1004*c83a76b0SSuyog Pawar     ps_master_ctxt->s_frm_prms.pf_interp_fxn = NULL;
1005*c83a76b0SSuyog Pawar 
1006*c83a76b0SSuyog Pawar     /*************************************************************************/
1007*c83a76b0SSuyog Pawar     /* If num ref is 0, that means that it has to be coded as I. Do nothing  */
1008*c83a76b0SSuyog Pawar     /* However mv bank update needs to happen with "intra" mv.               */
1009*c83a76b0SSuyog Pawar     /*************************************************************************/
1010*c83a76b0SSuyog Pawar     if(ps_master_ctxt->s_ref_map.i4_num_ref == 0 || ps_master_ctxt->s_frm_prms.is_i_pic)
1011*c83a76b0SSuyog Pawar     {
1012*c83a76b0SSuyog Pawar         for(i = 1; i < ps_thrd0_ctxt->num_layers; i++)
1013*c83a76b0SSuyog Pawar         {
1014*c83a76b0SSuyog Pawar             layer_ctxt_t *ps_layer_ctxt = ps_thrd0_ctxt->ps_curr_descr->aps_layers[i];
1015*c83a76b0SSuyog Pawar             BLK_SIZE_T e_blk_size;
1016*c83a76b0SSuyog Pawar             S32 use_4x4;
1017*c83a76b0SSuyog Pawar 
1018*c83a76b0SSuyog Pawar             /* The mv bank is filled with "intra" mv */
1019*c83a76b0SSuyog Pawar             use_4x4 = hme_get_mv_blk_size(
1020*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->s_init_prms.use_4x4,
1021*c83a76b0SSuyog Pawar                 i,
1022*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->num_layers,
1023*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->u1_encode[i]);
1024*c83a76b0SSuyog Pawar             e_blk_size = use_4x4 ? BLK_4x4 : BLK_8x8;
1025*c83a76b0SSuyog Pawar             hme_init_mv_bank(ps_layer_ctxt, e_blk_size, 2, 1, ps_ctxt->u1_encode[i]);
1026*c83a76b0SSuyog Pawar             hme_fill_mvbank_intra(ps_layer_ctxt);
1027*c83a76b0SSuyog Pawar 
1028*c83a76b0SSuyog Pawar             /* Clear out the global mvs */
1029*c83a76b0SSuyog Pawar             memset(
1030*c83a76b0SSuyog Pawar                 ps_layer_ctxt->s_global_mv,
1031*c83a76b0SSuyog Pawar                 0,
1032*c83a76b0SSuyog Pawar                 sizeof(hme_mv_t) * ps_thrd0_ctxt->max_num_ref * NUM_GMV_LOBES);
1033*c83a76b0SSuyog Pawar         }
1034*c83a76b0SSuyog Pawar 
1035*c83a76b0SSuyog Pawar         return;
1036*c83a76b0SSuyog Pawar     }
1037*c83a76b0SSuyog Pawar 
1038*c83a76b0SSuyog Pawar     /*************************************************************************/
1039*c83a76b0SSuyog Pawar     /* Coarse & refine Layer frm init (layer mem is common across thrds)     */
1040*c83a76b0SSuyog Pawar     /*************************************************************************/
1041*c83a76b0SSuyog Pawar     {
1042*c83a76b0SSuyog Pawar         coarse_prms_t s_coarse_prms;
1043*c83a76b0SSuyog Pawar         refine_prms_t s_refine_prms;
1044*c83a76b0SSuyog Pawar         S16 i2_max;
1045*c83a76b0SSuyog Pawar         S32 layer_id;
1046*c83a76b0SSuyog Pawar 
1047*c83a76b0SSuyog Pawar         layer_id = ps_thrd0_ctxt->num_layers - 1;
1048*c83a76b0SSuyog Pawar         i2_max = ps_thrd0_ctxt->ps_curr_descr->aps_layers[layer_id]->i2_max_mv_x;
1049*c83a76b0SSuyog Pawar         i2_max = MAX(i2_max, ps_thrd0_ctxt->ps_curr_descr->aps_layers[layer_id]->i2_max_mv_y);
1050*c83a76b0SSuyog Pawar         s_coarse_prms.i4_layer_id = layer_id;
1051*c83a76b0SSuyog Pawar 
1052*c83a76b0SSuyog Pawar         {
1053*c83a76b0SSuyog Pawar             S32 log_start_step;
1054*c83a76b0SSuyog Pawar             /* Based on Preset, set the starting step size for Refinement */
1055*c83a76b0SSuyog Pawar             if(ME_MEDIUM_SPEED > ps_ctxt->s_init_prms.s_me_coding_tools.e_me_quality_presets)
1056*c83a76b0SSuyog Pawar             {
1057*c83a76b0SSuyog Pawar                 log_start_step = 0;
1058*c83a76b0SSuyog Pawar             }
1059*c83a76b0SSuyog Pawar             else
1060*c83a76b0SSuyog Pawar             {
1061*c83a76b0SSuyog Pawar                 log_start_step = 1;
1062*c83a76b0SSuyog Pawar             }
1063*c83a76b0SSuyog Pawar             s_coarse_prms.i4_max_iters = i2_max >> log_start_step;
1064*c83a76b0SSuyog Pawar             s_coarse_prms.i4_start_step = 1 << log_start_step;
1065*c83a76b0SSuyog Pawar         }
1066*c83a76b0SSuyog Pawar         s_coarse_prms.i4_num_ref = ps_master_ctxt->s_ref_map.i4_num_ref;
1067*c83a76b0SSuyog Pawar         s_coarse_prms.do_full_search = 1;
1068*c83a76b0SSuyog Pawar         s_coarse_prms.num_results = ps_thrd0_ctxt->max_num_results_coarse;
1069*c83a76b0SSuyog Pawar 
1070*c83a76b0SSuyog Pawar         hme_coarse_frm_init(ps_thrd0_ctxt, &s_coarse_prms);
1071*c83a76b0SSuyog Pawar 
1072*c83a76b0SSuyog Pawar         layer_id--;
1073*c83a76b0SSuyog Pawar 
1074*c83a76b0SSuyog Pawar         /*************************************************************************/
1075*c83a76b0SSuyog Pawar         /* This loop will run for all refine layers (non- encode layers)          */
1076*c83a76b0SSuyog Pawar         /*************************************************************************/
1077*c83a76b0SSuyog Pawar         while(layer_id > 0)
1078*c83a76b0SSuyog Pawar         {
1079*c83a76b0SSuyog Pawar             layer_ctxt_t *ps_curr_layer;
1080*c83a76b0SSuyog Pawar             layer_ctxt_t *ps_coarse_layer;
1081*c83a76b0SSuyog Pawar 
1082*c83a76b0SSuyog Pawar             ps_coarse_layer = ps_thrd0_ctxt->ps_curr_descr->aps_layers[layer_id + 1];
1083*c83a76b0SSuyog Pawar 
1084*c83a76b0SSuyog Pawar             ps_curr_layer = ps_thrd0_ctxt->ps_curr_descr->aps_layers[layer_id];
1085*c83a76b0SSuyog Pawar 
1086*c83a76b0SSuyog Pawar             hme_set_refine_prms(
1087*c83a76b0SSuyog Pawar                 &s_refine_prms,
1088*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->u1_encode[layer_id],
1089*c83a76b0SSuyog Pawar                 ps_master_ctxt->s_ref_map.i4_num_ref,
1090*c83a76b0SSuyog Pawar                 layer_id,
1091*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->num_layers,
1092*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->num_layers_explicit_search,
1093*c83a76b0SSuyog Pawar                 ps_thrd0_ctxt->s_init_prms.use_4x4,
1094*c83a76b0SSuyog Pawar                 &ps_master_ctxt->s_frm_prms,
1095*c83a76b0SSuyog Pawar                 NULL,
1096*c83a76b0SSuyog Pawar                 &ps_thrd0_ctxt->s_init_prms.s_me_coding_tools);
1097*c83a76b0SSuyog Pawar 
1098*c83a76b0SSuyog Pawar             hme_refine_frm_init(ps_curr_layer, &s_refine_prms, ps_coarse_layer);
1099*c83a76b0SSuyog Pawar 
1100*c83a76b0SSuyog Pawar             layer_id--;
1101*c83a76b0SSuyog Pawar         }
1102*c83a76b0SSuyog Pawar     }
1103*c83a76b0SSuyog Pawar 
1104*c83a76b0SSuyog Pawar     return;
1105*c83a76b0SSuyog Pawar }
1106*c83a76b0SSuyog Pawar 
1107*c83a76b0SSuyog Pawar /*!
1108*c83a76b0SSuyog Pawar ******************************************************************************
1109*c83a76b0SSuyog Pawar * \if Function name : ihevce_decomp_pre_intra_frame_init \endif
1110*c83a76b0SSuyog Pawar *
1111*c83a76b0SSuyog Pawar * \brief
1112*c83a76b0SSuyog Pawar *    Frame Intialization for Decomp intra pre analysis.
1113*c83a76b0SSuyog Pawar *
1114*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to module ctxt
1115*c83a76b0SSuyog Pawar * \param[in] ppu1_decomp_lyr_bufs : pointer to array of layer buffer pointers
1116*c83a76b0SSuyog Pawar * \param[in] pi4_lyr_buf_stride : pointer to array of layer buffer strides
1117*c83a76b0SSuyog Pawar *
1118*c83a76b0SSuyog Pawar * \return
1119*c83a76b0SSuyog Pawar *    None
1120*c83a76b0SSuyog Pawar *
1121*c83a76b0SSuyog Pawar * \author
1122*c83a76b0SSuyog Pawar *  Ittiam
1123*c83a76b0SSuyog Pawar *
1124*c83a76b0SSuyog Pawar *****************************************************************************
1125*c83a76b0SSuyog Pawar */
ihevce_coarse_me_get_lyr_buf_desc(void * pv_me_ctxt,UWORD8 ** ppu1_decomp_lyr_bufs,WORD32 * pi4_lyr_buf_stride)1126*c83a76b0SSuyog Pawar WORD32 ihevce_coarse_me_get_lyr_buf_desc(
1127*c83a76b0SSuyog Pawar     void *pv_me_ctxt, UWORD8 **ppu1_decomp_lyr_bufs, WORD32 *pi4_lyr_buf_stride)
1128*c83a76b0SSuyog Pawar {
1129*c83a76b0SSuyog Pawar     /* local variables */
1130*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
1131*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_thrd0_ctxt;
1132*c83a76b0SSuyog Pawar     WORD32 lyr_no;
1133*c83a76b0SSuyog Pawar     layers_descr_t *ps_curr_descr;
1134*c83a76b0SSuyog Pawar     WORD32 i4_free_idx;
1135*c83a76b0SSuyog Pawar 
1136*c83a76b0SSuyog Pawar     /* All processing done using shared / common memory across */
1137*c83a76b0SSuyog Pawar     /* threads is done using thrd0  ctxt */
1138*c83a76b0SSuyog Pawar     ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[0];
1139*c83a76b0SSuyog Pawar 
1140*c83a76b0SSuyog Pawar     /* Obtain an empty layer descriptor */
1141*c83a76b0SSuyog Pawar     i4_free_idx = hme_coarse_find_free_descr_idx((void *)ps_thrd0_ctxt);
1142*c83a76b0SSuyog Pawar 
1143*c83a76b0SSuyog Pawar     ps_curr_descr = &ps_thrd0_ctxt->as_ref_descr[i4_free_idx];
1144*c83a76b0SSuyog Pawar 
1145*c83a76b0SSuyog Pawar     /* export all the layer buffers except Layer 0 (encode layer) */
1146*c83a76b0SSuyog Pawar     for(lyr_no = 1; lyr_no < ps_thrd0_ctxt->num_layers; lyr_no++)
1147*c83a76b0SSuyog Pawar     {
1148*c83a76b0SSuyog Pawar         pi4_lyr_buf_stride[lyr_no - 1] = ps_curr_descr->aps_layers[lyr_no]->i4_inp_stride;
1149*c83a76b0SSuyog Pawar         ppu1_decomp_lyr_bufs[lyr_no - 1] = ps_curr_descr->aps_layers[lyr_no]->pu1_inp;
1150*c83a76b0SSuyog Pawar     }
1151*c83a76b0SSuyog Pawar 
1152*c83a76b0SSuyog Pawar     return (i4_free_idx);
1153*c83a76b0SSuyog Pawar }
1154*c83a76b0SSuyog Pawar 
1155*c83a76b0SSuyog Pawar /*!
1156*c83a76b0SSuyog Pawar ******************************************************************************
1157*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_get_lyr_prms_job_que \endif
1158*c83a76b0SSuyog Pawar *
1159*c83a76b0SSuyog Pawar * \brief Returns to the caller key attributes related to dependency between layers
1160*c83a76b0SSuyog Pawar *          for multi-thread execution
1161*c83a76b0SSuyog Pawar *
1162*c83a76b0SSuyog Pawar *
1163*c83a76b0SSuyog Pawar * \par Description:
1164*c83a76b0SSuyog Pawar *    This function requires the precondition that the width and ht of encode
1165*c83a76b0SSuyog Pawar *    layer is known, and ME API ihevce_me_set_resolution() API called with
1166*c83a76b0SSuyog Pawar *    this info. Based on this, ME populates useful information for the encoder
1167*c83a76b0SSuyog Pawar *    to execute the multi-thread (concurrent across layers) in this API.
1168*c83a76b0SSuyog Pawar *    The number of layers, number of vertical units in each layer, and for
1169*c83a76b0SSuyog Pawar *    each vertial unit in each layer, its dependency on previous layer's units
1170*c83a76b0SSuyog Pawar *    From ME's perspective, a vertical unit is one which is smallest min size
1171*c83a76b0SSuyog Pawar *    vertically (and spans the entire row horizontally). This is CTB for encode
1172*c83a76b0SSuyog Pawar *    layer, and 8x8 / 4x4 for non encode layers.
1173*c83a76b0SSuyog Pawar *
1174*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : ME handle
1175*c83a76b0SSuyog Pawar * \param[in] ps_curr_inp : Input buffer descriptor
1176*c83a76b0SSuyog Pawar * \param[out] pi4_num_hme_lyrs : Num of HME layers (ME updates)
1177*c83a76b0SSuyog Pawar * \param[out] pi4_num_vert_units_in_lyr : Array of size N (num layers), each
1178*c83a76b0SSuyog Pawar *                     entry has num vertical units in that particular layer
1179*c83a76b0SSuyog Pawar * \param[in] ps_me_job_q_prms : Array of job queue prms, one for each unit in a
1180*c83a76b0SSuyog Pawar *                 layer. Note that this is contiguous in order of processing
1181*c83a76b0SSuyog Pawar *                 All k units of layer N-1 from top to bottom, followed by
1182*c83a76b0SSuyog Pawar *                 all m units of layer N-2 .... ends with X units of layer 0
1183*c83a76b0SSuyog Pawar *
1184*c83a76b0SSuyog Pawar * \return
1185*c83a76b0SSuyog Pawar *    None
1186*c83a76b0SSuyog Pawar *
1187*c83a76b0SSuyog Pawar * \author
1188*c83a76b0SSuyog Pawar *  Ittiam
1189*c83a76b0SSuyog Pawar *
1190*c83a76b0SSuyog Pawar *****************************************************************************
1191*c83a76b0SSuyog Pawar */
ihevce_coarse_me_get_lyr_prms_job_que(void * pv_me_ctxt,ihevce_lap_enc_buf_t * ps_curr_inp,WORD32 * pi4_num_hme_lyrs,WORD32 * pi4_num_vert_units_in_lyr,multi_thrd_me_job_q_prms_t * ps_me_job_q_prms)1192*c83a76b0SSuyog Pawar void ihevce_coarse_me_get_lyr_prms_job_que(
1193*c83a76b0SSuyog Pawar     void *pv_me_ctxt,
1194*c83a76b0SSuyog Pawar     ihevce_lap_enc_buf_t *ps_curr_inp,
1195*c83a76b0SSuyog Pawar     WORD32 *pi4_num_hme_lyrs,
1196*c83a76b0SSuyog Pawar     WORD32 *pi4_num_vert_units_in_lyr,
1197*c83a76b0SSuyog Pawar     multi_thrd_me_job_q_prms_t *ps_me_job_q_prms)
1198*c83a76b0SSuyog Pawar {
1199*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_ctxt;
1200*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
1201*c83a76b0SSuyog Pawar 
1202*c83a76b0SSuyog Pawar     /* These arrays and ptrs track input dependencies for units of a layer */
1203*c83a76b0SSuyog Pawar     /* This is a ping poing design, while using one part, we update other part */
1204*c83a76b0SSuyog Pawar     U08 au1_inp_dep[2][MAX_NUM_VERT_UNITS_FRM];
1205*c83a76b0SSuyog Pawar     U08 *pu1_inp_dep_c, *pu1_inp_dep_n;
1206*c83a76b0SSuyog Pawar 
1207*c83a76b0SSuyog Pawar     /* Height of current and next layers */
1208*c83a76b0SSuyog Pawar     S32 ht_c, ht_n;
1209*c83a76b0SSuyog Pawar 
1210*c83a76b0SSuyog Pawar     /* Blk ht at a given layer and next layer*/
1211*c83a76b0SSuyog Pawar     S32 unit_ht_c, unit_ht_n, blk_ht_c, blk_ht_n;
1212*c83a76b0SSuyog Pawar 
1213*c83a76b0SSuyog Pawar     /* Number of vertical units in current and next layer */
1214*c83a76b0SSuyog Pawar     S32 num_vert_c, num_vert_n;
1215*c83a76b0SSuyog Pawar 
1216*c83a76b0SSuyog Pawar     S32 ctb_size = 64, num_layers, i, j, k;
1217*c83a76b0SSuyog Pawar 
1218*c83a76b0SSuyog Pawar     /* since same layer desc pointer is stored in all thread ctxt */
1219*c83a76b0SSuyog Pawar     /* a free idx is obtained using 0th thread ctxt pointer */
1220*c83a76b0SSuyog Pawar     ps_ctxt = ps_master_ctxt->aps_me_ctxt[0];
1221*c83a76b0SSuyog Pawar 
1222*c83a76b0SSuyog Pawar     /* Set the number of layers */
1223*c83a76b0SSuyog Pawar     num_layers = ps_ctxt->num_layers;
1224*c83a76b0SSuyog Pawar     *pi4_num_hme_lyrs = num_layers;
1225*c83a76b0SSuyog Pawar 
1226*c83a76b0SSuyog Pawar     pu1_inp_dep_c = &au1_inp_dep[0][0];
1227*c83a76b0SSuyog Pawar     pu1_inp_dep_n = &au1_inp_dep[1][0];
1228*c83a76b0SSuyog Pawar 
1229*c83a76b0SSuyog Pawar     ASSERT(num_layers >= 2);
1230*c83a76b0SSuyog Pawar 
1231*c83a76b0SSuyog Pawar     ht_n = ps_ctxt->a_ht[num_layers - 2];
1232*c83a76b0SSuyog Pawar     ht_c = ps_ctxt->a_ht[num_layers - 1];
1233*c83a76b0SSuyog Pawar 
1234*c83a76b0SSuyog Pawar     /* compute blk ht and unit ht for c and n */
1235*c83a76b0SSuyog Pawar     if(ps_ctxt->u1_encode[num_layers - 1])
1236*c83a76b0SSuyog Pawar     {
1237*c83a76b0SSuyog Pawar         blk_ht_c = 16;
1238*c83a76b0SSuyog Pawar         unit_ht_c = ctb_size;
1239*c83a76b0SSuyog Pawar     }
1240*c83a76b0SSuyog Pawar     else
1241*c83a76b0SSuyog Pawar     {
1242*c83a76b0SSuyog Pawar         blk_ht_c = hme_get_blk_size(ps_ctxt->s_init_prms.use_4x4, num_layers - 1, num_layers, 0);
1243*c83a76b0SSuyog Pawar         unit_ht_c = blk_ht_c;
1244*c83a76b0SSuyog Pawar     }
1245*c83a76b0SSuyog Pawar 
1246*c83a76b0SSuyog Pawar     num_vert_c = (ht_c + unit_ht_c - 1) / unit_ht_c;
1247*c83a76b0SSuyog Pawar 
1248*c83a76b0SSuyog Pawar     /* For new design in Coarsest HME layer we need */
1249*c83a76b0SSuyog Pawar     /* one additional row extra at the end of frame */
1250*c83a76b0SSuyog Pawar     /* hence num_vert_c is incremented by 1         */
1251*c83a76b0SSuyog Pawar     num_vert_c++;
1252*c83a76b0SSuyog Pawar 
1253*c83a76b0SSuyog Pawar     /* Dummy initialization outside loop, not used first time */
1254*c83a76b0SSuyog Pawar     memset(pu1_inp_dep_c, 0, num_vert_c);
1255*c83a76b0SSuyog Pawar 
1256*c83a76b0SSuyog Pawar     /*************************************************************************/
1257*c83a76b0SSuyog Pawar     /* Run through each layer, set the number of vertical units and job queue*/
1258*c83a76b0SSuyog Pawar     /* attrs for each vert unit in the layer                                 */
1259*c83a76b0SSuyog Pawar     /*************************************************************************/
1260*c83a76b0SSuyog Pawar     for(i = num_layers - 1; i > 0; i--)
1261*c83a76b0SSuyog Pawar     {
1262*c83a76b0SSuyog Pawar         /* 0th entry is actually layer id num_layers - 1 */
1263*c83a76b0SSuyog Pawar         /* and entry num_layers-1 equals the biggest layer (id = 0) */
1264*c83a76b0SSuyog Pawar         pi4_num_vert_units_in_lyr[num_layers - 1 - i] = num_vert_c;
1265*c83a76b0SSuyog Pawar         /* "n" is computed for first time */
1266*c83a76b0SSuyog Pawar         ht_n = ps_ctxt->a_ht[i - 1];
1267*c83a76b0SSuyog Pawar         blk_ht_n = hme_get_blk_size(ps_ctxt->s_init_prms.use_4x4, i - 1, num_layers, 0);
1268*c83a76b0SSuyog Pawar         unit_ht_n = blk_ht_n;
1269*c83a76b0SSuyog Pawar         if(ps_ctxt->u1_encode[i - 1])
1270*c83a76b0SSuyog Pawar             unit_ht_n = ctb_size;
1271*c83a76b0SSuyog Pawar 
1272*c83a76b0SSuyog Pawar         num_vert_n = (ht_n + unit_ht_n - 1) / unit_ht_n;
1273*c83a76b0SSuyog Pawar         /* Initialize all units' inp dep in next layer to 0 */
1274*c83a76b0SSuyog Pawar         memset(pu1_inp_dep_n, 0, num_vert_n * sizeof(U08));
1275*c83a76b0SSuyog Pawar 
1276*c83a76b0SSuyog Pawar         /* Evaluate dependencies for this layer */
1277*c83a76b0SSuyog Pawar         for(j = 0; j < num_vert_c; j++)
1278*c83a76b0SSuyog Pawar         {
1279*c83a76b0SSuyog Pawar             S32 v1, v2;
1280*c83a76b0SSuyog Pawar 
1281*c83a76b0SSuyog Pawar             /* Output dependencies. When one unit in current layer finishes, */
1282*c83a76b0SSuyog Pawar             /* how many in the next layer it affects?. Assuming that the top */
1283*c83a76b0SSuyog Pawar             /* of this vertical unit and bottom of this vertical unit project*/
1284*c83a76b0SSuyog Pawar             /* somewhere in the next layer. The top of this vertical unit    */
1285*c83a76b0SSuyog Pawar             /* becomes the bottom right point for somebody, and the bottom of*/
1286*c83a76b0SSuyog Pawar             /* this vertical unit becomes the colocated pt for somebody, this*/
1287*c83a76b0SSuyog Pawar             /* is the extremum.                                              */
1288*c83a76b0SSuyog Pawar 
1289*c83a76b0SSuyog Pawar             /* for the initial unit affected by j in "c" layer, take j-1th   */
1290*c83a76b0SSuyog Pawar             /* unit top and project it.                                      */
1291*c83a76b0SSuyog Pawar             v1 = (j - 1) * unit_ht_c * ht_n;
1292*c83a76b0SSuyog Pawar             v1 /= (ht_c * unit_ht_n);
1293*c83a76b0SSuyog Pawar             v1 -= 1;
1294*c83a76b0SSuyog Pawar 
1295*c83a76b0SSuyog Pawar             /* for the final unit affected by j in "c" layer, take jth unit  */
1296*c83a76b0SSuyog Pawar             /* bottom and project it.                                        */
1297*c83a76b0SSuyog Pawar 
1298*c83a76b0SSuyog Pawar             v2 = (j + 1) * unit_ht_c * ht_n;
1299*c83a76b0SSuyog Pawar             v2 /= (ht_c * unit_ht_n);
1300*c83a76b0SSuyog Pawar             v2 += 1;
1301*c83a76b0SSuyog Pawar 
1302*c83a76b0SSuyog Pawar             /* Clip to be within valid limits */
1303*c83a76b0SSuyog Pawar             v1 = HME_CLIP(v1, 0, (num_vert_n - 1));
1304*c83a76b0SSuyog Pawar             v2 = HME_CLIP(v2, 0, (num_vert_n - 1));
1305*c83a76b0SSuyog Pawar 
1306*c83a76b0SSuyog Pawar             /* In the layer "n", units starting at offset v1, and upto v2 are*/
1307*c83a76b0SSuyog Pawar             /* dependent on unit j of layer "c". So for each of these units  */
1308*c83a76b0SSuyog Pawar             /* increment the dependency by 1 corresponding to "jth" unit in  */
1309*c83a76b0SSuyog Pawar             /* layer "c"                                                     */
1310*c83a76b0SSuyog Pawar             ps_me_job_q_prms->i4_num_output_dep = v2 - v1 + 1;
1311*c83a76b0SSuyog Pawar             ASSERT(ps_me_job_q_prms->i4_num_output_dep <= MAX_OUT_DEP);
1312*c83a76b0SSuyog Pawar             for(k = v1; k <= v2; k++)
1313*c83a76b0SSuyog Pawar                 pu1_inp_dep_n[k]++;
1314*c83a76b0SSuyog Pawar 
1315*c83a76b0SSuyog Pawar             /* Input dependency would have been calculated in prev run */
1316*c83a76b0SSuyog Pawar             ps_me_job_q_prms->i4_num_inp_dep = pu1_inp_dep_c[j];
1317*c83a76b0SSuyog Pawar             ASSERT(ps_me_job_q_prms->i4_num_inp_dep <= MAX_OUT_DEP);
1318*c83a76b0SSuyog Pawar 
1319*c83a76b0SSuyog Pawar             /* Offsets */
1320*c83a76b0SSuyog Pawar             for(k = v1; k <= v2; k++)
1321*c83a76b0SSuyog Pawar                 ps_me_job_q_prms->ai4_out_dep_unit_off[k - v1] = k;
1322*c83a76b0SSuyog Pawar 
1323*c83a76b0SSuyog Pawar             ps_me_job_q_prms++;
1324*c83a76b0SSuyog Pawar         }
1325*c83a76b0SSuyog Pawar 
1326*c83a76b0SSuyog Pawar         /* Compute the blk size and vert unit size in each layer             */
1327*c83a76b0SSuyog Pawar         /* "c" denotes curr layer, and "n" denotes the layer to which result */
1328*c83a76b0SSuyog Pawar         /* is projected to                                                   */
1329*c83a76b0SSuyog Pawar         ht_c = ht_n;
1330*c83a76b0SSuyog Pawar         blk_ht_c = blk_ht_n;
1331*c83a76b0SSuyog Pawar         unit_ht_c = unit_ht_n;
1332*c83a76b0SSuyog Pawar         num_vert_c = num_vert_n;
1333*c83a76b0SSuyog Pawar 
1334*c83a76b0SSuyog Pawar         /* Input dep count for next layer was computed this iteration. */
1335*c83a76b0SSuyog Pawar         /* Swap so that p_inp_dep_n becomes current for next iteration, */
1336*c83a76b0SSuyog Pawar         /* and p_inp_dep_c will become update area during next iteration */
1337*c83a76b0SSuyog Pawar         /* for next to next.                                             */
1338*c83a76b0SSuyog Pawar         {
1339*c83a76b0SSuyog Pawar             U08 *pu1_tmp = pu1_inp_dep_n;
1340*c83a76b0SSuyog Pawar             pu1_inp_dep_n = pu1_inp_dep_c;
1341*c83a76b0SSuyog Pawar             pu1_inp_dep_c = pu1_tmp;
1342*c83a76b0SSuyog Pawar         }
1343*c83a76b0SSuyog Pawar     }
1344*c83a76b0SSuyog Pawar 
1345*c83a76b0SSuyog Pawar     /* LAYER 0 OR ENCODE LAYER UPDATE : NO OUTPUT DEPS */
1346*c83a76b0SSuyog Pawar 
1347*c83a76b0SSuyog Pawar     /* set the numebr of vertical units */
1348*c83a76b0SSuyog Pawar     pi4_num_vert_units_in_lyr[num_layers - 1] = num_vert_c;
1349*c83a76b0SSuyog Pawar     for(j = 0; j < num_vert_c; j++)
1350*c83a76b0SSuyog Pawar     {
1351*c83a76b0SSuyog Pawar         /* Here there is no output dependency for ME. However this data is used for encode, */
1352*c83a76b0SSuyog Pawar         /* and there is a 1-1 correspondence between this and the encode     */
1353*c83a76b0SSuyog Pawar         /* Hence we set output dependency of 1 */
1354*c83a76b0SSuyog Pawar         ps_me_job_q_prms->i4_num_output_dep = 1;
1355*c83a76b0SSuyog Pawar         ps_me_job_q_prms->ai4_out_dep_unit_off[0] = j;
1356*c83a76b0SSuyog Pawar         ps_me_job_q_prms->i4_num_inp_dep = pu1_inp_dep_c[j];
1357*c83a76b0SSuyog Pawar         ASSERT(ps_me_job_q_prms->i4_num_inp_dep <= MAX_OUT_DEP);
1358*c83a76b0SSuyog Pawar         ps_me_job_q_prms++;
1359*c83a76b0SSuyog Pawar     }
1360*c83a76b0SSuyog Pawar 
1361*c83a76b0SSuyog Pawar     return;
1362*c83a76b0SSuyog Pawar }
1363*c83a76b0SSuyog Pawar 
1364*c83a76b0SSuyog Pawar /*!
1365*c83a76b0SSuyog Pawar ******************************************************************************
1366*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_set_lyr1_mv_bank \endif
1367*c83a76b0SSuyog Pawar *
1368*c83a76b0SSuyog Pawar * \brief
1369*c83a76b0SSuyog Pawar *    Frame level ME initialisation of MV bank of penultimate layer
1370*c83a76b0SSuyog Pawar *
1371*c83a76b0SSuyog Pawar * \par Description:
1372*c83a76b0SSuyog Pawar *    Updates the Layer1 context with the given buffers
1373*c83a76b0SSuyog Pawar *
1374*c83a76b0SSuyog Pawar * \param[in] pv_me_ctxt : pointer to ME module
1375*c83a76b0SSuyog Pawar * \param[in] pu1_mv_bank : MV bank buffer pointer
1376*c83a76b0SSuyog Pawar * \param[in] pu1_ref_idx_bank : refrence bank buffer pointer
1377*c83a76b0SSuyog Pawar *
1378*c83a76b0SSuyog Pawar * \return
1379*c83a76b0SSuyog Pawar *    None
1380*c83a76b0SSuyog Pawar *
1381*c83a76b0SSuyog Pawar * \author
1382*c83a76b0SSuyog Pawar *  Ittiam
1383*c83a76b0SSuyog Pawar *
1384*c83a76b0SSuyog Pawar *****************************************************************************
1385*c83a76b0SSuyog Pawar */
ihevce_coarse_me_set_lyr1_mv_bank(void * pv_me_ctxt,ihevce_lap_enc_buf_t * ps_enc_lap_inp,void * pv_mv_bank,void * pv_ref_idx_bank,WORD32 i4_curr_idx)1386*c83a76b0SSuyog Pawar void ihevce_coarse_me_set_lyr1_mv_bank(
1387*c83a76b0SSuyog Pawar     void *pv_me_ctxt,
1388*c83a76b0SSuyog Pawar     ihevce_lap_enc_buf_t *ps_enc_lap_inp,
1389*c83a76b0SSuyog Pawar     void *pv_mv_bank,
1390*c83a76b0SSuyog Pawar     void *pv_ref_idx_bank,
1391*c83a76b0SSuyog Pawar     WORD32 i4_curr_idx)
1392*c83a76b0SSuyog Pawar {
1393*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_thrd0_ctxt;
1394*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
1395*c83a76b0SSuyog Pawar     layer_ctxt_t *ps_lyr1_ctxt;
1396*c83a76b0SSuyog Pawar 
1397*c83a76b0SSuyog Pawar     /* Input descriptor that is updated and passed to ME */
1398*c83a76b0SSuyog Pawar     hme_inp_desc_t s_inp_desc;
1399*c83a76b0SSuyog Pawar 
1400*c83a76b0SSuyog Pawar     /*************************************************************************/
1401*c83a76b0SSuyog Pawar     /* Add the current input to ME's DPB. This will also create the pyramids */
1402*c83a76b0SSuyog Pawar     /* for the HME layers tha are not "encoded".                             */
1403*c83a76b0SSuyog Pawar     /*************************************************************************/
1404*c83a76b0SSuyog Pawar     s_inp_desc.i4_poc = ps_enc_lap_inp->s_lap_out.i4_poc;
1405*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;
1406*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;
1407*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;
1408*c83a76b0SSuyog Pawar 
1409*c83a76b0SSuyog Pawar     s_inp_desc.s_layer_desc[0].luma_stride = ps_enc_lap_inp->s_lap_out.s_input_buf.i4_y_strd;
1410*c83a76b0SSuyog Pawar     s_inp_desc.s_layer_desc[0].chroma_stride = ps_enc_lap_inp->s_lap_out.s_input_buf.i4_uv_strd;
1411*c83a76b0SSuyog Pawar 
1412*c83a76b0SSuyog Pawar     hme_coarse_add_inp(pv_me_ctxt, &s_inp_desc, i4_curr_idx);
1413*c83a76b0SSuyog Pawar 
1414*c83a76b0SSuyog Pawar     /* All processing done using shared / common memory across */
1415*c83a76b0SSuyog Pawar     /* threads is done using thrd 0 ctxt since layer ctxt is shared accross all threads */
1416*c83a76b0SSuyog Pawar     ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[0];
1417*c83a76b0SSuyog Pawar 
1418*c83a76b0SSuyog Pawar     ps_lyr1_ctxt = ps_thrd0_ctxt->ps_curr_descr->aps_layers[1];
1419*c83a76b0SSuyog Pawar 
1420*c83a76b0SSuyog Pawar     /* register the mv bank & ref idx bank pointer */
1421*c83a76b0SSuyog Pawar     ps_lyr1_ctxt->ps_layer_mvbank->pi1_ref_idx_base = (S08 *)pv_ref_idx_bank;
1422*c83a76b0SSuyog Pawar     ps_lyr1_ctxt->ps_layer_mvbank->ps_mv_base = (hme_mv_t *)pv_mv_bank;
1423*c83a76b0SSuyog Pawar 
1424*c83a76b0SSuyog Pawar     return;
1425*c83a76b0SSuyog Pawar }
1426*c83a76b0SSuyog Pawar 
1427*c83a76b0SSuyog Pawar /*!
1428*c83a76b0SSuyog Pawar ******************************************************************************
1429*c83a76b0SSuyog Pawar * \if Function name : ihevce_coarse_me_get_lyr1_ctxt \endif
1430*c83a76b0SSuyog Pawar *
1431*c83a76b0SSuyog Pawar * \brief
1432*c83a76b0SSuyog Pawar *    function to get teh Layer 1 properties to be passed on the encode layer
1433*c83a76b0SSuyog Pawar *
1434*c83a76b0SSuyog Pawar * \par Description:
1435*c83a76b0SSuyog Pawar *    Ucopies the enitre layer ctxt emory to the destination
1436*c83a76b0SSuyog Pawar *
1437*c83a76b0SSuyog Pawar * \param[in] pv_me_ctxt : pointer to ME module
1438*c83a76b0SSuyog Pawar * \param[in] pu1_mv_bank : MV bank buffer pointer
1439*c83a76b0SSuyog Pawar * \param[in] pu1_ref_idx_bank : refrence bank buffer pointer
1440*c83a76b0SSuyog Pawar *
1441*c83a76b0SSuyog Pawar * \return
1442*c83a76b0SSuyog Pawar *    None
1443*c83a76b0SSuyog Pawar *
1444*c83a76b0SSuyog Pawar * \author
1445*c83a76b0SSuyog Pawar *  Ittiam
1446*c83a76b0SSuyog Pawar *
1447*c83a76b0SSuyog Pawar *****************************************************************************
1448*c83a76b0SSuyog Pawar */
ihevce_coarse_me_get_lyr1_ctxt(void * pv_me_ctxt,void * pv_layer_ctxt,void * pv_layer_mv_bank_ctxt)1449*c83a76b0SSuyog Pawar void ihevce_coarse_me_get_lyr1_ctxt(
1450*c83a76b0SSuyog Pawar     void *pv_me_ctxt, void *pv_layer_ctxt, void *pv_layer_mv_bank_ctxt)
1451*c83a76b0SSuyog Pawar {
1452*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *ps_thrd0_ctxt;
1453*c83a76b0SSuyog Pawar     coarse_me_master_ctxt_t *ps_master_ctxt = (coarse_me_master_ctxt_t *)pv_me_ctxt;
1454*c83a76b0SSuyog Pawar     layer_ctxt_t *ps_lyr1_ctxt;
1455*c83a76b0SSuyog Pawar 
1456*c83a76b0SSuyog Pawar     /* All processing done using shared / common memory across */
1457*c83a76b0SSuyog Pawar     /* threads is done using thrd 0 ctxt since layer ctxt is shared accross all threads */
1458*c83a76b0SSuyog Pawar     ps_thrd0_ctxt = ps_master_ctxt->aps_me_ctxt[0];
1459*c83a76b0SSuyog Pawar 
1460*c83a76b0SSuyog Pawar     /* get the context of layer 1 */
1461*c83a76b0SSuyog Pawar     ps_lyr1_ctxt = ps_thrd0_ctxt->ps_curr_descr->aps_layers[1];
1462*c83a76b0SSuyog Pawar 
1463*c83a76b0SSuyog Pawar     /* copy the layer ctxt eve registerd mv bank & ref idx bank also goes in */
1464*c83a76b0SSuyog Pawar     memcpy(pv_layer_ctxt, ps_lyr1_ctxt, sizeof(layer_ctxt_t));
1465*c83a76b0SSuyog Pawar 
1466*c83a76b0SSuyog Pawar     /* copy the layer mv bank contents */
1467*c83a76b0SSuyog Pawar     memcpy(pv_layer_mv_bank_ctxt, ps_lyr1_ctxt->ps_layer_mvbank, sizeof(layer_mv_t));
1468*c83a76b0SSuyog Pawar 
1469*c83a76b0SSuyog Pawar     /* register the MV bank pointer in the layer ctxt*/
1470*c83a76b0SSuyog Pawar     ((layer_ctxt_t *)pv_layer_ctxt)->ps_layer_mvbank = (layer_mv_t *)pv_layer_mv_bank_ctxt;
1471*c83a76b0SSuyog Pawar 
1472*c83a76b0SSuyog Pawar     return;
1473*c83a76b0SSuyog Pawar }
1474