Coverage Report

Created: 2026-05-30 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhevc/encoder/ihevce_memory_init.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
21
/*!
22
******************************************************************************
23
* \file ihevce_memory_init.c
24
*
25
* \brief
26
*    This file contains functions which perform memory requirement gathering
27
*    and freeing of memories of encoder at the end
28
*
29
* \date
30
*    18/09/2012
31
*
32
* \author
33
*    Ittiam
34
*
35
* List of Functions
36
*    <TODO: TO BE ADDED>
37
*
38
******************************************************************************
39
*/
40
41
/*****************************************************************************/
42
/* File Includes                                                             */
43
/*****************************************************************************/
44
/* System include files */
45
#include <stdio.h>
46
#include <string.h>
47
#include <stdlib.h>
48
#include <assert.h>
49
#include <stdarg.h>
50
#include <math.h>
51
52
/* User include files */
53
#include "ihevc_typedefs.h"
54
#include "itt_video_api.h"
55
#include "ihevce_api.h"
56
57
#include "rc_cntrl_param.h"
58
#include "rc_frame_info_collector.h"
59
#include "rc_look_ahead_params.h"
60
61
#include "ihevc_defs.h"
62
#include "ihevc_macros.h"
63
#include "ihevc_debug.h"
64
#include "ihevc_structs.h"
65
#include "ihevc_platform_macros.h"
66
#include "ihevc_deblk.h"
67
#include "ihevc_itrans_recon.h"
68
#include "ihevc_chroma_itrans_recon.h"
69
#include "ihevc_chroma_intra_pred.h"
70
#include "ihevc_intra_pred.h"
71
#include "ihevc_inter_pred.h"
72
#include "ihevc_mem_fns.h"
73
#include "ihevc_padding.h"
74
#include "ihevc_weighted_pred.h"
75
#include "ihevc_sao.h"
76
#include "ihevc_resi_trans.h"
77
#include "ihevc_quant_iquant_ssd.h"
78
#include "ihevc_cabac_tables.h"
79
#include "ihevc_common_tables.h"
80
81
#include "ihevce_defs.h"
82
#include "ihevce_hle_interface.h"
83
#include "ihevce_lap_enc_structs.h"
84
#include "ihevce_lap_interface.h"
85
#include "ihevce_multi_thrd_structs.h"
86
#include "ihevce_multi_thrd_funcs.h"
87
#include "ihevce_me_common_defs.h"
88
#include "ihevce_had_satd.h"
89
#include "ihevce_error_codes.h"
90
#include "ihevce_bitstream.h"
91
#include "ihevce_cabac.h"
92
#include "ihevce_rdoq_macros.h"
93
#include "ihevce_function_selector.h"
94
#include "ihevce_enc_structs.h"
95
#include "ihevce_entropy_structs.h"
96
#include "ihevce_cmn_utils_instr_set_router.h"
97
#include "ihevce_ipe_instr_set_router.h"
98
#include "ihevce_decomp_pre_intra_structs.h"
99
#include "ihevce_decomp_pre_intra_pass.h"
100
#include "ihevce_enc_loop_structs.h"
101
#include "ihevce_nbr_avail.h"
102
#include "ihevce_enc_loop_utils.h"
103
#include "ihevce_sub_pic_rc.h"
104
#include "ihevce_global_tables.h"
105
#include "ihevce_bs_compute_ctb.h"
106
#include "ihevce_cabac_rdo.h"
107
#include "ihevce_deblk.h"
108
#include "ihevce_entropy_interface.h"
109
#include "ihevce_frame_process.h"
110
#include "ihevce_ipe_pass.h"
111
#include "ihevce_rc_enc_structs.h"
112
#include "ihevce_rc_interface.h"
113
#include "hme_datatype.h"
114
#include "hme_interface.h"
115
#include "hme_common_defs.h"
116
#include "hme_defs.h"
117
#include "ihevce_me_instr_set_router.h"
118
#include "ihevce_enc_subpel_gen.h"
119
#include "ihevce_inter_pred.h"
120
#include "ihevce_mv_pred.h"
121
#include "ihevce_mv_pred_merge.h"
122
#include "ihevce_enc_loop_inter_mode_sifter.h"
123
#include "ihevce_me_pass.h"
124
#include "ihevce_coarse_me_pass.h"
125
#include "ihevce_enc_cu_recursion.h"
126
#include "ihevce_enc_loop_pass.h"
127
#include "ihevce_common_utils.h"
128
#include "ihevce_buffer_que_interface.h"
129
#include "ihevce_dep_mngr_interface.h"
130
#include "ihevce_sao.h"
131
#include "ihevce_tile_interface.h"
132
133
#include "cast_types.h"
134
#include "osal.h"
135
#include "osal_defaults.h"
136
137
/*****************************************************************************/
138
/* Function Definitions                                                      */
139
/*****************************************************************************/
140
141
/*!
142
******************************************************************************
143
* \if Function name : ihevce_mem_manager_init \endif
144
*
145
* \brief
146
*    Encoder Memory init function
147
*
148
* \param[in] Processing interface context pointer
149
*
150
* \return
151
*    None
152
*
153
* \author
154
*  Ittiam
155
*
156
*****************************************************************************
157
*/
158
1.22k
#define MAX_QUEUE 40
159
void ihevce_mem_manager_init(enc_ctxt_t *ps_enc_ctxt, ihevce_hle_ctxt_t *ps_intrf_ctxt)
160
198
{
161
    /* local variables */
162
198
    WORD32 total_memtabs_req = 0;
163
198
    WORD32 total_memtabs_used = 0;
164
198
    WORD32 total_system_memtabs = 0;
165
198
    WORD32 ctr;
166
198
    WORD32 buf_size;
167
198
    WORD32 num_ctb_horz;
168
198
    WORD32 num_ctb_vert;
169
198
    WORD32 num_cu_in_ctb;
170
198
    WORD32 num_pu_in_ctb;
171
198
    WORD32 num_tu_in_ctb;
172
198
    WORD32 ctb_size;
173
198
    WORD32 min_cu_size;
174
198
    WORD32 max_num_ref_pics;
175
198
    WORD32 mem_alloc_ctrl_flag;
176
198
    WORD32 space_for_mem_in_enc_grp = 0;
177
198
    WORD32 space_for_mem_in_pre_enc_grp = 0;
178
198
    WORD32 mv_bank_size;
179
198
    WORD32 ref_idx_bank_size;
180
198
    WORD32 a_wd[MAX_NUM_HME_LAYERS], a_ht[MAX_NUM_HME_LAYERS];
181
198
    WORD32 a_disp_wd[MAX_NUM_HME_LAYERS], a_disp_ht[MAX_NUM_HME_LAYERS];
182
198
    WORD32 a_ctb_align_wd[MAX_NUM_HME_LAYERS], a_ctb_align_ht[MAX_NUM_HME_LAYERS];
183
198
    WORD32 n_enc_layers = 1, n_tot_layers;
184
198
    WORD32 num_bufs_preenc_me_que, num_bufs_L0_ipe_enc, max_delay_preenc_l0_que;
185
198
    WORD32 i, i4_resolution_id = ps_enc_ctxt->i4_resolution_id;  //counter
186
198
    WORD32 i4_num_bitrate_inst;
187
198
    iv_mem_rec_t *ps_memtab;
188
198
    WORD32 i4_field_pic, i4_total_queues = 0;
189
190
198
    recon_pic_buf_t **pps_pre_enc_pic_bufs;
191
198
    frm_proc_ent_cod_ctxt_t **pps_frm_proc_ent_cod_bufs[IHEVCE_MAX_NUM_BITRATES];
192
198
    pre_enc_me_ctxt_t **pps_pre_enc_bufs;
193
198
    me_enc_rdopt_ctxt_t **pps_me_enc_bufs;
194
198
    pre_enc_L0_ipe_encloop_ctxt_t **pps_L0_ipe_enc_bufs;
195
    /*get number of input buffer required based on requirement from each stage*/
196
198
    ihevce_lap_enc_buf_t **pps_lap_enc_input_bufs;
197
198
    WORD32 i4_num_enc_loop_frm_pllel;
198
198
    WORD32 i4_num_me_frm_pllel;
199
    /*msr: These are parameters required to allocate input buffer,
200
    encoder needs to be initilized before getting requirements hence filled once static params are initilized*/
201
198
    WORD32 num_input_buf_per_queue, i4_yuv_min_size, i4_luma_min_size;
202
203
198
    i4_num_bitrate_inst = ps_enc_ctxt->i4_num_bitrates;
204
198
    i4_field_pic = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_field_pic;
205
198
    ps_intrf_ctxt->i4_gpu_mem_size = 0;
206
207
    /*Initialize the thrd id flag and all deafult values for sub pic rc */
208
198
    {
209
198
        WORD32 i, j, k;
210
211
396
        for(i = 0; i < MAX_NUM_ENC_LOOP_PARALLEL; i++)
212
198
        {
213
396
            for(j = 0; j < IHEVCE_MAX_NUM_BITRATES; j++)
214
198
            {
215
198
                ps_enc_ctxt->s_multi_thrd.ai4_acc_ctb_ctr[i][j] = 0;
216
198
                ps_enc_ctxt->s_multi_thrd.ai4_ctb_ctr[i][j] = 0;
217
218
198
                ps_enc_ctxt->s_multi_thrd.ai4_threshold_reached[i][j] = 0;
219
220
198
                ps_enc_ctxt->s_multi_thrd.ai4_curr_qp_acc[i][j] = 0;
221
222
198
                ps_enc_ctxt->s_multi_thrd.af_acc_hdr_bits_scale_err[i][j] = 0;
223
224
1.78k
                for(k = 0; k < MAX_NUM_FRM_PROC_THRDS_ENC; k++)
225
1.58k
                {
226
1.58k
                    ps_enc_ctxt->s_multi_thrd.ai4_thrd_id_valid_flag[i][j][k] = -1;
227
1.58k
                }
228
198
            }
229
198
        }
230
198
    }
231
232
198
#define ENABLE_FRM_PARALLEL
233
198
#ifdef ENABLE_FRM_PARALLEL
234
198
    i4_num_enc_loop_frm_pllel = MAX_NUM_ENC_LOOP_PARALLEL;
235
198
    i4_num_me_frm_pllel = MAX_NUM_ME_PARALLEL;
236
#else
237
    i4_num_enc_loop_frm_pllel = 1;
238
    i4_num_me_frm_pllel = 1;
239
#endif
240
241
198
    ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel = i4_num_enc_loop_frm_pllel;
242
198
    ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc = i4_num_enc_loop_frm_pllel;
243
198
    ps_enc_ctxt->s_multi_thrd.i4_num_me_frm_pllel = i4_num_me_frm_pllel;
244
198
    ps_enc_ctxt->s_multi_thrd.i4_force_end_flag = 0;
245
246
198
    ps_enc_ctxt->i4_ref_mbr_id = 0;
247
    /* get the ctb size from max cu size */
248
198
    ctb_size = ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_max_log2_cu_size;
249
250
    /* get the min cu size from config params */
251
198
    min_cu_size = ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_min_log2_cu_size;
252
253
    /* convert to actual width */
254
198
    ctb_size = 1 << ctb_size;
255
198
    min_cu_size = 1 << min_cu_size;
256
257
    /* Get the width and heights of different decomp layers */
258
198
    *a_wd =
259
198
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
260
198
            .i4_width +
261
198
        SET_CTB_ALIGN(
262
198
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
263
198
                .i4_width,
264
198
            min_cu_size);
265
198
    *a_ht =
266
198
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
267
198
            .i4_height +
268
198
        SET_CTB_ALIGN(
269
198
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
270
198
                .i4_height,
271
198
            min_cu_size);
272
273
198
    n_tot_layers = hme_derive_num_layers(n_enc_layers, a_wd, a_ht, a_disp_wd, a_disp_ht);
274
198
    hme_coarse_get_layer1_mv_bank_ref_idx_size(
275
198
        n_tot_layers,
276
198
        a_wd,
277
198
        a_ht,
278
198
        ((ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
279
198
             ? ((DEFAULT_MAX_REFERENCE_PICS) << i4_field_pic)
280
198
             : ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames),
281
198
        (S32 *)(&mv_bank_size),
282
198
        (S32 *)(&ref_idx_bank_size));
283
198
    if(n_tot_layers < 3)
284
0
    {
285
0
        WORD32 error_code;
286
0
        error_code = IHEVCE_NUM_DECOMP_LYRS_NOT_SUPPORTED;
287
0
        ps_intrf_ctxt->i4_error_code = IHEVCE_SETUNSUPPORTEDINPUT(error_code);
288
0
        return;
289
0
    }
290
291
    /* calculate num cu,pu,tu in ctb */
292
198
    num_cu_in_ctb = ctb_size / MIN_CU_SIZE;
293
198
    num_cu_in_ctb *= num_cu_in_ctb;
294
295
198
    num_pu_in_ctb = ctb_size / MIN_PU_SIZE;
296
198
    num_pu_in_ctb *= num_pu_in_ctb;
297
298
198
    num_tu_in_ctb = ctb_size / MIN_PU_SIZE;
299
198
    num_tu_in_ctb *= num_tu_in_ctb;
300
301
    /* calcuate the number of ctb horizontally*/
302
198
    num_ctb_horz =
303
198
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
304
198
            .i4_width +
305
198
        SET_CTB_ALIGN(
306
198
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
307
198
                .i4_width,
308
198
            ctb_size);
309
198
    num_ctb_horz = num_ctb_horz / ctb_size;
310
311
    /* calcuate the number of ctb vertically*/
312
198
    num_ctb_vert =
313
198
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
314
198
            .i4_height +
315
198
        SET_CTB_ALIGN(
316
198
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
317
198
                .i4_height,
318
198
            ctb_size);
319
198
    num_ctb_vert = num_ctb_vert / ctb_size;
320
321
    /* align all the decomp layer dimensions to CTB alignment */
322
925
    for(ctr = 0; ctr < n_tot_layers; ctr++)
323
727
    {
324
727
        a_ctb_align_wd[ctr] = a_wd[ctr] + SET_CTB_ALIGN(a_wd[ctr], ctb_size);
325
326
727
        a_ctb_align_ht[ctr] = a_ht[ctr] + SET_CTB_ALIGN(a_ht[ctr], ctb_size);
327
727
    }
328
329
    /* SEI related parametert initialization */
330
331
198
    ps_enc_ctxt->u4_cur_pic_encode_cnt = 0;
332
333
    /* store the frame level ctb parameters which will be constant for the session */
334
198
    ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size = ctb_size;
335
198
    ps_enc_ctxt->s_frm_ctb_prms.i4_min_cu_size = min_cu_size;
336
198
    ps_enc_ctxt->s_frm_ctb_prms.i4_num_cus_in_ctb = num_cu_in_ctb;
337
198
    ps_enc_ctxt->s_frm_ctb_prms.i4_num_pus_in_ctb = num_pu_in_ctb;
338
198
    ps_enc_ctxt->s_frm_ctb_prms.i4_num_tus_in_ctb = num_tu_in_ctb;
339
340
    /* intialize cra poc to default value */
341
198
    ps_enc_ctxt->i4_cra_poc = 0;
342
343
    /* initialise the memory alloc control flag */
344
198
    mem_alloc_ctrl_flag = ps_enc_ctxt->ps_stat_prms->s_multi_thrd_prms.i4_memory_alloc_ctrl_flag;
345
346
    /* decide the memory space for enc_grp and pre_enc_grp based on control flag */
347
198
    if(0 == mem_alloc_ctrl_flag)
348
198
    {
349
        /* normal memory */
350
198
        space_for_mem_in_enc_grp = IV_EXT_CACHEABLE_NORMAL_MEM;
351
198
        space_for_mem_in_pre_enc_grp = IV_EXT_CACHEABLE_NORMAL_MEM;
352
198
    }
353
0
    else if(1 == mem_alloc_ctrl_flag)
354
0
    {
355
        /* only NUMA Node 0 memory allocation */
356
0
        space_for_mem_in_enc_grp = IV_EXT_CACHEABLE_NUMA_NODE0_MEM;
357
0
        space_for_mem_in_pre_enc_grp = IV_EXT_CACHEABLE_NUMA_NODE0_MEM;
358
0
    }
359
0
    else if(2 == mem_alloc_ctrl_flag)
360
0
    {
361
        /* Both NUMA Node 0 & Node 1 memory allocation */
362
0
        space_for_mem_in_enc_grp = IV_EXT_CACHEABLE_NUMA_NODE0_MEM;
363
0
        space_for_mem_in_pre_enc_grp = IV_EXT_CACHEABLE_NUMA_NODE1_MEM;
364
0
    }
365
0
    else
366
0
    {
367
        /* should not enter here */
368
0
        ASSERT(0);
369
0
    }
370
371
198
    {
372
198
        if(ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel > 1)
373
0
        {
374
0
            num_bufs_preenc_me_que = MIN_L1_L0_STAGGER_NON_SEQ +
375
0
                                     ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics +
376
0
                                     (MAX_L0_IPE_ENC_STAGGER - 1) + NUM_BUFS_DECOMP_HME;
377
0
        }
378
198
        else
379
198
        {
380
198
            num_bufs_preenc_me_que = MIN_L1_L0_STAGGER_NON_SEQ +
381
198
                                     ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics +
382
198
                                     (MIN_L0_IPE_ENC_STAGGER - 1) + NUM_BUFS_DECOMP_HME;
383
198
        }
384
385
        /*The number of buffers to support stagger between L0 IPE, ME and enc loop. This is a separate queue to store L0 IPE
386
        output to save memory since this is not used in L1 stage*/
387
198
        if(ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel > 1)
388
0
        {
389
0
            num_bufs_L0_ipe_enc = MAX_L0_IPE_ENC_STAGGER;
390
0
        }
391
198
        else
392
198
        {
393
198
            num_bufs_L0_ipe_enc = MIN_L0_IPE_ENC_STAGGER;
394
198
        }
395
396
198
        max_delay_preenc_l0_que = MIN_L1_L0_STAGGER_NON_SEQ +
397
198
                                  ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics + 1;
398
198
    }
399
400
    /* ------------ popluate the lap static parameters ------------- */
401
198
    ps_enc_ctxt->s_lap_stat_prms.i4_max_closed_gop_period =
402
198
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_closed_gop_period;
403
404
198
    ps_enc_ctxt->s_lap_stat_prms.i4_min_closed_gop_period =
405
198
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_min_closed_gop_period;
406
407
198
    ps_enc_ctxt->s_lap_stat_prms.i4_max_cra_open_gop_period =
408
198
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_cra_open_gop_period;
409
410
198
    ps_enc_ctxt->s_lap_stat_prms.i4_max_i_open_gop_period =
411
198
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_i_open_gop_period;
412
413
198
    ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
414
198
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames;
415
416
198
    ps_enc_ctxt->s_lap_stat_prms.i4_max_temporal_layers =
417
198
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_temporal_layers;
418
419
198
    ps_enc_ctxt->s_lap_stat_prms.i4_width = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_width;
420
421
198
    ps_enc_ctxt->s_lap_stat_prms.i4_height = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_height;
422
423
198
    ps_enc_ctxt->s_lap_stat_prms.i4_enable_logo = ps_enc_ctxt->ps_stat_prms->i4_enable_logo;
424
425
198
    ps_enc_ctxt->s_lap_stat_prms.i4_src_interlace_field =
426
198
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_field_pic;
427
198
    ps_enc_ctxt->s_lap_stat_prms.i4_frame_rate =
428
198
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_frm_rate_num /
429
198
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_frm_rate_denom;
430
431
198
    ps_enc_ctxt->s_lap_stat_prms.i4_blu_ray_spec = ps_enc_ctxt->i4_blu_ray_spec;
432
433
198
    ps_enc_ctxt->s_lap_stat_prms.i4_internal_bit_depth =
434
198
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth;
435
436
198
    ps_enc_ctxt->s_lap_stat_prms.i4_input_bit_depth =
437
198
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_input_bit_depth;
438
439
198
    ps_enc_ctxt->s_lap_stat_prms.u1_chroma_array_type =
440
198
        (ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV) ? 2 : 1;
441
442
198
    ps_enc_ctxt->s_lap_stat_prms.i4_rc_pass_num = ps_enc_ctxt->ps_stat_prms->s_pass_prms.i4_pass;
443
444
198
    if(0 == i4_resolution_id)
445
198
    {
446
396
        for(ctr = 0; ctr < ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_num_res_layers; ctr++)
447
198
        {
448
198
            ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] =
449
198
                ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ctr].i4_quality_preset;
450
451
198
            if(ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] == IHEVCE_QUALITY_P7)
452
14
            {
453
14
                ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] = IHEVCE_QUALITY_P6;
454
14
            }
455
198
        }
456
198
    }
457
198
    memcpy(
458
198
        &ps_enc_ctxt->s_lap_stat_prms.s_lap_params,
459
198
        &ps_enc_ctxt->ps_stat_prms->s_lap_prms,
460
198
        sizeof(ihevce_lap_params_t));
461
462
    /* copy the create prms as runtime prms */
463
198
    memcpy(
464
198
        &ps_enc_ctxt->s_runtime_src_prms,
465
198
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
466
198
        sizeof(ihevce_src_params_t));
467
    /*Copy the target params*/
468
198
    memcpy(
469
198
        &ps_enc_ctxt->s_runtime_tgt_params,
470
198
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
471
198
        sizeof(ihevce_tgt_params_t));
472
198
    ps_enc_ctxt->s_lap_stat_prms.e_arch_type = ps_enc_ctxt->ps_stat_prms->e_arch_type;
473
198
    ps_enc_ctxt->s_lap_stat_prms.u1_is_popcnt_available = ps_enc_ctxt->u1_is_popcnt_available;
474
475
    /* copy the create prms as runtime prms */
476
198
    memcpy(
477
198
        &ps_enc_ctxt->s_runtime_src_prms,
478
198
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
479
198
        sizeof(ihevce_src_params_t));
480
    /*Copy the target params*/
481
198
    memcpy(
482
198
        &ps_enc_ctxt->s_runtime_tgt_params,
483
198
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
484
198
        sizeof(ihevce_tgt_params_t));
485
486
    /* copy the run time coding parameters */
487
198
    memcpy(
488
198
        &ps_enc_ctxt->s_runtime_coding_prms,
489
198
        &ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms,
490
198
        sizeof(ihevce_coding_params_t));
491
    /*change in run time parameter*/
492
198
    if(ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
493
198
    {
494
198
        ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames = (DEFAULT_MAX_REFERENCE_PICS)
495
198
                                                                     << i4_field_pic;
496
198
        ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
497
198
            ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
498
198
    }
499
198
    ASSERT(i4_num_enc_loop_frm_pllel == i4_num_me_frm_pllel);
500
501
198
    if((1 == i4_num_enc_loop_frm_pllel) && (1 == i4_num_me_frm_pllel))
502
198
    {
503
198
        max_num_ref_pics = ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
504
198
    }
505
0
    else
506
0
    {
507
0
        max_num_ref_pics =
508
0
            ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames * i4_num_enc_loop_frm_pllel;
509
0
    }
510
    /* --------------------------------------------------------------------- */
511
    /* --------------  Collating the number of memtabs required ------------ */
512
    /* --------------------------------------------------------------------- */
513
514
    /* Memtabs for syntactical tiles */
515
198
    total_memtabs_req += ihevce_tiles_get_num_mem_recs();
516
517
    /* ---------- Enc loop Memtabs --------- */
518
198
    total_memtabs_req +=
519
198
        ihevce_enc_loop_get_num_mem_recs(i4_num_bitrate_inst, i4_num_enc_loop_frm_pllel);
520
    /* ---------- ME Memtabs --------------- */
521
198
    total_memtabs_req += ihevce_me_get_num_mem_recs(i4_num_me_frm_pllel);
522
523
    /* ---------- Coarse ME Memtabs --------------- */
524
198
    total_memtabs_req += ihevce_coarse_me_get_num_mem_recs();
525
    /* ---------- IPE Memtabs -------------- */
526
198
    total_memtabs_req += ihevce_ipe_get_num_mem_recs();
527
528
    /* ---------- ECD Memtabs -------------- */
529
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
530
198
    {
531
198
        total_memtabs_req += ihevce_entropy_get_num_mem_recs();
532
198
    }
533
198
    if(0 == ps_enc_ctxt->i4_resolution_id)
534
198
    {
535
        /* ---------- LAP Memtabs--------------- */
536
198
        total_memtabs_req += ihevce_lap_get_num_mem_recs();
537
198
    }
538
    /* ---------- Decomp Pre Intra Memtabs--------------- */
539
198
    total_memtabs_req += ihevce_decomp_pre_intra_get_num_mem_recs();
540
541
    /* ---------- RC memtabs --------------- */
542
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
543
198
    {
544
198
        total_memtabs_req += ihevce_rc_get_num_mem_recs(); /*HEVC_RC*/
545
198
    }
546
547
    /* ---------- System Memtabs ----------- */
548
198
    total_memtabs_req += TOTAL_SYSTEM_MEM_RECS;  //increment this based on final requirement
549
550
    /* -----Frameproc Entcod Que Memtabs --- */
551
    /* one queue for each bit-rate is used */
552
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
553
198
    {
554
198
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
555
198
    }
556
    /* mrs:memtab for one queue for encoder owned input queue, This is only request for memtab, currently more than
557
    required memtabs are allocated. Hence my change of using memtab for yuv buffers is surviving. Only memtab
558
    usage and initialization needs to be exact sync*/
559
198
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
560
561
    /* ---Pre-encode Encode Que Mem requests -- */
562
198
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
563
564
    /* -----ME / Enc-RD opt Que Mem requests --- */
565
198
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
566
567
    /* ----Pre-encode L0 IPE to enc Que Mem requests -- */
568
198
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
569
570
    /* --- ME-EncLoop Dep Mngr Row-Row Mem requests -- */
571
198
    total_memtabs_req += NUM_ME_ENC_BUFS * ihevce_dmgr_get_num_mem_recs();
572
573
    /* --- Prev. frame EncLoop Done Dep Mngr Frm-Frm Mem requests -- */
574
198
    total_memtabs_req += i4_num_enc_loop_frm_pllel * ihevce_dmgr_get_num_mem_recs();
575
576
    /* --- Prev. frame EncLoop Done for re-encode Dep Mngr Frm-Frm Mem requests -- */
577
198
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
578
579
    /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem requests -- */
580
198
    total_memtabs_req += i4_num_me_frm_pllel * ihevce_dmgr_get_num_mem_recs();
581
582
    /* --- Prev. frame PreEnc L1 Done Dep Mngr Frm-Frm Mem requests -- */
583
198
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
584
585
    /* --- Prev. frame PreEnc HME Done Dep Mngr Frm-Frm Mem requests -- */
586
198
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
587
588
    /* --- Prev. frame PreEnc L0 Done Dep Mngr Frm-Frm Mem requests -- */
589
198
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
590
591
    /* --- ME-Prev Recon Dep Mngr Row-Frm Mem requests -- */
592
198
    total_memtabs_req +=
593
198
        (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * ihevce_dmgr_get_num_mem_recs();
594
595
    /* ----- allocate memomry for memtabs --- */
596
198
    {
597
198
        iv_mem_rec_t s_memtab;
598
599
198
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
600
198
        s_memtab.i4_mem_size = total_memtabs_req * sizeof(iv_mem_rec_t);
601
198
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
602
198
        s_memtab.i4_mem_alignment = 4;
603
604
198
        ps_intrf_ctxt->ihevce_mem_alloc(
605
198
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->ps_stat_prms->s_sys_api, &s_memtab);
606
198
        if(s_memtab.pv_base == NULL)
607
0
        {
608
0
            ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
609
0
            return;
610
0
        }
611
612
198
        ps_memtab = (iv_mem_rec_t *)s_memtab.pv_base;
613
198
    }
614
615
    /* --------------------------------------------------------------------- */
616
    /* ------------------  Collating memory requirements ------------------- */
617
    /* --------------------------------------------------------------------- */
618
619
    /* ----------- Tiles mem requests -------------*/
620
0
    total_memtabs_used += ihevce_tiles_get_mem_recs(
621
198
        &ps_memtab[total_memtabs_used],
622
198
        ps_enc_ctxt->ps_stat_prms,
623
198
        &ps_enc_ctxt->s_frm_ctb_prms,
624
198
        i4_resolution_id,
625
198
        space_for_mem_in_enc_grp);
626
627
    /* ---------- Enc loop Mem requests --------- */
628
198
    total_memtabs_used += ihevce_enc_loop_get_mem_recs(
629
198
        &ps_memtab[total_memtabs_used],
630
198
        ps_enc_ctxt->ps_stat_prms,
631
198
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
632
198
        i4_num_bitrate_inst,
633
198
        i4_num_enc_loop_frm_pllel,
634
198
        space_for_mem_in_enc_grp,
635
198
        i4_resolution_id);
636
    /* ---------- ME Mem requests --------------- */
637
198
    total_memtabs_used += ihevce_me_get_mem_recs(
638
198
        &ps_memtab[total_memtabs_used],
639
198
        ps_enc_ctxt->ps_stat_prms,
640
198
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
641
198
        space_for_mem_in_enc_grp,
642
198
        i4_resolution_id,
643
198
        i4_num_me_frm_pllel);
644
645
    /* ---------- Coarse ME Mem requests --------------- */
646
198
    total_memtabs_used += ihevce_coarse_me_get_mem_recs(
647
198
        &ps_memtab[total_memtabs_used],
648
198
        ps_enc_ctxt->ps_stat_prms,
649
198
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
650
198
        space_for_mem_in_pre_enc_grp,
651
198
        i4_resolution_id);
652
    /* ---------- IPE Mem requests -------------- */
653
198
    total_memtabs_used += ihevce_ipe_get_mem_recs(
654
198
        &ps_memtab[total_memtabs_used],
655
198
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
656
198
        space_for_mem_in_pre_enc_grp);
657
    /* ---------- ECD Mem requests -------------- */
658
198
    i4_num_bitrate_inst = ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
659
198
                              .i4_num_bitrate_instances;
660
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
661
198
    {
662
198
        total_memtabs_used += ihevce_entropy_get_mem_recs(
663
198
            &ps_memtab[total_memtabs_used],
664
198
            ps_enc_ctxt->ps_stat_prms,
665
198
            space_for_mem_in_pre_enc_grp,
666
198
            i4_resolution_id);
667
198
    }
668
669
198
    if(0 == i4_resolution_id)
670
198
    {
671
        /* ---------- LAP Mem requests--------------- */
672
198
        total_memtabs_used +=
673
198
            ihevce_lap_get_mem_recs(&ps_memtab[total_memtabs_used], space_for_mem_in_pre_enc_grp);
674
198
    }
675
676
    /* -------- DECOMPOSITION PRE INTRA Mem requests-------- */
677
198
    total_memtabs_used += ihevce_decomp_pre_intra_get_mem_recs(
678
198
        &ps_memtab[total_memtabs_used],
679
198
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
680
198
        space_for_mem_in_pre_enc_grp);
681
682
    /* ---------- RC Mem requests --------------- */
683
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
684
198
    {
685
198
        total_memtabs_used += ihevce_rc_get_mem_recs(
686
198
            &ps_memtab[total_memtabs_used],
687
198
            ps_enc_ctxt->ps_stat_prms,
688
198
            space_for_mem_in_pre_enc_grp,
689
198
            &ps_enc_ctxt->ps_stat_prms->s_sys_api);
690
198
    }
691
692
    /* ---------- System Mem requests ----------- */
693
694
    /* allocate memory for pps tile */
695
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
696
697
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
698
699
198
    if(1 == ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_tiles_enabled_flag)
700
0
    {
701
0
        ps_memtab[total_memtabs_used].i4_mem_size =
702
0
            (ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_num_tile_cols *
703
0
             ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_num_tile_rows) *
704
0
            (sizeof(tile_t));
705
0
    }
706
198
    else
707
198
    {
708
198
        ps_memtab[total_memtabs_used].i4_mem_size = sizeof(tile_t);
709
198
    }
710
711
    /* increment the memtab counter */
712
198
    total_memtabs_used++;
713
198
    total_system_memtabs++;
714
715
    /* recon picture buffer pointer array */
716
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
717
198
    {
718
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
719
720
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
721
722
198
        ps_memtab[total_memtabs_used].i4_mem_size =
723
198
            (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * (sizeof(recon_pic_buf_t *));
724
725
        /* increment the memtab counter */
726
198
        total_memtabs_used++;
727
198
        total_system_memtabs++;
728
198
    }
729
730
    /* recon picture buffers structures */
731
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
732
198
    {
733
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
734
735
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
736
737
198
        ps_memtab[total_memtabs_used].i4_mem_size =
738
198
            (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * (sizeof(recon_pic_buf_t));
739
740
        /* increment the memtab counter */
741
198
        total_memtabs_used++;
742
198
        total_system_memtabs++;
743
198
    }
744
745
    /* reference/recon picture buffers */
746
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
747
198
    {
748
198
        WORD32 i4_chroma_buf_size_shift =
749
198
            -(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth <= 8) +
750
198
            (ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV);
751
752
198
        buf_size = ((num_ctb_horz * ctb_size) + (PAD_HORZ << 1));
753
198
        buf_size = buf_size * ((num_ctb_vert * ctb_size) + (PAD_VERT << 1));
754
198
        buf_size = buf_size * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS);
755
756
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
757
758
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
759
760
        /* If HBD, both 8bit and 16 bit luma buffers are required, whereas only 16bit chroma buffers are required */
761
198
        ps_memtab[total_memtabs_used].i4_mem_size =
762
            /* Luma */
763
198
            (buf_size * ((ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth > 8)
764
198
                             ? BUFFER_SIZE_MULTIPLIER_IF_HBD
765
198
                             : 1)) +
766
            /* Chroma */
767
198
            (SHL_NEG(buf_size, i4_chroma_buf_size_shift));
768
769
        /* increment the memtab counter */
770
198
        total_memtabs_used++;
771
198
        total_system_memtabs++;
772
198
    }
773
    /* reference/recon picture subpel planes */
774
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
775
776
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
777
778
198
    ps_memtab[total_memtabs_used].i4_mem_size =
779
198
        buf_size * (3 + L0ME_IN_OPENLOOP_MODE); /* 3 planes */
780
781
    /* increment the memtab counter */
782
198
    total_memtabs_used++;
783
198
    total_system_memtabs++;
784
    /* reference colocated MV bank */
785
    /* Keep memory for an extra CTB at the right and bottom of frame.
786
    This extra space is needed by dist-encoding and unused in non-dist-encoding */
787
198
    buf_size = (num_ctb_horz + 1) * (num_ctb_vert + 1) * num_pu_in_ctb;
788
198
    buf_size = buf_size * sizeof(pu_col_mv_t) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
789
198
               i4_num_bitrate_inst;
790
791
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
792
793
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
794
795
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
796
797
    /* increment the memtab counter */
798
198
    total_memtabs_used++;
799
198
    total_system_memtabs++;
800
801
    /* reference colocated MV bank map */
802
    /* Keep memory for an extra CTB at the right and bottom of frame.
803
    This extra space is needed by dist-encoding and unused in non-dist-encoding */
804
198
    buf_size = (num_ctb_horz + 1) * (num_ctb_vert + 1) * num_pu_in_ctb;
805
198
    buf_size = buf_size * sizeof(UWORD8) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
806
198
               i4_num_bitrate_inst;
807
808
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
809
810
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
811
812
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
813
814
    /* increment the memtab counter */
815
198
    total_memtabs_used++;
816
198
    total_system_memtabs++;
817
818
    /* reference collocated MV bank map offsets map */
819
198
    buf_size = num_ctb_horz * num_ctb_vert;
820
198
    buf_size = buf_size * sizeof(UWORD16) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
821
198
               i4_num_bitrate_inst;
822
823
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
824
825
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
826
827
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
828
829
    /* increment the memtab counter */
830
198
    total_memtabs_used++;
831
198
    total_system_memtabs++;
832
833
    /* reference colocated MV bank ctb offset */
834
198
    buf_size = num_ctb_horz;
835
198
    buf_size = buf_size * num_ctb_vert;
836
198
    buf_size = buf_size * sizeof(UWORD32) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
837
198
               i4_num_bitrate_inst;
838
839
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
840
841
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
842
843
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
844
845
    /* increment the memtab counter */
846
198
    total_memtabs_used++;
847
198
    total_system_memtabs++;
848
849
    /* recon picture buffer pointer array for pre enc group */
850
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
851
852
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
853
854
198
    ps_memtab[total_memtabs_used].i4_mem_size =
855
198
        (max_num_ref_pics + 1) * (sizeof(recon_pic_buf_t *));
856
857
    /* increment the memtab counter */
858
198
    total_memtabs_used++;
859
198
    total_system_memtabs++;
860
861
    /* recon picture buffers structures for pre enc group */
862
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
863
864
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
865
866
198
    ps_memtab[total_memtabs_used].i4_mem_size = (max_num_ref_pics + 1) * (sizeof(recon_pic_buf_t));
867
868
    /* increment the memtab counter */
869
198
    total_memtabs_used++;
870
198
    total_system_memtabs++;
871
198
    {
872
198
        num_input_buf_per_queue = ihevce_lap_get_num_ip_bufs(&ps_enc_ctxt->s_lap_stat_prms);
873
198
        {
874
198
            WORD32 i4_count_temp = 0, i4_last_queue_length;
875
876
            /*First allocate the memory for the buffer based on resolution*/
877
198
            WORD32 ctb_align_pic_wd = ps_enc_ctxt->s_runtime_tgt_params.i4_width +
878
198
                                      SET_CTB_ALIGN(
879
198
                                          ps_enc_ctxt->s_runtime_tgt_params.i4_width,
880
198
                                          ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size);
881
882
198
            WORD32 ctb_align_pic_ht = ps_enc_ctxt->s_runtime_tgt_params.i4_height +
883
198
                                      SET_CTB_ALIGN(
884
198
                                          ps_enc_ctxt->s_runtime_tgt_params.i4_height,
885
198
                                          ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size);
886
887
198
            i4_last_queue_length = (num_input_buf_per_queue % MAX_QUEUE);
888
889
198
            if((num_input_buf_per_queue % MAX_QUEUE) == 0)
890
0
                i4_last_queue_length = MAX_QUEUE;
891
892
198
            ps_enc_ctxt->i4_num_input_buf_per_queue = num_input_buf_per_queue;
893
198
            i4_yuv_min_size =
894
198
                (ctb_align_pic_wd * ctb_align_pic_ht) +
895
198
                ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
896
198
                     ? (ctb_align_pic_wd * ctb_align_pic_ht)
897
198
                     : ((ctb_align_pic_wd * ctb_align_pic_ht) >> 1));
898
198
            i4_luma_min_size = (ctb_align_pic_wd * ctb_align_pic_ht);
899
900
            /*Inorder to allocate memory for the large buffer sizes overflowing WORD32 we are splitting the memtabs using i4_total_hbd_queues and MAX_HBD_QUEUE*/
901
198
            i4_total_queues = num_input_buf_per_queue / MAX_QUEUE;
902
903
198
            if((num_input_buf_per_queue % MAX_QUEUE) != 0)
904
198
            {
905
198
                i4_total_queues++;
906
198
            }
907
908
198
            ASSERT(i4_total_queues < 5);
909
910
396
            for(i4_count_temp = 0; i4_count_temp < i4_total_queues; i4_count_temp++)
911
198
            {
912
198
                ps_memtab[total_memtabs_used].i4_mem_alignment = 32;
913
914
198
                ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
915
                /*Memory size for yuv buffer of one frame * num of input required to stored in the queue*/
916
198
                if((i4_count_temp < (i4_total_queues - 1)))
917
0
                    ps_memtab[total_memtabs_used].i4_mem_size = i4_yuv_min_size * MAX_QUEUE;
918
198
                else
919
198
                    ps_memtab[total_memtabs_used].i4_mem_size =
920
198
                        (i4_yuv_min_size)*i4_last_queue_length;
921
922
                /* increment the memtab counter */
923
198
                total_memtabs_used++;
924
198
                total_system_memtabs++;
925
198
            }
926
198
        }
927
        /*memory for input buffer structure*/
928
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
929
930
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
931
932
198
        ps_memtab[total_memtabs_used].i4_mem_size =
933
198
            (num_input_buf_per_queue) * (sizeof(ihevce_lap_enc_buf_t *));
934
935
        /* increment the memtab counter */
936
198
        total_memtabs_used++;
937
198
        total_system_memtabs++;
938
939
        /* frame process/entropy coding buffer structures */
940
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
941
942
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
943
944
198
        ps_memtab[total_memtabs_used].i4_mem_size =
945
198
            (num_input_buf_per_queue) * (sizeof(ihevce_lap_enc_buf_t));
946
        /* increment the memtab counter */
947
198
        total_memtabs_used++;
948
198
        total_system_memtabs++;
949
950
        /*input synch ctrl command*/
951
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
952
953
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
954
955
198
        ps_memtab[total_memtabs_used].i4_mem_size =
956
198
            (num_input_buf_per_queue) * (ENC_COMMAND_BUFF_SIZE);
957
958
198
        total_memtabs_used++;
959
198
        total_system_memtabs++;
960
198
    }
961
962
    /* Pre-encode/encode coding buffer pointer array */
963
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
964
965
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
966
967
198
    ps_memtab[total_memtabs_used].i4_mem_size =
968
198
        (num_bufs_preenc_me_que) * (sizeof(pre_enc_me_ctxt_t *));
969
970
    /* increment the memtab counter */
971
198
    total_memtabs_used++;
972
198
    total_system_memtabs++;
973
974
    /* frame process/entropy coding buffer structures */
975
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
976
977
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
978
979
198
    ps_memtab[total_memtabs_used].i4_mem_size =
980
198
        (num_bufs_preenc_me_que) * (sizeof(pre_enc_me_ctxt_t));
981
982
    /* increment the memtab counter */
983
198
    total_memtabs_used++;
984
198
    total_system_memtabs++;
985
986
    /* Pre-encode L0 IPE output to ME buffer pointer*/
987
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
988
989
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
990
991
198
    ps_memtab[total_memtabs_used].i4_mem_size =
992
198
        (num_bufs_L0_ipe_enc) * (sizeof(pre_enc_L0_ipe_encloop_ctxt_t *));
993
994
    /* increment the memtab counter */
995
198
    total_memtabs_used++;
996
198
    total_system_memtabs++;
997
998
    /* Pre-encode L0 IPE output to ME buffer */
999
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1000
1001
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1002
1003
198
    ps_memtab[total_memtabs_used].i4_mem_size =
1004
198
        (num_bufs_L0_ipe_enc) * (sizeof(pre_enc_L0_ipe_encloop_ctxt_t));
1005
1006
    /* increment the memtab counter */
1007
198
    total_memtabs_used++;
1008
198
    total_system_memtabs++;
1009
1010
    /* CTB analyse Frame level  */
1011
198
    buf_size = num_ctb_horz;
1012
198
    buf_size = buf_size * num_ctb_vert;
1013
198
    buf_size = buf_size * sizeof(ctb_analyse_t) * num_bufs_preenc_me_que;
1014
1015
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1016
1017
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1018
1019
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1020
1021
    /* increment the memtab counter */
1022
198
    total_memtabs_used++;
1023
198
    total_system_memtabs++;
1024
1025
    /* ME layer ctxt pointer */
1026
198
    buf_size = sizeof(layer_ctxt_t) * num_bufs_preenc_me_que;
1027
1028
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1029
1030
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1031
1032
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1033
1034
    /* increment the memtab counter */
1035
198
    total_memtabs_used++;
1036
198
    total_system_memtabs++;
1037
1038
    /* ME layer MV bank ctxt pointer */
1039
198
    buf_size = sizeof(layer_mv_t) * num_bufs_preenc_me_que;
1040
1041
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1042
1043
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1044
1045
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1046
1047
    /* increment the memtab counter */
1048
198
    total_memtabs_used++;
1049
198
    total_system_memtabs++;
1050
1051
    /* ME layer MV bank pointer */
1052
198
    buf_size = mv_bank_size * num_bufs_preenc_me_que;
1053
1054
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1055
1056
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1057
1058
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1059
1060
    /* increment the memtab counter */
1061
198
    total_memtabs_used++;
1062
198
    total_system_memtabs++;
1063
1064
    /* ME layer ref idx bank pointer */
1065
198
    buf_size = ref_idx_bank_size * num_bufs_preenc_me_que;
1066
1067
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1068
1069
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1070
1071
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1072
1073
    /* increment the memtab counter */
1074
198
    total_memtabs_used++;
1075
198
    total_system_memtabs++;
1076
    /* Frame level array to store 8x8 intra cost */
1077
198
    buf_size = (num_ctb_horz * ctb_size) >> 3;
1078
198
    buf_size *= ((num_ctb_vert * ctb_size) >> 3);
1079
198
    buf_size *= sizeof(double) * num_bufs_preenc_me_que;
1080
1081
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1082
1083
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1084
1085
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1086
1087
    /* increment the memtab counter */
1088
198
    total_memtabs_used++;
1089
198
    total_system_memtabs++;
1090
1091
    /* Frame level array to store ctb intra cost and modes */
1092
198
    buf_size = (num_ctb_horz * num_ctb_vert);
1093
198
    buf_size *= sizeof(ipe_l0_ctb_analyse_for_me_t) * num_bufs_L0_ipe_enc;
1094
1095
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1096
1097
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1098
1099
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1100
1101
    /* increment the memtab counter */
1102
198
    total_memtabs_used++;
1103
198
    total_system_memtabs++;
1104
1105
    /*
1106
    * Layer early decision buffer L1 buf.Since the pre intra analysis always
1107
    * expects memory for ihevce_ed_blk_t for complete ctbs, align the width and
1108
    * height in layer to mutiple of 32.
1109
    */
1110
198
    buf_size = (a_ctb_align_wd[1] >> 5) * (a_ctb_align_ht[1] >> 5) * sizeof(ihevce_ed_ctb_l1_t) *
1111
198
               num_bufs_preenc_me_que;
1112
1113
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1114
1115
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1116
1117
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1118
1119
    /* increment the memtab counter */
1120
198
    total_memtabs_used++;
1121
198
    total_system_memtabs++;
1122
1123
    /*
1124
    * Layer early decision buffer L1 buf.Since the pre intra analysis always
1125
    * expects memory for ihevce_ed_blk_t for complete ctbs, align the width and
1126
    * height in layer to mutiple of 32.
1127
    */
1128
198
    buf_size = (a_ctb_align_wd[1] >> 2) * (a_ctb_align_ht[1] >> 2) * sizeof(ihevce_ed_blk_t) *
1129
198
               num_bufs_preenc_me_que;
1130
1131
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1132
1133
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1134
1135
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1136
1137
    /* increment the memtab counter */
1138
198
    total_memtabs_used++;
1139
198
    total_system_memtabs++;
1140
1141
    /*
1142
    * Layer early decision buffer L2 buf.Since the pre intra analysis always
1143
    * expects memory for ihevce_ed_blk_t for complete ctbs, align the width and
1144
    * height in layer to mutiple of 16.
1145
    */
1146
198
    buf_size = (a_ctb_align_wd[2] >> 2) * (a_ctb_align_ht[2] >> 2) * sizeof(ihevce_ed_blk_t) *
1147
198
               num_bufs_preenc_me_que;
1148
1149
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1150
1151
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1152
1153
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1154
1155
    /* increment the memtab counter */
1156
198
    total_memtabs_used++;
1157
198
    total_system_memtabs++;
1158
1159
    /* following is the buffer requirement of
1160
    que between me and enc*/
1161
1162
    /* me/enc que buffer pointer array */
1163
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1164
1165
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1166
1167
198
    ps_memtab[total_memtabs_used].i4_mem_size = (NUM_ME_ENC_BUFS) * (sizeof(me_enc_rdopt_ctxt_t *));
1168
1169
    /* increment the memtab counter */
1170
198
    total_memtabs_used++;
1171
198
    total_system_memtabs++;
1172
1173
    /* fme/enc que buffer structures */
1174
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1175
1176
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1177
1178
198
    ps_memtab[total_memtabs_used].i4_mem_size = (NUM_ME_ENC_BUFS) * (sizeof(me_enc_rdopt_ctxt_t));
1179
1180
    /* increment the memtab counter */
1181
198
    total_memtabs_used++;
1182
198
    total_system_memtabs++;
1183
1184
    /* Job Queue related memory                            */
1185
    /* max num ctb rows is doubled to take care worst case */
1186
    /* requirements because of HME layers                  */
1187
198
    buf_size = (MAX_NUM_VERT_UNITS_FRM) * (NUM_ENC_JOBS_QUES)*NUM_ME_ENC_BUFS;  //PING_PONG_BUF;
1188
    /* In tile case, based on the number of column tiles,
1189
    we will have  separate jobQ per column tile        */
1190
198
    if(1 == ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_tiles_enabled_flag)
1191
0
    {
1192
0
        buf_size *= ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_num_tile_cols;
1193
0
    }
1194
198
    buf_size *= sizeof(job_queue_t);
1195
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1196
1197
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1198
1199
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1200
1201
    /* increment the memtab counter */
1202
198
    total_memtabs_used++;
1203
198
    total_system_memtabs++;
1204
1205
    /* cur_ctb_cu_tree_t Frame level  */
1206
198
    buf_size = num_ctb_horz * MAX_NUM_NODES_CU_TREE;
1207
198
    buf_size = buf_size * num_ctb_vert;
1208
1209
    /* ps_cu_analyse_inter buffer is used to popualte outputs form ME after using cu analyse form IPE */
1210
198
    buf_size = buf_size * sizeof(cur_ctb_cu_tree_t) * NUM_ME_ENC_BUFS;
1211
1212
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1213
1214
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1215
1216
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1217
1218
    /* increment the memtab counter */
1219
198
    total_memtabs_used++;
1220
198
    total_system_memtabs++;
1221
1222
    /* me_ctb_data_t Frame level  */
1223
198
    buf_size = num_ctb_horz * num_ctb_vert;
1224
1225
    /* This buffer is used to */
1226
198
    buf_size = buf_size * sizeof(me_ctb_data_t) * NUM_ME_ENC_BUFS;
1227
1228
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1229
1230
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1231
1232
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1233
1234
    /* increment the memtab counter */
1235
198
    total_memtabs_used++;
1236
198
    total_system_memtabs++;
1237
1238
    /* following is for each bit-rate */
1239
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
1240
198
    {
1241
        /* frame process/entropy coding buffer pointer array */
1242
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1243
1244
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1245
1246
198
        ps_memtab[total_memtabs_used].i4_mem_size =
1247
198
            (NUM_FRMPROC_ENTCOD_BUFS) * (sizeof(frm_proc_ent_cod_ctxt_t *));
1248
1249
        /* increment the memtab counter */
1250
198
        total_memtabs_used++;
1251
198
        total_system_memtabs++;
1252
1253
        /* frame process/entropy coding buffer structures */
1254
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1255
1256
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1257
1258
198
        ps_memtab[total_memtabs_used].i4_mem_size =
1259
198
            (NUM_FRMPROC_ENTCOD_BUFS) * (sizeof(frm_proc_ent_cod_ctxt_t));
1260
1261
        /* increment the memtab counter */
1262
198
        total_memtabs_used++;
1263
198
        total_system_memtabs++;
1264
1265
        /* CTB enc loop Frame level  */
1266
198
        buf_size = num_ctb_horz;
1267
198
        buf_size = buf_size * num_ctb_vert;
1268
198
        buf_size = buf_size * sizeof(ctb_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1269
1270
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1271
1272
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1273
1274
198
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1275
1276
        /* increment the memtab counter */
1277
198
        total_memtabs_used++;
1278
198
        total_system_memtabs++;
1279
1280
        /* CU enc loop Frame level  */
1281
198
        buf_size = num_ctb_horz * num_cu_in_ctb;
1282
198
        buf_size = buf_size * num_ctb_vert;
1283
198
        buf_size = buf_size * sizeof(cu_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1284
1285
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1286
1287
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1288
1289
198
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1290
1291
        /* increment the memtab counter */
1292
198
        total_memtabs_used++;
1293
198
        total_system_memtabs++;
1294
1295
        /* TU enc loop Frame level  */
1296
198
        buf_size = num_ctb_horz * num_tu_in_ctb;
1297
198
        buf_size = buf_size * num_ctb_vert;
1298
198
        buf_size = buf_size * sizeof(tu_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1299
1300
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1301
1302
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1303
1304
198
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1305
1306
        /* increment the memtab counter */
1307
198
        total_memtabs_used++;
1308
198
        total_system_memtabs++;
1309
1310
        /* PU enc loop Frame level  */
1311
198
        buf_size = num_ctb_horz * num_pu_in_ctb;
1312
198
        buf_size = buf_size * num_ctb_vert;
1313
198
        buf_size = buf_size * sizeof(pu_t) * NUM_FRMPROC_ENTCOD_BUFS;
1314
1315
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1316
1317
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1318
1319
198
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1320
1321
        /* increment the memtab counter */
1322
198
        total_memtabs_used++;
1323
198
        total_system_memtabs++;
1324
1325
        /* Coeffs Frame level  */
1326
198
        buf_size =
1327
198
            num_ctb_horz * ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
1328
198
                                ? (num_tu_in_ctb << 1)
1329
198
                                : ((num_tu_in_ctb * 3) >> 1));
1330
198
        buf_size = buf_size * num_ctb_vert;
1331
198
        buf_size = buf_size * sizeof(UWORD8) * MAX_SCAN_COEFFS_BYTES_4x4 * NUM_FRMPROC_ENTCOD_BUFS;
1332
1333
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1334
1335
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1336
1337
198
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1338
1339
        /* increment the memtab counter */
1340
198
        total_memtabs_used++;
1341
198
        total_system_memtabs++;
1342
1343
198
#ifndef DISABLE_SEI
1344
        /* SEI Payload Data */
1345
198
        buf_size = sizeof(UWORD8) * MAX_NUMBER_OF_SEI_PAYLOAD * MAX_SEI_PAYLOAD_PER_TLV *
1346
198
                   NUM_FRMPROC_ENTCOD_BUFS;
1347
1348
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1349
198
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1350
1351
198
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1352
1353
        /* increment the memtab counter */
1354
198
        total_memtabs_used++;
1355
198
        total_system_memtabs++;
1356
198
#endif
1357
198
    }
1358
1359
    /* ------ Working mem frame level -------*/
1360
198
    buf_size = ((num_ctb_horz * ctb_size) + 16);
1361
198
    buf_size *= ((num_ctb_vert * ctb_size) + 23);
1362
198
    buf_size *= sizeof(WORD16);
1363
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1364
1365
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1366
1367
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1368
1369
    /* increment the memtab counter */
1370
198
    total_memtabs_used++;
1371
198
    total_system_memtabs++;
1372
    /* Job Queue related memory                            */
1373
    /* max num ctb rows is doubled to take care worst case */
1374
    /* requirements because of HME layers                  */
1375
198
    buf_size = (MAX_NUM_VERT_UNITS_FRM) * (NUM_PRE_ENC_JOBS_QUES) * (max_delay_preenc_l0_que);
1376
198
    buf_size *= sizeof(job_queue_t);
1377
1378
198
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1379
1380
198
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1381
1382
198
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1383
1384
    /* increment the memtab counter */
1385
198
    total_memtabs_used++;
1386
198
    total_system_memtabs++;
1387
1388
    /* check on the system memtabs */
1389
198
    ASSERT(total_system_memtabs <= TOTAL_SYSTEM_MEM_RECS);
1390
1391
    /* -----Frameproc Entcod Que Mem requests --- */
1392
    /*  derive for each bit-rate */
1393
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
1394
198
    {
1395
198
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
1396
198
            &ps_memtab[total_memtabs_used], NUM_FRMPROC_ENTCOD_BUFS, space_for_mem_in_enc_grp);
1397
198
    }
1398
    /*mrs: Request memory for the input yuv queue*/
1399
198
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1400
198
        &ps_memtab[total_memtabs_used], num_input_buf_per_queue, space_for_mem_in_enc_grp);
1401
    /*------ The encoder owned input buffer queue*/
1402
    /* -----Pre-encode Encode Que Mem requests --- */
1403
198
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1404
198
        &ps_memtab[total_memtabs_used], num_bufs_preenc_me_que, space_for_mem_in_enc_grp);
1405
1406
    /* -----ME / Enc-RD opt Que Mem requests --- */
1407
198
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1408
198
        &ps_memtab[total_memtabs_used], NUM_ME_ENC_BUFS, space_for_mem_in_enc_grp);
1409
1410
    /* -----Pre-encode L0 IPE to enc Que Mem requests --- */
1411
198
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1412
198
        &ps_memtab[total_memtabs_used], num_bufs_L0_ipe_enc, space_for_mem_in_enc_grp);
1413
1414
    /* ---------- Dependency Manager allocations -------- */
1415
198
    {
1416
        /* --- ME-EncLoop Dep Mngr Row-Row Mem requests -- */
1417
396
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
1418
198
        {
1419
198
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1420
198
                &ps_memtab[total_memtabs_used],
1421
198
                DEP_MNGR_ROW_ROW_SYNC,
1422
198
                (a_ctb_align_ht[0] / ctb_size),
1423
198
                ps_enc_ctxt->ps_stat_prms->s_app_tile_params
1424
198
                    .i4_num_tile_cols, /* Number of Col Tiles */
1425
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1426
198
                space_for_mem_in_enc_grp);
1427
198
        }
1428
1429
396
        for(ctr = 0; ctr < i4_num_enc_loop_frm_pllel; ctr++)
1430
198
        {
1431
            /* --- Prev. frame EncLoop Done Dep Mngr Frm-Frm Mem requests -- */
1432
198
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1433
198
                &ps_memtab[total_memtabs_used],
1434
198
                DEP_MNGR_FRM_FRM_SYNC,
1435
198
                (a_ctb_align_ht[0] / ctb_size),
1436
198
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
1437
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1438
198
                space_for_mem_in_enc_grp);
1439
198
        }
1440
        /* --- Prev. frame EncLoop Done for re-encode Dep Mngr Frm-Frm Mem requests -- */
1441
198
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1442
198
            &ps_memtab[total_memtabs_used],
1443
198
            DEP_MNGR_FRM_FRM_SYNC,
1444
198
            (a_ctb_align_ht[0] / ctb_size),
1445
198
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1446
198
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1447
198
            space_for_mem_in_enc_grp);
1448
396
        for(ctr = 0; ctr < i4_num_me_frm_pllel; ctr++)
1449
198
        {
1450
            /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem requests -- */
1451
198
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1452
198
                &ps_memtab[total_memtabs_used],
1453
198
                DEP_MNGR_FRM_FRM_SYNC,
1454
198
                (a_ctb_align_ht[0] / ctb_size),
1455
198
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
1456
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1457
198
                space_for_mem_in_enc_grp);
1458
198
        }
1459
1460
        /* --- Prev. frame PreEnc L1 Done Dep Mngr Frm-Frm Mem requests -- */
1461
198
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1462
198
            &ps_memtab[total_memtabs_used],
1463
198
            DEP_MNGR_FRM_FRM_SYNC,
1464
198
            (a_ctb_align_ht[0] / ctb_size),
1465
198
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1466
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1467
198
            space_for_mem_in_enc_grp);
1468
1469
        /* --- Prev. frame PreEnc HME Done Dep Mngr Frm-Frm Mem requests -- */
1470
198
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1471
198
            &ps_memtab[total_memtabs_used],
1472
198
            DEP_MNGR_FRM_FRM_SYNC,
1473
198
            (a_ctb_align_ht[0] / ctb_size),
1474
198
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1475
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1476
198
            space_for_mem_in_enc_grp);
1477
1478
        /* --- Prev. frame PreEnc L0 Done Dep Mngr Frm-Frm Mem requests -- */
1479
198
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1480
198
            &ps_memtab[total_memtabs_used],
1481
198
            DEP_MNGR_FRM_FRM_SYNC,
1482
198
            (a_ctb_align_ht[0] / ctb_size),
1483
198
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1484
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1485
198
            space_for_mem_in_enc_grp);
1486
1487
        /* --- ME-Prev Recon Dep Mngr Row-Frm Mem requests -- */
1488
1.18k
        for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
1489
990
        {
1490
990
            WORD32 i4_num_units = num_ctb_horz * num_ctb_vert;
1491
1492
990
            total_memtabs_used += ihevce_dmgr_map_get_mem_recs(
1493
990
                &ps_memtab[total_memtabs_used],
1494
990
                i4_num_units,
1495
990
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1496
990
                space_for_mem_in_enc_grp);
1497
990
        }
1498
198
    }
1499
1500
    /* ----- allocate memory as per requests ---- */
1501
1502
    /* check on memtabs requested v/s memtabs used */
1503
    //ittiam : should put an assert
1504
1505
    //ASSERT(total_memtabs_used == total_memtabs_req);
1506
1507
174k
    for(ctr = 0; ctr < total_memtabs_used; ctr++)
1508
174k
    {
1509
174k
        UWORD8 *pu1_mem = NULL;
1510
174k
        ps_intrf_ctxt->ihevce_mem_alloc(
1511
174k
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->ps_stat_prms->s_sys_api, &ps_memtab[ctr]);
1512
1513
174k
        pu1_mem = (UWORD8 *)ps_memtab[ctr].pv_base;
1514
1515
174k
        if(NULL == pu1_mem)
1516
0
        {
1517
0
            ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
1518
0
            return;
1519
0
        }
1520
174k
    }
1521
1522
    /* --------------------------------------------------------------------- */
1523
    /* --------- Initialisation of Modules & System memory ----------------- */
1524
    /* --------------------------------------------------------------------- */
1525
1526
    /* store the final allocated memtabs */
1527
198
    ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs = total_memtabs_used;
1528
198
    ps_enc_ctxt->s_mem_mngr.ps_create_memtab = ps_memtab;
1529
1530
    /* ---------- Tiles Mem init --------- */
1531
198
    ps_enc_ctxt->ps_tile_params_base = (ihevce_tile_params_t *)ihevce_tiles_mem_init(
1532
198
        ps_memtab, ps_enc_ctxt->ps_stat_prms, ps_enc_ctxt, i4_resolution_id);
1533
1534
198
    ps_memtab += ihevce_tiles_get_num_mem_recs();
1535
1536
    /* ---------- Enc loop Mem init --------- */
1537
198
    ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt = ihevce_enc_loop_init(
1538
198
        ps_memtab,
1539
198
        ps_enc_ctxt->ps_stat_prms,
1540
198
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1541
198
        ps_intrf_ctxt->pv_osal_handle,
1542
198
        &ps_enc_ctxt->s_func_selector,
1543
198
        &ps_enc_ctxt->s_rc_quant,
1544
198
        ps_enc_ctxt->ps_tile_params_base,
1545
198
        i4_resolution_id,
1546
198
        i4_num_enc_loop_frm_pllel,
1547
198
        ps_enc_ctxt->u1_is_popcnt_available);
1548
1549
198
    ps_memtab += ihevce_enc_loop_get_num_mem_recs(i4_num_bitrate_inst, i4_num_enc_loop_frm_pllel);
1550
    /* ---------- ME Mem init --------------- */
1551
198
    ps_enc_ctxt->s_module_ctxt.pv_me_ctxt = ihevce_me_init(
1552
198
        ps_memtab,
1553
198
        ps_enc_ctxt->ps_stat_prms,
1554
198
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1555
198
        ps_intrf_ctxt->pv_osal_handle,
1556
198
        &ps_enc_ctxt->s_rc_quant,
1557
198
        (void *)ps_enc_ctxt->ps_tile_params_base,
1558
198
        i4_resolution_id,
1559
198
        i4_num_me_frm_pllel,
1560
198
        ps_enc_ctxt->u1_is_popcnt_available);
1561
1562
198
    ps_memtab += ihevce_me_get_num_mem_recs(i4_num_me_frm_pllel);
1563
1564
    /* ---------- Coarse ME Mem init --------------- */
1565
198
    ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt = ihevce_coarse_me_init(
1566
198
        ps_memtab,
1567
198
        ps_enc_ctxt->ps_stat_prms,
1568
198
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1569
198
        ps_intrf_ctxt->pv_osal_handle,
1570
198
        i4_resolution_id,
1571
198
        ps_enc_ctxt->u1_is_popcnt_available);
1572
1573
198
    ps_memtab += ihevce_coarse_me_get_num_mem_recs();
1574
    /* ---------- IPE Mem init -------------- */
1575
198
    ps_enc_ctxt->s_module_ctxt.pv_ipe_ctxt = ihevce_ipe_init(
1576
198
        ps_memtab,
1577
198
        ps_enc_ctxt->ps_stat_prms,
1578
198
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1579
198
        ps_enc_ctxt->i4_ref_mbr_id,
1580
198
        &ps_enc_ctxt->s_func_selector,
1581
198
        &ps_enc_ctxt->s_rc_quant,
1582
198
        i4_resolution_id,
1583
198
        ps_enc_ctxt->u1_is_popcnt_available);
1584
1585
198
    ps_memtab += ihevce_ipe_get_num_mem_recs();
1586
1587
198
    ps_enc_ctxt->s_rc_quant.i2_max_qp = 51;
1588
198
    ps_enc_ctxt->s_rc_quant.i2_min_qp = 0;
1589
198
    ps_enc_ctxt->s_rc_quant.i1_qp_offset = 0;
1590
198
    ps_enc_ctxt->s_rc_quant.i2_max_qscale =
1591
198
        228 << 3;  // Q3 format is mantained for accuarate calc at lower qp
1592
198
    ps_enc_ctxt->s_rc_quant.i2_min_qscale = 1;
1593
1594
    /* ---------- ECD Mem init -------------- */
1595
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
1596
198
    {
1597
198
        ps_enc_ctxt->s_module_ctxt.apv_ent_cod_ctxt[i] = ihevce_entropy_init(
1598
198
            ps_memtab,
1599
198
            ps_enc_ctxt->ps_stat_prms,
1600
198
            (void *)ps_enc_ctxt->ps_tile_params_base,
1601
198
            i4_resolution_id);
1602
1603
198
        ps_memtab += ihevce_entropy_get_num_mem_recs();
1604
198
    }
1605
1606
    /* ---------- LAP Mem init--------------- */
1607
198
    if(i4_resolution_id == 0)
1608
198
    {
1609
198
        ps_enc_ctxt->s_module_ctxt.pv_lap_ctxt =
1610
198
            ihevce_lap_init(ps_memtab, &ps_enc_ctxt->s_lap_stat_prms, ps_enc_ctxt->ps_stat_prms);
1611
1612
198
        ps_memtab += ihevce_lap_get_num_mem_recs();
1613
198
    }
1614
    /*-----------DECOMPOSITION PRE INTRA init----*/
1615
198
    ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt = ihevce_decomp_pre_intra_init(
1616
198
        ps_memtab,
1617
198
        ps_enc_ctxt->ps_stat_prms,
1618
198
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1619
198
        &ps_enc_ctxt->s_func_selector,
1620
198
        i4_resolution_id,
1621
198
        ps_enc_ctxt->u1_is_popcnt_available);
1622
1623
198
    ps_memtab += ihevce_decomp_pre_intra_get_num_mem_recs();
1624
1625
    /* ---------- RC Mem init --------------- */
1626
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
1627
198
    {
1628
        /*swaping of buf_id for 0th and reference bitrate location, as encoder
1629
        assumes always 0th loc for reference bitrate and app must receive in
1630
        the configured order*/
1631
198
        if(i == 0)
1632
198
        {
1633
198
            ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i] = ihevce_rc_mem_init(
1634
198
                ps_memtab,
1635
198
                ps_enc_ctxt->ps_stat_prms,
1636
198
                ps_enc_ctxt->i4_ref_mbr_id,
1637
198
                &ps_enc_ctxt->s_rc_quant,
1638
198
                ps_enc_ctxt->i4_resolution_id,
1639
198
                ps_enc_ctxt->i4_look_ahead_frames_in_first_pass);
1640
198
        }
1641
0
        else if(i == ps_enc_ctxt->i4_ref_mbr_id)
1642
0
        {
1643
0
            ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i] = ihevce_rc_mem_init(
1644
0
                ps_memtab,
1645
0
                ps_enc_ctxt->ps_stat_prms,
1646
0
                0,
1647
0
                &ps_enc_ctxt->s_rc_quant,
1648
0
                ps_enc_ctxt->i4_resolution_id,
1649
0
                ps_enc_ctxt->i4_look_ahead_frames_in_first_pass);
1650
0
        }
1651
0
        else
1652
0
        {
1653
0
            ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i] = ihevce_rc_mem_init(
1654
0
                ps_memtab,
1655
0
                ps_enc_ctxt->ps_stat_prms,
1656
0
                i,
1657
0
                &ps_enc_ctxt->s_rc_quant,
1658
0
                ps_enc_ctxt->i4_resolution_id,
1659
0
                ps_enc_ctxt->i4_look_ahead_frames_in_first_pass);
1660
0
        }
1661
198
        ps_memtab += ihevce_rc_get_num_mem_recs();
1662
198
    }
1663
1664
    /* ---------- System Mem init ----------- */
1665
198
    {
1666
198
        recon_pic_buf_t **pps_pic_bufs[IHEVCE_MAX_NUM_BITRATES];
1667
198
        recon_pic_buf_t *ps_pic_bufs[IHEVCE_MAX_NUM_BITRATES];
1668
198
        void *pv_recon_buf[IHEVCE_MAX_NUM_BITRATES];
1669
198
#if(SRC_PADDING_FOR_TRAQO || ENABLE_SSD_CALC_RC)
1670
198
        void *pv_recon_buf_source[IHEVCE_MAX_NUM_BITRATES] = { NULL };
1671
198
#endif
1672
198
        void *pv_uv_recon_buf[IHEVCE_MAX_NUM_BITRATES];
1673
198
        UWORD8 *pu1_subpel_buf;
1674
198
        pu_col_mv_t *ps_col_mv;
1675
198
        UWORD8 *pu1_col_mv_map;
1676
198
        UWORD16 *pu2_col_num_pu_map;
1677
198
        UWORD32 *pu4_col_mv_off;
1678
198
        WORD32 luma_frm_size;
1679
198
        WORD32 recon_stride; /* stride for Y and UV(interleave) */
1680
198
        WORD32 luma_frm_height; /* including padding    */
1681
198
        WORD32 num_pu_in_frm;
1682
1683
        /* pps tile memory */
1684
396
        for(i = 0; i < i4_num_bitrate_inst; i++)
1685
198
        {
1686
198
            ps_enc_ctxt->as_pps[i].ps_tile = (tile_t *)ps_memtab->pv_base;
1687
198
        }
1688
1689
198
        ps_memtab++; /* increment the memtabs */
1690
1691
        /* recon picture buffer pointer array */
1692
396
        for(i = 0; i < i4_num_bitrate_inst; i++)
1693
198
        {
1694
198
            pps_pic_bufs[i] = (recon_pic_buf_t **)ps_memtab->pv_base;
1695
198
            ps_memtab++; /* increment the memtabs */
1696
198
        }
1697
1698
        /* recon picture buffers structures */
1699
396
        for(i = 0; i < i4_num_bitrate_inst; i++)
1700
198
        {
1701
198
            ps_pic_bufs[i] = (recon_pic_buf_t *)ps_memtab->pv_base;
1702
198
            ps_memtab++; /* increment the memtabs */
1703
198
        }
1704
1705
        /* reference/recon picture buffers */
1706
396
        for(i = 0; i < i4_num_bitrate_inst; i++)
1707
198
        {
1708
198
            pv_recon_buf[i] = ps_memtab->pv_base;
1709
198
            ps_memtab++; /* increment the memtabs */
1710
198
        }
1711
        /* reference/recon picture subpel planes */
1712
198
        pu1_subpel_buf = (UWORD8 *)ps_memtab->pv_base;
1713
        /* increment the memtabs */
1714
198
        ps_memtab++;
1715
        /* reference colocated MV bank */
1716
198
        ps_col_mv = (pu_col_mv_t *)ps_memtab->pv_base;
1717
        /* increment the memtabs */
1718
198
        ps_memtab++;
1719
1720
        /* reference colocated MV bank map */
1721
198
        pu1_col_mv_map = (UWORD8 *)ps_memtab->pv_base;
1722
        /* increment the memtabs */
1723
198
        ps_memtab++;
1724
1725
        /* reference collocated MV bank map offsets map */
1726
198
        pu2_col_num_pu_map = (UWORD16 *)ps_memtab->pv_base;
1727
        /* increment the memtabs */
1728
198
        ps_memtab++;
1729
1730
        /* reference colocated MV bank ctb offset */
1731
198
        pu4_col_mv_off = (UWORD32 *)ps_memtab->pv_base;
1732
        /* increment the memtabs */
1733
198
        ps_memtab++;
1734
1735
        /* compute the stride and frame height after accounting for padding */
1736
198
        recon_stride = ((num_ctb_horz * ctb_size) + (PAD_HORZ << 1));
1737
198
        luma_frm_height = ((num_ctb_vert * ctb_size) + (PAD_VERT << 1));
1738
198
        luma_frm_size = recon_stride * luma_frm_height;
1739
        /* The subpel buffer is also incremented to take care of padding */
1740
        /* Both luma and subpel buffer use same stride                   */
1741
198
        pu1_subpel_buf += (recon_stride * PAD_VERT);
1742
198
        pu1_subpel_buf += PAD_HORZ;
1743
1744
        /* Keep memory for an extra CTB at the right and bottom of frame.
1745
        This extra space is needed by dist-encoding and unused in non-dist-encoding */
1746
198
        num_pu_in_frm = (num_ctb_horz + 1) * num_pu_in_ctb * (num_ctb_vert + 1);
1747
1748
396
        for(i = 0; i < i4_num_bitrate_inst; i++)
1749
198
        {
1750
198
            pv_uv_recon_buf[i] = pv_recon_buf[i];
1751
1752
            /* increment the recon buffer to take care of padding */
1753
198
            pv_recon_buf[i] = (UWORD8 *)pv_recon_buf[i] + (recon_stride * PAD_VERT) + PAD_HORZ;
1754
1755
            /* chroma buffer starts at the end of luma buffer */
1756
198
            pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + luma_frm_size;
1757
198
            if(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth == 8)
1758
198
            {
1759
                /* increment the chroma recon buffer to take care of padding    */
1760
                /* vert padding halved but horiz is same due to uv interleave   */
1761
198
                pv_uv_recon_buf[i] =
1762
198
                    (UWORD8 *)pv_uv_recon_buf[i] + (recon_stride * (PAD_VERT >> 1)) +
1763
198
                    ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
1764
198
                         ? (recon_stride * (PAD_VERT >> 1))
1765
198
                         : 0);
1766
198
                pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + PAD_HORZ;
1767
198
            }
1768
1769
            /* loop to initialise all the memories */
1770
            /* initialize recon buffers */
1771
            /* only YUV buffers are allocated for each bit-rate instnaces.
1772
            Subpel buffers and col buffers are made NULL for auxiliary bit-rate instances,
1773
            since ME and IPE happens only for reference bit-rate instnace */
1774
1.18k
            for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
1775
990
            {
1776
990
                pps_pic_bufs[i][ctr] =
1777
990
                    ps_pic_bufs[i];  //check the index of pps [i] should be first or last index?!!
1778
1779
990
                ps_pic_bufs[i]->s_yuv_buf_desc.i4_size = sizeof(iv_enc_yuv_buf_t);
1780
990
                ps_pic_bufs[i]->s_yuv_buf_desc.pv_y_buf = pv_recon_buf[i];
1781
990
                ps_pic_bufs[i]->s_yuv_buf_desc.pv_v_buf = NULL;
1782
990
                {
1783
990
                    ps_pic_bufs[i]->s_yuv_buf_desc.pv_u_buf = pv_uv_recon_buf[i];
1784
990
                }
1785
990
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[0] = ((i == 0) ? pu1_subpel_buf : NULL);
1786
990
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[1] =
1787
990
                    ((i == 0) ? (pu1_subpel_buf + luma_frm_size) : NULL);
1788
990
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[2] =
1789
990
                    ((i == 0) ? (pu1_subpel_buf + (luma_frm_size * 2)) : NULL);
1790
990
                ps_pic_bufs[i]->ps_frm_col_mv = ps_col_mv;
1791
990
                ps_pic_bufs[i]->pu1_frm_pu_map = pu1_col_mv_map;
1792
990
                ps_pic_bufs[i]->pu2_num_pu_map = pu2_col_num_pu_map;
1793
990
                ps_pic_bufs[i]->pu4_pu_off = pu4_col_mv_off;
1794
990
                ps_pic_bufs[i]->i4_is_free = 1;
1795
990
                ps_pic_bufs[i]->i4_poc = -1;
1796
990
                ps_pic_bufs[i]->i4_display_num = -1;
1797
990
                ps_pic_bufs[i]->i4_buf_id = ctr;
1798
1799
                /* frame level buff increments */
1800
990
                ps_col_mv += num_pu_in_frm;
1801
990
                pu1_col_mv_map += num_pu_in_frm;
1802
990
                pu2_col_num_pu_map += (num_ctb_horz * num_ctb_vert);
1803
990
                pu4_col_mv_off += (num_ctb_horz * num_ctb_vert);
1804
1805
990
                if(ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
1806
0
                {
1807
0
                    pv_recon_buf[i] = (UWORD8 *)pv_recon_buf[i] + (luma_frm_size << 1);
1808
0
                    pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + (luma_frm_size << 1);
1809
0
                }
1810
990
                else
1811
990
                {
1812
990
                    pv_recon_buf[i] = (UWORD8 *)pv_recon_buf[i] + ((3 * luma_frm_size) >> 1);
1813
990
                    pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + ((3 * luma_frm_size) >> 1);
1814
990
                }
1815
990
                pu1_subpel_buf += ((3 + L0ME_IN_OPENLOOP_MODE) * luma_frm_size); /* 3 planes */
1816
990
                ps_pic_bufs[i]++;
1817
990
            }  //ctr ends
1818
1819
            /* store the queue pointer and num buffs to context */
1820
198
            ps_enc_ctxt->pps_recon_buf_q[i] = pps_pic_bufs[i];
1821
198
            ps_enc_ctxt->ai4_num_buf_recon_q[i] = (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS);
1822
1823
198
        }  //bitrate ctr ends
1824
1825
198
    }  //end of system memory init
1826
1827
    /* Pre encode group recon buffer  containier NO Buffers will be allocated / used */
1828
198
    {
1829
198
        recon_pic_buf_t *ps_pic_bufs;
1830
1831
        /* recon picture buffer pointer array */
1832
198
        pps_pre_enc_pic_bufs = (recon_pic_buf_t **)ps_memtab->pv_base;
1833
        /* increment the memtabs */
1834
198
        ps_memtab++;
1835
1836
        /* recon picture buffers structures */
1837
198
        ps_pic_bufs = (recon_pic_buf_t *)ps_memtab->pv_base;
1838
        /* increment the memtabs */
1839
198
        ps_memtab++;
1840
1841
        /* loop to initialise all the memories */
1842
1.18k
        for(ctr = 0; ctr < (max_num_ref_pics + 1); ctr++)
1843
990
        {
1844
990
            pps_pre_enc_pic_bufs[ctr] = ps_pic_bufs;
1845
1846
990
            ps_pic_bufs->s_yuv_buf_desc.i4_size = sizeof(iv_enc_yuv_buf_t);
1847
990
            ps_pic_bufs->s_yuv_buf_desc.pv_y_buf = NULL;
1848
990
            ps_pic_bufs->s_yuv_buf_desc.pv_u_buf = NULL;
1849
990
            ps_pic_bufs->s_yuv_buf_desc.pv_v_buf = NULL;
1850
990
            ps_pic_bufs->apu1_y_sub_pel_planes[0] = NULL;
1851
990
            ps_pic_bufs->apu1_y_sub_pel_planes[1] = NULL;
1852
990
            ps_pic_bufs->apu1_y_sub_pel_planes[2] = NULL;
1853
990
            ps_pic_bufs->ps_frm_col_mv = NULL;
1854
990
            ps_pic_bufs->pu1_frm_pu_map = NULL;
1855
990
            ps_pic_bufs->pu2_num_pu_map = NULL;
1856
990
            ps_pic_bufs->pu4_pu_off = NULL;
1857
990
            ps_pic_bufs->i4_is_free = 1;
1858
990
            ps_pic_bufs->i4_poc = -1;
1859
990
            ps_pic_bufs->i4_buf_id = ctr;
1860
1861
            /* frame level buff increments */
1862
990
            ps_pic_bufs++;
1863
990
        }
1864
1865
        /* store the queue pointer and num buffs to context */
1866
198
        ps_enc_ctxt->pps_pre_enc_recon_buf_q = pps_pre_enc_pic_bufs;
1867
198
        ps_enc_ctxt->i4_pre_enc_num_buf_recon_q = (max_num_ref_pics + 1);
1868
198
    }
1869
1870
    /* Frame level buffers and Que between pre-encode & encode */
1871
198
    {
1872
198
        pre_enc_me_ctxt_t *ps_pre_enc_bufs;
1873
198
        pre_enc_L0_ipe_encloop_ctxt_t *ps_L0_ipe_enc_bufs;
1874
198
        ihevce_lap_enc_buf_t *ps_lap_enc_input_buf;
1875
198
        ctb_analyse_t *ps_ctb_analyse;
1876
198
        UWORD8 *pu1_me_lyr_ctxt;
1877
198
        UWORD8 *pu1_me_lyr_bank_ctxt;
1878
198
        UWORD8 *pu1_mv_bank;
1879
198
        UWORD8 *pu1_ref_idx_bank;
1880
198
        double *plf_intra_8x8_cost;
1881
198
        ipe_l0_ctb_analyse_for_me_t *ps_ipe_analyse_ctb;
1882
198
        ihevce_ed_ctb_l1_t *ps_ed_ctb_l1;
1883
198
        ihevce_ed_blk_t *ps_layer1_buf;
1884
198
        ihevce_ed_blk_t *ps_layer2_buf;
1885
198
        UWORD8 *pu1_lap_input_yuv_buf[4];
1886
198
        UWORD8 *pu1_input_synch_ctrl_cmd;
1887
198
        WORD32 i4_count = 0;
1888
        /*initialize the memory for input buffer*/
1889
198
        {
1890
396
            for(i4_count = 0; i4_count < i4_total_queues; i4_count++)
1891
198
            {
1892
198
                pu1_lap_input_yuv_buf[i4_count] = (UWORD8 *)ps_memtab->pv_base;
1893
                /* increment the memtabs */
1894
198
                ps_memtab++;
1895
198
            }
1896
198
            pps_lap_enc_input_bufs = (ihevce_lap_enc_buf_t **)ps_memtab->pv_base;
1897
            /* increment the memtabs */
1898
198
            ps_memtab++;
1899
1900
            /*memory for the input buffer structure*/
1901
198
            ps_lap_enc_input_buf = (ihevce_lap_enc_buf_t *)ps_memtab->pv_base;
1902
198
            ps_memtab++;
1903
1904
198
            pu1_input_synch_ctrl_cmd = (UWORD8 *)ps_memtab->pv_base;
1905
198
            ps_memtab++;
1906
198
        }
1907
        /* pre encode /encode coding buffer pointer array */
1908
198
        pps_pre_enc_bufs = (pre_enc_me_ctxt_t **)ps_memtab->pv_base;
1909
        /* increment the memtabs */
1910
198
        ps_memtab++;
1911
1912
        /* pre encode /encode buffer structure */
1913
198
        ps_pre_enc_bufs = (pre_enc_me_ctxt_t *)ps_memtab->pv_base;
1914
        /* increment the memtabs */
1915
198
        ps_memtab++;
1916
1917
        /*  Pre-encode L0 IPE output to ME buffer pointer */
1918
198
        pps_L0_ipe_enc_bufs = (pre_enc_L0_ipe_encloop_ctxt_t **)ps_memtab->pv_base;
1919
        /* increment the memtabs */
1920
198
        ps_memtab++;
1921
1922
        /* Pre-encode L0 IPE output to ME buffer */
1923
198
        ps_L0_ipe_enc_bufs = (pre_enc_L0_ipe_encloop_ctxt_t *)ps_memtab->pv_base;
1924
        /* increment the memtabs */
1925
198
        ps_memtab++;
1926
1927
        /* CTB analyse Frame level  */
1928
198
        ps_ctb_analyse = (ctb_analyse_t *)ps_memtab->pv_base;
1929
        /* increment the memtabs */
1930
198
        ps_memtab++;
1931
1932
        /* ME layer ctxt Frame level  */
1933
198
        pu1_me_lyr_ctxt = (UWORD8 *)ps_memtab->pv_base;
1934
        /* increment the memtabs */
1935
198
        ps_memtab++;
1936
1937
        /* ME layer bank ctxt Frame level  */
1938
198
        pu1_me_lyr_bank_ctxt = (UWORD8 *)ps_memtab->pv_base;
1939
        /* increment the memtabs */
1940
198
        ps_memtab++;
1941
1942
        /* ME layer MV bank Frame level  */
1943
198
        pu1_mv_bank = (UWORD8 *)ps_memtab->pv_base;
1944
        /* increment the memtabs */
1945
198
        ps_memtab++;
1946
1947
        /* ME layer ref idx bank Frame level  */
1948
198
        pu1_ref_idx_bank = (UWORD8 *)ps_memtab->pv_base;
1949
        /* increment the memtabs */
1950
198
        ps_memtab++;
1951
        /* 8x8 intra costs for entire frame */
1952
198
        plf_intra_8x8_cost = (double *)ps_memtab->pv_base;
1953
198
        ps_memtab++;
1954
1955
        /* ctb intra costs and modes for entire frame */
1956
198
        ps_ipe_analyse_ctb = (ipe_l0_ctb_analyse_for_me_t *)ps_memtab->pv_base;
1957
198
        ps_memtab++;
1958
1959
        /*Contains ctb level information at pre-intra stage */
1960
198
        ps_ed_ctb_l1 = (ihevce_ed_ctb_l1_t *)ps_memtab->pv_base;
1961
198
        ps_memtab++;
1962
1963
        /* Layer L1 buf */
1964
198
        ps_layer1_buf = (ihevce_ed_blk_t *)ps_memtab->pv_base;
1965
        /* increment the memtabs */
1966
198
        ps_memtab++;
1967
1968
        /* Layer2 buf */
1969
198
        ps_layer2_buf = (ihevce_ed_blk_t *)ps_memtab->pv_base;
1970
        /* increment the memtabs */
1971
198
        ps_memtab++;
1972
1973
        /* loop to initialise all the memories*/
1974
        /*mrs: assign individual input yuv frame pointers here*/
1975
1976
198
        i4_count = 0;
1977
        /* loop to initialise the buffer pointer */
1978
630
        for(ctr = 0; ctr < num_input_buf_per_queue; ctr++)
1979
432
        {
1980
432
            pps_lap_enc_input_bufs[ctr] = &ps_lap_enc_input_buf[ctr];
1981
1982
432
            pps_lap_enc_input_bufs[ctr]->s_input_buf.i4_size = sizeof(iv_input_data_ctrl_buffs_t);
1983
1984
432
            pps_lap_enc_input_bufs[ctr]->s_input_buf.pv_synch_ctrl_bufs = pu1_input_synch_ctrl_cmd;
1985
1986
432
            pps_lap_enc_input_bufs[ctr]->s_input_buf.s_input_buf.i4_size = sizeof(iv_yuv_buf_t);
1987
1988
432
            pu1_input_synch_ctrl_cmd += ENC_COMMAND_BUFF_SIZE;
1989
            /*pointer to i/p buf initialised to null in case of run time allocation*/
1990
1991
432
            {
1992
432
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_y_buf =
1993
432
                    pu1_lap_input_yuv_buf[i4_count];
1994
1995
432
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_u_buf =
1996
432
                    pu1_lap_input_yuv_buf[i4_count] + i4_luma_min_size;
1997
1998
432
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_v_buf =
1999
432
                    NULL; /*since yuv 420 format*/
2000
2001
432
                pu1_lap_input_yuv_buf[i4_count] += i4_yuv_min_size;
2002
2003
432
                if(((ctr + 1) % MAX_QUEUE) == 0)
2004
0
                    i4_count++;
2005
432
            }
2006
432
        }
2007
594
        for(ctr = 0; ctr < num_bufs_preenc_me_que; ctr++)
2008
396
        {
2009
396
            pps_pre_enc_bufs[ctr] = ps_pre_enc_bufs;
2010
2011
396
            ps_pre_enc_bufs->ps_ctb_analyse = ps_ctb_analyse;
2012
396
            ps_pre_enc_bufs->pv_me_lyr_ctxt = (void *)pu1_me_lyr_ctxt;
2013
396
            ps_pre_enc_bufs->pv_me_lyr_bnk_ctxt = (void *)pu1_me_lyr_bank_ctxt;
2014
396
            ps_pre_enc_bufs->pv_me_mv_bank = (void *)pu1_mv_bank;
2015
396
            ps_pre_enc_bufs->pv_me_ref_idx = (void *)pu1_ref_idx_bank;
2016
396
            ps_pre_enc_bufs->ps_layer1_buf = ps_layer1_buf;
2017
396
            ps_pre_enc_bufs->ps_layer2_buf = ps_layer2_buf;
2018
396
            ps_pre_enc_bufs->ps_ed_ctb_l1 = ps_ed_ctb_l1;
2019
396
            ps_pre_enc_bufs->plf_intra_8x8_cost = plf_intra_8x8_cost;
2020
2021
396
            ps_ctb_analyse += num_ctb_horz * num_ctb_vert;
2022
396
            pu1_me_lyr_ctxt += sizeof(layer_ctxt_t);
2023
396
            pu1_me_lyr_bank_ctxt += sizeof(layer_mv_t);
2024
396
            pu1_mv_bank += mv_bank_size;
2025
396
            pu1_ref_idx_bank += ref_idx_bank_size;
2026
396
            plf_intra_8x8_cost +=
2027
396
                (((num_ctb_horz * ctb_size) >> 3) * ((num_ctb_vert * ctb_size) >> 3));
2028
396
            ps_ed_ctb_l1 += (a_ctb_align_wd[1] >> 5) * (a_ctb_align_ht[1] >> 5);
2029
396
            ps_layer1_buf += (a_ctb_align_wd[1] >> 2) * (a_ctb_align_ht[1] >> 2);
2030
396
            ps_layer2_buf += (a_ctb_align_wd[2] >> 2) * (a_ctb_align_ht[2] >> 2);
2031
396
            ps_pre_enc_bufs++;
2032
396
        }
2033
2034
396
        for(ctr = 0; ctr < num_bufs_L0_ipe_enc; ctr++)
2035
198
        {
2036
198
            pps_L0_ipe_enc_bufs[ctr] = ps_L0_ipe_enc_bufs;
2037
198
            ps_L0_ipe_enc_bufs->ps_ipe_analyse_ctb = ps_ipe_analyse_ctb;
2038
198
            ps_ipe_analyse_ctb += num_ctb_horz * num_ctb_vert;
2039
198
            ps_L0_ipe_enc_bufs++;
2040
198
        }
2041
198
    }
2042
2043
    /* Frame level que between ME and Enc rd-opt */
2044
198
    {
2045
198
        me_enc_rdopt_ctxt_t *ps_me_enc_bufs;
2046
198
        job_queue_t *ps_job_q_enc;
2047
198
        me_ctb_data_t *ps_cur_ctb_me_data;
2048
198
        cur_ctb_cu_tree_t *ps_cur_ctb_cu_tree;
2049
2050
        /* pre encode /encode coding buffer pointer array */
2051
198
        pps_me_enc_bufs = (me_enc_rdopt_ctxt_t **)ps_memtab->pv_base;
2052
        /* increment the memtabs */
2053
198
        ps_memtab++;
2054
2055
        /* pre encode /encode buffer structure */
2056
198
        ps_me_enc_bufs = (me_enc_rdopt_ctxt_t *)ps_memtab->pv_base;
2057
        /* increment the memtabs */
2058
198
        ps_memtab++;
2059
2060
        /*me and enc job queue memory */
2061
198
        ps_job_q_enc = (job_queue_t *)ps_memtab->pv_base;
2062
        /* increment the memtabs */
2063
198
        ps_memtab++;
2064
2065
        /*ctb me data memory*/
2066
198
        ps_cur_ctb_cu_tree = (cur_ctb_cu_tree_t *)ps_memtab->pv_base;
2067
        /* increment the memtabs */
2068
198
        ps_memtab++;
2069
2070
        /*ctb me data memory*/
2071
198
        ps_cur_ctb_me_data = (me_ctb_data_t *)ps_memtab->pv_base;
2072
        /* increment the memtabs */
2073
198
        ps_memtab++;
2074
2075
        /* loop to initialise all the memories */
2076
396
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
2077
198
        {
2078
198
            pps_me_enc_bufs[ctr] = ps_me_enc_bufs;
2079
2080
198
            ps_me_enc_bufs->ps_job_q_enc = ps_job_q_enc;
2081
198
            ps_me_enc_bufs->ps_cur_ctb_cu_tree = ps_cur_ctb_cu_tree;
2082
198
            ps_me_enc_bufs->ps_cur_ctb_me_data = ps_cur_ctb_me_data;
2083
2084
198
            ps_job_q_enc += (MAX_NUM_VERT_UNITS_FRM * NUM_ENC_JOBS_QUES);
2085
            /* In tile case, based on the number of column tiles,
2086
            increment jobQ per column tile        */
2087
198
            if(1 == ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_tiles_enabled_flag)
2088
0
            {
2089
0
                WORD32 col_tile_ctr;
2090
0
                for(col_tile_ctr = 1;
2091
0
                    col_tile_ctr < ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_num_tile_cols;
2092
0
                    col_tile_ctr++)
2093
0
                {
2094
0
                    ps_job_q_enc += (MAX_NUM_VERT_UNITS_FRM * NUM_ENC_JOBS_QUES);
2095
0
                }
2096
0
            }
2097
2098
198
            ps_cur_ctb_cu_tree += (num_ctb_horz * MAX_NUM_NODES_CU_TREE * num_ctb_vert);
2099
198
            ps_cur_ctb_me_data += (num_ctb_horz * num_ctb_vert);
2100
2101
198
            ps_me_enc_bufs++;
2102
198
        }
2103
198
    }
2104
    /* Frame level Que between frame process & entropy */
2105
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
2106
198
    {
2107
198
        frm_proc_ent_cod_ctxt_t *ps_frmp_ent_bufs;
2108
198
        ctb_enc_loop_out_t *ps_ctb;
2109
198
        cu_enc_loop_out_t *ps_cu;
2110
198
        tu_enc_loop_out_t *ps_tu;
2111
198
        pu_t *ps_pu;
2112
198
        UWORD8 *pu1_coeffs;
2113
198
        WORD32 num_ctb_in_frm;
2114
198
        WORD32 coeff_size;
2115
2116
        /* frame process/entropy coding buffer pointer array */
2117
198
        pps_frm_proc_ent_cod_bufs[i] = (frm_proc_ent_cod_ctxt_t **)ps_memtab->pv_base;
2118
        /* increment the memtabs */
2119
198
        ps_memtab++;
2120
2121
        /* frame process/entropy coding buffer structure */
2122
198
        ps_frmp_ent_bufs = (frm_proc_ent_cod_ctxt_t *)ps_memtab->pv_base;
2123
        /* increment the memtabs */
2124
198
        ps_memtab++;
2125
2126
        /* CTB enc loop Frame level  */
2127
198
        ps_ctb = (ctb_enc_loop_out_t *)ps_memtab->pv_base;
2128
        /* increment the memtabs */
2129
198
        ps_memtab++;
2130
2131
        /* CU enc loop Frame level  */
2132
198
        ps_cu = (cu_enc_loop_out_t *)ps_memtab->pv_base;
2133
        /* increment the memtabs */
2134
198
        ps_memtab++;
2135
2136
        /* TU enc loop Frame level  */
2137
198
        ps_tu = (tu_enc_loop_out_t *)ps_memtab->pv_base;
2138
        /* increment the memtabs */
2139
198
        ps_memtab++;
2140
2141
        /* PU enc loop Frame level  */
2142
198
        ps_pu = (pu_t *)ps_memtab->pv_base;
2143
        /* increment the memtabs */
2144
198
        ps_memtab++;
2145
2146
        /* Coeffs Frame level  */
2147
198
        pu1_coeffs = (UWORD8 *)ps_memtab->pv_base;
2148
        /* increment the memtabs */
2149
198
        ps_memtab++;
2150
2151
198
#ifndef DISABLE_SEI
2152
        /* CC User Data  */
2153
198
        UWORD8 *pu1_sei_payload;
2154
198
        pu1_sei_payload = (UWORD8 *)ps_memtab->pv_base;
2155
198
        ps_memtab++;
2156
198
#endif
2157
2158
198
        num_ctb_in_frm = num_ctb_horz * num_ctb_vert;
2159
2160
        /* calculate the coeff size */
2161
198
        coeff_size =
2162
198
            num_ctb_horz * ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
2163
198
                                ? (num_tu_in_ctb << 1)
2164
198
                                : ((num_tu_in_ctb * 3) >> 1));
2165
198
        coeff_size = coeff_size * num_ctb_vert * MAX_SCAN_COEFFS_BYTES_4x4;
2166
        /* loop to initialise all the memories */
2167
396
        for(ctr = 0; ctr < NUM_FRMPROC_ENTCOD_BUFS; ctr++)
2168
198
        {
2169
198
            pps_frm_proc_ent_cod_bufs[i][ctr] = ps_frmp_ent_bufs;
2170
2171
198
            ps_frmp_ent_bufs->ps_frm_ctb_data = ps_ctb;
2172
198
            ps_frmp_ent_bufs->ps_frm_cu_data = ps_cu;
2173
198
            ps_frmp_ent_bufs->ps_frm_pu_data = ps_pu;
2174
198
            ps_frmp_ent_bufs->ps_frm_tu_data = ps_tu;
2175
198
            ps_frmp_ent_bufs->pv_coeff_data = pu1_coeffs;
2176
2177
            /* memset the slice headers and buffer to keep track */
2178
198
            memset(&ps_frmp_ent_bufs->s_slice_hdr, 0, sizeof(slice_header_t));
2179
2180
            /*PIC_INFO*/
2181
198
            memset(&ps_frmp_ent_bufs->s_pic_level_info, 0, sizeof(s_pic_level_acc_info_t));
2182
2183
198
            ps_ctb += num_ctb_in_frm;
2184
198
            ps_cu += num_ctb_in_frm * num_cu_in_ctb;
2185
198
            ps_pu += num_ctb_in_frm * num_pu_in_ctb;
2186
198
            ps_tu += num_ctb_in_frm * num_tu_in_ctb;
2187
2188
198
            pu1_coeffs += coeff_size;
2189
2190
198
#ifndef DISABLE_SEI
2191
2.17k
            for(WORD32 num_sei = 0; num_sei < MAX_NUMBER_OF_SEI_PAYLOAD; num_sei++)
2192
1.98k
            {
2193
1.98k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].pu1_sei_payload = pu1_sei_payload;
2194
1.98k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].u4_payload_type = 0;
2195
1.98k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].u4_payload_length = 0;
2196
1.98k
                pu1_sei_payload += MAX_SEI_PAYLOAD_PER_TLV;
2197
1.98k
            }
2198
2199
198
#endif
2200
198
            ps_frmp_ent_bufs++;
2201
198
        }
2202
198
    }
2203
2204
    /* Working memory for encoder */
2205
198
    ps_enc_ctxt->pu1_frm_lvl_wkg_mem = (UWORD8 *)ps_memtab->pv_base;
2206
198
    ps_memtab++;
2207
2208
    /* Job Que memory */
2209
    /* Job que memory distribution is as follows                                                 _______
2210
    enc_group_ping -> MAX_NUM_VERT_UNITS_FRM for all the passes (NUM_ENC_JOBS_QUES)------------>|_______|
2211
    enc_group_pong -> MAX_NUM_VERT_UNITS_FRM for all the passes (NUM_ENC_JOBS_QUES)------------>|_______|
2212
    pre_enc_group_ping -> MAX_NUM_VERT_UNITS_FRM for all the passes (NUM_PRE_ENC_JOBS_QUES)---->|_______|
2213
    pre_enc_group_ping -> MAX_NUM_VERT_UNITS_FRM for all the passes (NUM_PRE_ENC_JOBS_QUES)---->|_______|
2214
    */
2215
2216
198
    ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[0] = (job_queue_t *)ps_memtab->pv_base;
2217
396
    for(ctr = 1; ctr < max_delay_preenc_l0_que; ctr++)
2218
198
    {
2219
198
        ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[ctr] =
2220
198
            ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[0] +
2221
198
            (MAX_NUM_VERT_UNITS_FRM * NUM_PRE_ENC_JOBS_QUES * ctr);
2222
198
    }
2223
198
    ps_memtab++;
2224
2225
    /* -----Frameproc Entcod Que mem_init --- */
2226
    /* init ptrs for each bit-rate */
2227
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
2228
198
    {
2229
198
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_FRM_PRS_ENT_COD_Q + i] = ihevce_buff_que_init(
2230
198
            ps_memtab, NUM_FRMPROC_ENTCOD_BUFS, (void **)pps_frm_proc_ent_cod_bufs[i]);
2231
198
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2232
198
    }
2233
    /*mrs*/
2234
    /* ----Encoder owned input buffer queue init----*/
2235
198
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_ENC_INPUT_Q] =
2236
198
        ihevce_buff_que_init(ps_memtab, num_input_buf_per_queue, (void **)pps_lap_enc_input_bufs);
2237
198
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2238
2239
    /* -----Pre-Encode / Encode Que mem_init --- */
2240
198
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_PRE_ENC_ME_Q] =
2241
198
        ihevce_buff_que_init(ps_memtab, num_bufs_preenc_me_que, (void **)pps_pre_enc_bufs);
2242
2243
198
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2244
2245
    /* -----ME / Enc-RD opt Que mem_init --- */
2246
198
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_ME_ENC_RDOPT_Q] =
2247
198
        ihevce_buff_que_init(ps_memtab, NUM_ME_ENC_BUFS, (void **)pps_me_enc_bufs);
2248
2249
198
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2250
2251
    /* -----Pre-Encode L0 IPE to enc queue --- */
2252
198
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_L0_IPE_ENC_Q] =
2253
198
        ihevce_buff_que_init(ps_memtab, num_bufs_L0_ipe_enc, (void **)pps_L0_ipe_enc_bufs);
2254
2255
198
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2256
2257
    /* ---------- Dependency Manager allocations -------- */
2258
198
    {
2259
198
        osal_sem_attr_t attr = OSAL_DEFAULT_SEM_ATTR;
2260
198
        WORD32 i1_is_sem_enabled;
2261
2262
198
        if(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
2263
198
               .i4_quality_preset >= IHEVCE_QUALITY_P4)
2264
43
        {
2265
43
            i1_is_sem_enabled = 0;
2266
43
        }
2267
155
        else
2268
155
        {
2269
155
            i1_is_sem_enabled = 1;
2270
155
        }
2271
2272
        /* allocate semaphores for all the threads in pre-enc and enc */
2273
396
        for(ctr = 0; ctr < ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds; ctr++)
2274
198
        {
2275
198
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle[ctr] =
2276
198
                osal_sem_create(ps_intrf_ctxt->pv_osal_handle, &attr);
2277
198
            if(NULL == ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle[ctr])
2278
0
            {
2279
0
                ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
2280
0
                return;
2281
0
            }
2282
198
        }
2283
2284
396
        for(ctr = 0; ctr < ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds; ctr++)
2285
198
        {
2286
198
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle[ctr] =
2287
198
                osal_sem_create(ps_intrf_ctxt->pv_osal_handle, &attr);
2288
198
            if(NULL == ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle[ctr])
2289
0
            {
2290
0
                ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
2291
0
                return;
2292
0
            }
2293
198
        }
2294
2295
        /* --- ME-EncLoop Dep Mngr Row-Row Init -- */
2296
396
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
2297
198
        {
2298
198
            me_enc_rdopt_ctxt_t *ps_me_enc_bufs = pps_me_enc_bufs[ctr];
2299
2300
198
            ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me = ihevce_dmgr_init(
2301
198
                ps_memtab,
2302
198
                ps_intrf_ctxt->pv_osal_handle,
2303
198
                DEP_MNGR_ROW_ROW_SYNC,
2304
198
                (a_ctb_align_ht[0] / ctb_size),
2305
198
                (a_ctb_align_wd[0] / ctb_size),
2306
198
                ps_enc_ctxt->ps_tile_params_base->i4_num_tile_cols, /* Number of Col Tiles */
2307
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2308
198
                i1_is_sem_enabled /*Sem Disabled/Enabled*/
2309
198
            );
2310
198
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2311
2312
            /* Register Enc group semaphore handles */
2313
198
            ihevce_dmgr_reg_sem_hdls(
2314
198
                ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me,
2315
198
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2316
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2317
2318
            /* Register the handle in multithread ctxt also for free purpose */
2319
198
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_encloop_dep_me[ctr] =
2320
198
                ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me;
2321
198
        }
2322
2323
396
        for(ctr = 0; ctr < i4_num_enc_loop_frm_pllel; ctr++)
2324
198
        {
2325
            /* --- Prev. frame EncLoop Done Dep Mngr Frm-Frm Mem Init -- */
2326
198
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_done[ctr] = ihevce_dmgr_init(
2327
198
                ps_memtab,
2328
198
                ps_intrf_ctxt->pv_osal_handle,
2329
198
                DEP_MNGR_FRM_FRM_SYNC,
2330
198
                (a_ctb_align_ht[0] / ctb_size),
2331
198
                (a_ctb_align_wd[0] / ctb_size),
2332
198
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
2333
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2334
198
                1 /*Sem Enabled*/
2335
198
            );
2336
198
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2337
2338
            /* Register Enc group semaphore handles */
2339
198
            ihevce_dmgr_reg_sem_hdls(
2340
198
                ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_done[ctr],
2341
198
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2342
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2343
198
        }
2344
        /* --- Prev. frame EncLoop Done Dep Mngr  for re-encode  Frm-Frm Mem Init -- */
2345
198
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_enc_done_for_reenc = ihevce_dmgr_init(
2346
198
            ps_memtab,
2347
198
            ps_intrf_ctxt->pv_osal_handle,
2348
198
            DEP_MNGR_FRM_FRM_SYNC,
2349
198
            (a_ctb_align_ht[0] / ctb_size),
2350
198
            (a_ctb_align_wd[0] / ctb_size),
2351
198
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2352
198
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2353
198
            1 /*Sem Enabled*/
2354
198
        );
2355
198
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2356
2357
        /* Register Enc group semaphore handles */
2358
198
        ihevce_dmgr_reg_sem_hdls(
2359
198
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_enc_done_for_reenc,
2360
198
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2361
198
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2362
396
        for(ctr = 0; ctr < i4_num_me_frm_pllel; ctr++)
2363
198
        {
2364
            /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem Init -- */
2365
198
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_me_done[ctr] = ihevce_dmgr_init(
2366
198
                ps_memtab,
2367
198
                ps_intrf_ctxt->pv_osal_handle,
2368
198
                DEP_MNGR_FRM_FRM_SYNC,
2369
198
                (a_ctb_align_ht[0] / ctb_size),
2370
198
                (a_ctb_align_wd[0] / ctb_size),
2371
198
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
2372
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2373
198
                1 /*Sem Enabled*/
2374
198
            );
2375
198
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2376
2377
            /* Register Enc group semaphore handles */
2378
198
            ihevce_dmgr_reg_sem_hdls(
2379
198
                ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_me_done[ctr],
2380
198
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2381
198
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2382
198
        }
2383
        /* --- Prev. frame PreEnc L1 Done Dep Mngr Frm-Frm Mem Init -- */
2384
198
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l1 = ihevce_dmgr_init(
2385
198
            ps_memtab,
2386
198
            ps_intrf_ctxt->pv_osal_handle,
2387
198
            DEP_MNGR_FRM_FRM_SYNC,
2388
198
            (a_ctb_align_ht[0] / ctb_size),
2389
198
            (a_ctb_align_wd[0] / ctb_size),
2390
198
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2391
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2392
198
            1 /*Sem Enabled*/
2393
198
        );
2394
198
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2395
2396
        /* Register Pre-Enc group semaphore handles */
2397
198
        ihevce_dmgr_reg_sem_hdls(
2398
198
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l1,
2399
198
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2400
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2401
2402
        /* --- Prev. frame PreEnc HME Done Dep Mngr Frm-Frm Mem Init -- */
2403
198
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_coarse_me = ihevce_dmgr_init(
2404
198
            ps_memtab,
2405
198
            ps_intrf_ctxt->pv_osal_handle,
2406
198
            DEP_MNGR_FRM_FRM_SYNC,
2407
198
            (a_ctb_align_ht[0] / ctb_size),
2408
198
            (a_ctb_align_wd[0] / ctb_size),
2409
198
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2410
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2411
198
            1 /*Sem Enabled*/
2412
198
        );
2413
198
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2414
2415
        /* Register Pre-Enc group semaphore handles */
2416
198
        ihevce_dmgr_reg_sem_hdls(
2417
198
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_coarse_me,
2418
198
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2419
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2420
2421
        /* --- Prev. frame PreEnc L0 Done Dep Mngr Frm-Frm Mem Init -- */
2422
198
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l0 = ihevce_dmgr_init(
2423
198
            ps_memtab,
2424
198
            ps_intrf_ctxt->pv_osal_handle,
2425
198
            DEP_MNGR_FRM_FRM_SYNC,
2426
198
            (a_ctb_align_ht[0] / ctb_size),
2427
198
            (a_ctb_align_wd[0] / ctb_size),
2428
198
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2429
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2430
198
            1 /*Sem Enabled*/
2431
198
        );
2432
198
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2433
2434
        /* Register Pre-Enc group semaphore handles */
2435
198
        ihevce_dmgr_reg_sem_hdls(
2436
198
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l0,
2437
198
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2438
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2439
2440
        /* --- ME-Prev Recon Dep Mngr Row-Frm Mem init -- */
2441
1.18k
        for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
2442
990
        {
2443
990
            WORD32 ai4_tile_xtra_ctb[4] = { 0 };
2444
2445
990
            ps_enc_ctxt->pps_recon_buf_q[0][ctr]->pv_dep_mngr_recon = ihevce_dmgr_map_init(
2446
990
                ps_memtab,
2447
990
                num_ctb_vert,
2448
990
                num_ctb_horz,
2449
990
                i1_is_sem_enabled, /*Sem Disabled/Enabled*/
2450
990
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2451
990
                ai4_tile_xtra_ctb);
2452
2453
990
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2454
2455
            /* Register Enc group semaphore handles */
2456
990
            ihevce_dmgr_reg_sem_hdls(
2457
990
                ps_enc_ctxt->pps_recon_buf_q[0][ctr]->pv_dep_mngr_recon,
2458
990
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2459
990
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2460
990
        }
2461
2462
        /* ------ Module level register semaphores -------- */
2463
198
        ihevce_coarse_me_reg_thrds_sem(
2464
198
            ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
2465
198
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2466
198
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2467
2468
198
        ihevce_enc_loop_reg_sem_hdls(
2469
198
            ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt,
2470
198
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2471
198
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2472
198
    }
2473
2474
    /* copy the run time source parameters from create time prms */
2475
0
    memcpy(
2476
198
        &ps_enc_ctxt->s_runtime_src_prms,
2477
198
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
2478
198
        sizeof(ihevce_src_params_t));
2479
2480
198
    memcpy(
2481
198
        &ps_enc_ctxt->s_runtime_tgt_params,
2482
198
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
2483
198
        sizeof(ihevce_tgt_params_t));
2484
2485
    /* copy the run time coding parameters from create time prms */
2486
198
    memcpy(
2487
198
        &ps_enc_ctxt->s_runtime_coding_prms,
2488
198
        &ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms,
2489
198
        sizeof(ihevce_coding_params_t));
2490
2491
    /*change in run time parameter*/
2492
198
    if(ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
2493
198
    {
2494
198
        ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames = (DEFAULT_MAX_REFERENCE_PICS)
2495
198
                                                                     << i4_field_pic;
2496
2497
198
        ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
2498
198
            ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
2499
198
    }
2500
2501
    /* populate the frame level ctb parameters based on run time params */
2502
198
    ihevce_set_pre_enc_prms(ps_enc_ctxt);
2503
2504
198
    return;
2505
198
}
2506
2507
/*!
2508
******************************************************************************
2509
* \if Function name : ihevce_mem_manager_que_init \endif
2510
*
2511
* \brief
2512
*    Encoder Que memory init function
2513
*
2514
* \param[in] Encoder context pointer
2515
* \param[in] High level Encoder context pointer
2516
* \param[in] Buffer descriptors
2517
*
2518
* \return
2519
*    None
2520
*
2521
* \author
2522
*  Ittiam
2523
*
2524
*****************************************************************************
2525
*/
2526
void ihevce_mem_manager_que_init(
2527
    enc_ctxt_t *ps_enc_ctxt,
2528
    ihevce_hle_ctxt_t *ps_hle_ctxt,
2529
    iv_input_data_ctrl_buffs_desc_t *ps_input_data_ctrl_buffs_desc,
2530
    iv_input_asynch_ctrl_buffs_desc_t *ps_input_asynch_ctrl_buffs_desc,
2531
    iv_output_data_buffs_desc_t *ps_output_data_buffs_desc,
2532
    iv_recon_data_buffs_desc_t *ps_recon_data_buffs_desc)
2533
198
{
2534
    /* local variables */
2535
198
    WORD32 total_memtabs_req = 0;
2536
198
    WORD32 total_memtabs_used = 0;
2537
198
    WORD32 ctr;
2538
198
    iv_mem_rec_t *ps_memtab;
2539
198
    WORD32 i;  //counter variable
2540
198
    iv_output_data_buffs_desc_t *ps_out_desc;
2541
198
    iv_recon_data_buffs_desc_t *ps_rec_desc;
2542
198
    WORD32 i4_num_bitrate_inst;  //number of bit-rate instance
2543
    /* storing 0th instance's pointer. This will be used for assigning buffer queue handles for input/output queues */
2544
198
    enc_ctxt_t *ps_enc_ctxt_base = (enc_ctxt_t *)ps_hle_ctxt->apv_enc_hdl[0];
2545
2546
198
    i4_num_bitrate_inst = ps_enc_ctxt->i4_num_bitrates;
2547
    //ps_hle_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[0].i4_num_bitrate_instances;
2548
2549
    /* --------------------------------------------------------------------- */
2550
    /* --------------  Collating the number of memtabs required ------------ */
2551
    /* --------------------------------------------------------------------- */
2552
2553
    /* ------ Input Data Que Memtab -------- */
2554
198
    if(0 == ps_enc_ctxt->i4_resolution_id)
2555
198
    {
2556
        /* array of pointers for input */
2557
198
        total_memtabs_req++;
2558
2559
        /* pointers for input desc */
2560
198
        total_memtabs_req++;
2561
2562
        /* que manager buffer requirements */
2563
198
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2564
2565
        /* ------ Input Control Que memtab ----- */
2566
        /* array of pointers for input control */
2567
198
        total_memtabs_req++;
2568
2569
        /* pointers for input control desc */
2570
198
        total_memtabs_req++;
2571
2572
        /* que manager buffer requirements */
2573
198
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2574
198
    }
2575
2576
    /* ------ Output Data Que Memtab -------- */
2577
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
2578
198
    {
2579
        /* array of pointers for output */
2580
198
        total_memtabs_req++;
2581
2582
        /* pointers for output desc */
2583
198
        total_memtabs_req++;
2584
2585
        /* que manager buffer requirements */
2586
198
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2587
198
    }
2588
2589
    /* ------ Recon Data Que Memtab -------- */
2590
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
2591
198
    {
2592
198
        if(ps_hle_ctxt->ps_static_cfg_prms->i4_save_recon)
2593
0
        {
2594
            /* array of pointers for input */
2595
0
            total_memtabs_req++;
2596
2597
            /* pointers for input desc */
2598
0
            total_memtabs_req++;
2599
2600
            /* que manager buffer requirements */
2601
0
            total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2602
0
        }
2603
198
    }
2604
2605
    /* ----- allocate memomry for memtabs --- */
2606
198
    {
2607
198
        iv_mem_rec_t s_memtab;
2608
2609
198
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
2610
198
        s_memtab.i4_mem_size = total_memtabs_req * sizeof(iv_mem_rec_t);
2611
198
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2612
198
        s_memtab.i4_mem_alignment = 4;
2613
2614
198
        ps_hle_ctxt->ihevce_mem_alloc(
2615
198
            ps_hle_ctxt->pv_mem_mgr_hdl, &ps_hle_ctxt->ps_static_cfg_prms->s_sys_api, &s_memtab);
2616
198
        if(s_memtab.pv_base == NULL)
2617
0
        {
2618
0
            ps_hle_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
2619
0
            return;
2620
0
        }
2621
198
        ps_memtab = (iv_mem_rec_t *)s_memtab.pv_base;
2622
198
    }
2623
2624
    /* --------------------------------------------------------------------- */
2625
    /* ------------------  Collating memory requirements ------------------- */
2626
    /* --------------------------------------------------------------------- */
2627
198
    if(0 == ps_enc_ctxt->i4_resolution_id)
2628
198
    {
2629
        /* ------ Input Data Que memory requests -------- */
2630
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2631
2632
198
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2633
2634
198
        ps_memtab[total_memtabs_used].i4_mem_size =
2635
198
            ((ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs) * (sizeof(ihevce_lap_enc_buf_t *)));
2636
2637
        /* increment the memtab counter */
2638
198
        total_memtabs_used++;
2639
2640
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2641
2642
198
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2643
2644
198
        ps_memtab[total_memtabs_used].i4_mem_size =
2645
198
            ((ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs) * (sizeof(ihevce_lap_enc_buf_t)));
2646
2647
        /* increment the memtab counter */
2648
198
        total_memtabs_used++;
2649
2650
        /* call the Que manager get mem recs */
2651
198
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2652
198
            &ps_memtab[total_memtabs_used],
2653
198
            ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs,
2654
198
            IV_EXT_CACHEABLE_NORMAL_MEM);
2655
2656
        /* ------ Input Control Que memory requests -------- */
2657
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2658
2659
198
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2660
2661
198
        ps_memtab[total_memtabs_used].i4_mem_size =
2662
198
            ((ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs) *
2663
198
             (sizeof(iv_input_ctrl_buffs_t *)));
2664
2665
        /* increment the memtab counter */
2666
198
        total_memtabs_used++;
2667
2668
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2669
2670
198
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2671
2672
198
        ps_memtab[total_memtabs_used].i4_mem_size =
2673
198
            ((ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs) *
2674
198
             (sizeof(iv_input_ctrl_buffs_t)));
2675
2676
        /* increment the memtab counter */
2677
198
        total_memtabs_used++;
2678
2679
        /* call the Que manager get mem recs */
2680
198
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2681
198
            &ps_memtab[total_memtabs_used],
2682
198
            ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs,
2683
198
            IV_EXT_CACHEABLE_NORMAL_MEM);
2684
198
    }
2685
2686
    /* ------ Output data Que memory requests -------- */
2687
198
    ps_out_desc = ps_output_data_buffs_desc;
2688
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
2689
198
    {
2690
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2691
2692
198
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2693
2694
198
        ps_memtab[total_memtabs_used].i4_mem_size =
2695
198
            ((ps_out_desc->i4_num_bitstream_bufs) * (sizeof(iv_output_data_buffs_t *)));
2696
2697
        /* increment the memtab counter */
2698
198
        total_memtabs_used++;
2699
2700
198
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2701
2702
198
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2703
2704
198
        ps_memtab[total_memtabs_used].i4_mem_size =
2705
198
            ((ps_out_desc->i4_num_bitstream_bufs) * (sizeof(iv_output_data_buffs_t)));
2706
2707
        /* increment the memtab counter */
2708
198
        total_memtabs_used++;
2709
2710
        /* call the Que manager get mem recs */
2711
198
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2712
198
            &ps_memtab[total_memtabs_used],
2713
198
            ps_out_desc->i4_num_bitstream_bufs,
2714
198
            IV_EXT_CACHEABLE_NORMAL_MEM);
2715
198
        ps_out_desc++;
2716
198
    }
2717
2718
    //recon_dump
2719
    /* ------ Recon Data Que memory requests -------- */
2720
198
    ps_rec_desc = ps_recon_data_buffs_desc;
2721
198
    if(ps_hle_ctxt->ps_static_cfg_prms->i4_save_recon)
2722
0
    {
2723
0
        for(i = 0; i < i4_num_bitrate_inst; i++)
2724
0
        {
2725
0
            ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2726
2727
0
            ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2728
2729
0
            ps_memtab[total_memtabs_used].i4_mem_size =
2730
0
                ((ps_rec_desc->i4_num_recon_bufs) * (sizeof(iv_enc_recon_data_buffs_t *)));
2731
2732
            /* increment the memtab counter */
2733
0
            total_memtabs_used++;
2734
2735
0
            ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2736
2737
0
            ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2738
2739
0
            ps_memtab[total_memtabs_used].i4_mem_size =
2740
0
                ((ps_rec_desc->i4_num_recon_bufs) * (sizeof(iv_enc_recon_data_buffs_t)));
2741
2742
            /* increment the memtab counter */
2743
0
            total_memtabs_used++;
2744
2745
            /* call the Que manager get mem recs */
2746
0
            total_memtabs_used += ihevce_buff_que_get_mem_recs(
2747
0
                &ps_memtab[total_memtabs_used],
2748
0
                ps_rec_desc->i4_num_recon_bufs,
2749
0
                IV_EXT_CACHEABLE_NORMAL_MEM);
2750
2751
0
            ps_rec_desc++;
2752
0
        }
2753
0
    }
2754
2755
    /* ----- allocate memory as per requests ---- */
2756
2757
    /* check on memtabs requested v/s memtabs used */
2758
    //ittiam : should put an assert
2759
198
    ASSERT(total_memtabs_req == total_memtabs_used);
2760
4.35k
    for(ctr = 0; ctr < total_memtabs_used; ctr++)
2761
4.15k
    {
2762
4.15k
        UWORD8 *pu1_mem = NULL;
2763
4.15k
        ps_hle_ctxt->ihevce_mem_alloc(
2764
4.15k
            ps_hle_ctxt->pv_mem_mgr_hdl,
2765
4.15k
            &ps_hle_ctxt->ps_static_cfg_prms->s_sys_api,
2766
4.15k
            &ps_memtab[ctr]);
2767
2768
4.15k
        pu1_mem = (UWORD8 *)ps_memtab[ctr].pv_base;
2769
2770
4.15k
        if(NULL == pu1_mem)
2771
0
        {
2772
0
            ps_hle_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
2773
0
            return;
2774
0
        }
2775
4.15k
    }
2776
2777
    /* store the final allocated memtabs */
2778
198
    ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs = total_memtabs_used;
2779
198
    ps_enc_ctxt->s_mem_mngr.ps_q_memtab = ps_memtab;
2780
2781
    /* --------------------------------------------------------------------- */
2782
    /* -------------- Initialisation of Queues memory ---------------------- */
2783
    /* --------------------------------------------------------------------- */
2784
2785
    /* ---------- Input Data Que Mem init --------------- */
2786
198
    if(0 == ps_enc_ctxt->i4_resolution_id)
2787
198
    {
2788
198
        ihevce_lap_enc_buf_t **pps_inp_bufs;
2789
198
        ihevce_lap_enc_buf_t *ps_inp_bufs;
2790
2791
198
        pps_inp_bufs = (ihevce_lap_enc_buf_t **)ps_memtab->pv_base;
2792
198
        ps_memtab++;
2793
2794
198
        ps_inp_bufs = (ihevce_lap_enc_buf_t *)ps_memtab->pv_base;
2795
198
        ps_memtab++;
2796
2797
        /* loop to initialise the buffer pointer */
2798
630
        for(ctr = 0; ctr < ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs; ctr++)
2799
432
        {
2800
432
            pps_inp_bufs[ctr] = &ps_inp_bufs[ctr];
2801
2802
432
            pps_inp_bufs[ctr]->s_input_buf.i4_size = sizeof(iv_input_data_ctrl_buffs_t);
2803
2804
432
            pps_inp_bufs[ctr]->s_input_buf.s_input_buf.i4_size = sizeof(iv_yuv_buf_t);
2805
2806
            /*pointer to i/p buf initialised to null in case of run time allocation*/
2807
432
            if(ps_hle_ctxt->i4_create_time_input_allocation == 1)
2808
432
            {
2809
432
                pps_inp_bufs[ctr]->s_input_buf.pv_synch_ctrl_bufs =
2810
432
                    ps_input_data_ctrl_buffs_desc->ppv_synch_ctrl_bufs[ctr];
2811
2812
432
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_y_buf =
2813
432
                    ps_input_data_ctrl_buffs_desc->ppv_y_buf[ctr];
2814
2815
432
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_u_buf =
2816
432
                    ps_input_data_ctrl_buffs_desc->ppv_u_buf[ctr];
2817
2818
432
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_v_buf =
2819
432
                    ps_input_data_ctrl_buffs_desc->ppv_v_buf[ctr];
2820
432
            }
2821
0
            else
2822
0
            {
2823
0
                pps_inp_bufs[ctr]->s_input_buf.pv_synch_ctrl_bufs = NULL;
2824
2825
0
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_y_buf = NULL;
2826
2827
0
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_u_buf = NULL;
2828
2829
0
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_v_buf = NULL;
2830
0
            }
2831
432
        }
2832
2833
        /* Get the input data buffer Q handle */
2834
198
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_DATA_CTRL_Q] = ihevce_buff_que_init(
2835
198
            ps_memtab, ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs, (void **)pps_inp_bufs);
2836
2837
        /* increment the memtab pointer */
2838
198
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2839
198
    }
2840
0
    else
2841
0
    {
2842
        /* Get the input data buffer Q handle from 0th instance */
2843
0
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_DATA_CTRL_Q] =
2844
0
            ps_enc_ctxt_base->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_DATA_CTRL_Q];
2845
0
    }
2846
2847
    /* ---------- Input control Que Mem init --------------- */
2848
198
    if(0 == ps_enc_ctxt->i4_resolution_id)
2849
198
    {
2850
198
        iv_input_ctrl_buffs_t **pps_inp_bufs;
2851
198
        iv_input_ctrl_buffs_t *ps_inp_bufs;
2852
2853
198
        pps_inp_bufs = (iv_input_ctrl_buffs_t **)ps_memtab->pv_base;
2854
198
        ps_memtab++;
2855
2856
198
        ps_inp_bufs = (iv_input_ctrl_buffs_t *)ps_memtab->pv_base;
2857
198
        ps_memtab++;
2858
2859
        /* loop to initialise the buffer pointer */
2860
990
        for(ctr = 0; ctr < ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs; ctr++)
2861
792
        {
2862
792
            pps_inp_bufs[ctr] = &ps_inp_bufs[ctr];
2863
2864
792
            pps_inp_bufs[ctr]->i4_size = sizeof(iv_input_ctrl_buffs_t);
2865
2866
792
            pps_inp_bufs[ctr]->pv_asynch_ctrl_bufs =
2867
792
                ps_input_asynch_ctrl_buffs_desc->ppv_asynch_ctrl_bufs[ctr];
2868
792
        }
2869
2870
        /* Get the input control buffer Q handle */
2871
198
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_ASYNCH_CTRL_Q] = ihevce_buff_que_init(
2872
198
            ps_memtab,
2873
198
            ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs,
2874
198
            (void **)pps_inp_bufs);
2875
2876
        /* increment the memtab pointer */
2877
198
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2878
198
    }
2879
0
    else
2880
0
    {
2881
        /* Get the input control buffer Q handle from 0th instance */
2882
0
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_ASYNCH_CTRL_Q] =
2883
0
            ps_enc_ctxt_base->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_ASYNCH_CTRL_Q];
2884
0
    }
2885
2886
    /* ---------- Output data Que Mem init --------------- */
2887
198
    ps_out_desc = ps_output_data_buffs_desc;
2888
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
2889
198
    {
2890
198
        iv_output_data_buffs_t **pps_out_bufs;
2891
198
        iv_output_data_buffs_t *ps_out_bufs;
2892
2893
198
        pps_out_bufs = (iv_output_data_buffs_t **)ps_memtab->pv_base;
2894
198
        ps_memtab++;
2895
2896
198
        ps_out_bufs = (iv_output_data_buffs_t *)ps_memtab->pv_base;
2897
198
        ps_memtab++;
2898
2899
        /* loop to initialise the buffer pointer */
2900
990
        for(ctr = 0; ctr < ps_out_desc->i4_num_bitstream_bufs; ctr++)
2901
792
        {
2902
792
            pps_out_bufs[ctr] = &ps_out_bufs[ctr];
2903
2904
792
            pps_out_bufs[ctr]->i4_size = sizeof(iv_output_data_buffs_t);
2905
2906
792
            pps_out_bufs[ctr]->i4_bitstream_buf_size = ps_out_desc->i4_size_bitstream_buf;
2907
2908
            /*pointer to o/p buf initialised to null in case of run time allocation*/
2909
792
            if(ps_hle_ctxt->i4_create_time_output_allocation == 1)
2910
0
            {
2911
0
                pps_out_bufs[ctr]->pv_bitstream_bufs = ps_out_desc->ppv_bitstream_bufs[ctr];
2912
0
            }
2913
792
            else
2914
792
            {
2915
792
                pps_out_bufs[ctr]->pv_bitstream_bufs = NULL;
2916
792
            }
2917
792
        }
2918
2919
        /* Get the output data buffer Q handle */
2920
198
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_OUTPUT_DATA_Q + i] = ihevce_buff_que_init(
2921
198
            ps_memtab, ps_out_desc->i4_num_bitstream_bufs, (void **)pps_out_bufs);
2922
2923
        /* increment the memtab pointer */
2924
198
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2925
2926
198
        ps_out_desc++;
2927
198
    }
2928
2929
    /* ----------Recon data Que Mem init --------------- */
2930
198
    ps_rec_desc = ps_recon_data_buffs_desc;
2931
396
    for(i = 0; i < i4_num_bitrate_inst; i++)
2932
198
    {
2933
198
        if(ps_hle_ctxt->ps_static_cfg_prms->i4_save_recon)
2934
0
        {
2935
0
            iv_enc_recon_data_buffs_t **pps_recon_bufs;
2936
0
            iv_enc_recon_data_buffs_t *ps_recon_bufs;
2937
2938
0
            pps_recon_bufs = (iv_enc_recon_data_buffs_t **)ps_memtab->pv_base;
2939
0
            ps_memtab++;
2940
2941
0
            ps_recon_bufs = (iv_enc_recon_data_buffs_t *)ps_memtab->pv_base;
2942
0
            ps_memtab++;
2943
2944
            /* loop to initialise the buffer pointer */
2945
0
            for(ctr = 0; ctr < ps_rec_desc->i4_num_recon_bufs; ctr++)
2946
0
            {
2947
0
                pps_recon_bufs[ctr] = &ps_recon_bufs[ctr];
2948
2949
0
                pps_recon_bufs[ctr]->i4_size = sizeof(iv_enc_recon_data_buffs_t);
2950
2951
0
                pps_recon_bufs[ctr]->pv_y_buf = ps_rec_desc->ppv_y_buf[ctr];
2952
2953
0
                pps_recon_bufs[ctr]->pv_cb_buf = ps_rec_desc->ppv_u_buf[ctr];
2954
2955
0
                pps_recon_bufs[ctr]->pv_cr_buf = ps_rec_desc->ppv_v_buf[ctr];
2956
0
            }
2957
2958
            /* Get the output data buffer Q handle */
2959
0
            ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_RECON_DATA_Q + i] = ihevce_buff_que_init(
2960
0
                ps_memtab, ps_rec_desc->i4_num_recon_bufs, (void **)pps_recon_bufs);
2961
2962
            /* increment the memtab pointer */
2963
0
            ps_memtab += ihevce_buff_que_get_num_mem_recs();
2964
2965
0
            ps_rec_desc++;
2966
0
        }
2967
198
        else
2968
198
        {
2969
198
            ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_RECON_DATA_Q + i] = NULL;
2970
198
        }
2971
198
    }
2972
2973
198
    return;
2974
198
}
2975
2976
/*!
2977
******************************************************************************
2978
* \if Function name : ihevce_mem_manager_free \endif
2979
*
2980
* \brief
2981
*    Encoder memory free function
2982
*
2983
* \param[in] Processing interface context pointer
2984
*
2985
* \return
2986
*    None
2987
*
2988
* \author
2989
*  Ittiam
2990
*
2991
*****************************************************************************
2992
*/
2993
void ihevce_mem_manager_free(enc_ctxt_t *ps_enc_ctxt, ihevce_hle_ctxt_t *ps_intrf_ctxt)
2994
198
{
2995
198
    WORD32 ctr;
2996
2997
    /* run a loop to free all the memory allocated create time */
2998
174k
    for(ctr = 0; ctr < ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs; ctr++)
2999
174k
    {
3000
174k
        ps_intrf_ctxt->ihevce_mem_free(
3001
174k
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->s_mem_mngr.ps_create_memtab[ctr]);
3002
174k
    }
3003
3004
    /* free the memtab memory */
3005
198
    {
3006
198
        iv_mem_rec_t s_memtab;
3007
3008
198
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
3009
198
        s_memtab.i4_mem_size = ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs * sizeof(iv_mem_rec_t);
3010
198
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
3011
198
        s_memtab.i4_mem_alignment = 4;
3012
198
        s_memtab.pv_base = (void *)ps_enc_ctxt->s_mem_mngr.ps_create_memtab;
3013
3014
198
        ps_intrf_ctxt->ihevce_mem_free(ps_intrf_ctxt->pv_mem_mgr_hdl, &s_memtab);
3015
198
    }
3016
3017
198
    if(1 == ps_enc_ctxt->i4_io_queues_created)
3018
198
    {
3019
        /* run a loop to free all the memory allocated durign que creation */
3020
4.35k
        for(ctr = 0; ctr < ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs; ctr++)
3021
4.15k
        {
3022
4.15k
            ps_intrf_ctxt->ihevce_mem_free(
3023
4.15k
                ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->s_mem_mngr.ps_q_memtab[ctr]);
3024
4.15k
        }
3025
3026
        /* free the  memtab memory */
3027
198
        {
3028
198
            iv_mem_rec_t s_memtab;
3029
3030
198
            s_memtab.i4_size = sizeof(iv_mem_rec_t);
3031
198
            s_memtab.i4_mem_size = ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs * sizeof(iv_mem_rec_t);
3032
198
            s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
3033
198
            s_memtab.i4_mem_alignment = 4;
3034
198
            s_memtab.pv_base = (void *)ps_enc_ctxt->s_mem_mngr.ps_q_memtab;
3035
3036
198
            ps_intrf_ctxt->ihevce_mem_free(ps_intrf_ctxt->pv_mem_mgr_hdl, &s_memtab);
3037
198
        }
3038
198
    }
3039
198
    return;
3040
198
}