Coverage Report

Created: 2026-09-14 06:39

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