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 Name : ih264d_api.c */
24*495ae853SAndroid Build Coastguard Worker /* */
25*495ae853SAndroid Build Coastguard Worker /* Description : Has all API related functions */
26*495ae853SAndroid Build Coastguard Worker /* */
27*495ae853SAndroid Build Coastguard Worker /* */
28*495ae853SAndroid Build Coastguard Worker /* List of Functions : api_check_struct_sanity */
29*495ae853SAndroid Build Coastguard Worker /* ih264d_set_processor */
30*495ae853SAndroid Build Coastguard Worker /* ih264d_create */
31*495ae853SAndroid Build Coastguard Worker /* ih264d_delete */
32*495ae853SAndroid Build Coastguard Worker /* ih264d_init */
33*495ae853SAndroid Build Coastguard Worker /* ih264d_map_error */
34*495ae853SAndroid Build Coastguard Worker /* ih264d_video_decode */
35*495ae853SAndroid Build Coastguard Worker /* ih264d_get_version */
36*495ae853SAndroid Build Coastguard Worker /* ih264d_get_display_frame */
37*495ae853SAndroid Build Coastguard Worker /* ih264d_set_display_frame */
38*495ae853SAndroid Build Coastguard Worker /* ih264d_set_flush_mode */
39*495ae853SAndroid Build Coastguard Worker /* ih264d_get_status */
40*495ae853SAndroid Build Coastguard Worker /* ih264d_get_buf_info */
41*495ae853SAndroid Build Coastguard Worker /* ih264d_set_params */
42*495ae853SAndroid Build Coastguard Worker /* ih264d_set_default_params */
43*495ae853SAndroid Build Coastguard Worker /* ih264d_reset */
44*495ae853SAndroid Build Coastguard Worker /* ih264d_ctl */
45*495ae853SAndroid Build Coastguard Worker /* ih264d_rel_display_frame */
46*495ae853SAndroid Build Coastguard Worker /* ih264d_set_degrade */
47*495ae853SAndroid Build Coastguard Worker /* ih264d_get_frame_dimensions */
48*495ae853SAndroid Build Coastguard Worker /* ih264d_set_num_cores */
49*495ae853SAndroid Build Coastguard Worker /* ih264d_fill_output_struct_from_context */
50*495ae853SAndroid Build Coastguard Worker /* ih264d_api_function */
51*495ae853SAndroid Build Coastguard Worker /* */
52*495ae853SAndroid Build Coastguard Worker /* Issues / Problems : None */
53*495ae853SAndroid Build Coastguard Worker /* */
54*495ae853SAndroid Build Coastguard Worker /* Revision History : */
55*495ae853SAndroid Build Coastguard Worker /* */
56*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
57*495ae853SAndroid Build Coastguard Worker /* 14 10 2008 100356(SKV) Draft */
58*495ae853SAndroid Build Coastguard Worker /* */
59*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
60*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
64*495ae853SAndroid Build Coastguard Worker #include "iv.h"
65*495ae853SAndroid Build Coastguard Worker #include "ivd.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264d.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
68*495ae853SAndroid Build Coastguard Worker
69*495ae853SAndroid Build Coastguard Worker #include <string.h>
70*495ae853SAndroid Build Coastguard Worker #include <limits.h>
71*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
72*495ae853SAndroid Build Coastguard Worker
73*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
74*495ae853SAndroid Build Coastguard Worker
75*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
76*495ae853SAndroid Build Coastguard Worker #include "ih264d_nal.h"
77*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
78*495ae853SAndroid Build Coastguard Worker
79*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
80*495ae853SAndroid Build Coastguard Worker
81*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
82*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
83*495ae853SAndroid Build Coastguard Worker #include "ih264d_function_selector.h"
84*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
85*495ae853SAndroid Build Coastguard Worker #include "ih264_disp_mgr.h"
86*495ae853SAndroid Build Coastguard Worker #include "ih264_buf_mgr.h"
87*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
88*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
89*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cabac.h"
90*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
91*495ae853SAndroid Build Coastguard Worker #include "ih264d_format_conv.h"
92*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_headers.h"
93*495ae853SAndroid Build Coastguard Worker #include "ih264d_thread_compute_bs.h"
94*495ae853SAndroid Build Coastguard Worker #include <assert.h>
95*495ae853SAndroid Build Coastguard Worker
96*495ae853SAndroid Build Coastguard Worker
97*495ae853SAndroid Build Coastguard Worker /*********************/
98*495ae853SAndroid Build Coastguard Worker /* Codec Versioning */
99*495ae853SAndroid Build Coastguard Worker /*********************/
100*495ae853SAndroid Build Coastguard Worker //Move this to where it is used
101*495ae853SAndroid Build Coastguard Worker #define CODEC_NAME "H264VDEC"
102*495ae853SAndroid Build Coastguard Worker #define CODEC_RELEASE_TYPE "production"
103*495ae853SAndroid Build Coastguard Worker #define CODEC_RELEASE_VER "05.00"
104*495ae853SAndroid Build Coastguard Worker #define CODEC_VENDOR "ITTIAM"
105*495ae853SAndroid Build Coastguard Worker #define MAXVERSION_STRLEN 511
106*495ae853SAndroid Build Coastguard Worker #ifdef ANDROID
107*495ae853SAndroid Build Coastguard Worker #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor) \
108*495ae853SAndroid Build Coastguard Worker snprintf(version_string, MAXVERSION_STRLEN, \
109*495ae853SAndroid Build Coastguard Worker "@(#)Id:%s_%s Ver:%s Released by %s", \
110*495ae853SAndroid Build Coastguard Worker codec_name, codec_release_type, codec_release_ver, codec_vendor)
111*495ae853SAndroid Build Coastguard Worker #else
112*495ae853SAndroid Build Coastguard Worker #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor) \
113*495ae853SAndroid Build Coastguard Worker snprintf(version_string, MAXVERSION_STRLEN, \
114*495ae853SAndroid Build Coastguard Worker "@(#)Id:%s_%s Ver:%s Released by %s Build: %s @ %s", \
115*495ae853SAndroid Build Coastguard Worker codec_name, codec_release_type, codec_release_ver, codec_vendor, __DATE__, __TIME__)
116*495ae853SAndroid Build Coastguard Worker #endif
117*495ae853SAndroid Build Coastguard Worker
118*495ae853SAndroid Build Coastguard Worker
119*495ae853SAndroid Build Coastguard Worker #define MIN_IN_BUFS 1
120*495ae853SAndroid Build Coastguard Worker #define MIN_OUT_BUFS_420 3
121*495ae853SAndroid Build Coastguard Worker #define MIN_OUT_BUFS_422ILE 1
122*495ae853SAndroid Build Coastguard Worker #define MIN_OUT_BUFS_RGB565 1
123*495ae853SAndroid Build Coastguard Worker #define MIN_OUT_BUFS_420SP 2
124*495ae853SAndroid Build Coastguard Worker
125*495ae853SAndroid Build Coastguard Worker #define NUM_FRAMES_LIMIT_ENABLED 0
126*495ae853SAndroid Build Coastguard Worker
127*495ae853SAndroid Build Coastguard Worker #if NUM_FRAMES_LIMIT_ENABLED
128*495ae853SAndroid Build Coastguard Worker #define NUM_FRAMES_LIMIT 10000
129*495ae853SAndroid Build Coastguard Worker #else
130*495ae853SAndroid Build Coastguard Worker #define NUM_FRAMES_LIMIT 0x7FFFFFFF
131*495ae853SAndroid Build Coastguard Worker #endif
132*495ae853SAndroid Build Coastguard Worker
133*495ae853SAndroid Build Coastguard Worker
134*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_get_extra_mem_external(UWORD32 width, UWORD32 height);
135*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_frame_dimensions(iv_obj_t *dec_hdl,
136*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
137*495ae853SAndroid Build Coastguard Worker void *pv_api_op);
138*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_vui_params(iv_obj_t *dec_hdl,
139*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
140*495ae853SAndroid Build Coastguard Worker void *pv_api_op);
141*495ae853SAndroid Build Coastguard Worker
142*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_mdcv_params(iv_obj_t *dec_hdl,
143*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
144*495ae853SAndroid Build Coastguard Worker void *pv_api_op);
145*495ae853SAndroid Build Coastguard Worker
146*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_cll_params(iv_obj_t *dec_hdl,
147*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
148*495ae853SAndroid Build Coastguard Worker void *pv_api_op);
149*495ae853SAndroid Build Coastguard Worker
150*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_ave_params(iv_obj_t *dec_hdl,
151*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
152*495ae853SAndroid Build Coastguard Worker void *pv_api_op);
153*495ae853SAndroid Build Coastguard Worker
154*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_ccv_params(iv_obj_t *dec_hdl,
155*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
156*495ae853SAndroid Build Coastguard Worker void *pv_api_op);
157*495ae853SAndroid Build Coastguard Worker
158*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_sii_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
159*495ae853SAndroid Build Coastguard Worker
160*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_fgc_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
161*495ae853SAndroid Build Coastguard Worker
162*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_num_cores(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
163*495ae853SAndroid Build Coastguard Worker
164*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_deblock_display(dec_struct_t *ps_dec);
165*495ae853SAndroid Build Coastguard Worker
166*495ae853SAndroid Build Coastguard Worker void ih264d_signal_decode_thread(dec_struct_t *ps_dec);
167*495ae853SAndroid Build Coastguard Worker
168*495ae853SAndroid Build Coastguard Worker void ih264d_signal_bs_deblk_thread(dec_struct_t *ps_dec);
169*495ae853SAndroid Build Coastguard Worker void ih264d_decode_picture_thread(dec_struct_t *ps_dec);
170*495ae853SAndroid Build Coastguard Worker
171*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_degrade(iv_obj_t *ps_codec_obj,
172*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
173*495ae853SAndroid Build Coastguard Worker void *pv_api_op);
174*495ae853SAndroid Build Coastguard Worker
175*495ae853SAndroid Build Coastguard Worker void ih264d_fill_output_struct_from_context(dec_struct_t *ps_dec,
176*495ae853SAndroid Build Coastguard Worker ivd_video_decode_op_t *ps_dec_op);
177*495ae853SAndroid Build Coastguard Worker
178*495ae853SAndroid Build Coastguard Worker /*!
179*495ae853SAndroid Build Coastguard Worker **************************************************************************
180*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_export_sei_params \endif
181*495ae853SAndroid Build Coastguard Worker *
182*495ae853SAndroid Build Coastguard Worker * \brief
183*495ae853SAndroid Build Coastguard Worker * Exports sei params from decoder to application.
184*495ae853SAndroid Build Coastguard Worker *
185*495ae853SAndroid Build Coastguard Worker * \return
186*495ae853SAndroid Build Coastguard Worker * 0 on Success and error code otherwise
187*495ae853SAndroid Build Coastguard Worker **************************************************************************
188*495ae853SAndroid Build Coastguard Worker */
189*495ae853SAndroid Build Coastguard Worker
ih264d_export_sei_params(ivd_sei_decode_op_t * ps_sei_decode_op,dec_struct_t * ps_dec)190*495ae853SAndroid Build Coastguard Worker void ih264d_export_sei_params(ivd_sei_decode_op_t *ps_sei_decode_op, dec_struct_t *ps_dec)
191*495ae853SAndroid Build Coastguard Worker {
192*495ae853SAndroid Build Coastguard Worker WORD32 i4_status = IV_SUCCESS;
193*495ae853SAndroid Build Coastguard Worker sei *ps_sei = (sei *)ps_dec->pv_disp_sei_params;
194*495ae853SAndroid Build Coastguard Worker
195*495ae853SAndroid Build Coastguard Worker i4_status = ih264d_export_sei_mdcv_params(ps_sei_decode_op, ps_sei, &ps_dec->s_sei_export);
196*495ae853SAndroid Build Coastguard Worker i4_status = ih264d_export_sei_cll_params(ps_sei_decode_op, ps_sei, &ps_dec->s_sei_export);
197*495ae853SAndroid Build Coastguard Worker i4_status = ih264d_export_sei_ave_params(ps_sei_decode_op, ps_sei, &ps_dec->s_sei_export);
198*495ae853SAndroid Build Coastguard Worker i4_status = ih264d_export_sei_ccv_params(ps_sei_decode_op, ps_sei, &ps_dec->s_sei_export);
199*495ae853SAndroid Build Coastguard Worker i4_status = ih264d_export_sei_sii_params(ps_sei_decode_op, ps_sei, &ps_dec->s_sei_export);
200*495ae853SAndroid Build Coastguard Worker i4_status = ih264d_export_sei_fgc_params(ps_sei_decode_op, ps_sei, &ps_dec->s_sei_export);
201*495ae853SAndroid Build Coastguard Worker
202*495ae853SAndroid Build Coastguard Worker UNUSED(i4_status);
203*495ae853SAndroid Build Coastguard Worker }
204*495ae853SAndroid Build Coastguard Worker
api_check_struct_sanity(iv_obj_t * ps_handle,void * pv_api_ip,void * pv_api_op)205*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
206*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
207*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
208*495ae853SAndroid Build Coastguard Worker {
209*495ae853SAndroid Build Coastguard Worker IVD_API_COMMAND_TYPE_T e_cmd;
210*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_api_ip;
211*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_api_op;
212*495ae853SAndroid Build Coastguard Worker UWORD32 i, j;
213*495ae853SAndroid Build Coastguard Worker
214*495ae853SAndroid Build Coastguard Worker if(NULL == pv_api_op)
215*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
216*495ae853SAndroid Build Coastguard Worker
217*495ae853SAndroid Build Coastguard Worker if(NULL == pv_api_ip)
218*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
219*495ae853SAndroid Build Coastguard Worker
220*495ae853SAndroid Build Coastguard Worker pu4_api_ip = (UWORD32 *)pv_api_ip;
221*495ae853SAndroid Build Coastguard Worker pu4_api_op = (UWORD32 *)pv_api_op;
222*495ae853SAndroid Build Coastguard Worker e_cmd = *(pu4_api_ip + 1);
223*495ae853SAndroid Build Coastguard Worker
224*495ae853SAndroid Build Coastguard Worker /* error checks on handle */
225*495ae853SAndroid Build Coastguard Worker switch((WORD32)e_cmd)
226*495ae853SAndroid Build Coastguard Worker {
227*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CREATE:
228*495ae853SAndroid Build Coastguard Worker break;
229*495ae853SAndroid Build Coastguard Worker
230*495ae853SAndroid Build Coastguard Worker case IVD_CMD_REL_DISPLAY_FRAME:
231*495ae853SAndroid Build Coastguard Worker case IVD_CMD_SET_DISPLAY_FRAME:
232*495ae853SAndroid Build Coastguard Worker case IVD_CMD_GET_DISPLAY_FRAME:
233*495ae853SAndroid Build Coastguard Worker case IVD_CMD_VIDEO_DECODE:
234*495ae853SAndroid Build Coastguard Worker case IVD_CMD_DELETE:
235*495ae853SAndroid Build Coastguard Worker case IVD_CMD_VIDEO_CTL:
236*495ae853SAndroid Build Coastguard Worker if(ps_handle == NULL)
237*495ae853SAndroid Build Coastguard Worker {
238*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
239*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= IVD_HANDLE_NULL;
240*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
241*495ae853SAndroid Build Coastguard Worker }
242*495ae853SAndroid Build Coastguard Worker
243*495ae853SAndroid Build Coastguard Worker if(ps_handle->u4_size != sizeof(iv_obj_t))
244*495ae853SAndroid Build Coastguard Worker {
245*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
246*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= IVD_HANDLE_STRUCT_SIZE_INCORRECT;
247*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
248*495ae853SAndroid Build Coastguard Worker }
249*495ae853SAndroid Build Coastguard Worker
250*495ae853SAndroid Build Coastguard Worker if(ps_handle->pv_fxns != ih264d_api_function)
251*495ae853SAndroid Build Coastguard Worker {
252*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
253*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= IVD_INVALID_HANDLE_NULL;
254*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
255*495ae853SAndroid Build Coastguard Worker }
256*495ae853SAndroid Build Coastguard Worker
257*495ae853SAndroid Build Coastguard Worker if(ps_handle->pv_codec_handle == NULL)
258*495ae853SAndroid Build Coastguard Worker {
259*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
260*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= IVD_INVALID_HANDLE_NULL;
261*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
262*495ae853SAndroid Build Coastguard Worker }
263*495ae853SAndroid Build Coastguard Worker break;
264*495ae853SAndroid Build Coastguard Worker default:
265*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
266*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= IVD_INVALID_API_CMD;
267*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
268*495ae853SAndroid Build Coastguard Worker }
269*495ae853SAndroid Build Coastguard Worker
270*495ae853SAndroid Build Coastguard Worker switch((WORD32)e_cmd)
271*495ae853SAndroid Build Coastguard Worker {
272*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CREATE:
273*495ae853SAndroid Build Coastguard Worker {
274*495ae853SAndroid Build Coastguard Worker ih264d_create_ip_t *ps_ip = (ih264d_create_ip_t *)pv_api_ip;
275*495ae853SAndroid Build Coastguard Worker ih264d_create_op_t *ps_op = (ih264d_create_op_t *)pv_api_op;
276*495ae853SAndroid Build Coastguard Worker
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_create_op_t.u4_error_code = 0;
279*495ae853SAndroid Build Coastguard Worker
280*495ae853SAndroid Build Coastguard Worker if((ps_ip->s_ivd_create_ip_t.u4_size > sizeof(ih264d_create_ip_t))
281*495ae853SAndroid Build Coastguard Worker || (ps_ip->s_ivd_create_ip_t.u4_size
282*495ae853SAndroid Build Coastguard Worker < sizeof(ivd_create_ip_t)))
283*495ae853SAndroid Build Coastguard Worker {
284*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_create_op_t.u4_error_code |= 1
285*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
286*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_create_op_t.u4_error_code |=
287*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
288*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("\n");
289*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
290*495ae853SAndroid Build Coastguard Worker }
291*495ae853SAndroid Build Coastguard Worker
292*495ae853SAndroid Build Coastguard Worker if((ps_op->s_ivd_create_op_t.u4_size != sizeof(ih264d_create_op_t))
293*495ae853SAndroid Build Coastguard Worker && (ps_op->s_ivd_create_op_t.u4_size
294*495ae853SAndroid Build Coastguard Worker != sizeof(ivd_create_op_t)))
295*495ae853SAndroid Build Coastguard Worker {
296*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_create_op_t.u4_error_code |= 1
297*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
298*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_create_op_t.u4_error_code |=
299*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
300*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("\n");
301*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
302*495ae853SAndroid Build Coastguard Worker }
303*495ae853SAndroid Build Coastguard Worker
304*495ae853SAndroid Build Coastguard Worker
305*495ae853SAndroid Build Coastguard Worker if((ps_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420P)
306*495ae853SAndroid Build Coastguard Worker && (ps_ip->s_ivd_create_ip_t.e_output_format
307*495ae853SAndroid Build Coastguard Worker != IV_YUV_422ILE)
308*495ae853SAndroid Build Coastguard Worker && (ps_ip->s_ivd_create_ip_t.e_output_format
309*495ae853SAndroid Build Coastguard Worker != IV_RGB_565)
310*495ae853SAndroid Build Coastguard Worker && (ps_ip->s_ivd_create_ip_t.e_output_format
311*495ae853SAndroid Build Coastguard Worker != IV_YUV_420SP_UV)
312*495ae853SAndroid Build Coastguard Worker && (ps_ip->s_ivd_create_ip_t.e_output_format
313*495ae853SAndroid Build Coastguard Worker != IV_YUV_420SP_VU))
314*495ae853SAndroid Build Coastguard Worker {
315*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_create_op_t.u4_error_code |= 1
316*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
317*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_create_op_t.u4_error_code |=
318*495ae853SAndroid Build Coastguard Worker IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED;
319*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("\n");
320*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
321*495ae853SAndroid Build Coastguard Worker }
322*495ae853SAndroid Build Coastguard Worker
323*495ae853SAndroid Build Coastguard Worker }
324*495ae853SAndroid Build Coastguard Worker break;
325*495ae853SAndroid Build Coastguard Worker
326*495ae853SAndroid Build Coastguard Worker case IVD_CMD_GET_DISPLAY_FRAME:
327*495ae853SAndroid Build Coastguard Worker {
328*495ae853SAndroid Build Coastguard Worker ih264d_get_display_frame_ip_t *ps_ip =
329*495ae853SAndroid Build Coastguard Worker (ih264d_get_display_frame_ip_t *)pv_api_ip;
330*495ae853SAndroid Build Coastguard Worker ih264d_get_display_frame_op_t *ps_op =
331*495ae853SAndroid Build Coastguard Worker (ih264d_get_display_frame_op_t *)pv_api_op;
332*495ae853SAndroid Build Coastguard Worker
333*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_get_display_frame_op_t.u4_error_code = 0;
334*495ae853SAndroid Build Coastguard Worker
335*495ae853SAndroid Build Coastguard Worker if((ps_ip->s_ivd_get_display_frame_ip_t.u4_size
336*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_get_display_frame_ip_t))
337*495ae853SAndroid Build Coastguard Worker && (ps_ip->s_ivd_get_display_frame_ip_t.u4_size
338*495ae853SAndroid Build Coastguard Worker != sizeof(ivd_get_display_frame_ip_t)))
339*495ae853SAndroid Build Coastguard Worker {
340*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1
341*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
342*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_get_display_frame_op_t.u4_error_code |=
343*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
344*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
345*495ae853SAndroid Build Coastguard Worker }
346*495ae853SAndroid Build Coastguard Worker
347*495ae853SAndroid Build Coastguard Worker if((ps_op->s_ivd_get_display_frame_op_t.u4_size
348*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_get_display_frame_op_t))
349*495ae853SAndroid Build Coastguard Worker && (ps_op->s_ivd_get_display_frame_op_t.u4_size
350*495ae853SAndroid Build Coastguard Worker != sizeof(ivd_get_display_frame_op_t)))
351*495ae853SAndroid Build Coastguard Worker {
352*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1
353*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
354*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_get_display_frame_op_t.u4_error_code |=
355*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
356*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
357*495ae853SAndroid Build Coastguard Worker }
358*495ae853SAndroid Build Coastguard Worker }
359*495ae853SAndroid Build Coastguard Worker break;
360*495ae853SAndroid Build Coastguard Worker
361*495ae853SAndroid Build Coastguard Worker case IVD_CMD_REL_DISPLAY_FRAME:
362*495ae853SAndroid Build Coastguard Worker {
363*495ae853SAndroid Build Coastguard Worker ih264d_rel_display_frame_ip_t *ps_ip =
364*495ae853SAndroid Build Coastguard Worker (ih264d_rel_display_frame_ip_t *)pv_api_ip;
365*495ae853SAndroid Build Coastguard Worker ih264d_rel_display_frame_op_t *ps_op =
366*495ae853SAndroid Build Coastguard Worker (ih264d_rel_display_frame_op_t *)pv_api_op;
367*495ae853SAndroid Build Coastguard Worker
368*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_rel_display_frame_op_t.u4_error_code = 0;
369*495ae853SAndroid Build Coastguard Worker
370*495ae853SAndroid Build Coastguard Worker if((ps_ip->s_ivd_rel_display_frame_ip_t.u4_size
371*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_rel_display_frame_ip_t))
372*495ae853SAndroid Build Coastguard Worker && (ps_ip->s_ivd_rel_display_frame_ip_t.u4_size
373*495ae853SAndroid Build Coastguard Worker != sizeof(ivd_rel_display_frame_ip_t)))
374*495ae853SAndroid Build Coastguard Worker {
375*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= 1
376*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
377*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |=
378*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
379*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
380*495ae853SAndroid Build Coastguard Worker }
381*495ae853SAndroid Build Coastguard Worker
382*495ae853SAndroid Build Coastguard Worker if((ps_op->s_ivd_rel_display_frame_op_t.u4_size
383*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_rel_display_frame_op_t))
384*495ae853SAndroid Build Coastguard Worker && (ps_op->s_ivd_rel_display_frame_op_t.u4_size
385*495ae853SAndroid Build Coastguard Worker != sizeof(ivd_rel_display_frame_op_t)))
386*495ae853SAndroid Build Coastguard Worker {
387*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= 1
388*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
389*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |=
390*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
391*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
392*495ae853SAndroid Build Coastguard Worker }
393*495ae853SAndroid Build Coastguard Worker
394*495ae853SAndroid Build Coastguard Worker }
395*495ae853SAndroid Build Coastguard Worker break;
396*495ae853SAndroid Build Coastguard Worker
397*495ae853SAndroid Build Coastguard Worker case IVD_CMD_SET_DISPLAY_FRAME:
398*495ae853SAndroid Build Coastguard Worker {
399*495ae853SAndroid Build Coastguard Worker ih264d_set_display_frame_ip_t *ps_ip =
400*495ae853SAndroid Build Coastguard Worker (ih264d_set_display_frame_ip_t *)pv_api_ip;
401*495ae853SAndroid Build Coastguard Worker ih264d_set_display_frame_op_t *ps_op =
402*495ae853SAndroid Build Coastguard Worker (ih264d_set_display_frame_op_t *)pv_api_op;
403*495ae853SAndroid Build Coastguard Worker UWORD32 j;
404*495ae853SAndroid Build Coastguard Worker
405*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code = 0;
406*495ae853SAndroid Build Coastguard Worker
407*495ae853SAndroid Build Coastguard Worker if((ps_ip->s_ivd_set_display_frame_ip_t.u4_size
408*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_set_display_frame_ip_t))
409*495ae853SAndroid Build Coastguard Worker && (ps_ip->s_ivd_set_display_frame_ip_t.u4_size
410*495ae853SAndroid Build Coastguard Worker != sizeof(ivd_set_display_frame_ip_t)))
411*495ae853SAndroid Build Coastguard Worker {
412*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1
413*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
414*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
415*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
416*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
417*495ae853SAndroid Build Coastguard Worker }
418*495ae853SAndroid Build Coastguard Worker
419*495ae853SAndroid Build Coastguard Worker if((ps_op->s_ivd_set_display_frame_op_t.u4_size
420*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_set_display_frame_op_t))
421*495ae853SAndroid Build Coastguard Worker && (ps_op->s_ivd_set_display_frame_op_t.u4_size
422*495ae853SAndroid Build Coastguard Worker != sizeof(ivd_set_display_frame_op_t)))
423*495ae853SAndroid Build Coastguard Worker {
424*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1
425*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
426*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
427*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
428*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
429*495ae853SAndroid Build Coastguard Worker }
430*495ae853SAndroid Build Coastguard Worker
431*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_set_display_frame_ip_t.num_disp_bufs == 0)
432*495ae853SAndroid Build Coastguard Worker {
433*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1
434*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
435*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
436*495ae853SAndroid Build Coastguard Worker IVD_DISP_FRM_ZERO_OP_BUFS;
437*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
438*495ae853SAndroid Build Coastguard Worker }
439*495ae853SAndroid Build Coastguard Worker
440*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ps_ip->s_ivd_set_display_frame_ip_t.num_disp_bufs;
441*495ae853SAndroid Build Coastguard Worker j++)
442*495ae853SAndroid Build Coastguard Worker {
443*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_num_bufs
444*495ae853SAndroid Build Coastguard Worker == 0)
445*495ae853SAndroid Build Coastguard Worker {
446*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1
447*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
448*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
449*495ae853SAndroid Build Coastguard Worker IVD_DISP_FRM_ZERO_OP_BUFS;
450*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
451*495ae853SAndroid Build Coastguard Worker }
452*495ae853SAndroid Build Coastguard Worker
453*495ae853SAndroid Build Coastguard Worker for(i = 0;
454*495ae853SAndroid Build Coastguard Worker i
455*495ae853SAndroid Build Coastguard Worker < ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_num_bufs;
456*495ae853SAndroid Build Coastguard Worker i++)
457*495ae853SAndroid Build Coastguard Worker {
458*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].pu1_bufs[i]
459*495ae853SAndroid Build Coastguard Worker == NULL)
460*495ae853SAndroid Build Coastguard Worker {
461*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1
462*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
463*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
464*495ae853SAndroid Build Coastguard Worker IVD_DISP_FRM_OP_BUF_NULL;
465*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
466*495ae853SAndroid Build Coastguard Worker }
467*495ae853SAndroid Build Coastguard Worker
468*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_min_out_buf_size[i]
469*495ae853SAndroid Build Coastguard Worker == 0)
470*495ae853SAndroid Build Coastguard Worker {
471*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1
472*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
473*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
474*495ae853SAndroid Build Coastguard Worker IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
475*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
476*495ae853SAndroid Build Coastguard Worker }
477*495ae853SAndroid Build Coastguard Worker }
478*495ae853SAndroid Build Coastguard Worker }
479*495ae853SAndroid Build Coastguard Worker }
480*495ae853SAndroid Build Coastguard Worker break;
481*495ae853SAndroid Build Coastguard Worker
482*495ae853SAndroid Build Coastguard Worker case IVD_CMD_VIDEO_DECODE:
483*495ae853SAndroid Build Coastguard Worker {
484*495ae853SAndroid Build Coastguard Worker ih264d_video_decode_ip_t *ps_ip =
485*495ae853SAndroid Build Coastguard Worker (ih264d_video_decode_ip_t *)pv_api_ip;
486*495ae853SAndroid Build Coastguard Worker ih264d_video_decode_op_t *ps_op =
487*495ae853SAndroid Build Coastguard Worker (ih264d_video_decode_op_t *)pv_api_op;
488*495ae853SAndroid Build Coastguard Worker
489*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("The input bytes is: %d",
490*495ae853SAndroid Build Coastguard Worker ps_ip->s_ivd_video_decode_ip_t.u4_num_Bytes);
491*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_error_code = 0;
492*495ae853SAndroid Build Coastguard Worker
493*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_video_decode_ip_t.u4_size != sizeof(ih264d_video_decode_ip_t) &&
494*495ae853SAndroid Build Coastguard Worker ps_ip->s_ivd_video_decode_ip_t.u4_size != sizeof(ivd_video_decode_ip_t) &&
495*495ae853SAndroid Build Coastguard Worker ps_ip->s_ivd_video_decode_ip_t.u4_size !=
496*495ae853SAndroid Build Coastguard Worker offsetof(ivd_video_decode_ip_t, s_out_buffer))
497*495ae853SAndroid Build Coastguard Worker {
498*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1
499*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
500*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_error_code |=
501*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
502*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
503*495ae853SAndroid Build Coastguard Worker }
504*495ae853SAndroid Build Coastguard Worker
505*495ae853SAndroid Build Coastguard Worker if(ps_op->s_ivd_video_decode_op_t.u4_size != sizeof(ih264d_video_decode_op_t) &&
506*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_size != sizeof(ivd_video_decode_op_t) &&
507*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_size !=
508*495ae853SAndroid Build Coastguard Worker offsetof(ivd_video_decode_op_t, u4_output_present))
509*495ae853SAndroid Build Coastguard Worker {
510*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1
511*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
512*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_error_code |=
513*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
514*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
515*495ae853SAndroid Build Coastguard Worker }
516*495ae853SAndroid Build Coastguard Worker
517*495ae853SAndroid Build Coastguard Worker {
518*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)(ps_handle->pv_codec_handle);
519*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_enable_mb_info)
520*495ae853SAndroid Build Coastguard Worker {
521*495ae853SAndroid Build Coastguard Worker if(!ps_ip->pu1_8x8_blk_qp_map && !ps_ip->pu1_8x8_blk_type_map)
522*495ae853SAndroid Build Coastguard Worker {
523*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1
524*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
525*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_video_decode_op_t.u4_error_code |=
526*495ae853SAndroid Build Coastguard Worker IH264D_FRAME_INFO_OP_BUF_NULL;
527*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
528*495ae853SAndroid Build Coastguard Worker }
529*495ae853SAndroid Build Coastguard Worker }
530*495ae853SAndroid Build Coastguard Worker }
531*495ae853SAndroid Build Coastguard Worker }
532*495ae853SAndroid Build Coastguard Worker break;
533*495ae853SAndroid Build Coastguard Worker
534*495ae853SAndroid Build Coastguard Worker case IVD_CMD_DELETE:
535*495ae853SAndroid Build Coastguard Worker {
536*495ae853SAndroid Build Coastguard Worker ih264d_delete_ip_t *ps_ip =
537*495ae853SAndroid Build Coastguard Worker (ih264d_delete_ip_t *)pv_api_ip;
538*495ae853SAndroid Build Coastguard Worker ih264d_delete_op_t *ps_op =
539*495ae853SAndroid Build Coastguard Worker (ih264d_delete_op_t *)pv_api_op;
540*495ae853SAndroid Build Coastguard Worker
541*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_delete_op_t.u4_error_code = 0;
542*495ae853SAndroid Build Coastguard Worker
543*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_delete_ip_t.u4_size
544*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_delete_ip_t))
545*495ae853SAndroid Build Coastguard Worker {
546*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_delete_op_t.u4_error_code |= 1
547*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
548*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_delete_op_t.u4_error_code |=
549*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
550*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
551*495ae853SAndroid Build Coastguard Worker }
552*495ae853SAndroid Build Coastguard Worker
553*495ae853SAndroid Build Coastguard Worker if(ps_op->s_ivd_delete_op_t.u4_size
554*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_delete_op_t))
555*495ae853SAndroid Build Coastguard Worker {
556*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_delete_op_t.u4_error_code |= 1
557*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
558*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_delete_op_t.u4_error_code |=
559*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
560*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
561*495ae853SAndroid Build Coastguard Worker }
562*495ae853SAndroid Build Coastguard Worker
563*495ae853SAndroid Build Coastguard Worker }
564*495ae853SAndroid Build Coastguard Worker break;
565*495ae853SAndroid Build Coastguard Worker
566*495ae853SAndroid Build Coastguard Worker case IVD_CMD_VIDEO_CTL:
567*495ae853SAndroid Build Coastguard Worker {
568*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_ptr_cmd;
569*495ae853SAndroid Build Coastguard Worker UWORD32 sub_command;
570*495ae853SAndroid Build Coastguard Worker
571*495ae853SAndroid Build Coastguard Worker pu4_ptr_cmd = (UWORD32 *)pv_api_ip;
572*495ae853SAndroid Build Coastguard Worker pu4_ptr_cmd += 2;
573*495ae853SAndroid Build Coastguard Worker sub_command = *pu4_ptr_cmd;
574*495ae853SAndroid Build Coastguard Worker
575*495ae853SAndroid Build Coastguard Worker switch(sub_command)
576*495ae853SAndroid Build Coastguard Worker {
577*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_SETPARAMS:
578*495ae853SAndroid Build Coastguard Worker {
579*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_config_ip_t *ps_ip;
580*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_config_op_t *ps_op;
581*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_set_config_ip_t *)pv_api_ip;
582*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_set_config_op_t *)pv_api_op;
583*495ae853SAndroid Build Coastguard Worker
584*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_ctl_set_config_ip_t.u4_size
585*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_set_config_ip_t))
586*495ae853SAndroid Build Coastguard Worker {
587*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= 1
588*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
589*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |=
590*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
591*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
592*495ae853SAndroid Build Coastguard Worker }
593*495ae853SAndroid Build Coastguard Worker }
594*495ae853SAndroid Build Coastguard Worker //no break; is needed here
595*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_SETDEFAULT:
596*495ae853SAndroid Build Coastguard Worker {
597*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_config_op_t *ps_op;
598*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_set_config_op_t *)pv_api_op;
599*495ae853SAndroid Build Coastguard Worker if(ps_op->s_ivd_ctl_set_config_op_t.u4_size
600*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_set_config_op_t))
601*495ae853SAndroid Build Coastguard Worker {
602*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= 1
603*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
604*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |=
605*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
606*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
607*495ae853SAndroid Build Coastguard Worker }
608*495ae853SAndroid Build Coastguard Worker }
609*495ae853SAndroid Build Coastguard Worker break;
610*495ae853SAndroid Build Coastguard Worker
611*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_GETPARAMS:
612*495ae853SAndroid Build Coastguard Worker {
613*495ae853SAndroid Build Coastguard Worker ih264d_ctl_getstatus_ip_t *ps_ip;
614*495ae853SAndroid Build Coastguard Worker ih264d_ctl_getstatus_op_t *ps_op;
615*495ae853SAndroid Build Coastguard Worker
616*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_getstatus_ip_t *)pv_api_ip;
617*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_getstatus_op_t *)pv_api_op;
618*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_ctl_getstatus_ip_t.u4_size
619*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_getstatus_ip_t))
620*495ae853SAndroid Build Coastguard Worker {
621*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= 1
622*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
623*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |=
624*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
625*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
626*495ae853SAndroid Build Coastguard Worker }
627*495ae853SAndroid Build Coastguard Worker if(ps_op->s_ivd_ctl_getstatus_op_t.u4_size
628*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_getstatus_op_t))
629*495ae853SAndroid Build Coastguard Worker {
630*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= 1
631*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
632*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |=
633*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
634*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
635*495ae853SAndroid Build Coastguard Worker }
636*495ae853SAndroid Build Coastguard Worker }
637*495ae853SAndroid Build Coastguard Worker break;
638*495ae853SAndroid Build Coastguard Worker
639*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_GETBUFINFO:
640*495ae853SAndroid Build Coastguard Worker {
641*495ae853SAndroid Build Coastguard Worker ih264d_ctl_getbufinfo_ip_t *ps_ip;
642*495ae853SAndroid Build Coastguard Worker ih264d_ctl_getbufinfo_op_t *ps_op;
643*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_getbufinfo_ip_t *)pv_api_ip;
644*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_getbufinfo_op_t *)pv_api_op;
645*495ae853SAndroid Build Coastguard Worker
646*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_ctl_getbufinfo_ip_t.u4_size
647*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_getbufinfo_ip_t))
648*495ae853SAndroid Build Coastguard Worker {
649*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= 1
650*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
651*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |=
652*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
653*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
654*495ae853SAndroid Build Coastguard Worker }
655*495ae853SAndroid Build Coastguard Worker if(ps_op->s_ivd_ctl_getbufinfo_op_t.u4_size
656*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_getbufinfo_op_t))
657*495ae853SAndroid Build Coastguard Worker {
658*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= 1
659*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
660*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |=
661*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
662*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
663*495ae853SAndroid Build Coastguard Worker }
664*495ae853SAndroid Build Coastguard Worker }
665*495ae853SAndroid Build Coastguard Worker break;
666*495ae853SAndroid Build Coastguard Worker
667*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_GETVERSION:
668*495ae853SAndroid Build Coastguard Worker {
669*495ae853SAndroid Build Coastguard Worker ih264d_ctl_getversioninfo_ip_t *ps_ip;
670*495ae853SAndroid Build Coastguard Worker ih264d_ctl_getversioninfo_op_t *ps_op;
671*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_getversioninfo_ip_t *)pv_api_ip;
672*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_getversioninfo_op_t *)pv_api_op;
673*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_ctl_getversioninfo_ip_t.u4_size
674*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_getversioninfo_ip_t))
675*495ae853SAndroid Build Coastguard Worker {
676*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |= 1
677*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
678*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |=
679*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
680*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
681*495ae853SAndroid Build Coastguard Worker }
682*495ae853SAndroid Build Coastguard Worker if(ps_op->s_ivd_ctl_getversioninfo_op_t.u4_size
683*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_getversioninfo_op_t))
684*495ae853SAndroid Build Coastguard Worker {
685*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |= 1
686*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
687*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |=
688*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
689*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
690*495ae853SAndroid Build Coastguard Worker }
691*495ae853SAndroid Build Coastguard Worker }
692*495ae853SAndroid Build Coastguard Worker break;
693*495ae853SAndroid Build Coastguard Worker
694*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_FLUSH:
695*495ae853SAndroid Build Coastguard Worker {
696*495ae853SAndroid Build Coastguard Worker ih264d_ctl_flush_ip_t *ps_ip;
697*495ae853SAndroid Build Coastguard Worker ih264d_ctl_flush_op_t *ps_op;
698*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_flush_ip_t *)pv_api_ip;
699*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_flush_op_t *)pv_api_op;
700*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_ctl_flush_ip_t.u4_size
701*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_flush_ip_t))
702*495ae853SAndroid Build Coastguard Worker {
703*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= 1
704*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
705*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_flush_op_t.u4_error_code |=
706*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
707*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
708*495ae853SAndroid Build Coastguard Worker }
709*495ae853SAndroid Build Coastguard Worker if(ps_op->s_ivd_ctl_flush_op_t.u4_size
710*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_flush_op_t))
711*495ae853SAndroid Build Coastguard Worker {
712*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= 1
713*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
714*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_flush_op_t.u4_error_code |=
715*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
716*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
717*495ae853SAndroid Build Coastguard Worker }
718*495ae853SAndroid Build Coastguard Worker }
719*495ae853SAndroid Build Coastguard Worker break;
720*495ae853SAndroid Build Coastguard Worker
721*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_RESET:
722*495ae853SAndroid Build Coastguard Worker {
723*495ae853SAndroid Build Coastguard Worker ih264d_ctl_reset_ip_t *ps_ip;
724*495ae853SAndroid Build Coastguard Worker ih264d_ctl_reset_op_t *ps_op;
725*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_reset_ip_t *)pv_api_ip;
726*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_reset_op_t *)pv_api_op;
727*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_ctl_reset_ip_t.u4_size
728*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_reset_ip_t))
729*495ae853SAndroid Build Coastguard Worker {
730*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= 1
731*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
732*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_reset_op_t.u4_error_code |=
733*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
734*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
735*495ae853SAndroid Build Coastguard Worker }
736*495ae853SAndroid Build Coastguard Worker if(ps_op->s_ivd_ctl_reset_op_t.u4_size
737*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_reset_op_t))
738*495ae853SAndroid Build Coastguard Worker {
739*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= 1
740*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM;
741*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_ctl_reset_op_t.u4_error_code |=
742*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
743*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
744*495ae853SAndroid Build Coastguard Worker }
745*495ae853SAndroid Build Coastguard Worker }
746*495ae853SAndroid Build Coastguard Worker break;
747*495ae853SAndroid Build Coastguard Worker
748*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_DEGRADE:
749*495ae853SAndroid Build Coastguard Worker {
750*495ae853SAndroid Build Coastguard Worker ih264d_ctl_degrade_ip_t *ps_ip;
751*495ae853SAndroid Build Coastguard Worker ih264d_ctl_degrade_op_t *ps_op;
752*495ae853SAndroid Build Coastguard Worker
753*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_degrade_ip_t *)pv_api_ip;
754*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_degrade_op_t *)pv_api_op;
755*495ae853SAndroid Build Coastguard Worker
756*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_degrade_ip_t))
757*495ae853SAndroid Build Coastguard Worker {
758*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
759*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
760*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
761*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
762*495ae853SAndroid Build Coastguard Worker }
763*495ae853SAndroid Build Coastguard Worker
764*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size != sizeof(ih264d_ctl_degrade_op_t))
765*495ae853SAndroid Build Coastguard Worker {
766*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
767*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
768*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
769*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
770*495ae853SAndroid Build Coastguard Worker }
771*495ae853SAndroid Build Coastguard Worker
772*495ae853SAndroid Build Coastguard Worker if((ps_ip->i4_degrade_pics < 0)
773*495ae853SAndroid Build Coastguard Worker || (ps_ip->i4_degrade_pics > 4)
774*495ae853SAndroid Build Coastguard Worker || (ps_ip->i4_nondegrade_interval < 0)
775*495ae853SAndroid Build Coastguard Worker || (ps_ip->i4_degrade_type < 0)
776*495ae853SAndroid Build Coastguard Worker || (ps_ip->i4_degrade_type > 15))
777*495ae853SAndroid Build Coastguard Worker {
778*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
779*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
780*495ae853SAndroid Build Coastguard Worker }
781*495ae853SAndroid Build Coastguard Worker
782*495ae853SAndroid Build Coastguard Worker break;
783*495ae853SAndroid Build Coastguard Worker }
784*495ae853SAndroid Build Coastguard Worker
785*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_BUFFER_DIMENSIONS:
786*495ae853SAndroid Build Coastguard Worker {
787*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_frame_dimensions_ip_t *ps_ip;
788*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_frame_dimensions_op_t *ps_op;
789*495ae853SAndroid Build Coastguard Worker
790*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_frame_dimensions_ip_t *)pv_api_ip;
791*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_frame_dimensions_op_t *)pv_api_op;
792*495ae853SAndroid Build Coastguard Worker
793*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size
794*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_get_frame_dimensions_ip_t))
795*495ae853SAndroid Build Coastguard Worker {
796*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
797*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
798*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
799*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
800*495ae853SAndroid Build Coastguard Worker }
801*495ae853SAndroid Build Coastguard Worker
802*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size
803*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_get_frame_dimensions_op_t))
804*495ae853SAndroid Build Coastguard Worker {
805*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
806*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
807*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
808*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
809*495ae853SAndroid Build Coastguard Worker }
810*495ae853SAndroid Build Coastguard Worker
811*495ae853SAndroid Build Coastguard Worker break;
812*495ae853SAndroid Build Coastguard Worker }
813*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_VUI_PARAMS:
814*495ae853SAndroid Build Coastguard Worker {
815*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_vui_params_ip_t *ps_ip;
816*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_vui_params_op_t *ps_op;
817*495ae853SAndroid Build Coastguard Worker
818*495ae853SAndroid Build Coastguard Worker ps_ip =
819*495ae853SAndroid Build Coastguard Worker (ih264d_ctl_get_vui_params_ip_t *)pv_api_ip;
820*495ae853SAndroid Build Coastguard Worker ps_op =
821*495ae853SAndroid Build Coastguard Worker (ih264d_ctl_get_vui_params_op_t *)pv_api_op;
822*495ae853SAndroid Build Coastguard Worker
823*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size
824*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_get_vui_params_ip_t))
825*495ae853SAndroid Build Coastguard Worker {
826*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
827*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
828*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
829*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
830*495ae853SAndroid Build Coastguard Worker }
831*495ae853SAndroid Build Coastguard Worker
832*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size
833*495ae853SAndroid Build Coastguard Worker != sizeof(ih264d_ctl_get_vui_params_op_t))
834*495ae853SAndroid Build Coastguard Worker {
835*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
836*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
837*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
838*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
839*495ae853SAndroid Build Coastguard Worker }
840*495ae853SAndroid Build Coastguard Worker
841*495ae853SAndroid Build Coastguard Worker break;
842*495ae853SAndroid Build Coastguard Worker }
843*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS:
844*495ae853SAndroid Build Coastguard Worker {
845*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_mdcv_params_ip_t *ps_ip;
846*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_mdcv_params_op_t *ps_op;
847*495ae853SAndroid Build Coastguard Worker
848*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_mdcv_params_ip_t *)pv_api_ip;
849*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_mdcv_params_op_t *)pv_api_op;
850*495ae853SAndroid Build Coastguard Worker
851*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_get_sei_mdcv_params_ip_t))
852*495ae853SAndroid Build Coastguard Worker {
853*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
854*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
855*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
856*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
857*495ae853SAndroid Build Coastguard Worker }
858*495ae853SAndroid Build Coastguard Worker
859*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size != sizeof(ih264d_ctl_get_sei_mdcv_params_op_t))
860*495ae853SAndroid Build Coastguard Worker {
861*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
862*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
863*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
864*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
865*495ae853SAndroid Build Coastguard Worker }
866*495ae853SAndroid Build Coastguard Worker
867*495ae853SAndroid Build Coastguard Worker break;
868*495ae853SAndroid Build Coastguard Worker }
869*495ae853SAndroid Build Coastguard Worker
870*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_CLL_PARAMS:
871*495ae853SAndroid Build Coastguard Worker {
872*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_cll_params_ip_t *ps_ip;
873*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_cll_params_op_t *ps_op;
874*495ae853SAndroid Build Coastguard Worker
875*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_cll_params_ip_t *)pv_api_ip;
876*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_cll_params_op_t *)pv_api_op;
877*495ae853SAndroid Build Coastguard Worker
878*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_get_sei_cll_params_ip_t))
879*495ae853SAndroid Build Coastguard Worker {
880*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
881*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
882*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
883*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
884*495ae853SAndroid Build Coastguard Worker }
885*495ae853SAndroid Build Coastguard Worker
886*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size != sizeof(ih264d_ctl_get_sei_cll_params_op_t))
887*495ae853SAndroid Build Coastguard Worker {
888*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
889*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
890*495ae853SAndroid Build Coastguard Worker IVD_OP_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 break;
895*495ae853SAndroid Build Coastguard Worker }
896*495ae853SAndroid Build Coastguard Worker
897*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_AVE_PARAMS:
898*495ae853SAndroid Build Coastguard Worker {
899*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_ave_params_ip_t *ps_ip;
900*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_ave_params_op_t *ps_op;
901*495ae853SAndroid Build Coastguard Worker
902*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_ave_params_ip_t *)pv_api_ip;
903*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_ave_params_op_t *)pv_api_op;
904*495ae853SAndroid Build Coastguard Worker
905*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_get_sei_ave_params_ip_t))
906*495ae853SAndroid Build Coastguard Worker {
907*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
908*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
909*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
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_op->u4_size != sizeof(ih264d_ctl_get_sei_ave_params_op_t))
914*495ae853SAndroid Build Coastguard Worker {
915*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
916*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
917*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
918*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
919*495ae853SAndroid Build Coastguard Worker }
920*495ae853SAndroid Build Coastguard Worker
921*495ae853SAndroid Build Coastguard Worker break;
922*495ae853SAndroid Build Coastguard Worker }
923*495ae853SAndroid Build Coastguard Worker
924*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_CCV_PARAMS:
925*495ae853SAndroid Build Coastguard Worker {
926*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_ccv_params_ip_t *ps_ip;
927*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_ccv_params_op_t *ps_op;
928*495ae853SAndroid Build Coastguard Worker
929*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_ccv_params_ip_t *)pv_api_ip;
930*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_ccv_params_op_t *)pv_api_op;
931*495ae853SAndroid Build Coastguard Worker
932*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_get_sei_ccv_params_ip_t))
933*495ae853SAndroid Build Coastguard Worker {
934*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
935*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
936*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
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_op->u4_size != sizeof(ih264d_ctl_get_sei_ccv_params_op_t))
941*495ae853SAndroid Build Coastguard Worker {
942*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
943*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
944*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
945*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
946*495ae853SAndroid Build Coastguard Worker }
947*495ae853SAndroid Build Coastguard Worker
948*495ae853SAndroid Build Coastguard Worker break;
949*495ae853SAndroid Build Coastguard Worker }
950*495ae853SAndroid Build Coastguard Worker
951*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_SII_PARAMS:
952*495ae853SAndroid Build Coastguard Worker {
953*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_sii_params_ip_t *ps_ip;
954*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_sii_params_op_t *ps_op;
955*495ae853SAndroid Build Coastguard Worker
956*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_sii_params_ip_t *) pv_api_ip;
957*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_sii_params_op_t *) pv_api_op;
958*495ae853SAndroid Build Coastguard Worker
959*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_get_sei_sii_params_ip_t))
960*495ae853SAndroid Build Coastguard Worker {
961*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
962*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
963*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
964*495ae853SAndroid Build Coastguard Worker }
965*495ae853SAndroid Build Coastguard Worker
966*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size != sizeof(ih264d_ctl_get_sei_sii_params_op_t))
967*495ae853SAndroid Build Coastguard Worker {
968*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
969*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
970*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
971*495ae853SAndroid Build Coastguard Worker }
972*495ae853SAndroid Build Coastguard Worker
973*495ae853SAndroid Build Coastguard Worker break;
974*495ae853SAndroid Build Coastguard Worker }
975*495ae853SAndroid Build Coastguard Worker
976*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_FGC_PARAMS:
977*495ae853SAndroid Build Coastguard Worker {
978*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_fgc_params_ip_t *ps_ip;
979*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_fgc_params_op_t *ps_op;
980*495ae853SAndroid Build Coastguard Worker
981*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_fgc_params_ip_t *) pv_api_ip;
982*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_fgc_params_op_t *) pv_api_op;
983*495ae853SAndroid Build Coastguard Worker
984*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_get_sei_fgc_params_ip_t))
985*495ae853SAndroid Build Coastguard Worker {
986*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
987*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
988*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
989*495ae853SAndroid Build Coastguard Worker }
990*495ae853SAndroid Build Coastguard Worker
991*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size != sizeof(ih264d_ctl_get_sei_fgc_params_op_t))
992*495ae853SAndroid Build Coastguard Worker {
993*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
994*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
995*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
996*495ae853SAndroid Build Coastguard Worker }
997*495ae853SAndroid Build Coastguard Worker
998*495ae853SAndroid Build Coastguard Worker break;
999*495ae853SAndroid Build Coastguard Worker }
1000*495ae853SAndroid Build Coastguard Worker
1001*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_SET_NUM_CORES:
1002*495ae853SAndroid Build Coastguard Worker {
1003*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_num_cores_ip_t *ps_ip;
1004*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_num_cores_op_t *ps_op;
1005*495ae853SAndroid Build Coastguard Worker
1006*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_set_num_cores_ip_t *)pv_api_ip;
1007*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_set_num_cores_op_t *)pv_api_op;
1008*495ae853SAndroid Build Coastguard Worker
1009*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_set_num_cores_ip_t))
1010*495ae853SAndroid Build Coastguard Worker {
1011*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
1012*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
1013*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
1014*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
1015*495ae853SAndroid Build Coastguard Worker }
1016*495ae853SAndroid Build Coastguard Worker
1017*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size != sizeof(ih264d_ctl_set_num_cores_op_t))
1018*495ae853SAndroid Build Coastguard Worker {
1019*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
1020*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
1021*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
1022*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
1023*495ae853SAndroid Build Coastguard Worker }
1024*495ae853SAndroid Build Coastguard Worker
1025*495ae853SAndroid Build Coastguard Worker if((ps_ip->u4_num_cores != 1) && (ps_ip->u4_num_cores != 2)
1026*495ae853SAndroid Build Coastguard Worker && (ps_ip->u4_num_cores != 3)
1027*495ae853SAndroid Build Coastguard Worker && (ps_ip->u4_num_cores != 4))
1028*495ae853SAndroid Build Coastguard Worker {
1029*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
1030*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
1031*495ae853SAndroid Build Coastguard Worker }
1032*495ae853SAndroid Build Coastguard Worker break;
1033*495ae853SAndroid Build Coastguard Worker }
1034*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_SET_PROCESSOR:
1035*495ae853SAndroid Build Coastguard Worker {
1036*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_processor_ip_t *ps_ip;
1037*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_processor_op_t *ps_op;
1038*495ae853SAndroid Build Coastguard Worker
1039*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_set_processor_ip_t *)pv_api_ip;
1040*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_set_processor_op_t *)pv_api_op;
1041*495ae853SAndroid Build Coastguard Worker
1042*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_size != sizeof(ih264d_ctl_set_processor_ip_t))
1043*495ae853SAndroid Build Coastguard Worker {
1044*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
1045*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
1046*495ae853SAndroid Build Coastguard Worker IVD_IP_API_STRUCT_SIZE_INCORRECT;
1047*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
1048*495ae853SAndroid Build Coastguard Worker }
1049*495ae853SAndroid Build Coastguard Worker
1050*495ae853SAndroid Build Coastguard Worker if(ps_op->u4_size != sizeof(ih264d_ctl_set_processor_op_t))
1051*495ae853SAndroid Build Coastguard Worker {
1052*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
1053*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code |=
1054*495ae853SAndroid Build Coastguard Worker IVD_OP_API_STRUCT_SIZE_INCORRECT;
1055*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
1056*495ae853SAndroid Build Coastguard Worker }
1057*495ae853SAndroid Build Coastguard Worker
1058*495ae853SAndroid Build Coastguard Worker break;
1059*495ae853SAndroid Build Coastguard Worker }
1060*495ae853SAndroid Build Coastguard Worker default:
1061*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
1062*495ae853SAndroid Build Coastguard Worker *(pu4_api_op + 1) |= IVD_UNSUPPORTED_API_CMD;
1063*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
1064*495ae853SAndroid Build Coastguard Worker break;
1065*495ae853SAndroid Build Coastguard Worker }
1066*495ae853SAndroid Build Coastguard Worker }
1067*495ae853SAndroid Build Coastguard Worker break;
1068*495ae853SAndroid Build Coastguard Worker }
1069*495ae853SAndroid Build Coastguard Worker
1070*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
1071*495ae853SAndroid Build Coastguard Worker }
1072*495ae853SAndroid Build Coastguard Worker
1073*495ae853SAndroid Build Coastguard Worker
1074*495ae853SAndroid Build Coastguard Worker /**
1075*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1076*495ae853SAndroid Build Coastguard Worker *
1077*495ae853SAndroid Build Coastguard Worker * @brief
1078*495ae853SAndroid Build Coastguard Worker * Sets Processor type
1079*495ae853SAndroid Build Coastguard Worker *
1080*495ae853SAndroid Build Coastguard Worker * @par Description:
1081*495ae853SAndroid Build Coastguard Worker * Sets Processor type
1082*495ae853SAndroid Build Coastguard Worker *
1083*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec_obj
1084*495ae853SAndroid Build Coastguard Worker * Pointer to codec object at API level
1085*495ae853SAndroid Build Coastguard Worker *
1086*495ae853SAndroid Build Coastguard Worker * @param[in] pv_api_ip
1087*495ae853SAndroid Build Coastguard Worker * Pointer to input argument structure
1088*495ae853SAndroid Build Coastguard Worker *
1089*495ae853SAndroid Build Coastguard Worker * @param[out] pv_api_op
1090*495ae853SAndroid Build Coastguard Worker * Pointer to output argument structure
1091*495ae853SAndroid Build Coastguard Worker *
1092*495ae853SAndroid Build Coastguard Worker * @returns Status
1093*495ae853SAndroid Build Coastguard Worker *
1094*495ae853SAndroid Build Coastguard Worker * @remarks
1095*495ae853SAndroid Build Coastguard Worker *
1096*495ae853SAndroid Build Coastguard Worker *
1097*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1098*495ae853SAndroid Build Coastguard Worker */
1099*495ae853SAndroid Build Coastguard Worker
ih264d_set_processor(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)1100*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_processor(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
1101*495ae853SAndroid Build Coastguard Worker {
1102*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_processor_ip_t *ps_ip;
1103*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_processor_op_t *ps_op;
1104*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_codec = (dec_struct_t *)dec_hdl->pv_codec_handle;
1105*495ae853SAndroid Build Coastguard Worker
1106*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_set_processor_ip_t *)pv_api_ip;
1107*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_set_processor_op_t *)pv_api_op;
1108*495ae853SAndroid Build Coastguard Worker
1109*495ae853SAndroid Build Coastguard Worker ps_codec->e_processor_arch = (IVD_ARCH_T)ps_ip->u4_arch;
1110*495ae853SAndroid Build Coastguard Worker ps_codec->e_processor_soc = (IVD_SOC_T)ps_ip->u4_soc;
1111*495ae853SAndroid Build Coastguard Worker
1112*495ae853SAndroid Build Coastguard Worker ih264d_init_function_ptr(ps_codec);
1113*495ae853SAndroid Build Coastguard Worker
1114*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = 0;
1115*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
1116*495ae853SAndroid Build Coastguard Worker }
1117*495ae853SAndroid Build Coastguard Worker
1118*495ae853SAndroid Build Coastguard Worker
1119*495ae853SAndroid Build Coastguard Worker /**************************************************************************
1120*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_init_decoder \endif
1121*495ae853SAndroid Build Coastguard Worker *
1122*495ae853SAndroid Build Coastguard Worker *
1123*495ae853SAndroid Build Coastguard Worker * \brief
1124*495ae853SAndroid Build Coastguard Worker * Initializes the decoder
1125*495ae853SAndroid Build Coastguard Worker *
1126*495ae853SAndroid Build Coastguard Worker * \param apiVersion : Version of the api being used.
1127*495ae853SAndroid Build Coastguard Worker * \param errorHandlingMechanism : Mechanism to be used for errror handling.
1128*495ae853SAndroid Build Coastguard Worker * \param postFilteringType: Type of post filtering operation to be used.
1129*495ae853SAndroid Build Coastguard Worker * \param uc_outputFormat: Format of the decoded picture [default 4:2:0].
1130*495ae853SAndroid Build Coastguard Worker * \param uc_dispBufs: Number of Display Buffers.
1131*495ae853SAndroid Build Coastguard Worker * \param p_NALBufAPI: Pointer to NAL Buffer API.
1132*495ae853SAndroid Build Coastguard Worker * \param p_DispBufAPI: Pointer to Display Buffer API.
1133*495ae853SAndroid Build Coastguard Worker * \param ih264d_dec_mem_manager :Pointer to the function that will be called by decoder
1134*495ae853SAndroid Build Coastguard Worker * for memory allocation and freeing.
1135*495ae853SAndroid Build Coastguard Worker *
1136*495ae853SAndroid Build Coastguard Worker * \return
1137*495ae853SAndroid Build Coastguard Worker * 0 on Success and -1 on error
1138*495ae853SAndroid Build Coastguard Worker *
1139*495ae853SAndroid Build Coastguard Worker **************************************************************************
1140*495ae853SAndroid Build Coastguard Worker */
ih264d_init_decoder(void * ps_dec_params)1141*495ae853SAndroid Build Coastguard Worker void ih264d_init_decoder(void * ps_dec_params)
1142*495ae853SAndroid Build Coastguard Worker {
1143*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec = (dec_struct_t *)ps_dec_params;
1144*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_cur_slice;
1145*495ae853SAndroid Build Coastguard Worker pocstruct_t *ps_prev_poc, *ps_cur_poc;
1146*495ae853SAndroid Build Coastguard Worker WORD32 size;
1147*495ae853SAndroid Build Coastguard Worker
1148*495ae853SAndroid Build Coastguard Worker size = sizeof(pred_info_t) * 2 * 32;
1149*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_pred, 0 , size);
1150*495ae853SAndroid Build Coastguard Worker
1151*495ae853SAndroid Build Coastguard Worker size = sizeof(disp_mgr_t);
1152*495ae853SAndroid Build Coastguard Worker memset(ps_dec->pv_disp_buf_mgr, 0 , size);
1153*495ae853SAndroid Build Coastguard Worker
1154*495ae853SAndroid Build Coastguard Worker size = sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
1155*495ae853SAndroid Build Coastguard Worker memset(ps_dec->pv_pic_buf_mgr, 0, size);
1156*495ae853SAndroid Build Coastguard Worker
1157*495ae853SAndroid Build Coastguard Worker size = sizeof(dec_err_status_t);
1158*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_dec_err_status, 0, size);
1159*495ae853SAndroid Build Coastguard Worker
1160*495ae853SAndroid Build Coastguard Worker size = sizeof(sei);
1161*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_sei, 0, size);
1162*495ae853SAndroid Build Coastguard Worker
1163*495ae853SAndroid Build Coastguard Worker size = sizeof(sei);
1164*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_sei_parse, 0, size);
1165*495ae853SAndroid Build Coastguard Worker
1166*495ae853SAndroid Build Coastguard Worker size = sizeof(dpb_commands_t);
1167*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_dpb_cmds, 0, size);
1168*495ae853SAndroid Build Coastguard Worker
1169*495ae853SAndroid Build Coastguard Worker size = sizeof(dec_bit_stream_t);
1170*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_bitstrm, 0, size);
1171*495ae853SAndroid Build Coastguard Worker
1172*495ae853SAndroid Build Coastguard Worker size = sizeof(dec_slice_params_t);
1173*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_cur_slice, 0, size);
1174*495ae853SAndroid Build Coastguard Worker
1175*495ae853SAndroid Build Coastguard Worker size = MAX(sizeof(dec_seq_params_t), sizeof(dec_pic_params_t));
1176*495ae853SAndroid Build Coastguard Worker memset(ps_dec->pv_scratch_sps_pps, 0, size);
1177*495ae853SAndroid Build Coastguard Worker
1178*495ae853SAndroid Build Coastguard Worker size = sizeof(ctxt_inc_mb_info_t);
1179*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_left_mb_ctxt_info, 0, size);
1180*495ae853SAndroid Build Coastguard Worker
1181*495ae853SAndroid Build Coastguard Worker size = (sizeof(neighbouradd_t) << 2);
1182*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_left_mvpred_addr, 0 ,size);
1183*495ae853SAndroid Build Coastguard Worker
1184*495ae853SAndroid Build Coastguard Worker size = sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
1185*495ae853SAndroid Build Coastguard Worker memset(ps_dec->pv_mv_buf_mgr, 0, size);
1186*495ae853SAndroid Build Coastguard Worker
1187*495ae853SAndroid Build Coastguard Worker /* Free any dynamic buffers that are allocated */
1188*495ae853SAndroid Build Coastguard Worker ih264d_free_dynamic_bufs(ps_dec);
1189*495ae853SAndroid Build Coastguard Worker
1190*495ae853SAndroid Build Coastguard Worker {
1191*495ae853SAndroid Build Coastguard Worker UWORD8 i;
1192*495ae853SAndroid Build Coastguard Worker struct pic_buffer_t *ps_init_dpb;
1193*495ae853SAndroid Build Coastguard Worker ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[0][0];
1194*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 2 * MAX_REF_BUFS; i++)
1195*495ae853SAndroid Build Coastguard Worker {
1196*495ae853SAndroid Build Coastguard Worker ps_init_dpb->pu1_buf1 = NULL;
1197*495ae853SAndroid Build Coastguard Worker ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
1198*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->ps_init_dpb[0][i] = ps_init_dpb;
1199*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->ps_mod_dpb[0][i] = ps_init_dpb;
1200*495ae853SAndroid Build Coastguard Worker ps_init_dpb++;
1201*495ae853SAndroid Build Coastguard Worker }
1202*495ae853SAndroid Build Coastguard Worker
1203*495ae853SAndroid Build Coastguard Worker ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[1][0];
1204*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 2 * MAX_REF_BUFS; i++)
1205*495ae853SAndroid Build Coastguard Worker {
1206*495ae853SAndroid Build Coastguard Worker ps_init_dpb->pu1_buf1 = NULL;
1207*495ae853SAndroid Build Coastguard Worker ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
1208*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->ps_init_dpb[1][i] = ps_init_dpb;
1209*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->ps_mod_dpb[1][i] = ps_init_dpb;
1210*495ae853SAndroid Build Coastguard Worker ps_init_dpb++;
1211*495ae853SAndroid Build Coastguard Worker }
1212*495ae853SAndroid Build Coastguard Worker }
1213*495ae853SAndroid Build Coastguard Worker
1214*495ae853SAndroid Build Coastguard Worker ps_cur_slice = ps_dec->ps_cur_slice;
1215*495ae853SAndroid Build Coastguard Worker ps_dec->init_done = 0;
1216*495ae853SAndroid Build Coastguard Worker
1217*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_cores = 1;
1218*495ae853SAndroid Build Coastguard Worker
1219*495ae853SAndroid Build Coastguard Worker ps_dec->u2_pic_ht = ps_dec->u2_pic_wd = 0;
1220*495ae853SAndroid Build Coastguard Worker
1221*495ae853SAndroid Build Coastguard Worker ps_dec->u1_separate_parse = DEFAULT_SEPARATE_PARSE;
1222*495ae853SAndroid Build Coastguard Worker ps_dec->u4_app_disable_deblk_frm = 0;
1223*495ae853SAndroid Build Coastguard Worker ps_dec->i4_degrade_type = 0;
1224*495ae853SAndroid Build Coastguard Worker ps_dec->i4_degrade_pics = 0;
1225*495ae853SAndroid Build Coastguard Worker
1226*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_pps, 0,
1227*495ae853SAndroid Build Coastguard Worker ((sizeof(dec_pic_params_t)) * MAX_NUM_PIC_PARAMS));
1228*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_sps, 0,
1229*495ae853SAndroid Build Coastguard Worker ((sizeof(dec_seq_params_t)) * MAX_NUM_SEQ_PARAMS));
1230*495ae853SAndroid Build Coastguard Worker
1231*495ae853SAndroid Build Coastguard Worker /* Initialization of function pointers ih264d_deblock_picture function*/
1232*495ae853SAndroid Build Coastguard Worker
1233*495ae853SAndroid Build Coastguard Worker ps_dec->p_DeblockPicture[0] = ih264d_deblock_picture_non_mbaff;
1234*495ae853SAndroid Build Coastguard Worker ps_dec->p_DeblockPicture[1] = ih264d_deblock_picture_mbaff;
1235*495ae853SAndroid Build Coastguard Worker
1236*495ae853SAndroid Build Coastguard Worker ps_dec->s_cab_dec_env.pv_codec_handle = ps_dec;
1237*495ae853SAndroid Build Coastguard Worker
1238*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_fld_in_frm = 0;
1239*495ae853SAndroid Build Coastguard Worker
1240*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->pv_codec_handle = ps_dec;
1241*495ae853SAndroid Build Coastguard Worker
1242*495ae853SAndroid Build Coastguard Worker /* Initialize the sei validity u4_flag with zero indiacting sei is not valid*/
1243*495ae853SAndroid Build Coastguard Worker ps_dec->ps_sei->u1_is_valid = 0;
1244*495ae853SAndroid Build Coastguard Worker
1245*495ae853SAndroid Build Coastguard Worker /* decParams Initializations */
1246*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps = NULL;
1247*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps = NULL;
1248*495ae853SAndroid Build Coastguard Worker ps_dec->u1_init_dec_flag = 0;
1249*495ae853SAndroid Build Coastguard Worker ps_dec->u1_first_slice_in_stream = 1;
1250*495ae853SAndroid Build Coastguard Worker ps_dec->u1_last_pic_not_decoded = 0;
1251*495ae853SAndroid Build Coastguard Worker ps_dec->u4_app_disp_width = 0;
1252*495ae853SAndroid Build Coastguard Worker ps_dec->i4_header_decoded = 0;
1253*495ae853SAndroid Build Coastguard Worker ps_dec->u4_total_frames_decoded = 0;
1254*495ae853SAndroid Build Coastguard Worker
1255*495ae853SAndroid Build Coastguard Worker ps_dec->i4_error_code = 0;
1256*495ae853SAndroid Build Coastguard Worker ps_dec->i4_content_type = IV_CONTENTTYPE_NA;
1257*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->u1_mbaff_frame_flag = 0;
1258*495ae853SAndroid Build Coastguard Worker
1259*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dec_err_status->u1_err_flag = ACCEPT_ALL_PICS; //REJECT_PB_PICS;
1260*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dec_err_status->u1_cur_pic_type = PIC_TYPE_UNKNOWN;
1261*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dec_err_status->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
1262*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dec_err_status->u4_cur_frm = INIT_FRAME;
1263*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
1264*495ae853SAndroid Build Coastguard Worker
1265*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pr_sl_type = 0xFF;
1266*495ae853SAndroid Build Coastguard Worker ps_dec->u2_mbx = 0xffff;
1267*495ae853SAndroid Build Coastguard Worker ps_dec->u2_mby = 0;
1268*495ae853SAndroid Build Coastguard Worker ps_dec->u2_total_mbs_coded = 0;
1269*495ae853SAndroid Build Coastguard Worker
1270*495ae853SAndroid Build Coastguard Worker /* POC initializations */
1271*495ae853SAndroid Build Coastguard Worker ps_prev_poc = &ps_dec->s_prev_pic_poc;
1272*495ae853SAndroid Build Coastguard Worker ps_cur_poc = &ps_dec->s_cur_pic_poc;
1273*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb = 0;
1274*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb = 0;
1275*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_delta_pic_order_cnt_bottom =
1276*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt_bottom = 0;
1277*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_delta_pic_order_cnt[0] =
1278*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[0] = 0;
1279*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_delta_pic_order_cnt[1] =
1280*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[1] = 0;
1281*495ae853SAndroid Build Coastguard Worker ps_prev_poc->u1_mmco_equalto5 = ps_cur_poc->u1_mmco_equalto5 = 0;
1282*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_top_field_order_count = ps_cur_poc->i4_top_field_order_count =
1283*495ae853SAndroid Build Coastguard Worker 0;
1284*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_bottom_field_order_count =
1285*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_bottom_field_order_count = 0;
1286*495ae853SAndroid Build Coastguard Worker ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field = 0;
1287*495ae853SAndroid Build Coastguard Worker ps_prev_poc->u1_mmco_equalto5 = ps_cur_poc->u1_mmco_equalto5 = 0;
1288*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst = 0;
1289*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u1_mmco_equalto5 = 0;
1290*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u2_frame_num = 0;
1291*495ae853SAndroid Build Coastguard Worker
1292*495ae853SAndroid Build Coastguard Worker ps_dec->i4_max_poc = 0;
1293*495ae853SAndroid Build Coastguard Worker ps_dec->i4_prev_max_display_seq = 0;
1294*495ae853SAndroid Build Coastguard Worker ps_dec->u1_recon_mb_grp = 4;
1295*495ae853SAndroid Build Coastguard Worker ps_dec->i4_reorder_depth = -1;
1296*495ae853SAndroid Build Coastguard Worker
1297*495ae853SAndroid Build Coastguard Worker /* Field PIC initializations */
1298*495ae853SAndroid Build Coastguard Worker ps_dec->u1_second_field = 0;
1299*495ae853SAndroid Build Coastguard Worker ps_dec->s_prev_seq_params.u1_eoseq_pending = 0;
1300*495ae853SAndroid Build Coastguard Worker
1301*495ae853SAndroid Build Coastguard Worker /* Set the cropping parameters as zero */
1302*495ae853SAndroid Build Coastguard Worker ps_dec->u2_crop_offset_y = 0;
1303*495ae853SAndroid Build Coastguard Worker ps_dec->u2_crop_offset_uv = 0;
1304*495ae853SAndroid Build Coastguard Worker
1305*495ae853SAndroid Build Coastguard Worker /* The Initial Frame Rate Info is not Present */
1306*495ae853SAndroid Build Coastguard Worker ps_dec->i4_vui_frame_rate = -1;
1307*495ae853SAndroid Build Coastguard Worker ps_dec->i4_pic_type = NA_SLICE;
1308*495ae853SAndroid Build Coastguard Worker ps_dec->i4_frametype = IV_NA_FRAME;
1309*495ae853SAndroid Build Coastguard Worker ps_dec->i4_content_type = IV_CONTENTTYPE_NA;
1310*495ae853SAndroid Build Coastguard Worker
1311*495ae853SAndroid Build Coastguard Worker ps_dec->u1_res_changed = 0;
1312*495ae853SAndroid Build Coastguard Worker
1313*495ae853SAndroid Build Coastguard Worker
1314*495ae853SAndroid Build Coastguard Worker ps_dec->u1_frame_decoded_flag = 0;
1315*495ae853SAndroid Build Coastguard Worker
1316*495ae853SAndroid Build Coastguard Worker /* Set the default frame seek mask mode */
1317*495ae853SAndroid Build Coastguard Worker ps_dec->u4_skip_frm_mask = SKIP_NONE;
1318*495ae853SAndroid Build Coastguard Worker
1319*495ae853SAndroid Build Coastguard Worker /********************************************************/
1320*495ae853SAndroid Build Coastguard Worker /* Initialize CAVLC residual decoding function pointers */
1321*495ae853SAndroid Build Coastguard Worker /********************************************************/
1322*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_4x4res_block[0] = ih264d_cavlc_4x4res_block_totalcoeff_1;
1323*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_4x4res_block[1] =
1324*495ae853SAndroid Build Coastguard Worker ih264d_cavlc_4x4res_block_totalcoeff_2to10;
1325*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_4x4res_block[2] =
1326*495ae853SAndroid Build Coastguard Worker ih264d_cavlc_4x4res_block_totalcoeff_11to16;
1327*495ae853SAndroid Build Coastguard Worker
1328*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse4x4coeff[0] = ih264d_cavlc_parse4x4coeff_n0to7;
1329*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse4x4coeff[1] = ih264d_cavlc_parse4x4coeff_n8;
1330*495ae853SAndroid Build Coastguard Worker
1331*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse_8x8block[0] =
1332*495ae853SAndroid Build Coastguard Worker ih264d_cavlc_parse_8x8block_none_available;
1333*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse_8x8block[1] =
1334*495ae853SAndroid Build Coastguard Worker ih264d_cavlc_parse_8x8block_left_available;
1335*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse_8x8block[2] =
1336*495ae853SAndroid Build Coastguard Worker ih264d_cavlc_parse_8x8block_top_available;
1337*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse_8x8block[3] =
1338*495ae853SAndroid Build Coastguard Worker ih264d_cavlc_parse_8x8block_both_available;
1339*495ae853SAndroid Build Coastguard Worker
1340*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
1341*495ae853SAndroid Build Coastguard Worker /* Initialize Bs calculation function pointers for P and B, 16x16/non16x16 */
1342*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
1343*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs1[0][0] = ih264d_fill_bs1_16x16mb_pslice;
1344*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs1[0][1] = ih264d_fill_bs1_non16x16mb_pslice;
1345*495ae853SAndroid Build Coastguard Worker
1346*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs1[1][0] = ih264d_fill_bs1_16x16mb_bslice;
1347*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs1[1][1] = ih264d_fill_bs1_non16x16mb_bslice;
1348*495ae853SAndroid Build Coastguard Worker
1349*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs_xtra_left_edge[0] =
1350*495ae853SAndroid Build Coastguard Worker ih264d_fill_bs_xtra_left_edge_cur_frm;
1351*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs_xtra_left_edge[1] =
1352*495ae853SAndroid Build Coastguard Worker ih264d_fill_bs_xtra_left_edge_cur_fld;
1353*495ae853SAndroid Build Coastguard Worker
1354*495ae853SAndroid Build Coastguard Worker /* Initialize Reference Pic Buffers */
1355*495ae853SAndroid Build Coastguard Worker ih264d_init_ref_bufs(ps_dec->ps_dpb_mgr);
1356*495ae853SAndroid Build Coastguard Worker
1357*495ae853SAndroid Build Coastguard Worker ps_dec->u2_prv_frame_num = 0;
1358*495ae853SAndroid Build Coastguard Worker ps_dec->u1_top_bottom_decoded = 0;
1359*495ae853SAndroid Build Coastguard Worker ps_dec->u1_dangling_field = 0;
1360*495ae853SAndroid Build Coastguard Worker
1361*495ae853SAndroid Build Coastguard Worker ps_dec->s_cab_dec_env.cabac_table = gau4_ih264d_cabac_table;
1362*495ae853SAndroid Build Coastguard Worker
1363*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_left_mv_ctxt_inc = ps_dec->u1_left_mv_ctxt_inc_arr[0];
1364*495ae853SAndroid Build Coastguard Worker ps_dec->pi1_left_ref_idx_ctxt_inc =
1365*495ae853SAndroid Build Coastguard Worker &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0];
1366*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_topmb;
1367*495ae853SAndroid Build Coastguard Worker
1368*495ae853SAndroid Build Coastguard Worker /* ! */
1369*495ae853SAndroid Build Coastguard Worker /* Initializing flush frame u4_flag */
1370*495ae853SAndroid Build Coastguard Worker ps_dec->u1_flushfrm = 0;
1371*495ae853SAndroid Build Coastguard Worker
1372*495ae853SAndroid Build Coastguard Worker {
1373*495ae853SAndroid Build Coastguard Worker ps_dec->s_cab_dec_env.pv_codec_handle = (void*)ps_dec;
1374*495ae853SAndroid Build Coastguard Worker ps_dec->ps_bitstrm->pv_codec_handle = (void*)ps_dec;
1375*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->pv_codec_handle = (void*)ps_dec;
1376*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->pv_codec_handle = (void*)ps_dec;
1377*495ae853SAndroid Build Coastguard Worker }
1378*495ae853SAndroid Build Coastguard Worker
1379*495ae853SAndroid Build Coastguard Worker memset(ps_dec->disp_bufs, 0, (MAX_DISP_BUFS_NEW) * sizeof(disp_buf_t));
1380*495ae853SAndroid Build Coastguard Worker memset(ps_dec->u4_disp_buf_mapping, 0,
1381*495ae853SAndroid Build Coastguard Worker (MAX_DISP_BUFS_NEW) * sizeof(UWORD32));
1382*495ae853SAndroid Build Coastguard Worker memset(ps_dec->u4_disp_buf_to_be_freed, 0,
1383*495ae853SAndroid Build Coastguard Worker (MAX_DISP_BUFS_NEW) * sizeof(UWORD32));
1384*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_cur_slice, 0, sizeof(dec_slice_params_t));
1385*495ae853SAndroid Build Coastguard Worker
1386*495ae853SAndroid Build Coastguard Worker ih264d_init_arch(ps_dec);
1387*495ae853SAndroid Build Coastguard Worker ih264d_init_function_ptr(ps_dec);
1388*495ae853SAndroid Build Coastguard Worker ps_dec->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
1389*495ae853SAndroid Build Coastguard Worker ps_dec->init_done = 1;
1390*495ae853SAndroid Build Coastguard Worker
1391*495ae853SAndroid Build Coastguard Worker }
1392*495ae853SAndroid Build Coastguard Worker
ih264d_join_threads(dec_struct_t * ps_dec)1393*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_join_threads(dec_struct_t *ps_dec)
1394*495ae853SAndroid Build Coastguard Worker {
1395*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
1396*495ae853SAndroid Build Coastguard Worker {
1397*495ae853SAndroid Build Coastguard Worker /* Wait for threads */
1398*495ae853SAndroid Build Coastguard Worker ps_dec->i4_break_threads = 1;
1399*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_dec_thread_created)
1400*495ae853SAndroid Build Coastguard Worker {
1401*495ae853SAndroid Build Coastguard Worker ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
1402*495ae853SAndroid Build Coastguard Worker
1403*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_start[0] = PROC_START;
1404*495ae853SAndroid Build Coastguard Worker
1405*495ae853SAndroid Build Coastguard Worker ithread_cond_signal(ps_dec->apv_proc_start_condition[0]);
1406*495ae853SAndroid Build Coastguard Worker
1407*495ae853SAndroid Build Coastguard Worker ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
1408*495ae853SAndroid Build Coastguard Worker
1409*495ae853SAndroid Build Coastguard Worker ithread_join(ps_dec->pv_dec_thread_handle, NULL);
1410*495ae853SAndroid Build Coastguard Worker
1411*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dec_thread_created = 0;
1412*495ae853SAndroid Build Coastguard Worker }
1413*495ae853SAndroid Build Coastguard Worker
1414*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_bs_deblk_thread_created)
1415*495ae853SAndroid Build Coastguard Worker {
1416*495ae853SAndroid Build Coastguard Worker ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
1417*495ae853SAndroid Build Coastguard Worker
1418*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_start[1] = PROC_START;
1419*495ae853SAndroid Build Coastguard Worker
1420*495ae853SAndroid Build Coastguard Worker ithread_cond_signal(ps_dec->apv_proc_start_condition[1]);
1421*495ae853SAndroid Build Coastguard Worker
1422*495ae853SAndroid Build Coastguard Worker ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
1423*495ae853SAndroid Build Coastguard Worker
1424*495ae853SAndroid Build Coastguard Worker ithread_join(ps_dec->pv_bs_deblk_thread_handle, NULL);
1425*495ae853SAndroid Build Coastguard Worker
1426*495ae853SAndroid Build Coastguard Worker ps_dec->u4_bs_deblk_thread_created = 0;
1427*495ae853SAndroid Build Coastguard Worker }
1428*495ae853SAndroid Build Coastguard Worker }
1429*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
1430*495ae853SAndroid Build Coastguard Worker }
1431*495ae853SAndroid Build Coastguard Worker
ih264d_free_static_bufs(iv_obj_t * dec_hdl)1432*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_free_static_bufs(iv_obj_t *dec_hdl)
1433*495ae853SAndroid Build Coastguard Worker {
1434*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec;
1435*495ae853SAndroid Build Coastguard Worker
1436*495ae853SAndroid Build Coastguard Worker void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1437*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt;
1438*495ae853SAndroid Build Coastguard Worker
1439*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)dec_hdl->pv_codec_handle;
1440*495ae853SAndroid Build Coastguard Worker pf_aligned_free = ps_dec->pf_aligned_free;
1441*495ae853SAndroid Build Coastguard Worker pv_mem_ctxt = ps_dec->pv_mem_ctxt;
1442*495ae853SAndroid Build Coastguard Worker
1443*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
1444*495ae853SAndroid Build Coastguard Worker {
1445*495ae853SAndroid Build Coastguard Worker
1446*495ae853SAndroid Build Coastguard Worker ih264d_join_threads(ps_dec);
1447*495ae853SAndroid Build Coastguard Worker
1448*495ae853SAndroid Build Coastguard Worker // destroy mutex and condition variable for both the threads
1449*495ae853SAndroid Build Coastguard Worker // 1. ih264d_decode_picture_thread
1450*495ae853SAndroid Build Coastguard Worker // 2. ih264d_recon_deblk_thread
1451*495ae853SAndroid Build Coastguard Worker {
1452*495ae853SAndroid Build Coastguard Worker UWORD32 i;
1453*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 2; i++)
1454*495ae853SAndroid Build Coastguard Worker {
1455*495ae853SAndroid Build Coastguard Worker ithread_cond_destroy(ps_dec->apv_proc_start_condition[i]);
1456*495ae853SAndroid Build Coastguard Worker ithread_cond_destroy(ps_dec->apv_proc_done_condition[i]);
1457*495ae853SAndroid Build Coastguard Worker
1458*495ae853SAndroid Build Coastguard Worker ithread_mutex_destroy(ps_dec->apv_proc_start_mutex[i]);
1459*495ae853SAndroid Build Coastguard Worker ithread_mutex_destroy(ps_dec->apv_proc_done_mutex[i]);
1460*495ae853SAndroid Build Coastguard Worker }
1461*495ae853SAndroid Build Coastguard Worker }
1462*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->apv_proc_start_mutex[0]);
1463*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->apv_proc_start_condition[0]);
1464*495ae853SAndroid Build Coastguard Worker }
1465*495ae853SAndroid Build Coastguard Worker
1466*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sps);
1467*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pps);
1468*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_dec_thread_handle);
1469*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_bs_deblk_thread_handle);
1470*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dpb_mgr);
1471*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pred);
1472*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_disp_buf_mgr);
1473*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_pic_buf_mgr);
1474*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pic_buf_base);
1475*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dec_err_status);
1476*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sei);
1477*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sei_parse);
1478*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dpb_cmds);
1479*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_bitstrm);
1480*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_cur_slice);
1481*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_scratch_sps_pps);
1482*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_bits_buf_static);
1483*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ppv_map_ref_idx_to_poc_base);
1484*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->p_cabac_ctxt_table_t);
1485*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_left_mb_ctxt_info);
1486*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_ref_buff_base);
1487*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pi2_pred1);
1488*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_temp_mc_buffer);
1489*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_init_dpb_base);
1490*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu4_mbaff_wt_mat);
1491*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu4_wts_ofsts_mat);
1492*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_left_mvpred_addr);
1493*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_mv_buf_mgr);
1494*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_col_mv_base);
1495*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, dec_hdl->pv_codec_handle);
1496*495ae853SAndroid Build Coastguard Worker
1497*495ae853SAndroid Build Coastguard Worker if(dec_hdl)
1498*495ae853SAndroid Build Coastguard Worker {
1499*495ae853SAndroid Build Coastguard Worker pf_aligned_free(pv_mem_ctxt, dec_hdl);
1500*495ae853SAndroid Build Coastguard Worker }
1501*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
1502*495ae853SAndroid Build Coastguard Worker }
1503*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1504*495ae853SAndroid Build Coastguard Worker /* */
1505*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_create */
1506*495ae853SAndroid Build Coastguard Worker /* */
1507*495ae853SAndroid Build Coastguard Worker /* Description : creates decoder */
1508*495ae853SAndroid Build Coastguard Worker /* */
1509*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
1510*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
1511*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
1512*495ae853SAndroid Build Coastguard Worker /* Outputs : */
1513*495ae853SAndroid Build Coastguard Worker /* Returns : void */
1514*495ae853SAndroid Build Coastguard Worker /* */
1515*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1516*495ae853SAndroid Build Coastguard Worker /* */
1517*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1518*495ae853SAndroid Build Coastguard Worker /* */
1519*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1520*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
1521*495ae853SAndroid Build Coastguard Worker /* */
1522*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_allocate_static_bufs(iv_obj_t ** dec_hdl,void * pv_api_ip,void * pv_api_op)1523*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_allocate_static_bufs(iv_obj_t **dec_hdl, void *pv_api_ip, void *pv_api_op)
1524*495ae853SAndroid Build Coastguard Worker {
1525*495ae853SAndroid Build Coastguard Worker ih264d_create_ip_t *ps_create_ip;
1526*495ae853SAndroid Build Coastguard Worker ih264d_create_op_t *ps_create_op;
1527*495ae853SAndroid Build Coastguard Worker void *pv_buf;
1528*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf;
1529*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec;
1530*495ae853SAndroid Build Coastguard Worker void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
1531*495ae853SAndroid Build Coastguard Worker void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1532*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt;
1533*495ae853SAndroid Build Coastguard Worker WORD32 size;
1534*495ae853SAndroid Build Coastguard Worker
1535*495ae853SAndroid Build Coastguard Worker ps_create_ip = (ih264d_create_ip_t *)pv_api_ip;
1536*495ae853SAndroid Build Coastguard Worker ps_create_op = (ih264d_create_op_t *)pv_api_op;
1537*495ae853SAndroid Build Coastguard Worker
1538*495ae853SAndroid Build Coastguard Worker ps_create_op->s_ivd_create_op_t.u4_error_code = 0;
1539*495ae853SAndroid Build Coastguard Worker
1540*495ae853SAndroid Build Coastguard Worker pf_aligned_alloc = ps_create_ip->s_ivd_create_ip_t.pf_aligned_alloc;
1541*495ae853SAndroid Build Coastguard Worker pf_aligned_free = ps_create_ip->s_ivd_create_ip_t.pf_aligned_free;
1542*495ae853SAndroid Build Coastguard Worker pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
1543*495ae853SAndroid Build Coastguard Worker
1544*495ae853SAndroid Build Coastguard Worker /* Initialize return handle to NULL */
1545*495ae853SAndroid Build Coastguard Worker ps_create_op->s_ivd_create_op_t.pv_handle = NULL;
1546*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(iv_obj_t));
1547*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1548*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, sizeof(iv_obj_t));
1549*495ae853SAndroid Build Coastguard Worker *dec_hdl = (iv_obj_t *)pv_buf;
1550*495ae853SAndroid Build Coastguard Worker ps_create_op->s_ivd_create_op_t.pv_handle = *dec_hdl;
1551*495ae853SAndroid Build Coastguard Worker
1552*495ae853SAndroid Build Coastguard Worker (*dec_hdl)->pv_codec_handle = NULL;
1553*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(dec_struct_t));
1554*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1555*495ae853SAndroid Build Coastguard Worker (*dec_hdl)->pv_codec_handle = (dec_struct_t *)pv_buf;
1556*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)pv_buf;
1557*495ae853SAndroid Build Coastguard Worker
1558*495ae853SAndroid Build Coastguard Worker memset(ps_dec, 0, sizeof(dec_struct_t));
1559*495ae853SAndroid Build Coastguard Worker
1560*495ae853SAndroid Build Coastguard Worker #ifndef LOGO_EN
1561*495ae853SAndroid Build Coastguard Worker ps_dec->u4_share_disp_buf = ps_create_ip->s_ivd_create_ip_t.u4_share_disp_buf;
1562*495ae853SAndroid Build Coastguard Worker #else
1563*495ae853SAndroid Build Coastguard Worker ps_dec->u4_share_disp_buf = 0;
1564*495ae853SAndroid Build Coastguard Worker #endif
1565*495ae853SAndroid Build Coastguard Worker
1566*495ae853SAndroid Build Coastguard Worker ps_dec->u1_chroma_format =
1567*495ae853SAndroid Build Coastguard Worker (UWORD8)(ps_create_ip->s_ivd_create_ip_t.e_output_format);
1568*495ae853SAndroid Build Coastguard Worker
1569*495ae853SAndroid Build Coastguard Worker if((ps_dec->u1_chroma_format != IV_YUV_420P)
1570*495ae853SAndroid Build Coastguard Worker && (ps_dec->u1_chroma_format
1571*495ae853SAndroid Build Coastguard Worker != IV_YUV_420SP_UV)
1572*495ae853SAndroid Build Coastguard Worker && (ps_dec->u1_chroma_format
1573*495ae853SAndroid Build Coastguard Worker != IV_YUV_420SP_VU))
1574*495ae853SAndroid Build Coastguard Worker {
1575*495ae853SAndroid Build Coastguard Worker ps_dec->u4_share_disp_buf = 0;
1576*495ae853SAndroid Build Coastguard Worker }
1577*495ae853SAndroid Build Coastguard Worker
1578*495ae853SAndroid Build Coastguard Worker ps_dec->u1_enable_mb_info = ps_create_ip->u4_enable_frame_info;
1579*495ae853SAndroid Build Coastguard Worker ps_dec->pf_aligned_alloc = pf_aligned_alloc;
1580*495ae853SAndroid Build Coastguard Worker ps_dec->pf_aligned_free = pf_aligned_free;
1581*495ae853SAndroid Build Coastguard Worker ps_dec->pv_mem_ctxt = pv_mem_ctxt;
1582*495ae853SAndroid Build Coastguard Worker ps_dec->i4_threads_active = ps_create_ip->u4_keep_threads_active;
1583*495ae853SAndroid Build Coastguard Worker
1584*495ae853SAndroid Build Coastguard Worker
1585*495ae853SAndroid Build Coastguard Worker size = ((sizeof(dec_seq_params_t)) * MAX_NUM_SEQ_PARAMS);
1586*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1587*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1588*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1589*495ae853SAndroid Build Coastguard Worker ps_dec->ps_sps = pv_buf;
1590*495ae853SAndroid Build Coastguard Worker
1591*495ae853SAndroid Build Coastguard Worker size = (sizeof(dec_pic_params_t)) * MAX_NUM_PIC_PARAMS;
1592*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1593*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1594*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1595*495ae853SAndroid Build Coastguard Worker ps_dec->ps_pps = pv_buf;
1596*495ae853SAndroid Build Coastguard Worker
1597*495ae853SAndroid Build Coastguard Worker size = ithread_get_handle_size();
1598*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1599*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1600*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1601*495ae853SAndroid Build Coastguard Worker ps_dec->pv_dec_thread_handle = pv_buf;
1602*495ae853SAndroid Build Coastguard Worker
1603*495ae853SAndroid Build Coastguard Worker size = ithread_get_handle_size();
1604*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1605*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1606*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1607*495ae853SAndroid Build Coastguard Worker ps_dec->pv_bs_deblk_thread_handle = pv_buf;
1608*495ae853SAndroid Build Coastguard Worker
1609*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
1610*495ae853SAndroid Build Coastguard Worker {
1611*495ae853SAndroid Build Coastguard Worker UWORD32 i;
1612*495ae853SAndroid Build Coastguard Worker /* Request memory to hold mutex (start/done) for both threads */
1613*495ae853SAndroid Build Coastguard Worker size = ithread_get_mutex_lock_size() << 2;
1614*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 8, size);
1615*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1616*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1617*495ae853SAndroid Build Coastguard Worker
1618*495ae853SAndroid Build Coastguard Worker // init mutex variable for both the threads
1619*495ae853SAndroid Build Coastguard Worker // 1. ih264d_decode_picture_thread
1620*495ae853SAndroid Build Coastguard Worker // 2. ih264d_recon_deblk_thread
1621*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 2; i++)
1622*495ae853SAndroid Build Coastguard Worker {
1623*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1624*495ae853SAndroid Build Coastguard Worker WORD32 mutex_size = ithread_get_mutex_lock_size();
1625*495ae853SAndroid Build Coastguard Worker
1626*495ae853SAndroid Build Coastguard Worker ps_dec->apv_proc_start_mutex[i] =
1627*495ae853SAndroid Build Coastguard Worker (UWORD8 *)pv_buf + (2 * i * mutex_size);
1628*495ae853SAndroid Build Coastguard Worker ps_dec->apv_proc_done_mutex[i] =
1629*495ae853SAndroid Build Coastguard Worker (UWORD8 *)pv_buf + ((2 * i + 1) * mutex_size);
1630*495ae853SAndroid Build Coastguard Worker
1631*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_init(ps_dec->apv_proc_start_mutex[i]);
1632*495ae853SAndroid Build Coastguard Worker RETURN_IF((ret != IV_SUCCESS), ret);
1633*495ae853SAndroid Build Coastguard Worker
1634*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_init(ps_dec->apv_proc_done_mutex[i]);
1635*495ae853SAndroid Build Coastguard Worker RETURN_IF((ret != IV_SUCCESS), ret);
1636*495ae853SAndroid Build Coastguard Worker }
1637*495ae853SAndroid Build Coastguard Worker
1638*495ae853SAndroid Build Coastguard Worker size = ithread_get_cond_struct_size() << 2;
1639*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 8, size);
1640*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1641*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1642*495ae853SAndroid Build Coastguard Worker
1643*495ae853SAndroid Build Coastguard Worker // init condition variable for both the threads
1644*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 2; i++)
1645*495ae853SAndroid Build Coastguard Worker {
1646*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1647*495ae853SAndroid Build Coastguard Worker WORD32 cond_size = ithread_get_cond_struct_size();
1648*495ae853SAndroid Build Coastguard Worker ps_dec->apv_proc_start_condition[i] =
1649*495ae853SAndroid Build Coastguard Worker (UWORD8 *)pv_buf + (2 * i * cond_size);
1650*495ae853SAndroid Build Coastguard Worker ps_dec->apv_proc_done_condition[i] =
1651*495ae853SAndroid Build Coastguard Worker (UWORD8 *)pv_buf + ((2 * i + 1) * cond_size);
1652*495ae853SAndroid Build Coastguard Worker
1653*495ae853SAndroid Build Coastguard Worker ret = ithread_cond_init(ps_dec->apv_proc_start_condition[i]);
1654*495ae853SAndroid Build Coastguard Worker RETURN_IF((ret != IV_SUCCESS), ret);
1655*495ae853SAndroid Build Coastguard Worker
1656*495ae853SAndroid Build Coastguard Worker ret = ithread_cond_init(ps_dec->apv_proc_done_condition[i]);
1657*495ae853SAndroid Build Coastguard Worker RETURN_IF((ret != IV_SUCCESS), ret);
1658*495ae853SAndroid Build Coastguard Worker }
1659*495ae853SAndroid Build Coastguard Worker }
1660*495ae853SAndroid Build Coastguard Worker
1661*495ae853SAndroid Build Coastguard Worker size = sizeof(dpb_manager_t);
1662*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1663*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1664*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1665*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr = pv_buf;
1666*495ae853SAndroid Build Coastguard Worker
1667*495ae853SAndroid Build Coastguard Worker size = sizeof(pred_info_t) * 2 * 32;
1668*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1669*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1670*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1671*495ae853SAndroid Build Coastguard Worker ps_dec->ps_pred = pv_buf;
1672*495ae853SAndroid Build Coastguard Worker
1673*495ae853SAndroid Build Coastguard Worker size = sizeof(disp_mgr_t);
1674*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1675*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1676*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1677*495ae853SAndroid Build Coastguard Worker ps_dec->pv_disp_buf_mgr = pv_buf;
1678*495ae853SAndroid Build Coastguard Worker
1679*495ae853SAndroid Build Coastguard Worker size = sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
1680*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1681*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1682*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1683*495ae853SAndroid Build Coastguard Worker ps_dec->pv_pic_buf_mgr = pv_buf;
1684*495ae853SAndroid Build Coastguard Worker
1685*495ae853SAndroid Build Coastguard Worker size = sizeof(struct pic_buffer_t) * (H264_MAX_REF_PICS * 2);
1686*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1687*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1688*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1689*495ae853SAndroid Build Coastguard Worker ps_dec->ps_pic_buf_base = pv_buf;
1690*495ae853SAndroid Build Coastguard Worker
1691*495ae853SAndroid Build Coastguard Worker size = sizeof(dec_err_status_t);
1692*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1693*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1694*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1695*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dec_err_status = (dec_err_status_t *)pv_buf;
1696*495ae853SAndroid Build Coastguard Worker
1697*495ae853SAndroid Build Coastguard Worker size = sizeof(sei);
1698*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1699*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1700*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1701*495ae853SAndroid Build Coastguard Worker ps_dec->ps_sei = (sei *)pv_buf;
1702*495ae853SAndroid Build Coastguard Worker
1703*495ae853SAndroid Build Coastguard Worker size = sizeof(sei);
1704*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1705*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1706*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1707*495ae853SAndroid Build Coastguard Worker ps_dec->ps_sei_parse = (sei *)pv_buf;
1708*495ae853SAndroid Build Coastguard Worker
1709*495ae853SAndroid Build Coastguard Worker size = sizeof(dpb_commands_t);
1710*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1711*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1712*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1713*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_cmds = (dpb_commands_t *)pv_buf;
1714*495ae853SAndroid Build Coastguard Worker
1715*495ae853SAndroid Build Coastguard Worker size = sizeof(dec_bit_stream_t);
1716*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1717*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1718*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1719*495ae853SAndroid Build Coastguard Worker ps_dec->ps_bitstrm = (dec_bit_stream_t *)pv_buf;
1720*495ae853SAndroid Build Coastguard Worker
1721*495ae853SAndroid Build Coastguard Worker size = sizeof(dec_slice_params_t);
1722*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1723*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1724*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1725*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice = (dec_slice_params_t *)pv_buf;
1726*495ae853SAndroid Build Coastguard Worker
1727*495ae853SAndroid Build Coastguard Worker size = MAX(sizeof(dec_seq_params_t), sizeof(dec_pic_params_t));
1728*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1729*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1730*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1731*495ae853SAndroid Build Coastguard Worker ps_dec->pv_scratch_sps_pps = pv_buf;
1732*495ae853SAndroid Build Coastguard Worker
1733*495ae853SAndroid Build Coastguard Worker
1734*495ae853SAndroid Build Coastguard Worker ps_dec->u4_static_bits_buf_size = 256000;
1735*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, ps_dec->u4_static_bits_buf_size);
1736*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1737*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, ps_dec->u4_static_bits_buf_size);
1738*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_bits_buf_static = pv_buf;
1739*495ae853SAndroid Build Coastguard Worker
1740*495ae853SAndroid Build Coastguard Worker
1741*495ae853SAndroid Build Coastguard Worker size = ((TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC)
1742*495ae853SAndroid Build Coastguard Worker * sizeof(void *));
1743*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1744*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1745*495ae853SAndroid Build Coastguard Worker ps_dec->ppv_map_ref_idx_to_poc_base = pv_buf;
1746*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ppv_map_ref_idx_to_poc_base, 0, size);
1747*495ae853SAndroid Build Coastguard Worker
1748*495ae853SAndroid Build Coastguard Worker ps_dec->ppv_map_ref_idx_to_poc = ps_dec->ppv_map_ref_idx_to_poc_base + OFFSET_MAP_IDX_POC;
1749*495ae853SAndroid Build Coastguard Worker
1750*495ae853SAndroid Build Coastguard Worker
1751*495ae853SAndroid Build Coastguard Worker size = (sizeof(bin_ctxt_model_t) * NUM_CABAC_CTXTS);
1752*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1753*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1754*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1755*495ae853SAndroid Build Coastguard Worker ps_dec->p_cabac_ctxt_table_t = pv_buf;
1756*495ae853SAndroid Build Coastguard Worker
1757*495ae853SAndroid Build Coastguard Worker
1758*495ae853SAndroid Build Coastguard Worker
1759*495ae853SAndroid Build Coastguard Worker size = sizeof(ctxt_inc_mb_info_t);
1760*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1761*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1762*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1763*495ae853SAndroid Build Coastguard Worker ps_dec->ps_left_mb_ctxt_info = pv_buf;
1764*495ae853SAndroid Build Coastguard Worker
1765*495ae853SAndroid Build Coastguard Worker
1766*495ae853SAndroid Build Coastguard Worker
1767*495ae853SAndroid Build Coastguard Worker size = MAX_REF_BUF_SIZE * 2;
1768*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1769*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1770*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1771*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_ref_buff_base = pv_buf;
1772*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_ref_buff = ps_dec->pu1_ref_buff_base + MAX_REF_BUF_SIZE;
1773*495ae853SAndroid Build Coastguard Worker
1774*495ae853SAndroid Build Coastguard Worker
1775*495ae853SAndroid Build Coastguard Worker size = ((sizeof(WORD16)) * PRED_BUFFER_WIDTH
1776*495ae853SAndroid Build Coastguard Worker * PRED_BUFFER_HEIGHT * 2);
1777*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1778*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1779*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1780*495ae853SAndroid Build Coastguard Worker ps_dec->pi2_pred1 = pv_buf;
1781*495ae853SAndroid Build Coastguard Worker
1782*495ae853SAndroid Build Coastguard Worker
1783*495ae853SAndroid Build Coastguard Worker size = sizeof(UWORD8) * (MB_LUM_SIZE);
1784*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1785*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1786*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1787*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_temp_mc_buffer = pv_buf;
1788*495ae853SAndroid Build Coastguard Worker
1789*495ae853SAndroid Build Coastguard Worker
1790*495ae853SAndroid Build Coastguard Worker
1791*495ae853SAndroid Build Coastguard Worker
1792*495ae853SAndroid Build Coastguard Worker size = 8 * MAX_REF_BUFS * sizeof(struct pic_buffer_t);
1793*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1794*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1795*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1796*495ae853SAndroid Build Coastguard Worker
1797*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_init_dpb_base = pv_buf;
1798*495ae853SAndroid Build Coastguard Worker pu1_buf = pv_buf;
1799*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->ps_init_dpb[0][0] = (struct pic_buffer_t *)pu1_buf;
1800*495ae853SAndroid Build Coastguard Worker
1801*495ae853SAndroid Build Coastguard Worker pu1_buf += size / 2;
1802*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->ps_init_dpb[1][0] = (struct pic_buffer_t *)pu1_buf;
1803*495ae853SAndroid Build Coastguard Worker
1804*495ae853SAndroid Build Coastguard Worker size = (sizeof(UWORD32) * 2 * 3
1805*495ae853SAndroid Build Coastguard Worker * ((MAX_FRAMES << 1) * (MAX_FRAMES << 1)) * 2);
1806*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1807*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1808*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1809*495ae853SAndroid Build Coastguard Worker ps_dec->pu4_mbaff_wt_mat = pv_buf;
1810*495ae853SAndroid Build Coastguard Worker
1811*495ae853SAndroid Build Coastguard Worker size = sizeof(UWORD32) * 2 * 3
1812*495ae853SAndroid Build Coastguard Worker * ((MAX_FRAMES << 1) * (MAX_FRAMES << 1));
1813*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1814*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1815*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1816*495ae853SAndroid Build Coastguard Worker ps_dec->pu4_wts_ofsts_mat = pv_buf;
1817*495ae853SAndroid Build Coastguard Worker
1818*495ae853SAndroid Build Coastguard Worker
1819*495ae853SAndroid Build Coastguard Worker size = (sizeof(neighbouradd_t) << 2);
1820*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1821*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1822*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1823*495ae853SAndroid Build Coastguard Worker ps_dec->ps_left_mvpred_addr = pv_buf;
1824*495ae853SAndroid Build Coastguard Worker
1825*495ae853SAndroid Build Coastguard Worker
1826*495ae853SAndroid Build Coastguard Worker size = sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
1827*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1828*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1829*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1830*495ae853SAndroid Build Coastguard Worker ps_dec->pv_mv_buf_mgr = pv_buf;
1831*495ae853SAndroid Build Coastguard Worker
1832*495ae853SAndroid Build Coastguard Worker
1833*495ae853SAndroid Build Coastguard Worker size = sizeof(col_mv_buf_t) * (H264_MAX_REF_PICS * 2);
1834*495ae853SAndroid Build Coastguard Worker pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1835*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1836*495ae853SAndroid Build Coastguard Worker ps_dec->ps_col_mv_base = pv_buf;
1837*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_col_mv_base, 0, size);
1838*495ae853SAndroid Build Coastguard Worker
1839*495ae853SAndroid Build Coastguard Worker ih264d_init_decoder(ps_dec);
1840*495ae853SAndroid Build Coastguard Worker
1841*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
1842*495ae853SAndroid Build Coastguard Worker }
1843*495ae853SAndroid Build Coastguard Worker
1844*495ae853SAndroid Build Coastguard Worker
1845*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1846*495ae853SAndroid Build Coastguard Worker /* */
1847*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_create */
1848*495ae853SAndroid Build Coastguard Worker /* */
1849*495ae853SAndroid Build Coastguard Worker /* Description : creates decoder */
1850*495ae853SAndroid Build Coastguard Worker /* */
1851*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
1852*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
1853*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
1854*495ae853SAndroid Build Coastguard Worker /* Outputs : */
1855*495ae853SAndroid Build Coastguard Worker /* Returns : void */
1856*495ae853SAndroid Build Coastguard Worker /* */
1857*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1858*495ae853SAndroid Build Coastguard Worker /* */
1859*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1860*495ae853SAndroid Build Coastguard Worker /* */
1861*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1862*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
1863*495ae853SAndroid Build Coastguard Worker /* */
1864*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_create(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)1865*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_create(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
1866*495ae853SAndroid Build Coastguard Worker {
1867*495ae853SAndroid Build Coastguard Worker ih264d_create_ip_t *ps_create_ip;
1868*495ae853SAndroid Build Coastguard Worker ih264d_create_op_t *ps_create_op;
1869*495ae853SAndroid Build Coastguard Worker
1870*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1871*495ae853SAndroid Build Coastguard Worker
1872*495ae853SAndroid Build Coastguard Worker ps_create_ip = (ih264d_create_ip_t *)pv_api_ip;
1873*495ae853SAndroid Build Coastguard Worker ps_create_op = (ih264d_create_op_t *)pv_api_op;
1874*495ae853SAndroid Build Coastguard Worker
1875*495ae853SAndroid Build Coastguard Worker ps_create_op->s_ivd_create_op_t.u4_error_code = 0;
1876*495ae853SAndroid Build Coastguard Worker dec_hdl = NULL;
1877*495ae853SAndroid Build Coastguard Worker ret = ih264d_allocate_static_bufs(&dec_hdl, pv_api_ip, pv_api_op);
1878*495ae853SAndroid Build Coastguard Worker
1879*495ae853SAndroid Build Coastguard Worker /* If allocation of some buffer fails, then free buffers allocated till then */
1880*495ae853SAndroid Build Coastguard Worker if(IV_FAIL == ret)
1881*495ae853SAndroid Build Coastguard Worker {
1882*495ae853SAndroid Build Coastguard Worker if(dec_hdl)
1883*495ae853SAndroid Build Coastguard Worker {
1884*495ae853SAndroid Build Coastguard Worker if(dec_hdl->pv_codec_handle)
1885*495ae853SAndroid Build Coastguard Worker {
1886*495ae853SAndroid Build Coastguard Worker ih264d_free_static_bufs(dec_hdl);
1887*495ae853SAndroid Build Coastguard Worker }
1888*495ae853SAndroid Build Coastguard Worker else
1889*495ae853SAndroid Build Coastguard Worker {
1890*495ae853SAndroid Build Coastguard Worker void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1891*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt;
1892*495ae853SAndroid Build Coastguard Worker
1893*495ae853SAndroid Build Coastguard Worker pf_aligned_free = ps_create_ip->s_ivd_create_ip_t.pf_aligned_free;
1894*495ae853SAndroid Build Coastguard Worker pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
1895*495ae853SAndroid Build Coastguard Worker pf_aligned_free(pv_mem_ctxt, dec_hdl);
1896*495ae853SAndroid Build Coastguard Worker }
1897*495ae853SAndroid Build Coastguard Worker }
1898*495ae853SAndroid Build Coastguard Worker ps_create_op->s_ivd_create_op_t.u4_error_code = IVD_MEM_ALLOC_FAILED;
1899*495ae853SAndroid Build Coastguard Worker ps_create_op->s_ivd_create_op_t.u4_error_code |= 1 << IVD_FATALERROR;
1900*495ae853SAndroid Build Coastguard Worker
1901*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
1902*495ae853SAndroid Build Coastguard Worker }
1903*495ae853SAndroid Build Coastguard Worker
1904*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
1905*495ae853SAndroid Build Coastguard Worker }
1906*495ae853SAndroid Build Coastguard Worker
1907*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1908*495ae853SAndroid Build Coastguard Worker /* */
1909*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_map_error */
1910*495ae853SAndroid Build Coastguard Worker /* */
1911*495ae853SAndroid Build Coastguard Worker /* Description : Maps error codes to IVD error groups */
1912*495ae853SAndroid Build Coastguard Worker /* */
1913*495ae853SAndroid Build Coastguard Worker /* Inputs : */
1914*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
1915*495ae853SAndroid Build Coastguard Worker /* Outputs : */
1916*495ae853SAndroid Build Coastguard Worker /* Returns : void */
1917*495ae853SAndroid Build Coastguard Worker /* */
1918*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1919*495ae853SAndroid Build Coastguard Worker /* */
1920*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1921*495ae853SAndroid Build Coastguard Worker /* */
1922*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1923*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
1924*495ae853SAndroid Build Coastguard Worker /* */
1925*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_map_error(UWORD32 i4_err_status)1926*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_map_error(UWORD32 i4_err_status)
1927*495ae853SAndroid Build Coastguard Worker {
1928*495ae853SAndroid Build Coastguard Worker UWORD32 temp = 0;
1929*495ae853SAndroid Build Coastguard Worker
1930*495ae853SAndroid Build Coastguard Worker switch(i4_err_status)
1931*495ae853SAndroid Build Coastguard Worker {
1932*495ae853SAndroid Build Coastguard Worker case ERROR_MEM_ALLOC_ISRAM_T:
1933*495ae853SAndroid Build Coastguard Worker case ERROR_MEM_ALLOC_SDRAM_T:
1934*495ae853SAndroid Build Coastguard Worker case ERROR_BUF_MGR:
1935*495ae853SAndroid Build Coastguard Worker case ERROR_MB_GROUP_ASSGN_T:
1936*495ae853SAndroid Build Coastguard Worker case ERROR_FRAME_LIMIT_OVER:
1937*495ae853SAndroid Build Coastguard Worker case ERROR_ACTUAL_RESOLUTION_GREATER_THAN_INIT:
1938*495ae853SAndroid Build Coastguard Worker case ERROR_PROFILE_NOT_SUPPORTED:
1939*495ae853SAndroid Build Coastguard Worker case ERROR_INIT_NOT_DONE:
1940*495ae853SAndroid Build Coastguard Worker case IVD_MEM_ALLOC_FAILED:
1941*495ae853SAndroid Build Coastguard Worker case ERROR_FEATURE_UNAVAIL:
1942*495ae853SAndroid Build Coastguard Worker case IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED:
1943*495ae853SAndroid Build Coastguard Worker temp = 1 << IVD_FATALERROR;
1944*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("\nFatal Error\n");
1945*495ae853SAndroid Build Coastguard Worker break;
1946*495ae853SAndroid Build Coastguard Worker
1947*495ae853SAndroid Build Coastguard Worker case ERROR_DBP_MANAGER_T:
1948*495ae853SAndroid Build Coastguard Worker case ERROR_GAPS_IN_FRM_NUM:
1949*495ae853SAndroid Build Coastguard Worker case ERROR_UNKNOWN_NAL:
1950*495ae853SAndroid Build Coastguard Worker case ERROR_INV_MB_SLC_GRP_T:
1951*495ae853SAndroid Build Coastguard Worker case ERROR_MULTIPLE_SLC_GRP_T:
1952*495ae853SAndroid Build Coastguard Worker case ERROR_UNKNOWN_LEVEL:
1953*495ae853SAndroid Build Coastguard Worker case ERROR_UNAVAIL_PICBUF_T:
1954*495ae853SAndroid Build Coastguard Worker case ERROR_UNAVAIL_MVBUF_T:
1955*495ae853SAndroid Build Coastguard Worker case ERROR_UNAVAIL_DISPBUF_T:
1956*495ae853SAndroid Build Coastguard Worker case ERROR_NUM_REF:
1957*495ae853SAndroid Build Coastguard Worker case ERROR_REFIDX_ORDER_T:
1958*495ae853SAndroid Build Coastguard Worker case ERROR_PIC0_NOT_FOUND_T:
1959*495ae853SAndroid Build Coastguard Worker case ERROR_MB_TYPE:
1960*495ae853SAndroid Build Coastguard Worker case ERROR_SUB_MB_TYPE:
1961*495ae853SAndroid Build Coastguard Worker case ERROR_CBP:
1962*495ae853SAndroid Build Coastguard Worker case ERROR_REF_IDX:
1963*495ae853SAndroid Build Coastguard Worker case ERROR_NUM_MV:
1964*495ae853SAndroid Build Coastguard Worker case ERROR_CHROMA_PRED_MODE:
1965*495ae853SAndroid Build Coastguard Worker case ERROR_INTRAPRED:
1966*495ae853SAndroid Build Coastguard Worker case ERROR_NEXT_MB_ADDRESS_T:
1967*495ae853SAndroid Build Coastguard Worker case ERROR_MB_ADDRESS_T:
1968*495ae853SAndroid Build Coastguard Worker case ERROR_PIC1_NOT_FOUND_T:
1969*495ae853SAndroid Build Coastguard Worker case ERROR_CAVLC_NUM_COEFF_T:
1970*495ae853SAndroid Build Coastguard Worker case ERROR_CAVLC_SCAN_POS_T:
1971*495ae853SAndroid Build Coastguard Worker case ERROR_PRED_WEIGHT_TABLE_T:
1972*495ae853SAndroid Build Coastguard Worker case ERROR_CORRUPTED_SLICE:
1973*495ae853SAndroid Build Coastguard Worker temp = 1 << IVD_CORRUPTEDDATA;
1974*495ae853SAndroid Build Coastguard Worker break;
1975*495ae853SAndroid Build Coastguard Worker
1976*495ae853SAndroid Build Coastguard Worker case ERROR_NOT_SUPP_RESOLUTION:
1977*495ae853SAndroid Build Coastguard Worker case ERROR_ACTUAL_LEVEL_GREATER_THAN_INIT:
1978*495ae853SAndroid Build Coastguard Worker temp = 1 << IVD_UNSUPPORTEDINPUT;
1979*495ae853SAndroid Build Coastguard Worker break;
1980*495ae853SAndroid Build Coastguard Worker
1981*495ae853SAndroid Build Coastguard Worker case ERROR_INVALID_PIC_PARAM:
1982*495ae853SAndroid Build Coastguard Worker case ERROR_INVALID_SEQ_PARAM:
1983*495ae853SAndroid Build Coastguard Worker case ERROR_EGC_EXCEED_32_1_T:
1984*495ae853SAndroid Build Coastguard Worker case ERROR_EGC_EXCEED_32_2_T:
1985*495ae853SAndroid Build Coastguard Worker case ERROR_INV_RANGE_TEV_T:
1986*495ae853SAndroid Build Coastguard Worker case ERROR_INV_SLC_TYPE_T:
1987*495ae853SAndroid Build Coastguard Worker case ERROR_INV_POC_TYPE_T:
1988*495ae853SAndroid Build Coastguard Worker case ERROR_INV_RANGE_QP_T:
1989*495ae853SAndroid Build Coastguard Worker case ERROR_INV_SPS_PPS_T:
1990*495ae853SAndroid Build Coastguard Worker case ERROR_INV_SLICE_HDR_T:
1991*495ae853SAndroid Build Coastguard Worker case ERROR_INV_SEI_MDCV_PARAMS:
1992*495ae853SAndroid Build Coastguard Worker case ERROR_INV_SEI_CLL_PARAMS:
1993*495ae853SAndroid Build Coastguard Worker case ERROR_INV_SEI_AVE_PARAMS:
1994*495ae853SAndroid Build Coastguard Worker case ERROR_INV_SEI_CCV_PARAMS:
1995*495ae853SAndroid Build Coastguard Worker case ERROR_INV_SEI_SII_PARAMS:
1996*495ae853SAndroid Build Coastguard Worker
1997*495ae853SAndroid Build Coastguard Worker temp = 1 << IVD_CORRUPTEDHEADER;
1998*495ae853SAndroid Build Coastguard Worker break;
1999*495ae853SAndroid Build Coastguard Worker
2000*495ae853SAndroid Build Coastguard Worker case ERROR_EOB_FLUSHBITS_T:
2001*495ae853SAndroid Build Coastguard Worker case ERROR_EOB_GETBITS_T:
2002*495ae853SAndroid Build Coastguard Worker case ERROR_EOB_GETBIT_T:
2003*495ae853SAndroid Build Coastguard Worker case ERROR_EOB_BYPASS_T:
2004*495ae853SAndroid Build Coastguard Worker case ERROR_EOB_DECISION_T:
2005*495ae853SAndroid Build Coastguard Worker case ERROR_EOB_TERMINATE_T:
2006*495ae853SAndroid Build Coastguard Worker case ERROR_EOB_READCOEFF4X4CAB_T:
2007*495ae853SAndroid Build Coastguard Worker temp = 1 << IVD_INSUFFICIENTDATA;
2008*495ae853SAndroid Build Coastguard Worker break;
2009*495ae853SAndroid Build Coastguard Worker case ERROR_DYNAMIC_RESOLUTION_NOT_SUPPORTED:
2010*495ae853SAndroid Build Coastguard Worker case ERROR_DISP_WIDTH_RESET_TO_PIC_WIDTH:
2011*495ae853SAndroid Build Coastguard Worker temp = 1 << IVD_UNSUPPORTEDPARAM | 1 << IVD_FATALERROR;
2012*495ae853SAndroid Build Coastguard Worker break;
2013*495ae853SAndroid Build Coastguard Worker
2014*495ae853SAndroid Build Coastguard Worker case ERROR_DANGLING_FIELD_IN_PIC:
2015*495ae853SAndroid Build Coastguard Worker temp = 1 << IVD_APPLIEDCONCEALMENT;
2016*495ae853SAndroid Build Coastguard Worker break;
2017*495ae853SAndroid Build Coastguard Worker
2018*495ae853SAndroid Build Coastguard Worker }
2019*495ae853SAndroid Build Coastguard Worker
2020*495ae853SAndroid Build Coastguard Worker return temp;
2021*495ae853SAndroid Build Coastguard Worker
2022*495ae853SAndroid Build Coastguard Worker }
2023*495ae853SAndroid Build Coastguard Worker
ih264d_get_outbuf_size(WORD32 pic_wd,UWORD32 pic_ht,UWORD8 u1_chroma_format,UWORD32 * p_buf_size)2024*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_get_outbuf_size(WORD32 pic_wd,
2025*495ae853SAndroid Build Coastguard Worker UWORD32 pic_ht,
2026*495ae853SAndroid Build Coastguard Worker UWORD8 u1_chroma_format,
2027*495ae853SAndroid Build Coastguard Worker UWORD32 *p_buf_size)
2028*495ae853SAndroid Build Coastguard Worker {
2029*495ae853SAndroid Build Coastguard Worker UWORD32 u4_min_num_out_bufs = 0;
2030*495ae853SAndroid Build Coastguard Worker
2031*495ae853SAndroid Build Coastguard Worker if(u1_chroma_format == IV_YUV_420P)
2032*495ae853SAndroid Build Coastguard Worker u4_min_num_out_bufs = MIN_OUT_BUFS_420;
2033*495ae853SAndroid Build Coastguard Worker else if(u1_chroma_format == IV_YUV_422ILE)
2034*495ae853SAndroid Build Coastguard Worker u4_min_num_out_bufs = MIN_OUT_BUFS_422ILE;
2035*495ae853SAndroid Build Coastguard Worker else if(u1_chroma_format == IV_RGB_565)
2036*495ae853SAndroid Build Coastguard Worker u4_min_num_out_bufs = MIN_OUT_BUFS_RGB565;
2037*495ae853SAndroid Build Coastguard Worker else if((u1_chroma_format == IV_YUV_420SP_UV)
2038*495ae853SAndroid Build Coastguard Worker || (u1_chroma_format == IV_YUV_420SP_VU))
2039*495ae853SAndroid Build Coastguard Worker u4_min_num_out_bufs = MIN_OUT_BUFS_420SP;
2040*495ae853SAndroid Build Coastguard Worker
2041*495ae853SAndroid Build Coastguard Worker if(u1_chroma_format == IV_YUV_420P)
2042*495ae853SAndroid Build Coastguard Worker {
2043*495ae853SAndroid Build Coastguard Worker p_buf_size[0] = (pic_wd * pic_ht);
2044*495ae853SAndroid Build Coastguard Worker p_buf_size[1] = (pic_wd * pic_ht) >> 2;
2045*495ae853SAndroid Build Coastguard Worker p_buf_size[2] = (pic_wd * pic_ht) >> 2;
2046*495ae853SAndroid Build Coastguard Worker }
2047*495ae853SAndroid Build Coastguard Worker else if(u1_chroma_format == IV_YUV_422ILE)
2048*495ae853SAndroid Build Coastguard Worker {
2049*495ae853SAndroid Build Coastguard Worker p_buf_size[0] = (pic_wd * pic_ht) * 2;
2050*495ae853SAndroid Build Coastguard Worker p_buf_size[1] = p_buf_size[2] = 0;
2051*495ae853SAndroid Build Coastguard Worker }
2052*495ae853SAndroid Build Coastguard Worker else if(u1_chroma_format == IV_RGB_565)
2053*495ae853SAndroid Build Coastguard Worker {
2054*495ae853SAndroid Build Coastguard Worker p_buf_size[0] = (pic_wd * pic_ht) * 2;
2055*495ae853SAndroid Build Coastguard Worker p_buf_size[1] = p_buf_size[2] = 0;
2056*495ae853SAndroid Build Coastguard Worker }
2057*495ae853SAndroid Build Coastguard Worker else if((u1_chroma_format == IV_YUV_420SP_UV)
2058*495ae853SAndroid Build Coastguard Worker || (u1_chroma_format == IV_YUV_420SP_VU))
2059*495ae853SAndroid Build Coastguard Worker {
2060*495ae853SAndroid Build Coastguard Worker p_buf_size[0] = (pic_wd * pic_ht);
2061*495ae853SAndroid Build Coastguard Worker p_buf_size[1] = (pic_wd * pic_ht) >> 1;
2062*495ae853SAndroid Build Coastguard Worker p_buf_size[2] = 0;
2063*495ae853SAndroid Build Coastguard Worker }
2064*495ae853SAndroid Build Coastguard Worker
2065*495ae853SAndroid Build Coastguard Worker return u4_min_num_out_bufs;
2066*495ae853SAndroid Build Coastguard Worker }
2067*495ae853SAndroid Build Coastguard Worker
check_app_out_buf_size(dec_struct_t * ps_dec)2068*495ae853SAndroid Build Coastguard Worker WORD32 check_app_out_buf_size(dec_struct_t *ps_dec)
2069*495ae853SAndroid Build Coastguard Worker {
2070*495ae853SAndroid Build Coastguard Worker UWORD32 au4_min_out_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
2071*495ae853SAndroid Build Coastguard Worker UWORD32 u4_min_num_out_bufs, i;
2072*495ae853SAndroid Build Coastguard Worker UWORD32 pic_wd, pic_ht;
2073*495ae853SAndroid Build Coastguard Worker
2074*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
2075*495ae853SAndroid Build Coastguard Worker {
2076*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u2_disp_width;
2077*495ae853SAndroid Build Coastguard Worker pic_ht = ps_dec->u2_disp_height;
2078*495ae853SAndroid Build Coastguard Worker
2079*495ae853SAndroid Build Coastguard Worker }
2080*495ae853SAndroid Build Coastguard Worker else
2081*495ae853SAndroid Build Coastguard Worker {
2082*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u2_frm_wd_y;
2083*495ae853SAndroid Build Coastguard Worker pic_ht = ps_dec->u2_frm_ht_y;
2084*495ae853SAndroid Build Coastguard Worker }
2085*495ae853SAndroid Build Coastguard Worker
2086*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_app_disp_width > pic_wd)
2087*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u4_app_disp_width;
2088*495ae853SAndroid Build Coastguard Worker
2089*495ae853SAndroid Build Coastguard Worker u4_min_num_out_bufs = ih264d_get_outbuf_size(pic_wd, pic_ht,
2090*495ae853SAndroid Build Coastguard Worker ps_dec->u1_chroma_format,
2091*495ae853SAndroid Build Coastguard Worker &au4_min_out_buf_size[0]);
2092*495ae853SAndroid Build Coastguard Worker
2093*495ae853SAndroid Build Coastguard Worker
2094*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
2095*495ae853SAndroid Build Coastguard Worker {
2096*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_out_buffer->u4_num_bufs < u4_min_num_out_bufs)
2097*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2098*495ae853SAndroid Build Coastguard Worker
2099*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u4_min_num_out_bufs; i++)
2100*495ae853SAndroid Build Coastguard Worker {
2101*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_out_buffer->u4_min_out_buf_size[i]
2102*495ae853SAndroid Build Coastguard Worker < au4_min_out_buf_size[i])
2103*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2104*495ae853SAndroid Build Coastguard Worker }
2105*495ae853SAndroid Build Coastguard Worker }
2106*495ae853SAndroid Build Coastguard Worker else
2107*495ae853SAndroid Build Coastguard Worker {
2108*495ae853SAndroid Build Coastguard Worker if(ps_dec->disp_bufs[0].u4_num_bufs < u4_min_num_out_bufs)
2109*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2110*495ae853SAndroid Build Coastguard Worker
2111*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u4_min_num_out_bufs; i++)
2112*495ae853SAndroid Build Coastguard Worker {
2113*495ae853SAndroid Build Coastguard Worker /* We need to check only with the disp_buffer[0], because we have
2114*495ae853SAndroid Build Coastguard Worker * already ensured that all the buffers are of the same size in
2115*495ae853SAndroid Build Coastguard Worker * ih264d_set_display_frame.
2116*495ae853SAndroid Build Coastguard Worker */
2117*495ae853SAndroid Build Coastguard Worker if(ps_dec->disp_bufs[0].u4_bufsize[i] < au4_min_out_buf_size[i])
2118*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2119*495ae853SAndroid Build Coastguard Worker }
2120*495ae853SAndroid Build Coastguard Worker
2121*495ae853SAndroid Build Coastguard Worker }
2122*495ae853SAndroid Build Coastguard Worker
2123*495ae853SAndroid Build Coastguard Worker return (IV_SUCCESS);
2124*495ae853SAndroid Build Coastguard Worker }
2125*495ae853SAndroid Build Coastguard Worker
2126*495ae853SAndroid Build Coastguard Worker
2127*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2128*495ae853SAndroid Build Coastguard Worker /* */
2129*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_video_decode */
2130*495ae853SAndroid Build Coastguard Worker /* */
2131*495ae853SAndroid Build Coastguard Worker /* Description : handle video decode API command */
2132*495ae853SAndroid Build Coastguard Worker /* */
2133*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
2134*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
2135*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
2136*495ae853SAndroid Build Coastguard Worker /* Outputs : */
2137*495ae853SAndroid Build Coastguard Worker /* Returns : void */
2138*495ae853SAndroid Build Coastguard Worker /* */
2139*495ae853SAndroid Build Coastguard Worker /* Issues : none */
2140*495ae853SAndroid Build Coastguard Worker /* */
2141*495ae853SAndroid Build Coastguard Worker /* Revision History: */
2142*495ae853SAndroid Build Coastguard Worker /* */
2143*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2144*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
2145*495ae853SAndroid Build Coastguard Worker /* */
2146*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2147*495ae853SAndroid Build Coastguard Worker
ih264d_video_decode(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)2148*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
2149*495ae853SAndroid Build Coastguard Worker {
2150*495ae853SAndroid Build Coastguard Worker /* ! */
2151*495ae853SAndroid Build Coastguard Worker
2152*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
2153*495ae853SAndroid Build Coastguard Worker
2154*495ae853SAndroid Build Coastguard Worker WORD32 i4_err_status = 0;
2155*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf = NULL;
2156*495ae853SAndroid Build Coastguard Worker WORD32 buflen;
2157*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_ofst, u4_length_of_start_code = 0;
2158*495ae853SAndroid Build Coastguard Worker
2159*495ae853SAndroid Build Coastguard Worker UWORD32 bytes_consumed = 0;
2160*495ae853SAndroid Build Coastguard Worker UWORD32 cur_slice_is_nonref = 0;
2161*495ae853SAndroid Build Coastguard Worker UWORD32 u4_next_is_aud;
2162*495ae853SAndroid Build Coastguard Worker UWORD32 u4_first_start_code_found = 0;
2163*495ae853SAndroid Build Coastguard Worker WORD32 ret = 0,api_ret_value = IV_SUCCESS;
2164*495ae853SAndroid Build Coastguard Worker WORD32 header_data_left = 0,frame_data_left = 0;
2165*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_bitstrm_buf;
2166*495ae853SAndroid Build Coastguard Worker ih264d_video_decode_ip_t *ps_h264d_dec_ip;
2167*495ae853SAndroid Build Coastguard Worker ih264d_video_decode_op_t *ps_h264d_dec_op;
2168*495ae853SAndroid Build Coastguard Worker ivd_video_decode_ip_t *ps_dec_ip;
2169*495ae853SAndroid Build Coastguard Worker ivd_video_decode_op_t *ps_dec_op;
2170*495ae853SAndroid Build Coastguard Worker
2171*495ae853SAndroid Build Coastguard Worker ithread_set_name((void*)"Parse_thread");
2172*495ae853SAndroid Build Coastguard Worker
2173*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_ip = (ih264d_video_decode_ip_t *)pv_api_ip;
2174*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op = (ih264d_video_decode_op_t *)pv_api_op;
2175*495ae853SAndroid Build Coastguard Worker ps_dec_ip = &ps_h264d_dec_ip->s_ivd_video_decode_ip_t;
2176*495ae853SAndroid Build Coastguard Worker ps_dec_op = &ps_h264d_dec_op->s_ivd_video_decode_op_t;
2177*495ae853SAndroid Build Coastguard Worker
2178*495ae853SAndroid Build Coastguard Worker {
2179*495ae853SAndroid Build Coastguard Worker UWORD32 u4_size;
2180*495ae853SAndroid Build Coastguard Worker u4_size = ps_dec_op->u4_size;
2181*495ae853SAndroid Build Coastguard Worker memset(ps_h264d_dec_op, 0, ps_dec_op->u4_size);
2182*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_size = u4_size;
2183*495ae853SAndroid Build Coastguard Worker }
2184*495ae853SAndroid Build Coastguard Worker
2185*495ae853SAndroid Build Coastguard Worker ps_dec->pv_dec_out = ps_dec_op;
2186*495ae853SAndroid Build Coastguard Worker if(ps_dec->init_done != 1)
2187*495ae853SAndroid Build Coastguard Worker {
2188*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2189*495ae853SAndroid Build Coastguard Worker }
2190*495ae853SAndroid Build Coastguard Worker
2191*495ae853SAndroid Build Coastguard Worker /*Data memory barries instruction,so that bitstream write by the application is complete*/
2192*495ae853SAndroid Build Coastguard Worker DATA_SYNC();
2193*495ae853SAndroid Build Coastguard Worker
2194*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u1_flushfrm)
2195*495ae853SAndroid Build Coastguard Worker {
2196*495ae853SAndroid Build Coastguard Worker if(ps_dec_ip->pv_stream_buffer == NULL)
2197*495ae853SAndroid Build Coastguard Worker {
2198*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
2199*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= IVD_DEC_FRM_BS_BUF_NULL;
2200*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2201*495ae853SAndroid Build Coastguard Worker }
2202*495ae853SAndroid Build Coastguard Worker if(ps_dec_ip->u4_num_Bytes <= 0)
2203*495ae853SAndroid Build Coastguard Worker {
2204*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
2205*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= IVD_DEC_NUMBYTES_INV;
2206*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2207*495ae853SAndroid Build Coastguard Worker
2208*495ae853SAndroid Build Coastguard Worker }
2209*495ae853SAndroid Build Coastguard Worker }
2210*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_decode_done = 0;
2211*495ae853SAndroid Build Coastguard Worker
2212*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
2213*495ae853SAndroid Build Coastguard Worker {
2214*495ae853SAndroid Build Coastguard Worker UWORD32 i;
2215*495ae853SAndroid Build Coastguard Worker ps_dec->i4_break_threads = 0;
2216*495ae853SAndroid Build Coastguard Worker for (i = 0; i < 2; i++)
2217*495ae853SAndroid Build Coastguard Worker {
2218*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[i]);
2219*495ae853SAndroid Build Coastguard Worker RETURN_IF((ret != IV_SUCCESS), ret);
2220*495ae853SAndroid Build Coastguard Worker
2221*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_start[i] = PROC_INIT;
2222*495ae853SAndroid Build Coastguard Worker
2223*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[i]);
2224*495ae853SAndroid Build Coastguard Worker RETURN_IF((ret != IV_SUCCESS), ret);
2225*495ae853SAndroid Build Coastguard Worker }
2226*495ae853SAndroid Build Coastguard Worker }
2227*495ae853SAndroid Build Coastguard Worker else {
2228*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dec_thread_created = 0;
2229*495ae853SAndroid Build Coastguard Worker ps_dec->u4_bs_deblk_thread_created = 0;
2230*495ae853SAndroid Build Coastguard Worker }
2231*495ae853SAndroid Build Coastguard Worker
2232*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_num_bytes_consumed = 0;
2233*495ae853SAndroid Build Coastguard Worker ps_dec_op->i4_reorder_depth = -1;
2234*495ae853SAndroid Build Coastguard Worker ps_dec_op->i4_display_index = DEFAULT_POC;
2235*495ae853SAndroid Build Coastguard Worker ps_dec->ps_out_buffer = NULL;
2236*495ae853SAndroid Build Coastguard Worker
2237*495ae853SAndroid Build Coastguard Worker if(ps_dec_ip->u4_size
2238*495ae853SAndroid Build Coastguard Worker >= offsetof(ivd_video_decode_ip_t, s_out_buffer))
2239*495ae853SAndroid Build Coastguard Worker ps_dec->ps_out_buffer = &ps_dec_ip->s_out_buffer;
2240*495ae853SAndroid Build Coastguard Worker
2241*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row = 0;
2242*495ae853SAndroid Build Coastguard Worker
2243*495ae853SAndroid Build Coastguard Worker ps_dec->u4_output_present = 0;
2244*495ae853SAndroid Build Coastguard Worker ps_dec->s_disp_op.u4_error_code = 1;
2245*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows = FMT_CONV_NUM_ROWS;
2246*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf
2247*495ae853SAndroid Build Coastguard Worker && ps_dec->i4_decode_header == 0)
2248*495ae853SAndroid Build Coastguard Worker {
2249*495ae853SAndroid Build Coastguard Worker UWORD32 i;
2250*495ae853SAndroid Build Coastguard Worker if((ps_dec->ps_out_buffer->u4_num_bufs == 0) ||
2251*495ae853SAndroid Build Coastguard Worker (ps_dec->ps_out_buffer->u4_num_bufs > IVD_VIDDEC_MAX_IO_BUFFERS))
2252*495ae853SAndroid Build Coastguard Worker {
2253*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
2254*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS;
2255*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2256*495ae853SAndroid Build Coastguard Worker }
2257*495ae853SAndroid Build Coastguard Worker
2258*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_dec->ps_out_buffer->u4_num_bufs; i++)
2259*495ae853SAndroid Build Coastguard Worker {
2260*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_out_buffer->pu1_bufs[i] == NULL)
2261*495ae853SAndroid Build Coastguard Worker {
2262*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
2263*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= IVD_DISP_FRM_OP_BUF_NULL;
2264*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2265*495ae853SAndroid Build Coastguard Worker }
2266*495ae853SAndroid Build Coastguard Worker
2267*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_out_buffer->u4_min_out_buf_size[i] == 0)
2268*495ae853SAndroid Build Coastguard Worker {
2269*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
2270*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |=
2271*495ae853SAndroid Build Coastguard Worker IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
2272*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2273*495ae853SAndroid Build Coastguard Worker }
2274*495ae853SAndroid Build Coastguard Worker }
2275*495ae853SAndroid Build Coastguard Worker }
2276*495ae853SAndroid Build Coastguard Worker
2277*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_total_frames_decoded >= NUM_FRAMES_LIMIT)
2278*495ae853SAndroid Build Coastguard Worker {
2279*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code = ERROR_FRAME_LIMIT_OVER;
2280*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2281*495ae853SAndroid Build Coastguard Worker }
2282*495ae853SAndroid Build Coastguard Worker
2283*495ae853SAndroid Build Coastguard Worker /* ! */
2284*495ae853SAndroid Build Coastguard Worker ps_dec->u4_ts = ps_dec_ip->u4_ts;
2285*495ae853SAndroid Build Coastguard Worker
2286*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code = 0;
2287*495ae853SAndroid Build Coastguard Worker ps_dec_op->e_pic_type = IV_NA_FRAME;
2288*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_output_present = 0;
2289*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_frame_decoded_flag = 0;
2290*495ae853SAndroid Build Coastguard Worker
2291*495ae853SAndroid Build Coastguard Worker ps_dec->i4_frametype = IV_NA_FRAME;
2292*495ae853SAndroid Build Coastguard Worker ps_dec->i4_content_type = IV_CONTENTTYPE_NA;
2293*495ae853SAndroid Build Coastguard Worker
2294*495ae853SAndroid Build Coastguard Worker ps_dec->u4_slice_start_code_found = 0;
2295*495ae853SAndroid Build Coastguard Worker
2296*495ae853SAndroid Build Coastguard Worker /* In case the decoder is not in flush mode(in shared mode),
2297*495ae853SAndroid Build Coastguard Worker then decoder has to pick up a buffer to write current frame.
2298*495ae853SAndroid Build Coastguard Worker Check if a frame is available in such cases */
2299*495ae853SAndroid Build Coastguard Worker
2300*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_init_dec_flag == 1 && ps_dec->u4_share_disp_buf == 1
2301*495ae853SAndroid Build Coastguard Worker && ps_dec->u1_flushfrm == 0)
2302*495ae853SAndroid Build Coastguard Worker {
2303*495ae853SAndroid Build Coastguard Worker UWORD32 i;
2304*495ae853SAndroid Build Coastguard Worker
2305*495ae853SAndroid Build Coastguard Worker WORD32 disp_avail = 0, free_id;
2306*495ae853SAndroid Build Coastguard Worker
2307*495ae853SAndroid Build Coastguard Worker /* Check if at least one buffer is available with the codec */
2308*495ae853SAndroid Build Coastguard Worker /* If not then return to application with error */
2309*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_dec->u1_pic_bufs; i++)
2310*495ae853SAndroid Build Coastguard Worker {
2311*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_disp_buf_mapping[i]
2312*495ae853SAndroid Build Coastguard Worker || 1 == ps_dec->u4_disp_buf_to_be_freed[i])
2313*495ae853SAndroid Build Coastguard Worker {
2314*495ae853SAndroid Build Coastguard Worker disp_avail = 1;
2315*495ae853SAndroid Build Coastguard Worker break;
2316*495ae853SAndroid Build Coastguard Worker }
2317*495ae853SAndroid Build Coastguard Worker
2318*495ae853SAndroid Build Coastguard Worker }
2319*495ae853SAndroid Build Coastguard Worker
2320*495ae853SAndroid Build Coastguard Worker if(0 == disp_avail)
2321*495ae853SAndroid Build Coastguard Worker {
2322*495ae853SAndroid Build Coastguard Worker /* If something is queued for display wait for that buffer to be returned */
2323*495ae853SAndroid Build Coastguard Worker
2324*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code = IVD_DEC_REF_BUF_NULL;
2325*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= (1 << IVD_UNSUPPORTEDPARAM);
2326*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2327*495ae853SAndroid Build Coastguard Worker }
2328*495ae853SAndroid Build Coastguard Worker
2329*495ae853SAndroid Build Coastguard Worker while(1)
2330*495ae853SAndroid Build Coastguard Worker {
2331*495ae853SAndroid Build Coastguard Worker pic_buffer_t *ps_pic_buf;
2332*495ae853SAndroid Build Coastguard Worker ps_pic_buf = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
2333*495ae853SAndroid Build Coastguard Worker (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, &free_id);
2334*495ae853SAndroid Build Coastguard Worker
2335*495ae853SAndroid Build Coastguard Worker if(ps_pic_buf == NULL)
2336*495ae853SAndroid Build Coastguard Worker {
2337*495ae853SAndroid Build Coastguard Worker UWORD32 display_queued = 0;
2338*495ae853SAndroid Build Coastguard Worker
2339*495ae853SAndroid Build Coastguard Worker /* check if any buffer was given for display which is not returned yet */
2340*495ae853SAndroid Build Coastguard Worker for(i = 0; i < (MAX_DISP_BUFS_NEW); i++)
2341*495ae853SAndroid Build Coastguard Worker {
2342*495ae853SAndroid Build Coastguard Worker if(0 != ps_dec->u4_disp_buf_mapping[i])
2343*495ae853SAndroid Build Coastguard Worker {
2344*495ae853SAndroid Build Coastguard Worker display_queued = 1;
2345*495ae853SAndroid Build Coastguard Worker break;
2346*495ae853SAndroid Build Coastguard Worker }
2347*495ae853SAndroid Build Coastguard Worker }
2348*495ae853SAndroid Build Coastguard Worker /* If some buffer is queued for display, then codec has to singal an error and wait
2349*495ae853SAndroid Build Coastguard Worker for that buffer to be returned.
2350*495ae853SAndroid Build Coastguard Worker If nothing is queued for display then codec has ownership of all display buffers
2351*495ae853SAndroid Build Coastguard Worker and it can reuse any of the existing buffers and continue decoding */
2352*495ae853SAndroid Build Coastguard Worker
2353*495ae853SAndroid Build Coastguard Worker if(1 == display_queued)
2354*495ae853SAndroid Build Coastguard Worker {
2355*495ae853SAndroid Build Coastguard Worker /* If something is queued for display wait for that buffer to be returned */
2356*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code = IVD_DEC_REF_BUF_NULL;
2357*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= (1
2358*495ae853SAndroid Build Coastguard Worker << IVD_UNSUPPORTEDPARAM);
2359*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2360*495ae853SAndroid Build Coastguard Worker }
2361*495ae853SAndroid Build Coastguard Worker }
2362*495ae853SAndroid Build Coastguard Worker else
2363*495ae853SAndroid Build Coastguard Worker {
2364*495ae853SAndroid Build Coastguard Worker /* If the buffer is with display, then mark it as in use and then look for a buffer again */
2365*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u4_disp_buf_mapping[free_id])
2366*495ae853SAndroid Build Coastguard Worker {
2367*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_set_status(
2368*495ae853SAndroid Build Coastguard Worker (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
2369*495ae853SAndroid Build Coastguard Worker free_id,
2370*495ae853SAndroid Build Coastguard Worker BUF_MGR_IO);
2371*495ae853SAndroid Build Coastguard Worker }
2372*495ae853SAndroid Build Coastguard Worker else
2373*495ae853SAndroid Build Coastguard Worker {
2374*495ae853SAndroid Build Coastguard Worker /**
2375*495ae853SAndroid Build Coastguard Worker * Found a free buffer for present call. Release it now.
2376*495ae853SAndroid Build Coastguard Worker * Will be again obtained later.
2377*495ae853SAndroid Build Coastguard Worker */
2378*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
2379*495ae853SAndroid Build Coastguard Worker free_id,
2380*495ae853SAndroid Build Coastguard Worker BUF_MGR_IO);
2381*495ae853SAndroid Build Coastguard Worker break;
2382*495ae853SAndroid Build Coastguard Worker }
2383*495ae853SAndroid Build Coastguard Worker }
2384*495ae853SAndroid Build Coastguard Worker }
2385*495ae853SAndroid Build Coastguard Worker
2386*495ae853SAndroid Build Coastguard Worker }
2387*495ae853SAndroid Build Coastguard Worker
2388*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_enable_mb_info && (ps_dec->i4_header_decoded & DECODED_SPS_MASK))
2389*495ae853SAndroid Build Coastguard Worker {
2390*495ae853SAndroid Build Coastguard Worker UWORD32 blk_qp_map_size = ps_h264d_dec_ip->u4_8x8_blk_qp_map_size;
2391*495ae853SAndroid Build Coastguard Worker UWORD32 blk_type_map_size = ps_h264d_dec_ip->u4_8x8_blk_type_map_size;
2392*495ae853SAndroid Build Coastguard Worker UWORD32 blk_8x8_map_size = ps_dec->u4_total_mbs << 2;
2393*495ae853SAndroid Build Coastguard Worker if ((ps_h264d_dec_ip->pu1_8x8_blk_qp_map && blk_qp_map_size < blk_8x8_map_size) ||
2394*495ae853SAndroid Build Coastguard Worker (ps_h264d_dec_ip->pu1_8x8_blk_type_map && blk_type_map_size < blk_8x8_map_size))
2395*495ae853SAndroid Build Coastguard Worker {
2396*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
2397*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= IH264D_INSUFFICIENT_METADATA_BUFFER;
2398*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2399*495ae853SAndroid Build Coastguard Worker }
2400*495ae853SAndroid Build Coastguard Worker }
2401*495ae853SAndroid Build Coastguard Worker
2402*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_flushfrm)
2403*495ae853SAndroid Build Coastguard Worker {
2404*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_init_dec_flag == 0)
2405*495ae853SAndroid Build Coastguard Worker {
2406*495ae853SAndroid Build Coastguard Worker /*Come out of flush mode and return*/
2407*495ae853SAndroid Build Coastguard Worker ps_dec->u1_flushfrm = 0;
2408*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2409*495ae853SAndroid Build Coastguard Worker }
2410*495ae853SAndroid Build Coastguard Worker
2411*495ae853SAndroid Build Coastguard Worker
2412*495ae853SAndroid Build Coastguard Worker
2413*495ae853SAndroid Build Coastguard Worker ih264d_get_next_display_field(ps_dec, ps_dec->ps_out_buffer,
2414*495ae853SAndroid Build Coastguard Worker &(ps_dec->s_disp_op));
2415*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_disp_op.u4_error_code)
2416*495ae853SAndroid Build Coastguard Worker {
2417*495ae853SAndroid Build Coastguard Worker /* check output buffer size given by the application */
2418*495ae853SAndroid Build Coastguard Worker if(check_app_out_buf_size(ps_dec) != IV_SUCCESS)
2419*495ae853SAndroid Build Coastguard Worker {
2420*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code= IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
2421*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2422*495ae853SAndroid Build Coastguard Worker }
2423*495ae853SAndroid Build Coastguard Worker
2424*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row = 0;
2425*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows = ps_dec->s_disp_frame_info.u4_y_ht;
2426*495ae853SAndroid Build Coastguard Worker ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op),
2427*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row,
2428*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows);
2429*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
2430*495ae853SAndroid Build Coastguard Worker ps_dec->u4_output_present = 1;
2431*495ae853SAndroid Build Coastguard Worker
2432*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_enable_mb_info)
2433*495ae853SAndroid Build Coastguard Worker {
2434*495ae853SAndroid Build Coastguard Worker UWORD32 disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
2435*495ae853SAndroid Build Coastguard Worker if(ps_h264d_dec_ip->pu1_8x8_blk_qp_map)
2436*495ae853SAndroid Build Coastguard Worker {
2437*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op->pu1_8x8_blk_qp_map = ps_h264d_dec_ip->pu1_8x8_blk_qp_map;
2438*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op->u4_8x8_blk_qp_map_size = ps_dec->u4_total_mbs << 2;
2439*495ae853SAndroid Build Coastguard Worker ih264_memcpy(ps_h264d_dec_op->pu1_8x8_blk_qp_map,
2440*495ae853SAndroid Build Coastguard Worker ps_dec->as_buf_id_info_map[disp_buf_id].pu1_qp_map,
2441*495ae853SAndroid Build Coastguard Worker ps_dec->u4_total_mbs << 2);
2442*495ae853SAndroid Build Coastguard Worker }
2443*495ae853SAndroid Build Coastguard Worker if(ps_h264d_dec_ip->pu1_8x8_blk_type_map)
2444*495ae853SAndroid Build Coastguard Worker {
2445*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op->pu1_8x8_blk_type_map = ps_h264d_dec_ip->pu1_8x8_blk_type_map;
2446*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op->u4_8x8_blk_type_map_size = ps_dec->u4_total_mbs << 2;
2447*495ae853SAndroid Build Coastguard Worker ih264_memcpy(ps_h264d_dec_op->pu1_8x8_blk_type_map,
2448*495ae853SAndroid Build Coastguard Worker ps_dec->as_buf_id_info_map[disp_buf_id].pu1_mb_type_map,
2449*495ae853SAndroid Build Coastguard Worker ps_dec->u4_total_mbs << 2);
2450*495ae853SAndroid Build Coastguard Worker }
2451*495ae853SAndroid Build Coastguard Worker }
2452*495ae853SAndroid Build Coastguard Worker }
2453*495ae853SAndroid Build Coastguard Worker ih264d_export_sei_params(&ps_dec_op->s_sei_decode_op, ps_dec);
2454*495ae853SAndroid Build Coastguard Worker
2455*495ae853SAndroid Build Coastguard Worker ih264d_release_display_field(ps_dec, &(ps_dec->s_disp_op));
2456*495ae853SAndroid Build Coastguard Worker
2457*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_pic_wd = (UWORD32)ps_dec->u2_disp_width;
2458*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_pic_ht = (UWORD32)ps_dec->u2_disp_height;
2459*495ae853SAndroid Build Coastguard Worker ps_dec_op->i4_reorder_depth = ps_dec->i4_reorder_depth;
2460*495ae853SAndroid Build Coastguard Worker ps_dec_op->i4_display_index = ps_dec->i4_display_index;
2461*495ae853SAndroid Build Coastguard Worker
2462*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_new_seq = 0;
2463*495ae853SAndroid Build Coastguard Worker
2464*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_output_present = ps_dec->u4_output_present;
2465*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_progressive_frame_flag =
2466*495ae853SAndroid Build Coastguard Worker ps_dec->s_disp_op.u4_progressive_frame_flag;
2467*495ae853SAndroid Build Coastguard Worker ps_dec_op->e_output_format =
2468*495ae853SAndroid Build Coastguard Worker ps_dec->s_disp_op.e_output_format;
2469*495ae853SAndroid Build Coastguard Worker ps_dec_op->s_disp_frm_buf = ps_dec->s_disp_op.s_disp_frm_buf;
2470*495ae853SAndroid Build Coastguard Worker ps_dec_op->e4_fld_type = ps_dec->s_disp_op.e4_fld_type;
2471*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_ts = ps_dec->s_disp_op.u4_ts;
2472*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
2473*495ae853SAndroid Build Coastguard Worker
2474*495ae853SAndroid Build Coastguard Worker /*In the case of flush ,since no frame is decoded set pic type as invalid*/
2475*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_is_ref_flag = -1;
2476*495ae853SAndroid Build Coastguard Worker ps_dec_op->e_pic_type = IV_NA_FRAME;
2477*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_frame_decoded_flag = 0;
2478*495ae853SAndroid Build Coastguard Worker
2479*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_disp_op.u4_error_code)
2480*495ae853SAndroid Build Coastguard Worker {
2481*495ae853SAndroid Build Coastguard Worker return (IV_SUCCESS);
2482*495ae853SAndroid Build Coastguard Worker }
2483*495ae853SAndroid Build Coastguard Worker else
2484*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2485*495ae853SAndroid Build Coastguard Worker
2486*495ae853SAndroid Build Coastguard Worker }
2487*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_res_changed == 1)
2488*495ae853SAndroid Build Coastguard Worker {
2489*495ae853SAndroid Build Coastguard Worker /*if resolution has changed and all buffers have been flushed, reset decoder*/
2490*495ae853SAndroid Build Coastguard Worker ih264d_init_decoder(ps_dec);
2491*495ae853SAndroid Build Coastguard Worker }
2492*495ae853SAndroid Build Coastguard Worker
2493*495ae853SAndroid Build Coastguard Worker ps_dec->u2_cur_mb_addr = 0;
2494*495ae853SAndroid Build Coastguard Worker ps_dec->u2_total_mbs_coded = 0;
2495*495ae853SAndroid Build Coastguard Worker ps_dec->u2_cur_slice_num = 0;
2496*495ae853SAndroid Build Coastguard Worker ps_dec->cur_dec_mb_num = 0;
2497*495ae853SAndroid Build Coastguard Worker ps_dec->cur_recon_mb_num = 0;
2498*495ae853SAndroid Build Coastguard Worker ps_dec->u4_first_slice_in_pic = 1;
2499*495ae853SAndroid Build Coastguard Worker ps_dec->u1_slice_header_done = 0;
2500*495ae853SAndroid Build Coastguard Worker ps_dec->u1_dangling_field = 0;
2501*495ae853SAndroid Build Coastguard Worker ps_dec->u4_cur_bs_mb_num = 0;
2502*495ae853SAndroid Build Coastguard Worker ps_dec->u4_start_recon_deblk = 0;
2503*495ae853SAndroid Build Coastguard Worker ps_dec->u4_sps_cnt_in_process = 0;
2504*495ae853SAndroid Build Coastguard Worker
2505*495ae853SAndroid Build Coastguard Worker DEBUG_THREADS_PRINTF(" Starting process call\n");
2506*495ae853SAndroid Build Coastguard Worker
2507*495ae853SAndroid Build Coastguard Worker
2508*495ae853SAndroid Build Coastguard Worker ps_dec->u4_pic_buf_got = 0;
2509*495ae853SAndroid Build Coastguard Worker
2510*495ae853SAndroid Build Coastguard Worker do
2511*495ae853SAndroid Build Coastguard Worker {
2512*495ae853SAndroid Build Coastguard Worker WORD32 buf_size;
2513*495ae853SAndroid Build Coastguard Worker
2514*495ae853SAndroid Build Coastguard Worker pu1_buf = (UWORD8*)ps_dec_ip->pv_stream_buffer
2515*495ae853SAndroid Build Coastguard Worker + ps_dec_op->u4_num_bytes_consumed;
2516*495ae853SAndroid Build Coastguard Worker
2517*495ae853SAndroid Build Coastguard Worker u4_max_ofst = ps_dec_ip->u4_num_Bytes
2518*495ae853SAndroid Build Coastguard Worker - ps_dec_op->u4_num_bytes_consumed;
2519*495ae853SAndroid Build Coastguard Worker
2520*495ae853SAndroid Build Coastguard Worker /* If dynamic bitstream buffer is not allocated and
2521*495ae853SAndroid Build Coastguard Worker * header decode is done, then allocate dynamic bitstream buffer
2522*495ae853SAndroid Build Coastguard Worker */
2523*495ae853SAndroid Build Coastguard Worker if((NULL == ps_dec->pu1_bits_buf_dynamic) &&
2524*495ae853SAndroid Build Coastguard Worker (ps_dec->i4_header_decoded & 1))
2525*495ae853SAndroid Build Coastguard Worker {
2526*495ae853SAndroid Build Coastguard Worker WORD32 size;
2527*495ae853SAndroid Build Coastguard Worker
2528*495ae853SAndroid Build Coastguard Worker void *pv_buf;
2529*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
2530*495ae853SAndroid Build Coastguard Worker size = MAX(256000, ps_dec->u2_pic_wd * ps_dec->u2_pic_ht * 3 / 2);
2531*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128,
2532*495ae853SAndroid Build Coastguard Worker size + EXTRA_BS_OFFSET);
2533*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2534*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size + EXTRA_BS_OFFSET);
2535*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_bits_buf_dynamic = pv_buf;
2536*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dynamic_bits_buf_size = size;
2537*495ae853SAndroid Build Coastguard Worker }
2538*495ae853SAndroid Build Coastguard Worker
2539*495ae853SAndroid Build Coastguard Worker if(ps_dec->pu1_bits_buf_dynamic)
2540*495ae853SAndroid Build Coastguard Worker {
2541*495ae853SAndroid Build Coastguard Worker pu1_bitstrm_buf = ps_dec->pu1_bits_buf_dynamic;
2542*495ae853SAndroid Build Coastguard Worker buf_size = ps_dec->u4_dynamic_bits_buf_size;
2543*495ae853SAndroid Build Coastguard Worker }
2544*495ae853SAndroid Build Coastguard Worker else
2545*495ae853SAndroid Build Coastguard Worker {
2546*495ae853SAndroid Build Coastguard Worker pu1_bitstrm_buf = ps_dec->pu1_bits_buf_static;
2547*495ae853SAndroid Build Coastguard Worker buf_size = ps_dec->u4_static_bits_buf_size;
2548*495ae853SAndroid Build Coastguard Worker }
2549*495ae853SAndroid Build Coastguard Worker
2550*495ae853SAndroid Build Coastguard Worker u4_next_is_aud = 0;
2551*495ae853SAndroid Build Coastguard Worker
2552*495ae853SAndroid Build Coastguard Worker buflen = ih264d_find_start_code(pu1_buf, 0, u4_max_ofst,
2553*495ae853SAndroid Build Coastguard Worker &u4_length_of_start_code,
2554*495ae853SAndroid Build Coastguard Worker &u4_next_is_aud);
2555*495ae853SAndroid Build Coastguard Worker
2556*495ae853SAndroid Build Coastguard Worker if(buflen == -1)
2557*495ae853SAndroid Build Coastguard Worker buflen = 0;
2558*495ae853SAndroid Build Coastguard Worker /* Ignore bytes beyond the allocated size of intermediate buffer */
2559*495ae853SAndroid Build Coastguard Worker /* Since 8 bytes are read ahead, ensure 8 bytes are free at the
2560*495ae853SAndroid Build Coastguard Worker end of the buffer, which will be memset to 0 after emulation prevention */
2561*495ae853SAndroid Build Coastguard Worker buflen = MIN(buflen, buf_size - 8);
2562*495ae853SAndroid Build Coastguard Worker
2563*495ae853SAndroid Build Coastguard Worker bytes_consumed = buflen + u4_length_of_start_code;
2564*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_num_bytes_consumed += bytes_consumed;
2565*495ae853SAndroid Build Coastguard Worker
2566*495ae853SAndroid Build Coastguard Worker if(buflen)
2567*495ae853SAndroid Build Coastguard Worker {
2568*495ae853SAndroid Build Coastguard Worker memcpy(pu1_bitstrm_buf, pu1_buf + u4_length_of_start_code,
2569*495ae853SAndroid Build Coastguard Worker buflen);
2570*495ae853SAndroid Build Coastguard Worker /* Decoder may read extra 8 bytes near end of the frame */
2571*495ae853SAndroid Build Coastguard Worker if((buflen + 8) < buf_size)
2572*495ae853SAndroid Build Coastguard Worker {
2573*495ae853SAndroid Build Coastguard Worker memset(pu1_bitstrm_buf + buflen, 0, 8);
2574*495ae853SAndroid Build Coastguard Worker }
2575*495ae853SAndroid Build Coastguard Worker u4_first_start_code_found = 1;
2576*495ae853SAndroid Build Coastguard Worker
2577*495ae853SAndroid Build Coastguard Worker }
2578*495ae853SAndroid Build Coastguard Worker else
2579*495ae853SAndroid Build Coastguard Worker {
2580*495ae853SAndroid Build Coastguard Worker /*start code not found*/
2581*495ae853SAndroid Build Coastguard Worker
2582*495ae853SAndroid Build Coastguard Worker if(u4_first_start_code_found == 0)
2583*495ae853SAndroid Build Coastguard Worker {
2584*495ae853SAndroid Build Coastguard Worker /*no start codes found in current process call*/
2585*495ae853SAndroid Build Coastguard Worker
2586*495ae853SAndroid Build Coastguard Worker ps_dec->i4_error_code = ERROR_START_CODE_NOT_FOUND;
2587*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= 1 << IVD_INSUFFICIENTDATA;
2588*495ae853SAndroid Build Coastguard Worker
2589*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_pic_buf_got == 0)
2590*495ae853SAndroid Build Coastguard Worker {
2591*495ae853SAndroid Build Coastguard Worker
2592*495ae853SAndroid Build Coastguard Worker ih264d_fill_output_struct_from_context(ps_dec,
2593*495ae853SAndroid Build Coastguard Worker ps_dec_op);
2594*495ae853SAndroid Build Coastguard Worker
2595*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code = ps_dec->i4_error_code;
2596*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_frame_decoded_flag = 0;
2597*495ae853SAndroid Build Coastguard Worker
2598*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2599*495ae853SAndroid Build Coastguard Worker }
2600*495ae853SAndroid Build Coastguard Worker else
2601*495ae853SAndroid Build Coastguard Worker {
2602*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_decode_done = 1;
2603*495ae853SAndroid Build Coastguard Worker continue;
2604*495ae853SAndroid Build Coastguard Worker }
2605*495ae853SAndroid Build Coastguard Worker }
2606*495ae853SAndroid Build Coastguard Worker else
2607*495ae853SAndroid Build Coastguard Worker {
2608*495ae853SAndroid Build Coastguard Worker /* a start code has already been found earlier in the same process call*/
2609*495ae853SAndroid Build Coastguard Worker frame_data_left = 0;
2610*495ae853SAndroid Build Coastguard Worker header_data_left = 0;
2611*495ae853SAndroid Build Coastguard Worker continue;
2612*495ae853SAndroid Build Coastguard Worker }
2613*495ae853SAndroid Build Coastguard Worker
2614*495ae853SAndroid Build Coastguard Worker }
2615*495ae853SAndroid Build Coastguard Worker
2616*495ae853SAndroid Build Coastguard Worker ret = ih264d_parse_nal_unit(dec_hdl, ps_dec_op,
2617*495ae853SAndroid Build Coastguard Worker pu1_bitstrm_buf, buflen);
2618*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2619*495ae853SAndroid Build Coastguard Worker {
2620*495ae853SAndroid Build Coastguard Worker UWORD32 error = ih264d_map_error(ret);
2621*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code = error | ret;
2622*495ae853SAndroid Build Coastguard Worker api_ret_value = IV_FAIL;
2623*495ae853SAndroid Build Coastguard Worker
2624*495ae853SAndroid Build Coastguard Worker if((ret == IVD_RES_CHANGED)
2625*495ae853SAndroid Build Coastguard Worker || (ret == IVD_MEM_ALLOC_FAILED)
2626*495ae853SAndroid Build Coastguard Worker || (ret == ERROR_UNAVAIL_PICBUF_T)
2627*495ae853SAndroid Build Coastguard Worker || (ret == ERROR_UNAVAIL_MVBUF_T)
2628*495ae853SAndroid Build Coastguard Worker || (ret == ERROR_INV_SPS_PPS_T)
2629*495ae853SAndroid Build Coastguard Worker || (ret == ERROR_FEATURE_UNAVAIL)
2630*495ae853SAndroid Build Coastguard Worker || (ret == IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED)
2631*495ae853SAndroid Build Coastguard Worker || (ret == IVD_DISP_FRM_ZERO_OP_BUF_SIZE))
2632*495ae853SAndroid Build Coastguard Worker {
2633*495ae853SAndroid Build Coastguard Worker ps_dec->u4_slice_start_code_found = 0;
2634*495ae853SAndroid Build Coastguard Worker break;
2635*495ae853SAndroid Build Coastguard Worker }
2636*495ae853SAndroid Build Coastguard Worker
2637*495ae853SAndroid Build Coastguard Worker if((ret == ERROR_INCOMPLETE_FRAME) || (ret == ERROR_DANGLING_FIELD_IN_PIC))
2638*495ae853SAndroid Build Coastguard Worker {
2639*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_num_bytes_consumed -= bytes_consumed;
2640*495ae853SAndroid Build Coastguard Worker api_ret_value = IV_FAIL;
2641*495ae853SAndroid Build Coastguard Worker break;
2642*495ae853SAndroid Build Coastguard Worker }
2643*495ae853SAndroid Build Coastguard Worker
2644*495ae853SAndroid Build Coastguard Worker if(ret == ERROR_IN_LAST_SLICE_OF_PIC)
2645*495ae853SAndroid Build Coastguard Worker {
2646*495ae853SAndroid Build Coastguard Worker api_ret_value = IV_FAIL;
2647*495ae853SAndroid Build Coastguard Worker break;
2648*495ae853SAndroid Build Coastguard Worker }
2649*495ae853SAndroid Build Coastguard Worker
2650*495ae853SAndroid Build Coastguard Worker }
2651*495ae853SAndroid Build Coastguard Worker
2652*495ae853SAndroid Build Coastguard Worker header_data_left = ((ps_dec->i4_decode_header == 1)
2653*495ae853SAndroid Build Coastguard Worker && (ps_dec->i4_header_decoded != 3)
2654*495ae853SAndroid Build Coastguard Worker && (ps_dec_op->u4_num_bytes_consumed
2655*495ae853SAndroid Build Coastguard Worker < ps_dec_ip->u4_num_Bytes));
2656*495ae853SAndroid Build Coastguard Worker frame_data_left = (((ps_dec->i4_decode_header == 0)
2657*495ae853SAndroid Build Coastguard Worker && ((ps_dec->u1_pic_decode_done == 0)
2658*495ae853SAndroid Build Coastguard Worker || (u4_next_is_aud == 1)))
2659*495ae853SAndroid Build Coastguard Worker && (ps_dec_op->u4_num_bytes_consumed
2660*495ae853SAndroid Build Coastguard Worker < ps_dec_ip->u4_num_Bytes));
2661*495ae853SAndroid Build Coastguard Worker }
2662*495ae853SAndroid Build Coastguard Worker while(( header_data_left == 1)||(frame_data_left == 1));
2663*495ae853SAndroid Build Coastguard Worker
2664*495ae853SAndroid Build Coastguard Worker if((ps_dec->u4_pic_buf_got == 1)
2665*495ae853SAndroid Build Coastguard Worker && (ret != IVD_MEM_ALLOC_FAILED)
2666*495ae853SAndroid Build Coastguard Worker && ps_dec->u2_total_mbs_coded < ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
2667*495ae853SAndroid Build Coastguard Worker {
2668*495ae853SAndroid Build Coastguard Worker // last slice - missing/corruption
2669*495ae853SAndroid Build Coastguard Worker WORD32 num_mb_skipped;
2670*495ae853SAndroid Build Coastguard Worker WORD32 prev_slice_err;
2671*495ae853SAndroid Build Coastguard Worker pocstruct_t temp_poc;
2672*495ae853SAndroid Build Coastguard Worker WORD32 ret1;
2673*495ae853SAndroid Build Coastguard Worker WORD32 ht_in_mbs;
2674*495ae853SAndroid Build Coastguard Worker ht_in_mbs = ps_dec->u2_pic_ht >> (4 + ps_dec->ps_cur_slice->u1_field_pic_flag);
2675*495ae853SAndroid Build Coastguard Worker num_mb_skipped = (ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
2676*495ae853SAndroid Build Coastguard Worker - ps_dec->u2_total_mbs_coded;
2677*495ae853SAndroid Build Coastguard Worker
2678*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_first_slice_in_pic && (ps_dec->u4_pic_buf_got == 0))
2679*495ae853SAndroid Build Coastguard Worker prev_slice_err = 1;
2680*495ae853SAndroid Build Coastguard Worker else
2681*495ae853SAndroid Build Coastguard Worker prev_slice_err = 2;
2682*495ae853SAndroid Build Coastguard Worker
2683*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_first_slice_in_pic && (ps_dec->u2_total_mbs_coded == 0))
2684*495ae853SAndroid Build Coastguard Worker prev_slice_err = 1;
2685*495ae853SAndroid Build Coastguard Worker
2686*495ae853SAndroid Build Coastguard Worker ret1 = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, ps_dec->u1_nal_unit_type == IDR_SLICE_NAL, ps_dec->ps_cur_slice->u2_frame_num,
2687*495ae853SAndroid Build Coastguard Worker &temp_poc, prev_slice_err);
2688*495ae853SAndroid Build Coastguard Worker
2689*495ae853SAndroid Build Coastguard Worker if((ret1 == ERROR_UNAVAIL_PICBUF_T) || (ret1 == ERROR_UNAVAIL_MVBUF_T) ||
2690*495ae853SAndroid Build Coastguard Worker (ret1 == ERROR_INV_SPS_PPS_T))
2691*495ae853SAndroid Build Coastguard Worker {
2692*495ae853SAndroid Build Coastguard Worker ret = ret1;
2693*495ae853SAndroid Build Coastguard Worker }
2694*495ae853SAndroid Build Coastguard Worker }
2695*495ae853SAndroid Build Coastguard Worker
2696*495ae853SAndroid Build Coastguard Worker if((ret == IVD_RES_CHANGED)
2697*495ae853SAndroid Build Coastguard Worker || (ret == IVD_MEM_ALLOC_FAILED)
2698*495ae853SAndroid Build Coastguard Worker || (ret == ERROR_UNAVAIL_PICBUF_T)
2699*495ae853SAndroid Build Coastguard Worker || (ret == ERROR_UNAVAIL_MVBUF_T)
2700*495ae853SAndroid Build Coastguard Worker || (ret == ERROR_INV_SPS_PPS_T))
2701*495ae853SAndroid Build Coastguard Worker {
2702*495ae853SAndroid Build Coastguard Worker
2703*495ae853SAndroid Build Coastguard Worker /* signal the decode thread */
2704*495ae853SAndroid Build Coastguard Worker ih264d_signal_decode_thread(ps_dec);
2705*495ae853SAndroid Build Coastguard Worker /* close deblock thread if it is not closed yet */
2706*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_num_cores == 3)
2707*495ae853SAndroid Build Coastguard Worker {
2708*495ae853SAndroid Build Coastguard Worker ih264d_signal_bs_deblk_thread(ps_dec);
2709*495ae853SAndroid Build Coastguard Worker }
2710*495ae853SAndroid Build Coastguard Worker /* dont consume bitstream for change in resolution case */
2711*495ae853SAndroid Build Coastguard Worker if(ret == IVD_RES_CHANGED)
2712*495ae853SAndroid Build Coastguard Worker {
2713*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_num_bytes_consumed -= bytes_consumed;
2714*495ae853SAndroid Build Coastguard Worker }
2715*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
2716*495ae853SAndroid Build Coastguard Worker }
2717*495ae853SAndroid Build Coastguard Worker
2718*495ae853SAndroid Build Coastguard Worker
2719*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_separate_parse)
2720*495ae853SAndroid Build Coastguard Worker {
2721*495ae853SAndroid Build Coastguard Worker /* If Format conversion is not complete,
2722*495ae853SAndroid Build Coastguard Worker complete it here */
2723*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_num_cores == 2)
2724*495ae853SAndroid Build Coastguard Worker {
2725*495ae853SAndroid Build Coastguard Worker
2726*495ae853SAndroid Build Coastguard Worker /*do deblocking of all mbs*/
2727*495ae853SAndroid Build Coastguard Worker if((ps_dec->u4_nmb_deblk == 0) &&(ps_dec->u4_start_recon_deblk == 1) && (ps_dec->ps_cur_sps->u1_mb_aff_flag == 0))
2728*495ae853SAndroid Build Coastguard Worker {
2729*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_mbs,u4_max_addr;
2730*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t s_tfr_ctxt;
2731*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_tfr_cxt = &s_tfr_ctxt;
2732*495ae853SAndroid Build Coastguard Worker pad_mgr_t *ps_pad_mgr = &ps_dec->s_pad_mgr;
2733*495ae853SAndroid Build Coastguard Worker
2734*495ae853SAndroid Build Coastguard Worker /*BS is done for all mbs while parsing*/
2735*495ae853SAndroid Build Coastguard Worker u4_max_addr = (ps_dec->u2_frm_wd_in_mbs * ps_dec->u2_frm_ht_in_mbs) - 1;
2736*495ae853SAndroid Build Coastguard Worker ps_dec->u4_cur_bs_mb_num = u4_max_addr + 1;
2737*495ae853SAndroid Build Coastguard Worker
2738*495ae853SAndroid Build Coastguard Worker
2739*495ae853SAndroid Build Coastguard Worker ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt,
2740*495ae853SAndroid Build Coastguard Worker ps_dec->u2_frm_wd_in_mbs, 0);
2741*495ae853SAndroid Build Coastguard Worker
2742*495ae853SAndroid Build Coastguard Worker
2743*495ae853SAndroid Build Coastguard Worker u4_num_mbs = u4_max_addr
2744*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_cur_deblk_mb_num + 1;
2745*495ae853SAndroid Build Coastguard Worker
2746*495ae853SAndroid Build Coastguard Worker DEBUG_PERF_PRINTF("mbs left for deblocking= %d \n",u4_num_mbs);
2747*495ae853SAndroid Build Coastguard Worker
2748*495ae853SAndroid Build Coastguard Worker if(u4_num_mbs != 0)
2749*495ae853SAndroid Build Coastguard Worker ih264d_check_mb_map_deblk(ps_dec, u4_num_mbs,
2750*495ae853SAndroid Build Coastguard Worker ps_tfr_cxt,1);
2751*495ae853SAndroid Build Coastguard Worker
2752*495ae853SAndroid Build Coastguard Worker ps_dec->u4_start_recon_deblk = 0;
2753*495ae853SAndroid Build Coastguard Worker
2754*495ae853SAndroid Build Coastguard Worker }
2755*495ae853SAndroid Build Coastguard Worker
2756*495ae853SAndroid Build Coastguard Worker }
2757*495ae853SAndroid Build Coastguard Worker
2758*495ae853SAndroid Build Coastguard Worker /*signal the decode thread*/
2759*495ae853SAndroid Build Coastguard Worker ih264d_signal_decode_thread(ps_dec);
2760*495ae853SAndroid Build Coastguard Worker /* close deblock thread if it is not closed yet*/
2761*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_num_cores == 3)
2762*495ae853SAndroid Build Coastguard Worker {
2763*495ae853SAndroid Build Coastguard Worker ih264d_signal_bs_deblk_thread(ps_dec);
2764*495ae853SAndroid Build Coastguard Worker }
2765*495ae853SAndroid Build Coastguard Worker }
2766*495ae853SAndroid Build Coastguard Worker
2767*495ae853SAndroid Build Coastguard Worker
2768*495ae853SAndroid Build Coastguard Worker DATA_SYNC();
2769*495ae853SAndroid Build Coastguard Worker
2770*495ae853SAndroid Build Coastguard Worker
2771*495ae853SAndroid Build Coastguard Worker if((ps_dec_op->u4_error_code & 0xff)
2772*495ae853SAndroid Build Coastguard Worker != ERROR_DYNAMIC_RESOLUTION_NOT_SUPPORTED)
2773*495ae853SAndroid Build Coastguard Worker {
2774*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_pic_wd = (UWORD32)ps_dec->u2_disp_width;
2775*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_pic_ht = (UWORD32)ps_dec->u2_disp_height;
2776*495ae853SAndroid Build Coastguard Worker ps_dec_op->i4_reorder_depth = ps_dec->i4_reorder_depth;
2777*495ae853SAndroid Build Coastguard Worker }
2778*495ae853SAndroid Build Coastguard Worker
2779*495ae853SAndroid Build Coastguard Worker //Report if header (sps and pps) has not been decoded yet
2780*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_decode_header == 1 && ps_dec->i4_header_decoded != 3)
2781*495ae853SAndroid Build Coastguard Worker {
2782*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_error_code |= (1 << IVD_INSUFFICIENTDATA);
2783*495ae853SAndroid Build Coastguard Worker api_ret_value = IV_FAIL;
2784*495ae853SAndroid Build Coastguard Worker }
2785*495ae853SAndroid Build Coastguard Worker
2786*495ae853SAndroid Build Coastguard Worker if((ps_dec->u4_pic_buf_got == 1)
2787*495ae853SAndroid Build Coastguard Worker && (ERROR_DANGLING_FIELD_IN_PIC != i4_err_status))
2788*495ae853SAndroid Build Coastguard Worker {
2789*495ae853SAndroid Build Coastguard Worker /*
2790*495ae853SAndroid Build Coastguard Worker * For field pictures, set the bottom and top picture decoded u4_flag correctly.
2791*495ae853SAndroid Build Coastguard Worker */
2792*495ae853SAndroid Build Coastguard Worker
2793*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_cur_slice->u1_field_pic_flag)
2794*495ae853SAndroid Build Coastguard Worker {
2795*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->ps_cur_slice->u1_bottom_field_flag)
2796*495ae853SAndroid Build Coastguard Worker {
2797*495ae853SAndroid Build Coastguard Worker ps_dec->u1_top_bottom_decoded |= BOT_FIELD_ONLY;
2798*495ae853SAndroid Build Coastguard Worker }
2799*495ae853SAndroid Build Coastguard Worker else
2800*495ae853SAndroid Build Coastguard Worker {
2801*495ae853SAndroid Build Coastguard Worker ps_dec->u1_top_bottom_decoded |= TOP_FIELD_ONLY;
2802*495ae853SAndroid Build Coastguard Worker }
2803*495ae853SAndroid Build Coastguard Worker }
2804*495ae853SAndroid Build Coastguard Worker else
2805*495ae853SAndroid Build Coastguard Worker {
2806*495ae853SAndroid Build Coastguard Worker ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY;
2807*495ae853SAndroid Build Coastguard Worker }
2808*495ae853SAndroid Build Coastguard Worker
2809*495ae853SAndroid Build Coastguard Worker /* if new frame in not found (if we are still getting slices from previous frame)
2810*495ae853SAndroid Build Coastguard Worker * ih264d_deblock_display is not called. Such frames will not be added to reference /display
2811*495ae853SAndroid Build Coastguard Worker */
2812*495ae853SAndroid Build Coastguard Worker if ((ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) == 0)
2813*495ae853SAndroid Build Coastguard Worker {
2814*495ae853SAndroid Build Coastguard Worker /* Calling Function to deblock Picture and Display */
2815*495ae853SAndroid Build Coastguard Worker ret = ih264d_deblock_display(ps_dec);
2816*495ae853SAndroid Build Coastguard Worker }
2817*495ae853SAndroid Build Coastguard Worker
2818*495ae853SAndroid Build Coastguard Worker
2819*495ae853SAndroid Build Coastguard Worker /*set to complete ,as we dont support partial frame decode*/
2820*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_header_decoded == 3)
2821*495ae853SAndroid Build Coastguard Worker {
2822*495ae853SAndroid Build Coastguard Worker ps_dec->u2_total_mbs_coded = ps_dec->ps_cur_sps->u2_max_mb_addr + 1;
2823*495ae853SAndroid Build Coastguard Worker }
2824*495ae853SAndroid Build Coastguard Worker
2825*495ae853SAndroid Build Coastguard Worker /*Update the i4_frametype at the end of picture*/
2826*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
2827*495ae853SAndroid Build Coastguard Worker {
2828*495ae853SAndroid Build Coastguard Worker ps_dec->i4_frametype = IV_IDR_FRAME;
2829*495ae853SAndroid Build Coastguard Worker }
2830*495ae853SAndroid Build Coastguard Worker else if(ps_dec->i4_pic_type == B_SLICE)
2831*495ae853SAndroid Build Coastguard Worker {
2832*495ae853SAndroid Build Coastguard Worker ps_dec->i4_frametype = IV_B_FRAME;
2833*495ae853SAndroid Build Coastguard Worker }
2834*495ae853SAndroid Build Coastguard Worker else if(ps_dec->i4_pic_type == P_SLICE)
2835*495ae853SAndroid Build Coastguard Worker {
2836*495ae853SAndroid Build Coastguard Worker ps_dec->i4_frametype = IV_P_FRAME;
2837*495ae853SAndroid Build Coastguard Worker }
2838*495ae853SAndroid Build Coastguard Worker else if(ps_dec->i4_pic_type == I_SLICE)
2839*495ae853SAndroid Build Coastguard Worker {
2840*495ae853SAndroid Build Coastguard Worker ps_dec->i4_frametype = IV_I_FRAME;
2841*495ae853SAndroid Build Coastguard Worker }
2842*495ae853SAndroid Build Coastguard Worker else
2843*495ae853SAndroid Build Coastguard Worker {
2844*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("Shouldn't come here\n");
2845*495ae853SAndroid Build Coastguard Worker }
2846*495ae853SAndroid Build Coastguard Worker
2847*495ae853SAndroid Build Coastguard Worker //Update the content type
2848*495ae853SAndroid Build Coastguard Worker ps_dec->i4_content_type = ps_dec->ps_cur_slice->u1_field_pic_flag;
2849*495ae853SAndroid Build Coastguard Worker
2850*495ae853SAndroid Build Coastguard Worker ps_dec->u4_total_frames_decoded = ps_dec->u4_total_frames_decoded + 2;
2851*495ae853SAndroid Build Coastguard Worker ps_dec->u4_total_frames_decoded = ps_dec->u4_total_frames_decoded
2852*495ae853SAndroid Build Coastguard Worker - ps_dec->ps_cur_slice->u1_field_pic_flag;
2853*495ae853SAndroid Build Coastguard Worker
2854*495ae853SAndroid Build Coastguard Worker }
2855*495ae853SAndroid Build Coastguard Worker
2856*495ae853SAndroid Build Coastguard Worker /* close deblock thread if it is not closed yet*/
2857*495ae853SAndroid Build Coastguard Worker if(!ps_dec->i4_threads_active)
2858*495ae853SAndroid Build Coastguard Worker {
2859*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_num_cores == 3)
2860*495ae853SAndroid Build Coastguard Worker {
2861*495ae853SAndroid Build Coastguard Worker ih264d_signal_bs_deblk_thread(ps_dec);
2862*495ae853SAndroid Build Coastguard Worker }
2863*495ae853SAndroid Build Coastguard Worker }
2864*495ae853SAndroid Build Coastguard Worker
2865*495ae853SAndroid Build Coastguard Worker
2866*495ae853SAndroid Build Coastguard Worker {
2867*495ae853SAndroid Build Coastguard Worker /* In case the decoder is configured to run in low delay mode,
2868*495ae853SAndroid Build Coastguard Worker * then get display buffer and then format convert.
2869*495ae853SAndroid Build Coastguard Worker * Note in this mode, format conversion does not run paralelly in a thread and adds to the codec cycles
2870*495ae853SAndroid Build Coastguard Worker */
2871*495ae853SAndroid Build Coastguard Worker
2872*495ae853SAndroid Build Coastguard Worker if((IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode)
2873*495ae853SAndroid Build Coastguard Worker && ps_dec->u1_init_dec_flag)
2874*495ae853SAndroid Build Coastguard Worker {
2875*495ae853SAndroid Build Coastguard Worker
2876*495ae853SAndroid Build Coastguard Worker ih264d_get_next_display_field(ps_dec, ps_dec->ps_out_buffer,
2877*495ae853SAndroid Build Coastguard Worker &(ps_dec->s_disp_op));
2878*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_disp_op.u4_error_code)
2879*495ae853SAndroid Build Coastguard Worker {
2880*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row = 0;
2881*495ae853SAndroid Build Coastguard Worker ps_dec->u4_output_present = 1;
2882*495ae853SAndroid Build Coastguard Worker }
2883*495ae853SAndroid Build Coastguard Worker }
2884*495ae853SAndroid Build Coastguard Worker
2885*495ae853SAndroid Build Coastguard Worker ih264d_fill_output_struct_from_context(ps_dec, ps_dec_op);
2886*495ae853SAndroid Build Coastguard Worker
2887*495ae853SAndroid Build Coastguard Worker /* If Format conversion is not complete,
2888*495ae853SAndroid Build Coastguard Worker complete it here */
2889*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_output_present &&
2890*495ae853SAndroid Build Coastguard Worker (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht))
2891*495ae853SAndroid Build Coastguard Worker {
2892*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows = ps_dec->s_disp_frame_info.u4_y_ht
2893*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_fmt_conv_cur_row;
2894*495ae853SAndroid Build Coastguard Worker ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op),
2895*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row,
2896*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows);
2897*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
2898*495ae853SAndroid Build Coastguard Worker }
2899*495ae853SAndroid Build Coastguard Worker
2900*495ae853SAndroid Build Coastguard Worker ih264d_release_display_field(ps_dec, &(ps_dec->s_disp_op));
2901*495ae853SAndroid Build Coastguard Worker }
2902*495ae853SAndroid Build Coastguard Worker
2903*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_decode_header == 1 && (ps_dec->i4_header_decoded & 1) == 1)
2904*495ae853SAndroid Build Coastguard Worker {
2905*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_progressive_frame_flag = 1;
2906*495ae853SAndroid Build Coastguard Worker if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
2907*495ae853SAndroid Build Coastguard Worker {
2908*495ae853SAndroid Build Coastguard Worker if((0 == ps_dec->ps_sps->u1_frame_mbs_only_flag)
2909*495ae853SAndroid Build Coastguard Worker && (0 == ps_dec->ps_sps->u1_mb_aff_flag))
2910*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_progressive_frame_flag = 0;
2911*495ae853SAndroid Build Coastguard Worker
2912*495ae853SAndroid Build Coastguard Worker }
2913*495ae853SAndroid Build Coastguard Worker }
2914*495ae853SAndroid Build Coastguard Worker
2915*495ae853SAndroid Build Coastguard Worker if((TOP_FIELD_ONLY | BOT_FIELD_ONLY) == ps_dec->u1_top_bottom_decoded)
2916*495ae853SAndroid Build Coastguard Worker {
2917*495ae853SAndroid Build Coastguard Worker ps_dec->u1_top_bottom_decoded = 0;
2918*495ae853SAndroid Build Coastguard Worker }
2919*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2920*495ae853SAndroid Build Coastguard Worker /* Do End of Pic processing. */
2921*495ae853SAndroid Build Coastguard Worker /* Should be called only if frame was decoded in previous process call*/
2922*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2923*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_pic_buf_got == 1)
2924*495ae853SAndroid Build Coastguard Worker {
2925*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u1_last_pic_not_decoded)
2926*495ae853SAndroid Build Coastguard Worker {
2927*495ae853SAndroid Build Coastguard Worker ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
2928*495ae853SAndroid Build Coastguard Worker
2929*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2930*495ae853SAndroid Build Coastguard Worker return ret;
2931*495ae853SAndroid Build Coastguard Worker
2932*495ae853SAndroid Build Coastguard Worker ret = ih264d_end_of_pic(ps_dec);
2933*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2934*495ae853SAndroid Build Coastguard Worker return ret;
2935*495ae853SAndroid Build Coastguard Worker }
2936*495ae853SAndroid Build Coastguard Worker else
2937*495ae853SAndroid Build Coastguard Worker {
2938*495ae853SAndroid Build Coastguard Worker ret = ih264d_end_of_pic(ps_dec);
2939*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2940*495ae853SAndroid Build Coastguard Worker return ret;
2941*495ae853SAndroid Build Coastguard Worker }
2942*495ae853SAndroid Build Coastguard Worker
2943*495ae853SAndroid Build Coastguard Worker }
2944*495ae853SAndroid Build Coastguard Worker
2945*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_enable_mb_info && ps_dec->u4_output_present)
2946*495ae853SAndroid Build Coastguard Worker {
2947*495ae853SAndroid Build Coastguard Worker UWORD32 disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
2948*495ae853SAndroid Build Coastguard Worker if(ps_h264d_dec_ip->pu1_8x8_blk_qp_map)
2949*495ae853SAndroid Build Coastguard Worker {
2950*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op->pu1_8x8_blk_qp_map = ps_h264d_dec_ip->pu1_8x8_blk_qp_map;
2951*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op->u4_8x8_blk_qp_map_size = ps_dec->u4_total_mbs << 2;
2952*495ae853SAndroid Build Coastguard Worker ih264_memcpy(ps_h264d_dec_op->pu1_8x8_blk_qp_map,
2953*495ae853SAndroid Build Coastguard Worker ps_dec->as_buf_id_info_map[disp_buf_id].pu1_qp_map,
2954*495ae853SAndroid Build Coastguard Worker ps_dec->u4_total_mbs << 2);
2955*495ae853SAndroid Build Coastguard Worker }
2956*495ae853SAndroid Build Coastguard Worker if(ps_h264d_dec_ip->pu1_8x8_blk_type_map)
2957*495ae853SAndroid Build Coastguard Worker {
2958*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op->pu1_8x8_blk_type_map = ps_h264d_dec_ip->pu1_8x8_blk_type_map;
2959*495ae853SAndroid Build Coastguard Worker ps_h264d_dec_op->u4_8x8_blk_type_map_size = ps_dec->u4_total_mbs << 2;
2960*495ae853SAndroid Build Coastguard Worker ih264_memcpy(ps_h264d_dec_op->pu1_8x8_blk_type_map,
2961*495ae853SAndroid Build Coastguard Worker ps_dec->as_buf_id_info_map[disp_buf_id].pu1_mb_type_map,
2962*495ae853SAndroid Build Coastguard Worker ps_dec->u4_total_mbs << 2);
2963*495ae853SAndroid Build Coastguard Worker }
2964*495ae853SAndroid Build Coastguard Worker }
2965*495ae853SAndroid Build Coastguard Worker
2966*495ae853SAndroid Build Coastguard Worker /*Data memory barrier instruction,so that yuv write by the library is complete*/
2967*495ae853SAndroid Build Coastguard Worker DATA_SYNC();
2968*495ae853SAndroid Build Coastguard Worker
2969*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("The num bytes consumed: %d\n",
2970*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_num_bytes_consumed);
2971*495ae853SAndroid Build Coastguard Worker return api_ret_value;
2972*495ae853SAndroid Build Coastguard Worker }
2973*495ae853SAndroid Build Coastguard Worker
ih264d_get_version(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)2974*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_version(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
2975*495ae853SAndroid Build Coastguard Worker {
2976*495ae853SAndroid Build Coastguard Worker char version_string[MAXVERSION_STRLEN + 1];
2977*495ae853SAndroid Build Coastguard Worker UWORD32 version_string_len;
2978*495ae853SAndroid Build Coastguard Worker
2979*495ae853SAndroid Build Coastguard Worker ivd_ctl_getversioninfo_ip_t *ps_ip;
2980*495ae853SAndroid Build Coastguard Worker ivd_ctl_getversioninfo_op_t *ps_op;
2981*495ae853SAndroid Build Coastguard Worker
2982*495ae853SAndroid Build Coastguard Worker ps_ip = (ivd_ctl_getversioninfo_ip_t *)pv_api_ip;
2983*495ae853SAndroid Build Coastguard Worker ps_op = (ivd_ctl_getversioninfo_op_t *)pv_api_op;
2984*495ae853SAndroid Build Coastguard Worker UNUSED(dec_hdl);
2985*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = IV_SUCCESS;
2986*495ae853SAndroid Build Coastguard Worker
2987*495ae853SAndroid Build Coastguard Worker VERSION(version_string, CODEC_NAME, CODEC_RELEASE_TYPE, CODEC_RELEASE_VER,
2988*495ae853SAndroid Build Coastguard Worker CODEC_VENDOR);
2989*495ae853SAndroid Build Coastguard Worker
2990*495ae853SAndroid Build Coastguard Worker if((WORD32)ps_ip->u4_version_buffer_size <= 0)
2991*495ae853SAndroid Build Coastguard Worker {
2992*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = IH264D_VERS_BUF_INSUFFICIENT;
2993*495ae853SAndroid Build Coastguard Worker return (IV_FAIL);
2994*495ae853SAndroid Build Coastguard Worker }
2995*495ae853SAndroid Build Coastguard Worker
2996*495ae853SAndroid Build Coastguard Worker version_string_len = strnlen(version_string, MAXVERSION_STRLEN) + 1;
2997*495ae853SAndroid Build Coastguard Worker
2998*495ae853SAndroid Build Coastguard Worker if(ps_ip->u4_version_buffer_size >= version_string_len) //(WORD32)sizeof(sizeof(version_string)))
2999*495ae853SAndroid Build Coastguard Worker {
3000*495ae853SAndroid Build Coastguard Worker memcpy(ps_ip->pv_version_buffer, version_string, version_string_len);
3001*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = IV_SUCCESS;
3002*495ae853SAndroid Build Coastguard Worker }
3003*495ae853SAndroid Build Coastguard Worker else
3004*495ae853SAndroid Build Coastguard Worker {
3005*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = IH264D_VERS_BUF_INSUFFICIENT;
3006*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
3007*495ae853SAndroid Build Coastguard Worker }
3008*495ae853SAndroid Build Coastguard Worker return (IV_SUCCESS);
3009*495ae853SAndroid Build Coastguard Worker }
3010*495ae853SAndroid Build Coastguard Worker
3011*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3012*495ae853SAndroid Build Coastguard Worker /* */
3013*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_display_frame */
3014*495ae853SAndroid Build Coastguard Worker /* */
3015*495ae853SAndroid Build Coastguard Worker /* Description : */
3016*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3017*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3018*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3019*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3020*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3021*495ae853SAndroid Build Coastguard Worker /* */
3022*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3023*495ae853SAndroid Build Coastguard Worker /* */
3024*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3025*495ae853SAndroid Build Coastguard Worker /* */
3026*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3027*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3028*495ae853SAndroid Build Coastguard Worker /* */
3029*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_display_frame(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3030*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_display_frame(iv_obj_t *dec_hdl,
3031*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
3032*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
3033*495ae853SAndroid Build Coastguard Worker {
3034*495ae853SAndroid Build Coastguard Worker
3035*495ae853SAndroid Build Coastguard Worker UNUSED(dec_hdl);
3036*495ae853SAndroid Build Coastguard Worker UNUSED(pv_api_ip);
3037*495ae853SAndroid Build Coastguard Worker UNUSED(pv_api_op);
3038*495ae853SAndroid Build Coastguard Worker // This function is no longer needed, output is returned in the process()
3039*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
3040*495ae853SAndroid Build Coastguard Worker }
3041*495ae853SAndroid Build Coastguard Worker
3042*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3043*495ae853SAndroid Build Coastguard Worker /* */
3044*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_set_display_frame */
3045*495ae853SAndroid Build Coastguard Worker /* */
3046*495ae853SAndroid Build Coastguard Worker /* Description : */
3047*495ae853SAndroid Build Coastguard Worker /* */
3048*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3049*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3050*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3051*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3052*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3053*495ae853SAndroid Build Coastguard Worker /* */
3054*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3055*495ae853SAndroid Build Coastguard Worker /* */
3056*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3057*495ae853SAndroid Build Coastguard Worker /* */
3058*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3059*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3060*495ae853SAndroid Build Coastguard Worker /* */
3061*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_set_display_frame(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3062*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_display_frame(iv_obj_t *dec_hdl,
3063*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
3064*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
3065*495ae853SAndroid Build Coastguard Worker {
3066*495ae853SAndroid Build Coastguard Worker
3067*495ae853SAndroid Build Coastguard Worker UWORD32 u4_disp_buf_size[3], u4_num_disp_bufs;
3068*495ae853SAndroid Build Coastguard Worker ivd_set_display_frame_ip_t *dec_disp_ip;
3069*495ae853SAndroid Build Coastguard Worker ivd_set_display_frame_op_t *dec_disp_op;
3070*495ae853SAndroid Build Coastguard Worker
3071*495ae853SAndroid Build Coastguard Worker UWORD32 i;
3072*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
3073*495ae853SAndroid Build Coastguard Worker
3074*495ae853SAndroid Build Coastguard Worker dec_disp_ip = (ivd_set_display_frame_ip_t *)pv_api_ip;
3075*495ae853SAndroid Build Coastguard Worker dec_disp_op = (ivd_set_display_frame_op_t *)pv_api_op;
3076*495ae853SAndroid Build Coastguard Worker dec_disp_op->u4_error_code = 0;
3077*495ae853SAndroid Build Coastguard Worker
3078*495ae853SAndroid Build Coastguard Worker
3079*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_disp_bufs = 0;
3080*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf)
3081*495ae853SAndroid Build Coastguard Worker {
3082*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_bufs = dec_disp_ip->num_disp_bufs;
3083*495ae853SAndroid Build Coastguard Worker
3084*495ae853SAndroid Build Coastguard Worker u4_num_bufs = MIN(u4_num_bufs, MAX_DISP_BUFS_NEW);
3085*495ae853SAndroid Build Coastguard Worker
3086*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_disp_bufs = u4_num_bufs;
3087*495ae853SAndroid Build Coastguard Worker
3088*495ae853SAndroid Build Coastguard Worker /* Get the number and sizes of the first buffer. Compare this with the
3089*495ae853SAndroid Build Coastguard Worker * rest to make sure all the buffers are of the same size.
3090*495ae853SAndroid Build Coastguard Worker */
3091*495ae853SAndroid Build Coastguard Worker u4_num_disp_bufs = dec_disp_ip->s_disp_buffer[0].u4_num_bufs;
3092*495ae853SAndroid Build Coastguard Worker
3093*495ae853SAndroid Build Coastguard Worker u4_disp_buf_size[0] =
3094*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[0];
3095*495ae853SAndroid Build Coastguard Worker u4_disp_buf_size[1] =
3096*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[1];
3097*495ae853SAndroid Build Coastguard Worker u4_disp_buf_size[2] =
3098*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[2];
3099*495ae853SAndroid Build Coastguard Worker
3100*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u4_num_bufs; i++)
3101*495ae853SAndroid Build Coastguard Worker {
3102*495ae853SAndroid Build Coastguard Worker if(dec_disp_ip->s_disp_buffer[i].u4_num_bufs != u4_num_disp_bufs)
3103*495ae853SAndroid Build Coastguard Worker {
3104*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
3105*495ae853SAndroid Build Coastguard Worker }
3106*495ae853SAndroid Build Coastguard Worker
3107*495ae853SAndroid Build Coastguard Worker if((dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[0]
3108*495ae853SAndroid Build Coastguard Worker != u4_disp_buf_size[0])
3109*495ae853SAndroid Build Coastguard Worker || (dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[1]
3110*495ae853SAndroid Build Coastguard Worker != u4_disp_buf_size[1])
3111*495ae853SAndroid Build Coastguard Worker || (dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[2]
3112*495ae853SAndroid Build Coastguard Worker != u4_disp_buf_size[2]))
3113*495ae853SAndroid Build Coastguard Worker {
3114*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
3115*495ae853SAndroid Build Coastguard Worker }
3116*495ae853SAndroid Build Coastguard Worker
3117*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_num_bufs =
3118*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[i].u4_num_bufs;
3119*495ae853SAndroid Build Coastguard Worker
3120*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].buf[0] =
3121*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[i].pu1_bufs[0];
3122*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].buf[1] =
3123*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[i].pu1_bufs[1];
3124*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].buf[2] =
3125*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[i].pu1_bufs[2];
3126*495ae853SAndroid Build Coastguard Worker
3127*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_bufsize[0] =
3128*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[0];
3129*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_bufsize[1] =
3130*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[1];
3131*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_bufsize[2] =
3132*495ae853SAndroid Build Coastguard Worker dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[2];
3133*495ae853SAndroid Build Coastguard Worker
3134*495ae853SAndroid Build Coastguard Worker }
3135*495ae853SAndroid Build Coastguard Worker }
3136*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3137*495ae853SAndroid Build Coastguard Worker
3138*495ae853SAndroid Build Coastguard Worker }
3139*495ae853SAndroid Build Coastguard Worker
3140*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3141*495ae853SAndroid Build Coastguard Worker /* */
3142*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_set_flush_mode */
3143*495ae853SAndroid Build Coastguard Worker /* */
3144*495ae853SAndroid Build Coastguard Worker /* Description : */
3145*495ae853SAndroid Build Coastguard Worker /* */
3146*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3147*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3148*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3149*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
3150*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3151*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3152*495ae853SAndroid Build Coastguard Worker /* */
3153*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3154*495ae853SAndroid Build Coastguard Worker /* */
3155*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3156*495ae853SAndroid Build Coastguard Worker /* */
3157*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3158*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3159*495ae853SAndroid Build Coastguard Worker /* */
3160*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_set_flush_mode(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3161*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_flush_mode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
3162*495ae853SAndroid Build Coastguard Worker {
3163*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec;
3164*495ae853SAndroid Build Coastguard Worker ivd_ctl_flush_op_t *ps_ctl_op = (ivd_ctl_flush_op_t*)pv_api_op;
3165*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = 0;
3166*495ae853SAndroid Build Coastguard Worker
3167*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
3168*495ae853SAndroid Build Coastguard Worker ih264d_join_threads(ps_dec);
3169*495ae853SAndroid Build Coastguard Worker UNUSED(pv_api_ip);
3170*495ae853SAndroid Build Coastguard Worker /* ! */
3171*495ae853SAndroid Build Coastguard Worker /* Signal flush frame control call */
3172*495ae853SAndroid Build Coastguard Worker ps_dec->u1_flushfrm = 1;
3173*495ae853SAndroid Build Coastguard Worker
3174*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_init_dec_flag == 1)
3175*495ae853SAndroid Build Coastguard Worker {
3176*495ae853SAndroid Build Coastguard Worker ih264d_release_pics_in_dpb((void *)ps_dec, ps_dec->u1_pic_bufs);
3177*495ae853SAndroid Build Coastguard Worker ih264d_release_display_bufs(ps_dec);
3178*495ae853SAndroid Build Coastguard Worker }
3179*495ae853SAndroid Build Coastguard Worker
3180*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = 0;
3181*495ae853SAndroid Build Coastguard Worker
3182*495ae853SAndroid Build Coastguard Worker /* Ignore dangling fields during flush */
3183*495ae853SAndroid Build Coastguard Worker ps_dec->u1_top_bottom_decoded = 0;
3184*495ae853SAndroid Build Coastguard Worker
3185*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3186*495ae853SAndroid Build Coastguard Worker }
3187*495ae853SAndroid Build Coastguard Worker
3188*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3189*495ae853SAndroid Build Coastguard Worker /* */
3190*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_status */
3191*495ae853SAndroid Build Coastguard Worker /* */
3192*495ae853SAndroid Build Coastguard Worker /* Description : */
3193*495ae853SAndroid Build Coastguard Worker /* */
3194*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3195*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3196*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3197*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
3198*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3199*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3200*495ae853SAndroid Build Coastguard Worker /* */
3201*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3202*495ae853SAndroid Build Coastguard Worker /* */
3203*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3204*495ae853SAndroid Build Coastguard Worker /* */
3205*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3206*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3207*495ae853SAndroid Build Coastguard Worker /* */
3208*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3209*495ae853SAndroid Build Coastguard Worker
ih264d_get_status(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3210*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_status(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
3211*495ae853SAndroid Build Coastguard Worker {
3212*495ae853SAndroid Build Coastguard Worker
3213*495ae853SAndroid Build Coastguard Worker UWORD32 i;
3214*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec;
3215*495ae853SAndroid Build Coastguard Worker UWORD32 pic_wd, pic_ht;
3216*495ae853SAndroid Build Coastguard Worker ivd_ctl_getstatus_op_t *ps_ctl_op = (ivd_ctl_getstatus_op_t*)pv_api_op;
3217*495ae853SAndroid Build Coastguard Worker UNUSED(pv_api_ip);
3218*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = 0;
3219*495ae853SAndroid Build Coastguard Worker
3220*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
3221*495ae853SAndroid Build Coastguard Worker
3222*495ae853SAndroid Build Coastguard Worker
3223*495ae853SAndroid Build Coastguard Worker if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
3224*495ae853SAndroid Build Coastguard Worker {
3225*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_pic_ht = ps_dec->u2_disp_height;
3226*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_pic_wd = ps_dec->u2_disp_width;
3227*495ae853SAndroid Build Coastguard Worker
3228*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
3229*495ae853SAndroid Build Coastguard Worker {
3230*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u2_disp_width;
3231*495ae853SAndroid Build Coastguard Worker pic_ht = ps_dec->u2_disp_height;
3232*495ae853SAndroid Build Coastguard Worker
3233*495ae853SAndroid Build Coastguard Worker }
3234*495ae853SAndroid Build Coastguard Worker else
3235*495ae853SAndroid Build Coastguard Worker {
3236*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u2_frm_wd_y;
3237*495ae853SAndroid Build Coastguard Worker pic_ht = ps_dec->u2_frm_ht_y;
3238*495ae853SAndroid Build Coastguard Worker }
3239*495ae853SAndroid Build Coastguard Worker }
3240*495ae853SAndroid Build Coastguard Worker else
3241*495ae853SAndroid Build Coastguard Worker {
3242*495ae853SAndroid Build Coastguard Worker pic_wd = 0;
3243*495ae853SAndroid Build Coastguard Worker pic_ht = 0;
3244*495ae853SAndroid Build Coastguard Worker
3245*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_pic_ht = pic_wd;
3246*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_pic_wd = pic_ht;
3247*495ae853SAndroid Build Coastguard Worker
3248*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u4_share_disp_buf)
3249*495ae853SAndroid Build Coastguard Worker {
3250*495ae853SAndroid Build Coastguard Worker pic_wd += (PAD_LEN_Y_H << 1);
3251*495ae853SAndroid Build Coastguard Worker pic_ht += (PAD_LEN_Y_V << 2);
3252*495ae853SAndroid Build Coastguard Worker
3253*495ae853SAndroid Build Coastguard Worker }
3254*495ae853SAndroid Build Coastguard Worker
3255*495ae853SAndroid Build Coastguard Worker }
3256*495ae853SAndroid Build Coastguard Worker
3257*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_app_disp_width > pic_wd)
3258*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u4_app_disp_width;
3259*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
3260*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = 1;
3261*495ae853SAndroid Build Coastguard Worker else
3262*495ae853SAndroid Build Coastguard Worker {
3263*495ae853SAndroid Build Coastguard Worker if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
3264*495ae853SAndroid Build Coastguard Worker {
3265*495ae853SAndroid Build Coastguard Worker if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1) &&
3266*495ae853SAndroid Build Coastguard Worker (1 == ps_dec->ps_cur_sps->s_vui.u1_bitstream_restriction_flag))
3267*495ae853SAndroid Build Coastguard Worker {
3268*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs =
3269*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 1;
3270*495ae853SAndroid Build Coastguard Worker }
3271*495ae853SAndroid Build Coastguard Worker else
3272*495ae853SAndroid Build Coastguard Worker {
3273*495ae853SAndroid Build Coastguard Worker /*if VUI is not present assume maximum possible refrence frames for the level,
3274*495ae853SAndroid Build Coastguard Worker * as max reorder frames*/
3275*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size(ps_dec->ps_cur_sps);
3276*495ae853SAndroid Build Coastguard Worker }
3277*495ae853SAndroid Build Coastguard Worker
3278*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs +=
3279*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
3280*495ae853SAndroid Build Coastguard Worker }
3281*495ae853SAndroid Build Coastguard Worker else
3282*495ae853SAndroid Build Coastguard Worker {
3283*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = 32;
3284*495ae853SAndroid Build Coastguard Worker }
3285*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = MAX(
3286*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs, 6);
3287*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = MIN(
3288*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs, 32);
3289*495ae853SAndroid Build Coastguard Worker }
3290*495ae853SAndroid Build Coastguard Worker
3291*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = ps_dec->i4_error_code;
3292*495ae853SAndroid Build Coastguard Worker
3293*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_frame_rate = 0; //make it proper
3294*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_bit_rate = 0; //make it proper
3295*495ae853SAndroid Build Coastguard Worker ps_ctl_op->e_content_type = ps_dec->i4_content_type;
3296*495ae853SAndroid Build Coastguard Worker ps_ctl_op->e_output_chroma_format = ps_dec->u1_chroma_format;
3297*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_num_in_bufs = MIN_IN_BUFS;
3298*495ae853SAndroid Build Coastguard Worker
3299*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_chroma_format == IV_YUV_420P)
3300*495ae853SAndroid Build Coastguard Worker {
3301*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_num_out_bufs = MIN_OUT_BUFS_420;
3302*495ae853SAndroid Build Coastguard Worker }
3303*495ae853SAndroid Build Coastguard Worker else if(ps_dec->u1_chroma_format == IV_YUV_422ILE)
3304*495ae853SAndroid Build Coastguard Worker {
3305*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_num_out_bufs = MIN_OUT_BUFS_422ILE;
3306*495ae853SAndroid Build Coastguard Worker }
3307*495ae853SAndroid Build Coastguard Worker else if(ps_dec->u1_chroma_format == IV_RGB_565)
3308*495ae853SAndroid Build Coastguard Worker {
3309*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_num_out_bufs = MIN_OUT_BUFS_RGB565;
3310*495ae853SAndroid Build Coastguard Worker }
3311*495ae853SAndroid Build Coastguard Worker else if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
3312*495ae853SAndroid Build Coastguard Worker || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU))
3313*495ae853SAndroid Build Coastguard Worker {
3314*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_num_out_bufs = MIN_OUT_BUFS_420SP;
3315*495ae853SAndroid Build Coastguard Worker }
3316*495ae853SAndroid Build Coastguard Worker
3317*495ae853SAndroid Build Coastguard Worker else
3318*495ae853SAndroid Build Coastguard Worker {
3319*495ae853SAndroid Build Coastguard Worker //Invalid chroma format; Error code may be updated, verify in testing if needed
3320*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = ERROR_FEATURE_UNAVAIL;
3321*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
3322*495ae853SAndroid Build Coastguard Worker }
3323*495ae853SAndroid Build Coastguard Worker
3324*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_ctl_op->u4_min_num_in_bufs; i++)
3325*495ae853SAndroid Build Coastguard Worker {
3326*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_in_buf_size[i] = MAX(256000, pic_wd * pic_ht * 3 / 2);
3327*495ae853SAndroid Build Coastguard Worker }
3328*495ae853SAndroid Build Coastguard Worker
3329*495ae853SAndroid Build Coastguard Worker /*!*/
3330*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_chroma_format == IV_YUV_420P)
3331*495ae853SAndroid Build Coastguard Worker {
3332*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[0] = (pic_wd * pic_ht);
3333*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[1] = (pic_wd * pic_ht)
3334*495ae853SAndroid Build Coastguard Worker >> 2;
3335*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[2] = (pic_wd * pic_ht)
3336*495ae853SAndroid Build Coastguard Worker >> 2;
3337*495ae853SAndroid Build Coastguard Worker }
3338*495ae853SAndroid Build Coastguard Worker else if(ps_dec->u1_chroma_format == IV_YUV_422ILE)
3339*495ae853SAndroid Build Coastguard Worker {
3340*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[0] = (pic_wd * pic_ht)
3341*495ae853SAndroid Build Coastguard Worker * 2;
3342*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[1] =
3343*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[2] = 0;
3344*495ae853SAndroid Build Coastguard Worker }
3345*495ae853SAndroid Build Coastguard Worker else if(ps_dec->u1_chroma_format == IV_RGB_565)
3346*495ae853SAndroid Build Coastguard Worker {
3347*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[0] = (pic_wd * pic_ht)
3348*495ae853SAndroid Build Coastguard Worker * 2;
3349*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[1] =
3350*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[2] = 0;
3351*495ae853SAndroid Build Coastguard Worker }
3352*495ae853SAndroid Build Coastguard Worker else if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
3353*495ae853SAndroid Build Coastguard Worker || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU))
3354*495ae853SAndroid Build Coastguard Worker {
3355*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[0] = (pic_wd * pic_ht);
3356*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[1] = (pic_wd * pic_ht)
3357*495ae853SAndroid Build Coastguard Worker >> 1;
3358*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[2] = 0;
3359*495ae853SAndroid Build Coastguard Worker }
3360*495ae853SAndroid Build Coastguard Worker
3361*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_disp_bufs_requested = ps_ctl_op->u4_num_disp_bufs;
3362*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3363*495ae853SAndroid Build Coastguard Worker }
3364*495ae853SAndroid Build Coastguard Worker
3365*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3366*495ae853SAndroid Build Coastguard Worker /* */
3367*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_buf_info */
3368*495ae853SAndroid Build Coastguard Worker /* */
3369*495ae853SAndroid Build Coastguard Worker /* Description : */
3370*495ae853SAndroid Build Coastguard Worker /* */
3371*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3372*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3373*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3374*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
3375*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3376*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3377*495ae853SAndroid Build Coastguard Worker /* */
3378*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3379*495ae853SAndroid Build Coastguard Worker /* */
3380*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3381*495ae853SAndroid Build Coastguard Worker /* */
3382*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3383*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3384*495ae853SAndroid Build Coastguard Worker /* */
3385*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_buf_info(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3386*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_buf_info(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
3387*495ae853SAndroid Build Coastguard Worker {
3388*495ae853SAndroid Build Coastguard Worker
3389*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec;
3390*495ae853SAndroid Build Coastguard Worker UWORD8 i = 0; // Default for 420P format
3391*495ae853SAndroid Build Coastguard Worker UWORD16 pic_wd, pic_ht;
3392*495ae853SAndroid Build Coastguard Worker ivd_ctl_getbufinfo_op_t *ps_ctl_op =
3393*495ae853SAndroid Build Coastguard Worker (ivd_ctl_getbufinfo_op_t*)pv_api_op;
3394*495ae853SAndroid Build Coastguard Worker UWORD32 au4_min_out_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
3395*495ae853SAndroid Build Coastguard Worker UNUSED(pv_api_ip);
3396*495ae853SAndroid Build Coastguard Worker
3397*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = 0;
3398*495ae853SAndroid Build Coastguard Worker
3399*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
3400*495ae853SAndroid Build Coastguard Worker
3401*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_num_in_bufs = MIN_IN_BUFS;
3402*495ae853SAndroid Build Coastguard Worker
3403*495ae853SAndroid Build Coastguard Worker
3404*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = 1;
3405*495ae853SAndroid Build Coastguard Worker
3406*495ae853SAndroid Build Coastguard Worker
3407*495ae853SAndroid Build Coastguard Worker pic_wd = 0;
3408*495ae853SAndroid Build Coastguard Worker pic_ht = 0;
3409*495ae853SAndroid Build Coastguard Worker
3410*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_header_decoded == 3)
3411*495ae853SAndroid Build Coastguard Worker {
3412*495ae853SAndroid Build Coastguard Worker
3413*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
3414*495ae853SAndroid Build Coastguard Worker {
3415*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u2_disp_width;
3416*495ae853SAndroid Build Coastguard Worker pic_ht = ps_dec->u2_disp_height;
3417*495ae853SAndroid Build Coastguard Worker
3418*495ae853SAndroid Build Coastguard Worker }
3419*495ae853SAndroid Build Coastguard Worker else
3420*495ae853SAndroid Build Coastguard Worker {
3421*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u2_frm_wd_y;
3422*495ae853SAndroid Build Coastguard Worker pic_ht = ps_dec->u2_frm_ht_y;
3423*495ae853SAndroid Build Coastguard Worker }
3424*495ae853SAndroid Build Coastguard Worker
3425*495ae853SAndroid Build Coastguard Worker }
3426*495ae853SAndroid Build Coastguard Worker
3427*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_ctl_op->u4_min_num_in_bufs; i++)
3428*495ae853SAndroid Build Coastguard Worker {
3429*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_in_buf_size[i] = MAX(256000, pic_wd * pic_ht * 3 / 2);
3430*495ae853SAndroid Build Coastguard Worker }
3431*495ae853SAndroid Build Coastguard Worker if((WORD32)ps_dec->u4_app_disp_width > pic_wd)
3432*495ae853SAndroid Build Coastguard Worker pic_wd = ps_dec->u4_app_disp_width;
3433*495ae853SAndroid Build Coastguard Worker
3434*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
3435*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = 1;
3436*495ae853SAndroid Build Coastguard Worker else
3437*495ae853SAndroid Build Coastguard Worker {
3438*495ae853SAndroid Build Coastguard Worker if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
3439*495ae853SAndroid Build Coastguard Worker {
3440*495ae853SAndroid Build Coastguard Worker if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1) &&
3441*495ae853SAndroid Build Coastguard Worker (1 == ps_dec->ps_cur_sps->s_vui.u1_bitstream_restriction_flag))
3442*495ae853SAndroid Build Coastguard Worker {
3443*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs =
3444*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 1;
3445*495ae853SAndroid Build Coastguard Worker }
3446*495ae853SAndroid Build Coastguard Worker else
3447*495ae853SAndroid Build Coastguard Worker {
3448*495ae853SAndroid Build Coastguard Worker /*if VUI is not present assume maximum possible refrence frames for the level,
3449*495ae853SAndroid Build Coastguard Worker * as max reorder frames*/
3450*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size(ps_dec->ps_cur_sps);
3451*495ae853SAndroid Build Coastguard Worker }
3452*495ae853SAndroid Build Coastguard Worker
3453*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs +=
3454*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
3455*495ae853SAndroid Build Coastguard Worker
3456*495ae853SAndroid Build Coastguard Worker }
3457*495ae853SAndroid Build Coastguard Worker else
3458*495ae853SAndroid Build Coastguard Worker {
3459*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = 32;
3460*495ae853SAndroid Build Coastguard Worker
3461*495ae853SAndroid Build Coastguard Worker }
3462*495ae853SAndroid Build Coastguard Worker
3463*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = MAX(
3464*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs, 6);
3465*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs = MIN(
3466*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_num_disp_bufs, 32);
3467*495ae853SAndroid Build Coastguard Worker }
3468*495ae853SAndroid Build Coastguard Worker
3469*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_num_out_bufs = ih264d_get_outbuf_size(
3470*495ae853SAndroid Build Coastguard Worker pic_wd, pic_ht, ps_dec->u1_chroma_format,
3471*495ae853SAndroid Build Coastguard Worker &au4_min_out_buf_size[0]);
3472*495ae853SAndroid Build Coastguard Worker
3473*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_ctl_op->u4_min_num_out_bufs; i++)
3474*495ae853SAndroid Build Coastguard Worker {
3475*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_min_out_buf_size[i] = au4_min_out_buf_size[i];
3476*495ae853SAndroid Build Coastguard Worker }
3477*495ae853SAndroid Build Coastguard Worker
3478*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_disp_bufs_requested = ps_ctl_op->u4_num_disp_bufs;
3479*495ae853SAndroid Build Coastguard Worker
3480*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3481*495ae853SAndroid Build Coastguard Worker }
3482*495ae853SAndroid Build Coastguard Worker
3483*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3484*495ae853SAndroid Build Coastguard Worker /* */
3485*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_set_params */
3486*495ae853SAndroid Build Coastguard Worker /* */
3487*495ae853SAndroid Build Coastguard Worker /* Description : */
3488*495ae853SAndroid Build Coastguard Worker /* */
3489*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3490*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3491*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3492*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3493*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3494*495ae853SAndroid Build Coastguard Worker /* */
3495*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3496*495ae853SAndroid Build Coastguard Worker /* */
3497*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3498*495ae853SAndroid Build Coastguard Worker /* */
3499*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3500*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3501*495ae853SAndroid Build Coastguard Worker /* */
3502*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_set_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3503*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
3504*495ae853SAndroid Build Coastguard Worker {
3505*495ae853SAndroid Build Coastguard Worker
3506*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec;
3507*495ae853SAndroid Build Coastguard Worker WORD32 ret = IV_SUCCESS;
3508*495ae853SAndroid Build Coastguard Worker
3509*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_config_ip_t *ps_h264d_ctl_ip =
3510*495ae853SAndroid Build Coastguard Worker (ih264d_ctl_set_config_ip_t *)pv_api_ip;
3511*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_config_op_t *ps_h264d_ctl_op =
3512*495ae853SAndroid Build Coastguard Worker (ih264d_ctl_set_config_op_t *)pv_api_op;
3513*495ae853SAndroid Build Coastguard Worker ivd_ctl_set_config_ip_t *ps_ctl_ip =
3514*495ae853SAndroid Build Coastguard Worker &ps_h264d_ctl_ip->s_ivd_ctl_set_config_ip_t;
3515*495ae853SAndroid Build Coastguard Worker ivd_ctl_set_config_op_t *ps_ctl_op =
3516*495ae853SAndroid Build Coastguard Worker &ps_h264d_ctl_op->s_ivd_ctl_set_config_op_t;
3517*495ae853SAndroid Build Coastguard Worker
3518*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
3519*495ae853SAndroid Build Coastguard Worker
3520*495ae853SAndroid Build Coastguard Worker ps_dec->u4_skip_frm_mask = 0;
3521*495ae853SAndroid Build Coastguard Worker
3522*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = 0;
3523*495ae853SAndroid Build Coastguard Worker
3524*495ae853SAndroid Build Coastguard Worker if(ps_ctl_ip->e_frm_skip_mode != IVD_SKIP_NONE)
3525*495ae853SAndroid Build Coastguard Worker {
3526*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = (1 << IVD_UNSUPPORTEDPARAM);
3527*495ae853SAndroid Build Coastguard Worker ret = IV_FAIL;
3528*495ae853SAndroid Build Coastguard Worker }
3529*495ae853SAndroid Build Coastguard Worker
3530*495ae853SAndroid Build Coastguard Worker if(ps_ctl_ip->u4_disp_wd >= ps_dec->u2_disp_width)
3531*495ae853SAndroid Build Coastguard Worker {
3532*495ae853SAndroid Build Coastguard Worker ps_dec->u4_app_disp_width = ps_ctl_ip->u4_disp_wd;
3533*495ae853SAndroid Build Coastguard Worker }
3534*495ae853SAndroid Build Coastguard Worker else if(0 == ps_dec->i4_header_decoded)
3535*495ae853SAndroid Build Coastguard Worker {
3536*495ae853SAndroid Build Coastguard Worker ps_dec->u4_app_disp_width = ps_ctl_ip->u4_disp_wd;
3537*495ae853SAndroid Build Coastguard Worker }
3538*495ae853SAndroid Build Coastguard Worker else if(ps_ctl_ip->u4_disp_wd == 0)
3539*495ae853SAndroid Build Coastguard Worker {
3540*495ae853SAndroid Build Coastguard Worker ps_dec->u4_app_disp_width = 0;
3541*495ae853SAndroid Build Coastguard Worker }
3542*495ae853SAndroid Build Coastguard Worker else
3543*495ae853SAndroid Build Coastguard Worker {
3544*495ae853SAndroid Build Coastguard Worker /*
3545*495ae853SAndroid Build Coastguard Worker * Set the display width to zero. This will ensure that the wrong value we had stored (0xFFFFFFFF)
3546*495ae853SAndroid Build Coastguard Worker * does not propogate.
3547*495ae853SAndroid Build Coastguard Worker */
3548*495ae853SAndroid Build Coastguard Worker ps_dec->u4_app_disp_width = 0;
3549*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code |= (1 << IVD_UNSUPPORTEDPARAM);
3550*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code |= ERROR_DISP_WIDTH_INVALID;
3551*495ae853SAndroid Build Coastguard Worker ret = IV_FAIL;
3552*495ae853SAndroid Build Coastguard Worker }
3553*495ae853SAndroid Build Coastguard Worker
3554*495ae853SAndroid Build Coastguard Worker if(ps_ctl_ip->e_vid_dec_mode == IVD_DECODE_FRAME)
3555*495ae853SAndroid Build Coastguard Worker ps_dec->i4_decode_header = 0;
3556*495ae853SAndroid Build Coastguard Worker else if(ps_ctl_ip->e_vid_dec_mode == IVD_DECODE_HEADER)
3557*495ae853SAndroid Build Coastguard Worker ps_dec->i4_decode_header = 1;
3558*495ae853SAndroid Build Coastguard Worker else
3559*495ae853SAndroid Build Coastguard Worker {
3560*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = (1 << IVD_UNSUPPORTEDPARAM);
3561*495ae853SAndroid Build Coastguard Worker ps_dec->i4_decode_header = 1;
3562*495ae853SAndroid Build Coastguard Worker ret = IV_FAIL;
3563*495ae853SAndroid Build Coastguard Worker }
3564*495ae853SAndroid Build Coastguard Worker ps_dec->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
3565*495ae853SAndroid Build Coastguard Worker
3566*495ae853SAndroid Build Coastguard Worker if((ps_ctl_ip->e_frm_out_mode != IVD_DECODE_FRAME_OUT) &&
3567*495ae853SAndroid Build Coastguard Worker (ps_ctl_ip->e_frm_out_mode != IVD_DISPLAY_FRAME_OUT))
3568*495ae853SAndroid Build Coastguard Worker {
3569*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = (1 << IVD_UNSUPPORTEDPARAM);
3570*495ae853SAndroid Build Coastguard Worker ret = IV_FAIL;
3571*495ae853SAndroid Build Coastguard Worker }
3572*495ae853SAndroid Build Coastguard Worker ps_dec->e_frm_out_mode = ps_ctl_ip->e_frm_out_mode;
3573*495ae853SAndroid Build Coastguard Worker return ret;
3574*495ae853SAndroid Build Coastguard Worker
3575*495ae853SAndroid Build Coastguard Worker }
3576*495ae853SAndroid Build Coastguard Worker
3577*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3578*495ae853SAndroid Build Coastguard Worker /* */
3579*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_set_default_params */
3580*495ae853SAndroid Build Coastguard Worker /* */
3581*495ae853SAndroid Build Coastguard Worker /* Description : */
3582*495ae853SAndroid Build Coastguard Worker /* */
3583*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3584*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3585*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3586*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3587*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3588*495ae853SAndroid Build Coastguard Worker /* */
3589*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3590*495ae853SAndroid Build Coastguard Worker /* */
3591*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3592*495ae853SAndroid Build Coastguard Worker /* */
3593*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3594*495ae853SAndroid Build Coastguard Worker /* 08 08 2011 100421 Copied from set_params */
3595*495ae853SAndroid Build Coastguard Worker /* */
3596*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_set_default_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3597*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_default_params(iv_obj_t *dec_hdl,
3598*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
3599*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
3600*495ae853SAndroid Build Coastguard Worker {
3601*495ae853SAndroid Build Coastguard Worker
3602*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec;
3603*495ae853SAndroid Build Coastguard Worker WORD32 ret = IV_SUCCESS;
3604*495ae853SAndroid Build Coastguard Worker
3605*495ae853SAndroid Build Coastguard Worker ivd_ctl_set_config_op_t *ps_ctl_op =
3606*495ae853SAndroid Build Coastguard Worker (ivd_ctl_set_config_op_t *)pv_api_op;
3607*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
3608*495ae853SAndroid Build Coastguard Worker UNUSED(pv_api_ip);
3609*495ae853SAndroid Build Coastguard Worker
3610*495ae853SAndroid Build Coastguard Worker
3611*495ae853SAndroid Build Coastguard Worker {
3612*495ae853SAndroid Build Coastguard Worker ps_dec->u4_app_disp_width = 0;
3613*495ae853SAndroid Build Coastguard Worker ps_dec->u4_skip_frm_mask = 0;
3614*495ae853SAndroid Build Coastguard Worker ps_dec->i4_decode_header = 1;
3615*495ae853SAndroid Build Coastguard Worker
3616*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = 0;
3617*495ae853SAndroid Build Coastguard Worker }
3618*495ae853SAndroid Build Coastguard Worker
3619*495ae853SAndroid Build Coastguard Worker
3620*495ae853SAndroid Build Coastguard Worker return ret;
3621*495ae853SAndroid Build Coastguard Worker }
3622*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3623*495ae853SAndroid Build Coastguard Worker /* */
3624*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_reset */
3625*495ae853SAndroid Build Coastguard Worker /* */
3626*495ae853SAndroid Build Coastguard Worker /* Description : */
3627*495ae853SAndroid Build Coastguard Worker /* */
3628*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3629*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3630*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3631*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
3632*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3633*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3634*495ae853SAndroid Build Coastguard Worker /* */
3635*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3636*495ae853SAndroid Build Coastguard Worker /* */
3637*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3638*495ae853SAndroid Build Coastguard Worker /* */
3639*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3640*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3641*495ae853SAndroid Build Coastguard Worker /* */
3642*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_delete(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3643*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_delete(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
3644*495ae853SAndroid Build Coastguard Worker {
3645*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec;
3646*495ae853SAndroid Build Coastguard Worker ih264d_delete_ip_t *ps_ip = (ih264d_delete_ip_t *)pv_api_ip;
3647*495ae853SAndroid Build Coastguard Worker ih264d_delete_op_t *ps_op = (ih264d_delete_op_t *)pv_api_op;
3648*495ae853SAndroid Build Coastguard Worker
3649*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
3650*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
3651*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_delete_op_t.u4_error_code = 0;
3652*495ae853SAndroid Build Coastguard Worker ih264d_free_dynamic_bufs(ps_dec);
3653*495ae853SAndroid Build Coastguard Worker ih264d_free_static_bufs(dec_hdl);
3654*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3655*495ae853SAndroid Build Coastguard Worker }
3656*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3657*495ae853SAndroid Build Coastguard Worker /* */
3658*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_reset */
3659*495ae853SAndroid Build Coastguard Worker /* */
3660*495ae853SAndroid Build Coastguard Worker /* Description : */
3661*495ae853SAndroid Build Coastguard Worker /* */
3662*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3663*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3664*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3665*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
3666*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3667*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3668*495ae853SAndroid Build Coastguard Worker /* */
3669*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3670*495ae853SAndroid Build Coastguard Worker /* */
3671*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3672*495ae853SAndroid Build Coastguard Worker /* */
3673*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3674*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3675*495ae853SAndroid Build Coastguard Worker /* */
3676*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_reset(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3677*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_reset(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
3678*495ae853SAndroid Build Coastguard Worker {
3679*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec;
3680*495ae853SAndroid Build Coastguard Worker ivd_ctl_reset_op_t *ps_ctl_op = (ivd_ctl_reset_op_t *)pv_api_op;
3681*495ae853SAndroid Build Coastguard Worker UNUSED(pv_api_ip);
3682*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = 0;
3683*495ae853SAndroid Build Coastguard Worker
3684*495ae853SAndroid Build Coastguard Worker ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
3685*495ae853SAndroid Build Coastguard Worker
3686*495ae853SAndroid Build Coastguard Worker if(ps_dec != NULL)
3687*495ae853SAndroid Build Coastguard Worker {
3688*495ae853SAndroid Build Coastguard Worker ih264d_join_threads(ps_dec);
3689*495ae853SAndroid Build Coastguard Worker ih264d_init_decoder(ps_dec);
3690*495ae853SAndroid Build Coastguard Worker }
3691*495ae853SAndroid Build Coastguard Worker else
3692*495ae853SAndroid Build Coastguard Worker {
3693*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT(
3694*495ae853SAndroid Build Coastguard Worker "\nReset called without Initializing the decoder\n");
3695*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = ERROR_INIT_NOT_DONE;
3696*495ae853SAndroid Build Coastguard Worker }
3697*495ae853SAndroid Build Coastguard Worker
3698*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3699*495ae853SAndroid Build Coastguard Worker }
3700*495ae853SAndroid Build Coastguard Worker
3701*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3702*495ae853SAndroid Build Coastguard Worker /* */
3703*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_ctl */
3704*495ae853SAndroid Build Coastguard Worker /* */
3705*495ae853SAndroid Build Coastguard Worker /* Description : */
3706*495ae853SAndroid Build Coastguard Worker /* */
3707*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3708*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3709*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3710*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3711*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3712*495ae853SAndroid Build Coastguard Worker /* */
3713*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3714*495ae853SAndroid Build Coastguard Worker /* */
3715*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3716*495ae853SAndroid Build Coastguard Worker /* */
3717*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3718*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3719*495ae853SAndroid Build Coastguard Worker /* */
3720*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_ctl(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3721*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_ctl(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
3722*495ae853SAndroid Build Coastguard Worker {
3723*495ae853SAndroid Build Coastguard Worker ivd_ctl_set_config_ip_t *ps_ctl_ip;
3724*495ae853SAndroid Build Coastguard Worker ivd_ctl_set_config_op_t *ps_ctl_op;
3725*495ae853SAndroid Build Coastguard Worker WORD32 ret = IV_SUCCESS;
3726*495ae853SAndroid Build Coastguard Worker UWORD32 subcommand;
3727*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
3728*495ae853SAndroid Build Coastguard Worker
3729*495ae853SAndroid Build Coastguard Worker if(ps_dec->init_done != 1)
3730*495ae853SAndroid Build Coastguard Worker {
3731*495ae853SAndroid Build Coastguard Worker //Return proper Error Code
3732*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
3733*495ae853SAndroid Build Coastguard Worker }
3734*495ae853SAndroid Build Coastguard Worker ps_ctl_ip = (ivd_ctl_set_config_ip_t*)pv_api_ip;
3735*495ae853SAndroid Build Coastguard Worker ps_ctl_op = (ivd_ctl_set_config_op_t*)pv_api_op;
3736*495ae853SAndroid Build Coastguard Worker ps_ctl_op->u4_error_code = 0;
3737*495ae853SAndroid Build Coastguard Worker subcommand = ps_ctl_ip->e_sub_cmd;
3738*495ae853SAndroid Build Coastguard Worker
3739*495ae853SAndroid Build Coastguard Worker switch(subcommand)
3740*495ae853SAndroid Build Coastguard Worker {
3741*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_GETPARAMS:
3742*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_status(dec_hdl, (void *)pv_api_ip,
3743*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3744*495ae853SAndroid Build Coastguard Worker break;
3745*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_SETPARAMS:
3746*495ae853SAndroid Build Coastguard Worker ret = ih264d_set_params(dec_hdl, (void *)pv_api_ip,
3747*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3748*495ae853SAndroid Build Coastguard Worker break;
3749*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_RESET:
3750*495ae853SAndroid Build Coastguard Worker ret = ih264d_reset(dec_hdl, (void *)pv_api_ip, (void *)pv_api_op);
3751*495ae853SAndroid Build Coastguard Worker break;
3752*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_SETDEFAULT:
3753*495ae853SAndroid Build Coastguard Worker ret = ih264d_set_default_params(dec_hdl, (void *)pv_api_ip,
3754*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3755*495ae853SAndroid Build Coastguard Worker break;
3756*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_FLUSH:
3757*495ae853SAndroid Build Coastguard Worker ret = ih264d_set_flush_mode(dec_hdl, (void *)pv_api_ip,
3758*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3759*495ae853SAndroid Build Coastguard Worker break;
3760*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_GETBUFINFO:
3761*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_buf_info(dec_hdl, (void *)pv_api_ip,
3762*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3763*495ae853SAndroid Build Coastguard Worker break;
3764*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_GETVERSION:
3765*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_version(dec_hdl, (void *)pv_api_ip,
3766*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3767*495ae853SAndroid Build Coastguard Worker break;
3768*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_DEGRADE:
3769*495ae853SAndroid Build Coastguard Worker ret = ih264d_set_degrade(dec_hdl, (void *)pv_api_ip,
3770*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3771*495ae853SAndroid Build Coastguard Worker break;
3772*495ae853SAndroid Build Coastguard Worker
3773*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_SET_NUM_CORES:
3774*495ae853SAndroid Build Coastguard Worker ret = ih264d_set_num_cores(dec_hdl, (void *)pv_api_ip,
3775*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3776*495ae853SAndroid Build Coastguard Worker break;
3777*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_BUFFER_DIMENSIONS:
3778*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_frame_dimensions(dec_hdl, (void *)pv_api_ip,
3779*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3780*495ae853SAndroid Build Coastguard Worker break;
3781*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_VUI_PARAMS:
3782*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_vui_params(dec_hdl, (void *)pv_api_ip,
3783*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3784*495ae853SAndroid Build Coastguard Worker break;
3785*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS:
3786*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_sei_mdcv_params(dec_hdl, (void *)pv_api_ip,
3787*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3788*495ae853SAndroid Build Coastguard Worker break;
3789*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_CLL_PARAMS:
3790*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_sei_cll_params(dec_hdl, (void *)pv_api_ip,
3791*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3792*495ae853SAndroid Build Coastguard Worker break;
3793*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_AVE_PARAMS:
3794*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_sei_ave_params(dec_hdl, (void *)pv_api_ip,
3795*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3796*495ae853SAndroid Build Coastguard Worker break;
3797*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_CCV_PARAMS:
3798*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_sei_ccv_params(dec_hdl, (void *)pv_api_ip,
3799*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3800*495ae853SAndroid Build Coastguard Worker break;
3801*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_SII_PARAMS:
3802*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_sei_sii_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
3803*495ae853SAndroid Build Coastguard Worker break;
3804*495ae853SAndroid Build Coastguard Worker
3805*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_GET_SEI_FGC_PARAMS:
3806*495ae853SAndroid Build Coastguard Worker ret = ih264d_get_sei_fgc_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
3807*495ae853SAndroid Build Coastguard Worker break;
3808*495ae853SAndroid Build Coastguard Worker
3809*495ae853SAndroid Build Coastguard Worker case IH264D_CMD_CTL_SET_PROCESSOR:
3810*495ae853SAndroid Build Coastguard Worker ret = ih264d_set_processor(dec_hdl, (void *)pv_api_ip,
3811*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
3812*495ae853SAndroid Build Coastguard Worker break;
3813*495ae853SAndroid Build Coastguard Worker default:
3814*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("\ndo nothing\n")
3815*495ae853SAndroid Build Coastguard Worker ;
3816*495ae853SAndroid Build Coastguard Worker break;
3817*495ae853SAndroid Build Coastguard Worker }
3818*495ae853SAndroid Build Coastguard Worker
3819*495ae853SAndroid Build Coastguard Worker return ret;
3820*495ae853SAndroid Build Coastguard Worker }
3821*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3822*495ae853SAndroid Build Coastguard Worker /* */
3823*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_rel_display_frame */
3824*495ae853SAndroid Build Coastguard Worker /* */
3825*495ae853SAndroid Build Coastguard Worker /* Description : */
3826*495ae853SAndroid Build Coastguard Worker /* */
3827*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
3828*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
3829*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
3830*495ae853SAndroid Build Coastguard Worker /* Outputs : */
3831*495ae853SAndroid Build Coastguard Worker /* Returns : void */
3832*495ae853SAndroid Build Coastguard Worker /* */
3833*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3834*495ae853SAndroid Build Coastguard Worker /* */
3835*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3836*495ae853SAndroid Build Coastguard Worker /* */
3837*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3838*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
3839*495ae853SAndroid Build Coastguard Worker /* */
3840*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_rel_display_frame(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3841*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_rel_display_frame(iv_obj_t *dec_hdl,
3842*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
3843*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
3844*495ae853SAndroid Build Coastguard Worker {
3845*495ae853SAndroid Build Coastguard Worker
3846*495ae853SAndroid Build Coastguard Worker ivd_rel_display_frame_ip_t *ps_rel_ip;
3847*495ae853SAndroid Build Coastguard Worker ivd_rel_display_frame_op_t *ps_rel_op;
3848*495ae853SAndroid Build Coastguard Worker UWORD32 buf_released = 0;
3849*495ae853SAndroid Build Coastguard Worker
3850*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ts = 0;
3851*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
3852*495ae853SAndroid Build Coastguard Worker
3853*495ae853SAndroid Build Coastguard Worker ps_rel_ip = (ivd_rel_display_frame_ip_t *)pv_api_ip;
3854*495ae853SAndroid Build Coastguard Worker ps_rel_op = (ivd_rel_display_frame_op_t *)pv_api_op;
3855*495ae853SAndroid Build Coastguard Worker ps_rel_op->u4_error_code = 0;
3856*495ae853SAndroid Build Coastguard Worker u4_ts = ps_rel_ip->u4_disp_buf_id;
3857*495ae853SAndroid Build Coastguard Worker
3858*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
3859*495ae853SAndroid Build Coastguard Worker {
3860*495ae853SAndroid Build Coastguard Worker ps_dec->u4_disp_buf_mapping[u4_ts] = 0;
3861*495ae853SAndroid Build Coastguard Worker ps_dec->u4_disp_buf_to_be_freed[u4_ts] = 0;
3862*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3863*495ae853SAndroid Build Coastguard Worker }
3864*495ae853SAndroid Build Coastguard Worker
3865*495ae853SAndroid Build Coastguard Worker if(ps_dec->pv_pic_buf_mgr != NULL)
3866*495ae853SAndroid Build Coastguard Worker {
3867*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u4_disp_buf_mapping[u4_ts])
3868*495ae853SAndroid Build Coastguard Worker {
3869*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
3870*495ae853SAndroid Build Coastguard Worker ps_rel_ip->u4_disp_buf_id,
3871*495ae853SAndroid Build Coastguard Worker BUF_MGR_IO);
3872*495ae853SAndroid Build Coastguard Worker ps_dec->u4_disp_buf_mapping[u4_ts] = 0;
3873*495ae853SAndroid Build Coastguard Worker buf_released = 1;
3874*495ae853SAndroid Build Coastguard Worker }
3875*495ae853SAndroid Build Coastguard Worker }
3876*495ae853SAndroid Build Coastguard Worker
3877*495ae853SAndroid Build Coastguard Worker if((1 == ps_dec->u4_share_disp_buf) && (0 == buf_released))
3878*495ae853SAndroid Build Coastguard Worker ps_dec->u4_disp_buf_to_be_freed[u4_ts] = 1;
3879*495ae853SAndroid Build Coastguard Worker
3880*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3881*495ae853SAndroid Build Coastguard Worker }
3882*495ae853SAndroid Build Coastguard Worker
3883*495ae853SAndroid Build Coastguard Worker /**
3884*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3885*495ae853SAndroid Build Coastguard Worker *
3886*495ae853SAndroid Build Coastguard Worker * @brief
3887*495ae853SAndroid Build Coastguard Worker * Sets degrade params
3888*495ae853SAndroid Build Coastguard Worker *
3889*495ae853SAndroid Build Coastguard Worker * @par Description:
3890*495ae853SAndroid Build Coastguard Worker * Sets degrade params.
3891*495ae853SAndroid Build Coastguard Worker * Refer to ih264d_ctl_degrade_ip_t definition for details
3892*495ae853SAndroid Build Coastguard Worker *
3893*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec_obj
3894*495ae853SAndroid Build Coastguard Worker * Pointer to codec object at API level
3895*495ae853SAndroid Build Coastguard Worker *
3896*495ae853SAndroid Build Coastguard Worker * @param[in] pv_api_ip
3897*495ae853SAndroid Build Coastguard Worker * Pointer to input argument structure
3898*495ae853SAndroid Build Coastguard Worker *
3899*495ae853SAndroid Build Coastguard Worker * @param[out] pv_api_op
3900*495ae853SAndroid Build Coastguard Worker * Pointer to output argument structure
3901*495ae853SAndroid Build Coastguard Worker *
3902*495ae853SAndroid Build Coastguard Worker * @returns Status
3903*495ae853SAndroid Build Coastguard Worker *
3904*495ae853SAndroid Build Coastguard Worker * @remarks
3905*495ae853SAndroid Build Coastguard Worker *
3906*495ae853SAndroid Build Coastguard Worker *
3907*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3908*495ae853SAndroid Build Coastguard Worker */
3909*495ae853SAndroid Build Coastguard Worker
ih264d_set_degrade(iv_obj_t * ps_codec_obj,void * pv_api_ip,void * pv_api_op)3910*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_degrade(iv_obj_t *ps_codec_obj,
3911*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
3912*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
3913*495ae853SAndroid Build Coastguard Worker {
3914*495ae853SAndroid Build Coastguard Worker ih264d_ctl_degrade_ip_t *ps_ip;
3915*495ae853SAndroid Build Coastguard Worker ih264d_ctl_degrade_op_t *ps_op;
3916*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_codec = (dec_struct_t *)ps_codec_obj->pv_codec_handle;
3917*495ae853SAndroid Build Coastguard Worker
3918*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_degrade_ip_t *)pv_api_ip;
3919*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_degrade_op_t *)pv_api_op;
3920*495ae853SAndroid Build Coastguard Worker
3921*495ae853SAndroid Build Coastguard Worker ps_codec->i4_degrade_type = ps_ip->i4_degrade_type;
3922*495ae853SAndroid Build Coastguard Worker ps_codec->i4_nondegrade_interval = ps_ip->i4_nondegrade_interval;
3923*495ae853SAndroid Build Coastguard Worker ps_codec->i4_degrade_pics = ps_ip->i4_degrade_pics;
3924*495ae853SAndroid Build Coastguard Worker
3925*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = 0;
3926*495ae853SAndroid Build Coastguard Worker ps_codec->i4_degrade_pic_cnt = 0;
3927*495ae853SAndroid Build Coastguard Worker
3928*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
3929*495ae853SAndroid Build Coastguard Worker }
3930*495ae853SAndroid Build Coastguard Worker
ih264d_get_frame_dimensions(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)3931*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_frame_dimensions(iv_obj_t *dec_hdl,
3932*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
3933*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
3934*495ae853SAndroid Build Coastguard Worker {
3935*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_frame_dimensions_ip_t *ps_ip;
3936*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_frame_dimensions_op_t *ps_op;
3937*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
3938*495ae853SAndroid Build Coastguard Worker UWORD32 disp_wd, disp_ht, buffer_wd, buffer_ht, x_offset, y_offset;
3939*495ae853SAndroid Build Coastguard Worker
3940*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_frame_dimensions_ip_t *)pv_api_ip;
3941*495ae853SAndroid Build Coastguard Worker
3942*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_frame_dimensions_op_t *)pv_api_op;
3943*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
3944*495ae853SAndroid Build Coastguard Worker if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
3945*495ae853SAndroid Build Coastguard Worker {
3946*495ae853SAndroid Build Coastguard Worker disp_wd = ps_dec->u2_disp_width;
3947*495ae853SAndroid Build Coastguard Worker disp_ht = ps_dec->u2_disp_height;
3948*495ae853SAndroid Build Coastguard Worker
3949*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
3950*495ae853SAndroid Build Coastguard Worker {
3951*495ae853SAndroid Build Coastguard Worker buffer_wd = disp_wd;
3952*495ae853SAndroid Build Coastguard Worker buffer_ht = disp_ht;
3953*495ae853SAndroid Build Coastguard Worker }
3954*495ae853SAndroid Build Coastguard Worker else
3955*495ae853SAndroid Build Coastguard Worker {
3956*495ae853SAndroid Build Coastguard Worker buffer_wd = ps_dec->u2_frm_wd_y;
3957*495ae853SAndroid Build Coastguard Worker buffer_ht = ps_dec->u2_frm_ht_y;
3958*495ae853SAndroid Build Coastguard Worker }
3959*495ae853SAndroid Build Coastguard Worker }
3960*495ae853SAndroid Build Coastguard Worker else
3961*495ae853SAndroid Build Coastguard Worker {
3962*495ae853SAndroid Build Coastguard Worker disp_wd = 0;
3963*495ae853SAndroid Build Coastguard Worker disp_ht = 0;
3964*495ae853SAndroid Build Coastguard Worker
3965*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
3966*495ae853SAndroid Build Coastguard Worker {
3967*495ae853SAndroid Build Coastguard Worker buffer_wd = disp_wd;
3968*495ae853SAndroid Build Coastguard Worker buffer_ht = disp_ht;
3969*495ae853SAndroid Build Coastguard Worker }
3970*495ae853SAndroid Build Coastguard Worker else
3971*495ae853SAndroid Build Coastguard Worker {
3972*495ae853SAndroid Build Coastguard Worker buffer_wd = ALIGN16(disp_wd) + (PAD_LEN_Y_H << 1);
3973*495ae853SAndroid Build Coastguard Worker buffer_ht = ALIGN16(disp_ht) + (PAD_LEN_Y_V << 2);
3974*495ae853SAndroid Build Coastguard Worker }
3975*495ae853SAndroid Build Coastguard Worker }
3976*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_app_disp_width > buffer_wd)
3977*495ae853SAndroid Build Coastguard Worker buffer_wd = ps_dec->u4_app_disp_width;
3978*495ae853SAndroid Build Coastguard Worker
3979*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
3980*495ae853SAndroid Build Coastguard Worker {
3981*495ae853SAndroid Build Coastguard Worker x_offset = 0;
3982*495ae853SAndroid Build Coastguard Worker y_offset = 0;
3983*495ae853SAndroid Build Coastguard Worker }
3984*495ae853SAndroid Build Coastguard Worker else
3985*495ae853SAndroid Build Coastguard Worker {
3986*495ae853SAndroid Build Coastguard Worker y_offset = (PAD_LEN_Y_V << 1);
3987*495ae853SAndroid Build Coastguard Worker x_offset = PAD_LEN_Y_H;
3988*495ae853SAndroid Build Coastguard Worker
3989*495ae853SAndroid Build Coastguard Worker if((NULL != ps_dec->ps_sps) && (1 == (ps_dec->ps_sps->u1_is_valid))
3990*495ae853SAndroid Build Coastguard Worker && (0 != ps_dec->u2_crop_offset_y))
3991*495ae853SAndroid Build Coastguard Worker {
3992*495ae853SAndroid Build Coastguard Worker y_offset += ps_dec->u2_crop_offset_y / ps_dec->u2_frm_wd_y;
3993*495ae853SAndroid Build Coastguard Worker x_offset += ps_dec->u2_crop_offset_y % ps_dec->u2_frm_wd_y;
3994*495ae853SAndroid Build Coastguard Worker }
3995*495ae853SAndroid Build Coastguard Worker }
3996*495ae853SAndroid Build Coastguard Worker
3997*495ae853SAndroid Build Coastguard Worker ps_op->u4_disp_wd[0] = disp_wd;
3998*495ae853SAndroid Build Coastguard Worker ps_op->u4_disp_ht[0] = disp_ht;
3999*495ae853SAndroid Build Coastguard Worker ps_op->u4_buffer_wd[0] = buffer_wd;
4000*495ae853SAndroid Build Coastguard Worker ps_op->u4_buffer_ht[0] = buffer_ht;
4001*495ae853SAndroid Build Coastguard Worker ps_op->u4_x_offset[0] = x_offset;
4002*495ae853SAndroid Build Coastguard Worker ps_op->u4_y_offset[0] = y_offset;
4003*495ae853SAndroid Build Coastguard Worker
4004*495ae853SAndroid Build Coastguard Worker ps_op->u4_disp_wd[1] = ps_op->u4_disp_wd[2] = ((ps_op->u4_disp_wd[0] + 1)
4005*495ae853SAndroid Build Coastguard Worker >> 1);
4006*495ae853SAndroid Build Coastguard Worker ps_op->u4_disp_ht[1] = ps_op->u4_disp_ht[2] = ((ps_op->u4_disp_ht[0] + 1)
4007*495ae853SAndroid Build Coastguard Worker >> 1);
4008*495ae853SAndroid Build Coastguard Worker ps_op->u4_buffer_wd[1] = ps_op->u4_buffer_wd[2] = (ps_op->u4_buffer_wd[0]
4009*495ae853SAndroid Build Coastguard Worker >> 1);
4010*495ae853SAndroid Build Coastguard Worker ps_op->u4_buffer_ht[1] = ps_op->u4_buffer_ht[2] = (ps_op->u4_buffer_ht[0]
4011*495ae853SAndroid Build Coastguard Worker >> 1);
4012*495ae853SAndroid Build Coastguard Worker ps_op->u4_x_offset[1] = ps_op->u4_x_offset[2] =
4013*495ae853SAndroid Build Coastguard Worker (ps_op->u4_x_offset[0] >> 1);
4014*495ae853SAndroid Build Coastguard Worker ps_op->u4_y_offset[1] = ps_op->u4_y_offset[2] =
4015*495ae853SAndroid Build Coastguard Worker (ps_op->u4_y_offset[0] >> 1);
4016*495ae853SAndroid Build Coastguard Worker
4017*495ae853SAndroid Build Coastguard Worker if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
4018*495ae853SAndroid Build Coastguard Worker || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU))
4019*495ae853SAndroid Build Coastguard Worker {
4020*495ae853SAndroid Build Coastguard Worker ps_op->u4_disp_wd[2] = 0;
4021*495ae853SAndroid Build Coastguard Worker ps_op->u4_disp_ht[2] = 0;
4022*495ae853SAndroid Build Coastguard Worker ps_op->u4_buffer_wd[2] = 0;
4023*495ae853SAndroid Build Coastguard Worker ps_op->u4_buffer_ht[2] = 0;
4024*495ae853SAndroid Build Coastguard Worker ps_op->u4_x_offset[2] = 0;
4025*495ae853SAndroid Build Coastguard Worker ps_op->u4_y_offset[2] = 0;
4026*495ae853SAndroid Build Coastguard Worker
4027*495ae853SAndroid Build Coastguard Worker ps_op->u4_disp_wd[1] <<= 1;
4028*495ae853SAndroid Build Coastguard Worker ps_op->u4_buffer_wd[1] <<= 1;
4029*495ae853SAndroid Build Coastguard Worker ps_op->u4_x_offset[1] <<= 1;
4030*495ae853SAndroid Build Coastguard Worker }
4031*495ae853SAndroid Build Coastguard Worker
4032*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
4033*495ae853SAndroid Build Coastguard Worker
4034*495ae853SAndroid Build Coastguard Worker }
4035*495ae853SAndroid Build Coastguard Worker
ih264d_get_vui_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4036*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_vui_params(iv_obj_t *dec_hdl,
4037*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
4038*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
4039*495ae853SAndroid Build Coastguard Worker {
4040*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_vui_params_ip_t *ps_ip;
4041*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_vui_params_op_t *ps_op;
4042*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
4043*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps;
4044*495ae853SAndroid Build Coastguard Worker vui_t *ps_vui;
4045*495ae853SAndroid Build Coastguard Worker WORD32 i;
4046*495ae853SAndroid Build Coastguard Worker UWORD32 u4_size;
4047*495ae853SAndroid Build Coastguard Worker
4048*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_vui_params_ip_t *)pv_api_ip;
4049*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_vui_params_op_t *)pv_api_op;
4050*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
4051*495ae853SAndroid Build Coastguard Worker
4052*495ae853SAndroid Build Coastguard Worker u4_size = ps_op->u4_size;
4053*495ae853SAndroid Build Coastguard Worker memset(ps_op, 0, sizeof(ih264d_ctl_get_vui_params_op_t));
4054*495ae853SAndroid Build Coastguard Worker ps_op->u4_size = u4_size;
4055*495ae853SAndroid Build Coastguard Worker
4056*495ae853SAndroid Build Coastguard Worker if(NULL == ps_dec->ps_cur_sps)
4057*495ae853SAndroid Build Coastguard Worker {
4058*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_VUI_PARAMS_NOT_FOUND;
4059*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4060*495ae853SAndroid Build Coastguard Worker }
4061*495ae853SAndroid Build Coastguard Worker
4062*495ae853SAndroid Build Coastguard Worker ps_sps = ps_dec->ps_cur_sps;
4063*495ae853SAndroid Build Coastguard Worker if((0 == ps_sps->u1_is_valid)
4064*495ae853SAndroid Build Coastguard Worker || (0 == ps_sps->u1_vui_parameters_present_flag))
4065*495ae853SAndroid Build Coastguard Worker {
4066*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_VUI_PARAMS_NOT_FOUND;
4067*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4068*495ae853SAndroid Build Coastguard Worker }
4069*495ae853SAndroid Build Coastguard Worker
4070*495ae853SAndroid Build Coastguard Worker ps_vui = &ps_sps->s_vui;
4071*495ae853SAndroid Build Coastguard Worker
4072*495ae853SAndroid Build Coastguard Worker ps_op->u1_aspect_ratio_idc = ps_vui->u1_aspect_ratio_idc;
4073*495ae853SAndroid Build Coastguard Worker ps_op->u2_sar_width = ps_vui->u2_sar_width;
4074*495ae853SAndroid Build Coastguard Worker ps_op->u2_sar_height = ps_vui->u2_sar_height;
4075*495ae853SAndroid Build Coastguard Worker ps_op->u1_overscan_appropriate_flag = ps_vui->u1_overscan_appropriate_flag;
4076*495ae853SAndroid Build Coastguard Worker ps_op->u1_video_format = ps_vui->u1_video_format;
4077*495ae853SAndroid Build Coastguard Worker ps_op->u1_video_full_range_flag = ps_vui->u1_video_full_range_flag;
4078*495ae853SAndroid Build Coastguard Worker ps_op->u1_colour_primaries = ps_vui->u1_colour_primaries;
4079*495ae853SAndroid Build Coastguard Worker ps_op->u1_tfr_chars = ps_vui->u1_tfr_chars;
4080*495ae853SAndroid Build Coastguard Worker ps_op->u1_matrix_coeffs = ps_vui->u1_matrix_coeffs;
4081*495ae853SAndroid Build Coastguard Worker ps_op->u1_cr_top_field = ps_vui->u1_cr_top_field;
4082*495ae853SAndroid Build Coastguard Worker ps_op->u1_cr_bottom_field = ps_vui->u1_cr_bottom_field;
4083*495ae853SAndroid Build Coastguard Worker ps_op->u4_num_units_in_tick = ps_vui->u4_num_units_in_tick;
4084*495ae853SAndroid Build Coastguard Worker ps_op->u4_time_scale = ps_vui->u4_time_scale;
4085*495ae853SAndroid Build Coastguard Worker ps_op->u1_fixed_frame_rate_flag = ps_vui->u1_fixed_frame_rate_flag;
4086*495ae853SAndroid Build Coastguard Worker ps_op->u1_nal_hrd_params_present = ps_vui->u1_nal_hrd_params_present;
4087*495ae853SAndroid Build Coastguard Worker ps_op->u1_vcl_hrd_params_present = ps_vui->u1_vcl_hrd_params_present;
4088*495ae853SAndroid Build Coastguard Worker ps_op->u1_low_delay_hrd_flag = ps_vui->u1_low_delay_hrd_flag;
4089*495ae853SAndroid Build Coastguard Worker ps_op->u1_pic_struct_present_flag = ps_vui->u1_pic_struct_present_flag;
4090*495ae853SAndroid Build Coastguard Worker ps_op->u1_bitstream_restriction_flag = ps_vui->u1_bitstream_restriction_flag;
4091*495ae853SAndroid Build Coastguard Worker ps_op->u1_mv_over_pic_boundaries_flag = ps_vui->u1_mv_over_pic_boundaries_flag;
4092*495ae853SAndroid Build Coastguard Worker ps_op->u4_max_bytes_per_pic_denom = ps_vui->u4_max_bytes_per_pic_denom;
4093*495ae853SAndroid Build Coastguard Worker ps_op->u4_max_bits_per_mb_denom = ps_vui->u4_max_bits_per_mb_denom;
4094*495ae853SAndroid Build Coastguard Worker ps_op->u4_log2_max_mv_length_horz = ps_vui->u4_log2_max_mv_length_horz;
4095*495ae853SAndroid Build Coastguard Worker ps_op->u4_log2_max_mv_length_vert = ps_vui->u4_log2_max_mv_length_vert;
4096*495ae853SAndroid Build Coastguard Worker ps_op->u4_num_reorder_frames = ps_vui->u4_num_reorder_frames;
4097*495ae853SAndroid Build Coastguard Worker ps_op->u4_max_dec_frame_buffering = ps_vui->u4_max_dec_frame_buffering;
4098*495ae853SAndroid Build Coastguard Worker
4099*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
4100*495ae853SAndroid Build Coastguard Worker }
4101*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4102*495ae853SAndroid Build Coastguard Worker /* */
4103*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_sei_mdcv_params */
4104*495ae853SAndroid Build Coastguard Worker /* */
4105*495ae853SAndroid Build Coastguard Worker /* Description : This function populates SEI mdcv message in */
4106*495ae853SAndroid Build Coastguard Worker /* output structure */
4107*495ae853SAndroid Build Coastguard Worker /* Inputs : iv_obj_t decoder handle */
4108*495ae853SAndroid Build Coastguard Worker /* : pv_api_ip pointer to input structure */
4109*495ae853SAndroid Build Coastguard Worker /* : pv_api_op pointer to output structure */
4110*495ae853SAndroid Build Coastguard Worker /* Outputs : */
4111*495ae853SAndroid Build Coastguard Worker /* Returns : returns 0; 1 with error code when MDCV is not present */
4112*495ae853SAndroid Build Coastguard Worker /* */
4113*495ae853SAndroid Build Coastguard Worker /* Issues : none */
4114*495ae853SAndroid Build Coastguard Worker /* */
4115*495ae853SAndroid Build Coastguard Worker /* Revision History: */
4116*495ae853SAndroid Build Coastguard Worker /* */
4117*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
4118*495ae853SAndroid Build Coastguard Worker /* */
4119*495ae853SAndroid Build Coastguard Worker /* */
4120*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_sei_mdcv_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4121*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_mdcv_params(iv_obj_t *dec_hdl,
4122*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
4123*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
4124*495ae853SAndroid Build Coastguard Worker {
4125*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_mdcv_params_ip_t *ps_ip;
4126*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_mdcv_params_op_t *ps_op;
4127*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
4128*495ae853SAndroid Build Coastguard Worker sei_mdcv_params_t *ps_sei_mdcv;
4129*495ae853SAndroid Build Coastguard Worker WORD32 i4_count;
4130*495ae853SAndroid Build Coastguard Worker
4131*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_mdcv_params_ip_t *)pv_api_ip;
4132*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_mdcv_params_op_t *)pv_api_op;
4133*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
4134*495ae853SAndroid Build Coastguard Worker
4135*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_sei_export.u1_sei_mdcv_params_present_flag)
4136*495ae853SAndroid Build Coastguard Worker {
4137*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_SEI_MDCV_PARAMS_NOT_FOUND;
4138*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4139*495ae853SAndroid Build Coastguard Worker }
4140*495ae853SAndroid Build Coastguard Worker
4141*495ae853SAndroid Build Coastguard Worker ps_sei_mdcv = &ps_dec->s_sei_export.s_sei_mdcv_params;
4142*495ae853SAndroid Build Coastguard Worker
4143*495ae853SAndroid Build Coastguard Worker for(i4_count = 0; i4_count < NUM_SEI_MDCV_PRIMARIES; i4_count++)
4144*495ae853SAndroid Build Coastguard Worker {
4145*495ae853SAndroid Build Coastguard Worker ps_op->au2_display_primaries_x[i4_count] = ps_sei_mdcv->au2_display_primaries_x[i4_count];
4146*495ae853SAndroid Build Coastguard Worker ps_op->au2_display_primaries_y[i4_count] = ps_sei_mdcv->au2_display_primaries_y[i4_count];
4147*495ae853SAndroid Build Coastguard Worker }
4148*495ae853SAndroid Build Coastguard Worker
4149*495ae853SAndroid Build Coastguard Worker ps_op->u2_white_point_x = ps_sei_mdcv->u2_white_point_x;
4150*495ae853SAndroid Build Coastguard Worker ps_op->u2_white_point_y = ps_sei_mdcv->u2_white_point_y;
4151*495ae853SAndroid Build Coastguard Worker ps_op->u4_max_display_mastering_luminance = ps_sei_mdcv->u4_max_display_mastering_luminance;
4152*495ae853SAndroid Build Coastguard Worker ps_op->u4_min_display_mastering_luminance = ps_sei_mdcv->u4_min_display_mastering_luminance;
4153*495ae853SAndroid Build Coastguard Worker
4154*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
4155*495ae853SAndroid Build Coastguard Worker }
4156*495ae853SAndroid Build Coastguard Worker
4157*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4158*495ae853SAndroid Build Coastguard Worker /* */
4159*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_sei_cll_params */
4160*495ae853SAndroid Build Coastguard Worker /* */
4161*495ae853SAndroid Build Coastguard Worker /* Description : This function populates SEI cll message in */
4162*495ae853SAndroid Build Coastguard Worker /* output structure */
4163*495ae853SAndroid Build Coastguard Worker /* Inputs : iv_obj_t decoder handle */
4164*495ae853SAndroid Build Coastguard Worker /* : pv_api_ip pointer to input structure */
4165*495ae853SAndroid Build Coastguard Worker /* : pv_api_op pointer to output structure */
4166*495ae853SAndroid Build Coastguard Worker /* Outputs : */
4167*495ae853SAndroid Build Coastguard Worker /* Returns : returns 0; 1 with error code when CLL is not present */
4168*495ae853SAndroid Build Coastguard Worker /* */
4169*495ae853SAndroid Build Coastguard Worker /* Issues : none */
4170*495ae853SAndroid Build Coastguard Worker /* */
4171*495ae853SAndroid Build Coastguard Worker /* Revision History: */
4172*495ae853SAndroid Build Coastguard Worker /* */
4173*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
4174*495ae853SAndroid Build Coastguard Worker /* */
4175*495ae853SAndroid Build Coastguard Worker /* */
4176*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_sei_cll_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4177*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_cll_params(iv_obj_t *dec_hdl,
4178*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
4179*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
4180*495ae853SAndroid Build Coastguard Worker {
4181*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_cll_params_ip_t *ps_ip;
4182*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_cll_params_op_t *ps_op;
4183*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
4184*495ae853SAndroid Build Coastguard Worker sei_cll_params_t *ps_sei_cll;
4185*495ae853SAndroid Build Coastguard Worker
4186*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_cll_params_ip_t *)pv_api_ip;
4187*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_cll_params_op_t *)pv_api_op;
4188*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
4189*495ae853SAndroid Build Coastguard Worker
4190*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_sei_export.u1_sei_cll_params_present_flag)
4191*495ae853SAndroid Build Coastguard Worker {
4192*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_SEI_CLL_PARAMS_NOT_FOUND;
4193*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4194*495ae853SAndroid Build Coastguard Worker }
4195*495ae853SAndroid Build Coastguard Worker
4196*495ae853SAndroid Build Coastguard Worker ps_sei_cll = &ps_dec->s_sei_export.s_sei_cll_params;
4197*495ae853SAndroid Build Coastguard Worker
4198*495ae853SAndroid Build Coastguard Worker ps_op->u2_max_content_light_level = ps_sei_cll->u2_max_content_light_level;
4199*495ae853SAndroid Build Coastguard Worker ps_op->u2_max_pic_average_light_level = ps_sei_cll->u2_max_pic_average_light_level;
4200*495ae853SAndroid Build Coastguard Worker
4201*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
4202*495ae853SAndroid Build Coastguard Worker }
4203*495ae853SAndroid Build Coastguard Worker
4204*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4205*495ae853SAndroid Build Coastguard Worker /* */
4206*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_sei_ave_params */
4207*495ae853SAndroid Build Coastguard Worker /* */
4208*495ae853SAndroid Build Coastguard Worker /* Description : This function populates SEI ave message in */
4209*495ae853SAndroid Build Coastguard Worker /* output structure */
4210*495ae853SAndroid Build Coastguard Worker /* Inputs : iv_obj_t decoder handle */
4211*495ae853SAndroid Build Coastguard Worker /* : pv_api_ip pointer to input structure */
4212*495ae853SAndroid Build Coastguard Worker /* : pv_api_op pointer to output structure */
4213*495ae853SAndroid Build Coastguard Worker /* Outputs : */
4214*495ae853SAndroid Build Coastguard Worker /* Returns : returns 0; 1 with error code when AVE is not present */
4215*495ae853SAndroid Build Coastguard Worker /* */
4216*495ae853SAndroid Build Coastguard Worker /* Issues : none */
4217*495ae853SAndroid Build Coastguard Worker /* */
4218*495ae853SAndroid Build Coastguard Worker /* Revision History: */
4219*495ae853SAndroid Build Coastguard Worker /* */
4220*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
4221*495ae853SAndroid Build Coastguard Worker /* */
4222*495ae853SAndroid Build Coastguard Worker /* */
4223*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_sei_ave_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4224*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_ave_params(iv_obj_t *dec_hdl,
4225*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
4226*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
4227*495ae853SAndroid Build Coastguard Worker {
4228*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_ave_params_ip_t *ps_ip;
4229*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_ave_params_op_t *ps_op;
4230*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
4231*495ae853SAndroid Build Coastguard Worker sei_ave_params_t *ps_sei_ave;
4232*495ae853SAndroid Build Coastguard Worker
4233*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_ave_params_ip_t *)pv_api_ip;
4234*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_ave_params_op_t *)pv_api_op;
4235*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
4236*495ae853SAndroid Build Coastguard Worker
4237*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_sei_export.u1_sei_ave_params_present_flag)
4238*495ae853SAndroid Build Coastguard Worker {
4239*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_SEI_AVE_PARAMS_NOT_FOUND;
4240*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4241*495ae853SAndroid Build Coastguard Worker }
4242*495ae853SAndroid Build Coastguard Worker
4243*495ae853SAndroid Build Coastguard Worker ps_sei_ave = &ps_dec->s_sei_export.s_sei_ave_params;
4244*495ae853SAndroid Build Coastguard Worker
4245*495ae853SAndroid Build Coastguard Worker ps_op->u4_ambient_illuminance = ps_sei_ave->u4_ambient_illuminance;
4246*495ae853SAndroid Build Coastguard Worker ps_op->u2_ambient_light_x = ps_sei_ave->u2_ambient_light_x;
4247*495ae853SAndroid Build Coastguard Worker ps_op->u2_ambient_light_y = ps_sei_ave->u2_ambient_light_y;
4248*495ae853SAndroid Build Coastguard Worker
4249*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
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 /* Function Name : ih264d_get_sei_ccv_params */
4255*495ae853SAndroid Build Coastguard Worker /* */
4256*495ae853SAndroid Build Coastguard Worker /* Description : This function populates SEI mdcv message in */
4257*495ae853SAndroid Build Coastguard Worker /* output structure */
4258*495ae853SAndroid Build Coastguard Worker /* Inputs : iv_obj_t decoder handle */
4259*495ae853SAndroid Build Coastguard Worker /* : pv_api_ip pointer to input structure */
4260*495ae853SAndroid Build Coastguard Worker /* : pv_api_op pointer to output structure */
4261*495ae853SAndroid Build Coastguard Worker /* Outputs : */
4262*495ae853SAndroid Build Coastguard Worker /* Returns : returns 0; 1 with error code when CCV is not present */
4263*495ae853SAndroid Build Coastguard Worker /* */
4264*495ae853SAndroid Build Coastguard Worker /* Issues : none */
4265*495ae853SAndroid Build Coastguard Worker /* */
4266*495ae853SAndroid Build Coastguard Worker /* Revision History: */
4267*495ae853SAndroid Build Coastguard Worker /* */
4268*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
4269*495ae853SAndroid Build Coastguard Worker /* */
4270*495ae853SAndroid Build Coastguard Worker /* */
4271*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_sei_ccv_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4272*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_ccv_params(iv_obj_t *dec_hdl,
4273*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
4274*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
4275*495ae853SAndroid Build Coastguard Worker {
4276*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_ccv_params_ip_t *ps_ip;
4277*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_ccv_params_op_t *ps_op;
4278*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
4279*495ae853SAndroid Build Coastguard Worker sei_ccv_params_t *ps_sei_ccv;
4280*495ae853SAndroid Build Coastguard Worker WORD32 i4_count;
4281*495ae853SAndroid Build Coastguard Worker
4282*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_ccv_params_ip_t *)pv_api_ip;
4283*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_ccv_params_op_t *)pv_api_op;
4284*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
4285*495ae853SAndroid Build Coastguard Worker
4286*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_sei_export.u1_sei_ccv_params_present_flag)
4287*495ae853SAndroid Build Coastguard Worker {
4288*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_SEI_CCV_PARAMS_NOT_FOUND;
4289*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4290*495ae853SAndroid Build Coastguard Worker }
4291*495ae853SAndroid Build Coastguard Worker
4292*495ae853SAndroid Build Coastguard Worker ps_sei_ccv = &ps_dec->s_sei_export.s_sei_ccv_params;
4293*495ae853SAndroid Build Coastguard Worker
4294*495ae853SAndroid Build Coastguard Worker ps_op->u1_ccv_cancel_flag = ps_sei_ccv->u1_ccv_cancel_flag;
4295*495ae853SAndroid Build Coastguard Worker
4296*495ae853SAndroid Build Coastguard Worker if(0 == ps_op->u1_ccv_cancel_flag)
4297*495ae853SAndroid Build Coastguard Worker {
4298*495ae853SAndroid Build Coastguard Worker ps_op->u1_ccv_persistence_flag = ps_sei_ccv->u1_ccv_persistence_flag;
4299*495ae853SAndroid Build Coastguard Worker ps_op->u1_ccv_primaries_present_flag = ps_sei_ccv->u1_ccv_primaries_present_flag;
4300*495ae853SAndroid Build Coastguard Worker ps_op->u1_ccv_min_luminance_value_present_flag =
4301*495ae853SAndroid Build Coastguard Worker ps_sei_ccv->u1_ccv_min_luminance_value_present_flag;
4302*495ae853SAndroid Build Coastguard Worker ps_op->u1_ccv_max_luminance_value_present_flag =
4303*495ae853SAndroid Build Coastguard Worker ps_sei_ccv->u1_ccv_max_luminance_value_present_flag;
4304*495ae853SAndroid Build Coastguard Worker ps_op->u1_ccv_avg_luminance_value_present_flag =
4305*495ae853SAndroid Build Coastguard Worker ps_sei_ccv->u1_ccv_avg_luminance_value_present_flag;
4306*495ae853SAndroid Build Coastguard Worker ps_op->u1_ccv_reserved_zero_2bits = ps_sei_ccv->u1_ccv_reserved_zero_2bits;
4307*495ae853SAndroid Build Coastguard Worker
4308*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_primaries_present_flag)
4309*495ae853SAndroid Build Coastguard Worker {
4310*495ae853SAndroid Build Coastguard Worker for(i4_count = 0; i4_count < NUM_SEI_CCV_PRIMARIES; i4_count++)
4311*495ae853SAndroid Build Coastguard Worker {
4312*495ae853SAndroid Build Coastguard Worker ps_op->ai4_ccv_primaries_x[i4_count] = ps_sei_ccv->ai4_ccv_primaries_x[i4_count];
4313*495ae853SAndroid Build Coastguard Worker ps_op->ai4_ccv_primaries_y[i4_count] = ps_sei_ccv->ai4_ccv_primaries_y[i4_count];
4314*495ae853SAndroid Build Coastguard Worker }
4315*495ae853SAndroid Build Coastguard Worker }
4316*495ae853SAndroid Build Coastguard Worker
4317*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_min_luminance_value_present_flag)
4318*495ae853SAndroid Build Coastguard Worker {
4319*495ae853SAndroid Build Coastguard Worker ps_op->u4_ccv_min_luminance_value = ps_sei_ccv->u4_ccv_min_luminance_value;
4320*495ae853SAndroid Build Coastguard Worker }
4321*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_max_luminance_value_present_flag)
4322*495ae853SAndroid Build Coastguard Worker {
4323*495ae853SAndroid Build Coastguard Worker ps_op->u4_ccv_max_luminance_value = ps_sei_ccv->u4_ccv_max_luminance_value;
4324*495ae853SAndroid Build Coastguard Worker }
4325*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_avg_luminance_value_present_flag)
4326*495ae853SAndroid Build Coastguard Worker {
4327*495ae853SAndroid Build Coastguard Worker ps_op->u4_ccv_avg_luminance_value = ps_sei_ccv->u4_ccv_avg_luminance_value;
4328*495ae853SAndroid Build Coastguard Worker }
4329*495ae853SAndroid Build Coastguard Worker }
4330*495ae853SAndroid Build Coastguard Worker
4331*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
4332*495ae853SAndroid Build Coastguard Worker }
4333*495ae853SAndroid Build Coastguard Worker
4334*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4335*495ae853SAndroid Build Coastguard Worker /* */
4336*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_sei_sii_params */
4337*495ae853SAndroid Build Coastguard Worker /* */
4338*495ae853SAndroid Build Coastguard Worker /* Description : This function populates SEI sii message in */
4339*495ae853SAndroid Build Coastguard Worker /* output structure */
4340*495ae853SAndroid Build Coastguard Worker /* Inputs : iv_obj_t decoder handle */
4341*495ae853SAndroid Build Coastguard Worker /* : pv_api_ip pointer to input structure */
4342*495ae853SAndroid Build Coastguard Worker /* : pv_api_op pointer to output structure */
4343*495ae853SAndroid Build Coastguard Worker /* Outputs : */
4344*495ae853SAndroid Build Coastguard Worker /* Returns : returns 0; 1 with error code when SII is not present */
4345*495ae853SAndroid Build Coastguard Worker /* */
4346*495ae853SAndroid Build Coastguard Worker /* Issues : none */
4347*495ae853SAndroid Build Coastguard Worker /* */
4348*495ae853SAndroid Build Coastguard Worker /* Revision History: */
4349*495ae853SAndroid Build Coastguard Worker /* */
4350*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
4351*495ae853SAndroid Build Coastguard Worker /* */
4352*495ae853SAndroid Build Coastguard Worker /* */
4353*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_sei_sii_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4354*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_sii_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
4355*495ae853SAndroid Build Coastguard Worker {
4356*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_sii_params_ip_t *ps_ip;
4357*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_sii_params_op_t *ps_op;
4358*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
4359*495ae853SAndroid Build Coastguard Worker sei_sii_params_t *ps_sei_sii;
4360*495ae853SAndroid Build Coastguard Worker int i;
4361*495ae853SAndroid Build Coastguard Worker
4362*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_sii_params_ip_t *) pv_api_ip;
4363*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_sii_params_op_t *) pv_api_op;
4364*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
4365*495ae853SAndroid Build Coastguard Worker
4366*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_sei_export.u1_sei_sii_params_present_flag)
4367*495ae853SAndroid Build Coastguard Worker {
4368*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_SEI_SII_PARAMS_NOT_FOUND;
4369*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4370*495ae853SAndroid Build Coastguard Worker }
4371*495ae853SAndroid Build Coastguard Worker
4372*495ae853SAndroid Build Coastguard Worker ps_sei_sii = &ps_dec->s_sei_export.s_sei_sii_params;
4373*495ae853SAndroid Build Coastguard Worker
4374*495ae853SAndroid Build Coastguard Worker if((ps_sei_sii->u4_sii_sub_layer_idx > 0) &&
4375*495ae853SAndroid Build Coastguard Worker (ps_sei_sii->u1_fixed_shutter_interval_within_cvs_flag == 1))
4376*495ae853SAndroid Build Coastguard Worker {
4377*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_INV_SEI_SII_PARAMS;
4378*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4379*495ae853SAndroid Build Coastguard Worker }
4380*495ae853SAndroid Build Coastguard Worker
4381*495ae853SAndroid Build Coastguard Worker if((ps_sei_sii->u4_sii_sub_layer_idx > ps_sei_sii->u1_sii_max_sub_layers_minus1) &&
4382*495ae853SAndroid Build Coastguard Worker (ps_sei_sii->u1_fixed_shutter_interval_within_cvs_flag == 0))
4383*495ae853SAndroid Build Coastguard Worker {
4384*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_INV_SEI_SII_PARAMS;
4385*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4386*495ae853SAndroid Build Coastguard Worker }
4387*495ae853SAndroid Build Coastguard Worker
4388*495ae853SAndroid Build Coastguard Worker ps_op->u4_sii_sub_layer_idx = ps_sei_sii->u4_sii_sub_layer_idx;
4389*495ae853SAndroid Build Coastguard Worker
4390*495ae853SAndroid Build Coastguard Worker if(0 == ps_op->u4_sii_sub_layer_idx)
4391*495ae853SAndroid Build Coastguard Worker {
4392*495ae853SAndroid Build Coastguard Worker ps_op->u1_shutter_interval_info_present_flag =
4393*495ae853SAndroid Build Coastguard Worker ps_sei_sii->u1_shutter_interval_info_present_flag;
4394*495ae853SAndroid Build Coastguard Worker
4395*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_sii->u1_shutter_interval_info_present_flag)
4396*495ae853SAndroid Build Coastguard Worker {
4397*495ae853SAndroid Build Coastguard Worker ps_op->u4_sii_time_scale = ps_sei_sii->u4_sii_time_scale;
4398*495ae853SAndroid Build Coastguard Worker ps_op->u1_fixed_shutter_interval_within_cvs_flag =
4399*495ae853SAndroid Build Coastguard Worker ps_sei_sii->u1_fixed_shutter_interval_within_cvs_flag;
4400*495ae853SAndroid Build Coastguard Worker
4401*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_sii->u1_fixed_shutter_interval_within_cvs_flag)
4402*495ae853SAndroid Build Coastguard Worker {
4403*495ae853SAndroid Build Coastguard Worker ps_op->u4_sii_num_units_in_shutter_interval =
4404*495ae853SAndroid Build Coastguard Worker ps_sei_sii->u4_sii_num_units_in_shutter_interval;
4405*495ae853SAndroid Build Coastguard Worker }
4406*495ae853SAndroid Build Coastguard Worker else
4407*495ae853SAndroid Build Coastguard Worker {
4408*495ae853SAndroid Build Coastguard Worker ps_op->u1_sii_max_sub_layers_minus1 = ps_sei_sii->u1_sii_max_sub_layers_minus1;
4409*495ae853SAndroid Build Coastguard Worker for(i = 0; i <= ps_sei_sii->u1_sii_max_sub_layers_minus1; i++)
4410*495ae853SAndroid Build Coastguard Worker {
4411*495ae853SAndroid Build Coastguard Worker ps_op->au4_sub_layer_num_units_in_shutter_interval[i] =
4412*495ae853SAndroid Build Coastguard Worker ps_sei_sii->au4_sub_layer_num_units_in_shutter_interval[i];
4413*495ae853SAndroid Build Coastguard Worker }
4414*495ae853SAndroid Build Coastguard Worker }
4415*495ae853SAndroid Build Coastguard Worker }
4416*495ae853SAndroid Build Coastguard Worker }
4417*495ae853SAndroid Build Coastguard Worker
4418*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
4419*495ae853SAndroid Build Coastguard Worker }
4420*495ae853SAndroid Build Coastguard Worker
4421*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4422*495ae853SAndroid Build Coastguard Worker /* */
4423*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_sei_fgc_params */
4424*495ae853SAndroid Build Coastguard Worker /* */
4425*495ae853SAndroid Build Coastguard Worker /* Description : This function populates SEI FGC message in */
4426*495ae853SAndroid Build Coastguard Worker /* output structure */
4427*495ae853SAndroid Build Coastguard Worker /* Inputs : iv_obj_t decoder handle */
4428*495ae853SAndroid Build Coastguard Worker /* : pv_api_ip pointer to input structure */
4429*495ae853SAndroid Build Coastguard Worker /* : pv_api_op pointer to output structure */
4430*495ae853SAndroid Build Coastguard Worker /* Outputs : */
4431*495ae853SAndroid Build Coastguard Worker /* Returns : returns 0; 1 with error code when FGC is not present */
4432*495ae853SAndroid Build Coastguard Worker /* */
4433*495ae853SAndroid Build Coastguard Worker /* Issues : none */
4434*495ae853SAndroid Build Coastguard Worker /* */
4435*495ae853SAndroid Build Coastguard Worker /* Revision History: */
4436*495ae853SAndroid Build Coastguard Worker /* */
4437*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
4438*495ae853SAndroid Build Coastguard Worker /* */
4439*495ae853SAndroid Build Coastguard Worker /* */
4440*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_sei_fgc_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4441*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_sei_fgc_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
4442*495ae853SAndroid Build Coastguard Worker {
4443*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_fgc_params_ip_t *ps_ip;
4444*495ae853SAndroid Build Coastguard Worker ih264d_ctl_get_sei_fgc_params_op_t *ps_op;
4445*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
4446*495ae853SAndroid Build Coastguard Worker sei_fgc_params_t *ps_sei_fgc;
4447*495ae853SAndroid Build Coastguard Worker WORD32 i4_count;
4448*495ae853SAndroid Build Coastguard Worker UWORD32 c, i, j;
4449*495ae853SAndroid Build Coastguard Worker
4450*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_get_sei_fgc_params_ip_t *) pv_api_ip;
4451*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_get_sei_fgc_params_op_t *) pv_api_op;
4452*495ae853SAndroid Build Coastguard Worker UNUSED(ps_ip);
4453*495ae853SAndroid Build Coastguard Worker
4454*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->s_sei_export.u1_sei_fgc_params_present_flag)
4455*495ae853SAndroid Build Coastguard Worker {
4456*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = ERROR_SEI_FGC_PARAMS_NOT_FOUND;
4457*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4458*495ae853SAndroid Build Coastguard Worker }
4459*495ae853SAndroid Build Coastguard Worker
4460*495ae853SAndroid Build Coastguard Worker ps_sei_fgc = &ps_dec->s_sei_export.s_sei_fgc_params;
4461*495ae853SAndroid Build Coastguard Worker
4462*495ae853SAndroid Build Coastguard Worker ps_op->u1_film_grain_characteristics_cancel_flag =
4463*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->u1_film_grain_characteristics_cancel_flag;
4464*495ae853SAndroid Build Coastguard Worker
4465*495ae853SAndroid Build Coastguard Worker if(0 == ps_op->u1_film_grain_characteristics_cancel_flag)
4466*495ae853SAndroid Build Coastguard Worker {
4467*495ae853SAndroid Build Coastguard Worker ps_op->i4_poc = ps_sei_fgc->i4_poc;
4468*495ae853SAndroid Build Coastguard Worker ps_op->u4_idr_pic_id = ps_sei_fgc->u4_idr_pic_id;
4469*495ae853SAndroid Build Coastguard Worker ps_op->u1_film_grain_model_id = ps_sei_fgc->u1_film_grain_model_id;
4470*495ae853SAndroid Build Coastguard Worker ps_op->u1_separate_colour_description_present_flag =
4471*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->u1_separate_colour_description_present_flag;
4472*495ae853SAndroid Build Coastguard Worker
4473*495ae853SAndroid Build Coastguard Worker if(ps_op->u1_separate_colour_description_present_flag)
4474*495ae853SAndroid Build Coastguard Worker {
4475*495ae853SAndroid Build Coastguard Worker ps_op->u1_film_grain_bit_depth_luma_minus8 =
4476*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->u1_film_grain_bit_depth_luma_minus8;
4477*495ae853SAndroid Build Coastguard Worker ps_op->u1_film_grain_bit_depth_chroma_minus8 =
4478*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->u1_film_grain_bit_depth_chroma_minus8;
4479*495ae853SAndroid Build Coastguard Worker ps_op->u1_film_grain_full_range_flag = ps_sei_fgc->u1_film_grain_full_range_flag;
4480*495ae853SAndroid Build Coastguard Worker ps_op->u1_film_grain_colour_primaries = ps_sei_fgc->u1_film_grain_colour_primaries;
4481*495ae853SAndroid Build Coastguard Worker ps_op->u1_film_grain_transfer_characteristics =
4482*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->u1_film_grain_transfer_characteristics;
4483*495ae853SAndroid Build Coastguard Worker ps_op->u1_film_grain_matrix_coefficients =
4484*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->u1_film_grain_matrix_coefficients;
4485*495ae853SAndroid Build Coastguard Worker }
4486*495ae853SAndroid Build Coastguard Worker ps_op->u1_blending_mode_id = ps_sei_fgc->u1_blending_mode_id;
4487*495ae853SAndroid Build Coastguard Worker ps_op->u1_log2_scale_factor = ps_sei_fgc->u1_log2_scale_factor;
4488*495ae853SAndroid Build Coastguard Worker
4489*495ae853SAndroid Build Coastguard Worker for(c = 0; c < SEI_FGC_NUM_COLOUR_COMPONENTS; c++)
4490*495ae853SAndroid Build Coastguard Worker {
4491*495ae853SAndroid Build Coastguard Worker ps_op->au1_comp_model_present_flag[c] = ps_sei_fgc->au1_comp_model_present_flag[c];
4492*495ae853SAndroid Build Coastguard Worker }
4493*495ae853SAndroid Build Coastguard Worker
4494*495ae853SAndroid Build Coastguard Worker for(c = 0; c < SEI_FGC_NUM_COLOUR_COMPONENTS; c++)
4495*495ae853SAndroid Build Coastguard Worker {
4496*495ae853SAndroid Build Coastguard Worker if(ps_op->au1_comp_model_present_flag[c])
4497*495ae853SAndroid Build Coastguard Worker {
4498*495ae853SAndroid Build Coastguard Worker ps_op->au1_num_intensity_intervals_minus1[c] =
4499*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->au1_num_intensity_intervals_minus1[c];
4500*495ae853SAndroid Build Coastguard Worker
4501*495ae853SAndroid Build Coastguard Worker ps_op->au1_num_model_values_minus1[c] = ps_sei_fgc->au1_num_model_values_minus1[c];
4502*495ae853SAndroid Build Coastguard Worker
4503*495ae853SAndroid Build Coastguard Worker for(i = 0; i <= ps_op->au1_num_intensity_intervals_minus1[c]; i++)
4504*495ae853SAndroid Build Coastguard Worker {
4505*495ae853SAndroid Build Coastguard Worker ps_op->au1_intensity_interval_lower_bound[c][i] =
4506*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->au1_intensity_interval_lower_bound[c][i];
4507*495ae853SAndroid Build Coastguard Worker ps_op->au1_intensity_interval_upper_bound[c][i] =
4508*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->au1_intensity_interval_upper_bound[c][i];
4509*495ae853SAndroid Build Coastguard Worker
4510*495ae853SAndroid Build Coastguard Worker for(j = 0; j <= ps_op->au1_num_model_values_minus1[c]; j++)
4511*495ae853SAndroid Build Coastguard Worker {
4512*495ae853SAndroid Build Coastguard Worker ps_op->ai4_comp_model_value[c][i][j] =
4513*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->ai4_comp_model_value[c][i][j];
4514*495ae853SAndroid Build Coastguard Worker }
4515*495ae853SAndroid Build Coastguard Worker }
4516*495ae853SAndroid Build Coastguard Worker }
4517*495ae853SAndroid Build Coastguard Worker }
4518*495ae853SAndroid Build Coastguard Worker ps_op->u4_film_grain_characteristics_repetition_period =
4519*495ae853SAndroid Build Coastguard Worker ps_sei_fgc->u4_film_grain_characteristics_repetition_period;
4520*495ae853SAndroid Build Coastguard Worker }
4521*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
4522*495ae853SAndroid Build Coastguard Worker }
4523*495ae853SAndroid Build Coastguard Worker
ih264d_set_num_cores(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4524*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_set_num_cores(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
4525*495ae853SAndroid Build Coastguard Worker {
4526*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_num_cores_ip_t *ps_ip;
4527*495ae853SAndroid Build Coastguard Worker ih264d_ctl_set_num_cores_op_t *ps_op;
4528*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = dec_hdl->pv_codec_handle;
4529*495ae853SAndroid Build Coastguard Worker
4530*495ae853SAndroid Build Coastguard Worker ps_ip = (ih264d_ctl_set_num_cores_ip_t *)pv_api_ip;
4531*495ae853SAndroid Build Coastguard Worker ps_op = (ih264d_ctl_set_num_cores_op_t *)pv_api_op;
4532*495ae853SAndroid Build Coastguard Worker ps_op->u4_error_code = 0;
4533*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_cores = ps_ip->u4_num_cores;
4534*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_num_cores == 1)
4535*495ae853SAndroid Build Coastguard Worker {
4536*495ae853SAndroid Build Coastguard Worker ps_dec->u1_separate_parse = 0;
4537*495ae853SAndroid Build Coastguard Worker }
4538*495ae853SAndroid Build Coastguard Worker else
4539*495ae853SAndroid Build Coastguard Worker {
4540*495ae853SAndroid Build Coastguard Worker ps_dec->u1_separate_parse = 1;
4541*495ae853SAndroid Build Coastguard Worker }
4542*495ae853SAndroid Build Coastguard Worker
4543*495ae853SAndroid Build Coastguard Worker /*using only upto three threads currently*/
4544*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_num_cores > 3)
4545*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_cores = 3;
4546*495ae853SAndroid Build Coastguard Worker
4547*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
4548*495ae853SAndroid Build Coastguard Worker }
4549*495ae853SAndroid Build Coastguard Worker
ih264d_fill_output_struct_from_context(dec_struct_t * ps_dec,ivd_video_decode_op_t * ps_dec_op)4550*495ae853SAndroid Build Coastguard Worker void ih264d_fill_output_struct_from_context(dec_struct_t *ps_dec,
4551*495ae853SAndroid Build Coastguard Worker ivd_video_decode_op_t *ps_dec_op)
4552*495ae853SAndroid Build Coastguard Worker {
4553*495ae853SAndroid Build Coastguard Worker if((ps_dec_op->u4_error_code & 0xff)
4554*495ae853SAndroid Build Coastguard Worker != ERROR_DYNAMIC_RESOLUTION_NOT_SUPPORTED)
4555*495ae853SAndroid Build Coastguard Worker {
4556*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_pic_wd = (UWORD32)ps_dec->u2_disp_width;
4557*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_pic_ht = (UWORD32)ps_dec->u2_disp_height;
4558*495ae853SAndroid Build Coastguard Worker }
4559*495ae853SAndroid Build Coastguard Worker ps_dec_op->i4_reorder_depth = ps_dec->i4_reorder_depth;
4560*495ae853SAndroid Build Coastguard Worker ps_dec_op->i4_display_index = ps_dec->i4_display_index;
4561*495ae853SAndroid Build Coastguard Worker ps_dec_op->e_pic_type = ps_dec->i4_frametype;
4562*495ae853SAndroid Build Coastguard Worker
4563*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_new_seq = 0;
4564*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_output_present = ps_dec->u4_output_present;
4565*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_progressive_frame_flag =
4566*495ae853SAndroid Build Coastguard Worker ps_dec->s_disp_op.u4_progressive_frame_flag;
4567*495ae853SAndroid Build Coastguard Worker
4568*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_is_ref_flag = 1;
4569*495ae853SAndroid Build Coastguard Worker if(ps_dec_op->u4_frame_decoded_flag)
4570*495ae853SAndroid Build Coastguard Worker {
4571*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_cur_slice->u1_nal_ref_idc == 0)
4572*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_is_ref_flag = 0;
4573*495ae853SAndroid Build Coastguard Worker }
4574*495ae853SAndroid Build Coastguard Worker
4575*495ae853SAndroid Build Coastguard Worker ps_dec_op->e_output_format = ps_dec->s_disp_op.e_output_format;
4576*495ae853SAndroid Build Coastguard Worker ps_dec_op->s_disp_frm_buf = ps_dec->s_disp_op.s_disp_frm_buf;
4577*495ae853SAndroid Build Coastguard Worker ps_dec_op->e4_fld_type = ps_dec->s_disp_op.e4_fld_type;
4578*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_ts = ps_dec->s_disp_op.u4_ts;
4579*495ae853SAndroid Build Coastguard Worker ps_dec_op->u4_disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
4580*495ae853SAndroid Build Coastguard Worker
4581*495ae853SAndroid Build Coastguard Worker ih264d_export_sei_params(&ps_dec_op->s_sei_decode_op, ps_dec);
4582*495ae853SAndroid Build Coastguard Worker }
4583*495ae853SAndroid Build Coastguard Worker
4584*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4585*495ae853SAndroid Build Coastguard Worker /* */
4586*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_api_function */
4587*495ae853SAndroid Build Coastguard Worker /* */
4588*495ae853SAndroid Build Coastguard Worker /* Description : */
4589*495ae853SAndroid Build Coastguard Worker /* */
4590*495ae853SAndroid Build Coastguard Worker /* Inputs :iv_obj_t decoder handle */
4591*495ae853SAndroid Build Coastguard Worker /* :pv_api_ip pointer to input structure */
4592*495ae853SAndroid Build Coastguard Worker /* :pv_api_op pointer to output structure */
4593*495ae853SAndroid Build Coastguard Worker /* Outputs : */
4594*495ae853SAndroid Build Coastguard Worker /* Returns : void */
4595*495ae853SAndroid Build Coastguard Worker /* */
4596*495ae853SAndroid Build Coastguard Worker /* Issues : none */
4597*495ae853SAndroid Build Coastguard Worker /* */
4598*495ae853SAndroid Build Coastguard Worker /* Revision History: */
4599*495ae853SAndroid Build Coastguard Worker /* */
4600*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
4601*495ae853SAndroid Build Coastguard Worker /* 22 10 2008 100356 Draft */
4602*495ae853SAndroid Build Coastguard Worker /* */
4603*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_api_function(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4604*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T ih264d_api_function(iv_obj_t *dec_hdl,
4605*495ae853SAndroid Build Coastguard Worker void *pv_api_ip,
4606*495ae853SAndroid Build Coastguard Worker void *pv_api_op)
4607*495ae853SAndroid Build Coastguard Worker {
4608*495ae853SAndroid Build Coastguard Worker UWORD32 command;
4609*495ae853SAndroid Build Coastguard Worker UWORD32 *pu2_ptr_cmd;
4610*495ae853SAndroid Build Coastguard Worker UWORD32 u4_api_ret;
4611*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T e_status;
4612*495ae853SAndroid Build Coastguard Worker e_status = api_check_struct_sanity(dec_hdl, pv_api_ip, pv_api_op);
4613*495ae853SAndroid Build Coastguard Worker
4614*495ae853SAndroid Build Coastguard Worker if(e_status != IV_SUCCESS)
4615*495ae853SAndroid Build Coastguard Worker {
4616*495ae853SAndroid Build Coastguard Worker UWORD32 *ptr_err;
4617*495ae853SAndroid Build Coastguard Worker
4618*495ae853SAndroid Build Coastguard Worker ptr_err = (UWORD32 *)pv_api_op;
4619*495ae853SAndroid Build Coastguard Worker UNUSED(ptr_err);
4620*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("error code = %d\n", *(ptr_err + 1));
4621*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
4622*495ae853SAndroid Build Coastguard Worker }
4623*495ae853SAndroid Build Coastguard Worker
4624*495ae853SAndroid Build Coastguard Worker pu2_ptr_cmd = (UWORD32 *)pv_api_ip;
4625*495ae853SAndroid Build Coastguard Worker pu2_ptr_cmd++;
4626*495ae853SAndroid Build Coastguard Worker
4627*495ae853SAndroid Build Coastguard Worker command = *pu2_ptr_cmd;
4628*495ae853SAndroid Build Coastguard Worker // H264_DEC_DEBUG_PRINT("inside lib = %d\n",command);
4629*495ae853SAndroid Build Coastguard Worker switch(command)
4630*495ae853SAndroid Build Coastguard Worker {
4631*495ae853SAndroid Build Coastguard Worker
4632*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CREATE:
4633*495ae853SAndroid Build Coastguard Worker u4_api_ret = ih264d_create(dec_hdl, (void *)pv_api_ip,
4634*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
4635*495ae853SAndroid Build Coastguard Worker break;
4636*495ae853SAndroid Build Coastguard Worker case IVD_CMD_DELETE:
4637*495ae853SAndroid Build Coastguard Worker u4_api_ret = ih264d_delete(dec_hdl, (void *)pv_api_ip,
4638*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
4639*495ae853SAndroid Build Coastguard Worker break;
4640*495ae853SAndroid Build Coastguard Worker
4641*495ae853SAndroid Build Coastguard Worker case IVD_CMD_VIDEO_DECODE:
4642*495ae853SAndroid Build Coastguard Worker u4_api_ret = ih264d_video_decode(dec_hdl, (void *)pv_api_ip,
4643*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
4644*495ae853SAndroid Build Coastguard Worker break;
4645*495ae853SAndroid Build Coastguard Worker
4646*495ae853SAndroid Build Coastguard Worker case IVD_CMD_GET_DISPLAY_FRAME:
4647*495ae853SAndroid Build Coastguard Worker u4_api_ret = ih264d_get_display_frame(dec_hdl, (void *)pv_api_ip,
4648*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
4649*495ae853SAndroid Build Coastguard Worker
4650*495ae853SAndroid Build Coastguard Worker break;
4651*495ae853SAndroid Build Coastguard Worker
4652*495ae853SAndroid Build Coastguard Worker case IVD_CMD_SET_DISPLAY_FRAME:
4653*495ae853SAndroid Build Coastguard Worker u4_api_ret = ih264d_set_display_frame(dec_hdl, (void *)pv_api_ip,
4654*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
4655*495ae853SAndroid Build Coastguard Worker
4656*495ae853SAndroid Build Coastguard Worker break;
4657*495ae853SAndroid Build Coastguard Worker
4658*495ae853SAndroid Build Coastguard Worker case IVD_CMD_REL_DISPLAY_FRAME:
4659*495ae853SAndroid Build Coastguard Worker u4_api_ret = ih264d_rel_display_frame(dec_hdl, (void *)pv_api_ip,
4660*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
4661*495ae853SAndroid Build Coastguard Worker break;
4662*495ae853SAndroid Build Coastguard Worker
4663*495ae853SAndroid Build Coastguard Worker case IVD_CMD_VIDEO_CTL:
4664*495ae853SAndroid Build Coastguard Worker u4_api_ret = ih264d_ctl(dec_hdl, (void *)pv_api_ip,
4665*495ae853SAndroid Build Coastguard Worker (void *)pv_api_op);
4666*495ae853SAndroid Build Coastguard Worker break;
4667*495ae853SAndroid Build Coastguard Worker default:
4668*495ae853SAndroid Build Coastguard Worker u4_api_ret = IV_FAIL;
4669*495ae853SAndroid Build Coastguard Worker break;
4670*495ae853SAndroid Build Coastguard Worker }
4671*495ae853SAndroid Build Coastguard Worker
4672*495ae853SAndroid Build Coastguard Worker return u4_api_ret;
4673*495ae853SAndroid Build Coastguard Worker }
4674