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