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