xref: /aosp_15_r20/external/libhevc/encoder/ihevce_plugin.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 * \file ihevce_plugin.c
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    This file contains wrapper utilities to use hevc encoder library
26*c83a76b0SSuyog Pawar *
27*c83a76b0SSuyog Pawar * \date
28*c83a76b0SSuyog Pawar *    15/04/2014
29*c83a76b0SSuyog Pawar *
30*c83a76b0SSuyog Pawar * \author
31*c83a76b0SSuyog Pawar *    Ittiam
32*c83a76b0SSuyog Pawar *
33*c83a76b0SSuyog Pawar * List of Functions
34*c83a76b0SSuyog Pawar *
35*c83a76b0SSuyog Pawar *
36*c83a76b0SSuyog Pawar ******************************************************************************
37*c83a76b0SSuyog Pawar */
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar /* File Includes                                                             */
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar /* System include files */
43*c83a76b0SSuyog Pawar #include <stdio.h>
44*c83a76b0SSuyog Pawar #include <string.h>
45*c83a76b0SSuyog Pawar #include <stdlib.h>
46*c83a76b0SSuyog Pawar #include <assert.h>
47*c83a76b0SSuyog Pawar #include <stdarg.h>
48*c83a76b0SSuyog Pawar 
49*c83a76b0SSuyog Pawar /* User include files */
50*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
51*c83a76b0SSuyog Pawar #include "itt_video_api.h"
52*c83a76b0SSuyog Pawar #include "ihevce_api.h"
53*c83a76b0SSuyog Pawar 
54*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
55*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
56*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
57*c83a76b0SSuyog Pawar 
58*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
59*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
60*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
61*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
62*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
63*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
64*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
65*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
66*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
67*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
68*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
69*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
70*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
71*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
72*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
73*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
74*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
75*c83a76b0SSuyog Pawar 
76*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
77*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
78*c83a76b0SSuyog Pawar #include "ihevce_plugin.h"
79*c83a76b0SSuyog Pawar #include "ihevce_plugin_priv.h"
80*c83a76b0SSuyog Pawar #include "ihevce_hle_interface.h"
81*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
82*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
83*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
84*c83a76b0SSuyog Pawar #include "ihevce_error_checks.h"
85*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
86*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
87*c83a76b0SSuyog Pawar #include "ihevce_global_tables.h"
88*c83a76b0SSuyog Pawar 
89*c83a76b0SSuyog Pawar #include "cast_types.h"
90*c83a76b0SSuyog Pawar #include "osal.h"
91*c83a76b0SSuyog Pawar #include "osal_defaults.h"
92*c83a76b0SSuyog Pawar 
93*c83a76b0SSuyog Pawar /*****************************************************************************/
94*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
95*c83a76b0SSuyog Pawar /*****************************************************************************/
96*c83a76b0SSuyog Pawar #define CREATE_TIME_ALLOCATION_INPUT 1
97*c83a76b0SSuyog Pawar #define CREATE_TIME_ALLOCATION_OUTPUT 0
98*c83a76b0SSuyog Pawar 
99*c83a76b0SSuyog Pawar #define MAX_NUM_FRM_IN_GOP 600
100*c83a76b0SSuyog Pawar 
101*c83a76b0SSuyog Pawar /*****************************************************************************/
102*c83a76b0SSuyog Pawar /* Extern variables                                                          */
103*c83a76b0SSuyog Pawar /*****************************************************************************/
104*c83a76b0SSuyog Pawar 
105*c83a76b0SSuyog Pawar /*****************************************************************************/
106*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
107*c83a76b0SSuyog Pawar /*****************************************************************************/
108*c83a76b0SSuyog Pawar 
109*c83a76b0SSuyog Pawar /*!
110*c83a76b0SSuyog Pawar ******************************************************************************
111*c83a76b0SSuyog Pawar * \if Function name : mem_mngr_alloc \endif
112*c83a76b0SSuyog Pawar *
113*c83a76b0SSuyog Pawar * \brief
114*c83a76b0SSuyog Pawar *    Memory manager specific alloc function
115*c83a76b0SSuyog Pawar *    it expects to reset the allocated memory and provide the zero initialised
116*c83a76b0SSuyog Pawar *    memory whenever this function getting called
117*c83a76b0SSuyog Pawar *
118*c83a76b0SSuyog Pawar * \param[in] pv_handle : handle to memory manager
119*c83a76b0SSuyog Pawar *                        (currently not required can be set to null)
120*c83a76b0SSuyog Pawar * \param[in] ps_memtab : memory descriptor pointer
121*c83a76b0SSuyog Pawar *
122*c83a76b0SSuyog Pawar * \return
123*c83a76b0SSuyog Pawar *    Memory pointer
124*c83a76b0SSuyog Pawar *
125*c83a76b0SSuyog Pawar * \author
126*c83a76b0SSuyog Pawar *  Ittiam
127*c83a76b0SSuyog Pawar *
128*c83a76b0SSuyog Pawar *****************************************************************************
129*c83a76b0SSuyog Pawar */
mem_mngr_alloc(void * pv_handle,ihevce_sys_api_t * ps_sys_api,iv_mem_rec_t * ps_memtab)130*c83a76b0SSuyog Pawar void mem_mngr_alloc(void *pv_handle, ihevce_sys_api_t *ps_sys_api, iv_mem_rec_t *ps_memtab)
131*c83a76b0SSuyog Pawar {
132*c83a76b0SSuyog Pawar #ifndef X86_MINGW
133*c83a76b0SSuyog Pawar     WORD32 error, mem_alignment;
134*c83a76b0SSuyog Pawar #endif
135*c83a76b0SSuyog Pawar 
136*c83a76b0SSuyog Pawar     (void)pv_handle;
137*c83a76b0SSuyog Pawar 
138*c83a76b0SSuyog Pawar #ifdef X86_MINGW
139*c83a76b0SSuyog Pawar     ps_memtab->pv_base = _aligned_malloc(ps_memtab->i4_mem_size, ps_memtab->i4_mem_alignment);
140*c83a76b0SSuyog Pawar #else
141*c83a76b0SSuyog Pawar     mem_alignment = ps_memtab->i4_mem_alignment;
142*c83a76b0SSuyog Pawar     mem_alignment = (mem_alignment >> 3) << 3;
143*c83a76b0SSuyog Pawar     if(mem_alignment == 0)
144*c83a76b0SSuyog Pawar     {
145*c83a76b0SSuyog Pawar         error = posix_memalign(&ps_memtab->pv_base, sizeof(void *), ps_memtab->i4_mem_size);
146*c83a76b0SSuyog Pawar     }
147*c83a76b0SSuyog Pawar     else
148*c83a76b0SSuyog Pawar     {
149*c83a76b0SSuyog Pawar         error = posix_memalign(&ps_memtab->pv_base, mem_alignment, ps_memtab->i4_mem_size);
150*c83a76b0SSuyog Pawar     }
151*c83a76b0SSuyog Pawar     if(error != 0)
152*c83a76b0SSuyog Pawar     {
153*c83a76b0SSuyog Pawar         ps_sys_api->ihevce_printf(ps_sys_api->pv_cb_handle, "posix_memalign error %d\n", error);
154*c83a76b0SSuyog Pawar     }
155*c83a76b0SSuyog Pawar #endif
156*c83a76b0SSuyog Pawar 
157*c83a76b0SSuyog Pawar     if(ps_memtab->pv_base == NULL)
158*c83a76b0SSuyog Pawar     {
159*c83a76b0SSuyog Pawar         ps_sys_api->ihevce_printf(
160*c83a76b0SSuyog Pawar             ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Unable to allocate memory\n");
161*c83a76b0SSuyog Pawar         ASSERT(0);
162*c83a76b0SSuyog Pawar     }
163*c83a76b0SSuyog Pawar     else
164*c83a76b0SSuyog Pawar     {
165*c83a76b0SSuyog Pawar         memset(ps_memtab->pv_base, 0, ps_memtab->i4_mem_size);
166*c83a76b0SSuyog Pawar     }
167*c83a76b0SSuyog Pawar     return;
168*c83a76b0SSuyog Pawar }
169*c83a76b0SSuyog Pawar 
170*c83a76b0SSuyog Pawar /*!
171*c83a76b0SSuyog Pawar ******************************************************************************
172*c83a76b0SSuyog Pawar * \if Function name : memory_alloc \endif
173*c83a76b0SSuyog Pawar *
174*c83a76b0SSuyog Pawar * \brief
175*c83a76b0SSuyog Pawar *    common memory allocate function should be used across all threads
176*c83a76b0SSuyog Pawar *    it expects to reset the allocated memory and return the zero initialised
177*c83a76b0SSuyog Pawar *    memory pointer whenever this function getting called
178*c83a76b0SSuyog Pawar *
179*c83a76b0SSuyog Pawar * \param[in] pv_handle : handle to memory manager
180*c83a76b0SSuyog Pawar *                        (currently not required can be set to null)
181*c83a76b0SSuyog Pawar * \param[in] u4_size : size of memory required
182*c83a76b0SSuyog Pawar *
183*c83a76b0SSuyog Pawar * \return
184*c83a76b0SSuyog Pawar *    Memory pointer
185*c83a76b0SSuyog Pawar *
186*c83a76b0SSuyog Pawar * \author
187*c83a76b0SSuyog Pawar *  Ittiam
188*c83a76b0SSuyog Pawar *
189*c83a76b0SSuyog Pawar *****************************************************************************
190*c83a76b0SSuyog Pawar */
memory_alloc(void * pv_handle,UWORD32 u4_size)191*c83a76b0SSuyog Pawar void *memory_alloc(void *pv_handle, UWORD32 u4_size)
192*c83a76b0SSuyog Pawar {
193*c83a76b0SSuyog Pawar     (void)pv_handle;
194*c83a76b0SSuyog Pawar     void *pv_buf = malloc(u4_size);
195*c83a76b0SSuyog Pawar     if(pv_buf)
196*c83a76b0SSuyog Pawar     {
197*c83a76b0SSuyog Pawar         memset(pv_buf, 0, u4_size);
198*c83a76b0SSuyog Pawar     }
199*c83a76b0SSuyog Pawar     return (pv_buf);
200*c83a76b0SSuyog Pawar }
201*c83a76b0SSuyog Pawar 
202*c83a76b0SSuyog Pawar /*!
203*c83a76b0SSuyog Pawar ******************************************************************************
204*c83a76b0SSuyog Pawar * \if Function name : mem_mngr_free \endif
205*c83a76b0SSuyog Pawar *
206*c83a76b0SSuyog Pawar * \brief
207*c83a76b0SSuyog Pawar *    Memory manager specific free function
208*c83a76b0SSuyog Pawar *
209*c83a76b0SSuyog Pawar * \param[in] pv_handle : handle to memory manager
210*c83a76b0SSuyog Pawar *                        (currently not required can be set to null)
211*c83a76b0SSuyog Pawar * \param[in] ps_memtab : memory descriptor pointer
212*c83a76b0SSuyog Pawar *
213*c83a76b0SSuyog Pawar * \return
214*c83a76b0SSuyog Pawar *    Memory pointer
215*c83a76b0SSuyog Pawar *
216*c83a76b0SSuyog Pawar * \author
217*c83a76b0SSuyog Pawar *  Ittiam
218*c83a76b0SSuyog Pawar *
219*c83a76b0SSuyog Pawar *****************************************************************************
220*c83a76b0SSuyog Pawar */
mem_mngr_free(void * pv_handle,iv_mem_rec_t * ps_memtab)221*c83a76b0SSuyog Pawar void mem_mngr_free(void *pv_handle, iv_mem_rec_t *ps_memtab)
222*c83a76b0SSuyog Pawar {
223*c83a76b0SSuyog Pawar     (void)pv_handle;
224*c83a76b0SSuyog Pawar #ifdef X86_MINGW
225*c83a76b0SSuyog Pawar     _aligned_free(ps_memtab->pv_base);
226*c83a76b0SSuyog Pawar #else
227*c83a76b0SSuyog Pawar     free(ps_memtab->pv_base);
228*c83a76b0SSuyog Pawar #endif
229*c83a76b0SSuyog Pawar     return;
230*c83a76b0SSuyog Pawar }
231*c83a76b0SSuyog Pawar 
232*c83a76b0SSuyog Pawar /*!
233*c83a76b0SSuyog Pawar ******************************************************************************
234*c83a76b0SSuyog Pawar * \if Function name : memory_free \endif
235*c83a76b0SSuyog Pawar *
236*c83a76b0SSuyog Pawar * \brief
237*c83a76b0SSuyog Pawar *    common memory free function should be used across all threads
238*c83a76b0SSuyog Pawar *
239*c83a76b0SSuyog Pawar * \param[in] pv_handle : handle to memory manager
240*c83a76b0SSuyog Pawar *                        (currently not required can be set to null)
241*c83a76b0SSuyog Pawar * \param[in] pv_mem : memory to be freed
242*c83a76b0SSuyog Pawar *
243*c83a76b0SSuyog Pawar * \return
244*c83a76b0SSuyog Pawar *    Memory pointer
245*c83a76b0SSuyog Pawar *
246*c83a76b0SSuyog Pawar * \author
247*c83a76b0SSuyog Pawar *  Ittiam
248*c83a76b0SSuyog Pawar *
249*c83a76b0SSuyog Pawar *****************************************************************************
250*c83a76b0SSuyog Pawar */
memory_free(void * pv_handle,void * pv_mem)251*c83a76b0SSuyog Pawar void memory_free(void *pv_handle, void *pv_mem)
252*c83a76b0SSuyog Pawar {
253*c83a76b0SSuyog Pawar     (void)pv_handle;
254*c83a76b0SSuyog Pawar     free(pv_mem);
255*c83a76b0SSuyog Pawar     return;
256*c83a76b0SSuyog Pawar }
257*c83a76b0SSuyog Pawar 
258*c83a76b0SSuyog Pawar /*!
259*c83a76b0SSuyog Pawar ******************************************************************************
260*c83a76b0SSuyog Pawar * \if Function name : ihevce_set_def_params \endif
261*c83a76b0SSuyog Pawar *
262*c83a76b0SSuyog Pawar * \brief
263*c83a76b0SSuyog Pawar *    Set default values
264*c83a76b0SSuyog Pawar *
265*c83a76b0SSuyog Pawar * \param[in] Static params pointer
266*c83a76b0SSuyog Pawar *
267*c83a76b0SSuyog Pawar * \return
268*c83a76b0SSuyog Pawar *    status
269*c83a76b0SSuyog Pawar *
270*c83a76b0SSuyog Pawar * \author
271*c83a76b0SSuyog Pawar *  Ittiam
272*c83a76b0SSuyog Pawar *
273*c83a76b0SSuyog Pawar *****************************************************************************
274*c83a76b0SSuyog Pawar */
ihevce_set_def_params(ihevce_static_cfg_params_t * ps_params)275*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T ihevce_set_def_params(ihevce_static_cfg_params_t *ps_params)
276*c83a76b0SSuyog Pawar {
277*c83a76b0SSuyog Pawar     WORD32 i, j;
278*c83a76b0SSuyog Pawar     /* sanity checks */
279*c83a76b0SSuyog Pawar     if(NULL == ps_params)
280*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
281*c83a76b0SSuyog Pawar 
282*c83a76b0SSuyog Pawar     memset(ps_params, 0, sizeof(*ps_params));
283*c83a76b0SSuyog Pawar 
284*c83a76b0SSuyog Pawar     /* initialsie all the parameters to default values */
285*c83a76b0SSuyog Pawar     ps_params->i4_size = sizeof(ihevce_static_cfg_params_t);
286*c83a76b0SSuyog Pawar     ps_params->i4_save_recon = 0;
287*c83a76b0SSuyog Pawar     ps_params->i4_log_dump_level = 0;
288*c83a76b0SSuyog Pawar     ps_params->i4_enable_logo = 0;
289*c83a76b0SSuyog Pawar     ps_params->i4_enable_csv_dump = 0;
290*c83a76b0SSuyog Pawar 
291*c83a76b0SSuyog Pawar     /* Control to free the entropy output buffers   */
292*c83a76b0SSuyog Pawar     /* 1  for non_blocking mode */
293*c83a76b0SSuyog Pawar     /* and 0 for blocking mode */
294*c83a76b0SSuyog Pawar     ps_params->i4_outbuf_buf_free_control = 1;
295*c83a76b0SSuyog Pawar 
296*c83a76b0SSuyog Pawar     /* coding tools parameters */
297*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_size = sizeof(ihevce_coding_params_t);
298*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_cropping_mode = 1;
299*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_deblocking_type = 0;
300*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_enable_entropy_sync = 0;
301*c83a76b0SSuyog Pawar     // New IDR/CDR Params
302*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_max_closed_gop_period = 0;
303*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_min_closed_gop_period = 0;
304*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_max_cra_open_gop_period = 60;
305*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_max_i_open_gop_period = 0;
306*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_max_reference_frames = -1;
307*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_max_temporal_layers = 0;
308*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_slice_type = 0;
309*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_use_default_sc_mtx = 0;
310*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_weighted_pred_enable = 0;
311*c83a76b0SSuyog Pawar     ps_params->s_coding_tools_prms.i4_vqet = 0;
312*c83a76b0SSuyog Pawar 
313*c83a76b0SSuyog Pawar     ps_params->e_arch_type = ARCH_NA;
314*c83a76b0SSuyog Pawar 
315*c83a76b0SSuyog Pawar     /* config parameters */
316*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_size = sizeof(ihevce_config_prms_t);
317*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_cu_level_rc = 1;
318*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_init_vbv_fullness = 0;
319*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_max_frame_qp = 51;
320*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_max_log2_cu_size = 6;
321*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_max_log2_tu_size = 5;
322*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_max_search_range_horz = 512;
323*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_max_search_range_vert = 256;
324*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_max_tr_tree_depth_I = 1;
325*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_max_tr_tree_depth_nI = 3;
326*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_min_frame_qp = 1;
327*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_min_log2_cu_size = 3;
328*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_min_log2_tu_size = 2;
329*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_num_frms_to_encode = -1;
330*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_rate_control_mode = 2;
331*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_stuffing_enable = 0;
332*c83a76b0SSuyog Pawar     ps_params->s_config_prms.i4_vbr_max_peak_rate_dur = 2000;
333*c83a76b0SSuyog Pawar 
334*c83a76b0SSuyog Pawar     /* LAP parameters */
335*c83a76b0SSuyog Pawar     ps_params->s_lap_prms.i4_size = sizeof(ihevce_lap_params_t);
336*c83a76b0SSuyog Pawar     ps_params->s_lap_prms.i4_deinterlacer_enable = 0;
337*c83a76b0SSuyog Pawar     ps_params->s_lap_prms.i4_denoise_enable = 0;
338*c83a76b0SSuyog Pawar     ps_params->s_lap_prms.i4_enable_wts_ofsts = 1;
339*c83a76b0SSuyog Pawar     ps_params->s_lap_prms.i4_rc_look_ahead_pics = 0;
340*c83a76b0SSuyog Pawar 
341*c83a76b0SSuyog Pawar     /* Multi Thread parameters */
342*c83a76b0SSuyog Pawar     ps_params->s_multi_thrd_prms.i4_size = sizeof(ihevce_static_multi_thread_params_t);
343*c83a76b0SSuyog Pawar     ps_params->s_multi_thrd_prms.i4_max_num_cores = 1;
344*c83a76b0SSuyog Pawar     ps_params->s_multi_thrd_prms.i4_memory_alloc_ctrl_flag = 0;
345*c83a76b0SSuyog Pawar     ps_params->s_multi_thrd_prms.i4_num_proc_groups = 1;
346*c83a76b0SSuyog Pawar     ps_params->s_multi_thrd_prms.ai4_num_cores_per_grp[0] = -1;
347*c83a76b0SSuyog Pawar     ps_params->s_multi_thrd_prms.i4_use_thrd_affinity = -1;  //0;
348*c83a76b0SSuyog Pawar     memset(&ps_params->s_multi_thrd_prms.au8_core_aff_mask[0], 0, sizeof(ULWORD64) * MAX_NUM_CORES);
349*c83a76b0SSuyog Pawar 
350*c83a76b0SSuyog Pawar     /* Output Streams parameters */
351*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_size = sizeof(ihevce_out_strm_params_t);
352*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_aud_enable_flags = 0;
353*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_eos_enable_flags = 0;
354*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_codec_profile = 1;
355*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_codec_tier = 0;
356*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_codec_type = 0;
357*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
358*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_sei_buffer_period_flags = 0;
359*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_sei_enable_flag = 0;
360*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_sei_payload_enable_flag = 0;
361*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_sei_pic_timing_flags = 0;
362*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_sei_cll_enable = 0;
363*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.u2_sei_avg_cll = 0;
364*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.u2_sei_max_cll = 0;
365*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_sei_recovery_point_flags = 0;
366*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags = 0;
367*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_decoded_pic_hash_sei_flag = 0;
368*c83a76b0SSuyog Pawar #endif
369*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_sps_at_cdr_enable = 1;
370*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_vui_enable = 0;
371*c83a76b0SSuyog Pawar     /*Set the interoperability flag to 0*/
372*c83a76b0SSuyog Pawar     ps_params->s_out_strm_prms.i4_interop_flags = 0;
373*c83a76b0SSuyog Pawar 
374*c83a76b0SSuyog Pawar     /* Source parameters */
375*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_size = sizeof(ihevce_src_params_t);
376*c83a76b0SSuyog Pawar     ps_params->s_src_prms.inp_chr_format = 1;
377*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_chr_format = 11;
378*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_field_pic = 0;
379*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_frm_rate_denom = 1000;
380*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_frm_rate_num = 30000;
381*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_height = 0;  //1080;
382*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_input_bit_depth = 8;
383*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_topfield_first = 1;
384*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_width = 0;  //1920;
385*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_orig_width = 0;
386*c83a76b0SSuyog Pawar     ps_params->s_src_prms.i4_orig_height = 0;
387*c83a76b0SSuyog Pawar 
388*c83a76b0SSuyog Pawar     /* Target layer parameters */
389*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.i4_size = sizeof(ihevce_tgt_layer_params_t);
390*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.i4_enable_temporal_scalability = 0;
391*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.i4_internal_bit_depth = 8;
392*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.i4_mbr_quality_setting = IHEVCE_MBR_HIGH_QUALITY;
393*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.i4_multi_res_layer_reuse = 0;
394*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.i4_num_res_layers = 1;
395*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.i4_mres_single_out = 0;
396*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.i4_start_res_id = 0;
397*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.pf_scale_chroma = NULL;
398*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.pf_scale_luma = NULL;
399*c83a76b0SSuyog Pawar     ps_params->s_tgt_lyr_prms.pv_scaler_handle = NULL;
400*c83a76b0SSuyog Pawar 
401*c83a76b0SSuyog Pawar     /* target parameters */
402*c83a76b0SSuyog Pawar     for(i = 0; i < IHEVCE_MAX_NUM_RESOLUTIONS; i++)
403*c83a76b0SSuyog Pawar     {
404*c83a76b0SSuyog Pawar         ps_params->s_tgt_lyr_prms.as_tgt_params[i].i4_size = sizeof(ihevce_tgt_params_t);
405*c83a76b0SSuyog Pawar         for(j = 0; j < IHEVCE_MAX_NUM_BITRATES; j++)
406*c83a76b0SSuyog Pawar         {
407*c83a76b0SSuyog Pawar             ps_params->s_tgt_lyr_prms.as_tgt_params[i].ai4_frame_qp[j] = 32;
408*c83a76b0SSuyog Pawar             ps_params->s_tgt_lyr_prms.as_tgt_params[i].ai4_tgt_bitrate[j] = 5000000;
409*c83a76b0SSuyog Pawar             ps_params->s_tgt_lyr_prms.as_tgt_params[i].ai4_peak_bitrate[j] = 10000000;
410*c83a76b0SSuyog Pawar             ps_params->s_tgt_lyr_prms.as_tgt_params[i].ai4_max_vbv_buffer_size[j] = -1;
411*c83a76b0SSuyog Pawar         }
412*c83a76b0SSuyog Pawar         ps_params->s_tgt_lyr_prms.as_tgt_params[i].i4_codec_level = 156;
413*c83a76b0SSuyog Pawar         ps_params->s_tgt_lyr_prms.as_tgt_params[i].i4_frm_rate_scale_factor = 1;
414*c83a76b0SSuyog Pawar         ps_params->s_tgt_lyr_prms.as_tgt_params[i].i4_height = 0;
415*c83a76b0SSuyog Pawar         ps_params->s_tgt_lyr_prms.as_tgt_params[i].i4_num_bitrate_instances = 1;
416*c83a76b0SSuyog Pawar         ps_params->s_tgt_lyr_prms.as_tgt_params[i].i4_quality_preset = IHEVCE_QUALITY_P5;
417*c83a76b0SSuyog Pawar         ps_params->s_tgt_lyr_prms.as_tgt_params[i].i4_width = 0;
418*c83a76b0SSuyog Pawar     }
419*c83a76b0SSuyog Pawar 
420*c83a76b0SSuyog Pawar     /* SEI VUI parameters */
421*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_aspect_ratio_info_present_flag = 0;
422*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.au1_aspect_ratio_idc[0] = 255;
423*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.au2_sar_width[0] = 4;
424*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.au2_sar_height[0] = 3;
425*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_overscan_info_present_flag = 0;
426*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_overscan_appropriate_flag = 0;
427*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_video_signal_type_present_flag = 1;
428*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_video_format = 5;
429*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_video_full_range_flag = 1;
430*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_colour_description_present_flag = 0;
431*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_colour_primaries = 2;
432*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_transfer_characteristics = 2;
433*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_matrix_coefficients = 2;
434*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_chroma_loc_info_present_flag = 0;
435*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_chroma_sample_loc_type_top_field = 0;
436*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_chroma_sample_loc_type_bottom_field = 0;
437*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_vui_hrd_parameters_present_flag = 0;
438*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_timing_info_present_flag = 0;
439*c83a76b0SSuyog Pawar     ps_params->s_vui_sei_prms.u1_nal_hrd_parameters_present_flag = 0;
440*c83a76b0SSuyog Pawar 
441*c83a76b0SSuyog Pawar     /* Setting sysAPIs to NULL */
442*c83a76b0SSuyog Pawar     memset(&ps_params->s_sys_api, 0, sizeof(ihevce_sys_api_t));
443*c83a76b0SSuyog Pawar 
444*c83a76b0SSuyog Pawar     /* Multi pass parameters */
445*c83a76b0SSuyog Pawar     memset(&ps_params->s_pass_prms, 0, sizeof(ihevce_pass_prms_t));
446*c83a76b0SSuyog Pawar     ps_params->s_pass_prms.i4_size = sizeof(ihevce_pass_prms_t);
447*c83a76b0SSuyog Pawar 
448*c83a76b0SSuyog Pawar     /* Tile parameters */
449*c83a76b0SSuyog Pawar     ps_params->s_app_tile_params.i4_size = sizeof(ihevce_app_tile_params_t);
450*c83a76b0SSuyog Pawar     ps_params->s_app_tile_params.i4_tiles_enabled_flag = 0;
451*c83a76b0SSuyog Pawar     ps_params->s_app_tile_params.i4_uniform_spacing_flag = 1;
452*c83a76b0SSuyog Pawar     ps_params->s_app_tile_params.i4_num_tile_cols = 1;
453*c83a76b0SSuyog Pawar     ps_params->s_app_tile_params.i4_num_tile_rows = 1;
454*c83a76b0SSuyog Pawar 
455*c83a76b0SSuyog Pawar     ps_params->s_slice_params.i4_slice_segment_mode = 0;
456*c83a76b0SSuyog Pawar     ps_params->s_slice_params.i4_slice_segment_argument = 1300;
457*c83a76b0SSuyog Pawar 
458*c83a76b0SSuyog Pawar     return (IHEVCE_EOK);
459*c83a76b0SSuyog Pawar }
460*c83a76b0SSuyog Pawar 
461*c83a76b0SSuyog Pawar /*!
462*c83a76b0SSuyog Pawar ******************************************************************************
463*c83a76b0SSuyog Pawar * \if Function name : ihevce_cmds_error_report \endif
464*c83a76b0SSuyog Pawar *
465*c83a76b0SSuyog Pawar * \brief
466*c83a76b0SSuyog Pawar *    Call back from encoder to report errors
467*c83a76b0SSuyog Pawar *
468*c83a76b0SSuyog Pawar * \param[in]    pv_error_handling_cb_handle
469*c83a76b0SSuyog Pawar * \param[in]    i4_error_code
470*c83a76b0SSuyog Pawar * \param[in]    i4_cmd_type
471*c83a76b0SSuyog Pawar * \param[in]    i4_id
472*c83a76b0SSuyog Pawar *
473*c83a76b0SSuyog Pawar * \return
474*c83a76b0SSuyog Pawar *    None
475*c83a76b0SSuyog Pawar *
476*c83a76b0SSuyog Pawar * \author
477*c83a76b0SSuyog Pawar *  Ittiam
478*c83a76b0SSuyog Pawar *
479*c83a76b0SSuyog Pawar *****************************************************************************
480*c83a76b0SSuyog Pawar */
ihevce_cmds_error_report(void * pv_cb_handle,WORD32 i4_error_code,WORD32 i4_cmd_type,WORD32 i4_buf_id)481*c83a76b0SSuyog Pawar IV_API_CALL_STATUS_T ihevce_cmds_error_report(
482*c83a76b0SSuyog Pawar     void *pv_cb_handle, WORD32 i4_error_code, WORD32 i4_cmd_type, WORD32 i4_buf_id)
483*c83a76b0SSuyog Pawar {
484*c83a76b0SSuyog Pawar     /*local variables*/
485*c83a76b0SSuyog Pawar     plugin_ctxt_t *plugin_ctxt = (plugin_ctxt_t *)pv_cb_handle;
486*c83a76b0SSuyog Pawar     ihevce_static_cfg_params_t *ps_static_cfg_params =
487*c83a76b0SSuyog Pawar         ((ihevce_hle_ctxt_t *)plugin_ctxt->pv_hle_interface_ctxt)->ps_static_cfg_prms;
488*c83a76b0SSuyog Pawar 
489*c83a76b0SSuyog Pawar     if(i4_cmd_type == 0)
490*c83a76b0SSuyog Pawar         ps_static_cfg_params->s_sys_api.ihevce_printf(
491*c83a76b0SSuyog Pawar             ps_static_cfg_params->s_sys_api.pv_cb_handle,
492*c83a76b0SSuyog Pawar             "PLUGIN ERROR: Asynchronous Buffer Error %d in Buffer Id %d",
493*c83a76b0SSuyog Pawar             i4_error_code,
494*c83a76b0SSuyog Pawar             i4_buf_id);
495*c83a76b0SSuyog Pawar     else
496*c83a76b0SSuyog Pawar         ps_static_cfg_params->s_sys_api.ihevce_printf(
497*c83a76b0SSuyog Pawar             ps_static_cfg_params->s_sys_api.pv_cb_handle,
498*c83a76b0SSuyog Pawar             "PLUGIN ERROR: Synchronous Buffer Error %d in Buffer Id %d",
499*c83a76b0SSuyog Pawar             i4_error_code,
500*c83a76b0SSuyog Pawar             i4_buf_id);
501*c83a76b0SSuyog Pawar 
502*c83a76b0SSuyog Pawar     return (IV_SUCCESS);
503*c83a76b0SSuyog Pawar }
504*c83a76b0SSuyog Pawar 
505*c83a76b0SSuyog Pawar /*!
506*c83a76b0SSuyog Pawar ******************************************************************************
507*c83a76b0SSuyog Pawar * \if Function name : ihevce_strm_fill_done \endif
508*c83a76b0SSuyog Pawar *
509*c83a76b0SSuyog Pawar * \brief
510*c83a76b0SSuyog Pawar *    Call back from encoder when Bitstream is ready to consume
511*c83a76b0SSuyog Pawar *
512*c83a76b0SSuyog Pawar * \param[in]
513*c83a76b0SSuyog Pawar * \param[in]
514*c83a76b0SSuyog Pawar * \param[in]
515*c83a76b0SSuyog Pawar *
516*c83a76b0SSuyog Pawar * \return
517*c83a76b0SSuyog Pawar *    None
518*c83a76b0SSuyog Pawar *
519*c83a76b0SSuyog Pawar * \author
520*c83a76b0SSuyog Pawar *  Ittiam
521*c83a76b0SSuyog Pawar *
522*c83a76b0SSuyog Pawar *****************************************************************************
523*c83a76b0SSuyog Pawar */
524*c83a76b0SSuyog Pawar IV_API_CALL_STATUS_T
ihevce_strm_fill_done(void * pv_ctxt,void * pv_curr_out,WORD32 i4_br_id,WORD32 i4_res_id)525*c83a76b0SSuyog Pawar     ihevce_strm_fill_done(void *pv_ctxt, void *pv_curr_out, WORD32 i4_br_id, WORD32 i4_res_id)
526*c83a76b0SSuyog Pawar {
527*c83a76b0SSuyog Pawar     /* local variables */
528*c83a76b0SSuyog Pawar     plugin_ctxt_t *ps_ctxt = (plugin_ctxt_t *)pv_ctxt;
529*c83a76b0SSuyog Pawar     app_ctxt_t *ps_app_ctxt = &ps_ctxt->s_app_ctxt;
530*c83a76b0SSuyog Pawar     out_strm_prms_t *ps_out_strm_prms = &ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id];
531*c83a76b0SSuyog Pawar     void *pv_app_out_strm_buf_mutex_hdl = ps_out_strm_prms->pv_app_out_strm_buf_mutex_hdl;
532*c83a76b0SSuyog Pawar     void *pv_app_out_strm_buf_cond_var_hdl = ps_out_strm_prms->pv_app_out_strm_buf_cond_var_hdl;
533*c83a76b0SSuyog Pawar     iv_output_data_buffs_t *ps_curr_out = (iv_output_data_buffs_t *)pv_curr_out;
534*c83a76b0SSuyog Pawar     WORD32 end_flag = ps_curr_out->i4_end_flag;
535*c83a76b0SSuyog Pawar     WORD32 osal_result;
536*c83a76b0SSuyog Pawar 
537*c83a76b0SSuyog Pawar     /* ------  output dump stream  -- */
538*c83a76b0SSuyog Pawar     if((WORD32)IV_FAIL != ps_curr_out->i4_process_ret_sts)
539*c83a76b0SSuyog Pawar     {
540*c83a76b0SSuyog Pawar         if(0 != ps_curr_out->i4_bytes_generated)
541*c83a76b0SSuyog Pawar         {
542*c83a76b0SSuyog Pawar             /* accumulate the total bits generated */
543*c83a76b0SSuyog Pawar             (ps_out_strm_prms->u8_total_bits) += ps_curr_out->i4_bytes_generated * 8;
544*c83a76b0SSuyog Pawar             (ps_out_strm_prms->u4_num_frms_enc)++;
545*c83a76b0SSuyog Pawar         }
546*c83a76b0SSuyog Pawar     }
547*c83a76b0SSuyog Pawar 
548*c83a76b0SSuyog Pawar     /****** Lock the critical section ******/
549*c83a76b0SSuyog Pawar     osal_result = osal_mutex_lock(pv_app_out_strm_buf_mutex_hdl);
550*c83a76b0SSuyog Pawar     if(OSAL_SUCCESS != osal_result)
551*c83a76b0SSuyog Pawar         return (IV_FAIL);
552*c83a76b0SSuyog Pawar 
553*c83a76b0SSuyog Pawar     /* Update the end flag to communicate with the o/p thread */
554*c83a76b0SSuyog Pawar     ps_app_ctxt->ai4_out_strm_end_flag[i4_res_id][i4_br_id] = end_flag;
555*c83a76b0SSuyog Pawar 
556*c83a76b0SSuyog Pawar     /* set the produced status of the buffer */
557*c83a76b0SSuyog Pawar     {
558*c83a76b0SSuyog Pawar         WORD32 idx = ps_curr_out->i4_cb_buf_id;
559*c83a76b0SSuyog Pawar 
560*c83a76b0SSuyog Pawar         ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][idx].i4_timestamp_low =
561*c83a76b0SSuyog Pawar             ps_curr_out->i4_out_timestamp_low;
562*c83a76b0SSuyog Pawar         ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][idx].i4_timestamp_high =
563*c83a76b0SSuyog Pawar             ps_curr_out->i4_out_timestamp_high;
564*c83a76b0SSuyog Pawar         ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][idx].i4_bytes_gen =
565*c83a76b0SSuyog Pawar             ps_curr_out->i4_bytes_generated;
566*c83a76b0SSuyog Pawar         ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][idx].i4_is_key_frame = 0;
567*c83a76b0SSuyog Pawar         ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][idx].i4_end_flag = end_flag;
568*c83a76b0SSuyog Pawar 
569*c83a76b0SSuyog Pawar         if((IV_IDR_FRAME == ps_curr_out->i4_encoded_frame_type) ||
570*c83a76b0SSuyog Pawar            (IV_I_FRAME == ps_curr_out->i4_encoded_frame_type))
571*c83a76b0SSuyog Pawar         {
572*c83a76b0SSuyog Pawar             ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][idx].i4_is_key_frame = 1;
573*c83a76b0SSuyog Pawar         }
574*c83a76b0SSuyog Pawar 
575*c83a76b0SSuyog Pawar         /* set the buffer as produced */
576*c83a76b0SSuyog Pawar         ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][idx].i4_is_prod = 1;
577*c83a76b0SSuyog Pawar     }
578*c83a76b0SSuyog Pawar 
579*c83a76b0SSuyog Pawar     /****** Wake ******/
580*c83a76b0SSuyog Pawar     osal_cond_var_signal(pv_app_out_strm_buf_cond_var_hdl);
581*c83a76b0SSuyog Pawar 
582*c83a76b0SSuyog Pawar     /****** Unlock the critical section ******/
583*c83a76b0SSuyog Pawar     osal_result = osal_mutex_unlock(pv_app_out_strm_buf_mutex_hdl);
584*c83a76b0SSuyog Pawar     if(OSAL_SUCCESS != osal_result)
585*c83a76b0SSuyog Pawar         return (IV_FAIL);
586*c83a76b0SSuyog Pawar 
587*c83a76b0SSuyog Pawar     return (IV_SUCCESS);
588*c83a76b0SSuyog Pawar }
589*c83a76b0SSuyog Pawar 
590*c83a76b0SSuyog Pawar /*!
591*c83a76b0SSuyog Pawar ******************************************************************************
592*c83a76b0SSuyog Pawar * \if Function name : ihevce_plugin_init \endif
593*c83a76b0SSuyog Pawar *
594*c83a76b0SSuyog Pawar * \brief
595*c83a76b0SSuyog Pawar *    Initialises the encoder context and threads
596*c83a76b0SSuyog Pawar *
597*c83a76b0SSuyog Pawar * \param[in] Static params pointer
598*c83a76b0SSuyog Pawar *
599*c83a76b0SSuyog Pawar * \return
600*c83a76b0SSuyog Pawar *    status
601*c83a76b0SSuyog Pawar *
602*c83a76b0SSuyog Pawar * \author
603*c83a76b0SSuyog Pawar *  Ittiam
604*c83a76b0SSuyog Pawar *
605*c83a76b0SSuyog Pawar *****************************************************************************
606*c83a76b0SSuyog Pawar */
ihevce_init(ihevce_static_cfg_params_t * ps_params,void ** ppv_ihevce_hdl)607*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T ihevce_init(ihevce_static_cfg_params_t *ps_params, void **ppv_ihevce_hdl)
608*c83a76b0SSuyog Pawar {
609*c83a76b0SSuyog Pawar     /* local variables */
610*c83a76b0SSuyog Pawar     plugin_ctxt_t *ps_ctxt;
611*c83a76b0SSuyog Pawar     app_ctxt_t *ps_app_ctxt;
612*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_interface_ctxt;
613*c83a76b0SSuyog Pawar     ihevce_sys_api_t *ps_sys_api;
614*c83a76b0SSuyog Pawar     osal_cb_funcs_t s_cb_funcs;
615*c83a76b0SSuyog Pawar     WORD32 status = 0;
616*c83a76b0SSuyog Pawar 
617*c83a76b0SSuyog Pawar     /* sanity checks */
618*c83a76b0SSuyog Pawar     if(NULL == ps_params)
619*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
620*c83a76b0SSuyog Pawar 
621*c83a76b0SSuyog Pawar     if(NULL == ppv_ihevce_hdl)
622*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
623*c83a76b0SSuyog Pawar 
624*c83a76b0SSuyog Pawar     /* set the handle to null by default */
625*c83a76b0SSuyog Pawar     *ppv_ihevce_hdl = NULL;
626*c83a76b0SSuyog Pawar 
627*c83a76b0SSuyog Pawar     /* Initiallizing system apis */
628*c83a76b0SSuyog Pawar     ps_sys_api = &ps_params->s_sys_api;
629*c83a76b0SSuyog Pawar     ihevce_init_sys_api(NULL, ps_sys_api);
630*c83a76b0SSuyog Pawar 
631*c83a76b0SSuyog Pawar     /* --------------------------------------------------------------------- */
632*c83a76b0SSuyog Pawar     /*                   Query and print Encoder version                     */
633*c83a76b0SSuyog Pawar     /* --------------------------------------------------------------------- */
634*c83a76b0SSuyog Pawar     ps_sys_api->ihevce_printf(
635*c83a76b0SSuyog Pawar         ps_sys_api->pv_cb_handle, "Encoder version %s\n\n", ihevce_get_encoder_version());
636*c83a76b0SSuyog Pawar 
637*c83a76b0SSuyog Pawar     /* --------------------------------------------------------------------- */
638*c83a76b0SSuyog Pawar     /*                    Plugin Handle create                               */
639*c83a76b0SSuyog Pawar     /* --------------------------------------------------------------------- */
640*c83a76b0SSuyog Pawar     ps_ctxt = (plugin_ctxt_t *)memory_alloc(NULL, sizeof(plugin_ctxt_t));
641*c83a76b0SSuyog Pawar     if(NULL == ps_ctxt)
642*c83a76b0SSuyog Pawar     {
643*c83a76b0SSuyog Pawar         ps_sys_api->ihevce_printf(
644*c83a76b0SSuyog Pawar             ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Error in Plugin initialization\n");
645*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
646*c83a76b0SSuyog Pawar     }
647*c83a76b0SSuyog Pawar 
648*c83a76b0SSuyog Pawar     /* initialise memory call backs */
649*c83a76b0SSuyog Pawar     ps_ctxt->ihevce_mem_alloc = memory_alloc;
650*c83a76b0SSuyog Pawar     ps_ctxt->ihevce_mem_free = memory_free;
651*c83a76b0SSuyog Pawar 
652*c83a76b0SSuyog Pawar     ps_ctxt->u8_num_frames_encoded = 0;
653*c83a76b0SSuyog Pawar 
654*c83a76b0SSuyog Pawar     if((0 == ps_params->i4_res_id) && (0 == ps_params->i4_br_id))
655*c83a76b0SSuyog Pawar     {
656*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
657*c83a76b0SSuyog Pawar         /*                      OSAL Handle create                               */
658*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
659*c83a76b0SSuyog Pawar         ps_ctxt->pv_osal_handle = memory_alloc(NULL, OSAL_HANDLE_SIZE);
660*c83a76b0SSuyog Pawar 
661*c83a76b0SSuyog Pawar         /* Initialize OSAL call back functions */
662*c83a76b0SSuyog Pawar         s_cb_funcs.mmr_handle = NULL;
663*c83a76b0SSuyog Pawar         s_cb_funcs.osal_alloc = memory_alloc;
664*c83a76b0SSuyog Pawar         s_cb_funcs.osal_free = memory_free;
665*c83a76b0SSuyog Pawar 
666*c83a76b0SSuyog Pawar         status = osal_init(ps_ctxt->pv_osal_handle);
667*c83a76b0SSuyog Pawar         if(OSAL_SUCCESS != status)
668*c83a76b0SSuyog Pawar         {
669*c83a76b0SSuyog Pawar             ps_sys_api->ihevce_printf(
670*c83a76b0SSuyog Pawar                 ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Error in OSAL initialization\n");
671*c83a76b0SSuyog Pawar             return (IHEVCE_EFAIL);
672*c83a76b0SSuyog Pawar         }
673*c83a76b0SSuyog Pawar 
674*c83a76b0SSuyog Pawar         status = osal_register_callbacks(ps_ctxt->pv_osal_handle, &s_cb_funcs);
675*c83a76b0SSuyog Pawar         if(OSAL_SUCCESS != status)
676*c83a76b0SSuyog Pawar         {
677*c83a76b0SSuyog Pawar             ps_sys_api->ihevce_printf(
678*c83a76b0SSuyog Pawar                 ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Error in OSAL call back registration\n");
679*c83a76b0SSuyog Pawar             return (IHEVCE_EFAIL);
680*c83a76b0SSuyog Pawar         }
681*c83a76b0SSuyog Pawar 
682*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
683*c83a76b0SSuyog Pawar         /*                      Thread affinity  Initialization                  */
684*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
685*c83a76b0SSuyog Pawar         if(ps_params->s_multi_thrd_prms.i4_use_thrd_affinity)
686*c83a76b0SSuyog Pawar         {
687*c83a76b0SSuyog Pawar             WORD32 i4_ctr;
688*c83a76b0SSuyog Pawar 
689*c83a76b0SSuyog Pawar             /* loop over all the cores */
690*c83a76b0SSuyog Pawar             for(i4_ctr = 0; i4_ctr < ps_params->s_multi_thrd_prms.i4_max_num_cores; i4_ctr++)
691*c83a76b0SSuyog Pawar             {
692*c83a76b0SSuyog Pawar                 /* All cores are logical cores  */
693*c83a76b0SSuyog Pawar                 ps_params->s_multi_thrd_prms.au8_core_aff_mask[i4_ctr] = ((ULWORD64)1 << i4_ctr);
694*c83a76b0SSuyog Pawar             }
695*c83a76b0SSuyog Pawar         }
696*c83a76b0SSuyog Pawar 
697*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
698*c83a76b0SSuyog Pawar         /*             Context Initialization                                    */
699*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
700*c83a76b0SSuyog Pawar         ps_app_ctxt = &ps_ctxt->s_app_ctxt;
701*c83a76b0SSuyog Pawar 
702*c83a76b0SSuyog Pawar         ps_ctxt->ps_static_cfg_prms = (ihevce_static_cfg_params_t *)ps_ctxt->ihevce_mem_alloc(
703*c83a76b0SSuyog Pawar             NULL, sizeof(ihevce_static_cfg_params_t));
704*c83a76b0SSuyog Pawar         if(NULL == ps_ctxt->ps_static_cfg_prms)
705*c83a76b0SSuyog Pawar         {
706*c83a76b0SSuyog Pawar             ps_sys_api->ihevce_printf(
707*c83a76b0SSuyog Pawar                 ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Error in Plugin memory initialization\n");
708*c83a76b0SSuyog Pawar             return (IHEVCE_EFAIL);
709*c83a76b0SSuyog Pawar         }
710*c83a76b0SSuyog Pawar 
711*c83a76b0SSuyog Pawar         ps_params->apF_csv_file[0][0] = NULL;
712*c83a76b0SSuyog Pawar 
713*c83a76b0SSuyog Pawar         /* set the memory manager handle to NULL */
714*c83a76b0SSuyog Pawar         ps_app_ctxt->pv_mem_mngr_handle = NULL;
715*c83a76b0SSuyog Pawar 
716*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
717*c83a76b0SSuyog Pawar         /*            Back up the static params passed by caller                 */
718*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
719*c83a76b0SSuyog Pawar         memcpy(ps_ctxt->ps_static_cfg_prms, ps_params, sizeof(ihevce_static_cfg_params_t));
720*c83a76b0SSuyog Pawar 
721*c83a76b0SSuyog Pawar         ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_orig_width =
722*c83a76b0SSuyog Pawar             ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_width;
723*c83a76b0SSuyog Pawar         if(HEVCE_MIN_WIDTH > ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_width)
724*c83a76b0SSuyog Pawar         {
725*c83a76b0SSuyog Pawar             ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_width = HEVCE_MIN_WIDTH;
726*c83a76b0SSuyog Pawar         }
727*c83a76b0SSuyog Pawar 
728*c83a76b0SSuyog Pawar         ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_orig_height =
729*c83a76b0SSuyog Pawar             ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_height;
730*c83a76b0SSuyog Pawar         if(HEVCE_MIN_HEIGHT > ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_height)
731*c83a76b0SSuyog Pawar         {
732*c83a76b0SSuyog Pawar             ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_height = HEVCE_MIN_HEIGHT;
733*c83a76b0SSuyog Pawar         }
734*c83a76b0SSuyog Pawar 
735*c83a76b0SSuyog Pawar         /* setting tgt width and height same as src width and height */
736*c83a76b0SSuyog Pawar         ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[0].i4_width =
737*c83a76b0SSuyog Pawar             ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_width;
738*c83a76b0SSuyog Pawar         ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[0].i4_height =
739*c83a76b0SSuyog Pawar             ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_height;
740*c83a76b0SSuyog Pawar 
741*c83a76b0SSuyog Pawar         /* setting key frame interval */
742*c83a76b0SSuyog Pawar         ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period =
743*c83a76b0SSuyog Pawar             MIN(MAX_NUM_FRM_IN_GOP,
744*c83a76b0SSuyog Pawar                 ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period);
745*c83a76b0SSuyog Pawar         ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period =
746*c83a76b0SSuyog Pawar             MIN(MAX_NUM_FRM_IN_GOP,
747*c83a76b0SSuyog Pawar                 ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period);
748*c83a76b0SSuyog Pawar         ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period =
749*c83a76b0SSuyog Pawar             MIN(MAX_NUM_FRM_IN_GOP,
750*c83a76b0SSuyog Pawar                 ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period);
751*c83a76b0SSuyog Pawar 
752*c83a76b0SSuyog Pawar         /* entropy sync is disabled if there is only one CTB row */
753*c83a76b0SSuyog Pawar         if(ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_height <=
754*c83a76b0SSuyog Pawar             (1 << ps_ctxt->ps_static_cfg_prms->s_config_prms.i4_max_log2_cu_size))
755*c83a76b0SSuyog Pawar         {
756*c83a76b0SSuyog Pawar             ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_enable_entropy_sync = 0;
757*c83a76b0SSuyog Pawar         }
758*c83a76b0SSuyog Pawar 
759*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
760*c83a76b0SSuyog Pawar         /*            High Level Encoder context init                            */
761*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
762*c83a76b0SSuyog Pawar         ps_interface_ctxt =
763*c83a76b0SSuyog Pawar             (ihevce_hle_ctxt_t *)ps_ctxt->ihevce_mem_alloc(NULL, sizeof(ihevce_hle_ctxt_t));
764*c83a76b0SSuyog Pawar         if(NULL == ps_interface_ctxt)
765*c83a76b0SSuyog Pawar         {
766*c83a76b0SSuyog Pawar             ps_sys_api->ihevce_printf(
767*c83a76b0SSuyog Pawar                 ps_sys_api->pv_cb_handle,
768*c83a76b0SSuyog Pawar                 "IHEVCE ERROR: Error in Plugin HLE memory initialization\n");
769*c83a76b0SSuyog Pawar             return (IHEVCE_EFAIL);
770*c83a76b0SSuyog Pawar         }
771*c83a76b0SSuyog Pawar         ps_interface_ctxt->i4_size = sizeof(ihevce_hle_ctxt_t);
772*c83a76b0SSuyog Pawar 
773*c83a76b0SSuyog Pawar         ps_ctxt->pv_hle_interface_ctxt = ps_interface_ctxt;
774*c83a76b0SSuyog Pawar 
775*c83a76b0SSuyog Pawar         /* store the static config parameters pointer */
776*c83a76b0SSuyog Pawar         ps_interface_ctxt->ps_static_cfg_prms = ps_ctxt->ps_static_cfg_prms;
777*c83a76b0SSuyog Pawar 
778*c83a76b0SSuyog Pawar         /* initialise the interface strucure parameters */
779*c83a76b0SSuyog Pawar         ps_interface_ctxt->pv_inp_cb_handle = (void *)ps_ctxt;
780*c83a76b0SSuyog Pawar         ps_interface_ctxt->pv_out_cb_handle = (void *)ps_ctxt;
781*c83a76b0SSuyog Pawar         ps_interface_ctxt->pv_recon_cb_handle = (void *)ps_ctxt;
782*c83a76b0SSuyog Pawar 
783*c83a76b0SSuyog Pawar         ps_interface_ctxt->pv_osal_handle = ps_ctxt->pv_osal_handle;
784*c83a76b0SSuyog Pawar         ps_interface_ctxt->ihevce_mem_alloc = mem_mngr_alloc;
785*c83a76b0SSuyog Pawar         ps_interface_ctxt->ihevce_mem_free = mem_mngr_free;
786*c83a76b0SSuyog Pawar         ps_interface_ctxt->i4_hle_init_done = 0;
787*c83a76b0SSuyog Pawar         ps_interface_ctxt->pv_mem_mgr_hdl = ps_app_ctxt->pv_mem_mngr_handle;
788*c83a76b0SSuyog Pawar 
789*c83a76b0SSuyog Pawar         /* reigter the callbacks */
790*c83a76b0SSuyog Pawar         ps_interface_ctxt->ihevce_output_strm_fill_done = ihevce_strm_fill_done;
791*c83a76b0SSuyog Pawar         ps_interface_ctxt->ihevce_output_recon_fill_done = NULL;
792*c83a76b0SSuyog Pawar         ps_interface_ctxt->ihevce_set_free_input_buff = NULL;
793*c83a76b0SSuyog Pawar 
794*c83a76b0SSuyog Pawar         /*Added for run time or create time creation*/
795*c83a76b0SSuyog Pawar         ps_interface_ctxt->i4_create_time_input_allocation = (WORD32)CREATE_TIME_ALLOCATION_INPUT;
796*c83a76b0SSuyog Pawar         ps_interface_ctxt->i4_create_time_output_allocation = (WORD32)CREATE_TIME_ALLOCATION_OUTPUT;
797*c83a76b0SSuyog Pawar 
798*c83a76b0SSuyog Pawar         ps_interface_ctxt->ihevce_cmds_error_report = ihevce_cmds_error_report;
799*c83a76b0SSuyog Pawar         ps_interface_ctxt->pv_cmd_err_cb_handle = (void *)ps_ctxt;
800*c83a76b0SSuyog Pawar 
801*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
802*c83a76b0SSuyog Pawar         /*           High Level Encoder Instance Creation                        */
803*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
804*c83a76b0SSuyog Pawar         status = ihevce_hle_interface_create(ps_interface_ctxt);
805*c83a76b0SSuyog Pawar         if((WORD32)IV_FAIL == status)
806*c83a76b0SSuyog Pawar         {
807*c83a76b0SSuyog Pawar             ihevce_hle_interface_delete(ps_interface_ctxt);
808*c83a76b0SSuyog Pawar 
809*c83a76b0SSuyog Pawar             memory_free(NULL, ps_interface_ctxt);
810*c83a76b0SSuyog Pawar 
811*c83a76b0SSuyog Pawar             /* free static config memory */
812*c83a76b0SSuyog Pawar             ps_ctxt->ihevce_mem_free(NULL, ps_ctxt->ps_static_cfg_prms);
813*c83a76b0SSuyog Pawar 
814*c83a76b0SSuyog Pawar             /* free osal handle */
815*c83a76b0SSuyog Pawar             memory_free(NULL, ps_ctxt->pv_osal_handle);
816*c83a76b0SSuyog Pawar 
817*c83a76b0SSuyog Pawar             /* free plugin ctxt memory */
818*c83a76b0SSuyog Pawar             memory_free(NULL, ps_ctxt);
819*c83a76b0SSuyog Pawar 
820*c83a76b0SSuyog Pawar             ps_sys_api->ihevce_printf(
821*c83a76b0SSuyog Pawar                 ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Error in Plugin HLE create failed\n");
822*c83a76b0SSuyog Pawar             return (IHEVCE_EFAIL);
823*c83a76b0SSuyog Pawar         }
824*c83a76b0SSuyog Pawar 
825*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
826*c83a76b0SSuyog Pawar         /*            Input Output and Command buffer allocation                 */
827*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
828*c83a76b0SSuyog Pawar         {
829*c83a76b0SSuyog Pawar             WORD32 ctr;
830*c83a76b0SSuyog Pawar             WORD32 buf_size;
831*c83a76b0SSuyog Pawar             UWORD8 *pu1_tmp_buf;
832*c83a76b0SSuyog Pawar             WORD32 i4_res_id;
833*c83a76b0SSuyog Pawar             WORD32 i4_br_id;
834*c83a76b0SSuyog Pawar             WORD32 i4_num_resolutions;
835*c83a76b0SSuyog Pawar             WORD32 ai4_num_bitrate_instances[IHEVCE_MAX_NUM_RESOLUTIONS] = { 1 };
836*c83a76b0SSuyog Pawar             iv_input_bufs_req_t s_input_bufs_req;
837*c83a76b0SSuyog Pawar             iv_res_layer_output_bufs_req_t s_res_layer_output_bufs_req;
838*c83a76b0SSuyog Pawar             iv_res_layer_recon_bufs_req_t s_res_layer_recon_bufs_req;
839*c83a76b0SSuyog Pawar 
840*c83a76b0SSuyog Pawar             /* local array of pointers */
841*c83a76b0SSuyog Pawar             void *apv_inp_luma_bufs[MAX_NUM_INP_DATA_BUFS];
842*c83a76b0SSuyog Pawar             void *apv_inp_cb_bufs[MAX_NUM_INP_DATA_BUFS];
843*c83a76b0SSuyog Pawar             void *apv_inp_cr_bufs[MAX_NUM_INP_DATA_BUFS];
844*c83a76b0SSuyog Pawar             void *apv_inp_sync_bufs[MAX_NUM_INP_CTRL_SYNC_BUFS];
845*c83a76b0SSuyog Pawar             void *apv_inp_async_bufs[MAX_NUM_INP_CTRL_ASYNC_BUFS];
846*c83a76b0SSuyog Pawar             void *apv_out_data_bufs[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]
847*c83a76b0SSuyog Pawar                                    [MAX_NUM_OUT_DATA_BUFS];
848*c83a76b0SSuyog Pawar 
849*c83a76b0SSuyog Pawar             /* get the number of resolutions */
850*c83a76b0SSuyog Pawar             i4_num_resolutions = ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.i4_num_res_layers;
851*c83a76b0SSuyog Pawar 
852*c83a76b0SSuyog Pawar             /* set the size of the structure */
853*c83a76b0SSuyog Pawar             s_input_bufs_req.i4_size = sizeof(iv_input_bufs_req_t);
854*c83a76b0SSuyog Pawar             s_res_layer_output_bufs_req.i4_size = sizeof(iv_res_layer_output_bufs_req_t);
855*c83a76b0SSuyog Pawar             s_res_layer_recon_bufs_req.i4_size = sizeof(iv_res_layer_recon_bufs_req_t);
856*c83a76b0SSuyog Pawar 
857*c83a76b0SSuyog Pawar             /* loop over num resolutions */
858*c83a76b0SSuyog Pawar             for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
859*c83a76b0SSuyog Pawar             {
860*c83a76b0SSuyog Pawar                 /* store the number of bitrates */
861*c83a76b0SSuyog Pawar                 ai4_num_bitrate_instances[i4_res_id] =
862*c83a76b0SSuyog Pawar                     ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_res_id]
863*c83a76b0SSuyog Pawar                         .i4_num_bitrate_instances;
864*c83a76b0SSuyog Pawar 
865*c83a76b0SSuyog Pawar                 /* loop over num bitrates */
866*c83a76b0SSuyog Pawar                 for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
867*c83a76b0SSuyog Pawar                 {
868*c83a76b0SSuyog Pawar                     s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id].i4_size =
869*c83a76b0SSuyog Pawar                         sizeof(iv_output_bufs_req_t);
870*c83a76b0SSuyog Pawar                 }
871*c83a76b0SSuyog Pawar             }
872*c83a76b0SSuyog Pawar 
873*c83a76b0SSuyog Pawar             /* call Query I/O buffer */
874*c83a76b0SSuyog Pawar             status = ihevce_query_io_buf_req(
875*c83a76b0SSuyog Pawar                 ps_interface_ctxt,
876*c83a76b0SSuyog Pawar                 &s_input_bufs_req,
877*c83a76b0SSuyog Pawar                 &s_res_layer_output_bufs_req,
878*c83a76b0SSuyog Pawar                 &s_res_layer_recon_bufs_req);
879*c83a76b0SSuyog Pawar 
880*c83a76b0SSuyog Pawar             /* check on the requirements against the MAX of application */
881*c83a76b0SSuyog Pawar             /* should be present only for debug purpose                 */
882*c83a76b0SSuyog Pawar 
883*c83a76b0SSuyog Pawar             /* ---------------  Input data buffers init ---------------------- */
884*c83a76b0SSuyog Pawar             /* allocate memory for input buffers  */
885*c83a76b0SSuyog Pawar             if(ps_interface_ctxt->i4_create_time_input_allocation == 1)
886*c83a76b0SSuyog Pawar             {
887*c83a76b0SSuyog Pawar                 buf_size = s_input_bufs_req.i4_min_size_uv_buf + s_input_bufs_req.i4_min_size_y_buf;
888*c83a76b0SSuyog Pawar                 ps_ctxt->s_memtab_inp_data_buf.i4_size = sizeof(iv_mem_rec_t);
889*c83a76b0SSuyog Pawar                 ps_ctxt->s_memtab_inp_data_buf.i4_mem_alignment = 4;
890*c83a76b0SSuyog Pawar                 ps_ctxt->s_memtab_inp_data_buf.i4_mem_size =
891*c83a76b0SSuyog Pawar                     (s_input_bufs_req.i4_min_num_yuv_bufs + XTRA_INP_DATA_BUFS) * buf_size;
892*c83a76b0SSuyog Pawar                 ps_ctxt->s_memtab_inp_data_buf.e_mem_type = IV_EXT_CACHEABLE_NUMA_NODE0_MEM;
893*c83a76b0SSuyog Pawar 
894*c83a76b0SSuyog Pawar                 mem_mngr_alloc(
895*c83a76b0SSuyog Pawar                     ps_app_ctxt->pv_mem_mngr_handle, ps_sys_api, &ps_ctxt->s_memtab_inp_data_buf);
896*c83a76b0SSuyog Pawar 
897*c83a76b0SSuyog Pawar                 pu1_tmp_buf = (UWORD8 *)ps_ctxt->s_memtab_inp_data_buf.pv_base;
898*c83a76b0SSuyog Pawar 
899*c83a76b0SSuyog Pawar                 if(NULL == pu1_tmp_buf)
900*c83a76b0SSuyog Pawar                 {
901*c83a76b0SSuyog Pawar                     ps_sys_api->ihevce_printf(
902*c83a76b0SSuyog Pawar                         ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Error in allocate memory\n");
903*c83a76b0SSuyog Pawar                     return (IHEVCE_EFAIL);
904*c83a76b0SSuyog Pawar                 }
905*c83a76b0SSuyog Pawar 
906*c83a76b0SSuyog Pawar                 /* loop to initialise the buffer pointer */
907*c83a76b0SSuyog Pawar                 for(ctr = 0; ctr < s_input_bufs_req.i4_min_num_yuv_bufs + XTRA_INP_DATA_BUFS; ctr++)
908*c83a76b0SSuyog Pawar                 {
909*c83a76b0SSuyog Pawar                     apv_inp_luma_bufs[ctr] = pu1_tmp_buf;
910*c83a76b0SSuyog Pawar                     apv_inp_cb_bufs[ctr] = pu1_tmp_buf + s_input_bufs_req.i4_min_size_y_buf;
911*c83a76b0SSuyog Pawar                     apv_inp_cr_bufs[ctr] = NULL; /* 420SP case */
912*c83a76b0SSuyog Pawar 
913*c83a76b0SSuyog Pawar                     /* increment the input buffer pointer to next buffer */
914*c83a76b0SSuyog Pawar                     pu1_tmp_buf += buf_size;
915*c83a76b0SSuyog Pawar                 }
916*c83a76b0SSuyog Pawar             }
917*c83a76b0SSuyog Pawar 
918*c83a76b0SSuyog Pawar             /* ---------------  Output data buffers init ---------------------- */
919*c83a76b0SSuyog Pawar 
920*c83a76b0SSuyog Pawar             /* loop over num resolutions */
921*c83a76b0SSuyog Pawar             for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
922*c83a76b0SSuyog Pawar             {
923*c83a76b0SSuyog Pawar                 for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
924*c83a76b0SSuyog Pawar                 {
925*c83a76b0SSuyog Pawar                     buf_size = s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id]
926*c83a76b0SSuyog Pawar                                    .i4_min_size_bitstream_buf;
927*c83a76b0SSuyog Pawar 
928*c83a76b0SSuyog Pawar                     ps_ctxt->as_memtab_out_data_buf[i4_res_id][i4_br_id].i4_size =
929*c83a76b0SSuyog Pawar                         sizeof(iv_mem_rec_t);
930*c83a76b0SSuyog Pawar                     ps_ctxt->as_memtab_out_data_buf[i4_res_id][i4_br_id].i4_mem_alignment = 4;
931*c83a76b0SSuyog Pawar 
932*c83a76b0SSuyog Pawar                     if(!ps_interface_ctxt->i4_create_time_output_allocation)
933*c83a76b0SSuyog Pawar                     {
934*c83a76b0SSuyog Pawar                         ps_ctxt->as_memtab_out_data_buf[i4_res_id][i4_br_id].i4_mem_size =
935*c83a76b0SSuyog Pawar                             (s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id]
936*c83a76b0SSuyog Pawar                                  .i4_min_num_out_bufs +
937*c83a76b0SSuyog Pawar                              XTRA_OUT_DATA_BUFS) *
938*c83a76b0SSuyog Pawar                             buf_size;
939*c83a76b0SSuyog Pawar                     }
940*c83a76b0SSuyog Pawar                     else
941*c83a76b0SSuyog Pawar                     {
942*c83a76b0SSuyog Pawar                         ps_ctxt->as_memtab_out_data_buf[i4_res_id][i4_br_id].i4_mem_size =
943*c83a76b0SSuyog Pawar                             (s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id]
944*c83a76b0SSuyog Pawar                                  .i4_min_num_out_bufs) *
945*c83a76b0SSuyog Pawar                             buf_size;
946*c83a76b0SSuyog Pawar                     }
947*c83a76b0SSuyog Pawar                     ps_ctxt->as_memtab_out_data_buf[i4_res_id][i4_br_id].e_mem_type =
948*c83a76b0SSuyog Pawar                         IV_EXT_CACHEABLE_NUMA_NODE1_MEM;
949*c83a76b0SSuyog Pawar 
950*c83a76b0SSuyog Pawar                     mem_mngr_alloc(
951*c83a76b0SSuyog Pawar                         ps_app_ctxt->pv_mem_mngr_handle,
952*c83a76b0SSuyog Pawar                         ps_sys_api,
953*c83a76b0SSuyog Pawar                         &ps_ctxt->as_memtab_out_data_buf[i4_res_id][i4_br_id]);
954*c83a76b0SSuyog Pawar 
955*c83a76b0SSuyog Pawar                     pu1_tmp_buf =
956*c83a76b0SSuyog Pawar                         (UWORD8 *)ps_ctxt->as_memtab_out_data_buf[i4_res_id][i4_br_id].pv_base;
957*c83a76b0SSuyog Pawar                     if(NULL == pu1_tmp_buf)
958*c83a76b0SSuyog Pawar                     {
959*c83a76b0SSuyog Pawar                         ps_sys_api->ihevce_printf(
960*c83a76b0SSuyog Pawar                             ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Error in allocate memory\n");
961*c83a76b0SSuyog Pawar                         return (IHEVCE_EFAIL);
962*c83a76b0SSuyog Pawar                     }
963*c83a76b0SSuyog Pawar 
964*c83a76b0SSuyog Pawar                     if(ps_interface_ctxt->i4_create_time_output_allocation == 1)
965*c83a76b0SSuyog Pawar                     {
966*c83a76b0SSuyog Pawar                         /* loop to initialise the buffer pointer */
967*c83a76b0SSuyog Pawar                         for(ctr = 0;
968*c83a76b0SSuyog Pawar                             ctr < s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id]
969*c83a76b0SSuyog Pawar                                       .i4_min_num_out_bufs;
970*c83a76b0SSuyog Pawar                             ctr++)
971*c83a76b0SSuyog Pawar                         {
972*c83a76b0SSuyog Pawar                             apv_out_data_bufs[i4_res_id][i4_br_id][ctr] = pu1_tmp_buf;
973*c83a76b0SSuyog Pawar                             pu1_tmp_buf += buf_size;
974*c83a76b0SSuyog Pawar                         }
975*c83a76b0SSuyog Pawar                     }
976*c83a76b0SSuyog Pawar                     else
977*c83a76b0SSuyog Pawar                     {
978*c83a76b0SSuyog Pawar                         WORD32 i4_num_out_bufs =
979*c83a76b0SSuyog Pawar                             s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id]
980*c83a76b0SSuyog Pawar                                 .i4_min_num_out_bufs +
981*c83a76b0SSuyog Pawar                             XTRA_OUT_DATA_BUFS;
982*c83a76b0SSuyog Pawar                         ps_ctxt->i4_num_out_bufs = i4_num_out_bufs;
983*c83a76b0SSuyog Pawar                         ps_ctxt->ai4_free_out_buf_idx[i4_res_id][i4_br_id] = 0;
984*c83a76b0SSuyog Pawar                         ps_ctxt->i4_prod_out_buf_idx = 0;
985*c83a76b0SSuyog Pawar 
986*c83a76b0SSuyog Pawar                         /* Assert to make sure ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][] array
987*c83a76b0SSuyog Pawar                         has more bufs than ps_ctxt->i4_num_out_bufs. Needed to identify
988*c83a76b0SSuyog Pawar                         wrap-around case */
989*c83a76b0SSuyog Pawar                         ASSERT(ps_ctxt->i4_num_out_bufs <= MAX_NUM_OUT_DATA_BUFS);
990*c83a76b0SSuyog Pawar 
991*c83a76b0SSuyog Pawar                         /* loop to initialise the buffer pointer */
992*c83a76b0SSuyog Pawar                         for(ctr = 0; ctr < i4_num_out_bufs; ctr++)
993*c83a76b0SSuyog Pawar                         {
994*c83a76b0SSuyog Pawar                             ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ctr].i4_idx = ctr;
995*c83a76b0SSuyog Pawar                             ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ctr].i4_is_free = 1;
996*c83a76b0SSuyog Pawar                             ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ctr].i4_is_prod = 0;
997*c83a76b0SSuyog Pawar                             ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ctr].i4_bytes_gen = 0;
998*c83a76b0SSuyog Pawar                             ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ctr].pu1_buf = pu1_tmp_buf;
999*c83a76b0SSuyog Pawar                             ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ctr].i4_buf_size = buf_size;
1000*c83a76b0SSuyog Pawar                             pu1_tmp_buf += buf_size;
1001*c83a76b0SSuyog Pawar                         }
1002*c83a76b0SSuyog Pawar                     }
1003*c83a76b0SSuyog Pawar 
1004*c83a76b0SSuyog Pawar                     /* create mutex for controlling the out strm buf b/w appln and encoder */
1005*c83a76b0SSuyog Pawar                     ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1006*c83a76b0SSuyog Pawar                         .pv_app_out_strm_buf_mutex_hdl = osal_mutex_create(ps_ctxt->pv_osal_handle);
1007*c83a76b0SSuyog Pawar                     if(NULL == ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1008*c83a76b0SSuyog Pawar                                    .pv_app_out_strm_buf_mutex_hdl)
1009*c83a76b0SSuyog Pawar                     {
1010*c83a76b0SSuyog Pawar                         ps_sys_api->ihevce_printf(
1011*c83a76b0SSuyog Pawar                             ps_sys_api->pv_cb_handle,
1012*c83a76b0SSuyog Pawar                             "IHEVCE ERROR: Error in Plugin initialization\n");
1013*c83a76b0SSuyog Pawar                         return (IHEVCE_EFAIL);
1014*c83a76b0SSuyog Pawar                     }
1015*c83a76b0SSuyog Pawar 
1016*c83a76b0SSuyog Pawar                     /* create mutex for controlling the out strm buf b/w appln and encoder */
1017*c83a76b0SSuyog Pawar                     ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1018*c83a76b0SSuyog Pawar                         .pv_app_out_strm_buf_cond_var_hdl =
1019*c83a76b0SSuyog Pawar                         osal_cond_var_create(ps_ctxt->pv_osal_handle);
1020*c83a76b0SSuyog Pawar                     if(NULL == ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1021*c83a76b0SSuyog Pawar                                    .pv_app_out_strm_buf_cond_var_hdl)
1022*c83a76b0SSuyog Pawar                     {
1023*c83a76b0SSuyog Pawar                         ps_sys_api->ihevce_printf(
1024*c83a76b0SSuyog Pawar                             ps_sys_api->pv_cb_handle,
1025*c83a76b0SSuyog Pawar                             "IHEVCE ERROR: Error in Plugin initialization\n");
1026*c83a76b0SSuyog Pawar                         return (IHEVCE_EFAIL);
1027*c83a76b0SSuyog Pawar                     }
1028*c83a76b0SSuyog Pawar                 }
1029*c83a76b0SSuyog Pawar             }
1030*c83a76b0SSuyog Pawar 
1031*c83a76b0SSuyog Pawar             if(ps_interface_ctxt->i4_create_time_input_allocation == 1)
1032*c83a76b0SSuyog Pawar             {
1033*c83a76b0SSuyog Pawar                 /* ------------- Input sync command buffers init -------------------- */
1034*c83a76b0SSuyog Pawar                 buf_size = s_input_bufs_req.i4_min_size_synch_ctrl_bufs;
1035*c83a76b0SSuyog Pawar 
1036*c83a76b0SSuyog Pawar                 ps_ctxt->s_memtab_inp_sync_ctrl_buf.i4_size = sizeof(iv_mem_rec_t);
1037*c83a76b0SSuyog Pawar                 ps_ctxt->s_memtab_inp_sync_ctrl_buf.i4_mem_alignment = 4;
1038*c83a76b0SSuyog Pawar                 ps_ctxt->s_memtab_inp_sync_ctrl_buf.i4_mem_size =
1039*c83a76b0SSuyog Pawar                     (s_input_bufs_req.i4_min_num_yuv_bufs + XTRA_INP_DATA_BUFS) * buf_size;
1040*c83a76b0SSuyog Pawar                 ps_ctxt->s_memtab_inp_sync_ctrl_buf.e_mem_type = IV_EXT_CACHEABLE_NUMA_NODE0_MEM;
1041*c83a76b0SSuyog Pawar 
1042*c83a76b0SSuyog Pawar                 mem_mngr_alloc(
1043*c83a76b0SSuyog Pawar                     ps_app_ctxt->pv_mem_mngr_handle,
1044*c83a76b0SSuyog Pawar                     ps_sys_api,
1045*c83a76b0SSuyog Pawar                     &ps_ctxt->s_memtab_inp_sync_ctrl_buf);
1046*c83a76b0SSuyog Pawar 
1047*c83a76b0SSuyog Pawar                 pu1_tmp_buf = (UWORD8 *)ps_ctxt->s_memtab_inp_sync_ctrl_buf.pv_base;
1048*c83a76b0SSuyog Pawar 
1049*c83a76b0SSuyog Pawar                 if(NULL == pu1_tmp_buf)
1050*c83a76b0SSuyog Pawar                 {
1051*c83a76b0SSuyog Pawar                     ps_sys_api->ihevce_printf(
1052*c83a76b0SSuyog Pawar                         ps_sys_api->pv_cb_handle, "IHEVCE ERROR: Error in allocate memory\n");
1053*c83a76b0SSuyog Pawar                     return (IHEVCE_EFAIL);
1054*c83a76b0SSuyog Pawar                 }
1055*c83a76b0SSuyog Pawar 
1056*c83a76b0SSuyog Pawar                 /* loop to initialise the buffer pointer */
1057*c83a76b0SSuyog Pawar                 for(ctr = 0; ctr < s_input_bufs_req.i4_min_num_yuv_bufs + XTRA_INP_DATA_BUFS; ctr++)
1058*c83a76b0SSuyog Pawar                 {
1059*c83a76b0SSuyog Pawar                     apv_inp_sync_bufs[ctr] = pu1_tmp_buf;
1060*c83a76b0SSuyog Pawar                     pu1_tmp_buf += buf_size;
1061*c83a76b0SSuyog Pawar                 }
1062*c83a76b0SSuyog Pawar             }
1063*c83a76b0SSuyog Pawar 
1064*c83a76b0SSuyog Pawar             /* ------------- Input async command buffers init -------------------- */
1065*c83a76b0SSuyog Pawar             buf_size = s_input_bufs_req.i4_min_size_asynch_ctrl_bufs;
1066*c83a76b0SSuyog Pawar 
1067*c83a76b0SSuyog Pawar             /* allocate memory for output status buffer */
1068*c83a76b0SSuyog Pawar             ps_ctxt->pu1_inp_async_ctrl_buf = (UWORD8 *)ps_ctxt->ihevce_mem_alloc(
1069*c83a76b0SSuyog Pawar                 NULL, s_input_bufs_req.i4_min_num_asynch_ctrl_bufs * buf_size);
1070*c83a76b0SSuyog Pawar             if(ps_ctxt->pu1_inp_async_ctrl_buf == NULL)
1071*c83a76b0SSuyog Pawar             {
1072*c83a76b0SSuyog Pawar                 ps_sys_api->ihevce_printf(
1073*c83a76b0SSuyog Pawar                     ps_sys_api->pv_cb_handle,
1074*c83a76b0SSuyog Pawar                     "IHEVCE ERROR: Error in Plugin memory initialization\n");
1075*c83a76b0SSuyog Pawar                 return (IHEVCE_EFAIL);
1076*c83a76b0SSuyog Pawar             }
1077*c83a76b0SSuyog Pawar 
1078*c83a76b0SSuyog Pawar             pu1_tmp_buf = ps_ctxt->pu1_inp_async_ctrl_buf;
1079*c83a76b0SSuyog Pawar 
1080*c83a76b0SSuyog Pawar             /* loop to initialise the buffer pointer */
1081*c83a76b0SSuyog Pawar             for(ctr = 0; ctr < s_input_bufs_req.i4_min_num_asynch_ctrl_bufs; ctr++)
1082*c83a76b0SSuyog Pawar             {
1083*c83a76b0SSuyog Pawar                 apv_inp_async_bufs[ctr] = pu1_tmp_buf;
1084*c83a76b0SSuyog Pawar                 pu1_tmp_buf += buf_size;
1085*c83a76b0SSuyog Pawar             }
1086*c83a76b0SSuyog Pawar 
1087*c83a76b0SSuyog Pawar             /* Create IO ports for the buffer allocated */
1088*c83a76b0SSuyog Pawar             {
1089*c83a76b0SSuyog Pawar                 iv_input_data_ctrl_buffs_desc_t s_inp_desc;
1090*c83a76b0SSuyog Pawar                 iv_input_asynch_ctrl_buffs_desc_t s_inp_ctrl_desc;
1091*c83a76b0SSuyog Pawar                 iv_res_layer_output_data_buffs_desc_t s_mres_out_desc;
1092*c83a76b0SSuyog Pawar                 iv_res_layer_recon_data_buffs_desc_t s_mres_recon_desc;
1093*c83a76b0SSuyog Pawar 
1094*c83a76b0SSuyog Pawar                 /* set the parameters of the input data control desc */
1095*c83a76b0SSuyog Pawar                 s_inp_desc.i4_size = sizeof(iv_input_data_ctrl_buffs_desc_t);
1096*c83a76b0SSuyog Pawar                 s_inp_desc.i4_num_synch_ctrl_bufs = s_input_bufs_req.i4_min_num_synch_ctrl_bufs;
1097*c83a76b0SSuyog Pawar                 s_inp_desc.i4_num_yuv_bufs =
1098*c83a76b0SSuyog Pawar                     s_input_bufs_req.i4_min_num_yuv_bufs + XTRA_INP_DATA_BUFS;
1099*c83a76b0SSuyog Pawar                 s_inp_desc.i4_size_y_buf = s_input_bufs_req.i4_min_size_y_buf;
1100*c83a76b0SSuyog Pawar                 s_inp_desc.i4_size_uv_buf = s_input_bufs_req.i4_min_size_uv_buf;
1101*c83a76b0SSuyog Pawar                 s_inp_desc.i4_size_synch_ctrl_bufs = s_input_bufs_req.i4_min_size_synch_ctrl_bufs;
1102*c83a76b0SSuyog Pawar                 s_inp_desc.ppv_synch_ctrl_bufs = &apv_inp_sync_bufs[0];
1103*c83a76b0SSuyog Pawar                 s_inp_desc.ppv_y_buf = &apv_inp_luma_bufs[0];
1104*c83a76b0SSuyog Pawar                 s_inp_desc.ppv_u_buf = &apv_inp_cb_bufs[0];
1105*c83a76b0SSuyog Pawar                 s_inp_desc.ppv_v_buf = &apv_inp_cr_bufs[0];
1106*c83a76b0SSuyog Pawar 
1107*c83a76b0SSuyog Pawar                 /* set the parameters of the input async control desc */
1108*c83a76b0SSuyog Pawar                 s_inp_ctrl_desc.i4_size = sizeof(iv_input_asynch_ctrl_buffs_desc_t);
1109*c83a76b0SSuyog Pawar                 s_inp_ctrl_desc.i4_num_asynch_ctrl_bufs =
1110*c83a76b0SSuyog Pawar                     s_input_bufs_req.i4_min_num_asynch_ctrl_bufs;
1111*c83a76b0SSuyog Pawar                 s_inp_ctrl_desc.i4_size_asynch_ctrl_bufs =
1112*c83a76b0SSuyog Pawar                     s_input_bufs_req.i4_min_size_asynch_ctrl_bufs;
1113*c83a76b0SSuyog Pawar                 s_inp_ctrl_desc.ppv_asynch_ctrl_bufs = &apv_inp_async_bufs[0];
1114*c83a76b0SSuyog Pawar 
1115*c83a76b0SSuyog Pawar                 for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
1116*c83a76b0SSuyog Pawar                 {
1117*c83a76b0SSuyog Pawar                     /* set the parameters of the output data desc */
1118*c83a76b0SSuyog Pawar                     for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
1119*c83a76b0SSuyog Pawar                     {
1120*c83a76b0SSuyog Pawar                         s_mres_out_desc.s_output_data_buffs[i4_res_id][i4_br_id].i4_size =
1121*c83a76b0SSuyog Pawar                             sizeof(iv_output_data_buffs_desc_t);
1122*c83a76b0SSuyog Pawar 
1123*c83a76b0SSuyog Pawar                         if(!ps_interface_ctxt->i4_create_time_output_allocation)
1124*c83a76b0SSuyog Pawar                         {
1125*c83a76b0SSuyog Pawar                             s_mres_out_desc.s_output_data_buffs[i4_res_id][i4_br_id]
1126*c83a76b0SSuyog Pawar                                 .i4_num_bitstream_bufs =
1127*c83a76b0SSuyog Pawar                                 s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id]
1128*c83a76b0SSuyog Pawar                                     .i4_min_num_out_bufs +
1129*c83a76b0SSuyog Pawar                                 XTRA_OUT_DATA_BUFS;
1130*c83a76b0SSuyog Pawar                         }
1131*c83a76b0SSuyog Pawar                         else
1132*c83a76b0SSuyog Pawar                         {
1133*c83a76b0SSuyog Pawar                             s_mres_out_desc.s_output_data_buffs[i4_res_id][i4_br_id]
1134*c83a76b0SSuyog Pawar                                 .i4_num_bitstream_bufs =
1135*c83a76b0SSuyog Pawar                                 s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id]
1136*c83a76b0SSuyog Pawar                                     .i4_min_num_out_bufs;
1137*c83a76b0SSuyog Pawar                         }
1138*c83a76b0SSuyog Pawar 
1139*c83a76b0SSuyog Pawar                         s_mres_out_desc.s_output_data_buffs[i4_res_id][i4_br_id]
1140*c83a76b0SSuyog Pawar                             .i4_size_bitstream_buf =
1141*c83a76b0SSuyog Pawar                             s_res_layer_output_bufs_req.s_output_buf_req[i4_res_id][i4_br_id]
1142*c83a76b0SSuyog Pawar                                 .i4_min_size_bitstream_buf;
1143*c83a76b0SSuyog Pawar                         s_mres_out_desc.s_output_data_buffs[i4_res_id][i4_br_id].ppv_bitstream_bufs =
1144*c83a76b0SSuyog Pawar                             &apv_out_data_bufs[i4_res_id][i4_br_id][0];
1145*c83a76b0SSuyog Pawar                     }
1146*c83a76b0SSuyog Pawar                 }
1147*c83a76b0SSuyog Pawar 
1148*c83a76b0SSuyog Pawar                 s_mres_recon_desc.i4_size = sizeof(iv_res_layer_recon_data_buffs_desc_t);
1149*c83a76b0SSuyog Pawar                 /* call create I/O ports */
1150*c83a76b0SSuyog Pawar                 status = ihevce_create_ports(
1151*c83a76b0SSuyog Pawar                     ps_interface_ctxt,
1152*c83a76b0SSuyog Pawar                     &s_inp_desc,
1153*c83a76b0SSuyog Pawar                     &s_inp_ctrl_desc,
1154*c83a76b0SSuyog Pawar                     &s_mres_out_desc,
1155*c83a76b0SSuyog Pawar                     &s_mres_recon_desc);
1156*c83a76b0SSuyog Pawar             }
1157*c83a76b0SSuyog Pawar         }
1158*c83a76b0SSuyog Pawar 
1159*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1160*c83a76b0SSuyog Pawar         /*            Create a High level encoder  thread                        */
1161*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1162*c83a76b0SSuyog Pawar         {
1163*c83a76b0SSuyog Pawar             osal_thread_attr_t s_thread_attr = OSAL_DEFAULT_THREAD_ATTR;
1164*c83a76b0SSuyog Pawar 
1165*c83a76b0SSuyog Pawar             /* Initialize application thread attributes */
1166*c83a76b0SSuyog Pawar             s_thread_attr.exit_code = 0;
1167*c83a76b0SSuyog Pawar             s_thread_attr.name = 0;
1168*c83a76b0SSuyog Pawar             s_thread_attr.priority_map_flag = 1;
1169*c83a76b0SSuyog Pawar             s_thread_attr.priority = OSAL_PRIORITY_DEFAULT;
1170*c83a76b0SSuyog Pawar             s_thread_attr.stack_addr = 0;
1171*c83a76b0SSuyog Pawar             s_thread_attr.stack_size = THREAD_STACK_SIZE;
1172*c83a76b0SSuyog Pawar             s_thread_attr.thread_func = ihevce_hle_interface_thrd;
1173*c83a76b0SSuyog Pawar             s_thread_attr.thread_param = (void *)(ps_interface_ctxt);
1174*c83a76b0SSuyog Pawar             s_thread_attr.core_affinity_mask = 0;
1175*c83a76b0SSuyog Pawar             s_thread_attr.group_num = 0;
1176*c83a76b0SSuyog Pawar 
1177*c83a76b0SSuyog Pawar             /* Create High level encoder thread */
1178*c83a76b0SSuyog Pawar             ps_ctxt->pv_hle_thread_hdl =
1179*c83a76b0SSuyog Pawar                 osal_thread_create(ps_ctxt->pv_osal_handle, &s_thread_attr);
1180*c83a76b0SSuyog Pawar             if(NULL == ps_ctxt->pv_hle_thread_hdl)
1181*c83a76b0SSuyog Pawar             {
1182*c83a76b0SSuyog Pawar                 return IHEVCE_EFAIL;
1183*c83a76b0SSuyog Pawar             }
1184*c83a76b0SSuyog Pawar         }
1185*c83a76b0SSuyog Pawar 
1186*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1187*c83a76b0SSuyog Pawar         /*                 Wait until HLE init is done                           */
1188*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1189*c83a76b0SSuyog Pawar         {
1190*c83a76b0SSuyog Pawar             volatile WORD32 hle_init_done;
1191*c83a76b0SSuyog Pawar             volatile WORD32 *pi4_hle_init_done;
1192*c83a76b0SSuyog Pawar 
1193*c83a76b0SSuyog Pawar             pi4_hle_init_done = (volatile WORD32 *)&ps_interface_ctxt->i4_hle_init_done;
1194*c83a76b0SSuyog Pawar 
1195*c83a76b0SSuyog Pawar             do
1196*c83a76b0SSuyog Pawar             {
1197*c83a76b0SSuyog Pawar                 hle_init_done = *pi4_hle_init_done;
1198*c83a76b0SSuyog Pawar 
1199*c83a76b0SSuyog Pawar             } while(0 == hle_init_done);
1200*c83a76b0SSuyog Pawar         }
1201*c83a76b0SSuyog Pawar 
1202*c83a76b0SSuyog Pawar         /* reset flush mode */
1203*c83a76b0SSuyog Pawar         ps_ctxt->i4_flush_mode_on = 0;
1204*c83a76b0SSuyog Pawar 
1205*c83a76b0SSuyog Pawar         {
1206*c83a76b0SSuyog Pawar             WORD32 i4_res_id;
1207*c83a76b0SSuyog Pawar             WORD32 i4_br_id;
1208*c83a76b0SSuyog Pawar             for(i4_res_id = 0; i4_res_id < IHEVCE_MAX_NUM_RESOLUTIONS; i4_res_id++)
1209*c83a76b0SSuyog Pawar             {
1210*c83a76b0SSuyog Pawar                 for(i4_br_id = 0; i4_br_id < IHEVCE_MAX_NUM_BITRATES; i4_br_id++)
1211*c83a76b0SSuyog Pawar                 {
1212*c83a76b0SSuyog Pawar                     /* reset out end flag */
1213*c83a76b0SSuyog Pawar                     ps_ctxt->ai4_out_end_flag[i4_res_id][i4_br_id] = 0;
1214*c83a76b0SSuyog Pawar                 }
1215*c83a76b0SSuyog Pawar             }
1216*c83a76b0SSuyog Pawar         }
1217*c83a76b0SSuyog Pawar 
1218*c83a76b0SSuyog Pawar         /* reset the field id */
1219*c83a76b0SSuyog Pawar         ps_ctxt->i4_field_id = 0;
1220*c83a76b0SSuyog Pawar 
1221*c83a76b0SSuyog Pawar         /* based on number of B pics set the DTS value */
1222*c83a76b0SSuyog Pawar         ps_ctxt->i8_dts = -1;
1223*c83a76b0SSuyog Pawar 
1224*c83a76b0SSuyog Pawar         if(0 != ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers)
1225*c83a76b0SSuyog Pawar         {
1226*c83a76b0SSuyog Pawar             ps_ctxt->i8_dts =
1227*c83a76b0SSuyog Pawar                 (-1) *
1228*c83a76b0SSuyog Pawar                 (1 << ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers);
1229*c83a76b0SSuyog Pawar         }
1230*c83a76b0SSuyog Pawar 
1231*c83a76b0SSuyog Pawar         /* initialsie the buffer stride */
1232*c83a76b0SSuyog Pawar         {
1233*c83a76b0SSuyog Pawar             WORD32 max_cu_size;
1234*c83a76b0SSuyog Pawar 
1235*c83a76b0SSuyog Pawar             max_cu_size = (1 << ps_ctxt->ps_static_cfg_prms->s_config_prms.i4_max_log2_cu_size);
1236*c83a76b0SSuyog Pawar             ps_ctxt->i4_frm_stride =
1237*c83a76b0SSuyog Pawar                 ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_width +
1238*c83a76b0SSuyog Pawar                 SET_CTB_ALIGN(ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_width, max_cu_size);
1239*c83a76b0SSuyog Pawar         }
1240*c83a76b0SSuyog Pawar     }
1241*c83a76b0SSuyog Pawar     else
1242*c83a76b0SSuyog Pawar     {
1243*c83a76b0SSuyog Pawar         /* free plugin ctxt memory */
1244*c83a76b0SSuyog Pawar         memory_free(NULL, ps_ctxt);
1245*c83a76b0SSuyog Pawar 
1246*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
1247*c83a76b0SSuyog Pawar     }
1248*c83a76b0SSuyog Pawar 
1249*c83a76b0SSuyog Pawar     /* reset the place holders of old bitrate */
1250*c83a76b0SSuyog Pawar     memset(&ps_ctxt->ai4_old_bitrate[0][0], 0, sizeof(ps_ctxt->ai4_old_bitrate));
1251*c83a76b0SSuyog Pawar 
1252*c83a76b0SSuyog Pawar     ps_ctxt->ai4_old_bitrate[0][0] = ps_params->s_tgt_lyr_prms.as_tgt_params[0].ai4_tgt_bitrate[0];
1253*c83a76b0SSuyog Pawar 
1254*c83a76b0SSuyog Pawar     /* store the plugin handle before returning */
1255*c83a76b0SSuyog Pawar     *ppv_ihevce_hdl = (void *)ps_ctxt;
1256*c83a76b0SSuyog Pawar 
1257*c83a76b0SSuyog Pawar     return (IHEVCE_EOK);
1258*c83a76b0SSuyog Pawar }
1259*c83a76b0SSuyog Pawar 
1260*c83a76b0SSuyog Pawar static IHEVCE_PLUGIN_STATUS_T
ihevce_receive_out_buffer(plugin_ctxt_t * ps_ctxt,ihevce_out_buf_t * ps_out)1261*c83a76b0SSuyog Pawar     ihevce_receive_out_buffer(plugin_ctxt_t *ps_ctxt, ihevce_out_buf_t *ps_out)
1262*c83a76b0SSuyog Pawar {
1263*c83a76b0SSuyog Pawar     app_ctxt_t *ps_app_ctxt = &ps_ctxt->s_app_ctxt;
1264*c83a76b0SSuyog Pawar     WORD32 i4_res_id, i4_br_id;
1265*c83a76b0SSuyog Pawar     WORD32 i4_num_resolutions;
1266*c83a76b0SSuyog Pawar     WORD32 ai4_num_bitrate_instances[IHEVCE_MAX_NUM_RESOLUTIONS] = { 1 };
1267*c83a76b0SSuyog Pawar 
1268*c83a76b0SSuyog Pawar     i4_num_resolutions = ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.i4_num_res_layers;
1269*c83a76b0SSuyog Pawar     for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
1270*c83a76b0SSuyog Pawar     {
1271*c83a76b0SSuyog Pawar         ai4_num_bitrate_instances[i4_res_id] =
1272*c83a76b0SSuyog Pawar             ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_res_id]
1273*c83a76b0SSuyog Pawar                 .i4_num_bitrate_instances;
1274*c83a76b0SSuyog Pawar     }
1275*c83a76b0SSuyog Pawar     /* default init */
1276*c83a76b0SSuyog Pawar     ps_out->pu1_output_buf = NULL;
1277*c83a76b0SSuyog Pawar     ps_out->i4_bytes_generated = 0;
1278*c83a76b0SSuyog Pawar 
1279*c83a76b0SSuyog Pawar     /* ---------------- if any output buffer is available return the buffer back ------------- */
1280*c83a76b0SSuyog Pawar     while(1)
1281*c83a76b0SSuyog Pawar     {
1282*c83a76b0SSuyog Pawar         WORD32 osal_result;
1283*c83a76b0SSuyog Pawar         WORD32 buf_present = 0;
1284*c83a76b0SSuyog Pawar         WORD32 i4_is_prod = 1;
1285*c83a76b0SSuyog Pawar         WORD32 i4_atleast_one_br_prod = 0;
1286*c83a76b0SSuyog Pawar         /****** Lock the critical section ******/
1287*c83a76b0SSuyog Pawar         osal_result =
1288*c83a76b0SSuyog Pawar             osal_mutex_lock(ps_app_ctxt->as_out_strm_prms[0][0].pv_app_out_strm_buf_mutex_hdl);
1289*c83a76b0SSuyog Pawar 
1290*c83a76b0SSuyog Pawar         if(OSAL_SUCCESS != osal_result)
1291*c83a76b0SSuyog Pawar             return IHEVCE_EFAIL;
1292*c83a76b0SSuyog Pawar 
1293*c83a76b0SSuyog Pawar         /* wait until entropy sends an output */
1294*c83a76b0SSuyog Pawar         while(1)
1295*c83a76b0SSuyog Pawar         {
1296*c83a76b0SSuyog Pawar             i4_is_prod = 1;
1297*c83a76b0SSuyog Pawar             for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
1298*c83a76b0SSuyog Pawar             {
1299*c83a76b0SSuyog Pawar                 for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
1300*c83a76b0SSuyog Pawar                 {
1301*c83a76b0SSuyog Pawar                     i4_is_prod &=
1302*c83a76b0SSuyog Pawar                         ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ps_ctxt->i4_prod_out_buf_idx]
1303*c83a76b0SSuyog Pawar                             .i4_is_prod;
1304*c83a76b0SSuyog Pawar                     i4_atleast_one_br_prod |=
1305*c83a76b0SSuyog Pawar                         ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ps_ctxt->i4_prod_out_buf_idx]
1306*c83a76b0SSuyog Pawar                             .i4_is_prod;
1307*c83a76b0SSuyog Pawar                 }
1308*c83a76b0SSuyog Pawar             }
1309*c83a76b0SSuyog Pawar             if(!i4_is_prod)
1310*c83a76b0SSuyog Pawar             {
1311*c83a76b0SSuyog Pawar                 for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
1312*c83a76b0SSuyog Pawar                 {
1313*c83a76b0SSuyog Pawar                     for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
1314*c83a76b0SSuyog Pawar                     {
1315*c83a76b0SSuyog Pawar                         osal_cond_var_wait(
1316*c83a76b0SSuyog Pawar                             ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1317*c83a76b0SSuyog Pawar                                 .pv_app_out_strm_buf_cond_var_hdl,
1318*c83a76b0SSuyog Pawar                             ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1319*c83a76b0SSuyog Pawar                                 .pv_app_out_strm_buf_mutex_hdl);
1320*c83a76b0SSuyog Pawar                     }
1321*c83a76b0SSuyog Pawar                 }
1322*c83a76b0SSuyog Pawar             }
1323*c83a76b0SSuyog Pawar             else
1324*c83a76b0SSuyog Pawar             {
1325*c83a76b0SSuyog Pawar                 break;
1326*c83a76b0SSuyog Pawar             }
1327*c83a76b0SSuyog Pawar         }
1328*c83a76b0SSuyog Pawar 
1329*c83a76b0SSuyog Pawar         ASSERT(i4_is_prod == 1);
1330*c83a76b0SSuyog Pawar 
1331*c83a76b0SSuyog Pawar         /* check if the current buffer for all bitrates and resolutions have been produced */
1332*c83a76b0SSuyog Pawar         if(1 == i4_is_prod)
1333*c83a76b0SSuyog Pawar         {
1334*c83a76b0SSuyog Pawar             buf_present = 1;
1335*c83a76b0SSuyog Pawar 
1336*c83a76b0SSuyog Pawar             for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
1337*c83a76b0SSuyog Pawar             {
1338*c83a76b0SSuyog Pawar                 for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
1339*c83a76b0SSuyog Pawar                 {
1340*c83a76b0SSuyog Pawar                     /* set the buffer to free status */
1341*c83a76b0SSuyog Pawar                     ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][ps_ctxt->i4_prod_out_buf_idx]
1342*c83a76b0SSuyog Pawar                         .i4_is_free = 1;
1343*c83a76b0SSuyog Pawar                     if((0 == i4_res_id) && (0 == i4_br_id))
1344*c83a76b0SSuyog Pawar                     {
1345*c83a76b0SSuyog Pawar                         ps_out->i4_bytes_generated =
1346*c83a76b0SSuyog Pawar                             ps_ctxt->aaas_out_bufs[0][0][ps_ctxt->i4_prod_out_buf_idx].i4_bytes_gen;
1347*c83a76b0SSuyog Pawar                         ps_out->pu1_output_buf =
1348*c83a76b0SSuyog Pawar                             ps_ctxt->aaas_out_bufs[0][0][ps_ctxt->i4_prod_out_buf_idx].pu1_buf;
1349*c83a76b0SSuyog Pawar                     }
1350*c83a76b0SSuyog Pawar                 }
1351*c83a76b0SSuyog Pawar             }
1352*c83a76b0SSuyog Pawar 
1353*c83a76b0SSuyog Pawar             /* copy the contents to output buffer */
1354*c83a76b0SSuyog Pawar             ps_out->i4_is_key_frame =
1355*c83a76b0SSuyog Pawar                 ps_ctxt->aaas_out_bufs[0][0][ps_ctxt->i4_prod_out_buf_idx].i4_is_key_frame;
1356*c83a76b0SSuyog Pawar             ps_out->u8_pts =
1357*c83a76b0SSuyog Pawar                 ps_ctxt->aaas_out_bufs[0][0][ps_ctxt->i4_prod_out_buf_idx].i4_timestamp_low;
1358*c83a76b0SSuyog Pawar             ps_out->u8_pts =
1359*c83a76b0SSuyog Pawar                 ps_out->u8_pts |
1360*c83a76b0SSuyog Pawar                 ((ULWORD64)(
1361*c83a76b0SSuyog Pawar                      ps_ctxt->aaas_out_bufs[0][0][ps_ctxt->i4_prod_out_buf_idx].i4_timestamp_high)
1362*c83a76b0SSuyog Pawar                  << 32);
1363*c83a76b0SSuyog Pawar             ps_out->i4_end_flag =
1364*c83a76b0SSuyog Pawar                 ps_ctxt->aaas_out_bufs[0][0][ps_ctxt->i4_prod_out_buf_idx].i4_end_flag;
1365*c83a76b0SSuyog Pawar             ps_out->i8_dts = ps_ctxt->i8_dts;
1366*c83a76b0SSuyog Pawar 
1367*c83a76b0SSuyog Pawar             /* increment the DTS */
1368*c83a76b0SSuyog Pawar             ps_ctxt->i8_dts++;
1369*c83a76b0SSuyog Pawar         }
1370*c83a76b0SSuyog Pawar 
1371*c83a76b0SSuyog Pawar         /* check for buffer present */
1372*c83a76b0SSuyog Pawar         if(1 == buf_present)
1373*c83a76b0SSuyog Pawar         {
1374*c83a76b0SSuyog Pawar             ps_ctxt->i4_prod_out_buf_idx++;
1375*c83a76b0SSuyog Pawar 
1376*c83a76b0SSuyog Pawar             /* wrap around case */
1377*c83a76b0SSuyog Pawar             if(ps_ctxt->i4_prod_out_buf_idx == ps_ctxt->i4_num_out_bufs)
1378*c83a76b0SSuyog Pawar             {
1379*c83a76b0SSuyog Pawar                 ps_ctxt->i4_prod_out_buf_idx = 0;
1380*c83a76b0SSuyog Pawar             }
1381*c83a76b0SSuyog Pawar 
1382*c83a76b0SSuyog Pawar             /****** Unlock the critical section ******/
1383*c83a76b0SSuyog Pawar             osal_result = osal_mutex_unlock(
1384*c83a76b0SSuyog Pawar                 ps_app_ctxt->as_out_strm_prms[0][0].pv_app_out_strm_buf_mutex_hdl);
1385*c83a76b0SSuyog Pawar             if(OSAL_SUCCESS != osal_result)
1386*c83a76b0SSuyog Pawar                 return IHEVCE_EFAIL;
1387*c83a76b0SSuyog Pawar 
1388*c83a76b0SSuyog Pawar             /* break while 1 loop */
1389*c83a76b0SSuyog Pawar             break;
1390*c83a76b0SSuyog Pawar         }
1391*c83a76b0SSuyog Pawar         else
1392*c83a76b0SSuyog Pawar         {
1393*c83a76b0SSuyog Pawar             /* in steady state*/
1394*c83a76b0SSuyog Pawar             if(0 == ps_ctxt->i4_flush_mode_on)
1395*c83a76b0SSuyog Pawar             {
1396*c83a76b0SSuyog Pawar                 /****** Unlock the critical section ******/
1397*c83a76b0SSuyog Pawar                 osal_result = osal_mutex_unlock(
1398*c83a76b0SSuyog Pawar                     ps_app_ctxt->as_out_strm_prms[0][0].pv_app_out_strm_buf_mutex_hdl);
1399*c83a76b0SSuyog Pawar                 if(OSAL_SUCCESS != osal_result)
1400*c83a76b0SSuyog Pawar                     return IHEVCE_EFAIL;
1401*c83a76b0SSuyog Pawar                 if(!i4_atleast_one_br_prod) /*** If atleast one bitrate is produced do not break from loop **/
1402*c83a76b0SSuyog Pawar                 { /*** Continue in while loop and Wait for next bitrate ***/
1403*c83a76b0SSuyog Pawar                     /* break while 1 loop */
1404*c83a76b0SSuyog Pawar                     break;
1405*c83a76b0SSuyog Pawar                 }
1406*c83a76b0SSuyog Pawar             }
1407*c83a76b0SSuyog Pawar             else
1408*c83a76b0SSuyog Pawar             {
1409*c83a76b0SSuyog Pawar                 /* In flush mode is ON then this function must return output
1410*c83a76b0SSuyog Pawar                 buffers. Otherwise assume that encoding is over and return fail */
1411*c83a76b0SSuyog Pawar                 /****** Unlock the critical section ******/
1412*c83a76b0SSuyog Pawar                 osal_result = osal_mutex_unlock(
1413*c83a76b0SSuyog Pawar                     ps_app_ctxt->as_out_strm_prms[0][0].pv_app_out_strm_buf_mutex_hdl);
1414*c83a76b0SSuyog Pawar                 if(OSAL_SUCCESS != osal_result)
1415*c83a76b0SSuyog Pawar                     return IHEVCE_EFAIL;
1416*c83a76b0SSuyog Pawar             }
1417*c83a76b0SSuyog Pawar         }
1418*c83a76b0SSuyog Pawar     }
1419*c83a76b0SSuyog Pawar 
1420*c83a76b0SSuyog Pawar     return IHEVCE_EOK;
1421*c83a76b0SSuyog Pawar }
1422*c83a76b0SSuyog Pawar 
1423*c83a76b0SSuyog Pawar static IHEVCE_PLUGIN_STATUS_T
ihevce_queue_out_buffer(plugin_ctxt_t * ps_ctxt,WORD32 i4_res_id,WORD32 i4_br_id)1424*c83a76b0SSuyog Pawar     ihevce_queue_out_buffer(plugin_ctxt_t *ps_ctxt, WORD32 i4_res_id, WORD32 i4_br_id)
1425*c83a76b0SSuyog Pawar {
1426*c83a76b0SSuyog Pawar     app_ctxt_t *ps_app_ctxt = &ps_ctxt->s_app_ctxt;
1427*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_interface_ctxt = (ihevce_hle_ctxt_t *)ps_ctxt->pv_hle_interface_ctxt;
1428*c83a76b0SSuyog Pawar 
1429*c83a76b0SSuyog Pawar     /* --------------------------------------------------------------------- */
1430*c83a76b0SSuyog Pawar     /*           Free Output buffer Queuing                                  */
1431*c83a76b0SSuyog Pawar     /* --------------------------------------------------------------------- */
1432*c83a76b0SSuyog Pawar     /* ------- Que in free output buffer if end flag is not set ------ */
1433*c83a76b0SSuyog Pawar     if(0 == ps_ctxt->ai4_out_end_flag[i4_res_id][i4_br_id])
1434*c83a76b0SSuyog Pawar     {
1435*c83a76b0SSuyog Pawar         WORD32 osal_result;
1436*c83a76b0SSuyog Pawar         iv_output_data_buffs_t *ps_curr_out;
1437*c83a76b0SSuyog Pawar         WORD32 buf_id_strm;
1438*c83a76b0SSuyog Pawar         WORD32 free_idx;
1439*c83a76b0SSuyog Pawar 
1440*c83a76b0SSuyog Pawar         free_idx = ps_ctxt->ai4_free_out_buf_idx[i4_res_id][i4_br_id];
1441*c83a76b0SSuyog Pawar 
1442*c83a76b0SSuyog Pawar         if(1 == ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][free_idx].i4_is_free)
1443*c83a76b0SSuyog Pawar         {
1444*c83a76b0SSuyog Pawar             /* ---------- get a free desc. from output Q ------ */
1445*c83a76b0SSuyog Pawar             ps_curr_out = (iv_output_data_buffs_t *)ihevce_q_get_free_out_strm_buff(
1446*c83a76b0SSuyog Pawar                 ps_interface_ctxt, &buf_id_strm, BUFF_QUE_NON_BLOCKING_MODE, i4_br_id, i4_res_id);
1447*c83a76b0SSuyog Pawar 
1448*c83a76b0SSuyog Pawar             /* if a free buffer is available */
1449*c83a76b0SSuyog Pawar             if(NULL != ps_curr_out)
1450*c83a76b0SSuyog Pawar             {
1451*c83a76b0SSuyog Pawar                 /****** Lock the critical section ******/
1452*c83a76b0SSuyog Pawar                 osal_result = osal_mutex_lock(ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1453*c83a76b0SSuyog Pawar                                                   .pv_app_out_strm_buf_mutex_hdl);
1454*c83a76b0SSuyog Pawar 
1455*c83a76b0SSuyog Pawar                 if(OSAL_SUCCESS != osal_result)
1456*c83a76b0SSuyog Pawar                     return IHEVCE_EFAIL;
1457*c83a76b0SSuyog Pawar 
1458*c83a76b0SSuyog Pawar                 if(1 == ps_app_ctxt->ai4_out_strm_end_flag[i4_res_id][i4_br_id])
1459*c83a76b0SSuyog Pawar                 {
1460*c83a76b0SSuyog Pawar                     ps_curr_out->i4_is_last_buf = 1;
1461*c83a76b0SSuyog Pawar                     ps_ctxt->ai4_out_end_flag[i4_res_id][i4_br_id] = 1;
1462*c83a76b0SSuyog Pawar                 }
1463*c83a76b0SSuyog Pawar                 else
1464*c83a76b0SSuyog Pawar                 {
1465*c83a76b0SSuyog Pawar                     ps_curr_out->i4_is_last_buf = 0;
1466*c83a76b0SSuyog Pawar                 }
1467*c83a76b0SSuyog Pawar                 ASSERT(ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][free_idx].i4_is_free == 1);
1468*c83a76b0SSuyog Pawar                 ASSERT(free_idx == ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][free_idx].i4_idx);
1469*c83a76b0SSuyog Pawar 
1470*c83a76b0SSuyog Pawar                 ps_curr_out->pv_bitstream_bufs =
1471*c83a76b0SSuyog Pawar                     (void *)ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][free_idx].pu1_buf;
1472*c83a76b0SSuyog Pawar                 ps_curr_out->i4_cb_buf_id =
1473*c83a76b0SSuyog Pawar                     ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][free_idx].i4_idx;
1474*c83a76b0SSuyog Pawar                 ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][free_idx].i4_is_free = 0;
1475*c83a76b0SSuyog Pawar                 ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][free_idx].i4_is_prod = 0;
1476*c83a76b0SSuyog Pawar                 ps_ctxt->aaas_out_bufs[i4_res_id][i4_br_id][free_idx].i4_bytes_gen = 0;
1477*c83a76b0SSuyog Pawar 
1478*c83a76b0SSuyog Pawar                 ps_ctxt->ai4_free_out_buf_idx[i4_res_id][i4_br_id]++;
1479*c83a76b0SSuyog Pawar 
1480*c83a76b0SSuyog Pawar                 /* wrap around case */
1481*c83a76b0SSuyog Pawar                 if(ps_ctxt->ai4_free_out_buf_idx[i4_res_id][i4_br_id] == ps_ctxt->i4_num_out_bufs)
1482*c83a76b0SSuyog Pawar                 {
1483*c83a76b0SSuyog Pawar                     ps_ctxt->ai4_free_out_buf_idx[i4_res_id][i4_br_id] = 0;
1484*c83a76b0SSuyog Pawar                 }
1485*c83a76b0SSuyog Pawar 
1486*c83a76b0SSuyog Pawar                 /****** Unlock the critical section ******/
1487*c83a76b0SSuyog Pawar                 osal_result = osal_mutex_unlock(ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1488*c83a76b0SSuyog Pawar                                                     .pv_app_out_strm_buf_mutex_hdl);
1489*c83a76b0SSuyog Pawar                 if(OSAL_SUCCESS != osal_result)
1490*c83a76b0SSuyog Pawar                     return IHEVCE_EFAIL;
1491*c83a76b0SSuyog Pawar 
1492*c83a76b0SSuyog Pawar                 /* ---------- set the buffer as produced ---------- */
1493*c83a76b0SSuyog Pawar                 ihevce_q_set_out_strm_buff_prod(
1494*c83a76b0SSuyog Pawar                     ps_interface_ctxt, buf_id_strm, i4_br_id, i4_res_id);
1495*c83a76b0SSuyog Pawar             }
1496*c83a76b0SSuyog Pawar         }
1497*c83a76b0SSuyog Pawar     }
1498*c83a76b0SSuyog Pawar     return IHEVCE_EOK;
1499*c83a76b0SSuyog Pawar }
1500*c83a76b0SSuyog Pawar 
1501*c83a76b0SSuyog Pawar /*!
1502*c83a76b0SSuyog Pawar ******************************************************************************
1503*c83a76b0SSuyog Pawar * \if Function name : ihevce_close \endif
1504*c83a76b0SSuyog Pawar *
1505*c83a76b0SSuyog Pawar * \brief
1506*c83a76b0SSuyog Pawar *    De-Initialises the encoder context and threads
1507*c83a76b0SSuyog Pawar *
1508*c83a76b0SSuyog Pawar * \param[in] Static params pointer
1509*c83a76b0SSuyog Pawar *
1510*c83a76b0SSuyog Pawar * \return
1511*c83a76b0SSuyog Pawar *    status
1512*c83a76b0SSuyog Pawar *
1513*c83a76b0SSuyog Pawar * \author
1514*c83a76b0SSuyog Pawar *  Ittiam
1515*c83a76b0SSuyog Pawar *
1516*c83a76b0SSuyog Pawar *****************************************************************************
1517*c83a76b0SSuyog Pawar */
ihevce_close(void * pv_ihevce_hdl)1518*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T ihevce_close(void *pv_ihevce_hdl)
1519*c83a76b0SSuyog Pawar {
1520*c83a76b0SSuyog Pawar     /* local variables */
1521*c83a76b0SSuyog Pawar     plugin_ctxt_t *ps_ctxt;
1522*c83a76b0SSuyog Pawar     app_ctxt_t *ps_app_ctxt;
1523*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_interface_ctxt;
1524*c83a76b0SSuyog Pawar     WORD32 i4_num_resolutions;
1525*c83a76b0SSuyog Pawar     WORD32 i4_res_id;
1526*c83a76b0SSuyog Pawar     WORD32 i4_br_id;
1527*c83a76b0SSuyog Pawar     WORD32 ai4_num_bitrate_instances[IHEVCE_MAX_NUM_RESOLUTIONS] = { 1 };
1528*c83a76b0SSuyog Pawar     ihevce_sys_api_t *ps_sys_api;
1529*c83a76b0SSuyog Pawar 
1530*c83a76b0SSuyog Pawar     /* sanity checks */
1531*c83a76b0SSuyog Pawar     if(NULL == pv_ihevce_hdl)
1532*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
1533*c83a76b0SSuyog Pawar 
1534*c83a76b0SSuyog Pawar     /* derive local variables */
1535*c83a76b0SSuyog Pawar     ps_ctxt = (plugin_ctxt_t *)pv_ihevce_hdl;
1536*c83a76b0SSuyog Pawar 
1537*c83a76b0SSuyog Pawar     ps_sys_api = &ps_ctxt->ps_static_cfg_prms->s_sys_api;
1538*c83a76b0SSuyog Pawar 
1539*c83a76b0SSuyog Pawar     if((0 == ps_ctxt->ps_static_cfg_prms->i4_res_id) &&
1540*c83a76b0SSuyog Pawar        (0 == ps_ctxt->ps_static_cfg_prms->i4_br_id))
1541*c83a76b0SSuyog Pawar     {
1542*c83a76b0SSuyog Pawar         ps_interface_ctxt = (ihevce_hle_ctxt_t *)ps_ctxt->pv_hle_interface_ctxt;
1543*c83a76b0SSuyog Pawar         ps_app_ctxt = &ps_ctxt->s_app_ctxt;
1544*c83a76b0SSuyog Pawar         i4_num_resolutions = ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.i4_num_res_layers;
1545*c83a76b0SSuyog Pawar 
1546*c83a76b0SSuyog Pawar         if(1 != ps_ctxt->i4_flush_mode_on)
1547*c83a76b0SSuyog Pawar         {
1548*c83a76b0SSuyog Pawar             for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
1549*c83a76b0SSuyog Pawar             {
1550*c83a76b0SSuyog Pawar                 ai4_num_bitrate_instances[i4_res_id] =
1551*c83a76b0SSuyog Pawar                     ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_res_id]
1552*c83a76b0SSuyog Pawar                         .i4_num_bitrate_instances;
1553*c83a76b0SSuyog Pawar                 for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
1554*c83a76b0SSuyog Pawar                 {
1555*c83a76b0SSuyog Pawar                     /* ------- Que in free output buffer if end flag is not set ------ */
1556*c83a76b0SSuyog Pawar                     ihevce_queue_out_buffer(ps_ctxt, i4_res_id, i4_br_id);
1557*c83a76b0SSuyog Pawar                 }
1558*c83a76b0SSuyog Pawar             }
1559*c83a76b0SSuyog Pawar             /* --------------------------------------------------------------------- */
1560*c83a76b0SSuyog Pawar             /*            Input Processing                                           */
1561*c83a76b0SSuyog Pawar             /* --------------------------------------------------------------------- */
1562*c83a76b0SSuyog Pawar             {
1563*c83a76b0SSuyog Pawar                 WORD32 buf_id;
1564*c83a76b0SSuyog Pawar 
1565*c83a76b0SSuyog Pawar                 iv_input_data_ctrl_buffs_t *ps_curr_inp;
1566*c83a76b0SSuyog Pawar                 WORD32 *pi4_ctrl_ptr;
1567*c83a76b0SSuyog Pawar 
1568*c83a76b0SSuyog Pawar                 /* ---------- get a free buffer from input Q ------ */
1569*c83a76b0SSuyog Pawar                 ps_curr_inp = (iv_input_data_ctrl_buffs_t *)ihevce_q_get_free_inp_data_buff(
1570*c83a76b0SSuyog Pawar                     ps_interface_ctxt, &buf_id, BUFF_QUE_BLOCKING_MODE);
1571*c83a76b0SSuyog Pawar 
1572*c83a76b0SSuyog Pawar                 if(NULL != ps_curr_inp)
1573*c83a76b0SSuyog Pawar                 {
1574*c83a76b0SSuyog Pawar                     /* flush mode command */
1575*c83a76b0SSuyog Pawar 
1576*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_buf_id = buf_id;
1577*c83a76b0SSuyog Pawar 
1578*c83a76b0SSuyog Pawar                     /* set the input status to invalid flag */
1579*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_inp_frm_data_valid_flag = 0;
1580*c83a76b0SSuyog Pawar 
1581*c83a76b0SSuyog Pawar                     pi4_ctrl_ptr = (WORD32 *)ps_curr_inp->pv_synch_ctrl_bufs;
1582*c83a76b0SSuyog Pawar 
1583*c83a76b0SSuyog Pawar                     *pi4_ctrl_ptr = IHEVCE_SYNCH_API_FLUSH_TAG;
1584*c83a76b0SSuyog Pawar                     *(pi4_ctrl_ptr + 1) = 0;
1585*c83a76b0SSuyog Pawar                     *(pi4_ctrl_ptr + 2) = IHEVCE_SYNCH_API_END_TAG;
1586*c83a76b0SSuyog Pawar 
1587*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_cmd_buf_size = 4 * 3; /* 4 bytes */
1588*c83a76b0SSuyog Pawar 
1589*c83a76b0SSuyog Pawar                     /* ---------- set the buffer as produced ---------- */
1590*c83a76b0SSuyog Pawar                     ihevce_q_set_inp_data_buff_prod(ps_interface_ctxt, buf_id);
1591*c83a76b0SSuyog Pawar                 }
1592*c83a76b0SSuyog Pawar                 else
1593*c83a76b0SSuyog Pawar                 {
1594*c83a76b0SSuyog Pawar                     /* Enable flush-mode and internal-flush once limit according to
1595*c83a76b0SSuyog Pawar                     Eval-version is reached */
1596*c83a76b0SSuyog Pawar                     ps_ctxt->i4_flush_mode_on = 1;
1597*c83a76b0SSuyog Pawar                 }
1598*c83a76b0SSuyog Pawar             }
1599*c83a76b0SSuyog Pawar         }
1600*c83a76b0SSuyog Pawar 
1601*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1602*c83a76b0SSuyog Pawar         /*            Wait and destroy Processing threads                        */
1603*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1604*c83a76b0SSuyog Pawar 
1605*c83a76b0SSuyog Pawar         /* Wait for High level encoder thread to complete */
1606*c83a76b0SSuyog Pawar         osal_thread_wait(ps_ctxt->pv_hle_thread_hdl);
1607*c83a76b0SSuyog Pawar 
1608*c83a76b0SSuyog Pawar         /* Destroy Hle thread */
1609*c83a76b0SSuyog Pawar         osal_thread_destroy(ps_ctxt->pv_hle_thread_hdl);
1610*c83a76b0SSuyog Pawar 
1611*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1612*c83a76b0SSuyog Pawar         /*            Input Output and Command buffers free                      */
1613*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1614*c83a76b0SSuyog Pawar 
1615*c83a76b0SSuyog Pawar         /* free output data and control buffer */
1616*c83a76b0SSuyog Pawar 
1617*c83a76b0SSuyog Pawar         for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
1618*c83a76b0SSuyog Pawar         {
1619*c83a76b0SSuyog Pawar             ai4_num_bitrate_instances[i4_res_id] =
1620*c83a76b0SSuyog Pawar                 ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_res_id]
1621*c83a76b0SSuyog Pawar                     .i4_num_bitrate_instances;
1622*c83a76b0SSuyog Pawar 
1623*c83a76b0SSuyog Pawar             for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
1624*c83a76b0SSuyog Pawar             {
1625*c83a76b0SSuyog Pawar                 mem_mngr_free(
1626*c83a76b0SSuyog Pawar                     ps_app_ctxt->pv_mem_mngr_handle,
1627*c83a76b0SSuyog Pawar                     &ps_ctxt->as_memtab_out_data_buf[i4_res_id][i4_br_id]);
1628*c83a76b0SSuyog Pawar 
1629*c83a76b0SSuyog Pawar                 /* free mutex of out strm buf b/w appln and encoder */
1630*c83a76b0SSuyog Pawar                 osal_mutex_destroy(ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1631*c83a76b0SSuyog Pawar                                        .pv_app_out_strm_buf_mutex_hdl);
1632*c83a76b0SSuyog Pawar 
1633*c83a76b0SSuyog Pawar                 osal_cond_var_destroy(ps_app_ctxt->as_out_strm_prms[i4_res_id][i4_br_id]
1634*c83a76b0SSuyog Pawar                                           .pv_app_out_strm_buf_cond_var_hdl);
1635*c83a76b0SSuyog Pawar             }
1636*c83a76b0SSuyog Pawar         }
1637*c83a76b0SSuyog Pawar 
1638*c83a76b0SSuyog Pawar         ps_ctxt->ihevce_mem_free(NULL, ps_ctxt->pu1_out_ctrl_buf);
1639*c83a76b0SSuyog Pawar         ps_ctxt->ihevce_mem_free(NULL, ps_ctxt->pu1_inp_async_ctrl_buf);
1640*c83a76b0SSuyog Pawar 
1641*c83a76b0SSuyog Pawar         /* free input data and control buffer */
1642*c83a76b0SSuyog Pawar         if(ps_interface_ctxt->i4_create_time_input_allocation == 1)
1643*c83a76b0SSuyog Pawar         {
1644*c83a76b0SSuyog Pawar             mem_mngr_free(ps_app_ctxt->pv_mem_mngr_handle, &ps_ctxt->s_memtab_inp_data_buf);
1645*c83a76b0SSuyog Pawar             mem_mngr_free(ps_app_ctxt->pv_mem_mngr_handle, &ps_ctxt->s_memtab_inp_sync_ctrl_buf);
1646*c83a76b0SSuyog Pawar         }
1647*c83a76b0SSuyog Pawar 
1648*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1649*c83a76b0SSuyog Pawar         /*               Encoder Instance Deletion                               */
1650*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1651*c83a76b0SSuyog Pawar         ihevce_hle_interface_delete(ps_interface_ctxt);
1652*c83a76b0SSuyog Pawar 
1653*c83a76b0SSuyog Pawar         /* free the high level encoder context memory */
1654*c83a76b0SSuyog Pawar         ps_ctxt->ihevce_mem_free(NULL, ps_ctxt->pv_hle_interface_ctxt);
1655*c83a76b0SSuyog Pawar 
1656*c83a76b0SSuyog Pawar         if(ps_ctxt->ps_static_cfg_prms->i4_enable_csv_dump)
1657*c83a76b0SSuyog Pawar         {
1658*c83a76b0SSuyog Pawar             ps_sys_api->s_file_io_api.ihevce_fclose(
1659*c83a76b0SSuyog Pawar                 (void *)ps_sys_api->pv_cb_handle, ps_ctxt->ps_static_cfg_prms->apF_csv_file[0][0]);
1660*c83a76b0SSuyog Pawar         }
1661*c83a76b0SSuyog Pawar 
1662*c83a76b0SSuyog Pawar         /* free static config memory */
1663*c83a76b0SSuyog Pawar         ps_ctxt->ihevce_mem_free(NULL, ps_ctxt->ps_static_cfg_prms);
1664*c83a76b0SSuyog Pawar 
1665*c83a76b0SSuyog Pawar         /* free osal handle */
1666*c83a76b0SSuyog Pawar         memory_free(NULL, ps_ctxt->pv_osal_handle);
1667*c83a76b0SSuyog Pawar 
1668*c83a76b0SSuyog Pawar         /* free plugin ctxt memory */
1669*c83a76b0SSuyog Pawar         memory_free(NULL, pv_ihevce_hdl);
1670*c83a76b0SSuyog Pawar     }
1671*c83a76b0SSuyog Pawar     else
1672*c83a76b0SSuyog Pawar     {
1673*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
1674*c83a76b0SSuyog Pawar     }
1675*c83a76b0SSuyog Pawar 
1676*c83a76b0SSuyog Pawar     return (IHEVCE_EOK);
1677*c83a76b0SSuyog Pawar }
1678*c83a76b0SSuyog Pawar 
1679*c83a76b0SSuyog Pawar /*!
1680*c83a76b0SSuyog Pawar ******************************************************************************
1681*c83a76b0SSuyog Pawar * \if Function name : ihevce_copy_inp_8bit \endif
1682*c83a76b0SSuyog Pawar *
1683*c83a76b0SSuyog Pawar * \brief
1684*c83a76b0SSuyog Pawar *    Input copy function for 8 bit input
1685*c83a76b0SSuyog Pawar *
1686*c83a76b0SSuyog Pawar * \param[in] Source and desdtination buffer descriptors
1687*c83a76b0SSuyog Pawar *
1688*c83a76b0SSuyog Pawar * \return
1689*c83a76b0SSuyog Pawar *    None
1690*c83a76b0SSuyog Pawar *
1691*c83a76b0SSuyog Pawar * \author
1692*c83a76b0SSuyog Pawar *  Ittiam
1693*c83a76b0SSuyog Pawar *
1694*c83a76b0SSuyog Pawar *****************************************************************************
1695*c83a76b0SSuyog Pawar */
ihevce_copy_inp_8bit(iv_input_data_ctrl_buffs_t * ps_curr_inp,ihevce_inp_buf_t * ps_inp,WORD32 chroma_format,WORD32 i4_orig_wd,WORD32 i4_orig_ht)1696*c83a76b0SSuyog Pawar IV_API_CALL_STATUS_T ihevce_copy_inp_8bit(
1697*c83a76b0SSuyog Pawar     iv_input_data_ctrl_buffs_t *ps_curr_inp,
1698*c83a76b0SSuyog Pawar     ihevce_inp_buf_t *ps_inp,
1699*c83a76b0SSuyog Pawar     WORD32 chroma_format,
1700*c83a76b0SSuyog Pawar     WORD32 i4_orig_wd,
1701*c83a76b0SSuyog Pawar     WORD32 i4_orig_ht)
1702*c83a76b0SSuyog Pawar {
1703*c83a76b0SSuyog Pawar     UWORD8 *pu1_src, *pu1_dst;
1704*c83a76b0SSuyog Pawar     WORD32 src_strd, dst_strd;
1705*c83a76b0SSuyog Pawar     WORD32 frm_height = i4_orig_ht;
1706*c83a76b0SSuyog Pawar     WORD32 frm_width = i4_orig_wd;
1707*c83a76b0SSuyog Pawar     WORD32 buf_height = ps_curr_inp->s_input_buf.i4_y_ht;
1708*c83a76b0SSuyog Pawar     WORD32 buf_width = ps_curr_inp->s_input_buf.i4_y_wd;
1709*c83a76b0SSuyog Pawar     WORD32 rows, cols;
1710*c83a76b0SSuyog Pawar 
1711*c83a76b0SSuyog Pawar     pu1_src = (UWORD8 *)ps_inp->apv_inp_planes[0];
1712*c83a76b0SSuyog Pawar     src_strd = ps_inp->ai4_inp_strd[0];
1713*c83a76b0SSuyog Pawar     pu1_dst = (UWORD8 *)ps_curr_inp->s_input_buf.pv_y_buf;
1714*c83a76b0SSuyog Pawar     dst_strd = ps_curr_inp->s_input_buf.i4_y_strd;
1715*c83a76b0SSuyog Pawar 
1716*c83a76b0SSuyog Pawar     if((ps_inp->ai4_inp_size[0] < (src_strd * frm_height)) || (ps_inp->ai4_inp_size[0] <= 0) ||
1717*c83a76b0SSuyog Pawar        (ps_inp->apv_inp_planes[0] == NULL))
1718*c83a76b0SSuyog Pawar     {
1719*c83a76b0SSuyog Pawar         return (IV_FAIL);
1720*c83a76b0SSuyog Pawar     }
1721*c83a76b0SSuyog Pawar     /* copy the input luma data into internal buffer */
1722*c83a76b0SSuyog Pawar     for(rows = 0; rows < frm_height; rows++)
1723*c83a76b0SSuyog Pawar     {
1724*c83a76b0SSuyog Pawar         memcpy(pu1_dst, pu1_src, frm_width);
1725*c83a76b0SSuyog Pawar         if(buf_width > frm_width)
1726*c83a76b0SSuyog Pawar         {
1727*c83a76b0SSuyog Pawar             memset(pu1_dst + frm_width, 0x0, buf_width - frm_width);
1728*c83a76b0SSuyog Pawar         }
1729*c83a76b0SSuyog Pawar         pu1_src += src_strd;
1730*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
1731*c83a76b0SSuyog Pawar     }
1732*c83a76b0SSuyog Pawar     while(rows < buf_height)
1733*c83a76b0SSuyog Pawar     {
1734*c83a76b0SSuyog Pawar         memset(pu1_dst, 0x0, buf_width);
1735*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
1736*c83a76b0SSuyog Pawar         rows++;
1737*c83a76b0SSuyog Pawar     }
1738*c83a76b0SSuyog Pawar 
1739*c83a76b0SSuyog Pawar     if(IV_YUV_420P == chroma_format)
1740*c83a76b0SSuyog Pawar     {
1741*c83a76b0SSuyog Pawar         UWORD8 *pu1_src_u, *pu1_src_v;
1742*c83a76b0SSuyog Pawar         WORD32 src_strd_u, src_strd_v;
1743*c83a76b0SSuyog Pawar 
1744*c83a76b0SSuyog Pawar         pu1_src_u = (UWORD8 *)ps_inp->apv_inp_planes[1];
1745*c83a76b0SSuyog Pawar         src_strd_u = ps_inp->ai4_inp_strd[1];
1746*c83a76b0SSuyog Pawar         pu1_src_v = (UWORD8 *)ps_inp->apv_inp_planes[2];
1747*c83a76b0SSuyog Pawar         src_strd_v = ps_inp->ai4_inp_strd[2];
1748*c83a76b0SSuyog Pawar         pu1_dst = (UWORD8 *)ps_curr_inp->s_input_buf.pv_u_buf;
1749*c83a76b0SSuyog Pawar         dst_strd = ps_curr_inp->s_input_buf.i4_uv_strd;
1750*c83a76b0SSuyog Pawar 
1751*c83a76b0SSuyog Pawar         frm_width = i4_orig_wd >> 1;
1752*c83a76b0SSuyog Pawar         frm_height = i4_orig_ht >> 1;
1753*c83a76b0SSuyog Pawar         buf_width = ps_curr_inp->s_input_buf.i4_uv_wd;
1754*c83a76b0SSuyog Pawar         buf_height = ps_curr_inp->s_input_buf.i4_uv_ht;
1755*c83a76b0SSuyog Pawar 
1756*c83a76b0SSuyog Pawar         if((ps_inp->ai4_inp_size[1] < (ps_inp->ai4_inp_strd[1] * frm_height)) ||
1757*c83a76b0SSuyog Pawar            (ps_inp->ai4_inp_size[1] <= 0) || (pu1_src_u == NULL))
1758*c83a76b0SSuyog Pawar         {
1759*c83a76b0SSuyog Pawar             return (IV_FAIL);
1760*c83a76b0SSuyog Pawar         }
1761*c83a76b0SSuyog Pawar         if((ps_inp->ai4_inp_size[2] < (ps_inp->ai4_inp_strd[2] * frm_height)) ||
1762*c83a76b0SSuyog Pawar            (ps_inp->ai4_inp_size[2] <= 0) || (pu1_src_v == NULL))
1763*c83a76b0SSuyog Pawar         {
1764*c83a76b0SSuyog Pawar             return (IV_FAIL);
1765*c83a76b0SSuyog Pawar         }
1766*c83a76b0SSuyog Pawar 
1767*c83a76b0SSuyog Pawar         /* copy the input chroma data in pixel interleaved format */
1768*c83a76b0SSuyog Pawar         for(rows = 0; rows < frm_height; rows++)
1769*c83a76b0SSuyog Pawar         {
1770*c83a76b0SSuyog Pawar             for(cols = 0; cols < frm_width; cols++)
1771*c83a76b0SSuyog Pawar             {
1772*c83a76b0SSuyog Pawar                 /* U V alternate */
1773*c83a76b0SSuyog Pawar                 pu1_dst[(cols << 1)] = pu1_src_u[cols];
1774*c83a76b0SSuyog Pawar                 pu1_dst[(cols << 1) + 1] = pu1_src_v[cols];
1775*c83a76b0SSuyog Pawar             }
1776*c83a76b0SSuyog Pawar             if(buf_width > (cols << 1))
1777*c83a76b0SSuyog Pawar             {
1778*c83a76b0SSuyog Pawar                 memset(&pu1_dst[(cols << 1)], 0x80, buf_width - (cols << 1));
1779*c83a76b0SSuyog Pawar             }
1780*c83a76b0SSuyog Pawar 
1781*c83a76b0SSuyog Pawar             pu1_src_u += src_strd_u;
1782*c83a76b0SSuyog Pawar             pu1_src_v += src_strd_v;
1783*c83a76b0SSuyog Pawar             pu1_dst += dst_strd;
1784*c83a76b0SSuyog Pawar         }
1785*c83a76b0SSuyog Pawar         while(rows < buf_height)
1786*c83a76b0SSuyog Pawar         {
1787*c83a76b0SSuyog Pawar             memset(pu1_dst, 0x80, buf_width);
1788*c83a76b0SSuyog Pawar 
1789*c83a76b0SSuyog Pawar             pu1_dst += dst_strd;
1790*c83a76b0SSuyog Pawar             rows++;
1791*c83a76b0SSuyog Pawar         }
1792*c83a76b0SSuyog Pawar     }
1793*c83a76b0SSuyog Pawar     else if(IV_YUV_420SP_UV == chroma_format)
1794*c83a76b0SSuyog Pawar     {
1795*c83a76b0SSuyog Pawar         pu1_src = (UWORD8 *)ps_inp->apv_inp_planes[1];
1796*c83a76b0SSuyog Pawar         src_strd = ps_inp->ai4_inp_strd[1];
1797*c83a76b0SSuyog Pawar         pu1_dst = (UWORD8 *)ps_curr_inp->s_input_buf.pv_u_buf;
1798*c83a76b0SSuyog Pawar         dst_strd = ps_curr_inp->s_input_buf.i4_uv_strd;
1799*c83a76b0SSuyog Pawar 
1800*c83a76b0SSuyog Pawar         frm_width = i4_orig_wd;
1801*c83a76b0SSuyog Pawar         frm_height = i4_orig_ht >> 1;
1802*c83a76b0SSuyog Pawar         buf_width = ps_curr_inp->s_input_buf.i4_uv_wd;
1803*c83a76b0SSuyog Pawar         buf_height = ps_curr_inp->s_input_buf.i4_uv_ht;
1804*c83a76b0SSuyog Pawar 
1805*c83a76b0SSuyog Pawar         if((ps_inp->ai4_inp_size[1] < (ps_inp->ai4_inp_strd[1] * frm_height)) ||
1806*c83a76b0SSuyog Pawar            (ps_inp->ai4_inp_size[1] <= 0) || (pu1_src == NULL))
1807*c83a76b0SSuyog Pawar         {
1808*c83a76b0SSuyog Pawar             return (IV_FAIL);
1809*c83a76b0SSuyog Pawar         }
1810*c83a76b0SSuyog Pawar 
1811*c83a76b0SSuyog Pawar         /* copy the input luma data into internal buffer */
1812*c83a76b0SSuyog Pawar         for(rows = 0; rows < frm_height; rows++)
1813*c83a76b0SSuyog Pawar         {
1814*c83a76b0SSuyog Pawar             memcpy(pu1_dst, pu1_src, frm_width);
1815*c83a76b0SSuyog Pawar             if(buf_width > frm_width)
1816*c83a76b0SSuyog Pawar             {
1817*c83a76b0SSuyog Pawar                 memset(pu1_dst + frm_width, 0x80, buf_width - frm_width);
1818*c83a76b0SSuyog Pawar             }
1819*c83a76b0SSuyog Pawar             pu1_src += src_strd;
1820*c83a76b0SSuyog Pawar             pu1_dst += dst_strd;
1821*c83a76b0SSuyog Pawar         }
1822*c83a76b0SSuyog Pawar         while(rows < buf_height)
1823*c83a76b0SSuyog Pawar         {
1824*c83a76b0SSuyog Pawar             memset(pu1_dst, 0x80, buf_width);
1825*c83a76b0SSuyog Pawar             pu1_dst += dst_strd;
1826*c83a76b0SSuyog Pawar             rows++;
1827*c83a76b0SSuyog Pawar         }
1828*c83a76b0SSuyog Pawar     }
1829*c83a76b0SSuyog Pawar     return (IV_SUCCESS);
1830*c83a76b0SSuyog Pawar }
1831*c83a76b0SSuyog Pawar 
1832*c83a76b0SSuyog Pawar /*!
1833*c83a76b0SSuyog Pawar ******************************************************************************
1834*c83a76b0SSuyog Pawar * \if Function name : ihevce_encode_header \endif
1835*c83a76b0SSuyog Pawar *
1836*c83a76b0SSuyog Pawar * \brief
1837*c83a76b0SSuyog Pawar *    Receive sps, pps and vps of the encoded sequence
1838*c83a76b0SSuyog Pawar *
1839*c83a76b0SSuyog Pawar * \param[in] Plugin handle, Output buffer
1840*c83a76b0SSuyog Pawar *
1841*c83a76b0SSuyog Pawar * \return
1842*c83a76b0SSuyog Pawar *    Success or Failure
1843*c83a76b0SSuyog Pawar *
1844*c83a76b0SSuyog Pawar * \author
1845*c83a76b0SSuyog Pawar *  Ittiam
1846*c83a76b0SSuyog Pawar *
1847*c83a76b0SSuyog Pawar *****************************************************************************
1848*c83a76b0SSuyog Pawar */
ihevce_encode_header(void * pv_ihevce_hdl,ihevce_out_buf_t * ps_out)1849*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T ihevce_encode_header(void *pv_ihevce_hdl, ihevce_out_buf_t *ps_out)
1850*c83a76b0SSuyog Pawar {
1851*c83a76b0SSuyog Pawar     plugin_ctxt_t *ps_ctxt = (plugin_ctxt_t *)pv_ihevce_hdl;
1852*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_interface_ctxt;
1853*c83a76b0SSuyog Pawar 
1854*c83a76b0SSuyog Pawar     /* sanity checks */
1855*c83a76b0SSuyog Pawar     if(NULL == pv_ihevce_hdl)
1856*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
1857*c83a76b0SSuyog Pawar 
1858*c83a76b0SSuyog Pawar     if(NULL == ps_out)
1859*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
1860*c83a76b0SSuyog Pawar 
1861*c83a76b0SSuyog Pawar     if((0 == ps_ctxt->ps_static_cfg_prms->i4_res_id) &&
1862*c83a76b0SSuyog Pawar        (0 == ps_ctxt->ps_static_cfg_prms->i4_br_id))
1863*c83a76b0SSuyog Pawar     {
1864*c83a76b0SSuyog Pawar         WORD32 status;
1865*c83a76b0SSuyog Pawar 
1866*c83a76b0SSuyog Pawar         /* ------- Que in free output buffer if end flag is not set ------ */
1867*c83a76b0SSuyog Pawar         ihevce_queue_out_buffer(ps_ctxt, 0, 0);
1868*c83a76b0SSuyog Pawar 
1869*c83a76b0SSuyog Pawar         /* ------- API call to encoder header ------- */
1870*c83a76b0SSuyog Pawar         ps_interface_ctxt = (ihevce_hle_ctxt_t *)ps_ctxt->pv_hle_interface_ctxt;
1871*c83a76b0SSuyog Pawar         status = ihevce_entropy_encode_header(ps_interface_ctxt, 0, 0);
1872*c83a76b0SSuyog Pawar         if(status)
1873*c83a76b0SSuyog Pawar             return IHEVCE_EFAIL;
1874*c83a76b0SSuyog Pawar 
1875*c83a76b0SSuyog Pawar         /* ------- receive header ------- */
1876*c83a76b0SSuyog Pawar         ihevce_receive_out_buffer(ps_ctxt, ps_out);
1877*c83a76b0SSuyog Pawar     }
1878*c83a76b0SSuyog Pawar     else
1879*c83a76b0SSuyog Pawar     {
1880*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
1881*c83a76b0SSuyog Pawar     }
1882*c83a76b0SSuyog Pawar 
1883*c83a76b0SSuyog Pawar     return (IHEVCE_EOK);
1884*c83a76b0SSuyog Pawar }
1885*c83a76b0SSuyog Pawar 
1886*c83a76b0SSuyog Pawar /*!
1887*c83a76b0SSuyog Pawar ******************************************************************************
1888*c83a76b0SSuyog Pawar * \if Function name : ihevce_encode \endif
1889*c83a76b0SSuyog Pawar *
1890*c83a76b0SSuyog Pawar * \brief
1891*c83a76b0SSuyog Pawar *    Frame level processing function
1892*c83a76b0SSuyog Pawar *
1893*c83a76b0SSuyog Pawar * \param[in] Plugin handle, Input buffer, Output buffer
1894*c83a76b0SSuyog Pawar *
1895*c83a76b0SSuyog Pawar * \return
1896*c83a76b0SSuyog Pawar *    Success or Failure
1897*c83a76b0SSuyog Pawar *
1898*c83a76b0SSuyog Pawar * \author
1899*c83a76b0SSuyog Pawar *  Ittiam
1900*c83a76b0SSuyog Pawar *
1901*c83a76b0SSuyog Pawar *****************************************************************************
1902*c83a76b0SSuyog Pawar */
1903*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T
ihevce_encode(void * pv_ihevce_hdl,ihevce_inp_buf_t * ps_inp,ihevce_out_buf_t * ps_out)1904*c83a76b0SSuyog Pawar     ihevce_encode(void *pv_ihevce_hdl, ihevce_inp_buf_t *ps_inp, ihevce_out_buf_t *ps_out)
1905*c83a76b0SSuyog Pawar {
1906*c83a76b0SSuyog Pawar     /* local variables */
1907*c83a76b0SSuyog Pawar     plugin_ctxt_t *ps_ctxt;
1908*c83a76b0SSuyog Pawar     app_ctxt_t *ps_app_ctxt;
1909*c83a76b0SSuyog Pawar     ihevce_hle_ctxt_t *ps_interface_ctxt;
1910*c83a76b0SSuyog Pawar 
1911*c83a76b0SSuyog Pawar     WORD32 i4_res_id, i4_br_id;
1912*c83a76b0SSuyog Pawar     WORD32 i4_num_resolutions;
1913*c83a76b0SSuyog Pawar     WORD32 ai4_num_bitrate_instances[IHEVCE_MAX_NUM_RESOLUTIONS] = { 1 };
1914*c83a76b0SSuyog Pawar     UWORD32 u4_latency = 0;
1915*c83a76b0SSuyog Pawar 
1916*c83a76b0SSuyog Pawar     /* sanity checks */
1917*c83a76b0SSuyog Pawar     if(NULL == pv_ihevce_hdl)
1918*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
1919*c83a76b0SSuyog Pawar 
1920*c83a76b0SSuyog Pawar     if(NULL == ps_out)
1921*c83a76b0SSuyog Pawar         return (IHEVCE_EFAIL);
1922*c83a76b0SSuyog Pawar 
1923*c83a76b0SSuyog Pawar     /* derive local variables */
1924*c83a76b0SSuyog Pawar     ps_ctxt = (plugin_ctxt_t *)pv_ihevce_hdl;
1925*c83a76b0SSuyog Pawar     if((0 == ps_ctxt->ps_static_cfg_prms->i4_res_id) &&
1926*c83a76b0SSuyog Pawar        (0 == ps_ctxt->ps_static_cfg_prms->i4_br_id))
1927*c83a76b0SSuyog Pawar     {
1928*c83a76b0SSuyog Pawar         ps_interface_ctxt = (ihevce_hle_ctxt_t *)ps_ctxt->pv_hle_interface_ctxt;
1929*c83a76b0SSuyog Pawar         ps_app_ctxt = &ps_ctxt->s_app_ctxt;
1930*c83a76b0SSuyog Pawar         i4_num_resolutions = ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.i4_num_res_layers;
1931*c83a76b0SSuyog Pawar 
1932*c83a76b0SSuyog Pawar         if(ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers)
1933*c83a76b0SSuyog Pawar         {
1934*c83a76b0SSuyog Pawar             u4_latency +=
1935*c83a76b0SSuyog Pawar                 (1 << ps_ctxt->ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers) - 1;
1936*c83a76b0SSuyog Pawar         }
1937*c83a76b0SSuyog Pawar 
1938*c83a76b0SSuyog Pawar         u4_latency += ps_ctxt->ps_static_cfg_prms->s_lap_prms.i4_rc_look_ahead_pics;
1939*c83a76b0SSuyog Pawar 
1940*c83a76b0SSuyog Pawar         /* Once the internal-flush-flag has been set and codec has issued
1941*c83a76b0SSuyog Pawar         end flag, exit encoding by returning IHEVCE_EFAIL */
1942*c83a76b0SSuyog Pawar         if(ps_ctxt->i4_internal_flush)
1943*c83a76b0SSuyog Pawar         {
1944*c83a76b0SSuyog Pawar             if(1 == ps_app_ctxt->ai4_out_strm_end_flag[0][0])
1945*c83a76b0SSuyog Pawar                 return (IHEVCE_EFAIL);
1946*c83a76b0SSuyog Pawar         }
1947*c83a76b0SSuyog Pawar 
1948*c83a76b0SSuyog Pawar         for(i4_res_id = 0; i4_res_id < i4_num_resolutions; i4_res_id++)
1949*c83a76b0SSuyog Pawar         {
1950*c83a76b0SSuyog Pawar             ai4_num_bitrate_instances[i4_res_id] =
1951*c83a76b0SSuyog Pawar                 ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_res_id]
1952*c83a76b0SSuyog Pawar                     .i4_num_bitrate_instances;
1953*c83a76b0SSuyog Pawar             for(i4_br_id = 0; i4_br_id < ai4_num_bitrate_instances[i4_res_id]; i4_br_id++)
1954*c83a76b0SSuyog Pawar             {
1955*c83a76b0SSuyog Pawar                 /* ------- Que in free output buffer if end flag is not set ------ */
1956*c83a76b0SSuyog Pawar                 ihevce_queue_out_buffer(ps_ctxt, i4_res_id, i4_br_id);
1957*c83a76b0SSuyog Pawar             }
1958*c83a76b0SSuyog Pawar         }
1959*c83a76b0SSuyog Pawar 
1960*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1961*c83a76b0SSuyog Pawar         /*            Input Processing                                           */
1962*c83a76b0SSuyog Pawar         /* --------------------------------------------------------------------- */
1963*c83a76b0SSuyog Pawar         if(0 == ps_ctxt->i4_flush_mode_on)
1964*c83a76b0SSuyog Pawar         {
1965*c83a76b0SSuyog Pawar             WORD32 frm_stride;
1966*c83a76b0SSuyog Pawar             WORD32 frm_width;
1967*c83a76b0SSuyog Pawar             WORD32 frm_height;
1968*c83a76b0SSuyog Pawar             WORD32 buf_id;
1969*c83a76b0SSuyog Pawar 
1970*c83a76b0SSuyog Pawar             iv_input_data_ctrl_buffs_t *ps_curr_inp;
1971*c83a76b0SSuyog Pawar             WORD32 *pi4_ctrl_ptr;
1972*c83a76b0SSuyog Pawar 
1973*c83a76b0SSuyog Pawar             frm_width = ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_width;
1974*c83a76b0SSuyog Pawar             frm_height = ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_height;
1975*c83a76b0SSuyog Pawar             frm_stride = ps_ctxt->i4_frm_stride;
1976*c83a76b0SSuyog Pawar 
1977*c83a76b0SSuyog Pawar             /* ---------- get a free buffer from input Q ------ */
1978*c83a76b0SSuyog Pawar             ps_curr_inp = (iv_input_data_ctrl_buffs_t *)ihevce_q_get_free_inp_data_buff(
1979*c83a76b0SSuyog Pawar                 ps_interface_ctxt, &buf_id, BUFF_QUE_BLOCKING_MODE);
1980*c83a76b0SSuyog Pawar 
1981*c83a76b0SSuyog Pawar             if(NULL != ps_curr_inp)
1982*c83a76b0SSuyog Pawar             {
1983*c83a76b0SSuyog Pawar                 /* if input buffer is not NULL */
1984*c83a76b0SSuyog Pawar                 if(NULL != ps_inp)
1985*c83a76b0SSuyog Pawar                 {
1986*c83a76b0SSuyog Pawar                     WORD32 result;
1987*c83a76b0SSuyog Pawar 
1988*c83a76b0SSuyog Pawar                     pi4_ctrl_ptr = (WORD32 *)ps_curr_inp->pv_synch_ctrl_bufs;
1989*c83a76b0SSuyog Pawar 
1990*c83a76b0SSuyog Pawar                     /* ---------- set ip params ---------- */
1991*c83a76b0SSuyog Pawar                     ps_curr_inp->s_input_buf.i4_size = sizeof(iv_yuv_buf_t);
1992*c83a76b0SSuyog Pawar                     ps_curr_inp->s_input_buf.i4_y_wd = frm_width;
1993*c83a76b0SSuyog Pawar                     ps_curr_inp->s_input_buf.i4_y_ht = frm_height;
1994*c83a76b0SSuyog Pawar                     ps_curr_inp->s_input_buf.i4_y_strd = frm_stride;
1995*c83a76b0SSuyog Pawar                     ps_curr_inp->s_input_buf.i4_uv_wd = frm_width;
1996*c83a76b0SSuyog Pawar                     ps_curr_inp->s_input_buf.i4_uv_ht =
1997*c83a76b0SSuyog Pawar                         frm_height >>
1998*c83a76b0SSuyog Pawar                         ((ps_ctxt->ps_static_cfg_prms->s_src_prms.inp_chr_format == 13) ? 0 : 1);
1999*c83a76b0SSuyog Pawar                     ps_curr_inp->s_input_buf.i4_uv_strd = frm_stride;
2000*c83a76b0SSuyog Pawar 
2001*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_buf_id = buf_id;
2002*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_inp_frm_data_valid_flag = 1;
2003*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_topfield_first = 1; /* set to default */
2004*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_bottom_field = ps_ctxt->i4_field_id;
2005*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_inp_timestamp_low = (WORD32)(ps_inp->u8_pts & 0xFFFFFFFF);
2006*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_inp_timestamp_high = (WORD32)(ps_inp->u8_pts >> 32);
2007*c83a76b0SSuyog Pawar 
2008*c83a76b0SSuyog Pawar                     /* toggle field id */
2009*c83a76b0SSuyog Pawar                     ps_ctxt->i4_field_id = !ps_ctxt->i4_field_id;
2010*c83a76b0SSuyog Pawar 
2011*c83a76b0SSuyog Pawar                     /* ---------- Introduction of Force IDR locs   ---------- */
2012*c83a76b0SSuyog Pawar                     if(ps_inp->i4_force_idr_flag)
2013*c83a76b0SSuyog Pawar                     {
2014*c83a76b0SSuyog Pawar                         *pi4_ctrl_ptr = IHEVCE_SYNCH_API_FORCE_IDR_TAG;
2015*c83a76b0SSuyog Pawar                         *(pi4_ctrl_ptr + 1) = 0;
2016*c83a76b0SSuyog Pawar                         pi4_ctrl_ptr += 2;
2017*c83a76b0SSuyog Pawar 
2018*c83a76b0SSuyog Pawar                         /* set the cmd to NA */
2019*c83a76b0SSuyog Pawar                         *pi4_ctrl_ptr = IHEVCE_SYNCH_API_END_TAG;
2020*c83a76b0SSuyog Pawar 
2021*c83a76b0SSuyog Pawar                         ps_curr_inp->i4_cmd_buf_size = 4 * 3; /* 12 bytes */
2022*c83a76b0SSuyog Pawar                     }
2023*c83a76b0SSuyog Pawar                     else
2024*c83a76b0SSuyog Pawar                     {
2025*c83a76b0SSuyog Pawar                         /* set the cmd to NA */
2026*c83a76b0SSuyog Pawar                         *pi4_ctrl_ptr = IHEVCE_SYNCH_API_END_TAG;
2027*c83a76b0SSuyog Pawar 
2028*c83a76b0SSuyog Pawar                         ps_curr_inp->i4_cmd_buf_size = 4; /* 4 bytes */
2029*c83a76b0SSuyog Pawar                     }
2030*c83a76b0SSuyog Pawar                     /* call the input copy function */
2031*c83a76b0SSuyog Pawar                     result = ihevce_copy_inp_8bit(
2032*c83a76b0SSuyog Pawar                         ps_curr_inp,
2033*c83a76b0SSuyog Pawar                         ps_inp,
2034*c83a76b0SSuyog Pawar                         ps_ctxt->ps_static_cfg_prms->s_src_prms.inp_chr_format,
2035*c83a76b0SSuyog Pawar                         ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_orig_width,
2036*c83a76b0SSuyog Pawar                         ps_ctxt->ps_static_cfg_prms->s_src_prms.i4_orig_height);
2037*c83a76b0SSuyog Pawar 
2038*c83a76b0SSuyog Pawar                     if(IV_SUCCESS != result)
2039*c83a76b0SSuyog Pawar                         return (IHEVCE_EFAIL);
2040*c83a76b0SSuyog Pawar 
2041*c83a76b0SSuyog Pawar                     if(3 != ps_ctxt->ps_static_cfg_prms->s_config_prms.i4_rate_control_mode)
2042*c83a76b0SSuyog Pawar                     {
2043*c83a76b0SSuyog Pawar                         /* Dynamic Change in bitrate not supported for multi res/MBR */
2044*c83a76b0SSuyog Pawar                         /*** Check for change in bitrate command ***/
2045*c83a76b0SSuyog Pawar                         if(ps_ctxt->ai4_old_bitrate[0][0] != ps_inp->i4_curr_bitrate)
2046*c83a76b0SSuyog Pawar                         {
2047*c83a76b0SSuyog Pawar                             WORD32 buf_id;
2048*c83a76b0SSuyog Pawar                             WORD32 *pi4_cmd_buf;
2049*c83a76b0SSuyog Pawar                             iv_input_ctrl_buffs_t *ps_ctrl_buf;
2050*c83a76b0SSuyog Pawar                             ihevce_dyn_config_prms_t *ps_dyn_br;
2051*c83a76b0SSuyog Pawar                             WORD32 codec_level_index = ihevce_get_level_index(
2052*c83a76b0SSuyog Pawar                                 ps_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[0]
2053*c83a76b0SSuyog Pawar                                     .i4_codec_level);
2054*c83a76b0SSuyog Pawar                             WORD32 max_bitrate =
2055*c83a76b0SSuyog Pawar                                 g_as_level_data[codec_level_index].i4_max_bit_rate
2056*c83a76b0SSuyog Pawar                                     [ps_ctxt->ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier] *
2057*c83a76b0SSuyog Pawar                                 1000;
2058*c83a76b0SSuyog Pawar 
2059*c83a76b0SSuyog Pawar                             /* ---------- get a free buffer from command Q ------ */
2060*c83a76b0SSuyog Pawar                             ps_ctrl_buf = (iv_input_ctrl_buffs_t *)ihevce_q_get_free_inp_ctrl_buff(
2061*c83a76b0SSuyog Pawar                                 ps_interface_ctxt, &buf_id, BUFF_QUE_BLOCKING_MODE);
2062*c83a76b0SSuyog Pawar                             /* store the buffer id */
2063*c83a76b0SSuyog Pawar                             ps_ctrl_buf->i4_buf_id = buf_id;
2064*c83a76b0SSuyog Pawar 
2065*c83a76b0SSuyog Pawar                             /* get the buffer pointer */
2066*c83a76b0SSuyog Pawar                             pi4_cmd_buf = (WORD32 *)ps_ctrl_buf->pv_asynch_ctrl_bufs;
2067*c83a76b0SSuyog Pawar 
2068*c83a76b0SSuyog Pawar                             /* store the set default command, encoder should use create time prms */
2069*c83a76b0SSuyog Pawar                             *pi4_cmd_buf = IHEVCE_ASYNCH_API_SETBITRATE_TAG;
2070*c83a76b0SSuyog Pawar                             *(pi4_cmd_buf + 1) = sizeof(ihevce_dyn_config_prms_t);
2071*c83a76b0SSuyog Pawar 
2072*c83a76b0SSuyog Pawar                             ps_dyn_br = (ihevce_dyn_config_prms_t *)(pi4_cmd_buf + 2);
2073*c83a76b0SSuyog Pawar                             ps_dyn_br->i4_size = sizeof(ihevce_dyn_config_prms_t);
2074*c83a76b0SSuyog Pawar                             ps_dyn_br->i4_tgt_br_id = 0;
2075*c83a76b0SSuyog Pawar                             ps_dyn_br->i4_tgt_res_id = 0;
2076*c83a76b0SSuyog Pawar                             ps_dyn_br->i4_new_tgt_bitrate =
2077*c83a76b0SSuyog Pawar                                 MIN(ps_inp->i4_curr_bitrate, max_bitrate);
2078*c83a76b0SSuyog Pawar                             ps_dyn_br->i4_new_tgt_bitrate =
2079*c83a76b0SSuyog Pawar                                 MAX(ps_dyn_br->i4_new_tgt_bitrate, MIN_BITRATE);
2080*c83a76b0SSuyog Pawar                             ps_dyn_br->i4_new_peak_bitrate =
2081*c83a76b0SSuyog Pawar                                 MIN((ps_dyn_br->i4_new_tgt_bitrate << 1), max_bitrate);
2082*c83a76b0SSuyog Pawar                             pi4_cmd_buf += 2;
2083*c83a76b0SSuyog Pawar                             pi4_cmd_buf += (sizeof(ihevce_dyn_config_prms_t) >> 2);
2084*c83a76b0SSuyog Pawar 
2085*c83a76b0SSuyog Pawar                             *(pi4_cmd_buf) = IHEVCE_ASYNCH_API_END_TAG;
2086*c83a76b0SSuyog Pawar 
2087*c83a76b0SSuyog Pawar                             ps_ctrl_buf->i4_cmd_buf_size = 12 + sizeof(ihevce_dyn_config_prms_t);
2088*c83a76b0SSuyog Pawar 
2089*c83a76b0SSuyog Pawar                             /* ---------- set the buffer as produced ---------- */
2090*c83a76b0SSuyog Pawar                             ihevce_q_set_inp_ctrl_buff_prod(ps_interface_ctxt, buf_id);
2091*c83a76b0SSuyog Pawar 
2092*c83a76b0SSuyog Pawar                             ps_ctxt->ai4_old_bitrate[0][0] = ps_dyn_br->i4_new_tgt_bitrate;
2093*c83a76b0SSuyog Pawar                         }
2094*c83a76b0SSuyog Pawar                     }
2095*c83a76b0SSuyog Pawar 
2096*c83a76b0SSuyog Pawar                     ps_ctxt->u8_num_frames_queued++;
2097*c83a76b0SSuyog Pawar                 }
2098*c83a76b0SSuyog Pawar                 else
2099*c83a76b0SSuyog Pawar                 { /* flush mode command */
2100*c83a76b0SSuyog Pawar 
2101*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_buf_id = buf_id;
2102*c83a76b0SSuyog Pawar 
2103*c83a76b0SSuyog Pawar                     /* set the input status to invalid flag */
2104*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_inp_frm_data_valid_flag = 0;
2105*c83a76b0SSuyog Pawar 
2106*c83a76b0SSuyog Pawar                     pi4_ctrl_ptr = (WORD32 *)ps_curr_inp->pv_synch_ctrl_bufs;
2107*c83a76b0SSuyog Pawar 
2108*c83a76b0SSuyog Pawar                     *pi4_ctrl_ptr = IHEVCE_SYNCH_API_FLUSH_TAG;
2109*c83a76b0SSuyog Pawar                     *(pi4_ctrl_ptr + 1) = 0;
2110*c83a76b0SSuyog Pawar                     *(pi4_ctrl_ptr + 2) = IHEVCE_SYNCH_API_END_TAG;
2111*c83a76b0SSuyog Pawar 
2112*c83a76b0SSuyog Pawar                     ps_curr_inp->i4_cmd_buf_size = 4 * 3; /* 4 bytes */
2113*c83a76b0SSuyog Pawar                 }
2114*c83a76b0SSuyog Pawar 
2115*c83a76b0SSuyog Pawar                 /* ---------- set the buffer as produced ---------- */
2116*c83a76b0SSuyog Pawar                 ihevce_q_set_inp_data_buff_prod(ps_interface_ctxt, buf_id);
2117*c83a76b0SSuyog Pawar                 ps_ctxt->u8_num_frames_encoded++;
2118*c83a76b0SSuyog Pawar             }
2119*c83a76b0SSuyog Pawar             else
2120*c83a76b0SSuyog Pawar             {
2121*c83a76b0SSuyog Pawar                 /* Enable flush-mode and internal-flush once limit according to
2122*c83a76b0SSuyog Pawar                 Eval-version is reached */
2123*c83a76b0SSuyog Pawar                 ps_ctxt->i4_flush_mode_on = 1;
2124*c83a76b0SSuyog Pawar                 ps_ctxt->i4_internal_flush = 1;
2125*c83a76b0SSuyog Pawar             }
2126*c83a76b0SSuyog Pawar         }
2127*c83a76b0SSuyog Pawar 
2128*c83a76b0SSuyog Pawar         /* set encoder in flush mode if input buffer is NULL */
2129*c83a76b0SSuyog Pawar         if(0 == ps_ctxt->i4_flush_mode_on)
2130*c83a76b0SSuyog Pawar         {
2131*c83a76b0SSuyog Pawar             if(NULL == ps_inp)
2132*c83a76b0SSuyog Pawar             {
2133*c83a76b0SSuyog Pawar                 ps_ctxt->i4_flush_mode_on = 1;
2134*c83a76b0SSuyog Pawar             }
2135*c83a76b0SSuyog Pawar         }
2136*c83a76b0SSuyog Pawar 
2137*c83a76b0SSuyog Pawar         if((u4_latency < ps_ctxt->u8_num_frames_queued) || (1 == ps_ctxt->i4_flush_mode_on))
2138*c83a76b0SSuyog Pawar         {
2139*c83a76b0SSuyog Pawar             /* --------------------------------------------------------------------- */
2140*c83a76b0SSuyog Pawar             /*            Output Processing                                          */
2141*c83a76b0SSuyog Pawar             /* --------------------------------------------------------------------- */
2142*c83a76b0SSuyog Pawar             ihevce_receive_out_buffer(ps_ctxt, ps_out);
2143*c83a76b0SSuyog Pawar         }
2144*c83a76b0SSuyog Pawar     }
2145*c83a76b0SSuyog Pawar     else  //Other bitrate and resolution instances
2146*c83a76b0SSuyog Pawar     {
2147*c83a76b0SSuyog Pawar         return IHEVCE_EFAIL;
2148*c83a76b0SSuyog Pawar     }
2149*c83a76b0SSuyog Pawar     return (IHEVCE_EOK);
2150*c83a76b0SSuyog Pawar }
2151*c83a76b0SSuyog Pawar 
2152