1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker ******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker * ih264e_rc_mem_interface.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * This file contains api function definitions for rate control memtabs
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker * ittiam
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * List of Functions
33*495ae853SAndroid Build Coastguard Worker * - ih264e_map_rc_mem_recs_to_itt_api
34*495ae853SAndroid Build Coastguard Worker * - ih264e_map_itt_mem_rec_to_rc_mem_rec
35*495ae853SAndroid Build Coastguard Worker * - ih264e_get_rate_control_mem_tab
36*495ae853SAndroid Build Coastguard Worker *
37*495ae853SAndroid Build Coastguard Worker * @remarks
38*495ae853SAndroid Build Coastguard Worker * none
39*495ae853SAndroid Build Coastguard Worker *
40*495ae853SAndroid Build Coastguard Worker *******************************************************************************
41*495ae853SAndroid Build Coastguard Worker */
42*495ae853SAndroid Build Coastguard Worker
43*495ae853SAndroid Build Coastguard Worker
44*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
45*495ae853SAndroid Build Coastguard Worker /* File Includes */
46*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
47*495ae853SAndroid Build Coastguard Worker
48*495ae853SAndroid Build Coastguard Worker /* System Include Files */
49*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
50*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
51*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
52*495ae853SAndroid Build Coastguard Worker #include <string.h>
53*495ae853SAndroid Build Coastguard Worker #include <assert.h>
54*495ae853SAndroid Build Coastguard Worker
55*495ae853SAndroid Build Coastguard Worker /* User Include Files */
56*495ae853SAndroid Build Coastguard Worker #include "ih264e_config.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
58*495ae853SAndroid Build Coastguard Worker
59*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264_mem_fns.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264_padding.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
64*495ae853SAndroid Build Coastguard Worker #include "ih264_size_defs.h"
65*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264_inter_pred_filters.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264_intra_pred_filters.h"
68*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
69*495ae853SAndroid Build Coastguard Worker #include "ih264_cabac_tables.h"
70*495ae853SAndroid Build Coastguard Worker
71*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
72*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
73*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
74*495ae853SAndroid Build Coastguard Worker
75*495ae853SAndroid Build Coastguard Worker #include "irc_mem_req_and_acq.h"
76*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
77*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
78*495ae853SAndroid Build Coastguard Worker #include "irc_rate_control_api.h"
79*495ae853SAndroid Build Coastguard Worker #include "irc_common.h"
80*495ae853SAndroid Build Coastguard Worker #include "irc_rd_model.h"
81*495ae853SAndroid Build Coastguard Worker #include "irc_est_sad.h"
82*495ae853SAndroid Build Coastguard Worker #include "irc_fixed_point_error_bits.h"
83*495ae853SAndroid Build Coastguard Worker #include "irc_vbr_storage_vbv.h"
84*495ae853SAndroid Build Coastguard Worker #include "irc_picture_type.h"
85*495ae853SAndroid Build Coastguard Worker #include "irc_bit_allocation.h"
86*495ae853SAndroid Build Coastguard Worker #include "irc_mb_model_based.h"
87*495ae853SAndroid Build Coastguard Worker #include "irc_cbr_buffer_control.h"
88*495ae853SAndroid Build Coastguard Worker #include "irc_vbr_str_prms.h"
89*495ae853SAndroid Build Coastguard Worker #include "irc_rate_control_api_structs.h"
90*495ae853SAndroid Build Coastguard Worker
91*495ae853SAndroid Build Coastguard Worker #include "ih264e.h"
92*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
93*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h"
94*495ae853SAndroid Build Coastguard Worker #include "ih264e_time_stamp.h"
95*495ae853SAndroid Build Coastguard Worker #include "ih264e_modify_frm_rate.h"
96*495ae853SAndroid Build Coastguard Worker #include "ih264e_rate_control.h"
97*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
98*495ae853SAndroid Build Coastguard Worker #include "ih264e_cabac_structs.h"
99*495ae853SAndroid Build Coastguard Worker #include "ih264e_structs.h"
100*495ae853SAndroid Build Coastguard Worker
101*495ae853SAndroid Build Coastguard Worker
102*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
103*495ae853SAndroid Build Coastguard Worker /* Function Definitions */
104*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
105*495ae853SAndroid Build Coastguard Worker
106*495ae853SAndroid Build Coastguard Worker /**
107*495ae853SAndroid Build Coastguard Worker ******************************************************************************
108*495ae853SAndroid Build Coastguard Worker *
109*495ae853SAndroid Build Coastguard Worker * @brief This function maps rc mem records structure to encoder lib mem records
110*495ae853SAndroid Build Coastguard Worker * structure
111*495ae853SAndroid Build Coastguard Worker *
112*495ae853SAndroid Build Coastguard Worker * @par Description
113*495ae853SAndroid Build Coastguard Worker * This function maps rc mem records structure to encoder lib mem records
114*495ae853SAndroid Build Coastguard Worker * structure
115*495ae853SAndroid Build Coastguard Worker *
116*495ae853SAndroid Build Coastguard Worker * @param[in] ps_mem
117*495ae853SAndroid Build Coastguard Worker * pointer to encoder lib mem records
118*495ae853SAndroid Build Coastguard Worker *
119*495ae853SAndroid Build Coastguard Worker * @param[in] rc_memtab
120*495ae853SAndroid Build Coastguard Worker * pointer to rc mem records
121*495ae853SAndroid Build Coastguard Worker *
122*495ae853SAndroid Build Coastguard Worker * @param[in] num_mem_recs
123*495ae853SAndroid Build Coastguard Worker * number of memory records
124*495ae853SAndroid Build Coastguard Worker *
125*495ae853SAndroid Build Coastguard Worker * @return void
126*495ae853SAndroid Build Coastguard Worker *
127*495ae853SAndroid Build Coastguard Worker ******************************************************************************
128*495ae853SAndroid Build Coastguard Worker */
ih264e_map_rc_mem_recs_to_itt_api(iv_mem_rec_t * ps_mem,itt_memtab_t * rc_memtab,UWORD32 num_mem_recs)129*495ae853SAndroid Build Coastguard Worker void ih264e_map_rc_mem_recs_to_itt_api(iv_mem_rec_t *ps_mem,
130*495ae853SAndroid Build Coastguard Worker itt_memtab_t *rc_memtab,
131*495ae853SAndroid Build Coastguard Worker UWORD32 num_mem_recs)
132*495ae853SAndroid Build Coastguard Worker {
133*495ae853SAndroid Build Coastguard Worker UWORD32 j;
134*495ae853SAndroid Build Coastguard Worker UWORD32 Size, align;
135*495ae853SAndroid Build Coastguard Worker
136*495ae853SAndroid Build Coastguard Worker for (j = 0; j < num_mem_recs; j++)
137*495ae853SAndroid Build Coastguard Worker {
138*495ae853SAndroid Build Coastguard Worker Size = rc_memtab->u4_size;
139*495ae853SAndroid Build Coastguard Worker align = rc_memtab->i4_alignment;
140*495ae853SAndroid Build Coastguard Worker
141*495ae853SAndroid Build Coastguard Worker /* we always ask for external persistent cacheable memory */
142*495ae853SAndroid Build Coastguard Worker FILL_MEMTAB(ps_mem, j, Size, align, IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM);
143*495ae853SAndroid Build Coastguard Worker
144*495ae853SAndroid Build Coastguard Worker rc_memtab++;
145*495ae853SAndroid Build Coastguard Worker }
146*495ae853SAndroid Build Coastguard Worker }
147*495ae853SAndroid Build Coastguard Worker
148*495ae853SAndroid Build Coastguard Worker /**
149*495ae853SAndroid Build Coastguard Worker *******************************************************************************
150*495ae853SAndroid Build Coastguard Worker *
151*495ae853SAndroid Build Coastguard Worker * @brief This function maps encoder lib mem records structure to RC memory
152*495ae853SAndroid Build Coastguard Worker * records structure
153*495ae853SAndroid Build Coastguard Worker *
154*495ae853SAndroid Build Coastguard Worker * @par Description
155*495ae853SAndroid Build Coastguard Worker * This function maps encoder lib mem records structure to RC memory
156*495ae853SAndroid Build Coastguard Worker * records structure
157*495ae853SAndroid Build Coastguard Worker *
158*495ae853SAndroid Build Coastguard Worker * @param[in] ps_mem
159*495ae853SAndroid Build Coastguard Worker * pointer to encoder lib mem records
160*495ae853SAndroid Build Coastguard Worker *
161*495ae853SAndroid Build Coastguard Worker * @param[in] rc_memtab
162*495ae853SAndroid Build Coastguard Worker * pointer to rc mem records
163*495ae853SAndroid Build Coastguard Worker *
164*495ae853SAndroid Build Coastguard Worker * @param[in] num_mem_recs
165*495ae853SAndroid Build Coastguard Worker * Number of memory records
166*495ae853SAndroid Build Coastguard Worker
167*495ae853SAndroid Build Coastguard Worker * @returns none
168*495ae853SAndroid Build Coastguard Worker *
169*495ae853SAndroid Build Coastguard Worker * @remarks
170*495ae853SAndroid Build Coastguard Worker *
171*495ae853SAndroid Build Coastguard Worker *******************************************************************************
172*495ae853SAndroid Build Coastguard Worker */
ih264e_map_itt_mem_rec_to_rc_mem_rec(iv_mem_rec_t * ps_mem,itt_memtab_t * rc_memtab,UWORD32 num_mem_recs)173*495ae853SAndroid Build Coastguard Worker void ih264e_map_itt_mem_rec_to_rc_mem_rec(iv_mem_rec_t *ps_mem,
174*495ae853SAndroid Build Coastguard Worker itt_memtab_t *rc_memtab,
175*495ae853SAndroid Build Coastguard Worker UWORD32 num_mem_recs)
176*495ae853SAndroid Build Coastguard Worker {
177*495ae853SAndroid Build Coastguard Worker UWORD32 i;
178*495ae853SAndroid Build Coastguard Worker
179*495ae853SAndroid Build Coastguard Worker for (i = 0; i < num_mem_recs; i++)
180*495ae853SAndroid Build Coastguard Worker {
181*495ae853SAndroid Build Coastguard Worker rc_memtab->i4_alignment = ps_mem->u4_mem_alignment;
182*495ae853SAndroid Build Coastguard Worker rc_memtab->u4_size = ps_mem->u4_mem_size;
183*495ae853SAndroid Build Coastguard Worker rc_memtab->pv_base = ps_mem->pv_base;
184*495ae853SAndroid Build Coastguard Worker
185*495ae853SAndroid Build Coastguard Worker /* only DDR memory is available */
186*495ae853SAndroid Build Coastguard Worker rc_memtab->e_mem_region = DDR;
187*495ae853SAndroid Build Coastguard Worker rc_memtab->e_usage = PERSISTENT;
188*495ae853SAndroid Build Coastguard Worker
189*495ae853SAndroid Build Coastguard Worker rc_memtab++;
190*495ae853SAndroid Build Coastguard Worker ps_mem++;
191*495ae853SAndroid Build Coastguard Worker }
192*495ae853SAndroid Build Coastguard Worker }
193*495ae853SAndroid Build Coastguard Worker
194*495ae853SAndroid Build Coastguard Worker /**
195*495ae853SAndroid Build Coastguard Worker ******************************************************************************
196*495ae853SAndroid Build Coastguard Worker *
197*495ae853SAndroid Build Coastguard Worker * @brief Get/Init memtabs for rate control
198*495ae853SAndroid Build Coastguard Worker *
199*495ae853SAndroid Build Coastguard Worker * @par Description
200*495ae853SAndroid Build Coastguard Worker * This routine is used to Get/init memtabs for rate control
201*495ae853SAndroid Build Coastguard Worker *
202*495ae853SAndroid Build Coastguard Worker * @param[in] pv_rate_control
203*495ae853SAndroid Build Coastguard Worker * pointer to rate control context (handle)
204*495ae853SAndroid Build Coastguard Worker *
205*495ae853SAndroid Build Coastguard Worker * @param[in] ps_mem
206*495ae853SAndroid Build Coastguard Worker * pointer to encoder lib mem records
207*495ae853SAndroid Build Coastguard Worker *
208*495ae853SAndroid Build Coastguard Worker * @param[in] e_func_type
209*495ae853SAndroid Build Coastguard Worker * enum that dictates fill memory records or Init memory records
210*495ae853SAndroid Build Coastguard Worker *
211*495ae853SAndroid Build Coastguard Worker * @return total number of mem records
212*495ae853SAndroid Build Coastguard Worker *
213*495ae853SAndroid Build Coastguard Worker ******************************************************************************
214*495ae853SAndroid Build Coastguard Worker */
ih264e_get_rate_control_mem_tab(void * pv_rate_control,iv_mem_rec_t * ps_mem,ITT_FUNC_TYPE_E e_func_type)215*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_get_rate_control_mem_tab(void *pv_rate_control,
216*495ae853SAndroid Build Coastguard Worker iv_mem_rec_t *ps_mem,
217*495ae853SAndroid Build Coastguard Worker ITT_FUNC_TYPE_E e_func_type)
218*495ae853SAndroid Build Coastguard Worker {
219*495ae853SAndroid Build Coastguard Worker itt_memtab_t as_itt_memtab[NUM_RC_MEMTABS];
220*495ae853SAndroid Build Coastguard Worker WORD32 i4_num_memtab = 0, j = 0;
221*495ae853SAndroid Build Coastguard Worker void *refptr2[4];
222*495ae853SAndroid Build Coastguard Worker void **refptr1[4];
223*495ae853SAndroid Build Coastguard Worker rate_control_ctxt_t *ps_rate_control = pv_rate_control;
224*495ae853SAndroid Build Coastguard Worker
225*495ae853SAndroid Build Coastguard Worker for (j = 0; j < 4; j++)
226*495ae853SAndroid Build Coastguard Worker refptr1[j] = &(refptr2[j]);
227*495ae853SAndroid Build Coastguard Worker
228*495ae853SAndroid Build Coastguard Worker j = 0;
229*495ae853SAndroid Build Coastguard Worker
230*495ae853SAndroid Build Coastguard Worker if (e_func_type == USE_BASE || e_func_type == FILL_BASE)
231*495ae853SAndroid Build Coastguard Worker {
232*495ae853SAndroid Build Coastguard Worker refptr1[1] = &ps_rate_control->pps_frame_time;
233*495ae853SAndroid Build Coastguard Worker refptr1[2] = &ps_rate_control->pps_time_stamp;
234*495ae853SAndroid Build Coastguard Worker refptr1[3] = &ps_rate_control->pps_pd_frm_rate;
235*495ae853SAndroid Build Coastguard Worker refptr1[0] = &ps_rate_control->pps_rate_control_api;
236*495ae853SAndroid Build Coastguard Worker }
237*495ae853SAndroid Build Coastguard Worker
238*495ae853SAndroid Build Coastguard Worker /* Get the total number of memtabs used by Rate Controller */
239*495ae853SAndroid Build Coastguard Worker i4_num_memtab = irc_rate_control_num_fill_use_free_memtab((rate_control_api_t **)refptr1[0], NULL, GET_NUM_MEMTAB);
240*495ae853SAndroid Build Coastguard Worker /* Few extra steps during init */
241*495ae853SAndroid Build Coastguard Worker ih264e_map_itt_mem_rec_to_rc_mem_rec((&ps_mem[j]), as_itt_memtab+j, i4_num_memtab);
242*495ae853SAndroid Build Coastguard Worker /* Fill the memtabs used by Rate Controller */
243*495ae853SAndroid Build Coastguard Worker i4_num_memtab = irc_rate_control_num_fill_use_free_memtab((rate_control_api_t **)refptr1[0],as_itt_memtab+j,e_func_type);
244*495ae853SAndroid Build Coastguard Worker /* Mapping ittiam memtabs to App. memtabs */
245*495ae853SAndroid Build Coastguard Worker ih264e_map_rc_mem_recs_to_itt_api((&ps_mem[j]), as_itt_memtab+j, i4_num_memtab);
246*495ae853SAndroid Build Coastguard Worker j += i4_num_memtab;
247*495ae853SAndroid Build Coastguard Worker
248*495ae853SAndroid Build Coastguard Worker /* Get the total number of memtabs used by Frame time Module */
249*495ae853SAndroid Build Coastguard Worker i4_num_memtab = ih264e_frame_time_get_init_free_memtab((frame_time_t **)refptr1[1], NULL, GET_NUM_MEMTAB);
250*495ae853SAndroid Build Coastguard Worker /* Few extra steps during init */
251*495ae853SAndroid Build Coastguard Worker ih264e_map_itt_mem_rec_to_rc_mem_rec((&ps_mem[j]), as_itt_memtab+j, i4_num_memtab);
252*495ae853SAndroid Build Coastguard Worker /* Fill the memtabs used by Frame time Module */
253*495ae853SAndroid Build Coastguard Worker i4_num_memtab = ih264e_frame_time_get_init_free_memtab((frame_time_t **)refptr1[1], as_itt_memtab+j, e_func_type);
254*495ae853SAndroid Build Coastguard Worker /* Mapping ittiam memtabs to App. memtabs */
255*495ae853SAndroid Build Coastguard Worker ih264e_map_rc_mem_recs_to_itt_api((&ps_mem[j]), as_itt_memtab+j, i4_num_memtab);
256*495ae853SAndroid Build Coastguard Worker j += i4_num_memtab;
257*495ae853SAndroid Build Coastguard Worker
258*495ae853SAndroid Build Coastguard Worker /* Get the total number of memtabs used by Time stamp Module */
259*495ae853SAndroid Build Coastguard Worker i4_num_memtab = ih264e_time_stamp_get_init_free_memtab((time_stamp_t **)refptr1[2], NULL, GET_NUM_MEMTAB);
260*495ae853SAndroid Build Coastguard Worker /* Few extra steps during init */
261*495ae853SAndroid Build Coastguard Worker ih264e_map_itt_mem_rec_to_rc_mem_rec((&ps_mem[j]), as_itt_memtab+j, i4_num_memtab);
262*495ae853SAndroid Build Coastguard Worker /* Fill the memtabs used by Time Stamp Module */
263*495ae853SAndroid Build Coastguard Worker i4_num_memtab = ih264e_time_stamp_get_init_free_memtab((time_stamp_t **)refptr1[2], as_itt_memtab+j, e_func_type);
264*495ae853SAndroid Build Coastguard Worker /* Mapping ittiam memtabs to App. memtabs */
265*495ae853SAndroid Build Coastguard Worker ih264e_map_rc_mem_recs_to_itt_api((&ps_mem[j]), as_itt_memtab+j, i4_num_memtab);
266*495ae853SAndroid Build Coastguard Worker j += i4_num_memtab;
267*495ae853SAndroid Build Coastguard Worker
268*495ae853SAndroid Build Coastguard Worker /* Get the total number of memtabs used by Frame rate Module */
269*495ae853SAndroid Build Coastguard Worker i4_num_memtab = ih264e_pd_frm_rate_get_init_free_memtab((pd_frm_rate_t **)refptr1[3], NULL, GET_NUM_MEMTAB);
270*495ae853SAndroid Build Coastguard Worker /* Few extra steps during init */
271*495ae853SAndroid Build Coastguard Worker ih264e_map_itt_mem_rec_to_rc_mem_rec((&ps_mem[j]), as_itt_memtab+j, i4_num_memtab);
272*495ae853SAndroid Build Coastguard Worker /* Fill the memtabs used by Frame Rate Module */
273*495ae853SAndroid Build Coastguard Worker i4_num_memtab = ih264e_pd_frm_rate_get_init_free_memtab((pd_frm_rate_t **)refptr1[3], as_itt_memtab+j, e_func_type);
274*495ae853SAndroid Build Coastguard Worker /* Mapping ittiam memtabs to App. memtabs */
275*495ae853SAndroid Build Coastguard Worker ih264e_map_rc_mem_recs_to_itt_api((&ps_mem[j]), as_itt_memtab+j, i4_num_memtab);
276*495ae853SAndroid Build Coastguard Worker j += i4_num_memtab;
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker return j; /* Total MemTabs Needed by Rate Control Module */
279*495ae853SAndroid Build Coastguard Worker }
280