• 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_coarse_me_pass.h
23 *
24 * \brief
25 *    Interfaces to create, control and run the Coarse ME module
26 *
27 * \date
28 *    22/10/2012
29 *
30 * \author
31 *    Ittiam
32 *
33 ******************************************************************************
34 */
35 
36 #ifndef _IHEVCE_COARSE_ME_PASS_H_
37 #define _IHEVCE_COARSE_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 ******************************************************************************
69 * \if Function name : ihevce_me_get_num_mem_recs \endif
70 *
71 * \brief
72 *    Number of memory records are returned for ME module
73 *
74 *
75 * \return
76 *    Number of memory records
77 *
78 * \author
79 *  Ittiam
80 *
81 *****************************************************************************
82 */
83 WORD32 ihevce_coarse_me_get_num_mem_recs();
84 
85 /*!
86 ******************************************************************************
87 * \if Function name : ihevce_coarse_me_get_mem_recs \endif
88 *
89 * \brief
90 *    Memory requirements are returned for coarse ME.
91 *
92 * \param[in,out]  ps_mem_tab : pointer to memory descriptors table
93 * \param[in] ps_init_prms : Create time static parameters
94 * \param[in] i4_num_proc_thrds : Number of processing threads for this module
95 * \param[in] i4_mem_space : memspace in whihc memory request should be done
96 *
97 * \return
98 *    Number of records
99 *
100 * \author
101 *  Ittiam
102 *
103 *****************************************************************************
104 */
105 WORD32 ihevce_coarse_me_get_mem_recs(
106     iv_mem_rec_t *ps_mem_tab,
107     ihevce_static_cfg_params_t *ps_init_prms,
108     WORD32 i4_num_proc_thrds,
109     WORD32 i4_mem_space,
110     WORD32 i4_resolution_id);
111 
112 /*!
113 ******************************************************************************
114 * \if Function name : ihevce_coarse_me_init \endif
115 *
116 * \brief
117 *    Intialization for ME context state structure .
118 *
119 * \param[in] ps_mem_tab : pointer to memory descriptors table
120 * \param[in] ps_init_prms : Create time static parameters
121 * \param[in] pv_osal_handle : Osal handle
122 *
123 * \return
124 *    Handle to the ME context
125 *
126 * \author
127 *  Ittiam
128 *
129 *****************************************************************************
130 */
131 void *ihevce_coarse_me_init(
132     iv_mem_rec_t *ps_mem_tab,
133     ihevce_static_cfg_params_t *ps_init_prms,
134     WORD32 i4_num_proc_thrds,
135     void *pv_osal_handle,
136     WORD32 i4_resolution_id,
137     UWORD8 u1_is_popcnt_available);
138 
139 /*!
140 ******************************************************************************
141 * \if Function name : ihevce_coarse_me_reg_thrds_sem \endif
142 *
143 * \brief
144 *    Intialization for ME context state structure with semaphores .
145 *
146 * \param[in] pv_me_ctxt : pointer to Coarse ME ctxt
147 * \param[in] ppv_sem_hdls : Arry of semaphore handles
148 * \param[in] i4_num_proc_thrds : Number of processing threads
149 *
150 * \return
151 *   none
152 *
153 * \author
154 *  Ittiam
155 *
156 *****************************************************************************
157 */
158 void ihevce_coarse_me_reg_thrds_sem(void *pv_me_ctxt, void **ppv_sem_hdls, WORD32 i4_num_proc_thrds);
159 
160 /*!
161 ******************************************************************************
162 * \if Function name : ihevce_coarse_me_delete \endif
163 *
164 * \brief
165 *    Destroy Coarse ME module
166 * Note : Only Destroys the resources allocated in the module like
167 *   semaphore,etc. Memory free is done Separately using memtabs
168 *
169 * \param[in] pv_me_ctxt : pointer to Coarse ME ctxt
170 * \param[in] ps_init_prms : Create time static parameters
171 *
172 * \return
173 *    None
174 *
175 * \author
176 *  Ittiam
177 *
178 *****************************************************************************
179 */
180 void ihevce_coarse_me_delete(
181     void *pv_me_ctxt, ihevce_static_cfg_params_t *ps_init_prms, WORD32 i4_resolution_id);
182 
183 /**
184 *******************************************************************************
185 * \if Function name : ihevce_me_set_resolution \endif
186 *
187 * \brief
188 *    Sets the resolution for ME state
189 *
190 * \par Description:
191 *    ME requires information of resolution to prime up its layer descriptors
192 *    and contexts. This API is called whenever a control call from application
193 *    causes a change of resolution. Has to be called once initially before
194 *    processing any frame. Again this is just a glue function and calls the
195 *    actual ME API for the same.
196 *
197 * \param[in,out] pv_me_ctxt: Handle to the ME context
198 * \param[in] n_enc_layers: Number of layers getting encoded
199 * \param[in] p_wd : Pointer containing widths of each layer getting encoded.
200 * \param[in] p_ht : Pointer containing heights of each layer getting encoded.
201 *
202 * \returns
203 *  none
204 *
205 * \author
206 *  Ittiam
207 *
208 *******************************************************************************
209 */
210 void ihevce_coarse_me_set_resolution(
211     void *pv_me_ctxt, WORD32 n_enc_layers, WORD32 *p_wd, WORD32 *p_ht);
212 
213 void ihevce_coarse_me_get_rc_param(
214     void *pv_me_ctxt,
215     LWORD64 *i8_acc_frame_hme_cost,
216     LWORD64 *i8_acc_frame_hme_sad,
217     LWORD64 *i8_acc_num_blks_higher_sad,
218     LWORD64 *i8_total_blks,
219     WORD32 i4_is_prev_pic_same_scene);
220 /*!
221 ******************************************************************************
222 * \if Function name : ihevce_me_frame_init \endif
223 *
224 * \brief
225 *    Frame level ME initialisation function
226 *
227 * \par Description:
228 *    The following pre-conditions exist for this function: a. We have the input
229 *    pic ready for encode, b. We have the reference list with POC, L0/L1 IDs
230 *    and ref ptrs ready for this picture and c. ihevce_me_set_resolution has
231 *    been called atleast once. Once these are supplied, the following are
232 *    done here: a. Input pyramid creation, b. Updation of ME's internal DPB
233 *    based on available ref list information
234 *
235 * \param[in] pv_ctxt : pointer to ME module
236 * \param[in] ps_frm_ctb_prms : CTB characteristics parameters
237 * \param[in] ps_frm_lamda : Frame level Lambda params
238 * \param[in] num_ref_l0 : Number of reference pics in L0 list
239 * \param[in] num_ref_l1 : Number of reference pics in L1 list
240 * \param[in] num_ref_l0_active : Active reference pics in L0 dir for current frame (shall be <= num_ref_l0)
241 * \param[in] num_ref_l1_active : Active reference pics in L1 dir for current frame (shall be <= num_ref_l1)
242 * \param[in] pps_rec_list_l0 : List of recon pics in L0 list
243 * \param[in] pps_rec_list_l1 : List of recon pics in L1 list
244 * \param[in] ps_enc_lap_inp  : pointer to input yuv buffer (frame buffer)
245 * \param[in] i4_frm_qp       : current picture QP
246 *
247 * \return
248 *    None
249 *
250 * \author
251 *  Ittiam
252 *
253 *****************************************************************************
254 */
255 void ihevce_coarse_me_frame_init(
256     void *pv_me_ctxt,
257     ihevce_static_cfg_params_t *ps_stat_prms,
258     frm_ctb_ctxt_t *ps_frm_ctb_prms,
259     frm_lambda_ctxt_t *ps_frm_lamda,
260     WORD32 num_ref_l0,
261     WORD32 num_ref_l1,
262     WORD32 num_ref_l0_active,
263     WORD32 num_ref_l1_active,
264     recon_pic_buf_t **pps_rec_list_l0,
265     recon_pic_buf_t **pps_rec_list_l1,
266     ihevce_lap_enc_buf_t *ps_enc_lap_inp,
267     WORD32 i4_frm_qp,
268     ihevce_ed_blk_t *ps_layer1_buf,  //EIID
269     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1,
270     UWORD8 *pu1_me_reverse_map_info,
271     WORD32 i4_temporal_layer_id);
272 
273 /*!
274 ******************************************************************************
275 * \if Function name : ihevce_me_process \endif
276 *
277 * \brief
278 *    Frame level ME function
279 *
280 * \par Description:
281 *    Processing of all layers starting from coarse and going
282 *    to the refinement layers, all layers
283 *    that are encoded go CTB by CTB. Outputs of this function are populated
284 *    ctb_analyse_t structures, one per CTB.
285 *
286 * \param[in] pv_ctxt : pointer to ME module
287 * \param[in] ps_enc_lap_inp  : pointer to input yuv buffer (frame buffer)
288 * \param[in,out] ps_ctb_out : pointer to CTB analyse output structure (frame buffer)
289 * \param[out] ps_cu_out : pointer to CU analyse output structure (frame buffer)
290 * \param[in]  pd_intra_costs : pointerto intra cost buffer
291 * \param[in]  ps_multi_thrd_ctxt : pointer to multi thread ctxt
292 * \param[in]  thrd_id : Thread id of the current thrd in which function is executed
293 *
294 * \return
295 *    None
296 *
297 * \author
298 *  Ittiam
299 *
300 *****************************************************************************
301 */
302 void ihevce_coarse_me_process(
303     void *pv_me_ctxt,
304     ihevce_lap_enc_buf_t *ps_enc_lap_inp,
305     multi_thrd_ctxt_t *ps_multi_thrd_ctxt,
306     WORD32 thrd_id,
307     WORD32 i4_ping_pong);
308 
309 /*!
310 ******************************************************************************
311 * \if Function name : ihevce_me_frame_dpb_update \endif
312 *
313 * \brief
314 *    Frame level ME initialisation function
315 *
316 * \par Description:
317 *   Updation of ME's internal DPB
318 *    based on available ref list information
319 *
320 * \param[in] pv_ctxt : pointer to ME module
321 * \param[in] num_ref_l0 : Number of reference pics in L0 list
322 * \param[in] num_ref_l1 : Number of reference pics in L1 list
323 * \param[in] pps_rec_list_l0 : List of recon pics in L0 list
324 * \param[in] pps_rec_list_l1 : List of recon pics in L1 list
325 *
326 * \return
327 *    None
328 *
329 * \author
330 *  Ittiam
331 *
332 *****************************************************************************
333 */
334 void ihevce_coarse_me_frame_dpb_update(
335     void *pv_me_ctxt,
336     WORD32 num_ref_l0,
337     WORD32 num_ref_l1,
338     recon_pic_buf_t **pps_rec_list_l0,
339     recon_pic_buf_t **pps_rec_list_l1);
340 
341 /*!
342 ******************************************************************************
343 * \if Function name : ihevce_me_get_lyr_prms_job_que \endif
344 *
345 * \brief Returns to the caller key attributes related to dependency between layers
346 *          for multi-thread execution
347 *
348 *
349 * \par Description:
350 *    This function requires the precondition that the width and ht of encode
351 *    layer is known, and ME API ihevce_me_set_resolution() API called with
352 *    this info. Based on this, ME populates useful information for the encoder
353 *    to execute the multi-thread (concurrent across layers) in this API.
354 *    The number of layers, number of vertical units in each layer, and for
355 *    each vertial unit in each layer, its dependency on previous layer's units
356 *    From ME's perspective, a vertical unit is one which is smallest min size
357 *    vertically (and spans the entire row horizontally). This is CTB for encode
358 *    layer, and 8x8 / 4x4 for non encode layers.
359 *
360 * \param[in] pv_ctxt : ME handle
361 * \param[in] ps_curr_inp : Input buffer descriptor
362 * \param[out] pi4_num_hme_lyrs : Num of HME layers (ME updates)
363 * \param[out] pi4_num_vert_units_in_lyr : Array of size N (num layers), each
364 *                     entry has num vertical units in that particular layer
365 * \param[in] ps_me_job_q_prms : Array of job queue prms, one for each unit in a
366 *                 layer. Note that this is contiguous in order of processing
367 *                 All k units of layer N-1 from top to bottom, followed by
368 *                 all m units of layer N-2 .... ends with X units of layer 0
369 *
370 * \return
371 *    None
372 *
373 * \author
374 *  Ittiam
375 *
376 *****************************************************************************
377 */
378 void ihevce_coarse_me_get_lyr_prms_job_que(
379     void *pv_me_ctxt,
380     ihevce_lap_enc_buf_t *ps_curr_inp,
381     WORD32 *pi4_num_hme_lyrs,
382     WORD32 *pi4_num_vert_units_in_lyr,
383     multi_thrd_me_job_q_prms_t *ps_me_job_q_prms);
384 
385 /*!
386 ******************************************************************************
387 * \if Function name : ihevce_me_frame_end \endif
388 *
389 * \brief
390 *    End of frame update function performs GMV collation
391 *
392 * \param[in] pv_ctxt : pointer to ME module
393 *
394 * \return
395 *    None
396 *
397 * \author
398 *  Ittiam
399 *
400 *****************************************************************************
401 */
402 void ihevce_coarse_me_frame_end(void *pv_me_ctxt);
403 
404 void ihevce_coarse_me_get_lyr1_ctxt(
405     void *pv_me_ctxt, void *pv_layer_ctxt, void *pv_layer_mv_bank_ctxt);
406 
407 void ihevce_coarse_me_set_lyr1_mv_bank(
408     void *pv_me_ctxt,
409     ihevce_lap_enc_buf_t *ps_enc_lap_inp,
410     void *pv_mv_bank,
411     void *pv_ref_idx_bank,
412     WORD32 i4_curr_idx);
413 
414 WORD32 ihevce_coarse_me_get_lyr_buf_desc(
415     void *pv_me_ctxt, UWORD8 **ppu1_decomp_lyr_bufs, WORD32 *pi4_lyr_buf_stride);
416 
417 #endif /* _IHEVCE_COARSE_ME_PASS_H_ */
418