• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 /*!
21 ******************************************************************************
22 * \file ihevce_me_pass.h
23 *
24 * \brief
25 *    Interfaces to create, control and run the ME module
26 *
27 * \date
28 *    22/10/2012
29 *
30 * \author
31 *    Ittiam
32 *
33 ******************************************************************************
34 */
35 
36 #ifndef _IHEVCE_ME_PASS_H_
37 #define _IHEVCE_ME_PASS_H_
38 
39 /*****************************************************************************/
40 /* Constant Macros                                                           */
41 /*****************************************************************************/
42 
43 /*****************************************************************************/
44 /* Function Macros                                                           */
45 /*****************************************************************************/
46 
47 /*****************************************************************************/
48 /* Typedefs                                                                  */
49 /*****************************************************************************/
50 
51 /*****************************************************************************/
52 /* Enums                                                                     */
53 /*****************************************************************************/
54 
55 /*****************************************************************************/
56 /* Structure                                                                 */
57 /*****************************************************************************/
58 
59 /*****************************************************************************/
60 /* Extern Variable Declarations                                              */
61 /*****************************************************************************/
62 
63 /*****************************************************************************/
64 /* Extern Function Declarations                                              */
65 /*****************************************************************************/
66 /*!
67 ******************************************************************************
68 * \if Function name : ihevce_me_get_num_mem_recs \endif
69 *
70 * \brief
71 *    Number of memory records are returned for ME module
72 *
73 *
74 * \return
75 *    Number of memory records
76 *
77 * \author
78 *  Ittiam
79 *
80 *****************************************************************************
81 */
82 WORD32 ihevce_me_get_num_mem_recs(WORD32 i4_num_me_frm_pllel);
83 
84 /*!
85 ******************************************************************************
86 * \if Function name : ihevce_me_get_mem_recs \endif
87 *
88 * \brief
89 *    Memory requirements are returned for ME.
90 *
91 * \param[in,out]  ps_mem_tab : pointer to memory descriptors table
92 * \param[in] ps_init_prms : Create time static parameters
93 *
94 * \return
95 *    Number of records
96 *
97 * \author
98 *  Ittiam
99 *
100 *****************************************************************************
101 */
102 WORD32 ihevce_me_get_mem_recs(
103     iv_mem_rec_t *ps_mem_tab,
104     ihevce_static_cfg_params_t *ps_init_prms,
105     WORD32 i4_num_proc_thrds,
106     WORD32 i4_mem_space,
107     WORD32 i4_resolution_id,
108     WORD32 i4_num_me_frm_pllel);
109 
110 /*!
111 ******************************************************************************
112 * \if Function name : ihevce_me_init \endif
113 *
114 * \brief
115 *    Intialization for ME context state structure .
116 *
117 * \param[in] ps_mem_tab : pointer to memory descriptors table
118 * \param[in] ps_init_prms : Create time static parameters
119 * \param[in] pv_osal_handle : Osal handle
120 *
121 * \return
122 *    Handle to the ME context
123 *
124 * \author
125 *  Ittiam
126 *
127 *****************************************************************************
128 */
129 void *ihevce_me_init(
130     iv_mem_rec_t *ps_mem_tab,
131     ihevce_static_cfg_params_t *ps_init_prms,
132     WORD32 i4_num_proc_thrds,
133     void *pv_osal_handle,
134     rc_quant_t *ps_rc_quant_ctxt,
135     void *pv_tile_params_base,
136     WORD32 i4_resolution_id,
137     WORD32 i4_num_me_frm_pllel,
138     UWORD8 u1_is_popcnt_available);
139 
140 /**
141 *******************************************************************************
142 * \if Function name : ihevce_me_set_resolution \endif
143 *
144 * \brief
145 *    Sets the resolution for ME state
146 *
147 * \par Description:
148 *    ME requires information of resolution to prime up its layer descriptors
149 *    and contexts. This API is called whenever a control call from application
150 *    causes a change of resolution. Has to be called once initially before
151 *    processing any frame. Again this is just a glue function and calls the
152 *    actual ME API for the same.
153 *
154 * \param[in,out] pv_me_ctxt: Handle to the ME context
155 * \param[in] n_enc_layers: Number of layers getting encoded
156 * \param[in] p_wd : Pointer containing widths of each layer getting encoded.
157 * \param[in] p_ht : Pointer containing heights of each layer getting encoded.
158 *
159 * \returns
160 *  none
161 *
162 * \author
163 *  Ittiam
164 *
165 *******************************************************************************
166 */
167 void ihevce_me_set_resolution(void *pv_me_ctxt, WORD32 n_enc_layers, WORD32 *p_wd, WORD32 *p_ht);
168 
169 /*!
170 ******************************************************************************
171 * \if Function name : ihevce_me_frame_init \endif
172 *
173 * \brief
174 *    Frame level ME initialisation function
175 *
176 * \par Description:
177 *    The following pre-conditions exist for this function: a. We have the input
178 *    pic ready for encode, b. We have the reference list with POC, L0/L1 IDs
179 *    and ref ptrs ready for this picture and c. ihevce_me_set_resolution has
180 *    been called atleast once. Once these are supplied, the following are
181 *    done here: a. Input pyramid creation, b. Updation of ME's internal DPB
182 *    based on available ref list information
183 *
184 * \param[in] pv_ctxt : pointer to ME module
185 * \param[in] ps_frm_ctb_prms : CTB characteristics parameters
186 * \param[in] ps_frm_lamda : Frame level Lambda params
187 * \param[in] num_ref_l0 : Number of reference pics in L0 list
188 * \param[in] num_ref_l1 : Number of reference pics in L1 list
189 * \param[in] num_ref_l0_active : Active reference pics in L0 dir for current frame (shall be <= num_ref_l0)
190 * \param[in] num_ref_l1_active : Active reference pics in L1 dir for current frame (shall be <= num_ref_l1)
191 * \param[in] pps_rec_list_l0 : List of recon pics in L0 list
192 * \param[in] pps_rec_list_l1 : List of recon pics in L1 list
193 * \param[in] ps_enc_lap_inp  : pointer to input yuv buffer (frame buffer)
194 * \param[in] i4_frm_qp       : current picture QP
195 *
196 * \return
197 *    None
198 *
199 * \author
200 *  Ittiam
201 *
202 *****************************************************************************
203 */
204 void ihevce_me_frame_init(
205     void *pv_me_ctxt,
206     me_enc_rdopt_ctxt_t *ps_cur_out_me_prms,
207     ihevce_static_cfg_params_t *ps_stat_prms,
208     frm_ctb_ctxt_t *ps_frm_ctb_prms,
209     frm_lambda_ctxt_t *ps_frm_lamda,
210     WORD32 num_ref_l0,
211     WORD32 num_ref_l1,
212     WORD32 num_ref_l0_active,
213     WORD32 num_ref_l1_active,
214     recon_pic_buf_t **pps_rec_list_l0,
215     recon_pic_buf_t **pps_rec_list_l1,
216     recon_pic_buf_t *(*aps_ref_list)[HEVCE_MAX_REF_PICS * 2],
217     func_selector_t *ps_func_selector,
218     ihevce_lap_enc_buf_t *ps_enc_lap_inp,
219     void *pv_coarse_layer,
220     WORD32 i4_me_frm_id,
221     WORD32 i4_thrd_id,
222     WORD32 i4_frm_qp,
223     WORD32 i4_temporal_layer_id,
224     WORD8 i1_cu_qp_delta_enabled_flag,
225     void *pv_dep_mngr_encloop_dep_me);
226 
227 /*!
228 ******************************************************************************
229 * \if Function name : ihevce_me_process \endif
230 *
231 * \brief
232 *    Frame level ME function
233 *
234 * \par Description:
235 *    Processing of all layers starting from coarse and going
236 *    to the refinement layers, all layers
237 *    that are encoded go CTB by CTB. Outputs of this function are populated
238 *    ctb_analyse_t structures, one per CTB.
239 *
240 * \param[in] pv_ctxt : pointer to ME module
241 * \param[in] ps_enc_lap_inp  : pointer to input yuv buffer (frame buffer)
242 * \param[in,out] ps_ctb_out : pointer to CTB analyse output structure (frame buffer)
243 * \param[out] ps_cu_out : pointer to CU analyse output structure (frame buffer)
244 * \param[in]  pd_intra_costs : pointerto intra cost buffer
245 * \param[in]  ps_multi_thrd_ctxt : pointer to multi thread ctxt
246 * \param[in]  thrd_id : Thread id of the current thrd in which function is executed
247 *
248 * \return
249 *    None
250 *
251 * \author
252 *  Ittiam
253 *
254 *****************************************************************************
255 */
256 void ihevce_me_process(
257     void *pv_me_ctxt,
258     ihevce_lap_enc_buf_t *ps_enc_lap_inp,
259     ctb_analyse_t *ps_ctb_out,
260     me_enc_rdopt_ctxt_t *ps_cur_out_me_prms,
261     double *pd_intra_costs,
262     ipe_l0_ctb_analyse_for_me_t *ps_ipe_analyse_ctb,
263     pre_enc_L0_ipe_encloop_ctxt_t *ps_l0_ipe_input,
264     void *pv_coarse_layer,
265     multi_thrd_ctxt_t *ps_multi_thrd_ctxt,
266     WORD32 i4_frame_parallelism_level,
267     WORD32 thrd_id,
268     WORD32 i4_me_frm_id);
269 
270 /*!
271 ******************************************************************************
272 * \if Function name : ihevce_me_frame_dpb_update \endif
273 *
274 * \brief
275 *    Frame level ME initialisation function
276 *
277 * \par Description:
278 *   Updation of ME's internal DPB
279 *    based on available ref list information
280 *
281 * \param[in] pv_ctxt : pointer to ME module
282 * \param[in] num_ref_l0 : Number of reference pics in L0 list
283 * \param[in] num_ref_l1 : Number of reference pics in L1 list
284 * \param[in] pps_rec_list_l0 : List of recon pics in L0 list
285 * \param[in] pps_rec_list_l1 : List of recon pics in L1 list
286 *
287 * \return
288 *    None
289 *
290 * \author
291 *  Ittiam
292 *
293 *****************************************************************************
294 */
295 void ihevce_me_frame_dpb_update(
296     void *pv_me_ctxt,
297     WORD32 num_ref_l0,
298     WORD32 num_ref_l1,
299     recon_pic_buf_t **pps_rec_list_l0,
300     recon_pic_buf_t **pps_rec_list_l1,
301     WORD32 i4_thrd_id);
302 
303 void ihevce_derive_me_init_prms(
304     ihevce_static_cfg_params_t *ps_init_prms,
305     hme_init_prms_t *ps_hme_init_prms,
306     S32 i4_num_proc_thrds,
307     WORD32 i4_resolution_id);
308 
309 void ihevc_me_update_ref_desc(
310     hme_ref_desc_t *ps_ref_desc,
311     recon_pic_buf_t *ps_recon_pic,
312     WORD32 ref_id_l0,
313     WORD32 ref_id_l1,
314     WORD32 ref_id_lc,
315     WORD32 is_fwd);
316 
317 WORD32 ihevce_me_find_poc_in_list(
318     recon_pic_buf_t **pps_rec_list, WORD32 poc, WORD32 i4_idr_gop_num, WORD32 num_ref);
319 
320 void ihevce_me_create_ref_map(
321     recon_pic_buf_t **pps_rec_list_l0,
322     recon_pic_buf_t **pps_rec_list_l1,
323     WORD32 num_ref_l0_active,
324     WORD32 num_ref_l1_active,
325     WORD32 num_ref,
326     hme_ref_map_t *ps_ref_map);
327 
328 /*!
329 ******************************************************************************
330 * \if Function name : ihevce_l0_me_frame_end \endif
331 *
332 * \brief
333 *    End of frame update function performs
334 *       - Dynamic Search Range collation
335 *
336 * \param[in] pv_ctxt : pointer to ME module
337 *
338 * \return
339 *    None
340 *
341 * \author
342 *  Ittiam
343 *
344 *****************************************************************************
345 */
346 void ihevce_l0_me_frame_end(
347     void *pv_me_ctxt, WORD32 i4_idx_dvsr_p, WORD32 i4_display_num, WORD32 i4_me_frm_id);
348 
349 #endif /* _IHEVCE_ME_PASS_H_ */
350