Coverage Report

Created: 2026-07-16 07:11

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