Coverage Report

Created: 2026-04-12 06:57

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.36k
#define MAX_QUEUE 40
159
void ihevce_mem_manager_init(enc_ctxt_t *ps_enc_ctxt, ihevce_hle_ctxt_t *ps_intrf_ctxt)
160
221
{
161
    /* local variables */
162
221
    WORD32 total_memtabs_req = 0;
163
221
    WORD32 total_memtabs_used = 0;
164
221
    WORD32 total_system_memtabs = 0;
165
221
    WORD32 ctr;
166
221
    WORD32 buf_size;
167
221
    WORD32 num_ctb_horz;
168
221
    WORD32 num_ctb_vert;
169
221
    WORD32 num_cu_in_ctb;
170
221
    WORD32 num_pu_in_ctb;
171
221
    WORD32 num_tu_in_ctb;
172
221
    WORD32 ctb_size;
173
221
    WORD32 min_cu_size;
174
221
    WORD32 max_num_ref_pics;
175
221
    WORD32 mem_alloc_ctrl_flag;
176
221
    WORD32 space_for_mem_in_enc_grp = 0;
177
221
    WORD32 space_for_mem_in_pre_enc_grp = 0;
178
221
    WORD32 mv_bank_size;
179
221
    WORD32 ref_idx_bank_size;
180
221
    WORD32 a_wd[MAX_NUM_HME_LAYERS], a_ht[MAX_NUM_HME_LAYERS];
181
221
    WORD32 a_disp_wd[MAX_NUM_HME_LAYERS], a_disp_ht[MAX_NUM_HME_LAYERS];
182
221
    WORD32 a_ctb_align_wd[MAX_NUM_HME_LAYERS], a_ctb_align_ht[MAX_NUM_HME_LAYERS];
183
221
    WORD32 n_enc_layers = 1, n_tot_layers;
184
221
    WORD32 num_bufs_preenc_me_que, num_bufs_L0_ipe_enc, max_delay_preenc_l0_que;
185
221
    WORD32 i, i4_resolution_id = ps_enc_ctxt->i4_resolution_id;  //counter
186
221
    WORD32 i4_num_bitrate_inst;
187
221
    iv_mem_rec_t *ps_memtab;
188
221
    WORD32 i4_field_pic, i4_total_queues = 0;
189
190
221
    recon_pic_buf_t **pps_pre_enc_pic_bufs;
191
221
    frm_proc_ent_cod_ctxt_t **pps_frm_proc_ent_cod_bufs[IHEVCE_MAX_NUM_BITRATES];
192
221
    pre_enc_me_ctxt_t **pps_pre_enc_bufs;
193
221
    me_enc_rdopt_ctxt_t **pps_me_enc_bufs;
194
221
    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
221
    ihevce_lap_enc_buf_t **pps_lap_enc_input_bufs;
197
221
    WORD32 i4_num_enc_loop_frm_pllel;
198
221
    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
221
    WORD32 num_input_buf_per_queue, i4_yuv_min_size, i4_luma_min_size;
202
203
221
    i4_num_bitrate_inst = ps_enc_ctxt->i4_num_bitrates;
204
221
    i4_field_pic = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_field_pic;
205
221
    ps_intrf_ctxt->i4_gpu_mem_size = 0;
206
207
    /*Initialize the thrd id flag and all deafult values for sub pic rc */
208
221
    {
209
221
        WORD32 i, j, k;
210
211
442
        for(i = 0; i < MAX_NUM_ENC_LOOP_PARALLEL; i++)
212
221
        {
213
442
            for(j = 0; j < IHEVCE_MAX_NUM_BITRATES; j++)
214
221
            {
215
221
                ps_enc_ctxt->s_multi_thrd.ai4_acc_ctb_ctr[i][j] = 0;
216
221
                ps_enc_ctxt->s_multi_thrd.ai4_ctb_ctr[i][j] = 0;
217
218
221
                ps_enc_ctxt->s_multi_thrd.ai4_threshold_reached[i][j] = 0;
219
220
221
                ps_enc_ctxt->s_multi_thrd.ai4_curr_qp_acc[i][j] = 0;
221
222
221
                ps_enc_ctxt->s_multi_thrd.af_acc_hdr_bits_scale_err[i][j] = 0;
223
224
1.98k
                for(k = 0; k < MAX_NUM_FRM_PROC_THRDS_ENC; k++)
225
1.76k
                {
226
1.76k
                    ps_enc_ctxt->s_multi_thrd.ai4_thrd_id_valid_flag[i][j][k] = -1;
227
1.76k
                }
228
221
            }
229
221
        }
230
221
    }
231
232
221
#define ENABLE_FRM_PARALLEL
233
221
#ifdef ENABLE_FRM_PARALLEL
234
221
    i4_num_enc_loop_frm_pllel = MAX_NUM_ENC_LOOP_PARALLEL;
235
221
    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
221
    ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel = i4_num_enc_loop_frm_pllel;
242
221
    ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc = i4_num_enc_loop_frm_pllel;
243
221
    ps_enc_ctxt->s_multi_thrd.i4_num_me_frm_pllel = i4_num_me_frm_pllel;
244
221
    ps_enc_ctxt->s_multi_thrd.i4_force_end_flag = 0;
245
246
221
    ps_enc_ctxt->i4_ref_mbr_id = 0;
247
    /* get the ctb size from max cu size */
248
221
    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
221
    min_cu_size = ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_min_log2_cu_size;
252
253
    /* convert to actual width */
254
221
    ctb_size = 1 << ctb_size;
255
221
    min_cu_size = 1 << min_cu_size;
256
257
    /* Get the width and heights of different decomp layers */
258
221
    *a_wd =
259
221
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
260
221
            .i4_width +
261
221
        SET_CTB_ALIGN(
262
221
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
263
221
                .i4_width,
264
221
            min_cu_size);
265
221
    *a_ht =
266
221
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
267
221
            .i4_height +
268
221
        SET_CTB_ALIGN(
269
221
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
270
221
                .i4_height,
271
221
            min_cu_size);
272
273
221
    n_tot_layers = hme_derive_num_layers(n_enc_layers, a_wd, a_ht, a_disp_wd, a_disp_ht);
274
221
    hme_coarse_get_layer1_mv_bank_ref_idx_size(
275
221
        n_tot_layers,
276
221
        a_wd,
277
221
        a_ht,
278
221
        ((ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
279
221
             ? ((DEFAULT_MAX_REFERENCE_PICS) << i4_field_pic)
280
221
             : ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames),
281
221
        (S32 *)(&mv_bank_size),
282
221
        (S32 *)(&ref_idx_bank_size));
283
221
    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
221
    num_cu_in_ctb = ctb_size / MIN_CU_SIZE;
293
221
    num_cu_in_ctb *= num_cu_in_ctb;
294
295
221
    num_pu_in_ctb = ctb_size / MIN_PU_SIZE;
296
221
    num_pu_in_ctb *= num_pu_in_ctb;
297
298
221
    num_tu_in_ctb = ctb_size / MIN_PU_SIZE;
299
221
    num_tu_in_ctb *= num_tu_in_ctb;
300
301
    /* calcuate the number of ctb horizontally*/
302
221
    num_ctb_horz =
303
221
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
304
221
            .i4_width +
305
221
        SET_CTB_ALIGN(
306
221
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
307
221
                .i4_width,
308
221
            ctb_size);
309
221
    num_ctb_horz = num_ctb_horz / ctb_size;
310
311
    /* calcuate the number of ctb vertically*/
312
221
    num_ctb_vert =
313
221
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
314
221
            .i4_height +
315
221
        SET_CTB_ALIGN(
316
221
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
317
221
                .i4_height,
318
221
            ctb_size);
319
221
    num_ctb_vert = num_ctb_vert / ctb_size;
320
321
    /* align all the decomp layer dimensions to CTB alignment */
322
1.04k
    for(ctr = 0; ctr < n_tot_layers; ctr++)
323
820
    {
324
820
        a_ctb_align_wd[ctr] = a_wd[ctr] + SET_CTB_ALIGN(a_wd[ctr], ctb_size);
325
326
820
        a_ctb_align_ht[ctr] = a_ht[ctr] + SET_CTB_ALIGN(a_ht[ctr], ctb_size);
327
820
    }
328
329
    /* SEI related parametert initialization */
330
331
221
    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
221
    ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size = ctb_size;
335
221
    ps_enc_ctxt->s_frm_ctb_prms.i4_min_cu_size = min_cu_size;
336
221
    ps_enc_ctxt->s_frm_ctb_prms.i4_num_cus_in_ctb = num_cu_in_ctb;
337
221
    ps_enc_ctxt->s_frm_ctb_prms.i4_num_pus_in_ctb = num_pu_in_ctb;
338
221
    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
221
    ps_enc_ctxt->i4_cra_poc = 0;
342
343
    /* initialise the memory alloc control flag */
344
221
    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
221
    if(0 == mem_alloc_ctrl_flag)
348
221
    {
349
        /* normal memory */
350
221
        space_for_mem_in_enc_grp = IV_EXT_CACHEABLE_NORMAL_MEM;
351
221
        space_for_mem_in_pre_enc_grp = IV_EXT_CACHEABLE_NORMAL_MEM;
352
221
    }
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
221
    {
372
221
        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
221
        else
379
221
        {
380
221
            num_bufs_preenc_me_que = MIN_L1_L0_STAGGER_NON_SEQ +
381
221
                                     ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics +
382
221
                                     (MIN_L0_IPE_ENC_STAGGER - 1) + NUM_BUFS_DECOMP_HME;
383
221
        }
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
221
        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
221
        else
392
221
        {
393
221
            num_bufs_L0_ipe_enc = MIN_L0_IPE_ENC_STAGGER;
394
221
        }
395
396
221
        max_delay_preenc_l0_que = MIN_L1_L0_STAGGER_NON_SEQ +
397
221
                                  ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics + 1;
398
221
    }
399
400
    /* ------------ popluate the lap static parameters ------------- */
401
221
    ps_enc_ctxt->s_lap_stat_prms.i4_max_closed_gop_period =
402
221
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_closed_gop_period;
403
404
221
    ps_enc_ctxt->s_lap_stat_prms.i4_min_closed_gop_period =
405
221
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_min_closed_gop_period;
406
407
221
    ps_enc_ctxt->s_lap_stat_prms.i4_max_cra_open_gop_period =
408
221
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_cra_open_gop_period;
409
410
221
    ps_enc_ctxt->s_lap_stat_prms.i4_max_i_open_gop_period =
411
221
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_i_open_gop_period;
412
413
221
    ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
414
221
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames;
415
416
221
    ps_enc_ctxt->s_lap_stat_prms.i4_max_temporal_layers =
417
221
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_temporal_layers;
418
419
221
    ps_enc_ctxt->s_lap_stat_prms.i4_width = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_width;
420
421
221
    ps_enc_ctxt->s_lap_stat_prms.i4_height = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_height;
422
423
221
    ps_enc_ctxt->s_lap_stat_prms.i4_enable_logo = ps_enc_ctxt->ps_stat_prms->i4_enable_logo;
424
425
221
    ps_enc_ctxt->s_lap_stat_prms.i4_src_interlace_field =
426
221
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_field_pic;
427
221
    ps_enc_ctxt->s_lap_stat_prms.i4_frame_rate =
428
221
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_frm_rate_num /
429
221
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_frm_rate_denom;
430
431
221
    ps_enc_ctxt->s_lap_stat_prms.i4_blu_ray_spec = ps_enc_ctxt->i4_blu_ray_spec;
432
433
221
    ps_enc_ctxt->s_lap_stat_prms.i4_internal_bit_depth =
434
221
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth;
435
436
221
    ps_enc_ctxt->s_lap_stat_prms.i4_input_bit_depth =
437
221
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_input_bit_depth;
438
439
221
    ps_enc_ctxt->s_lap_stat_prms.u1_chroma_array_type =
440
221
        (ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV) ? 2 : 1;
441
442
221
    ps_enc_ctxt->s_lap_stat_prms.i4_rc_pass_num = ps_enc_ctxt->ps_stat_prms->s_pass_prms.i4_pass;
443
444
221
    if(0 == i4_resolution_id)
445
221
    {
446
442
        for(ctr = 0; ctr < ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_num_res_layers; ctr++)
447
221
        {
448
221
            ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] =
449
221
                ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ctr].i4_quality_preset;
450
451
221
            if(ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] == IHEVCE_QUALITY_P7)
452
16
            {
453
16
                ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] = IHEVCE_QUALITY_P6;
454
16
            }
455
221
        }
456
221
    }
457
221
    memcpy(
458
221
        &ps_enc_ctxt->s_lap_stat_prms.s_lap_params,
459
221
        &ps_enc_ctxt->ps_stat_prms->s_lap_prms,
460
221
        sizeof(ihevce_lap_params_t));
461
462
    /* copy the create prms as runtime prms */
463
221
    memcpy(
464
221
        &ps_enc_ctxt->s_runtime_src_prms,
465
221
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
466
221
        sizeof(ihevce_src_params_t));
467
    /*Copy the target params*/
468
221
    memcpy(
469
221
        &ps_enc_ctxt->s_runtime_tgt_params,
470
221
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
471
221
        sizeof(ihevce_tgt_params_t));
472
221
    ps_enc_ctxt->s_lap_stat_prms.e_arch_type = ps_enc_ctxt->ps_stat_prms->e_arch_type;
473
221
    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
221
    memcpy(
477
221
        &ps_enc_ctxt->s_runtime_src_prms,
478
221
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
479
221
        sizeof(ihevce_src_params_t));
480
    /*Copy the target params*/
481
221
    memcpy(
482
221
        &ps_enc_ctxt->s_runtime_tgt_params,
483
221
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
484
221
        sizeof(ihevce_tgt_params_t));
485
486
    /* copy the run time coding parameters */
487
221
    memcpy(
488
221
        &ps_enc_ctxt->s_runtime_coding_prms,
489
221
        &ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms,
490
221
        sizeof(ihevce_coding_params_t));
491
    /*change in run time parameter*/
492
221
    if(ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
493
221
    {
494
221
        ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames = (DEFAULT_MAX_REFERENCE_PICS)
495
221
                                                                     << i4_field_pic;
496
221
        ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
497
221
            ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
498
221
    }
499
221
    ASSERT(i4_num_enc_loop_frm_pllel == i4_num_me_frm_pllel);
500
501
221
    if((1 == i4_num_enc_loop_frm_pllel) && (1 == i4_num_me_frm_pllel))
502
221
    {
503
221
        max_num_ref_pics = ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
504
221
    }
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
221
    total_memtabs_req += ihevce_tiles_get_num_mem_recs();
516
517
    /* ---------- Enc loop Memtabs --------- */
518
221
    total_memtabs_req +=
519
221
        ihevce_enc_loop_get_num_mem_recs(i4_num_bitrate_inst, i4_num_enc_loop_frm_pllel);
520
    /* ---------- ME Memtabs --------------- */
521
221
    total_memtabs_req += ihevce_me_get_num_mem_recs(i4_num_me_frm_pllel);
522
523
    /* ---------- Coarse ME Memtabs --------------- */
524
221
    total_memtabs_req += ihevce_coarse_me_get_num_mem_recs();
525
    /* ---------- IPE Memtabs -------------- */
526
221
    total_memtabs_req += ihevce_ipe_get_num_mem_recs();
527
528
    /* ---------- ECD Memtabs -------------- */
529
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
530
221
    {
531
221
        total_memtabs_req += ihevce_entropy_get_num_mem_recs();
532
221
    }
533
221
    if(0 == ps_enc_ctxt->i4_resolution_id)
534
221
    {
535
        /* ---------- LAP Memtabs--------------- */
536
221
        total_memtabs_req += ihevce_lap_get_num_mem_recs();
537
221
    }
538
    /* ---------- Decomp Pre Intra Memtabs--------------- */
539
221
    total_memtabs_req += ihevce_decomp_pre_intra_get_num_mem_recs();
540
541
    /* ---------- RC memtabs --------------- */
542
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
543
221
    {
544
221
        total_memtabs_req += ihevce_rc_get_num_mem_recs(); /*HEVC_RC*/
545
221
    }
546
547
    /* ---------- System Memtabs ----------- */
548
221
    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
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
553
221
    {
554
221
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
555
221
    }
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
221
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
560
561
    /* ---Pre-encode Encode Que Mem requests -- */
562
221
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
563
564
    /* -----ME / Enc-RD opt Que Mem requests --- */
565
221
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
566
567
    /* ----Pre-encode L0 IPE to enc Que Mem requests -- */
568
221
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
569
570
    /* --- ME-EncLoop Dep Mngr Row-Row Mem requests -- */
571
221
    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
221
    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
221
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
578
579
    /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem requests -- */
580
221
    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
221
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
584
585
    /* --- Prev. frame PreEnc HME Done Dep Mngr Frm-Frm Mem requests -- */
586
221
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
587
588
    /* --- Prev. frame PreEnc L0 Done Dep Mngr Frm-Frm Mem requests -- */
589
221
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
590
591
    /* --- ME-Prev Recon Dep Mngr Row-Frm Mem requests -- */
592
221
    total_memtabs_req +=
593
221
        (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * ihevce_dmgr_get_num_mem_recs();
594
595
    /* ----- allocate memomry for memtabs --- */
596
221
    {
597
221
        iv_mem_rec_t s_memtab;
598
599
221
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
600
221
        s_memtab.i4_mem_size = total_memtabs_req * sizeof(iv_mem_rec_t);
601
221
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
602
221
        s_memtab.i4_mem_alignment = 4;
603
604
221
        ps_intrf_ctxt->ihevce_mem_alloc(
605
221
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->ps_stat_prms->s_sys_api, &s_memtab);
606
221
        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
221
        ps_memtab = (iv_mem_rec_t *)s_memtab.pv_base;
613
221
    }
614
615
    /* --------------------------------------------------------------------- */
616
    /* ------------------  Collating memory requirements ------------------- */
617
    /* --------------------------------------------------------------------- */
618
619
    /* ----------- Tiles mem requests -------------*/
620
0
    total_memtabs_used += ihevce_tiles_get_mem_recs(
621
221
        &ps_memtab[total_memtabs_used],
622
221
        ps_enc_ctxt->ps_stat_prms,
623
221
        &ps_enc_ctxt->s_frm_ctb_prms,
624
221
        i4_resolution_id,
625
221
        space_for_mem_in_enc_grp);
626
627
    /* ---------- Enc loop Mem requests --------- */
628
221
    total_memtabs_used += ihevce_enc_loop_get_mem_recs(
629
221
        &ps_memtab[total_memtabs_used],
630
221
        ps_enc_ctxt->ps_stat_prms,
631
221
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
632
221
        i4_num_bitrate_inst,
633
221
        i4_num_enc_loop_frm_pllel,
634
221
        space_for_mem_in_enc_grp,
635
221
        i4_resolution_id);
636
    /* ---------- ME Mem requests --------------- */
637
221
    total_memtabs_used += ihevce_me_get_mem_recs(
638
221
        &ps_memtab[total_memtabs_used],
639
221
        ps_enc_ctxt->ps_stat_prms,
640
221
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
641
221
        space_for_mem_in_enc_grp,
642
221
        i4_resolution_id,
643
221
        i4_num_me_frm_pllel);
644
645
    /* ---------- Coarse ME Mem requests --------------- */
646
221
    total_memtabs_used += ihevce_coarse_me_get_mem_recs(
647
221
        &ps_memtab[total_memtabs_used],
648
221
        ps_enc_ctxt->ps_stat_prms,
649
221
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
650
221
        space_for_mem_in_pre_enc_grp,
651
221
        i4_resolution_id);
652
    /* ---------- IPE Mem requests -------------- */
653
221
    total_memtabs_used += ihevce_ipe_get_mem_recs(
654
221
        &ps_memtab[total_memtabs_used],
655
221
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
656
221
        space_for_mem_in_pre_enc_grp);
657
    /* ---------- ECD Mem requests -------------- */
658
221
    i4_num_bitrate_inst = ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
659
221
                              .i4_num_bitrate_instances;
660
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
661
221
    {
662
221
        total_memtabs_used += ihevce_entropy_get_mem_recs(
663
221
            &ps_memtab[total_memtabs_used],
664
221
            ps_enc_ctxt->ps_stat_prms,
665
221
            space_for_mem_in_pre_enc_grp,
666
221
            i4_resolution_id);
667
221
    }
668
669
221
    if(0 == i4_resolution_id)
670
221
    {
671
        /* ---------- LAP Mem requests--------------- */
672
221
        total_memtabs_used +=
673
221
            ihevce_lap_get_mem_recs(&ps_memtab[total_memtabs_used], space_for_mem_in_pre_enc_grp);
674
221
    }
675
676
    /* -------- DECOMPOSITION PRE INTRA Mem requests-------- */
677
221
    total_memtabs_used += ihevce_decomp_pre_intra_get_mem_recs(
678
221
        &ps_memtab[total_memtabs_used],
679
221
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
680
221
        space_for_mem_in_pre_enc_grp);
681
682
    /* ---------- RC Mem requests --------------- */
683
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
684
221
    {
685
221
        total_memtabs_used += ihevce_rc_get_mem_recs(
686
221
            &ps_memtab[total_memtabs_used],
687
221
            ps_enc_ctxt->ps_stat_prms,
688
221
            space_for_mem_in_pre_enc_grp,
689
221
            &ps_enc_ctxt->ps_stat_prms->s_sys_api);
690
221
    }
691
692
    /* ---------- System Mem requests ----------- */
693
694
    /* allocate memory for pps tile */
695
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
696
697
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
698
699
221
    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
221
    else
707
221
    {
708
221
        ps_memtab[total_memtabs_used].i4_mem_size = sizeof(tile_t);
709
221
    }
710
711
    /* increment the memtab counter */
712
221
    total_memtabs_used++;
713
221
    total_system_memtabs++;
714
715
    /* recon picture buffer pointer array */
716
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
717
221
    {
718
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
719
720
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
721
722
221
        ps_memtab[total_memtabs_used].i4_mem_size =
723
221
            (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * (sizeof(recon_pic_buf_t *));
724
725
        /* increment the memtab counter */
726
221
        total_memtabs_used++;
727
221
        total_system_memtabs++;
728
221
    }
729
730
    /* recon picture buffers structures */
731
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
732
221
    {
733
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
734
735
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
736
737
221
        ps_memtab[total_memtabs_used].i4_mem_size =
738
221
            (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * (sizeof(recon_pic_buf_t));
739
740
        /* increment the memtab counter */
741
221
        total_memtabs_used++;
742
221
        total_system_memtabs++;
743
221
    }
744
745
    /* reference/recon picture buffers */
746
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
747
221
    {
748
221
        WORD32 i4_chroma_buf_size_shift =
749
221
            -(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth <= 8) +
750
221
            (ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV);
751
752
221
        buf_size = ((num_ctb_horz * ctb_size) + (PAD_HORZ << 1));
753
221
        buf_size = buf_size * ((num_ctb_vert * ctb_size) + (PAD_VERT << 1));
754
221
        buf_size = buf_size * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS);
755
756
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
757
758
221
        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
221
        ps_memtab[total_memtabs_used].i4_mem_size =
762
            /* Luma */
763
221
            (buf_size * ((ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth > 8)
764
221
                             ? BUFFER_SIZE_MULTIPLIER_IF_HBD
765
221
                             : 1)) +
766
            /* Chroma */
767
221
            (SHL_NEG(buf_size, i4_chroma_buf_size_shift));
768
769
        /* increment the memtab counter */
770
221
        total_memtabs_used++;
771
221
        total_system_memtabs++;
772
221
    }
773
    /* reference/recon picture subpel planes */
774
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
775
776
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
777
778
221
    ps_memtab[total_memtabs_used].i4_mem_size =
779
221
        buf_size * (3 + L0ME_IN_OPENLOOP_MODE); /* 3 planes */
780
781
    /* increment the memtab counter */
782
221
    total_memtabs_used++;
783
221
    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
221
    buf_size = (num_ctb_horz + 1) * (num_ctb_vert + 1) * num_pu_in_ctb;
788
221
    buf_size = buf_size * sizeof(pu_col_mv_t) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
789
221
               i4_num_bitrate_inst;
790
791
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
792
793
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
794
795
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
796
797
    /* increment the memtab counter */
798
221
    total_memtabs_used++;
799
221
    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
221
    buf_size = (num_ctb_horz + 1) * (num_ctb_vert + 1) * num_pu_in_ctb;
805
221
    buf_size = buf_size * sizeof(UWORD8) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
806
221
               i4_num_bitrate_inst;
807
808
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
809
810
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
811
812
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
813
814
    /* increment the memtab counter */
815
221
    total_memtabs_used++;
816
221
    total_system_memtabs++;
817
818
    /* reference collocated MV bank map offsets map */
819
221
    buf_size = num_ctb_horz * num_ctb_vert;
820
221
    buf_size = buf_size * sizeof(UWORD16) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
821
221
               i4_num_bitrate_inst;
822
823
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
824
825
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
826
827
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
828
829
    /* increment the memtab counter */
830
221
    total_memtabs_used++;
831
221
    total_system_memtabs++;
832
833
    /* reference colocated MV bank ctb offset */
834
221
    buf_size = num_ctb_horz;
835
221
    buf_size = buf_size * num_ctb_vert;
836
221
    buf_size = buf_size * sizeof(UWORD32) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
837
221
               i4_num_bitrate_inst;
838
839
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
840
841
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
842
843
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
844
845
    /* increment the memtab counter */
846
221
    total_memtabs_used++;
847
221
    total_system_memtabs++;
848
849
    /* recon picture buffer pointer array for pre enc group */
850
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
851
852
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
853
854
221
    ps_memtab[total_memtabs_used].i4_mem_size =
855
221
        (max_num_ref_pics + 1) * (sizeof(recon_pic_buf_t *));
856
857
    /* increment the memtab counter */
858
221
    total_memtabs_used++;
859
221
    total_system_memtabs++;
860
861
    /* recon picture buffers structures for pre enc group */
862
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
863
864
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
865
866
221
    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
221
    total_memtabs_used++;
870
221
    total_system_memtabs++;
871
221
    {
872
221
        num_input_buf_per_queue = ihevce_lap_get_num_ip_bufs(&ps_enc_ctxt->s_lap_stat_prms);
873
221
        {
874
221
            WORD32 i4_count_temp = 0, i4_last_queue_length;
875
876
            /*First allocate the memory for the buffer based on resolution*/
877
221
            WORD32 ctb_align_pic_wd = ps_enc_ctxt->s_runtime_tgt_params.i4_width +
878
221
                                      SET_CTB_ALIGN(
879
221
                                          ps_enc_ctxt->s_runtime_tgt_params.i4_width,
880
221
                                          ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size);
881
882
221
            WORD32 ctb_align_pic_ht = ps_enc_ctxt->s_runtime_tgt_params.i4_height +
883
221
                                      SET_CTB_ALIGN(
884
221
                                          ps_enc_ctxt->s_runtime_tgt_params.i4_height,
885
221
                                          ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size);
886
887
221
            i4_last_queue_length = (num_input_buf_per_queue % MAX_QUEUE);
888
889
221
            if((num_input_buf_per_queue % MAX_QUEUE) == 0)
890
0
                i4_last_queue_length = MAX_QUEUE;
891
892
221
            ps_enc_ctxt->i4_num_input_buf_per_queue = num_input_buf_per_queue;
893
221
            i4_yuv_min_size =
894
221
                (ctb_align_pic_wd * ctb_align_pic_ht) +
895
221
                ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
896
221
                     ? (ctb_align_pic_wd * ctb_align_pic_ht)
897
221
                     : ((ctb_align_pic_wd * ctb_align_pic_ht) >> 1));
898
221
            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
221
            i4_total_queues = num_input_buf_per_queue / MAX_QUEUE;
902
903
221
            if((num_input_buf_per_queue % MAX_QUEUE) != 0)
904
221
            {
905
221
                i4_total_queues++;
906
221
            }
907
908
221
            ASSERT(i4_total_queues < 5);
909
910
442
            for(i4_count_temp = 0; i4_count_temp < i4_total_queues; i4_count_temp++)
911
221
            {
912
221
                ps_memtab[total_memtabs_used].i4_mem_alignment = 32;
913
914
221
                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
221
                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
221
                else
919
221
                    ps_memtab[total_memtabs_used].i4_mem_size =
920
221
                        (i4_yuv_min_size)*i4_last_queue_length;
921
922
                /* increment the memtab counter */
923
221
                total_memtabs_used++;
924
221
                total_system_memtabs++;
925
221
            }
926
221
        }
927
        /*memory for input buffer structure*/
928
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
929
930
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
931
932
221
        ps_memtab[total_memtabs_used].i4_mem_size =
933
221
            (num_input_buf_per_queue) * (sizeof(ihevce_lap_enc_buf_t *));
934
935
        /* increment the memtab counter */
936
221
        total_memtabs_used++;
937
221
        total_system_memtabs++;
938
939
        /* frame process/entropy coding buffer structures */
940
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
941
942
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
943
944
221
        ps_memtab[total_memtabs_used].i4_mem_size =
945
221
            (num_input_buf_per_queue) * (sizeof(ihevce_lap_enc_buf_t));
946
        /* increment the memtab counter */
947
221
        total_memtabs_used++;
948
221
        total_system_memtabs++;
949
950
        /*input synch ctrl command*/
951
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
952
953
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
954
955
221
        ps_memtab[total_memtabs_used].i4_mem_size =
956
221
            (num_input_buf_per_queue) * (ENC_COMMAND_BUFF_SIZE);
957
958
221
        total_memtabs_used++;
959
221
        total_system_memtabs++;
960
221
    }
961
962
    /* Pre-encode/encode coding buffer pointer array */
963
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
964
965
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
966
967
221
    ps_memtab[total_memtabs_used].i4_mem_size =
968
221
        (num_bufs_preenc_me_que) * (sizeof(pre_enc_me_ctxt_t *));
969
970
    /* increment the memtab counter */
971
221
    total_memtabs_used++;
972
221
    total_system_memtabs++;
973
974
    /* frame process/entropy coding buffer structures */
975
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
976
977
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
978
979
221
    ps_memtab[total_memtabs_used].i4_mem_size =
980
221
        (num_bufs_preenc_me_que) * (sizeof(pre_enc_me_ctxt_t));
981
982
    /* increment the memtab counter */
983
221
    total_memtabs_used++;
984
221
    total_system_memtabs++;
985
986
    /* Pre-encode L0 IPE output to ME buffer pointer*/
987
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
988
989
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
990
991
221
    ps_memtab[total_memtabs_used].i4_mem_size =
992
221
        (num_bufs_L0_ipe_enc) * (sizeof(pre_enc_L0_ipe_encloop_ctxt_t *));
993
994
    /* increment the memtab counter */
995
221
    total_memtabs_used++;
996
221
    total_system_memtabs++;
997
998
    /* Pre-encode L0 IPE output to ME buffer */
999
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1000
1001
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1002
1003
221
    ps_memtab[total_memtabs_used].i4_mem_size =
1004
221
        (num_bufs_L0_ipe_enc) * (sizeof(pre_enc_L0_ipe_encloop_ctxt_t));
1005
1006
    /* increment the memtab counter */
1007
221
    total_memtabs_used++;
1008
221
    total_system_memtabs++;
1009
1010
    /* CTB analyse Frame level  */
1011
221
    buf_size = num_ctb_horz;
1012
221
    buf_size = buf_size * num_ctb_vert;
1013
221
    buf_size = buf_size * sizeof(ctb_analyse_t) * num_bufs_preenc_me_que;
1014
1015
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1016
1017
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1018
1019
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1020
1021
    /* increment the memtab counter */
1022
221
    total_memtabs_used++;
1023
221
    total_system_memtabs++;
1024
1025
    /* ME layer ctxt pointer */
1026
221
    buf_size = sizeof(layer_ctxt_t) * num_bufs_preenc_me_que;
1027
1028
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1029
1030
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1031
1032
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1033
1034
    /* increment the memtab counter */
1035
221
    total_memtabs_used++;
1036
221
    total_system_memtabs++;
1037
1038
    /* ME layer MV bank ctxt pointer */
1039
221
    buf_size = sizeof(layer_mv_t) * num_bufs_preenc_me_que;
1040
1041
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1042
1043
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1044
1045
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1046
1047
    /* increment the memtab counter */
1048
221
    total_memtabs_used++;
1049
221
    total_system_memtabs++;
1050
1051
    /* ME layer MV bank pointer */
1052
221
    buf_size = mv_bank_size * num_bufs_preenc_me_que;
1053
1054
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1055
1056
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1057
1058
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1059
1060
    /* increment the memtab counter */
1061
221
    total_memtabs_used++;
1062
221
    total_system_memtabs++;
1063
1064
    /* ME layer ref idx bank pointer */
1065
221
    buf_size = ref_idx_bank_size * num_bufs_preenc_me_que;
1066
1067
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1068
1069
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1070
1071
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1072
1073
    /* increment the memtab counter */
1074
221
    total_memtabs_used++;
1075
221
    total_system_memtabs++;
1076
    /* Frame level array to store 8x8 intra cost */
1077
221
    buf_size = (num_ctb_horz * ctb_size) >> 3;
1078
221
    buf_size *= ((num_ctb_vert * ctb_size) >> 3);
1079
221
    buf_size *= sizeof(double) * num_bufs_preenc_me_que;
1080
1081
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1082
1083
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1084
1085
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1086
1087
    /* increment the memtab counter */
1088
221
    total_memtabs_used++;
1089
221
    total_system_memtabs++;
1090
1091
    /* Frame level array to store ctb intra cost and modes */
1092
221
    buf_size = (num_ctb_horz * num_ctb_vert);
1093
221
    buf_size *= sizeof(ipe_l0_ctb_analyse_for_me_t) * num_bufs_L0_ipe_enc;
1094
1095
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1096
1097
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1098
1099
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1100
1101
    /* increment the memtab counter */
1102
221
    total_memtabs_used++;
1103
221
    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
221
    buf_size = (a_ctb_align_wd[1] >> 5) * (a_ctb_align_ht[1] >> 5) * sizeof(ihevce_ed_ctb_l1_t) *
1111
221
               num_bufs_preenc_me_que;
1112
1113
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1114
1115
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1116
1117
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1118
1119
    /* increment the memtab counter */
1120
221
    total_memtabs_used++;
1121
221
    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
221
    buf_size = (a_ctb_align_wd[1] >> 2) * (a_ctb_align_ht[1] >> 2) * sizeof(ihevce_ed_blk_t) *
1129
221
               num_bufs_preenc_me_que;
1130
1131
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1132
1133
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1134
1135
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1136
1137
    /* increment the memtab counter */
1138
221
    total_memtabs_used++;
1139
221
    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
221
    buf_size = (a_ctb_align_wd[2] >> 2) * (a_ctb_align_ht[2] >> 2) * sizeof(ihevce_ed_blk_t) *
1147
221
               num_bufs_preenc_me_que;
1148
1149
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1150
1151
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1152
1153
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1154
1155
    /* increment the memtab counter */
1156
221
    total_memtabs_used++;
1157
221
    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
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1164
1165
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1166
1167
221
    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
221
    total_memtabs_used++;
1171
221
    total_system_memtabs++;
1172
1173
    /* fme/enc que buffer structures */
1174
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1175
1176
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1177
1178
221
    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
221
    total_memtabs_used++;
1182
221
    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
221
    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
221
    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
221
    buf_size *= sizeof(job_queue_t);
1195
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1196
1197
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1198
1199
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1200
1201
    /* increment the memtab counter */
1202
221
    total_memtabs_used++;
1203
221
    total_system_memtabs++;
1204
1205
    /* cur_ctb_cu_tree_t Frame level  */
1206
221
    buf_size = num_ctb_horz * MAX_NUM_NODES_CU_TREE;
1207
221
    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
221
    buf_size = buf_size * sizeof(cur_ctb_cu_tree_t) * NUM_ME_ENC_BUFS;
1211
1212
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1213
1214
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1215
1216
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1217
1218
    /* increment the memtab counter */
1219
221
    total_memtabs_used++;
1220
221
    total_system_memtabs++;
1221
1222
    /* me_ctb_data_t Frame level  */
1223
221
    buf_size = num_ctb_horz * num_ctb_vert;
1224
1225
    /* This buffer is used to */
1226
221
    buf_size = buf_size * sizeof(me_ctb_data_t) * NUM_ME_ENC_BUFS;
1227
1228
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1229
1230
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1231
1232
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1233
1234
    /* increment the memtab counter */
1235
221
    total_memtabs_used++;
1236
221
    total_system_memtabs++;
1237
1238
    /* following is for each bit-rate */
1239
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
1240
221
    {
1241
        /* frame process/entropy coding buffer pointer array */
1242
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1243
1244
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1245
1246
221
        ps_memtab[total_memtabs_used].i4_mem_size =
1247
221
            (NUM_FRMPROC_ENTCOD_BUFS) * (sizeof(frm_proc_ent_cod_ctxt_t *));
1248
1249
        /* increment the memtab counter */
1250
221
        total_memtabs_used++;
1251
221
        total_system_memtabs++;
1252
1253
        /* frame process/entropy coding buffer structures */
1254
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1255
1256
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1257
1258
221
        ps_memtab[total_memtabs_used].i4_mem_size =
1259
221
            (NUM_FRMPROC_ENTCOD_BUFS) * (sizeof(frm_proc_ent_cod_ctxt_t));
1260
1261
        /* increment the memtab counter */
1262
221
        total_memtabs_used++;
1263
221
        total_system_memtabs++;
1264
1265
        /* CTB enc loop Frame level  */
1266
221
        buf_size = num_ctb_horz;
1267
221
        buf_size = buf_size * num_ctb_vert;
1268
221
        buf_size = buf_size * sizeof(ctb_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1269
1270
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1271
1272
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1273
1274
221
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1275
1276
        /* increment the memtab counter */
1277
221
        total_memtabs_used++;
1278
221
        total_system_memtabs++;
1279
1280
        /* CU enc loop Frame level  */
1281
221
        buf_size = num_ctb_horz * num_cu_in_ctb;
1282
221
        buf_size = buf_size * num_ctb_vert;
1283
221
        buf_size = buf_size * sizeof(cu_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1284
1285
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1286
1287
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1288
1289
221
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1290
1291
        /* increment the memtab counter */
1292
221
        total_memtabs_used++;
1293
221
        total_system_memtabs++;
1294
1295
        /* TU enc loop Frame level  */
1296
221
        buf_size = num_ctb_horz * num_tu_in_ctb;
1297
221
        buf_size = buf_size * num_ctb_vert;
1298
221
        buf_size = buf_size * sizeof(tu_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1299
1300
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1301
1302
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1303
1304
221
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1305
1306
        /* increment the memtab counter */
1307
221
        total_memtabs_used++;
1308
221
        total_system_memtabs++;
1309
1310
        /* PU enc loop Frame level  */
1311
221
        buf_size = num_ctb_horz * num_pu_in_ctb;
1312
221
        buf_size = buf_size * num_ctb_vert;
1313
221
        buf_size = buf_size * sizeof(pu_t) * NUM_FRMPROC_ENTCOD_BUFS;
1314
1315
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1316
1317
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1318
1319
221
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1320
1321
        /* increment the memtab counter */
1322
221
        total_memtabs_used++;
1323
221
        total_system_memtabs++;
1324
1325
        /* Coeffs Frame level  */
1326
221
        buf_size =
1327
221
            num_ctb_horz * ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
1328
221
                                ? (num_tu_in_ctb << 1)
1329
221
                                : ((num_tu_in_ctb * 3) >> 1));
1330
221
        buf_size = buf_size * num_ctb_vert;
1331
221
        buf_size = buf_size * sizeof(UWORD8) * MAX_SCAN_COEFFS_BYTES_4x4 * NUM_FRMPROC_ENTCOD_BUFS;
1332
1333
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1334
1335
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1336
1337
221
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1338
1339
        /* increment the memtab counter */
1340
221
        total_memtabs_used++;
1341
221
        total_system_memtabs++;
1342
1343
221
#ifndef DISABLE_SEI
1344
        /* SEI Payload Data */
1345
221
        buf_size = sizeof(UWORD8) * MAX_NUMBER_OF_SEI_PAYLOAD * MAX_SEI_PAYLOAD_PER_TLV *
1346
221
                   NUM_FRMPROC_ENTCOD_BUFS;
1347
1348
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1349
221
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1350
1351
221
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1352
1353
        /* increment the memtab counter */
1354
221
        total_memtabs_used++;
1355
221
        total_system_memtabs++;
1356
221
#endif
1357
221
    }
1358
1359
    /* ------ Working mem frame level -------*/
1360
221
    buf_size = ((num_ctb_horz * ctb_size) + 16);
1361
221
    buf_size *= ((num_ctb_vert * ctb_size) + 23);
1362
221
    buf_size *= sizeof(WORD16);
1363
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1364
1365
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1366
1367
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1368
1369
    /* increment the memtab counter */
1370
221
    total_memtabs_used++;
1371
221
    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
221
    buf_size = (MAX_NUM_VERT_UNITS_FRM) * (NUM_PRE_ENC_JOBS_QUES) * (max_delay_preenc_l0_que);
1376
221
    buf_size *= sizeof(job_queue_t);
1377
1378
221
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1379
1380
221
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1381
1382
221
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1383
1384
    /* increment the memtab counter */
1385
221
    total_memtabs_used++;
1386
221
    total_system_memtabs++;
1387
1388
    /* check on the system memtabs */
1389
221
    ASSERT(total_system_memtabs <= TOTAL_SYSTEM_MEM_RECS);
1390
1391
    /* -----Frameproc Entcod Que Mem requests --- */
1392
    /*  derive for each bit-rate */
1393
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
1394
221
    {
1395
221
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
1396
221
            &ps_memtab[total_memtabs_used], NUM_FRMPROC_ENTCOD_BUFS, space_for_mem_in_enc_grp);
1397
221
    }
1398
    /*mrs: Request memory for the input yuv queue*/
1399
221
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1400
221
        &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
221
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1404
221
        &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
221
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1408
221
        &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
221
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1412
221
        &ps_memtab[total_memtabs_used], num_bufs_L0_ipe_enc, space_for_mem_in_enc_grp);
1413
1414
    /* ---------- Dependency Manager allocations -------- */
1415
221
    {
1416
        /* --- ME-EncLoop Dep Mngr Row-Row Mem requests -- */
1417
442
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
1418
221
        {
1419
221
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1420
221
                &ps_memtab[total_memtabs_used],
1421
221
                DEP_MNGR_ROW_ROW_SYNC,
1422
221
                (a_ctb_align_ht[0] / ctb_size),
1423
221
                ps_enc_ctxt->ps_stat_prms->s_app_tile_params
1424
221
                    .i4_num_tile_cols, /* Number of Col Tiles */
1425
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1426
221
                space_for_mem_in_enc_grp);
1427
221
        }
1428
1429
442
        for(ctr = 0; ctr < i4_num_enc_loop_frm_pllel; ctr++)
1430
221
        {
1431
            /* --- Prev. frame EncLoop Done Dep Mngr Frm-Frm Mem requests -- */
1432
221
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1433
221
                &ps_memtab[total_memtabs_used],
1434
221
                DEP_MNGR_FRM_FRM_SYNC,
1435
221
                (a_ctb_align_ht[0] / ctb_size),
1436
221
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
1437
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1438
221
                space_for_mem_in_enc_grp);
1439
221
        }
1440
        /* --- Prev. frame EncLoop Done for re-encode Dep Mngr Frm-Frm Mem requests -- */
1441
221
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1442
221
            &ps_memtab[total_memtabs_used],
1443
221
            DEP_MNGR_FRM_FRM_SYNC,
1444
221
            (a_ctb_align_ht[0] / ctb_size),
1445
221
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1446
221
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1447
221
            space_for_mem_in_enc_grp);
1448
442
        for(ctr = 0; ctr < i4_num_me_frm_pllel; ctr++)
1449
221
        {
1450
            /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem requests -- */
1451
221
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1452
221
                &ps_memtab[total_memtabs_used],
1453
221
                DEP_MNGR_FRM_FRM_SYNC,
1454
221
                (a_ctb_align_ht[0] / ctb_size),
1455
221
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
1456
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1457
221
                space_for_mem_in_enc_grp);
1458
221
        }
1459
1460
        /* --- Prev. frame PreEnc L1 Done Dep Mngr Frm-Frm Mem requests -- */
1461
221
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1462
221
            &ps_memtab[total_memtabs_used],
1463
221
            DEP_MNGR_FRM_FRM_SYNC,
1464
221
            (a_ctb_align_ht[0] / ctb_size),
1465
221
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1466
221
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1467
221
            space_for_mem_in_enc_grp);
1468
1469
        /* --- Prev. frame PreEnc HME Done Dep Mngr Frm-Frm Mem requests -- */
1470
221
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1471
221
            &ps_memtab[total_memtabs_used],
1472
221
            DEP_MNGR_FRM_FRM_SYNC,
1473
221
            (a_ctb_align_ht[0] / ctb_size),
1474
221
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1475
221
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1476
221
            space_for_mem_in_enc_grp);
1477
1478
        /* --- Prev. frame PreEnc L0 Done Dep Mngr Frm-Frm Mem requests -- */
1479
221
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1480
221
            &ps_memtab[total_memtabs_used],
1481
221
            DEP_MNGR_FRM_FRM_SYNC,
1482
221
            (a_ctb_align_ht[0] / ctb_size),
1483
221
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1484
221
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1485
221
            space_for_mem_in_enc_grp);
1486
1487
        /* --- ME-Prev Recon Dep Mngr Row-Frm Mem requests -- */
1488
1.32k
        for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
1489
1.10k
        {
1490
1.10k
            WORD32 i4_num_units = num_ctb_horz * num_ctb_vert;
1491
1492
1.10k
            total_memtabs_used += ihevce_dmgr_map_get_mem_recs(
1493
1.10k
                &ps_memtab[total_memtabs_used],
1494
1.10k
                i4_num_units,
1495
1.10k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1496
1.10k
                space_for_mem_in_enc_grp);
1497
1.10k
        }
1498
221
    }
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
194k
    for(ctr = 0; ctr < total_memtabs_used; ctr++)
1508
194k
    {
1509
194k
        UWORD8 *pu1_mem = NULL;
1510
194k
        ps_intrf_ctxt->ihevce_mem_alloc(
1511
194k
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->ps_stat_prms->s_sys_api, &ps_memtab[ctr]);
1512
1513
194k
        pu1_mem = (UWORD8 *)ps_memtab[ctr].pv_base;
1514
1515
194k
        if(NULL == pu1_mem)
1516
0
        {
1517
0
            ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
1518
0
            return;
1519
0
        }
1520
194k
    }
1521
1522
    /* --------------------------------------------------------------------- */
1523
    /* --------- Initialisation of Modules & System memory ----------------- */
1524
    /* --------------------------------------------------------------------- */
1525
1526
    /* store the final allocated memtabs */
1527
221
    ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs = total_memtabs_used;
1528
221
    ps_enc_ctxt->s_mem_mngr.ps_create_memtab = ps_memtab;
1529
1530
    /* ---------- Tiles Mem init --------- */
1531
221
    ps_enc_ctxt->ps_tile_params_base = (ihevce_tile_params_t *)ihevce_tiles_mem_init(
1532
221
        ps_memtab, ps_enc_ctxt->ps_stat_prms, ps_enc_ctxt, i4_resolution_id);
1533
1534
221
    ps_memtab += ihevce_tiles_get_num_mem_recs();
1535
1536
    /* ---------- Enc loop Mem init --------- */
1537
221
    ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt = ihevce_enc_loop_init(
1538
221
        ps_memtab,
1539
221
        ps_enc_ctxt->ps_stat_prms,
1540
221
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1541
221
        ps_intrf_ctxt->pv_osal_handle,
1542
221
        &ps_enc_ctxt->s_func_selector,
1543
221
        &ps_enc_ctxt->s_rc_quant,
1544
221
        ps_enc_ctxt->ps_tile_params_base,
1545
221
        i4_resolution_id,
1546
221
        i4_num_enc_loop_frm_pllel,
1547
221
        ps_enc_ctxt->u1_is_popcnt_available);
1548
1549
221
    ps_memtab += ihevce_enc_loop_get_num_mem_recs(i4_num_bitrate_inst, i4_num_enc_loop_frm_pllel);
1550
    /* ---------- ME Mem init --------------- */
1551
221
    ps_enc_ctxt->s_module_ctxt.pv_me_ctxt = ihevce_me_init(
1552
221
        ps_memtab,
1553
221
        ps_enc_ctxt->ps_stat_prms,
1554
221
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1555
221
        ps_intrf_ctxt->pv_osal_handle,
1556
221
        &ps_enc_ctxt->s_rc_quant,
1557
221
        (void *)ps_enc_ctxt->ps_tile_params_base,
1558
221
        i4_resolution_id,
1559
221
        i4_num_me_frm_pllel,
1560
221
        ps_enc_ctxt->u1_is_popcnt_available);
1561
1562
221
    ps_memtab += ihevce_me_get_num_mem_recs(i4_num_me_frm_pllel);
1563
1564
    /* ---------- Coarse ME Mem init --------------- */
1565
221
    ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt = ihevce_coarse_me_init(
1566
221
        ps_memtab,
1567
221
        ps_enc_ctxt->ps_stat_prms,
1568
221
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1569
221
        ps_intrf_ctxt->pv_osal_handle,
1570
221
        i4_resolution_id,
1571
221
        ps_enc_ctxt->u1_is_popcnt_available);
1572
1573
221
    ps_memtab += ihevce_coarse_me_get_num_mem_recs();
1574
    /* ---------- IPE Mem init -------------- */
1575
221
    ps_enc_ctxt->s_module_ctxt.pv_ipe_ctxt = ihevce_ipe_init(
1576
221
        ps_memtab,
1577
221
        ps_enc_ctxt->ps_stat_prms,
1578
221
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1579
221
        ps_enc_ctxt->i4_ref_mbr_id,
1580
221
        &ps_enc_ctxt->s_func_selector,
1581
221
        &ps_enc_ctxt->s_rc_quant,
1582
221
        i4_resolution_id,
1583
221
        ps_enc_ctxt->u1_is_popcnt_available);
1584
1585
221
    ps_memtab += ihevce_ipe_get_num_mem_recs();
1586
1587
221
    ps_enc_ctxt->s_rc_quant.i2_max_qp = 51;
1588
221
    ps_enc_ctxt->s_rc_quant.i2_min_qp = 0;
1589
221
    ps_enc_ctxt->s_rc_quant.i1_qp_offset = 0;
1590
221
    ps_enc_ctxt->s_rc_quant.i2_max_qscale =
1591
221
        228 << 3;  // Q3 format is mantained for accuarate calc at lower qp
1592
221
    ps_enc_ctxt->s_rc_quant.i2_min_qscale = 1;
1593
1594
    /* ---------- ECD Mem init -------------- */
1595
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
1596
221
    {
1597
221
        ps_enc_ctxt->s_module_ctxt.apv_ent_cod_ctxt[i] = ihevce_entropy_init(
1598
221
            ps_memtab,
1599
221
            ps_enc_ctxt->ps_stat_prms,
1600
221
            (void *)ps_enc_ctxt->ps_tile_params_base,
1601
221
            i4_resolution_id);
1602
1603
221
        ps_memtab += ihevce_entropy_get_num_mem_recs();
1604
221
    }
1605
1606
    /* ---------- LAP Mem init--------------- */
1607
221
    if(i4_resolution_id == 0)
1608
221
    {
1609
221
        ps_enc_ctxt->s_module_ctxt.pv_lap_ctxt =
1610
221
            ihevce_lap_init(ps_memtab, &ps_enc_ctxt->s_lap_stat_prms, ps_enc_ctxt->ps_stat_prms);
1611
1612
221
        ps_memtab += ihevce_lap_get_num_mem_recs();
1613
221
    }
1614
    /*-----------DECOMPOSITION PRE INTRA init----*/
1615
221
    ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt = ihevce_decomp_pre_intra_init(
1616
221
        ps_memtab,
1617
221
        ps_enc_ctxt->ps_stat_prms,
1618
221
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1619
221
        &ps_enc_ctxt->s_func_selector,
1620
221
        i4_resolution_id,
1621
221
        ps_enc_ctxt->u1_is_popcnt_available);
1622
1623
221
    ps_memtab += ihevce_decomp_pre_intra_get_num_mem_recs();
1624
1625
    /* ---------- RC Mem init --------------- */
1626
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
1627
221
    {
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
221
        if(i == 0)
1632
221
        {
1633
221
            ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i] = ihevce_rc_mem_init(
1634
221
                ps_memtab,
1635
221
                ps_enc_ctxt->ps_stat_prms,
1636
221
                ps_enc_ctxt->i4_ref_mbr_id,
1637
221
                &ps_enc_ctxt->s_rc_quant,
1638
221
                ps_enc_ctxt->i4_resolution_id,
1639
221
                ps_enc_ctxt->i4_look_ahead_frames_in_first_pass);
1640
221
        }
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
221
        ps_memtab += ihevce_rc_get_num_mem_recs();
1662
221
    }
1663
1664
    /* ---------- System Mem init ----------- */
1665
221
    {
1666
221
        recon_pic_buf_t **pps_pic_bufs[IHEVCE_MAX_NUM_BITRATES];
1667
221
        recon_pic_buf_t *ps_pic_bufs[IHEVCE_MAX_NUM_BITRATES];
1668
221
        void *pv_recon_buf[IHEVCE_MAX_NUM_BITRATES];
1669
221
#if(SRC_PADDING_FOR_TRAQO || ENABLE_SSD_CALC_RC)
1670
221
        void *pv_recon_buf_source[IHEVCE_MAX_NUM_BITRATES] = { NULL };
1671
221
#endif
1672
221
        void *pv_uv_recon_buf[IHEVCE_MAX_NUM_BITRATES];
1673
221
        UWORD8 *pu1_subpel_buf;
1674
221
        pu_col_mv_t *ps_col_mv;
1675
221
        UWORD8 *pu1_col_mv_map;
1676
221
        UWORD16 *pu2_col_num_pu_map;
1677
221
        UWORD32 *pu4_col_mv_off;
1678
221
        WORD32 luma_frm_size;
1679
221
        WORD32 recon_stride; /* stride for Y and UV(interleave) */
1680
221
        WORD32 luma_frm_height; /* including padding    */
1681
221
        WORD32 num_pu_in_frm;
1682
1683
        /* pps tile memory */
1684
442
        for(i = 0; i < i4_num_bitrate_inst; i++)
1685
221
        {
1686
221
            ps_enc_ctxt->as_pps[i].ps_tile = (tile_t *)ps_memtab->pv_base;
1687
221
        }
1688
1689
221
        ps_memtab++; /* increment the memtabs */
1690
1691
        /* recon picture buffer pointer array */
1692
442
        for(i = 0; i < i4_num_bitrate_inst; i++)
1693
221
        {
1694
221
            pps_pic_bufs[i] = (recon_pic_buf_t **)ps_memtab->pv_base;
1695
221
            ps_memtab++; /* increment the memtabs */
1696
221
        }
1697
1698
        /* recon picture buffers structures */
1699
442
        for(i = 0; i < i4_num_bitrate_inst; i++)
1700
221
        {
1701
221
            ps_pic_bufs[i] = (recon_pic_buf_t *)ps_memtab->pv_base;
1702
221
            ps_memtab++; /* increment the memtabs */
1703
221
        }
1704
1705
        /* reference/recon picture buffers */
1706
442
        for(i = 0; i < i4_num_bitrate_inst; i++)
1707
221
        {
1708
221
            pv_recon_buf[i] = ps_memtab->pv_base;
1709
221
            ps_memtab++; /* increment the memtabs */
1710
221
        }
1711
        /* reference/recon picture subpel planes */
1712
221
        pu1_subpel_buf = (UWORD8 *)ps_memtab->pv_base;
1713
        /* increment the memtabs */
1714
221
        ps_memtab++;
1715
        /* reference colocated MV bank */
1716
221
        ps_col_mv = (pu_col_mv_t *)ps_memtab->pv_base;
1717
        /* increment the memtabs */
1718
221
        ps_memtab++;
1719
1720
        /* reference colocated MV bank map */
1721
221
        pu1_col_mv_map = (UWORD8 *)ps_memtab->pv_base;
1722
        /* increment the memtabs */
1723
221
        ps_memtab++;
1724
1725
        /* reference collocated MV bank map offsets map */
1726
221
        pu2_col_num_pu_map = (UWORD16 *)ps_memtab->pv_base;
1727
        /* increment the memtabs */
1728
221
        ps_memtab++;
1729
1730
        /* reference colocated MV bank ctb offset */
1731
221
        pu4_col_mv_off = (UWORD32 *)ps_memtab->pv_base;
1732
        /* increment the memtabs */
1733
221
        ps_memtab++;
1734
1735
        /* compute the stride and frame height after accounting for padding */
1736
221
        recon_stride = ((num_ctb_horz * ctb_size) + (PAD_HORZ << 1));
1737
221
        luma_frm_height = ((num_ctb_vert * ctb_size) + (PAD_VERT << 1));
1738
221
        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
221
        pu1_subpel_buf += (recon_stride * PAD_VERT);
1742
221
        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
221
        num_pu_in_frm = (num_ctb_horz + 1) * num_pu_in_ctb * (num_ctb_vert + 1);
1747
1748
442
        for(i = 0; i < i4_num_bitrate_inst; i++)
1749
221
        {
1750
221
            pv_uv_recon_buf[i] = pv_recon_buf[i];
1751
1752
            /* increment the recon buffer to take care of padding */
1753
221
            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
221
            pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + luma_frm_size;
1757
221
            if(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth == 8)
1758
221
            {
1759
                /* increment the chroma recon buffer to take care of padding    */
1760
                /* vert padding halved but horiz is same due to uv interleave   */
1761
221
                pv_uv_recon_buf[i] =
1762
221
                    (UWORD8 *)pv_uv_recon_buf[i] + (recon_stride * (PAD_VERT >> 1)) +
1763
221
                    ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
1764
221
                         ? (recon_stride * (PAD_VERT >> 1))
1765
221
                         : 0);
1766
221
                pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + PAD_HORZ;
1767
221
            }
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.32k
            for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
1775
1.10k
            {
1776
1.10k
                pps_pic_bufs[i][ctr] =
1777
1.10k
                    ps_pic_bufs[i];  //check the index of pps [i] should be first or last index?!!
1778
1779
1.10k
                ps_pic_bufs[i]->s_yuv_buf_desc.i4_size = sizeof(iv_enc_yuv_buf_t);
1780
1.10k
                ps_pic_bufs[i]->s_yuv_buf_desc.pv_y_buf = pv_recon_buf[i];
1781
1.10k
                ps_pic_bufs[i]->s_yuv_buf_desc.pv_v_buf = NULL;
1782
1.10k
                {
1783
1.10k
                    ps_pic_bufs[i]->s_yuv_buf_desc.pv_u_buf = pv_uv_recon_buf[i];
1784
1.10k
                }
1785
1.10k
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[0] = ((i == 0) ? pu1_subpel_buf : NULL);
1786
1.10k
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[1] =
1787
1.10k
                    ((i == 0) ? (pu1_subpel_buf + luma_frm_size) : NULL);
1788
1.10k
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[2] =
1789
1.10k
                    ((i == 0) ? (pu1_subpel_buf + (luma_frm_size * 2)) : NULL);
1790
1.10k
                ps_pic_bufs[i]->ps_frm_col_mv = ps_col_mv;
1791
1.10k
                ps_pic_bufs[i]->pu1_frm_pu_map = pu1_col_mv_map;
1792
1.10k
                ps_pic_bufs[i]->pu2_num_pu_map = pu2_col_num_pu_map;
1793
1.10k
                ps_pic_bufs[i]->pu4_pu_off = pu4_col_mv_off;
1794
1.10k
                ps_pic_bufs[i]->i4_is_free = 1;
1795
1.10k
                ps_pic_bufs[i]->i4_poc = -1;
1796
1.10k
                ps_pic_bufs[i]->i4_display_num = -1;
1797
1.10k
                ps_pic_bufs[i]->i4_buf_id = ctr;
1798
1799
                /* frame level buff increments */
1800
1.10k
                ps_col_mv += num_pu_in_frm;
1801
1.10k
                pu1_col_mv_map += num_pu_in_frm;
1802
1.10k
                pu2_col_num_pu_map += (num_ctb_horz * num_ctb_vert);
1803
1.10k
                pu4_col_mv_off += (num_ctb_horz * num_ctb_vert);
1804
1805
1.10k
                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
1.10k
                else
1811
1.10k
                {
1812
1.10k
                    pv_recon_buf[i] = (UWORD8 *)pv_recon_buf[i] + ((3 * luma_frm_size) >> 1);
1813
1.10k
                    pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + ((3 * luma_frm_size) >> 1);
1814
1.10k
                }
1815
1.10k
                pu1_subpel_buf += ((3 + L0ME_IN_OPENLOOP_MODE) * luma_frm_size); /* 3 planes */
1816
1.10k
                ps_pic_bufs[i]++;
1817
1.10k
            }  //ctr ends
1818
1819
            /* store the queue pointer and num buffs to context */
1820
221
            ps_enc_ctxt->pps_recon_buf_q[i] = pps_pic_bufs[i];
1821
221
            ps_enc_ctxt->ai4_num_buf_recon_q[i] = (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS);
1822
1823
221
        }  //bitrate ctr ends
1824
1825
221
    }  //end of system memory init
1826
1827
    /* Pre encode group recon buffer  containier NO Buffers will be allocated / used */
1828
221
    {
1829
221
        recon_pic_buf_t *ps_pic_bufs;
1830
1831
        /* recon picture buffer pointer array */
1832
221
        pps_pre_enc_pic_bufs = (recon_pic_buf_t **)ps_memtab->pv_base;
1833
        /* increment the memtabs */
1834
221
        ps_memtab++;
1835
1836
        /* recon picture buffers structures */
1837
221
        ps_pic_bufs = (recon_pic_buf_t *)ps_memtab->pv_base;
1838
        /* increment the memtabs */
1839
221
        ps_memtab++;
1840
1841
        /* loop to initialise all the memories */
1842
1.32k
        for(ctr = 0; ctr < (max_num_ref_pics + 1); ctr++)
1843
1.10k
        {
1844
1.10k
            pps_pre_enc_pic_bufs[ctr] = ps_pic_bufs;
1845
1846
1.10k
            ps_pic_bufs->s_yuv_buf_desc.i4_size = sizeof(iv_enc_yuv_buf_t);
1847
1.10k
            ps_pic_bufs->s_yuv_buf_desc.pv_y_buf = NULL;
1848
1.10k
            ps_pic_bufs->s_yuv_buf_desc.pv_u_buf = NULL;
1849
1.10k
            ps_pic_bufs->s_yuv_buf_desc.pv_v_buf = NULL;
1850
1.10k
            ps_pic_bufs->apu1_y_sub_pel_planes[0] = NULL;
1851
1.10k
            ps_pic_bufs->apu1_y_sub_pel_planes[1] = NULL;
1852
1.10k
            ps_pic_bufs->apu1_y_sub_pel_planes[2] = NULL;
1853
1.10k
            ps_pic_bufs->ps_frm_col_mv = NULL;
1854
1.10k
            ps_pic_bufs->pu1_frm_pu_map = NULL;
1855
1.10k
            ps_pic_bufs->pu2_num_pu_map = NULL;
1856
1.10k
            ps_pic_bufs->pu4_pu_off = NULL;
1857
1.10k
            ps_pic_bufs->i4_is_free = 1;
1858
1.10k
            ps_pic_bufs->i4_poc = -1;
1859
1.10k
            ps_pic_bufs->i4_buf_id = ctr;
1860
1861
            /* frame level buff increments */
1862
1.10k
            ps_pic_bufs++;
1863
1.10k
        }
1864
1865
        /* store the queue pointer and num buffs to context */
1866
221
        ps_enc_ctxt->pps_pre_enc_recon_buf_q = pps_pre_enc_pic_bufs;
1867
221
        ps_enc_ctxt->i4_pre_enc_num_buf_recon_q = (max_num_ref_pics + 1);
1868
221
    }
1869
1870
    /* Frame level buffers and Que between pre-encode & encode */
1871
221
    {
1872
221
        pre_enc_me_ctxt_t *ps_pre_enc_bufs;
1873
221
        pre_enc_L0_ipe_encloop_ctxt_t *ps_L0_ipe_enc_bufs;
1874
221
        ihevce_lap_enc_buf_t *ps_lap_enc_input_buf;
1875
221
        ctb_analyse_t *ps_ctb_analyse;
1876
221
        UWORD8 *pu1_me_lyr_ctxt;
1877
221
        UWORD8 *pu1_me_lyr_bank_ctxt;
1878
221
        UWORD8 *pu1_mv_bank;
1879
221
        UWORD8 *pu1_ref_idx_bank;
1880
221
        double *plf_intra_8x8_cost;
1881
221
        ipe_l0_ctb_analyse_for_me_t *ps_ipe_analyse_ctb;
1882
221
        ihevce_ed_ctb_l1_t *ps_ed_ctb_l1;
1883
221
        ihevce_ed_blk_t *ps_layer1_buf;
1884
221
        ihevce_ed_blk_t *ps_layer2_buf;
1885
221
        UWORD8 *pu1_lap_input_yuv_buf[4];
1886
221
        UWORD8 *pu1_input_synch_ctrl_cmd;
1887
221
        WORD32 i4_count = 0;
1888
        /*initialize the memory for input buffer*/
1889
221
        {
1890
442
            for(i4_count = 0; i4_count < i4_total_queues; i4_count++)
1891
221
            {
1892
221
                pu1_lap_input_yuv_buf[i4_count] = (UWORD8 *)ps_memtab->pv_base;
1893
                /* increment the memtabs */
1894
221
                ps_memtab++;
1895
221
            }
1896
221
            pps_lap_enc_input_bufs = (ihevce_lap_enc_buf_t **)ps_memtab->pv_base;
1897
            /* increment the memtabs */
1898
221
            ps_memtab++;
1899
1900
            /*memory for the input buffer structure*/
1901
221
            ps_lap_enc_input_buf = (ihevce_lap_enc_buf_t *)ps_memtab->pv_base;
1902
221
            ps_memtab++;
1903
1904
221
            pu1_input_synch_ctrl_cmd = (UWORD8 *)ps_memtab->pv_base;
1905
221
            ps_memtab++;
1906
221
        }
1907
        /* pre encode /encode coding buffer pointer array */
1908
221
        pps_pre_enc_bufs = (pre_enc_me_ctxt_t **)ps_memtab->pv_base;
1909
        /* increment the memtabs */
1910
221
        ps_memtab++;
1911
1912
        /* pre encode /encode buffer structure */
1913
221
        ps_pre_enc_bufs = (pre_enc_me_ctxt_t *)ps_memtab->pv_base;
1914
        /* increment the memtabs */
1915
221
        ps_memtab++;
1916
1917
        /*  Pre-encode L0 IPE output to ME buffer pointer */
1918
221
        pps_L0_ipe_enc_bufs = (pre_enc_L0_ipe_encloop_ctxt_t **)ps_memtab->pv_base;
1919
        /* increment the memtabs */
1920
221
        ps_memtab++;
1921
1922
        /* Pre-encode L0 IPE output to ME buffer */
1923
221
        ps_L0_ipe_enc_bufs = (pre_enc_L0_ipe_encloop_ctxt_t *)ps_memtab->pv_base;
1924
        /* increment the memtabs */
1925
221
        ps_memtab++;
1926
1927
        /* CTB analyse Frame level  */
1928
221
        ps_ctb_analyse = (ctb_analyse_t *)ps_memtab->pv_base;
1929
        /* increment the memtabs */
1930
221
        ps_memtab++;
1931
1932
        /* ME layer ctxt Frame level  */
1933
221
        pu1_me_lyr_ctxt = (UWORD8 *)ps_memtab->pv_base;
1934
        /* increment the memtabs */
1935
221
        ps_memtab++;
1936
1937
        /* ME layer bank ctxt Frame level  */
1938
221
        pu1_me_lyr_bank_ctxt = (UWORD8 *)ps_memtab->pv_base;
1939
        /* increment the memtabs */
1940
221
        ps_memtab++;
1941
1942
        /* ME layer MV bank Frame level  */
1943
221
        pu1_mv_bank = (UWORD8 *)ps_memtab->pv_base;
1944
        /* increment the memtabs */
1945
221
        ps_memtab++;
1946
1947
        /* ME layer ref idx bank Frame level  */
1948
221
        pu1_ref_idx_bank = (UWORD8 *)ps_memtab->pv_base;
1949
        /* increment the memtabs */
1950
221
        ps_memtab++;
1951
        /* 8x8 intra costs for entire frame */
1952
221
        plf_intra_8x8_cost = (double *)ps_memtab->pv_base;
1953
221
        ps_memtab++;
1954
1955
        /* ctb intra costs and modes for entire frame */
1956
221
        ps_ipe_analyse_ctb = (ipe_l0_ctb_analyse_for_me_t *)ps_memtab->pv_base;
1957
221
        ps_memtab++;
1958
1959
        /*Contains ctb level information at pre-intra stage */
1960
221
        ps_ed_ctb_l1 = (ihevce_ed_ctb_l1_t *)ps_memtab->pv_base;
1961
221
        ps_memtab++;
1962
1963
        /* Layer L1 buf */
1964
221
        ps_layer1_buf = (ihevce_ed_blk_t *)ps_memtab->pv_base;
1965
        /* increment the memtabs */
1966
221
        ps_memtab++;
1967
1968
        /* Layer2 buf */
1969
221
        ps_layer2_buf = (ihevce_ed_blk_t *)ps_memtab->pv_base;
1970
        /* increment the memtabs */
1971
221
        ps_memtab++;
1972
1973
        /* loop to initialise all the memories*/
1974
        /*mrs: assign individual input yuv frame pointers here*/
1975
1976
221
        i4_count = 0;
1977
        /* loop to initialise the buffer pointer */
1978
702
        for(ctr = 0; ctr < num_input_buf_per_queue; ctr++)
1979
481
        {
1980
481
            pps_lap_enc_input_bufs[ctr] = &ps_lap_enc_input_buf[ctr];
1981
1982
481
            pps_lap_enc_input_bufs[ctr]->s_input_buf.i4_size = sizeof(iv_input_data_ctrl_buffs_t);
1983
1984
481
            pps_lap_enc_input_bufs[ctr]->s_input_buf.pv_synch_ctrl_bufs = pu1_input_synch_ctrl_cmd;
1985
1986
481
            pps_lap_enc_input_bufs[ctr]->s_input_buf.s_input_buf.i4_size = sizeof(iv_yuv_buf_t);
1987
1988
481
            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
481
            {
1992
481
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_y_buf =
1993
481
                    pu1_lap_input_yuv_buf[i4_count];
1994
1995
481
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_u_buf =
1996
481
                    pu1_lap_input_yuv_buf[i4_count] + i4_luma_min_size;
1997
1998
481
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_v_buf =
1999
481
                    NULL; /*since yuv 420 format*/
2000
2001
481
                pu1_lap_input_yuv_buf[i4_count] += i4_yuv_min_size;
2002
2003
481
                if(((ctr + 1) % MAX_QUEUE) == 0)
2004
0
                    i4_count++;
2005
481
            }
2006
481
        }
2007
663
        for(ctr = 0; ctr < num_bufs_preenc_me_que; ctr++)
2008
442
        {
2009
442
            pps_pre_enc_bufs[ctr] = ps_pre_enc_bufs;
2010
2011
442
            ps_pre_enc_bufs->ps_ctb_analyse = ps_ctb_analyse;
2012
442
            ps_pre_enc_bufs->pv_me_lyr_ctxt = (void *)pu1_me_lyr_ctxt;
2013
442
            ps_pre_enc_bufs->pv_me_lyr_bnk_ctxt = (void *)pu1_me_lyr_bank_ctxt;
2014
442
            ps_pre_enc_bufs->pv_me_mv_bank = (void *)pu1_mv_bank;
2015
442
            ps_pre_enc_bufs->pv_me_ref_idx = (void *)pu1_ref_idx_bank;
2016
442
            ps_pre_enc_bufs->ps_layer1_buf = ps_layer1_buf;
2017
442
            ps_pre_enc_bufs->ps_layer2_buf = ps_layer2_buf;
2018
442
            ps_pre_enc_bufs->ps_ed_ctb_l1 = ps_ed_ctb_l1;
2019
442
            ps_pre_enc_bufs->plf_intra_8x8_cost = plf_intra_8x8_cost;
2020
2021
442
            ps_ctb_analyse += num_ctb_horz * num_ctb_vert;
2022
442
            pu1_me_lyr_ctxt += sizeof(layer_ctxt_t);
2023
442
            pu1_me_lyr_bank_ctxt += sizeof(layer_mv_t);
2024
442
            pu1_mv_bank += mv_bank_size;
2025
442
            pu1_ref_idx_bank += ref_idx_bank_size;
2026
442
            plf_intra_8x8_cost +=
2027
442
                (((num_ctb_horz * ctb_size) >> 3) * ((num_ctb_vert * ctb_size) >> 3));
2028
442
            ps_ed_ctb_l1 += (a_ctb_align_wd[1] >> 5) * (a_ctb_align_ht[1] >> 5);
2029
442
            ps_layer1_buf += (a_ctb_align_wd[1] >> 2) * (a_ctb_align_ht[1] >> 2);
2030
442
            ps_layer2_buf += (a_ctb_align_wd[2] >> 2) * (a_ctb_align_ht[2] >> 2);
2031
442
            ps_pre_enc_bufs++;
2032
442
        }
2033
2034
442
        for(ctr = 0; ctr < num_bufs_L0_ipe_enc; ctr++)
2035
221
        {
2036
221
            pps_L0_ipe_enc_bufs[ctr] = ps_L0_ipe_enc_bufs;
2037
221
            ps_L0_ipe_enc_bufs->ps_ipe_analyse_ctb = ps_ipe_analyse_ctb;
2038
221
            ps_ipe_analyse_ctb += num_ctb_horz * num_ctb_vert;
2039
221
            ps_L0_ipe_enc_bufs++;
2040
221
        }
2041
221
    }
2042
2043
    /* Frame level que between ME and Enc rd-opt */
2044
221
    {
2045
221
        me_enc_rdopt_ctxt_t *ps_me_enc_bufs;
2046
221
        job_queue_t *ps_job_q_enc;
2047
221
        me_ctb_data_t *ps_cur_ctb_me_data;
2048
221
        cur_ctb_cu_tree_t *ps_cur_ctb_cu_tree;
2049
2050
        /* pre encode /encode coding buffer pointer array */
2051
221
        pps_me_enc_bufs = (me_enc_rdopt_ctxt_t **)ps_memtab->pv_base;
2052
        /* increment the memtabs */
2053
221
        ps_memtab++;
2054
2055
        /* pre encode /encode buffer structure */
2056
221
        ps_me_enc_bufs = (me_enc_rdopt_ctxt_t *)ps_memtab->pv_base;
2057
        /* increment the memtabs */
2058
221
        ps_memtab++;
2059
2060
        /*me and enc job queue memory */
2061
221
        ps_job_q_enc = (job_queue_t *)ps_memtab->pv_base;
2062
        /* increment the memtabs */
2063
221
        ps_memtab++;
2064
2065
        /*ctb me data memory*/
2066
221
        ps_cur_ctb_cu_tree = (cur_ctb_cu_tree_t *)ps_memtab->pv_base;
2067
        /* increment the memtabs */
2068
221
        ps_memtab++;
2069
2070
        /*ctb me data memory*/
2071
221
        ps_cur_ctb_me_data = (me_ctb_data_t *)ps_memtab->pv_base;
2072
        /* increment the memtabs */
2073
221
        ps_memtab++;
2074
2075
        /* loop to initialise all the memories */
2076
442
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
2077
221
        {
2078
221
            pps_me_enc_bufs[ctr] = ps_me_enc_bufs;
2079
2080
221
            ps_me_enc_bufs->ps_job_q_enc = ps_job_q_enc;
2081
221
            ps_me_enc_bufs->ps_cur_ctb_cu_tree = ps_cur_ctb_cu_tree;
2082
221
            ps_me_enc_bufs->ps_cur_ctb_me_data = ps_cur_ctb_me_data;
2083
2084
221
            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
221
            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
221
            ps_cur_ctb_cu_tree += (num_ctb_horz * MAX_NUM_NODES_CU_TREE * num_ctb_vert);
2099
221
            ps_cur_ctb_me_data += (num_ctb_horz * num_ctb_vert);
2100
2101
221
            ps_me_enc_bufs++;
2102
221
        }
2103
221
    }
2104
    /* Frame level Que between frame process & entropy */
2105
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
2106
221
    {
2107
221
        frm_proc_ent_cod_ctxt_t *ps_frmp_ent_bufs;
2108
221
        ctb_enc_loop_out_t *ps_ctb;
2109
221
        cu_enc_loop_out_t *ps_cu;
2110
221
        tu_enc_loop_out_t *ps_tu;
2111
221
        pu_t *ps_pu;
2112
221
        UWORD8 *pu1_coeffs;
2113
221
        WORD32 num_ctb_in_frm;
2114
221
        WORD32 coeff_size;
2115
2116
        /* frame process/entropy coding buffer pointer array */
2117
221
        pps_frm_proc_ent_cod_bufs[i] = (frm_proc_ent_cod_ctxt_t **)ps_memtab->pv_base;
2118
        /* increment the memtabs */
2119
221
        ps_memtab++;
2120
2121
        /* frame process/entropy coding buffer structure */
2122
221
        ps_frmp_ent_bufs = (frm_proc_ent_cod_ctxt_t *)ps_memtab->pv_base;
2123
        /* increment the memtabs */
2124
221
        ps_memtab++;
2125
2126
        /* CTB enc loop Frame level  */
2127
221
        ps_ctb = (ctb_enc_loop_out_t *)ps_memtab->pv_base;
2128
        /* increment the memtabs */
2129
221
        ps_memtab++;
2130
2131
        /* CU enc loop Frame level  */
2132
221
        ps_cu = (cu_enc_loop_out_t *)ps_memtab->pv_base;
2133
        /* increment the memtabs */
2134
221
        ps_memtab++;
2135
2136
        /* TU enc loop Frame level  */
2137
221
        ps_tu = (tu_enc_loop_out_t *)ps_memtab->pv_base;
2138
        /* increment the memtabs */
2139
221
        ps_memtab++;
2140
2141
        /* PU enc loop Frame level  */
2142
221
        ps_pu = (pu_t *)ps_memtab->pv_base;
2143
        /* increment the memtabs */
2144
221
        ps_memtab++;
2145
2146
        /* Coeffs Frame level  */
2147
221
        pu1_coeffs = (UWORD8 *)ps_memtab->pv_base;
2148
        /* increment the memtabs */
2149
221
        ps_memtab++;
2150
2151
221
#ifndef DISABLE_SEI
2152
        /* CC User Data  */
2153
221
        UWORD8 *pu1_sei_payload;
2154
221
        pu1_sei_payload = (UWORD8 *)ps_memtab->pv_base;
2155
221
        ps_memtab++;
2156
221
#endif
2157
2158
221
        num_ctb_in_frm = num_ctb_horz * num_ctb_vert;
2159
2160
        /* calculate the coeff size */
2161
221
        coeff_size =
2162
221
            num_ctb_horz * ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
2163
221
                                ? (num_tu_in_ctb << 1)
2164
221
                                : ((num_tu_in_ctb * 3) >> 1));
2165
221
        coeff_size = coeff_size * num_ctb_vert * MAX_SCAN_COEFFS_BYTES_4x4;
2166
        /* loop to initialise all the memories */
2167
442
        for(ctr = 0; ctr < NUM_FRMPROC_ENTCOD_BUFS; ctr++)
2168
221
        {
2169
221
            pps_frm_proc_ent_cod_bufs[i][ctr] = ps_frmp_ent_bufs;
2170
2171
221
            ps_frmp_ent_bufs->ps_frm_ctb_data = ps_ctb;
2172
221
            ps_frmp_ent_bufs->ps_frm_cu_data = ps_cu;
2173
221
            ps_frmp_ent_bufs->ps_frm_pu_data = ps_pu;
2174
221
            ps_frmp_ent_bufs->ps_frm_tu_data = ps_tu;
2175
221
            ps_frmp_ent_bufs->pv_coeff_data = pu1_coeffs;
2176
2177
            /* memset the slice headers and buffer to keep track */
2178
221
            memset(&ps_frmp_ent_bufs->s_slice_hdr, 0, sizeof(slice_header_t));
2179
2180
            /*PIC_INFO*/
2181
221
            memset(&ps_frmp_ent_bufs->s_pic_level_info, 0, sizeof(s_pic_level_acc_info_t));
2182
2183
221
            ps_ctb += num_ctb_in_frm;
2184
221
            ps_cu += num_ctb_in_frm * num_cu_in_ctb;
2185
221
            ps_pu += num_ctb_in_frm * num_pu_in_ctb;
2186
221
            ps_tu += num_ctb_in_frm * num_tu_in_ctb;
2187
2188
221
            pu1_coeffs += coeff_size;
2189
2190
221
#ifndef DISABLE_SEI
2191
2.43k
            for(WORD32 num_sei = 0; num_sei < MAX_NUMBER_OF_SEI_PAYLOAD; num_sei++)
2192
2.21k
            {
2193
2.21k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].pu1_sei_payload = pu1_sei_payload;
2194
2.21k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].u4_payload_type = 0;
2195
2.21k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].u4_payload_length = 0;
2196
2.21k
                pu1_sei_payload += MAX_SEI_PAYLOAD_PER_TLV;
2197
2.21k
            }
2198
2199
221
#endif
2200
221
            ps_frmp_ent_bufs++;
2201
221
        }
2202
221
    }
2203
2204
    /* Working memory for encoder */
2205
221
    ps_enc_ctxt->pu1_frm_lvl_wkg_mem = (UWORD8 *)ps_memtab->pv_base;
2206
221
    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
221
    ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[0] = (job_queue_t *)ps_memtab->pv_base;
2217
442
    for(ctr = 1; ctr < max_delay_preenc_l0_que; ctr++)
2218
221
    {
2219
221
        ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[ctr] =
2220
221
            ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[0] +
2221
221
            (MAX_NUM_VERT_UNITS_FRM * NUM_PRE_ENC_JOBS_QUES * ctr);
2222
221
    }
2223
221
    ps_memtab++;
2224
2225
    /* -----Frameproc Entcod Que mem_init --- */
2226
    /* init ptrs for each bit-rate */
2227
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
2228
221
    {
2229
221
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_FRM_PRS_ENT_COD_Q + i] = ihevce_buff_que_init(
2230
221
            ps_memtab, NUM_FRMPROC_ENTCOD_BUFS, (void **)pps_frm_proc_ent_cod_bufs[i]);
2231
221
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2232
221
    }
2233
    /*mrs*/
2234
    /* ----Encoder owned input buffer queue init----*/
2235
221
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_ENC_INPUT_Q] =
2236
221
        ihevce_buff_que_init(ps_memtab, num_input_buf_per_queue, (void **)pps_lap_enc_input_bufs);
2237
221
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2238
2239
    /* -----Pre-Encode / Encode Que mem_init --- */
2240
221
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_PRE_ENC_ME_Q] =
2241
221
        ihevce_buff_que_init(ps_memtab, num_bufs_preenc_me_que, (void **)pps_pre_enc_bufs);
2242
2243
221
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2244
2245
    /* -----ME / Enc-RD opt Que mem_init --- */
2246
221
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_ME_ENC_RDOPT_Q] =
2247
221
        ihevce_buff_que_init(ps_memtab, NUM_ME_ENC_BUFS, (void **)pps_me_enc_bufs);
2248
2249
221
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2250
2251
    /* -----Pre-Encode L0 IPE to enc queue --- */
2252
221
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_L0_IPE_ENC_Q] =
2253
221
        ihevce_buff_que_init(ps_memtab, num_bufs_L0_ipe_enc, (void **)pps_L0_ipe_enc_bufs);
2254
2255
221
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2256
2257
    /* ---------- Dependency Manager allocations -------- */
2258
221
    {
2259
221
        osal_sem_attr_t attr = OSAL_DEFAULT_SEM_ATTR;
2260
221
        WORD32 i1_is_sem_enabled;
2261
2262
221
        if(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
2263
221
               .i4_quality_preset >= IHEVCE_QUALITY_P4)
2264
48
        {
2265
48
            i1_is_sem_enabled = 0;
2266
48
        }
2267
173
        else
2268
173
        {
2269
173
            i1_is_sem_enabled = 1;
2270
173
        }
2271
2272
        /* allocate semaphores for all the threads in pre-enc and enc */
2273
442
        for(ctr = 0; ctr < ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds; ctr++)
2274
221
        {
2275
221
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle[ctr] =
2276
221
                osal_sem_create(ps_intrf_ctxt->pv_osal_handle, &attr);
2277
221
            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
221
        }
2283
2284
442
        for(ctr = 0; ctr < ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds; ctr++)
2285
221
        {
2286
221
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle[ctr] =
2287
221
                osal_sem_create(ps_intrf_ctxt->pv_osal_handle, &attr);
2288
221
            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
221
        }
2294
2295
        /* --- ME-EncLoop Dep Mngr Row-Row Init -- */
2296
442
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
2297
221
        {
2298
221
            me_enc_rdopt_ctxt_t *ps_me_enc_bufs = pps_me_enc_bufs[ctr];
2299
2300
221
            ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me = ihevce_dmgr_init(
2301
221
                ps_memtab,
2302
221
                ps_intrf_ctxt->pv_osal_handle,
2303
221
                DEP_MNGR_ROW_ROW_SYNC,
2304
221
                (a_ctb_align_ht[0] / ctb_size),
2305
221
                (a_ctb_align_wd[0] / ctb_size),
2306
221
                ps_enc_ctxt->ps_tile_params_base->i4_num_tile_cols, /* Number of Col Tiles */
2307
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2308
221
                i1_is_sem_enabled /*Sem Disabled/Enabled*/
2309
221
            );
2310
221
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2311
2312
            /* Register Enc group semaphore handles */
2313
221
            ihevce_dmgr_reg_sem_hdls(
2314
221
                ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me,
2315
221
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2316
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2317
2318
            /* Register the handle in multithread ctxt also for free purpose */
2319
221
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_encloop_dep_me[ctr] =
2320
221
                ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me;
2321
221
        }
2322
2323
442
        for(ctr = 0; ctr < i4_num_enc_loop_frm_pllel; ctr++)
2324
221
        {
2325
            /* --- Prev. frame EncLoop Done Dep Mngr Frm-Frm Mem Init -- */
2326
221
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_done[ctr] = ihevce_dmgr_init(
2327
221
                ps_memtab,
2328
221
                ps_intrf_ctxt->pv_osal_handle,
2329
221
                DEP_MNGR_FRM_FRM_SYNC,
2330
221
                (a_ctb_align_ht[0] / ctb_size),
2331
221
                (a_ctb_align_wd[0] / ctb_size),
2332
221
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
2333
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2334
221
                1 /*Sem Enabled*/
2335
221
            );
2336
221
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2337
2338
            /* Register Enc group semaphore handles */
2339
221
            ihevce_dmgr_reg_sem_hdls(
2340
221
                ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_done[ctr],
2341
221
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2342
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2343
221
        }
2344
        /* --- Prev. frame EncLoop Done Dep Mngr  for re-encode  Frm-Frm Mem Init -- */
2345
221
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_enc_done_for_reenc = ihevce_dmgr_init(
2346
221
            ps_memtab,
2347
221
            ps_intrf_ctxt->pv_osal_handle,
2348
221
            DEP_MNGR_FRM_FRM_SYNC,
2349
221
            (a_ctb_align_ht[0] / ctb_size),
2350
221
            (a_ctb_align_wd[0] / ctb_size),
2351
221
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2352
221
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2353
221
            1 /*Sem Enabled*/
2354
221
        );
2355
221
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2356
2357
        /* Register Enc group semaphore handles */
2358
221
        ihevce_dmgr_reg_sem_hdls(
2359
221
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_enc_done_for_reenc,
2360
221
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2361
221
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2362
442
        for(ctr = 0; ctr < i4_num_me_frm_pllel; ctr++)
2363
221
        {
2364
            /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem Init -- */
2365
221
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_me_done[ctr] = ihevce_dmgr_init(
2366
221
                ps_memtab,
2367
221
                ps_intrf_ctxt->pv_osal_handle,
2368
221
                DEP_MNGR_FRM_FRM_SYNC,
2369
221
                (a_ctb_align_ht[0] / ctb_size),
2370
221
                (a_ctb_align_wd[0] / ctb_size),
2371
221
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
2372
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2373
221
                1 /*Sem Enabled*/
2374
221
            );
2375
221
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2376
2377
            /* Register Enc group semaphore handles */
2378
221
            ihevce_dmgr_reg_sem_hdls(
2379
221
                ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_me_done[ctr],
2380
221
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2381
221
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2382
221
        }
2383
        /* --- Prev. frame PreEnc L1 Done Dep Mngr Frm-Frm Mem Init -- */
2384
221
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l1 = ihevce_dmgr_init(
2385
221
            ps_memtab,
2386
221
            ps_intrf_ctxt->pv_osal_handle,
2387
221
            DEP_MNGR_FRM_FRM_SYNC,
2388
221
            (a_ctb_align_ht[0] / ctb_size),
2389
221
            (a_ctb_align_wd[0] / ctb_size),
2390
221
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2391
221
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2392
221
            1 /*Sem Enabled*/
2393
221
        );
2394
221
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2395
2396
        /* Register Pre-Enc group semaphore handles */
2397
221
        ihevce_dmgr_reg_sem_hdls(
2398
221
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l1,
2399
221
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2400
221
            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
221
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_coarse_me = ihevce_dmgr_init(
2404
221
            ps_memtab,
2405
221
            ps_intrf_ctxt->pv_osal_handle,
2406
221
            DEP_MNGR_FRM_FRM_SYNC,
2407
221
            (a_ctb_align_ht[0] / ctb_size),
2408
221
            (a_ctb_align_wd[0] / ctb_size),
2409
221
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2410
221
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2411
221
            1 /*Sem Enabled*/
2412
221
        );
2413
221
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2414
2415
        /* Register Pre-Enc group semaphore handles */
2416
221
        ihevce_dmgr_reg_sem_hdls(
2417
221
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_coarse_me,
2418
221
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2419
221
            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
221
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l0 = ihevce_dmgr_init(
2423
221
            ps_memtab,
2424
221
            ps_intrf_ctxt->pv_osal_handle,
2425
221
            DEP_MNGR_FRM_FRM_SYNC,
2426
221
            (a_ctb_align_ht[0] / ctb_size),
2427
221
            (a_ctb_align_wd[0] / ctb_size),
2428
221
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2429
221
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2430
221
            1 /*Sem Enabled*/
2431
221
        );
2432
221
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2433
2434
        /* Register Pre-Enc group semaphore handles */
2435
221
        ihevce_dmgr_reg_sem_hdls(
2436
221
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l0,
2437
221
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2438
221
            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.32k
        for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
2442
1.10k
        {
2443
1.10k
            WORD32 ai4_tile_xtra_ctb[4] = { 0 };
2444
2445
1.10k
            ps_enc_ctxt->pps_recon_buf_q[0][ctr]->pv_dep_mngr_recon = ihevce_dmgr_map_init(
2446
1.10k
                ps_memtab,
2447
1.10k
                num_ctb_vert,
2448
1.10k
                num_ctb_horz,
2449
1.10k
                i1_is_sem_enabled, /*Sem Disabled/Enabled*/
2450
1.10k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2451
1.10k
                ai4_tile_xtra_ctb);
2452
2453
1.10k
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2454
2455
            /* Register Enc group semaphore handles */
2456
1.10k
            ihevce_dmgr_reg_sem_hdls(
2457
1.10k
                ps_enc_ctxt->pps_recon_buf_q[0][ctr]->pv_dep_mngr_recon,
2458
1.10k
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2459
1.10k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2460
1.10k
        }
2461
2462
        /* ------ Module level register semaphores -------- */
2463
221
        ihevce_coarse_me_reg_thrds_sem(
2464
221
            ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
2465
221
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2466
221
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2467
2468
221
        ihevce_enc_loop_reg_sem_hdls(
2469
221
            ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt,
2470
221
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2471
221
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2472
221
    }
2473
2474
    /* copy the run time source parameters from create time prms */
2475
0
    memcpy(
2476
221
        &ps_enc_ctxt->s_runtime_src_prms,
2477
221
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
2478
221
        sizeof(ihevce_src_params_t));
2479
2480
221
    memcpy(
2481
221
        &ps_enc_ctxt->s_runtime_tgt_params,
2482
221
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
2483
221
        sizeof(ihevce_tgt_params_t));
2484
2485
    /* copy the run time coding parameters from create time prms */
2486
221
    memcpy(
2487
221
        &ps_enc_ctxt->s_runtime_coding_prms,
2488
221
        &ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms,
2489
221
        sizeof(ihevce_coding_params_t));
2490
2491
    /*change in run time parameter*/
2492
221
    if(ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
2493
221
    {
2494
221
        ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames = (DEFAULT_MAX_REFERENCE_PICS)
2495
221
                                                                     << i4_field_pic;
2496
2497
221
        ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
2498
221
            ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
2499
221
    }
2500
2501
    /* populate the frame level ctb parameters based on run time params */
2502
221
    ihevce_set_pre_enc_prms(ps_enc_ctxt);
2503
2504
221
    return;
2505
221
}
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
221
{
2534
    /* local variables */
2535
221
    WORD32 total_memtabs_req = 0;
2536
221
    WORD32 total_memtabs_used = 0;
2537
221
    WORD32 ctr;
2538
221
    iv_mem_rec_t *ps_memtab;
2539
221
    WORD32 i;  //counter variable
2540
221
    iv_output_data_buffs_desc_t *ps_out_desc;
2541
221
    iv_recon_data_buffs_desc_t *ps_rec_desc;
2542
221
    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
221
    enc_ctxt_t *ps_enc_ctxt_base = (enc_ctxt_t *)ps_hle_ctxt->apv_enc_hdl[0];
2545
2546
221
    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
221
    if(0 == ps_enc_ctxt->i4_resolution_id)
2555
221
    {
2556
        /* array of pointers for input */
2557
221
        total_memtabs_req++;
2558
2559
        /* pointers for input desc */
2560
221
        total_memtabs_req++;
2561
2562
        /* que manager buffer requirements */
2563
221
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2564
2565
        /* ------ Input Control Que memtab ----- */
2566
        /* array of pointers for input control */
2567
221
        total_memtabs_req++;
2568
2569
        /* pointers for input control desc */
2570
221
        total_memtabs_req++;
2571
2572
        /* que manager buffer requirements */
2573
221
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2574
221
    }
2575
2576
    /* ------ Output Data Que Memtab -------- */
2577
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
2578
221
    {
2579
        /* array of pointers for output */
2580
221
        total_memtabs_req++;
2581
2582
        /* pointers for output desc */
2583
221
        total_memtabs_req++;
2584
2585
        /* que manager buffer requirements */
2586
221
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2587
221
    }
2588
2589
    /* ------ Recon Data Que Memtab -------- */
2590
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
2591
221
    {
2592
221
        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
221
    }
2604
2605
    /* ----- allocate memomry for memtabs --- */
2606
221
    {
2607
221
        iv_mem_rec_t s_memtab;
2608
2609
221
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
2610
221
        s_memtab.i4_mem_size = total_memtabs_req * sizeof(iv_mem_rec_t);
2611
221
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2612
221
        s_memtab.i4_mem_alignment = 4;
2613
2614
221
        ps_hle_ctxt->ihevce_mem_alloc(
2615
221
            ps_hle_ctxt->pv_mem_mgr_hdl, &ps_hle_ctxt->ps_static_cfg_prms->s_sys_api, &s_memtab);
2616
221
        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
221
        ps_memtab = (iv_mem_rec_t *)s_memtab.pv_base;
2622
221
    }
2623
2624
    /* --------------------------------------------------------------------- */
2625
    /* ------------------  Collating memory requirements ------------------- */
2626
    /* --------------------------------------------------------------------- */
2627
221
    if(0 == ps_enc_ctxt->i4_resolution_id)
2628
221
    {
2629
        /* ------ Input Data Que memory requests -------- */
2630
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2631
2632
221
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2633
2634
221
        ps_memtab[total_memtabs_used].i4_mem_size =
2635
221
            ((ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs) * (sizeof(ihevce_lap_enc_buf_t *)));
2636
2637
        /* increment the memtab counter */
2638
221
        total_memtabs_used++;
2639
2640
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2641
2642
221
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2643
2644
221
        ps_memtab[total_memtabs_used].i4_mem_size =
2645
221
            ((ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs) * (sizeof(ihevce_lap_enc_buf_t)));
2646
2647
        /* increment the memtab counter */
2648
221
        total_memtabs_used++;
2649
2650
        /* call the Que manager get mem recs */
2651
221
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2652
221
            &ps_memtab[total_memtabs_used],
2653
221
            ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs,
2654
221
            IV_EXT_CACHEABLE_NORMAL_MEM);
2655
2656
        /* ------ Input Control Que memory requests -------- */
2657
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2658
2659
221
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2660
2661
221
        ps_memtab[total_memtabs_used].i4_mem_size =
2662
221
            ((ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs) *
2663
221
             (sizeof(iv_input_ctrl_buffs_t *)));
2664
2665
        /* increment the memtab counter */
2666
221
        total_memtabs_used++;
2667
2668
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2669
2670
221
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2671
2672
221
        ps_memtab[total_memtabs_used].i4_mem_size =
2673
221
            ((ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs) *
2674
221
             (sizeof(iv_input_ctrl_buffs_t)));
2675
2676
        /* increment the memtab counter */
2677
221
        total_memtabs_used++;
2678
2679
        /* call the Que manager get mem recs */
2680
221
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2681
221
            &ps_memtab[total_memtabs_used],
2682
221
            ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs,
2683
221
            IV_EXT_CACHEABLE_NORMAL_MEM);
2684
221
    }
2685
2686
    /* ------ Output data Que memory requests -------- */
2687
221
    ps_out_desc = ps_output_data_buffs_desc;
2688
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
2689
221
    {
2690
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2691
2692
221
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2693
2694
221
        ps_memtab[total_memtabs_used].i4_mem_size =
2695
221
            ((ps_out_desc->i4_num_bitstream_bufs) * (sizeof(iv_output_data_buffs_t *)));
2696
2697
        /* increment the memtab counter */
2698
221
        total_memtabs_used++;
2699
2700
221
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2701
2702
221
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2703
2704
221
        ps_memtab[total_memtabs_used].i4_mem_size =
2705
221
            ((ps_out_desc->i4_num_bitstream_bufs) * (sizeof(iv_output_data_buffs_t)));
2706
2707
        /* increment the memtab counter */
2708
221
        total_memtabs_used++;
2709
2710
        /* call the Que manager get mem recs */
2711
221
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2712
221
            &ps_memtab[total_memtabs_used],
2713
221
            ps_out_desc->i4_num_bitstream_bufs,
2714
221
            IV_EXT_CACHEABLE_NORMAL_MEM);
2715
221
        ps_out_desc++;
2716
221
    }
2717
2718
    //recon_dump
2719
    /* ------ Recon Data Que memory requests -------- */
2720
221
    ps_rec_desc = ps_recon_data_buffs_desc;
2721
221
    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
221
    ASSERT(total_memtabs_req == total_memtabs_used);
2760
4.86k
    for(ctr = 0; ctr < total_memtabs_used; ctr++)
2761
4.64k
    {
2762
4.64k
        UWORD8 *pu1_mem = NULL;
2763
4.64k
        ps_hle_ctxt->ihevce_mem_alloc(
2764
4.64k
            ps_hle_ctxt->pv_mem_mgr_hdl,
2765
4.64k
            &ps_hle_ctxt->ps_static_cfg_prms->s_sys_api,
2766
4.64k
            &ps_memtab[ctr]);
2767
2768
4.64k
        pu1_mem = (UWORD8 *)ps_memtab[ctr].pv_base;
2769
2770
4.64k
        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.64k
    }
2776
2777
    /* store the final allocated memtabs */
2778
221
    ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs = total_memtabs_used;
2779
221
    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
221
    if(0 == ps_enc_ctxt->i4_resolution_id)
2787
221
    {
2788
221
        ihevce_lap_enc_buf_t **pps_inp_bufs;
2789
221
        ihevce_lap_enc_buf_t *ps_inp_bufs;
2790
2791
221
        pps_inp_bufs = (ihevce_lap_enc_buf_t **)ps_memtab->pv_base;
2792
221
        ps_memtab++;
2793
2794
221
        ps_inp_bufs = (ihevce_lap_enc_buf_t *)ps_memtab->pv_base;
2795
221
        ps_memtab++;
2796
2797
        /* loop to initialise the buffer pointer */
2798
702
        for(ctr = 0; ctr < ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs; ctr++)
2799
481
        {
2800
481
            pps_inp_bufs[ctr] = &ps_inp_bufs[ctr];
2801
2802
481
            pps_inp_bufs[ctr]->s_input_buf.i4_size = sizeof(iv_input_data_ctrl_buffs_t);
2803
2804
481
            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
481
            if(ps_hle_ctxt->i4_create_time_input_allocation == 1)
2808
481
            {
2809
481
                pps_inp_bufs[ctr]->s_input_buf.pv_synch_ctrl_bufs =
2810
481
                    ps_input_data_ctrl_buffs_desc->ppv_synch_ctrl_bufs[ctr];
2811
2812
481
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_y_buf =
2813
481
                    ps_input_data_ctrl_buffs_desc->ppv_y_buf[ctr];
2814
2815
481
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_u_buf =
2816
481
                    ps_input_data_ctrl_buffs_desc->ppv_u_buf[ctr];
2817
2818
481
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_v_buf =
2819
481
                    ps_input_data_ctrl_buffs_desc->ppv_v_buf[ctr];
2820
481
            }
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
481
        }
2832
2833
        /* Get the input data buffer Q handle */
2834
221
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_DATA_CTRL_Q] = ihevce_buff_que_init(
2835
221
            ps_memtab, ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs, (void **)pps_inp_bufs);
2836
2837
        /* increment the memtab pointer */
2838
221
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2839
221
    }
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
221
    if(0 == ps_enc_ctxt->i4_resolution_id)
2849
221
    {
2850
221
        iv_input_ctrl_buffs_t **pps_inp_bufs;
2851
221
        iv_input_ctrl_buffs_t *ps_inp_bufs;
2852
2853
221
        pps_inp_bufs = (iv_input_ctrl_buffs_t **)ps_memtab->pv_base;
2854
221
        ps_memtab++;
2855
2856
221
        ps_inp_bufs = (iv_input_ctrl_buffs_t *)ps_memtab->pv_base;
2857
221
        ps_memtab++;
2858
2859
        /* loop to initialise the buffer pointer */
2860
1.10k
        for(ctr = 0; ctr < ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs; ctr++)
2861
884
        {
2862
884
            pps_inp_bufs[ctr] = &ps_inp_bufs[ctr];
2863
2864
884
            pps_inp_bufs[ctr]->i4_size = sizeof(iv_input_ctrl_buffs_t);
2865
2866
884
            pps_inp_bufs[ctr]->pv_asynch_ctrl_bufs =
2867
884
                ps_input_asynch_ctrl_buffs_desc->ppv_asynch_ctrl_bufs[ctr];
2868
884
        }
2869
2870
        /* Get the input control buffer Q handle */
2871
221
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_ASYNCH_CTRL_Q] = ihevce_buff_que_init(
2872
221
            ps_memtab,
2873
221
            ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs,
2874
221
            (void **)pps_inp_bufs);
2875
2876
        /* increment the memtab pointer */
2877
221
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2878
221
    }
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
221
    ps_out_desc = ps_output_data_buffs_desc;
2888
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
2889
221
    {
2890
221
        iv_output_data_buffs_t **pps_out_bufs;
2891
221
        iv_output_data_buffs_t *ps_out_bufs;
2892
2893
221
        pps_out_bufs = (iv_output_data_buffs_t **)ps_memtab->pv_base;
2894
221
        ps_memtab++;
2895
2896
221
        ps_out_bufs = (iv_output_data_buffs_t *)ps_memtab->pv_base;
2897
221
        ps_memtab++;
2898
2899
        /* loop to initialise the buffer pointer */
2900
1.10k
        for(ctr = 0; ctr < ps_out_desc->i4_num_bitstream_bufs; ctr++)
2901
884
        {
2902
884
            pps_out_bufs[ctr] = &ps_out_bufs[ctr];
2903
2904
884
            pps_out_bufs[ctr]->i4_size = sizeof(iv_output_data_buffs_t);
2905
2906
884
            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
884
            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
884
            else
2914
884
            {
2915
884
                pps_out_bufs[ctr]->pv_bitstream_bufs = NULL;
2916
884
            }
2917
884
        }
2918
2919
        /* Get the output data buffer Q handle */
2920
221
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_OUTPUT_DATA_Q + i] = ihevce_buff_que_init(
2921
221
            ps_memtab, ps_out_desc->i4_num_bitstream_bufs, (void **)pps_out_bufs);
2922
2923
        /* increment the memtab pointer */
2924
221
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2925
2926
221
        ps_out_desc++;
2927
221
    }
2928
2929
    /* ----------Recon data Que Mem init --------------- */
2930
221
    ps_rec_desc = ps_recon_data_buffs_desc;
2931
442
    for(i = 0; i < i4_num_bitrate_inst; i++)
2932
221
    {
2933
221
        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
221
        else
2968
221
        {
2969
221
            ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_RECON_DATA_Q + i] = NULL;
2970
221
        }
2971
221
    }
2972
2973
221
    return;
2974
221
}
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
221
{
2995
221
    WORD32 ctr;
2996
2997
    /* run a loop to free all the memory allocated create time */
2998
194k
    for(ctr = 0; ctr < ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs; ctr++)
2999
194k
    {
3000
194k
        ps_intrf_ctxt->ihevce_mem_free(
3001
194k
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->s_mem_mngr.ps_create_memtab[ctr]);
3002
194k
    }
3003
3004
    /* free the memtab memory */
3005
221
    {
3006
221
        iv_mem_rec_t s_memtab;
3007
3008
221
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
3009
221
        s_memtab.i4_mem_size = ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs * sizeof(iv_mem_rec_t);
3010
221
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
3011
221
        s_memtab.i4_mem_alignment = 4;
3012
221
        s_memtab.pv_base = (void *)ps_enc_ctxt->s_mem_mngr.ps_create_memtab;
3013
3014
221
        ps_intrf_ctxt->ihevce_mem_free(ps_intrf_ctxt->pv_mem_mgr_hdl, &s_memtab);
3015
221
    }
3016
3017
221
    if(1 == ps_enc_ctxt->i4_io_queues_created)
3018
221
    {
3019
        /* run a loop to free all the memory allocated durign que creation */
3020
4.86k
        for(ctr = 0; ctr < ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs; ctr++)
3021
4.64k
        {
3022
4.64k
            ps_intrf_ctxt->ihevce_mem_free(
3023
4.64k
                ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->s_mem_mngr.ps_q_memtab[ctr]);
3024
4.64k
        }
3025
3026
        /* free the  memtab memory */
3027
221
        {
3028
221
            iv_mem_rec_t s_memtab;
3029
3030
221
            s_memtab.i4_size = sizeof(iv_mem_rec_t);
3031
221
            s_memtab.i4_mem_size = ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs * sizeof(iv_mem_rec_t);
3032
221
            s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
3033
221
            s_memtab.i4_mem_alignment = 4;
3034
221
            s_memtab.pv_base = (void *)ps_enc_ctxt->s_mem_mngr.ps_q_memtab;
3035
3036
221
            ps_intrf_ctxt->ihevce_mem_free(ps_intrf_ctxt->pv_mem_mgr_hdl, &s_memtab);
3037
221
        }
3038
221
    }
3039
221
    return;
3040
221
}