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_api.c
25 *
26 * @brief
27 * Contains api function definitions for H264 encoder
28 *
29 * @author
30 * ittiam
31 *
32 * @par List of Functions:
33 * - api_check_struct_sanity()
34 * - ih264e_codec_update_config()
35 * - ih264e_set_default_params()
36 * - ih264e_init()
37 * - ih264e_get_num_rec()
38 * - ih264e_fill_num_mem_rec()
39 * - ih264e_init_mem_rec()
40 * - ih264e_retrieve_memrec()
41 * - ih264e_set_flush_mode()
42 * - ih264e_get_buf_info()
43 * - ih264e_set_dimensions()
44 * - ih264e_set_frame_rate()
45 * - ih264e_set_bit_rate()
46 * - ih264e_set_frame_type()
47 * - ih264e_set_qp()
48 * - ih264e_set_enc_mode()
49 * - ih264e_set_vbv_params()
50 * - ih264_set_air_params()
51 * - ih264_set_me_params()
52 * - ih264_set_ipe_params()
53 * - ih264_set_gop_params()
54 * - ih264_set_profile_params()
55 * - ih264_set_deblock_params()
56 * - ih264e_set_num_cores()
57 * - ih264e_reset()
58 * - ih264e_ctl()
59 * - ih264e_api_function()
60 *
61 * @remarks
62 * None
63 *
64 *******************************************************************************
65 */
66
67 /*****************************************************************************/
68 /* File Includes */
69 /*****************************************************************************/
70
71 /* System Include Files */
72 #include <stdio.h>
73 #include <stddef.h>
74 #include <stdlib.h>
75 #include <string.h>
76 #include <assert.h>
77
78 /* User Include Files */
79 #include "ih264e_config.h"
80 #include "ih264_typedefs.h"
81 #include "ih264_size_defs.h"
82 #include "iv2.h"
83 #include "ive2.h"
84 #include "ih264e.h"
85 #include "ithread.h"
86 #include "ih264_debug.h"
87 #include "ih264_defs.h"
88 #include "ih264_error.h"
89 #include "ih264_structs.h"
90 #include "ih264_trans_quant_itrans_iquant.h"
91 #include "ih264_inter_pred_filters.h"
92 #include "ih264_mem_fns.h"
93 #include "ih264_padding.h"
94 #include "ih264_intra_pred_filters.h"
95 #include "ih264_deblk_edge_filters.h"
96 #include "ih264_cabac_tables.h"
97 #include "ih264_macros.h"
98 #include "ih264e_defs.h"
99 #include "ih264e_globals.h"
100 #include "ih264_buf_mgr.h"
101 #include "irc_mem_req_and_acq.h"
102 #include "irc_cntrl_param.h"
103 #include "irc_frame_info_collector.h"
104 #include "irc_rate_control_api.h"
105 #include "ih264e_time_stamp.h"
106 #include "ih264e_modify_frm_rate.h"
107 #include "ih264e_rate_control.h"
108 #include "ih264e_error.h"
109 #include "ih264e_bitstream.h"
110 #include "ime_defs.h"
111 #include "ime_distortion_metrics.h"
112 #include "ime_structs.h"
113 #include "ih264e_cabac_structs.h"
114 #include "ih264e_structs.h"
115 #include "ih264e_utils.h"
116 #include "ih264e_core_coding.h"
117 #include "ih264_platform_macros.h"
118 #include "ih264e_platform_macros.h"
119 #include "ih264_list.h"
120 #include "ih264_dpb_mgr.h"
121 #include "ih264_cavlc_tables.h"
122 #include "ih264e_cavlc.h"
123 #include "ih264_common_tables.h"
124 #include "ih264e_master.h"
125 #include "ih264e_fmt_conv.h"
126 #include "ih264e_version.h"
127
128
129 /*****************************************************************************/
130 /* Function Declarations */
131 /*****************************************************************************/
132 WORD32 ih264e_get_rate_control_mem_tab(void *pv_rate_control,
133 iv_mem_rec_t *ps_mem,
134 ITT_FUNC_TYPE_E e_func_type);
135
136
137 /*****************************************************************************/
138 /* Function Definitions */
139 /*****************************************************************************/
140
141 /**
142 *******************************************************************************
143 *
144 * @brief
145 * Used to test arguments for corresponding API call
146 *
147 * @par Description:
148 * For each command the arguments are validated
149 *
150 * @param[in] ps_handle
151 * Codec handle at API level
152 *
153 * @param[in] pv_api_ip
154 * Pointer to input structure
155 *
156 * @param[out] pv_api_op
157 * Pointer to output structure
158 *
159 * @returns error status
160 *
161 * @remarks none
162 *
163 *******************************************************************************
164 */
api_check_struct_sanity(iv_obj_t * ps_handle,void * pv_api_ip,void * pv_api_op)165 static IV_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
166 void *pv_api_ip,
167 void *pv_api_op)
168 {
169 /* api call */
170 WORD32 command = IV_CMD_NA;
171
172 /* input structure expected by the api call */
173 UWORD32 *pu4_api_ip = pv_api_ip;
174
175 /* output structure expected by the api call */
176 UWORD32 *pu4_api_op = pv_api_op;
177
178 /* temp var */
179 WORD32 i, j;
180
181 if (NULL == pv_api_op || NULL == pv_api_ip)
182 {
183 return (IV_FAIL);
184 }
185
186 /* get command */
187 command = pu4_api_ip[1];
188
189 /* set error code */
190 pu4_api_op[1] = 0;
191
192 /* error checks on handle */
193 switch (command)
194 {
195 case IV_CMD_GET_NUM_MEM_REC:
196 case IV_CMD_FILL_NUM_MEM_REC:
197 break;
198
199 case IV_CMD_INIT:
200 if (ps_handle == NULL)
201 {
202 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
203 *(pu4_api_op + 1) |= IVE_ERR_HANDLE_NULL;
204 return IV_FAIL;
205 }
206
207 if (ps_handle->u4_size != sizeof(iv_obj_t))
208 {
209 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
210 *(pu4_api_op + 1) |= IVE_ERR_HANDLE_STRUCT_SIZE_INCORRECT;
211 return IV_FAIL;
212 }
213 break;
214
215 case IVE_CMD_QUEUE_INPUT:
216 case IVE_CMD_QUEUE_OUTPUT:
217 case IVE_CMD_DEQUEUE_OUTPUT:
218 case IVE_CMD_GET_RECON:
219 case IV_CMD_RETRIEVE_MEMREC:
220 case IVE_CMD_VIDEO_CTL:
221 case IVE_CMD_VIDEO_ENCODE:
222
223 if (ps_handle == NULL)
224 {
225 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
226 *(pu4_api_op + 1) |= IVE_ERR_HANDLE_NULL;
227 return IV_FAIL;
228 }
229
230 if (ps_handle->u4_size != sizeof(iv_obj_t))
231 {
232 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
233 *(pu4_api_op + 1) |= IVE_ERR_HANDLE_STRUCT_SIZE_INCORRECT;
234 return IV_FAIL;
235 }
236
237 if (ps_handle->pv_fxns != ih264e_api_function)
238 {
239 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
240 *(pu4_api_op + 1) |= IVE_ERR_API_FUNCTION_PTR_NULL;
241 return IV_FAIL;
242 }
243
244 if (ps_handle->pv_codec_handle == NULL)
245 {
246 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
247 *(pu4_api_op + 1) |= IVE_ERR_INVALID_CODEC_HANDLE;
248 return IV_FAIL;
249 }
250 break;
251
252 default:
253 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
254 *(pu4_api_op + 1) |= IVE_ERR_INVALID_API_CMD;
255 return IV_FAIL;
256 }
257
258 /* error checks on input output structures */
259 switch (command)
260 {
261 case IV_CMD_GET_NUM_MEM_REC:
262 {
263 ih264e_num_mem_rec_ip_t *ps_ip = pv_api_ip;
264 ih264e_num_mem_rec_op_t *ps_op = pv_api_op;
265
266 ps_op->s_ive_op.u4_error_code = 0;
267
268 if (ps_ip->s_ive_ip.u4_size != sizeof(ih264e_num_mem_rec_ip_t))
269 {
270 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
271 ps_op->s_ive_op.u4_error_code |=
272 IVE_ERR_IP_GET_MEM_REC_API_STRUCT_SIZE_INCORRECT;
273 return (IV_FAIL);
274 }
275
276 if (ps_op->s_ive_op.u4_size != sizeof(ih264e_num_mem_rec_op_t))
277 {
278 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
279 ps_op->s_ive_op.u4_error_code |=
280 IVE_ERR_OP_GET_MEM_REC_API_STRUCT_SIZE_INCORRECT;
281 return (IV_FAIL);
282 }
283 break;
284 }
285
286 case IV_CMD_FILL_NUM_MEM_REC:
287 {
288 ih264e_fill_mem_rec_ip_t *ps_ip = pv_api_ip;
289 ih264e_fill_mem_rec_op_t *ps_op = pv_api_op;
290
291 iv_mem_rec_t *ps_mem_rec = NULL;
292
293 WORD32 max_wd = ALIGN16(ps_ip->s_ive_ip.u4_max_wd);
294 WORD32 max_ht = ALIGN16(ps_ip->s_ive_ip.u4_max_ht);
295
296 ps_op->s_ive_op.u4_error_code = 0;
297
298 if (ps_ip->s_ive_ip.u4_size != sizeof(ih264e_fill_mem_rec_ip_t))
299 {
300 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
301 ps_op->s_ive_op.u4_error_code |=
302 IVE_ERR_IP_FILL_MEM_REC_API_STRUCT_SIZE_INCORRECT;
303 return (IV_FAIL);
304 }
305
306 if (ps_op->s_ive_op.u4_size != sizeof(ih264e_fill_mem_rec_op_t))
307 {
308 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
309 ps_op->s_ive_op.u4_error_code |=
310 IVE_ERR_OP_FILL_MEM_REC_API_STRUCT_SIZE_INCORRECT;
311 return (IV_FAIL);
312 }
313
314 if (max_wd < MIN_WD || max_wd > MAX_WD)
315 {
316 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
317 ps_op->s_ive_op.u4_error_code |= IH264E_WIDTH_NOT_SUPPORTED;
318 return (IV_FAIL);
319 }
320
321 if (max_ht < MIN_HT || max_ht > MAX_HT)
322 {
323 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
324 ps_op->s_ive_op.u4_error_code |= IH264E_HEIGHT_NOT_SUPPORTED;
325 return (IV_FAIL);
326 }
327
328 /* verify number of mem rec ptr */
329 if (NULL == ps_ip->s_ive_ip.ps_mem_rec)
330 {
331 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
332 ps_op->s_ive_op.u4_error_code |=
333 IVE_ERR_FILL_NUM_MEM_RECS_POINTER_NULL;
334 return (IV_FAIL);
335 }
336
337 /* verify number of mem records */
338 if (ps_ip->s_ive_ip.u4_num_mem_rec != MEM_REC_CNT)
339 {
340 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
341 ps_op->s_ive_op.u4_error_code |=
342 IVE_ERR_NUM_MEM_REC_NOT_SUFFICIENT;
343 return IV_FAIL;
344 }
345
346 /* check mem records sizes are correct */
347 ps_mem_rec = ps_ip->s_ive_ip.ps_mem_rec;
348 for (i = 0; i < MEM_REC_CNT; i++)
349 {
350 if (ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
351 {
352 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
353 ps_op->s_ive_op.u4_error_code |=
354 IVE_ERR_MEM_REC_STRUCT_SIZE_INCORRECT;
355 return IV_FAIL;
356 }
357 }
358 break;
359 }
360
361 case IV_CMD_INIT:
362 {
363 ih264e_init_ip_t *ps_ip = pv_api_ip;
364 ih264e_init_op_t *ps_op = pv_api_op;
365
366 iv_mem_rec_t *ps_mem_rec = NULL;
367
368 WORD32 max_wd = ALIGN16(ps_ip->s_ive_ip.u4_max_wd);
369 WORD32 max_ht = ALIGN16(ps_ip->s_ive_ip.u4_max_ht);
370
371 ps_op->s_ive_op.u4_error_code = 0;
372
373 if (ps_ip->s_ive_ip.u4_size != sizeof(ih264e_init_ip_t))
374 {
375 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
376 ps_op->s_ive_op.u4_error_code |=
377 IVE_ERR_IP_INIT_API_STRUCT_SIZE_INCORRECT;
378 return (IV_FAIL);
379 }
380
381 if (ps_op->s_ive_op.u4_size != sizeof(ih264e_init_op_t))
382 {
383 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
384 ps_op->s_ive_op.u4_error_code |=
385 IVE_ERR_OP_INIT_API_STRUCT_SIZE_INCORRECT;
386 return (IV_FAIL);
387 }
388
389 if (max_wd < MIN_WD || max_wd > MAX_WD)
390 {
391 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
392 ps_op->s_ive_op.u4_error_code |= IH264E_WIDTH_NOT_SUPPORTED;
393 return (IV_FAIL);
394 }
395
396 if (max_ht < MIN_HT || max_ht > MAX_HT)
397 {
398 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
399 ps_op->s_ive_op.u4_error_code |= IH264E_HEIGHT_NOT_SUPPORTED;
400 return (IV_FAIL);
401 }
402
403 if (ps_ip->s_ive_ip.u4_max_ref_cnt > MAX_REF_PIC_CNT ||
404 ps_ip->s_ive_ip.u4_max_ref_cnt < MIN_REF_PIC_CNT)
405 {
406 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
407 ps_op->s_ive_op.u4_error_code |= IH264E_NUM_REF_UNSUPPORTED;
408 return (IV_FAIL);
409 }
410
411 if (ps_ip->s_ive_ip.u4_max_reorder_cnt != 0)
412 {
413 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
414 ps_op->s_ive_op.u4_error_code |= IH264E_NUM_REORDER_UNSUPPORTED;
415 return (IV_FAIL);
416 }
417
418 if ((ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_10)
419 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_1B)
420 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_11)
421 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_12)
422 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_13)
423 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_20)
424 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_21)
425 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_22)
426 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_30)
427 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_31)
428 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_32)
429 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_40)
430 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_41)
431 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_42)
432 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_50)
433 && (ps_ip->s_ive_ip.u4_max_level != IH264_LEVEL_51))
434 {
435 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
436 ps_op->s_ive_op.u4_error_code |=
437 IH264E_CODEC_LEVEL_NOT_SUPPORTED;
438 return (IV_FAIL);
439 }
440
441 if ((ps_ip->s_ive_ip.e_inp_color_fmt != IV_YUV_420P)
442 && (ps_ip->s_ive_ip.e_inp_color_fmt != IV_YUV_422ILE)
443 && (ps_ip->s_ive_ip.e_inp_color_fmt != IV_YUV_420SP_UV)
444 && (ps_ip->s_ive_ip.e_inp_color_fmt != IV_YUV_420SP_VU))
445 {
446 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
447 ps_op->s_ive_op.u4_error_code |=
448 IH264E_INPUT_CHROMA_FORMAT_NOT_SUPPORTED;
449 return (IV_FAIL);
450 }
451
452 if ((ps_ip->s_ive_ip.e_recon_color_fmt != IV_YUV_420P)
453 && (ps_ip->s_ive_ip.e_recon_color_fmt != IV_YUV_420SP_UV)
454 && (ps_ip->s_ive_ip.e_recon_color_fmt != IV_YUV_420SP_VU))
455 {
456 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
457 ps_op->s_ive_op.u4_error_code |=
458 IH264E_RECON_CHROMA_FORMAT_NOT_SUPPORTED;
459 return (IV_FAIL);
460 }
461
462 if ((ps_ip->s_ive_ip.e_rc_mode != IVE_RC_NONE)
463 && (ps_ip->s_ive_ip.e_rc_mode != IVE_RC_STORAGE)
464 && (ps_ip->s_ive_ip.e_rc_mode != IVE_RC_CBR_NON_LOW_DELAY))
465 {
466 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
467 ps_op->s_ive_op.u4_error_code |=
468 IH264E_RATE_CONTROL_MODE_NOT_SUPPORTED;
469 return (IV_FAIL);
470 }
471
472 if (ps_ip->s_ive_ip.u4_max_framerate > DEFAULT_MAX_FRAMERATE)
473 {
474 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
475 ps_op->s_ive_op.u4_error_code |=
476 IH264E_FRAME_RATE_NOT_SUPPORTED;
477 return (IV_FAIL);
478 }
479
480 if (ps_ip->s_ive_ip.u4_max_bitrate > DEFAULT_MAX_BITRATE)
481 {
482 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
483 ps_op->s_ive_op.u4_error_code |= IH264E_BITRATE_NOT_SUPPORTED;
484 return (IV_FAIL);
485 }
486
487 if (ps_ip->s_ive_ip.u4_num_bframes > MAX_NUM_BFRAMES)
488 {
489 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
490 ps_op->s_ive_op.u4_error_code |= IH264E_BFRAMES_NOT_SUPPORTED;
491 return (IV_FAIL);
492 }
493
494 if (ps_ip->s_ive_ip.u4_num_bframes
495 && (ps_ip->s_ive_ip.u4_max_ref_cnt < 2))
496 {
497 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
498 ps_op->s_ive_op.u4_error_code |= IH264E_BFRAMES_NOT_SUPPORTED;
499 return (IV_FAIL);
500 }
501
502 if (ps_ip->s_ive_ip.e_content_type != IV_PROGRESSIVE)
503 {
504 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
505 ps_op->s_ive_op.u4_error_code |=
506 IH264E_CONTENT_TYPE_NOT_SUPPORTED;
507 return (IV_FAIL);
508 }
509
510 if (ps_ip->s_ive_ip.u4_max_srch_rng_x > DEFAULT_MAX_SRCH_RANGE_X)
511 {
512 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
513 ps_op->s_ive_op.u4_error_code |=
514 IH264E_HORIZONTAL_SEARCH_RANGE_NOT_SUPPORTED;
515 return (IV_FAIL);
516 }
517
518 if (ps_ip->s_ive_ip.u4_max_srch_rng_y > DEFAULT_MAX_SRCH_RANGE_Y)
519 {
520 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
521 ps_op->s_ive_op.u4_error_code |=
522 IH264E_VERTICAL_SEARCH_RANGE_NOT_SUPPORTED;
523 return (IV_FAIL);
524 }
525
526 if ((ps_ip->s_ive_ip.e_slice_mode != IVE_SLICE_MODE_NONE)
527 && (ps_ip->s_ive_ip.e_slice_mode != IVE_SLICE_MODE_BLOCKS))
528 {
529 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
530 ps_op->s_ive_op.u4_error_code |=
531 IH264E_SLICE_TYPE_INPUT_INVALID;
532 return (IV_FAIL);
533 }
534
535 if (ps_ip->s_ive_ip.e_slice_mode == IVE_SLICE_MODE_BLOCKS)
536 {
537 if (ps_ip->s_ive_ip.u4_slice_param == 0
538 || ps_ip->s_ive_ip.u4_slice_param > ((UWORD32)max_ht >> 4))
539 {
540 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
541 ps_op->s_ive_op.u4_error_code |=
542 IH264E_SLICE_PARAM_INPUT_INVALID;
543 return (IV_FAIL);
544 }
545 }
546
547 if (NULL == ps_ip->s_ive_ip.ps_mem_rec)
548 {
549 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
550 ps_op->s_ive_op.u4_error_code |=
551 IVE_ERR_FILL_NUM_MEM_RECS_POINTER_NULL;
552 return (IV_FAIL);
553 }
554
555 /* verify number of mem records */
556 if (ps_ip->s_ive_ip.u4_num_mem_rec != MEM_REC_CNT)
557 {
558 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
559 ps_op->s_ive_op.u4_error_code |=
560 IVE_ERR_NUM_MEM_REC_NOT_SUFFICIENT;
561 return (IV_FAIL);
562 }
563
564 ps_mem_rec = ps_ip->s_ive_ip.ps_mem_rec;
565
566 /* check memrecords sizes are correct */
567 for (i = 0; i <((WORD32)ps_ip->s_ive_ip.u4_num_mem_rec); i++)
568 {
569 if (ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
570 {
571 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
572 ps_op->s_ive_op.u4_error_code |=
573 IVE_ERR_MEM_REC_STRUCT_SIZE_INCORRECT;
574 return IV_FAIL;
575 }
576
577 /* check memrecords pointers are not NULL */
578 if (ps_mem_rec[i].pv_base == NULL)
579 {
580 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
581 ps_op->s_ive_op.u4_error_code |=
582 IVE_ERR_MEM_REC_BASE_POINTER_NULL;
583 return IV_FAIL;
584 }
585 }
586
587 /* verify memtabs for overlapping regions */
588 {
589 void *start[MEM_REC_CNT];
590 void *end[MEM_REC_CNT];
591
592 start[0] = (ps_mem_rec[0].pv_base);
593 end[0] = ((UWORD8 *) ps_mem_rec[0].pv_base)
594 + ps_mem_rec[0].u4_mem_size - 1;
595
596 for (i = 1; i < MEM_REC_CNT; i++)
597 {
598 /* This array is populated to check memtab overlap */
599 start[i] = (ps_mem_rec[i].pv_base);
600 end[i] = ((UWORD8 *) ps_mem_rec[i].pv_base)
601 + ps_mem_rec[i].u4_mem_size - 1;
602
603 for (j = 0; j < i; j++)
604 {
605 if ((start[i] >= start[j]) && (start[i] <= end[j]))
606 {
607 ps_op->s_ive_op.u4_error_code |= 1
608 << IVE_UNSUPPORTEDPARAM;
609 ps_op->s_ive_op.u4_error_code |=
610 IVE_ERR_MEM_REC_OVERLAP_ERR;
611 return IV_FAIL;
612 }
613
614 if ((end[i] >= start[j]) && (end[i] <= end[j]))
615 {
616 ps_op->s_ive_op.u4_error_code |= 1
617 << IVE_UNSUPPORTEDPARAM;
618 ps_op->s_ive_op.u4_error_code |=
619 IVE_ERR_MEM_REC_OVERLAP_ERR;
620 return IV_FAIL;
621 }
622
623 if ((start[i] < start[j]) && (end[i] > end[j]))
624 {
625 ps_op->s_ive_op.u4_error_code |= 1
626 << IVE_UNSUPPORTEDPARAM;
627 ps_op->s_ive_op.u4_error_code |=
628 IVE_ERR_MEM_REC_OVERLAP_ERR;
629 return IV_FAIL;
630 }
631 }
632 }
633 }
634
635 /* re-validate mem records with init config */
636 {
637 /* mem records */
638 iv_mem_rec_t s_mem_rec_ittiam_api[MEM_REC_CNT];
639
640 /* api interface structs */
641 ih264e_fill_mem_rec_ip_t s_ip;
642 ih264e_fill_mem_rec_op_t s_op;
643
644 /* error status */
645 IV_STATUS_T e_status;
646
647 /* temp var */
648 WORD32 i;
649
650 s_ip.s_ive_ip.u4_size = sizeof(ih264e_fill_mem_rec_ip_t);
651 s_op.s_ive_op.u4_size = sizeof(ih264e_fill_mem_rec_op_t);
652
653 s_ip.s_ive_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
654 s_ip.s_ive_ip.ps_mem_rec = s_mem_rec_ittiam_api;
655 s_ip.s_ive_ip.u4_max_wd = max_wd;
656 s_ip.s_ive_ip.u4_max_ht = max_ht;
657 s_ip.s_ive_ip.u4_num_mem_rec = ps_ip->s_ive_ip.u4_num_mem_rec;
658 s_ip.s_ive_ip.u4_max_level = ps_ip->s_ive_ip.u4_max_level;
659 s_ip.s_ive_ip.u4_max_ref_cnt = ps_ip->s_ive_ip.u4_max_ref_cnt;
660 s_ip.s_ive_ip.u4_max_reorder_cnt =
661 ps_ip->s_ive_ip.u4_max_reorder_cnt;
662 s_ip.s_ive_ip.e_color_format = ps_ip->s_ive_ip.e_inp_color_fmt;
663 s_ip.s_ive_ip.u4_max_srch_rng_x =
664 ps_ip->s_ive_ip.u4_max_srch_rng_x;
665 s_ip.s_ive_ip.u4_max_srch_rng_y =
666 ps_ip->s_ive_ip.u4_max_srch_rng_y;
667
668 for (i = 0; i < MEM_REC_CNT; i++)
669 {
670 s_mem_rec_ittiam_api[i].u4_size = sizeof(iv_mem_rec_t);
671 }
672
673 /* fill mem records */
674 e_status = ih264e_api_function(NULL, (void *) &s_ip,
675 (void *) &s_op);
676
677 if (IV_FAIL == e_status)
678 {
679 ps_op->s_ive_op.u4_error_code = s_op.s_ive_op.u4_error_code;
680 return (IV_FAIL);
681 }
682
683 /* verify mem records */
684 for (i = 0; i < MEM_REC_CNT; i++)
685 {
686 if (ps_mem_rec[i].u4_mem_size
687 < s_mem_rec_ittiam_api[i].u4_mem_size)
688 {
689 ps_op->s_ive_op.u4_error_code |= 1
690 << IVE_UNSUPPORTEDPARAM;
691 ps_op->s_ive_op.u4_error_code |=
692 IVE_ERR_MEM_REC_INSUFFICIENT_SIZE;
693
694 return IV_FAIL;
695 }
696
697 if (ps_mem_rec[i].u4_mem_alignment
698 != s_mem_rec_ittiam_api[i].u4_mem_alignment)
699 {
700 ps_op->s_ive_op.u4_error_code |= 1
701 << IVE_UNSUPPORTEDPARAM;
702 ps_op->s_ive_op.u4_error_code |=
703 IVE_ERR_MEM_REC_ALIGNMENT_ERR;
704
705 return IV_FAIL;
706 }
707
708 if (ps_mem_rec[i].e_mem_type
709 != s_mem_rec_ittiam_api[i].e_mem_type)
710 {
711 UWORD32 check = IV_SUCCESS;
712 UWORD32 diff = s_mem_rec_ittiam_api[i].e_mem_type
713 - ps_mem_rec[i].e_mem_type;
714
715 if ((ps_mem_rec[i].e_mem_type
716 <= IV_EXTERNAL_CACHEABLE_SCRATCH_MEM)
717 && (s_mem_rec_ittiam_api[i].e_mem_type
718 >= IV_INTERNAL_NONCACHEABLE_PERSISTENT_MEM))
719 {
720 check = IV_FAIL;
721 }
722
723 if (3 != (s_mem_rec_ittiam_api[i].e_mem_type % 4))
724 {
725 /* It is not IV_EXTERNAL_NONCACHEABLE_PERSISTENT_MEM or
726 * IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM */
727
728 if ((diff < 1) || (diff > 3))
729 {
730 /* Difference between 1 and 3 is okay for all cases other than the
731 * two filtered with the MOD condition above */
732 check = IV_FAIL;
733 }
734 }
735 else
736 {
737 if (diff == 1)
738 {
739 /* This particular case is when codec asked for External Persistent,
740 * but got Internal Scratch */
741 check = IV_FAIL;
742 }
743 if ((diff != 2) && (diff != 3))
744 {
745 check = IV_FAIL;
746 }
747 }
748
749 if (check == IV_FAIL)
750 {
751 ps_op->s_ive_op.u4_error_code |= 1
752 << IVE_UNSUPPORTEDPARAM;
753 ps_op->s_ive_op.u4_error_code |=
754 IVE_ERR_MEM_REC_INCORRECT_TYPE;
755
756 return IV_FAIL;
757 }
758 }
759 }
760 }
761 break;
762 }
763
764 case IVE_CMD_QUEUE_INPUT:
765 case IVE_CMD_QUEUE_OUTPUT:
766 case IVE_CMD_DEQUEUE_OUTPUT:
767 case IVE_CMD_GET_RECON:
768 break;
769
770 case IV_CMD_RETRIEVE_MEMREC:
771 {
772 ih264e_retrieve_mem_rec_ip_t *ps_ip = pv_api_ip;
773 ih264e_retrieve_mem_rec_op_t *ps_op = pv_api_op;
774
775 iv_mem_rec_t *ps_mem_rec = NULL;
776
777 ps_op->s_ive_op.u4_error_code = 0;
778
779 if (ps_ip->s_ive_ip.u4_size != sizeof(ih264e_retrieve_mem_rec_ip_t))
780 {
781 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
782 ps_op->s_ive_op.u4_error_code |=
783 IVE_ERR_IP_RETRIEVE_MEM_REC_API_STRUCT_SIZE_INCORRECT;
784 return (IV_FAIL);
785 }
786
787 if (ps_op->s_ive_op.u4_size != sizeof(ih264e_retrieve_mem_rec_op_t))
788 {
789 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
790 ps_op->s_ive_op.u4_error_code |=
791 IVE_ERR_OP_RETRIEVE_MEM_REC_API_STRUCT_SIZE_INCORRECT;
792 return (IV_FAIL);
793 }
794
795 if (NULL == ps_ip->s_ive_ip.ps_mem_rec)
796 {
797 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
798 ps_op->s_ive_op.u4_error_code |=
799 IVE_ERR_FILL_NUM_MEM_RECS_POINTER_NULL;
800 return (IV_FAIL);
801 }
802
803 ps_mem_rec = ps_ip->s_ive_ip.ps_mem_rec;
804
805 /* check memrecords sizes are correct */
806 for (i = 0; i < MEM_REC_CNT; i++)
807 {
808 if (ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
809 {
810 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
811 ps_op->s_ive_op.u4_error_code |=
812 IVE_ERR_MEM_REC_STRUCT_SIZE_INCORRECT;
813 return IV_FAIL;
814 }
815 }
816 break;
817 }
818
819 case IVE_CMD_VIDEO_ENCODE:
820 {
821 ih264e_video_encode_ip_t *ps_ip = pv_api_ip;
822 ih264e_video_encode_op_t *ps_op = pv_api_op;
823
824 if (ps_ip->s_ive_ip.u4_size != sizeof(ih264e_video_encode_ip_t))
825 {
826 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
827 ps_op->s_ive_op.u4_error_code |=
828 IVE_ERR_IP_ENCODE_API_STRUCT_SIZE_INCORRECT;
829 return (IV_FAIL);
830 }
831
832 if (ps_op->s_ive_op.u4_size != sizeof(ih264e_video_encode_op_t))
833 {
834 ps_op->s_ive_op.u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
835 ps_op->s_ive_op.u4_error_code |=
836 IVE_ERR_OP_ENCODE_API_STRUCT_SIZE_INCORRECT;
837 return (IV_FAIL);
838 }
839 break;
840 }
841
842 case IVE_CMD_VIDEO_CTL:
843 {
844 /* ptr to input structure */
845 WORD32 *pu4_ptr_cmd = pv_api_ip;
846
847 /* sub command */
848 WORD32 sub_command = pu4_ptr_cmd[2];
849
850 switch (sub_command)
851 {
852 case IVE_CMD_CTL_SETDEFAULT:
853 {
854 ih264e_ctl_setdefault_ip_t *ps_ip = pv_api_ip;
855 ih264e_ctl_setdefault_op_t *ps_op = pv_api_op;
856
857 if (ps_ip->s_ive_ip.u4_size
858 != sizeof(ih264e_ctl_setdefault_ip_t))
859 {
860 ps_op->s_ive_op.u4_error_code |= 1
861 << IVE_UNSUPPORTEDPARAM;
862 ps_op->s_ive_op.u4_error_code |=
863 IVE_ERR_IP_CTL_SETDEF_API_STRUCT_SIZE_INCORRECT;
864 return IV_FAIL;
865 }
866
867 if (ps_op->s_ive_op.u4_size
868 != sizeof(ih264e_ctl_setdefault_op_t))
869 {
870 ps_op->s_ive_op.u4_error_code |= 1
871 << IVE_UNSUPPORTEDPARAM;
872 ps_op->s_ive_op.u4_error_code |=
873 IVE_ERR_OP_CTL_SETDEF_API_STRUCT_SIZE_INCORRECT;
874 return IV_FAIL;
875 }
876 break;
877 }
878
879 case IVE_CMD_CTL_GETBUFINFO:
880 {
881 codec_t *ps_codec = (codec_t *) (ps_handle->pv_codec_handle);
882
883 ih264e_ctl_getbufinfo_ip_t *ps_ip = pv_api_ip;
884 ih264e_ctl_getbufinfo_op_t *ps_op = pv_api_op;
885
886 if (ps_ip->s_ive_ip.u4_size
887 != sizeof(ih264e_ctl_getbufinfo_ip_t))
888 {
889 ps_op->s_ive_op.u4_error_code |= 1
890 << IVE_UNSUPPORTEDPARAM;
891 ps_op->s_ive_op.u4_error_code |=
892 IVE_ERR_IP_CTL_GETBUFINFO_API_STRUCT_SIZE_INCORRECT;
893 return IV_FAIL;
894 }
895
896 if (ps_op->s_ive_op.u4_size
897 != sizeof(ih264e_ctl_getbufinfo_op_t))
898 {
899 ps_op->s_ive_op.u4_error_code |= 1
900 << IVE_UNSUPPORTEDPARAM;
901 ps_op->s_ive_op.u4_error_code |=
902 IVE_ERR_OP_CTL_GETBUFINFO_API_STRUCT_SIZE_INCORRECT;
903 return IV_FAIL;
904 }
905
906 if (ps_ip->s_ive_ip.u4_max_wd < MIN_WD)
907 {
908 ps_op->s_ive_op.u4_error_code |= 1
909 << IVE_UNSUPPORTEDPARAM;
910 ps_op->s_ive_op.u4_error_code |=
911 IH264E_WIDTH_NOT_SUPPORTED;
912 return (IV_FAIL);
913 }
914
915 if (ps_ip->s_ive_ip.u4_max_wd > ps_codec->s_cfg.u4_max_wd)
916 {
917 ps_op->s_ive_op.u4_error_code |= 1
918 << IVE_UNSUPPORTEDPARAM;
919 ps_op->s_ive_op.u4_error_code |=
920 IH264E_WIDTH_NOT_SUPPORTED;
921 return (IV_FAIL);
922 }
923
924 if (ps_ip->s_ive_ip.u4_max_ht < MIN_HT)
925 {
926 ps_op->s_ive_op.u4_error_code |= 1
927 << IVE_UNSUPPORTEDPARAM;
928 ps_op->s_ive_op.u4_error_code |=
929 IH264E_HEIGHT_NOT_SUPPORTED;
930 return (IV_FAIL);
931 }
932
933 if (ps_ip->s_ive_ip.u4_max_ht > ps_codec->s_cfg.u4_max_ht)
934 {
935 ps_op->s_ive_op.u4_error_code |= 1
936 << IVE_UNSUPPORTEDPARAM;
937 ps_op->s_ive_op.u4_error_code |=
938 IH264E_HEIGHT_NOT_SUPPORTED;
939 return (IV_FAIL);
940 }
941
942 if ((ps_ip->s_ive_ip.e_inp_color_fmt != IV_YUV_420P)
943 && (ps_ip->s_ive_ip.e_inp_color_fmt != IV_YUV_422ILE)
944 && (ps_ip->s_ive_ip.e_inp_color_fmt != IV_YUV_420SP_UV)
945 && (ps_ip->s_ive_ip.e_inp_color_fmt != IV_YUV_420SP_VU))
946 {
947 ps_op->s_ive_op.u4_error_code |= 1
948 << IVE_UNSUPPORTEDPARAM;
949 ps_op->s_ive_op.u4_error_code |=
950 IH264E_INPUT_CHROMA_FORMAT_NOT_SUPPORTED;
951 return (IV_FAIL);
952 }
953 break;
954 }
955
956 case IVE_CMD_CTL_GETVERSION:
957 {
958 ih264e_ctl_getversioninfo_ip_t *ps_ip = pv_api_ip;
959 ih264e_ctl_getversioninfo_op_t *ps_op = pv_api_op;
960
961 if (ps_ip->s_ive_ip.u4_size
962 != sizeof(ih264e_ctl_getversioninfo_ip_t))
963 {
964 ps_op->s_ive_op.u4_error_code |= 1
965 << IVE_UNSUPPORTEDPARAM;
966 ps_op->s_ive_op.u4_error_code |=
967 IVE_ERR_IP_CTL_GETVERSION_API_STRUCT_SIZE_INCORRECT;
968 return IV_FAIL;
969 }
970
971 if (ps_op->s_ive_op.u4_size
972 != sizeof(ih264e_ctl_getversioninfo_op_t))
973 {
974 ps_op->s_ive_op.u4_error_code |= 1
975 << IVE_UNSUPPORTEDPARAM;
976 ps_op->s_ive_op.u4_error_code |=
977 IVE_ERR_OP_CTL_GETVERSION_API_STRUCT_SIZE_INCORRECT;
978 return IV_FAIL;
979 }
980
981 if (ps_ip->s_ive_ip.pu1_version == NULL)
982 {
983 ps_op->s_ive_op.u4_error_code |= 1
984 << IVE_UNSUPPORTEDPARAM;
985 ps_op->s_ive_op.u4_error_code |=
986 IVE_ERR_CTL_GET_VERSION_BUFFER_IS_NULL;
987 return IV_FAIL;
988 }
989
990 break;
991 }
992
993 case IVE_CMD_CTL_FLUSH:
994 {
995 ih264e_ctl_flush_ip_t *ps_ip = pv_api_ip;
996 ih264e_ctl_flush_op_t *ps_op = pv_api_op;
997
998 if (ps_ip->s_ive_ip.u4_size
999 != sizeof(ih264e_ctl_flush_ip_t))
1000 {
1001 ps_op->s_ive_op.u4_error_code |= 1
1002 << IVE_UNSUPPORTEDPARAM;
1003 ps_op->s_ive_op.u4_error_code |=
1004 IVE_ERR_IP_CTL_FLUSH_API_STRUCT_SIZE_INCORRECT;
1005 return IV_FAIL;
1006 }
1007
1008 if (ps_op->s_ive_op.u4_size
1009 != sizeof(ih264e_ctl_flush_op_t))
1010 {
1011 ps_op->s_ive_op.u4_error_code |= 1
1012 << IVE_UNSUPPORTEDPARAM;
1013 ps_op->s_ive_op.u4_error_code |=
1014 IVE_ERR_OP_CTL_FLUSH_API_STRUCT_SIZE_INCORRECT;
1015 return IV_FAIL;
1016 }
1017
1018 break;
1019 }
1020
1021 case IVE_CMD_CTL_RESET:
1022 {
1023 ih264e_ctl_reset_ip_t *ps_ip = pv_api_ip;
1024 ih264e_ctl_reset_op_t *ps_op = pv_api_op;
1025
1026 if (ps_ip->s_ive_ip.u4_size
1027 != sizeof(ih264e_ctl_reset_ip_t))
1028 {
1029 ps_op->s_ive_op.u4_error_code |= 1
1030 << IVE_UNSUPPORTEDPARAM;
1031 ps_op->s_ive_op.u4_error_code |=
1032 IVE_ERR_IP_CTL_RESET_API_STRUCT_SIZE_INCORRECT;
1033 return IV_FAIL;
1034 }
1035
1036 if (ps_op->s_ive_op.u4_size
1037 != sizeof(ih264e_ctl_reset_op_t))
1038 {
1039 ps_op->s_ive_op.u4_error_code |= 1
1040 << IVE_UNSUPPORTEDPARAM;
1041 ps_op->s_ive_op.u4_error_code |=
1042 IVE_ERR_OP_CTL_RESET_API_STRUCT_SIZE_INCORRECT;
1043 return IV_FAIL;
1044 }
1045
1046 break;
1047 }
1048
1049 case IVE_CMD_CTL_SET_NUM_CORES:
1050 {
1051 ih264e_ctl_set_num_cores_ip_t *ps_ip = pv_api_ip;
1052 ih264e_ctl_set_num_cores_op_t *ps_op = pv_api_op;
1053
1054 if (ps_ip->s_ive_ip.u4_size
1055 != sizeof(ih264e_ctl_set_num_cores_ip_t))
1056 {
1057 ps_op->s_ive_op.u4_error_code |= 1
1058 << IVE_UNSUPPORTEDPARAM;
1059 ps_op->s_ive_op.u4_error_code |=
1060 IVE_ERR_IP_CTL_SETCORES_API_STRUCT_SIZE_INCORRECT;
1061 return IV_FAIL;
1062 }
1063
1064 if (ps_op->s_ive_op.u4_size
1065 != sizeof(ih264e_ctl_set_num_cores_op_t))
1066 {
1067 ps_op->s_ive_op.u4_error_code |= 1
1068 << IVE_UNSUPPORTEDPARAM;
1069 ps_op->s_ive_op.u4_error_code |=
1070 IVE_ERR_OP_CTL_SETCORES_API_STRUCT_SIZE_INCORRECT;
1071 return IV_FAIL;
1072 }
1073
1074 if ((ps_ip->s_ive_ip.u4_num_cores < 1)
1075 || (ps_ip->s_ive_ip.u4_num_cores > MAX_NUM_CORES))
1076 {
1077 ps_op->s_ive_op.u4_error_code |= 1
1078 << IVE_UNSUPPORTEDPARAM;
1079 ps_op->s_ive_op.u4_error_code |=
1080 IH264E_INVALID_NUM_CORES;
1081 return IV_FAIL;
1082 }
1083
1084 break;
1085 }
1086
1087 case IVE_CMD_CTL_SET_DIMENSIONS:
1088 {
1089 codec_t *ps_codec = (codec_t *) (ps_handle->pv_codec_handle);
1090
1091 ih264e_ctl_set_dimensions_ip_t *ps_ip = pv_api_ip;
1092 ih264e_ctl_set_dimensions_op_t *ps_op = pv_api_op;
1093
1094 if (ps_ip->s_ive_ip.u4_size
1095 != sizeof(ih264e_ctl_set_dimensions_ip_t))
1096 {
1097 ps_op->s_ive_op.u4_error_code |= 1
1098 << IVE_UNSUPPORTEDPARAM;
1099 ps_op->s_ive_op.u4_error_code |=
1100 IVE_ERR_IP_CTL_SETDIM_API_STRUCT_SIZE_INCORRECT;
1101 return IV_FAIL;
1102 }
1103
1104 if (ps_op->s_ive_op.u4_size
1105 != sizeof(ih264e_ctl_set_dimensions_op_t))
1106 {
1107 ps_op->s_ive_op.u4_error_code |= 1
1108 << IVE_UNSUPPORTEDPARAM;
1109 ps_op->s_ive_op.u4_error_code |=
1110 IVE_ERR_OP_CTL_SETDIM_API_STRUCT_SIZE_INCORRECT;
1111 return IV_FAIL;
1112 }
1113
1114 if (ps_ip->s_ive_ip.u4_wd < MIN_WD)
1115 {
1116 ps_op->s_ive_op.u4_error_code |= 1
1117 << IVE_UNSUPPORTEDPARAM;
1118 ps_op->s_ive_op.u4_error_code |=
1119 IH264E_WIDTH_NOT_SUPPORTED;
1120 return (IV_FAIL);
1121 }
1122
1123 if (ps_ip->s_ive_ip.u4_wd > ps_codec->s_cfg.u4_max_wd)
1124 {
1125 ps_op->s_ive_op.u4_error_code |= 1
1126 << IVE_UNSUPPORTEDPARAM;
1127 ps_op->s_ive_op.u4_error_code |=
1128 IH264E_WIDTH_NOT_SUPPORTED;
1129 return (IV_FAIL);
1130 }
1131
1132 if (ps_ip->s_ive_ip.u4_ht < MIN_HT)
1133 {
1134 ps_op->s_ive_op.u4_error_code |= 1
1135 << IVE_UNSUPPORTEDPARAM;
1136 ps_op->s_ive_op.u4_error_code |=
1137 IH264E_HEIGHT_NOT_SUPPORTED;
1138 return (IV_FAIL);
1139 }
1140
1141 if (ps_ip->s_ive_ip.u4_ht > ps_codec->s_cfg.u4_max_ht)
1142 {
1143 ps_op->s_ive_op.u4_error_code |= 1
1144 << IVE_UNSUPPORTEDPARAM;
1145 ps_op->s_ive_op.u4_error_code |=
1146 IH264E_HEIGHT_NOT_SUPPORTED;
1147 return (IV_FAIL);
1148 }
1149
1150 if(ps_ip->s_ive_ip.u4_wd & 1)
1151 {
1152 ps_op->s_ive_op.u4_error_code |= 1
1153 << IVE_UNSUPPORTEDPARAM;
1154 ps_op->s_ive_op.u4_error_code |=
1155 IH264E_WIDTH_NOT_SUPPORTED;
1156 return (IV_FAIL);
1157 }
1158
1159 if(ps_ip->s_ive_ip.u4_ht & 1)
1160 {
1161 ps_op->s_ive_op.u4_error_code |= 1
1162 << IVE_UNSUPPORTEDPARAM;
1163 ps_op->s_ive_op.u4_error_code |=
1164 IH264E_HEIGHT_NOT_SUPPORTED;
1165 return (IV_FAIL);
1166 }
1167
1168 break;
1169 }
1170
1171 case IVE_CMD_CTL_SET_FRAMERATE:
1172 {
1173 ih264e_ctl_set_frame_rate_ip_t *ps_ip = pv_api_ip;
1174 ih264e_ctl_set_frame_rate_op_t *ps_op = pv_api_op;
1175
1176 if (ps_ip->s_ive_ip.u4_size
1177 != sizeof(ih264e_ctl_set_frame_rate_ip_t))
1178 {
1179 ps_op->s_ive_op.u4_error_code |= 1
1180 << IVE_UNSUPPORTEDPARAM;
1181 ps_op->s_ive_op.u4_error_code |=
1182 IVE_ERR_IP_CTL_SETFRAMERATE_API_STRUCT_SIZE_INCORRECT;
1183 return IV_FAIL;
1184 }
1185
1186 if (ps_op->s_ive_op.u4_size
1187 != sizeof(ih264e_ctl_set_frame_rate_op_t))
1188 {
1189 ps_op->s_ive_op.u4_error_code |= 1
1190 << IVE_UNSUPPORTEDPARAM;
1191 ps_op->s_ive_op.u4_error_code |=
1192 IVE_ERR_OP_CTL_SETFRAMERATE_API_STRUCT_SIZE_INCORRECT;
1193 return IV_FAIL;
1194 }
1195
1196 if (((ps_ip->s_ive_ip.u4_src_frame_rate * 1000) > DEFAULT_MAX_FRAMERATE)
1197 || ((ps_ip->s_ive_ip.u4_tgt_frame_rate * 1000) > DEFAULT_MAX_FRAMERATE))
1198 {
1199 ps_op->s_ive_op.u4_error_code |= 1
1200 << IVE_UNSUPPORTEDPARAM;
1201 ps_op->s_ive_op.u4_error_code |=
1202 IH264E_FRAME_RATE_NOT_SUPPORTED;
1203 return (IV_FAIL);
1204 }
1205
1206 if ((ps_ip->s_ive_ip.u4_src_frame_rate == 0)
1207 || (ps_ip->s_ive_ip.u4_tgt_frame_rate == 0))
1208 {
1209 ps_op->s_ive_op.u4_error_code |= 1
1210 << IVE_UNSUPPORTEDPARAM;
1211 ps_op->s_ive_op.u4_error_code |=
1212 IH264E_FRAME_RATE_NOT_SUPPORTED;
1213 return (IV_FAIL);
1214 }
1215
1216 if (ps_ip->s_ive_ip.u4_tgt_frame_rate
1217 > ps_ip->s_ive_ip.u4_src_frame_rate)
1218 {
1219 ps_op->s_ive_op.u4_error_code |= 1
1220 << IVE_UNSUPPORTEDPARAM;
1221 ps_op->s_ive_op.u4_error_code |=
1222 IH264E_TGT_FRAME_RATE_EXCEEDS_SRC_FRAME_RATE;
1223 return (IV_FAIL);
1224 }
1225
1226 break;
1227 }
1228
1229 case IVE_CMD_CTL_SET_BITRATE:
1230 {
1231 ih264e_ctl_set_bitrate_ip_t *ps_ip = pv_api_ip;
1232 ih264e_ctl_set_bitrate_op_t *ps_op = pv_api_op;
1233
1234 if (ps_ip->s_ive_ip.u4_size
1235 != sizeof(ih264e_ctl_set_bitrate_ip_t))
1236 {
1237 ps_op->s_ive_op.u4_error_code |= 1
1238 << IVE_UNSUPPORTEDPARAM;
1239 ps_op->s_ive_op.u4_error_code |=
1240 IVE_ERR_IP_CTL_SETBITRATE_API_STRUCT_SIZE_INCORRECT;
1241 return IV_FAIL;
1242 }
1243
1244 if (ps_op->s_ive_op.u4_size
1245 != sizeof(ih264e_ctl_set_bitrate_op_t))
1246 {
1247 ps_op->s_ive_op.u4_error_code |= 1
1248 << IVE_UNSUPPORTEDPARAM;
1249 ps_op->s_ive_op.u4_error_code |=
1250 IVE_ERR_OP_CTL_SETBITRATE_API_STRUCT_SIZE_INCORRECT;
1251 return IV_FAIL;
1252 }
1253
1254 if ((ps_ip->s_ive_ip.u4_target_bitrate > DEFAULT_MAX_BITRATE)
1255 || (ps_ip->s_ive_ip.u4_target_bitrate == 0))
1256 {
1257 ps_op->s_ive_op.u4_error_code |= 1
1258 << IVE_UNSUPPORTEDPARAM;
1259 ps_op->s_ive_op.u4_error_code |=
1260 IH264E_BITRATE_NOT_SUPPORTED;
1261 return (IV_FAIL);
1262 }
1263
1264 break;
1265 }
1266
1267 case IVE_CMD_CTL_SET_FRAMETYPE:
1268 {
1269 ih264e_ctl_set_frame_type_ip_t *ps_ip = pv_api_ip;
1270 ih264e_ctl_set_frame_type_op_t *ps_op = pv_api_op;
1271
1272 if (ps_ip->s_ive_ip.u4_size
1273 != sizeof(ih264e_ctl_set_frame_type_ip_t))
1274 {
1275 ps_op->s_ive_op.u4_error_code |= 1
1276 << IVE_UNSUPPORTEDPARAM;
1277 ps_op->s_ive_op.u4_error_code |=
1278 IVE_ERR_IP_CTL_SETFRAMETYPE_API_STRUCT_SIZE_INCORRECT;
1279 return IV_FAIL;
1280 }
1281
1282 if (ps_op->s_ive_op.u4_size
1283 != sizeof(ih264e_ctl_set_frame_type_op_t))
1284 {
1285 ps_op->s_ive_op.u4_error_code |= 1
1286 << IVE_UNSUPPORTEDPARAM;
1287 ps_op->s_ive_op.u4_error_code |=
1288 IVE_ERR_OP_CTL_SETFRAMETYPE_API_STRUCT_SIZE_INCORRECT;
1289 return IV_FAIL;
1290 }
1291
1292 if ((ps_ip->s_ive_ip.e_frame_type != IV_NA_FRAME)
1293 && (ps_ip->s_ive_ip.e_frame_type != IV_I_FRAME)
1294 && (ps_ip->s_ive_ip.e_frame_type != IV_P_FRAME)
1295 && (ps_ip->s_ive_ip.e_frame_type != IV_IDR_FRAME))
1296 {
1297 ps_op->s_ive_op.u4_error_code |= 1
1298 << IVE_UNSUPPORTEDPARAM;
1299 ps_op->s_ive_op.u4_error_code |=
1300 IH264E_INVALID_FORCE_FRAME_INPUT;
1301 return IV_FAIL;
1302 }
1303 break;
1304 }
1305
1306 case IVE_CMD_CTL_SET_ME_PARAMS:
1307 {
1308 codec_t *ps_codec = (codec_t *) (ps_handle->pv_codec_handle);
1309
1310 ih264e_ctl_set_me_params_ip_t *ps_ip = pv_api_ip;
1311 ih264e_ctl_set_me_params_op_t *ps_op = pv_api_op;
1312
1313 if (ps_ip->s_ive_ip.u4_size
1314 != sizeof(ih264e_ctl_set_me_params_ip_t))
1315 {
1316 ps_op->s_ive_op.u4_error_code |= 1
1317 << IVE_UNSUPPORTEDPARAM;
1318 ps_op->s_ive_op.u4_error_code |=
1319 IVE_ERR_IP_CTL_SETMEPARAMS_API_STRUCT_SIZE_INCORRECT;
1320 return IV_FAIL;
1321 }
1322
1323 if (ps_op->s_ive_op.u4_size
1324 != sizeof(ih264e_ctl_set_me_params_op_t))
1325 {
1326 ps_op->s_ive_op.u4_error_code |= 1
1327 << IVE_UNSUPPORTEDPARAM;
1328 ps_op->s_ive_op.u4_error_code |=
1329 IVE_ERR_OP_CTL_SETMEPARAMS_API_STRUCT_SIZE_INCORRECT;
1330 return IV_FAIL;
1331 }
1332
1333 if ((ps_ip->s_ive_ip.u4_me_speed_preset != FULL_SRCH)
1334 && (ps_ip->s_ive_ip.u4_me_speed_preset != DMND_SRCH)
1335 && (ps_ip->s_ive_ip.u4_me_speed_preset != HEX_SRCH))
1336 {
1337 ps_op->s_ive_op.u4_error_code |= 1
1338 << IVE_UNSUPPORTEDPARAM;
1339 ps_op->s_ive_op.u4_error_code |=
1340 IH264E_INVALID_ME_SPEED_PRESET;
1341 return IV_FAIL;
1342 }
1343
1344 if ((ps_ip->s_ive_ip.u4_enable_hpel != 0)
1345 && (ps_ip->s_ive_ip.u4_enable_hpel != 1))
1346 {
1347 ps_op->s_ive_op.u4_error_code |= 1
1348 << IVE_UNSUPPORTEDPARAM;
1349 ps_op->s_ive_op.u4_error_code |=
1350 IH264E_INVALID_HALFPEL_OPTION;
1351 return IV_FAIL;
1352 }
1353
1354 if ((ps_ip->s_ive_ip.u4_enable_qpel != 0)
1355 && (ps_ip->s_ive_ip.u4_enable_qpel != 1))
1356 {
1357 ps_op->s_ive_op.u4_error_code |= 1
1358 << IVE_UNSUPPORTEDPARAM;
1359 ps_op->s_ive_op.u4_error_code |=
1360 IH264E_INVALID_QPEL_OPTION;
1361 return IV_FAIL;
1362 }
1363
1364 if ((ps_ip->s_ive_ip.u4_enable_fast_sad != 0)
1365 && (ps_ip->s_ive_ip.u4_enable_fast_sad != 1))
1366 {
1367 ps_op->s_ive_op.u4_error_code |= 1
1368 << IVE_UNSUPPORTEDPARAM;
1369 ps_op->s_ive_op.u4_error_code |=
1370 IH264E_INVALID_FAST_SAD_OPTION;
1371 return IV_FAIL;
1372 }
1373
1374 if (ps_ip->s_ive_ip.u4_enable_alt_ref > 255)
1375 {
1376 ps_op->s_ive_op.u4_error_code |= 1
1377 << IVE_UNSUPPORTEDPARAM;
1378 ps_op->s_ive_op.u4_error_code |=
1379 IH264E_INVALID_ALT_REF_OPTION;
1380 return IV_FAIL;
1381 }
1382
1383 if (ps_ip->s_ive_ip.u4_srch_rng_x
1384 > ps_codec->s_cfg.u4_max_srch_rng_x)
1385 {
1386 ps_op->s_ive_op.u4_error_code |= 1
1387 << IVE_UNSUPPORTEDPARAM;
1388 ps_op->s_ive_op.u4_error_code |=
1389 IH264E_HORIZONTAL_SEARCH_RANGE_NOT_SUPPORTED;
1390 return (IV_FAIL);
1391 }
1392
1393 if (ps_ip->s_ive_ip.u4_srch_rng_y
1394 > ps_codec->s_cfg.u4_max_srch_rng_y)
1395 {
1396 ps_op->s_ive_op.u4_error_code |= 1
1397 << IVE_UNSUPPORTEDPARAM;
1398 ps_op->s_ive_op.u4_error_code |=
1399 IH264E_VERTICAL_SEARCH_RANGE_NOT_SUPPORTED;
1400 return (IV_FAIL);
1401 }
1402
1403 break;
1404 }
1405
1406 case IVE_CMD_CTL_SET_IPE_PARAMS:
1407 {
1408 ih264e_ctl_set_ipe_params_ip_t *ps_ip = pv_api_ip;
1409 ih264e_ctl_set_ipe_params_op_t *ps_op = pv_api_op;
1410
1411 if (ps_ip->s_ive_ip.u4_size
1412 != sizeof(ih264e_ctl_set_ipe_params_ip_t))
1413 {
1414 ps_op->s_ive_op.u4_error_code |= 1
1415 << IVE_UNSUPPORTEDPARAM;
1416 ps_op->s_ive_op.u4_error_code |=
1417 IVE_ERR_IP_CTL_SETIPEPARAMS_API_STRUCT_SIZE_INCORRECT;
1418 return IV_FAIL;
1419 }
1420
1421 if (ps_op->s_ive_op.u4_size
1422 != sizeof(ih264e_ctl_set_ipe_params_op_t))
1423 {
1424 ps_op->s_ive_op.u4_error_code |= 1
1425 << IVE_UNSUPPORTEDPARAM;
1426 ps_op->s_ive_op.u4_error_code |=
1427 IVE_ERR_OP_CTL_SETIPEPARAMS_API_STRUCT_SIZE_INCORRECT;
1428 return IV_FAIL;
1429 }
1430
1431 if ((ps_ip->s_ive_ip.u4_enable_intra_4x4 != 0)
1432 && (ps_ip->s_ive_ip.u4_enable_intra_4x4 != 1))
1433 {
1434 ps_op->s_ive_op.u4_error_code |= 1
1435 << IVE_UNSUPPORTEDPARAM;
1436 ps_op->s_ive_op.u4_error_code |=
1437 IH264E_INVALID_INTRA4x4_OPTION;
1438 return IV_FAIL;
1439 }
1440
1441 if ((ps_ip->s_ive_ip.u4_constrained_intra_pred != 0)
1442 && (ps_ip->s_ive_ip.u4_constrained_intra_pred != 1))
1443 {
1444 ps_op->s_ive_op.u4_error_code |= 1
1445 << IVE_UNSUPPORTEDPARAM;
1446 ps_op->s_ive_op.u4_error_code |=
1447 IH264E_INVALID_CONSTRAINED_INTRA_PREDICTION_MODE;
1448 return IV_FAIL;
1449 }
1450
1451 if ((ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_CONFIG)
1452 && (ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_SLOWEST)
1453 && (ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_NORMAL)
1454 && (ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_FAST)
1455 && (ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_HIGH_SPEED)
1456 && (ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_FASTEST))
1457 {
1458 ps_op->s_ive_op.u4_error_code |= 1
1459 << IVE_UNSUPPORTEDPARAM;
1460 ps_op->s_ive_op.u4_error_code |=
1461 IH264E_INVALID_ENC_SPEED_PRESET;
1462 return IV_FAIL;
1463 }
1464
1465 break;
1466 }
1467
1468 case IVE_CMD_CTL_SET_GOP_PARAMS:
1469 {
1470 ih264e_ctl_set_gop_params_ip_t *ps_ip = pv_api_ip;
1471 ih264e_ctl_set_gop_params_op_t *ps_op = pv_api_op;
1472
1473 if (ps_ip->s_ive_ip.u4_size
1474 != sizeof(ih264e_ctl_set_gop_params_ip_t))
1475 {
1476 ps_op->s_ive_op.u4_error_code |= 1
1477 << IVE_UNSUPPORTEDPARAM;
1478 ps_op->s_ive_op.u4_error_code |=
1479 IVE_ERR_IP_CTL_SETGOPPARAMS_API_STRUCT_SIZE_INCORRECT;
1480 return IV_FAIL;
1481 }
1482
1483 if (ps_op->s_ive_op.u4_size
1484 != sizeof(ih264e_ctl_set_gop_params_op_t))
1485 {
1486 ps_op->s_ive_op.u4_error_code |= 1
1487 << IVE_UNSUPPORTEDPARAM;
1488 ps_op->s_ive_op.u4_error_code |=
1489 IVE_ERR_OP_CTL_SETGOPPARAMS_API_STRUCT_SIZE_INCORRECT;
1490 return IV_FAIL;
1491 }
1492
1493 if ((ps_ip->s_ive_ip.u4_i_frm_interval < DEFAULT_MIN_INTRA_FRAME_RATE)
1494 || (ps_ip->s_ive_ip.u4_i_frm_interval > DEFAULT_MAX_INTRA_FRAME_RATE))
1495 {
1496 ps_op->s_ive_op.u4_error_code |= 1
1497 << IVE_UNSUPPORTEDPARAM;
1498 ps_op->s_ive_op.u4_error_code |=
1499 IH264E_INVALID_INTRA_FRAME_INTERVAL;
1500 return IV_FAIL;
1501 }
1502
1503 if ((ps_ip->s_ive_ip.u4_idr_frm_interval < DEFAULT_MIN_INTRA_FRAME_RATE)
1504 || (ps_ip->s_ive_ip.u4_idr_frm_interval > DEFAULT_MAX_INTRA_FRAME_RATE))
1505 {
1506 ps_op->s_ive_op.u4_error_code |= 1
1507 << IVE_UNSUPPORTEDPARAM;
1508 ps_op->s_ive_op.u4_error_code |=
1509 IH264E_INVALID_IDR_FRAME_INTERVAL;
1510 return IV_FAIL;
1511 }
1512
1513 break;
1514 }
1515
1516 case IVE_CMD_CTL_SET_DEBLOCK_PARAMS:
1517 {
1518 ih264e_ctl_set_deblock_params_ip_t *ps_ip = pv_api_ip;
1519 ih264e_ctl_set_deblock_params_op_t *ps_op = pv_api_op;
1520
1521 if (ps_ip->s_ive_ip.u4_size
1522 != sizeof(ih264e_ctl_set_deblock_params_ip_t))
1523 {
1524 ps_op->s_ive_op.u4_error_code |= 1
1525 << IVE_UNSUPPORTEDPARAM;
1526 ps_op->s_ive_op.u4_error_code |=
1527 IVE_ERR_IP_CTL_SETDEBLKPARAMS_API_STRUCT_SIZE_INCORRECT;
1528 return IV_FAIL;
1529 }
1530
1531 if (ps_op->s_ive_op.u4_size
1532 != sizeof(ih264e_ctl_set_deblock_params_op_t))
1533 {
1534 ps_op->s_ive_op.u4_error_code |= 1
1535 << IVE_UNSUPPORTEDPARAM;
1536 ps_op->s_ive_op.u4_error_code |=
1537 IVE_ERR_OP_CTL_SETDEBLKPARAMS_API_STRUCT_SIZE_INCORRECT;
1538 return IV_FAIL;
1539 }
1540
1541 if ((ps_ip->s_ive_ip.u4_disable_deblock_level != DISABLE_DEBLK_LEVEL_0)
1542 && (ps_ip->s_ive_ip.u4_disable_deblock_level != DISABLE_DEBLK_LEVEL_2)
1543 && (ps_ip->s_ive_ip.u4_disable_deblock_level != DISABLE_DEBLK_LEVEL_3)
1544 && (ps_ip->s_ive_ip.u4_disable_deblock_level != DISABLE_DEBLK_LEVEL_4))
1545 {
1546 ps_op->s_ive_op.u4_error_code |= 1
1547 << IVE_UNSUPPORTEDPARAM;
1548 ps_op->s_ive_op.u4_error_code |=
1549 IH264E_INVALID_DEBLOCKING_TYPE_INPUT;
1550 return IV_FAIL;
1551 }
1552
1553 break;
1554 }
1555
1556 case IVE_CMD_CTL_SET_QP:
1557 {
1558 ih264e_ctl_set_qp_ip_t *ps_ip = pv_api_ip;
1559 ih264e_ctl_set_qp_op_t *ps_op = pv_api_op;
1560
1561 if (ps_ip->s_ive_ip.u4_size
1562 != sizeof(ih264e_ctl_set_qp_ip_t))
1563 {
1564 ps_op->s_ive_op.u4_error_code |= 1
1565 << IVE_UNSUPPORTEDPARAM;
1566 ps_op->s_ive_op.u4_error_code |=
1567 IVE_ERR_IP_CTL_SETQPPARAMS_API_STRUCT_SIZE_INCORRECT;
1568 return IV_FAIL;
1569 }
1570
1571 if (ps_op->s_ive_op.u4_size
1572 != sizeof(ih264e_ctl_set_qp_op_t))
1573 {
1574 ps_op->s_ive_op.u4_error_code |= 1
1575 << IVE_UNSUPPORTEDPARAM;
1576 ps_op->s_ive_op.u4_error_code |=
1577 IVE_ERR_OP_CTL_SETQPPARAMS_API_STRUCT_SIZE_INCORRECT;
1578 return IV_FAIL;
1579 }
1580
1581 if ((ps_ip->s_ive_ip.u4_i_qp_max > MAX_H264_QP)
1582 || (ps_ip->s_ive_ip.u4_p_qp_max > MAX_H264_QP)
1583 || (ps_ip->s_ive_ip.u4_b_qp_max > MAX_H264_QP))
1584 {
1585 ps_op->s_ive_op.u4_error_code |= 1
1586 << IVE_UNSUPPORTEDPARAM;
1587 ps_op->s_ive_op.u4_error_code |=
1588 IH264E_INVALID_MAX_FRAME_QP;
1589 return IV_FAIL;
1590 }
1591
1592 /* We donot support QP < 4 */
1593 if ((ps_ip->s_ive_ip.u4_i_qp_min < 4)
1594 || (ps_ip->s_ive_ip.u4_p_qp_min < 4)
1595 || (ps_ip->s_ive_ip.u4_b_qp_min < 4)
1596 || (ps_ip->s_ive_ip.u4_i_qp_min > ps_ip->s_ive_ip.u4_i_qp_max)
1597 || (ps_ip->s_ive_ip.u4_p_qp_min > ps_ip->s_ive_ip.u4_p_qp_max)
1598 || (ps_ip->s_ive_ip.u4_b_qp_min > ps_ip->s_ive_ip.u4_b_qp_max))
1599 {
1600 ps_op->s_ive_op.u4_error_code |= 1
1601 << IVE_UNSUPPORTEDPARAM;
1602 ps_op->s_ive_op.u4_error_code |=
1603 IH264E_INVALID_MIN_FRAME_QP;
1604 return IV_FAIL;
1605 }
1606
1607 if ((ps_ip->s_ive_ip.u4_i_qp > ps_ip->s_ive_ip.u4_i_qp_max)
1608 || (ps_ip->s_ive_ip.u4_p_qp > ps_ip->s_ive_ip.u4_p_qp_max)
1609 || (ps_ip->s_ive_ip.u4_b_qp > ps_ip->s_ive_ip.u4_b_qp_max))
1610 {
1611 ps_op->s_ive_op.u4_error_code |= 1
1612 << IVE_UNSUPPORTEDPARAM;
1613 ps_op->s_ive_op.u4_error_code |= IH264E_INVALID_INIT_QP;
1614 return IV_FAIL;
1615 }
1616
1617 if ((ps_ip->s_ive_ip.u4_i_qp < ps_ip->s_ive_ip.u4_i_qp_min)
1618 || (ps_ip->s_ive_ip.u4_p_qp < ps_ip->s_ive_ip.u4_p_qp_min)
1619 || (ps_ip->s_ive_ip.u4_b_qp < ps_ip->s_ive_ip.u4_b_qp_min))
1620 {
1621 ps_op->s_ive_op.u4_error_code |= 1
1622 << IVE_UNSUPPORTEDPARAM;
1623 ps_op->s_ive_op.u4_error_code |= IH264E_INVALID_INIT_QP;
1624 return IV_FAIL;
1625 }
1626
1627 break;
1628 }
1629
1630 case IVE_CMD_CTL_SET_VUI_PARAMS:
1631 {
1632 ih264e_vui_ip_t *ps_ip = pv_api_ip;
1633 ih264e_vui_op_t *ps_op = pv_api_op;
1634
1635 if(ps_ip->u4_size != sizeof(ih264e_vui_ip_t))
1636 {
1637 ps_op->u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
1638 ps_op->u4_error_code |=
1639 IVE_ERR_IP_CTL_SET_VUI_STRUCT_SIZE_INCORRECT;
1640 return IV_FAIL;
1641 }
1642
1643 if(ps_op->u4_size != sizeof(ih264e_vui_op_t))
1644 {
1645 ps_op->u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
1646 ps_op->u4_error_code |=
1647 IVE_ERR_OP_CTL_SET_VUI_STRUCT_SIZE_INCORRECT;
1648 return IV_FAIL;
1649 }
1650
1651 break;
1652 }
1653
1654 case IVE_CMD_CTL_SET_ENC_MODE:
1655 {
1656 ih264e_ctl_set_enc_mode_ip_t *ps_ip = pv_api_ip;
1657 ih264e_ctl_set_enc_mode_op_t *ps_op = pv_api_op;
1658
1659 if (ps_ip->s_ive_ip.u4_size
1660 != sizeof(ih264e_ctl_set_enc_mode_ip_t))
1661 {
1662 ps_op->s_ive_op.u4_error_code |= 1
1663 << IVE_UNSUPPORTEDPARAM;
1664 ps_op->s_ive_op.u4_error_code |=
1665 IVE_ERR_IP_CTL_SETENCMODE_API_STRUCT_SIZE_INCORRECT;
1666 return IV_FAIL;
1667 }
1668
1669 if (ps_op->s_ive_op.u4_size
1670 != sizeof(ih264e_ctl_set_enc_mode_op_t))
1671 {
1672 ps_op->s_ive_op.u4_error_code |= 1
1673 << IVE_UNSUPPORTEDPARAM;
1674 ps_op->s_ive_op.u4_error_code |=
1675 IVE_ERR_OP_CTL_SETENCMODE_API_STRUCT_SIZE_INCORRECT;
1676 return IV_FAIL;
1677 }
1678
1679 if ((ps_ip->s_ive_ip.e_enc_mode != IVE_ENC_MODE_HEADER)
1680 && (ps_ip->s_ive_ip.e_enc_mode != IVE_ENC_MODE_PICTURE))
1681 {
1682 ps_op->s_ive_op.u4_error_code |= 1
1683 << IVE_UNSUPPORTEDPARAM;
1684 ps_op->s_ive_op.u4_error_code |=
1685 IH264E_INVALID_ENC_OPERATION_MODE;
1686 return IV_FAIL;
1687 }
1688
1689 break;
1690 }
1691
1692 case IVE_CMD_CTL_SET_VBV_PARAMS:
1693 {
1694 ih264e_ctl_set_vbv_params_ip_t *ps_ip = pv_api_ip;
1695 ih264e_ctl_set_vbv_params_op_t *ps_op = pv_api_op;
1696
1697 if (ps_ip->s_ive_ip.u4_size
1698 != sizeof(ih264e_ctl_set_vbv_params_ip_t))
1699 {
1700 ps_op->s_ive_op.u4_error_code |= 1
1701 << IVE_UNSUPPORTEDPARAM;
1702 ps_op->s_ive_op.u4_error_code |=
1703 IVE_ERR_IP_CTL_SETVBVPARAMS_API_STRUCT_SIZE_INCORRECT;
1704 return IV_FAIL;
1705 }
1706
1707 if (ps_op->s_ive_op.u4_size
1708 != sizeof(ih264e_ctl_set_vbv_params_op_t))
1709 {
1710 ps_op->s_ive_op.u4_error_code |= 1
1711 << IVE_UNSUPPORTEDPARAM;
1712 ps_op->s_ive_op.u4_error_code |=
1713 IVE_ERR_OP_CTL_SETVBVPARAMS_API_STRUCT_SIZE_INCORRECT;
1714 return IV_FAIL;
1715 }
1716
1717 if ((ps_ip->s_ive_ip.u4_vbv_buffer_delay < DEFAULT_MIN_BUFFER_DELAY)
1718 || (ps_ip->s_ive_ip.u4_vbv_buffer_delay > DEFAULT_MAX_BUFFER_DELAY))
1719 {
1720 ps_op->s_ive_op.u4_error_code |= 1
1721 << IVE_UNSUPPORTEDPARAM;
1722 ps_op->s_ive_op.u4_error_code |=
1723 IH264E_INVALID_BUFFER_DELAY;
1724 return IV_FAIL;
1725 }
1726
1727 break;
1728 }
1729
1730 case IVE_CMD_CTL_SET_AIR_PARAMS:
1731 {
1732 ih264e_ctl_set_air_params_ip_t *ps_ip = pv_api_ip;
1733 ih264e_ctl_set_air_params_op_t *ps_op = pv_api_op;
1734
1735 if (ps_ip->s_ive_ip.u4_size
1736 != sizeof(ih264e_ctl_set_air_params_ip_t))
1737 {
1738 ps_op->s_ive_op.u4_error_code |= 1
1739 << IVE_UNSUPPORTEDPARAM;
1740 ps_op->s_ive_op.u4_error_code |=
1741 IVE_ERR_IP_CTL_SETAIRPARAMS_API_STRUCT_SIZE_INCORRECT;
1742 return IV_FAIL;
1743 }
1744
1745 if (ps_op->s_ive_op.u4_size
1746 != sizeof(ih264e_ctl_set_air_params_op_t))
1747 {
1748 ps_op->s_ive_op.u4_error_code |= 1
1749 << IVE_UNSUPPORTEDPARAM;
1750 ps_op->s_ive_op.u4_error_code |=
1751 IVE_ERR_OP_CTL_SETAIRPARAMS_API_STRUCT_SIZE_INCORRECT;
1752 return IV_FAIL;
1753 }
1754
1755 if ((ps_ip->s_ive_ip.e_air_mode != IVE_AIR_MODE_NONE)
1756 && (ps_ip->s_ive_ip.e_air_mode != IVE_AIR_MODE_CYCLIC)
1757 && (ps_ip->s_ive_ip.e_air_mode != IVE_AIR_MODE_RANDOM))
1758 {
1759 ps_op->s_ive_op.u4_error_code |= 1
1760 << IVE_UNSUPPORTEDPARAM;
1761 ps_op->s_ive_op.u4_error_code |=
1762 IH264E_INVALID_AIR_MODE;
1763 return IV_FAIL;
1764 }
1765
1766 if (ps_ip->s_ive_ip.u4_air_refresh_period == 0)
1767 {
1768 ps_op->s_ive_op.u4_error_code |= 1
1769 << IVE_UNSUPPORTEDPARAM;
1770 ps_op->s_ive_op.u4_error_code |=
1771 IH264E_INVALID_AIR_REFRESH_PERIOD;
1772 return IV_FAIL;
1773 }
1774
1775 break;
1776 }
1777
1778 case IVE_CMD_CTL_SET_PROFILE_PARAMS:
1779 {
1780 ih264e_ctl_set_profile_params_ip_t *ps_ip = pv_api_ip;
1781 ih264e_ctl_set_profile_params_op_t *ps_op = pv_api_op;
1782
1783 if (ps_ip->s_ive_ip.u4_size
1784 != sizeof(ih264e_ctl_set_profile_params_ip_t))
1785 {
1786 ps_op->s_ive_op.u4_error_code |= 1
1787 << IVE_UNSUPPORTEDPARAM;
1788 ps_op->s_ive_op.u4_error_code |=
1789 IVE_ERR_IP_CTL_SETPROFILE_API_STRUCT_SIZE_INCORRECT;
1790 return IV_FAIL;
1791 }
1792
1793 if (ps_op->s_ive_op.u4_size
1794 != sizeof(ih264e_ctl_set_profile_params_op_t))
1795 {
1796 ps_op->s_ive_op.u4_error_code |= 1
1797 << IVE_UNSUPPORTEDPARAM;
1798 ps_op->s_ive_op.u4_error_code |=
1799 IVE_ERR_OP_CTL_SETPROFILE_API_STRUCT_SIZE_INCORRECT;
1800 return IV_FAIL;
1801 }
1802
1803 if (ps_ip->s_ive_ip.e_profile != IV_PROFILE_BASE &&
1804 ps_ip->s_ive_ip.e_profile != IV_PROFILE_MAIN)
1805 {
1806 ps_op->s_ive_op.u4_error_code |= 1
1807 << IVE_UNSUPPORTEDPARAM;
1808 ps_op->s_ive_op.u4_error_code |=
1809 IH264E_PROFILE_NOT_SUPPORTED;
1810 return IV_FAIL;
1811 }
1812
1813 if (ps_ip->s_ive_ip.u4_entropy_coding_mode > 1)
1814 {
1815 ps_op->s_ive_op.u4_error_code |= 1
1816 << IVE_UNSUPPORTEDPARAM;
1817 ps_op->s_ive_op.u4_error_code |=
1818 IH264E_INVALID_ENTROPY_CODING_MODE;
1819 return IV_FAIL;
1820 }
1821
1822 break;
1823 }
1824
1825 default:
1826 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
1827 *(pu4_api_op + 1) |= IVE_ERR_INVALID_API_SUB_CMD;
1828 return IV_FAIL;
1829 }
1830
1831 break;
1832 }
1833
1834 default:
1835 *(pu4_api_op + 1) |= 1 << IVE_UNSUPPORTEDPARAM;
1836 *(pu4_api_op + 1) |= IVE_ERR_INVALID_API_CMD;
1837 return IV_FAIL;
1838 }
1839
1840 return IV_SUCCESS;
1841 }
1842
1843 /**
1844 *******************************************************************************
1845 *
1846 * @brief update encoder configuration parameters
1847 *
1848 * @par Description:
1849 * updates encoder configuration parameters from the given config set.
1850 * Initialize/reinitialize codec parameters according to new configurations.
1851 *
1852 * @param[in] ps_codec
1853 * Pointer to codec context
1854 *
1855 * @param[in] ps_cfg
1856 * Pointer to config param set
1857 *
1858 * @remarks none
1859 *
1860 *******************************************************************************
1861 */
ih264e_codec_update_config(codec_t * ps_codec,cfg_params_t * ps_cfg)1862 IH264E_ERROR_T ih264e_codec_update_config(codec_t *ps_codec,
1863 cfg_params_t *ps_cfg)
1864 {
1865 /* config params */
1866 cfg_params_t *ps_curr_cfg = &ps_codec->s_cfg;
1867
1868 /* error status */
1869 IH264E_ERROR_T err = IH264E_SUCCESS;
1870
1871 /* temp var */
1872 UWORD32 u4_init_rc = 0;
1873
1874 /***********************/
1875 /* UPDATE CODEC CONFIG */
1876 /***********************/
1877 if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_DIMENSIONS)
1878 {
1879 UWORD32 wd_aln = ALIGN16(ps_cfg->u4_wd);
1880 UWORD32 ht_aln = ALIGN16(ps_cfg->u4_ht);
1881
1882 if (ps_curr_cfg->u4_wd != wd_aln || ps_curr_cfg->u4_ht != ht_aln
1883 || ps_curr_cfg->u4_disp_wd != ps_cfg->u4_disp_wd
1884 || ps_curr_cfg->u4_disp_ht != ps_cfg->u4_disp_ht)
1885 {
1886 ps_curr_cfg->u4_wd = wd_aln;
1887 ps_curr_cfg->u4_ht = ht_aln;
1888
1889 ps_curr_cfg->u4_disp_wd = ps_cfg->u4_disp_wd;
1890 ps_curr_cfg->u4_disp_ht = ps_cfg->u4_disp_ht;
1891
1892 ps_curr_cfg->i4_wd_mbs = ps_curr_cfg->u4_wd >> 4;
1893 ps_curr_cfg->i4_ht_mbs = ps_curr_cfg->u4_ht >> 4;
1894
1895 ps_codec->i4_rec_strd = ALIGN16(ps_cfg->u4_wd) + PAD_WD;
1896
1897 /* If number of MBs in a frame changes the air map also changes.
1898 * Hence recompute air map also reset air pic cnt */
1899 if (ps_codec->s_cfg.e_air_mode != IVE_AIR_MODE_NONE)
1900 {
1901 /* re-init the air map */
1902 ih264e_init_air_map(ps_codec);
1903
1904 /* reset air counter */
1905 ps_codec->i4_air_pic_cnt = -1;
1906 }
1907
1908 /* initialize mv bank buffer manager */
1909 err = ih264e_mv_buf_mgr_add_bufs(ps_codec);
1910 if (err != IH264E_SUCCESS)
1911 return err;
1912
1913 /* initialize ref bank buffer manager */
1914 err = ih264e_pic_buf_mgr_add_bufs(ps_codec);
1915 if (err != IH264E_SUCCESS)
1916 return err;
1917
1918 /* since dimension changed, start new sequence by forcing IDR */
1919 ps_codec->force_curr_frame_type = IV_IDR_FRAME;
1920
1921 /* in case dimension changes, we need to reinitialize RC as the
1922 * old model shall not fit further */
1923 u4_init_rc = 1;
1924
1925 /* when the dimension changes, the header needs to be regenerated */
1926 ps_codec->i4_gen_header = 1;
1927 }
1928 }
1929 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_FRAMERATE)
1930 {
1931 /* temp var */
1932 UWORD32 u4_src_ticks, u4_tgt_ticks;
1933
1934 u4_src_ticks = ih264e_frame_time_get_src_ticks(
1935 ps_codec->s_rate_control.pps_frame_time);
1936
1937 u4_tgt_ticks = ih264e_frame_time_get_tgt_ticks(
1938 ps_codec->s_rate_control.pps_frame_time);
1939
1940 /* Change frame rate */
1941 if (ps_codec->s_cfg.u4_src_frame_rate
1942 != ps_cfg->u4_src_frame_rate * 1000)
1943 {
1944 ps_codec->s_cfg.u4_src_frame_rate = ps_cfg->u4_src_frame_rate
1945 * 1000;
1946
1947 ih264e_frame_time_update_src_frame_rate(
1948 ps_codec->s_rate_control.pps_frame_time,
1949 ps_codec->s_cfg.u4_src_frame_rate);
1950
1951 ih264_time_stamp_update_frame_rate(
1952 ps_codec->s_rate_control.pps_time_stamp,
1953 ps_codec->s_cfg.u4_src_frame_rate);
1954
1955 irc_change_frame_rate(ps_codec->s_rate_control.pps_rate_control_api,
1956 ps_codec->s_cfg.u4_src_frame_rate,
1957 u4_src_ticks, u4_tgt_ticks);
1958 }
1959
1960 if (ps_codec->s_cfg.u4_tgt_frame_rate
1961 != ps_cfg->u4_tgt_frame_rate * 1000)
1962 {
1963 ps_codec->s_cfg.u4_tgt_frame_rate = ps_cfg->u4_tgt_frame_rate
1964 * 1000;
1965
1966 ih264e_frame_time_update_tgt_frame_rate(
1967 ps_codec->s_rate_control.pps_frame_time,
1968 ps_codec->s_cfg.u4_tgt_frame_rate);
1969
1970 irc_change_frame_rate(ps_codec->s_rate_control.pps_rate_control_api,
1971 ps_codec->s_cfg.u4_src_frame_rate,
1972 u4_src_ticks, u4_tgt_ticks);
1973
1974 irc_change_frm_rate_for_bit_alloc(
1975 ps_codec->s_rate_control.pps_rate_control_api,
1976 ps_codec->s_cfg.u4_tgt_frame_rate);
1977 }
1978
1979 }
1980 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_BITRATE)
1981 {
1982 if (ps_curr_cfg->u4_target_bitrate != ps_cfg->u4_target_bitrate)
1983 {
1984 if (IVE_RC_NONE != ps_curr_cfg->e_rc_mode)
1985 irc_change_avg_bit_rate(
1986 ps_codec->s_rate_control.pps_rate_control_api,
1987 ps_cfg->u4_target_bitrate);
1988
1989 ps_curr_cfg->u4_target_bitrate = ps_cfg->u4_target_bitrate;
1990 }
1991 }
1992 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_FRAMETYPE)
1993 {
1994 switch (ps_cfg->e_frame_type)
1995 {
1996 case IV_I_FRAME:
1997 ps_codec->force_curr_frame_type = IV_I_FRAME;
1998 break;
1999
2000 case IV_IDR_FRAME:
2001 ps_codec->force_curr_frame_type = IV_IDR_FRAME;
2002 break;
2003
2004 case IV_P_FRAME:
2005 default:
2006 break;
2007 }
2008 }
2009 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_ME_PARAMS)
2010 {
2011 if (ps_curr_cfg->u4_enc_speed_preset == IVE_CONFIG)
2012 {
2013 ps_codec->s_cfg.u4_enable_hpel = ps_cfg->u4_enable_hpel;
2014 ps_codec->s_cfg.u4_enable_fast_sad = ps_cfg->u4_enable_fast_sad;
2015 ps_codec->s_cfg.u4_me_speed_preset = ps_cfg->u4_me_speed_preset;
2016 ps_codec->s_cfg.u4_enable_qpel = ps_cfg->u4_enable_qpel;
2017 }
2018 else if (ps_curr_cfg->u4_enc_speed_preset == IVE_FASTEST)
2019 {
2020 ps_codec->s_cfg.u4_enable_fast_sad = ps_cfg->u4_enable_fast_sad;
2021 }
2022 ps_codec->s_cfg.u4_srch_rng_x = ps_cfg->u4_srch_rng_x;
2023 ps_codec->s_cfg.u4_srch_rng_y = ps_cfg->u4_srch_rng_y;
2024
2025 if (ps_codec->s_cfg.u4_enable_alt_ref != ps_cfg->u4_enable_alt_ref)
2026 {
2027 ps_codec->s_cfg.u4_enable_alt_ref = ps_cfg->u4_enable_alt_ref;
2028 ps_codec->u4_is_curr_frm_ref = 1;
2029 }
2030 }
2031 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_IPE_PARAMS)
2032 {
2033 ps_curr_cfg->u4_enc_speed_preset = ps_cfg->u4_enc_speed_preset;
2034 ps_curr_cfg->u4_constrained_intra_pred = ps_cfg->u4_constrained_intra_pred;
2035 if (ps_curr_cfg->u4_enc_speed_preset == IVE_SLOWEST)
2036 {/* high quality */
2037 /* enable diamond search */
2038 ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
2039 ps_curr_cfg->u4_enable_fast_sad = 0;
2040
2041 /* disable intra 4x4 */
2042 ps_curr_cfg->u4_enable_intra_4x4 = 1;
2043 ps_codec->luma_energy_compaction[1] =
2044 ih264e_code_luma_intra_macroblock_4x4_rdopt_on;
2045
2046 /* sub pel off */
2047 ps_curr_cfg->u4_enable_hpel = 1;
2048
2049 /* deblocking off */
2050 ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0;
2051
2052 /* disabled intra inter gating in Inter slices */
2053 ps_codec->u4_inter_gate = 0;
2054 }
2055 else if (ps_curr_cfg->u4_enc_speed_preset == IVE_NORMAL)
2056 {/* normal */
2057 /* enable diamond search */
2058 ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
2059 ps_curr_cfg->u4_enable_fast_sad = 0;
2060
2061 /* disable intra 4x4 */
2062 ps_curr_cfg->u4_enable_intra_4x4 = 1;
2063
2064 /* sub pel off */
2065 ps_curr_cfg->u4_enable_hpel = 1;
2066
2067 /* deblocking off */
2068 ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0;
2069
2070 /* disabled intra inter gating in Inter slices */
2071 ps_codec->u4_inter_gate = 0;
2072 }
2073 else if (ps_curr_cfg->u4_enc_speed_preset == IVE_FAST)
2074 {/* normal */
2075 /* enable diamond search */
2076 ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
2077 ps_curr_cfg->u4_enable_fast_sad = 0;
2078
2079 /* disable intra 4x4 */
2080 ps_curr_cfg->u4_enable_intra_4x4 = 0;
2081
2082 /* sub pel off */
2083 ps_curr_cfg->u4_enable_hpel = 1;
2084
2085 /* deblocking off */
2086 ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0;
2087
2088 /* disabled intra inter gating in Inter slices */
2089 ps_codec->u4_inter_gate = 1;
2090 }
2091 else if (ps_curr_cfg->u4_enc_speed_preset == IVE_HIGH_SPEED)
2092 {/* fast */
2093 /* enable diamond search */
2094 ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
2095 ps_curr_cfg->u4_enable_fast_sad = 0;
2096
2097 /* disable intra 4x4 */
2098 ps_curr_cfg->u4_enable_intra_4x4 = 0;
2099
2100 /* sub pel off */
2101 ps_curr_cfg->u4_enable_hpel = 0;
2102
2103 /* deblocking off */
2104 ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_4;
2105
2106 /* disabled intra inter gating in Inter slices */
2107 ps_codec->u4_inter_gate = 0;
2108 }
2109 else if (ps_curr_cfg->u4_enc_speed_preset == IVE_FASTEST)
2110 {/* fastest */
2111 /* enable diamond search */
2112 ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
2113 //u4_num_layers = 4;
2114
2115 /* disable intra 4x4 */
2116 ps_curr_cfg->u4_enable_intra_4x4 = 0;
2117
2118 /* sub pel off */
2119 ps_curr_cfg->u4_enable_hpel = 0;
2120
2121 /* deblocking off */
2122 ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_4;
2123
2124 /* disabled intra inter gating in Inter slices */
2125 ps_codec->u4_inter_gate = 1;
2126 }
2127 else if (ps_curr_cfg->u4_enc_speed_preset == IVE_CONFIG)
2128 {
2129 ps_curr_cfg->u4_enable_intra_4x4 = ps_cfg->u4_enable_intra_4x4;
2130 }
2131 }
2132 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_GOP_PARAMS)
2133 {
2134 if (ps_curr_cfg->u4_i_frm_interval != ps_cfg->u4_i_frm_interval)
2135 {
2136 ps_curr_cfg->u4_i_frm_interval = ps_cfg->u4_i_frm_interval;
2137
2138 /* reset air counter */
2139 ps_codec->i4_air_pic_cnt = -1;
2140
2141 /* re-init air map */
2142 ih264e_init_air_map(ps_codec);
2143
2144 /*Effect intra frame interval change*/
2145
2146 irc_change_intra_frm_int_call(
2147 ps_codec->s_rate_control.pps_rate_control_api,
2148 ps_curr_cfg->u4_i_frm_interval);
2149 }
2150
2151 ps_curr_cfg->u4_idr_frm_interval = ps_cfg->u4_idr_frm_interval;
2152
2153 }
2154 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_DEBLOCK_PARAMS)
2155 {
2156 if (ps_curr_cfg->u4_enc_speed_preset == IVE_CONFIG)
2157 {
2158 ps_curr_cfg->u4_disable_deblock_level =
2159 ps_cfg->u4_disable_deblock_level;
2160 }
2161 }
2162 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_QP)
2163 {
2164 UWORD8 au1_init_qp[MAX_PIC_TYPE];
2165 UWORD8 au1_min_max_qp[2 * MAX_PIC_TYPE];
2166
2167 ps_codec->s_cfg.u4_i_qp_max = ps_cfg->u4_i_qp_max;
2168 ps_codec->s_cfg.u4_i_qp_min = ps_cfg->u4_i_qp_min;
2169 ps_codec->s_cfg.u4_i_qp = ps_cfg->u4_i_qp;
2170
2171 ps_codec->s_cfg.u4_p_qp_max = ps_cfg->u4_p_qp_max;
2172 ps_codec->s_cfg.u4_p_qp_min = ps_cfg->u4_p_qp_min;
2173 ps_codec->s_cfg.u4_p_qp = ps_cfg->u4_p_qp;
2174
2175 ps_codec->s_cfg.u4_b_qp_max = ps_cfg->u4_b_qp_max;
2176 ps_codec->s_cfg.u4_b_qp_min = ps_cfg->u4_b_qp_min;
2177 ps_codec->s_cfg.u4_b_qp = ps_cfg->u4_b_qp;
2178
2179 /* update rc lib with modified qp */
2180 au1_init_qp[0] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp];
2181 au1_init_qp[1] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp];
2182 au1_init_qp[2] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp];
2183
2184 irc_change_init_qp(ps_codec->s_rate_control.pps_rate_control_api,
2185 au1_init_qp);
2186
2187 au1_min_max_qp[2 * I_PIC] =
2188 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp_min];
2189 au1_min_max_qp[2 * I_PIC + 1] =
2190 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp_max];
2191
2192 au1_min_max_qp[2 * P_PIC] =
2193 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp_min];
2194 au1_min_max_qp[2 * P_PIC + 1] =
2195 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp_max];
2196
2197 au1_min_max_qp[2 * B_PIC] =
2198 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp_min];
2199 au1_min_max_qp[2 * B_PIC + 1] =
2200 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp_max];
2201
2202 irc_change_min_max_qp(ps_codec->s_rate_control.pps_rate_control_api,
2203 au1_min_max_qp);
2204 }
2205 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_ENC_MODE)
2206 {
2207 ps_codec->s_cfg.e_enc_mode = ps_cfg->e_enc_mode;
2208
2209 if (ps_codec->s_cfg.e_enc_mode == IVE_ENC_MODE_HEADER)
2210 {
2211 ps_codec->i4_header_mode = 1;
2212 ps_codec->s_cfg.e_enc_mode = IVE_ENC_MODE_PICTURE;
2213 }
2214 else
2215 {
2216 ps_codec->i4_header_mode = 0;
2217 }
2218 }
2219 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_VBV_PARAMS
2220 && IVE_RC_NONE != ps_codec->s_cfg.e_rc_mode)
2221 {
2222 ps_codec->s_cfg.u4_vbv_buf_size = ps_cfg->u4_vbv_buf_size;
2223 ps_codec->s_cfg.u4_vbv_buffer_delay = ps_cfg->u4_vbv_buffer_delay;
2224
2225 // irc_change_buffer_delay(ps_codec->s_rate_control.pps_rate_control_api, ps_codec->s_cfg.u4_vbv_buffer_delay);
2226
2227 // TODO: remove this when the support for changing buffer dynamically
2228 // is yet to be added.
2229 u4_init_rc = 1;
2230 }
2231 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_AIR_PARAMS)
2232 {
2233 if (ps_curr_cfg->e_air_mode != ps_cfg->e_air_mode
2234 || ps_curr_cfg->u4_air_refresh_period
2235 != ps_cfg->u4_air_refresh_period)
2236 {
2237 ps_curr_cfg->e_air_mode = ps_cfg->e_air_mode;
2238 ps_curr_cfg->u4_air_refresh_period = ps_cfg->u4_air_refresh_period;
2239
2240 ih264e_init_air_map(ps_codec);
2241
2242 /* reset air counter */
2243 ps_codec->i4_air_pic_cnt = -1;
2244 }
2245 }
2246 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_PROFILE_PARAMS)
2247 {
2248 ps_codec->s_cfg.e_profile = ps_cfg->e_profile;
2249 ps_codec->s_cfg.u4_entropy_coding_mode = ps_cfg->u4_entropy_coding_mode;
2250 }
2251 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_NUM_CORES)
2252 {
2253 ps_codec->s_cfg.u4_num_cores = ps_cfg->u4_num_cores;
2254 }
2255 else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_VUI_PARAMS)
2256 {
2257 ps_codec->s_cfg.s_vui = ps_cfg->s_vui;
2258 }
2259 /* reset RC model */
2260 if (u4_init_rc)
2261 {
2262 /* init qp */
2263 UWORD8 au1_init_qp[MAX_PIC_TYPE];
2264
2265 /* min max qp */
2266 UWORD8 au1_min_max_qp[2 * MAX_PIC_TYPE];
2267
2268 /* init i,p,b qp */
2269 au1_init_qp[0] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp];
2270 au1_init_qp[1] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp];
2271 au1_init_qp[2] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp];
2272
2273 /* init min max qp */
2274 au1_min_max_qp[2 * I_PIC] =
2275 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp_min];
2276 au1_min_max_qp[2 * I_PIC + 1] =
2277 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_i_qp_max];
2278
2279 au1_min_max_qp[2 * P_PIC] =
2280 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp_min];
2281 au1_min_max_qp[2 * P_PIC + 1] =
2282 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_p_qp_max];
2283
2284 au1_min_max_qp[2 * B_PIC] =
2285 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp_min];
2286 au1_min_max_qp[2 * B_PIC + 1] =
2287 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.u4_b_qp_max];
2288
2289 /* get rc mode */
2290 switch (ps_codec->s_cfg.e_rc_mode)
2291 {
2292 case IVE_RC_STORAGE:
2293 ps_codec->s_rate_control.e_rc_type = VBR_STORAGE;
2294 break;
2295
2296 case IVE_RC_CBR_NON_LOW_DELAY:
2297 ps_codec->s_rate_control.e_rc_type = CBR_NLDRC;
2298 break;
2299
2300 case IVE_RC_CBR_LOW_DELAY:
2301 ps_codec->s_rate_control.e_rc_type = CBR_LDRC;
2302 break;
2303
2304 case IVE_RC_NONE:
2305 ps_codec->s_rate_control.e_rc_type = CONST_QP;
2306 break;
2307
2308 default:
2309 break;
2310 }
2311
2312 /* init rate control */
2313 ih264e_rc_init(ps_codec->s_rate_control.pps_rate_control_api,
2314 ps_codec->s_rate_control.pps_frame_time,
2315 ps_codec->s_rate_control.pps_time_stamp,
2316 ps_codec->s_rate_control.pps_pd_frm_rate,
2317 ps_codec->s_cfg.u4_max_framerate,
2318 ps_codec->s_cfg.u4_src_frame_rate,
2319 ps_codec->s_cfg.u4_tgt_frame_rate,
2320 ps_codec->s_rate_control.e_rc_type,
2321 ps_codec->s_cfg.u4_target_bitrate,
2322 ps_codec->s_cfg.u4_max_bitrate,
2323 ps_codec->s_cfg.u4_vbv_buffer_delay,
2324 ps_codec->s_cfg.u4_i_frm_interval,
2325 ps_codec->s_cfg.u4_num_bframes + 1, au1_init_qp,
2326 ps_codec->s_cfg.u4_num_bframes + 2, au1_min_max_qp,
2327 ps_codec->s_cfg.u4_max_level);
2328 }
2329
2330 return err;
2331 }
2332
2333 /**
2334 *******************************************************************************
2335 *
2336 * @brief
2337 * Sets default encoder config parameters
2338 *
2339 * @par Description:
2340 * Sets default dynamic parameters. Will be called in ih264e_init() to ensure
2341 * that even if set_params is not called, codec continues to work
2342 *
2343 * @param[in] ps_cfg
2344 * Pointer to encoder config params
2345 *
2346 * @returns error status
2347 *
2348 * @remarks none
2349 *
2350 *******************************************************************************
2351 */
ih264e_set_default_params(cfg_params_t * ps_cfg)2352 static WORD32 ih264e_set_default_params(cfg_params_t *ps_cfg)
2353 {
2354 WORD32 ret = IV_SUCCESS;
2355
2356 ps_cfg->u4_max_wd = MAX_WD;
2357 ps_cfg->u4_max_ht = MAX_HT;
2358 ps_cfg->u4_max_ref_cnt = MAX_REF_CNT;
2359 ps_cfg->u4_max_reorder_cnt = MAX_REF_CNT;
2360 ps_cfg->u4_max_level = DEFAULT_MAX_LEVEL;
2361 ps_cfg->e_inp_color_fmt = IV_YUV_420SP_UV;
2362 ps_cfg->u4_enable_recon = DEFAULT_RECON_ENABLE;
2363 ps_cfg->e_recon_color_fmt = IV_YUV_420P;
2364 ps_cfg->u4_enc_speed_preset = IVE_FASTEST;
2365 ps_cfg->e_rc_mode = DEFAULT_RC;
2366 ps_cfg->u4_max_framerate = DEFAULT_MAX_FRAMERATE;
2367 ps_cfg->u4_max_bitrate = DEFAULT_MAX_BITRATE;
2368 ps_cfg->u4_num_bframes = DEFAULT_MAX_NUM_BFRAMES;
2369 ps_cfg->e_content_type = IV_PROGRESSIVE;
2370 ps_cfg->u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
2371 ps_cfg->u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
2372 ps_cfg->e_slice_mode = IVE_SLICE_MODE_NONE;
2373 ps_cfg->u4_slice_param = DEFAULT_SLICE_PARAM;
2374 ps_cfg->e_arch = ih264e_default_arch();
2375 ps_cfg->e_soc = SOC_GENERIC;
2376 ps_cfg->u4_disp_wd = MAX_WD;
2377 ps_cfg->u4_disp_ht = MAX_HT;
2378 ps_cfg->u4_wd = MAX_WD;
2379 ps_cfg->u4_ht = MAX_HT;
2380 ps_cfg->u4_src_frame_rate = DEFAULT_SRC_FRAME_RATE;
2381 ps_cfg->u4_tgt_frame_rate = DEFAULT_TGT_FRAME_RATE;
2382 ps_cfg->u4_target_bitrate = DEFAULT_BITRATE;
2383 ps_cfg->e_frame_type = IV_NA_FRAME;
2384 ps_cfg->e_enc_mode = IVE_ENC_MODE_DEFAULT;
2385 ps_cfg->u4_i_qp = DEFAULT_I_QP;
2386 ps_cfg->u4_p_qp = DEFAULT_P_QP;
2387 ps_cfg->u4_b_qp = DEFAULT_B_QP;
2388 ps_cfg->u4_i_qp_min = DEFAULT_QP_MIN;
2389 ps_cfg->u4_i_qp_max = DEFAULT_QP_MAX;
2390 ps_cfg->u4_p_qp_min = DEFAULT_QP_MIN;
2391 ps_cfg->u4_p_qp_max = DEFAULT_QP_MAX;
2392 ps_cfg->u4_b_qp_min = DEFAULT_QP_MIN;
2393 ps_cfg->u4_b_qp_max = DEFAULT_QP_MAX;
2394 ps_cfg->e_air_mode = DEFAULT_AIR_MODE;
2395 ps_cfg->u4_air_refresh_period = DEFAULT_AIR_REFRESH_PERIOD;
2396 ps_cfg->u4_vbv_buffer_delay = DEFAULT_VBV_DELAY;
2397 ps_cfg->u4_vbv_buf_size = DEFAULT_VBV_SIZE;
2398 ps_cfg->u4_num_cores = DEFAULT_NUM_CORES;
2399 ps_cfg->u4_me_speed_preset = DEFAULT_ME_SPEED_PRESET;
2400 ps_cfg->u4_enable_hpel = DEFAULT_HPEL;
2401 ps_cfg->u4_enable_qpel = DEFAULT_QPEL;
2402 ps_cfg->u4_enable_intra_4x4 = DEFAULT_I4;
2403 ps_cfg->u4_enable_intra_8x8 = DEFAULT_I8;
2404 ps_cfg->u4_enable_intra_16x16 = DEFAULT_I16;
2405 ps_cfg->u4_enable_fast_sad = DEFAULT_ENABLE_FAST_SAD;
2406 ps_cfg->u4_enable_satqd = DEFAULT_ENABLE_SATQD;
2407 ps_cfg->i4_min_sad =
2408 (ps_cfg->u4_enable_satqd == DEFAULT_ENABLE_SATQD) ?
2409 DEFAULT_MIN_SAD_ENABLE :
2410 DEFAULT_MIN_SAD_DISABLE;
2411 ps_cfg->u4_srch_rng_x = DEFAULT_SRCH_RNG_X;
2412 ps_cfg->u4_srch_rng_y = DEFAULT_SRCH_RNG_Y;
2413 ps_cfg->u4_i_frm_interval = DEFAULT_I_INTERVAL;
2414 ps_cfg->u4_idr_frm_interval = DEFAULT_IDR_INTERVAL;
2415 ps_cfg->u4_disable_deblock_level = DEFAULT_DISABLE_DEBLK_LEVEL;
2416 ps_cfg->e_profile = DEFAULT_PROFILE;
2417 ps_cfg->u4_timestamp_low = 0;
2418 ps_cfg->u4_timestamp_high = 0;
2419 ps_cfg->u4_is_valid = 1;
2420 ps_cfg->e_cmd = IVE_CMD_CT_NA;
2421 ps_cfg->i4_wd_mbs = ps_cfg->u4_max_wd >> 4;
2422 ps_cfg->i4_ht_mbs = ps_cfg->u4_max_ht >> 4;
2423 ps_cfg->u4_entropy_coding_mode = CAVLC;
2424 ps_cfg->u4_weighted_prediction = 0;
2425 ps_cfg->u4_constrained_intra_pred = 0;
2426 ps_cfg->u4_pic_info_type = 0;
2427 ps_cfg->u4_mb_info_type = 0;
2428
2429 return ret;
2430 }
2431
2432 /**
2433 *******************************************************************************
2434 *
2435 * @brief
2436 * Initialize encoder context. This will be called by init_mem_rec and during
2437 * codec reset
2438 *
2439 * @par Description:
2440 * Initializes the context
2441 *
2442 * @param[in] ps_codec
2443 * Codec context pointer
2444 *
2445 * @returns error status
2446 *
2447 * @remarks none
2448 *
2449 *******************************************************************************
2450 */
ih264e_init(codec_t * ps_codec)2451 static WORD32 ih264e_init(codec_t *ps_codec)
2452 {
2453 /* enc config param set */
2454 cfg_params_t *ps_cfg = &(ps_codec->s_cfg);
2455
2456 /* temp var */
2457 WORD32 i;
2458
2459 /* coded pic count */
2460 ps_codec->i4_poc = 0;
2461
2462 /* Number of API calls to encode are made */
2463 ps_codec->i4_encode_api_call_cnt = -1;
2464
2465 /* Indicates no header has been generated yet */
2466 ps_codec->u4_header_generated = 0;
2467
2468 /* Number of pictures encoded */
2469 ps_codec->i4_pic_cnt = -1;
2470
2471 /* Number of threads created */
2472 ps_codec->i4_proc_thread_cnt = 0;
2473
2474 /* ctl mutex init */
2475 ithread_mutex_init(ps_codec->pv_ctl_mutex);
2476
2477 /* Set encoder chroma format */
2478 ps_codec->e_codec_color_format =
2479 (ps_cfg->e_inp_color_fmt == IV_YUV_420SP_VU) ?
2480 IV_YUV_420SP_VU : IV_YUV_420SP_UV;
2481
2482 /* Number of continuous frames where deblocking was disabled */
2483 ps_codec->i4_disable_deblk_pic_cnt = 0;
2484
2485 /* frame num */
2486 ps_codec->i4_frame_num = 0;
2487
2488 /* set the current frame type to I frame, since we are going to start encoding*/
2489 ps_codec->force_curr_frame_type = IV_NA_FRAME;
2490
2491 /* idr_pic_id */
2492 ps_codec->i4_idr_pic_id = -1;
2493
2494 /* Flush mode */
2495 ps_codec->i4_flush_mode = 0;
2496
2497 /* Encode header mode */
2498 ps_codec->i4_header_mode = 0;
2499
2500 /* Encode generate header */
2501 ps_codec->i4_gen_header = 0;
2502
2503 /* To signal successful completion of init */
2504 ps_codec->i4_init_done = 1;
2505
2506 /* To signal that at least one picture was decoded */
2507 ps_codec->i4_first_pic_done = 0;
2508
2509 /* Reset Codec */
2510 ps_codec->i4_reset_flag = 0;
2511
2512 /* Current error code */
2513 ps_codec->i4_error_code = IH264E_SUCCESS;
2514
2515 /* threshold residue */
2516 ps_codec->u4_thres_resi = 1;
2517
2518 /* inter gating enable */
2519 ps_codec->u4_inter_gate = 0;
2520
2521 /* entropy mutex init */
2522 ithread_mutex_init(ps_codec->pv_entropy_mutex);
2523
2524 /* sps id */
2525 ps_codec->i4_sps_id = 0;
2526
2527 /* sps id */
2528 ps_codec->i4_pps_id = 0;
2529
2530 /* Process thread created status */
2531 memset(ps_codec->ai4_process_thread_created, 0, MAX_PROCESS_THREADS);
2532
2533 /* Number of MBs processed together */
2534 ps_codec->i4_proc_nmb = 8;
2535
2536 /* Previous POC msb */
2537 ps_codec->i4_prev_poc_msb = 0;
2538
2539 /* Previous POC lsb */
2540 ps_codec->i4_prev_poc_lsb = -1;
2541
2542 /* max Previous POC lsb */
2543 ps_codec->i4_max_prev_poc_lsb = -1;
2544
2545 /* sps, pps status */
2546 {
2547 sps_t *ps_sps = ps_codec->ps_sps_base;
2548 pps_t *ps_pps = ps_codec->ps_pps_base;
2549
2550 for (i = 0; i < MAX_SPS_CNT; i++)
2551 {
2552 ps_sps->i1_sps_valid = 0;
2553 ps_sps++;
2554 }
2555
2556 for (i = 0; i < MAX_PPS_CNT; i++)
2557 {
2558 ps_pps->i1_pps_valid = 0;
2559 ps_pps++;
2560 }
2561 }
2562
2563 {
2564 WORD32 max_mb_rows = ps_cfg->i4_ht_mbs;
2565
2566 WORD32 num_jobs = max_mb_rows * MAX_CTXT_SETS;
2567 WORD32 clz;
2568
2569 /* Use next power of two number of entries*/
2570 clz = CLZ(num_jobs);
2571 num_jobs = 1 << (32 - clz);
2572
2573 /* init process jobq */
2574 ps_codec->pv_proc_jobq = ih264_list_init(
2575 ps_codec->pv_proc_jobq_buf,
2576 ps_codec->i4_proc_jobq_buf_size, num_jobs,
2577 sizeof(job_t), 10);
2578 RETURN_IF((ps_codec->pv_proc_jobq == NULL), IV_FAIL);
2579 ih264_list_reset(ps_codec->pv_proc_jobq);
2580
2581 /* init entropy jobq */
2582 ps_codec->pv_entropy_jobq = ih264_list_init(
2583 ps_codec->pv_entropy_jobq_buf,
2584 ps_codec->i4_entropy_jobq_buf_size, num_jobs,
2585 sizeof(job_t), 10);
2586 RETURN_IF((ps_codec->pv_entropy_jobq == NULL), IV_FAIL);
2587 ih264_list_reset(ps_codec->pv_entropy_jobq);
2588 }
2589
2590 /* Update the jobq context to all the threads */
2591 for (i = 0; i < MAX_PROCESS_CTXT; i++)
2592 {
2593 ps_codec->as_process[i].pv_proc_jobq = ps_codec->pv_proc_jobq;
2594 ps_codec->as_process[i].pv_entropy_jobq = ps_codec->pv_entropy_jobq;
2595
2596 /* i4_id always stays between 0 and MAX_PROCESS_THREADS */
2597 ps_codec->as_process[i].i4_id =
2598 (i >= MAX_PROCESS_THREADS) ?
2599 (i - MAX_PROCESS_THREADS) : i;
2600 ps_codec->as_process[i].ps_codec = ps_codec;
2601
2602 ps_codec->as_process[i].s_entropy.pv_proc_jobq = ps_codec->pv_proc_jobq;
2603 ps_codec->as_process[i].s_entropy.pv_entropy_jobq =
2604 ps_codec->pv_entropy_jobq;
2605 ps_codec->as_process[i].s_entropy.i4_abs_pic_order_cnt = -1;
2606 }
2607
2608 /* Initialize MV Bank buffer manager */
2609 ps_codec->pv_mv_buf_mgr = ih264_buf_mgr_init(ps_codec->pv_mv_buf_mgr_base);
2610
2611 /* Initialize Picture buffer manager for reference buffers*/
2612 ps_codec->pv_ref_buf_mgr = ih264_buf_mgr_init(
2613 ps_codec->pv_ref_buf_mgr_base);
2614
2615 /* Initialize Picture buffer manager for input buffers*/
2616 ps_codec->pv_inp_buf_mgr = ih264_buf_mgr_init(
2617 ps_codec->pv_inp_buf_mgr_base);
2618
2619 /* Initialize buffer manager for output buffers*/
2620 ps_codec->pv_out_buf_mgr = ih264_buf_mgr_init(
2621 ps_codec->pv_out_buf_mgr_base);
2622
2623 /* buffer cnt in buffer manager */
2624 ps_codec->i4_inp_buf_cnt = 0;
2625 ps_codec->i4_out_buf_cnt = 0;
2626 ps_codec->i4_ref_buf_cnt = 0;
2627
2628 ps_codec->ps_pic_buf = (pic_buf_t *) ps_codec->pv_pic_buf_base;
2629 memset(ps_codec->ps_pic_buf, 0, BUF_MGR_MAX_CNT * sizeof(pic_buf_t));
2630
2631 /* Initialize dpb manager */
2632 ih264_dpb_mgr_init((dpb_mgr_t*) ps_codec->pv_dpb_mgr);
2633
2634 memset(ps_codec->as_ref_set, 0,
2635 sizeof(ref_set_t) * (MAX_DPB_SIZE + MAX_CTXT_SETS));
2636 for (i = 0; i < (MAX_DPB_SIZE + MAX_CTXT_SETS); i++)
2637 {
2638 ps_codec->as_ref_set[i].i4_pic_cnt = -1;
2639 }
2640
2641 /* fn ptr init */
2642 ih264e_init_function_ptr(ps_codec);
2643
2644 /* reset status flags */
2645 for (i = 0; i < MAX_CTXT_SETS; i++)
2646 {
2647 ps_codec->au4_entropy_thread_active[i] = 0;
2648 ps_codec->ai4_pic_cnt[i] = -1;
2649
2650 ps_codec->s_rate_control.pre_encode_skip[i] = 0;
2651 ps_codec->s_rate_control.post_encode_skip[i] = 0;
2652 }
2653
2654 ps_codec->s_rate_control.num_intra_in_prev_frame = 0;
2655 ps_codec->s_rate_control.i4_avg_activity = 0;
2656
2657 return IV_SUCCESS;
2658 }
2659
2660 /**
2661 *******************************************************************************
2662 *
2663 * @brief
2664 * Gets number of memory records required by the codec
2665 *
2666 * @par Description:
2667 * Gets codec memory requirements
2668 *
2669 * @param[in] pv_api_ip
2670 * Pointer to input argument structure
2671 *
2672 * @param[out] pv_api_op
2673 * Pointer to output argument structure
2674 *
2675 * @returns status
2676 *
2677 * @remarks
2678 *
2679 *******************************************************************************
2680 */
ih264e_get_num_rec(void * pv_api_ip,void * pv_api_op)2681 static WORD32 ih264e_get_num_rec(void *pv_api_ip, void *pv_api_op)
2682 {
2683 /* api call I/O structures */
2684 ih264e_num_mem_rec_op_t *ps_op = pv_api_op;
2685
2686 UNUSED(pv_api_ip);
2687
2688 ps_op->s_ive_op.u4_num_mem_rec = MEM_REC_CNT;
2689
2690 return IV_SUCCESS;
2691 }
2692
2693 /**
2694 *******************************************************************************
2695 *
2696 * @brief
2697 * Fills memory records of the codec
2698 *
2699 * @par Description:
2700 * Fills codec memory requirements
2701 *
2702 * @param[in] pv_api_ip
2703 * Pointer to input argument structure
2704 *
2705 * @param[out] pv_api_op
2706 * Pointer to output argument structure
2707 *
2708 * @returns error status
2709 *
2710 * @remarks none
2711 *
2712 *******************************************************************************
2713 */
ih264e_fill_num_mem_rec(void * pv_api_ip,void * pv_api_op)2714 static WORD32 ih264e_fill_num_mem_rec(void *pv_api_ip, void *pv_api_op)
2715 {
2716 /* api call I/O structures */
2717 ih264e_fill_mem_rec_ip_t *ps_ip = pv_api_ip;
2718 ih264e_fill_mem_rec_op_t *ps_op = pv_api_op;
2719
2720 /* profile / level info */
2721 WORD32 level;
2722 WORD32 num_reorder_frames;
2723 WORD32 num_ref_frames;
2724
2725 /* mem records */
2726 WORD32 no_of_mem_rec;
2727 iv_mem_rec_t *ps_mem_rec_base, *ps_mem_rec;
2728
2729 /* frame dimensions */
2730 WORD32 max_wd_luma, max_ht_luma;
2731 WORD32 max_mb_rows, max_mb_cols, max_mb_cnt;
2732
2733 /* temp var */
2734 WORD32 i;
2735
2736 /* error status */
2737 IV_STATUS_T status = IV_SUCCESS;
2738
2739 num_reorder_frames = ps_ip->s_ive_ip.u4_max_reorder_cnt;
2740 num_ref_frames = ps_ip->s_ive_ip.u4_max_ref_cnt;
2741
2742 /* mem records */
2743 ps_mem_rec_base = ps_ip->s_ive_ip.ps_mem_rec;
2744 no_of_mem_rec = ps_ip->s_ive_ip.u4_num_mem_rec;
2745
2746 /* frame dimensions */
2747 max_ht_luma = ps_ip->s_ive_ip.u4_max_ht;
2748 max_wd_luma = ps_ip->s_ive_ip.u4_max_wd;
2749 max_ht_luma = ALIGN16(max_ht_luma);
2750 max_wd_luma = ALIGN16(max_wd_luma);
2751 max_mb_rows = max_ht_luma / MB_SIZE;
2752 max_mb_cols = max_wd_luma / MB_SIZE;
2753 max_mb_cnt = max_mb_rows * max_mb_cols;
2754
2755 /* profile / level info */
2756 level = ih264e_get_min_level(max_ht_luma, max_wd_luma);
2757
2758 /* validate params */
2759 if ((level < MIN_LEVEL) || (level > MAX_LEVEL))
2760 {
2761 ps_op->s_ive_op.u4_error_code |= IH264E_CODEC_LEVEL_NOT_SUPPORTED;
2762 level = MAX_LEVEL;
2763 }
2764
2765 if (num_ref_frames > MAX_REF_CNT)
2766 {
2767 ps_op->s_ive_op.u4_error_code |= IH264E_NUM_REF_UNSUPPORTED;
2768 num_ref_frames = MAX_REF_CNT;
2769 }
2770
2771 if (num_reorder_frames > MAX_REF_CNT)
2772 {
2773 ps_op->s_ive_op.u4_error_code |= IH264E_NUM_REORDER_UNSUPPORTED;
2774 num_reorder_frames = MAX_REF_CNT;
2775 }
2776
2777 /* Set all memory records as persistent and alignment as 128 by default */
2778 ps_mem_rec = ps_mem_rec_base;
2779 for (i = 0; i < no_of_mem_rec; i++)
2780 {
2781 ps_mem_rec->u4_mem_alignment = 128;
2782 ps_mem_rec->e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
2783 ps_mem_rec++;
2784 }
2785
2786 /************************************************************************
2787 * Request memory for h264 encoder handle *
2788 ***********************************************************************/
2789 ps_mem_rec = &ps_mem_rec_base[MEM_REC_IV_OBJ];
2790 {
2791 ps_mem_rec->u4_mem_size = sizeof(iv_obj_t);
2792 }
2793 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_IV_OBJ, ps_mem_rec->u4_mem_size);
2794
2795 /************************************************************************
2796 * Request memory for h264 encoder context *
2797 ***********************************************************************/
2798 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CODEC];
2799 {
2800 ps_mem_rec->u4_mem_size = sizeof(codec_t);
2801 }
2802 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_CODEC, ps_mem_rec->u4_mem_size);
2803
2804 /************************************************************************
2805 * Request memory for CABAC context *
2806 ***********************************************************************/
2807 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CABAC];
2808 {
2809 ps_mem_rec->u4_mem_size = sizeof(cabac_ctxt_t);
2810 }
2811 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_CABAC, ps_mem_rec->u4_mem_size);
2812
2813 /************************************************************************
2814 * Request memory for CABAC MB info *
2815 ***********************************************************************/
2816 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CABAC_MB_INFO];
2817 {
2818 ps_mem_rec->u4_mem_size = ((max_mb_cols + 1) + 1)
2819 * sizeof(mb_info_ctxt_t);
2820 }
2821 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_CABAC_MB_INFO, ps_mem_rec->u4_mem_size);
2822
2823
2824 /************************************************************************
2825 * Request memory for entropy context *
2826 * In multi core encoding, each row is assumed to be launched on a *
2827 * thread. The rows below can only start after its neighbors are coded *
2828 * The status of an mb coded/uncoded is signaled via entropy map. *
2829 * 1. One word32 to store skip run cnt *
2830 * 2. mb entropy map (mb status entropy coded/uncoded). The size*
2831 * of the entropy map is max mb cols. Further allocate one *
2832 * more additional row to evade checking for row -1. *
2833 * 3. size of bit stream buffer to store bit stream ctxt. *
2834 * 4. Entropy coding is dependent on nnz coefficient count for *
2835 * the neighbor blocks. It is sufficient to maintain one row *
2836 * worth of nnz as entropy for lower row waits on entropy map*
2837 ************************************************************************/
2838 ps_mem_rec = &ps_mem_rec_base[MEM_REC_ENTROPY];
2839 {
2840 /* total size of the mem record */
2841 WORD32 total_size = 0;
2842
2843 /* size of skip mb run */
2844 total_size += sizeof(WORD32);
2845 total_size = ALIGN8(total_size);
2846
2847 /* size in bytes to store entropy status of an entire frame */
2848 total_size += (max_mb_cols * max_mb_rows);
2849 /* add an additional 1 row of bytes to evade the special case of row 0 */
2850 total_size += max_mb_cols;
2851 total_size = ALIGN128(total_size);
2852
2853 /* size of bit stream buffer */
2854 total_size += sizeof(bitstrm_t);
2855 total_size = ALIGN128(total_size);
2856
2857 /* top nnz luma */
2858 total_size += (max_mb_cols * 4 * sizeof(UWORD8));
2859 total_size = ALIGN128(total_size);
2860
2861 /* top nnz cbcr */
2862 total_size += (max_mb_cols * 4 * sizeof(UWORD8));
2863 total_size = ALIGN128(total_size);
2864
2865 /* total size per each proc ctxt */
2866 total_size *= MAX_CTXT_SETS;
2867
2868 ps_mem_rec->u4_mem_size = total_size;
2869 }
2870 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_ENTROPY, ps_mem_rec->u4_mem_size);
2871
2872 /************************************************************************
2873 * The residue coefficients that needs to be entropy coded are packed *
2874 * at a buffer space by the proc threads. The entropy thread shall *
2875 * read from the buffer space, unpack them and encode the same. The *
2876 * buffer space required to pack a row of mbs are as follows. *
2877 * Assuming transform_8x8_flag is disabled, *
2878 * In the worst case, 1 mb contains 1 dc 4x4 luma sub block, followed *
2879 * by 16 ac 4x4 luma sub blocks, 2 dc chroma 2x2 sub blocks, followed *
2880 * by 8 ac 4x4 chroma sub blocks. *
2881 * For the sake of simplicity we assume that all sub blocks are of *
2882 * type 4x4. The packing of each 4x4 is depicted by the structure *
2883 * tu_sblk_coeff_data_t *
2884 ************************************************************************/
2885 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MB_COEFF_DATA];
2886 {
2887 /* temp var */
2888 WORD32 size = 0;
2889
2890 /* size of coeff data of 1 mb */
2891 size += sizeof(tu_sblk_coeff_data_t) * MAX_4x4_SUBBLKS;
2892
2893 /* size of coeff data of 1 row of mb's */
2894 size *= max_mb_cols;
2895
2896 /* align to avoid any false sharing across threads */
2897 size = ALIGN64(size);
2898
2899 /* size for one full frame */
2900 size *= max_mb_rows;
2901
2902 /* size of each proc buffer set (ping, pong) */
2903 size *= MAX_CTXT_SETS;
2904
2905 ps_mem_rec->u4_mem_size = size;
2906 }
2907 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_MB_COEFF_DATA, ps_mem_rec->u4_mem_size);
2908
2909 /************************************************************************
2910 * while encoding an mb, the mb header data is signaled to the entropy*
2911 * thread by writing to a buffer space. the size of header data per mb *
2912 * is assumed to be 40 bytes *
2913 * TODO: revisit this inference *
2914 ************************************************************************/
2915 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MB_HEADER_DATA];
2916 {
2917 /* temp var */
2918 WORD32 size;
2919
2920 /* size per MB */
2921 size = 40;
2922
2923 /* size for 1 row of mbs */
2924 size = size * max_mb_cols;
2925
2926 /* align to avoid any false sharing across threads */
2927 size = ALIGN64(size);
2928
2929 /* size for one full frame */
2930 size *= max_mb_rows;
2931
2932 /* size of each proc buffer set (ping, pong) */
2933 size *= MAX_CTXT_SETS;
2934
2935 ps_mem_rec->u4_mem_size = size;
2936 }
2937 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_MB_HEADER_DATA, ps_mem_rec->u4_mem_size);
2938
2939 /************************************************************************
2940 * Size for holding mv_buf_t for each MV Bank. *
2941 * Note this allocation is done for BUF_MGR_MAX_CNT instead of *
2942 * MAX_DPB_SIZE or max_dpb_size for following reasons *
2943 * max_dpb_size will be based on max_wd and max_ht *
2944 * For higher max_wd and max_ht this number will be smaller than *
2945 * MAX_DPB_SIZE But during actual initialization number of buffers *
2946 * allocated can be more. *
2947 * *
2948 * One extra MV Bank is needed to hold current pics MV bank. *
2949 * Since this is only a structure allocation and not actual buffer *
2950 * allocation, it is allocated for BUF_MGR_MAX_CNT entries *
2951 ************************************************************************/
2952 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MVBANK];
2953 {
2954 /* max luma samples */
2955 WORD32 max_luma_samples = 0;
2956
2957 /* determine max luma samples */
2958 for (i = 0; i < 16; i++)
2959 if (level ==(WORD32)gas_ih264_lvl_tbl[i].u4_level_idc)
2960 max_luma_samples = gas_ih264_lvl_tbl[i].u4_max_fs
2961 << (BLK_SIZE + BLK_SIZE);
2962
2963 ps_mem_rec->u4_mem_size = ih264_buf_mgr_size();
2964
2965 /************************************************************************
2966 * Allocate for pu_map, enc_pu_t and pic_pu_idx for each MV bank *
2967 * Note: Number of luma samples is not max_wd * max_ht here, instead it *
2968 * is set to maximum number of luma samples allowed at the given level. *
2969 * This is done to ensure that any stream with width and height lesser *
2970 * than max_wd and max_ht is supported. Number of buffers required can *
2971 * be greater for lower width and heights at a given level and this *
2972 * increased number of buffers might require more memory than what *
2973 * max_wd and max_ht buffer would have required Also note one extra *
2974 * buffer is allocated to store current pictures MV bank. *
2975 ***********************************************************************/
2976
2977 ps_mem_rec->u4_mem_size += BUF_MGR_MAX_CNT * sizeof(mv_buf_t);
2978
2979 ps_mem_rec->u4_mem_size += (num_ref_frames + num_reorder_frames
2980 + MAX_CTXT_SETS)
2981 * ih264e_get_pic_mv_bank_size(max_luma_samples);
2982 }
2983 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_MVBANK, ps_mem_rec->u4_mem_size);
2984
2985 /************************************************************************
2986 * While encoding inter slices, to compute the cost of encoding an mb *
2987 * with the mv's at hand, we employ the expression cost = sad + lambda *
2988 * x mv_bits. Here mv_bits is the total number of bits taken to represe*
2989 * nt the mv in the stream. The mv bits for all the possible mv are *
2990 * stored in the look up table. The mem record for this look up table *
2991 * is given below. *
2992 ************************************************************************/
2993 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MVBITS];
2994 {
2995 /* max srch range x */
2996 UWORD32 u4_srch_range_x = ps_ip->s_ive_ip.u4_max_srch_rng_x;
2997
2998 /* max srch range y */
2999 UWORD32 u4_srch_range_y = ps_ip->s_ive_ip.u4_max_srch_rng_y;
3000
3001 /* max srch range */
3002 UWORD32 u4_max_srch_range = MAX(u4_srch_range_x, u4_srch_range_y);
3003
3004 /* due to subpel */
3005 u4_max_srch_range <<= 2;
3006
3007 /* due to mv on either direction */
3008 u4_max_srch_range = (u4_max_srch_range << 1);
3009
3010 /* due to pred mv + zero */
3011 u4_max_srch_range = (u4_max_srch_range << 1) + 1;
3012
3013 u4_max_srch_range = ALIGN128(u4_max_srch_range);
3014
3015 ps_mem_rec->u4_mem_size = u4_max_srch_range;
3016 }
3017 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_MVBITS, ps_mem_rec->u4_mem_size);
3018
3019 /************************************************************************
3020 * Request memory for SPS *
3021 ***********************************************************************/
3022 ps_mem_rec = &ps_mem_rec_base[MEM_REC_SPS];
3023 {
3024 ps_mem_rec->u4_mem_size = MAX_SPS_CNT * sizeof(sps_t);
3025 }
3026 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_SPS, ps_mem_rec->u4_mem_size);
3027
3028 /************************************************************************
3029 * Request memory for PPS *
3030 ***********************************************************************/
3031 ps_mem_rec = &ps_mem_rec_base[MEM_REC_PPS];
3032 {
3033 ps_mem_rec->u4_mem_size = MAX_PPS_CNT * sizeof(pps_t);
3034 }
3035 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PPS, ps_mem_rec->u4_mem_size);
3036
3037 /************************************************************************
3038 * Request memory for Slice Header *
3039 ***********************************************************************/
3040 ps_mem_rec = &ps_mem_rec_base[MEM_REC_SLICE_HDR];
3041 {
3042 ps_mem_rec->u4_mem_size = MAX_CTXT_SETS * MAX_SLICE_HDR_CNT
3043 * sizeof(slice_header_t);
3044 }
3045 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_SLICE_HDR, ps_mem_rec->u4_mem_size);
3046
3047 /************************************************************************
3048 * Request memory for Adaptive Intra Refresh *
3049 ***********************************************************************/
3050 ps_mem_rec = &ps_mem_rec_base[MEM_REC_AIR_MAP];
3051 {
3052 /* total size of the mem record */
3053 WORD32 total_size = 0;
3054
3055 /* intra coded map */
3056 total_size += max_mb_cnt;
3057 total_size *= MAX_CTXT_SETS;
3058
3059 /* mb refresh map */
3060 total_size += sizeof(UWORD16) * max_mb_cnt;
3061
3062 /* alignment */
3063 total_size = ALIGN128(total_size);
3064
3065 ps_mem_rec->u4_mem_size = total_size;
3066 }
3067 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_AIR_MAP, ps_mem_rec->u4_mem_size);
3068
3069 /************************************************************************
3070 * In multi slice encoding, this memory record helps tracking the start*
3071 * of slice with reference to mb. *
3072 * MEM RECORD for holding *
3073 * 1. mb slice map *
3074 ************************************************************************/
3075 ps_mem_rec = &ps_mem_rec_base[MEM_REC_SLICE_MAP];
3076 {
3077 /* total size of the mem record */
3078 WORD32 total_size = 0;
3079
3080 /* size in bytes to slice index of all mbs of a frame */
3081 total_size = ALIGN64(max_mb_cnt);
3082
3083 /* ih264e_update_proc_ctxt can overread by 1 at the end */
3084 total_size += 1;
3085
3086 /* total size per each proc ctxt */
3087 total_size *= MAX_CTXT_SETS;
3088 ps_mem_rec->u4_mem_size = total_size;
3089 }
3090 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_SLICE_MAP, ps_mem_rec->u4_mem_size);
3091
3092 /************************************************************************
3093 * Request memory to hold thread handles for each processing thread *
3094 ************************************************************************/
3095 ps_mem_rec = &ps_mem_rec_base[MEM_REC_THREAD_HANDLE];
3096 {
3097 WORD32 handle_size = ithread_get_handle_size();
3098
3099 ps_mem_rec->u4_mem_size = MAX_PROCESS_THREADS * handle_size;
3100 }
3101 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_THREAD_HANDLE, ps_mem_rec->u4_mem_size);
3102
3103 /************************************************************************
3104 * Request memory to hold mutex for control calls *
3105 ************************************************************************/
3106 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CTL_MUTEX];
3107 {
3108 ps_mem_rec->u4_mem_size = ithread_get_mutex_lock_size();
3109 }
3110 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_CTL_MUTEX, ps_mem_rec->u4_mem_size);
3111
3112 /************************************************************************
3113 * Request memory to hold mutex for entropy calls *
3114 ************************************************************************/
3115 ps_mem_rec = &ps_mem_rec_base[MEM_REC_ENTROPY_MUTEX];
3116 {
3117 ps_mem_rec->u4_mem_size = ithread_get_mutex_lock_size();
3118 }
3119 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_ENTROPY_MUTEX, ps_mem_rec->u4_mem_size);
3120
3121 /************************************************************************
3122 * Request memory to hold process jobs *
3123 ***********************************************************************/
3124 ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_JOBQ];
3125 {
3126 /* One process job per row of MBs */
3127 /* Allocate for two pictures, so that wrap around can be handled easily */
3128 WORD32 num_jobs = max_mb_rows * MAX_CTXT_SETS;
3129
3130 WORD32 job_queue_size = ih264_list_size(num_jobs, sizeof(job_t));
3131
3132 ps_mem_rec->u4_mem_size = job_queue_size;
3133 }
3134 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PROC_JOBQ, ps_mem_rec->u4_mem_size);
3135
3136 /************************************************************************
3137 * Request memory to hold entropy jobs *
3138 ***********************************************************************/
3139 ps_mem_rec = &ps_mem_rec_base[MEM_REC_ENTROPY_JOBQ];
3140 {
3141 /* One process job per row of MBs */
3142 /* Allocate for two pictures, so that wrap around can be handled easily */
3143 WORD32 num_jobs = max_mb_rows * MAX_CTXT_SETS;
3144
3145 WORD32 job_queue_size = ih264_list_size(num_jobs, sizeof(job_t));
3146
3147 ps_mem_rec->u4_mem_size = job_queue_size;
3148 }
3149 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_ENTROPY_JOBQ, ps_mem_rec->u4_mem_size);
3150
3151 /************************************************************************
3152 * In multi core encoding, each row is assumed to be launched on a *
3153 * thread. The rows below can only start after its neighbors are coded *
3154 * The status of an mb coded/uncoded is signaled via proc map. *
3155 * MEM RECORD for holding *
3156 * 1. mb proc map (mb status core coded/uncoded) *
3157 ************************************************************************/
3158 ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_MAP];
3159 {
3160 /* total size of the mem record */
3161 WORD32 total_size = 0;
3162
3163 /* size in bytes to mb core coding status of an entire frame */
3164 total_size = max_mb_cnt;
3165
3166 /* add an additional 1 row of bytes to evade the special case of row 0 */
3167 total_size += max_mb_cols;
3168
3169 /* total size per each proc ctxt */
3170 total_size *= MAX_CTXT_SETS;
3171 ps_mem_rec->u4_mem_size = total_size;
3172 }
3173 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PROC_MAP, ps_mem_rec->u4_mem_size);
3174
3175 /************************************************************************
3176 * mem record for holding a particular MB is deblocked or not *
3177 * 1. mb deblk map (mb status deblocked/not deblocked) *
3178 ************************************************************************/
3179 ps_mem_rec = &ps_mem_rec_base[MEM_REC_DBLK_MAP];
3180 {
3181 /* total size of the mem record */
3182 WORD32 total_size = 0;
3183
3184 /* size in bytes to mb core coding status of an entire frame */
3185 total_size = max_mb_cnt;
3186
3187 /* add an additional 1 row of bytes to evade the special case of row 0 */
3188 total_size += max_mb_cols;
3189
3190 total_size = ALIGN64(total_size);
3191
3192 /* total size per each proc ctxt */
3193 total_size *= MAX_CTXT_SETS;
3194 ps_mem_rec->u4_mem_size = total_size;
3195 }
3196 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_DBLK_MAP, ps_mem_rec->u4_mem_size);
3197
3198 /************************************************************************
3199 * mem record for holding a particular MB's me is done or not *
3200 * 1. mb me map *
3201 ************************************************************************/
3202 ps_mem_rec = &ps_mem_rec_base[MEM_REC_ME_MAP];
3203 {
3204 /* total size of the mem record */
3205 WORD32 total_size = 0;
3206
3207 /* size in bytes to mb core coding status of an entire frame */
3208 total_size = max_mb_cnt;
3209
3210 /* add an additional 1 row of bytes to evade the special case of row 0 */
3211 total_size += max_mb_cols;
3212
3213 /* total size per each proc ctxt */
3214 total_size *= MAX_CTXT_SETS;
3215
3216 ps_mem_rec->u4_mem_size = total_size;
3217 }
3218 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_ME_MAP, ps_mem_rec->u4_mem_size);
3219
3220 /************************************************************************
3221 * size for holding dpb manager context *
3222 ************************************************************************/
3223 ps_mem_rec = &ps_mem_rec_base[MEM_REC_DPB_MGR];
3224 {
3225 ps_mem_rec->u4_mem_size = sizeof(dpb_mgr_t);
3226 }
3227 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_DPB_MGR, ps_mem_rec->u4_mem_size);
3228
3229 /************************************************************************
3230 * luma or chroma core coding involves mb estimation, error computation*
3231 * between the estimated singnal and the actual signal, transform the *
3232 * error, quantize the error, then inverse transform and inverse quant *
3233 * ize the residue and add the result back to estimated signal. *
3234 * To perform all these, a set of temporary buffers are needed. *
3235 * MEM RECORD for holding scratch buffers *
3236 * 1. prediction buffer used during mb mode analysis *
3237 * 2 temp. reference buffer when intra 4x4 with rdopt on is *
3238 * enabled *
3239 * - when intra 4x4 is enabled, rdopt is on, to store the *
3240 * reconstructed values and use them later this temp. buffer *
3241 * is used. *
3242 * 3. prediction buffer used during intra mode analysis *
3243 * 4. prediction buffer used during intra 16x16 plane mode *
3244 * analysis
3245 * 5. prediction buffer used during intra chroma mode analysis *
3246 * 6. prediction buffer used during intra chroma 16x16 plane *
3247 * mode analysis
3248 * 7. forward transform output buffer *
3249 * - to store the error between estimated and the actual inp *
3250 * ut and to store the fwd transformed quantized output *
3251 * 8. forward transform output buffer *
3252 * - when intra 4x4 is enabled, rdopt is on, to store the *
3253 * fwd transform values and use them later this temp. buffer *
3254 * is used. *
3255 * 9. temporary buffer for inverse transform *
3256 * - temporary buffer used in inverse transform and inverse *
3257 * quantization *
3258 * A. Buffers for holding half_x , half_y and half_xy planes *
3259 ************************************************************************/
3260 ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_SCRATCH];
3261 {
3262 WORD32 total_size = 0;
3263 WORD32 i4_tmp_size;
3264
3265 /* size to hold prediction buffer */
3266 total_size += sizeof(UWORD8) * 16 * 16;
3267 total_size = ALIGN64(total_size);
3268
3269 /* size to hold recon for intra 4x4 buffer */
3270 total_size += sizeof(UWORD8) * 16 * 16;
3271 total_size = ALIGN64(total_size);
3272
3273 /* prediction buffer intra 16x16 */
3274 total_size += sizeof(UWORD8) * 16 * 16;
3275 total_size = ALIGN64(total_size);
3276
3277 /* prediction buffer intra 16x16 plane*/
3278 total_size += sizeof(UWORD8) * 16 * 16;
3279 total_size = ALIGN64(total_size);
3280
3281 /* prediction buffer intra chroma*/
3282 total_size += sizeof(UWORD8) * 16 * 8;
3283 total_size = ALIGN64(total_size);
3284
3285 /* prediction buffer intra chroma plane*/
3286 total_size += sizeof(UWORD8) * 16 * 8;
3287 total_size = ALIGN64(total_size);
3288
3289 /* size to hold fwd transform output */
3290 total_size += sizeof(WORD16) * SIZE_TRANS_BUFF;
3291 total_size = ALIGN64(total_size);
3292
3293 /* size to hold fwd transform output */
3294 total_size += sizeof(WORD16) * SIZE_TRANS_BUFF;
3295 total_size = ALIGN64(total_size);
3296
3297 /* size to hold temporary data during inverse transform */
3298 total_size += sizeof(WORD32) * SIZE_TMP_BUFF_ITRANS;
3299 total_size = ALIGN64(total_size);
3300
3301 /* Buffers for holding half_x , half_y and half_xy planes */
3302 i4_tmp_size = sizeof(UWORD8) * (HP_BUFF_WD * HP_BUFF_HT);
3303 total_size += (ALIGN64(i4_tmp_size) * SUBPEL_BUFF_CNT);
3304
3305 /* Allocate for each process thread */
3306 total_size *= MAX_PROCESS_CTXT;
3307
3308 ps_mem_rec->u4_mem_size = total_size;
3309 }
3310 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_PROC_SCRATCH, ps_mem_rec->u4_mem_size);
3311
3312 /************************************************************************
3313 * When transform_8x8_flag is disabled, the size of a sub block is *
3314 * 4x4 and when the transform_8x8_flag is enabled the size of the sub *
3315 * block is 8x8. The threshold matrix and the forward scaling list *
3316 * is of the size of the sub block. *
3317 * MEM RECORD for holding *
3318 * 1. quantization parameters for plane y, cb, cr *
3319 * - threshold matrix for quantization *
3320 * - forward weight matrix *
3321 * - satqd threshold matrix *
3322 ************************************************************************/
3323 ps_mem_rec = &ps_mem_rec_base[MEM_REC_QUANT_PARAM];
3324 {
3325 /* total size of the mem record */
3326 WORD32 total_size = 0;
3327
3328 /* quantization parameter list for planes y,cb and cr */
3329 total_size += ALIGN64(sizeof(quant_params_t)) * 3;
3330
3331 /* size of threshold matrix for quantization
3332 * (assuming the transform_8x8_flag is disabled).
3333 * for all 3 planes */
3334 total_size += ALIGN64(sizeof(WORD16) * 4 * 4) * 3;
3335
3336 /* size of forward weight matrix for quantization
3337 * (assuming the transform_8x8_flag is disabled).
3338 * for all 3 planes */
3339 total_size += ALIGN64(sizeof(WORD16) * 4 * 4) * 3;
3340
3341 /* Size for SATDQ threshold matrix for palnes y, cb and cr */
3342 total_size += ALIGN64(sizeof(UWORD16) * 9) * 3;
3343
3344 /* total size per each proc thread */
3345 total_size *= MAX_PROCESS_CTXT;
3346
3347 ps_mem_rec->u4_mem_size = total_size;
3348 }
3349 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_QUANT_PARAM, ps_mem_rec->u4_mem_size);
3350
3351 /************************************************************************
3352 * While computing blocking strength for the current mb, the csbp, mb *
3353 * type for the neighboring mbs are necessary. memtab for storing top *
3354 * row mbtype and csbp is evaluated here. *
3355 * *
3356 * when encoding intra 4x4 or intra 8x8 the submb types are estimated *
3357 * and sent. The estimation is dependent on neighbor mbs. For this *
3358 * store the top row sub mb types for intra mbs *
3359 * *
3360 * During motion vector prediction, the curr mb mv is predicted from *
3361 * neigbors left, top, top right and sometimes top left depending on *
3362 * the availability. The top and top right content is accessed from *
3363 * the memtab specified below. *
3364 ************************************************************************/
3365 ps_mem_rec = &ps_mem_rec_base[MEM_REC_TOP_ROW_SYN_INFO];
3366 {
3367 /* total size of the mem record */
3368 WORD32 total_size = 0;
3369
3370 /* size in bytes to store 1 row of mb_info_t */
3371 /* one additional mb, to avoid checking end of row condition */
3372 total_size += (max_mb_cols + 1) * sizeof(mb_info_t);
3373
3374 /* size in bytes to store 1 row of intra macroblock sub modes */
3375 total_size += max_mb_cols * sizeof(UWORD8) * 16;
3376
3377 /* size in bytes to store 1 row + 1 of enc_pu_t */
3378 /* one additional mb, to avoid checking end of row condition */
3379 total_size += (max_mb_cols + 1) * sizeof(enc_pu_t);
3380
3381 /* total size per proc ctxt */
3382 total_size = ALIGN128(total_size);
3383
3384 /* total size per each proc ctxt */
3385 total_size *= MAX_CTXT_SETS;
3386 ps_mem_rec->u4_mem_size = total_size;
3387 }
3388 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_TOP_ROW_SYN_INFO, ps_mem_rec->u4_mem_size);
3389
3390 /************************************************************************
3391 * When transform_8x8_flag is disabled, the mb is partitioned into *
3392 * 4 sub blocks. This corresponds to 1 vertical left edge and 1 *
3393 * vertical inner edge, 1 horizontal top edge and 1 horizontal *
3394 * inner edge per mb. Further, When transform_8x8_flag is enabled, *
3395 * the mb is partitioned in to 16 sub blocks. This corresponds to *
3396 * 1 vertical left edge and 3 vertical inner edges, 1 horizontal top *
3397 * edge and 3 horizontal inner edges per mb. *
3398 * MEM RECORD for holding *
3399 * 1. vertical edge blocking strength *
3400 * 2. horizontal edge blocking strength *
3401 * 3. mb qp *
3402 * all are frame level *
3403 ************************************************************************/
3404 ps_mem_rec = &ps_mem_rec_base[MEM_REC_BS_QP];
3405 {
3406 /* total size of the mem record */
3407 WORD32 total_size = 0;
3408
3409 /* size in bytes to store vertical edge bs, horizontal edge bs and qp of every mb*/
3410 WORD32 vert_bs_size, horz_bs_size, qp_size;
3411
3412 /* vertical edge bs = total number of vertical edges * number of bytes per each edge */
3413 /* total num of v edges = total mb * 4 (assuming transform_8x8_flag = 0),
3414 * each edge is formed by 4 pairs of subblks, requiring 4 bytes to storing bs */
3415 vert_bs_size = ALIGN64(max_mb_cnt * 4 * 4);
3416
3417 /* horizontal edge bs = total number of horizontal edges * number of bytes per each edge */
3418 /* total num of h edges = total mb * 4 (assuming transform_8x8_flag = 0),
3419 * each edge is formed by 4 pairs of subblks, requiring 4 bytes to storing bs */
3420 horz_bs_size = ALIGN64(max_mb_cnt * 4 * 4);
3421
3422 /* qp of each mb requires 1 byte */
3423 qp_size = ALIGN64(max_mb_cnt);
3424
3425 /* total size */
3426 total_size = vert_bs_size + horz_bs_size + qp_size;
3427
3428 /* total size per each proc ctxt */
3429 total_size *= MAX_CTXT_SETS;
3430
3431 ps_mem_rec->u4_mem_size = total_size;
3432 }
3433 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_BS_QP, ps_mem_rec->u4_mem_size);
3434
3435 /************************************************************************
3436 * size for holding dpb manager context *
3437 ************************************************************************/
3438 ps_mem_rec = &ps_mem_rec_base[MEM_REC_INP_PIC];
3439 {
3440 ps_mem_rec->u4_mem_size = ih264_buf_mgr_size();
3441 }
3442 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_INP_PIC, ps_mem_rec->u4_mem_size);
3443
3444 /************************************************************************
3445 * size for holding dpb manager context *
3446 ************************************************************************/
3447 ps_mem_rec = &ps_mem_rec_base[MEM_REC_OUT];
3448 {
3449 ps_mem_rec->u4_mem_size = ih264_buf_mgr_size();
3450 }
3451 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_OUT, ps_mem_rec->u4_mem_size);
3452
3453 /************************************************************************
3454 * Size for color space conversion *
3455 ************************************************************************/
3456 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CSC];
3457 {
3458 /* We need a total a memory for a single frame of 420 sp, ie
3459 * (wd * ht) for luma and (wd * ht / 2) for chroma*/
3460 ps_mem_rec->u4_mem_size = MAX_CTXT_SETS
3461 * ((3 * max_ht_luma * max_wd_luma) >> 1);
3462 /* Allocate an extra row, since inverse transform functions for
3463 * chroma access(only read, not used) few extra bytes due to
3464 * interleaved input
3465 */
3466 ps_mem_rec->u4_mem_size += max_wd_luma;
3467 }
3468 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_CSC, ps_mem_rec->u4_mem_size);
3469
3470 /************************************************************************
3471 * Size for holding pic_buf_t for each reference picture *
3472 * Note this allocation is done for BUF_MGR_MAX_CNT instead of *
3473 * MAX_DPB_SIZE or max_dpb_size for following reasons *
3474 * max_dpb_size will be based on max_wd and max_ht *
3475 * For higher max_wd and max_ht this number will be smaller than *
3476 * MAX_DPB_SIZE But during actual initialization number of buffers *
3477 * allocated can be more. *
3478 * *
3479 * Also to handle display depth application can allocate more than *
3480 * what codec asks for in case of non-shared mode *
3481 * Since this is only a structure allocation and not actual buffer *
3482 * allocation, it is allocated for BUF_MGR_MAX_CNT entries *
3483 ************************************************************************/
3484 ps_mem_rec = &ps_mem_rec_base[MEM_REC_REF_PIC];
3485 {
3486 ps_mem_rec->u4_mem_size = ih264_buf_mgr_size();
3487 ps_mem_rec->u4_mem_size += BUF_MGR_MAX_CNT * sizeof(pic_buf_t);
3488
3489 /************************************************************************
3490 * Note: Number of luma samples is not max_wd * max_ht here, instead it *
3491 * is set to maximum number of luma samples allowed at the given level. *
3492 * This is done to ensure that any stream with width and height lesser *
3493 * than max_wd and max_ht is supported. Number of buffers required can *
3494 * be greater for lower width and heights at a given level and this *
3495 * increased number of buffers might require more memory than what *
3496 * max_wd and max_ht buffer would have required. Number of buffers is *
3497 * doubled in order to return one frame at a time instead of sending *
3498 * multiple outputs during dpb full case. Also note one extra buffer is *
3499 * allocted to store current picture. *
3500 * *
3501 * Half-pel planes for each reference buffer are allocated along with *
3502 * the reference buffer. So each reference buffer is 4 times the *
3503 * required size. This way buffer management for the half-pel planes is *
3504 * easier and while using the half-pel planes in MC, an offset can be *
3505 * used from a single pointer *
3506 ***********************************************************************/
3507 ps_mem_rec->u4_mem_size += HPEL_PLANES_CNT
3508 * ih264e_get_total_pic_buf_size(
3509 max_wd_luma * max_ht_luma, level,
3510 PAD_WD, PAD_HT, num_ref_frames,
3511 num_reorder_frames);
3512 }
3513 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_REF_PIC, ps_mem_rec->u4_mem_size);
3514
3515 /************************************************************************
3516 * Request memory to hold mem recs to be returned during retrieve call *
3517 ************************************************************************/
3518 ps_mem_rec = &ps_mem_rec_base[MEM_REC_BACKUP];
3519 {
3520 ps_mem_rec->u4_mem_size = MEM_REC_CNT * sizeof(iv_mem_rec_t);
3521 }
3522 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_BACKUP, ps_mem_rec->u4_mem_size);
3523
3524 /************************************************************************
3525 * size for memory required by NMB info structs and buffer for storing *
3526 * half pel plane *
3527 ************************************************************************/
3528 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MB_INFO_NMB];
3529 {
3530 ps_mem_rec->u4_mem_size = MAX_PROCESS_CTXT * max_mb_cols *
3531 (sizeof(mb_info_nmb_t) + MB_SIZE * MB_SIZE
3532 * sizeof(UWORD8));
3533 }
3534 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_MB_INFO_NMB, ps_mem_rec->u4_mem_size);
3535
3536 /************************************************************************
3537 * RC mem records *
3538 ************************************************************************/
3539 ps_mem_rec = &ps_mem_rec_base[MEM_REC_RC];
3540 {
3541 ih264e_get_rate_control_mem_tab(NULL, ps_mem_rec, FILL_MEMTAB);
3542 }
3543 DEBUG("\nMemory record Id %d = %d \n", MEM_REC_RC, ps_mem_rec->u4_mem_size);
3544
3545 /* Each memtab size is aligned to next multiple of 128 bytes */
3546 /* This is to ensure all the memtabs start at different cache lines */
3547 ps_mem_rec = ps_mem_rec_base;
3548 for (i = 0; i < MEM_REC_CNT; i++)
3549 {
3550 ps_mem_rec->u4_mem_size = ALIGN128(ps_mem_rec->u4_mem_size);
3551 ps_mem_rec++;
3552 }
3553
3554 ps_op->s_ive_op.u4_num_mem_rec = MEM_REC_CNT;
3555
3556 DEBUG("Num mem recs in fill call : %d\n", ps_op->s_ive_op.u4_num_mem_rec);
3557
3558 return (status);
3559 }
3560
3561 /**
3562 *******************************************************************************
3563 *
3564 * @brief
3565 * Initializes from mem records passed to the codec
3566 *
3567 * @par Description:
3568 * Initializes pointers based on mem records passed
3569 *
3570 * @param[in] ps_codec_obj
3571 * Pointer to codec object at API level
3572 *
3573 * @param[in] pv_api_ip
3574 * Pointer to input argument structure
3575 *
3576 * @param[out] pv_api_op
3577 * Pointer to output argument structure
3578 *
3579 * @returns error status
3580 *
3581 * @remarks none
3582 *
3583 *******************************************************************************
3584 */
ih264e_init_mem_rec(iv_obj_t * ps_codec_obj,void * pv_api_ip,void * pv_api_op)3585 static WORD32 ih264e_init_mem_rec(iv_obj_t *ps_codec_obj,
3586 void *pv_api_ip,
3587 void *pv_api_op)
3588 {
3589 /* api call I/O structures */
3590 ih264e_init_ip_t *ps_ip = pv_api_ip;
3591 ih264e_init_op_t *ps_op = pv_api_op;
3592
3593 /* mem records */
3594 iv_mem_rec_t *ps_mem_rec_base, *ps_mem_rec;
3595
3596 /* codec variables */
3597 codec_t * ps_codec;
3598 cabac_ctxt_t *ps_cabac;
3599 mb_info_ctxt_t *ps_mb_map_ctxt_inc;
3600
3601 cfg_params_t *ps_cfg;
3602
3603 /* frame dimensions */
3604 WORD32 max_wd_luma, max_ht_luma;
3605 WORD32 max_mb_rows, max_mb_cols, max_mb_cnt;
3606
3607 /* temp var */
3608 WORD32 i, j;
3609 WORD32 status = IV_SUCCESS;
3610
3611 /* frame dimensions */
3612 max_ht_luma = ALIGN16(ps_ip->s_ive_ip.u4_max_ht);
3613 max_wd_luma = ALIGN16(ps_ip->s_ive_ip.u4_max_wd);
3614 max_mb_rows = max_ht_luma / MB_SIZE;
3615 max_mb_cols = max_wd_luma / MB_SIZE;
3616 max_mb_cnt = max_mb_rows * max_mb_cols;
3617
3618 /* mem records */
3619 ps_mem_rec_base = ps_ip->s_ive_ip.ps_mem_rec;
3620
3621 /* Init mem records */
3622 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CODEC];
3623 {
3624 ps_codec_obj->pv_codec_handle = ps_mem_rec->pv_base;
3625 ps_codec = (codec_t *) (ps_codec_obj->pv_codec_handle);
3626 }
3627 /* Init mem records_cabac ctxt */
3628 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CABAC];
3629 {
3630 ps_cabac = (cabac_ctxt_t *)(ps_mem_rec->pv_base);
3631 }
3632
3633 /* Init mem records mb info array for CABAC */
3634 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CABAC_MB_INFO];
3635 {
3636 ps_mb_map_ctxt_inc = (mb_info_ctxt_t *)(ps_mem_rec->pv_base);
3637 }
3638
3639 /* Note this memset can not be done in init() call, since init will called
3640 during reset as well. And calling this during reset will mean all pointers
3641 need to reinitialized */
3642 memset(ps_codec, 0, sizeof(codec_t));
3643 memset(ps_cabac, 0, sizeof(cabac_ctxt_t));
3644
3645 /* Set default Config Params */
3646 ps_cfg = &ps_codec->s_cfg;
3647 ih264e_set_default_params(ps_cfg);
3648
3649 /* Update config params as per input */
3650 ps_cfg->u4_max_wd = ALIGN16(ps_ip->s_ive_ip.u4_max_wd);
3651 ps_cfg->u4_max_ht = ALIGN16(ps_ip->s_ive_ip.u4_max_ht);
3652 ps_cfg->i4_wd_mbs = ps_cfg->u4_max_wd >> 4;
3653 ps_cfg->i4_ht_mbs = ps_cfg->u4_max_ht >> 4;
3654 ps_cfg->u4_max_ref_cnt = ps_ip->s_ive_ip.u4_max_ref_cnt;
3655 ps_cfg->u4_max_reorder_cnt = ps_ip->s_ive_ip.u4_max_reorder_cnt;
3656 ps_cfg->u4_max_level = ps_ip->s_ive_ip.u4_max_level;
3657 ps_cfg->e_inp_color_fmt = ps_ip->s_ive_ip.e_inp_color_fmt;
3658 ps_cfg->e_recon_color_fmt = ps_ip->s_ive_ip.e_recon_color_fmt;
3659 ps_cfg->u4_max_framerate = ps_ip->s_ive_ip.u4_max_framerate;
3660 ps_cfg->u4_max_bitrate = ps_ip->s_ive_ip.u4_max_bitrate;
3661 ps_cfg->u4_num_bframes = ps_ip->s_ive_ip.u4_num_bframes;
3662 ps_cfg->e_content_type = ps_ip->s_ive_ip.e_content_type;
3663 ps_cfg->u4_max_srch_rng_x = ps_ip->s_ive_ip.u4_max_srch_rng_x;
3664 ps_cfg->u4_max_srch_rng_y = ps_ip->s_ive_ip.u4_max_srch_rng_y;
3665 ps_cfg->e_slice_mode = ps_ip->s_ive_ip.e_slice_mode;
3666 ps_cfg->u4_slice_param = ps_ip->s_ive_ip.u4_slice_param;
3667 ps_cfg->e_arch = ps_ip->s_ive_ip.e_arch;
3668 ps_cfg->e_soc = ps_ip->s_ive_ip.e_soc;
3669 ps_cfg->u4_enable_recon = ps_ip->s_ive_ip.u4_enable_recon;
3670 ps_cfg->e_rc_mode = ps_ip->s_ive_ip.e_rc_mode;
3671
3672 /* Validate params */
3673 if ((ps_ip->s_ive_ip.u4_max_level < MIN_LEVEL)
3674 || (ps_ip->s_ive_ip.u4_max_level > MAX_LEVEL))
3675 {
3676 ps_op->s_ive_op.u4_error_code |= IH264E_CODEC_LEVEL_NOT_SUPPORTED;
3677 ps_cfg->u4_max_level = DEFAULT_MAX_LEVEL;
3678 }
3679
3680 if (ps_ip->s_ive_ip.u4_max_ref_cnt > MAX_REF_CNT)
3681 {
3682 ps_op->s_ive_op.u4_error_code |= IH264E_NUM_REF_UNSUPPORTED;
3683 ps_cfg->u4_max_ref_cnt = MAX_REF_CNT;
3684 }
3685
3686 if (ps_ip->s_ive_ip.u4_max_reorder_cnt > MAX_REF_CNT)
3687 {
3688 ps_op->s_ive_op.u4_error_code |= IH264E_NUM_REORDER_UNSUPPORTED;
3689 ps_cfg->u4_max_reorder_cnt = MAX_REF_CNT;
3690 }
3691
3692 ps_mem_rec = &ps_mem_rec_base[MEM_REC_BACKUP];
3693 {
3694 ps_codec->ps_mem_rec_backup = (iv_mem_rec_t *) ps_mem_rec->pv_base;
3695
3696 memcpy(ps_codec->ps_mem_rec_backup, ps_mem_rec_base,
3697 MEM_REC_CNT * sizeof(iv_mem_rec_t));
3698 }
3699
3700 ps_mem_rec = &ps_mem_rec_base[MEM_REC_ENTROPY];
3701 {
3702 /* temp var */
3703 WORD32 size = 0, offset;
3704
3705 for (i = 0; i < MAX_PROCESS_CTXT; i++)
3706 {
3707 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
3708 {
3709 /* base ptr */
3710 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
3711
3712 /* reset size */
3713 size = 0;
3714
3715 /* skip mb run */
3716 ps_codec->as_process[i].s_entropy.pi4_mb_skip_run =
3717 (void *) (pu1_buf + size);
3718 size += sizeof(WORD32);
3719 size = ALIGN8(size);
3720
3721 /* entropy map */
3722 ps_codec->as_process[i].s_entropy.pu1_entropy_map =
3723 (void *) (pu1_buf + size + max_mb_cols);
3724 /* size in bytes to store entropy status of an entire frame */
3725 size += (max_mb_cols * max_mb_rows);
3726 /* add an additional 1 row of bytes to evade the special case of row 0 */
3727 size += max_mb_cols;
3728 size = ALIGN128(size);
3729
3730 /* bit stream ptr */
3731 ps_codec->as_process[i].s_entropy.ps_bitstrm = (void *) (pu1_buf
3732 + size);
3733 size += sizeof(bitstrm_t);
3734 size = ALIGN128(size);
3735
3736 /* nnz luma */
3737 ps_codec->as_process[i].s_entropy.pu1_top_nnz_luma =
3738 (void *) (pu1_buf + size);
3739 size += (max_mb_cols * 4 * sizeof(UWORD8));
3740 size = ALIGN128(size);
3741
3742 /* nnz chroma */
3743 ps_codec->as_process[i].s_entropy.pu1_top_nnz_cbcr =
3744 (void *) (pu1_buf + size);
3745 size += (max_mb_cols * 4 * sizeof(UWORD8));
3746 size = ALIGN128(size);
3747 offset = size;
3748 /* cabac Context */
3749 ps_codec->as_process[i].s_entropy.ps_cabac = ps_cabac;
3750 }
3751 else
3752 {
3753 /* base ptr */
3754 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
3755
3756 /* reset size */
3757 size = offset;
3758
3759 /* skip mb run */
3760 ps_codec->as_process[i].s_entropy.pi4_mb_skip_run =
3761 (void *) (pu1_buf + size);
3762 size += sizeof(WORD32);
3763 size = ALIGN8(size);
3764
3765 /* entropy map */
3766 ps_codec->as_process[i].s_entropy.pu1_entropy_map =
3767 (void *) (pu1_buf + size + max_mb_cols);
3768 /* size in bytes to store entropy status of an entire frame */
3769 size += (max_mb_cols * max_mb_rows);
3770 /* add an additional 1 row of bytes to evade the special case of row 0 */
3771 size += max_mb_cols;
3772 size = ALIGN128(size);
3773
3774 /* bit stream ptr */
3775 ps_codec->as_process[i].s_entropy.ps_bitstrm = (void *) (pu1_buf
3776 + size);
3777 size += sizeof(bitstrm_t);
3778 size = ALIGN128(size);
3779
3780 /* nnz luma */
3781 ps_codec->as_process[i].s_entropy.pu1_top_nnz_luma =
3782 (void *) (pu1_buf + size);
3783 size += (max_mb_cols * 4 * sizeof(UWORD8));
3784 size = ALIGN128(size);
3785
3786 /* nnz chroma */
3787 ps_codec->as_process[i].s_entropy.pu1_top_nnz_cbcr =
3788 (void *) (pu1_buf + size);
3789 size += (max_mb_cols * 4 * sizeof(UWORD8));
3790 size = ALIGN128(size);
3791 /* cabac Context */
3792 ps_codec->as_process[i].s_entropy.ps_cabac = ps_cabac;
3793 }
3794 }
3795 ps_codec->as_process[0].s_entropy.ps_cabac->ps_mb_map_ctxt_inc_base =
3796 ps_mb_map_ctxt_inc;
3797 }
3798
3799 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MB_COEFF_DATA];
3800 {
3801 /* temp var */
3802 WORD32 size = 0, size_of_row;
3803 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
3804
3805 /* size of coeff data of 1 mb */
3806 size += sizeof(tu_sblk_coeff_data_t) * MAX_4x4_SUBBLKS;
3807
3808 /* size of coeff data of 1 row of mb's */
3809 size *= max_mb_cols;
3810
3811 /* align to avoid false sharing */
3812 size = ALIGN64(size);
3813 size_of_row = size;
3814
3815 /* size for one full frame */
3816 size *= max_mb_rows;
3817
3818 ps_codec->u4_size_coeff_data = size_of_row;
3819
3820 for (i = 0; i < MAX_PROCESS_CTXT; i++)
3821 {
3822 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
3823 {
3824 ps_codec->as_process[i].pv_pic_mb_coeff_data = pu1_buf;
3825 ps_codec->as_process[i].s_entropy.pv_pic_mb_coeff_data =
3826 pu1_buf;
3827 }
3828 else
3829 {
3830 ps_codec->as_process[i].pv_pic_mb_coeff_data = pu1_buf + size;
3831 ps_codec->as_process[i].s_entropy.pv_pic_mb_coeff_data = pu1_buf
3832 + size;
3833 }
3834 }
3835 }
3836
3837 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MB_HEADER_DATA];
3838 {
3839 /* temp var */
3840 WORD32 size, size_of_row;
3841 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
3842
3843 /* size of header data of 1 mb */
3844 size = sizeof(mb_hdr_t);
3845
3846 /* size for 1 row of mbs */
3847 size = size * max_mb_cols;
3848
3849 /* align to avoid any false sharing across threads */
3850 size = ALIGN64(size);
3851 size_of_row = size;
3852
3853 /* size for one full frame */
3854 size *= max_mb_rows;
3855
3856 ps_codec->u4_size_header_data = size_of_row;
3857
3858 for (i = 0; i < MAX_PROCESS_CTXT; i++)
3859 {
3860 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
3861 {
3862 ps_codec->as_process[i].pv_pic_mb_header_data = pu1_buf;
3863 ps_codec->as_process[i].s_entropy.pv_pic_mb_header_data =
3864 pu1_buf;
3865 }
3866 else
3867 {
3868 ps_codec->as_process[i].pv_pic_mb_header_data = pu1_buf + size;
3869 ps_codec->as_process[i].s_entropy.pv_pic_mb_header_data =
3870 pu1_buf + size;
3871 }
3872 }
3873 }
3874
3875 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MVBANK];
3876 {
3877 /* size of buf mgr struct */
3878 WORD32 size = ih264_buf_mgr_size();
3879
3880 /* temp var */
3881 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
3882
3883 /* mv buffer mgr */
3884 ps_codec->pv_mv_buf_mgr_base = pu1_buf;
3885
3886 /* mv bank */
3887 ps_codec->pv_mv_bank_buf_base = pu1_buf + size;
3888 ps_codec->i4_total_mv_bank_size = ps_mem_rec->u4_mem_size - size;
3889 }
3890
3891 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MVBITS];
3892 {
3893 /* max srch range x */
3894 UWORD32 u4_srch_range_x = ps_ip->s_ive_ip.u4_max_srch_rng_x;
3895
3896 /* max srch range y */
3897 UWORD32 u4_srch_range_y = ps_ip->s_ive_ip.u4_max_srch_rng_y;
3898
3899 /* max srch range */
3900 UWORD32 u4_max_srch_range = MAX(u4_srch_range_x, u4_srch_range_y);
3901
3902 /* temp var */
3903 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
3904
3905 /* due to subpel */
3906 u4_max_srch_range <<= 2;
3907
3908 // /* due to mv on either direction */
3909 // u4_max_srch_range = (u4_max_srch_range << 1);
3910
3911 /* due to pred mv + zero */
3912 u4_max_srch_range = (u4_max_srch_range << 1) + 1;
3913
3914 for (i = 0; i < MAX_PROCESS_CTXT; i++)
3915 {
3916 /* me ctxt */
3917 me_ctxt_t *ps_mem_ctxt = &(ps_codec->as_process[i].s_me_ctxt);
3918
3919 /* init at zero mv */
3920 ps_mem_ctxt->pu1_mv_bits = pu1_buf + u4_max_srch_range;
3921 }
3922 }
3923
3924 ps_mem_rec = &ps_mem_rec_base[MEM_REC_SPS];
3925 {
3926 ps_codec->ps_sps_base = (sps_t *) ps_mem_rec->pv_base;
3927 }
3928
3929 ps_mem_rec = &ps_mem_rec_base[MEM_REC_PPS];
3930 {
3931 ps_codec->ps_pps_base = (pps_t *) ps_mem_rec->pv_base;
3932 }
3933
3934 ps_mem_rec = &ps_mem_rec_base[MEM_REC_SLICE_HDR];
3935 {
3936 ps_codec->ps_slice_hdr_base = ps_mem_rec->pv_base;
3937
3938 for (i = 0; i < MAX_PROCESS_CTXT; i++)
3939 {
3940 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
3941 {
3942 ps_codec->as_process[i].ps_slice_hdr_base = ps_mem_rec->pv_base;
3943 }
3944 else
3945 {
3946 /* temp var */
3947 WORD32 size = MAX_SLICE_HDR_CNT * sizeof(slice_header_t);
3948 void *pv_buf = (UWORD8 *) ps_mem_rec->pv_base + size;
3949
3950 ps_codec->as_process[i].ps_slice_hdr_base = pv_buf;
3951 }
3952 }
3953 }
3954
3955 ps_mem_rec = &ps_mem_rec_base[MEM_REC_AIR_MAP];
3956 {
3957 /* temp var */
3958 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
3959
3960 for (i = 0; i < MAX_PROCESS_CTXT; i++)
3961 {
3962 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
3963 {
3964 ps_codec->as_process[i].pu1_is_intra_coded = pu1_buf;
3965 }
3966 else
3967 {
3968 ps_codec->as_process[i].pu1_is_intra_coded = pu1_buf
3969 + max_mb_cnt;
3970 }
3971 }
3972
3973 ps_codec->pu2_intr_rfrsh_map = (UWORD16 *) (pu1_buf + max_mb_cnt * MAX_CTXT_SETS);
3974 }
3975
3976 ps_mem_rec = &ps_mem_rec_base[MEM_REC_SLICE_MAP];
3977 {
3978 /* pointer to storage space */
3979 UWORD8 *pu1_buf_ping, *pu1_buf_pong;
3980
3981 /* init pointer */
3982 pu1_buf_ping = ps_mem_rec->pv_base;
3983 pu1_buf_pong = pu1_buf_ping + ALIGN64(max_mb_cnt);
3984
3985 for (i = 0; i < MAX_PROCESS_CTXT; i++)
3986 {
3987 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
3988 {
3989 ps_codec->as_process[i].pu1_slice_idx = pu1_buf_ping;
3990 }
3991 else
3992 {
3993 ps_codec->as_process[i].pu1_slice_idx = pu1_buf_pong;
3994 }
3995 }
3996 }
3997
3998 ps_mem_rec = &ps_mem_rec_base[MEM_REC_THREAD_HANDLE];
3999 {
4000 WORD32 handle_size = ithread_get_handle_size();
4001
4002 for (i = 0; i < MAX_PROCESS_THREADS; i++)
4003 {
4004 ps_codec->apv_proc_thread_handle[i] = (UWORD8 *) ps_mem_rec->pv_base
4005 + (i * handle_size);
4006 }
4007 }
4008
4009 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CTL_MUTEX];
4010 {
4011 ps_codec->pv_ctl_mutex = ps_mem_rec->pv_base;
4012 }
4013
4014 ps_mem_rec = &ps_mem_rec_base[MEM_REC_ENTROPY_MUTEX];
4015 {
4016 ps_codec->pv_entropy_mutex = ps_mem_rec->pv_base;
4017 }
4018
4019 ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_JOBQ];
4020 {
4021 ps_codec->pv_proc_jobq_buf = ps_mem_rec->pv_base;
4022 ps_codec->i4_proc_jobq_buf_size = ps_mem_rec->u4_mem_size;
4023 }
4024
4025 ps_mem_rec = &ps_mem_rec_base[MEM_REC_ENTROPY_JOBQ];
4026 {
4027 ps_codec->pv_entropy_jobq_buf = ps_mem_rec->pv_base;
4028 ps_codec->i4_entropy_jobq_buf_size = ps_mem_rec->u4_mem_size;
4029 }
4030
4031 ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_MAP];
4032 {
4033 /* pointer to storage space */
4034 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
4035
4036 /* total size of the mem record */
4037 WORD32 total_size = 0;
4038
4039 /* size in bytes to mb core coding status of an entire frame */
4040 total_size = max_mb_cnt;
4041
4042 /* add an additional 1 row of bytes to evade the special case of row 0 */
4043 total_size += max_mb_cols;
4044
4045 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4046 {
4047 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
4048 {
4049 ps_codec->as_process[i].pu1_proc_map = pu1_buf + max_mb_cols;
4050 }
4051 else
4052 {
4053 ps_codec->as_process[i].pu1_proc_map = pu1_buf + total_size
4054 + max_mb_cols;
4055 }
4056 }
4057 }
4058
4059 ps_mem_rec = &ps_mem_rec_base[MEM_REC_DBLK_MAP];
4060 {
4061 /* pointer to storage space */
4062 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
4063
4064 /* total size of the mem record */
4065 WORD32 total_size = 0;
4066
4067 /* size in bytes to mb core coding status of an entire frame */
4068 total_size = max_mb_cnt;
4069
4070 /* add an additional 1 row of bytes to evade the special case of row 0 */
4071 total_size += max_mb_cols;
4072
4073 /*Align the memory offsets*/
4074 total_size = ALIGN64(total_size);
4075
4076 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4077 {
4078 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
4079 {
4080 ps_codec->as_process[i].pu1_deblk_map = pu1_buf + max_mb_cols;
4081
4082 }
4083 else
4084 {
4085 ps_codec->as_process[i].pu1_deblk_map = pu1_buf + total_size
4086 + max_mb_cols;
4087
4088 }
4089 }
4090 }
4091
4092 ps_mem_rec = &ps_mem_rec_base[MEM_REC_ME_MAP];
4093 {
4094 /* pointer to storage space */
4095 UWORD8 *pu1_buf = (UWORD8 *) ps_mem_rec->pv_base;
4096
4097 /* total size of the mem record */
4098 WORD32 total_size = 0;
4099
4100 /* size in bytes to mb core coding status of an entire frame */
4101 total_size = max_mb_cnt;
4102
4103 /* add an additional 1 row of bytes to evade the special case of row 0 */
4104 total_size += max_mb_cols;
4105
4106 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4107 {
4108 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
4109 {
4110 ps_codec->as_process[i].pu1_me_map = pu1_buf + max_mb_cols;
4111 }
4112 else
4113 {
4114 ps_codec->as_process[i].pu1_me_map = pu1_buf + total_size
4115 + max_mb_cols;
4116 }
4117 }
4118 }
4119
4120 ps_mem_rec = &ps_mem_rec_base[MEM_REC_DPB_MGR];
4121 {
4122 ps_codec->pv_dpb_mgr = ps_mem_rec->pv_base;
4123 }
4124
4125 ps_mem_rec = &ps_mem_rec_base[MEM_REC_PROC_SCRATCH];
4126 {
4127 /* pointer to storage space */
4128 UWORD8 *pu1_buf = (UWORD8 *) ps_mem_rec->pv_base;
4129
4130 /* size of pred buffer, fwd transform output, temp buffer for inv tra */
4131 WORD32 size_pred_luma, size_pred_chroma, size_fwd, size_inv, size_hp;
4132
4133 /* temp var */
4134 WORD32 size = 0;
4135
4136 /* size to hold intra/inter prediction buffer */
4137 size_pred_luma = sizeof(UWORD8) * 16 * 16;
4138 size_pred_chroma = sizeof(UWORD8) * 8 * 16;
4139
4140 /* size to hold fwd transform output */
4141 size_fwd = sizeof(WORD16) * SIZE_TRANS_BUFF;
4142
4143 /* size to hold temporary data during inverse transform */
4144 size_inv = sizeof(WORD32) * SIZE_TMP_BUFF_ITRANS;
4145
4146 /* size to hold half pel plane buffers */
4147 size_hp = sizeof(UWORD8) * (HP_BUFF_WD * HP_BUFF_HT);
4148
4149 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4150 {
4151 /* prediction buffer */
4152 ps_codec->as_process[i].pu1_pred_mb = (void *) (pu1_buf + size);
4153 ps_codec->as_process[i].i4_pred_strd = 16;
4154 size += size_pred_luma;
4155 size = ALIGN64(size);
4156
4157 /* prediction buffer */
4158 ps_codec->as_process[i].pu1_ref_mb_intra_4x4 = (void *) (pu1_buf
4159 + size);
4160 size += size_pred_luma;
4161 size = ALIGN64(size);
4162
4163 /* prediction buffer intra 16x16 */
4164 ps_codec->as_process[i].pu1_pred_mb_intra_16x16 = (void *) (pu1_buf
4165 + size);
4166 size += size_pred_luma;
4167 size = ALIGN64(size);
4168
4169 /* prediction buffer intra 16x16 plane*/
4170 ps_codec->as_process[i].pu1_pred_mb_intra_16x16_plane =
4171 (void *) (pu1_buf + size);
4172 size += size_pred_luma;
4173 size = ALIGN64(size);
4174
4175 /* prediction buffer intra chroma*/
4176 ps_codec->as_process[i].pu1_pred_mb_intra_chroma = (void *) (pu1_buf
4177 + size);
4178 size += size_pred_chroma;
4179 size = ALIGN64(size);
4180
4181 /* prediction buffer intra chroma plane*/
4182 ps_codec->as_process[i].pu1_pred_mb_intra_chroma_plane =
4183 (void *) (pu1_buf + size);
4184 size += size_pred_chroma;
4185 size = ALIGN64(size);
4186
4187 /* Fwd transform output */
4188 ps_codec->as_process[i].pi2_res_buf = (void *) (pu1_buf + size);
4189 ps_codec->as_process[i].i4_res_strd = 16;
4190 size += size_fwd;
4191 size = ALIGN64(size);
4192
4193 /* Fwd transform output */
4194 ps_codec->as_process[i].pi2_res_buf_intra_4x4 = (void *) (pu1_buf
4195 + size);
4196 size += size_fwd;
4197 size = ALIGN64(size);
4198
4199 /* scratch buffer used during inverse transform */
4200 ps_codec->as_process[i].pv_scratch_buff = (void *) (pu1_buf + size);
4201 size += size_inv;
4202 size = ALIGN64(size);
4203
4204 for (j = 0; j < SUBPEL_BUFF_CNT; j++)
4205 {
4206 ps_codec->as_process[i].apu1_subpel_buffs[j] = (pu1_buf + size);
4207 size += ALIGN64(size_hp);
4208 }
4209 }
4210 }
4211
4212 ps_mem_rec = &ps_mem_rec_base[MEM_REC_QUANT_PARAM];
4213 {
4214 /* pointer to storage space */
4215 UWORD8 *pu1_buf = (UWORD8 *) ps_mem_rec->pv_base;
4216
4217 /* size of qp, threshold matrix, fwd scaling list for one plane */
4218 WORD32 size_quant_param, size_thres_mat, size_fwd_weight_mat,
4219 size_satqd_weight_mat;
4220
4221 /* temp var */
4222 WORD32 total_size = 0;
4223
4224 /* size of quantization parameter list of 1 plane */
4225 size_quant_param = ALIGN64(sizeof(quant_params_t));
4226
4227 /* size of threshold matrix for quantization
4228 * (assuming the transform_8x8_flag is disabled).
4229 * for 1 plane */
4230 size_thres_mat = ALIGN64(sizeof(WORD16) * 4 * 4);
4231
4232 /* size of forward weight matrix for quantization
4233 * (assuming the transform_8x8_flag is disabled).
4234 * for 1 plane */
4235 size_fwd_weight_mat = ALIGN64(sizeof(WORD16) * 4 * 4);
4236
4237 /* size of SATQD matrix*/
4238 size_satqd_weight_mat = ALIGN64(sizeof(UWORD16) * 9);
4239
4240 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4241 {
4242 quant_params_t **ps_qp_params = ps_codec->as_process[i].ps_qp_params;
4243
4244 /* quantization param structure */
4245 ps_qp_params[0] = (quant_params_t *) (pu1_buf + total_size);
4246 total_size = total_size + size_quant_param;
4247 ps_qp_params[1] = (quant_params_t *) (pu1_buf + total_size);
4248 total_size = total_size + size_quant_param;
4249 ps_qp_params[2] = (quant_params_t *) (pu1_buf + total_size);
4250 total_size = total_size + size_quant_param;
4251
4252 /* threshold matrix for quantization */
4253 ps_qp_params[0]->pu2_thres_mat = (void *) (pu1_buf + total_size);
4254 total_size = total_size + size_thres_mat;
4255 ps_qp_params[1]->pu2_thres_mat = (void *) (pu1_buf + total_size);
4256 total_size = total_size + size_thres_mat;
4257 ps_qp_params[2]->pu2_thres_mat = (void *) (pu1_buf + total_size);
4258 total_size = total_size + size_thres_mat;
4259
4260 /* fwd weight matrix */
4261 ps_qp_params[0]->pu2_weigh_mat = (void *) (pu1_buf + total_size);
4262 total_size = total_size + size_fwd_weight_mat;
4263 ps_qp_params[1]->pu2_weigh_mat = (void *) (pu1_buf + total_size);
4264 total_size = total_size + size_fwd_weight_mat;
4265 ps_qp_params[2]->pu2_weigh_mat = (void *) (pu1_buf + total_size);
4266 total_size = total_size + size_fwd_weight_mat;
4267
4268 /* threshold matrix for SATQD */
4269 ps_qp_params[0]->pu2_sad_thrsh = (void *) (pu1_buf + total_size);
4270 total_size = total_size + size_satqd_weight_mat;
4271 ps_qp_params[1]->pu2_sad_thrsh = (void *) (pu1_buf + total_size);
4272 total_size = total_size + size_satqd_weight_mat;
4273 ps_qp_params[2]->pu2_sad_thrsh = (void *) (pu1_buf + total_size);
4274 total_size = total_size + size_satqd_weight_mat;
4275
4276 total_size = ALIGN128(total_size);
4277 }
4278 }
4279
4280 ps_mem_rec = &ps_mem_rec_base[MEM_REC_TOP_ROW_SYN_INFO];
4281 {
4282 /* total size of the mem record */
4283 WORD32 total_size = 0, size_csbp, size_intra_modes, size_mv;
4284
4285 /* pointer to buffer */
4286 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
4287
4288 /* size in bytes to store 1 row of mb_info_t */
4289 /* one additional mb, to avoid checking end of row condition */
4290 size_csbp = (max_mb_cols + 1) * sizeof(mb_info_t);
4291
4292 /* size in bytes to store 1 row of intra macroblock sub modes */
4293 size_intra_modes = max_mb_cols * sizeof(UWORD8) * 16;
4294
4295 /* size in bytes to store 1 row + 1 of enc_pu_t */
4296 /* one additional mb, to avoid checking end of row condition */
4297 size_mv = (max_mb_cols + 1) * sizeof(enc_pu_t);
4298
4299 /* total size per proc ctxt */
4300 total_size = size_csbp + size_intra_modes + size_mv;
4301
4302 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4303 {
4304 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
4305 {
4306 ps_codec->as_process[i].ps_top_row_mb_syntax_ele_base =
4307 (mb_info_t *) pu1_buf;
4308 ps_codec->as_process[i].pu1_top_mb_intra_modes_base = pu1_buf
4309 + size_csbp;
4310 ps_codec->as_process[i].ps_top_row_pu_base =
4311 (enc_pu_t *) (pu1_buf + size_csbp
4312 + size_intra_modes);
4313 }
4314 else
4315 {
4316 ps_codec->as_process[i].ps_top_row_mb_syntax_ele_base =
4317 (mb_info_t *) (pu1_buf + total_size);
4318 ps_codec->as_process[i].pu1_top_mb_intra_modes_base = pu1_buf
4319 + total_size + size_csbp;
4320 ps_codec->as_process[i].ps_top_row_pu_base =
4321 (enc_pu_t *) (pu1_buf + total_size + size_csbp
4322 + size_intra_modes);
4323 }
4324 }
4325 }
4326
4327 ps_mem_rec = &ps_mem_rec_base[MEM_REC_BS_QP];
4328 {
4329 UWORD8 *pu1_buf_ping, *pu1_buf_pong;
4330
4331 /* total size of the mem record */
4332 WORD32 total_size = 0;
4333
4334 /* size in bytes to store vertical edge bs, horizontal edge bs and qp of every mb*/
4335 WORD32 vert_bs_size, horz_bs_size, qp_size;
4336
4337 /* vertical edge bs = total number of vertical edges * number of bytes per each edge */
4338 /* total num of v edges = total mb * 4 (assuming transform_8x8_flag = 0),
4339 * each edge is formed by 4 pairs of subblks, requiring 4 bytes to storing bs */
4340 vert_bs_size = ALIGN64(max_mb_cnt * 4 * 4);
4341
4342 /* horizontal edge bs = total number of horizontal edges * number of bytes per each edge */
4343 /* total num of h edges = total mb * 4 (assuming transform_8x8_flag = 0),
4344 * each edge is formed by 4 pairs of subblks, requiring 4 bytes to storing bs */
4345 horz_bs_size = ALIGN64(max_mb_cnt * 4 * 4);
4346
4347 /* qp of each mb requires 1 byte */
4348 qp_size = ALIGN64(max_mb_cnt);
4349
4350 /* total size */
4351 total_size = vert_bs_size + horz_bs_size + qp_size;
4352
4353 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4354 {
4355 if (i < MAX_PROCESS_CTXT / MAX_CTXT_SETS)
4356 {
4357 pu1_buf_ping = (UWORD8 *) ps_mem_rec->pv_base;
4358
4359 /* vertical edge bs storage space */
4360 ps_codec->as_process[i].s_deblk_ctxt.s_bs_ctxt.pu4_pic_vert_bs =
4361 (UWORD32 *) pu1_buf_ping;
4362 pu1_buf_ping += vert_bs_size;
4363
4364 /* horizontal edge bs storage space */
4365 ps_codec->as_process[i].s_deblk_ctxt.s_bs_ctxt.pu4_pic_horz_bs =
4366 (UWORD32 *) pu1_buf_ping;
4367 pu1_buf_ping += horz_bs_size;
4368
4369 /* qp */
4370 ps_codec->as_process[i].s_deblk_ctxt.s_bs_ctxt.pu1_pic_qp =
4371 (UWORD8 *) pu1_buf_ping;
4372 pu1_buf_ping += qp_size;
4373 }
4374 else
4375 {
4376 pu1_buf_pong = (UWORD8 *) ps_mem_rec->pv_base;
4377 pu1_buf_pong += total_size;
4378
4379 /* vertical edge bs storage space */
4380 ps_codec->as_process[i].s_deblk_ctxt.s_bs_ctxt.pu4_pic_vert_bs =
4381 (UWORD32 *) pu1_buf_pong;
4382 pu1_buf_pong += vert_bs_size;
4383
4384 /* horizontal edge bs storage space */
4385 ps_codec->as_process[i].s_deblk_ctxt.s_bs_ctxt.pu4_pic_horz_bs =
4386 (UWORD32 *) pu1_buf_pong;
4387 pu1_buf_pong += horz_bs_size;
4388
4389 /* qp */
4390 ps_codec->as_process[i].s_deblk_ctxt.s_bs_ctxt.pu1_pic_qp =
4391 (UWORD8 *) pu1_buf_pong;
4392 pu1_buf_pong += qp_size;
4393 }
4394 }
4395 }
4396
4397 ps_mem_rec = &ps_mem_rec_base[MEM_REC_INP_PIC];
4398 {
4399 ps_codec->pv_inp_buf_mgr_base = ps_mem_rec->pv_base;
4400 }
4401
4402 ps_mem_rec = &ps_mem_rec_base[MEM_REC_OUT];
4403 {
4404 ps_codec->pv_out_buf_mgr_base = ps_mem_rec->pv_base;
4405 }
4406
4407 ps_mem_rec = &ps_mem_rec_base[MEM_REC_CSC];
4408 {
4409 ps_codec->pu1_y_csc_buf_base = ps_mem_rec->pv_base;
4410 ps_codec->pu1_uv_csc_buf_base = (UWORD8 *) ps_mem_rec->pv_base
4411 + (max_ht_luma * max_wd_luma);
4412 }
4413
4414 ps_mem_rec = &ps_mem_rec_base[MEM_REC_REF_PIC];
4415 {
4416 /* size of buf mgr struct */
4417 WORD32 size = ih264_buf_mgr_size();
4418
4419 /* temp var */
4420 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
4421
4422 /* pic buffer mgr */
4423 ps_codec->pv_ref_buf_mgr_base = pu1_buf;
4424
4425 /* picture bank */
4426 ps_codec->pv_pic_buf_base = pu1_buf + size;
4427 ps_codec->i4_total_pic_buf_size = ps_mem_rec->u4_mem_size - size;
4428 }
4429
4430 ps_mem_rec = &ps_mem_rec_base[MEM_REC_MB_INFO_NMB];
4431 {
4432 /* temp var */
4433 UWORD8 *pu1_buf = ps_mem_rec->pv_base;
4434
4435 /* size of nmb ctxt */
4436 WORD32 size = max_mb_cols * sizeof(mb_info_nmb_t);
4437
4438 WORD32 nmb_cntr, subpel_buf_size;
4439
4440 /* init nmb info structure pointer in all proc ctxts */
4441 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4442 {
4443 ps_codec->as_process[i].ps_nmb_info = (mb_info_nmb_t *) (pu1_buf);
4444
4445 pu1_buf += size;
4446 }
4447
4448 subpel_buf_size = MB_SIZE * MB_SIZE * sizeof(UWORD8);
4449
4450 /* adjusting pointers for nmb halfpel buffer */
4451 for (i = 0; i < MAX_PROCESS_CTXT; i++)
4452 {
4453 mb_info_nmb_t* ps_mb_info_nmb =
4454 &ps_codec->as_process[i].ps_nmb_info[0];
4455
4456 for (nmb_cntr = 0; nmb_cntr < max_mb_cols; nmb_cntr++)
4457 {
4458 ps_mb_info_nmb[nmb_cntr].pu1_best_sub_pel_buf = pu1_buf;
4459
4460 pu1_buf = pu1_buf + subpel_buf_size;
4461
4462 ps_mb_info_nmb[nmb_cntr].u4_bst_spel_buf_strd = MB_SIZE;
4463 }
4464 }
4465 }
4466
4467 ps_mem_rec = &ps_mem_rec_base[MEM_REC_RC];
4468 {
4469 ih264e_get_rate_control_mem_tab(&ps_codec->s_rate_control, ps_mem_rec,
4470 USE_BASE);
4471 }
4472
4473 /* init codec ctxt */
4474 status = ih264e_init(ps_codec);
4475
4476 return status;
4477 }
4478
4479 /**
4480 *******************************************************************************
4481 *
4482 * @brief
4483 * Retrieves mem records passed to the codec
4484 *
4485 * @par Description:
4486 * Retrieves mem recs passed during init
4487 *
4488 * @param[in] ps_codec_obj
4489 * Pointer to codec object at API level
4490 *
4491 * @param[in] pv_api_ip
4492 * Pointer to input argument structure
4493 *
4494 * @param[out] pv_api_op
4495 * Pointer to output argument structure
4496 *
4497 * @returns error status
4498 *
4499 * @remarks none
4500 *
4501 *******************************************************************************
4502 */
ih264e_retrieve_memrec(iv_obj_t * ps_codec_obj,void * pv_api_ip,void * pv_api_op)4503 static WORD32 ih264e_retrieve_memrec(iv_obj_t *ps_codec_obj,
4504 void *pv_api_ip,
4505 void *pv_api_op)
4506 {
4507 /* codec ctxt */
4508 codec_t *ps_codec = (codec_t *) ps_codec_obj->pv_codec_handle;
4509
4510 /* ctrl call I/O structures */
4511 ih264e_retrieve_mem_rec_ip_t *ps_ip = pv_api_ip;
4512 ih264e_retrieve_mem_rec_op_t *ps_op = pv_api_op;
4513
4514 if (ps_codec->i4_init_done != 1)
4515 {
4516 ps_op->s_ive_op.u4_error_code |= 1 << IVE_FATALERROR;
4517 ps_op->s_ive_op.u4_error_code |= IH264E_INIT_NOT_DONE;
4518 return IV_FAIL;
4519 }
4520
4521 /* join threads upon at end of sequence */
4522 ih264e_join_threads(ps_codec);
4523
4524 /* collect list of memory records used by the encoder library */
4525 memcpy(ps_ip->s_ive_ip.ps_mem_rec, ps_codec->ps_mem_rec_backup,
4526 MEM_REC_CNT * (sizeof(iv_mem_rec_t)));
4527 ps_op->s_ive_op.u4_num_mem_rec_filled = MEM_REC_CNT;
4528
4529 /* clean up mutex memory */
4530 ih264_list_free(ps_codec->pv_entropy_jobq);
4531 ih264_list_free(ps_codec->pv_proc_jobq);
4532 ithread_mutex_destroy(ps_codec->pv_ctl_mutex);
4533 ithread_mutex_destroy(ps_codec->pv_entropy_mutex);
4534
4535
4536 ih264_buf_mgr_free((buf_mgr_t *)ps_codec->pv_mv_buf_mgr);
4537 ih264_buf_mgr_free((buf_mgr_t *)ps_codec->pv_ref_buf_mgr);
4538 ih264_buf_mgr_free((buf_mgr_t *)ps_codec->pv_inp_buf_mgr);
4539 ih264_buf_mgr_free((buf_mgr_t *)ps_codec->pv_out_buf_mgr);
4540
4541 return IV_SUCCESS;
4542 }
4543
4544 /**
4545 *******************************************************************************
4546 *
4547 * @brief
4548 * Sets the encoder in flush mode.
4549 *
4550 * @par Description:
4551 * Sets the encoder in flush mode
4552 *
4553 * @param[in] ps_codec_obj
4554 * Pointer to codec object at API level
4555 *
4556 * @param[in] pv_api_ip
4557 * Pointer to input argument structure
4558 *
4559 * @param[out] pv_api_op
4560 * Pointer to output argument structure
4561 *
4562 * @returns error status
4563 *
4564 * @remarks This call has no real effect on encoder
4565 *
4566 *******************************************************************************
4567 */
ih264e_set_flush_mode(iv_obj_t * ps_codec_obj,void * pv_api_ip,void * pv_api_op)4568 static WORD32 ih264e_set_flush_mode(iv_obj_t *ps_codec_obj,
4569 void *pv_api_ip,
4570 void *pv_api_op)
4571 {
4572 /* codec ctxt */
4573 codec_t *ps_codec = (codec_t *) ps_codec_obj->pv_codec_handle;
4574
4575 /* ctrl call I/O structures */
4576 ih264e_ctl_flush_op_t *ps_ctl_op = pv_api_op;
4577
4578 UNUSED(pv_api_ip);
4579
4580 ps_ctl_op->s_ive_op.u4_error_code = 0;
4581
4582 /* signal flush frame control call */
4583 ps_codec->i4_flush_mode = 1;
4584
4585 return IV_SUCCESS;
4586 }
4587
4588 /**
4589 *******************************************************************************
4590 *
4591 * @brief
4592 * Gets encoder buffer requirements
4593 *
4594 * @par Description:
4595 * Gets the encoder buffer requirements. Basing on max width and max height
4596 * configuration settings, this routine, computes the sizes of necessary input,
4597 * output buffers returns this info to callee.
4598 *
4599 * @param[in] ps_codec_obj
4600 * Pointer to codec object at API level
4601 *
4602 * @param[in] pv_api_ip
4603 * Pointer to input argument structure
4604 *
4605 * @param[out] pv_api_op
4606 * Pointer to output argument structure
4607 *
4608 * @returns error status
4609 *
4610 * @remarks none
4611 *
4612 *******************************************************************************
4613 */
ih264e_get_buf_info(iv_obj_t * ps_codec_obj,void * pv_api_ip,void * pv_api_op)4614 static WORD32 ih264e_get_buf_info(iv_obj_t *ps_codec_obj,
4615 void *pv_api_ip,
4616 void *pv_api_op)
4617 {
4618 /* ctrl call I/O structures */
4619 ih264e_ctl_getbufinfo_ip_t *ps_ip = pv_api_ip;
4620 ih264e_ctl_getbufinfo_op_t *ps_op = pv_api_op;
4621
4622 /* temp var */
4623 WORD32 wd = ALIGN16(ps_ip->s_ive_ip.u4_max_wd);
4624 WORD32 ht = ALIGN16(ps_ip->s_ive_ip.u4_max_ht);
4625 WORD32 i;
4626
4627 UNUSED(ps_codec_obj);
4628
4629 ps_op->s_ive_op.u4_error_code = 0;
4630
4631 /* Number of components in input buffers required for codec &
4632 * Minimum sizes of each component in input buffer required */
4633 if (ps_ip->s_ive_ip.e_inp_color_fmt == IV_YUV_420P)
4634 {
4635 ps_op->s_ive_op.u4_inp_comp_cnt = MIN_RAW_BUFS_420_COMP;
4636
4637 ps_op->s_ive_op.au4_min_in_buf_size[0] = wd * ht;
4638 ps_op->s_ive_op.au4_min_in_buf_size[1] = (wd >> 1) * (ht >> 1);
4639 ps_op->s_ive_op.au4_min_in_buf_size[2] = (wd >> 1) * (ht >> 1);
4640 }
4641 else if (ps_ip->s_ive_ip.e_inp_color_fmt == IV_YUV_422ILE)
4642 {
4643 ps_op->s_ive_op.u4_inp_comp_cnt = MIN_RAW_BUFS_422ILE_COMP;
4644
4645 ps_op->s_ive_op.au4_min_in_buf_size[0] = wd * ht * 2;
4646 ps_op->s_ive_op.au4_min_in_buf_size[1] =
4647 ps_op->s_ive_op.au4_min_in_buf_size[2] = 0;
4648 }
4649 else if (ps_ip->s_ive_ip.e_inp_color_fmt == IV_RGB_565)
4650 {
4651 ps_op->s_ive_op.u4_inp_comp_cnt = MIN_RAW_BUFS_RGB565_COMP;
4652
4653 ps_op->s_ive_op.au4_min_in_buf_size[0] = wd * ht * 2;
4654 ps_op->s_ive_op.au4_min_in_buf_size[1] =
4655 ps_op->s_ive_op.au4_min_in_buf_size[2] = 0;
4656 }
4657 else if (ps_ip->s_ive_ip.e_inp_color_fmt == IV_RGBA_8888)
4658 {
4659 ps_op->s_ive_op.u4_inp_comp_cnt = MIN_RAW_BUFS_RGBA8888_COMP;
4660
4661 ps_op->s_ive_op.au4_min_in_buf_size[0] = wd * ht * 4;
4662 ps_op->s_ive_op.au4_min_in_buf_size[1] =
4663 ps_op->s_ive_op.au4_min_in_buf_size[2] = 0;
4664 }
4665 else if ((ps_ip->s_ive_ip.e_inp_color_fmt == IV_YUV_420SP_UV)
4666 || (ps_ip->s_ive_ip.e_inp_color_fmt == IV_YUV_420SP_VU))
4667 {
4668 ps_op->s_ive_op.u4_inp_comp_cnt = MIN_RAW_BUFS_420SP_COMP;
4669
4670 ps_op->s_ive_op.au4_min_in_buf_size[0] = wd * ht;
4671 ps_op->s_ive_op.au4_min_in_buf_size[1] = wd * (ht >> 1);
4672 ps_op->s_ive_op.au4_min_in_buf_size[2] = 0;
4673 }
4674
4675 /* Number of components in output buffers required for codec &
4676 * Minimum sizes of each component in output buffer required */
4677 ps_op->s_ive_op.u4_out_comp_cnt = MIN_BITS_BUFS_COMP;
4678
4679 for (i = 0; i < (WORD32) ps_op->s_ive_op.u4_out_comp_cnt; i++)
4680 {
4681 ps_op->s_ive_op.au4_min_out_buf_size[i] = MAX(((wd * ht * 3) >> 1), MIN_STREAM_SIZE);
4682 }
4683
4684 ps_op->s_ive_op.u4_min_inp_bufs = MIN_INP_BUFS;
4685 ps_op->s_ive_op.u4_min_out_bufs = MIN_OUT_BUFS;
4686
4687 return IV_SUCCESS;
4688 }
4689
4690 /**
4691 *******************************************************************************
4692 *
4693 * @brief
4694 * Sets the picture dimensions
4695 *
4696 * @par Description:
4697 * Sets width, height, display width, display height and strides
4698 *
4699 * @param[in] pv_api_ip
4700 * Pointer to input argument structure
4701 *
4702 * @param[out] pv_api_op
4703 * Pointer to output argument structure
4704 *
4705 * @param[out] ps_cfg
4706 * Pointer to config structure to be updated
4707 *
4708 * @returns error status
4709 *
4710 * @remarks none
4711 *
4712 *******************************************************************************
4713 */
ih264e_set_dimensions(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)4714 static IV_STATUS_T ih264e_set_dimensions(void *pv_api_ip,
4715 void *pv_api_op,
4716 cfg_params_t *ps_cfg)
4717 {
4718 /* ctrl call I/O structures */
4719 ih264e_ctl_set_dimensions_ip_t *ps_ip = pv_api_ip;
4720 ih264e_ctl_set_dimensions_op_t *ps_op = pv_api_op;
4721
4722 ps_op->s_ive_op.u4_error_code = 0;
4723
4724 ps_cfg->u4_wd = ALIGN16(ps_ip->s_ive_ip.u4_wd);
4725 ps_cfg->u4_ht = ALIGN16(ps_ip->s_ive_ip.u4_ht);
4726 ps_cfg->i4_wd_mbs = ps_cfg->u4_wd >> 4;
4727 ps_cfg->i4_ht_mbs = ps_cfg->u4_ht >> 4;
4728 ps_cfg->u4_disp_wd = ps_ip->s_ive_ip.u4_wd;
4729 ps_cfg->u4_disp_ht = ps_ip->s_ive_ip.u4_ht;
4730
4731 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
4732 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
4733
4734 return IV_SUCCESS;
4735 }
4736
4737 /**
4738 *******************************************************************************
4739 *
4740 * @brief
4741 * Sets source and target frame rates
4742 *
4743 * @par Description:
4744 * Sets source and target frame rates
4745 *
4746 * @param[in] pv_api_ip
4747 * Pointer to input argument structure
4748 *
4749 * @param[out] pv_api_op
4750 * Pointer to output argument structure
4751 *
4752 * @param[out] ps_cfg
4753 * Pointer to config structure to be updated
4754 *
4755 * @returns error status
4756 *
4757 * @remarks none
4758 *
4759 *******************************************************************************
4760 */
ih264e_set_frame_rate(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)4761 static IV_STATUS_T ih264e_set_frame_rate(void *pv_api_ip,
4762 void *pv_api_op,
4763 cfg_params_t *ps_cfg)
4764 {
4765 /* ctrl call I/O structures */
4766 ih264e_ctl_set_frame_rate_ip_t *ps_ip = pv_api_ip;
4767 ih264e_ctl_set_frame_rate_op_t *ps_op = pv_api_op;
4768
4769 ps_op->s_ive_op.u4_error_code = 0;
4770
4771 ps_cfg->u4_src_frame_rate = ps_ip->s_ive_ip.u4_src_frame_rate;
4772 ps_cfg->u4_tgt_frame_rate = ps_ip->s_ive_ip.u4_tgt_frame_rate;
4773
4774 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
4775 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
4776
4777 return IV_SUCCESS;
4778 }
4779
4780 /**
4781 *******************************************************************************
4782 *
4783 * @brief
4784 * Sets target bit rate
4785 *
4786 * @par Description:
4787 * Sets target bit rate
4788 *
4789 * @param[in] pv_api_ip
4790 * Pointer to input argument structure
4791 *
4792 * @param[out] pv_api_op
4793 * Pointer to output argument structure
4794 *
4795 * @param[out] ps_cfg
4796 * Pointer to config structure to be updated
4797 *
4798 * @returns error status
4799 *
4800 * @remarks none
4801 *
4802 *******************************************************************************
4803 */
ih264e_set_bit_rate(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)4804 static IV_STATUS_T ih264e_set_bit_rate(void *pv_api_ip,
4805 void *pv_api_op,
4806 cfg_params_t *ps_cfg)
4807 {
4808 /* ctrl call I/O structures */
4809 ih264e_ctl_set_bitrate_ip_t *ps_ip = pv_api_ip;
4810 ih264e_ctl_set_bitrate_op_t *ps_op = pv_api_op;
4811
4812 ps_op->s_ive_op.u4_error_code = 0;
4813
4814 ps_cfg->u4_target_bitrate = ps_ip->s_ive_ip.u4_target_bitrate;
4815
4816 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
4817 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
4818
4819 return IV_SUCCESS;
4820 }
4821
4822 /**
4823 *******************************************************************************
4824 *
4825 * @brief
4826 * Sets frame type
4827 *
4828 * @par Description:
4829 * Sets frame type
4830 *
4831 * @param[in] pv_api_ip
4832 * Pointer to input argument structure
4833 *
4834 * @param[out] pv_api_op
4835 * Pointer to output argument structure
4836 *
4837 * @param[out] ps_cfg
4838 * Pointer to config structure to be updated
4839 *
4840 * @returns error status
4841 *
4842 * @remarks not a sticky tag
4843 *
4844 *******************************************************************************
4845 */
ih264e_set_frame_type(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)4846 static IV_STATUS_T ih264e_set_frame_type(void *pv_api_ip,
4847 void *pv_api_op,
4848 cfg_params_t *ps_cfg)
4849 {
4850 /* ctrl call I/O structures */
4851 ih264e_ctl_set_frame_type_ip_t *ps_ip = pv_api_ip;
4852 ih264e_ctl_set_frame_type_op_t *ps_op = pv_api_op;
4853
4854 ps_op->s_ive_op.u4_error_code = 0;
4855
4856 ps_cfg->e_frame_type = ps_ip->s_ive_ip.e_frame_type;
4857
4858 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
4859 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
4860
4861 return IV_SUCCESS;
4862 }
4863
4864 /**
4865 *******************************************************************************
4866 *
4867 * @brief
4868 * Sets quantization params
4869 *
4870 * @par Description:
4871 * Sets the max, min and default qp for I frame, P frame and B frame
4872 *
4873 * @param[in] pv_api_ip
4874 * Pointer to input argument structure
4875 *
4876 * @param[out] pv_api_op
4877 * Pointer to output argument structure
4878 *
4879 * @param[out] ps_cfg
4880 * Pointer to config structure to be updated
4881 *
4882 * @returns error status
4883 *
4884 * @remarks none
4885 *
4886 *******************************************************************************
4887 */
ih264e_set_qp(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)4888 static IV_STATUS_T ih264e_set_qp(void *pv_api_ip,
4889 void *pv_api_op,
4890 cfg_params_t *ps_cfg)
4891 {
4892 /* ctrl call I/O structures */
4893 ih264e_ctl_set_qp_ip_t *ps_set_qp_ip = pv_api_ip;
4894 ih264e_ctl_set_qp_op_t *ps_set_qp_op = pv_api_op;
4895
4896 ps_set_qp_op->s_ive_op.u4_error_code = 0;
4897
4898 ps_cfg->u4_i_qp_max = ps_set_qp_ip->s_ive_ip.u4_i_qp_max;
4899 ps_cfg->u4_i_qp_min = ps_set_qp_ip->s_ive_ip.u4_i_qp_min;
4900 ps_cfg->u4_i_qp = ps_set_qp_ip->s_ive_ip.u4_i_qp;
4901 ps_cfg->u4_p_qp_max = ps_set_qp_ip->s_ive_ip.u4_p_qp_max;
4902 ps_cfg->u4_p_qp_min = ps_set_qp_ip->s_ive_ip.u4_p_qp_min;
4903 ps_cfg->u4_p_qp = ps_set_qp_ip->s_ive_ip.u4_p_qp;
4904 ps_cfg->u4_b_qp_max = ps_set_qp_ip->s_ive_ip.u4_b_qp_max;
4905 ps_cfg->u4_b_qp_min = ps_set_qp_ip->s_ive_ip.u4_b_qp_min;
4906 ps_cfg->u4_b_qp = ps_set_qp_ip->s_ive_ip.u4_b_qp;
4907
4908 ps_cfg->u4_timestamp_high = ps_set_qp_ip->s_ive_ip.u4_timestamp_high;
4909 ps_cfg->u4_timestamp_low = ps_set_qp_ip->s_ive_ip.u4_timestamp_low;
4910
4911 return IV_SUCCESS;
4912 }
4913
4914 /**
4915 *******************************************************************************
4916 *
4917 * @brief
4918 * Sets encoding mode
4919 *
4920 * @par Description:
4921 * Sets encoding mode
4922 *
4923 * @param[in] pv_api_ip
4924 * Pointer to input argument structure
4925 *
4926 * @param[out] pv_api_op
4927 * Pointer to output argument structure
4928 *
4929 * @param[out] ps_cfg
4930 * Pointer to config structure to be updated
4931 *
4932 * @returns error status
4933 *
4934 * @remarks none
4935 *
4936 *******************************************************************************
4937 */
ih264e_set_enc_mode(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)4938 static IV_STATUS_T ih264e_set_enc_mode(void *pv_api_ip,
4939 void *pv_api_op,
4940 cfg_params_t *ps_cfg)
4941 {
4942 /* ctrl call I/O structures */
4943 ih264e_ctl_set_enc_mode_ip_t *ps_ip = pv_api_ip;
4944 ih264e_ctl_set_enc_mode_op_t *ps_op = pv_api_op;
4945
4946 ps_op->s_ive_op.u4_error_code = 0;
4947
4948 ps_cfg->e_enc_mode = ps_ip->s_ive_ip.e_enc_mode;
4949
4950 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
4951 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
4952
4953 return IV_SUCCESS;
4954 }
4955
4956 /**
4957 *******************************************************************************
4958 *
4959 * @brief
4960 * Sets vbv parameters
4961 *
4962 * @par Description:
4963 * Sets vbv parameters
4964 *
4965 * @param[in] pv_api_ip
4966 * Pointer to input argument structure
4967 *
4968 * @param[out] pv_api_op
4969 * Pointer to output argument structure
4970 *
4971 * @param[out] ps_cfg
4972 * Pointer to config structure to be updated
4973 *
4974 * @returns error status
4975 *
4976 * @remarks none
4977 *
4978 *******************************************************************************
4979 */
ih264e_set_vbv_params(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)4980 static IV_STATUS_T ih264e_set_vbv_params(void *pv_api_ip,
4981 void *pv_api_op,
4982 cfg_params_t *ps_cfg)
4983 {
4984 /* ctrl call I/O structures */
4985 ih264e_ctl_set_vbv_params_ip_t *ps_ip = pv_api_ip;
4986 ih264e_ctl_set_vbv_params_op_t *ps_op = pv_api_op;
4987
4988 ps_op->s_ive_op.u4_error_code = 0;
4989
4990 ps_cfg->u4_vbv_buf_size = ps_ip->s_ive_ip.u4_vbv_buf_size;
4991 ps_cfg->u4_vbv_buffer_delay = ps_ip->s_ive_ip.u4_vbv_buffer_delay;
4992
4993 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
4994 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
4995
4996 return IV_SUCCESS;
4997 }
4998
4999 /**
5000 *******************************************************************************
5001 *
5002 * @brief
5003 * Sets AIR parameters
5004 *
5005 * @par Description:
5006 * Sets AIR parameters
5007 *
5008 * @param[in] pv_api_ip
5009 * Pointer to input argument structure
5010 *
5011 * @param[out] pv_api_op
5012 * Pointer to output argument structure
5013 *
5014 * @param[out] ps_cfg
5015 * Pointer to config structure to be updated
5016 *
5017 * @returns error status
5018 *
5019 * @remarks none
5020 *
5021 *******************************************************************************
5022 */
ih264_set_air_params(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)5023 static IV_STATUS_T ih264_set_air_params(void *pv_api_ip,
5024 void *pv_api_op,
5025 cfg_params_t *ps_cfg)
5026 {
5027 /* ctrl call I/O structures */
5028 ih264e_ctl_set_air_params_ip_t *ps_ip = pv_api_ip;
5029 ih264e_ctl_set_air_params_op_t *ps_op = pv_api_op;
5030
5031 ps_op->s_ive_op.u4_error_code = 0;
5032
5033 ps_cfg->e_air_mode = ps_ip->s_ive_ip.e_air_mode;
5034 ps_cfg->u4_air_refresh_period = ps_ip->s_ive_ip.u4_air_refresh_period;
5035
5036 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
5037 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
5038
5039 return IV_SUCCESS;
5040 }
5041
5042 /**
5043 *******************************************************************************
5044 *
5045 * @brief
5046 * Sets motion estimation parameters
5047 *
5048 * @par Description:
5049 * Sets motion estimation parameters
5050 *
5051 * @param[in] pv_api_ip
5052 * Pointer to input argument structure
5053 *
5054 * @param[out] pv_api_op
5055 * Pointer to output argument structure
5056 *
5057 * @param[out] ps_cfg
5058 * Pointer to config structure to be updated
5059 *
5060 * @returns error status
5061 *
5062 * @remarks none
5063 *
5064 *******************************************************************************
5065 */
ih264_set_me_params(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)5066 static IV_STATUS_T ih264_set_me_params(void *pv_api_ip,
5067 void *pv_api_op,
5068 cfg_params_t *ps_cfg)
5069 {
5070 /* ctrl call I/O structures */
5071 ih264e_ctl_set_me_params_ip_t *ps_ip = pv_api_ip;
5072 ih264e_ctl_set_me_params_op_t *ps_op = pv_api_op;
5073
5074 ps_op->s_ive_op.u4_error_code = 0;
5075
5076 ps_cfg->u4_enable_hpel = ps_ip->s_ive_ip.u4_enable_hpel;
5077 ps_cfg->u4_enable_qpel = ps_ip->s_ive_ip.u4_enable_qpel;
5078 ps_cfg->u4_enable_fast_sad = ps_ip->s_ive_ip.u4_enable_fast_sad;
5079 ps_cfg->u4_enable_alt_ref = ps_ip->s_ive_ip.u4_enable_alt_ref;
5080 ps_cfg->u4_srch_rng_x = ps_ip->s_ive_ip.u4_srch_rng_x;
5081 ps_cfg->u4_srch_rng_y = ps_ip->s_ive_ip.u4_srch_rng_y;
5082 ps_cfg->u4_me_speed_preset = ps_ip->s_ive_ip.u4_me_speed_preset;
5083
5084 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
5085 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
5086
5087 return IV_SUCCESS;
5088 }
5089
5090 /**
5091 *******************************************************************************
5092 *
5093 * @brief
5094 * Sets Intra/Inter Prediction estimation parameters
5095 *
5096 * @par Description:
5097 * Sets Intra/Inter Prediction estimation parameters
5098 *
5099 * @param[in] pv_api_ip
5100 * Pointer to input argument structure
5101 *
5102 * @param[out] pv_api_op
5103 * Pointer to output argument structure
5104 *
5105 * @param[out] ps_cfg
5106 * Pointer to config structure to be updated
5107 *
5108 * @returns error status
5109 *
5110 * @remarks none
5111 *
5112 *******************************************************************************
5113 */
ih264_set_ipe_params(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)5114 static IV_STATUS_T ih264_set_ipe_params(void *pv_api_ip,
5115 void *pv_api_op,
5116 cfg_params_t *ps_cfg)
5117 {
5118 /* ctrl call I/O structures */
5119 ih264e_ctl_set_ipe_params_ip_t *ps_ip = pv_api_ip;
5120 ih264e_ctl_set_ipe_params_op_t *ps_op = pv_api_op;
5121
5122 ps_op->s_ive_op.u4_error_code = 0;
5123
5124 ps_cfg->u4_enable_intra_4x4 = ps_ip->s_ive_ip.u4_enable_intra_4x4;
5125 ps_cfg->u4_enc_speed_preset = ps_ip->s_ive_ip.u4_enc_speed_preset;
5126
5127 ps_cfg->u4_constrained_intra_pred = ps_ip->s_ive_ip.u4_constrained_intra_pred;
5128
5129 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
5130 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
5131
5132 return IV_SUCCESS;
5133 }
5134
5135 /**
5136 *******************************************************************************
5137 *
5138 * @brief
5139 * Sets GOP parameters
5140 *
5141 * @par Description:
5142 * Sets GOP parameters
5143 *
5144 * @param[in] pv_api_ip
5145 * Pointer to input argument structure
5146 *
5147 * @param[out] pv_api_op
5148 * Pointer to output argument structure
5149 *
5150 * @param[out] ps_cfg
5151 * Pointer to config structure to be updated
5152 *
5153 * @returns error status
5154 *
5155 * @remarks none
5156 *
5157 *******************************************************************************
5158 */
ih264_set_gop_params(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)5159 static IV_STATUS_T ih264_set_gop_params(void *pv_api_ip,
5160 void *pv_api_op,
5161 cfg_params_t *ps_cfg)
5162 {
5163 /* ctrl call I/O structures */
5164 ih264e_ctl_set_gop_params_ip_t *ps_ip = pv_api_ip;
5165 ih264e_ctl_set_gop_params_op_t *ps_op = pv_api_op;
5166
5167 ps_op->s_ive_op.u4_error_code = 0;
5168
5169 ps_cfg->u4_i_frm_interval = ps_ip->s_ive_ip.u4_i_frm_interval;
5170 ps_cfg->u4_idr_frm_interval = ps_ip->s_ive_ip.u4_idr_frm_interval;
5171
5172 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
5173 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
5174
5175 return IV_SUCCESS;
5176 }
5177
5178 /**
5179 *******************************************************************************
5180 *
5181 * @brief
5182 * Sets profile parameters
5183 *
5184 * @par Description:
5185 * Sets profile parameters
5186 *
5187 * @param[in] pv_api_ip
5188 * Pointer to input argument structure
5189 *
5190 * @param[out] pv_api_op
5191 * Pointer to output argument structure
5192 *
5193 * @param[out] ps_cfg
5194 * Pointer to config structure to be updated
5195 *
5196 * @returns error status
5197 *
5198 * @remarks none
5199 *
5200 *******************************************************************************
5201 */
ih264_set_profile_params(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)5202 static IV_STATUS_T ih264_set_profile_params(void *pv_api_ip,
5203 void *pv_api_op,
5204 cfg_params_t *ps_cfg)
5205 {
5206 /* ctrl call I/O structures */
5207 ih264e_ctl_set_profile_params_ip_t *ps_ip = pv_api_ip;
5208 ih264e_ctl_set_profile_params_op_t *ps_op = pv_api_op;
5209
5210 ps_op->s_ive_op.u4_error_code = 0;
5211
5212 ps_cfg->e_profile = ps_ip->s_ive_ip.e_profile;
5213
5214 ps_cfg->u4_entropy_coding_mode = ps_ip->s_ive_ip.u4_entropy_coding_mode;
5215
5216 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
5217 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
5218
5219 return IV_SUCCESS;
5220 }
5221
5222 /**
5223 *******************************************************************************
5224 *
5225 * @brief
5226 * Sets disable deblock level
5227 *
5228 * @par Description:
5229 * Sets disable deblock level. Level 0 means no disabling and level 4 means
5230 * disable completely. 1, 2, 3 are intermediate levels that control amount
5231 * of deblocking done.
5232 *
5233 * @param[in] ps_codec_obj
5234 * Pointer to codec object at API level
5235 *
5236 * @param[in] pv_api_ip
5237 * Pointer to input argument structure
5238 *
5239 * @param[out] pv_api_op
5240 * Pointer to output argument structure
5241 *
5242 * @returns error status
5243 *
5244 * @remarks none
5245 *
5246 *******************************************************************************
5247 */
ih264_set_deblock_params(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)5248 static WORD32 ih264_set_deblock_params(void *pv_api_ip,
5249 void *pv_api_op,
5250 cfg_params_t *ps_cfg)
5251 {
5252 /* ctrl call I/O structures */
5253 ih264e_ctl_set_deblock_params_ip_t *ps_ip = pv_api_ip;
5254 ih264e_ctl_set_deblock_params_op_t *ps_op = pv_api_op;
5255
5256 ps_op->s_ive_op.u4_error_code = 0;
5257
5258 ps_cfg->u4_disable_deblock_level = ps_ip->s_ive_ip.u4_disable_deblock_level;
5259
5260 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
5261 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
5262
5263 return IV_SUCCESS;
5264 }
5265 /**
5266 *******************************************************************************
5267 *
5268 * @brief
5269 * Sets vui params
5270 *
5271 * @par Description:
5272 * Video usability information
5273 *
5274 * @param[in] pv_api_ip
5275 * Pointer to input argument structure
5276 *
5277 * @param[out] pv_api_op
5278 * Pointer to output argument structure
5279 *
5280 * @param[out] ps_cfg
5281 * Pointer to config structure to be updated
5282 *
5283 * @returns error status
5284 *
5285 * @remarks none
5286 *
5287 *******************************************************************************
5288 */
ih264e_set_vui_params(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)5289 static WORD32 ih264e_set_vui_params(void *pv_api_ip,
5290 void *pv_api_op,
5291 cfg_params_t *ps_cfg)
5292 {
5293 /* ctrl call I/O structures */
5294 ih264e_vui_ip_t *ps_ip = pv_api_ip;
5295 ih264e_vui_op_t *ps_op = pv_api_op;
5296 vui_t *ps_vui = &ps_cfg->s_vui;
5297
5298 ps_op->u4_error_code = 0;
5299
5300 ps_vui->u1_aspect_ratio_info_present_flag =
5301 ps_ip->u1_aspect_ratio_info_present_flag;
5302 ps_vui->u1_aspect_ratio_idc = ps_ip->u1_aspect_ratio_idc;
5303 ps_vui->u2_sar_width = ps_ip->u2_sar_width;
5304 ps_vui->u2_sar_height = ps_ip->u2_sar_height;
5305 ps_vui->u1_overscan_info_present_flag =
5306 ps_ip->u1_overscan_info_present_flag;
5307 ps_vui->u1_overscan_appropriate_flag = ps_ip->u1_overscan_appropriate_flag;
5308 ps_vui->u1_video_signal_type_present_flag =
5309 ps_ip->u1_video_signal_type_present_flag;
5310 ps_vui->u1_video_format = ps_ip->u1_video_format;
5311 ps_vui->u1_video_full_range_flag = ps_ip->u1_video_full_range_flag;
5312 ps_vui->u1_colour_description_present_flag =
5313 ps_ip->u1_colour_description_present_flag;
5314 ps_vui->u1_colour_primaries = ps_ip->u1_colour_primaries;
5315 ps_vui->u1_transfer_characteristics = ps_ip->u1_transfer_characteristics;
5316 ps_vui->u1_matrix_coefficients = ps_ip->u1_matrix_coefficients;
5317 ps_vui->u1_chroma_loc_info_present_flag =
5318 ps_ip->u1_chroma_loc_info_present_flag;
5319 ps_vui->u1_chroma_sample_loc_type_top_field =
5320 ps_ip->u1_chroma_sample_loc_type_top_field;
5321 ps_vui->u1_chroma_sample_loc_type_bottom_field =
5322 ps_ip->u1_chroma_sample_loc_type_bottom_field;
5323 ps_vui->u1_vui_timing_info_present_flag =
5324 ps_ip->u1_vui_timing_info_present_flag;
5325 ps_vui->u4_vui_num_units_in_tick = ps_ip->u4_vui_num_units_in_tick;
5326 ps_vui->u4_vui_time_scale = ps_ip->u4_vui_time_scale;
5327 ps_vui->u1_fixed_frame_rate_flag = ps_ip->u1_fixed_frame_rate_flag;
5328 ps_vui->u1_nal_hrd_parameters_present_flag =
5329 ps_ip->u1_nal_hrd_parameters_present_flag;
5330 ps_vui->u1_vcl_hrd_parameters_present_flag =
5331 ps_ip->u1_vcl_hrd_parameters_present_flag;
5332 ps_vui->u1_low_delay_hrd_flag = ps_ip->u1_low_delay_hrd_flag;
5333 ps_vui->u1_pic_struct_present_flag = ps_ip->u1_pic_struct_present_flag;
5334 ps_vui->u1_bitstream_restriction_flag =
5335 ps_ip->u1_bitstream_restriction_flag;
5336 ps_vui->u1_motion_vectors_over_pic_boundaries_flag =
5337 ps_ip->u1_motion_vectors_over_pic_boundaries_flag;
5338 ps_vui->u1_max_bytes_per_pic_denom = ps_ip->u1_max_bytes_per_pic_denom;
5339 ps_vui->u1_max_bits_per_mb_denom = ps_ip->u1_max_bits_per_mb_denom;
5340 ps_vui->u1_log2_max_mv_length_horizontal =
5341 ps_ip->u1_log2_max_mv_length_horizontal;
5342 ps_vui->u1_log2_max_mv_length_vertical =
5343 ps_ip->u1_log2_max_mv_length_vertical;
5344 ps_vui->u1_num_reorder_frames = ps_ip->u1_num_reorder_frames;
5345 ps_vui->u1_max_dec_frame_buffering = ps_ip->u1_max_dec_frame_buffering;
5346
5347 return IV_SUCCESS;
5348 }
5349 /**
5350 *******************************************************************************
5351 *
5352 * @brief
5353 * Sets number of cores
5354 *
5355 * @par Description:
5356 * Sets number of cores
5357 *
5358 * @param[in] ps_codec_obj
5359 * Pointer to codec object at API level
5360 *
5361 * @param[in] pv_api_ip
5362 * Pointer to input argument structure
5363 *
5364 * @param[out] pv_api_op
5365 * Pointer to output argument structure
5366 *
5367 * @returns error status
5368 *
5369 * @remarks The number of encoder threads is limited to MAX_PROCESS_THREADS
5370 *
5371 *******************************************************************************
5372 */
ih264e_set_num_cores(void * pv_api_ip,void * pv_api_op,cfg_params_t * ps_cfg)5373 static WORD32 ih264e_set_num_cores(void *pv_api_ip,
5374 void *pv_api_op,
5375 cfg_params_t *ps_cfg)
5376 {
5377 /* ctrl call I/O structures */
5378 ih264e_ctl_set_num_cores_ip_t *ps_ip = pv_api_ip;
5379 ih264e_ctl_set_num_cores_op_t *ps_op = pv_api_op;
5380
5381 ps_op->s_ive_op.u4_error_code = 0;
5382
5383 ps_cfg->u4_num_cores = MIN(ps_ip->s_ive_ip.u4_num_cores, MAX_PROCESS_THREADS);
5384
5385 ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
5386 ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
5387
5388 return IV_SUCCESS;
5389 }
5390
5391 /**
5392 *******************************************************************************
5393 *
5394 * @brief
5395 * Resets encoder state
5396 *
5397 * @par Description:
5398 * Resets encoder state by calling ih264e_init()
5399 *
5400 * @param[in] ps_codec_obj
5401 * Pointer to codec object at API level
5402 *
5403 * @param[in] pv_api_ip
5404 * Pointer to input argument structure
5405 *
5406 * @param[out] pv_api_op
5407 * Pointer to output argument structure
5408 *
5409 * @returns error status
5410 *
5411 * @remarks none
5412 *
5413 *******************************************************************************
5414 */
ih264e_reset(iv_obj_t * ps_codec_obj,void * pv_api_ip,void * pv_api_op)5415 static WORD32 ih264e_reset(iv_obj_t *ps_codec_obj,
5416 void *pv_api_ip,
5417 void *pv_api_op)
5418 {
5419 /* codec ctxt */
5420 codec_t * ps_codec = (codec_t *) (ps_codec_obj->pv_codec_handle);
5421
5422 /* ctrl call I/O structures */
5423 ih264e_ctl_reset_op_t *ps_op = pv_api_op;
5424
5425 UNUSED(pv_api_ip);
5426
5427 ps_op->s_ive_op.u4_error_code = 0;
5428
5429 if (ps_codec != NULL)
5430 {
5431 ih264e_init(ps_codec);
5432 }
5433 else
5434 {
5435 ps_op->s_ive_op.u4_error_code = IH264E_INIT_NOT_DONE;
5436 }
5437
5438 return IV_SUCCESS;
5439 }
5440
5441 /**
5442 *******************************************************************************
5443 *
5444 * @brief
5445 * Codec control call
5446 *
5447 * @par Description:
5448 * Codec control call which in turn calls appropriate calls based on sub-command
5449 *
5450 * @param[in] ps_codec_obj
5451 * Pointer to codec object at API level
5452 *
5453 * @param[in] pv_api_ip
5454 * Pointer to input argument structure
5455 *
5456 * @param[out] pv_api_op
5457 * Pointer to output argument structure
5458 *
5459 * @returns error status
5460 *
5461 * @remarks none
5462 *
5463 *******************************************************************************
5464 */
ih264e_ctl(iv_obj_t * ps_codec_obj,void * pv_api_ip,void * pv_api_op)5465 static WORD32 ih264e_ctl(iv_obj_t *ps_codec_obj,
5466 void *pv_api_ip,
5467 void *pv_api_op)
5468 {
5469 /* codec ctxt */
5470 codec_t *ps_codec = (codec_t *) ps_codec_obj->pv_codec_handle;
5471
5472 /* ctrl call I/O structures */
5473 ih264e_ctl_setdefault_ip_t *ps_ctl_ip = pv_api_ip;
5474 ih264e_ctl_setdefault_op_t *ps_ctl_op = pv_api_op;
5475
5476 /* ctrl call sub cmd */
5477 IVE_CONTROL_API_COMMAND_TYPE_T sub_cmd = ps_ctl_ip->s_ive_ip.e_sub_cmd;
5478
5479 /* error status */
5480 IV_STATUS_T ret = IV_SUCCESS;
5481
5482 /* temp var */
5483 WORD32 i;
5484 cfg_params_t *ps_cfg = NULL;
5485
5486 /* control call is for configuring encoding params, this is not to be called
5487 * before a successful init call */
5488 if (ps_codec->i4_init_done != 1)
5489 {
5490 ps_ctl_op->s_ive_op.u4_error_code |= 1 << IVE_FATALERROR;
5491 ps_ctl_op->s_ive_op.u4_error_code |= IH264E_INIT_NOT_DONE;
5492 return IV_FAIL;
5493 }
5494
5495 /* make it thread safe */
5496 ithread_mutex_lock(ps_codec->pv_ctl_mutex);
5497
5498 /* find a free config param set to hold current parameters */
5499 for (i = 0; i < MAX_ACTIVE_CONFIG_PARAMS; i++)
5500 {
5501 if (0 == ps_codec->as_cfg[i].u4_is_valid)
5502 {
5503 ps_cfg = &ps_codec->as_cfg[i];
5504 break;
5505 }
5506 }
5507
5508 /* If all are invalid, then start overwriting from the head config params */
5509 if (NULL == ps_cfg)
5510 {
5511 ps_cfg = &ps_codec->as_cfg[0];
5512 }
5513
5514 ps_cfg->u4_is_valid = 1;
5515
5516 ps_cfg->e_cmd = sub_cmd;
5517
5518 switch (sub_cmd)
5519 {
5520 case IVE_CMD_CTL_SET_DIMENSIONS:
5521 ret = ih264e_set_dimensions(pv_api_ip, pv_api_op, ps_cfg);
5522 break;
5523
5524 case IVE_CMD_CTL_SET_FRAMERATE:
5525 ret = ih264e_set_frame_rate(pv_api_ip, pv_api_op, ps_cfg);
5526 break;
5527
5528 case IVE_CMD_CTL_SET_BITRATE:
5529 ret = ih264e_set_bit_rate(pv_api_ip, pv_api_op, ps_cfg);
5530 break;
5531
5532 case IVE_CMD_CTL_SET_FRAMETYPE:
5533 ret = ih264e_set_frame_type(pv_api_ip, pv_api_op, ps_cfg);
5534 break;
5535
5536 case IVE_CMD_CTL_SET_QP:
5537 ret = ih264e_set_qp(pv_api_ip, pv_api_op, ps_cfg);
5538 break;
5539
5540 case IVE_CMD_CTL_SET_ENC_MODE:
5541 ret = ih264e_set_enc_mode(pv_api_ip, pv_api_op, ps_cfg);
5542 break;
5543
5544 case IVE_CMD_CTL_SET_VBV_PARAMS:
5545 ret = ih264e_set_vbv_params(pv_api_ip, pv_api_op, ps_cfg);
5546 break;
5547
5548 case IVE_CMD_CTL_SET_AIR_PARAMS:
5549 ret = ih264_set_air_params(pv_api_ip, pv_api_op, ps_cfg);
5550 break;
5551
5552 case IVE_CMD_CTL_SET_ME_PARAMS:
5553 ret = ih264_set_me_params(pv_api_ip, pv_api_op, ps_cfg);
5554 break;
5555
5556 case IVE_CMD_CTL_SET_IPE_PARAMS:
5557 ret = ih264_set_ipe_params(pv_api_ip, pv_api_op, ps_cfg);
5558 break;
5559
5560 case IVE_CMD_CTL_SET_GOP_PARAMS:
5561 ret = ih264_set_gop_params(pv_api_ip, pv_api_op, ps_cfg);
5562 break;
5563
5564 case IVE_CMD_CTL_SET_PROFILE_PARAMS:
5565 ret = ih264_set_profile_params(pv_api_ip, pv_api_op, ps_cfg);
5566 break;
5567
5568 case IVE_CMD_CTL_SET_DEBLOCK_PARAMS:
5569 ret = ih264_set_deblock_params(pv_api_ip, pv_api_op, ps_cfg);
5570 break;
5571
5572 case IVE_CMD_CTL_SET_VUI_PARAMS:
5573 ret = ih264e_set_vui_params(pv_api_ip, pv_api_op, ps_cfg);
5574 break;
5575
5576 case IVE_CMD_CTL_RESET:
5577
5578 /* invalidate config param struct as it is being served right away */
5579 ps_codec->as_cfg[i].u4_is_valid = 0;
5580
5581 ret = ih264e_reset(ps_codec_obj, pv_api_ip, pv_api_op);
5582 break;
5583
5584 case IVE_CMD_CTL_SETDEFAULT:
5585 {
5586 /* ctrl call I/O structures */
5587 ih264e_ctl_setdefault_op_t *ps_op = pv_api_op;
5588
5589 /* invalidate config param struct as it is being served right away */
5590 ps_codec->as_cfg[i].u4_is_valid = 0;
5591
5592 /* error status */
5593 ret = ih264e_set_default_params(ps_cfg);
5594
5595 ps_op->s_ive_op.u4_error_code = ret;
5596
5597 break;
5598 }
5599
5600 case IVE_CMD_CTL_FLUSH:
5601
5602 /* invalidate config param struct as it is being served right away */
5603 ps_codec->as_cfg[i].u4_is_valid = 0;
5604
5605 ret = ih264e_set_flush_mode(ps_codec_obj, pv_api_ip, pv_api_op);
5606 break;
5607
5608 case IVE_CMD_CTL_GETBUFINFO:
5609
5610 /* invalidate config param struct as it is being served right away */
5611 ps_codec->as_cfg[i].u4_is_valid = 0;
5612
5613 ret = ih264e_get_buf_info(ps_codec_obj, pv_api_ip, pv_api_op);
5614 break;
5615
5616 case IVE_CMD_CTL_GETVERSION:
5617 {
5618 /* ctrl call I/O structures */
5619 ih264e_ctl_getversioninfo_ip_t *ps_ip = pv_api_ip;
5620 ih264e_ctl_getversioninfo_op_t *ps_op = pv_api_op;
5621
5622 /* invalidate config param struct as it is being served right away */
5623 ps_codec->as_cfg[i].u4_is_valid = 0;
5624
5625 /* error status */
5626 ps_op->s_ive_op.u4_error_code = IV_SUCCESS;
5627
5628 if (ps_ip->s_ive_ip.u4_version_bufsize <= 0)
5629 {
5630 ps_op->s_ive_op.u4_error_code =
5631 IH264E_CXA_VERS_BUF_INSUFFICIENT;
5632 ret = IV_FAIL;
5633 }
5634 else
5635 {
5636 ret = ih264e_get_version((CHAR *) ps_ip->s_ive_ip.pu1_version,
5637 ps_ip->s_ive_ip.u4_version_bufsize);
5638
5639 if (ret != IV_SUCCESS)
5640 {
5641 ps_op->s_ive_op.u4_error_code =
5642 IH264E_CXA_VERS_BUF_INSUFFICIENT;
5643 ret = IV_FAIL;
5644 }
5645 }
5646 break;
5647 }
5648
5649 case IVE_CMD_CTL_SET_NUM_CORES:
5650 ret = ih264e_set_num_cores(pv_api_ip, pv_api_op, ps_cfg);
5651 break;
5652
5653 default:
5654 /* invalidate config param struct as it is being served right away */
5655 ps_codec->as_cfg[i].u4_is_valid = 0;
5656
5657 DEBUG("Warning !! unrecognized control api command \n");
5658 break;
5659 }
5660
5661 ithread_mutex_unlock(ps_codec->pv_ctl_mutex);
5662
5663 return ret;
5664 }
5665
5666 /**
5667 *******************************************************************************
5668 *
5669 * @brief
5670 * Codec entry point function. All the function calls to the codec are done
5671 * using this function with different values specified in command
5672 *
5673 * @par Description:
5674 * Arguments are tested for validity and then based on the command
5675 * appropriate function is called
5676 *
5677 * @param[in] ps_handle
5678 * API level handle for codec
5679 *
5680 * @param[in] pv_api_ip
5681 * Input argument structure
5682 *
5683 * @param[out] pv_api_op
5684 * Output argument structure
5685 *
5686 * @returns error_status
5687 *
5688 * @remarks
5689 *
5690 *******************************************************************************
5691 */
ih264e_api_function(iv_obj_t * ps_handle,void * pv_api_ip,void * pv_api_op)5692 IV_STATUS_T ih264e_api_function(iv_obj_t *ps_handle,
5693 void *pv_api_ip,
5694 void *pv_api_op)
5695 {
5696 /* api command */
5697 WORD32 command = IV_CMD_NA;
5698
5699 /* error status */
5700 IV_STATUS_T e_status;
5701 WORD32 ret;
5702
5703 /* tmp var */
5704 WORD32 *pu4_ptr_cmd = (WORD32 *) pv_api_ip;
5705
5706 /* validate input / output structures */
5707 e_status = api_check_struct_sanity(ps_handle, pv_api_ip, pv_api_op);
5708
5709 if (e_status != IV_SUCCESS)
5710 {
5711 DEBUG("error code = %d\n", *((UWORD32 *)pv_api_op + 1));
5712 return IV_FAIL;
5713 }
5714
5715 pu4_ptr_cmd++;
5716
5717 command = *pu4_ptr_cmd;
5718
5719 switch (command)
5720 {
5721 case IV_CMD_GET_NUM_MEM_REC:
5722 ret = ih264e_get_num_rec(pv_api_ip, pv_api_op);
5723 break;
5724
5725 case IV_CMD_FILL_NUM_MEM_REC:
5726 ret = ih264e_fill_num_mem_rec(pv_api_ip, pv_api_op);
5727 break;
5728
5729 case IV_CMD_INIT:
5730 ret = ih264e_init_mem_rec(ps_handle, pv_api_ip, pv_api_op);
5731 break;
5732
5733 case IV_CMD_RETRIEVE_MEMREC:
5734 ret = ih264e_retrieve_memrec(ps_handle, pv_api_ip, pv_api_op);
5735 break;
5736
5737 case IVE_CMD_VIDEO_CTL:
5738 ret = ih264e_ctl(ps_handle, pv_api_ip, pv_api_op);
5739 break;
5740
5741 case IVE_CMD_VIDEO_ENCODE:
5742 ret = ih264e_encode(ps_handle, pv_api_ip, pv_api_op);
5743 break;
5744
5745 default:
5746 ret = IV_FAIL;
5747 break;
5748 }
5749
5750 return (IV_STATUS_T) ret;
5751 }
5752