xref: /aosp_15_r20/external/libavc/decoder/svc/isvcd_api.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker  * @file
24*495ae853SAndroid Build Coastguard Worker  *  isvcd_api.c
25*495ae853SAndroid Build Coastguard Worker  *
26*495ae853SAndroid Build Coastguard Worker  * @brief
27*495ae853SAndroid Build Coastguard Worker  *  Contains all the API related functions
28*495ae853SAndroid Build Coastguard Worker  *
29*495ae853SAndroid Build Coastguard Worker  * @author
30*495ae853SAndroid Build Coastguard Worker  *  Kishore
31*495ae853SAndroid Build Coastguard Worker  *
32*495ae853SAndroid Build Coastguard Worker  * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker  *  - api_check_struct_sanity()
34*495ae853SAndroid Build Coastguard Worker  *  - isvcd_set_processor()
35*495ae853SAndroid Build Coastguard Worker  *  - isvcd_init_decoder()
36*495ae853SAndroid Build Coastguard Worker  *  - isvcd_nal_parse_ctxt_free()
37*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_resample_ctxt_free()
38*495ae853SAndroid Build Coastguard Worker  *  - isvcd_intra_resample_ctxt_free()
39*495ae853SAndroid Build Coastguard Worker  *  - isvcd_mode_mv_resample_ctxt_free()
40*495ae853SAndroid Build Coastguard Worker  *  - isvcd_free_static_bufs()
41*495ae853SAndroid Build Coastguard Worker  *  - isvcd_nal_parse_ctxt_create()
42*495ae853SAndroid Build Coastguard Worker  *  - isvcd_intra_resample_ctxt_create()
43*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_resample_ctxt_create()
44*495ae853SAndroid Build Coastguard Worker  *  - isvcd_mode_mv_resample_ctxt_create()
45*495ae853SAndroid Build Coastguard Worker  *  - isvcd_allocate_static_bufs()
46*495ae853SAndroid Build Coastguard Worker  *  - isvcd_create()
47*495ae853SAndroid Build Coastguard Worker  *  - isvcd_update_dqid()
48*495ae853SAndroid Build Coastguard Worker  *  - isvcd_detect_res_change()
49*495ae853SAndroid Build Coastguard Worker  *  - isvcd_parse_ref_pic_list_modify()
50*495ae853SAndroid Build Coastguard Worker  *  - isvcd_parse_slice_hdr_refdq_id()
51*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_ref_lyr_dqid()
52*495ae853SAndroid Build Coastguard Worker  *  - isvcd_conceal_node_params()
53*495ae853SAndroid Build Coastguard Worker  *  - isvcd_refine_dep_list()
54*495ae853SAndroid Build Coastguard Worker  *  - isvcd_dec_non_vcl()
55*495ae853SAndroid Build Coastguard Worker  *  - isvcd_seq_hdr_dec()
56*495ae853SAndroid Build Coastguard Worker  *  - isvcd_pre_parse_refine_au()
57*495ae853SAndroid Build Coastguard Worker  *  - isvcd_video_decode()
58*495ae853SAndroid Build Coastguard Worker  *  - isvcd_set_display_frame()
59*495ae853SAndroid Build Coastguard Worker  *  - isvcd_set_flush_mode()
60*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_status()
61*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_buf_info()
62*495ae853SAndroid Build Coastguard Worker  *  - isvcd_set_params()
63*495ae853SAndroid Build Coastguard Worker  *  - isvcd_set_target_layer()
64*495ae853SAndroid Build Coastguard Worker  *  - isvcd_set_default_params()
65*495ae853SAndroid Build Coastguard Worker  *  - isvcd_delete()
66*495ae853SAndroid Build Coastguard Worker  *  - isvcd_reset()
67*495ae853SAndroid Build Coastguard Worker  *  - isvcd_ctl()
68*495ae853SAndroid Build Coastguard Worker  *  - isvcd_rel_display_frame()
69*495ae853SAndroid Build Coastguard Worker  *  - isvcd_set_degrade()
70*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_frame_dimensions()
71*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_vui_params()
72*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_sei_mdcv_params()
73*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_sei_cll_params()
74*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_sei_ave_params()
75*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_sei_ccv_params()
76*495ae853SAndroid Build Coastguard Worker  *  - isvcd_set_num_cores()
77*495ae853SAndroid Build Coastguard Worker  *  - isvcd_fill_output_struct_from_context()
78*495ae853SAndroid Build Coastguard Worker  *  - isvcd_api_function()
79*495ae853SAndroid Build Coastguard Worker  *
80*495ae853SAndroid Build Coastguard Worker  * @remarks
81*495ae853SAndroid Build Coastguard Worker  *  None
82*495ae853SAndroid Build Coastguard Worker  *
83*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
84*495ae853SAndroid Build Coastguard Worker  */
85*495ae853SAndroid Build Coastguard Worker 
86*495ae853SAndroid Build Coastguard Worker #include <string.h>
87*495ae853SAndroid Build Coastguard Worker #include <limits.h>
88*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
89*495ae853SAndroid Build Coastguard Worker #include <assert.h>
90*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
91*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
92*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
93*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
94*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
95*495ae853SAndroid Build Coastguard Worker #include "iv.h"
96*495ae853SAndroid Build Coastguard Worker #include "ivd.h"
97*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
98*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
99*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
100*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
101*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
102*495ae853SAndroid Build Coastguard Worker #include "ih264d_nal.h"
103*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
104*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
105*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
106*495ae853SAndroid Build Coastguard Worker #include "ih264d_function_selector.h"
107*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
108*495ae853SAndroid Build Coastguard Worker #include "ih264_disp_mgr.h"
109*495ae853SAndroid Build Coastguard Worker #include "ih264_buf_mgr.h"
110*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
111*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
112*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cabac.h"
113*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
114*495ae853SAndroid Build Coastguard Worker #include "isvcd_process_epslice.h"
115*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
116*495ae853SAndroid Build Coastguard Worker #include "ih264d_api_utils.h"
117*495ae853SAndroid Build Coastguard Worker #include "ih264d_format_conv.h"
118*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_headers.h"
119*495ae853SAndroid Build Coastguard Worker #include "ih264d_thread_compute_bs.h"
120*495ae853SAndroid Build Coastguard Worker #include "isvcd_utils.h"
121*495ae853SAndroid Build Coastguard Worker #include "isvcd.h"
122*495ae853SAndroid Build Coastguard Worker #include "isvcd_mode_mv_resamp.h"
123*495ae853SAndroid Build Coastguard Worker #include "isvcd_parse_headers.h"
124*495ae853SAndroid Build Coastguard Worker #include "isvcd_thread_compute_bs.h"
125*495ae853SAndroid Build Coastguard Worker #include "isvcd_function_selector.h"
126*495ae853SAndroid Build Coastguard Worker /*********************/
127*495ae853SAndroid Build Coastguard Worker /* Codec Versioning  */
128*495ae853SAndroid Build Coastguard Worker /*********************/
129*495ae853SAndroid Build Coastguard Worker // Move this to where it is used
130*495ae853SAndroid Build Coastguard Worker #define CODEC_NAME "H264VDEC"
131*495ae853SAndroid Build Coastguard Worker #define CODEC_RELEASE_TYPE "production"
132*495ae853SAndroid Build Coastguard Worker #define CODEC_RELEASE_VER "05.00"
133*495ae853SAndroid Build Coastguard Worker #define CODEC_VENDOR "ITTIAM"
134*495ae853SAndroid Build Coastguard Worker #define MAXVERSION_STRLEN 511
135*495ae853SAndroid Build Coastguard Worker #ifdef ANDROID
136*495ae853SAndroid Build Coastguard Worker #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor)  \
137*495ae853SAndroid Build Coastguard Worker     snprintf(version_string, MAXVERSION_STRLEN, "@(#)Id:%s_%s Ver:%s Released by %s", codec_name, \
138*495ae853SAndroid Build Coastguard Worker              codec_release_type, codec_release_ver, codec_vendor)
139*495ae853SAndroid Build Coastguard Worker #else
140*495ae853SAndroid Build Coastguard Worker #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor)  \
141*495ae853SAndroid Build Coastguard Worker     snprintf(version_string, MAXVERSION_STRLEN,                                                   \
142*495ae853SAndroid Build Coastguard Worker              "@(#)Id:%s_%s Ver:%s Released by %s Build: %s @ %s", codec_name, codec_release_type, \
143*495ae853SAndroid Build Coastguard Worker              codec_release_ver, codec_vendor, __DATE__, __TIME__)
144*495ae853SAndroid Build Coastguard Worker #endif
145*495ae853SAndroid Build Coastguard Worker 
146*495ae853SAndroid Build Coastguard Worker #define MIN_IN_BUFS 1
147*495ae853SAndroid Build Coastguard Worker #define MIN_OUT_BUFS_420 3
148*495ae853SAndroid Build Coastguard Worker #define MIN_OUT_BUFS_422ILE 1
149*495ae853SAndroid Build Coastguard Worker #define MIN_OUT_BUFS_RGB565 1
150*495ae853SAndroid Build Coastguard Worker #define MIN_OUT_BUFS_420SP 2
151*495ae853SAndroid Build Coastguard Worker 
152*495ae853SAndroid Build Coastguard Worker #define NUM_FRAMES_LIMIT_ENABLED 0
153*495ae853SAndroid Build Coastguard Worker 
154*495ae853SAndroid Build Coastguard Worker #if NUM_FRAMES_LIMIT_ENABLED
155*495ae853SAndroid Build Coastguard Worker #define NUM_FRAMES_LIMIT 10000
156*495ae853SAndroid Build Coastguard Worker #else
157*495ae853SAndroid Build Coastguard Worker #define NUM_FRAMES_LIMIT 0x7FFFFFFF
158*495ae853SAndroid Build Coastguard Worker #endif
159*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_version(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
160*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_sei(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm);
161*495ae853SAndroid Build Coastguard Worker WORD32 check_app_out_buf_size(dec_struct_t *ps_dec);
162*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_get_extra_mem_external(UWORD32 width, UWORD32 height);
163*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_frame_dimensions(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
164*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_vui_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
165*495ae853SAndroid Build Coastguard Worker 
166*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_sei_mdcv_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
167*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_sei_cll_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
168*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_sei_ave_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
169*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_sei_ccv_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
170*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_num_cores(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
171*495ae853SAndroid Build Coastguard Worker 
172*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_deblock_display(dec_struct_t *ps_dec);
173*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_display_frame(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
174*495ae853SAndroid Build Coastguard Worker 
175*495ae853SAndroid Build Coastguard Worker void ih264d_signal_decode_thread(dec_struct_t *ps_dec);
176*495ae853SAndroid Build Coastguard Worker 
177*495ae853SAndroid Build Coastguard Worker void ih264d_signal_bs_deblk_thread(dec_struct_t *ps_dec);
178*495ae853SAndroid Build Coastguard Worker void ih264d_decode_picture_thread(dec_struct_t *ps_dec);
179*495ae853SAndroid Build Coastguard Worker void isvcd_decode_picture_thread(svc_dec_lyr_struct_t *ps_svc_lyr_dec);
180*495ae853SAndroid Build Coastguard Worker 
181*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_degrade(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op);
182*495ae853SAndroid Build Coastguard Worker 
183*495ae853SAndroid Build Coastguard Worker void isvcd_fill_output_struct_from_context(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
184*495ae853SAndroid Build Coastguard Worker                                            ivd_video_decode_op_t *ps_dec_op);
185*495ae853SAndroid Build Coastguard Worker 
api_check_struct_sanity(iv_obj_t * ps_handle,void * pv_api_ip,void * pv_api_op)186*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle, void *pv_api_ip,
187*495ae853SAndroid Build Coastguard Worker                                                     void *pv_api_op)
188*495ae853SAndroid Build Coastguard Worker {
189*495ae853SAndroid Build Coastguard Worker     IVD_API_COMMAND_TYPE_T e_cmd;
190*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_api_ip;
191*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_api_op;
192*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
193*495ae853SAndroid Build Coastguard Worker 
194*495ae853SAndroid Build Coastguard Worker     if(NULL == pv_api_op) return (IV_FAIL);
195*495ae853SAndroid Build Coastguard Worker 
196*495ae853SAndroid Build Coastguard Worker     if(NULL == pv_api_ip) return (IV_FAIL);
197*495ae853SAndroid Build Coastguard Worker 
198*495ae853SAndroid Build Coastguard Worker     pu4_api_ip = (UWORD32 *) pv_api_ip;
199*495ae853SAndroid Build Coastguard Worker     pu4_api_op = (UWORD32 *) pv_api_op;
200*495ae853SAndroid Build Coastguard Worker     e_cmd = *(pu4_api_ip + 1);
201*495ae853SAndroid Build Coastguard Worker 
202*495ae853SAndroid Build Coastguard Worker     /* error checks on handle */
203*495ae853SAndroid Build Coastguard Worker     switch((WORD32) e_cmd)
204*495ae853SAndroid Build Coastguard Worker     {
205*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CREATE:
206*495ae853SAndroid Build Coastguard Worker             break;
207*495ae853SAndroid Build Coastguard Worker 
208*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_REL_DISPLAY_FRAME:
209*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_SET_DISPLAY_FRAME:
210*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_GET_DISPLAY_FRAME:
211*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_VIDEO_DECODE:
212*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_DELETE:
213*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_VIDEO_CTL:
214*495ae853SAndroid Build Coastguard Worker             if(ps_handle == NULL)
215*495ae853SAndroid Build Coastguard Worker             {
216*495ae853SAndroid Build Coastguard Worker                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
217*495ae853SAndroid Build Coastguard Worker                 *(pu4_api_op + 1) |= IVD_HANDLE_NULL;
218*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
219*495ae853SAndroid Build Coastguard Worker             }
220*495ae853SAndroid Build Coastguard Worker 
221*495ae853SAndroid Build Coastguard Worker             if(ps_handle->u4_size != sizeof(iv_obj_t))
222*495ae853SAndroid Build Coastguard Worker             {
223*495ae853SAndroid Build Coastguard Worker                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
224*495ae853SAndroid Build Coastguard Worker                 *(pu4_api_op + 1) |= IVD_HANDLE_STRUCT_SIZE_INCORRECT;
225*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
226*495ae853SAndroid Build Coastguard Worker             }
227*495ae853SAndroid Build Coastguard Worker 
228*495ae853SAndroid Build Coastguard Worker             if(ps_handle->pv_fxns != isvcd_api_function)
229*495ae853SAndroid Build Coastguard Worker             {
230*495ae853SAndroid Build Coastguard Worker                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
231*495ae853SAndroid Build Coastguard Worker                 *(pu4_api_op + 1) |= IVD_INVALID_HANDLE_NULL;
232*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
233*495ae853SAndroid Build Coastguard Worker             }
234*495ae853SAndroid Build Coastguard Worker 
235*495ae853SAndroid Build Coastguard Worker             if(ps_handle->pv_codec_handle == NULL)
236*495ae853SAndroid Build Coastguard Worker             {
237*495ae853SAndroid Build Coastguard Worker                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
238*495ae853SAndroid Build Coastguard Worker                 *(pu4_api_op + 1) |= IVD_INVALID_HANDLE_NULL;
239*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
240*495ae853SAndroid Build Coastguard Worker             }
241*495ae853SAndroid Build Coastguard Worker             break;
242*495ae853SAndroid Build Coastguard Worker         default:
243*495ae853SAndroid Build Coastguard Worker             *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
244*495ae853SAndroid Build Coastguard Worker             *(pu4_api_op + 1) |= IVD_INVALID_API_CMD;
245*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
246*495ae853SAndroid Build Coastguard Worker     }
247*495ae853SAndroid Build Coastguard Worker 
248*495ae853SAndroid Build Coastguard Worker     switch((WORD32) e_cmd)
249*495ae853SAndroid Build Coastguard Worker     {
250*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CREATE:
251*495ae853SAndroid Build Coastguard Worker         {
252*495ae853SAndroid Build Coastguard Worker             isvcd_create_ip_t *ps_ip = (isvcd_create_ip_t *) pv_api_ip;
253*495ae853SAndroid Build Coastguard Worker             isvcd_create_op_t *ps_op = (isvcd_create_op_t *) pv_api_op;
254*495ae853SAndroid Build Coastguard Worker 
255*495ae853SAndroid Build Coastguard Worker             ps_op->s_ivd_create_op_t.u4_error_code = 0;
256*495ae853SAndroid Build Coastguard Worker 
257*495ae853SAndroid Build Coastguard Worker             if((ps_ip->s_ivd_create_ip_t.u4_size > sizeof(isvcd_create_ip_t)) ||
258*495ae853SAndroid Build Coastguard Worker                (ps_ip->s_ivd_create_ip_t.u4_size < sizeof(ivd_create_ip_t)))
259*495ae853SAndroid Build Coastguard Worker             {
260*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_create_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
261*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_create_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
262*495ae853SAndroid Build Coastguard Worker                 H264_DEC_DEBUG_PRINT("\n");
263*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
264*495ae853SAndroid Build Coastguard Worker             }
265*495ae853SAndroid Build Coastguard Worker 
266*495ae853SAndroid Build Coastguard Worker             if((ps_op->s_ivd_create_op_t.u4_size != sizeof(isvcd_create_op_t)) &&
267*495ae853SAndroid Build Coastguard Worker                (ps_op->s_ivd_create_op_t.u4_size != sizeof(ivd_create_op_t)))
268*495ae853SAndroid Build Coastguard Worker             {
269*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_create_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
270*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_create_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
271*495ae853SAndroid Build Coastguard Worker                 H264_DEC_DEBUG_PRINT("\n");
272*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
273*495ae853SAndroid Build Coastguard Worker             }
274*495ae853SAndroid Build Coastguard Worker 
275*495ae853SAndroid Build Coastguard Worker             if((ps_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420P) &&
276*495ae853SAndroid Build Coastguard Worker                (ps_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_422ILE) &&
277*495ae853SAndroid Build Coastguard Worker                (ps_ip->s_ivd_create_ip_t.e_output_format != IV_RGB_565) &&
278*495ae853SAndroid Build Coastguard Worker                (ps_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420SP_UV) &&
279*495ae853SAndroid Build Coastguard Worker                (ps_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420SP_VU))
280*495ae853SAndroid Build Coastguard Worker             {
281*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_create_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
282*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_create_op_t.u4_error_code |= IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED;
283*495ae853SAndroid Build Coastguard Worker                 H264_DEC_DEBUG_PRINT("\n");
284*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
285*495ae853SAndroid Build Coastguard Worker             }
286*495ae853SAndroid Build Coastguard Worker         }
287*495ae853SAndroid Build Coastguard Worker         break;
288*495ae853SAndroid Build Coastguard Worker 
289*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_GET_DISPLAY_FRAME:
290*495ae853SAndroid Build Coastguard Worker         {
291*495ae853SAndroid Build Coastguard Worker             isvcd_get_display_frame_ip_t *ps_ip = (isvcd_get_display_frame_ip_t *) pv_api_ip;
292*495ae853SAndroid Build Coastguard Worker             isvcd_get_display_frame_op_t *ps_op = (isvcd_get_display_frame_op_t *) pv_api_op;
293*495ae853SAndroid Build Coastguard Worker 
294*495ae853SAndroid Build Coastguard Worker             ps_op->s_ivd_get_display_frame_op_t.u4_error_code = 0;
295*495ae853SAndroid Build Coastguard Worker 
296*495ae853SAndroid Build Coastguard Worker             if((ps_ip->s_ivd_get_display_frame_ip_t.u4_size !=
297*495ae853SAndroid Build Coastguard Worker                 sizeof(isvcd_get_display_frame_ip_t)) &&
298*495ae853SAndroid Build Coastguard Worker                (ps_ip->s_ivd_get_display_frame_ip_t.u4_size != sizeof(ivd_get_display_frame_ip_t)))
299*495ae853SAndroid Build Coastguard Worker             {
300*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
301*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |=
302*495ae853SAndroid Build Coastguard Worker                     IVD_IP_API_STRUCT_SIZE_INCORRECT;
303*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
304*495ae853SAndroid Build Coastguard Worker             }
305*495ae853SAndroid Build Coastguard Worker 
306*495ae853SAndroid Build Coastguard Worker             if((ps_op->s_ivd_get_display_frame_op_t.u4_size !=
307*495ae853SAndroid Build Coastguard Worker                 sizeof(isvcd_get_display_frame_op_t)) &&
308*495ae853SAndroid Build Coastguard Worker                (ps_op->s_ivd_get_display_frame_op_t.u4_size != sizeof(ivd_get_display_frame_op_t)))
309*495ae853SAndroid Build Coastguard Worker             {
310*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
311*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_get_display_frame_op_t.u4_error_code |=
312*495ae853SAndroid Build Coastguard Worker                     IVD_OP_API_STRUCT_SIZE_INCORRECT;
313*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
314*495ae853SAndroid Build Coastguard Worker             }
315*495ae853SAndroid Build Coastguard Worker         }
316*495ae853SAndroid Build Coastguard Worker         break;
317*495ae853SAndroid Build Coastguard Worker 
318*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_REL_DISPLAY_FRAME:
319*495ae853SAndroid Build Coastguard Worker         {
320*495ae853SAndroid Build Coastguard Worker             isvcd_rel_display_frame_ip_t *ps_ip = (isvcd_rel_display_frame_ip_t *) pv_api_ip;
321*495ae853SAndroid Build Coastguard Worker             isvcd_rel_display_frame_op_t *ps_op = (isvcd_rel_display_frame_op_t *) pv_api_op;
322*495ae853SAndroid Build Coastguard Worker 
323*495ae853SAndroid Build Coastguard Worker             ps_op->s_ivd_rel_display_frame_op_t.u4_error_code = 0;
324*495ae853SAndroid Build Coastguard Worker 
325*495ae853SAndroid Build Coastguard Worker             if((ps_ip->s_ivd_rel_display_frame_ip_t.u4_size !=
326*495ae853SAndroid Build Coastguard Worker                 sizeof(isvcd_rel_display_frame_ip_t)) &&
327*495ae853SAndroid Build Coastguard Worker                (ps_ip->s_ivd_rel_display_frame_ip_t.u4_size != sizeof(ivd_rel_display_frame_ip_t)))
328*495ae853SAndroid Build Coastguard Worker             {
329*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
330*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |=
331*495ae853SAndroid Build Coastguard Worker                     IVD_IP_API_STRUCT_SIZE_INCORRECT;
332*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
333*495ae853SAndroid Build Coastguard Worker             }
334*495ae853SAndroid Build Coastguard Worker 
335*495ae853SAndroid Build Coastguard Worker             if((ps_op->s_ivd_rel_display_frame_op_t.u4_size !=
336*495ae853SAndroid Build Coastguard Worker                 sizeof(isvcd_rel_display_frame_op_t)) &&
337*495ae853SAndroid Build Coastguard Worker                (ps_op->s_ivd_rel_display_frame_op_t.u4_size != sizeof(ivd_rel_display_frame_op_t)))
338*495ae853SAndroid Build Coastguard Worker             {
339*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
340*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |=
341*495ae853SAndroid Build Coastguard Worker                     IVD_OP_API_STRUCT_SIZE_INCORRECT;
342*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
343*495ae853SAndroid Build Coastguard Worker             }
344*495ae853SAndroid Build Coastguard Worker         }
345*495ae853SAndroid Build Coastguard Worker         break;
346*495ae853SAndroid Build Coastguard Worker 
347*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_SET_DISPLAY_FRAME:
348*495ae853SAndroid Build Coastguard Worker         {
349*495ae853SAndroid Build Coastguard Worker             isvcd_set_display_frame_ip_t *ps_ip = (isvcd_set_display_frame_ip_t *) pv_api_ip;
350*495ae853SAndroid Build Coastguard Worker             isvcd_set_display_frame_op_t *ps_op = (isvcd_set_display_frame_op_t *) pv_api_op;
351*495ae853SAndroid Build Coastguard Worker             UWORD32 j;
352*495ae853SAndroid Build Coastguard Worker 
353*495ae853SAndroid Build Coastguard Worker             ps_op->s_ivd_set_display_frame_op_t.u4_error_code = 0;
354*495ae853SAndroid Build Coastguard Worker 
355*495ae853SAndroid Build Coastguard Worker             if((ps_ip->s_ivd_set_display_frame_ip_t.u4_size !=
356*495ae853SAndroid Build Coastguard Worker                 sizeof(isvcd_set_display_frame_ip_t)) &&
357*495ae853SAndroid Build Coastguard Worker                (ps_ip->s_ivd_set_display_frame_ip_t.u4_size != sizeof(ivd_set_display_frame_ip_t)))
358*495ae853SAndroid Build Coastguard Worker             {
359*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
360*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
361*495ae853SAndroid Build Coastguard Worker                     IVD_IP_API_STRUCT_SIZE_INCORRECT;
362*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
363*495ae853SAndroid Build Coastguard Worker             }
364*495ae853SAndroid Build Coastguard Worker 
365*495ae853SAndroid Build Coastguard Worker             if((ps_op->s_ivd_set_display_frame_op_t.u4_size !=
366*495ae853SAndroid Build Coastguard Worker                 sizeof(isvcd_set_display_frame_op_t)) &&
367*495ae853SAndroid Build Coastguard Worker                (ps_op->s_ivd_set_display_frame_op_t.u4_size != sizeof(ivd_set_display_frame_op_t)))
368*495ae853SAndroid Build Coastguard Worker             {
369*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
370*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
371*495ae853SAndroid Build Coastguard Worker                     IVD_OP_API_STRUCT_SIZE_INCORRECT;
372*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
373*495ae853SAndroid Build Coastguard Worker             }
374*495ae853SAndroid Build Coastguard Worker 
375*495ae853SAndroid Build Coastguard Worker             if(ps_ip->s_ivd_set_display_frame_ip_t.num_disp_bufs == 0)
376*495ae853SAndroid Build Coastguard Worker             {
377*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
378*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS;
379*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
380*495ae853SAndroid Build Coastguard Worker             }
381*495ae853SAndroid Build Coastguard Worker 
382*495ae853SAndroid Build Coastguard Worker             for(j = 0; j < ps_ip->s_ivd_set_display_frame_ip_t.num_disp_bufs; j++)
383*495ae853SAndroid Build Coastguard Worker             {
384*495ae853SAndroid Build Coastguard Worker                 if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_num_bufs == 0)
385*495ae853SAndroid Build Coastguard Worker                 {
386*495ae853SAndroid Build Coastguard Worker                     ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
387*495ae853SAndroid Build Coastguard Worker                     ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS;
388*495ae853SAndroid Build Coastguard Worker                     return IV_FAIL;
389*495ae853SAndroid Build Coastguard Worker                 }
390*495ae853SAndroid Build Coastguard Worker 
391*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_num_bufs;
392*495ae853SAndroid Build Coastguard Worker                     i++)
393*495ae853SAndroid Build Coastguard Worker                 {
394*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].pu1_bufs[i] == NULL)
395*495ae853SAndroid Build Coastguard Worker                     {
396*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
397*495ae853SAndroid Build Coastguard Worker                             1 << IVD_UNSUPPORTEDPARAM;
398*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
399*495ae853SAndroid Build Coastguard Worker                             IVD_DISP_FRM_OP_BUF_NULL;
400*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
401*495ae853SAndroid Build Coastguard Worker                     }
402*495ae853SAndroid Build Coastguard Worker 
403*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j]
404*495ae853SAndroid Build Coastguard Worker                            .u4_min_out_buf_size[i] == 0)
405*495ae853SAndroid Build Coastguard Worker                     {
406*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
407*495ae853SAndroid Build Coastguard Worker                             1 << IVD_UNSUPPORTEDPARAM;
408*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_set_display_frame_op_t.u4_error_code |=
409*495ae853SAndroid Build Coastguard Worker                             IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
410*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
411*495ae853SAndroid Build Coastguard Worker                     }
412*495ae853SAndroid Build Coastguard Worker                 }
413*495ae853SAndroid Build Coastguard Worker             }
414*495ae853SAndroid Build Coastguard Worker         }
415*495ae853SAndroid Build Coastguard Worker         break;
416*495ae853SAndroid Build Coastguard Worker 
417*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_VIDEO_DECODE:
418*495ae853SAndroid Build Coastguard Worker         {
419*495ae853SAndroid Build Coastguard Worker             isvcd_video_decode_ip_t *ps_ip = (isvcd_video_decode_ip_t *) pv_api_ip;
420*495ae853SAndroid Build Coastguard Worker             isvcd_video_decode_op_t *ps_op = (isvcd_video_decode_op_t *) pv_api_op;
421*495ae853SAndroid Build Coastguard Worker 
422*495ae853SAndroid Build Coastguard Worker             H264_DEC_DEBUG_PRINT("The input bytes is: %d",
423*495ae853SAndroid Build Coastguard Worker                                  ps_ip->s_ivd_video_decode_ip_t.u4_num_Bytes);
424*495ae853SAndroid Build Coastguard Worker             ps_op->s_ivd_video_decode_op_t.u4_error_code = 0;
425*495ae853SAndroid Build Coastguard Worker 
426*495ae853SAndroid Build Coastguard Worker             if(ps_ip->s_ivd_video_decode_ip_t.u4_size != sizeof(isvcd_video_decode_ip_t) &&
427*495ae853SAndroid Build Coastguard Worker                ps_ip->s_ivd_video_decode_ip_t.u4_size !=
428*495ae853SAndroid Build Coastguard Worker                    offsetof(ivd_video_decode_ip_t, s_out_buffer))
429*495ae853SAndroid Build Coastguard Worker             {
430*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
431*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_video_decode_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
432*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
433*495ae853SAndroid Build Coastguard Worker             }
434*495ae853SAndroid Build Coastguard Worker 
435*495ae853SAndroid Build Coastguard Worker             if(ps_op->s_ivd_video_decode_op_t.u4_size != sizeof(isvcd_video_decode_op_t) &&
436*495ae853SAndroid Build Coastguard Worker                ps_op->s_ivd_video_decode_op_t.u4_size !=
437*495ae853SAndroid Build Coastguard Worker                    offsetof(ivd_video_decode_op_t, u4_output_present))
438*495ae853SAndroid Build Coastguard Worker             {
439*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
440*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_video_decode_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
441*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
442*495ae853SAndroid Build Coastguard Worker             }
443*495ae853SAndroid Build Coastguard Worker             {
444*495ae853SAndroid Build Coastguard Worker                 svc_dec_ctxt_t *ps_svcd_ctxt;
445*495ae853SAndroid Build Coastguard Worker                 svc_dec_lyr_struct_t *ps_svc_lyr_dec;
446*495ae853SAndroid Build Coastguard Worker                 dec_struct_t *ps_dec;
447*495ae853SAndroid Build Coastguard Worker                 ps_svcd_ctxt = (svc_dec_ctxt_t *) (ps_handle->pv_codec_handle);
448*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[0];
449*495ae853SAndroid Build Coastguard Worker                 ps_dec = &ps_svc_lyr_dec->s_dec;
450*495ae853SAndroid Build Coastguard Worker                 if(ps_dec->u1_enable_mb_info)
451*495ae853SAndroid Build Coastguard Worker                 {
452*495ae853SAndroid Build Coastguard Worker                     if(!ps_ip->pu1_8x8_blk_qp_map && !ps_ip->pu1_8x8_blk_type_map)
453*495ae853SAndroid Build Coastguard Worker                     {
454*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
455*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_video_decode_op_t.u4_error_code |=
456*495ae853SAndroid Build Coastguard Worker                             IH264D_FRAME_INFO_OP_BUF_NULL;
457*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
458*495ae853SAndroid Build Coastguard Worker                     }
459*495ae853SAndroid Build Coastguard Worker                 }
460*495ae853SAndroid Build Coastguard Worker             }
461*495ae853SAndroid Build Coastguard Worker         }
462*495ae853SAndroid Build Coastguard Worker         break;
463*495ae853SAndroid Build Coastguard Worker 
464*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_DELETE:
465*495ae853SAndroid Build Coastguard Worker         {
466*495ae853SAndroid Build Coastguard Worker             isvcd_delete_ip_t *ps_ip = (isvcd_delete_ip_t *) pv_api_ip;
467*495ae853SAndroid Build Coastguard Worker             isvcd_delete_op_t *ps_op = (isvcd_delete_op_t *) pv_api_op;
468*495ae853SAndroid Build Coastguard Worker 
469*495ae853SAndroid Build Coastguard Worker             ps_op->s_ivd_delete_op_t.u4_error_code = 0;
470*495ae853SAndroid Build Coastguard Worker 
471*495ae853SAndroid Build Coastguard Worker             if(ps_ip->s_ivd_delete_ip_t.u4_size != sizeof(isvcd_delete_ip_t))
472*495ae853SAndroid Build Coastguard Worker             {
473*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_delete_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
474*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_delete_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
475*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
476*495ae853SAndroid Build Coastguard Worker             }
477*495ae853SAndroid Build Coastguard Worker 
478*495ae853SAndroid Build Coastguard Worker             if(ps_op->s_ivd_delete_op_t.u4_size != sizeof(isvcd_delete_op_t))
479*495ae853SAndroid Build Coastguard Worker             {
480*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_delete_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
481*495ae853SAndroid Build Coastguard Worker                 ps_op->s_ivd_delete_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
482*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
483*495ae853SAndroid Build Coastguard Worker             }
484*495ae853SAndroid Build Coastguard Worker         }
485*495ae853SAndroid Build Coastguard Worker         break;
486*495ae853SAndroid Build Coastguard Worker 
487*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_VIDEO_CTL:
488*495ae853SAndroid Build Coastguard Worker         {
489*495ae853SAndroid Build Coastguard Worker             UWORD32 *pu4_ptr_cmd;
490*495ae853SAndroid Build Coastguard Worker             UWORD32 sub_command;
491*495ae853SAndroid Build Coastguard Worker 
492*495ae853SAndroid Build Coastguard Worker             pu4_ptr_cmd = (UWORD32 *) pv_api_ip;
493*495ae853SAndroid Build Coastguard Worker             pu4_ptr_cmd += 2;
494*495ae853SAndroid Build Coastguard Worker             sub_command = *pu4_ptr_cmd;
495*495ae853SAndroid Build Coastguard Worker 
496*495ae853SAndroid Build Coastguard Worker             switch(sub_command)
497*495ae853SAndroid Build Coastguard Worker             {
498*495ae853SAndroid Build Coastguard Worker                 case IVD_CMD_CTL_SETPARAMS:
499*495ae853SAndroid Build Coastguard Worker                 {
500*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_config_ip_t *ps_ip;
501*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_config_op_t *ps_op;
502*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_set_config_ip_t *) pv_api_ip;
503*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_set_config_op_t *) pv_api_op;
504*495ae853SAndroid Build Coastguard Worker 
505*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->s_ivd_ctl_set_config_ip_t.u4_size !=
506*495ae853SAndroid Build Coastguard Worker                        sizeof(isvcd_ctl_set_config_ip_t))
507*495ae853SAndroid Build Coastguard Worker                     {
508*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
509*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |=
510*495ae853SAndroid Build Coastguard Worker                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
511*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
512*495ae853SAndroid Build Coastguard Worker                     }
513*495ae853SAndroid Build Coastguard Worker                 }
514*495ae853SAndroid Build Coastguard Worker                 break;
515*495ae853SAndroid Build Coastguard Worker 
516*495ae853SAndroid Build Coastguard Worker                 case IVD_CMD_CTL_SETDEFAULT:
517*495ae853SAndroid Build Coastguard Worker                 {
518*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_config_op_t *ps_op;
519*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_set_config_op_t *) pv_api_op;
520*495ae853SAndroid Build Coastguard Worker                     if(ps_op->s_ivd_ctl_set_config_op_t.u4_size !=
521*495ae853SAndroid Build Coastguard Worker                        sizeof(isvcd_ctl_set_config_op_t))
522*495ae853SAndroid Build Coastguard Worker                     {
523*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
524*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |=
525*495ae853SAndroid Build Coastguard Worker                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
526*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
527*495ae853SAndroid Build Coastguard Worker                     }
528*495ae853SAndroid Build Coastguard Worker                 }
529*495ae853SAndroid Build Coastguard Worker                 break;
530*495ae853SAndroid Build Coastguard Worker 
531*495ae853SAndroid Build Coastguard Worker                 case IVD_CMD_CTL_GETPARAMS:
532*495ae853SAndroid Build Coastguard Worker                 {
533*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_getstatus_ip_t *ps_ip;
534*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_getstatus_op_t *ps_op;
535*495ae853SAndroid Build Coastguard Worker 
536*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_getstatus_ip_t *) pv_api_ip;
537*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_getstatus_op_t *) pv_api_op;
538*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->s_ivd_ctl_getstatus_ip_t.u4_size != sizeof(isvcd_ctl_getstatus_ip_t))
539*495ae853SAndroid Build Coastguard Worker                     {
540*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
541*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |=
542*495ae853SAndroid Build Coastguard Worker                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
543*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
544*495ae853SAndroid Build Coastguard Worker                     }
545*495ae853SAndroid Build Coastguard Worker                     if(ps_op->s_ivd_ctl_getstatus_op_t.u4_size != sizeof(isvcd_ctl_getstatus_op_t))
546*495ae853SAndroid Build Coastguard Worker                     {
547*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
548*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |=
549*495ae853SAndroid Build Coastguard Worker                             IVD_OP_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                 break;
554*495ae853SAndroid Build Coastguard Worker 
555*495ae853SAndroid Build Coastguard Worker                 case IVD_CMD_CTL_GETBUFINFO:
556*495ae853SAndroid Build Coastguard Worker                 {
557*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_getbufinfo_ip_t *ps_ip;
558*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_getbufinfo_op_t *ps_op;
559*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_getbufinfo_ip_t *) pv_api_ip;
560*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_getbufinfo_op_t *) pv_api_op;
561*495ae853SAndroid Build Coastguard Worker 
562*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->s_ivd_ctl_getbufinfo_ip_t.u4_size !=
563*495ae853SAndroid Build Coastguard Worker                        sizeof(isvcd_ctl_getbufinfo_ip_t))
564*495ae853SAndroid Build Coastguard Worker                     {
565*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
566*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |=
567*495ae853SAndroid Build Coastguard Worker                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
568*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
569*495ae853SAndroid Build Coastguard Worker                     }
570*495ae853SAndroid Build Coastguard Worker                     if(ps_op->s_ivd_ctl_getbufinfo_op_t.u4_size !=
571*495ae853SAndroid Build Coastguard Worker                        sizeof(isvcd_ctl_getbufinfo_op_t))
572*495ae853SAndroid Build Coastguard Worker                     {
573*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
574*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |=
575*495ae853SAndroid Build Coastguard Worker                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
576*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
577*495ae853SAndroid Build Coastguard Worker                     }
578*495ae853SAndroid Build Coastguard Worker                 }
579*495ae853SAndroid Build Coastguard Worker                 break;
580*495ae853SAndroid Build Coastguard Worker 
581*495ae853SAndroid Build Coastguard Worker                 case IVD_CMD_CTL_GETVERSION:
582*495ae853SAndroid Build Coastguard Worker                 {
583*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_getversioninfo_ip_t *ps_ip;
584*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_getversioninfo_op_t *ps_op;
585*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_getversioninfo_ip_t *) pv_api_ip;
586*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_getversioninfo_op_t *) pv_api_op;
587*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->s_ivd_ctl_getversioninfo_ip_t.u4_size !=
588*495ae853SAndroid Build Coastguard Worker                        sizeof(isvcd_ctl_getversioninfo_ip_t))
589*495ae853SAndroid Build Coastguard Worker                     {
590*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |=
591*495ae853SAndroid Build Coastguard Worker                             1 << IVD_UNSUPPORTEDPARAM;
592*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |=
593*495ae853SAndroid Build Coastguard Worker                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
594*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
595*495ae853SAndroid Build Coastguard Worker                     }
596*495ae853SAndroid Build Coastguard Worker                     if(ps_op->s_ivd_ctl_getversioninfo_op_t.u4_size !=
597*495ae853SAndroid Build Coastguard Worker                        sizeof(isvcd_ctl_getversioninfo_op_t))
598*495ae853SAndroid Build Coastguard Worker                     {
599*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |=
600*495ae853SAndroid Build Coastguard Worker                             1 << IVD_UNSUPPORTEDPARAM;
601*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |=
602*495ae853SAndroid Build Coastguard Worker                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
603*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
604*495ae853SAndroid Build Coastguard Worker                     }
605*495ae853SAndroid Build Coastguard Worker                 }
606*495ae853SAndroid Build Coastguard Worker                 break;
607*495ae853SAndroid Build Coastguard Worker 
608*495ae853SAndroid Build Coastguard Worker                 case IVD_CMD_CTL_FLUSH:
609*495ae853SAndroid Build Coastguard Worker                 {
610*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_flush_ip_t *ps_ip;
611*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_flush_op_t *ps_op;
612*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_flush_ip_t *) pv_api_ip;
613*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_flush_op_t *) pv_api_op;
614*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->s_ivd_ctl_flush_ip_t.u4_size != sizeof(isvcd_ctl_flush_ip_t))
615*495ae853SAndroid Build Coastguard Worker                     {
616*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
617*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_flush_op_t.u4_error_code |=
618*495ae853SAndroid Build Coastguard Worker                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
619*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
620*495ae853SAndroid Build Coastguard Worker                     }
621*495ae853SAndroid Build Coastguard Worker                     if(ps_op->s_ivd_ctl_flush_op_t.u4_size != sizeof(isvcd_ctl_flush_op_t))
622*495ae853SAndroid Build Coastguard Worker                     {
623*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
624*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_flush_op_t.u4_error_code |=
625*495ae853SAndroid Build Coastguard Worker                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
626*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
627*495ae853SAndroid Build Coastguard Worker                     }
628*495ae853SAndroid Build Coastguard Worker                 }
629*495ae853SAndroid Build Coastguard Worker                 break;
630*495ae853SAndroid Build Coastguard Worker 
631*495ae853SAndroid Build Coastguard Worker                 case IVD_CMD_CTL_RESET:
632*495ae853SAndroid Build Coastguard Worker                 {
633*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_reset_ip_t *ps_ip;
634*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_reset_op_t *ps_op;
635*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_reset_ip_t *) pv_api_ip;
636*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_reset_op_t *) pv_api_op;
637*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->s_ivd_ctl_reset_ip_t.u4_size != sizeof(isvcd_ctl_reset_ip_t))
638*495ae853SAndroid Build Coastguard Worker                     {
639*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
640*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_reset_op_t.u4_error_code |=
641*495ae853SAndroid Build Coastguard Worker                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
642*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
643*495ae853SAndroid Build Coastguard Worker                     }
644*495ae853SAndroid Build Coastguard Worker                     if(ps_op->s_ivd_ctl_reset_op_t.u4_size != sizeof(isvcd_ctl_reset_op_t))
645*495ae853SAndroid Build Coastguard Worker                     {
646*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
647*495ae853SAndroid Build Coastguard Worker                         ps_op->s_ivd_ctl_reset_op_t.u4_error_code |=
648*495ae853SAndroid Build Coastguard Worker                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
649*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
650*495ae853SAndroid Build Coastguard Worker                     }
651*495ae853SAndroid Build Coastguard Worker                 }
652*495ae853SAndroid Build Coastguard Worker                 break;
653*495ae853SAndroid Build Coastguard Worker 
654*495ae853SAndroid Build Coastguard Worker                 case IH264D_CMD_CTL_DEGRADE:
655*495ae853SAndroid Build Coastguard Worker                 {
656*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_degrade_ip_t *ps_ip;
657*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_degrade_op_t *ps_op;
658*495ae853SAndroid Build Coastguard Worker 
659*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_degrade_ip_t *) pv_api_ip;
660*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_degrade_op_t *) pv_api_op;
661*495ae853SAndroid Build Coastguard Worker 
662*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_degrade_ip_t))
663*495ae853SAndroid Build Coastguard Worker                     {
664*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
665*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
666*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
667*495ae853SAndroid Build Coastguard Worker                     }
668*495ae853SAndroid Build Coastguard Worker 
669*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_degrade_op_t))
670*495ae853SAndroid Build Coastguard Worker                     {
671*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
672*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
673*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
674*495ae853SAndroid Build Coastguard Worker                     }
675*495ae853SAndroid Build Coastguard Worker 
676*495ae853SAndroid Build Coastguard Worker                     if((ps_ip->i4_degrade_pics < 0) || (ps_ip->i4_degrade_pics > 4) ||
677*495ae853SAndroid Build Coastguard Worker                        (ps_ip->i4_nondegrade_interval < 0) || (ps_ip->i4_degrade_type < 0) ||
678*495ae853SAndroid Build Coastguard Worker                        (ps_ip->i4_degrade_type > 15))
679*495ae853SAndroid Build Coastguard Worker                     {
680*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
681*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
682*495ae853SAndroid Build Coastguard Worker                     }
683*495ae853SAndroid Build Coastguard Worker 
684*495ae853SAndroid Build Coastguard Worker                     break;
685*495ae853SAndroid Build Coastguard Worker                 }
686*495ae853SAndroid Build Coastguard Worker 
687*495ae853SAndroid Build Coastguard Worker                 case IH264D_CMD_CTL_GET_BUFFER_DIMENSIONS:
688*495ae853SAndroid Build Coastguard Worker                 {
689*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_frame_dimensions_ip_t *ps_ip;
690*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_frame_dimensions_op_t *ps_op;
691*495ae853SAndroid Build Coastguard Worker 
692*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_get_frame_dimensions_ip_t *) pv_api_ip;
693*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_get_frame_dimensions_op_t *) pv_api_op;
694*495ae853SAndroid Build Coastguard Worker 
695*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_get_frame_dimensions_ip_t))
696*495ae853SAndroid Build Coastguard Worker                     {
697*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
698*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
699*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
700*495ae853SAndroid Build Coastguard Worker                     }
701*495ae853SAndroid Build Coastguard Worker 
702*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_get_frame_dimensions_op_t))
703*495ae853SAndroid Build Coastguard Worker                     {
704*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
705*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
706*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
707*495ae853SAndroid Build Coastguard Worker                     }
708*495ae853SAndroid Build Coastguard Worker 
709*495ae853SAndroid Build Coastguard Worker                     break;
710*495ae853SAndroid Build Coastguard Worker                 }
711*495ae853SAndroid Build Coastguard Worker                 case IH264D_CMD_CTL_GET_VUI_PARAMS:
712*495ae853SAndroid Build Coastguard Worker                 {
713*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_vui_params_ip_t *ps_ip;
714*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_vui_params_op_t *ps_op;
715*495ae853SAndroid Build Coastguard Worker 
716*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_get_vui_params_ip_t *) pv_api_ip;
717*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_get_vui_params_op_t *) pv_api_op;
718*495ae853SAndroid Build Coastguard Worker 
719*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_get_vui_params_ip_t))
720*495ae853SAndroid Build Coastguard Worker                     {
721*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
722*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
723*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
724*495ae853SAndroid Build Coastguard Worker                     }
725*495ae853SAndroid Build Coastguard Worker 
726*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_get_vui_params_op_t))
727*495ae853SAndroid Build Coastguard Worker                     {
728*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
729*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
730*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
731*495ae853SAndroid Build Coastguard Worker                     }
732*495ae853SAndroid Build Coastguard Worker 
733*495ae853SAndroid Build Coastguard Worker                     break;
734*495ae853SAndroid Build Coastguard Worker                 }
735*495ae853SAndroid Build Coastguard Worker                 case IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS:
736*495ae853SAndroid Build Coastguard Worker                 {
737*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_mdcv_params_ip_t *ps_ip;
738*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_mdcv_params_op_t *ps_op;
739*495ae853SAndroid Build Coastguard Worker 
740*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_get_sei_mdcv_params_ip_t *) pv_api_ip;
741*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_get_sei_mdcv_params_op_t *) pv_api_op;
742*495ae853SAndroid Build Coastguard Worker 
743*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_get_sei_mdcv_params_ip_t))
744*495ae853SAndroid Build Coastguard Worker                     {
745*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
746*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
747*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
748*495ae853SAndroid Build Coastguard Worker                     }
749*495ae853SAndroid Build Coastguard Worker 
750*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_get_sei_mdcv_params_op_t))
751*495ae853SAndroid Build Coastguard Worker                     {
752*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
753*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
754*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
755*495ae853SAndroid Build Coastguard Worker                     }
756*495ae853SAndroid Build Coastguard Worker 
757*495ae853SAndroid Build Coastguard Worker                     break;
758*495ae853SAndroid Build Coastguard Worker                 }
759*495ae853SAndroid Build Coastguard Worker 
760*495ae853SAndroid Build Coastguard Worker                 case IH264D_CMD_CTL_GET_SEI_CLL_PARAMS:
761*495ae853SAndroid Build Coastguard Worker                 {
762*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_cll_params_ip_t *ps_ip;
763*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_cll_params_op_t *ps_op;
764*495ae853SAndroid Build Coastguard Worker 
765*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_get_sei_cll_params_ip_t *) pv_api_ip;
766*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_get_sei_cll_params_op_t *) pv_api_op;
767*495ae853SAndroid Build Coastguard Worker 
768*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_get_sei_cll_params_ip_t))
769*495ae853SAndroid Build Coastguard Worker                     {
770*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
771*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
772*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
773*495ae853SAndroid Build Coastguard Worker                     }
774*495ae853SAndroid Build Coastguard Worker 
775*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_get_sei_cll_params_op_t))
776*495ae853SAndroid Build Coastguard Worker                     {
777*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
778*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
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_SEI_AVE_PARAMS:
786*495ae853SAndroid Build Coastguard Worker                 {
787*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_ave_params_ip_t *ps_ip;
788*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_ave_params_op_t *ps_op;
789*495ae853SAndroid Build Coastguard Worker 
790*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_get_sei_ave_params_ip_t *) pv_api_ip;
791*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_get_sei_ave_params_op_t *) pv_api_op;
792*495ae853SAndroid Build Coastguard Worker 
793*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_get_sei_ave_params_ip_t))
794*495ae853SAndroid Build Coastguard Worker                     {
795*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
796*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
797*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
798*495ae853SAndroid Build Coastguard Worker                     }
799*495ae853SAndroid Build Coastguard Worker 
800*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_get_sei_ave_params_op_t))
801*495ae853SAndroid Build Coastguard Worker                     {
802*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
803*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
804*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
805*495ae853SAndroid Build Coastguard Worker                     }
806*495ae853SAndroid Build Coastguard Worker 
807*495ae853SAndroid Build Coastguard Worker                     break;
808*495ae853SAndroid Build Coastguard Worker                 }
809*495ae853SAndroid Build Coastguard Worker 
810*495ae853SAndroid Build Coastguard Worker                 case IH264D_CMD_CTL_GET_SEI_CCV_PARAMS:
811*495ae853SAndroid Build Coastguard Worker                 {
812*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_ccv_params_ip_t *ps_ip;
813*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_ccv_params_op_t *ps_op;
814*495ae853SAndroid Build Coastguard Worker 
815*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_get_sei_ccv_params_ip_t *) pv_api_ip;
816*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_get_sei_ccv_params_op_t *) pv_api_op;
817*495ae853SAndroid Build Coastguard Worker 
818*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_get_sei_ccv_params_ip_t))
819*495ae853SAndroid Build Coastguard Worker                     {
820*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
821*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
822*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
823*495ae853SAndroid Build Coastguard Worker                     }
824*495ae853SAndroid Build Coastguard Worker 
825*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_get_sei_ccv_params_op_t))
826*495ae853SAndroid Build Coastguard Worker                     {
827*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
828*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_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                     break;
833*495ae853SAndroid Build Coastguard Worker                 }
834*495ae853SAndroid Build Coastguard Worker 
835*495ae853SAndroid Build Coastguard Worker                 case IH264D_CMD_CTL_SET_NUM_CORES:
836*495ae853SAndroid Build Coastguard Worker                 {
837*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_num_cores_ip_t *ps_ip;
838*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_num_cores_op_t *ps_op;
839*495ae853SAndroid Build Coastguard Worker 
840*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_set_num_cores_ip_t *) pv_api_ip;
841*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_set_num_cores_op_t *) pv_api_op;
842*495ae853SAndroid Build Coastguard Worker 
843*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_set_num_cores_ip_t))
844*495ae853SAndroid Build Coastguard Worker                     {
845*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
846*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
847*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
848*495ae853SAndroid Build Coastguard Worker                     }
849*495ae853SAndroid Build Coastguard Worker 
850*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_set_num_cores_op_t))
851*495ae853SAndroid Build Coastguard Worker                     {
852*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
853*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
854*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
855*495ae853SAndroid Build Coastguard Worker                     }
856*495ae853SAndroid Build Coastguard Worker 
857*495ae853SAndroid Build Coastguard Worker                     if((ps_ip->u4_num_cores != 1) && (ps_ip->u4_num_cores != 2) &&
858*495ae853SAndroid Build Coastguard Worker                        (ps_ip->u4_num_cores != 3) && (ps_ip->u4_num_cores != 4))
859*495ae853SAndroid Build Coastguard Worker                     {
860*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
861*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
862*495ae853SAndroid Build Coastguard Worker                     }
863*495ae853SAndroid Build Coastguard Worker                     break;
864*495ae853SAndroid Build Coastguard Worker                 }
865*495ae853SAndroid Build Coastguard Worker                 case IH264D_CMD_CTL_SET_PROCESSOR:
866*495ae853SAndroid Build Coastguard Worker                 {
867*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_processor_ip_t *ps_ip;
868*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_processor_op_t *ps_op;
869*495ae853SAndroid Build Coastguard Worker 
870*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_ctl_set_processor_ip_t *) pv_api_ip;
871*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_ctl_set_processor_op_t *) pv_api_op;
872*495ae853SAndroid Build Coastguard Worker 
873*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_ctl_set_processor_ip_t))
874*495ae853SAndroid Build Coastguard Worker                     {
875*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
876*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
877*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
878*495ae853SAndroid Build Coastguard Worker                     }
879*495ae853SAndroid Build Coastguard Worker 
880*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_ctl_set_processor_op_t))
881*495ae853SAndroid Build Coastguard Worker                     {
882*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
883*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
884*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
885*495ae853SAndroid Build Coastguard Worker                     }
886*495ae853SAndroid Build Coastguard Worker 
887*495ae853SAndroid Build Coastguard Worker                     break;
888*495ae853SAndroid Build Coastguard Worker                 }
889*495ae853SAndroid Build Coastguard Worker 
890*495ae853SAndroid Build Coastguard Worker                 case ISVCD_CMD_CTL_SET_TGT_LAYER:
891*495ae853SAndroid Build Coastguard Worker                 {
892*495ae853SAndroid Build Coastguard Worker                     isvcd_set_target_layer_ip_t *ps_ip;
893*495ae853SAndroid Build Coastguard Worker                     isvcd_set_target_layer_op_t *ps_op;
894*495ae853SAndroid Build Coastguard Worker 
895*495ae853SAndroid Build Coastguard Worker                     ps_ip = (isvcd_set_target_layer_ip_t *) pv_api_ip;
896*495ae853SAndroid Build Coastguard Worker                     ps_op = (isvcd_set_target_layer_op_t *) pv_api_op;
897*495ae853SAndroid Build Coastguard Worker 
898*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u4_size != sizeof(isvcd_set_target_layer_ip_t))
899*495ae853SAndroid Build Coastguard Worker                     {
900*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
901*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
902*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
903*495ae853SAndroid Build Coastguard Worker                     }
904*495ae853SAndroid Build Coastguard Worker 
905*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u1_tgt_dep_id > MAX_DEPENDENCY_ID)
906*495ae853SAndroid Build Coastguard Worker                     {
907*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
908*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
909*495ae853SAndroid Build Coastguard Worker                     }
910*495ae853SAndroid Build Coastguard Worker 
911*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u1_tgt_temp_id > MAX_TEMPORAL_ID)
912*495ae853SAndroid Build Coastguard Worker                     {
913*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
914*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
915*495ae853SAndroid Build Coastguard Worker                     }
916*495ae853SAndroid Build Coastguard Worker 
917*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u1_tgt_quality_id > MAX_QUALITY_ID)
918*495ae853SAndroid Build Coastguard Worker                     {
919*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
920*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
921*495ae853SAndroid Build Coastguard Worker                     }
922*495ae853SAndroid Build Coastguard Worker 
923*495ae853SAndroid Build Coastguard Worker                     if(ps_ip->u1_tgt_priority_id > MAX_PRIORITY_ID)
924*495ae853SAndroid Build Coastguard Worker                     {
925*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
926*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
927*495ae853SAndroid Build Coastguard Worker                     }
928*495ae853SAndroid Build Coastguard Worker 
929*495ae853SAndroid Build Coastguard Worker                     if(ps_op->u4_size != sizeof(isvcd_set_target_layer_op_t))
930*495ae853SAndroid Build Coastguard Worker                     {
931*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
932*495ae853SAndroid Build Coastguard Worker                         ps_op->u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
933*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
934*495ae853SAndroid Build Coastguard Worker                     }
935*495ae853SAndroid Build Coastguard Worker 
936*495ae853SAndroid Build Coastguard Worker                     break;
937*495ae853SAndroid Build Coastguard Worker                 }
938*495ae853SAndroid Build Coastguard Worker 
939*495ae853SAndroid Build Coastguard Worker                 default:
940*495ae853SAndroid Build Coastguard Worker                     *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
941*495ae853SAndroid Build Coastguard Worker                     *(pu4_api_op + 1) |= IVD_UNSUPPORTED_API_CMD;
942*495ae853SAndroid Build Coastguard Worker                     return IV_FAIL;
943*495ae853SAndroid Build Coastguard Worker                     break;
944*495ae853SAndroid Build Coastguard Worker             }
945*495ae853SAndroid Build Coastguard Worker         }
946*495ae853SAndroid Build Coastguard Worker         break;
947*495ae853SAndroid Build Coastguard Worker     }
948*495ae853SAndroid Build Coastguard Worker 
949*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
950*495ae853SAndroid Build Coastguard Worker }
951*495ae853SAndroid Build Coastguard Worker 
952*495ae853SAndroid Build Coastguard Worker /**
953*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
954*495ae853SAndroid Build Coastguard Worker  *
955*495ae853SAndroid Build Coastguard Worker  * @brief
956*495ae853SAndroid Build Coastguard Worker  *  Sets Processor type
957*495ae853SAndroid Build Coastguard Worker  *
958*495ae853SAndroid Build Coastguard Worker  * @par Description:
959*495ae853SAndroid Build Coastguard Worker  *  Sets Processor type
960*495ae853SAndroid Build Coastguard Worker  *
961*495ae853SAndroid Build Coastguard Worker  * @param[in] ps_codec_obj
962*495ae853SAndroid Build Coastguard Worker  *  Pointer to codec object at API level
963*495ae853SAndroid Build Coastguard Worker  *
964*495ae853SAndroid Build Coastguard Worker  * @param[in] pv_api_ip
965*495ae853SAndroid Build Coastguard Worker  *  Pointer to input argument structure
966*495ae853SAndroid Build Coastguard Worker  *
967*495ae853SAndroid Build Coastguard Worker  * @param[out] pv_api_op
968*495ae853SAndroid Build Coastguard Worker  *  Pointer to output argument structure
969*495ae853SAndroid Build Coastguard Worker  *
970*495ae853SAndroid Build Coastguard Worker  * @returns  Status
971*495ae853SAndroid Build Coastguard Worker  *
972*495ae853SAndroid Build Coastguard Worker  * @remarks
973*495ae853SAndroid Build Coastguard Worker  *
974*495ae853SAndroid Build Coastguard Worker  *
975*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
976*495ae853SAndroid Build Coastguard Worker  */
977*495ae853SAndroid Build Coastguard Worker 
isvcd_set_processor(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)978*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_processor(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
979*495ae853SAndroid Build Coastguard Worker {
980*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_processor_ip_t *ps_ip;
981*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_processor_op_t *ps_op;
982*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
983*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_codec;
984*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
985*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
986*495ae853SAndroid Build Coastguard Worker 
987*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_set_processor_ip_t *) pv_api_ip;
988*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_set_processor_op_t *) pv_api_op;
989*495ae853SAndroid Build Coastguard Worker 
990*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->e_processor_arch = (IVD_ARCH_T) ps_ip->u4_arch;
991*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->e_processor_soc = (IVD_SOC_T) ps_ip->u4_soc;
992*495ae853SAndroid Build Coastguard Worker 
993*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
994*495ae853SAndroid Build Coastguard Worker     {
995*495ae853SAndroid Build Coastguard Worker         ps_codec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
996*495ae853SAndroid Build Coastguard Worker         ps_codec->s_dec.e_processor_arch = (IVD_ARCH_T) ps_ip->u4_arch;
997*495ae853SAndroid Build Coastguard Worker         ps_codec->s_dec.e_processor_soc = (IVD_SOC_T) ps_ip->u4_soc;
998*495ae853SAndroid Build Coastguard Worker 
999*495ae853SAndroid Build Coastguard Worker         isvcd_init_function_ptr(ps_codec);
1000*495ae853SAndroid Build Coastguard Worker     }
1001*495ae853SAndroid Build Coastguard Worker 
1002*495ae853SAndroid Build Coastguard Worker     ps_op->u4_error_code = 0;
1003*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
1004*495ae853SAndroid Build Coastguard Worker }
1005*495ae853SAndroid Build Coastguard Worker 
1006*495ae853SAndroid Build Coastguard Worker /**************************************************************************
1007*495ae853SAndroid Build Coastguard Worker  * \if Function name : isvcd_init_decoder \endif
1008*495ae853SAndroid Build Coastguard Worker  *
1009*495ae853SAndroid Build Coastguard Worker  *
1010*495ae853SAndroid Build Coastguard Worker  * \brief
1011*495ae853SAndroid Build Coastguard Worker  *    Initializes the decoder
1012*495ae853SAndroid Build Coastguard Worker  *
1013*495ae853SAndroid Build Coastguard Worker  * \param apiVersion               : Version of the api being used.
1014*495ae853SAndroid Build Coastguard Worker  * \param errorHandlingMechanism   : Mechanism to be used for errror handling.
1015*495ae853SAndroid Build Coastguard Worker  * \param postFilteringType: Type of post filtering operation to be used.
1016*495ae853SAndroid Build Coastguard Worker  * \param uc_outputFormat: Format of the decoded picture [default 4:2:0].
1017*495ae853SAndroid Build Coastguard Worker  * \param uc_dispBufs: Number of Display Buffers.
1018*495ae853SAndroid Build Coastguard Worker  * \param p_NALBufAPI: Pointer to NAL Buffer API.
1019*495ae853SAndroid Build Coastguard Worker  * \param p_DispBufAPI: Pointer to Display Buffer API.
1020*495ae853SAndroid Build Coastguard Worker  * \param ih264d_dec_mem_manager  :Pointer to the function that will be called
1021*495ae853SAndroid Build Coastguard Worker  *by decoder for memory allocation and freeing.
1022*495ae853SAndroid Build Coastguard Worker  *
1023*495ae853SAndroid Build Coastguard Worker  * \return
1024*495ae853SAndroid Build Coastguard Worker  *    0 on Success and -1 on error
1025*495ae853SAndroid Build Coastguard Worker  *
1026*495ae853SAndroid Build Coastguard Worker  **************************************************************************
1027*495ae853SAndroid Build Coastguard Worker  */
isvcd_init_decoder(svc_dec_lyr_struct_t * ps_dec_svc_lyr_params)1028*495ae853SAndroid Build Coastguard Worker void isvcd_init_decoder(svc_dec_lyr_struct_t *ps_dec_svc_lyr_params)
1029*495ae853SAndroid Build Coastguard Worker {
1030*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) ps_dec_svc_lyr_params;
1031*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
1032*495ae853SAndroid Build Coastguard Worker     dec_slice_params_t *ps_cur_slice;
1033*495ae853SAndroid Build Coastguard Worker     pocstruct_t *ps_prev_poc, *ps_cur_poc;
1034*495ae853SAndroid Build Coastguard Worker     size_t size;
1035*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
1036*495ae853SAndroid Build Coastguard Worker 
1037*495ae853SAndroid Build Coastguard Worker     size = sizeof(pred_info_t) * 2 * 32;
1038*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_pred, 0, size);
1039*495ae853SAndroid Build Coastguard Worker 
1040*495ae853SAndroid Build Coastguard Worker     size = sizeof(disp_mgr_t);
1041*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->pv_disp_buf_mgr, 0, size);
1042*495ae853SAndroid Build Coastguard Worker 
1043*495ae853SAndroid Build Coastguard Worker     size = ih264_buf_mgr_size();
1044*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->pv_pic_buf_mgr, 0, size);
1045*495ae853SAndroid Build Coastguard Worker 
1046*495ae853SAndroid Build Coastguard Worker     size = sizeof(dec_err_status_t);
1047*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_dec_err_status, 0, size);
1048*495ae853SAndroid Build Coastguard Worker 
1049*495ae853SAndroid Build Coastguard Worker     size = sizeof(sei);
1050*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_sei, 0, size);
1051*495ae853SAndroid Build Coastguard Worker 
1052*495ae853SAndroid Build Coastguard Worker     size = sizeof(sei);
1053*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_sei_parse, 0, size);
1054*495ae853SAndroid Build Coastguard Worker 
1055*495ae853SAndroid Build Coastguard Worker     size = sizeof(dpb_commands_t);
1056*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_dpb_cmds, 0, size);
1057*495ae853SAndroid Build Coastguard Worker 
1058*495ae853SAndroid Build Coastguard Worker     size = sizeof(dec_bit_stream_t);
1059*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_bitstrm, 0, size);
1060*495ae853SAndroid Build Coastguard Worker 
1061*495ae853SAndroid Build Coastguard Worker     size = sizeof(dec_slice_params_t);
1062*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_cur_slice, 0, size);
1063*495ae853SAndroid Build Coastguard Worker 
1064*495ae853SAndroid Build Coastguard Worker     size = MAX(sizeof(dec_seq_params_t), sizeof(dec_pic_params_t));
1065*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->pv_scratch_sps_pps, 0, size);
1066*495ae853SAndroid Build Coastguard Worker 
1067*495ae853SAndroid Build Coastguard Worker     size = sizeof(dec_svc_seq_params_t);
1068*495ae853SAndroid Build Coastguard Worker     memset(ps_svc_lyr_dec->pv_scratch_subset_sps, 0, size);
1069*495ae853SAndroid Build Coastguard Worker 
1070*495ae853SAndroid Build Coastguard Worker     size = sizeof(ctxt_inc_mb_info_t);
1071*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_left_mb_ctxt_info, 0, size);
1072*495ae853SAndroid Build Coastguard Worker 
1073*495ae853SAndroid Build Coastguard Worker     size = (sizeof(neighbouradd_t) << 2);
1074*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_left_mvpred_addr, 0, size);
1075*495ae853SAndroid Build Coastguard Worker 
1076*495ae853SAndroid Build Coastguard Worker     size = ih264_buf_mgr_size();
1077*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->pv_mv_buf_mgr, 0, size);
1078*495ae853SAndroid Build Coastguard Worker 
1079*495ae853SAndroid Build Coastguard Worker     /* Free any dynamic buffers that are allocated */
1080*495ae853SAndroid Build Coastguard Worker     isvcd_free_dynamic_bufs(ps_svc_lyr_dec);
1081*495ae853SAndroid Build Coastguard Worker 
1082*495ae853SAndroid Build Coastguard Worker     {
1083*495ae853SAndroid Build Coastguard Worker         UWORD8 i;
1084*495ae853SAndroid Build Coastguard Worker         struct pic_buffer_t *ps_init_dpb;
1085*495ae853SAndroid Build Coastguard Worker         ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[0][0];
1086*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < 2 * MAX_REF_BUFS; i++)
1087*495ae853SAndroid Build Coastguard Worker         {
1088*495ae853SAndroid Build Coastguard Worker             ps_init_dpb->pu1_buf1 = NULL;
1089*495ae853SAndroid Build Coastguard Worker             ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
1090*495ae853SAndroid Build Coastguard Worker             ps_dec->ps_dpb_mgr->ps_init_dpb[0][i] = ps_init_dpb;
1091*495ae853SAndroid Build Coastguard Worker             ps_dec->ps_dpb_mgr->ps_mod_dpb[0][i] = ps_init_dpb;
1092*495ae853SAndroid Build Coastguard Worker             ps_init_dpb++;
1093*495ae853SAndroid Build Coastguard Worker         }
1094*495ae853SAndroid Build Coastguard Worker 
1095*495ae853SAndroid Build Coastguard Worker         ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[1][0];
1096*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < 2 * MAX_REF_BUFS; i++)
1097*495ae853SAndroid Build Coastguard Worker         {
1098*495ae853SAndroid Build Coastguard Worker             ps_init_dpb->pu1_buf1 = NULL;
1099*495ae853SAndroid Build Coastguard Worker             ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
1100*495ae853SAndroid Build Coastguard Worker             ps_dec->ps_dpb_mgr->ps_init_dpb[1][i] = ps_init_dpb;
1101*495ae853SAndroid Build Coastguard Worker             ps_dec->ps_dpb_mgr->ps_mod_dpb[1][i] = ps_init_dpb;
1102*495ae853SAndroid Build Coastguard Worker             ps_init_dpb++;
1103*495ae853SAndroid Build Coastguard Worker         }
1104*495ae853SAndroid Build Coastguard Worker     }
1105*495ae853SAndroid Build Coastguard Worker 
1106*495ae853SAndroid Build Coastguard Worker     ps_cur_slice = ps_dec->ps_cur_slice;
1107*495ae853SAndroid Build Coastguard Worker     ps_dec->init_done = 0;
1108*495ae853SAndroid Build Coastguard Worker 
1109*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_num_cores = 1;
1110*495ae853SAndroid Build Coastguard Worker     ps_dec->u2_pic_ht = ps_dec->u2_pic_wd = 0;
1111*495ae853SAndroid Build Coastguard Worker 
1112*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_separate_parse = DEFAULT_SEPARATE_PARSE;
1113*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_app_disable_deblk_frm = 0;
1114*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_degrade_type = 0;
1115*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_degrade_pics = 0;
1116*495ae853SAndroid Build Coastguard Worker 
1117*495ae853SAndroid Build Coastguard Worker     /* Initialization of function pointers ih264d_deblock_picture function*/
1118*495ae853SAndroid Build Coastguard Worker     ps_dec->p_DeblockPicture[0] = ih264d_deblock_picture_non_mbaff;
1119*495ae853SAndroid Build Coastguard Worker     ps_dec->p_DeblockPicture[1] = ih264d_deblock_picture_mbaff;
1120*495ae853SAndroid Build Coastguard Worker 
1121*495ae853SAndroid Build Coastguard Worker     ps_dec->s_cab_dec_env.pv_codec_handle = ps_dec;
1122*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_num_fld_in_frm = 0;
1123*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_dpb_mgr->pv_codec_handle = ps_dec;
1124*495ae853SAndroid Build Coastguard Worker 
1125*495ae853SAndroid Build Coastguard Worker     /* Initialize the sei validity u4_flag with zero indiacting sei is not valid*/
1126*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_sei->u1_is_valid = 0;
1127*495ae853SAndroid Build Coastguard Worker 
1128*495ae853SAndroid Build Coastguard Worker     /* decParams Initializations */
1129*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_cur_pps = NULL;
1130*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_cur_sps = NULL;
1131*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_init_dec_flag = 0;
1132*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_first_slice_in_stream = 1;
1133*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_last_pic_not_decoded = 0;
1134*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_app_disp_width = 0;
1135*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_header_decoded = 0;
1136*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_total_frames_decoded = 0;
1137*495ae853SAndroid Build Coastguard Worker 
1138*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_error_code = 0;
1139*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_content_type = IV_CONTENTTYPE_NA;
1140*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_cur_slice->u1_mbaff_frame_flag = 0;
1141*495ae853SAndroid Build Coastguard Worker 
1142*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_dec_err_status->u1_err_flag = ACCEPT_ALL_PICS;
1143*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_dec_err_status->u1_cur_pic_type = PIC_TYPE_UNKNOWN;
1144*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_dec_err_status->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
1145*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_dec_err_status->u4_cur_frm = INIT_FRAME;
1146*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
1147*495ae853SAndroid Build Coastguard Worker 
1148*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_pr_sl_type = 0xFF;
1149*495ae853SAndroid Build Coastguard Worker     ps_dec->u2_mbx = 0xffff;
1150*495ae853SAndroid Build Coastguard Worker     ps_dec->u2_mby = 0;
1151*495ae853SAndroid Build Coastguard Worker     ps_dec->u2_total_mbs_coded = 0;
1152*495ae853SAndroid Build Coastguard Worker 
1153*495ae853SAndroid Build Coastguard Worker     /* POC initializations */
1154*495ae853SAndroid Build Coastguard Worker     ps_prev_poc = &ps_dec->s_prev_pic_poc;
1155*495ae853SAndroid Build Coastguard Worker     ps_cur_poc = &ps_dec->s_cur_pic_poc;
1156*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb = 0;
1157*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb = 0;
1158*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom = 0;
1159*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0] = 0;
1160*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1] = 0;
1161*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->u1_mmco_equalto5 = ps_cur_poc->u1_mmco_equalto5 = 0;
1162*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->i4_top_field_order_count = ps_cur_poc->i4_top_field_order_count = 0;
1163*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->i4_bottom_field_order_count = ps_cur_poc->i4_bottom_field_order_count = 0;
1164*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field = 0;
1165*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->u1_mmco_equalto5 = ps_cur_poc->u1_mmco_equalto5 = 0;
1166*495ae853SAndroid Build Coastguard Worker     ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst = 0;
1167*495ae853SAndroid Build Coastguard Worker     ps_cur_slice->u1_mmco_equalto5 = 0;
1168*495ae853SAndroid Build Coastguard Worker     ps_cur_slice->u2_frame_num = 0;
1169*495ae853SAndroid Build Coastguard Worker 
1170*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_max_poc = 0;
1171*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_prev_max_display_seq = 0;
1172*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_recon_mb_grp = 4;
1173*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_reorder_depth = -1;
1174*495ae853SAndroid Build Coastguard Worker 
1175*495ae853SAndroid Build Coastguard Worker     /* Field PIC initializations */
1176*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_second_field = 0;
1177*495ae853SAndroid Build Coastguard Worker     ps_dec->s_prev_seq_params.u1_eoseq_pending = 0;
1178*495ae853SAndroid Build Coastguard Worker 
1179*495ae853SAndroid Build Coastguard Worker     /* Set the cropping parameters as zero */
1180*495ae853SAndroid Build Coastguard Worker     ps_dec->u2_crop_offset_y = 0;
1181*495ae853SAndroid Build Coastguard Worker     ps_dec->u2_crop_offset_uv = 0;
1182*495ae853SAndroid Build Coastguard Worker 
1183*495ae853SAndroid Build Coastguard Worker     /* The Initial Frame Rate Info is not Present */
1184*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_vui_frame_rate = -1;
1185*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_pic_type = NA_SLICE;
1186*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_frametype = IV_NA_FRAME;
1187*495ae853SAndroid Build Coastguard Worker     ps_dec->i4_content_type = IV_CONTENTTYPE_NA;
1188*495ae853SAndroid Build Coastguard Worker 
1189*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_res_changed = 0;
1190*495ae853SAndroid Build Coastguard Worker 
1191*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_frame_decoded_flag = 0;
1192*495ae853SAndroid Build Coastguard Worker 
1193*495ae853SAndroid Build Coastguard Worker     /* Set the default frame seek mask mode */
1194*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_skip_frm_mask = SKIP_NONE;
1195*495ae853SAndroid Build Coastguard Worker 
1196*495ae853SAndroid Build Coastguard Worker     /********************************************************/
1197*495ae853SAndroid Build Coastguard Worker     /* Initialize CAVLC residual decoding function pointers */
1198*495ae853SAndroid Build Coastguard Worker     /********************************************************/
1199*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_4x4res_block[0] = ih264d_cavlc_4x4res_block_totalcoeff_1;
1200*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_4x4res_block[1] = ih264d_cavlc_4x4res_block_totalcoeff_2to10;
1201*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_4x4res_block[2] = ih264d_cavlc_4x4res_block_totalcoeff_11to16;
1202*495ae853SAndroid Build Coastguard Worker 
1203*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_parse4x4coeff[0] = ih264d_cavlc_parse4x4coeff_n0to7;
1204*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_parse4x4coeff[1] = ih264d_cavlc_parse4x4coeff_n8;
1205*495ae853SAndroid Build Coastguard Worker 
1206*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_parse_8x8block[0] = ih264d_cavlc_parse_8x8block_none_available;
1207*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_parse_8x8block[1] = ih264d_cavlc_parse_8x8block_left_available;
1208*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_parse_8x8block[2] = ih264d_cavlc_parse_8x8block_top_available;
1209*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_cavlc_parse_8x8block[3] = ih264d_cavlc_parse_8x8block_both_available;
1210*495ae853SAndroid Build Coastguard Worker 
1211*495ae853SAndroid Build Coastguard Worker     /***************************************************************************/
1212*495ae853SAndroid Build Coastguard Worker     /* Initialize Bs calculation function pointers for P and B, 16x16/non16x16 */
1213*495ae853SAndroid Build Coastguard Worker     /***************************************************************************/
1214*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_fill_bs1[0][0] = ih264d_fill_bs1_16x16mb_pslice;
1215*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_fill_bs1[0][1] = ih264d_fill_bs1_non16x16mb_pslice;
1216*495ae853SAndroid Build Coastguard Worker 
1217*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_fill_bs1[1][0] = ih264d_fill_bs1_16x16mb_bslice;
1218*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_fill_bs1[1][1] = ih264d_fill_bs1_non16x16mb_bslice;
1219*495ae853SAndroid Build Coastguard Worker 
1220*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_fill_bs_xtra_left_edge[0] = ih264d_fill_bs_xtra_left_edge_cur_frm;
1221*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_fill_bs_xtra_left_edge[1] = ih264d_fill_bs_xtra_left_edge_cur_fld;
1222*495ae853SAndroid Build Coastguard Worker 
1223*495ae853SAndroid Build Coastguard Worker     /* Initialize Reference Pic Buffers */
1224*495ae853SAndroid Build Coastguard Worker     ih264d_init_ref_bufs(ps_dec->ps_dpb_mgr);
1225*495ae853SAndroid Build Coastguard Worker 
1226*495ae853SAndroid Build Coastguard Worker     ps_dec->u2_prv_frame_num = 0;
1227*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_top_bottom_decoded = 0;
1228*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_dangling_field = 0;
1229*495ae853SAndroid Build Coastguard Worker 
1230*495ae853SAndroid Build Coastguard Worker     ps_dec->s_cab_dec_env.cabac_table = gau4_ih264d_cabac_table;
1231*495ae853SAndroid Build Coastguard Worker 
1232*495ae853SAndroid Build Coastguard Worker     ps_dec->pu1_left_mv_ctxt_inc = ps_dec->u1_left_mv_ctxt_inc_arr[0];
1233*495ae853SAndroid Build Coastguard Worker     ps_dec->pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0];
1234*495ae853SAndroid Build Coastguard Worker     ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_topmb;
1235*495ae853SAndroid Build Coastguard Worker 
1236*495ae853SAndroid Build Coastguard Worker     /* ! */
1237*495ae853SAndroid Build Coastguard Worker     /* Initializing flush frame u4_flag */
1238*495ae853SAndroid Build Coastguard Worker     ps_dec->u1_flushfrm = 0;
1239*495ae853SAndroid Build Coastguard Worker 
1240*495ae853SAndroid Build Coastguard Worker     ps_dec->s_cab_dec_env.pv_codec_handle = (void *) ps_dec;
1241*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_bitstrm->pv_codec_handle = (void *) ps_dec;
1242*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_cur_slice->pv_codec_handle = (void *) ps_dec;
1243*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_dpb_mgr->pv_codec_handle = (void *) ps_dec;
1244*495ae853SAndroid Build Coastguard Worker 
1245*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->disp_bufs, 0, (MAX_DISP_BUFS_NEW) * sizeof(disp_buf_t));
1246*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->u4_disp_buf_mapping, 0, (MAX_DISP_BUFS_NEW) * sizeof(UWORD32));
1247*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->u4_disp_buf_to_be_freed, 0, (MAX_DISP_BUFS_NEW) * sizeof(UWORD32));
1248*495ae853SAndroid Build Coastguard Worker     memset(ps_dec->ps_cur_slice, 0, sizeof(dec_slice_params_t));
1249*495ae853SAndroid Build Coastguard Worker 
1250*495ae853SAndroid Build Coastguard Worker     ih264d_init_arch(ps_dec);
1251*495ae853SAndroid Build Coastguard Worker     isvcd_init_function_ptr(ps_svc_lyr_dec);
1252*495ae853SAndroid Build Coastguard Worker     ps_dec->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
1253*495ae853SAndroid Build Coastguard Worker     ps_dec->init_done = 1;
1254*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec->u1_layer_identifier = BASE_LAYER;
1255*495ae853SAndroid Build Coastguard Worker }
1256*495ae853SAndroid Build Coastguard Worker 
1257*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1258*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1259*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_nal_parse_ctxt_free                                */
1260*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1261*495ae853SAndroid Build Coastguard Worker /*  Description   :this function is used to free the nal parse context       */
1262*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1263*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1264*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
1265*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1266*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1267*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                      */
1268*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1269*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1270*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1271*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1272*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1273*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1274*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   Kishore               creation                       */
1275*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1276*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1277*495ae853SAndroid Build Coastguard Worker 
isvcd_nal_parse_ctxt_free(svc_dec_ctxt_t * ps_svcd_ctxt)1278*495ae853SAndroid Build Coastguard Worker void isvcd_nal_parse_ctxt_free(svc_dec_ctxt_t *ps_svcd_ctxt)
1279*495ae853SAndroid Build Coastguard Worker {
1280*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
1281*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
1282*495ae853SAndroid Build Coastguard Worker     void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1283*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
1284*495ae853SAndroid Build Coastguard Worker     nal_parse_ctxt_t *ps_ctxt;
1285*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[0];
1286*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
1287*495ae853SAndroid Build Coastguard Worker     pf_aligned_free = ps_dec->pf_aligned_free;
1288*495ae853SAndroid Build Coastguard Worker 
1289*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_dec->pv_mem_ctxt;
1290*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (nal_parse_ctxt_t *) ps_svcd_ctxt->pv_nal_parse_ctxt;
1291*495ae853SAndroid Build Coastguard Worker 
1292*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->s_dqid_ctxt.ps_dqid_node);
1293*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->pv_nal_header_buf);
1294*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->pv_nal_unit);
1295*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->pv_vcl_nal_buff);
1296*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->pv_non_vcl_nal_buff);
1297*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->pv_nal_parse_ctxt);
1298*495ae853SAndroid Build Coastguard Worker }
1299*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1300*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1301*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_resample_ctxt_free                        */
1302*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1303*495ae853SAndroid Build Coastguard Worker /*  Description   :this function is used to free the resd_resamp context     */
1304*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1305*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1306*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
1307*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1308*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1309*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1310*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1311*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1312*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1313*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1314*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1315*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1316*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   Kishore               creation                       */
1317*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1318*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1319*495ae853SAndroid Build Coastguard Worker 
isvcd_residual_resample_ctxt_free(svc_dec_ctxt_t * ps_svcd_ctxt)1320*495ae853SAndroid Build Coastguard Worker void isvcd_residual_resample_ctxt_free(svc_dec_ctxt_t *ps_svcd_ctxt)
1321*495ae853SAndroid Build Coastguard Worker {
1322*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
1323*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
1324*495ae853SAndroid Build Coastguard Worker     void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1325*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
1326*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
1327*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[0];
1328*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
1329*495ae853SAndroid Build Coastguard Worker     pf_aligned_free = ps_dec->pf_aligned_free;
1330*495ae853SAndroid Build Coastguard Worker 
1331*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_dec->pv_mem_ctxt;
1332*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (residual_sampling_ctxt_t *) ps_svcd_ctxt->pv_residual_sample_ctxt;
1333*495ae853SAndroid Build Coastguard Worker 
1334*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->pi2_refarray_buffer);
1335*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->pu1_ref_x_ptr_incr);
1336*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_x_offset_length);
1337*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_y_offset_length);
1338*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_x_pos_phase);
1339*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_y_pos_phase);
1340*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->pv_residual_sample_ctxt);
1341*495ae853SAndroid Build Coastguard Worker }
1342*495ae853SAndroid Build Coastguard Worker 
1343*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1344*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1345*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_intra_resample_ctxt_free                           */
1346*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1347*495ae853SAndroid Build Coastguard Worker /*  Description   :this function is used to free the intra_resamp context    */
1348*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1349*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1350*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
1351*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1352*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1353*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1354*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1355*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1356*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1357*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1358*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1359*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1360*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   Kishore               creation                       */
1361*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1362*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_intra_resample_ctxt_free(svc_dec_ctxt_t * ps_svcd_ctxt)1363*495ae853SAndroid Build Coastguard Worker void isvcd_intra_resample_ctxt_free(svc_dec_ctxt_t *ps_svcd_ctxt)
1364*495ae853SAndroid Build Coastguard Worker {
1365*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
1366*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
1367*495ae853SAndroid Build Coastguard Worker     void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1368*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
1369*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
1370*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[0];
1371*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
1372*495ae853SAndroid Build Coastguard Worker     pf_aligned_free = ps_dec->pf_aligned_free;
1373*495ae853SAndroid Build Coastguard Worker 
1374*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_dec->pv_mem_ctxt;
1375*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_sampling_ctxt_t *) ps_svcd_ctxt->pv_intra_sample_ctxt;
1376*495ae853SAndroid Build Coastguard Worker 
1377*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->pu1_refarray_buffer);
1378*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->pu1_refarray_cb);
1379*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->pu1_refarray_cr);
1380*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->pi4_temp_interpolation_buffer);
1381*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_x_offset_length);
1382*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_y_offset_length);
1383*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_x_min_max);
1384*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_y_min_max);
1385*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_x_pos_phase);
1386*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_y_pos_phase);
1387*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.pi2_xd_index);
1388*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.pi2_yd_index);
1389*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.pi2_ya_index);
1390*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_seg_lookup_horz);
1391*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.ps_seg_lookup_vert);
1392*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_ctxt->as_res_lyrs[0].s_luma_map_ctxt.pu1_refarray_x_idx);
1393*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->pv_intra_sample_ctxt);
1394*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->pv_ii_pred_ctxt);
1395*495ae853SAndroid Build Coastguard Worker }
1396*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1397*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1398*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_mode_mv_resample_ctxt_free                         */
1399*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1400*495ae853SAndroid Build Coastguard Worker /*  Description   :this function is used to free the mv resamp context       */
1401*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1402*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1403*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
1404*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1405*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1406*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1407*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1408*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1409*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1410*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1411*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1412*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1413*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   Kishore               creation                       */
1414*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1415*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_mode_mv_resample_ctxt_free(svc_dec_ctxt_t * ps_svcd_ctxt)1416*495ae853SAndroid Build Coastguard Worker void isvcd_mode_mv_resample_ctxt_free(svc_dec_ctxt_t *ps_svcd_ctxt)
1417*495ae853SAndroid Build Coastguard Worker {
1418*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
1419*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
1420*495ae853SAndroid Build Coastguard Worker     void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1421*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
1422*495ae853SAndroid Build Coastguard Worker     mode_motion_ctxt_t *ps_mode_motion;
1423*495ae853SAndroid Build Coastguard Worker 
1424*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[0];
1425*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
1426*495ae853SAndroid Build Coastguard Worker     pf_aligned_free = ps_dec->pf_aligned_free;
1427*495ae853SAndroid Build Coastguard Worker 
1428*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_dec->pv_mem_ctxt;
1429*495ae853SAndroid Build Coastguard Worker     ps_mode_motion = (mode_motion_ctxt_t *) ps_svcd_ctxt->pv_mode_mv_sample_ctxt;
1430*495ae853SAndroid Build Coastguard Worker 
1431*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_mode_motion->ps_motion_pred_struct);
1432*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_mode_motion->as_res_lyr_mem[0].pi2_ref_loc_x);
1433*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_mode_motion->as_res_lyr_mem[0].pi2_ref_loc_y);
1434*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->pv_ref_lyr_offset);
1435*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->pv_mode_mv_sample_ctxt);
1436*495ae853SAndroid Build Coastguard Worker }
1437*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1438*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1439*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_free_static_bufs                                   */
1440*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1441*495ae853SAndroid Build Coastguard Worker /*  Description   :this function is used to free the static buffers          */
1442*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1443*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1444*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
1445*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1446*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1447*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1448*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1449*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1450*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1451*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1452*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1453*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1454*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   Kishore               creation                       */
1455*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1456*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1457*495ae853SAndroid Build Coastguard Worker 
isvcd_free_static_bufs(iv_obj_t * dec_hdl)1458*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_free_static_bufs(iv_obj_t *dec_hdl)
1459*495ae853SAndroid Build Coastguard Worker {
1460*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
1461*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
1462*495ae853SAndroid Build Coastguard Worker 
1463*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
1464*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
1465*495ae853SAndroid Build Coastguard Worker 
1466*495ae853SAndroid Build Coastguard Worker     void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1467*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
1468*495ae853SAndroid Build Coastguard Worker 
1469*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
1470*495ae853SAndroid Build Coastguard Worker 
1471*495ae853SAndroid Build Coastguard Worker     isvcd_intra_resample_ctxt_free(ps_svcd_ctxt);
1472*495ae853SAndroid Build Coastguard Worker     isvcd_residual_resample_ctxt_free(ps_svcd_ctxt);
1473*495ae853SAndroid Build Coastguard Worker     isvcd_mode_mv_resample_ctxt_free(ps_svcd_ctxt);
1474*495ae853SAndroid Build Coastguard Worker     isvcd_nal_parse_ctxt_free(ps_svcd_ctxt);
1475*495ae853SAndroid Build Coastguard Worker 
1476*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
1477*495ae853SAndroid Build Coastguard Worker     {
1478*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
1479*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
1480*495ae853SAndroid Build Coastguard Worker         pf_aligned_free = ps_dec->pf_aligned_free;
1481*495ae853SAndroid Build Coastguard Worker         pv_mem_ctxt = ps_dec->pv_mem_ctxt;
1482*495ae853SAndroid Build Coastguard Worker 
1483*495ae853SAndroid Build Coastguard Worker #ifdef KEEP_THREADS_ACTIVE
1484*495ae853SAndroid Build Coastguard Worker         /* Wait for threads */
1485*495ae853SAndroid Build Coastguard Worker         ps_dec->i4_break_threads = 1;
1486*495ae853SAndroid Build Coastguard Worker         if(ps_dec->u4_dec_thread_created)
1487*495ae853SAndroid Build Coastguard Worker         {
1488*495ae853SAndroid Build Coastguard Worker             ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
1489*495ae853SAndroid Build Coastguard Worker 
1490*495ae853SAndroid Build Coastguard Worker             ps_dec->ai4_process_start[0] = PROC_START;
1491*495ae853SAndroid Build Coastguard Worker 
1492*495ae853SAndroid Build Coastguard Worker             ithread_cond_signal(ps_dec->apv_proc_start_condition[0]);
1493*495ae853SAndroid Build Coastguard Worker 
1494*495ae853SAndroid Build Coastguard Worker             ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
1495*495ae853SAndroid Build Coastguard Worker 
1496*495ae853SAndroid Build Coastguard Worker             ithread_join(ps_dec->pv_dec_thread_handle, NULL);
1497*495ae853SAndroid Build Coastguard Worker 
1498*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_dec_thread_created = 0;
1499*495ae853SAndroid Build Coastguard Worker         }
1500*495ae853SAndroid Build Coastguard Worker 
1501*495ae853SAndroid Build Coastguard Worker         if(ps_dec->u4_bs_deblk_thread_created)
1502*495ae853SAndroid Build Coastguard Worker         {
1503*495ae853SAndroid Build Coastguard Worker             ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
1504*495ae853SAndroid Build Coastguard Worker 
1505*495ae853SAndroid Build Coastguard Worker             ps_dec->ai4_process_start[1] = PROC_START;
1506*495ae853SAndroid Build Coastguard Worker 
1507*495ae853SAndroid Build Coastguard Worker             ithread_cond_signal(ps_dec->apv_proc_start_condition[1]);
1508*495ae853SAndroid Build Coastguard Worker 
1509*495ae853SAndroid Build Coastguard Worker             ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
1510*495ae853SAndroid Build Coastguard Worker 
1511*495ae853SAndroid Build Coastguard Worker             ithread_join(ps_dec->pv_bs_deblk_thread_handle, NULL);
1512*495ae853SAndroid Build Coastguard Worker 
1513*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_bs_deblk_thread_created = 0;
1514*495ae853SAndroid Build Coastguard Worker         }
1515*495ae853SAndroid Build Coastguard Worker 
1516*495ae853SAndroid Build Coastguard Worker         // destroy mutex and condition variable for both the threads
1517*495ae853SAndroid Build Coastguard Worker         // 1. ih264d_decode_picture_thread
1518*495ae853SAndroid Build Coastguard Worker         // 2. ih264d_recon_deblk_thread
1519*495ae853SAndroid Build Coastguard Worker         {
1520*495ae853SAndroid Build Coastguard Worker             UWORD32 i;
1521*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < 2; i++)
1522*495ae853SAndroid Build Coastguard Worker             {
1523*495ae853SAndroid Build Coastguard Worker                 ithread_cond_destroy(ps_dec->apv_proc_start_condition[i]);
1524*495ae853SAndroid Build Coastguard Worker                 ithread_cond_destroy(ps_dec->apv_proc_done_condition[i]);
1525*495ae853SAndroid Build Coastguard Worker 
1526*495ae853SAndroid Build Coastguard Worker                 ithread_mutex_destroy(ps_dec->apv_proc_start_mutex[i]);
1527*495ae853SAndroid Build Coastguard Worker                 ithread_mutex_destroy(ps_dec->apv_proc_done_mutex[i]);
1528*495ae853SAndroid Build Coastguard Worker             }
1529*495ae853SAndroid Build Coastguard Worker         }
1530*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->apv_proc_start_mutex[0]);
1531*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->apv_proc_start_condition[0]);
1532*495ae853SAndroid Build Coastguard Worker #endif
1533*495ae853SAndroid Build Coastguard Worker         if(0 == u1_layer_id)
1534*495ae853SAndroid Build Coastguard Worker         {
1535*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_sps_ctr;
1536*495ae853SAndroid Build Coastguard Worker             PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sps);
1537*495ae853SAndroid Build Coastguard Worker             for(u1_sps_ctr = 0; u1_sps_ctr < (2 * MAX_NUM_SEQ_PARAMS); u1_sps_ctr++)
1538*495ae853SAndroid Build Coastguard Worker             {
1539*495ae853SAndroid Build Coastguard Worker                 if(NULL != ps_svcd_ctxt->ps_subset_sps[u1_sps_ctr].s_sps_svc_ext.ps_svc_vui_ext)
1540*495ae853SAndroid Build Coastguard Worker                 {
1541*495ae853SAndroid Build Coastguard Worker                     PS_DEC_ALIGNED_FREE(
1542*495ae853SAndroid Build Coastguard Worker                         ps_dec,
1543*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->ps_subset_sps[u1_sps_ctr].s_sps_svc_ext.ps_svc_vui_ext);
1544*495ae853SAndroid Build Coastguard Worker                 }
1545*495ae853SAndroid Build Coastguard Worker             }
1546*495ae853SAndroid Build Coastguard Worker             PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->ps_subset_sps);
1547*495ae853SAndroid Build Coastguard Worker             PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pps);
1548*495ae853SAndroid Build Coastguard Worker             PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sei);
1549*495ae853SAndroid Build Coastguard Worker             PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sei_parse);
1550*495ae853SAndroid Build Coastguard Worker         }
1551*495ae853SAndroid Build Coastguard Worker 
1552*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_dec_thread_handle);
1553*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_bs_deblk_thread_handle);
1554*495ae853SAndroid Build Coastguard Worker 
1555*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dpb_mgr);
1556*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pred);
1557*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_disp_buf_mgr);
1558*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pic_buf_base);
1559*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dec_err_status);
1560*495ae853SAndroid Build Coastguard Worker 
1561*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dpb_cmds);
1562*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_bitstrm);
1563*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->ps_nal_svc_ext);
1564*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_cur_slice);
1565*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_scratch_sps_pps);
1566*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->pv_scratch_subset_sps);
1567*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_bits_buf_static);
1568*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ppv_map_ref_idx_to_poc_base);
1569*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->p_cabac_ctxt_table_t);
1570*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_left_mb_ctxt_info);
1571*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_ref_buff_base);
1572*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pi2_pred1);
1573*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_temp_mc_buffer);
1574*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_init_dpb_base);
1575*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu4_mbaff_wt_mat);
1576*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu4_wts_ofsts_mat);
1577*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_left_mvpred_addr);
1578*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_col_mv_base);
1579*495ae853SAndroid Build Coastguard Worker         PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma);
1580*495ae853SAndroid Build Coastguard Worker 
1581*495ae853SAndroid Build Coastguard Worker         if(NULL != ps_dec->pv_pic_buf_mgr)
1582*495ae853SAndroid Build Coastguard Worker         {
1583*495ae853SAndroid Build Coastguard Worker             if(u1_layer_id < ps_svcd_ctxt->u1_prev_num_res_layers)
1584*495ae853SAndroid Build Coastguard Worker             {
1585*495ae853SAndroid Build Coastguard Worker                 if(((buf_mgr_t *) ps_dec->pv_pic_buf_mgr)->pv_mutex != NULL)
1586*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_free(ps_dec->pv_pic_buf_mgr);
1587*495ae853SAndroid Build Coastguard Worker             }
1588*495ae853SAndroid Build Coastguard Worker             PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_pic_buf_mgr);
1589*495ae853SAndroid Build Coastguard Worker         }
1590*495ae853SAndroid Build Coastguard Worker         if(NULL != ps_dec->pv_mv_buf_mgr)
1591*495ae853SAndroid Build Coastguard Worker         {
1592*495ae853SAndroid Build Coastguard Worker             if(u1_layer_id < ps_svcd_ctxt->u1_prev_num_res_layers)
1593*495ae853SAndroid Build Coastguard Worker             {
1594*495ae853SAndroid Build Coastguard Worker                 if(((buf_mgr_t *) ps_dec->pv_mv_buf_mgr)->pv_mutex != NULL)
1595*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_free(ps_dec->pv_mv_buf_mgr);
1596*495ae853SAndroid Build Coastguard Worker             }
1597*495ae853SAndroid Build Coastguard Worker             PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_mv_buf_mgr);
1598*495ae853SAndroid Build Coastguard Worker         }
1599*495ae853SAndroid Build Coastguard Worker     }
1600*495ae853SAndroid Build Coastguard Worker 
1601*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, ps_svcd_ctxt->ps_svc_dec_lyr);
1602*495ae853SAndroid Build Coastguard Worker     pf_aligned_free(pv_mem_ctxt, dec_hdl->pv_codec_handle);
1603*495ae853SAndroid Build Coastguard Worker 
1604*495ae853SAndroid Build Coastguard Worker     if(dec_hdl)
1605*495ae853SAndroid Build Coastguard Worker     {
1606*495ae853SAndroid Build Coastguard Worker         pf_aligned_free(pv_mem_ctxt, dec_hdl);
1607*495ae853SAndroid Build Coastguard Worker     }
1608*495ae853SAndroid Build Coastguard Worker 
1609*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
1610*495ae853SAndroid Build Coastguard Worker }
1611*495ae853SAndroid Build Coastguard Worker 
1612*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1613*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1614*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_nal_parse_init                                      */
1615*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1616*495ae853SAndroid Build Coastguard Worker /*  Description   : Initiaization of allocation of memory                    */
1617*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1618*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_mem_rec - Allocated memory records                    */
1619*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1620*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
1621*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1622*495ae853SAndroid Build Coastguard Worker /*  Processing    : None                                                     */
1623*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1624*495ae853SAndroid Build Coastguard Worker /*  Outputs       : None                                                     */
1625*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1626*495ae853SAndroid Build Coastguard Worker /*  Returns       : Module's handle                                          */
1627*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1628*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
1629*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1630*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1631*495ae853SAndroid Build Coastguard Worker /*          DD MM YYYY   Author(s)       Changes                             */
1632*495ae853SAndroid Build Coastguard Worker /*          06 09 2021   Vijay           Draft                               */
1633*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1634*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_nal_parse_ctxt_create(svc_dec_ctxt_t * ps_svcd_ctxt,void * pv_api_ip,void * pv_api_op)1635*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_nal_parse_ctxt_create(svc_dec_ctxt_t *ps_svcd_ctxt, void *pv_api_ip, void *pv_api_op)
1636*495ae853SAndroid Build Coastguard Worker {
1637*495ae853SAndroid Build Coastguard Worker     isvcd_create_ip_t *ps_create_ip;
1638*495ae853SAndroid Build Coastguard Worker     void *pv_buf;
1639*495ae853SAndroid Build Coastguard Worker     void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
1640*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
1641*495ae853SAndroid Build Coastguard Worker     WORD32 size;
1642*495ae853SAndroid Build Coastguard Worker     nal_parse_ctxt_t *ps_nal_parse_ctxt;
1643*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_ptr;
1644*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_api_op);
1645*495ae853SAndroid Build Coastguard Worker 
1646*495ae853SAndroid Build Coastguard Worker     ps_create_ip = (isvcd_create_ip_t *) pv_api_ip;
1647*495ae853SAndroid Build Coastguard Worker 
1648*495ae853SAndroid Build Coastguard Worker     pf_aligned_alloc = ps_create_ip->s_ivd_create_ip_t.pf_aligned_alloc;
1649*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
1650*495ae853SAndroid Build Coastguard Worker 
1651*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1652*495ae853SAndroid Build Coastguard Worker     /* Handle                                                                */
1653*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1654*495ae853SAndroid Build Coastguard Worker     size = sizeof(nal_parse_ctxt_t);
1655*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1656*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
1657*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
1658*495ae853SAndroid Build Coastguard Worker     ps_nal_parse_ctxt = pv_buf;
1659*495ae853SAndroid Build Coastguard Worker 
1660*495ae853SAndroid Build Coastguard Worker     /* set the lowest dqid to -1 */
1661*495ae853SAndroid Build Coastguard Worker     ps_nal_parse_ctxt->i4_prev_dq_id = -1;
1662*495ae853SAndroid Build Coastguard Worker 
1663*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1664*495ae853SAndroid Build Coastguard Worker     /* DQID list buffer and initialization of vcl node buffer context        */
1665*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1666*495ae853SAndroid Build Coastguard Worker     {
1667*495ae853SAndroid Build Coastguard Worker         WORD32 i4_lyr_idx;
1668*495ae853SAndroid Build Coastguard Worker         WORD32 i4_max_num_lyrs;
1669*495ae853SAndroid Build Coastguard Worker         vcl_node_t *ps_vcl_node;
1670*495ae853SAndroid Build Coastguard Worker         dqid_node_t *ps_dqid_node;
1671*495ae853SAndroid Build Coastguard Worker         dqid_ctxt_t *ps_dqid_ctxt;
1672*495ae853SAndroid Build Coastguard Worker 
1673*495ae853SAndroid Build Coastguard Worker         size = sizeof(vcl_node_t);
1674*495ae853SAndroid Build Coastguard Worker         size += sizeof(dqid_node_t);
1675*495ae853SAndroid Build Coastguard Worker         size *= MAX_NUM_RES_LYRS;
1676*495ae853SAndroid Build Coastguard Worker 
1677*495ae853SAndroid Build Coastguard Worker         ps_dqid_ctxt = &ps_nal_parse_ctxt->s_dqid_ctxt;
1678*495ae853SAndroid Build Coastguard Worker 
1679*495ae853SAndroid Build Coastguard Worker         ps_dqid_ctxt->i4_max_num_lyrs = MAX_NUM_RES_LYRS;
1680*495ae853SAndroid Build Coastguard Worker 
1681*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1682*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
1683*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
1684*495ae853SAndroid Build Coastguard Worker 
1685*495ae853SAndroid Build Coastguard Worker         ps_dqid_ctxt->ps_dqid_node = pv_buf;
1686*495ae853SAndroid Build Coastguard Worker         ps_dqid_node = ps_dqid_ctxt->ps_dqid_node;
1687*495ae853SAndroid Build Coastguard Worker 
1688*495ae853SAndroid Build Coastguard Worker         i4_max_num_lyrs = ps_dqid_ctxt->i4_max_num_lyrs;
1689*495ae853SAndroid Build Coastguard Worker 
1690*495ae853SAndroid Build Coastguard Worker         pu1_ptr = pv_buf;
1691*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(dqid_node_t) * i4_max_num_lyrs;
1692*495ae853SAndroid Build Coastguard Worker         ps_vcl_node = (vcl_node_t *) pu1_ptr;
1693*495ae853SAndroid Build Coastguard Worker 
1694*495ae853SAndroid Build Coastguard Worker         for(i4_lyr_idx = 0; i4_lyr_idx < i4_max_num_lyrs; i4_lyr_idx++)
1695*495ae853SAndroid Build Coastguard Worker         {
1696*495ae853SAndroid Build Coastguard Worker             ps_dqid_node->ps_vcl_node = ps_vcl_node;
1697*495ae853SAndroid Build Coastguard Worker 
1698*495ae853SAndroid Build Coastguard Worker             /* Loop updates */
1699*495ae853SAndroid Build Coastguard Worker             ps_vcl_node += 1;
1700*495ae853SAndroid Build Coastguard Worker             ps_dqid_node += 1;
1701*495ae853SAndroid Build Coastguard Worker         } /* Loop over all the layers */
1702*495ae853SAndroid Build Coastguard Worker     }
1703*495ae853SAndroid Build Coastguard Worker 
1704*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1705*495ae853SAndroid Build Coastguard Worker     /* Common memory                                                         */
1706*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1707*495ae853SAndroid Build Coastguard Worker     size = UP_ALIGN_8(HEADER_BUFFER_LEN_BEFORE_EP);
1708*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1709*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
1710*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
1711*495ae853SAndroid Build Coastguard Worker     ps_nal_parse_ctxt->pv_nal_header_buf = (void *) pv_buf;
1712*495ae853SAndroid Build Coastguard Worker 
1713*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1714*495ae853SAndroid Build Coastguard Worker     /* Layer params memory                                                   */
1715*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1716*495ae853SAndroid Build Coastguard Worker     size = sizeof(nal_unit_t);
1717*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1718*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
1719*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
1720*495ae853SAndroid Build Coastguard Worker     ps_nal_parse_ctxt->pv_nal_unit = pv_buf;
1721*495ae853SAndroid Build Coastguard Worker 
1722*495ae853SAndroid Build Coastguard Worker     size = MAX_VCL_NAL_BUFF_SIZE * sizeof(UWORD8);
1723*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1724*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
1725*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
1726*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->pv_vcl_nal_buff = pv_buf;
1727*495ae853SAndroid Build Coastguard Worker 
1728*495ae853SAndroid Build Coastguard Worker     size = MAX_NON_VCL_NAL_BUFF_SIZE * sizeof(UWORD8);
1729*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1730*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
1731*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
1732*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->pv_non_vcl_nal_buff = pv_buf;
1733*495ae853SAndroid Build Coastguard Worker 
1734*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1735*495ae853SAndroid Build Coastguard Worker     /* Registering the seq and pic prms buffer pointers                      */
1736*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
1737*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_svcd_ctxt->ps_sps || NULL == ps_svcd_ctxt->ps_pps)
1738*495ae853SAndroid Build Coastguard Worker     {
1739*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
1740*495ae853SAndroid Build Coastguard Worker     }
1741*495ae853SAndroid Build Coastguard Worker 
1742*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->pv_nal_parse_ctxt = ps_nal_parse_ctxt;
1743*495ae853SAndroid Build Coastguard Worker     ps_nal_parse_ctxt->pv_seq_prms = ps_svcd_ctxt->ps_sps;
1744*495ae853SAndroid Build Coastguard Worker     ps_nal_parse_ctxt->pv_pic_prms = ps_svcd_ctxt->ps_pps;
1745*495ae853SAndroid Build Coastguard Worker 
1746*495ae853SAndroid Build Coastguard Worker     /* register VCL and NON VCL buffer pointers */
1747*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_svcd_ctxt->pv_vcl_nal_buff || NULL == ps_svcd_ctxt->pv_non_vcl_nal_buff)
1748*495ae853SAndroid Build Coastguard Worker     {
1749*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
1750*495ae853SAndroid Build Coastguard Worker     }
1751*495ae853SAndroid Build Coastguard Worker 
1752*495ae853SAndroid Build Coastguard Worker     ps_nal_parse_ctxt->pv_vcl_nal_buf = (UWORD8 *) ps_svcd_ctxt->pv_vcl_nal_buff;
1753*495ae853SAndroid Build Coastguard Worker     ps_nal_parse_ctxt->pv_non_vcl_nal_buf = (UWORD8 *) ps_svcd_ctxt->pv_non_vcl_nal_buff;
1754*495ae853SAndroid Build Coastguard Worker     isvcd_nal_parse_reset_ctxt(ANNEX_B, PARTIAL_INPUT_MODE, ps_nal_parse_ctxt);
1755*495ae853SAndroid Build Coastguard Worker 
1756*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
1757*495ae853SAndroid Build Coastguard Worker }
1758*495ae853SAndroid Build Coastguard Worker 
1759*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1760*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1761*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_intra_resample_ctxt_create                         */
1762*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1763*495ae853SAndroid Build Coastguard Worker /*  Description   :this function is used to create intra_resamp context      */
1764*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1765*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1766*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
1767*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1768*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1769*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1770*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1771*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1772*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1773*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1774*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1775*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1776*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   Kishore               creation                       */
1777*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1778*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_intra_resample_ctxt_create(svc_dec_ctxt_t * ps_svcd_ctxt,void * pv_api_ip,void * pv_api_op)1779*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_intra_resample_ctxt_create(svc_dec_ctxt_t *ps_svcd_ctxt, void *pv_api_ip,
1780*495ae853SAndroid Build Coastguard Worker                                         void *pv_api_op)
1781*495ae853SAndroid Build Coastguard Worker {
1782*495ae853SAndroid Build Coastguard Worker     isvcd_create_ip_t *ps_create_ip;
1783*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
1784*495ae853SAndroid Build Coastguard Worker     void *pv_buf;
1785*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
1786*495ae853SAndroid Build Coastguard Worker     void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
1787*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
1788*495ae853SAndroid Build Coastguard Worker     WORD32 size;
1789*495ae853SAndroid Build Coastguard Worker     intra_inter_pred_ctxt_t *ps_ii_pred_ctxt;
1790*495ae853SAndroid Build Coastguard Worker 
1791*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
1792*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_api_op);
1793*495ae853SAndroid Build Coastguard Worker     ps_create_ip = (isvcd_create_ip_t *) pv_api_ip;
1794*495ae853SAndroid Build Coastguard Worker 
1795*495ae853SAndroid Build Coastguard Worker     pf_aligned_alloc = ps_create_ip->s_ivd_create_ip_t.pf_aligned_alloc;
1796*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
1797*495ae853SAndroid Build Coastguard Worker 
1798*495ae853SAndroid Build Coastguard Worker     {
1799*495ae853SAndroid Build Coastguard Worker         intra_samp_lyr_ctxt *ps_lyr_ctxt;
1800*495ae853SAndroid Build Coastguard Worker 
1801*495ae853SAndroid Build Coastguard Worker         /* allocate context structure */
1802*495ae853SAndroid Build Coastguard Worker         size = ((sizeof(intra_sampling_ctxt_t) + 127) >> 7) << 7;
1803*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1804*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
1805*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
1806*495ae853SAndroid Build Coastguard Worker         ps_ctxt = pv_buf;
1807*495ae853SAndroid Build Coastguard Worker 
1808*495ae853SAndroid Build Coastguard Worker         /* luma reference array buffer  */
1809*495ae853SAndroid Build Coastguard Worker         size = REF_ARRAY_WIDTH * REF_ARRAY_HEIGHT * sizeof(UWORD8);
1810*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1811*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
1812*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
1813*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pu1_refarray_buffer = pv_buf;
1814*495ae853SAndroid Build Coastguard Worker 
1815*495ae853SAndroid Build Coastguard Worker         /* cb reference array buffer */
1816*495ae853SAndroid Build Coastguard Worker         size = REF_ARRAY_WIDTH * REF_ARRAY_HEIGHT * sizeof(UWORD8);
1817*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1818*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
1819*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
1820*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pu1_refarray_cb = pv_buf;
1821*495ae853SAndroid Build Coastguard Worker 
1822*495ae853SAndroid Build Coastguard Worker         /* cr reference array buffer */
1823*495ae853SAndroid Build Coastguard Worker         size = ((DYADIC_REF_W_C + 2) * (DYADIC_REF_H_C + 2) * sizeof(UWORD8));
1824*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1825*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
1826*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
1827*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pu1_refarray_cr = pv_buf;
1828*495ae853SAndroid Build Coastguard Worker 
1829*495ae853SAndroid Build Coastguard Worker         /* Temp Intermediate Buffer */
1830*495ae853SAndroid Build Coastguard Worker         size = INTERMEDIATE_BUFF_WIDTH * INTERMEDIATE_BUFF_HEIGHT * sizeof(WORD32);
1831*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1832*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
1833*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
1834*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pi4_temp_interpolation_buffer = pv_buf;
1835*495ae853SAndroid Build Coastguard Worker 
1836*495ae853SAndroid Build Coastguard Worker         /****************** projected locations buffers ******************/
1837*495ae853SAndroid Build Coastguard Worker         {
1838*495ae853SAndroid Build Coastguard Worker             intra_samp_map_ctxt_t *ps_luma_map;
1839*495ae853SAndroid Build Coastguard Worker             intra_samp_map_ctxt_t *ps_chroma_map;
1840*495ae853SAndroid Build Coastguard Worker             WORD32 i4_lyr_id;
1841*495ae853SAndroid Build Coastguard Worker             ref_mb_map_t *ps_off_len_map;
1842*495ae853SAndroid Build Coastguard Worker             ref_pixel_map_t *ps_pos_phase_map;
1843*495ae853SAndroid Build Coastguard Worker             ref_min_max_map_t *ps_min_max;
1844*495ae853SAndroid Build Coastguard Worker             WORD16 *pi2_mem;
1845*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_mem;
1846*495ae853SAndroid Build Coastguard Worker             seg_lookup_desc_t *ps_seg_lookup;
1847*495ae853SAndroid Build Coastguard Worker 
1848*495ae853SAndroid Build Coastguard Worker             /****************** Horz offset length ******************/
1849*495ae853SAndroid Build Coastguard Worker 
1850*495ae853SAndroid Build Coastguard Worker             size = (H264_MAX_FRAME_WIDTH >> 4) * MAX_NUM_RES_LYRS * 2 * sizeof(ref_mb_map_t);
1851*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1852*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
1853*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
1854*495ae853SAndroid Build Coastguard Worker             ps_off_len_map = pv_buf;
1855*495ae853SAndroid Build Coastguard Worker 
1856*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
1857*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
1858*495ae853SAndroid Build Coastguard Worker             {
1859*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
1860*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
1861*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1862*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1863*495ae853SAndroid Build Coastguard Worker 
1864*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
1865*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->ps_x_offset_length = ps_off_len_map;
1866*495ae853SAndroid Build Coastguard Worker                 ps_off_len_map += (H264_MAX_FRAME_WIDTH >> 4);
1867*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->ps_x_offset_length = ps_off_len_map;
1868*495ae853SAndroid Build Coastguard Worker                 ps_off_len_map += (H264_MAX_FRAME_WIDTH >> 4);
1869*495ae853SAndroid Build Coastguard Worker 
1870*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
1871*495ae853SAndroid Build Coastguard Worker 
1872*495ae853SAndroid Build Coastguard Worker             /****************** Vert offset length ******************/
1873*495ae853SAndroid Build Coastguard Worker             size = (H264_MAX_FRAME_HEIGHT >> 4) * MAX_NUM_RES_LYRS * 2 * sizeof(ref_mb_map_t);
1874*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1875*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
1876*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
1877*495ae853SAndroid Build Coastguard Worker             ps_off_len_map = pv_buf;
1878*495ae853SAndroid Build Coastguard Worker 
1879*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
1880*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
1881*495ae853SAndroid Build Coastguard Worker             {
1882*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
1883*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
1884*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1885*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1886*495ae853SAndroid Build Coastguard Worker 
1887*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
1888*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->ps_y_offset_length = ps_off_len_map;
1889*495ae853SAndroid Build Coastguard Worker                 ps_off_len_map += (H264_MAX_FRAME_HEIGHT >> 4);
1890*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->ps_y_offset_length = ps_off_len_map;
1891*495ae853SAndroid Build Coastguard Worker                 ps_off_len_map += (H264_MAX_FRAME_HEIGHT >> 4);
1892*495ae853SAndroid Build Coastguard Worker 
1893*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
1894*495ae853SAndroid Build Coastguard Worker 
1895*495ae853SAndroid Build Coastguard Worker             /****************** Horz Min Max Pos ******************/
1896*495ae853SAndroid Build Coastguard Worker 
1897*495ae853SAndroid Build Coastguard Worker             size = (H264_MAX_FRAME_WIDTH >> 4) * MAX_NUM_RES_LYRS * 2 * sizeof(ref_mb_map_t);
1898*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1899*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
1900*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
1901*495ae853SAndroid Build Coastguard Worker             ps_min_max = pv_buf;
1902*495ae853SAndroid Build Coastguard Worker 
1903*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
1904*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
1905*495ae853SAndroid Build Coastguard Worker             {
1906*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
1907*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
1908*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1909*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1910*495ae853SAndroid Build Coastguard Worker 
1911*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
1912*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->ps_x_min_max = ps_min_max;
1913*495ae853SAndroid Build Coastguard Worker                 ps_min_max += (H264_MAX_FRAME_WIDTH >> 4);
1914*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->ps_x_min_max = ps_min_max;
1915*495ae853SAndroid Build Coastguard Worker                 ps_min_max += (H264_MAX_FRAME_WIDTH >> 4);
1916*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
1917*495ae853SAndroid Build Coastguard Worker 
1918*495ae853SAndroid Build Coastguard Worker             /****************** Vert Min Max Pos ******************/
1919*495ae853SAndroid Build Coastguard Worker             size = (H264_MAX_FRAME_HEIGHT >> 4) * MAX_NUM_RES_LYRS * 2 * sizeof(ref_mb_map_t);
1920*495ae853SAndroid Build Coastguard Worker 
1921*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1922*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
1923*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
1924*495ae853SAndroid Build Coastguard Worker             ps_min_max = pv_buf;
1925*495ae853SAndroid Build Coastguard Worker 
1926*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
1927*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
1928*495ae853SAndroid Build Coastguard Worker             {
1929*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
1930*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
1931*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1932*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1933*495ae853SAndroid Build Coastguard Worker 
1934*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
1935*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->ps_y_min_max = ps_min_max;
1936*495ae853SAndroid Build Coastguard Worker                 ps_min_max += (H264_MAX_FRAME_HEIGHT >> 4);
1937*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->ps_y_min_max = ps_min_max;
1938*495ae853SAndroid Build Coastguard Worker                 ps_min_max += (H264_MAX_FRAME_HEIGHT >> 4);
1939*495ae853SAndroid Build Coastguard Worker 
1940*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
1941*495ae853SAndroid Build Coastguard Worker 
1942*495ae853SAndroid Build Coastguard Worker             /****************** Horz position phase ******************/
1943*495ae853SAndroid Build Coastguard Worker             size = (H264_MAX_FRAME_WIDTH) *MAX_NUM_RES_LYRS * 2 * sizeof(ref_pixel_map_t);
1944*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1945*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
1946*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
1947*495ae853SAndroid Build Coastguard Worker             ps_pos_phase_map = pv_buf;
1948*495ae853SAndroid Build Coastguard Worker 
1949*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
1950*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
1951*495ae853SAndroid Build Coastguard Worker             {
1952*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
1953*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
1954*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1955*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1956*495ae853SAndroid Build Coastguard Worker 
1957*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
1958*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->ps_x_pos_phase = ps_pos_phase_map;
1959*495ae853SAndroid Build Coastguard Worker                 ps_pos_phase_map += (H264_MAX_FRAME_WIDTH);
1960*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->ps_x_pos_phase = ps_pos_phase_map;
1961*495ae853SAndroid Build Coastguard Worker                 ps_pos_phase_map += (H264_MAX_FRAME_WIDTH);
1962*495ae853SAndroid Build Coastguard Worker 
1963*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
1964*495ae853SAndroid Build Coastguard Worker 
1965*495ae853SAndroid Build Coastguard Worker             /****************** Vert position phase ******************/
1966*495ae853SAndroid Build Coastguard Worker 
1967*495ae853SAndroid Build Coastguard Worker             size = (H264_MAX_FRAME_HEIGHT) *MAX_NUM_RES_LYRS * 2 * sizeof(ref_pixel_map_t);
1968*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1969*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
1970*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
1971*495ae853SAndroid Build Coastguard Worker             ps_pos_phase_map = pv_buf;
1972*495ae853SAndroid Build Coastguard Worker 
1973*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
1974*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
1975*495ae853SAndroid Build Coastguard Worker             {
1976*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
1977*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
1978*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1979*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1980*495ae853SAndroid Build Coastguard Worker 
1981*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
1982*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->ps_y_pos_phase = ps_pos_phase_map;
1983*495ae853SAndroid Build Coastguard Worker                 ps_pos_phase_map += (H264_MAX_FRAME_HEIGHT);
1984*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->ps_y_pos_phase = ps_pos_phase_map;
1985*495ae853SAndroid Build Coastguard Worker                 ps_pos_phase_map += (H264_MAX_FRAME_HEIGHT);
1986*495ae853SAndroid Build Coastguard Worker 
1987*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
1988*495ae853SAndroid Build Coastguard Worker 
1989*495ae853SAndroid Build Coastguard Worker             /**************** XD Index ******************************/
1990*495ae853SAndroid Build Coastguard Worker             size = (MB_WIDTH) *MAX_NUM_RES_LYRS * 2 * sizeof(WORD16);
1991*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
1992*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
1993*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
1994*495ae853SAndroid Build Coastguard Worker             pi2_mem = pv_buf;
1995*495ae853SAndroid Build Coastguard Worker 
1996*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
1997*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
1998*495ae853SAndroid Build Coastguard Worker             {
1999*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
2000*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2001*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2002*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2003*495ae853SAndroid Build Coastguard Worker 
2004*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
2005*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->pi2_xd_index = pi2_mem;
2006*495ae853SAndroid Build Coastguard Worker                 pi2_mem += MB_WIDTH;
2007*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->pi2_xd_index = pi2_mem;
2008*495ae853SAndroid Build Coastguard Worker                 pi2_mem += MB_WIDTH;
2009*495ae853SAndroid Build Coastguard Worker 
2010*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
2011*495ae853SAndroid Build Coastguard Worker 
2012*495ae853SAndroid Build Coastguard Worker             /**************** YD Index ******************************/
2013*495ae853SAndroid Build Coastguard Worker             size = (MB_HEIGHT) *MAX_NUM_RES_LYRS * 2 * sizeof(WORD16);
2014*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2015*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
2016*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
2017*495ae853SAndroid Build Coastguard Worker             pi2_mem = pv_buf;
2018*495ae853SAndroid Build Coastguard Worker 
2019*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
2020*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2021*495ae853SAndroid Build Coastguard Worker             {
2022*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
2023*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2024*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2025*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2026*495ae853SAndroid Build Coastguard Worker 
2027*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
2028*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->pi2_yd_index = pi2_mem;
2029*495ae853SAndroid Build Coastguard Worker                 pi2_mem += MB_HEIGHT;
2030*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->pi2_yd_index = pi2_mem;
2031*495ae853SAndroid Build Coastguard Worker                 pi2_mem += MB_HEIGHT;
2032*495ae853SAndroid Build Coastguard Worker 
2033*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
2034*495ae853SAndroid Build Coastguard Worker 
2035*495ae853SAndroid Build Coastguard Worker             /**************** YA Index ******************************/
2036*495ae853SAndroid Build Coastguard Worker             size = MB_HEIGHT * MAX_NUM_RES_LYRS * 2 * sizeof(WORD16);
2037*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2038*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
2039*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
2040*495ae853SAndroid Build Coastguard Worker             pi2_mem = pv_buf;
2041*495ae853SAndroid Build Coastguard Worker 
2042*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
2043*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2044*495ae853SAndroid Build Coastguard Worker             {
2045*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
2046*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2047*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2048*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2049*495ae853SAndroid Build Coastguard Worker 
2050*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
2051*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->pi2_ya_index = pi2_mem;
2052*495ae853SAndroid Build Coastguard Worker                 pi2_mem += MB_HEIGHT;
2053*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->pi2_ya_index = pi2_mem;
2054*495ae853SAndroid Build Coastguard Worker                 pi2_mem += MB_HEIGHT;
2055*495ae853SAndroid Build Coastguard Worker 
2056*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
2057*495ae853SAndroid Build Coastguard Worker 
2058*495ae853SAndroid Build Coastguard Worker             /**************** Horizontal segment lookup **************************/
2059*495ae853SAndroid Build Coastguard Worker             /* (MB_WIDTH x seg_lookup_desc_t) x (num layers - 1)   (for luma   )*/
2060*495ae853SAndroid Build Coastguard Worker             /* (BLOCK_WIDTH x seg_lookup_desc_t) x (num layers - 1) (for chroma )*/
2061*495ae853SAndroid Build Coastguard Worker             size = (MB_WIDTH * sizeof(seg_lookup_desc_t)) * MAX_NUM_RES_LYRS;
2062*495ae853SAndroid Build Coastguard Worker 
2063*495ae853SAndroid Build Coastguard Worker             size += (BLOCK_WIDTH * sizeof(seg_lookup_desc_t)) * MAX_NUM_RES_LYRS;
2064*495ae853SAndroid Build Coastguard Worker 
2065*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2066*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
2067*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
2068*495ae853SAndroid Build Coastguard Worker             ps_seg_lookup = pv_buf;
2069*495ae853SAndroid Build Coastguard Worker 
2070*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
2071*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2072*495ae853SAndroid Build Coastguard Worker             {
2073*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
2074*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2075*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2076*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2077*495ae853SAndroid Build Coastguard Worker 
2078*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
2079*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->ps_seg_lookup_horz = ps_seg_lookup;
2080*495ae853SAndroid Build Coastguard Worker                 ps_seg_lookup += MB_WIDTH;
2081*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->ps_seg_lookup_horz = ps_seg_lookup;
2082*495ae853SAndroid Build Coastguard Worker                 ps_seg_lookup += BLOCK_WIDTH;
2083*495ae853SAndroid Build Coastguard Worker 
2084*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
2085*495ae853SAndroid Build Coastguard Worker 
2086*495ae853SAndroid Build Coastguard Worker             /**************** Vertical segment lookup ****************************/
2087*495ae853SAndroid Build Coastguard Worker             /* (MB_HEIGHT x seg_lookup_desc_t) x (num layers - 1)    (for luma  )*/
2088*495ae853SAndroid Build Coastguard Worker             /* (BLOCK_HEIGHT x seg_lookup_desc_t) x (num layers - 1) (for chroma)*/
2089*495ae853SAndroid Build Coastguard Worker             size = (MB_HEIGHT * sizeof(seg_lookup_desc_t)) * MAX_NUM_RES_LYRS;
2090*495ae853SAndroid Build Coastguard Worker 
2091*495ae853SAndroid Build Coastguard Worker             size += (BLOCK_HEIGHT * sizeof(seg_lookup_desc_t)) * MAX_NUM_RES_LYRS;
2092*495ae853SAndroid Build Coastguard Worker 
2093*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2094*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
2095*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
2096*495ae853SAndroid Build Coastguard Worker             ps_seg_lookup = pv_buf;
2097*495ae853SAndroid Build Coastguard Worker 
2098*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
2099*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2100*495ae853SAndroid Build Coastguard Worker             {
2101*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
2102*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2103*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2104*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2105*495ae853SAndroid Build Coastguard Worker 
2106*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
2107*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->ps_seg_lookup_vert = ps_seg_lookup;
2108*495ae853SAndroid Build Coastguard Worker                 ps_seg_lookup += MB_HEIGHT;
2109*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->ps_seg_lookup_vert = ps_seg_lookup;
2110*495ae853SAndroid Build Coastguard Worker                 ps_seg_lookup += BLOCK_HEIGHT;
2111*495ae853SAndroid Build Coastguard Worker 
2112*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
2113*495ae853SAndroid Build Coastguard Worker 
2114*495ae853SAndroid Build Coastguard Worker             /**************** X and Y Reference Array Index lookup ***************/
2115*495ae853SAndroid Build Coastguard Worker             /* (MAX_REF_IDX_ARRAY) x (num layers - 1)     (for luma  x-index)     */
2116*495ae853SAndroid Build Coastguard Worker             /* (MAX_REF_IDX_ARRAY) x (num layers - 1)     (for luma  y-index)     */
2117*495ae853SAndroid Build Coastguard Worker             /* (MAX_REF_IDX_ARRAY) x (num layers - 1)     (for chroma x-index)    */
2118*495ae853SAndroid Build Coastguard Worker             /* (MAX_REF_IDX_ARRAY) x (num layers - 1)     (for chroma y-index)    */
2119*495ae853SAndroid Build Coastguard Worker             /*********************************************************************/
2120*495ae853SAndroid Build Coastguard Worker             size = (MAX_REF_IDX_ARRAY * MAX_NUM_RES_LYRS * 4);
2121*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2122*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
2123*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
2124*495ae853SAndroid Build Coastguard Worker             pu1_mem = pv_buf;
2125*495ae853SAndroid Build Coastguard Worker 
2126*495ae853SAndroid Build Coastguard Worker             /* loop over num layers -1 */
2127*495ae853SAndroid Build Coastguard Worker             for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2128*495ae853SAndroid Build Coastguard Worker             {
2129*495ae853SAndroid Build Coastguard Worker                 /* derive the layer map ctxt */
2130*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2131*495ae853SAndroid Build Coastguard Worker                 ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2132*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2133*495ae853SAndroid Build Coastguard Worker 
2134*495ae853SAndroid Build Coastguard Worker                 /* initialise the pointers */
2135*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->pu1_refarray_x_idx = pu1_mem;
2136*495ae853SAndroid Build Coastguard Worker                 pu1_mem += MAX_REF_IDX_ARRAY;
2137*495ae853SAndroid Build Coastguard Worker 
2138*495ae853SAndroid Build Coastguard Worker                 ps_luma_map->pu1_refarray_y_idx = pu1_mem;
2139*495ae853SAndroid Build Coastguard Worker                 pu1_mem += MAX_REF_IDX_ARRAY;
2140*495ae853SAndroid Build Coastguard Worker 
2141*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->pu1_refarray_x_idx = pu1_mem;
2142*495ae853SAndroid Build Coastguard Worker                 pu1_mem += MAX_REF_IDX_ARRAY;
2143*495ae853SAndroid Build Coastguard Worker 
2144*495ae853SAndroid Build Coastguard Worker                 ps_chroma_map->pu1_refarray_y_idx = pu1_mem;
2145*495ae853SAndroid Build Coastguard Worker                 pu1_mem += MAX_REF_IDX_ARRAY;
2146*495ae853SAndroid Build Coastguard Worker 
2147*495ae853SAndroid Build Coastguard Worker             } /* end of loop over resolution layers */
2148*495ae853SAndroid Build Coastguard Worker         }
2149*495ae853SAndroid Build Coastguard Worker 
2150*495ae853SAndroid Build Coastguard Worker         size = ((sizeof(intra_inter_pred_ctxt_t) + 127) >> 7) << 7;
2151*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2152*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2153*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2154*495ae853SAndroid Build Coastguard Worker         ps_ii_pred_ctxt = pv_buf;
2155*495ae853SAndroid Build Coastguard Worker     }
2156*495ae853SAndroid Build Coastguard Worker 
2157*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->pv_intra_sample_ctxt = ps_ctxt;
2158*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->pv_ii_pred_ctxt = ps_ii_pred_ctxt;
2159*495ae853SAndroid Build Coastguard Worker 
2160*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
2161*495ae853SAndroid Build Coastguard Worker     {
2162*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
2163*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->pv_intra_sample_ctxt = ps_svcd_ctxt->pv_intra_sample_ctxt;
2164*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->pv_ii_pred_ctxt = ps_svcd_ctxt->pv_ii_pred_ctxt;
2165*495ae853SAndroid Build Coastguard Worker     }
2166*495ae853SAndroid Build Coastguard Worker 
2167*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
2168*495ae853SAndroid Build Coastguard Worker }
2169*495ae853SAndroid Build Coastguard Worker 
2170*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2171*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2172*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_resample_ctxt_create                      */
2173*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2174*495ae853SAndroid Build Coastguard Worker /*  Description   :this function is used to create resd_resamp context       */
2175*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
2176*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
2177*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
2178*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2179*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
2180*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
2181*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2182*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
2183*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2184*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2185*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2186*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2187*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   ittiam                creation                       */
2188*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2189*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_resample_ctxt_create(svc_dec_ctxt_t * ps_svcd_ctxt,void * pv_api_ip,void * pv_api_op)2190*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_residual_resample_ctxt_create(svc_dec_ctxt_t *ps_svcd_ctxt, void *pv_api_ip,
2191*495ae853SAndroid Build Coastguard Worker                                            void *pv_api_op)
2192*495ae853SAndroid Build Coastguard Worker {
2193*495ae853SAndroid Build Coastguard Worker     isvcd_create_ip_t *ps_create_ip;
2194*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
2195*495ae853SAndroid Build Coastguard Worker     void *pv_buf;
2196*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
2197*495ae853SAndroid Build Coastguard Worker     void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
2198*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
2199*495ae853SAndroid Build Coastguard Worker     WORD32 size;
2200*495ae853SAndroid Build Coastguard Worker 
2201*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
2202*495ae853SAndroid Build Coastguard Worker     res_lyr_ctxt *ps_lyr_ctxt;
2203*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_api_op);
2204*495ae853SAndroid Build Coastguard Worker     ps_create_ip = (isvcd_create_ip_t *) pv_api_ip;
2205*495ae853SAndroid Build Coastguard Worker 
2206*495ae853SAndroid Build Coastguard Worker     pf_aligned_alloc = ps_create_ip->s_ivd_create_ip_t.pf_aligned_alloc;
2207*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
2208*495ae853SAndroid Build Coastguard Worker 
2209*495ae853SAndroid Build Coastguard Worker     /* allocate context structure */
2210*495ae853SAndroid Build Coastguard Worker     size = ((sizeof(residual_sampling_ctxt_t) + 127) >> 7) << 7;
2211*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2212*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2213*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2214*495ae853SAndroid Build Coastguard Worker     ps_ctxt = pv_buf;
2215*495ae853SAndroid Build Coastguard Worker 
2216*495ae853SAndroid Build Coastguard Worker     /* reference array buffer  */
2217*495ae853SAndroid Build Coastguard Worker     size = REF_ARRAY_WIDTH_RES_SAMP * REF_ARRAY_HEIGHT_RES_SAMP * sizeof(WORD16);
2218*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2219*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2220*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2221*495ae853SAndroid Build Coastguard Worker     ps_ctxt->pi2_refarray_buffer = pv_buf;
2222*495ae853SAndroid Build Coastguard Worker 
2223*495ae853SAndroid Build Coastguard Worker     /* reference array pointer increment buffer */
2224*495ae853SAndroid Build Coastguard Worker     {
2225*495ae853SAndroid Build Coastguard Worker         WORD32 i4_size;
2226*495ae853SAndroid Build Coastguard Worker 
2227*495ae853SAndroid Build Coastguard Worker         i4_size = REF_ARRAY_WIDTH_RES_SAMP * REF_ARRAY_HEIGHT_RES_SAMP * sizeof(UWORD8);
2228*495ae853SAndroid Build Coastguard Worker         size = REF_ARRAY_WIDTH_RES_SAMP * REF_ARRAY_HEIGHT_RES_SAMP * 2 * sizeof(UWORD8);
2229*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2230*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2231*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2232*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pu1_ref_x_ptr_incr = pv_buf;
2233*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pu1_ref_y_ptr_incr = ps_ctxt->pu1_ref_x_ptr_incr + i4_size;
2234*495ae853SAndroid Build Coastguard Worker     }
2235*495ae853SAndroid Build Coastguard Worker 
2236*495ae853SAndroid Build Coastguard Worker     /****************** projected locations buffers ******************/
2237*495ae853SAndroid Build Coastguard Worker     {
2238*495ae853SAndroid Build Coastguard Worker         residual_samp_map_ctxt_t *ps_luma_map;
2239*495ae853SAndroid Build Coastguard Worker         residual_samp_map_ctxt_t *ps_chroma_map;
2240*495ae853SAndroid Build Coastguard Worker         WORD32 i4_lyr_id;
2241*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_off_len_map;
2242*495ae853SAndroid Build Coastguard Worker         ref_pixel_map_t *ps_pos_phase_map;
2243*495ae853SAndroid Build Coastguard Worker 
2244*495ae853SAndroid Build Coastguard Worker         /****************** Horz offset length ******************/
2245*495ae853SAndroid Build Coastguard Worker         size = (H264_MAX_FRAME_WIDTH >> 4) * MAX_NUM_RES_LYRS * 2 * sizeof(ref_mb_map_t);
2246*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2247*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2248*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2249*495ae853SAndroid Build Coastguard Worker         ps_off_len_map = pv_buf;
2250*495ae853SAndroid Build Coastguard Worker 
2251*495ae853SAndroid Build Coastguard Worker         /* loop over num layers -1 */
2252*495ae853SAndroid Build Coastguard Worker         for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2253*495ae853SAndroid Build Coastguard Worker         {
2254*495ae853SAndroid Build Coastguard Worker             /* derive the layer map ctxt */
2255*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2256*495ae853SAndroid Build Coastguard Worker             ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2257*495ae853SAndroid Build Coastguard Worker             ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2258*495ae853SAndroid Build Coastguard Worker 
2259*495ae853SAndroid Build Coastguard Worker             /* initialise the pointers */
2260*495ae853SAndroid Build Coastguard Worker             ps_luma_map->ps_x_offset_length = ps_off_len_map;
2261*495ae853SAndroid Build Coastguard Worker             ps_off_len_map += (H264_MAX_FRAME_WIDTH >> 4);
2262*495ae853SAndroid Build Coastguard Worker             ps_chroma_map->ps_x_offset_length = ps_off_len_map;
2263*495ae853SAndroid Build Coastguard Worker             ps_off_len_map += (H264_MAX_FRAME_WIDTH >> 4);
2264*495ae853SAndroid Build Coastguard Worker 
2265*495ae853SAndroid Build Coastguard Worker         } /* end of loop over resolution layers */
2266*495ae853SAndroid Build Coastguard Worker 
2267*495ae853SAndroid Build Coastguard Worker         /****************** Vert offset length ******************/
2268*495ae853SAndroid Build Coastguard Worker         size = (H264_MAX_FRAME_HEIGHT >> 4) * MAX_NUM_RES_LYRS * 2 * sizeof(ref_mb_map_t);
2269*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2270*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2271*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2272*495ae853SAndroid Build Coastguard Worker         ps_off_len_map = pv_buf;
2273*495ae853SAndroid Build Coastguard Worker 
2274*495ae853SAndroid Build Coastguard Worker         /* loop over num layers -1 */
2275*495ae853SAndroid Build Coastguard Worker         for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2276*495ae853SAndroid Build Coastguard Worker         {
2277*495ae853SAndroid Build Coastguard Worker             /* derive the layer map ctxt */
2278*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2279*495ae853SAndroid Build Coastguard Worker             ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2280*495ae853SAndroid Build Coastguard Worker             ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2281*495ae853SAndroid Build Coastguard Worker 
2282*495ae853SAndroid Build Coastguard Worker             /* initialise the pointers */
2283*495ae853SAndroid Build Coastguard Worker             ps_luma_map->ps_y_offset_length = ps_off_len_map;
2284*495ae853SAndroid Build Coastguard Worker             ps_off_len_map += (H264_MAX_FRAME_HEIGHT >> 4);
2285*495ae853SAndroid Build Coastguard Worker             ps_chroma_map->ps_y_offset_length = ps_off_len_map;
2286*495ae853SAndroid Build Coastguard Worker             ps_off_len_map += (H264_MAX_FRAME_HEIGHT >> 4);
2287*495ae853SAndroid Build Coastguard Worker 
2288*495ae853SAndroid Build Coastguard Worker         } /* end of loop over resolution layers */
2289*495ae853SAndroid Build Coastguard Worker 
2290*495ae853SAndroid Build Coastguard Worker         /****************** Horz position phase ******************/
2291*495ae853SAndroid Build Coastguard Worker         size = H264_MAX_FRAME_WIDTH * MAX_NUM_RES_LYRS * 2 * sizeof(ref_pixel_map_t);
2292*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2293*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2294*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2295*495ae853SAndroid Build Coastguard Worker         ps_pos_phase_map = pv_buf;
2296*495ae853SAndroid Build Coastguard Worker 
2297*495ae853SAndroid Build Coastguard Worker         /* loop over num layers -1 */
2298*495ae853SAndroid Build Coastguard Worker         for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2299*495ae853SAndroid Build Coastguard Worker         {
2300*495ae853SAndroid Build Coastguard Worker             /* derive the layer map ctxt */
2301*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2302*495ae853SAndroid Build Coastguard Worker             ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2303*495ae853SAndroid Build Coastguard Worker             ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2304*495ae853SAndroid Build Coastguard Worker 
2305*495ae853SAndroid Build Coastguard Worker             /* initialise the pointers */
2306*495ae853SAndroid Build Coastguard Worker             ps_luma_map->ps_x_pos_phase = ps_pos_phase_map;
2307*495ae853SAndroid Build Coastguard Worker             ps_pos_phase_map += H264_MAX_FRAME_WIDTH;
2308*495ae853SAndroid Build Coastguard Worker             ps_chroma_map->ps_x_pos_phase = ps_pos_phase_map;
2309*495ae853SAndroid Build Coastguard Worker             ps_pos_phase_map += H264_MAX_FRAME_WIDTH;
2310*495ae853SAndroid Build Coastguard Worker 
2311*495ae853SAndroid Build Coastguard Worker         } /* end of loop over resolution layers */
2312*495ae853SAndroid Build Coastguard Worker 
2313*495ae853SAndroid Build Coastguard Worker         /****************** Vert position phase ******************/
2314*495ae853SAndroid Build Coastguard Worker 
2315*495ae853SAndroid Build Coastguard Worker         size = H264_MAX_FRAME_HEIGHT * MAX_NUM_RES_LYRS * 2 * sizeof(ref_pixel_map_t);
2316*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2317*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2318*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2319*495ae853SAndroid Build Coastguard Worker         ps_pos_phase_map = pv_buf;
2320*495ae853SAndroid Build Coastguard Worker 
2321*495ae853SAndroid Build Coastguard Worker         /* loop over num layers -1 */
2322*495ae853SAndroid Build Coastguard Worker         for(i4_lyr_id = 0; i4_lyr_id < MAX_NUM_RES_LYRS; i4_lyr_id++)
2323*495ae853SAndroid Build Coastguard Worker         {
2324*495ae853SAndroid Build Coastguard Worker             /* derive the layer map ctxt */
2325*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[i4_lyr_id];
2326*495ae853SAndroid Build Coastguard Worker             ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
2327*495ae853SAndroid Build Coastguard Worker             ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2328*495ae853SAndroid Build Coastguard Worker 
2329*495ae853SAndroid Build Coastguard Worker             /* initialise the pointers */
2330*495ae853SAndroid Build Coastguard Worker             ps_luma_map->ps_y_pos_phase = ps_pos_phase_map;
2331*495ae853SAndroid Build Coastguard Worker             ps_pos_phase_map += H264_MAX_FRAME_HEIGHT;
2332*495ae853SAndroid Build Coastguard Worker             ps_chroma_map->ps_y_pos_phase = ps_pos_phase_map;
2333*495ae853SAndroid Build Coastguard Worker             ps_pos_phase_map += H264_MAX_FRAME_HEIGHT;
2334*495ae853SAndroid Build Coastguard Worker 
2335*495ae853SAndroid Build Coastguard Worker         } /* end of loop over resolution layers */
2336*495ae853SAndroid Build Coastguard Worker     }
2337*495ae853SAndroid Build Coastguard Worker 
2338*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->pv_residual_sample_ctxt = ps_ctxt;
2339*495ae853SAndroid Build Coastguard Worker 
2340*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
2341*495ae853SAndroid Build Coastguard Worker     {
2342*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
2343*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->pv_residual_sample_ctxt = ps_svcd_ctxt->pv_residual_sample_ctxt;
2344*495ae853SAndroid Build Coastguard Worker     }
2345*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
2346*495ae853SAndroid Build Coastguard Worker }
2347*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2348*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2349*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_mode_mv_resample_ctxt_create                       */
2350*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2351*495ae853SAndroid Build Coastguard Worker /*  Description   :this function is used to create mv_resamp context         */
2352*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
2353*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
2354*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
2355*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2356*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
2357*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
2358*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2359*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
2360*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2361*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2362*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2363*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2364*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   Kishore               creation                       */
2365*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2366*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_mode_mv_resample_ctxt_create(svc_dec_ctxt_t * ps_svcd_ctxt,void * pv_api_ip,void * pv_api_op)2367*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_mode_mv_resample_ctxt_create(svc_dec_ctxt_t *ps_svcd_ctxt, void *pv_api_ip,
2368*495ae853SAndroid Build Coastguard Worker                                           void *pv_api_op)
2369*495ae853SAndroid Build Coastguard Worker {
2370*495ae853SAndroid Build Coastguard Worker     isvcd_create_ip_t *ps_create_ip;
2371*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
2372*495ae853SAndroid Build Coastguard Worker     void *pv_buf;
2373*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_mem;
2374*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
2375*495ae853SAndroid Build Coastguard Worker     void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
2376*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
2377*495ae853SAndroid Build Coastguard Worker     WORD32 size, i4_res_id;
2378*495ae853SAndroid Build Coastguard Worker     ref_lyr_scaled_offset_t *ps_ref_pic_offsets;
2379*495ae853SAndroid Build Coastguard Worker     mode_motion_ctxt_t *ps_mode_motion;
2380*495ae853SAndroid Build Coastguard Worker     mode_motion_lyr_ctxt *ps_lyr_mem;
2381*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_api_op);
2382*495ae853SAndroid Build Coastguard Worker     ps_create_ip = (isvcd_create_ip_t *) pv_api_ip;
2383*495ae853SAndroid Build Coastguard Worker 
2384*495ae853SAndroid Build Coastguard Worker     pf_aligned_alloc = ps_create_ip->s_ivd_create_ip_t.pf_aligned_alloc;
2385*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
2386*495ae853SAndroid Build Coastguard Worker 
2387*495ae853SAndroid Build Coastguard Worker     size = ((sizeof(mode_motion_ctxt_t) + 127) >> 7) << 7;
2388*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2389*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2390*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2391*495ae853SAndroid Build Coastguard Worker     ps_mode_motion = pv_buf;
2392*495ae853SAndroid Build Coastguard Worker 
2393*495ae853SAndroid Build Coastguard Worker     /* motion pred structure */
2394*495ae853SAndroid Build Coastguard Worker     size = 2 * NUM_MB_PARTS * NUM_SUB_MB_PARTS * sizeof(mv_pred_t);
2395*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2396*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2397*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2398*495ae853SAndroid Build Coastguard Worker     ps_mode_motion->ps_motion_pred_struct = (mv_pred_t *) pv_buf;
2399*495ae853SAndroid Build Coastguard Worker 
2400*495ae853SAndroid Build Coastguard Worker     /* projected locations X */
2401*495ae853SAndroid Build Coastguard Worker     size = H264_MAX_FRAME_WIDTH * MAX_NUM_RES_LYRS * sizeof(WORD16);
2402*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2403*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2404*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2405*495ae853SAndroid Build Coastguard Worker     pi2_mem = (WORD16 *) pv_buf;
2406*495ae853SAndroid Build Coastguard Worker 
2407*495ae853SAndroid Build Coastguard Worker     /* loop over NUM resolution layers */
2408*495ae853SAndroid Build Coastguard Worker     for(i4_res_id = 0; i4_res_id < MAX_NUM_RES_LYRS; i4_res_id++)
2409*495ae853SAndroid Build Coastguard Worker     {
2410*495ae853SAndroid Build Coastguard Worker         ps_lyr_mem = &ps_mode_motion->as_res_lyr_mem[i4_res_id];
2411*495ae853SAndroid Build Coastguard Worker 
2412*495ae853SAndroid Build Coastguard Worker         /* initialise the pointers */
2413*495ae853SAndroid Build Coastguard Worker         ps_lyr_mem->pi2_ref_loc_x = pi2_mem;
2414*495ae853SAndroid Build Coastguard Worker 
2415*495ae853SAndroid Build Coastguard Worker         /* increment the buffer pointer */
2416*495ae853SAndroid Build Coastguard Worker         pi2_mem += H264_MAX_FRAME_WIDTH;
2417*495ae853SAndroid Build Coastguard Worker 
2418*495ae853SAndroid Build Coastguard Worker     } /* end of loop over num resolution layers */
2419*495ae853SAndroid Build Coastguard Worker 
2420*495ae853SAndroid Build Coastguard Worker     /* projected locations Y */
2421*495ae853SAndroid Build Coastguard Worker     size = H264_MAX_FRAME_HEIGHT * MAX_NUM_RES_LYRS * sizeof(WORD16);
2422*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2423*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2424*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2425*495ae853SAndroid Build Coastguard Worker     pi2_mem = (WORD16 *) pv_buf;
2426*495ae853SAndroid Build Coastguard Worker     /* loop over NUM resolution layers */
2427*495ae853SAndroid Build Coastguard Worker     for(i4_res_id = 0; i4_res_id < MAX_NUM_RES_LYRS; i4_res_id++)
2428*495ae853SAndroid Build Coastguard Worker     {
2429*495ae853SAndroid Build Coastguard Worker         ps_lyr_mem = &ps_mode_motion->as_res_lyr_mem[i4_res_id];
2430*495ae853SAndroid Build Coastguard Worker 
2431*495ae853SAndroid Build Coastguard Worker         /* initialise the pointers */
2432*495ae853SAndroid Build Coastguard Worker         ps_lyr_mem->pi2_ref_loc_y = pi2_mem;
2433*495ae853SAndroid Build Coastguard Worker         /* increment the buffer pointer */
2434*495ae853SAndroid Build Coastguard Worker         pi2_mem += H264_MAX_FRAME_HEIGHT;
2435*495ae853SAndroid Build Coastguard Worker 
2436*495ae853SAndroid Build Coastguard Worker     } /* end of loop over num resolution layers */
2437*495ae853SAndroid Build Coastguard Worker 
2438*495ae853SAndroid Build Coastguard Worker     size = sizeof(ref_lyr_scaled_offset_t) * MAX_NUM_RES_LYRS * MAX_NUM_PIC_BUFS;
2439*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2440*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2441*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2442*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->pv_ref_lyr_offset = pv_buf;
2443*495ae853SAndroid Build Coastguard Worker 
2444*495ae853SAndroid Build Coastguard Worker     /* loop over NUM resolution layers */
2445*495ae853SAndroid Build Coastguard Worker     ps_ref_pic_offsets = (ref_lyr_scaled_offset_t *) ps_svcd_ctxt->pv_ref_lyr_offset;
2446*495ae853SAndroid Build Coastguard Worker 
2447*495ae853SAndroid Build Coastguard Worker     for(i4_res_id = 0; i4_res_id < MAX_NUM_RES_LYRS; i4_res_id++)
2448*495ae853SAndroid Build Coastguard Worker     {
2449*495ae853SAndroid Build Coastguard Worker         ps_lyr_mem = &ps_mode_motion->as_res_lyr_mem[i4_res_id];
2450*495ae853SAndroid Build Coastguard Worker 
2451*495ae853SAndroid Build Coastguard Worker         /* store the current resolution layer pic offset start pointer */
2452*495ae853SAndroid Build Coastguard Worker         ps_lyr_mem->ps_ref_pic_lyr_offsets = ps_ref_pic_offsets + (i4_res_id * MAX_NUM_PIC_BUFS);
2453*495ae853SAndroid Build Coastguard Worker 
2454*495ae853SAndroid Build Coastguard Worker     } /* end of loop over num resolution layers */
2455*495ae853SAndroid Build Coastguard Worker 
2456*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->pv_mode_mv_sample_ctxt = ps_mode_motion;
2457*495ae853SAndroid Build Coastguard Worker 
2458*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
2459*495ae853SAndroid Build Coastguard Worker     {
2460*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
2461*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->pv_mode_mv_sample_ctxt = ps_svcd_ctxt->pv_mode_mv_sample_ctxt;
2462*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->pv_ref_lyr_offset = ps_svcd_ctxt->pv_ref_lyr_offset;
2463*495ae853SAndroid Build Coastguard Worker     }
2464*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
2465*495ae853SAndroid Build Coastguard Worker }
2466*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2467*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2468*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_allocate_static_bufs                               */
2469*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2470*495ae853SAndroid Build Coastguard Worker /*  Description   : allocates static buffers                                 */
2471*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2472*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
2473*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
2474*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
2475*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
2476*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
2477*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2478*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
2479*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2480*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2481*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2482*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2483*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
2484*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2485*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_allocate_static_bufs(iv_obj_t ** dec_hdl,void * pv_api_ip,void * pv_api_op)2486*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_allocate_static_bufs(iv_obj_t **dec_hdl, void *pv_api_ip, void *pv_api_op)
2487*495ae853SAndroid Build Coastguard Worker {
2488*495ae853SAndroid Build Coastguard Worker     isvcd_create_ip_t *ps_create_ip;
2489*495ae853SAndroid Build Coastguard Worker     isvcd_create_op_t *ps_create_op;
2490*495ae853SAndroid Build Coastguard Worker     void *pv_buf;
2491*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf;
2492*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
2493*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
2494*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
2495*495ae853SAndroid Build Coastguard Worker     void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
2496*495ae853SAndroid Build Coastguard Worker     void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
2497*495ae853SAndroid Build Coastguard Worker     void *pv_mem_ctxt;
2498*495ae853SAndroid Build Coastguard Worker     WORD32 size;
2499*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id, u1_sps_ctr;
2500*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_chroma_format;
2501*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
2502*495ae853SAndroid Build Coastguard Worker 
2503*495ae853SAndroid Build Coastguard Worker     ps_create_ip = (isvcd_create_ip_t *) pv_api_ip;
2504*495ae853SAndroid Build Coastguard Worker     ps_create_op = (isvcd_create_op_t *) pv_api_op;
2505*495ae853SAndroid Build Coastguard Worker 
2506*495ae853SAndroid Build Coastguard Worker     ps_create_op->s_ivd_create_op_t.u4_error_code = 0;
2507*495ae853SAndroid Build Coastguard Worker     pf_aligned_alloc = ps_create_ip->s_ivd_create_ip_t.pf_aligned_alloc;
2508*495ae853SAndroid Build Coastguard Worker     pf_aligned_free = ps_create_ip->s_ivd_create_ip_t.pf_aligned_free;
2509*495ae853SAndroid Build Coastguard Worker     pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
2510*495ae853SAndroid Build Coastguard Worker     u1_chroma_format = (UWORD8) (ps_create_ip->s_ivd_create_ip_t.e_output_format);
2511*495ae853SAndroid Build Coastguard Worker 
2512*495ae853SAndroid Build Coastguard Worker     if((u1_chroma_format != IV_YUV_420P) && (u1_chroma_format != IV_YUV_420SP_UV) &&
2513*495ae853SAndroid Build Coastguard Worker        (u1_chroma_format != IV_YUV_420SP_VU))
2514*495ae853SAndroid Build Coastguard Worker     {
2515*495ae853SAndroid Build Coastguard Worker         ps_create_op->s_ivd_create_op_t.pv_handle = NULL;
2516*495ae853SAndroid Build Coastguard Worker 
2517*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
2518*495ae853SAndroid Build Coastguard Worker     }
2519*495ae853SAndroid Build Coastguard Worker 
2520*495ae853SAndroid Build Coastguard Worker     /* Initialize return handle to NULL */
2521*495ae853SAndroid Build Coastguard Worker     ps_create_op->s_ivd_create_op_t.pv_handle = NULL;
2522*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(iv_obj_t));
2523*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2524*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, sizeof(iv_obj_t));
2525*495ae853SAndroid Build Coastguard Worker     *dec_hdl = (iv_obj_t *) pv_buf;
2526*495ae853SAndroid Build Coastguard Worker     ps_create_op->s_ivd_create_op_t.pv_handle = *dec_hdl;
2527*495ae853SAndroid Build Coastguard Worker 
2528*495ae853SAndroid Build Coastguard Worker     (*dec_hdl)->pv_codec_handle = NULL;
2529*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(svc_dec_ctxt_t));
2530*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2531*495ae853SAndroid Build Coastguard Worker     (*dec_hdl)->pv_codec_handle = (svc_dec_ctxt_t *) pv_buf;
2532*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) pv_buf;
2533*495ae853SAndroid Build Coastguard Worker 
2534*495ae853SAndroid Build Coastguard Worker     memset(ps_svcd_ctxt, 0, sizeof(svc_dec_ctxt_t));
2535*495ae853SAndroid Build Coastguard Worker 
2536*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_prev_num_res_layers = UINT8_MAX;
2537*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_pre_parse_in_flush = 1;
2538*495ae853SAndroid Build Coastguard Worker     /* set default to maximum values supported */
2539*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_tgt_dep_id = MAX_DEPENDENCY_ID;
2540*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_tgt_quality_id = MAX_QUALITY_ID;
2541*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_tgt_temp_id = MAX_TEMPORAL_ID;
2542*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_tgt_priority_id = MAX_PRIORITY_ID;
2543*495ae853SAndroid Build Coastguard Worker 
2544*495ae853SAndroid Build Coastguard Worker     /* two sets of MAX_NUM_SEQ_PARAMS are created one for sps-base layer;  one for
2545*495ae853SAndroid Build Coastguard Worker      * subset_sps- enhancement*/
2546*495ae853SAndroid Build Coastguard Worker     size = ((sizeof(dec_seq_params_t)) * MAX_NUM_SEQ_PARAMS * 2);
2547*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2548*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2549*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2550*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->ps_sps = pv_buf;
2551*495ae853SAndroid Build Coastguard Worker 
2552*495ae853SAndroid Build Coastguard Worker     /* two sets of MAX_NUM_SEQ_PARAMS are created one for sps-base layer;  one for
2553*495ae853SAndroid Build Coastguard Worker      * subset_sps- enhancement*/
2554*495ae853SAndroid Build Coastguard Worker     size = ((sizeof(dec_svc_seq_params_t)) * MAX_NUM_SEQ_PARAMS * 2);
2555*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2556*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2557*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2558*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->ps_subset_sps = pv_buf;
2559*495ae853SAndroid Build Coastguard Worker 
2560*495ae853SAndroid Build Coastguard Worker     for(u1_sps_ctr = 0; u1_sps_ctr < (2 * MAX_NUM_SEQ_PARAMS); u1_sps_ctr++)
2561*495ae853SAndroid Build Coastguard Worker     {
2562*495ae853SAndroid Build Coastguard Worker         ps_svcd_ctxt->ps_subset_sps[u1_sps_ctr].ps_seq = &ps_svcd_ctxt->ps_sps[u1_sps_ctr];
2563*495ae853SAndroid Build Coastguard Worker     }
2564*495ae853SAndroid Build Coastguard Worker 
2565*495ae853SAndroid Build Coastguard Worker     size = sizeof(sei);
2566*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2567*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2568*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2569*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->ps_sei = (sei *) pv_buf;
2570*495ae853SAndroid Build Coastguard Worker 
2571*495ae853SAndroid Build Coastguard Worker     size = sizeof(sei);
2572*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2573*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2574*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2575*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->ps_sei_parse = (sei *) pv_buf;
2576*495ae853SAndroid Build Coastguard Worker 
2577*495ae853SAndroid Build Coastguard Worker     size = (sizeof(dec_pic_params_t)) * MAX_NUM_PIC_PARAMS;
2578*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2579*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2580*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2581*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->ps_pps = pv_buf;
2582*495ae853SAndroid Build Coastguard Worker 
2583*495ae853SAndroid Build Coastguard Worker     size = (sizeof(svc_dec_lyr_struct_t)) * MAX_NUM_RES_LYRS;
2584*495ae853SAndroid Build Coastguard Worker     pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2585*495ae853SAndroid Build Coastguard Worker     RETURN_IF((NULL == pv_buf), IV_FAIL);
2586*495ae853SAndroid Build Coastguard Worker     memset(pv_buf, 0, size);
2587*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->ps_svc_dec_lyr = pv_buf;
2588*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_target_layer_id = 0;
2589*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_cur_layer_id = 0;
2590*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->i4_eos_flag = 0;
2591*495ae853SAndroid Build Coastguard Worker 
2592*495ae853SAndroid Build Coastguard Worker     ret = isvcd_mode_mv_resample_ctxt_create(ps_svcd_ctxt, pv_api_ip, pv_api_op);
2593*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
2594*495ae853SAndroid Build Coastguard Worker     {
2595*495ae853SAndroid Build Coastguard Worker         return ret;
2596*495ae853SAndroid Build Coastguard Worker     }
2597*495ae853SAndroid Build Coastguard Worker     ret = isvcd_intra_resample_ctxt_create(ps_svcd_ctxt, pv_api_ip, pv_api_op);
2598*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
2599*495ae853SAndroid Build Coastguard Worker     {
2600*495ae853SAndroid Build Coastguard Worker         return ret;
2601*495ae853SAndroid Build Coastguard Worker     }
2602*495ae853SAndroid Build Coastguard Worker     ret = isvcd_residual_resample_ctxt_create(ps_svcd_ctxt, pv_api_ip, pv_api_op);
2603*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
2604*495ae853SAndroid Build Coastguard Worker     {
2605*495ae853SAndroid Build Coastguard Worker         return ret;
2606*495ae853SAndroid Build Coastguard Worker     }
2607*495ae853SAndroid Build Coastguard Worker     ret = isvcd_nal_parse_ctxt_create(ps_svcd_ctxt, pv_api_ip, pv_api_op);
2608*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
2609*495ae853SAndroid Build Coastguard Worker     {
2610*495ae853SAndroid Build Coastguard Worker         return ret;
2611*495ae853SAndroid Build Coastguard Worker     }
2612*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
2613*495ae853SAndroid Build Coastguard Worker     {
2614*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
2615*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
2616*495ae853SAndroid Build Coastguard Worker 
2617*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_svcd_ctxt = ps_svcd_ctxt;
2618*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->u1_layer_id = u1_layer_id;
2619*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->u1_dyadic_flag = 1;
2620*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->u1_restricted_res_change_flag = 1;
2621*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->u1_base_res_flag = 1;
2622*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->u1_ref_layer_id = u1_layer_id - 1;
2623*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_dec_svc_ref_layer =
2624*495ae853SAndroid Build Coastguard Worker             &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svc_lyr_dec->u1_ref_layer_id];
2625*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->u4_pps_id_for_layer = UINT32_MAX;
2626*495ae853SAndroid Build Coastguard Worker 
2627*495ae853SAndroid Build Coastguard Worker #ifndef LOGO_EN
2628*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_share_disp_buf = ps_create_ip->s_ivd_create_ip_t.u4_share_disp_buf;
2629*495ae853SAndroid Build Coastguard Worker #else
2630*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_share_disp_buf = 0;
2631*495ae853SAndroid Build Coastguard Worker #endif
2632*495ae853SAndroid Build Coastguard Worker 
2633*495ae853SAndroid Build Coastguard Worker         ps_dec->u1_chroma_format = (UWORD8) (ps_create_ip->s_ivd_create_ip_t.e_output_format);
2634*495ae853SAndroid Build Coastguard Worker 
2635*495ae853SAndroid Build Coastguard Worker         if((ps_dec->u1_chroma_format != IV_YUV_420P) &&
2636*495ae853SAndroid Build Coastguard Worker            (ps_dec->u1_chroma_format != IV_YUV_420SP_UV) &&
2637*495ae853SAndroid Build Coastguard Worker            (ps_dec->u1_chroma_format != IV_YUV_420SP_VU))
2638*495ae853SAndroid Build Coastguard Worker         {
2639*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_share_disp_buf = 0;
2640*495ae853SAndroid Build Coastguard Worker         }
2641*495ae853SAndroid Build Coastguard Worker 
2642*495ae853SAndroid Build Coastguard Worker         ps_dec->u1_enable_mb_info = ps_create_ip->u4_enable_frame_info;
2643*495ae853SAndroid Build Coastguard Worker         ps_dec->pf_aligned_alloc = pf_aligned_alloc;
2644*495ae853SAndroid Build Coastguard Worker         ps_dec->pf_aligned_free = pf_aligned_free;
2645*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_mem_ctxt = pv_mem_ctxt;
2646*495ae853SAndroid Build Coastguard Worker 
2647*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_sps = ps_svcd_ctxt->ps_sps;
2648*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_subset_sps = ps_svcd_ctxt->ps_subset_sps;
2649*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_pps = ps_svcd_ctxt->ps_pps;
2650*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_sei = ps_svcd_ctxt->ps_sei;
2651*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_sei_parse = ps_svcd_ctxt->ps_sei_parse;
2652*495ae853SAndroid Build Coastguard Worker 
2653*495ae853SAndroid Build Coastguard Worker         size = ithread_get_handle_size();
2654*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2655*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2656*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2657*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_dec_thread_handle = pv_buf;
2658*495ae853SAndroid Build Coastguard Worker 
2659*495ae853SAndroid Build Coastguard Worker         size = ithread_get_handle_size();
2660*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2661*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2662*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2663*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_bs_deblk_thread_handle = pv_buf;
2664*495ae853SAndroid Build Coastguard Worker 
2665*495ae853SAndroid Build Coastguard Worker #ifdef KEEP_THREADS_ACTIVE
2666*495ae853SAndroid Build Coastguard Worker         {
2667*495ae853SAndroid Build Coastguard Worker             UWORD32 i;
2668*495ae853SAndroid Build Coastguard Worker             /* Request memory to hold mutex (start/done) for both threads */
2669*495ae853SAndroid Build Coastguard Worker             size = ithread_get_mutex_lock_size() << 2;
2670*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 8, size);
2671*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
2672*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
2673*495ae853SAndroid Build Coastguard Worker 
2674*495ae853SAndroid Build Coastguard Worker             // init mutex variable for both the threads
2675*495ae853SAndroid Build Coastguard Worker             // 1. ih264d_decode_picture_thread
2676*495ae853SAndroid Build Coastguard Worker             // 2. ih264d_recon_deblk_thread
2677*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < 2; i++)
2678*495ae853SAndroid Build Coastguard Worker             {
2679*495ae853SAndroid Build Coastguard Worker                 WORD32 ret;
2680*495ae853SAndroid Build Coastguard Worker                 WORD32 mutex_size = ithread_get_mutex_lock_size();
2681*495ae853SAndroid Build Coastguard Worker 
2682*495ae853SAndroid Build Coastguard Worker                 ps_dec->apv_proc_start_mutex[i] = (UWORD8 *) pv_buf + (2 * i * mutex_size);
2683*495ae853SAndroid Build Coastguard Worker                 ps_dec->apv_proc_done_mutex[i] = (UWORD8 *) pv_buf + ((2 * i + 1) * mutex_size);
2684*495ae853SAndroid Build Coastguard Worker 
2685*495ae853SAndroid Build Coastguard Worker                 ret = ithread_mutex_init(ps_dec->apv_proc_start_mutex[0]);
2686*495ae853SAndroid Build Coastguard Worker                 RETURN_IF((ret != IV_SUCCESS), ret);
2687*495ae853SAndroid Build Coastguard Worker 
2688*495ae853SAndroid Build Coastguard Worker                 ret = ithread_mutex_init(ps_dec->apv_proc_done_mutex[i]);
2689*495ae853SAndroid Build Coastguard Worker                 RETURN_IF((ret != IV_SUCCESS), ret);
2690*495ae853SAndroid Build Coastguard Worker             }
2691*495ae853SAndroid Build Coastguard Worker 
2692*495ae853SAndroid Build Coastguard Worker             size = ithread_get_cond_struct_size() << 2;
2693*495ae853SAndroid Build Coastguard Worker             pv_buf = pf_aligned_alloc(pv_mem_ctxt, 8, size);
2694*495ae853SAndroid Build Coastguard Worker             RETURN_IF((NULL == pv_buf), IV_FAIL);
2695*495ae853SAndroid Build Coastguard Worker             memset(pv_buf, 0, size);
2696*495ae853SAndroid Build Coastguard Worker 
2697*495ae853SAndroid Build Coastguard Worker             // init condition variable for both the threads
2698*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < 2; i++)
2699*495ae853SAndroid Build Coastguard Worker             {
2700*495ae853SAndroid Build Coastguard Worker                 WORD32 ret;
2701*495ae853SAndroid Build Coastguard Worker                 WORD32 cond_size = ithread_get_cond_struct_size();
2702*495ae853SAndroid Build Coastguard Worker                 ps_dec->apv_proc_start_condition[i] = (UWORD8 *) pv_buf + (2 * i * cond_size);
2703*495ae853SAndroid Build Coastguard Worker                 ps_dec->apv_proc_done_condition[i] = (UWORD8 *) pv_buf + ((2 * i + 1) * cond_size);
2704*495ae853SAndroid Build Coastguard Worker 
2705*495ae853SAndroid Build Coastguard Worker                 ret = ithread_cond_init(ps_dec->apv_proc_start_condition[i]);
2706*495ae853SAndroid Build Coastguard Worker                 RETURN_IF((ret != IV_SUCCESS), ret);
2707*495ae853SAndroid Build Coastguard Worker 
2708*495ae853SAndroid Build Coastguard Worker                 ret = ithread_cond_init(ps_dec->apv_proc_done_condition[i]);
2709*495ae853SAndroid Build Coastguard Worker                 RETURN_IF((ret != IV_SUCCESS), ret);
2710*495ae853SAndroid Build Coastguard Worker             }
2711*495ae853SAndroid Build Coastguard Worker         }
2712*495ae853SAndroid Build Coastguard Worker #endif
2713*495ae853SAndroid Build Coastguard Worker         size = sizeof(dpb_manager_t);
2714*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2715*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2716*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2717*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_dpb_mgr = pv_buf;
2718*495ae853SAndroid Build Coastguard Worker 
2719*495ae853SAndroid Build Coastguard Worker         size = sizeof(pred_info_t) * 2 * 32;
2720*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2721*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2722*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2723*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_pred = pv_buf;
2724*495ae853SAndroid Build Coastguard Worker 
2725*495ae853SAndroid Build Coastguard Worker         size = sizeof(disp_mgr_t);
2726*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2727*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2728*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2729*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_disp_buf_mgr = pv_buf;
2730*495ae853SAndroid Build Coastguard Worker 
2731*495ae853SAndroid Build Coastguard Worker         size = ih264_buf_mgr_size();
2732*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2733*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2734*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2735*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_pic_buf_mgr = pv_buf;
2736*495ae853SAndroid Build Coastguard Worker 
2737*495ae853SAndroid Build Coastguard Worker         size = sizeof(struct pic_buffer_t) * (H264_MAX_REF_PICS * 2);
2738*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2739*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2740*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2741*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_pic_buf_base = pv_buf;
2742*495ae853SAndroid Build Coastguard Worker 
2743*495ae853SAndroid Build Coastguard Worker         size = sizeof(dec_err_status_t);
2744*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2745*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2746*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2747*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_dec_err_status = (dec_err_status_t *) pv_buf;
2748*495ae853SAndroid Build Coastguard Worker 
2749*495ae853SAndroid Build Coastguard Worker         size = sizeof(dpb_commands_t);
2750*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2751*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2752*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2753*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_dpb_cmds = (dpb_commands_t *) pv_buf;
2754*495ae853SAndroid Build Coastguard Worker 
2755*495ae853SAndroid Build Coastguard Worker         size = sizeof(dec_bit_stream_t);
2756*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2757*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2758*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2759*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_bitstrm = (dec_bit_stream_t *) pv_buf;
2760*495ae853SAndroid Build Coastguard Worker 
2761*495ae853SAndroid Build Coastguard Worker         size = sizeof(dec_nal_unit_svc_ext_params_t);
2762*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2763*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2764*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2765*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_nal_svc_ext = (dec_nal_unit_svc_ext_params_t *) pv_buf;
2766*495ae853SAndroid Build Coastguard Worker 
2767*495ae853SAndroid Build Coastguard Worker         size = sizeof(dec_slice_params_t);
2768*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2769*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2770*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2771*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_cur_slice = (dec_slice_params_t *) pv_buf;
2772*495ae853SAndroid Build Coastguard Worker 
2773*495ae853SAndroid Build Coastguard Worker         size = MAX(sizeof(dec_seq_params_t), sizeof(dec_pic_params_t));
2774*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2775*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2776*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2777*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_scratch_sps_pps = pv_buf;
2778*495ae853SAndroid Build Coastguard Worker 
2779*495ae853SAndroid Build Coastguard Worker         size = sizeof(dec_svc_seq_params_t);
2780*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2781*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2782*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2783*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->pv_scratch_subset_sps = pv_buf;
2784*495ae853SAndroid Build Coastguard Worker 
2785*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_static_bits_buf_size = 256000;
2786*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, ps_dec->u4_static_bits_buf_size);
2787*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2788*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, ps_dec->u4_static_bits_buf_size);
2789*495ae853SAndroid Build Coastguard Worker         ps_dec->pu1_bits_buf_static = pv_buf;
2790*495ae853SAndroid Build Coastguard Worker 
2791*495ae853SAndroid Build Coastguard Worker         size = ((TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC) * sizeof(void *));
2792*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2793*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2794*495ae853SAndroid Build Coastguard Worker         ps_dec->ppv_map_ref_idx_to_poc_base = pv_buf;
2795*495ae853SAndroid Build Coastguard Worker         memset(ps_dec->ppv_map_ref_idx_to_poc_base, 0, size);
2796*495ae853SAndroid Build Coastguard Worker 
2797*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;
2798*495ae853SAndroid Build Coastguard Worker 
2799*495ae853SAndroid Build Coastguard Worker         size = (sizeof(bin_ctxt_model_t) * NUM_CABAC_CTXTS_SVC);
2800*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2801*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2802*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2803*495ae853SAndroid Build Coastguard Worker         ps_dec->p_cabac_ctxt_table_t = pv_buf;
2804*495ae853SAndroid Build Coastguard Worker 
2805*495ae853SAndroid Build Coastguard Worker         size = sizeof(ctxt_inc_mb_info_t);
2806*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2807*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2808*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2809*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_left_mb_ctxt_info = pv_buf;
2810*495ae853SAndroid Build Coastguard Worker 
2811*495ae853SAndroid Build Coastguard Worker         size = MAX_REF_BUF_SIZE * 2;
2812*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2813*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2814*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2815*495ae853SAndroid Build Coastguard Worker         ps_dec->pu1_ref_buff_base = pv_buf;
2816*495ae853SAndroid Build Coastguard Worker         ps_dec->pu1_ref_buff = ps_dec->pu1_ref_buff_base + MAX_REF_BUF_SIZE;
2817*495ae853SAndroid Build Coastguard Worker 
2818*495ae853SAndroid Build Coastguard Worker         size = ((sizeof(WORD16)) * PRED_BUFFER_WIDTH * PRED_BUFFER_HEIGHT * 2);
2819*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2820*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2821*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2822*495ae853SAndroid Build Coastguard Worker         ps_dec->pi2_pred1 = pv_buf;
2823*495ae853SAndroid Build Coastguard Worker 
2824*495ae853SAndroid Build Coastguard Worker         size = sizeof(UWORD8) * (MB_LUM_SIZE);
2825*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2826*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2827*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2828*495ae853SAndroid Build Coastguard Worker         ps_dec->pu1_temp_mc_buffer = pv_buf;
2829*495ae853SAndroid Build Coastguard Worker 
2830*495ae853SAndroid Build Coastguard Worker         size = 8 * MAX_REF_BUFS * sizeof(struct pic_buffer_t);
2831*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2832*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2833*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2834*495ae853SAndroid Build Coastguard Worker 
2835*495ae853SAndroid Build Coastguard Worker         ps_dec->pu1_init_dpb_base = pv_buf;
2836*495ae853SAndroid Build Coastguard Worker         pu1_buf = pv_buf;
2837*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_dpb_mgr->ps_init_dpb[0][0] = (struct pic_buffer_t *) pu1_buf;
2838*495ae853SAndroid Build Coastguard Worker 
2839*495ae853SAndroid Build Coastguard Worker         pu1_buf += size / 2;
2840*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_dpb_mgr->ps_init_dpb[1][0] = (struct pic_buffer_t *) pu1_buf;
2841*495ae853SAndroid Build Coastguard Worker 
2842*495ae853SAndroid Build Coastguard Worker         size = (sizeof(UWORD32) * 2 * 3 * ((MAX_FRAMES << 1) * (MAX_FRAMES << 1)) * 2);
2843*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2844*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2845*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2846*495ae853SAndroid Build Coastguard Worker         ps_dec->pu4_mbaff_wt_mat = pv_buf;
2847*495ae853SAndroid Build Coastguard Worker 
2848*495ae853SAndroid Build Coastguard Worker         size = sizeof(UWORD32) * 2 * 3 * ((MAX_FRAMES << 1) * (MAX_FRAMES << 1));
2849*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2850*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2851*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2852*495ae853SAndroid Build Coastguard Worker         ps_dec->pu4_wts_ofsts_mat = pv_buf;
2853*495ae853SAndroid Build Coastguard Worker 
2854*495ae853SAndroid Build Coastguard Worker         size = (sizeof(neighbouradd_t) << 2);
2855*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2856*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2857*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2858*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_left_mvpred_addr = pv_buf;
2859*495ae853SAndroid Build Coastguard Worker 
2860*495ae853SAndroid Build Coastguard Worker         size = ih264_buf_mgr_size();
2861*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2862*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2863*495ae853SAndroid Build Coastguard Worker         memset(pv_buf, 0, size);
2864*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_mv_buf_mgr = pv_buf;
2865*495ae853SAndroid Build Coastguard Worker 
2866*495ae853SAndroid Build Coastguard Worker         size = sizeof(col_mv_buf_t) * (H264_MAX_REF_PICS * 2);
2867*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2868*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2869*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_col_mv_base = pv_buf;
2870*495ae853SAndroid Build Coastguard Worker         memset(ps_dec->ps_col_mv_base, 0, size);
2871*495ae853SAndroid Build Coastguard Worker 
2872*495ae853SAndroid Build Coastguard Worker         size = ((MB_SIZE * MB_SIZE * 3) >> 1) + MB_SIZE;
2873*495ae853SAndroid Build Coastguard Worker         pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
2874*495ae853SAndroid Build Coastguard Worker         RETURN_IF((NULL == pv_buf), IV_FAIL);
2875*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma = pv_buf;
2876*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->pu1_ii_resamp_buffer_chroma =
2877*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma + (MB_SIZE * MB_SIZE);
2878*495ae853SAndroid Build Coastguard Worker         memset(ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma, 0, size);
2879*495ae853SAndroid Build Coastguard Worker 
2880*495ae853SAndroid Build Coastguard Worker         isvcd_init_decoder(ps_svc_lyr_dec);
2881*495ae853SAndroid Build Coastguard Worker     }
2882*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
2883*495ae853SAndroid Build Coastguard Worker }
2884*495ae853SAndroid Build Coastguard Worker 
2885*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2886*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2887*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_create                                             */
2888*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2889*495ae853SAndroid Build Coastguard Worker /*  Description   : creates decoder                                          */
2890*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2891*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
2892*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
2893*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
2894*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
2895*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
2896*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2897*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
2898*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2899*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2900*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2901*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2902*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore                                              */
2903*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2904*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_create(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)2905*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_create(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
2906*495ae853SAndroid Build Coastguard Worker {
2907*495ae853SAndroid Build Coastguard Worker     isvcd_create_ip_t *ps_create_ip;
2908*495ae853SAndroid Build Coastguard Worker     isvcd_create_op_t *ps_create_op;
2909*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
2910*495ae853SAndroid Build Coastguard Worker 
2911*495ae853SAndroid Build Coastguard Worker     ps_create_ip = (isvcd_create_ip_t *) pv_api_ip;
2912*495ae853SAndroid Build Coastguard Worker     ps_create_op = (isvcd_create_op_t *) pv_api_op;
2913*495ae853SAndroid Build Coastguard Worker 
2914*495ae853SAndroid Build Coastguard Worker     ps_create_op->s_ivd_create_op_t.u4_error_code = 0;
2915*495ae853SAndroid Build Coastguard Worker     dec_hdl = NULL;
2916*495ae853SAndroid Build Coastguard Worker     ret = isvcd_allocate_static_bufs(&dec_hdl, pv_api_ip, pv_api_op);
2917*495ae853SAndroid Build Coastguard Worker 
2918*495ae853SAndroid Build Coastguard Worker     /* If allocation of some buffer fails, then free buffers allocated till then */
2919*495ae853SAndroid Build Coastguard Worker     if(IV_FAIL == ret)
2920*495ae853SAndroid Build Coastguard Worker     {
2921*495ae853SAndroid Build Coastguard Worker         if(dec_hdl)
2922*495ae853SAndroid Build Coastguard Worker         {
2923*495ae853SAndroid Build Coastguard Worker             if(dec_hdl->pv_codec_handle)
2924*495ae853SAndroid Build Coastguard Worker             {
2925*495ae853SAndroid Build Coastguard Worker                 isvcd_free_static_bufs(dec_hdl);
2926*495ae853SAndroid Build Coastguard Worker             }
2927*495ae853SAndroid Build Coastguard Worker             else
2928*495ae853SAndroid Build Coastguard Worker             {
2929*495ae853SAndroid Build Coastguard Worker                 void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
2930*495ae853SAndroid Build Coastguard Worker                 void *pv_mem_ctxt;
2931*495ae853SAndroid Build Coastguard Worker 
2932*495ae853SAndroid Build Coastguard Worker                 pf_aligned_free = ps_create_ip->s_ivd_create_ip_t.pf_aligned_free;
2933*495ae853SAndroid Build Coastguard Worker                 pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
2934*495ae853SAndroid Build Coastguard Worker                 pf_aligned_free(pv_mem_ctxt, dec_hdl);
2935*495ae853SAndroid Build Coastguard Worker             }
2936*495ae853SAndroid Build Coastguard Worker         }
2937*495ae853SAndroid Build Coastguard Worker         ps_create_op->s_ivd_create_op_t.u4_error_code = IVD_MEM_ALLOC_FAILED;
2938*495ae853SAndroid Build Coastguard Worker         ps_create_op->s_ivd_create_op_t.u4_error_code |= 1 << IVD_FATALERROR;
2939*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
2940*495ae853SAndroid Build Coastguard Worker     }
2941*495ae853SAndroid Build Coastguard Worker 
2942*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
2943*495ae853SAndroid Build Coastguard Worker }
2944*495ae853SAndroid Build Coastguard Worker 
2945*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2946*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2947*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_update_dqid                                        */
2948*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2949*495ae853SAndroid Build Coastguard Worker /*  Description   : Updates the DQID list based on reference layer DQID      */
2950*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2951*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2952*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. Reference layer DQID                                  */
2953*495ae853SAndroid Build Coastguard Worker /*                  2. current layer's vcl node structure                    */
2954*495ae853SAndroid Build Coastguard Worker /*                  3. pointer to store the bottom layer VCL node            */
2955*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
2956*495ae853SAndroid Build Coastguard Worker /*  Processing    : 1. Searches for a layer with reference layer DQID        */
2957*495ae853SAndroid Build Coastguard Worker /*                  2. Updates the bottom and top nodes of current layer and */
2958*495ae853SAndroid Build Coastguard Worker /*                     reference layer vcl nodes respectively                */
2959*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2960*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Updates top and bottom node field of vcl nodes of current*/
2961*495ae853SAndroid Build Coastguard Worker /*                  layer and reference layer respectively                   */
2962*495ae853SAndroid Build Coastguard Worker /*  Returns       : status                                                   */
2963*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2964*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
2965*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2966*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2967*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2968*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2969*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay      Draft                                     */
2970*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_update_dqid(WORD32 i4_ref_lyr_dqid,vcl_node_t * ps_cur_lyr_node,vcl_node_t ** pps_bot_lyr_node)2971*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_update_dqid(WORD32 i4_ref_lyr_dqid, vcl_node_t *ps_cur_lyr_node,
2972*495ae853SAndroid Build Coastguard Worker                          vcl_node_t **pps_bot_lyr_node)
2973*495ae853SAndroid Build Coastguard Worker {
2974*495ae853SAndroid Build Coastguard Worker     vcl_node_t *ps_vcl_node;
2975*495ae853SAndroid Build Coastguard Worker 
2976*495ae853SAndroid Build Coastguard Worker     /* sanity checks */
2977*495ae853SAndroid Build Coastguard Worker     if((NULL == ps_cur_lyr_node) || (NULL == pps_bot_lyr_node))
2978*495ae853SAndroid Build Coastguard Worker     {
2979*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
2980*495ae853SAndroid Build Coastguard Worker     }
2981*495ae853SAndroid Build Coastguard Worker 
2982*495ae853SAndroid Build Coastguard Worker     ps_vcl_node = ps_cur_lyr_node->ps_bot_node;
2983*495ae853SAndroid Build Coastguard Worker     while(NULL != ps_vcl_node)
2984*495ae853SAndroid Build Coastguard Worker     {
2985*495ae853SAndroid Build Coastguard Worker         WORD32 i4_dqid;
2986*495ae853SAndroid Build Coastguard Worker 
2987*495ae853SAndroid Build Coastguard Worker         i4_dqid = (ps_vcl_node->i4_dependency_id << 4) + ps_vcl_node->i4_quality_id;
2988*495ae853SAndroid Build Coastguard Worker 
2989*495ae853SAndroid Build Coastguard Worker         /* if reference layer DQ ID matches */
2990*495ae853SAndroid Build Coastguard Worker         /* or reference layer is a layer below reference dq id layer */
2991*495ae853SAndroid Build Coastguard Worker         if((i4_dqid == i4_ref_lyr_dqid) ||
2992*495ae853SAndroid Build Coastguard Worker            (ps_vcl_node->i4_quality_id < (i4_ref_lyr_dqid & 0x0F)) ||
2993*495ae853SAndroid Build Coastguard Worker            (ps_vcl_node->i4_dependency_id < (i4_ref_lyr_dqid >> 4)))
2994*495ae853SAndroid Build Coastguard Worker         {
2995*495ae853SAndroid Build Coastguard Worker             break;
2996*495ae853SAndroid Build Coastguard Worker         }
2997*495ae853SAndroid Build Coastguard Worker         ps_vcl_node = ps_vcl_node->ps_bot_node;
2998*495ae853SAndroid Build Coastguard Worker     }
2999*495ae853SAndroid Build Coastguard Worker 
3000*495ae853SAndroid Build Coastguard Worker     /* Update the top and bottom node of ref layer and current layer nodes */
3001*495ae853SAndroid Build Coastguard Worker 
3002*495ae853SAndroid Build Coastguard Worker     if(NULL != ps_vcl_node)
3003*495ae853SAndroid Build Coastguard Worker     {
3004*495ae853SAndroid Build Coastguard Worker         ps_cur_lyr_node->ps_bot_node = ps_vcl_node;
3005*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->ps_top_node = ps_cur_lyr_node;
3006*495ae853SAndroid Build Coastguard Worker     }
3007*495ae853SAndroid Build Coastguard Worker 
3008*495ae853SAndroid Build Coastguard Worker     /* Update pointer to bottom VCL node */
3009*495ae853SAndroid Build Coastguard Worker     *pps_bot_lyr_node = ps_vcl_node;
3010*495ae853SAndroid Build Coastguard Worker     return (OK);
3011*495ae853SAndroid Build Coastguard Worker }
3012*495ae853SAndroid Build Coastguard Worker 
3013*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3014*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3015*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_detect_res_change                                  */
3016*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3017*495ae853SAndroid Build Coastguard Worker /*  Description   : This function detects the resolution change              */
3018*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3019*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3020*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. Pointer to Current SPS                                */
3021*495ae853SAndroid Build Coastguard Worker /*                  2. Pointer to prevoius SPS                               */
3022*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
3023*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
3024*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3025*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
3026*495ae853SAndroid Build Coastguard Worker /*  Returns       : SVCD_TRUE if different resolution else SVCD_FALSE        */
3027*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3028*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3029*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3030*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3031*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3032*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3033*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijayakumar      Draft                               */
3034*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3035*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_detect_res_change(dec_seq_params_t * ps_curr_sps,dec_seq_params_t * ps_prev_sps,dec_svc_seq_params_t * ps_curr_subset_sps,dec_svc_seq_params_t * ps_prev_subset_sps)3036*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_detect_res_change(dec_seq_params_t *ps_curr_sps, dec_seq_params_t *ps_prev_sps,
3037*495ae853SAndroid Build Coastguard Worker                                dec_svc_seq_params_t *ps_curr_subset_sps,
3038*495ae853SAndroid Build Coastguard Worker                                dec_svc_seq_params_t *ps_prev_subset_sps)
3039*495ae853SAndroid Build Coastguard Worker {
3040*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_scaled_ref_width_sps;
3041*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_scaled_ref_ht_sps;
3042*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_prev_subset_sps);
3043*495ae853SAndroid Build Coastguard Worker 
3044*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_prev_sps)
3045*495ae853SAndroid Build Coastguard Worker     {
3046*495ae853SAndroid Build Coastguard Worker         /* indicates bottom most layer in Access unit */
3047*495ae853SAndroid Build Coastguard Worker         return (SVCD_FALSE);
3048*495ae853SAndroid Build Coastguard Worker     }
3049*495ae853SAndroid Build Coastguard Worker     /* Check for the ESS idc */
3050*495ae853SAndroid Build Coastguard Worker     if(2 == ps_curr_subset_sps->s_sps_svc_ext.u1_extended_spatial_scalability_idc)
3051*495ae853SAndroid Build Coastguard Worker     {
3052*495ae853SAndroid Build Coastguard Worker         return (SVCD_TRUE);
3053*495ae853SAndroid Build Coastguard Worker     }
3054*495ae853SAndroid Build Coastguard Worker 
3055*495ae853SAndroid Build Coastguard Worker     /* Calculate the scaled reference width and height */
3056*495ae853SAndroid Build Coastguard Worker     u2_scaled_ref_width_sps = (ps_curr_sps->u2_frm_wd_in_mbs << 4);
3057*495ae853SAndroid Build Coastguard Worker     u2_scaled_ref_width_sps -=
3058*495ae853SAndroid Build Coastguard Worker         (ps_curr_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_left_offset +
3059*495ae853SAndroid Build Coastguard Worker          ps_curr_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_right_offset);
3060*495ae853SAndroid Build Coastguard Worker 
3061*495ae853SAndroid Build Coastguard Worker     u2_scaled_ref_ht_sps = (ps_curr_sps->u2_frm_ht_in_mbs << 4);
3062*495ae853SAndroid Build Coastguard Worker     u2_scaled_ref_ht_sps -=
3063*495ae853SAndroid Build Coastguard Worker         (ps_curr_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_top_offset +
3064*495ae853SAndroid Build Coastguard Worker          ps_curr_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_bottom_offset);
3065*495ae853SAndroid Build Coastguard Worker 
3066*495ae853SAndroid Build Coastguard Worker     /* Check for frame width being different */
3067*495ae853SAndroid Build Coastguard Worker     if(u2_scaled_ref_width_sps != (ps_prev_sps->u2_frm_wd_in_mbs << 4))
3068*495ae853SAndroid Build Coastguard Worker     {
3069*495ae853SAndroid Build Coastguard Worker         return (SVCD_TRUE);
3070*495ae853SAndroid Build Coastguard Worker     }
3071*495ae853SAndroid Build Coastguard Worker 
3072*495ae853SAndroid Build Coastguard Worker     /* Check for frame height being different */
3073*495ae853SAndroid Build Coastguard Worker     if(u2_scaled_ref_ht_sps != (ps_prev_sps->u2_frm_ht_in_mbs << 4))
3074*495ae853SAndroid Build Coastguard Worker     {
3075*495ae853SAndroid Build Coastguard Worker         return (SVCD_TRUE);
3076*495ae853SAndroid Build Coastguard Worker     }
3077*495ae853SAndroid Build Coastguard Worker 
3078*495ae853SAndroid Build Coastguard Worker     /* check for crop offset not MB aligned */
3079*495ae853SAndroid Build Coastguard Worker     if((0 != (ps_curr_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_left_offset & 15)) ||
3080*495ae853SAndroid Build Coastguard Worker        (0 != (ps_curr_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_top_offset & 15)))
3081*495ae853SAndroid Build Coastguard Worker     {
3082*495ae853SAndroid Build Coastguard Worker         return (SVCD_TRUE);
3083*495ae853SAndroid Build Coastguard Worker     }
3084*495ae853SAndroid Build Coastguard Worker 
3085*495ae853SAndroid Build Coastguard Worker     /* check for chroma Phase Y being different */
3086*495ae853SAndroid Build Coastguard Worker     if(ps_curr_subset_sps->s_sps_svc_ext.u1_chroma_phase_x_plus1_flag !=
3087*495ae853SAndroid Build Coastguard Worker        ps_curr_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_x_plus1_flag)
3088*495ae853SAndroid Build Coastguard Worker     {
3089*495ae853SAndroid Build Coastguard Worker         return (SVCD_TRUE);
3090*495ae853SAndroid Build Coastguard Worker     }
3091*495ae853SAndroid Build Coastguard Worker 
3092*495ae853SAndroid Build Coastguard Worker     /* check for chroma Phase Y being different */
3093*495ae853SAndroid Build Coastguard Worker     if(ps_curr_subset_sps->s_sps_svc_ext.u1_chroma_phase_y_plus1 !=
3094*495ae853SAndroid Build Coastguard Worker        ps_curr_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_y_plus1)
3095*495ae853SAndroid Build Coastguard Worker     {
3096*495ae853SAndroid Build Coastguard Worker         return (SVCD_TRUE);
3097*495ae853SAndroid Build Coastguard Worker     }
3098*495ae853SAndroid Build Coastguard Worker 
3099*495ae853SAndroid Build Coastguard Worker     /* If none of the above are true then there is no resolution change */
3100*495ae853SAndroid Build Coastguard Worker     return (SVCD_FALSE);
3101*495ae853SAndroid Build Coastguard Worker }
3102*495ae853SAndroid Build Coastguard Worker 
3103*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3104*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3105*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_parse_ref_pic_list_modify                          */
3106*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3107*495ae853SAndroid Build Coastguard Worker /*  Description   : Parses the reference picture modification related        */
3108*495ae853SAndroid Build Coastguard Worker /*                  syntax elements                                          */
3109*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3110*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. stream context structure                              */
3111*495ae853SAndroid Build Coastguard Worker /*                  2. slice prms structure                                  */
3112*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
3113*495ae853SAndroid Build Coastguard Worker /*  Processing    : Parses the syntax elements                               */
3114*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3115*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Updated stream buffer context                            */
3116*495ae853SAndroid Build Coastguard Worker /*  Returns       : status                                                   */
3117*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3118*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
3119*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3120*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3121*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3122*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3123*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           Draft                                */
3124*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3125*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_parse_ref_pic_list_modify(dec_bit_stream_t * ps_bitstrm,dec_slice_params_t * ps_slice_prms,dec_seq_params_t * ps_curr_sps)3126*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_parse_ref_pic_list_modify(dec_bit_stream_t *ps_bitstrm,
3127*495ae853SAndroid Build Coastguard Worker                                        dec_slice_params_t *ps_slice_prms,
3128*495ae853SAndroid Build Coastguard Worker                                        dec_seq_params_t *ps_curr_sps)
3129*495ae853SAndroid Build Coastguard Worker {
3130*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mod_flag;
3131*495ae853SAndroid Build Coastguard Worker     UWORD16 ui_nextUev;
3132*495ae853SAndroid Build Coastguard Worker     WORD32 i4_num_sets_ctr = 0;
3133*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
3134*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
3135*495ae853SAndroid Build Coastguard Worker 
3136*495ae853SAndroid Build Coastguard Worker     if(I_SLICE != ps_slice_prms->u1_slice_type)
3137*495ae853SAndroid Build Coastguard Worker     {
3138*495ae853SAndroid Build Coastguard Worker         /* ref_pic_list_modification_flag_l0 */
3139*495ae853SAndroid Build Coastguard Worker         i4_mod_flag = ih264d_get_bit_h264(ps_bitstrm);
3140*495ae853SAndroid Build Coastguard Worker 
3141*495ae853SAndroid Build Coastguard Worker         if(0 != i4_mod_flag)
3142*495ae853SAndroid Build Coastguard Worker         {
3143*495ae853SAndroid Build Coastguard Worker             WORD32 i4_mod_pic_num_idc;
3144*495ae853SAndroid Build Coastguard Worker 
3145*495ae853SAndroid Build Coastguard Worker             i4_num_sets_ctr = 0;
3146*495ae853SAndroid Build Coastguard Worker             do
3147*495ae853SAndroid Build Coastguard Worker             {
3148*495ae853SAndroid Build Coastguard Worker                 /* modification_of_pic_nums_idc */
3149*495ae853SAndroid Build Coastguard Worker                 i4_mod_pic_num_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3150*495ae853SAndroid Build Coastguard Worker 
3151*495ae853SAndroid Build Coastguard Worker                 if((i4_mod_pic_num_idc > 3) || (i4_mod_pic_num_idc < 0))
3152*495ae853SAndroid Build Coastguard Worker                 {
3153*495ae853SAndroid Build Coastguard Worker                     return ERROR_INV_SLICE_HDR_T;
3154*495ae853SAndroid Build Coastguard Worker                 }
3155*495ae853SAndroid Build Coastguard Worker                 if(3 != i4_mod_pic_num_idc)
3156*495ae853SAndroid Build Coastguard Worker                 {
3157*495ae853SAndroid Build Coastguard Worker                     /* i4_mod_pic_num_idc = 0,1 ==> abs_diff_pic_num_minus1 */
3158*495ae853SAndroid Build Coastguard Worker                     /* i4_mod_pic_num_idc = 2 ==> long_term_pic_num */
3159*495ae853SAndroid Build Coastguard Worker 
3160*495ae853SAndroid Build Coastguard Worker                     ui_nextUev = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3161*495ae853SAndroid Build Coastguard Worker                     if(ui_nextUev > (ps_curr_sps->u2_u4_max_pic_num_minus1 + 1))
3162*495ae853SAndroid Build Coastguard Worker                         return ERROR_INV_SLICE_HDR_T;
3163*495ae853SAndroid Build Coastguard Worker                 }
3164*495ae853SAndroid Build Coastguard Worker 
3165*495ae853SAndroid Build Coastguard Worker                 i4_num_sets_ctr++;
3166*495ae853SAndroid Build Coastguard Worker 
3167*495ae853SAndroid Build Coastguard Worker                 /* if the number of commands recieved exceeds max limit */
3168*495ae853SAndroid Build Coastguard Worker                 if((H264_MAX_REF_PICS) == i4_num_sets_ctr) break;
3169*495ae853SAndroid Build Coastguard Worker 
3170*495ae853SAndroid Build Coastguard Worker             } while(3 != i4_mod_pic_num_idc);
3171*495ae853SAndroid Build Coastguard Worker         }
3172*495ae853SAndroid Build Coastguard Worker 
3173*495ae853SAndroid Build Coastguard Worker         /*********** if (I_SLICE != u1_slice_type) ***************************/
3174*495ae853SAndroid Build Coastguard Worker     }
3175*495ae853SAndroid Build Coastguard Worker 
3176*495ae853SAndroid Build Coastguard Worker     if(B_SLICE != ps_slice_prms->u1_slice_type)
3177*495ae853SAndroid Build Coastguard Worker     {
3178*495ae853SAndroid Build Coastguard Worker         return (OK);
3179*495ae853SAndroid Build Coastguard Worker     }
3180*495ae853SAndroid Build Coastguard Worker 
3181*495ae853SAndroid Build Coastguard Worker     /* ref_pic_list_modification_flag_l1 */
3182*495ae853SAndroid Build Coastguard Worker     i4_mod_flag = ih264d_get_bit_h264(ps_bitstrm);
3183*495ae853SAndroid Build Coastguard Worker 
3184*495ae853SAndroid Build Coastguard Worker     if(0 != i4_mod_flag)
3185*495ae853SAndroid Build Coastguard Worker     {
3186*495ae853SAndroid Build Coastguard Worker         WORD32 i4_mod_pic_num_idc;
3187*495ae853SAndroid Build Coastguard Worker 
3188*495ae853SAndroid Build Coastguard Worker         do
3189*495ae853SAndroid Build Coastguard Worker         {
3190*495ae853SAndroid Build Coastguard Worker             /* modification_of_pic_nums_idc */
3191*495ae853SAndroid Build Coastguard Worker             i4_mod_pic_num_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3192*495ae853SAndroid Build Coastguard Worker 
3193*495ae853SAndroid Build Coastguard Worker             if((i4_mod_pic_num_idc > 3) || (i4_mod_pic_num_idc < 0))
3194*495ae853SAndroid Build Coastguard Worker             {
3195*495ae853SAndroid Build Coastguard Worker                 return ERROR_INV_SLICE_HDR_T;
3196*495ae853SAndroid Build Coastguard Worker             }
3197*495ae853SAndroid Build Coastguard Worker             if(3 != i4_mod_pic_num_idc)
3198*495ae853SAndroid Build Coastguard Worker             {
3199*495ae853SAndroid Build Coastguard Worker                 /* i4_mod_pic_num_idc = 0,1 ==> abs_diff_pic_num_minus1 */
3200*495ae853SAndroid Build Coastguard Worker                 /* i4_mod_pic_num_idc = 2 ==> long_term_pic_num */
3201*495ae853SAndroid Build Coastguard Worker 
3202*495ae853SAndroid Build Coastguard Worker                 ui_nextUev = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3203*495ae853SAndroid Build Coastguard Worker                 if(ui_nextUev > (ps_curr_sps->u2_u4_max_pic_num_minus1 + 1))
3204*495ae853SAndroid Build Coastguard Worker                     return ERROR_INV_SLICE_HDR_T;
3205*495ae853SAndroid Build Coastguard Worker             }
3206*495ae853SAndroid Build Coastguard Worker 
3207*495ae853SAndroid Build Coastguard Worker             i4_num_sets_ctr++;
3208*495ae853SAndroid Build Coastguard Worker 
3209*495ae853SAndroid Build Coastguard Worker             /* if the number of commands recieved exceeds max limit */
3210*495ae853SAndroid Build Coastguard Worker             if((H264_MAX_REF_PICS) == i4_num_sets_ctr) break;
3211*495ae853SAndroid Build Coastguard Worker 
3212*495ae853SAndroid Build Coastguard Worker         } while(3 != i4_mod_pic_num_idc);
3213*495ae853SAndroid Build Coastguard Worker     }
3214*495ae853SAndroid Build Coastguard Worker 
3215*495ae853SAndroid Build Coastguard Worker     return (OK);
3216*495ae853SAndroid Build Coastguard Worker }
3217*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3218*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3219*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_parse_slice_hdr_refdq_id                           */
3220*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3221*495ae853SAndroid Build Coastguard Worker /*  Description   : this function decodes the slice until Inter layer deblk  */
3222*495ae853SAndroid Build Coastguard Worker /*                  parameters are parsed                                    */
3223*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3224*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. pointer to VCL node of given layer                    */
3225*495ae853SAndroid Build Coastguard Worker /*                  2. pointer toi slice params structure                    */
3226*495ae853SAndroid Build Coastguard Worker /*                  3. pointer to layer params strcuture                     */
3227*495ae853SAndroid Build Coastguard Worker /*                  4. pointer to stream context structure                   */
3228*495ae853SAndroid Build Coastguard Worker /*                  5. pointer to store the reference DQID                   */
3229*495ae853SAndroid Build Coastguard Worker /*                  6. pointer to array of SPS                               */
3230*495ae853SAndroid Build Coastguard Worker /*                  7. pointer to array of PPS                               */
3231*495ae853SAndroid Build Coastguard Worker /*                  8. no inter layer pred flag of current slice             */
3232*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3233*495ae853SAndroid Build Coastguard Worker /*  Processing    : prases syntax elements                                   */
3234*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3235*495ae853SAndroid Build Coastguard Worker /*  Outputs       : reference layer DQ ID                                    */
3236*495ae853SAndroid Build Coastguard Worker /*  Returns       : Error code                                               */
3237*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3238*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3239*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3240*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3241*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3242*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3243*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   vijayakumar          creation                        */
3244*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3245*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_parse_slice_hdr_refdq_id(vcl_node_t * ps_vcl_node,dec_slice_params_t * ps_slice_prms,dec_bit_stream_t * ps_bitstrm,WORD32 * pi4_ref_dq_id,dec_seq_params_t * ps_sps,dec_pic_params_t * ps_pps,WORD32 i4_no_int_lyr_pred,svc_dec_ctxt_t * ps_svcd_ctxt)3246*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_parse_slice_hdr_refdq_id(vcl_node_t *ps_vcl_node, dec_slice_params_t *ps_slice_prms,
3247*495ae853SAndroid Build Coastguard Worker                                       dec_bit_stream_t *ps_bitstrm, WORD32 *pi4_ref_dq_id,
3248*495ae853SAndroid Build Coastguard Worker                                       dec_seq_params_t *ps_sps, dec_pic_params_t *ps_pps,
3249*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_no_int_lyr_pred, svc_dec_ctxt_t *ps_svcd_ctxt)
3250*495ae853SAndroid Build Coastguard Worker {
3251*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_pps_id;
3252*495ae853SAndroid Build Coastguard Worker     WORD32 i_temp;
3253*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_temp;
3254*495ae853SAndroid Build Coastguard Worker     WORD32 i4_nal_unit_type;
3255*495ae853SAndroid Build Coastguard Worker     WORD32 i4_nal_ref_idc, i4_quality_id;
3256*495ae853SAndroid Build Coastguard Worker     WORD32 i4_use_ref_base, i4_idr_pic_flag;
3257*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
3258*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
3259*495ae853SAndroid Build Coastguard Worker     dec_svc_seq_params_t *ps_subset_sps = NULL;
3260*495ae853SAndroid Build Coastguard Worker     WORD32 ret = OK;
3261*495ae853SAndroid Build Coastguard Worker 
3262*495ae853SAndroid Build Coastguard Worker     i4_nal_unit_type = ps_vcl_node->i4_nal_unit_type;
3263*495ae853SAndroid Build Coastguard Worker     i4_nal_ref_idc = ps_vcl_node->i4_nal_ref_idc;
3264*495ae853SAndroid Build Coastguard Worker     i4_quality_id = ps_vcl_node->i4_quality_id;
3265*495ae853SAndroid Build Coastguard Worker     i4_use_ref_base = ps_vcl_node->i4_use_ref_base;
3266*495ae853SAndroid Build Coastguard Worker     i4_idr_pic_flag = ps_vcl_node->i4_idr_pic_flag;
3267*495ae853SAndroid Build Coastguard Worker 
3268*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3269*495ae853SAndroid Build Coastguard Worker     /*--------------------- first mb in slice -------------------------------*/
3270*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3271*495ae853SAndroid Build Coastguard Worker     ps_slice_prms->u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3272*495ae853SAndroid Build Coastguard Worker 
3273*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3274*495ae853SAndroid Build Coastguard Worker     /*---------------------------- slice type -------------------------------*/
3275*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3276*495ae853SAndroid Build Coastguard Worker     ps_slice_prms->u1_slice_type = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3277*495ae853SAndroid Build Coastguard Worker     if(ps_slice_prms->u1_slice_type > 4)
3278*495ae853SAndroid Build Coastguard Worker     {
3279*495ae853SAndroid Build Coastguard Worker         ps_slice_prms->u1_slice_type -= 5;
3280*495ae853SAndroid Build Coastguard Worker     }
3281*495ae853SAndroid Build Coastguard Worker 
3282*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3283*495ae853SAndroid Build Coastguard Worker     /*----------------------------- PPS id ----------------------------------*/
3284*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3285*495ae853SAndroid Build Coastguard Worker     u1_pps_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3286*495ae853SAndroid Build Coastguard Worker 
3287*495ae853SAndroid Build Coastguard Worker     /* set correspoding sps and pps id also */
3288*495ae853SAndroid Build Coastguard Worker     ps_pps += u1_pps_id;
3289*495ae853SAndroid Build Coastguard Worker     if(FALSE == ps_pps->u1_is_valid)
3290*495ae853SAndroid Build Coastguard Worker     {
3291*495ae853SAndroid Build Coastguard Worker         return ERROR_INV_SLICE_HDR_T;
3292*495ae853SAndroid Build Coastguard Worker     }
3293*495ae853SAndroid Build Coastguard Worker     ps_sps = ps_pps->ps_sps;
3294*495ae853SAndroid Build Coastguard Worker     ps_subset_sps = &ps_svcd_ctxt->ps_subset_sps[ps_sps->u1_seq_parameter_set_id];
3295*495ae853SAndroid Build Coastguard Worker     if(CODED_SLICE_EXTENSION_NAL == i4_nal_unit_type)
3296*495ae853SAndroid Build Coastguard Worker     {
3297*495ae853SAndroid Build Coastguard Worker         ps_sps += MAX_NUM_SEQ_PARAMS;
3298*495ae853SAndroid Build Coastguard Worker         ps_subset_sps =
3299*495ae853SAndroid Build Coastguard Worker             &ps_svcd_ctxt->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_sps->u1_seq_parameter_set_id];
3300*495ae853SAndroid Build Coastguard Worker     }
3301*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3302*495ae853SAndroid Build Coastguard Worker     /*--------------------------- frm num -----------------------------------*/
3303*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3304*495ae853SAndroid Build Coastguard Worker     if(!ps_sps) return ERROR_INV_SLICE_HDR_T;
3305*495ae853SAndroid Build Coastguard Worker     if(FALSE == ps_sps->u1_is_valid) return ERROR_INV_SLICE_HDR_T;
3306*495ae853SAndroid Build Coastguard Worker 
3307*495ae853SAndroid Build Coastguard Worker     ps_slice_prms->u2_frame_num = ih264d_get_bits_h264(ps_bitstrm, ps_sps->u1_bits_in_frm_num);
3308*495ae853SAndroid Build Coastguard Worker 
3309*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3310*495ae853SAndroid Build Coastguard Worker     /*------------------ field pic flag and bottom field flag ---------------*/
3311*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3312*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE != ps_sps->u1_frame_mbs_only_flag)
3313*495ae853SAndroid Build Coastguard Worker     {
3314*495ae853SAndroid Build Coastguard Worker         return ERROR_INV_SLICE_HDR_T;
3315*495ae853SAndroid Build Coastguard Worker     }
3316*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3317*495ae853SAndroid Build Coastguard Worker     /*--------------------------- IDR pic id --------------------------------*/
3318*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3319*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == i4_idr_pic_flag)
3320*495ae853SAndroid Build Coastguard Worker     {
3321*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_idr_pic_id = 0;
3322*495ae853SAndroid Build Coastguard Worker         u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3323*495ae853SAndroid Build Coastguard Worker         if(u4_idr_pic_id > 65535) return ERROR_INV_SLICE_HDR_T;
3324*495ae853SAndroid Build Coastguard Worker     }
3325*495ae853SAndroid Build Coastguard Worker 
3326*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3327*495ae853SAndroid Build Coastguard Worker     /*----------------- poc lsb and delts_poc_bottom ------------------------*/
3328*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3329*495ae853SAndroid Build Coastguard Worker     if(0 == ps_sps->u1_pic_order_cnt_type)
3330*495ae853SAndroid Build Coastguard Worker     {
3331*495ae853SAndroid Build Coastguard Worker         i_temp = ih264d_get_bits_h264(ps_bitstrm, ps_sps->u1_log2_max_pic_order_cnt_lsb_minus);
3332*495ae853SAndroid Build Coastguard Worker 
3333*495ae853SAndroid Build Coastguard Worker         if(i_temp < 0 || i_temp >= ps_sps->i4_max_pic_order_cntLsb) return ERROR_INV_SLICE_HDR_T;
3334*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE == ps_pps->u1_pic_order_present_flag)
3335*495ae853SAndroid Build Coastguard Worker         {
3336*495ae853SAndroid Build Coastguard Worker             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3337*495ae853SAndroid Build Coastguard Worker         }
3338*495ae853SAndroid Build Coastguard Worker     }
3339*495ae853SAndroid Build Coastguard Worker 
3340*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3341*495ae853SAndroid Build Coastguard Worker     /*---------------- delta_poc_count[0] and [1] ---------------------------*/
3342*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3343*495ae853SAndroid Build Coastguard Worker     if((1 == ps_sps->u1_pic_order_cnt_type) && (!ps_sps->u1_delta_pic_order_always_zero_flag))
3344*495ae853SAndroid Build Coastguard Worker     {
3345*495ae853SAndroid Build Coastguard Worker         i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3346*495ae853SAndroid Build Coastguard Worker 
3347*495ae853SAndroid Build Coastguard Worker         if(ps_pps->u1_pic_order_present_flag)
3348*495ae853SAndroid Build Coastguard Worker         {
3349*495ae853SAndroid Build Coastguard Worker             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3350*495ae853SAndroid Build Coastguard Worker         }
3351*495ae853SAndroid Build Coastguard Worker     }
3352*495ae853SAndroid Build Coastguard Worker 
3353*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3354*495ae853SAndroid Build Coastguard Worker     /*---------------------- redundant pic cnt ------------------------------*/
3355*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3356*495ae853SAndroid Build Coastguard Worker     if(ps_pps->u1_redundant_pic_cnt_present_flag)
3357*495ae853SAndroid Build Coastguard Worker     {
3358*495ae853SAndroid Build Coastguard Worker         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3359*495ae853SAndroid Build Coastguard Worker         if(u4_temp > MAX_REDUNDANT_PIC_CNT) return ERROR_INV_SLICE_HDR_T;
3360*495ae853SAndroid Build Coastguard Worker     }
3361*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3362*495ae853SAndroid Build Coastguard Worker     /*-----------------Direct_spatial_mv_pred_flag --------------------------*/
3363*495ae853SAndroid Build Coastguard Worker     /*-----------------num ref active override flag -------------------------*/
3364*495ae853SAndroid Build Coastguard Worker     /*-----------------num_ref_idx_active_l0&1 ------------------------------*/
3365*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3366*495ae853SAndroid Build Coastguard Worker     if(0 == i4_quality_id)
3367*495ae853SAndroid Build Coastguard Worker     {
3368*495ae853SAndroid Build Coastguard Worker         if(B_SLICE == ps_slice_prms->u1_slice_type)
3369*495ae853SAndroid Build Coastguard Worker         {
3370*495ae853SAndroid Build Coastguard Worker             ps_slice_prms->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
3371*495ae853SAndroid Build Coastguard Worker         }
3372*495ae853SAndroid Build Coastguard Worker 
3373*495ae853SAndroid Build Coastguard Worker         if((P_SLICE == ps_slice_prms->u1_slice_type) || (B_SLICE == ps_slice_prms->u1_slice_type))
3374*495ae853SAndroid Build Coastguard Worker         {
3375*495ae853SAndroid Build Coastguard Worker             WORD8 i1_over_ride_flag;
3376*495ae853SAndroid Build Coastguard Worker             i1_over_ride_flag = ih264d_get_bit_h264(ps_bitstrm);
3377*495ae853SAndroid Build Coastguard Worker 
3378*495ae853SAndroid Build Coastguard Worker             ps_slice_prms->u1_num_ref_idx_active_override_flag = i1_over_ride_flag;
3379*495ae853SAndroid Build Coastguard Worker 
3380*495ae853SAndroid Build Coastguard Worker             if(SVCD_TRUE == i1_over_ride_flag)
3381*495ae853SAndroid Build Coastguard Worker             {
3382*495ae853SAndroid Build Coastguard Worker                 UWORD8 u8_ref_idx_l0;
3383*495ae853SAndroid Build Coastguard Worker                 u8_ref_idx_l0 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3384*495ae853SAndroid Build Coastguard Worker                 if(u8_ref_idx_l0 > H264_MAX_REF_PICS)
3385*495ae853SAndroid Build Coastguard Worker                 {
3386*495ae853SAndroid Build Coastguard Worker                     return ERROR_NUM_REF;
3387*495ae853SAndroid Build Coastguard Worker                 }
3388*495ae853SAndroid Build Coastguard Worker                 if(B_SLICE == ps_slice_prms->u1_slice_type)
3389*495ae853SAndroid Build Coastguard Worker                 {
3390*495ae853SAndroid Build Coastguard Worker                     UWORD8 u8_ref_idx_l1;
3391*495ae853SAndroid Build Coastguard Worker                     u8_ref_idx_l1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3392*495ae853SAndroid Build Coastguard Worker                     if(u8_ref_idx_l1 > H264_MAX_REF_PICS)
3393*495ae853SAndroid Build Coastguard Worker                     {
3394*495ae853SAndroid Build Coastguard Worker                         return ERROR_NUM_REF;
3395*495ae853SAndroid Build Coastguard Worker                     }
3396*495ae853SAndroid Build Coastguard Worker                 }
3397*495ae853SAndroid Build Coastguard Worker             }
3398*495ae853SAndroid Build Coastguard Worker         }
3399*495ae853SAndroid Build Coastguard Worker 
3400*495ae853SAndroid Build Coastguard Worker         /*-----------------------------------------------------------------------*/
3401*495ae853SAndroid Build Coastguard Worker         /*---------------------- ref pic list modification ----------------------*/
3402*495ae853SAndroid Build Coastguard Worker         /*-----------------------------------------------------------------------*/
3403*495ae853SAndroid Build Coastguard Worker         {
3404*495ae853SAndroid Build Coastguard Worker             ret = isvcd_parse_ref_pic_list_modify(ps_bitstrm, ps_slice_prms, ps_sps);
3405*495ae853SAndroid Build Coastguard Worker             if(OK != ret) return ret;
3406*495ae853SAndroid Build Coastguard Worker         }
3407*495ae853SAndroid Build Coastguard Worker 
3408*495ae853SAndroid Build Coastguard Worker         if(((1 == ps_pps->u1_wted_pred_flag) && (P_SLICE == ps_slice_prms->u1_slice_type)) ||
3409*495ae853SAndroid Build Coastguard Worker            ((B_SLICE == ps_slice_prms->u1_slice_type) && (1 == ps_pps->u1_wted_bipred_idc)))
3410*495ae853SAndroid Build Coastguard Worker         {
3411*495ae853SAndroid Build Coastguard Worker             if((ps_slice_prms->u1_num_ref_idx_lx_active[0] >= H264_MAX_REF_IDX) ||
3412*495ae853SAndroid Build Coastguard Worker                (ps_slice_prms->u1_num_ref_idx_lx_active[1] >= H264_MAX_REF_IDX))
3413*495ae853SAndroid Build Coastguard Worker             {
3414*495ae853SAndroid Build Coastguard Worker                 return ERROR_NUM_REF;
3415*495ae853SAndroid Build Coastguard Worker             }
3416*495ae853SAndroid Build Coastguard Worker             /*-------------------------------------------------------------------*/
3417*495ae853SAndroid Build Coastguard Worker             /*------------------------- Pred weight table -----------------------*/
3418*495ae853SAndroid Build Coastguard Worker             /*-------------------------------------------------------------------*/
3419*495ae853SAndroid Build Coastguard Worker             if(CODED_SLICE_EXTENSION_NAL == i4_nal_unit_type)
3420*495ae853SAndroid Build Coastguard Worker             {
3421*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_base_pred_wt_tbl_flag = 1;
3422*495ae853SAndroid Build Coastguard Worker 
3423*495ae853SAndroid Build Coastguard Worker                 /* base_pred_weight_table_flag */
3424*495ae853SAndroid Build Coastguard Worker                 if(0 == i4_no_int_lyr_pred)
3425*495ae853SAndroid Build Coastguard Worker                 {
3426*495ae853SAndroid Build Coastguard Worker                     i4_base_pred_wt_tbl_flag = ih264d_get_bit_h264(ps_bitstrm);
3427*495ae853SAndroid Build Coastguard Worker                 }
3428*495ae853SAndroid Build Coastguard Worker 
3429*495ae853SAndroid Build Coastguard Worker                 if((1 == i4_no_int_lyr_pred) || (0 == i4_base_pred_wt_tbl_flag))
3430*495ae853SAndroid Build Coastguard Worker                 {
3431*495ae853SAndroid Build Coastguard Worker                     ret = ih264d_parse_pred_weight_table(ps_slice_prms, ps_bitstrm);
3432*495ae853SAndroid Build Coastguard Worker                     if(ret != OK) return ret;
3433*495ae853SAndroid Build Coastguard Worker                 }
3434*495ae853SAndroid Build Coastguard Worker             }
3435*495ae853SAndroid Build Coastguard Worker             else
3436*495ae853SAndroid Build Coastguard Worker             {
3437*495ae853SAndroid Build Coastguard Worker                 ret = ih264d_parse_pred_weight_table(ps_slice_prms, ps_bitstrm);
3438*495ae853SAndroid Build Coastguard Worker                 if(ret != OK) return ret;
3439*495ae853SAndroid Build Coastguard Worker             }
3440*495ae853SAndroid Build Coastguard Worker         }
3441*495ae853SAndroid Build Coastguard Worker 
3442*495ae853SAndroid Build Coastguard Worker         /*-----------------------------------------------------------------------*/
3443*495ae853SAndroid Build Coastguard Worker         /*------------------------- ref pic marking -----------------------------*/
3444*495ae853SAndroid Build Coastguard Worker         /*-----------------------------------------------------------------------*/
3445*495ae853SAndroid Build Coastguard Worker         if(0 != i4_nal_ref_idc)
3446*495ae853SAndroid Build Coastguard Worker         {
3447*495ae853SAndroid Build Coastguard Worker             dec_struct_t *ps_dec;
3448*495ae853SAndroid Build Coastguard Worker             svc_dec_lyr_struct_t *ps_svc_lyr_dec;
3449*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_store_ref_base_pic;
3450*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr;
3451*495ae853SAndroid Build Coastguard Worker             ps_dec = &ps_svc_lyr_dec->s_dec;
3452*495ae853SAndroid Build Coastguard Worker             {
3453*495ae853SAndroid Build Coastguard Worker                 dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
3454*495ae853SAndroid Build Coastguard Worker 
3455*495ae853SAndroid Build Coastguard Worker                 ps_dec->u1_nal_unit_type = i4_nal_unit_type;
3456*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag = i4_idr_pic_flag;
3457*495ae853SAndroid Build Coastguard Worker                 ps_dec->ps_cur_sps = ps_sps;
3458*495ae853SAndroid Build Coastguard Worker                 ps_dec->ps_cur_pps = ps_pps;
3459*495ae853SAndroid Build Coastguard Worker                 ps_pps->ps_sps = ps_sps;
3460*495ae853SAndroid Build Coastguard Worker 
3461*495ae853SAndroid Build Coastguard Worker                 if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
3462*495ae853SAndroid Build Coastguard Worker                     ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
3463*495ae853SAndroid Build Coastguard Worker 
3464*495ae853SAndroid Build Coastguard Worker                 i_temp = ih264d_read_mmco_commands(ps_dec);
3465*495ae853SAndroid Build Coastguard Worker                 ps_pps->ps_sps = ps_sps_tmp;
3466*495ae853SAndroid Build Coastguard Worker                 ps_dec->u1_nal_unit_type = i4_nal_unit_type;
3467*495ae853SAndroid Build Coastguard Worker                 if(i_temp < 0)
3468*495ae853SAndroid Build Coastguard Worker                 {
3469*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
3470*495ae853SAndroid Build Coastguard Worker                 }
3471*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_bitoffset = i_temp;
3472*495ae853SAndroid Build Coastguard Worker             }
3473*495ae853SAndroid Build Coastguard Worker 
3474*495ae853SAndroid Build Coastguard Worker             if(0 == ps_subset_sps->s_sps_svc_ext.u1_slice_header_restriction_flag)
3475*495ae853SAndroid Build Coastguard Worker             {
3476*495ae853SAndroid Build Coastguard Worker                 /* store_ref_base_pic_flag */
3477*495ae853SAndroid Build Coastguard Worker                 u1_store_ref_base_pic = ih264d_get_bit_h264(ps_bitstrm);
3478*495ae853SAndroid Build Coastguard Worker                 if(0 != u1_store_ref_base_pic)
3479*495ae853SAndroid Build Coastguard Worker                 {
3480*495ae853SAndroid Build Coastguard Worker                     return ERROR_INV_SLICE_HDR_T;
3481*495ae853SAndroid Build Coastguard Worker                 }
3482*495ae853SAndroid Build Coastguard Worker 
3483*495ae853SAndroid Build Coastguard Worker                 if(((1 == i4_use_ref_base) || (1 == u1_store_ref_base_pic)) &&
3484*495ae853SAndroid Build Coastguard Worker                    (SVCD_FALSE == i4_idr_pic_flag))
3485*495ae853SAndroid Build Coastguard Worker                 {
3486*495ae853SAndroid Build Coastguard Worker                     i_temp = isvcd_dec_ref_base_pic_marking(
3487*495ae853SAndroid Build Coastguard Worker                         &ps_svc_lyr_dec->s_svc_slice_params.s_ref_base_pic_marking_svc_ext,
3488*495ae853SAndroid Build Coastguard Worker                         ps_bitstrm);
3489*495ae853SAndroid Build Coastguard Worker                     if(i_temp != OK)
3490*495ae853SAndroid Build Coastguard Worker                     {
3491*495ae853SAndroid Build Coastguard Worker                         return i_temp;
3492*495ae853SAndroid Build Coastguard Worker                     }
3493*495ae853SAndroid Build Coastguard Worker                 }
3494*495ae853SAndroid Build Coastguard Worker                 /******* End of if (SVC_VCL_NAL == i4_nal_unit_type) *********/
3495*495ae853SAndroid Build Coastguard Worker             }
3496*495ae853SAndroid Build Coastguard Worker             /******** End of if(0 != i4_nal_ref_idc) *************************/
3497*495ae853SAndroid Build Coastguard Worker         }
3498*495ae853SAndroid Build Coastguard Worker         /************* End of if(0 == i4_quality_id) *************************/
3499*495ae853SAndroid Build Coastguard Worker     }
3500*495ae853SAndroid Build Coastguard Worker 
3501*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3502*495ae853SAndroid Build Coastguard Worker     /*--------------------------- cabac int idc -----------------------------*/
3503*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3504*495ae853SAndroid Build Coastguard Worker     if((ps_pps->u1_entropy_coding_mode == CABAC) && (I_SLICE != ps_slice_prms->u1_slice_type))
3505*495ae853SAndroid Build Coastguard Worker     {
3506*495ae853SAndroid Build Coastguard Worker         ps_slice_prms->u1_cabac_init_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3507*495ae853SAndroid Build Coastguard Worker         if(ps_slice_prms->u1_cabac_init_idc > MAX_CABAC_INIT_IDC)
3508*495ae853SAndroid Build Coastguard Worker         {
3509*495ae853SAndroid Build Coastguard Worker             return ERROR_INV_SLICE_HDR_T;
3510*495ae853SAndroid Build Coastguard Worker         }
3511*495ae853SAndroid Build Coastguard Worker     }
3512*495ae853SAndroid Build Coastguard Worker 
3513*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3514*495ae853SAndroid Build Coastguard Worker     /*--------------------------- slice qp delta ----------------------------*/
3515*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3516*495ae853SAndroid Build Coastguard Worker     {
3517*495ae853SAndroid Build Coastguard Worker         WORD8 i1_slice_qp_delta;
3518*495ae853SAndroid Build Coastguard Worker         i1_slice_qp_delta = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3519*495ae853SAndroid Build Coastguard Worker         i1_slice_qp_delta += ps_pps->u1_pic_init_qp;
3520*495ae853SAndroid Build Coastguard Worker         if((i1_slice_qp_delta < MIN_H264_QP) || (i1_slice_qp_delta > MAX_H264_QP))
3521*495ae853SAndroid Build Coastguard Worker         {
3522*495ae853SAndroid Build Coastguard Worker             return ERROR_INV_RANGE_QP_T;
3523*495ae853SAndroid Build Coastguard Worker         }
3524*495ae853SAndroid Build Coastguard Worker         ps_slice_prms->u1_slice_qp = (UWORD8) i1_slice_qp_delta;
3525*495ae853SAndroid Build Coastguard Worker     }
3526*495ae853SAndroid Build Coastguard Worker 
3527*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3528*495ae853SAndroid Build Coastguard Worker     /*--------------------------- disable dblk filter idc -------------------*/
3529*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3530*495ae853SAndroid Build Coastguard Worker     /* Set to default value */
3531*495ae853SAndroid Build Coastguard Worker 
3532*495ae853SAndroid Build Coastguard Worker     ps_slice_prms->u1_disable_dblk_filter_idc = 0;
3533*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == ps_pps->u1_deblocking_filter_parameters_present_flag)
3534*495ae853SAndroid Build Coastguard Worker     {
3535*495ae853SAndroid Build Coastguard Worker         ps_slice_prms->u1_disable_dblk_filter_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3536*495ae853SAndroid Build Coastguard Worker 
3537*495ae853SAndroid Build Coastguard Worker         if(ps_slice_prms->u1_disable_dblk_filter_idc > SLICE_BOUNDARY_DBLK_DISABLED)
3538*495ae853SAndroid Build Coastguard Worker         {
3539*495ae853SAndroid Build Coastguard Worker             return ERROR_INV_SLICE_HDR_T;
3540*495ae853SAndroid Build Coastguard Worker         }
3541*495ae853SAndroid Build Coastguard Worker         /*-------------------------------------------------------------------*/
3542*495ae853SAndroid Build Coastguard Worker         /*--------------------------- slice_alpha_c0_offset_div2 ------------*/
3543*495ae853SAndroid Build Coastguard Worker         /*--------------------------- slice_beta_offset_div2 ----------------*/
3544*495ae853SAndroid Build Coastguard Worker         /*-------------------------------------------------------------------*/
3545*495ae853SAndroid Build Coastguard Worker         if(1 != ps_slice_prms->u1_disable_dblk_filter_idc)
3546*495ae853SAndroid Build Coastguard Worker         {
3547*495ae853SAndroid Build Coastguard Worker             /* slice_alpha_c0_offset_div2 */
3548*495ae853SAndroid Build Coastguard Worker             ps_slice_prms->i1_slice_alpha_c0_offset = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3549*495ae853SAndroid Build Coastguard Worker             if((MIN_DBLK_FIL_OFF > ps_slice_prms->i1_slice_alpha_c0_offset) ||
3550*495ae853SAndroid Build Coastguard Worker                (ps_slice_prms->i1_slice_alpha_c0_offset > MAX_DBLK_FIL_OFF))
3551*495ae853SAndroid Build Coastguard Worker             {
3552*495ae853SAndroid Build Coastguard Worker                 return ERROR_INV_SLICE_HDR_T;
3553*495ae853SAndroid Build Coastguard Worker             }
3554*495ae853SAndroid Build Coastguard Worker             ps_slice_prms->i1_slice_beta_offset = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3555*495ae853SAndroid Build Coastguard Worker             if((MIN_DBLK_FIL_OFF > ps_slice_prms->i1_slice_beta_offset) ||
3556*495ae853SAndroid Build Coastguard Worker                (ps_slice_prms->i1_slice_beta_offset > MAX_DBLK_FIL_OFF))
3557*495ae853SAndroid Build Coastguard Worker             {
3558*495ae853SAndroid Build Coastguard Worker                 return ERROR_INV_SLICE_HDR_T;
3559*495ae853SAndroid Build Coastguard Worker             }
3560*495ae853SAndroid Build Coastguard Worker         }
3561*495ae853SAndroid Build Coastguard Worker     }
3562*495ae853SAndroid Build Coastguard Worker 
3563*495ae853SAndroid Build Coastguard Worker     *pi4_ref_dq_id = -1;
3564*495ae853SAndroid Build Coastguard Worker 
3565*495ae853SAndroid Build Coastguard Worker     if((0 == i4_no_int_lyr_pred) && (0 == i4_quality_id))
3566*495ae853SAndroid Build Coastguard Worker     {
3567*495ae853SAndroid Build Coastguard Worker         WORD32 i4_inter_lyr_dblk_idc;
3568*495ae853SAndroid Build Coastguard Worker         WORD32 i4_inter_lyr_alpha_c0_offset;
3569*495ae853SAndroid Build Coastguard Worker         WORD32 i4_inter_lyr_beta_offset;
3570*495ae853SAndroid Build Coastguard Worker 
3571*495ae853SAndroid Build Coastguard Worker         /*-------------------------------------------------------------------*/
3572*495ae853SAndroid Build Coastguard Worker         /*--------------------------- ref_layer_dq_id -----------------------*/
3573*495ae853SAndroid Build Coastguard Worker         /*-------------------------------------------------------------------*/
3574*495ae853SAndroid Build Coastguard Worker         *pi4_ref_dq_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3575*495ae853SAndroid Build Coastguard Worker 
3576*495ae853SAndroid Build Coastguard Worker         if(*pi4_ref_dq_id > MAX_REF_DEP_ID)
3577*495ae853SAndroid Build Coastguard Worker         {
3578*495ae853SAndroid Build Coastguard Worker             return ERROR_INV_SLICE_HDR_T;
3579*495ae853SAndroid Build Coastguard Worker         }
3580*495ae853SAndroid Build Coastguard Worker         /* ------------------------------------------- */
3581*495ae853SAndroid Build Coastguard Worker         /* ---- Inter layer de-blocking parameters ---- */
3582*495ae853SAndroid Build Coastguard Worker         /* ------------------------------------------- */
3583*495ae853SAndroid Build Coastguard Worker         i4_inter_lyr_dblk_idc = 0;
3584*495ae853SAndroid Build Coastguard Worker         i4_inter_lyr_alpha_c0_offset = 0;
3585*495ae853SAndroid Build Coastguard Worker         i4_inter_lyr_beta_offset = 0;
3586*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE ==
3587*495ae853SAndroid Build Coastguard Worker            ps_subset_sps->s_sps_svc_ext.u1_inter_layer_deblocking_filter_control_present_flag)
3588*495ae853SAndroid Build Coastguard Worker         {
3589*495ae853SAndroid Build Coastguard Worker             i4_inter_lyr_dblk_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3590*495ae853SAndroid Build Coastguard Worker 
3591*495ae853SAndroid Build Coastguard Worker             if(i4_inter_lyr_dblk_idc > 6)
3592*495ae853SAndroid Build Coastguard Worker             {
3593*495ae853SAndroid Build Coastguard Worker                 return ERROR_INV_SLICE_HDR_T;
3594*495ae853SAndroid Build Coastguard Worker             }
3595*495ae853SAndroid Build Coastguard Worker             if(1 != i4_inter_lyr_dblk_idc)
3596*495ae853SAndroid Build Coastguard Worker             {
3597*495ae853SAndroid Build Coastguard Worker                 /* Alpha Offset */
3598*495ae853SAndroid Build Coastguard Worker                 i4_inter_lyr_alpha_c0_offset = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3599*495ae853SAndroid Build Coastguard Worker                 if(i4_inter_lyr_alpha_c0_offset > 6 || i4_inter_lyr_alpha_c0_offset < -6)
3600*495ae853SAndroid Build Coastguard Worker                 {
3601*495ae853SAndroid Build Coastguard Worker                     return ERROR_INV_SLICE_HDR_T;
3602*495ae853SAndroid Build Coastguard Worker                 }
3603*495ae853SAndroid Build Coastguard Worker                 i4_inter_lyr_alpha_c0_offset <<= 1;
3604*495ae853SAndroid Build Coastguard Worker 
3605*495ae853SAndroid Build Coastguard Worker                 /* Beta Offset */
3606*495ae853SAndroid Build Coastguard Worker                 i4_inter_lyr_beta_offset = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3607*495ae853SAndroid Build Coastguard Worker                 if(i4_inter_lyr_beta_offset > 6 || i4_inter_lyr_beta_offset < -6)
3608*495ae853SAndroid Build Coastguard Worker                 {
3609*495ae853SAndroid Build Coastguard Worker                     return ERROR_INV_SLICE_HDR_T;
3610*495ae853SAndroid Build Coastguard Worker                 }
3611*495ae853SAndroid Build Coastguard Worker                 i4_inter_lyr_beta_offset <<= 1;
3612*495ae853SAndroid Build Coastguard Worker             }
3613*495ae853SAndroid Build Coastguard Worker         }
3614*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->i4_inter_lyr_dblk_idc = i4_inter_lyr_dblk_idc;
3615*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->i4_inter_lyr_beta_offset = i4_inter_lyr_beta_offset;
3616*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->i4_inter_lyr_alpha_c0_offset = i4_inter_lyr_alpha_c0_offset;
3617*495ae853SAndroid Build Coastguard Worker     }
3618*495ae853SAndroid Build Coastguard Worker 
3619*495ae853SAndroid Build Coastguard Worker     return (0);
3620*495ae853SAndroid Build Coastguard Worker }
3621*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3622*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3623*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_ref_lyr_dqid                                   */
3624*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3625*495ae853SAndroid Build Coastguard Worker /*  Description   : Parses the slice header till ref lyr dqid.               */
3626*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3627*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3628*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. vcl node                                              */
3629*495ae853SAndroid Build Coastguard Worker /*                  2. sequence prms set base buffer pointer                 */
3630*495ae853SAndroid Build Coastguard Worker /*                  3. picture prms set base buffer pointer                  */
3631*495ae853SAndroid Build Coastguard Worker /*                  4. Target layer flag                                     */
3632*495ae853SAndroid Build Coastguard Worker /*                  5. DPB command context structure                         */
3633*495ae853SAndroid Build Coastguard Worker /*                  6. Reference layer DQID                                  */
3634*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
3635*495ae853SAndroid Build Coastguard Worker /*  Processing    : 1. Parses the slice header till ref lyr DQID             */
3636*495ae853SAndroid Build Coastguard Worker /*                  2. If current layer is target layer then it calculates   */
3637*495ae853SAndroid Build Coastguard Worker /*                     poc and gaps in frame number                          */
3638*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3639*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Updates 1) ref dqid variable 2) dpb command context      */
3640*495ae853SAndroid Build Coastguard Worker /*  Returns       : status                                                   */
3641*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3642*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
3643*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3644*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3645*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3646*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3647*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           Draft                                */
3648*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_ref_lyr_dqid(vcl_node_t * ps_vcl_node,dec_seq_params_t * ps_sps,dec_pic_params_t * ps_pps,WORD32 * pi4_ref_lyr_dqid,WORD32 i4_prev_au_dqid,WORD32 * pi4_err_code,svc_dec_ctxt_t * ps_svcd_ctxt)3649*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_ref_lyr_dqid(vcl_node_t *ps_vcl_node, dec_seq_params_t *ps_sps,
3650*495ae853SAndroid Build Coastguard Worker                               dec_pic_params_t *ps_pps, WORD32 *pi4_ref_lyr_dqid,
3651*495ae853SAndroid Build Coastguard Worker                               WORD32 i4_prev_au_dqid, WORD32 *pi4_err_code,
3652*495ae853SAndroid Build Coastguard Worker                               svc_dec_ctxt_t *ps_svcd_ctxt)
3653*495ae853SAndroid Build Coastguard Worker {
3654*495ae853SAndroid Build Coastguard Worker     WORD32 i4_status;
3655*495ae853SAndroid Build Coastguard Worker     WORD32 ai4_ref_dq_id[2] = {0};
3656*495ae853SAndroid Build Coastguard Worker     WORD32 i4_num_slc_dec;
3657*495ae853SAndroid Build Coastguard Worker 
3658*495ae853SAndroid Build Coastguard Worker     /* local structures */
3659*495ae853SAndroid Build Coastguard Worker     dec_slice_params_t s_slice_prms = {0};
3660*495ae853SAndroid Build Coastguard Worker 
3661*495ae853SAndroid Build Coastguard Worker     /* vcl buffer */
3662*495ae853SAndroid Build Coastguard Worker     vcl_buf_hdr_t *ps_vcl_buf;
3663*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
3664*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr;
3665*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_prev_au_dqid);
3666*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
3667*495ae853SAndroid Build Coastguard Worker     /* Sanity checks */
3668*495ae853SAndroid Build Coastguard Worker     if((NULL == ps_vcl_node) || (NULL == ps_sps) || (NULL == ps_pps) || (NULL == pi4_ref_lyr_dqid))
3669*495ae853SAndroid Build Coastguard Worker     {
3670*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
3671*495ae853SAndroid Build Coastguard Worker     }
3672*495ae853SAndroid Build Coastguard Worker 
3673*495ae853SAndroid Build Coastguard Worker     i4_num_slc_dec = 0;
3674*495ae853SAndroid Build Coastguard Worker     ps_vcl_buf = ps_vcl_node->ps_first_vcl_nal;
3675*495ae853SAndroid Build Coastguard Worker     i4_status = NOT_OK;
3676*495ae853SAndroid Build Coastguard Worker 
3677*495ae853SAndroid Build Coastguard Worker     while(NULL != ps_vcl_buf)
3678*495ae853SAndroid Build Coastguard Worker     {
3679*495ae853SAndroid Build Coastguard Worker         WORD32 i4_error;
3680*495ae853SAndroid Build Coastguard Worker 
3681*495ae853SAndroid Build Coastguard Worker         /* Fill the stream context structure */
3682*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_bitstrm->u4_ofst = 0;
3683*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_bitstrm->pu4_buffer =
3684*495ae853SAndroid Build Coastguard Worker             (UWORD32 *) ((UWORD8 *) ps_vcl_buf + ps_vcl_buf->i4_buf_offset +
3685*495ae853SAndroid Build Coastguard Worker                          ps_vcl_buf->i4_slice_offset);
3686*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_bitstrm->u4_max_ofst = ps_vcl_buf->u4_max_bits;
3687*495ae853SAndroid Build Coastguard Worker 
3688*495ae853SAndroid Build Coastguard Worker         /* call the function which decodes the slice header */
3689*495ae853SAndroid Build Coastguard Worker         i4_error = isvcd_parse_slice_hdr_refdq_id(ps_vcl_node, &s_slice_prms, ps_dec->ps_bitstrm,
3690*495ae853SAndroid Build Coastguard Worker                                                   &ai4_ref_dq_id[i4_num_slc_dec], ps_sps, ps_pps,
3691*495ae853SAndroid Build Coastguard Worker                                                   ps_vcl_buf->i4_no_int_lyr_pred, ps_svcd_ctxt);
3692*495ae853SAndroid Build Coastguard Worker 
3693*495ae853SAndroid Build Coastguard Worker         /* store the first error encountered */
3694*495ae853SAndroid Build Coastguard Worker         if(0 == *pi4_err_code)
3695*495ae853SAndroid Build Coastguard Worker         {
3696*495ae853SAndroid Build Coastguard Worker             *pi4_err_code = i4_error;
3697*495ae853SAndroid Build Coastguard Worker         }
3698*495ae853SAndroid Build Coastguard Worker         if(i4_error != 0)
3699*495ae853SAndroid Build Coastguard Worker         {
3700*495ae853SAndroid Build Coastguard Worker             /* check on the Error returned */
3701*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
3702*495ae853SAndroid Build Coastguard Worker         }
3703*495ae853SAndroid Build Coastguard Worker 
3704*495ae853SAndroid Build Coastguard Worker         /* set the return status */
3705*495ae853SAndroid Build Coastguard Worker         i4_status = OK;
3706*495ae853SAndroid Build Coastguard Worker         break;
3707*495ae853SAndroid Build Coastguard Worker 
3708*495ae853SAndroid Build Coastguard Worker         /* go to the next slice header */
3709*495ae853SAndroid Build Coastguard Worker         ps_vcl_buf = ps_vcl_buf->ps_next;
3710*495ae853SAndroid Build Coastguard Worker     }
3711*495ae853SAndroid Build Coastguard Worker 
3712*495ae853SAndroid Build Coastguard Worker     /* set the appropriate reference dqid of the first slice */
3713*495ae853SAndroid Build Coastguard Worker     *pi4_ref_lyr_dqid = ai4_ref_dq_id[0];
3714*495ae853SAndroid Build Coastguard Worker 
3715*495ae853SAndroid Build Coastguard Worker     return (i4_status);
3716*495ae853SAndroid Build Coastguard Worker }
3717*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3718*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3719*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_conceal_node_params                                */
3720*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3721*495ae853SAndroid Build Coastguard Worker /*  Description   : This function detects the resolution change              */
3722*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3723*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3724*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. Pointer to Current SPS                                */
3725*495ae853SAndroid Build Coastguard Worker /*                  2. Pointer to prevoius SPS                               */
3726*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
3727*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
3728*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3729*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
3730*495ae853SAndroid Build Coastguard Worker /*  Returns       : SVCD_TRUE if different resolution else SVCD_FALSE        */
3731*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3732*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3733*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3734*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3735*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3736*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3737*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijayakumar     Draft                                */
3738*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3739*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_conceal_node_params(vcl_nal_t * ps_vcl_nal,prev_au_prms_t * ps_prev_au_prms)3740*495ae853SAndroid Build Coastguard Worker void isvcd_conceal_node_params(vcl_nal_t *ps_vcl_nal, prev_au_prms_t *ps_prev_au_prms)
3741*495ae853SAndroid Build Coastguard Worker {
3742*495ae853SAndroid Build Coastguard Worker     vcl_node_t *ps_node;
3743*495ae853SAndroid Build Coastguard Worker     WORD32 i4_conceal_lyrs;
3744*495ae853SAndroid Build Coastguard Worker     WORD32 i4_no_gaps_flag;
3745*495ae853SAndroid Build Coastguard Worker 
3746*495ae853SAndroid Build Coastguard Worker     /* get the bottom node */
3747*495ae853SAndroid Build Coastguard Worker     ps_node = ps_vcl_nal->ps_bot_node;
3748*495ae853SAndroid Build Coastguard Worker     i4_conceal_lyrs = SVCD_FALSE;
3749*495ae853SAndroid Build Coastguard Worker     i4_no_gaps_flag = SVCD_FALSE;
3750*495ae853SAndroid Build Coastguard Worker 
3751*495ae853SAndroid Build Coastguard Worker     /* loop over all nodes present in the current AU */
3752*495ae853SAndroid Build Coastguard Worker     while(NULL != ps_node)
3753*495ae853SAndroid Build Coastguard Worker     {
3754*495ae853SAndroid Build Coastguard Worker         WORD32 i4_dep_id = 0;
3755*495ae853SAndroid Build Coastguard Worker         WORD32 i4_qua_id = 0;
3756*495ae853SAndroid Build Coastguard Worker         UWORD16 u2_frm_num_dep = 0;
3757*495ae853SAndroid Build Coastguard Worker         WORD32 i4_idr_pic_flag = 0;
3758*495ae853SAndroid Build Coastguard Worker         WORD32 i4_idr_pic_num = 0;
3759*495ae853SAndroid Build Coastguard Worker         WORD32 i4_nal_ref_idc = 0;
3760*495ae853SAndroid Build Coastguard Worker         WORD32 i4_poc_syntax = 0;
3761*495ae853SAndroid Build Coastguard Worker         WORD32 i4_qua_zero_lyr_sts = 0;
3762*495ae853SAndroid Build Coastguard Worker 
3763*495ae853SAndroid Build Coastguard Worker         i4_dep_id = ps_node->i4_dependency_id;
3764*495ae853SAndroid Build Coastguard Worker         i4_qua_id = ps_node->i4_quality_id;
3765*495ae853SAndroid Build Coastguard Worker 
3766*495ae853SAndroid Build Coastguard Worker         /* reset the quality 0 layer updated status */
3767*495ae853SAndroid Build Coastguard Worker         if(0 == i4_qua_id)
3768*495ae853SAndroid Build Coastguard Worker         {
3769*495ae853SAndroid Build Coastguard Worker             i4_qua_zero_lyr_sts = SVCD_FALSE;
3770*495ae853SAndroid Build Coastguard Worker         }
3771*495ae853SAndroid Build Coastguard Worker 
3772*495ae853SAndroid Build Coastguard Worker         /* process the quality id 0 layers */
3773*495ae853SAndroid Build Coastguard Worker         if((0 == i4_qua_id) && (NULL != ps_node->ps_first_vcl_nal))
3774*495ae853SAndroid Build Coastguard Worker         {
3775*495ae853SAndroid Build Coastguard Worker             /* if current and previous are reference pictures */
3776*495ae853SAndroid Build Coastguard Worker             if((0 != ps_prev_au_prms[i4_dep_id].i4_nal_ref_id) && (0 != ps_node->i4_nal_ref_idc))
3777*495ae853SAndroid Build Coastguard Worker             {
3778*495ae853SAndroid Build Coastguard Worker                 if(ps_prev_au_prms[i4_dep_id].u2_frm_num == ps_node->u2_frm_num)
3779*495ae853SAndroid Build Coastguard Worker                 {
3780*495ae853SAndroid Build Coastguard Worker                     /* frame number is concealed */
3781*495ae853SAndroid Build Coastguard Worker                     ps_node->u2_frm_num++;
3782*495ae853SAndroid Build Coastguard Worker                     i4_conceal_lyrs = SVCD_TRUE;
3783*495ae853SAndroid Build Coastguard Worker                 }
3784*495ae853SAndroid Build Coastguard Worker                 else if((SVCD_TRUE == i4_conceal_lyrs) || (SVCD_TRUE == i4_no_gaps_flag))
3785*495ae853SAndroid Build Coastguard Worker                 {
3786*495ae853SAndroid Build Coastguard Worker                     /* if the current au frm_num is less than prev */
3787*495ae853SAndroid Build Coastguard Worker                     /* or the difference is greater than 1         */
3788*495ae853SAndroid Build Coastguard Worker                     if((ps_prev_au_prms[i4_dep_id].u2_frm_num > ps_node->u2_frm_num) ||
3789*495ae853SAndroid Build Coastguard Worker                        ((ps_node->u2_frm_num - ps_prev_au_prms[i4_dep_id].u2_frm_num) > 1))
3790*495ae853SAndroid Build Coastguard Worker                     {
3791*495ae853SAndroid Build Coastguard Worker                         /* frame number is concealed */
3792*495ae853SAndroid Build Coastguard Worker                         ps_node->u2_frm_num = ps_prev_au_prms[i4_dep_id].u2_frm_num + 1;
3793*495ae853SAndroid Build Coastguard Worker                     }
3794*495ae853SAndroid Build Coastguard Worker                 }
3795*495ae853SAndroid Build Coastguard Worker 
3796*495ae853SAndroid Build Coastguard Worker                 /* set the no gaps flag */
3797*495ae853SAndroid Build Coastguard Worker                 if(1 == (ps_node->u2_frm_num - ps_prev_au_prms[i4_dep_id].u2_frm_num))
3798*495ae853SAndroid Build Coastguard Worker                 {
3799*495ae853SAndroid Build Coastguard Worker                     i4_no_gaps_flag = SVCD_TRUE;
3800*495ae853SAndroid Build Coastguard Worker                 }
3801*495ae853SAndroid Build Coastguard Worker             }
3802*495ae853SAndroid Build Coastguard Worker 
3803*495ae853SAndroid Build Coastguard Worker             /* store the final frame number */
3804*495ae853SAndroid Build Coastguard Worker             u2_frm_num_dep = ps_node->u2_frm_num;
3805*495ae853SAndroid Build Coastguard Worker             i4_idr_pic_flag = ps_node->i4_idr_pic_flag;
3806*495ae853SAndroid Build Coastguard Worker             i4_idr_pic_num = ps_node->i4_idr_pic_num;
3807*495ae853SAndroid Build Coastguard Worker             i4_nal_ref_idc = ps_node->i4_nal_ref_idc;
3808*495ae853SAndroid Build Coastguard Worker             i4_poc_syntax = ps_node->i4_poc_syntax;
3809*495ae853SAndroid Build Coastguard Worker             i4_qua_zero_lyr_sts = SVCD_TRUE;
3810*495ae853SAndroid Build Coastguard Worker         }
3811*495ae853SAndroid Build Coastguard Worker         else
3812*495ae853SAndroid Build Coastguard Worker         {
3813*495ae853SAndroid Build Coastguard Worker             if(SVCD_TRUE == i4_qua_zero_lyr_sts)
3814*495ae853SAndroid Build Coastguard Worker             {
3815*495ae853SAndroid Build Coastguard Worker                 /* for higher quality layers store the same value */
3816*495ae853SAndroid Build Coastguard Worker                 /* present in the quality id 0 layer              */
3817*495ae853SAndroid Build Coastguard Worker                 ps_node->u2_frm_num = u2_frm_num_dep;
3818*495ae853SAndroid Build Coastguard Worker                 ps_node->i4_idr_pic_flag = i4_idr_pic_flag;
3819*495ae853SAndroid Build Coastguard Worker                 ps_node->i4_idr_pic_num = i4_idr_pic_num;
3820*495ae853SAndroid Build Coastguard Worker                 ps_node->i4_nal_ref_idc = i4_nal_ref_idc;
3821*495ae853SAndroid Build Coastguard Worker                 ps_node->i4_poc_syntax = i4_poc_syntax;
3822*495ae853SAndroid Build Coastguard Worker             }
3823*495ae853SAndroid Build Coastguard Worker         }
3824*495ae853SAndroid Build Coastguard Worker 
3825*495ae853SAndroid Build Coastguard Worker         /* get the upper node pointer */
3826*495ae853SAndroid Build Coastguard Worker         ps_node = ps_node->ps_top_node;
3827*495ae853SAndroid Build Coastguard Worker     }
3828*495ae853SAndroid Build Coastguard Worker }
3829*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3830*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3831*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_refine_dep_list                                    */
3832*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3833*495ae853SAndroid Build Coastguard Worker /*  Description   : Refines the DQID list based on reference layer DQID      */
3834*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3835*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3836*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. vcl nal structure (input and output)                  */
3837*495ae853SAndroid Build Coastguard Worker /*                  2. sps prms base buffer pointer                          */
3838*495ae853SAndroid Build Coastguard Worker /*                  3. pps prms base buffer pointer                          */
3839*495ae853SAndroid Build Coastguard Worker /*                  4. pointer to array in which the dep id should be stored */
3840*495ae853SAndroid Build Coastguard Worker /*                  5. pointer to array having prev AU ref dq id             */
3841*495ae853SAndroid Build Coastguard Worker /*                  6. pointer to init params structure                      */
3842*495ae853SAndroid Build Coastguard Worker /*                  7. pointer to store the Error code                       */
3843*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
3844*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
3845*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3846*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Updates the vcl nal structure                            */
3847*495ae853SAndroid Build Coastguard Worker /*                  Also determines frm_num and poc                          */
3848*495ae853SAndroid Build Coastguard Worker /*  Returns       : status                                                   */
3849*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3850*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
3851*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3852*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3853*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3854*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3855*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           Draft                                */
3856*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_refine_dep_list(void * pv_out_vcl_ctxt,dec_seq_params_t * ps_sps,dec_svc_seq_params_t * ps_subset_sps,dec_pic_params_t * ps_pps,WORD32 * pi4_dep_id_map,prev_au_prms_t * ps_prev_au_prms,prev_au_sps_pps_t * ps_pps_sps_prev,WORD32 * pi4_err_code,svc_dec_ctxt_t * ps_svcd_ctxt)3857*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_refine_dep_list(void *pv_out_vcl_ctxt, dec_seq_params_t *ps_sps,
3858*495ae853SAndroid Build Coastguard Worker                              dec_svc_seq_params_t *ps_subset_sps, dec_pic_params_t *ps_pps,
3859*495ae853SAndroid Build Coastguard Worker                              WORD32 *pi4_dep_id_map, prev_au_prms_t *ps_prev_au_prms,
3860*495ae853SAndroid Build Coastguard Worker                              prev_au_sps_pps_t *ps_pps_sps_prev, WORD32 *pi4_err_code,
3861*495ae853SAndroid Build Coastguard Worker                              svc_dec_ctxt_t *ps_svcd_ctxt)
3862*495ae853SAndroid Build Coastguard Worker {
3863*495ae853SAndroid Build Coastguard Worker     vcl_nal_t *ps_vcl_nal;
3864*495ae853SAndroid Build Coastguard Worker     vcl_node_t *ps_vcl_node;
3865*495ae853SAndroid Build Coastguard Worker     WORD32 i4_idr_pic_flag;
3866*495ae853SAndroid Build Coastguard Worker     WORD32 i4_nal_ref_idc;
3867*495ae853SAndroid Build Coastguard Worker     WORD32 i4_idr_pic_num;
3868*495ae853SAndroid Build Coastguard Worker     WORD32 i4_num_res_lyrs_bup;
3869*495ae853SAndroid Build Coastguard Worker     WORD32 i4_restore_prms_flag;
3870*495ae853SAndroid Build Coastguard Worker     vcl_node_t *ps_node_bup;
3871*495ae853SAndroid Build Coastguard Worker     WORD32 ai4_dep_id[MAX_NUM_RES_LYRS] = {0};
3872*495ae853SAndroid Build Coastguard Worker 
3873*495ae853SAndroid Build Coastguard Worker     /* used for checking the init prms */
3874*495ae853SAndroid Build Coastguard Worker     dec_seq_params_t *ps_sps_tgt_minus1_lyr = NULL;
3875*495ae853SAndroid Build Coastguard Worker     dec_seq_params_t *ps_sps_tgt_minus2_lyr = NULL;
3876*495ae853SAndroid Build Coastguard Worker     UNUSED(pi4_err_code);
3877*495ae853SAndroid Build Coastguard Worker     /* sanity checks */
3878*495ae853SAndroid Build Coastguard Worker     if((NULL == pv_out_vcl_ctxt) || (NULL == ps_sps) || (NULL == ps_pps))
3879*495ae853SAndroid Build Coastguard Worker     {
3880*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
3881*495ae853SAndroid Build Coastguard Worker     }
3882*495ae853SAndroid Build Coastguard Worker 
3883*495ae853SAndroid Build Coastguard Worker     ps_vcl_nal = (vcl_nal_t *) pv_out_vcl_ctxt;
3884*495ae853SAndroid Build Coastguard Worker 
3885*495ae853SAndroid Build Coastguard Worker     /*  no node is present */
3886*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_vcl_nal->ps_bot_node)
3887*495ae853SAndroid Build Coastguard Worker     {
3888*495ae853SAndroid Build Coastguard Worker         return (NOT_OK);
3889*495ae853SAndroid Build Coastguard Worker     }
3890*495ae853SAndroid Build Coastguard Worker 
3891*495ae853SAndroid Build Coastguard Worker     /* set the single layer flag if top node and bottom node are same */
3892*495ae853SAndroid Build Coastguard Worker     if((ps_vcl_nal->ps_bot_node == ps_vcl_nal->ps_top_node) &&
3893*495ae853SAndroid Build Coastguard Worker        (0 == ps_vcl_nal->ps_bot_node->i4_dependency_id))
3894*495ae853SAndroid Build Coastguard Worker     {
3895*495ae853SAndroid Build Coastguard Worker     }
3896*495ae853SAndroid Build Coastguard Worker     else
3897*495ae853SAndroid Build Coastguard Worker     {
3898*495ae853SAndroid Build Coastguard Worker         /* call the function which corrects the frame number of each node */
3899*495ae853SAndroid Build Coastguard Worker         /* based on previous access unit frame number                     */
3900*495ae853SAndroid Build Coastguard Worker         isvcd_conceal_node_params(ps_vcl_nal, ps_prev_au_prms);
3901*495ae853SAndroid Build Coastguard Worker     }
3902*495ae853SAndroid Build Coastguard Worker     /* get the top most node */
3903*495ae853SAndroid Build Coastguard Worker     ps_vcl_node = ps_vcl_nal->ps_top_node;
3904*495ae853SAndroid Build Coastguard Worker 
3905*495ae853SAndroid Build Coastguard Worker     /* get the IDR picture flag for top most layer in current AU */
3906*495ae853SAndroid Build Coastguard Worker     /* if not valid then set the value present in the first valid node */
3907*495ae853SAndroid Build Coastguard Worker     {
3908*495ae853SAndroid Build Coastguard Worker         vcl_node_t *ps_node;
3909*495ae853SAndroid Build Coastguard Worker         WORD32 i4_node_present_flag;
3910*495ae853SAndroid Build Coastguard Worker 
3911*495ae853SAndroid Build Coastguard Worker         ps_node = ps_vcl_node;
3912*495ae853SAndroid Build Coastguard Worker         i4_node_present_flag = SVCD_FALSE;
3913*495ae853SAndroid Build Coastguard Worker 
3914*495ae853SAndroid Build Coastguard Worker         /* store default values */
3915*495ae853SAndroid Build Coastguard Worker         i4_idr_pic_flag = SVCD_FALSE;
3916*495ae853SAndroid Build Coastguard Worker         i4_nal_ref_idc = 0;
3917*495ae853SAndroid Build Coastguard Worker         i4_idr_pic_num = 0;
3918*495ae853SAndroid Build Coastguard Worker 
3919*495ae853SAndroid Build Coastguard Worker         /* loop until valid node */
3920*495ae853SAndroid Build Coastguard Worker         while(NULL != ps_node)
3921*495ae853SAndroid Build Coastguard Worker         {
3922*495ae853SAndroid Build Coastguard Worker             if(NULL != ps_node->ps_first_vcl_nal)
3923*495ae853SAndroid Build Coastguard Worker             {
3924*495ae853SAndroid Build Coastguard Worker                 i4_idr_pic_flag = ps_node->i4_idr_pic_flag;
3925*495ae853SAndroid Build Coastguard Worker                 i4_nal_ref_idc = ps_node->i4_nal_ref_idc;
3926*495ae853SAndroid Build Coastguard Worker                 i4_idr_pic_num = ps_node->i4_idr_pic_num;
3927*495ae853SAndroid Build Coastguard Worker                 i4_node_present_flag = SVCD_TRUE;
3928*495ae853SAndroid Build Coastguard Worker                 break;
3929*495ae853SAndroid Build Coastguard Worker             }
3930*495ae853SAndroid Build Coastguard Worker             else if(SVCD_TRUE == ps_node->i4_idr_pic_flag)
3931*495ae853SAndroid Build Coastguard Worker             {
3932*495ae853SAndroid Build Coastguard Worker                 i4_idr_pic_flag = ps_node->i4_idr_pic_flag;
3933*495ae853SAndroid Build Coastguard Worker                 i4_nal_ref_idc = ps_node->i4_nal_ref_idc;
3934*495ae853SAndroid Build Coastguard Worker                 i4_idr_pic_num = ps_node->i4_idr_pic_num;
3935*495ae853SAndroid Build Coastguard Worker                 i4_node_present_flag = SVCD_TRUE;
3936*495ae853SAndroid Build Coastguard Worker                 break;
3937*495ae853SAndroid Build Coastguard Worker             }
3938*495ae853SAndroid Build Coastguard Worker             /* point to next node */
3939*495ae853SAndroid Build Coastguard Worker             ps_node = ps_node->ps_bot_node;
3940*495ae853SAndroid Build Coastguard Worker         }
3941*495ae853SAndroid Build Coastguard Worker 
3942*495ae853SAndroid Build Coastguard Worker         /* alteast one node should be present */
3943*495ae853SAndroid Build Coastguard Worker         if(SVCD_FALSE == i4_node_present_flag)
3944*495ae853SAndroid Build Coastguard Worker         {
3945*495ae853SAndroid Build Coastguard Worker             return (NOT_OK);
3946*495ae853SAndroid Build Coastguard Worker         }
3947*495ae853SAndroid Build Coastguard Worker     }
3948*495ae853SAndroid Build Coastguard Worker 
3949*495ae853SAndroid Build Coastguard Worker     /* initially the access unit is considered to have a single resolution */
3950*495ae853SAndroid Build Coastguard Worker     ai4_dep_id[0] = 0;
3951*495ae853SAndroid Build Coastguard Worker     ps_vcl_nal->i4_num_res_lyrs = 1;
3952*495ae853SAndroid Build Coastguard Worker     i4_restore_prms_flag = SVCD_FALSE;
3953*495ae853SAndroid Build Coastguard Worker 
3954*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3955*495ae853SAndroid Build Coastguard Worker     /* loop until all the nodes are processed                                */
3956*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
3957*495ae853SAndroid Build Coastguard Worker     while(NULL != ps_vcl_node)
3958*495ae853SAndroid Build Coastguard Worker     {
3959*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_lyr_dqid, i4_status;
3960*495ae853SAndroid Build Coastguard Worker         vcl_node_t *ps_bot_vcl_node;
3961*495ae853SAndroid Build Coastguard Worker         WORD32 i4_res_chnge_flag = SVCD_FALSE;
3962*495ae853SAndroid Build Coastguard Worker         WORD32 i4_dep_id, i4_qua_id;
3963*495ae853SAndroid Build Coastguard Worker         WORD32 i4_prev_sps_pps_valid;
3964*495ae853SAndroid Build Coastguard Worker         WORD32 i4_prev_au_prms_valid;
3965*495ae853SAndroid Build Coastguard Worker 
3966*495ae853SAndroid Build Coastguard Worker         /* set the reference layer DQID to -1 */
3967*495ae853SAndroid Build Coastguard Worker         i4_ref_lyr_dqid = -1;
3968*495ae853SAndroid Build Coastguard Worker 
3969*495ae853SAndroid Build Coastguard Worker         /* get the current layer dependency and quality id */
3970*495ae853SAndroid Build Coastguard Worker         i4_dep_id = ps_vcl_node->i4_dependency_id;
3971*495ae853SAndroid Build Coastguard Worker         i4_qua_id = ps_vcl_node->i4_quality_id;
3972*495ae853SAndroid Build Coastguard Worker 
3973*495ae853SAndroid Build Coastguard Worker         /* get the valid status of prev access unit params */
3974*495ae853SAndroid Build Coastguard Worker         i4_prev_au_prms_valid = ps_prev_au_prms[i4_dep_id].i4_updated_sts;
3975*495ae853SAndroid Build Coastguard Worker         i4_prev_sps_pps_valid = ps_pps_sps_prev[(i4_dep_id << 4) + i4_qua_id].i4_updated_sts;
3976*495ae853SAndroid Build Coastguard Worker 
3977*495ae853SAndroid Build Coastguard Worker         /* missing layer handling */
3978*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_vcl_node->ps_first_vcl_nal)
3979*495ae853SAndroid Build Coastguard Worker         {
3980*495ae853SAndroid Build Coastguard Worker             /* store the params appropriately */
3981*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_idr_pic_flag = i4_idr_pic_flag;
3982*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_nal_ref_idc = i4_nal_ref_idc;
3983*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_idr_pic_num = i4_idr_pic_num;
3984*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_num_slices = 0;
3985*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_use_ref_base = 0;
3986*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_temporal_id = 0;
3987*495ae853SAndroid Build Coastguard Worker 
3988*495ae853SAndroid Build Coastguard Worker             if((0 != i4_dep_id) || (0 != i4_qua_id))
3989*495ae853SAndroid Build Coastguard Worker             {
3990*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->i4_nal_unit_type = CODED_SLICE_EXTENSION_NAL;
3991*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->u1_acc_no_int_pred = 0;
3992*495ae853SAndroid Build Coastguard Worker             }
3993*495ae853SAndroid Build Coastguard Worker             else if(SVCD_TRUE == i4_idr_pic_flag)
3994*495ae853SAndroid Build Coastguard Worker             {
3995*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->i4_nal_unit_type = IDR_SLICE_NAL;
3996*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->u1_acc_no_int_pred = 1;
3997*495ae853SAndroid Build Coastguard Worker             }
3998*495ae853SAndroid Build Coastguard Worker             else
3999*495ae853SAndroid Build Coastguard Worker             {
4000*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->i4_nal_unit_type = SLICE_NAL;
4001*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->u1_acc_no_int_pred = 1;
4002*495ae853SAndroid Build Coastguard Worker             }
4003*495ae853SAndroid Build Coastguard Worker 
4004*495ae853SAndroid Build Coastguard Worker             if(SVCD_FALSE == i4_idr_pic_flag)
4005*495ae853SAndroid Build Coastguard Worker             {
4006*495ae853SAndroid Build Coastguard Worker                 /* pick the other params form previous access unit */
4007*495ae853SAndroid Build Coastguard Worker                 if(SVCD_TRUE == i4_prev_sps_pps_valid)
4008*495ae853SAndroid Build Coastguard Worker                 {
4009*495ae853SAndroid Build Coastguard Worker                     ps_vcl_node->u1_pps_id =
4010*495ae853SAndroid Build Coastguard Worker                         ps_pps_sps_prev[(i4_dep_id << 4) + i4_qua_id].u1_pps_id;
4011*495ae853SAndroid Build Coastguard Worker 
4012*495ae853SAndroid Build Coastguard Worker                     ps_vcl_node->u1_sps_id =
4013*495ae853SAndroid Build Coastguard Worker                         ps_pps_sps_prev[(i4_dep_id << 4) + i4_qua_id].u1_sps_id;
4014*495ae853SAndroid Build Coastguard Worker                 }
4015*495ae853SAndroid Build Coastguard Worker 
4016*495ae853SAndroid Build Coastguard Worker                 if(SVCD_TRUE == i4_prev_au_prms_valid)
4017*495ae853SAndroid Build Coastguard Worker                 {
4018*495ae853SAndroid Build Coastguard Worker                     if(0 == ps_vcl_node->i4_nal_ref_idc)
4019*495ae853SAndroid Build Coastguard Worker                     {
4020*495ae853SAndroid Build Coastguard Worker                         ps_vcl_node->u2_frm_num = ps_prev_au_prms[i4_dep_id].u2_frm_num;
4021*495ae853SAndroid Build Coastguard Worker                     }
4022*495ae853SAndroid Build Coastguard Worker                     else
4023*495ae853SAndroid Build Coastguard Worker                     {
4024*495ae853SAndroid Build Coastguard Worker                         ps_vcl_node->u2_frm_num = ps_prev_au_prms[i4_dep_id].u2_frm_num + 1;
4025*495ae853SAndroid Build Coastguard Worker                     }
4026*495ae853SAndroid Build Coastguard Worker                 }
4027*495ae853SAndroid Build Coastguard Worker             }
4028*495ae853SAndroid Build Coastguard Worker         }
4029*495ae853SAndroid Build Coastguard Worker 
4030*495ae853SAndroid Build Coastguard Worker         /* SPS id cannot change unless its an IDR pic */
4031*495ae853SAndroid Build Coastguard Worker         if(SVCD_FALSE == ps_vcl_node->i4_idr_pic_flag)
4032*495ae853SAndroid Build Coastguard Worker         {
4033*495ae853SAndroid Build Coastguard Worker             if(SVCD_TRUE == i4_prev_sps_pps_valid)
4034*495ae853SAndroid Build Coastguard Worker             {
4035*495ae853SAndroid Build Coastguard Worker                 /* store the SPS id of the current layer */
4036*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->u1_sps_id = ps_pps_sps_prev[(i4_dep_id << 4) + i4_qua_id].u1_sps_id;
4037*495ae853SAndroid Build Coastguard Worker             }
4038*495ae853SAndroid Build Coastguard Worker         }
4039*495ae853SAndroid Build Coastguard Worker 
4040*495ae853SAndroid Build Coastguard Worker         /* store the PPS id and SPS id of the current layer */
4041*495ae853SAndroid Build Coastguard Worker         ps_pps_sps_prev[(i4_dep_id << 4) + i4_qua_id].u1_pps_id = ps_vcl_node->u1_pps_id;
4042*495ae853SAndroid Build Coastguard Worker         ps_pps_sps_prev[(i4_dep_id << 4) + i4_qua_id].u1_sps_id = ps_vcl_node->u1_sps_id;
4043*495ae853SAndroid Build Coastguard Worker         ps_pps_sps_prev[(i4_dep_id << 4) + i4_qua_id].i4_updated_sts = SVCD_TRUE;
4044*495ae853SAndroid Build Coastguard Worker 
4045*495ae853SAndroid Build Coastguard Worker         /* handling of no_inter_layer_pred_flag 1 cases */
4046*495ae853SAndroid Build Coastguard Worker         if((1 == ps_vcl_node->u1_acc_no_int_pred) && (NULL != ps_vcl_node->ps_bot_node))
4047*495ae853SAndroid Build Coastguard Worker         {
4048*495ae853SAndroid Build Coastguard Worker             if(SVCD_TRUE == i4_idr_pic_flag)
4049*495ae853SAndroid Build Coastguard Worker             {
4050*495ae853SAndroid Build Coastguard Worker                 /* take a back up of the parameters till the current node. */
4051*495ae853SAndroid Build Coastguard Worker                 /* these parameters will be restored at the end of loop */
4052*495ae853SAndroid Build Coastguard Worker 
4053*495ae853SAndroid Build Coastguard Worker                 if(SVCD_FALSE == i4_restore_prms_flag)
4054*495ae853SAndroid Build Coastguard Worker                 {
4055*495ae853SAndroid Build Coastguard Worker                     /* get the number of resolution detected so far */
4056*495ae853SAndroid Build Coastguard Worker                     i4_num_res_lyrs_bup = ps_vcl_nal->i4_num_res_lyrs;
4057*495ae853SAndroid Build Coastguard Worker 
4058*495ae853SAndroid Build Coastguard Worker                     ps_node_bup = ps_vcl_node;
4059*495ae853SAndroid Build Coastguard Worker 
4060*495ae853SAndroid Build Coastguard Worker                     /* set the restore params flag */
4061*495ae853SAndroid Build Coastguard Worker                     i4_restore_prms_flag = SVCD_TRUE;
4062*495ae853SAndroid Build Coastguard Worker                 }
4063*495ae853SAndroid Build Coastguard Worker             }
4064*495ae853SAndroid Build Coastguard Worker             else
4065*495ae853SAndroid Build Coastguard Worker             {
4066*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->i4_ref_dq_id = -1;
4067*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->i4_res_change_flag = i4_res_chnge_flag;
4068*495ae853SAndroid Build Coastguard Worker 
4069*495ae853SAndroid Build Coastguard Worker                 /* store the reference DQID for current dependency */
4070*495ae853SAndroid Build Coastguard Worker                 ps_prev_au_prms[i4_dep_id].i4_ref_dq_id = -1;
4071*495ae853SAndroid Build Coastguard Worker                 ps_prev_au_prms[i4_dep_id].u2_frm_num = ps_vcl_node->u2_frm_num;
4072*495ae853SAndroid Build Coastguard Worker                 ps_prev_au_prms[i4_dep_id].i4_nal_ref_id = ps_vcl_node->i4_nal_ref_idc;
4073*495ae853SAndroid Build Coastguard Worker 
4074*495ae853SAndroid Build Coastguard Worker                 /* the bottom node is set to NULL */
4075*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->ps_bot_node = NULL;
4076*495ae853SAndroid Build Coastguard Worker                 break;
4077*495ae853SAndroid Build Coastguard Worker             }
4078*495ae853SAndroid Build Coastguard Worker         }
4079*495ae853SAndroid Build Coastguard Worker 
4080*495ae853SAndroid Build Coastguard Worker         /* derive the reference layer DQID for quality id equal to 0 */
4081*495ae853SAndroid Build Coastguard Worker         if(0 == i4_qua_id)
4082*495ae853SAndroid Build Coastguard Worker         {
4083*495ae853SAndroid Build Coastguard Worker             dec_seq_params_t *ps_curr_sps;
4084*495ae853SAndroid Build Coastguard Worker             dec_svc_seq_params_t *ps_curr_subset_sps;
4085*495ae853SAndroid Build Coastguard Worker 
4086*495ae853SAndroid Build Coastguard Worker             /* derive current SPS */
4087*495ae853SAndroid Build Coastguard Worker             ps_curr_sps = ps_sps + ps_vcl_node->u1_sps_id;
4088*495ae853SAndroid Build Coastguard Worker             ps_curr_subset_sps = ps_subset_sps + ps_vcl_node->u1_sps_id;
4089*495ae853SAndroid Build Coastguard Worker 
4090*495ae853SAndroid Build Coastguard Worker             {
4091*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_max_frm_num;
4092*495ae853SAndroid Build Coastguard Worker 
4093*495ae853SAndroid Build Coastguard Worker                 /* get the maximum value of frame number */
4094*495ae853SAndroid Build Coastguard Worker                 i4_max_frm_num = (1 << (ps_curr_sps->u1_bits_in_frm_num + 1));
4095*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->u2_frm_num = ps_vcl_node->u2_frm_num % i4_max_frm_num;
4096*495ae853SAndroid Build Coastguard Worker                 if(SVCD_TRUE == ps_vcl_node->i4_idr_pic_flag)
4097*495ae853SAndroid Build Coastguard Worker                 {
4098*495ae853SAndroid Build Coastguard Worker                     /* if idr then frm num should be 0 */
4099*495ae853SAndroid Build Coastguard Worker                     ps_vcl_node->u2_frm_num = 0;
4100*495ae853SAndroid Build Coastguard Worker                 }
4101*495ae853SAndroid Build Coastguard Worker             }
4102*495ae853SAndroid Build Coastguard Worker 
4103*495ae853SAndroid Build Coastguard Worker             /* store default params to inter layer deblocking params */
4104*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_inter_lyr_dblk_idc = 0;
4105*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_inter_lyr_beta_offset = 0;
4106*495ae853SAndroid Build Coastguard Worker             ps_vcl_node->i4_inter_lyr_alpha_c0_offset = 0;
4107*495ae853SAndroid Build Coastguard Worker             /* No SEI support for scalability info*/
4108*495ae853SAndroid Build Coastguard Worker             i4_status = NOT_OK;
4109*495ae853SAndroid Build Coastguard Worker 
4110*495ae853SAndroid Build Coastguard Worker             /* if no inter layer pred flag is present set the   */
4111*495ae853SAndroid Build Coastguard Worker             /* status to fail since the slices will not contain */
4112*495ae853SAndroid Build Coastguard Worker             /* reference layer Dqid                             */
4113*495ae853SAndroid Build Coastguard Worker             if(1 == ps_vcl_node->u1_acc_no_int_pred)
4114*495ae853SAndroid Build Coastguard Worker             {
4115*495ae853SAndroid Build Coastguard Worker                 i4_status = NOT_OK;
4116*495ae853SAndroid Build Coastguard Worker             }
4117*495ae853SAndroid Build Coastguard Worker             else
4118*495ae853SAndroid Build Coastguard Worker             {
4119*495ae853SAndroid Build Coastguard Worker                 WORD32 *pi4_ref_dq_id;
4120*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_ref_dq_id_temp;
4121*495ae853SAndroid Build Coastguard Worker 
4122*495ae853SAndroid Build Coastguard Worker                 /* check if the SEI message has given the ref_dq_id */
4123*495ae853SAndroid Build Coastguard Worker                 if(NOT_OK == i4_status)
4124*495ae853SAndroid Build Coastguard Worker                 {
4125*495ae853SAndroid Build Coastguard Worker                     pi4_ref_dq_id = &i4_ref_lyr_dqid;
4126*495ae853SAndroid Build Coastguard Worker                 }
4127*495ae853SAndroid Build Coastguard Worker                 else
4128*495ae853SAndroid Build Coastguard Worker                 {
4129*495ae853SAndroid Build Coastguard Worker                     pi4_ref_dq_id = &i4_ref_dq_id_temp;
4130*495ae853SAndroid Build Coastguard Worker                 }
4131*495ae853SAndroid Build Coastguard Worker 
4132*495ae853SAndroid Build Coastguard Worker                 i4_status = isvcd_get_ref_lyr_dqid(ps_vcl_node, ps_sps, ps_pps, pi4_ref_dq_id,
4133*495ae853SAndroid Build Coastguard Worker                                                    ps_prev_au_prms[i4_dep_id].i4_ref_dq_id,
4134*495ae853SAndroid Build Coastguard Worker                                                    &ps_svcd_ctxt->i4_error_code, ps_svcd_ctxt);
4135*495ae853SAndroid Build Coastguard Worker             }
4136*495ae853SAndroid Build Coastguard Worker 
4137*495ae853SAndroid Build Coastguard Worker             /* no slice in the layer has been successfully decoded */
4138*495ae853SAndroid Build Coastguard Worker             if(NOT_OK == i4_status)
4139*495ae853SAndroid Build Coastguard Worker             {
4140*495ae853SAndroid Build Coastguard Worker                 /* check for IDR picture */
4141*495ae853SAndroid Build Coastguard Worker                 if(SVCD_TRUE == i4_idr_pic_flag)
4142*495ae853SAndroid Build Coastguard Worker                 {
4143*495ae853SAndroid Build Coastguard Worker                     /* set the next lower layer as the reference layer */
4144*495ae853SAndroid Build Coastguard Worker                     if(NULL != ps_vcl_node->ps_bot_node)
4145*495ae853SAndroid Build Coastguard Worker                     {
4146*495ae853SAndroid Build Coastguard Worker                         i4_ref_lyr_dqid = ps_vcl_node->ps_bot_node->i4_dependency_id << 4;
4147*495ae853SAndroid Build Coastguard Worker 
4148*495ae853SAndroid Build Coastguard Worker                         i4_ref_lyr_dqid += ps_vcl_node->ps_bot_node->i4_quality_id;
4149*495ae853SAndroid Build Coastguard Worker                     }
4150*495ae853SAndroid Build Coastguard Worker                     else
4151*495ae853SAndroid Build Coastguard Worker                     {
4152*495ae853SAndroid Build Coastguard Worker                         i4_ref_lyr_dqid = -1;
4153*495ae853SAndroid Build Coastguard Worker                     }
4154*495ae853SAndroid Build Coastguard Worker                 }
4155*495ae853SAndroid Build Coastguard Worker                 else
4156*495ae853SAndroid Build Coastguard Worker                 {
4157*495ae853SAndroid Build Coastguard Worker                     /* take the reference dq id from previous access unit */
4158*495ae853SAndroid Build Coastguard Worker                     i4_ref_lyr_dqid = ps_prev_au_prms[i4_dep_id].i4_ref_dq_id;
4159*495ae853SAndroid Build Coastguard Worker                 }
4160*495ae853SAndroid Build Coastguard Worker             }
4161*495ae853SAndroid Build Coastguard Worker 
4162*495ae853SAndroid Build Coastguard Worker             /* Update the DQID list based on ref DQID.     */
4163*495ae853SAndroid Build Coastguard Worker             /* This routine also updates the ref_dq_id     */
4164*495ae853SAndroid Build Coastguard Worker             /* in case the actual layer is completely lost */
4165*495ae853SAndroid Build Coastguard Worker             i4_status = isvcd_update_dqid(i4_ref_lyr_dqid, ps_vcl_node, &ps_bot_vcl_node);
4166*495ae853SAndroid Build Coastguard Worker 
4167*495ae853SAndroid Build Coastguard Worker             if(!(OK == i4_status))
4168*495ae853SAndroid Build Coastguard Worker             {
4169*495ae853SAndroid Build Coastguard Worker                 return i4_status;
4170*495ae853SAndroid Build Coastguard Worker             }
4171*495ae853SAndroid Build Coastguard Worker 
4172*495ae853SAndroid Build Coastguard Worker             /* store the reference DQID for current depedency and */
4173*495ae853SAndroid Build Coastguard Worker             /* quality id 0 layer                                 */
4174*495ae853SAndroid Build Coastguard Worker             ps_prev_au_prms[i4_dep_id].i4_ref_dq_id = i4_ref_lyr_dqid;
4175*495ae853SAndroid Build Coastguard Worker             ps_prev_au_prms[i4_dep_id].i4_nal_ref_id = ps_vcl_node->i4_nal_ref_idc;
4176*495ae853SAndroid Build Coastguard Worker             ps_prev_au_prms[i4_dep_id].u2_frm_num = ps_vcl_node->u2_frm_num;
4177*495ae853SAndroid Build Coastguard Worker             ps_prev_au_prms[i4_dep_id].i4_updated_sts = SVCD_TRUE;
4178*495ae853SAndroid Build Coastguard Worker 
4179*495ae853SAndroid Build Coastguard Worker             /* ------- Detect Resolution Change ---------------- */
4180*495ae853SAndroid Build Coastguard Worker             {
4181*495ae853SAndroid Build Coastguard Worker                 dec_seq_params_t *ps_lower_sps = NULL;
4182*495ae853SAndroid Build Coastguard Worker                 dec_svc_seq_params_t *ps_lower_subset_sps = NULL;
4183*495ae853SAndroid Build Coastguard Worker 
4184*495ae853SAndroid Build Coastguard Worker                 if(NULL != ps_bot_vcl_node)
4185*495ae853SAndroid Build Coastguard Worker                 {
4186*495ae853SAndroid Build Coastguard Worker                     if((NULL != ps_bot_vcl_node->ps_first_vcl_nal) ||
4187*495ae853SAndroid Build Coastguard Worker                        (SVCD_TRUE == i4_idr_pic_flag))
4188*495ae853SAndroid Build Coastguard Worker                     {
4189*495ae853SAndroid Build Coastguard Worker                         /* get the SPS of layer */
4190*495ae853SAndroid Build Coastguard Worker                         ps_lower_sps = ps_sps + ps_bot_vcl_node->u1_sps_id;
4191*495ae853SAndroid Build Coastguard Worker                         ps_lower_subset_sps = ps_subset_sps + ps_bot_vcl_node->u1_sps_id;
4192*495ae853SAndroid Build Coastguard Worker                     }
4193*495ae853SAndroid Build Coastguard Worker                     else
4194*495ae853SAndroid Build Coastguard Worker                     {
4195*495ae853SAndroid Build Coastguard Worker                         /* if the bottom layer is completely missed */
4196*495ae853SAndroid Build Coastguard Worker                         WORD32 i4_bot_dep_id, i4_bot_qua_id;
4197*495ae853SAndroid Build Coastguard Worker                         UWORD8 u1_sps_id = 0;
4198*495ae853SAndroid Build Coastguard Worker 
4199*495ae853SAndroid Build Coastguard Worker                         /* sps id is picked from previous access unit */
4200*495ae853SAndroid Build Coastguard Worker                         i4_bot_dep_id = ps_bot_vcl_node->i4_dependency_id;
4201*495ae853SAndroid Build Coastguard Worker                         i4_bot_qua_id = ps_bot_vcl_node->i4_quality_id;
4202*495ae853SAndroid Build Coastguard Worker 
4203*495ae853SAndroid Build Coastguard Worker                         if(SVCD_TRUE ==
4204*495ae853SAndroid Build Coastguard Worker                            ps_pps_sps_prev[(i4_bot_dep_id << 4) + i4_bot_qua_id].i4_updated_sts)
4205*495ae853SAndroid Build Coastguard Worker                         {
4206*495ae853SAndroid Build Coastguard Worker                             u1_sps_id =
4207*495ae853SAndroid Build Coastguard Worker                                 ps_pps_sps_prev[(i4_bot_dep_id << 4) + i4_bot_qua_id].u1_sps_id;
4208*495ae853SAndroid Build Coastguard Worker                         }
4209*495ae853SAndroid Build Coastguard Worker                         else
4210*495ae853SAndroid Build Coastguard Worker                         {
4211*495ae853SAndroid Build Coastguard Worker                             /* should not enter here */
4212*495ae853SAndroid Build Coastguard Worker                             return NOT_OK;
4213*495ae853SAndroid Build Coastguard Worker                         }
4214*495ae853SAndroid Build Coastguard Worker 
4215*495ae853SAndroid Build Coastguard Worker                         /* get the SPS of lower layer */
4216*495ae853SAndroid Build Coastguard Worker                         ps_lower_sps = ps_sps + u1_sps_id;
4217*495ae853SAndroid Build Coastguard Worker                         ps_lower_subset_sps = ps_subset_sps + u1_sps_id;
4218*495ae853SAndroid Build Coastguard Worker                     }
4219*495ae853SAndroid Build Coastguard Worker                 }
4220*495ae853SAndroid Build Coastguard Worker 
4221*495ae853SAndroid Build Coastguard Worker                 /* call the function which detects resolution change */
4222*495ae853SAndroid Build Coastguard Worker                 i4_res_chnge_flag = isvcd_detect_res_change(
4223*495ae853SAndroid Build Coastguard Worker                     ps_curr_sps, ps_lower_sps, ps_curr_subset_sps, ps_lower_subset_sps);
4224*495ae853SAndroid Build Coastguard Worker 
4225*495ae853SAndroid Build Coastguard Worker                 /* if a resolution exists below current resolution */
4226*495ae853SAndroid Build Coastguard Worker                 if(SVCD_TRUE == i4_res_chnge_flag)
4227*495ae853SAndroid Build Coastguard Worker                 {
4228*495ae853SAndroid Build Coastguard Worker                     /* if current picture id IDR */
4229*495ae853SAndroid Build Coastguard Worker                     if(SVCD_TRUE == i4_idr_pic_flag)
4230*495ae853SAndroid Build Coastguard Worker                     {
4231*495ae853SAndroid Build Coastguard Worker                         /* store the depedency id of bottom most layer in current resolution */
4232*495ae853SAndroid Build Coastguard Worker                         ai4_dep_id[ps_vcl_nal->i4_num_res_lyrs - 1] = i4_dep_id;
4233*495ae853SAndroid Build Coastguard Worker                     }
4234*495ae853SAndroid Build Coastguard Worker 
4235*495ae853SAndroid Build Coastguard Worker                     /* increment the num resolution layer counter */
4236*495ae853SAndroid Build Coastguard Worker                     ps_vcl_nal->i4_num_res_lyrs++;
4237*495ae853SAndroid Build Coastguard Worker 
4238*495ae853SAndroid Build Coastguard Worker                     /* store the SPS of target -1 and -2 resolution layers */
4239*495ae853SAndroid Build Coastguard Worker                     if(2 == ps_vcl_nal->i4_num_res_lyrs)
4240*495ae853SAndroid Build Coastguard Worker                     {
4241*495ae853SAndroid Build Coastguard Worker                         ps_sps_tgt_minus1_lyr = ps_curr_sps;
4242*495ae853SAndroid Build Coastguard Worker                     }
4243*495ae853SAndroid Build Coastguard Worker                     else if(3 == ps_vcl_nal->i4_num_res_lyrs)
4244*495ae853SAndroid Build Coastguard Worker                     {
4245*495ae853SAndroid Build Coastguard Worker                         ps_sps_tgt_minus2_lyr = ps_curr_sps;
4246*495ae853SAndroid Build Coastguard Worker                     }
4247*495ae853SAndroid Build Coastguard Worker                     else if(ps_vcl_nal->i4_num_res_lyrs > MAX_NUM_RES_LYRS)
4248*495ae853SAndroid Build Coastguard Worker                     {
4249*495ae853SAndroid Build Coastguard Worker                         return NOT_OK;
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             /* -------- end of resolution change detection -------- */
4255*495ae853SAndroid Build Coastguard Worker         }
4256*495ae853SAndroid Build Coastguard Worker         else
4257*495ae853SAndroid Build Coastguard Worker         {
4258*495ae853SAndroid Build Coastguard Worker             i4_ref_lyr_dqid = (i4_dep_id << 4);
4259*495ae853SAndroid Build Coastguard Worker             i4_ref_lyr_dqid += (i4_qua_id - 1);
4260*495ae853SAndroid Build Coastguard Worker 
4261*495ae853SAndroid Build Coastguard Worker             /* Update the DQID list based on ref DQID.     */
4262*495ae853SAndroid Build Coastguard Worker             /* This routine also updates the ref_dq_id     */
4263*495ae853SAndroid Build Coastguard Worker             /* in case the actual layer is completely lost */
4264*495ae853SAndroid Build Coastguard Worker             i4_status = isvcd_update_dqid(i4_ref_lyr_dqid, ps_vcl_node, &ps_bot_vcl_node);
4265*495ae853SAndroid Build Coastguard Worker 
4266*495ae853SAndroid Build Coastguard Worker             if(!(OK == i4_status))
4267*495ae853SAndroid Build Coastguard Worker             {
4268*495ae853SAndroid Build Coastguard Worker                 return i4_status;
4269*495ae853SAndroid Build Coastguard Worker             }
4270*495ae853SAndroid Build Coastguard Worker             if(SVCD_TRUE == ps_vcl_node->i4_idr_pic_flag)
4271*495ae853SAndroid Build Coastguard Worker             {
4272*495ae853SAndroid Build Coastguard Worker                 /* if idr then frm num should be 0 */
4273*495ae853SAndroid Build Coastguard Worker                 ps_vcl_node->u2_frm_num = 0;
4274*495ae853SAndroid Build Coastguard Worker             }
4275*495ae853SAndroid Build Coastguard Worker         }
4276*495ae853SAndroid Build Coastguard Worker 
4277*495ae853SAndroid Build Coastguard Worker         /* Update resolution change flag inside VCL    */
4278*495ae853SAndroid Build Coastguard Worker         /* node structure. This parameter is later used*/
4279*495ae853SAndroid Build Coastguard Worker         /* in detecting the top most layer in the      */
4280*495ae853SAndroid Build Coastguard Worker         /* resolution currently being decoded          */
4281*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->i4_res_change_flag = i4_res_chnge_flag;
4282*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->i4_ref_dq_id = i4_ref_lyr_dqid;
4283*495ae853SAndroid Build Coastguard Worker 
4284*495ae853SAndroid Build Coastguard Worker         /* go to the next node */
4285*495ae853SAndroid Build Coastguard Worker         ps_vcl_node = ps_bot_vcl_node;
4286*495ae853SAndroid Build Coastguard Worker     }
4287*495ae853SAndroid Build Coastguard Worker 
4288*495ae853SAndroid Build Coastguard Worker     /* update the Dependency array for each resolution */
4289*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == i4_idr_pic_flag)
4290*495ae853SAndroid Build Coastguard Worker     {
4291*495ae853SAndroid Build Coastguard Worker         WORD32 i4_idx;
4292*495ae853SAndroid Build Coastguard Worker 
4293*495ae853SAndroid Build Coastguard Worker         ai4_dep_id[ps_vcl_nal->i4_num_res_lyrs - 1] = 0;
4294*495ae853SAndroid Build Coastguard Worker 
4295*495ae853SAndroid Build Coastguard Worker         /* loop over number of resolutions detected */
4296*495ae853SAndroid Build Coastguard Worker         for(i4_idx = 0; i4_idx < ps_vcl_nal->i4_num_res_lyrs; i4_idx++)
4297*495ae853SAndroid Build Coastguard Worker         {
4298*495ae853SAndroid Build Coastguard Worker             pi4_dep_id_map[i4_idx] = ai4_dep_id[ps_vcl_nal->i4_num_res_lyrs - 1 - i4_idx];
4299*495ae853SAndroid Build Coastguard Worker         }
4300*495ae853SAndroid Build Coastguard Worker     }
4301*495ae853SAndroid Build Coastguard Worker 
4302*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == i4_restore_prms_flag)
4303*495ae853SAndroid Build Coastguard Worker     {
4304*495ae853SAndroid Build Coastguard Worker         /* restore the number of resolutions */
4305*495ae853SAndroid Build Coastguard Worker         ps_vcl_nal->i4_num_res_lyrs = i4_num_res_lyrs_bup;
4306*495ae853SAndroid Build Coastguard Worker 
4307*495ae853SAndroid Build Coastguard Worker         ps_vcl_node = ps_node_bup;
4308*495ae853SAndroid Build Coastguard Worker 
4309*495ae853SAndroid Build Coastguard Worker         /* set the bottom node to NULL */
4310*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->ps_bot_node = NULL;
4311*495ae853SAndroid Build Coastguard Worker 
4312*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->i4_ref_dq_id = -1;
4313*495ae853SAndroid Build Coastguard Worker         ps_vcl_node->i4_res_change_flag = SVCD_FALSE;
4314*495ae853SAndroid Build Coastguard Worker 
4315*495ae853SAndroid Build Coastguard Worker         /* store the reference DQID for current dependency */
4316*495ae853SAndroid Build Coastguard Worker         ps_prev_au_prms[ps_vcl_node->i4_dependency_id].i4_ref_dq_id = -1;
4317*495ae853SAndroid Build Coastguard Worker 
4318*495ae853SAndroid Build Coastguard Worker         ps_prev_au_prms[ps_vcl_node->i4_dependency_id].u2_frm_num = ps_vcl_node->u2_frm_num;
4319*495ae853SAndroid Build Coastguard Worker 
4320*495ae853SAndroid Build Coastguard Worker         ps_prev_au_prms[ps_vcl_node->i4_dependency_id].i4_nal_ref_id = ps_vcl_node->i4_nal_ref_idc;
4321*495ae853SAndroid Build Coastguard Worker     }
4322*495ae853SAndroid Build Coastguard Worker 
4323*495ae853SAndroid Build Coastguard Worker     /* Finally update the bottom most node in the current access unit */
4324*495ae853SAndroid Build Coastguard Worker     ps_vcl_node = ps_vcl_nal->ps_top_node;
4325*495ae853SAndroid Build Coastguard Worker 
4326*495ae853SAndroid Build Coastguard Worker     while(NULL != ps_vcl_node->ps_bot_node)
4327*495ae853SAndroid Build Coastguard Worker     {
4328*495ae853SAndroid Build Coastguard Worker         ps_vcl_node = ps_vcl_node->ps_bot_node;
4329*495ae853SAndroid Build Coastguard Worker     }
4330*495ae853SAndroid Build Coastguard Worker 
4331*495ae853SAndroid Build Coastguard Worker     ps_vcl_nal->ps_bot_node = ps_vcl_node;
4332*495ae853SAndroid Build Coastguard Worker 
4333*495ae853SAndroid Build Coastguard Worker     /* check on validity of Target Layer -1 and -2 dimensions */
4334*495ae853SAndroid Build Coastguard Worker     if((NULL != ps_sps_tgt_minus1_lyr) && (0 == ps_sps_tgt_minus1_lyr->u1_is_valid))
4335*495ae853SAndroid Build Coastguard Worker     {
4336*495ae853SAndroid Build Coastguard Worker         if((H264_MAX_FRAME_WIDTH < (WORD32) (ps_sps_tgt_minus1_lyr->u2_frm_wd_in_mbs << 4)) ||
4337*495ae853SAndroid Build Coastguard Worker            (H264_MAX_FRAME_HEIGHT < (WORD32) (ps_sps_tgt_minus1_lyr->u2_frm_ht_in_mbs << 4)))
4338*495ae853SAndroid Build Coastguard Worker         {
4339*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
4340*495ae853SAndroid Build Coastguard Worker         }
4341*495ae853SAndroid Build Coastguard Worker     }
4342*495ae853SAndroid Build Coastguard Worker 
4343*495ae853SAndroid Build Coastguard Worker     if((NULL != ps_sps_tgt_minus2_lyr) && (0 == ps_sps_tgt_minus2_lyr->u1_is_valid))
4344*495ae853SAndroid Build Coastguard Worker     {
4345*495ae853SAndroid Build Coastguard Worker         if((H264_MAX_FRAME_WIDTH < (WORD32) (ps_sps_tgt_minus2_lyr->u2_frm_wd_in_mbs << 4)) ||
4346*495ae853SAndroid Build Coastguard Worker            (H264_MAX_FRAME_HEIGHT < (WORD32) (ps_sps_tgt_minus2_lyr->u2_frm_ht_in_mbs << 4)))
4347*495ae853SAndroid Build Coastguard Worker         {
4348*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
4349*495ae853SAndroid Build Coastguard Worker         }
4350*495ae853SAndroid Build Coastguard Worker     }
4351*495ae853SAndroid Build Coastguard Worker 
4352*495ae853SAndroid Build Coastguard Worker     return (OK);
4353*495ae853SAndroid Build Coastguard Worker }
4354*495ae853SAndroid Build Coastguard Worker 
4355*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4356*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4357*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_dec_non_vcl                                        */
4358*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4359*495ae853SAndroid Build Coastguard Worker /*  Description   : this function decodes the NON VCL NAL units              */
4360*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4361*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4362*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_out_non_vcl : pointer to the structure containing     */
4363*495ae853SAndroid Build Coastguard Worker /*                                  NON VCL NAL units                        */
4364*495ae853SAndroid Build Coastguard Worker /*                  ps_seq_params : pointer to array of SPS structures       */
4365*495ae853SAndroid Build Coastguard Worker /*                  ps_pic_params : pointer to array of PPS structures       */
4366*495ae853SAndroid Build Coastguard Worker /*                  ps_sei_ctxt : pointer to array of SEI structures         */
4367*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
4368*495ae853SAndroid Build Coastguard Worker /*  Processing    : it decodes the units unitl all the units are             */
4369*495ae853SAndroid Build Coastguard Worker /*                  decoded                                                  */
4370*495ae853SAndroid Build Coastguard Worker /*  Outputs       : decoded parameters in appropriate structures             */
4371*495ae853SAndroid Build Coastguard Worker /*  Returns       : Success or Faliure                                       */
4372*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4373*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
4374*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4375*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4376*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4377*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4378*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   vijayakumar          creation                        */
4379*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4380*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_dec_non_vcl(void * pv_out_non_vcl,void * pv_seq_params,void * pv_pic_params,svc_dec_ctxt_t * ps_svcd_ctxt)4381*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_dec_non_vcl(void *pv_out_non_vcl, void *pv_seq_params, void *pv_pic_params,
4382*495ae853SAndroid Build Coastguard Worker                          svc_dec_ctxt_t *ps_svcd_ctxt)
4383*495ae853SAndroid Build Coastguard Worker {
4384*495ae853SAndroid Build Coastguard Worker     /* local varibles */
4385*495ae853SAndroid Build Coastguard Worker     non_vcl_nal_t *ps_non_vcl;
4386*495ae853SAndroid Build Coastguard Worker     WORD32 i4_unit_indx;
4387*495ae853SAndroid Build Coastguard Worker     non_vcl_buf_hdr_t *ps_non_vcl_buf;
4388*495ae853SAndroid Build Coastguard Worker     WORD32 i_status = OK;
4389*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
4390*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
4391*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t *ps_bitstrm;
4392*495ae853SAndroid Build Coastguard Worker 
4393*495ae853SAndroid Build Coastguard Worker     if((NULL == pv_out_non_vcl) || (NULL == pv_seq_params) || (NULL == pv_pic_params))
4394*495ae853SAndroid Build Coastguard Worker     {
4395*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
4396*495ae853SAndroid Build Coastguard Worker     }
4397*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_seq_params);
4398*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_pic_params);
4399*495ae853SAndroid Build Coastguard Worker 
4400*495ae853SAndroid Build Coastguard Worker     /* currently SEI decoding is not supported */
4401*495ae853SAndroid Build Coastguard Worker     /* derive the local variables */
4402*495ae853SAndroid Build Coastguard Worker     ps_non_vcl = (non_vcl_nal_t *) pv_out_non_vcl;
4403*495ae853SAndroid Build Coastguard Worker     ps_non_vcl_buf = ps_non_vcl->ps_first_non_vcl_nal;
4404*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_non_vcl_buf) return (NOT_OK);
4405*495ae853SAndroid Build Coastguard Worker 
4406*495ae853SAndroid Build Coastguard Worker     /* loop until all NON VCL NAL are decoded */
4407*495ae853SAndroid Build Coastguard Worker     for(i4_unit_indx = 0; i4_unit_indx < ps_non_vcl->i4_num_non_vcl_nals; i4_unit_indx++)
4408*495ae853SAndroid Build Coastguard Worker     {
4409*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_nal_unit_type;
4410*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr;
4411*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
4412*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_non_vcl_buf) return (NOT_OK);
4413*495ae853SAndroid Build Coastguard Worker         /* get the current NAL unit type */
4414*495ae853SAndroid Build Coastguard Worker         u4_nal_unit_type = (UWORD32) ps_non_vcl_buf->i4_nal_unit_type;
4415*495ae853SAndroid Build Coastguard Worker         if(u4_nal_unit_type > MAX_SVC_NAL_UNIT_TYPE) return (NOT_OK);
4416*495ae853SAndroid Build Coastguard Worker         ps_dec->u1_nal_unit_type = u4_nal_unit_type;
4417*495ae853SAndroid Build Coastguard Worker 
4418*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_bitstrm->pu4_buffer =
4419*495ae853SAndroid Build Coastguard Worker             (UWORD32 *) ((UWORD8 *) ps_non_vcl_buf + ps_non_vcl_buf->i4_buf_offset);
4420*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_bitstrm->u4_ofst = 0;
4421*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_bitstrm->u4_max_ofst = isvcd_nal_rbsp_to_sodb(
4422*495ae853SAndroid Build Coastguard Worker             (UWORD8 *) ps_dec->ps_bitstrm->pu4_buffer, ps_non_vcl_buf->i4_buf_size, 0);
4423*495ae853SAndroid Build Coastguard Worker         if(ps_dec->ps_bitstrm->u4_max_ofst <= 0) return (NOT_OK);
4424*495ae853SAndroid Build Coastguard Worker 
4425*495ae853SAndroid Build Coastguard Worker         ps_bitstrm = ps_dec->ps_bitstrm;
4426*495ae853SAndroid Build Coastguard Worker 
4427*495ae853SAndroid Build Coastguard Worker         /* call the processing module based on nal unit type */
4428*495ae853SAndroid Build Coastguard Worker         switch(u4_nal_unit_type)
4429*495ae853SAndroid Build Coastguard Worker         {
4430*495ae853SAndroid Build Coastguard Worker             case SEQ_PARAM_NAL:
4431*495ae853SAndroid Build Coastguard Worker 
4432*495ae853SAndroid Build Coastguard Worker                 i_status = isvcd_parse_sps(ps_svc_lyr_dec, ps_bitstrm);
4433*495ae853SAndroid Build Coastguard Worker 
4434*495ae853SAndroid Build Coastguard Worker                 if(!i_status)
4435*495ae853SAndroid Build Coastguard Worker                 {
4436*495ae853SAndroid Build Coastguard Worker                     ps_dec->i4_header_decoded |= 0x1;
4437*495ae853SAndroid Build Coastguard Worker                     ps_svcd_ctxt->u4_num_sps_ctr++;
4438*495ae853SAndroid Build Coastguard Worker 
4439*495ae853SAndroid Build Coastguard Worker                     if(ps_svcd_ctxt->pic_width < ps_svc_lyr_dec->pic_width)
4440*495ae853SAndroid Build Coastguard Worker                     {
4441*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->pic_width = ps_svc_lyr_dec->pic_width;
4442*495ae853SAndroid Build Coastguard Worker                     }
4443*495ae853SAndroid Build Coastguard Worker                     if(ps_svcd_ctxt->pic_height < ps_svc_lyr_dec->pic_height)
4444*495ae853SAndroid Build Coastguard Worker                     {
4445*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->pic_height = ps_svc_lyr_dec->pic_height;
4446*495ae853SAndroid Build Coastguard Worker                     }
4447*495ae853SAndroid Build Coastguard Worker                 }
4448*495ae853SAndroid Build Coastguard Worker 
4449*495ae853SAndroid Build Coastguard Worker                 if(i_status) return i_status;
4450*495ae853SAndroid Build Coastguard Worker 
4451*495ae853SAndroid Build Coastguard Worker                 break;
4452*495ae853SAndroid Build Coastguard Worker             case SUBSET_SPS_NAL:
4453*495ae853SAndroid Build Coastguard Worker 
4454*495ae853SAndroid Build Coastguard Worker                 i_status = isvcd_parse_subset_sps(ps_svc_lyr_dec, ps_bitstrm);
4455*495ae853SAndroid Build Coastguard Worker 
4456*495ae853SAndroid Build Coastguard Worker                 if(!i_status)
4457*495ae853SAndroid Build Coastguard Worker                 {
4458*495ae853SAndroid Build Coastguard Worker                     ps_svcd_ctxt->u4_num_sps_ctr++;
4459*495ae853SAndroid Build Coastguard Worker                     ps_dec->i4_header_decoded |= 0x1;
4460*495ae853SAndroid Build Coastguard Worker 
4461*495ae853SAndroid Build Coastguard Worker                     if(ps_svcd_ctxt->pic_width < ps_svc_lyr_dec->pic_width)
4462*495ae853SAndroid Build Coastguard Worker                     {
4463*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->pic_width = ps_svc_lyr_dec->pic_width;
4464*495ae853SAndroid Build Coastguard Worker                     }
4465*495ae853SAndroid Build Coastguard Worker                     if(ps_svcd_ctxt->pic_height < ps_svc_lyr_dec->pic_height)
4466*495ae853SAndroid Build Coastguard Worker                     {
4467*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->pic_height = ps_svc_lyr_dec->pic_height;
4468*495ae853SAndroid Build Coastguard Worker                     }
4469*495ae853SAndroid Build Coastguard Worker                 }
4470*495ae853SAndroid Build Coastguard Worker                 if(i_status) return i_status;
4471*495ae853SAndroid Build Coastguard Worker 
4472*495ae853SAndroid Build Coastguard Worker                 break;
4473*495ae853SAndroid Build Coastguard Worker 
4474*495ae853SAndroid Build Coastguard Worker             case PIC_PARAM_NAL:
4475*495ae853SAndroid Build Coastguard Worker 
4476*495ae853SAndroid Build Coastguard Worker                 i_status = isvcd_parse_pps(ps_svc_lyr_dec, ps_bitstrm);
4477*495ae853SAndroid Build Coastguard Worker                 if(!i_status)
4478*495ae853SAndroid Build Coastguard Worker                 {
4479*495ae853SAndroid Build Coastguard Worker                     ps_dec->i4_header_decoded |= 0x2;
4480*495ae853SAndroid Build Coastguard Worker                     ps_svcd_ctxt->u4_num_pps_ctr++;
4481*495ae853SAndroid Build Coastguard Worker                 }
4482*495ae853SAndroid Build Coastguard Worker                 if(i_status) return i_status;
4483*495ae853SAndroid Build Coastguard Worker                 break;
4484*495ae853SAndroid Build Coastguard Worker             case SEI_NAL:
4485*495ae853SAndroid Build Coastguard Worker             {
4486*495ae853SAndroid Build Coastguard Worker                 i_status = ih264d_parse_sei_message(ps_dec, ps_bitstrm);
4487*495ae853SAndroid Build Coastguard Worker                 if(i_status) return i_status;
4488*495ae853SAndroid Build Coastguard Worker                 ih264d_parse_sei(ps_dec, ps_bitstrm);
4489*495ae853SAndroid Build Coastguard Worker             }
4490*495ae853SAndroid Build Coastguard Worker             break;
4491*495ae853SAndroid Build Coastguard Worker             default:
4492*495ae853SAndroid Build Coastguard Worker                 /* no other NON VCL UNIT is supported */
4493*495ae853SAndroid Build Coastguard Worker                 break;
4494*495ae853SAndroid Build Coastguard Worker         }
4495*495ae853SAndroid Build Coastguard Worker 
4496*495ae853SAndroid Build Coastguard Worker         /* get the next non vcl bufffer */
4497*495ae853SAndroid Build Coastguard Worker         ps_non_vcl_buf = ps_non_vcl_buf->ps_next;
4498*495ae853SAndroid Build Coastguard Worker 
4499*495ae853SAndroid Build Coastguard Worker     } /* end of loop over all NAL units */
4500*495ae853SAndroid Build Coastguard Worker 
4501*495ae853SAndroid Build Coastguard Worker     return (OK);
4502*495ae853SAndroid Build Coastguard Worker }
4503*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4504*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4505*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_seq_hdr_dec                                        */
4506*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4507*495ae853SAndroid Build Coastguard Worker /*  Description   : This function decodes sequence header, which includes    */
4508*495ae853SAndroid Build Coastguard Worker /*                  non VCL NAL before the first VCL unit                    */
4509*495ae853SAndroid Build Coastguard Worker /*  Inputs        : Decoder context, inbufs, place holder for number of bytes*/
4510*495ae853SAndroid Build Coastguard Worker /*                  consumed and number of packets consumed                  */
4511*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
4512*495ae853SAndroid Build Coastguard Worker /*  Processing    : 1. Parse non VCL units before first VCL unit             */
4513*495ae853SAndroid Build Coastguard Worker /*                  2. Decode parsed non VCL units                           */
4514*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Decoded header                                           */
4515*495ae853SAndroid Build Coastguard Worker /*  Returns       : OK or NOT_OK                                             */
4516*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4517*495ae853SAndroid Build Coastguard Worker /*  Issues        : no known issues                                          */
4518*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4519*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4520*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4521*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4522*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Creation                             */
4523*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4524*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_seq_hdr_dec(svc_dec_ctxt_t * ps_svcd_ctxt,ivd_video_decode_ip_t * ps_in_bufs,UWORD32 * pu4_bytes_consumed)4525*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_seq_hdr_dec(svc_dec_ctxt_t *ps_svcd_ctxt, ivd_video_decode_ip_t *ps_in_bufs,
4526*495ae853SAndroid Build Coastguard Worker                          UWORD32 *pu4_bytes_consumed)
4527*495ae853SAndroid Build Coastguard Worker {
4528*495ae853SAndroid Build Coastguard Worker     WORD32 i4_status;
4529*495ae853SAndroid Build Coastguard Worker 
4530*495ae853SAndroid Build Coastguard Worker     /* Decode all non VCL NAL till first VCL NAL is encountered */
4531*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->s_non_vcl_nal.i4_num_non_vcl_nals = 0;
4532*495ae853SAndroid Build Coastguard Worker     i4_status = isvcd_nal_parse_non_vcl_nal(
4533*495ae853SAndroid Build Coastguard Worker         ps_svcd_ctxt->pv_nal_parse_ctxt, ps_in_bufs->pv_stream_buffer, &ps_svcd_ctxt->s_non_vcl_nal,
4534*495ae853SAndroid Build Coastguard Worker         pu4_bytes_consumed, &ps_in_bufs->u4_num_Bytes);
4535*495ae853SAndroid Build Coastguard Worker 
4536*495ae853SAndroid Build Coastguard Worker     /* Note: The bitstream extraction module expects updated  */
4537*495ae853SAndroid Build Coastguard Worker     /* pointer whenever a new call to this module has been    */
4538*495ae853SAndroid Build Coastguard Worker     /* made. Hence the buffer pointer has to be incremented   */
4539*495ae853SAndroid Build Coastguard Worker     /* by bytes consumed                                      */
4540*495ae853SAndroid Build Coastguard Worker     ps_in_bufs->u4_num_Bytes -= *pu4_bytes_consumed;
4541*495ae853SAndroid Build Coastguard Worker 
4542*495ae853SAndroid Build Coastguard Worker     /* ------------------------------------------------------ */
4543*495ae853SAndroid Build Coastguard Worker     /* Decoding of non VCL data. As current implementation it */
4544*495ae853SAndroid Build Coastguard Worker     /* decodes the followings:                                */
4545*495ae853SAndroid Build Coastguard Worker     /*          1. Sequence parameter set                     */
4546*495ae853SAndroid Build Coastguard Worker     /*          2. Picture parameter set                      */
4547*495ae853SAndroid Build Coastguard Worker     /*          3. SEI message                                */
4548*495ae853SAndroid Build Coastguard Worker     /* ------------------------------------------------------ */
4549*495ae853SAndroid Build Coastguard Worker     i4_status = isvcd_dec_non_vcl(&ps_svcd_ctxt->s_non_vcl_nal, ps_svcd_ctxt->ps_sps, ps_svcd_ctxt->ps_pps,
4550*495ae853SAndroid Build Coastguard Worker                       ps_svcd_ctxt);
4551*495ae853SAndroid Build Coastguard Worker 
4552*495ae853SAndroid Build Coastguard Worker     return (i4_status);
4553*495ae853SAndroid Build Coastguard Worker }
4554*495ae853SAndroid Build Coastguard Worker 
4555*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4556*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4557*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_pre_parse_refine_au                               */
4558*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4559*495ae853SAndroid Build Coastguard Worker /*  Description   : This function process a decode call                      */
4560*495ae853SAndroid Build Coastguard Worker /*  Inputs        : ps_dec_ctxt : decoder context structure                  */
4561*495ae853SAndroid Build Coastguard Worker /*                  ps_in_bufs : input buffer descriptor                     */
4562*495ae853SAndroid Build Coastguard Worker /*                  pu4_bytes_consumed : pointer to store the bytes consumed */
4563*495ae853SAndroid Build Coastguard Worker /*                  pi4_packets_consumed : pointer to store the packets      */
4564*495ae853SAndroid Build Coastguard Worker /*                                   consumed                                */
4565*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
4566*495ae853SAndroid Build Coastguard Worker /*  Processing    : It calls the NAL parse module to parse the input stream  */
4567*495ae853SAndroid Build Coastguard Worker /*                  if a picture boundary is detected it calls the           */
4568*495ae853SAndroid Build Coastguard Worker /*                  Dependency list refiniment and Picture Decode routines   */
4569*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Decoded picture                                          */
4570*495ae853SAndroid Build Coastguard Worker /*  Returns       : OK or NOT_OK                                             */
4571*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4572*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
4573*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4574*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4575*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4576*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4577*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Creation                             */
4578*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4579*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_pre_parse_refine_au(svc_dec_ctxt_t * ps_svcd_ctxt,ivd_video_decode_ip_t * ps_in_bufs,UWORD32 * pu4_bytes_consumed)4580*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_pre_parse_refine_au(svc_dec_ctxt_t *ps_svcd_ctxt, ivd_video_decode_ip_t *ps_in_bufs,
4581*495ae853SAndroid Build Coastguard Worker                                  UWORD32 *pu4_bytes_consumed)
4582*495ae853SAndroid Build Coastguard Worker {
4583*495ae853SAndroid Build Coastguard Worker     WORD32 i4_status = 0, i4_non_vcl_status;
4584*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_bytes_consumed = 0;
4585*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
4586*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
4587*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr;
4588*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
4589*495ae853SAndroid Build Coastguard Worker 
4590*495ae853SAndroid Build Coastguard Worker     /* Sequence header decode:                                 */
4591*495ae853SAndroid Build Coastguard Worker     /* If sequence header is not decoded then decode  the seq  */
4592*495ae853SAndroid Build Coastguard Worker     /* uence header                                            */
4593*495ae853SAndroid Build Coastguard Worker 
4594*495ae853SAndroid Build Coastguard Worker     if(SVCD_FALSE == ps_dec->i4_header_decoded)
4595*495ae853SAndroid Build Coastguard Worker     {
4596*495ae853SAndroid Build Coastguard Worker         i4_status = isvcd_seq_hdr_dec(ps_svcd_ctxt, ps_in_bufs, &u4_bytes_consumed);
4597*495ae853SAndroid Build Coastguard Worker 
4598*495ae853SAndroid Build Coastguard Worker         if((VCL_NAL_FOUND_TRUE == i4_status) && (ps_svcd_ctxt->u4_num_sps_ctr != 0) &&
4599*495ae853SAndroid Build Coastguard Worker            (ps_svcd_ctxt->u4_num_pps_ctr != 0))
4600*495ae853SAndroid Build Coastguard Worker         {
4601*495ae853SAndroid Build Coastguard Worker             /* set the header decoded flag */
4602*495ae853SAndroid Build Coastguard Worker             ps_dec->i4_header_decoded = 3;
4603*495ae853SAndroid Build Coastguard Worker         }
4604*495ae853SAndroid Build Coastguard Worker     }
4605*495ae853SAndroid Build Coastguard Worker     *pu4_bytes_consumed = u4_bytes_consumed;
4606*495ae853SAndroid Build Coastguard Worker     if (i4_status)
4607*495ae853SAndroid Build Coastguard Worker     {
4608*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
4609*495ae853SAndroid Build Coastguard Worker     }
4610*495ae853SAndroid Build Coastguard Worker     if(1 == ps_dec->i4_decode_header)
4611*495ae853SAndroid Build Coastguard Worker     {
4612*495ae853SAndroid Build Coastguard Worker         return OK;
4613*495ae853SAndroid Build Coastguard Worker     }
4614*495ae853SAndroid Build Coastguard Worker     /* Bit-stream Parsing. It performs following tasks:        */
4615*495ae853SAndroid Build Coastguard Worker     /*          1. NAL hader decoder                           */
4616*495ae853SAndroid Build Coastguard Worker     /*          2. Emulation prevention and byte swap          */
4617*495ae853SAndroid Build Coastguard Worker     /*             (During this process data to moved to output*/
4618*495ae853SAndroid Build Coastguard Worker     /*              buffer)                                    */
4619*495ae853SAndroid Build Coastguard Worker     /*          3. Dependency list creation based on NAL header*/
4620*495ae853SAndroid Build Coastguard Worker     /*          4. Detection of picture boundary               */
4621*495ae853SAndroid Build Coastguard Worker     /* NOTE1:                                                  */
4622*495ae853SAndroid Build Coastguard Worker     /*       Output buffers for VCL and non VCL data are       */
4623*495ae853SAndroid Build Coastguard Worker     /*       different. VCL data can be retrieved through      */
4624*495ae853SAndroid Build Coastguard Worker     /*       dependency list. Whereas non VCL data is stored in*/
4625*495ae853SAndroid Build Coastguard Worker     /*       one single buffer, which is accessed through NON  */
4626*495ae853SAndroid Build Coastguard Worker     /*       VCL structure                                     */
4627*495ae853SAndroid Build Coastguard Worker     /* NOTE2:Partial input case for nal parsing requires a     */
4628*495ae853SAndroid Build Coastguard Worker     /*       flush API to be called when end of bitstream      */
4629*495ae853SAndroid Build Coastguard Worker     /*       occurs                                            */
4630*495ae853SAndroid Build Coastguard Worker 
4631*495ae853SAndroid Build Coastguard Worker     if(SVCD_FALSE == ps_svcd_ctxt->i4_eos_flag)
4632*495ae853SAndroid Build Coastguard Worker     {
4633*495ae853SAndroid Build Coastguard Worker         if(ps_dec->i4_header_decoded == 3)
4634*495ae853SAndroid Build Coastguard Worker         {
4635*495ae853SAndroid Build Coastguard Worker             i4_status = isvcd_nal_parse_vcl_nal_partial(
4636*495ae853SAndroid Build Coastguard Worker                 ps_svcd_ctxt->pv_nal_parse_ctxt, ps_in_bufs->pv_stream_buffer,
4637*495ae853SAndroid Build Coastguard Worker                 &ps_svcd_ctxt->s_non_vcl_nal, &ps_svcd_ctxt->s_vcl_nal, &u4_bytes_consumed,
4638*495ae853SAndroid Build Coastguard Worker                 &ps_in_bufs->u4_num_Bytes);
4639*495ae853SAndroid Build Coastguard Worker         }
4640*495ae853SAndroid Build Coastguard Worker         else
4641*495ae853SAndroid Build Coastguard Worker         {
4642*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
4643*495ae853SAndroid Build Coastguard Worker         }
4644*495ae853SAndroid Build Coastguard Worker     }
4645*495ae853SAndroid Build Coastguard Worker     else
4646*495ae853SAndroid Build Coastguard Worker     {
4647*495ae853SAndroid Build Coastguard Worker         void *pv_nal_parse_ctxt;
4648*495ae853SAndroid Build Coastguard Worker         pv_nal_parse_ctxt = ps_svcd_ctxt->pv_nal_parse_ctxt;
4649*495ae853SAndroid Build Coastguard Worker 
4650*495ae853SAndroid Build Coastguard Worker         i4_status = isvcd_nal_parse_partial_signal_eos(pv_nal_parse_ctxt, &ps_svcd_ctxt->s_vcl_nal,
4651*495ae853SAndroid Build Coastguard Worker                                                        &ps_svcd_ctxt->s_non_vcl_nal);
4652*495ae853SAndroid Build Coastguard Worker 
4653*495ae853SAndroid Build Coastguard Worker         u4_bytes_consumed = 0;
4654*495ae853SAndroid Build Coastguard Worker     }
4655*495ae853SAndroid Build Coastguard Worker 
4656*495ae853SAndroid Build Coastguard Worker     *pu4_bytes_consumed += u4_bytes_consumed;
4657*495ae853SAndroid Build Coastguard Worker 
4658*495ae853SAndroid Build Coastguard Worker     /* Picture Boundary detected: Go ahead and do the decoding  */
4659*495ae853SAndroid Build Coastguard Worker     /* Picture boundary not detected: Otherwsie retrun from this*/
4660*495ae853SAndroid Build Coastguard Worker     /* function and update the bytes consumed variable. This    */
4661*495ae853SAndroid Build Coastguard Worker     /* should be repeated till we get a picture boundary        */
4662*495ae853SAndroid Build Coastguard Worker 
4663*495ae853SAndroid Build Coastguard Worker     if(PIC_BOUNDARY_FALSE == i4_status)
4664*495ae853SAndroid Build Coastguard Worker     {
4665*495ae853SAndroid Build Coastguard Worker         return (NOT_OK);
4666*495ae853SAndroid Build Coastguard Worker     }
4667*495ae853SAndroid Build Coastguard Worker 
4668*495ae853SAndroid Build Coastguard Worker     else if(FLUSH_DECODED_PICTURE == i4_status)
4669*495ae853SAndroid Build Coastguard Worker     {
4670*495ae853SAndroid Build Coastguard Worker         /* No more data is expected to come. Pictures decoded   */
4671*495ae853SAndroid Build Coastguard Worker         /* so far needs to be sent for display                  */
4672*495ae853SAndroid Build Coastguard Worker         return (FLUSH);
4673*495ae853SAndroid Build Coastguard Worker     }
4674*495ae853SAndroid Build Coastguard Worker 
4675*495ae853SAndroid Build Coastguard Worker     if(PIC_BOUNDARY_TRUE != i4_status)
4676*495ae853SAndroid Build Coastguard Worker     {
4677*495ae853SAndroid Build Coastguard Worker         return (NOT_OK);
4678*495ae853SAndroid Build Coastguard Worker     }
4679*495ae853SAndroid Build Coastguard Worker 
4680*495ae853SAndroid Build Coastguard Worker     /* check if the application has set any of the skip modes       */
4681*495ae853SAndroid Build Coastguard Worker     /* add the support for P and B skip modes                       */
4682*495ae853SAndroid Build Coastguard Worker     /* if(ps_dec_ctxt->s_dyn_prms.u1_frame_skip_mode)               */
4683*495ae853SAndroid Build Coastguard Worker 
4684*495ae853SAndroid Build Coastguard Worker     /* Parse slice header to decode reference layer dQId and refine */
4685*495ae853SAndroid Build Coastguard Worker     /* the dependency list                                          */
4686*495ae853SAndroid Build Coastguard Worker     /* NOTE: Yes, this processing could be moved into NAL parsing   */
4687*495ae853SAndroid Build Coastguard Worker     /*       routine to avoid unneccessary emulation prevention and */
4688*495ae853SAndroid Build Coastguard Worker     /*       byte swapping over discardable data. This Optimization */
4689*495ae853SAndroid Build Coastguard Worker     /*       has been deferred for some time. In future if we found */
4690*495ae853SAndroid Build Coastguard Worker     /*       that there are many such streams which doesn't set     */
4691*495ae853SAndroid Build Coastguard Worker     /*       'discard_flag' correctly in NAL header, we will take a */
4692*495ae853SAndroid Build Coastguard Worker     /*       hit to optimize it.                                    */
4693*495ae853SAndroid Build Coastguard Worker 
4694*495ae853SAndroid Build Coastguard Worker     /* At present this routine also performs the following          */
4695*495ae853SAndroid Build Coastguard Worker     /* 1. Refine DQID list based on reference layer DQID            */
4696*495ae853SAndroid Build Coastguard Worker     /* 2. Calculates the POC for the target layer                   */
4697*495ae853SAndroid Build Coastguard Worker 
4698*495ae853SAndroid Build Coastguard Worker     {
4699*495ae853SAndroid Build Coastguard Worker         i4_status = isvcd_refine_dep_list(
4700*495ae853SAndroid Build Coastguard Worker             &ps_svcd_ctxt->s_vcl_nal, ps_svcd_ctxt->ps_sps, ps_svcd_ctxt->ps_subset_sps,
4701*495ae853SAndroid Build Coastguard Worker             ps_svcd_ctxt->ps_pps, &ps_svcd_ctxt->ai4_dq_id_map[0], &ps_svcd_ctxt->as_au_prms_dep[0],
4702*495ae853SAndroid Build Coastguard Worker             &ps_svcd_ctxt->as_pps_sps_prev_au[0], &ps_svcd_ctxt->i4_error_code, ps_svcd_ctxt);
4703*495ae853SAndroid Build Coastguard Worker     }
4704*495ae853SAndroid Build Coastguard Worker 
4705*495ae853SAndroid Build Coastguard Worker     if(0 != ps_svcd_ctxt->s_non_vcl_nal.i4_num_non_vcl_nals)
4706*495ae853SAndroid Build Coastguard Worker     {
4707*495ae853SAndroid Build Coastguard Worker         /* Decoding of non VCL data. In current implementation it  */
4708*495ae853SAndroid Build Coastguard Worker         /* decodes the followings:                                 */
4709*495ae853SAndroid Build Coastguard Worker         /*          1. Sequence parameter set                      */
4710*495ae853SAndroid Build Coastguard Worker         /*          2. Picture parameter set                       */
4711*495ae853SAndroid Build Coastguard Worker         /*          3. SEI message                                 */
4712*495ae853SAndroid Build Coastguard Worker         i4_non_vcl_status = isvcd_dec_non_vcl(&ps_svcd_ctxt->s_non_vcl_nal, ps_svcd_ctxt->ps_sps,
4713*495ae853SAndroid Build Coastguard Worker                                               ps_svcd_ctxt->ps_pps, ps_svcd_ctxt);
4714*495ae853SAndroid Build Coastguard Worker 
4715*495ae853SAndroid Build Coastguard Worker         if(OK != i4_non_vcl_status) return i4_non_vcl_status;
4716*495ae853SAndroid Build Coastguard Worker     }
4717*495ae853SAndroid Build Coastguard Worker     if(OK != i4_status) return (i4_status);
4718*495ae853SAndroid Build Coastguard Worker     return (OK);
4719*495ae853SAndroid Build Coastguard Worker }
4720*495ae853SAndroid Build Coastguard Worker 
4721*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4722*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4723*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_video_decode                                      */
4724*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4725*495ae853SAndroid Build Coastguard Worker /*  Description   :  handle video decode API command                         */
4726*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4727*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
4728*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
4729*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
4730*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
4731*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
4732*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4733*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
4734*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4735*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4736*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4737*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4738*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
4739*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4740*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4741*495ae853SAndroid Build Coastguard Worker 
isvcd_video_decode(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)4742*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
4743*495ae853SAndroid Build Coastguard Worker {
4744*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
4745*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec_zero_lyr;
4746*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
4747*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_zero_dec;
4748*495ae853SAndroid Build Coastguard Worker 
4749*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
4750*495ae853SAndroid Build Coastguard Worker     WORD32 i4_err_status = 0;
4751*495ae853SAndroid Build Coastguard Worker 
4752*495ae853SAndroid Build Coastguard Worker     UWORD32 bytes_consumed = 0;
4753*495ae853SAndroid Build Coastguard Worker     WORD32 ret = 0, api_ret_value = IV_SUCCESS;
4754*495ae853SAndroid Build Coastguard Worker     isvcd_video_decode_ip_t *ps_h264d_dec_ip;
4755*495ae853SAndroid Build Coastguard Worker     isvcd_video_decode_op_t *ps_h264d_dec_op;
4756*495ae853SAndroid Build Coastguard Worker     ivd_video_decode_ip_t *ps_dec_ip;
4757*495ae853SAndroid Build Coastguard Worker     ivd_video_decode_op_t *ps_dec_op;
4758*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_res_id;
4759*495ae853SAndroid Build Coastguard Worker 
4760*495ae853SAndroid Build Coastguard Worker     ithread_set_name((void *) "Parse_thread");
4761*495ae853SAndroid Build Coastguard Worker 
4762*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) (dec_hdl->pv_codec_handle);
4763*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[0];
4764*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
4765*495ae853SAndroid Build Coastguard Worker 
4766*495ae853SAndroid Build Coastguard Worker     ps_h264d_dec_ip = (isvcd_video_decode_ip_t *) pv_api_ip;
4767*495ae853SAndroid Build Coastguard Worker     ps_h264d_dec_op = (isvcd_video_decode_op_t *) pv_api_op;
4768*495ae853SAndroid Build Coastguard Worker     ps_dec_ip = &ps_h264d_dec_ip->s_ivd_video_decode_ip_t;
4769*495ae853SAndroid Build Coastguard Worker     ps_dec_op = &ps_h264d_dec_op->s_ivd_video_decode_op_t;
4770*495ae853SAndroid Build Coastguard Worker 
4771*495ae853SAndroid Build Coastguard Worker     {
4772*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_size;
4773*495ae853SAndroid Build Coastguard Worker         u4_size = ps_dec_op->u4_size;
4774*495ae853SAndroid Build Coastguard Worker         memset(ps_h264d_dec_op, 0, sizeof(isvcd_video_decode_op_t));
4775*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_size = u4_size;
4776*495ae853SAndroid Build Coastguard Worker     }
4777*495ae853SAndroid Build Coastguard Worker 
4778*495ae853SAndroid Build Coastguard Worker     ps_dec->pv_dec_out = ps_dec_op;
4779*495ae853SAndroid Build Coastguard Worker     if(ps_dec->init_done != 1)
4780*495ae853SAndroid Build Coastguard Worker     {
4781*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
4782*495ae853SAndroid Build Coastguard Worker     }
4783*495ae853SAndroid Build Coastguard Worker 
4784*495ae853SAndroid Build Coastguard Worker     /*Data memory barries instruction,so that bitstream write by the application
4785*495ae853SAndroid Build Coastguard Worker      * is complete*/
4786*495ae853SAndroid Build Coastguard Worker     DATA_SYNC();
4787*495ae853SAndroid Build Coastguard Worker 
4788*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->u1_flushfrm)
4789*495ae853SAndroid Build Coastguard Worker     {
4790*495ae853SAndroid Build Coastguard Worker         if(ps_dec_ip->pv_stream_buffer == NULL)
4791*495ae853SAndroid Build Coastguard Worker         {
4792*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
4793*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= IVD_DEC_FRM_BS_BUF_NULL;
4794*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
4795*495ae853SAndroid Build Coastguard Worker         }
4796*495ae853SAndroid Build Coastguard Worker         if(ps_dec_ip->u4_num_Bytes <= 16)
4797*495ae853SAndroid Build Coastguard Worker         {
4798*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
4799*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= IVD_DEC_NUMBYTES_INV;
4800*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
4801*495ae853SAndroid Build Coastguard Worker         }
4802*495ae853SAndroid Build Coastguard Worker     }
4803*495ae853SAndroid Build Coastguard Worker #ifdef KEEP_THREADS_ACTIVE
4804*495ae853SAndroid Build Coastguard Worker     {
4805*495ae853SAndroid Build Coastguard Worker         UWORD32 i;
4806*495ae853SAndroid Build Coastguard Worker         ps_dec->i4_break_threads = 0;
4807*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < 2; i++)
4808*495ae853SAndroid Build Coastguard Worker         {
4809*495ae853SAndroid Build Coastguard Worker             ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[i]);
4810*495ae853SAndroid Build Coastguard Worker             RETURN_IF((ret != IV_SUCCESS), ret);
4811*495ae853SAndroid Build Coastguard Worker 
4812*495ae853SAndroid Build Coastguard Worker             ps_dec->ai4_process_start[i] = PROC_INIT;
4813*495ae853SAndroid Build Coastguard Worker 
4814*495ae853SAndroid Build Coastguard Worker             ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[i]);
4815*495ae853SAndroid Build Coastguard Worker             RETURN_IF((ret != IV_SUCCESS), ret);
4816*495ae853SAndroid Build Coastguard Worker         }
4817*495ae853SAndroid Build Coastguard Worker     }
4818*495ae853SAndroid Build Coastguard Worker #else
4819*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_dec_thread_created = 0;
4820*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_bs_deblk_thread_created = 0;
4821*495ae853SAndroid Build Coastguard Worker #endif
4822*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_num_bytes_consumed = 0;
4823*495ae853SAndroid Build Coastguard Worker     ps_dec_op->i4_reorder_depth = -1;
4824*495ae853SAndroid Build Coastguard Worker     ps_dec_op->i4_display_index = DEFAULT_POC;
4825*495ae853SAndroid Build Coastguard Worker 
4826*495ae853SAndroid Build Coastguard Worker     ps_dec->ps_out_buffer = NULL;
4827*495ae853SAndroid Build Coastguard Worker     if(ps_dec_ip->u4_size >= offsetof(ivd_video_decode_ip_t, s_out_buffer))
4828*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_out_buffer = &ps_dec_ip->s_out_buffer;
4829*495ae853SAndroid Build Coastguard Worker 
4830*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->u4_share_disp_buf && ps_dec->i4_decode_header == 0)
4831*495ae853SAndroid Build Coastguard Worker     {
4832*495ae853SAndroid Build Coastguard Worker         UWORD32 i;
4833*495ae853SAndroid Build Coastguard Worker         if((ps_dec->ps_out_buffer->u4_num_bufs == 0) ||
4834*495ae853SAndroid Build Coastguard Worker            (ps_dec->ps_out_buffer->u4_num_bufs > IVD_VIDDEC_MAX_IO_BUFFERS))
4835*495ae853SAndroid Build Coastguard Worker         {
4836*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
4837*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS;
4838*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
4839*495ae853SAndroid Build Coastguard Worker         }
4840*495ae853SAndroid Build Coastguard Worker 
4841*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_dec->ps_out_buffer->u4_num_bufs; i++)
4842*495ae853SAndroid Build Coastguard Worker         {
4843*495ae853SAndroid Build Coastguard Worker             if(ps_dec->ps_out_buffer->pu1_bufs[i] == NULL)
4844*495ae853SAndroid Build Coastguard Worker             {
4845*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
4846*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code |= IVD_DISP_FRM_OP_BUF_NULL;
4847*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
4848*495ae853SAndroid Build Coastguard Worker             }
4849*495ae853SAndroid Build Coastguard Worker 
4850*495ae853SAndroid Build Coastguard Worker             if(ps_dec->ps_out_buffer->u4_min_out_buf_size[i] == 0)
4851*495ae853SAndroid Build Coastguard Worker             {
4852*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
4853*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
4854*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
4855*495ae853SAndroid Build Coastguard Worker             }
4856*495ae853SAndroid Build Coastguard Worker         }
4857*495ae853SAndroid Build Coastguard Worker     }
4858*495ae853SAndroid Build Coastguard Worker 
4859*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u4_total_frames_decoded >= NUM_FRAMES_LIMIT)
4860*495ae853SAndroid Build Coastguard Worker     {
4861*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_error_code = ERROR_FRAME_LIMIT_OVER;
4862*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
4863*495ae853SAndroid Build Coastguard Worker     }
4864*495ae853SAndroid Build Coastguard Worker 
4865*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_error_code = 0;
4866*495ae853SAndroid Build Coastguard Worker     ps_dec_op->e_pic_type = IV_NA_FRAME;
4867*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_output_present = 0;
4868*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_frame_decoded_flag = 0;
4869*495ae853SAndroid Build Coastguard Worker 
4870*495ae853SAndroid Build Coastguard Worker     /* In case the decoder is not in flush mode(in shared mode),
4871*495ae853SAndroid Build Coastguard Worker      then decoder has to pick up a buffer to write current frame.
4872*495ae853SAndroid Build Coastguard Worker      Check if a frame is available in such cases */
4873*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u1_init_dec_flag == 1 && ps_dec->u4_share_disp_buf == 1 && ps_dec->u1_flushfrm == 0)
4874*495ae853SAndroid Build Coastguard Worker     {
4875*495ae853SAndroid Build Coastguard Worker         UWORD32 i;
4876*495ae853SAndroid Build Coastguard Worker         WORD32 disp_avail = 0, free_id;
4877*495ae853SAndroid Build Coastguard Worker 
4878*495ae853SAndroid Build Coastguard Worker         /* Check if at least one buffer is available with the codec */
4879*495ae853SAndroid Build Coastguard Worker         /* If not then return to application with error */
4880*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_dec->u1_pic_bufs; i++)
4881*495ae853SAndroid Build Coastguard Worker         {
4882*495ae853SAndroid Build Coastguard Worker             if(0 == ps_dec->u4_disp_buf_mapping[i] || 1 == ps_dec->u4_disp_buf_to_be_freed[i])
4883*495ae853SAndroid Build Coastguard Worker             {
4884*495ae853SAndroid Build Coastguard Worker                 disp_avail = 1;
4885*495ae853SAndroid Build Coastguard Worker                 break;
4886*495ae853SAndroid Build Coastguard Worker             }
4887*495ae853SAndroid Build Coastguard Worker         }
4888*495ae853SAndroid Build Coastguard Worker 
4889*495ae853SAndroid Build Coastguard Worker         if(0 == disp_avail)
4890*495ae853SAndroid Build Coastguard Worker         {
4891*495ae853SAndroid Build Coastguard Worker             /* If something is queued for display wait for that buffer to be returned
4892*495ae853SAndroid Build Coastguard Worker              */
4893*495ae853SAndroid Build Coastguard Worker 
4894*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code = IVD_DEC_REF_BUF_NULL;
4895*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= (1 << IVD_UNSUPPORTEDPARAM);
4896*495ae853SAndroid Build Coastguard Worker             return (IV_FAIL);
4897*495ae853SAndroid Build Coastguard Worker         }
4898*495ae853SAndroid Build Coastguard Worker 
4899*495ae853SAndroid Build Coastguard Worker         while(1)
4900*495ae853SAndroid Build Coastguard Worker         {
4901*495ae853SAndroid Build Coastguard Worker             pic_buffer_t *ps_pic_buf;
4902*495ae853SAndroid Build Coastguard Worker             ps_pic_buf = (pic_buffer_t *) ih264_buf_mgr_get_next_free(
4903*495ae853SAndroid Build Coastguard Worker                 (buf_mgr_t *) ps_dec->pv_pic_buf_mgr, &free_id);
4904*495ae853SAndroid Build Coastguard Worker 
4905*495ae853SAndroid Build Coastguard Worker             if(ps_pic_buf == NULL)
4906*495ae853SAndroid Build Coastguard Worker             {
4907*495ae853SAndroid Build Coastguard Worker                 UWORD32 display_queued = 0;
4908*495ae853SAndroid Build Coastguard Worker 
4909*495ae853SAndroid Build Coastguard Worker                 /* check if any buffer was given for display which is not returned yet */
4910*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < (MAX_DISP_BUFS_NEW); i++)
4911*495ae853SAndroid Build Coastguard Worker                 {
4912*495ae853SAndroid Build Coastguard Worker                     if(0 != ps_dec->u4_disp_buf_mapping[i])
4913*495ae853SAndroid Build Coastguard Worker                     {
4914*495ae853SAndroid Build Coastguard Worker                         display_queued = 1;
4915*495ae853SAndroid Build Coastguard Worker                         break;
4916*495ae853SAndroid Build Coastguard Worker                     }
4917*495ae853SAndroid Build Coastguard Worker                 }
4918*495ae853SAndroid Build Coastguard Worker                 /* If some buffer is queued for display, then codec has to singal an
4919*495ae853SAndroid Build Coastguard Worker                  error and wait for that buffer to be returned. If nothing is queued for
4920*495ae853SAndroid Build Coastguard Worker                  display then codec has ownership of all display buffers and it can
4921*495ae853SAndroid Build Coastguard Worker                  reuse any of the existing buffers and continue decoding */
4922*495ae853SAndroid Build Coastguard Worker 
4923*495ae853SAndroid Build Coastguard Worker                 if(1 == display_queued)
4924*495ae853SAndroid Build Coastguard Worker                 {
4925*495ae853SAndroid Build Coastguard Worker                     /* If something is queued for display wait for that buffer to be
4926*495ae853SAndroid Build Coastguard Worker                      * returned */
4927*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_error_code = IVD_DEC_REF_BUF_NULL;
4928*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_error_code |= (1 << IVD_UNSUPPORTEDPARAM);
4929*495ae853SAndroid Build Coastguard Worker                     return (IV_FAIL);
4930*495ae853SAndroid Build Coastguard Worker                 }
4931*495ae853SAndroid Build Coastguard Worker             }
4932*495ae853SAndroid Build Coastguard Worker             else
4933*495ae853SAndroid Build Coastguard Worker             {
4934*495ae853SAndroid Build Coastguard Worker                 /* If the buffer is with display, then mark it as in use and then look
4935*495ae853SAndroid Build Coastguard Worker                  * for a buffer again */
4936*495ae853SAndroid Build Coastguard Worker                 if(1 == ps_dec->u4_disp_buf_mapping[free_id])
4937*495ae853SAndroid Build Coastguard Worker                 {
4938*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_set_status((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, free_id,
4939*495ae853SAndroid Build Coastguard Worker                                              BUF_MGR_IO);
4940*495ae853SAndroid Build Coastguard Worker                 }
4941*495ae853SAndroid Build Coastguard Worker                 else
4942*495ae853SAndroid Build Coastguard Worker                 {
4943*495ae853SAndroid Build Coastguard Worker                     /**
4944*495ae853SAndroid Build Coastguard Worker                      *  Found a free buffer for present call. Release it now.
4945*495ae853SAndroid Build Coastguard Worker                      *  Will be again obtained later.
4946*495ae853SAndroid Build Coastguard Worker                      */
4947*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, free_id,
4948*495ae853SAndroid Build Coastguard Worker                                           BUF_MGR_IO);
4949*495ae853SAndroid Build Coastguard Worker                     break;
4950*495ae853SAndroid Build Coastguard Worker                 }
4951*495ae853SAndroid Build Coastguard Worker             }
4952*495ae853SAndroid Build Coastguard Worker         }
4953*495ae853SAndroid Build Coastguard Worker     }
4954*495ae853SAndroid Build Coastguard Worker 
4955*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u1_enable_mb_info && (ps_dec->i4_header_decoded & DECODED_SPS_MASK))
4956*495ae853SAndroid Build Coastguard Worker     {
4957*495ae853SAndroid Build Coastguard Worker         UWORD32 blk_qp_map_size = ps_h264d_dec_ip->u4_8x8_blk_qp_map_size;
4958*495ae853SAndroid Build Coastguard Worker         UWORD32 blk_type_map_size = ps_h264d_dec_ip->u4_8x8_blk_type_map_size;
4959*495ae853SAndroid Build Coastguard Worker         UWORD32 blk_8x8_map_size = ps_dec->u4_total_mbs << 2;
4960*495ae853SAndroid Build Coastguard Worker         if((ps_h264d_dec_ip->pu1_8x8_blk_qp_map && blk_qp_map_size < blk_8x8_map_size) ||
4961*495ae853SAndroid Build Coastguard Worker            (ps_h264d_dec_ip->pu1_8x8_blk_type_map && blk_type_map_size < blk_8x8_map_size))
4962*495ae853SAndroid Build Coastguard Worker         {
4963*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
4964*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_error_code |= IH264D_INSUFFICIENT_METADATA_BUFFER;
4965*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
4966*495ae853SAndroid Build Coastguard Worker         }
4967*495ae853SAndroid Build Coastguard Worker     }
4968*495ae853SAndroid Build Coastguard Worker 
4969*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u1_flushfrm && (1 == ps_svcd_ctxt->u1_pre_parse_in_flush))
4970*495ae853SAndroid Build Coastguard Worker     {
4971*495ae853SAndroid Build Coastguard Worker         if(ps_dec->u1_init_dec_flag == 0)
4972*495ae853SAndroid Build Coastguard Worker         {
4973*495ae853SAndroid Build Coastguard Worker             ps_dec->u1_flushfrm = 0;
4974*495ae853SAndroid Build Coastguard Worker             return (IV_FAIL);
4975*495ae853SAndroid Build Coastguard Worker         }
4976*495ae853SAndroid Build Coastguard Worker 
4977*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->s_vcl_nal.i4_num_res_lyrs - 1];
4978*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
4979*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_fmt_conv_cur_row = 0;
4980*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_output_present = 0;
4981*495ae853SAndroid Build Coastguard Worker         ps_dec->s_disp_op.u4_error_code = 1;
4982*495ae853SAndroid Build Coastguard Worker 
4983*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_out_buffer = NULL;
4984*495ae853SAndroid Build Coastguard Worker         if(ps_dec_ip->u4_size >= offsetof(ivd_video_decode_ip_t, s_out_buffer))
4985*495ae853SAndroid Build Coastguard Worker         {
4986*495ae853SAndroid Build Coastguard Worker             ps_dec->ps_out_buffer = &ps_dec_ip->s_out_buffer;
4987*495ae853SAndroid Build Coastguard Worker         }
4988*495ae853SAndroid Build Coastguard Worker         ih264d_get_next_display_field(ps_dec, ps_dec->ps_out_buffer, &(ps_dec->s_disp_op));
4989*495ae853SAndroid Build Coastguard Worker         if(0 == ps_dec->s_disp_op.u4_error_code)
4990*495ae853SAndroid Build Coastguard Worker         {
4991*495ae853SAndroid Build Coastguard Worker             /* check output buffer size given by the application */
4992*495ae853SAndroid Build Coastguard Worker             if(check_app_out_buf_size(ps_dec) != IV_SUCCESS)
4993*495ae853SAndroid Build Coastguard Worker             {
4994*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code = IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
4995*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
4996*495ae853SAndroid Build Coastguard Worker             }
4997*495ae853SAndroid Build Coastguard Worker 
4998*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_fmt_conv_cur_row = 0;
4999*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_fmt_conv_num_rows = ps_dec->s_disp_frame_info.u4_y_ht;
5000*495ae853SAndroid Build Coastguard Worker             ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op), ps_dec->u4_fmt_conv_cur_row,
5001*495ae853SAndroid Build Coastguard Worker                                   ps_dec->u4_fmt_conv_num_rows);
5002*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
5003*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_output_present = 1;
5004*495ae853SAndroid Build Coastguard Worker             if(ps_dec->u1_enable_mb_info)
5005*495ae853SAndroid Build Coastguard Worker             {
5006*495ae853SAndroid Build Coastguard Worker                 UWORD32 disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
5007*495ae853SAndroid Build Coastguard Worker                 if(ps_h264d_dec_ip->pu1_8x8_blk_qp_map)
5008*495ae853SAndroid Build Coastguard Worker                 {
5009*495ae853SAndroid Build Coastguard Worker                     ps_h264d_dec_op->pu1_8x8_blk_qp_map = ps_h264d_dec_ip->pu1_8x8_blk_qp_map;
5010*495ae853SAndroid Build Coastguard Worker                     ps_h264d_dec_op->u4_8x8_blk_qp_map_size = ps_dec->u4_total_mbs << 2;
5011*495ae853SAndroid Build Coastguard Worker                     ih264_memcpy(ps_h264d_dec_op->pu1_8x8_blk_qp_map,
5012*495ae853SAndroid Build Coastguard Worker                                  ps_dec->as_buf_id_info_map[disp_buf_id].pu1_qp_map,
5013*495ae853SAndroid Build Coastguard Worker                                  ps_dec->u4_total_mbs << 2);
5014*495ae853SAndroid Build Coastguard Worker                 }
5015*495ae853SAndroid Build Coastguard Worker                 if(ps_h264d_dec_ip->pu1_8x8_blk_type_map)
5016*495ae853SAndroid Build Coastguard Worker                 {
5017*495ae853SAndroid Build Coastguard Worker                     ps_h264d_dec_op->pu1_8x8_blk_type_map = ps_h264d_dec_ip->pu1_8x8_blk_type_map;
5018*495ae853SAndroid Build Coastguard Worker                     ps_h264d_dec_op->u4_8x8_blk_type_map_size = ps_dec->u4_total_mbs << 2;
5019*495ae853SAndroid Build Coastguard Worker                     ih264_memcpy(ps_h264d_dec_op->pu1_8x8_blk_type_map,
5020*495ae853SAndroid Build Coastguard Worker                                  ps_dec->as_buf_id_info_map[disp_buf_id].pu1_mb_type_map,
5021*495ae853SAndroid Build Coastguard Worker                                  ps_dec->u4_total_mbs << 2);
5022*495ae853SAndroid Build Coastguard Worker                 }
5023*495ae853SAndroid Build Coastguard Worker             }
5024*495ae853SAndroid Build Coastguard Worker         }
5025*495ae853SAndroid Build Coastguard Worker         ih264d_export_sei_params(&ps_dec_op->s_sei_decode_op, ps_dec);
5026*495ae853SAndroid Build Coastguard Worker 
5027*495ae853SAndroid Build Coastguard Worker         ih264d_release_display_field(ps_dec, &(ps_dec->s_disp_op));
5028*495ae853SAndroid Build Coastguard Worker 
5029*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_pic_wd = (UWORD32) ps_dec->u2_disp_width;
5030*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_pic_ht = (UWORD32) ps_dec->u2_disp_height;
5031*495ae853SAndroid Build Coastguard Worker         ps_dec_op->i4_reorder_depth = ps_dec->i4_reorder_depth;
5032*495ae853SAndroid Build Coastguard Worker         ps_dec_op->i4_display_index = ps_dec->i4_display_index;
5033*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_new_seq = 0;
5034*495ae853SAndroid Build Coastguard Worker 
5035*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_output_present = ps_dec->u4_output_present;
5036*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_progressive_frame_flag = ps_dec->s_disp_op.u4_progressive_frame_flag;
5037*495ae853SAndroid Build Coastguard Worker         ps_dec_op->e_output_format = ps_dec->s_disp_op.e_output_format;
5038*495ae853SAndroid Build Coastguard Worker         ps_dec_op->s_disp_frm_buf = ps_dec->s_disp_op.s_disp_frm_buf;
5039*495ae853SAndroid Build Coastguard Worker         ps_dec_op->e4_fld_type = ps_dec->s_disp_op.e4_fld_type;
5040*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_ts = ps_dec->s_disp_op.u4_ts;
5041*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
5042*495ae853SAndroid Build Coastguard Worker 
5043*495ae853SAndroid Build Coastguard Worker         /*In the case of flush ,since no frame is decoded set pic type as invalid*/
5044*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_is_ref_flag = UINT32_MAX;
5045*495ae853SAndroid Build Coastguard Worker         ps_dec_op->e_pic_type = IV_NA_FRAME;
5046*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_frame_decoded_flag = 0;
5047*495ae853SAndroid Build Coastguard Worker 
5048*495ae853SAndroid Build Coastguard Worker         if(0 == ps_dec->s_disp_op.u4_error_code)
5049*495ae853SAndroid Build Coastguard Worker         {
5050*495ae853SAndroid Build Coastguard Worker             return (IV_SUCCESS);
5051*495ae853SAndroid Build Coastguard Worker         }
5052*495ae853SAndroid Build Coastguard Worker         else
5053*495ae853SAndroid Build Coastguard Worker             return (IV_FAIL);
5054*495ae853SAndroid Build Coastguard Worker     }
5055*495ae853SAndroid Build Coastguard Worker 
5056*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u1_res_changed == 1)
5057*495ae853SAndroid Build Coastguard Worker     {
5058*495ae853SAndroid Build Coastguard Worker         /*if resolution has changed and all buffers have been flushed, reset
5059*495ae853SAndroid Build Coastguard Worker          * decoder*/
5060*495ae853SAndroid Build Coastguard Worker         if(((buf_mgr_t *) ps_dec->pv_pic_buf_mgr)->pv_mutex != NULL)
5061*495ae853SAndroid Build Coastguard Worker             ih264_buf_mgr_free(ps_dec->pv_pic_buf_mgr);
5062*495ae853SAndroid Build Coastguard Worker         if(((buf_mgr_t *) ps_dec->pv_mv_buf_mgr)->pv_mutex != NULL)
5063*495ae853SAndroid Build Coastguard Worker             ih264_buf_mgr_free(ps_dec->pv_mv_buf_mgr);
5064*495ae853SAndroid Build Coastguard Worker 
5065*495ae853SAndroid Build Coastguard Worker         isvcd_init_decoder(ps_svc_lyr_dec);
5066*495ae853SAndroid Build Coastguard Worker     }
5067*495ae853SAndroid Build Coastguard Worker 
5068*495ae853SAndroid Build Coastguard Worker     DEBUG_THREADS_PRINTF(" Starting process call\n");
5069*495ae853SAndroid Build Coastguard Worker 
5070*495ae853SAndroid Build Coastguard Worker     {
5071*495ae853SAndroid Build Coastguard Worker         vcl_node_t *ps_cur_node;
5072*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_num_res_lyrs;
5073*495ae853SAndroid Build Coastguard Worker         vcl_buf_hdr_t *ps_vcl_buf;
5074*495ae853SAndroid Build Coastguard Worker         UWORD8 flush_decode = 1;
5075*495ae853SAndroid Build Coastguard Worker         ps_svcd_ctxt->u1_pre_parse_in_flush = 0;
5076*495ae853SAndroid Build Coastguard Worker 
5077*495ae853SAndroid Build Coastguard Worker         ret = isvcd_pre_parse_refine_au(ps_svcd_ctxt, ps_dec_ip, &ps_dec_op->u4_num_bytes_consumed);
5078*495ae853SAndroid Build Coastguard Worker         ps_svcd_ctxt->u1_pre_parse_in_flush = (ret == FLUSH);
5079*495ae853SAndroid Build Coastguard Worker 
5080*495ae853SAndroid Build Coastguard Worker         if(ret != OK)
5081*495ae853SAndroid Build Coastguard Worker         {
5082*495ae853SAndroid Build Coastguard Worker             UWORD32 error = ih264d_map_error((UWORD32) ret);
5083*495ae853SAndroid Build Coastguard Worker             if(ret != NOT_OK)
5084*495ae853SAndroid Build Coastguard Worker             {
5085*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code = error | ret;
5086*495ae853SAndroid Build Coastguard Worker             }
5087*495ae853SAndroid Build Coastguard Worker             if((ps_dec_op->u4_error_code >> IVD_FATALERROR) & 1)
5088*495ae853SAndroid Build Coastguard Worker             {
5089*495ae853SAndroid Build Coastguard Worker                 ps_svcd_ctxt->u1_exit_till_next_IDR = 1;
5090*495ae853SAndroid Build Coastguard Worker             }
5091*495ae853SAndroid Build Coastguard Worker             api_ret_value = IV_FAIL;
5092*495ae853SAndroid Build Coastguard Worker             if((ret == IVD_RES_CHANGED) || (ret == IVD_MEM_ALLOC_FAILED) ||
5093*495ae853SAndroid Build Coastguard Worker                (ret == ERROR_UNAVAIL_PICBUF_T) || (ret == ERROR_UNAVAIL_MVBUF_T) ||
5094*495ae853SAndroid Build Coastguard Worker                (ret == ERROR_INV_SPS_PPS_T) || (ret == ERROR_FEATURE_UNAVAIL) ||
5095*495ae853SAndroid Build Coastguard Worker                (ret == IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED) ||
5096*495ae853SAndroid Build Coastguard Worker                (ret == IVD_DISP_FRM_ZERO_OP_BUF_SIZE))
5097*495ae853SAndroid Build Coastguard Worker             {
5098*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_slice_start_code_found = 0;
5099*495ae853SAndroid Build Coastguard Worker             }
5100*495ae853SAndroid Build Coastguard Worker             if((ret == ERROR_INCOMPLETE_FRAME) || (ret == ERROR_DANGLING_FIELD_IN_PIC))
5101*495ae853SAndroid Build Coastguard Worker             {
5102*495ae853SAndroid Build Coastguard Worker                 api_ret_value = IV_FAIL;
5103*495ae853SAndroid Build Coastguard Worker             }
5104*495ae853SAndroid Build Coastguard Worker 
5105*495ae853SAndroid Build Coastguard Worker             if(ret == ERROR_IN_LAST_SLICE_OF_PIC)
5106*495ae853SAndroid Build Coastguard Worker             {
5107*495ae853SAndroid Build Coastguard Worker                 api_ret_value = IV_FAIL;
5108*495ae853SAndroid Build Coastguard Worker             }
5109*495ae853SAndroid Build Coastguard Worker         }
5110*495ae853SAndroid Build Coastguard Worker 
5111*495ae853SAndroid Build Coastguard Worker         if(NOT_OK == ret)
5112*495ae853SAndroid Build Coastguard Worker         {
5113*495ae853SAndroid Build Coastguard Worker             if(ps_dec->u4_pic_buf_got == 0)
5114*495ae853SAndroid Build Coastguard Worker             {
5115*495ae853SAndroid Build Coastguard Worker                 ps_dec->i4_error_code = ERROR_START_CODE_NOT_FOUND;
5116*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code |= 1 << IVD_INSUFFICIENTDATA;
5117*495ae853SAndroid Build Coastguard Worker 
5118*495ae853SAndroid Build Coastguard Worker                 isvcd_fill_output_struct_from_context(ps_svc_lyr_dec, ps_dec_op);
5119*495ae853SAndroid Build Coastguard Worker 
5120*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code = ps_dec->i4_error_code;
5121*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_frame_decoded_flag = 0;
5122*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
5123*495ae853SAndroid Build Coastguard Worker             }
5124*495ae853SAndroid Build Coastguard Worker             return (IV_SUCCESS);
5125*495ae853SAndroid Build Coastguard Worker         }
5126*495ae853SAndroid Build Coastguard Worker 
5127*495ae853SAndroid Build Coastguard Worker         u1_num_res_lyrs = ps_svcd_ctxt->s_vcl_nal.i4_num_res_lyrs;
5128*495ae853SAndroid Build Coastguard Worker 
5129*495ae853SAndroid Build Coastguard Worker         /* error concelment: exit till next IDR if any of Non Target layers are
5130*495ae853SAndroid Build Coastguard Worker          * corrupted */
5131*495ae853SAndroid Build Coastguard Worker         {
5132*495ae853SAndroid Build Coastguard Worker             ps_cur_node = ps_svcd_ctxt->s_vcl_nal.ps_bot_node;
5133*495ae853SAndroid Build Coastguard Worker 
5134*495ae853SAndroid Build Coastguard Worker             if(NULL != ps_cur_node)
5135*495ae853SAndroid Build Coastguard Worker             {
5136*495ae853SAndroid Build Coastguard Worker                 if(!ps_cur_node->i4_idr_pic_flag)
5137*495ae853SAndroid Build Coastguard Worker                 {
5138*495ae853SAndroid Build Coastguard Worker                     if(u1_num_res_lyrs != ps_svcd_ctxt->u1_prev_num_res_layers)
5139*495ae853SAndroid Build Coastguard Worker                     {
5140*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->u1_exit_till_next_IDR = 1;
5141*495ae853SAndroid Build Coastguard Worker                         ps_dec_op->u4_error_code = ERROR_UNKNOWN_NAL;
5142*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
5143*495ae853SAndroid Build Coastguard Worker                     }
5144*495ae853SAndroid Build Coastguard Worker                 }
5145*495ae853SAndroid Build Coastguard Worker                 else
5146*495ae853SAndroid Build Coastguard Worker                 {
5147*495ae853SAndroid Build Coastguard Worker                     if(u1_num_res_lyrs != ps_svcd_ctxt->u1_prev_num_res_layers)
5148*495ae853SAndroid Build Coastguard Worker                     {
5149*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->u1_prev_num_res_layers = u1_num_res_lyrs;
5150*495ae853SAndroid Build Coastguard Worker                     }
5151*495ae853SAndroid Build Coastguard Worker                 }
5152*495ae853SAndroid Build Coastguard Worker             }
5153*495ae853SAndroid Build Coastguard Worker         }
5154*495ae853SAndroid Build Coastguard Worker         if(ps_svcd_ctxt->u1_prev_num_res_layers != u1_num_res_lyrs && (u1_num_res_lyrs != 0))
5155*495ae853SAndroid Build Coastguard Worker         {
5156*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr + u1_num_res_lyrs - 1;
5157*495ae853SAndroid Build Coastguard Worker             ps_dec = &ps_svc_lyr_dec->s_dec;
5158*495ae853SAndroid Build Coastguard Worker 
5159*495ae853SAndroid Build Coastguard Worker             if(ps_dec->u1_init_dec_flag == 1)
5160*495ae853SAndroid Build Coastguard Worker             {
5161*495ae853SAndroid Build Coastguard Worker                 ih264d_release_pics_in_dpb((void *) ps_dec, ps_dec->u1_pic_bufs);
5162*495ae853SAndroid Build Coastguard Worker                 ih264d_release_display_bufs(ps_dec);
5163*495ae853SAndroid Build Coastguard Worker                 ih264_disp_mgr_init((disp_mgr_t *) ps_dec->pv_disp_buf_mgr);
5164*495ae853SAndroid Build Coastguard Worker 
5165*495ae853SAndroid Build Coastguard Worker                 ih264_buf_mgr_reset(ps_dec->pv_pic_buf_mgr);
5166*495ae853SAndroid Build Coastguard Worker                 ih264_buf_mgr_reset(ps_dec->pv_mv_buf_mgr);
5167*495ae853SAndroid Build Coastguard Worker                 ih264d_init_ref_bufs(ps_dec->ps_dpb_mgr);
5168*495ae853SAndroid Build Coastguard Worker             }
5169*495ae853SAndroid Build Coastguard Worker 
5170*495ae853SAndroid Build Coastguard Worker             // ps_svcd_ctxt->u1_prev_num_res_layers = u1_num_res_lyrs;
5171*495ae853SAndroid Build Coastguard Worker         }
5172*495ae853SAndroid Build Coastguard Worker         ps_svcd_ctxt->u1_parse_nal_unit_error = 0;
5173*495ae853SAndroid Build Coastguard Worker 
5174*495ae853SAndroid Build Coastguard Worker         if((1 == ps_svcd_ctxt->u1_exit_till_next_IDR) &&
5175*495ae853SAndroid Build Coastguard Worker            (ps_svcd_ctxt->s_vcl_nal.ps_bot_node != NULL))
5176*495ae853SAndroid Build Coastguard Worker         {
5177*495ae853SAndroid Build Coastguard Worker             if(1 == ps_svcd_ctxt->s_vcl_nal.ps_bot_node->i4_idr_pic_flag)
5178*495ae853SAndroid Build Coastguard Worker             {
5179*495ae853SAndroid Build Coastguard Worker                 ps_svcd_ctxt->u1_exit_till_next_IDR = 0;
5180*495ae853SAndroid Build Coastguard Worker 
5181*495ae853SAndroid Build Coastguard Worker                 for(u1_res_id = 0; u1_res_id < u1_num_res_lyrs; u1_res_id++)
5182*495ae853SAndroid Build Coastguard Worker                 {
5183*495ae853SAndroid Build Coastguard Worker                     ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr + u1_res_id;
5184*495ae853SAndroid Build Coastguard Worker                     ps_dec = &ps_svc_lyr_dec->s_dec;
5185*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_reset(ps_dec->pv_pic_buf_mgr);
5186*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_reset(ps_dec->pv_mv_buf_mgr);
5187*495ae853SAndroid Build Coastguard Worker                 }
5188*495ae853SAndroid Build Coastguard Worker             }
5189*495ae853SAndroid Build Coastguard Worker             else
5190*495ae853SAndroid Build Coastguard Worker             {
5191*495ae853SAndroid Build Coastguard Worker                 ps_dec_op->u4_error_code = ERROR_UNKNOWN_NAL;
5192*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
5193*495ae853SAndroid Build Coastguard Worker             }
5194*495ae853SAndroid Build Coastguard Worker         }
5195*495ae853SAndroid Build Coastguard Worker 
5196*495ae853SAndroid Build Coastguard Worker         if((0 == ps_dec->i4_decode_header) && (OK == ret))
5197*495ae853SAndroid Build Coastguard Worker         {
5198*495ae853SAndroid Build Coastguard Worker             flush_decode = 0;
5199*495ae853SAndroid Build Coastguard Worker             ps_cur_node = ps_svcd_ctxt->s_vcl_nal.ps_bot_node;
5200*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_zero_dec = ps_svcd_ctxt->ps_svc_dec_lyr;
5201*495ae853SAndroid Build Coastguard Worker             ps_dec_zero_lyr = &ps_svc_lyr_zero_dec->s_dec;
5202*495ae853SAndroid Build Coastguard Worker             /* master loop */
5203*495ae853SAndroid Build Coastguard Worker 
5204*495ae853SAndroid Build Coastguard Worker             for(u1_res_id = 0; u1_res_id < u1_num_res_lyrs; u1_res_id++)
5205*495ae853SAndroid Build Coastguard Worker             {
5206*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_layer_nal_data_present = 0;
5207*495ae853SAndroid Build Coastguard Worker                 ps_svcd_ctxt->u1_cur_layer_id = u1_res_id;
5208*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr + u1_res_id;
5209*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->u1_res_init_done = 0;
5210*495ae853SAndroid Build Coastguard Worker                 ps_dec = &ps_svc_lyr_dec->s_dec;
5211*495ae853SAndroid Build Coastguard Worker 
5212*495ae853SAndroid Build Coastguard Worker                 ps_dec->i4_decode_header = ps_dec_zero_lyr->i4_decode_header;
5213*495ae853SAndroid Build Coastguard Worker                 ps_dec->i4_header_decoded = ps_dec_zero_lyr->i4_header_decoded;
5214*495ae853SAndroid Build Coastguard Worker                 ps_dec->u1_pic_decode_done = 0;
5215*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_fmt_conv_cur_row = 0;
5216*495ae853SAndroid Build Coastguard Worker 
5217*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_output_present = 0;
5218*495ae853SAndroid Build Coastguard Worker                 ps_dec->s_disp_op.u4_error_code = 1;
5219*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_fmt_conv_num_rows = FMT_CONV_NUM_ROWS;
5220*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_ts = ps_dec_ip->u4_ts;
5221*495ae853SAndroid Build Coastguard Worker                 ps_dec->i4_frametype = IV_NA_FRAME;
5222*495ae853SAndroid Build Coastguard Worker                 ps_dec->i4_content_type = IV_CONTENTTYPE_NA;
5223*495ae853SAndroid Build Coastguard Worker 
5224*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_slice_start_code_found = 0;
5225*495ae853SAndroid Build Coastguard Worker                 ps_dec->u2_cur_mb_addr = 0;
5226*495ae853SAndroid Build Coastguard Worker                 ps_dec->u2_total_mbs_coded = 0;
5227*495ae853SAndroid Build Coastguard Worker                 ps_dec->u2_cur_slice_num = 0;
5228*495ae853SAndroid Build Coastguard Worker                 ps_dec->cur_dec_mb_num = 0;
5229*495ae853SAndroid Build Coastguard Worker                 ps_dec->cur_recon_mb_num = 0;
5230*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_first_slice_in_pic = 1;
5231*495ae853SAndroid Build Coastguard Worker                 ps_dec->u1_slice_header_done = 0;
5232*495ae853SAndroid Build Coastguard Worker                 ps_dec->u1_dangling_field = 0;
5233*495ae853SAndroid Build Coastguard Worker 
5234*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_dec_thread_created = 0;
5235*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_bs_deblk_thread_created = 0;
5236*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_cur_bs_mb_num = 0;
5237*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_cur_deblk_mb_num = 0;
5238*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_start_recon_deblk = 0;
5239*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_sps_cnt_in_process = 0;
5240*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_pic_buf_got = 0;
5241*495ae853SAndroid Build Coastguard Worker                 ps_dec->pv_dec_out = ps_dec_op;
5242*495ae853SAndroid Build Coastguard Worker 
5243*495ae853SAndroid Build Coastguard Worker                 if(ps_dec_ip->u4_size >= offsetof(ivd_video_decode_ip_t, s_out_buffer))
5244*495ae853SAndroid Build Coastguard Worker                     ps_dec->ps_out_buffer = &ps_dec_ip->s_out_buffer;
5245*495ae853SAndroid Build Coastguard Worker 
5246*495ae853SAndroid Build Coastguard Worker                 ps_dec->u1_nal_unit_type = ps_cur_node->i4_nal_unit_type;
5247*495ae853SAndroid Build Coastguard Worker                 ps_dec->u1_separate_parse = 0;
5248*495ae853SAndroid Build Coastguard Worker                 if(u1_res_id == (u1_num_res_lyrs - 1))
5249*495ae853SAndroid Build Coastguard Worker                 {
5250*495ae853SAndroid Build Coastguard Worker                     ps_svc_lyr_dec->u1_layer_identifier = TARGET_LAYER;
5251*495ae853SAndroid Build Coastguard Worker                     if(ps_dec->u4_num_cores >= 2)
5252*495ae853SAndroid Build Coastguard Worker                     {
5253*495ae853SAndroid Build Coastguard Worker                         ps_dec->u4_num_cores = 2;
5254*495ae853SAndroid Build Coastguard Worker                         ps_dec->u1_separate_parse = 1;
5255*495ae853SAndroid Build Coastguard Worker                     }
5256*495ae853SAndroid Build Coastguard Worker                 }
5257*495ae853SAndroid Build Coastguard Worker                 else if(u1_res_id == 0)
5258*495ae853SAndroid Build Coastguard Worker                 {
5259*495ae853SAndroid Build Coastguard Worker                     ps_svc_lyr_dec->u1_layer_identifier = BASE_LAYER;
5260*495ae853SAndroid Build Coastguard Worker                     ps_dec->u1_separate_parse = 0;
5261*495ae853SAndroid Build Coastguard Worker                     ps_dec->u4_num_cores = 1;
5262*495ae853SAndroid Build Coastguard Worker                 }
5263*495ae853SAndroid Build Coastguard Worker                 else if(u1_res_id != 0)
5264*495ae853SAndroid Build Coastguard Worker                 {
5265*495ae853SAndroid Build Coastguard Worker                     ps_svc_lyr_dec->u1_layer_identifier = MEDIAL_ENHANCEMENT_LAYER;
5266*495ae853SAndroid Build Coastguard Worker                     ps_dec->u1_separate_parse = 0;
5267*495ae853SAndroid Build Coastguard Worker                     ps_dec->u4_num_cores = 1;
5268*495ae853SAndroid Build Coastguard Worker                 }
5269*495ae853SAndroid Build Coastguard Worker                 else
5270*495ae853SAndroid Build Coastguard Worker                 {
5271*495ae853SAndroid Build Coastguard Worker                     return IV_FAIL;
5272*495ae853SAndroid Build Coastguard Worker                 }
5273*495ae853SAndroid Build Coastguard Worker 
5274*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->u1_base_res_flag = (0 == u1_res_id);
5275*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag = ps_cur_node->i4_idr_pic_flag;
5276*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_dependency_id = ps_cur_node->i4_dependency_id;
5277*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_priority_id = ps_cur_node->i4_priority_id;
5278*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_no_inter_layer_pred_flag =
5279*495ae853SAndroid Build Coastguard Worker                     ps_cur_node->u1_acc_no_int_pred;
5280*495ae853SAndroid Build Coastguard Worker 
5281*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id = ps_cur_node->i4_quality_id;
5282*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_temporal_id = ps_cur_node->i4_temporal_id;
5283*495ae853SAndroid Build Coastguard Worker 
5284*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_use_ref_base_pic_flag =
5285*495ae853SAndroid Build Coastguard Worker                     ps_cur_node->i4_use_ref_base;
5286*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_discardable_flag = 0;
5287*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->ps_nal_svc_ext->u1_svc_ext_flag = (u1_res_id > 1);
5288*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->u4_pps_id_for_layer = UINT32_MAX;
5289*495ae853SAndroid Build Coastguard Worker                 ps_vcl_buf = ps_cur_node->ps_first_vcl_nal;
5290*495ae853SAndroid Build Coastguard Worker                 ps_svc_lyr_dec->u1_error_in_cur_frame = 0;
5291*495ae853SAndroid Build Coastguard Worker 
5292*495ae853SAndroid Build Coastguard Worker                 /* Only for Non target Layers*/
5293*495ae853SAndroid Build Coastguard Worker                 if(NULL != ps_cur_node->ps_top_node)
5294*495ae853SAndroid Build Coastguard Worker                 {
5295*495ae853SAndroid Build Coastguard Worker                     ps_svc_lyr_dec->u1_inter_lyr_disable_dblk_filter_idc =
5296*495ae853SAndroid Build Coastguard Worker                         ps_cur_node->ps_top_node->i4_inter_lyr_dblk_idc;
5297*495ae853SAndroid Build Coastguard Worker                     ps_svc_lyr_dec->i1_inter_lyr_slice_alpha_c0_offset =
5298*495ae853SAndroid Build Coastguard Worker                         ps_cur_node->ps_top_node->i4_inter_lyr_alpha_c0_offset;
5299*495ae853SAndroid Build Coastguard Worker                     ps_svc_lyr_dec->i1_inter_lyr_slice_beta_offset =
5300*495ae853SAndroid Build Coastguard Worker                         ps_cur_node->ps_top_node->i4_inter_lyr_beta_offset;
5301*495ae853SAndroid Build Coastguard Worker                 }
5302*495ae853SAndroid Build Coastguard Worker 
5303*495ae853SAndroid Build Coastguard Worker                 while(NULL != ps_vcl_buf)
5304*495ae853SAndroid Build Coastguard Worker                 {
5305*495ae853SAndroid Build Coastguard Worker                     u1_layer_nal_data_present = 1;
5306*495ae853SAndroid Build Coastguard Worker                     ps_dec->ps_bitstrm->u4_ofst = 0;
5307*495ae853SAndroid Build Coastguard Worker                     ps_dec->ps_bitstrm->pu4_buffer =
5308*495ae853SAndroid Build Coastguard Worker                         (UWORD32 *) ((UWORD8 *) ps_vcl_buf + ps_vcl_buf->i4_buf_offset +
5309*495ae853SAndroid Build Coastguard Worker                                      ps_vcl_buf->i4_slice_offset);
5310*495ae853SAndroid Build Coastguard Worker 
5311*495ae853SAndroid Build Coastguard Worker                     ps_dec->ps_bitstrm->u4_max_ofst = ps_vcl_buf->u4_max_bits;
5312*495ae853SAndroid Build Coastguard Worker 
5313*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_frame_decoded_flag = 0;
5314*495ae853SAndroid Build Coastguard Worker                     ret = isvcd_parse_nal_unit(ps_svc_lyr_dec, ps_cur_node->i4_nal_ref_idc);
5315*495ae853SAndroid Build Coastguard Worker                     if(ret != OK)
5316*495ae853SAndroid Build Coastguard Worker                     {
5317*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->u1_parse_nal_unit_error = 1;
5318*495ae853SAndroid Build Coastguard Worker                         break;
5319*495ae853SAndroid Build Coastguard Worker                     }
5320*495ae853SAndroid Build Coastguard Worker 
5321*495ae853SAndroid Build Coastguard Worker                     /* go to the next slice */
5322*495ae853SAndroid Build Coastguard Worker                     ps_vcl_buf = ps_vcl_buf->ps_next;
5323*495ae853SAndroid Build Coastguard Worker                 }
5324*495ae853SAndroid Build Coastguard Worker                 /* error concelment: exit till next IDR if a Layer data is missing */
5325*495ae853SAndroid Build Coastguard Worker                 if(0 == u1_layer_nal_data_present)
5326*495ae853SAndroid Build Coastguard Worker                 {
5327*495ae853SAndroid Build Coastguard Worker                     ps_svcd_ctxt->u1_exit_till_next_IDR = 1;
5328*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_error_code = ERROR_UNKNOWN_NAL;
5329*495ae853SAndroid Build Coastguard Worker                     return IV_FAIL;
5330*495ae853SAndroid Build Coastguard Worker                 }
5331*495ae853SAndroid Build Coastguard Worker                 /* error concelment: exit till next IDR if any of Non Target layers are
5332*495ae853SAndroid Build Coastguard Worker                  * corrupted */
5333*495ae853SAndroid Build Coastguard Worker                 if((ret != OK) && (u1_res_id != (u1_num_res_lyrs - 1)))
5334*495ae853SAndroid Build Coastguard Worker                 {
5335*495ae853SAndroid Build Coastguard Worker                     ps_svcd_ctxt->u1_exit_till_next_IDR = 1;
5336*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_error_code = ERROR_UNKNOWN_NAL;
5337*495ae853SAndroid Build Coastguard Worker                     return IV_FAIL;
5338*495ae853SAndroid Build Coastguard Worker                 }
5339*495ae853SAndroid Build Coastguard Worker 
5340*495ae853SAndroid Build Coastguard Worker                 if((ret != OK) && (u1_res_id == (u1_num_res_lyrs - 1)))
5341*495ae853SAndroid Build Coastguard Worker                 {
5342*495ae853SAndroid Build Coastguard Worker                     ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr + u1_num_res_lyrs - 1;
5343*495ae853SAndroid Build Coastguard Worker                     ps_dec = &ps_svc_lyr_dec->s_dec;
5344*495ae853SAndroid Build Coastguard Worker 
5345*495ae853SAndroid Build Coastguard Worker                     if((0 == ps_svcd_ctxt->u4_num_sps_ctr) || (0 == ps_svcd_ctxt->u4_num_pps_ctr) ||
5346*495ae853SAndroid Build Coastguard Worker                        (NULL == ps_dec->ps_cur_pps) || (ps_svc_lyr_dec->u1_res_init_done == 0))
5347*495ae853SAndroid Build Coastguard Worker                     {
5348*495ae853SAndroid Build Coastguard Worker                         ps_svcd_ctxt->u1_exit_till_next_IDR = 1;
5349*495ae853SAndroid Build Coastguard Worker                         ps_dec_op->u4_error_code = ERROR_UNKNOWN_NAL;
5350*495ae853SAndroid Build Coastguard Worker                         ih264d_signal_decode_thread(ps_dec);
5351*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
5352*495ae853SAndroid Build Coastguard Worker                     }
5353*495ae853SAndroid Build Coastguard Worker                 }
5354*495ae853SAndroid Build Coastguard Worker                 ps_cur_node = ps_cur_node->ps_top_node;
5355*495ae853SAndroid Build Coastguard Worker 
5356*495ae853SAndroid Build Coastguard Worker                 if((ps_dec->u4_pic_buf_got == 1) && (ret != IVD_MEM_ALLOC_FAILED) &&
5357*495ae853SAndroid Build Coastguard Worker                    ps_dec->u2_total_mbs_coded < ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
5358*495ae853SAndroid Build Coastguard Worker                 {
5359*495ae853SAndroid Build Coastguard Worker                     // last slice - missing/corruption
5360*495ae853SAndroid Build Coastguard Worker                     WORD32 num_mb_skipped;
5361*495ae853SAndroid Build Coastguard Worker                     WORD32 prev_slice_err;
5362*495ae853SAndroid Build Coastguard Worker                     pocstruct_t temp_poc;
5363*495ae853SAndroid Build Coastguard Worker                     WORD32 ret1;
5364*495ae853SAndroid Build Coastguard Worker                     WORD32 ht_in_mbs;
5365*495ae853SAndroid Build Coastguard Worker                     ht_in_mbs = ps_dec->u2_pic_ht >> (4 + ps_dec->ps_cur_slice->u1_field_pic_flag);
5366*495ae853SAndroid Build Coastguard Worker                     num_mb_skipped =
5367*495ae853SAndroid Build Coastguard Worker                         (ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) - ps_dec->u2_total_mbs_coded;
5368*495ae853SAndroid Build Coastguard Worker 
5369*495ae853SAndroid Build Coastguard Worker                     if(ps_dec->u4_first_slice_in_pic && (ps_dec->u4_pic_buf_got == 0))
5370*495ae853SAndroid Build Coastguard Worker                         prev_slice_err = 1;
5371*495ae853SAndroid Build Coastguard Worker                     else
5372*495ae853SAndroid Build Coastguard Worker                         prev_slice_err = 2;
5373*495ae853SAndroid Build Coastguard Worker 
5374*495ae853SAndroid Build Coastguard Worker                     if(ps_dec->u2_total_mbs_coded == 0)
5375*495ae853SAndroid Build Coastguard Worker                     {
5376*495ae853SAndroid Build Coastguard Worker                         prev_slice_err = 1;
5377*495ae853SAndroid Build Coastguard Worker                     }
5378*495ae853SAndroid Build Coastguard Worker                     ret1 = isvcd_mark_err_slice_skip(
5379*495ae853SAndroid Build Coastguard Worker                         ps_svc_lyr_dec, num_mb_skipped, ps_dec->u1_nal_unit_type == IDR_SLICE_NAL,
5380*495ae853SAndroid Build Coastguard Worker                         ps_dec->ps_cur_slice->u2_frame_num, &temp_poc, prev_slice_err);
5381*495ae853SAndroid Build Coastguard Worker 
5382*495ae853SAndroid Build Coastguard Worker                     if((ret1 == ERROR_UNAVAIL_PICBUF_T) || (ret1 == ERROR_UNAVAIL_MVBUF_T) ||
5383*495ae853SAndroid Build Coastguard Worker                        (ret1 == ERROR_INV_SPS_PPS_T) || (ret1 == ERROR_CORRUPTED_SLICE) ||
5384*495ae853SAndroid Build Coastguard Worker                        (ret == NOT_OK))
5385*495ae853SAndroid Build Coastguard Worker                     {
5386*495ae853SAndroid Build Coastguard Worker                         ret = ret1;
5387*495ae853SAndroid Build Coastguard Worker                     }
5388*495ae853SAndroid Build Coastguard Worker                 }
5389*495ae853SAndroid Build Coastguard Worker 
5390*495ae853SAndroid Build Coastguard Worker                 if((ret == IVD_RES_CHANGED) || (ret == IVD_MEM_ALLOC_FAILED) ||
5391*495ae853SAndroid Build Coastguard Worker                    (ret == ERROR_UNAVAIL_PICBUF_T) || (ret == ERROR_UNAVAIL_MVBUF_T) ||
5392*495ae853SAndroid Build Coastguard Worker                    (ret == ERROR_INV_SPS_PPS_T) || (ret == ERROR_CORRUPTED_SLICE) ||
5393*495ae853SAndroid Build Coastguard Worker                    (ret == IVD_DISP_FRM_ZERO_OP_BUF_SIZE) || (ret == NOT_OK))
5394*495ae853SAndroid Build Coastguard Worker                 {
5395*495ae853SAndroid Build Coastguard Worker                     ps_svcd_ctxt->u1_exit_till_next_IDR = 1;
5396*495ae853SAndroid Build Coastguard Worker                     /* signal the decode thread */
5397*495ae853SAndroid Build Coastguard Worker                     ih264d_signal_decode_thread(ps_dec);
5398*495ae853SAndroid Build Coastguard Worker                     /* dont consume bitstream for change in resolution case */
5399*495ae853SAndroid Build Coastguard Worker                     if(ret == IVD_RES_CHANGED)
5400*495ae853SAndroid Build Coastguard Worker                     {
5401*495ae853SAndroid Build Coastguard Worker                         ps_dec_op->u4_num_bytes_consumed -= bytes_consumed;
5402*495ae853SAndroid Build Coastguard Worker                     }
5403*495ae853SAndroid Build Coastguard Worker                     return IV_FAIL;
5404*495ae853SAndroid Build Coastguard Worker                 }
5405*495ae853SAndroid Build Coastguard Worker 
5406*495ae853SAndroid Build Coastguard Worker                 /* Multi thread - for target Layer decoding*/
5407*495ae853SAndroid Build Coastguard Worker                 if((ps_dec->u1_separate_parse) &&
5408*495ae853SAndroid Build Coastguard Worker                    (ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) &&
5409*495ae853SAndroid Build Coastguard Worker                    (0 == ps_svc_lyr_dec->u1_error_in_cur_frame))
5410*495ae853SAndroid Build Coastguard Worker                 {
5411*495ae853SAndroid Build Coastguard Worker                     /* If Format conversion is not complete,
5412*495ae853SAndroid Build Coastguard Worker                      complete it here */
5413*495ae853SAndroid Build Coastguard Worker                     if(ps_dec->u4_num_cores == 2)
5414*495ae853SAndroid Build Coastguard Worker                     {
5415*495ae853SAndroid Build Coastguard Worker                         /*do deblocking of all mbs*/
5416*495ae853SAndroid Build Coastguard Worker                         if((ps_dec->u4_nmb_deblk == 0) && (ps_dec->u4_start_recon_deblk == 1) &&
5417*495ae853SAndroid Build Coastguard Worker                            (ps_dec->ps_cur_sps->u1_mb_aff_flag == 0))
5418*495ae853SAndroid Build Coastguard Worker                         {
5419*495ae853SAndroid Build Coastguard Worker                             UWORD8 u1_end_of_row = 0;
5420*495ae853SAndroid Build Coastguard Worker                             UWORD32 u4_max_addr;
5421*495ae853SAndroid Build Coastguard Worker                             tfr_ctxt_t s_tfr_ctxt = {0};
5422*495ae853SAndroid Build Coastguard Worker                             tfr_ctxt_t *ps_tfr_cxt = &s_tfr_ctxt;
5423*495ae853SAndroid Build Coastguard Worker                             pad_mgr_t *ps_pad_mgr = &ps_dec->s_pad_mgr;
5424*495ae853SAndroid Build Coastguard Worker                             UWORD32 u4_slice_end = 0;
5425*495ae853SAndroid Build Coastguard Worker 
5426*495ae853SAndroid Build Coastguard Worker                             /*BS is done for all mbs while parsing*/
5427*495ae853SAndroid Build Coastguard Worker                             u4_max_addr = (ps_dec->u2_frm_wd_in_mbs * ps_dec->u2_frm_ht_in_mbs) - 1;
5428*495ae853SAndroid Build Coastguard Worker                             /* BS is moved post recon gen in SVC ext*/
5429*495ae853SAndroid Build Coastguard Worker 
5430*495ae853SAndroid Build Coastguard Worker                             ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt,
5431*495ae853SAndroid Build Coastguard Worker                                                        ps_dec->u2_frm_wd_in_mbs, 0);
5432*495ae853SAndroid Build Coastguard Worker 
5433*495ae853SAndroid Build Coastguard Worker                             {
5434*495ae853SAndroid Build Coastguard Worker                                 while(u4_slice_end != 1)
5435*495ae853SAndroid Build Coastguard Worker                                 {
5436*495ae853SAndroid Build Coastguard Worker                                     dec_mb_info_t *p_cur_mb;
5437*495ae853SAndroid Build Coastguard Worker                                     WORD32 i, bs_mb_grp;
5438*495ae853SAndroid Build Coastguard Worker                                     bs_mb_grp = ps_dec->cur_dec_mb_num - ps_dec->u4_cur_bs_mb_num;
5439*495ae853SAndroid Build Coastguard Worker 
5440*495ae853SAndroid Build Coastguard Worker                                     for(i = 0; i < bs_mb_grp; i++)
5441*495ae853SAndroid Build Coastguard Worker                                     {
5442*495ae853SAndroid Build Coastguard Worker                                         p_cur_mb =
5443*495ae853SAndroid Build Coastguard Worker                                             &ps_dec->ps_frm_mb_info[ps_dec->u4_cur_bs_mb_num];
5444*495ae853SAndroid Build Coastguard Worker 
5445*495ae853SAndroid Build Coastguard Worker                                         DEBUG_THREADS_PRINTF("ps_dec->u4_cur_bs_mb_num = %d\n",
5446*495ae853SAndroid Build Coastguard Worker                                                              ps_dec->u4_cur_bs_mb_num);
5447*495ae853SAndroid Build Coastguard Worker                                         isvcd_compute_bs_non_mbaff_thread(ps_svc_lyr_dec, p_cur_mb,
5448*495ae853SAndroid Build Coastguard Worker                                                                           ps_dec->u4_cur_bs_mb_num);
5449*495ae853SAndroid Build Coastguard Worker 
5450*495ae853SAndroid Build Coastguard Worker                                         ps_dec->u4_cur_bs_mb_num++;
5451*495ae853SAndroid Build Coastguard Worker                                         ps_dec->u4_bs_cur_slice_num_mbs++;
5452*495ae853SAndroid Build Coastguard Worker                                     }
5453*495ae853SAndroid Build Coastguard Worker                                     if(ps_dec->u4_cur_bs_mb_num > u4_max_addr)
5454*495ae853SAndroid Build Coastguard Worker                                     {
5455*495ae853SAndroid Build Coastguard Worker                                         u4_slice_end = 1;
5456*495ae853SAndroid Build Coastguard Worker                                         u1_end_of_row = 1;
5457*495ae853SAndroid Build Coastguard Worker                                     }
5458*495ae853SAndroid Build Coastguard Worker                                     /*deblock MB group*/
5459*495ae853SAndroid Build Coastguard Worker                                     {
5460*495ae853SAndroid Build Coastguard Worker                                         UWORD32 u4_num_mbs;
5461*495ae853SAndroid Build Coastguard Worker 
5462*495ae853SAndroid Build Coastguard Worker                                         if(ps_dec->u4_cur_bs_mb_num > ps_dec->u4_cur_deblk_mb_num)
5463*495ae853SAndroid Build Coastguard Worker                                         {
5464*495ae853SAndroid Build Coastguard Worker                                             if(u1_end_of_row)
5465*495ae853SAndroid Build Coastguard Worker                                             {
5466*495ae853SAndroid Build Coastguard Worker                                                 u4_num_mbs = ps_dec->u4_cur_bs_mb_num -
5467*495ae853SAndroid Build Coastguard Worker                                                              ps_dec->u4_cur_deblk_mb_num;
5468*495ae853SAndroid Build Coastguard Worker                                             }
5469*495ae853SAndroid Build Coastguard Worker                                             else
5470*495ae853SAndroid Build Coastguard Worker                                             {
5471*495ae853SAndroid Build Coastguard Worker                                                 u4_num_mbs = ps_dec->u4_cur_bs_mb_num -
5472*495ae853SAndroid Build Coastguard Worker                                                              ps_dec->u4_cur_deblk_mb_num - 1;
5473*495ae853SAndroid Build Coastguard Worker                                             }
5474*495ae853SAndroid Build Coastguard Worker                                         }
5475*495ae853SAndroid Build Coastguard Worker                                         else
5476*495ae853SAndroid Build Coastguard Worker                                             u4_num_mbs = 0;
5477*495ae853SAndroid Build Coastguard Worker 
5478*495ae853SAndroid Build Coastguard Worker                                         ih264d_check_mb_map_deblk(ps_dec, u4_num_mbs, ps_tfr_cxt,
5479*495ae853SAndroid Build Coastguard Worker                                                                   0);
5480*495ae853SAndroid Build Coastguard Worker                                     }
5481*495ae853SAndroid Build Coastguard Worker                                 }
5482*495ae853SAndroid Build Coastguard Worker                             }
5483*495ae853SAndroid Build Coastguard Worker                         }
5484*495ae853SAndroid Build Coastguard Worker                     }
5485*495ae853SAndroid Build Coastguard Worker 
5486*495ae853SAndroid Build Coastguard Worker                     /*signal the decode thread*/
5487*495ae853SAndroid Build Coastguard Worker                     ih264d_signal_decode_thread(ps_dec);
5488*495ae853SAndroid Build Coastguard Worker                 }
5489*495ae853SAndroid Build Coastguard Worker                 else if((ps_dec->u1_separate_parse) &&
5490*495ae853SAndroid Build Coastguard Worker                         (ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER))
5491*495ae853SAndroid Build Coastguard Worker                 {
5492*495ae853SAndroid Build Coastguard Worker                     /*signal the decode thread*/
5493*495ae853SAndroid Build Coastguard Worker                     ih264d_signal_decode_thread(ps_dec);
5494*495ae853SAndroid Build Coastguard Worker                 }
5495*495ae853SAndroid Build Coastguard Worker 
5496*495ae853SAndroid Build Coastguard Worker                 DATA_SYNC();
5497*495ae853SAndroid Build Coastguard Worker 
5498*495ae853SAndroid Build Coastguard Worker                 if((ps_dec_op->u4_error_code & 0xff) != ERROR_DYNAMIC_RESOLUTION_NOT_SUPPORTED)
5499*495ae853SAndroid Build Coastguard Worker                 {
5500*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_pic_wd = (UWORD32) ps_dec->u2_disp_width;
5501*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_pic_ht = (UWORD32) ps_dec->u2_disp_height;
5502*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->i4_reorder_depth = ps_dec->i4_reorder_depth;
5503*495ae853SAndroid Build Coastguard Worker                 }
5504*495ae853SAndroid Build Coastguard Worker 
5505*495ae853SAndroid Build Coastguard Worker                 // Report if header (sps and pps) has not been decoded yet
5506*495ae853SAndroid Build Coastguard Worker                 if(ps_dec->i4_decode_header == 1 && ps_dec->i4_header_decoded != 3)
5507*495ae853SAndroid Build Coastguard Worker                 {
5508*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_error_code |= (1 << IVD_INSUFFICIENTDATA);
5509*495ae853SAndroid Build Coastguard Worker                     api_ret_value = IV_FAIL;
5510*495ae853SAndroid Build Coastguard Worker                 }
5511*495ae853SAndroid Build Coastguard Worker 
5512*495ae853SAndroid Build Coastguard Worker                 if((ps_dec->u4_pic_buf_got == 1) && (ERROR_DANGLING_FIELD_IN_PIC != i4_err_status))
5513*495ae853SAndroid Build Coastguard Worker                 {
5514*495ae853SAndroid Build Coastguard Worker                     /* For field pictures, set bottom and top picture decoded u4_flag correctly */
5515*495ae853SAndroid Build Coastguard Worker 
5516*495ae853SAndroid Build Coastguard Worker                     if(ps_dec->ps_cur_slice->u1_field_pic_flag)
5517*495ae853SAndroid Build Coastguard Worker                     {
5518*495ae853SAndroid Build Coastguard Worker                         if(1 == ps_dec->ps_cur_slice->u1_bottom_field_flag)
5519*495ae853SAndroid Build Coastguard Worker                         {
5520*495ae853SAndroid Build Coastguard Worker                             ps_dec->u1_top_bottom_decoded |= BOT_FIELD_ONLY;
5521*495ae853SAndroid Build Coastguard Worker                         }
5522*495ae853SAndroid Build Coastguard Worker                         else
5523*495ae853SAndroid Build Coastguard Worker                         {
5524*495ae853SAndroid Build Coastguard Worker                             ps_dec->u1_top_bottom_decoded |= TOP_FIELD_ONLY;
5525*495ae853SAndroid Build Coastguard Worker                         }
5526*495ae853SAndroid Build Coastguard Worker                     }
5527*495ae853SAndroid Build Coastguard Worker                     else
5528*495ae853SAndroid Build Coastguard Worker                     {
5529*495ae853SAndroid Build Coastguard Worker                         ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY;
5530*495ae853SAndroid Build Coastguard Worker                     }
5531*495ae853SAndroid Build Coastguard Worker 
5532*495ae853SAndroid Build Coastguard Worker                     /* if new frame in not found (if we are still getting slices from
5533*495ae853SAndroid Build Coastguard Worker                      * previous frame) ih264d_deblock_display is not called. Such frames
5534*495ae853SAndroid Build Coastguard Worker                      * will not be added to reference /display
5535*495ae853SAndroid Build Coastguard Worker                      */
5536*495ae853SAndroid Build Coastguard Worker                     if((ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) == 0)
5537*495ae853SAndroid Build Coastguard Worker                     {
5538*495ae853SAndroid Build Coastguard Worker                         /* Calling Function to deblock Picture and Display */
5539*495ae853SAndroid Build Coastguard Worker                         ret = ih264d_deblock_display(ps_dec);
5540*495ae853SAndroid Build Coastguard Worker                     }
5541*495ae853SAndroid Build Coastguard Worker 
5542*495ae853SAndroid Build Coastguard Worker                     /*set to complete ,as we dont support partial frame decode*/
5543*495ae853SAndroid Build Coastguard Worker                     if(ps_dec->i4_header_decoded == 3)
5544*495ae853SAndroid Build Coastguard Worker                     {
5545*495ae853SAndroid Build Coastguard Worker                         ps_dec->u2_total_mbs_coded = ps_dec->ps_cur_sps->u2_max_mb_addr + 1;
5546*495ae853SAndroid Build Coastguard Worker                     }
5547*495ae853SAndroid Build Coastguard Worker 
5548*495ae853SAndroid Build Coastguard Worker                     /*Update the i4_frametype at the end of picture*/
5549*495ae853SAndroid Build Coastguard Worker                     if(ps_dec->ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
5550*495ae853SAndroid Build Coastguard Worker                     {
5551*495ae853SAndroid Build Coastguard Worker                         ps_dec->i4_frametype = IV_IDR_FRAME;
5552*495ae853SAndroid Build Coastguard Worker                     }
5553*495ae853SAndroid Build Coastguard Worker                     else if(ps_dec->i4_pic_type == B_SLICE)
5554*495ae853SAndroid Build Coastguard Worker                     {
5555*495ae853SAndroid Build Coastguard Worker                         ps_dec->i4_frametype = IV_B_FRAME;
5556*495ae853SAndroid Build Coastguard Worker                     }
5557*495ae853SAndroid Build Coastguard Worker                     else if(ps_dec->i4_pic_type == P_SLICE)
5558*495ae853SAndroid Build Coastguard Worker                     {
5559*495ae853SAndroid Build Coastguard Worker                         ps_dec->i4_frametype = IV_P_FRAME;
5560*495ae853SAndroid Build Coastguard Worker                     }
5561*495ae853SAndroid Build Coastguard Worker                     else if(ps_dec->i4_pic_type == I_SLICE)
5562*495ae853SAndroid Build Coastguard Worker                     {
5563*495ae853SAndroid Build Coastguard Worker                         ps_dec->i4_frametype = IV_I_FRAME;
5564*495ae853SAndroid Build Coastguard Worker                     }
5565*495ae853SAndroid Build Coastguard Worker                     else
5566*495ae853SAndroid Build Coastguard Worker                     {
5567*495ae853SAndroid Build Coastguard Worker                         H264_DEC_DEBUG_PRINT("Shouldn't come here\n");
5568*495ae853SAndroid Build Coastguard Worker                     }
5569*495ae853SAndroid Build Coastguard Worker 
5570*495ae853SAndroid Build Coastguard Worker                     // Update the content type
5571*495ae853SAndroid Build Coastguard Worker                     ps_dec->i4_content_type = ps_dec->ps_cur_slice->u1_field_pic_flag;
5572*495ae853SAndroid Build Coastguard Worker 
5573*495ae853SAndroid Build Coastguard Worker                     ps_dec->u4_total_frames_decoded = ps_dec->u4_total_frames_decoded + 2;
5574*495ae853SAndroid Build Coastguard Worker                     ps_dec->u4_total_frames_decoded =
5575*495ae853SAndroid Build Coastguard Worker                         ps_dec->u4_total_frames_decoded - ps_dec->ps_cur_slice->u1_field_pic_flag;
5576*495ae853SAndroid Build Coastguard Worker                 }
5577*495ae853SAndroid Build Coastguard Worker 
5578*495ae853SAndroid Build Coastguard Worker                 /* In case the decoder is configured to run in low delay mode,
5579*495ae853SAndroid Build Coastguard Worker                  * then get display buffer and then format convert.
5580*495ae853SAndroid Build Coastguard Worker                  * Note in this mode, format conversion does not run paralelly in a
5581*495ae853SAndroid Build Coastguard Worker                  * thread and adds to the codec cycles
5582*495ae853SAndroid Build Coastguard Worker                  */
5583*495ae853SAndroid Build Coastguard Worker                 if((IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode) && ps_dec->u1_init_dec_flag)
5584*495ae853SAndroid Build Coastguard Worker                 {
5585*495ae853SAndroid Build Coastguard Worker                     ih264d_get_next_display_field(ps_dec, ps_dec->ps_out_buffer,
5586*495ae853SAndroid Build Coastguard Worker                                                   &(ps_dec->s_disp_op));
5587*495ae853SAndroid Build Coastguard Worker 
5588*495ae853SAndroid Build Coastguard Worker                     if(0 == ps_dec->s_disp_op.u4_error_code)
5589*495ae853SAndroid Build Coastguard Worker                     {
5590*495ae853SAndroid Build Coastguard Worker                         ps_dec->u4_fmt_conv_cur_row = 0;
5591*495ae853SAndroid Build Coastguard Worker                         ps_dec->u4_output_present = 1;
5592*495ae853SAndroid Build Coastguard Worker                     }
5593*495ae853SAndroid Build Coastguard Worker                     else
5594*495ae853SAndroid Build Coastguard Worker                     {
5595*495ae853SAndroid Build Coastguard Worker                         ps_dec->u4_output_present = 0;
5596*495ae853SAndroid Build Coastguard Worker                     }
5597*495ae853SAndroid Build Coastguard Worker                 }
5598*495ae853SAndroid Build Coastguard Worker 
5599*495ae853SAndroid Build Coastguard Worker                 isvcd_fill_output_struct_from_context(ps_svc_lyr_dec, ps_dec_op);
5600*495ae853SAndroid Build Coastguard Worker 
5601*495ae853SAndroid Build Coastguard Worker                 /* If Format conversion is not complete,
5602*495ae853SAndroid Build Coastguard Worker                  complete it here */
5603*495ae853SAndroid Build Coastguard Worker                 /* For Non -target Layers , Buffers are retrived but not displayed*/
5604*495ae853SAndroid Build Coastguard Worker 
5605*495ae853SAndroid Build Coastguard Worker                 if((ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) &&
5606*495ae853SAndroid Build Coastguard Worker                    ps_dec->u4_output_present &&
5607*495ae853SAndroid Build Coastguard Worker                    (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht))
5608*495ae853SAndroid Build Coastguard Worker                 {
5609*495ae853SAndroid Build Coastguard Worker                     ps_dec->u4_fmt_conv_num_rows =
5610*495ae853SAndroid Build Coastguard Worker                         ps_dec->s_disp_frame_info.u4_y_ht - ps_dec->u4_fmt_conv_cur_row;
5611*495ae853SAndroid Build Coastguard Worker                     ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op), ps_dec->u4_fmt_conv_cur_row,
5612*495ae853SAndroid Build Coastguard Worker                                           ps_dec->u4_fmt_conv_num_rows);
5613*495ae853SAndroid Build Coastguard Worker                     ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
5614*495ae853SAndroid Build Coastguard Worker                 }
5615*495ae853SAndroid Build Coastguard Worker 
5616*495ae853SAndroid Build Coastguard Worker                 ih264d_release_display_field(ps_dec, &(ps_dec->s_disp_op));
5617*495ae853SAndroid Build Coastguard Worker 
5618*495ae853SAndroid Build Coastguard Worker                 if(ps_dec->i4_decode_header == 1 && (ps_dec->i4_header_decoded & 1) == 1)
5619*495ae853SAndroid Build Coastguard Worker                 {
5620*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_progressive_frame_flag = 1;
5621*495ae853SAndroid Build Coastguard Worker                     if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
5622*495ae853SAndroid Build Coastguard Worker                     {
5623*495ae853SAndroid Build Coastguard Worker                         if((0 == ps_dec->ps_sps->u1_frame_mbs_only_flag) &&
5624*495ae853SAndroid Build Coastguard Worker                            (0 == ps_dec->ps_sps->u1_mb_aff_flag))
5625*495ae853SAndroid Build Coastguard Worker                             ps_dec_op->u4_progressive_frame_flag = 0;
5626*495ae853SAndroid Build Coastguard Worker                     }
5627*495ae853SAndroid Build Coastguard Worker                 }
5628*495ae853SAndroid Build Coastguard Worker 
5629*495ae853SAndroid Build Coastguard Worker                 if((TOP_FIELD_ONLY | BOT_FIELD_ONLY) == ps_dec->u1_top_bottom_decoded)
5630*495ae853SAndroid Build Coastguard Worker                 {
5631*495ae853SAndroid Build Coastguard Worker                     ps_dec->u1_top_bottom_decoded = 0;
5632*495ae853SAndroid Build Coastguard Worker                 }
5633*495ae853SAndroid Build Coastguard Worker                 /*--------------------------------------------------------------------*/
5634*495ae853SAndroid Build Coastguard Worker                 /* Do End of Pic processing.                                          */
5635*495ae853SAndroid Build Coastguard Worker                 /* Should be called only if frame was decoded in previous process call*/
5636*495ae853SAndroid Build Coastguard Worker                 /*--------------------------------------------------------------------*/
5637*495ae853SAndroid Build Coastguard Worker                 if(ps_dec->u4_pic_buf_got == 1)
5638*495ae853SAndroid Build Coastguard Worker                 {
5639*495ae853SAndroid Build Coastguard Worker                     if(1 == ps_dec->u1_last_pic_not_decoded)
5640*495ae853SAndroid Build Coastguard Worker                     {
5641*495ae853SAndroid Build Coastguard Worker                         ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
5642*495ae853SAndroid Build Coastguard Worker 
5643*495ae853SAndroid Build Coastguard Worker                         if(ret != OK) return ret;
5644*495ae853SAndroid Build Coastguard Worker 
5645*495ae853SAndroid Build Coastguard Worker                         ret = ih264d_end_of_pic(ps_dec);
5646*495ae853SAndroid Build Coastguard Worker                         if(ret != OK) return ret;
5647*495ae853SAndroid Build Coastguard Worker                     }
5648*495ae853SAndroid Build Coastguard Worker                     else
5649*495ae853SAndroid Build Coastguard Worker                     {
5650*495ae853SAndroid Build Coastguard Worker                         ret = ih264d_end_of_pic(ps_dec);
5651*495ae853SAndroid Build Coastguard Worker                         if(ret != OK) return ret;
5652*495ae853SAndroid Build Coastguard Worker                     }
5653*495ae853SAndroid Build Coastguard Worker                 }
5654*495ae853SAndroid Build Coastguard Worker 
5655*495ae853SAndroid Build Coastguard Worker                 if(ps_dec->u1_enable_mb_info && ps_dec->u4_output_present)
5656*495ae853SAndroid Build Coastguard Worker                 {
5657*495ae853SAndroid Build Coastguard Worker                     UWORD32 disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
5658*495ae853SAndroid Build Coastguard Worker                     if(ps_h264d_dec_ip->pu1_8x8_blk_qp_map)
5659*495ae853SAndroid Build Coastguard Worker                     {
5660*495ae853SAndroid Build Coastguard Worker                         ps_h264d_dec_op->pu1_8x8_blk_qp_map = ps_h264d_dec_ip->pu1_8x8_blk_qp_map;
5661*495ae853SAndroid Build Coastguard Worker                         ps_h264d_dec_op->u4_8x8_blk_qp_map_size = ps_dec->u4_total_mbs << 2;
5662*495ae853SAndroid Build Coastguard Worker                         ih264_memcpy(ps_h264d_dec_op->pu1_8x8_blk_qp_map,
5663*495ae853SAndroid Build Coastguard Worker                                      ps_dec->as_buf_id_info_map[disp_buf_id].pu1_qp_map,
5664*495ae853SAndroid Build Coastguard Worker                                      ps_dec->u4_total_mbs << 2);
5665*495ae853SAndroid Build Coastguard Worker                     }
5666*495ae853SAndroid Build Coastguard Worker                     if(ps_h264d_dec_ip->pu1_8x8_blk_type_map)
5667*495ae853SAndroid Build Coastguard Worker                     {
5668*495ae853SAndroid Build Coastguard Worker                         ps_h264d_dec_op->pu1_8x8_blk_type_map =
5669*495ae853SAndroid Build Coastguard Worker                             ps_h264d_dec_ip->pu1_8x8_blk_type_map;
5670*495ae853SAndroid Build Coastguard Worker                         ps_h264d_dec_op->u4_8x8_blk_type_map_size = ps_dec->u4_total_mbs << 2;
5671*495ae853SAndroid Build Coastguard Worker                         ih264_memcpy(ps_h264d_dec_op->pu1_8x8_blk_type_map,
5672*495ae853SAndroid Build Coastguard Worker                                      ps_dec->as_buf_id_info_map[disp_buf_id].pu1_mb_type_map,
5673*495ae853SAndroid Build Coastguard Worker                                      ps_dec->u4_total_mbs << 2);
5674*495ae853SAndroid Build Coastguard Worker                     }
5675*495ae853SAndroid Build Coastguard Worker                 }
5676*495ae853SAndroid Build Coastguard Worker                 /*Data memory barrier instruction,so that yuv write by the library is
5677*495ae853SAndroid Build Coastguard Worker                  * complete*/
5678*495ae853SAndroid Build Coastguard Worker                 DATA_SYNC();
5679*495ae853SAndroid Build Coastguard Worker 
5680*495ae853SAndroid Build Coastguard Worker                 H264_DEC_DEBUG_PRINT("The num bytes consumed: %d\n",
5681*495ae853SAndroid Build Coastguard Worker                                      ps_dec_op->u4_num_bytes_consumed);
5682*495ae853SAndroid Build Coastguard Worker             }
5683*495ae853SAndroid Build Coastguard Worker         }
5684*495ae853SAndroid Build Coastguard Worker         /* highest layer for flush validation */
5685*495ae853SAndroid Build Coastguard Worker 
5686*495ae853SAndroid Build Coastguard Worker         if((ps_dec->u1_flushfrm) && (1 == flush_decode))
5687*495ae853SAndroid Build Coastguard Worker         {
5688*495ae853SAndroid Build Coastguard Worker             u1_res_id = u1_num_res_lyrs - 1;
5689*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec = ps_svcd_ctxt->ps_svc_dec_lyr + u1_res_id;
5690*495ae853SAndroid Build Coastguard Worker             ps_dec = &ps_svc_lyr_dec->s_dec;
5691*495ae853SAndroid Build Coastguard Worker 
5692*495ae853SAndroid Build Coastguard Worker             ih264d_get_next_display_field(ps_dec, ps_dec->ps_out_buffer, &(ps_dec->s_disp_op));
5693*495ae853SAndroid Build Coastguard Worker             if(0 == ps_dec->s_disp_op.u4_error_code)
5694*495ae853SAndroid Build Coastguard Worker             {
5695*495ae853SAndroid Build Coastguard Worker                 /* check output buffer size given by the application */
5696*495ae853SAndroid Build Coastguard Worker                 if(check_app_out_buf_size(ps_dec) != IV_SUCCESS)
5697*495ae853SAndroid Build Coastguard Worker                 {
5698*495ae853SAndroid Build Coastguard Worker                     ps_dec_op->u4_error_code = IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
5699*495ae853SAndroid Build Coastguard Worker                     return (IV_FAIL);
5700*495ae853SAndroid Build Coastguard Worker                 }
5701*495ae853SAndroid Build Coastguard Worker 
5702*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_fmt_conv_cur_row = 0;
5703*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_fmt_conv_num_rows = ps_dec->s_disp_frame_info.u4_y_ht;
5704*495ae853SAndroid Build Coastguard Worker                 ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op), ps_dec->u4_fmt_conv_cur_row,
5705*495ae853SAndroid Build Coastguard Worker                                       ps_dec->u4_fmt_conv_num_rows);
5706*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
5707*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_output_present = 1;
5708*495ae853SAndroid Build Coastguard Worker             }
5709*495ae853SAndroid Build Coastguard Worker             else
5710*495ae853SAndroid Build Coastguard Worker             {
5711*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_output_present = 0;
5712*495ae853SAndroid Build Coastguard Worker             }
5713*495ae853SAndroid Build Coastguard Worker             ih264d_export_sei_params(&ps_dec_op->s_sei_decode_op, ps_dec);
5714*495ae853SAndroid Build Coastguard Worker 
5715*495ae853SAndroid Build Coastguard Worker             ih264d_release_display_field(ps_dec, &(ps_dec->s_disp_op));
5716*495ae853SAndroid Build Coastguard Worker 
5717*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_pic_wd = (UWORD32) ps_dec->u2_disp_width;
5718*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_pic_ht = (UWORD32) ps_dec->u2_disp_height;
5719*495ae853SAndroid Build Coastguard Worker             ps_dec_op->i4_reorder_depth = ps_dec->i4_reorder_depth;
5720*495ae853SAndroid Build Coastguard Worker             ps_dec_op->i4_display_index = ps_dec->i4_display_index;
5721*495ae853SAndroid Build Coastguard Worker 
5722*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_new_seq = 0;
5723*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_output_present = (ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
5724*495ae853SAndroid Build Coastguard Worker                                                ? ps_dec->u4_output_present
5725*495ae853SAndroid Build Coastguard Worker                                                : 0;
5726*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_progressive_frame_flag = ps_dec->s_disp_op.u4_progressive_frame_flag;
5727*495ae853SAndroid Build Coastguard Worker             ps_dec_op->e_output_format = ps_dec->s_disp_op.e_output_format;
5728*495ae853SAndroid Build Coastguard Worker             ps_dec_op->s_disp_frm_buf = ps_dec->s_disp_op.s_disp_frm_buf;
5729*495ae853SAndroid Build Coastguard Worker             ps_dec_op->e4_fld_type = ps_dec->s_disp_op.e4_fld_type;
5730*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_ts = ps_dec->s_disp_op.u4_ts;
5731*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
5732*495ae853SAndroid Build Coastguard Worker 
5733*495ae853SAndroid Build Coastguard Worker             /*In the case of flush ,since no frame is decoded set pic type as invalid*/
5734*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_is_ref_flag = UINT32_MAX;
5735*495ae853SAndroid Build Coastguard Worker             ps_dec_op->e_pic_type = IV_NA_FRAME;
5736*495ae853SAndroid Build Coastguard Worker             ps_dec_op->u4_frame_decoded_flag = 0;
5737*495ae853SAndroid Build Coastguard Worker 
5738*495ae853SAndroid Build Coastguard Worker             if(0 == ps_dec->s_disp_op.u4_error_code)
5739*495ae853SAndroid Build Coastguard Worker             {
5740*495ae853SAndroid Build Coastguard Worker                 return (IV_SUCCESS);
5741*495ae853SAndroid Build Coastguard Worker             }
5742*495ae853SAndroid Build Coastguard Worker             else
5743*495ae853SAndroid Build Coastguard Worker                 return (IV_FAIL);
5744*495ae853SAndroid Build Coastguard Worker         }
5745*495ae853SAndroid Build Coastguard Worker     }
5746*495ae853SAndroid Build Coastguard Worker 
5747*495ae853SAndroid Build Coastguard Worker     if((ps_dec_op->u4_error_code & 0xff) != ERROR_DYNAMIC_RESOLUTION_NOT_SUPPORTED)
5748*495ae853SAndroid Build Coastguard Worker     {
5749*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_pic_wd = (UWORD32) ps_dec->u2_disp_width;
5750*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_pic_ht = (UWORD32) ps_dec->u2_disp_height;
5751*495ae853SAndroid Build Coastguard Worker         ps_dec_op->i4_reorder_depth = ps_dec->i4_reorder_depth;
5752*495ae853SAndroid Build Coastguard Worker     }
5753*495ae853SAndroid Build Coastguard Worker     return api_ret_value;
5754*495ae853SAndroid Build Coastguard Worker }
5755*495ae853SAndroid Build Coastguard Worker 
5756*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
5757*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5758*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_set_display_frame                                 */
5759*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5760*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
5761*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5762*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
5763*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
5764*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
5765*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
5766*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
5767*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5768*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
5769*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5770*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
5771*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5772*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
5773*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
5774*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5775*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_set_display_frame(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)5776*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_display_frame(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
5777*495ae853SAndroid Build Coastguard Worker {
5778*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_disp_buf_size[3] = {0};
5779*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_disp_bufs;
5780*495ae853SAndroid Build Coastguard Worker     ivd_set_display_frame_ip_t *dec_disp_ip;
5781*495ae853SAndroid Build Coastguard Worker     ivd_set_display_frame_op_t *dec_disp_op;
5782*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
5783*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
5784*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
5785*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
5786*495ae853SAndroid Build Coastguard Worker 
5787*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
5788*495ae853SAndroid Build Coastguard Worker 
5789*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
5790*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
5791*495ae853SAndroid Build Coastguard Worker 
5792*495ae853SAndroid Build Coastguard Worker     dec_disp_ip = (ivd_set_display_frame_ip_t *) pv_api_ip;
5793*495ae853SAndroid Build Coastguard Worker     dec_disp_op = (ivd_set_display_frame_op_t *) pv_api_op;
5794*495ae853SAndroid Build Coastguard Worker     dec_disp_op->u4_error_code = 0;
5795*495ae853SAndroid Build Coastguard Worker 
5796*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_num_disp_bufs = 0;
5797*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u4_share_disp_buf)
5798*495ae853SAndroid Build Coastguard Worker     {
5799*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_num_bufs = dec_disp_ip->num_disp_bufs;
5800*495ae853SAndroid Build Coastguard Worker 
5801*495ae853SAndroid Build Coastguard Worker         u4_num_bufs = MIN(u4_num_bufs, MAX_DISP_BUFS_NEW);
5802*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_num_disp_bufs = u4_num_bufs;
5803*495ae853SAndroid Build Coastguard Worker 
5804*495ae853SAndroid Build Coastguard Worker         /* Get the number and sizes of the first buffer. Compare this with the
5805*495ae853SAndroid Build Coastguard Worker          * rest to make sure all the buffers are of the same size.
5806*495ae853SAndroid Build Coastguard Worker          */
5807*495ae853SAndroid Build Coastguard Worker         u4_num_disp_bufs = dec_disp_ip->s_disp_buffer[0].u4_num_bufs;
5808*495ae853SAndroid Build Coastguard Worker 
5809*495ae853SAndroid Build Coastguard Worker         u4_disp_buf_size[0] = dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[0];
5810*495ae853SAndroid Build Coastguard Worker         u4_disp_buf_size[1] = dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[1];
5811*495ae853SAndroid Build Coastguard Worker         u4_disp_buf_size[2] = dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[2];
5812*495ae853SAndroid Build Coastguard Worker 
5813*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < u4_num_bufs; i++)
5814*495ae853SAndroid Build Coastguard Worker         {
5815*495ae853SAndroid Build Coastguard Worker             if(dec_disp_ip->s_disp_buffer[i].u4_num_bufs != u4_num_disp_bufs)
5816*495ae853SAndroid Build Coastguard Worker             {
5817*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
5818*495ae853SAndroid Build Coastguard Worker             }
5819*495ae853SAndroid Build Coastguard Worker 
5820*495ae853SAndroid Build Coastguard Worker             if((dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[0] != u4_disp_buf_size[0]) ||
5821*495ae853SAndroid Build Coastguard Worker                (dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[1] != u4_disp_buf_size[1]) ||
5822*495ae853SAndroid Build Coastguard Worker                (dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[2] != u4_disp_buf_size[2]))
5823*495ae853SAndroid Build Coastguard Worker             {
5824*495ae853SAndroid Build Coastguard Worker                 return IV_FAIL;
5825*495ae853SAndroid Build Coastguard Worker             }
5826*495ae853SAndroid Build Coastguard Worker 
5827*495ae853SAndroid Build Coastguard Worker             ps_dec->disp_bufs[i].u4_num_bufs = dec_disp_ip->s_disp_buffer[i].u4_num_bufs;
5828*495ae853SAndroid Build Coastguard Worker 
5829*495ae853SAndroid Build Coastguard Worker             ps_dec->disp_bufs[i].buf[0] = dec_disp_ip->s_disp_buffer[i].pu1_bufs[0];
5830*495ae853SAndroid Build Coastguard Worker             ps_dec->disp_bufs[i].buf[1] = dec_disp_ip->s_disp_buffer[i].pu1_bufs[1];
5831*495ae853SAndroid Build Coastguard Worker             ps_dec->disp_bufs[i].buf[2] = dec_disp_ip->s_disp_buffer[i].pu1_bufs[2];
5832*495ae853SAndroid Build Coastguard Worker 
5833*495ae853SAndroid Build Coastguard Worker             ps_dec->disp_bufs[i].u4_bufsize[0] =
5834*495ae853SAndroid Build Coastguard Worker                 dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[0];
5835*495ae853SAndroid Build Coastguard Worker             ps_dec->disp_bufs[i].u4_bufsize[1] =
5836*495ae853SAndroid Build Coastguard Worker                 dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[1];
5837*495ae853SAndroid Build Coastguard Worker             ps_dec->disp_bufs[i].u4_bufsize[2] =
5838*495ae853SAndroid Build Coastguard Worker                 dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[2];
5839*495ae853SAndroid Build Coastguard Worker         }
5840*495ae853SAndroid Build Coastguard Worker     }
5841*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
5842*495ae853SAndroid Build Coastguard Worker }
5843*495ae853SAndroid Build Coastguard Worker 
5844*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
5845*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5846*495ae853SAndroid Build Coastguard Worker /*  Function Name : ih264d_set_flush_mode_svt_ext                            */
5847*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5848*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
5849*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5850*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
5851*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
5852*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
5853*495ae853SAndroid Build Coastguard Worker /*  Globals       : <Does it use any global variables?>                      */
5854*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
5855*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
5856*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5857*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
5858*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5859*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
5860*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5861*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
5862*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
5863*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5864*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_set_flush_mode(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)5865*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_flush_mode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
5866*495ae853SAndroid Build Coastguard Worker {
5867*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
5868*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
5869*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
5870*495ae853SAndroid Build Coastguard Worker     ivd_ctl_flush_op_t *ps_ctl_op = (ivd_ctl_flush_op_t *) pv_api_op;
5871*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
5872*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
5873*495ae853SAndroid Build Coastguard Worker 
5874*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_error_code = 0;
5875*495ae853SAndroid Build Coastguard Worker 
5876*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[0];
5877*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
5878*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->i4_decode_header)
5879*495ae853SAndroid Build Coastguard Worker     {
5880*495ae853SAndroid Build Coastguard Worker         ps_svcd_ctxt->i4_eos_flag = 1;
5881*495ae853SAndroid Build Coastguard Worker     }
5882*495ae853SAndroid Build Coastguard Worker 
5883*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
5884*495ae853SAndroid Build Coastguard Worker     {
5885*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
5886*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
5887*495ae853SAndroid Build Coastguard Worker         UNUSED(pv_api_ip);
5888*495ae853SAndroid Build Coastguard Worker 
5889*495ae853SAndroid Build Coastguard Worker         /* Signal flush frame control call */
5890*495ae853SAndroid Build Coastguard Worker         ps_dec->u1_flushfrm = 1;
5891*495ae853SAndroid Build Coastguard Worker 
5892*495ae853SAndroid Build Coastguard Worker         if(ps_dec->u1_init_dec_flag == 1)
5893*495ae853SAndroid Build Coastguard Worker         {
5894*495ae853SAndroid Build Coastguard Worker             ih264d_release_pics_in_dpb((void *) ps_dec, ps_dec->u1_pic_bufs);
5895*495ae853SAndroid Build Coastguard Worker             ih264d_release_display_bufs(ps_dec);
5896*495ae853SAndroid Build Coastguard Worker         }
5897*495ae853SAndroid Build Coastguard Worker 
5898*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_error_code = 0;
5899*495ae853SAndroid Build Coastguard Worker 
5900*495ae853SAndroid Build Coastguard Worker         /* Ignore dangling fields during flush */
5901*495ae853SAndroid Build Coastguard Worker         ps_dec->u1_top_bottom_decoded = 0;
5902*495ae853SAndroid Build Coastguard Worker     }
5903*495ae853SAndroid Build Coastguard Worker 
5904*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
5905*495ae853SAndroid Build Coastguard Worker }
5906*495ae853SAndroid Build Coastguard Worker 
5907*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
5908*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5909*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_status                                         */
5910*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5911*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
5912*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5913*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
5914*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
5915*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
5916*495ae853SAndroid Build Coastguard Worker /*  Globals       : <Does it use any global variables?>                      */
5917*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
5918*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
5919*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5920*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
5921*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5922*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
5923*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5924*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
5925*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
5926*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5927*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
5928*495ae853SAndroid Build Coastguard Worker 
isvcd_get_status(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)5929*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_status(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
5930*495ae853SAndroid Build Coastguard Worker {
5931*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
5932*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
5933*495ae853SAndroid Build Coastguard Worker     UWORD32 pic_wd, pic_ht;
5934*495ae853SAndroid Build Coastguard Worker     ivd_ctl_getstatus_op_t *ps_ctl_op = (ivd_ctl_getstatus_op_t *) pv_api_op;
5935*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
5936*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
5937*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
5938*495ae853SAndroid Build Coastguard Worker 
5939*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
5940*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
5941*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_api_ip);
5942*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_error_code = 0;
5943*495ae853SAndroid Build Coastguard Worker 
5944*495ae853SAndroid Build Coastguard Worker     if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
5945*495ae853SAndroid Build Coastguard Worker     {
5946*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_pic_ht = ps_dec->u2_disp_height;
5947*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_pic_wd = ps_dec->u2_disp_width;
5948*495ae853SAndroid Build Coastguard Worker 
5949*495ae853SAndroid Build Coastguard Worker         if(0 == ps_dec->u4_share_disp_buf)
5950*495ae853SAndroid Build Coastguard Worker         {
5951*495ae853SAndroid Build Coastguard Worker             pic_wd = ps_dec->u2_disp_width;
5952*495ae853SAndroid Build Coastguard Worker             pic_ht = ps_dec->u2_disp_height;
5953*495ae853SAndroid Build Coastguard Worker         }
5954*495ae853SAndroid Build Coastguard Worker         else
5955*495ae853SAndroid Build Coastguard Worker         {
5956*495ae853SAndroid Build Coastguard Worker             pic_wd = ps_dec->u2_frm_wd_y;
5957*495ae853SAndroid Build Coastguard Worker             pic_ht = ps_dec->u2_frm_ht_y;
5958*495ae853SAndroid Build Coastguard Worker         }
5959*495ae853SAndroid Build Coastguard Worker     }
5960*495ae853SAndroid Build Coastguard Worker     else
5961*495ae853SAndroid Build Coastguard Worker     {
5962*495ae853SAndroid Build Coastguard Worker         pic_wd = 0;
5963*495ae853SAndroid Build Coastguard Worker         pic_ht = 0;
5964*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_pic_ht = pic_wd;
5965*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_pic_wd = pic_ht;
5966*495ae853SAndroid Build Coastguard Worker 
5967*495ae853SAndroid Build Coastguard Worker         if(1 == ps_dec->u4_share_disp_buf)
5968*495ae853SAndroid Build Coastguard Worker         {
5969*495ae853SAndroid Build Coastguard Worker             pic_wd += (PAD_LEN_Y_H << 1);
5970*495ae853SAndroid Build Coastguard Worker             pic_ht += (PAD_LEN_Y_V << 2);
5971*495ae853SAndroid Build Coastguard Worker         }
5972*495ae853SAndroid Build Coastguard Worker     }
5973*495ae853SAndroid Build Coastguard Worker 
5974*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u4_app_disp_width > pic_wd) pic_wd = ps_dec->u4_app_disp_width;
5975*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->u4_share_disp_buf)
5976*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_num_disp_bufs = 1;
5977*495ae853SAndroid Build Coastguard Worker     else
5978*495ae853SAndroid Build Coastguard Worker     {
5979*495ae853SAndroid Build Coastguard Worker         if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
5980*495ae853SAndroid Build Coastguard Worker         {
5981*495ae853SAndroid Build Coastguard Worker             if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1) &&
5982*495ae853SAndroid Build Coastguard Worker                (1 == ps_dec->ps_cur_sps->s_vui.u1_bitstream_restriction_flag))
5983*495ae853SAndroid Build Coastguard Worker             {
5984*495ae853SAndroid Build Coastguard Worker                 ps_ctl_op->u4_num_disp_bufs = ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 1;
5985*495ae853SAndroid Build Coastguard Worker             }
5986*495ae853SAndroid Build Coastguard Worker             else
5987*495ae853SAndroid Build Coastguard Worker             {
5988*495ae853SAndroid Build Coastguard Worker                 /*if VUI is not present assume maximum possible refrence frames for the
5989*495ae853SAndroid Build Coastguard Worker                  * level, as max reorder frames*/
5990*495ae853SAndroid Build Coastguard Worker                 ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size(ps_dec->ps_cur_sps);
5991*495ae853SAndroid Build Coastguard Worker             }
5992*495ae853SAndroid Build Coastguard Worker 
5993*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_num_disp_bufs += ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
5994*495ae853SAndroid Build Coastguard Worker         }
5995*495ae853SAndroid Build Coastguard Worker         else
5996*495ae853SAndroid Build Coastguard Worker         {
5997*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_num_disp_bufs = 32;
5998*495ae853SAndroid Build Coastguard Worker         }
5999*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_num_disp_bufs = MAX(ps_ctl_op->u4_num_disp_bufs, 6);
6000*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_num_disp_bufs = MIN(ps_ctl_op->u4_num_disp_bufs, 32);
6001*495ae853SAndroid Build Coastguard Worker     }
6002*495ae853SAndroid Build Coastguard Worker 
6003*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_error_code = ps_dec->i4_error_code;
6004*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_frame_rate = 0;
6005*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_bit_rate = 0;
6006*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->e_content_type = ps_dec->i4_content_type;
6007*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->e_output_chroma_format = ps_dec->u1_chroma_format;
6008*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_min_num_in_bufs = MIN_IN_BUFS;
6009*495ae853SAndroid Build Coastguard Worker 
6010*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u1_chroma_format == IV_YUV_420P)
6011*495ae853SAndroid Build Coastguard Worker     {
6012*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_num_out_bufs = MIN_OUT_BUFS_420;
6013*495ae853SAndroid Build Coastguard Worker     }
6014*495ae853SAndroid Build Coastguard Worker     else if(ps_dec->u1_chroma_format == IV_YUV_422ILE)
6015*495ae853SAndroid Build Coastguard Worker     {
6016*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_num_out_bufs = MIN_OUT_BUFS_422ILE;
6017*495ae853SAndroid Build Coastguard Worker     }
6018*495ae853SAndroid Build Coastguard Worker     else if(ps_dec->u1_chroma_format == IV_RGB_565)
6019*495ae853SAndroid Build Coastguard Worker     {
6020*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_num_out_bufs = MIN_OUT_BUFS_RGB565;
6021*495ae853SAndroid Build Coastguard Worker     }
6022*495ae853SAndroid Build Coastguard Worker     else if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV) ||
6023*495ae853SAndroid Build Coastguard Worker             (ps_dec->u1_chroma_format == IV_YUV_420SP_VU))
6024*495ae853SAndroid Build Coastguard Worker     {
6025*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_num_out_bufs = MIN_OUT_BUFS_420SP;
6026*495ae853SAndroid Build Coastguard Worker     }
6027*495ae853SAndroid Build Coastguard Worker     else
6028*495ae853SAndroid Build Coastguard Worker     {
6029*495ae853SAndroid Build Coastguard Worker         // Invalid chroma format; Error code may be updated, verify in testing if needed
6030*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_error_code = ERROR_FEATURE_UNAVAIL;
6031*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
6032*495ae853SAndroid Build Coastguard Worker     }
6033*495ae853SAndroid Build Coastguard Worker 
6034*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_ctl_op->u4_min_num_in_bufs; i++)
6035*495ae853SAndroid Build Coastguard Worker     {
6036*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_in_buf_size[i] = MAX(256000, pic_wd * pic_ht * 3 / 2);
6037*495ae853SAndroid Build Coastguard Worker     }
6038*495ae853SAndroid Build Coastguard Worker 
6039*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u1_chroma_format == IV_YUV_420P)
6040*495ae853SAndroid Build Coastguard Worker     {
6041*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[0] = (pic_wd * pic_ht);
6042*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[1] = (pic_wd * pic_ht) >> 2;
6043*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[2] = (pic_wd * pic_ht) >> 2;
6044*495ae853SAndroid Build Coastguard Worker     }
6045*495ae853SAndroid Build Coastguard Worker     else if(ps_dec->u1_chroma_format == IV_YUV_422ILE)
6046*495ae853SAndroid Build Coastguard Worker     {
6047*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[0] = (pic_wd * pic_ht) * 2;
6048*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[1] = ps_ctl_op->u4_min_out_buf_size[2] = 0;
6049*495ae853SAndroid Build Coastguard Worker     }
6050*495ae853SAndroid Build Coastguard Worker     else if(ps_dec->u1_chroma_format == IV_RGB_565)
6051*495ae853SAndroid Build Coastguard Worker     {
6052*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[0] = (pic_wd * pic_ht) * 2;
6053*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[1] = ps_ctl_op->u4_min_out_buf_size[2] = 0;
6054*495ae853SAndroid Build Coastguard Worker     }
6055*495ae853SAndroid Build Coastguard Worker     else if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV) ||
6056*495ae853SAndroid Build Coastguard Worker             (ps_dec->u1_chroma_format == IV_YUV_420SP_VU))
6057*495ae853SAndroid Build Coastguard Worker     {
6058*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[0] = (pic_wd * pic_ht);
6059*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[1] = (pic_wd * pic_ht) >> 1;
6060*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[2] = 0;
6061*495ae853SAndroid Build Coastguard Worker     }
6062*495ae853SAndroid Build Coastguard Worker 
6063*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_num_disp_bufs_requested = ps_ctl_op->u4_num_disp_bufs;
6064*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6065*495ae853SAndroid Build Coastguard Worker }
6066*495ae853SAndroid Build Coastguard Worker 
6067*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6068*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6069*495ae853SAndroid Build Coastguard Worker /*  Function Name :    isvcd_get_buf_info                                    */
6070*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6071*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
6072*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6073*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6074*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6075*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6076*495ae853SAndroid Build Coastguard Worker /*  Globals       : <Does it use any global variables?>                      */
6077*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6078*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6079*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6080*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6081*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6082*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6083*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6084*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6085*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
6086*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6087*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_buf_info(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6088*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_buf_info(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6089*495ae853SAndroid Build Coastguard Worker {
6090*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6091*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6092*495ae853SAndroid Build Coastguard Worker     UWORD8 i = 0;  // Default for 420P format
6093*495ae853SAndroid Build Coastguard Worker     UWORD16 pic_wd, pic_ht;
6094*495ae853SAndroid Build Coastguard Worker     ivd_ctl_getbufinfo_op_t *ps_ctl_op = (ivd_ctl_getbufinfo_op_t *) pv_api_op;
6095*495ae853SAndroid Build Coastguard Worker     UWORD32 au4_min_out_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS] = {0};
6096*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6097*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6098*495ae853SAndroid Build Coastguard Worker 
6099*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_api_ip);
6100*495ae853SAndroid Build Coastguard Worker 
6101*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
6102*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
6103*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_error_code = 0;
6104*495ae853SAndroid Build Coastguard Worker 
6105*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_min_num_in_bufs = MIN_IN_BUFS;
6106*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_num_disp_bufs = 1;
6107*495ae853SAndroid Build Coastguard Worker     pic_wd = 0;
6108*495ae853SAndroid Build Coastguard Worker     pic_ht = 0;
6109*495ae853SAndroid Build Coastguard Worker 
6110*495ae853SAndroid Build Coastguard Worker     if(ps_dec->i4_header_decoded == 3)
6111*495ae853SAndroid Build Coastguard Worker     {
6112*495ae853SAndroid Build Coastguard Worker         pic_wd = ps_svcd_ctxt->pic_width;
6113*495ae853SAndroid Build Coastguard Worker         pic_ht = ps_svcd_ctxt->pic_height;
6114*495ae853SAndroid Build Coastguard Worker     }
6115*495ae853SAndroid Build Coastguard Worker 
6116*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_ctl_op->u4_min_num_in_bufs; i++)
6117*495ae853SAndroid Build Coastguard Worker     {
6118*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_in_buf_size[i] = MAX(256000, pic_wd * pic_ht * 3 / 2);
6119*495ae853SAndroid Build Coastguard Worker     }
6120*495ae853SAndroid Build Coastguard Worker     if((WORD32) ps_dec->u4_app_disp_width > pic_wd) pic_wd = ps_dec->u4_app_disp_width;
6121*495ae853SAndroid Build Coastguard Worker 
6122*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->u4_share_disp_buf)
6123*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_num_disp_bufs = 1;
6124*495ae853SAndroid Build Coastguard Worker     else
6125*495ae853SAndroid Build Coastguard Worker     {
6126*495ae853SAndroid Build Coastguard Worker         if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
6127*495ae853SAndroid Build Coastguard Worker         {
6128*495ae853SAndroid Build Coastguard Worker             if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1) &&
6129*495ae853SAndroid Build Coastguard Worker                (1 == ps_dec->ps_cur_sps->s_vui.u1_bitstream_restriction_flag))
6130*495ae853SAndroid Build Coastguard Worker             {
6131*495ae853SAndroid Build Coastguard Worker                 ps_ctl_op->u4_num_disp_bufs = ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 1;
6132*495ae853SAndroid Build Coastguard Worker             }
6133*495ae853SAndroid Build Coastguard Worker             else
6134*495ae853SAndroid Build Coastguard Worker             {
6135*495ae853SAndroid Build Coastguard Worker                 /*if VUI is not present assume maximum possible refrence frames for the
6136*495ae853SAndroid Build Coastguard Worker                  * level, as max reorder frames*/
6137*495ae853SAndroid Build Coastguard Worker                 ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size(ps_dec->ps_cur_sps);
6138*495ae853SAndroid Build Coastguard Worker             }
6139*495ae853SAndroid Build Coastguard Worker 
6140*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_num_disp_bufs += ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
6141*495ae853SAndroid Build Coastguard Worker         }
6142*495ae853SAndroid Build Coastguard Worker         else
6143*495ae853SAndroid Build Coastguard Worker         {
6144*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_num_disp_bufs = 32;
6145*495ae853SAndroid Build Coastguard Worker         }
6146*495ae853SAndroid Build Coastguard Worker 
6147*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_num_disp_bufs = MAX(ps_ctl_op->u4_num_disp_bufs, 6);
6148*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_num_disp_bufs = MIN(ps_ctl_op->u4_num_disp_bufs, 32);
6149*495ae853SAndroid Build Coastguard Worker     }
6150*495ae853SAndroid Build Coastguard Worker 
6151*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_min_num_out_bufs =
6152*495ae853SAndroid Build Coastguard Worker         ih264d_get_outbuf_size(pic_wd, pic_ht, ps_dec->u1_chroma_format, &au4_min_out_buf_size[0]);
6153*495ae853SAndroid Build Coastguard Worker 
6154*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_ctl_op->u4_min_num_out_bufs; i++)
6155*495ae853SAndroid Build Coastguard Worker     {
6156*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_min_out_buf_size[i] = au4_min_out_buf_size[i];
6157*495ae853SAndroid Build Coastguard Worker     }
6158*495ae853SAndroid Build Coastguard Worker 
6159*495ae853SAndroid Build Coastguard Worker     ps_dec->u4_num_disp_bufs_requested = ps_ctl_op->u4_num_disp_bufs;
6160*495ae853SAndroid Build Coastguard Worker 
6161*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6162*495ae853SAndroid Build Coastguard Worker }
6163*495ae853SAndroid Build Coastguard Worker 
6164*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6165*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6166*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_set_params                                         */
6167*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6168*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
6169*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6170*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6171*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6172*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6173*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6174*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6175*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6176*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6177*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6178*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6179*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6180*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6181*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
6182*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6183*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_set_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6184*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6185*495ae853SAndroid Build Coastguard Worker {
6186*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6187*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6188*495ae853SAndroid Build Coastguard Worker     WORD32 ret = IV_SUCCESS;
6189*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6190*495ae853SAndroid Build Coastguard Worker     WORD32 u1_layer_id;
6191*495ae853SAndroid Build Coastguard Worker 
6192*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6193*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->i4_eos_flag = 0;
6194*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
6195*495ae853SAndroid Build Coastguard Worker     {
6196*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_set_config_ip_t *ps_h264d_ctl_ip = (isvcd_ctl_set_config_ip_t *) pv_api_ip;
6197*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_set_config_op_t *ps_h264d_ctl_op = (isvcd_ctl_set_config_op_t *) pv_api_op;
6198*495ae853SAndroid Build Coastguard Worker         ivd_ctl_set_config_ip_t *ps_ctl_ip = &ps_h264d_ctl_ip->s_ivd_ctl_set_config_ip_t;
6199*495ae853SAndroid Build Coastguard Worker         ivd_ctl_set_config_op_t *ps_ctl_op = &ps_h264d_ctl_op->s_ivd_ctl_set_config_op_t;
6200*495ae853SAndroid Build Coastguard Worker 
6201*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
6202*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
6203*495ae853SAndroid Build Coastguard Worker 
6204*495ae853SAndroid Build Coastguard Worker         ps_dec->u1_flushfrm = 0;
6205*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_skip_frm_mask = 0;
6206*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_error_code = 0;
6207*495ae853SAndroid Build Coastguard Worker 
6208*495ae853SAndroid Build Coastguard Worker         if(ps_ctl_ip->e_frm_skip_mode != IVD_SKIP_NONE)
6209*495ae853SAndroid Build Coastguard Worker         {
6210*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_error_code = (1 << IVD_UNSUPPORTEDPARAM);
6211*495ae853SAndroid Build Coastguard Worker             ret = IV_FAIL;
6212*495ae853SAndroid Build Coastguard Worker         }
6213*495ae853SAndroid Build Coastguard Worker 
6214*495ae853SAndroid Build Coastguard Worker         if(ps_ctl_ip->u4_disp_wd >= ps_dec->u2_disp_width)
6215*495ae853SAndroid Build Coastguard Worker         {
6216*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_app_disp_width = ps_ctl_ip->u4_disp_wd;
6217*495ae853SAndroid Build Coastguard Worker         }
6218*495ae853SAndroid Build Coastguard Worker         else if(0 == ps_dec->i4_header_decoded)
6219*495ae853SAndroid Build Coastguard Worker         {
6220*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_app_disp_width = ps_ctl_ip->u4_disp_wd;
6221*495ae853SAndroid Build Coastguard Worker         }
6222*495ae853SAndroid Build Coastguard Worker         else if(ps_ctl_ip->u4_disp_wd == 0)
6223*495ae853SAndroid Build Coastguard Worker         {
6224*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_app_disp_width = 0;
6225*495ae853SAndroid Build Coastguard Worker         }
6226*495ae853SAndroid Build Coastguard Worker         else
6227*495ae853SAndroid Build Coastguard Worker         {
6228*495ae853SAndroid Build Coastguard Worker             /*
6229*495ae853SAndroid Build Coastguard Worker              * Set the display width to zero. This will ensure that the wrong value we
6230*495ae853SAndroid Build Coastguard Worker              * had stored (0xFFFFFFFF) does not propogate.
6231*495ae853SAndroid Build Coastguard Worker              */
6232*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_app_disp_width = 0;
6233*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_error_code |= (1 << IVD_UNSUPPORTEDPARAM);
6234*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_error_code |= ERROR_DISP_WIDTH_INVALID;
6235*495ae853SAndroid Build Coastguard Worker             ret = IV_FAIL;
6236*495ae853SAndroid Build Coastguard Worker         }
6237*495ae853SAndroid Build Coastguard Worker 
6238*495ae853SAndroid Build Coastguard Worker         if(ps_ctl_ip->e_vid_dec_mode == IVD_DECODE_FRAME)
6239*495ae853SAndroid Build Coastguard Worker             ps_dec->i4_decode_header = 0;
6240*495ae853SAndroid Build Coastguard Worker         else if(ps_ctl_ip->e_vid_dec_mode == IVD_DECODE_HEADER)
6241*495ae853SAndroid Build Coastguard Worker             ps_dec->i4_decode_header = 1;
6242*495ae853SAndroid Build Coastguard Worker         else
6243*495ae853SAndroid Build Coastguard Worker         {
6244*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_error_code = (1 << IVD_UNSUPPORTEDPARAM);
6245*495ae853SAndroid Build Coastguard Worker             ps_dec->i4_decode_header = 1;
6246*495ae853SAndroid Build Coastguard Worker             ret = IV_FAIL;
6247*495ae853SAndroid Build Coastguard Worker         }
6248*495ae853SAndroid Build Coastguard Worker         ps_dec->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
6249*495ae853SAndroid Build Coastguard Worker 
6250*495ae853SAndroid Build Coastguard Worker         if((ps_ctl_ip->e_frm_out_mode != IVD_DECODE_FRAME_OUT) &&
6251*495ae853SAndroid Build Coastguard Worker            (ps_ctl_ip->e_frm_out_mode != IVD_DISPLAY_FRAME_OUT))
6252*495ae853SAndroid Build Coastguard Worker         {
6253*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_error_code = (1 << IVD_UNSUPPORTEDPARAM);
6254*495ae853SAndroid Build Coastguard Worker             ret = IV_FAIL;
6255*495ae853SAndroid Build Coastguard Worker         }
6256*495ae853SAndroid Build Coastguard Worker         ps_dec->e_frm_out_mode = ps_ctl_ip->e_frm_out_mode;
6257*495ae853SAndroid Build Coastguard Worker     }
6258*495ae853SAndroid Build Coastguard Worker     return ret;
6259*495ae853SAndroid Build Coastguard Worker }
6260*495ae853SAndroid Build Coastguard Worker 
6261*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6262*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6263*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_set_target_layer                                   */
6264*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6265*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
6266*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6267*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6268*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6269*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6270*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6271*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6272*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6273*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6274*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6275*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6276*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6277*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6278*495ae853SAndroid Build Coastguard Worker /*         05 04 2021   Kishore         Draft                                */
6279*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6280*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_set_target_layer(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6281*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_target_layer(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6282*495ae853SAndroid Build Coastguard Worker {
6283*495ae853SAndroid Build Coastguard Worker     WORD32 ret = IV_SUCCESS;
6284*495ae853SAndroid Build Coastguard Worker 
6285*495ae853SAndroid Build Coastguard Worker     isvcd_set_target_layer_ip_t *ps_ip;
6286*495ae853SAndroid Build Coastguard Worker     isvcd_set_target_layer_op_t *ps_op;
6287*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6288*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6289*495ae853SAndroid Build Coastguard Worker 
6290*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_set_target_layer_ip_t *) pv_api_ip;
6291*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_set_target_layer_op_t *) pv_api_op;
6292*495ae853SAndroid Build Coastguard Worker 
6293*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_tgt_dep_id = ps_ip->u1_tgt_dep_id;
6294*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_tgt_quality_id = ps_ip->u1_tgt_quality_id;
6295*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_tgt_temp_id = ps_ip->u1_tgt_temp_id;
6296*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_tgt_priority_id = ps_ip->u1_tgt_priority_id;
6297*495ae853SAndroid Build Coastguard Worker 
6298*495ae853SAndroid Build Coastguard Worker     ret = isvcd_nal_parse_set_target_attr(ps_ip->u1_tgt_quality_id, ps_ip->u1_tgt_dep_id,
6299*495ae853SAndroid Build Coastguard Worker                                           ps_ip->u1_tgt_temp_id, ps_ip->u1_tgt_priority_id,
6300*495ae853SAndroid Build Coastguard Worker                                           ps_svcd_ctxt->pv_nal_parse_ctxt);
6301*495ae853SAndroid Build Coastguard Worker     ps_op->u4_error_code = 0;
6302*495ae853SAndroid Build Coastguard Worker 
6303*495ae853SAndroid Build Coastguard Worker     return ret;
6304*495ae853SAndroid Build Coastguard Worker }
6305*495ae853SAndroid Build Coastguard Worker 
6306*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6307*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6308*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_set_default_params                                 */
6309*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6310*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
6311*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6312*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6313*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6314*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6315*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6316*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6317*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6318*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6319*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6320*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6321*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6322*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6323*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Copied from set_params               */
6324*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6325*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_set_default_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6326*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_default_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6327*495ae853SAndroid Build Coastguard Worker {
6328*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6329*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6330*495ae853SAndroid Build Coastguard Worker     WORD32 ret = IV_SUCCESS;
6331*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
6332*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6333*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_op_t *ps_ctl_op = (ivd_ctl_set_config_op_t *) pv_api_op;
6334*495ae853SAndroid Build Coastguard Worker 
6335*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6336*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_api_ip);
6337*495ae853SAndroid Build Coastguard Worker 
6338*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
6339*495ae853SAndroid Build Coastguard Worker     {
6340*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
6341*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
6342*495ae853SAndroid Build Coastguard Worker 
6343*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_app_disp_width = 0;
6344*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_skip_frm_mask = 0;
6345*495ae853SAndroid Build Coastguard Worker         ps_dec->i4_decode_header = 1;
6346*495ae853SAndroid Build Coastguard Worker     }
6347*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_error_code = 0;
6348*495ae853SAndroid Build Coastguard Worker 
6349*495ae853SAndroid Build Coastguard Worker     return ret;
6350*495ae853SAndroid Build Coastguard Worker }
6351*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6352*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6353*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_delete                                            */
6354*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6355*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
6356*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6357*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6358*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6359*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6360*495ae853SAndroid Build Coastguard Worker /*  Globals       : <Does it use any global variables?>                      */
6361*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6362*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6363*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6364*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6365*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6366*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6367*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6368*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6369*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
6370*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6371*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_delete(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6372*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_delete(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6373*495ae853SAndroid Build Coastguard Worker {
6374*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6375*495ae853SAndroid Build Coastguard Worker     isvcd_delete_ip_t *ps_ip = (isvcd_delete_ip_t *) pv_api_ip;
6376*495ae853SAndroid Build Coastguard Worker     isvcd_delete_op_t *ps_op = (isvcd_delete_op_t *) pv_api_op;
6377*495ae853SAndroid Build Coastguard Worker 
6378*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
6379*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6380*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6381*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_ip);
6382*495ae853SAndroid Build Coastguard Worker 
6383*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
6384*495ae853SAndroid Build Coastguard Worker     {
6385*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
6386*495ae853SAndroid Build Coastguard Worker         isvcd_free_dynamic_bufs(ps_svc_lyr_dec);
6387*495ae853SAndroid Build Coastguard Worker     }
6388*495ae853SAndroid Build Coastguard Worker     isvcd_free_static_bufs(dec_hdl);
6389*495ae853SAndroid Build Coastguard Worker     ps_op->s_ivd_delete_op_t.u4_error_code = 0;
6390*495ae853SAndroid Build Coastguard Worker 
6391*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6392*495ae853SAndroid Build Coastguard Worker }
6393*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6394*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6395*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_reset                                             */
6396*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6397*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
6398*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6399*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6400*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6401*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6402*495ae853SAndroid Build Coastguard Worker /*  Globals       : <Does it use any global variables?>                      */
6403*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6404*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6405*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6406*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6407*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6408*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6409*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6410*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6411*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
6412*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6413*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_reset(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6414*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_reset(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6415*495ae853SAndroid Build Coastguard Worker {
6416*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6417*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6418*495ae853SAndroid Build Coastguard Worker     ivd_ctl_reset_op_t *ps_ctl_op = (ivd_ctl_reset_op_t *) pv_api_op;
6419*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
6420*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6421*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6422*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_api_ip);
6423*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_error_code = 0;
6424*495ae853SAndroid Build Coastguard Worker 
6425*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->i4_eos_flag = 0;
6426*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u4_num_sps_ctr = 0;
6427*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u4_num_pps_ctr = 0;
6428*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt->u1_pre_parse_in_flush = 1;
6429*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
6430*495ae853SAndroid Build Coastguard Worker     {
6431*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
6432*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
6433*495ae853SAndroid Build Coastguard Worker         if(ps_dec != NULL)
6434*495ae853SAndroid Build Coastguard Worker         {
6435*495ae853SAndroid Build Coastguard Worker             if(((buf_mgr_t *) ps_dec->pv_pic_buf_mgr)->pv_mutex != NULL)
6436*495ae853SAndroid Build Coastguard Worker                 ih264_buf_mgr_free(ps_dec->pv_pic_buf_mgr);
6437*495ae853SAndroid Build Coastguard Worker             if(((buf_mgr_t *) ps_dec->pv_mv_buf_mgr)->pv_mutex != NULL)
6438*495ae853SAndroid Build Coastguard Worker                 ih264_buf_mgr_free(ps_dec->pv_mv_buf_mgr);
6439*495ae853SAndroid Build Coastguard Worker 
6440*495ae853SAndroid Build Coastguard Worker             isvcd_init_decoder(ps_svc_lyr_dec);
6441*495ae853SAndroid Build Coastguard Worker             ps_dec->u1_flushfrm = 0;
6442*495ae853SAndroid Build Coastguard Worker         }
6443*495ae853SAndroid Build Coastguard Worker         else
6444*495ae853SAndroid Build Coastguard Worker         {
6445*495ae853SAndroid Build Coastguard Worker             H264_DEC_DEBUG_PRINT("\nReset called without Initializing the decoder\n");
6446*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_error_code = ERROR_INIT_NOT_DONE;
6447*495ae853SAndroid Build Coastguard Worker         }
6448*495ae853SAndroid Build Coastguard Worker     }
6449*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6450*495ae853SAndroid Build Coastguard Worker }
6451*495ae853SAndroid Build Coastguard Worker 
6452*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6453*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6454*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_ctl                                               */
6455*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6456*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
6457*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6458*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6459*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6460*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6461*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6462*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6463*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6464*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6465*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6466*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6467*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6468*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6469*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
6470*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6471*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_ctl(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6472*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_ctl(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6473*495ae853SAndroid Build Coastguard Worker {
6474*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_ip_t *ps_ctl_ip;
6475*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_op_t *ps_ctl_op;
6476*495ae853SAndroid Build Coastguard Worker     WORD32 ret = IV_SUCCESS;
6477*495ae853SAndroid Build Coastguard Worker     UWORD32 subcommand;
6478*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6479*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6480*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6481*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6482*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
6483*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
6484*495ae853SAndroid Build Coastguard Worker     if(ps_dec->init_done != 1)
6485*495ae853SAndroid Build Coastguard Worker     {
6486*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
6487*495ae853SAndroid Build Coastguard Worker     }
6488*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip = (ivd_ctl_set_config_ip_t *) pv_api_ip;
6489*495ae853SAndroid Build Coastguard Worker     ps_ctl_op = (ivd_ctl_set_config_op_t *) pv_api_op;
6490*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_error_code = 0;
6491*495ae853SAndroid Build Coastguard Worker     subcommand = ps_ctl_ip->e_sub_cmd;
6492*495ae853SAndroid Build Coastguard Worker 
6493*495ae853SAndroid Build Coastguard Worker     switch(subcommand)
6494*495ae853SAndroid Build Coastguard Worker     {
6495*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CTL_GETPARAMS:
6496*495ae853SAndroid Build Coastguard Worker             ret = isvcd_get_status(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6497*495ae853SAndroid Build Coastguard Worker             break;
6498*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CTL_SETPARAMS:
6499*495ae853SAndroid Build Coastguard Worker             ret = isvcd_set_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6500*495ae853SAndroid Build Coastguard Worker             break;
6501*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CTL_RESET:
6502*495ae853SAndroid Build Coastguard Worker             ret = isvcd_reset(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6503*495ae853SAndroid Build Coastguard Worker             break;
6504*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CTL_SETDEFAULT:
6505*495ae853SAndroid Build Coastguard Worker             ret = isvcd_set_default_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6506*495ae853SAndroid Build Coastguard Worker             break;
6507*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CTL_FLUSH:
6508*495ae853SAndroid Build Coastguard Worker             ret = isvcd_set_flush_mode(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6509*495ae853SAndroid Build Coastguard Worker             break;
6510*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CTL_GETBUFINFO:
6511*495ae853SAndroid Build Coastguard Worker             ret = isvcd_get_buf_info(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6512*495ae853SAndroid Build Coastguard Worker             break;
6513*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CTL_GETVERSION:
6514*495ae853SAndroid Build Coastguard Worker             ret = ih264d_get_version(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6515*495ae853SAndroid Build Coastguard Worker             break;
6516*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_DEGRADE:
6517*495ae853SAndroid Build Coastguard Worker             ret = isvcd_set_degrade(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6518*495ae853SAndroid Build Coastguard Worker             break;
6519*495ae853SAndroid Build Coastguard Worker 
6520*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_SET_NUM_CORES:
6521*495ae853SAndroid Build Coastguard Worker             ret = isvcd_set_num_cores(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6522*495ae853SAndroid Build Coastguard Worker             break;
6523*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_GET_BUFFER_DIMENSIONS:
6524*495ae853SAndroid Build Coastguard Worker             ret = isvcd_get_frame_dimensions(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6525*495ae853SAndroid Build Coastguard Worker             break;
6526*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_GET_VUI_PARAMS:
6527*495ae853SAndroid Build Coastguard Worker             ret = isvcd_get_vui_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6528*495ae853SAndroid Build Coastguard Worker             break;
6529*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS:
6530*495ae853SAndroid Build Coastguard Worker             ret = isvcd_get_sei_mdcv_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6531*495ae853SAndroid Build Coastguard Worker             break;
6532*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_GET_SEI_CLL_PARAMS:
6533*495ae853SAndroid Build Coastguard Worker             ret = isvcd_get_sei_cll_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6534*495ae853SAndroid Build Coastguard Worker             break;
6535*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_GET_SEI_AVE_PARAMS:
6536*495ae853SAndroid Build Coastguard Worker             ret = isvcd_get_sei_ave_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6537*495ae853SAndroid Build Coastguard Worker             break;
6538*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_GET_SEI_CCV_PARAMS:
6539*495ae853SAndroid Build Coastguard Worker             ret = isvcd_get_sei_ccv_params(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6540*495ae853SAndroid Build Coastguard Worker             break;
6541*495ae853SAndroid Build Coastguard Worker         case IH264D_CMD_CTL_SET_PROCESSOR:
6542*495ae853SAndroid Build Coastguard Worker             ret = isvcd_set_processor(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6543*495ae853SAndroid Build Coastguard Worker             break;
6544*495ae853SAndroid Build Coastguard Worker         case ISVCD_CMD_CTL_SET_TGT_LAYER:
6545*495ae853SAndroid Build Coastguard Worker             ret = isvcd_set_target_layer(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
6546*495ae853SAndroid Build Coastguard Worker             break;
6547*495ae853SAndroid Build Coastguard Worker         default:
6548*495ae853SAndroid Build Coastguard Worker             H264_DEC_DEBUG_PRINT("\ndo nothing\n");
6549*495ae853SAndroid Build Coastguard Worker             break;
6550*495ae853SAndroid Build Coastguard Worker     }
6551*495ae853SAndroid Build Coastguard Worker 
6552*495ae853SAndroid Build Coastguard Worker     return ret;
6553*495ae853SAndroid Build Coastguard Worker }
6554*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6555*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6556*495ae853SAndroid Build Coastguard Worker /*  Function Name :   isvcd_rel_display_frame                                */
6557*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6558*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
6559*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6560*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6561*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6562*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6563*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6564*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6565*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6566*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6567*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6568*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6569*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6570*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6571*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
6572*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6573*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_rel_display_frame(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6574*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_rel_display_frame(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6575*495ae853SAndroid Build Coastguard Worker {
6576*495ae853SAndroid Build Coastguard Worker     ivd_rel_display_frame_ip_t *ps_rel_ip;
6577*495ae853SAndroid Build Coastguard Worker     ivd_rel_display_frame_op_t *ps_rel_op;
6578*495ae853SAndroid Build Coastguard Worker     UWORD32 buf_released = 0;
6579*495ae853SAndroid Build Coastguard Worker 
6580*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ts = 0;
6581*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6582*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6583*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
6584*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6585*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6586*495ae853SAndroid Build Coastguard Worker 
6587*495ae853SAndroid Build Coastguard Worker     ps_rel_ip = (ivd_rel_display_frame_ip_t *) pv_api_ip;
6588*495ae853SAndroid Build Coastguard Worker     ps_rel_op = (ivd_rel_display_frame_op_t *) pv_api_op;
6589*495ae853SAndroid Build Coastguard Worker     ps_rel_op->u4_error_code = 0;
6590*495ae853SAndroid Build Coastguard Worker     u4_ts = ps_rel_ip->u4_disp_buf_id;
6591*495ae853SAndroid Build Coastguard Worker 
6592*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
6593*495ae853SAndroid Build Coastguard Worker     {
6594*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
6595*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
6596*495ae853SAndroid Build Coastguard Worker         if(0 == ps_dec->u4_share_disp_buf)
6597*495ae853SAndroid Build Coastguard Worker         {
6598*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_disp_buf_mapping[u4_ts] = 0;
6599*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_disp_buf_to_be_freed[u4_ts] = 0;
6600*495ae853SAndroid Build Coastguard Worker             return IV_SUCCESS;
6601*495ae853SAndroid Build Coastguard Worker         }
6602*495ae853SAndroid Build Coastguard Worker 
6603*495ae853SAndroid Build Coastguard Worker         if(ps_dec->pv_pic_buf_mgr != NULL)
6604*495ae853SAndroid Build Coastguard Worker         {
6605*495ae853SAndroid Build Coastguard Worker             if(1 == ps_dec->u4_disp_buf_mapping[u4_ts])
6606*495ae853SAndroid Build Coastguard Worker             {
6607*495ae853SAndroid Build Coastguard Worker                 ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr,
6608*495ae853SAndroid Build Coastguard Worker                                       ps_rel_ip->u4_disp_buf_id, BUF_MGR_IO);
6609*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_disp_buf_mapping[u4_ts] = 0;
6610*495ae853SAndroid Build Coastguard Worker                 buf_released = 1;
6611*495ae853SAndroid Build Coastguard Worker             }
6612*495ae853SAndroid Build Coastguard Worker         }
6613*495ae853SAndroid Build Coastguard Worker 
6614*495ae853SAndroid Build Coastguard Worker         if((1 == ps_dec->u4_share_disp_buf) && (0 == buf_released))
6615*495ae853SAndroid Build Coastguard Worker             ps_dec->u4_disp_buf_to_be_freed[u4_ts] = 1;
6616*495ae853SAndroid Build Coastguard Worker     }
6617*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6618*495ae853SAndroid Build Coastguard Worker }
6619*495ae853SAndroid Build Coastguard Worker 
6620*495ae853SAndroid Build Coastguard Worker /**
6621*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
6622*495ae853SAndroid Build Coastguard Worker  *
6623*495ae853SAndroid Build Coastguard Worker  * @brief
6624*495ae853SAndroid Build Coastguard Worker  *  Sets degrade params
6625*495ae853SAndroid Build Coastguard Worker  *
6626*495ae853SAndroid Build Coastguard Worker  * @par Description:
6627*495ae853SAndroid Build Coastguard Worker  *  Sets degrade params.
6628*495ae853SAndroid Build Coastguard Worker  *  Refer to ih264d_ctl_degrade_ip_t definition for details
6629*495ae853SAndroid Build Coastguard Worker  *
6630*495ae853SAndroid Build Coastguard Worker  * @param[in] ps_codec_obj
6631*495ae853SAndroid Build Coastguard Worker  *  Pointer to codec object at API level
6632*495ae853SAndroid Build Coastguard Worker  *
6633*495ae853SAndroid Build Coastguard Worker  * @param[in] pv_api_ip
6634*495ae853SAndroid Build Coastguard Worker  *  Pointer to input argument structure
6635*495ae853SAndroid Build Coastguard Worker  *
6636*495ae853SAndroid Build Coastguard Worker  * @param[out] pv_api_op
6637*495ae853SAndroid Build Coastguard Worker  *  Pointer to output argument structure
6638*495ae853SAndroid Build Coastguard Worker  *
6639*495ae853SAndroid Build Coastguard Worker  * @returns  Status
6640*495ae853SAndroid Build Coastguard Worker  *
6641*495ae853SAndroid Build Coastguard Worker  * @remarks
6642*495ae853SAndroid Build Coastguard Worker  *
6643*495ae853SAndroid Build Coastguard Worker  *
6644*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
6645*495ae853SAndroid Build Coastguard Worker  */
6646*495ae853SAndroid Build Coastguard Worker 
isvcd_set_degrade(iv_obj_t * ps_codec_obj,void * pv_api_ip,void * pv_api_op)6647*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_degrade(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op)
6648*495ae853SAndroid Build Coastguard Worker {
6649*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_degrade_ip_t *ps_ip;
6650*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_degrade_op_t *ps_op;
6651*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_codec;
6652*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6653*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
6654*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6655*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) ps_codec_obj->pv_codec_handle;
6656*495ae853SAndroid Build Coastguard Worker 
6657*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_degrade_ip_t *) pv_api_ip;
6658*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_degrade_op_t *) pv_api_op;
6659*495ae853SAndroid Build Coastguard Worker 
6660*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
6661*495ae853SAndroid Build Coastguard Worker     {
6662*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
6663*495ae853SAndroid Build Coastguard Worker         ps_codec = &ps_svc_lyr_dec->s_dec;
6664*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_degrade_type = ps_ip->i4_degrade_type;
6665*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_nondegrade_interval = ps_ip->i4_nondegrade_interval;
6666*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_degrade_pics = ps_ip->i4_degrade_pics;
6667*495ae853SAndroid Build Coastguard Worker 
6668*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_degrade_pic_cnt = 0;
6669*495ae853SAndroid Build Coastguard Worker     }
6670*495ae853SAndroid Build Coastguard Worker     ps_op->u4_error_code = 0;
6671*495ae853SAndroid Build Coastguard Worker 
6672*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6673*495ae853SAndroid Build Coastguard Worker }
6674*495ae853SAndroid Build Coastguard Worker 
6675*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6676*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6677*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_frame_dimensions                               */
6678*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6679*495ae853SAndroid Build Coastguard Worker /*  Description   : gets the frame wd and ht and the buffer sizes            */
6680*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6681*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6682*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6683*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6684*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6685*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
6686*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6687*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6688*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6689*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6690*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6691*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6692*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
6693*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6694*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_frame_dimensions(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6695*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_frame_dimensions(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6696*495ae853SAndroid Build Coastguard Worker {
6697*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_frame_dimensions_ip_t *ps_ip;
6698*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_frame_dimensions_op_t *ps_op;
6699*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6700*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6701*495ae853SAndroid Build Coastguard Worker     UWORD32 disp_wd, disp_ht, buffer_wd, buffer_ht, x_offset, y_offset;
6702*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6703*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6704*495ae853SAndroid Build Coastguard Worker 
6705*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
6706*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
6707*495ae853SAndroid Build Coastguard Worker 
6708*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_get_frame_dimensions_ip_t *) pv_api_ip;
6709*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_get_frame_dimensions_op_t *) pv_api_op;
6710*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_ip);
6711*495ae853SAndroid Build Coastguard Worker     if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
6712*495ae853SAndroid Build Coastguard Worker     {
6713*495ae853SAndroid Build Coastguard Worker         disp_wd = ps_dec->u2_disp_width;
6714*495ae853SAndroid Build Coastguard Worker         disp_ht = ps_dec->u2_disp_height;
6715*495ae853SAndroid Build Coastguard Worker 
6716*495ae853SAndroid Build Coastguard Worker         if(0 == ps_dec->u4_share_disp_buf)
6717*495ae853SAndroid Build Coastguard Worker         {
6718*495ae853SAndroid Build Coastguard Worker             buffer_wd = disp_wd;
6719*495ae853SAndroid Build Coastguard Worker             buffer_ht = disp_ht;
6720*495ae853SAndroid Build Coastguard Worker         }
6721*495ae853SAndroid Build Coastguard Worker         else
6722*495ae853SAndroid Build Coastguard Worker         {
6723*495ae853SAndroid Build Coastguard Worker             buffer_wd = ps_dec->u2_frm_wd_y;
6724*495ae853SAndroid Build Coastguard Worker             buffer_ht = ps_dec->u2_frm_ht_y;
6725*495ae853SAndroid Build Coastguard Worker         }
6726*495ae853SAndroid Build Coastguard Worker     }
6727*495ae853SAndroid Build Coastguard Worker     else
6728*495ae853SAndroid Build Coastguard Worker     {
6729*495ae853SAndroid Build Coastguard Worker         disp_wd = 0;
6730*495ae853SAndroid Build Coastguard Worker         disp_ht = 0;
6731*495ae853SAndroid Build Coastguard Worker 
6732*495ae853SAndroid Build Coastguard Worker         if(0 == ps_dec->u4_share_disp_buf)
6733*495ae853SAndroid Build Coastguard Worker         {
6734*495ae853SAndroid Build Coastguard Worker             buffer_wd = disp_wd;
6735*495ae853SAndroid Build Coastguard Worker             buffer_ht = disp_ht;
6736*495ae853SAndroid Build Coastguard Worker         }
6737*495ae853SAndroid Build Coastguard Worker         else
6738*495ae853SAndroid Build Coastguard Worker         {
6739*495ae853SAndroid Build Coastguard Worker             buffer_wd = ALIGN16(disp_wd) + (PAD_LEN_Y_H << 1);
6740*495ae853SAndroid Build Coastguard Worker             buffer_ht = ALIGN16(disp_ht) + (PAD_LEN_Y_V << 2);
6741*495ae853SAndroid Build Coastguard Worker         }
6742*495ae853SAndroid Build Coastguard Worker     }
6743*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u4_app_disp_width > buffer_wd) buffer_wd = ps_dec->u4_app_disp_width;
6744*495ae853SAndroid Build Coastguard Worker 
6745*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->u4_share_disp_buf)
6746*495ae853SAndroid Build Coastguard Worker     {
6747*495ae853SAndroid Build Coastguard Worker         x_offset = 0;
6748*495ae853SAndroid Build Coastguard Worker         y_offset = 0;
6749*495ae853SAndroid Build Coastguard Worker     }
6750*495ae853SAndroid Build Coastguard Worker     else
6751*495ae853SAndroid Build Coastguard Worker     {
6752*495ae853SAndroid Build Coastguard Worker         y_offset = (PAD_LEN_Y_V << 1);
6753*495ae853SAndroid Build Coastguard Worker         x_offset = PAD_LEN_Y_H;
6754*495ae853SAndroid Build Coastguard Worker 
6755*495ae853SAndroid Build Coastguard Worker         if((NULL != ps_dec->ps_sps) && (1 == (ps_dec->ps_sps->u1_is_valid)) &&
6756*495ae853SAndroid Build Coastguard Worker            (0 != ps_dec->u2_crop_offset_y))
6757*495ae853SAndroid Build Coastguard Worker         {
6758*495ae853SAndroid Build Coastguard Worker             y_offset += ps_dec->u2_crop_offset_y / ps_dec->u2_frm_wd_y;
6759*495ae853SAndroid Build Coastguard Worker             x_offset += ps_dec->u2_crop_offset_y % ps_dec->u2_frm_wd_y;
6760*495ae853SAndroid Build Coastguard Worker         }
6761*495ae853SAndroid Build Coastguard Worker     }
6762*495ae853SAndroid Build Coastguard Worker 
6763*495ae853SAndroid Build Coastguard Worker     ps_op->u4_disp_wd[0] = disp_wd;
6764*495ae853SAndroid Build Coastguard Worker     ps_op->u4_disp_ht[0] = disp_ht;
6765*495ae853SAndroid Build Coastguard Worker     ps_op->u4_buffer_wd[0] = buffer_wd;
6766*495ae853SAndroid Build Coastguard Worker     ps_op->u4_buffer_ht[0] = buffer_ht;
6767*495ae853SAndroid Build Coastguard Worker     ps_op->u4_x_offset[0] = x_offset;
6768*495ae853SAndroid Build Coastguard Worker     ps_op->u4_y_offset[0] = y_offset;
6769*495ae853SAndroid Build Coastguard Worker 
6770*495ae853SAndroid Build Coastguard Worker     ps_op->u4_disp_wd[1] = ps_op->u4_disp_wd[2] = ((ps_op->u4_disp_wd[0] + 1) >> 1);
6771*495ae853SAndroid Build Coastguard Worker     ps_op->u4_disp_ht[1] = ps_op->u4_disp_ht[2] = ((ps_op->u4_disp_ht[0] + 1) >> 1);
6772*495ae853SAndroid Build Coastguard Worker     ps_op->u4_buffer_wd[1] = ps_op->u4_buffer_wd[2] = (ps_op->u4_buffer_wd[0] >> 1);
6773*495ae853SAndroid Build Coastguard Worker     ps_op->u4_buffer_ht[1] = ps_op->u4_buffer_ht[2] = (ps_op->u4_buffer_ht[0] >> 1);
6774*495ae853SAndroid Build Coastguard Worker     ps_op->u4_x_offset[1] = ps_op->u4_x_offset[2] = (ps_op->u4_x_offset[0] >> 1);
6775*495ae853SAndroid Build Coastguard Worker     ps_op->u4_y_offset[1] = ps_op->u4_y_offset[2] = (ps_op->u4_y_offset[0] >> 1);
6776*495ae853SAndroid Build Coastguard Worker 
6777*495ae853SAndroid Build Coastguard Worker     if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV) ||
6778*495ae853SAndroid Build Coastguard Worker        (ps_dec->u1_chroma_format == IV_YUV_420SP_VU))
6779*495ae853SAndroid Build Coastguard Worker     {
6780*495ae853SAndroid Build Coastguard Worker         ps_op->u4_disp_wd[2] = 0;
6781*495ae853SAndroid Build Coastguard Worker         ps_op->u4_disp_ht[2] = 0;
6782*495ae853SAndroid Build Coastguard Worker         ps_op->u4_buffer_wd[2] = 0;
6783*495ae853SAndroid Build Coastguard Worker         ps_op->u4_buffer_ht[2] = 0;
6784*495ae853SAndroid Build Coastguard Worker         ps_op->u4_x_offset[2] = 0;
6785*495ae853SAndroid Build Coastguard Worker         ps_op->u4_y_offset[2] = 0;
6786*495ae853SAndroid Build Coastguard Worker 
6787*495ae853SAndroid Build Coastguard Worker         ps_op->u4_disp_wd[1] <<= 1;
6788*495ae853SAndroid Build Coastguard Worker         ps_op->u4_buffer_wd[1] <<= 1;
6789*495ae853SAndroid Build Coastguard Worker         ps_op->u4_x_offset[1] <<= 1;
6790*495ae853SAndroid Build Coastguard Worker     }
6791*495ae853SAndroid Build Coastguard Worker 
6792*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6793*495ae853SAndroid Build Coastguard Worker }
6794*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6795*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6796*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_vui_params                                     */
6797*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6798*495ae853SAndroid Build Coastguard Worker /*  Description   : gets the VUI params                                      */
6799*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6800*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
6801*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
6802*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
6803*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6804*495ae853SAndroid Build Coastguard Worker /*  Returns       : success or failure                                       */
6805*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6806*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6807*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6808*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6809*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6810*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6811*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
6812*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6813*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6814*495ae853SAndroid Build Coastguard Worker 
isvcd_get_vui_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6815*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_vui_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6816*495ae853SAndroid Build Coastguard Worker {
6817*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_vui_params_ip_t *ps_ip;
6818*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_vui_params_op_t *ps_op;
6819*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6820*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6821*495ae853SAndroid Build Coastguard Worker     dec_seq_params_t *ps_sps;
6822*495ae853SAndroid Build Coastguard Worker     vui_t *ps_vui;
6823*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_size;
6824*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6825*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6826*495ae853SAndroid Build Coastguard Worker 
6827*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_get_vui_params_ip_t *) pv_api_ip;
6828*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_get_vui_params_op_t *) pv_api_op;
6829*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_ip);
6830*495ae853SAndroid Build Coastguard Worker 
6831*495ae853SAndroid Build Coastguard Worker     u4_size = ps_op->u4_size;
6832*495ae853SAndroid Build Coastguard Worker     memset(ps_op, 0, sizeof(isvcd_ctl_get_vui_params_op_t));
6833*495ae853SAndroid Build Coastguard Worker     ps_op->u4_size = u4_size;
6834*495ae853SAndroid Build Coastguard Worker 
6835*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
6836*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
6837*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_dec->ps_cur_sps)
6838*495ae853SAndroid Build Coastguard Worker     {
6839*495ae853SAndroid Build Coastguard Worker         ps_op->u4_error_code = ERROR_VUI_PARAMS_NOT_FOUND;
6840*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
6841*495ae853SAndroid Build Coastguard Worker     }
6842*495ae853SAndroid Build Coastguard Worker     ps_sps = ps_dec->ps_cur_sps;
6843*495ae853SAndroid Build Coastguard Worker 
6844*495ae853SAndroid Build Coastguard Worker     if((0 == ps_sps->u1_is_valid) || (0 == ps_sps->u1_vui_parameters_present_flag))
6845*495ae853SAndroid Build Coastguard Worker     {
6846*495ae853SAndroid Build Coastguard Worker         ps_op->u4_error_code = ERROR_VUI_PARAMS_NOT_FOUND;
6847*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
6848*495ae853SAndroid Build Coastguard Worker     }
6849*495ae853SAndroid Build Coastguard Worker 
6850*495ae853SAndroid Build Coastguard Worker     ps_vui = &ps_sps->s_vui;
6851*495ae853SAndroid Build Coastguard Worker 
6852*495ae853SAndroid Build Coastguard Worker     ps_op->u1_aspect_ratio_idc = ps_vui->u1_aspect_ratio_idc;
6853*495ae853SAndroid Build Coastguard Worker     ps_op->u2_sar_width = ps_vui->u2_sar_width;
6854*495ae853SAndroid Build Coastguard Worker     ps_op->u2_sar_height = ps_vui->u2_sar_height;
6855*495ae853SAndroid Build Coastguard Worker     ps_op->u1_overscan_appropriate_flag = ps_vui->u1_overscan_appropriate_flag;
6856*495ae853SAndroid Build Coastguard Worker     ps_op->u1_video_format = ps_vui->u1_video_format;
6857*495ae853SAndroid Build Coastguard Worker     ps_op->u1_video_full_range_flag = ps_vui->u1_video_full_range_flag;
6858*495ae853SAndroid Build Coastguard Worker     ps_op->u1_colour_primaries = ps_vui->u1_colour_primaries;
6859*495ae853SAndroid Build Coastguard Worker     ps_op->u1_tfr_chars = ps_vui->u1_tfr_chars;
6860*495ae853SAndroid Build Coastguard Worker     ps_op->u1_matrix_coeffs = ps_vui->u1_matrix_coeffs;
6861*495ae853SAndroid Build Coastguard Worker     ps_op->u1_cr_top_field = ps_vui->u1_cr_top_field;
6862*495ae853SAndroid Build Coastguard Worker     ps_op->u1_cr_bottom_field = ps_vui->u1_cr_bottom_field;
6863*495ae853SAndroid Build Coastguard Worker     ps_op->u4_num_units_in_tick = ps_vui->u4_num_units_in_tick;
6864*495ae853SAndroid Build Coastguard Worker     ps_op->u4_time_scale = ps_vui->u4_time_scale;
6865*495ae853SAndroid Build Coastguard Worker     ps_op->u1_fixed_frame_rate_flag = ps_vui->u1_fixed_frame_rate_flag;
6866*495ae853SAndroid Build Coastguard Worker     ps_op->u1_nal_hrd_params_present = ps_vui->u1_nal_hrd_params_present;
6867*495ae853SAndroid Build Coastguard Worker     ps_op->u1_vcl_hrd_params_present = ps_vui->u1_vcl_hrd_params_present;
6868*495ae853SAndroid Build Coastguard Worker     ps_op->u1_low_delay_hrd_flag = ps_vui->u1_low_delay_hrd_flag;
6869*495ae853SAndroid Build Coastguard Worker     ps_op->u1_pic_struct_present_flag = ps_vui->u1_pic_struct_present_flag;
6870*495ae853SAndroid Build Coastguard Worker     ps_op->u1_bitstream_restriction_flag = ps_vui->u1_bitstream_restriction_flag;
6871*495ae853SAndroid Build Coastguard Worker     ps_op->u1_mv_over_pic_boundaries_flag = ps_vui->u1_mv_over_pic_boundaries_flag;
6872*495ae853SAndroid Build Coastguard Worker     ps_op->u4_max_bytes_per_pic_denom = ps_vui->u4_max_bytes_per_pic_denom;
6873*495ae853SAndroid Build Coastguard Worker     ps_op->u4_max_bits_per_mb_denom = ps_vui->u4_max_bits_per_mb_denom;
6874*495ae853SAndroid Build Coastguard Worker     ps_op->u4_log2_max_mv_length_horz = ps_vui->u4_log2_max_mv_length_horz;
6875*495ae853SAndroid Build Coastguard Worker     ps_op->u4_log2_max_mv_length_vert = ps_vui->u4_log2_max_mv_length_vert;
6876*495ae853SAndroid Build Coastguard Worker     ps_op->u4_num_reorder_frames = ps_vui->u4_num_reorder_frames;
6877*495ae853SAndroid Build Coastguard Worker     ps_op->u4_max_dec_frame_buffering = ps_vui->u4_max_dec_frame_buffering;
6878*495ae853SAndroid Build Coastguard Worker 
6879*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6880*495ae853SAndroid Build Coastguard Worker }
6881*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6882*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6883*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_sei_mdcv_params                               */
6884*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6885*495ae853SAndroid Build Coastguard Worker /*  Description   : This function populates SEI mdcv message in              */
6886*495ae853SAndroid Build Coastguard Worker /*                     output structure                                      */
6887*495ae853SAndroid Build Coastguard Worker /*  Inputs        : iv_obj_t decoder handle                                  */
6888*495ae853SAndroid Build Coastguard Worker /*                : pv_api_ip pointer to input structure                     */
6889*495ae853SAndroid Build Coastguard Worker /*                : pv_api_op pointer to output structure                    */
6890*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6891*495ae853SAndroid Build Coastguard Worker /*  Returns       : returns 0; 1 with error code when MDCV is not present    */
6892*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6893*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6894*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6895*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6896*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6897*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6898*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6899*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6900*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_sei_mdcv_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6901*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_sei_mdcv_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6902*495ae853SAndroid Build Coastguard Worker {
6903*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_sei_mdcv_params_ip_t *ps_ip;
6904*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_sei_mdcv_params_op_t *ps_op;
6905*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6906*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6907*495ae853SAndroid Build Coastguard Worker     sei_mdcv_params_t *ps_sei_mdcv;
6908*495ae853SAndroid Build Coastguard Worker     WORD32 i4_count;
6909*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6910*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6911*495ae853SAndroid Build Coastguard Worker 
6912*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_get_sei_mdcv_params_ip_t *) pv_api_ip;
6913*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_get_sei_mdcv_params_op_t *) pv_api_op;
6914*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_ip);
6915*495ae853SAndroid Build Coastguard Worker 
6916*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
6917*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
6918*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->s_sei_export.u1_sei_mdcv_params_present_flag)
6919*495ae853SAndroid Build Coastguard Worker     {
6920*495ae853SAndroid Build Coastguard Worker         ps_op->u4_error_code = ERROR_SEI_MDCV_PARAMS_NOT_FOUND;
6921*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
6922*495ae853SAndroid Build Coastguard Worker     }
6923*495ae853SAndroid Build Coastguard Worker     ps_sei_mdcv = &ps_dec->s_sei_export.s_sei_mdcv_params;
6924*495ae853SAndroid Build Coastguard Worker 
6925*495ae853SAndroid Build Coastguard Worker     for(i4_count = 0; i4_count < NUM_SEI_MDCV_PRIMARIES; i4_count++)
6926*495ae853SAndroid Build Coastguard Worker     {
6927*495ae853SAndroid Build Coastguard Worker         ps_op->au2_display_primaries_x[i4_count] = ps_sei_mdcv->au2_display_primaries_x[i4_count];
6928*495ae853SAndroid Build Coastguard Worker         ps_op->au2_display_primaries_y[i4_count] = ps_sei_mdcv->au2_display_primaries_y[i4_count];
6929*495ae853SAndroid Build Coastguard Worker     }
6930*495ae853SAndroid Build Coastguard Worker 
6931*495ae853SAndroid Build Coastguard Worker     ps_op->u2_white_point_x = ps_sei_mdcv->u2_white_point_x;
6932*495ae853SAndroid Build Coastguard Worker     ps_op->u2_white_point_y = ps_sei_mdcv->u2_white_point_y;
6933*495ae853SAndroid Build Coastguard Worker     ps_op->u4_max_display_mastering_luminance = ps_sei_mdcv->u4_max_display_mastering_luminance;
6934*495ae853SAndroid Build Coastguard Worker     ps_op->u4_min_display_mastering_luminance = ps_sei_mdcv->u4_min_display_mastering_luminance;
6935*495ae853SAndroid Build Coastguard Worker 
6936*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6937*495ae853SAndroid Build Coastguard Worker }
6938*495ae853SAndroid Build Coastguard Worker 
6939*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6940*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6941*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_sei_cll_params                                */
6942*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6943*495ae853SAndroid Build Coastguard Worker /*  Description   : This function populates SEI cll message in               */
6944*495ae853SAndroid Build Coastguard Worker /*                     output structure                                      */
6945*495ae853SAndroid Build Coastguard Worker /*  Inputs        : iv_obj_t decoder handle                                  */
6946*495ae853SAndroid Build Coastguard Worker /*                : pv_api_ip pointer to input structure                     */
6947*495ae853SAndroid Build Coastguard Worker /*                : pv_api_op pointer to output structure                    */
6948*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6949*495ae853SAndroid Build Coastguard Worker /*  Returns       : returns 0; 1 with error code when CLL is not present     */
6950*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6951*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
6952*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6953*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
6954*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6955*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
6956*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6957*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6958*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_sei_cll_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)6959*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_sei_cll_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
6960*495ae853SAndroid Build Coastguard Worker {
6961*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_sei_cll_params_ip_t *ps_ip;
6962*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_sei_cll_params_op_t *ps_op;
6963*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
6964*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
6965*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
6966*495ae853SAndroid Build Coastguard Worker     sei_cll_params_t *ps_sei_cll;
6967*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
6968*495ae853SAndroid Build Coastguard Worker 
6969*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_get_sei_cll_params_ip_t *) pv_api_ip;
6970*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_get_sei_cll_params_op_t *) pv_api_op;
6971*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_ip);
6972*495ae853SAndroid Build Coastguard Worker 
6973*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
6974*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
6975*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->s_sei_export.u1_sei_cll_params_present_flag)
6976*495ae853SAndroid Build Coastguard Worker     {
6977*495ae853SAndroid Build Coastguard Worker         ps_op->u4_error_code = ERROR_SEI_CLL_PARAMS_NOT_FOUND;
6978*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
6979*495ae853SAndroid Build Coastguard Worker     }
6980*495ae853SAndroid Build Coastguard Worker     ps_sei_cll = &ps_dec->s_sei_export.s_sei_cll_params;
6981*495ae853SAndroid Build Coastguard Worker 
6982*495ae853SAndroid Build Coastguard Worker     ps_op->u2_max_content_light_level = ps_sei_cll->u2_max_content_light_level;
6983*495ae853SAndroid Build Coastguard Worker     ps_op->u2_max_pic_average_light_level = ps_sei_cll->u2_max_pic_average_light_level;
6984*495ae853SAndroid Build Coastguard Worker 
6985*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
6986*495ae853SAndroid Build Coastguard Worker }
6987*495ae853SAndroid Build Coastguard Worker 
6988*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
6989*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6990*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_sei_ave_params                                */
6991*495ae853SAndroid Build Coastguard Worker /*                                                                           */
6992*495ae853SAndroid Build Coastguard Worker /*  Description   : This function populates SEI ave message in               */
6993*495ae853SAndroid Build Coastguard Worker /*                     output structure                                      */
6994*495ae853SAndroid Build Coastguard Worker /*  Inputs        : iv_obj_t decoder handle                                  */
6995*495ae853SAndroid Build Coastguard Worker /*                : pv_api_ip pointer to input structure                     */
6996*495ae853SAndroid Build Coastguard Worker /*                : pv_api_op pointer to output structure                    */
6997*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
6998*495ae853SAndroid Build Coastguard Worker /*  Returns       : returns 0; 1 with error code when AVE is not present     */
6999*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7000*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
7001*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7002*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
7003*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7004*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
7005*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7006*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7007*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_sei_ave_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)7008*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_sei_ave_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
7009*495ae853SAndroid Build Coastguard Worker {
7010*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_sei_ave_params_ip_t *ps_ip;
7011*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_sei_ave_params_op_t *ps_op;
7012*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
7013*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
7014*495ae853SAndroid Build Coastguard Worker     sei_ave_params_t *ps_sei_ave;
7015*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
7016*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
7017*495ae853SAndroid Build Coastguard Worker 
7018*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_get_sei_ave_params_ip_t *) pv_api_ip;
7019*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_get_sei_ave_params_op_t *) pv_api_op;
7020*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_ip);
7021*495ae853SAndroid Build Coastguard Worker 
7022*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
7023*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
7024*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->s_sei_export.u1_sei_ave_params_present_flag)
7025*495ae853SAndroid Build Coastguard Worker     {
7026*495ae853SAndroid Build Coastguard Worker         ps_op->u4_error_code = ERROR_SEI_AVE_PARAMS_NOT_FOUND;
7027*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
7028*495ae853SAndroid Build Coastguard Worker     }
7029*495ae853SAndroid Build Coastguard Worker     ps_sei_ave = &ps_dec->s_sei_export.s_sei_ave_params;
7030*495ae853SAndroid Build Coastguard Worker 
7031*495ae853SAndroid Build Coastguard Worker     ps_op->u4_ambient_illuminance = ps_sei_ave->u4_ambient_illuminance;
7032*495ae853SAndroid Build Coastguard Worker     ps_op->u2_ambient_light_x = ps_sei_ave->u2_ambient_light_x;
7033*495ae853SAndroid Build Coastguard Worker     ps_op->u2_ambient_light_y = ps_sei_ave->u2_ambient_light_y;
7034*495ae853SAndroid Build Coastguard Worker 
7035*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
7036*495ae853SAndroid Build Coastguard Worker }
7037*495ae853SAndroid Build Coastguard Worker 
7038*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
7039*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7040*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_sei_ccv_params                                */
7041*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7042*495ae853SAndroid Build Coastguard Worker /*  Description   : This function populates SEI mdcv message in              */
7043*495ae853SAndroid Build Coastguard Worker /*                     output structure                                      */
7044*495ae853SAndroid Build Coastguard Worker /*  Inputs        : iv_obj_t decoder handle                                  */
7045*495ae853SAndroid Build Coastguard Worker /*                : pv_api_ip pointer to input structure                     */
7046*495ae853SAndroid Build Coastguard Worker /*                : pv_api_op pointer to output structure                    */
7047*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
7048*495ae853SAndroid Build Coastguard Worker /*  Returns       : returns 0; 1 with error code when CCV is not present    */
7049*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7050*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
7051*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7052*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
7053*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7054*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
7055*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7056*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7057*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_sei_ccv_params(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)7058*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_sei_ccv_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
7059*495ae853SAndroid Build Coastguard Worker {
7060*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_sei_ccv_params_ip_t *ps_ip;
7061*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_get_sei_ccv_params_op_t *ps_op;
7062*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
7063*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
7064*495ae853SAndroid Build Coastguard Worker     sei_ccv_params_t *ps_sei_ccv;
7065*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
7066*495ae853SAndroid Build Coastguard Worker     WORD32 i4_count;
7067*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
7068*495ae853SAndroid Build Coastguard Worker 
7069*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_get_sei_ccv_params_ip_t *) pv_api_ip;
7070*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_get_sei_ccv_params_op_t *) pv_api_op;
7071*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_ip);
7072*495ae853SAndroid Build Coastguard Worker 
7073*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svcd_ctxt->u1_target_layer_id];
7074*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
7075*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dec->s_sei_export.u1_sei_ccv_params_present_flag)
7076*495ae853SAndroid Build Coastguard Worker     {
7077*495ae853SAndroid Build Coastguard Worker         ps_op->u4_error_code = ERROR_SEI_CCV_PARAMS_NOT_FOUND;
7078*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
7079*495ae853SAndroid Build Coastguard Worker     }
7080*495ae853SAndroid Build Coastguard Worker     ps_sei_ccv = &ps_dec->s_sei_export.s_sei_ccv_params;
7081*495ae853SAndroid Build Coastguard Worker     ps_op->u1_ccv_cancel_flag = ps_sei_ccv->u1_ccv_cancel_flag;
7082*495ae853SAndroid Build Coastguard Worker 
7083*495ae853SAndroid Build Coastguard Worker     if(0 == ps_op->u1_ccv_cancel_flag)
7084*495ae853SAndroid Build Coastguard Worker     {
7085*495ae853SAndroid Build Coastguard Worker         ps_op->u1_ccv_persistence_flag = ps_sei_ccv->u1_ccv_persistence_flag;
7086*495ae853SAndroid Build Coastguard Worker         ps_op->u1_ccv_primaries_present_flag = ps_sei_ccv->u1_ccv_primaries_present_flag;
7087*495ae853SAndroid Build Coastguard Worker         ps_op->u1_ccv_min_luminance_value_present_flag =
7088*495ae853SAndroid Build Coastguard Worker             ps_sei_ccv->u1_ccv_min_luminance_value_present_flag;
7089*495ae853SAndroid Build Coastguard Worker         ps_op->u1_ccv_max_luminance_value_present_flag =
7090*495ae853SAndroid Build Coastguard Worker             ps_sei_ccv->u1_ccv_max_luminance_value_present_flag;
7091*495ae853SAndroid Build Coastguard Worker         ps_op->u1_ccv_avg_luminance_value_present_flag =
7092*495ae853SAndroid Build Coastguard Worker             ps_sei_ccv->u1_ccv_avg_luminance_value_present_flag;
7093*495ae853SAndroid Build Coastguard Worker         ps_op->u1_ccv_reserved_zero_2bits = ps_sei_ccv->u1_ccv_reserved_zero_2bits;
7094*495ae853SAndroid Build Coastguard Worker 
7095*495ae853SAndroid Build Coastguard Worker         if(1 == ps_sei_ccv->u1_ccv_primaries_present_flag)
7096*495ae853SAndroid Build Coastguard Worker         {
7097*495ae853SAndroid Build Coastguard Worker             for(i4_count = 0; i4_count < NUM_SEI_CCV_PRIMARIES; i4_count++)
7098*495ae853SAndroid Build Coastguard Worker             {
7099*495ae853SAndroid Build Coastguard Worker                 ps_op->ai4_ccv_primaries_x[i4_count] = ps_sei_ccv->ai4_ccv_primaries_x[i4_count];
7100*495ae853SAndroid Build Coastguard Worker                 ps_op->ai4_ccv_primaries_y[i4_count] = ps_sei_ccv->ai4_ccv_primaries_y[i4_count];
7101*495ae853SAndroid Build Coastguard Worker             }
7102*495ae853SAndroid Build Coastguard Worker         }
7103*495ae853SAndroid Build Coastguard Worker 
7104*495ae853SAndroid Build Coastguard Worker         if(1 == ps_sei_ccv->u1_ccv_min_luminance_value_present_flag)
7105*495ae853SAndroid Build Coastguard Worker         {
7106*495ae853SAndroid Build Coastguard Worker             ps_op->u4_ccv_min_luminance_value = ps_sei_ccv->u4_ccv_min_luminance_value;
7107*495ae853SAndroid Build Coastguard Worker         }
7108*495ae853SAndroid Build Coastguard Worker         if(1 == ps_sei_ccv->u1_ccv_max_luminance_value_present_flag)
7109*495ae853SAndroid Build Coastguard Worker         {
7110*495ae853SAndroid Build Coastguard Worker             ps_op->u4_ccv_max_luminance_value = ps_sei_ccv->u4_ccv_max_luminance_value;
7111*495ae853SAndroid Build Coastguard Worker         }
7112*495ae853SAndroid Build Coastguard Worker         if(1 == ps_sei_ccv->u1_ccv_avg_luminance_value_present_flag)
7113*495ae853SAndroid Build Coastguard Worker         {
7114*495ae853SAndroid Build Coastguard Worker             ps_op->u4_ccv_avg_luminance_value = ps_sei_ccv->u4_ccv_avg_luminance_value;
7115*495ae853SAndroid Build Coastguard Worker         }
7116*495ae853SAndroid Build Coastguard Worker     }
7117*495ae853SAndroid Build Coastguard Worker 
7118*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
7119*495ae853SAndroid Build Coastguard Worker }
7120*495ae853SAndroid Build Coastguard Worker 
7121*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
7122*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7123*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_set_num_cores                                      */
7124*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7125*495ae853SAndroid Build Coastguard Worker /*  Description   : This function sets the no of cores which decoder         */
7126*495ae853SAndroid Build Coastguard Worker /*                     can use for decoding                                  */
7127*495ae853SAndroid Build Coastguard Worker /*  Inputs        : iv_obj_t decoder handle                                  */
7128*495ae853SAndroid Build Coastguard Worker /*                : pv_api_ip pointer to input structure                     */
7129*495ae853SAndroid Build Coastguard Worker /*                : pv_api_op pointer to output structure                    */
7130*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
7131*495ae853SAndroid Build Coastguard Worker /*  Returns       : returns 0; 1 with error code                             */
7132*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7133*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
7134*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7135*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
7136*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7137*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
7138*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7139*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7140*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_set_num_cores(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)7141*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_set_num_cores(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
7142*495ae853SAndroid Build Coastguard Worker {
7143*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_layer_id;
7144*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_num_cores_ip_t *ps_ip;
7145*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_num_cores_op_t *ps_op;
7146*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
7147*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
7148*495ae853SAndroid Build Coastguard Worker     svc_dec_ctxt_t *ps_svcd_ctxt;
7149*495ae853SAndroid Build Coastguard Worker     ps_svcd_ctxt = (svc_dec_ctxt_t *) dec_hdl->pv_codec_handle;
7150*495ae853SAndroid Build Coastguard Worker 
7151*495ae853SAndroid Build Coastguard Worker     ps_ip = (isvcd_ctl_set_num_cores_ip_t *) pv_api_ip;
7152*495ae853SAndroid Build Coastguard Worker     ps_op = (isvcd_ctl_set_num_cores_op_t *) pv_api_op;
7153*495ae853SAndroid Build Coastguard Worker     ps_op->u4_error_code = 0;
7154*495ae853SAndroid Build Coastguard Worker     for(u1_layer_id = 0; u1_layer_id < MAX_NUM_RES_LYRS; u1_layer_id++)
7155*495ae853SAndroid Build Coastguard Worker     {
7156*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec = &ps_svcd_ctxt->ps_svc_dec_lyr[u1_layer_id];
7157*495ae853SAndroid Build Coastguard Worker         ps_dec = &ps_svc_lyr_dec->s_dec;
7158*495ae853SAndroid Build Coastguard Worker         ps_dec->u4_num_cores = ps_ip->u4_num_cores;
7159*495ae853SAndroid Build Coastguard Worker 
7160*495ae853SAndroid Build Coastguard Worker         if(ps_dec->u4_num_cores == 1)
7161*495ae853SAndroid Build Coastguard Worker         {
7162*495ae853SAndroid Build Coastguard Worker             ps_dec->u1_separate_parse = 0;
7163*495ae853SAndroid Build Coastguard Worker         }
7164*495ae853SAndroid Build Coastguard Worker         else
7165*495ae853SAndroid Build Coastguard Worker         {
7166*495ae853SAndroid Build Coastguard Worker             ps_dec->u1_separate_parse = 1;
7167*495ae853SAndroid Build Coastguard Worker         }
7168*495ae853SAndroid Build Coastguard Worker 
7169*495ae853SAndroid Build Coastguard Worker         /*using only upto three threads currently*/
7170*495ae853SAndroid Build Coastguard Worker         if(ps_dec->u4_num_cores > 3) ps_dec->u4_num_cores = 3;
7171*495ae853SAndroid Build Coastguard Worker     }
7172*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
7173*495ae853SAndroid Build Coastguard Worker }
7174*495ae853SAndroid Build Coastguard Worker 
7175*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
7176*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7177*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_fill_output_struct_from_context                    */
7178*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7179*495ae853SAndroid Build Coastguard Worker /*  Description   : This function fills the output structure from the        */
7180*495ae853SAndroid Build Coastguard Worker /*                     svc layer context                                     */
7181*495ae853SAndroid Build Coastguard Worker /*  Inputs        : iv_obj_t decoder handle                                  */
7182*495ae853SAndroid Build Coastguard Worker /*                : ps_svc_lyr_dec pointer to svc layer context              */
7183*495ae853SAndroid Build Coastguard Worker /*                : ps_dec_op pointer to output structure                    */
7184*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
7185*495ae853SAndroid Build Coastguard Worker /*  Returns       :                                                          */
7186*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7187*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
7188*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7189*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
7190*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7191*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
7192*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7193*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7194*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_fill_output_struct_from_context(svc_dec_lyr_struct_t * ps_svc_lyr_dec,ivd_video_decode_op_t * ps_dec_op)7195*495ae853SAndroid Build Coastguard Worker void isvcd_fill_output_struct_from_context(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
7196*495ae853SAndroid Build Coastguard Worker                                            ivd_video_decode_op_t *ps_dec_op)
7197*495ae853SAndroid Build Coastguard Worker {
7198*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
7199*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
7200*495ae853SAndroid Build Coastguard Worker     if((ps_dec_op->u4_error_code & 0xff) != ERROR_DYNAMIC_RESOLUTION_NOT_SUPPORTED)
7201*495ae853SAndroid Build Coastguard Worker     {
7202*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_pic_wd = (UWORD32) ps_dec->u2_disp_width;
7203*495ae853SAndroid Build Coastguard Worker         ps_dec_op->u4_pic_ht = (UWORD32) ps_dec->u2_disp_height;
7204*495ae853SAndroid Build Coastguard Worker     }
7205*495ae853SAndroid Build Coastguard Worker     ps_dec_op->i4_reorder_depth = ps_dec->i4_reorder_depth;
7206*495ae853SAndroid Build Coastguard Worker     ps_dec_op->i4_display_index = ps_dec->i4_display_index;
7207*495ae853SAndroid Build Coastguard Worker     ps_dec_op->e_pic_type = ps_dec->i4_frametype;
7208*495ae853SAndroid Build Coastguard Worker 
7209*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_new_seq = 0;
7210*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_output_present =
7211*495ae853SAndroid Build Coastguard Worker         (ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) ? ps_dec->u4_output_present : 0;
7212*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_progressive_frame_flag = ps_dec->s_disp_op.u4_progressive_frame_flag;
7213*495ae853SAndroid Build Coastguard Worker 
7214*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_is_ref_flag = 1;
7215*495ae853SAndroid Build Coastguard Worker     if(ps_dec_op->u4_frame_decoded_flag)
7216*495ae853SAndroid Build Coastguard Worker     {
7217*495ae853SAndroid Build Coastguard Worker         if(ps_dec->ps_cur_slice->u1_nal_ref_idc == 0) ps_dec_op->u4_is_ref_flag = 0;
7218*495ae853SAndroid Build Coastguard Worker     }
7219*495ae853SAndroid Build Coastguard Worker 
7220*495ae853SAndroid Build Coastguard Worker     ps_dec_op->e_output_format = ps_dec->s_disp_op.e_output_format;
7221*495ae853SAndroid Build Coastguard Worker     ps_dec_op->s_disp_frm_buf = ps_dec->s_disp_op.s_disp_frm_buf;
7222*495ae853SAndroid Build Coastguard Worker     ps_dec_op->e4_fld_type = ps_dec->s_disp_op.e4_fld_type;
7223*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_ts = ps_dec->s_disp_op.u4_ts;
7224*495ae853SAndroid Build Coastguard Worker     ps_dec_op->u4_disp_buf_id = ps_dec->s_disp_op.u4_disp_buf_id;
7225*495ae853SAndroid Build Coastguard Worker 
7226*495ae853SAndroid Build Coastguard Worker     ih264d_export_sei_params(&ps_dec_op->s_sei_decode_op, ps_dec);
7227*495ae853SAndroid Build Coastguard Worker }
7228*495ae853SAndroid Build Coastguard Worker 
7229*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
7230*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7231*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_api_function                                       */
7232*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7233*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
7234*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7235*495ae853SAndroid Build Coastguard Worker /*  Inputs        :iv_obj_t decoder handle                                   */
7236*495ae853SAndroid Build Coastguard Worker /*                :pv_api_ip pointer to input structure                      */
7237*495ae853SAndroid Build Coastguard Worker /*                :pv_api_op pointer to output structure                     */
7238*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
7239*495ae853SAndroid Build Coastguard Worker /*  Returns       : void                                                     */
7240*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7241*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
7242*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7243*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
7244*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7245*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
7246*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Draft                                */
7247*495ae853SAndroid Build Coastguard Worker /*                                                                           */
7248*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_api_function(iv_obj_t * dec_hdl,void * pv_api_ip,void * pv_api_op)7249*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T isvcd_api_function(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
7250*495ae853SAndroid Build Coastguard Worker {
7251*495ae853SAndroid Build Coastguard Worker     UWORD32 command;
7252*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu2_ptr_cmd;
7253*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_api_ret;
7254*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T e_status;
7255*495ae853SAndroid Build Coastguard Worker     e_status = api_check_struct_sanity(dec_hdl, pv_api_ip, pv_api_op);
7256*495ae853SAndroid Build Coastguard Worker 
7257*495ae853SAndroid Build Coastguard Worker     if(e_status != IV_SUCCESS)
7258*495ae853SAndroid Build Coastguard Worker     {
7259*495ae853SAndroid Build Coastguard Worker         UWORD32 *ptr_err;
7260*495ae853SAndroid Build Coastguard Worker 
7261*495ae853SAndroid Build Coastguard Worker         ptr_err = (UWORD32 *) pv_api_op;
7262*495ae853SAndroid Build Coastguard Worker         UNUSED(ptr_err);
7263*495ae853SAndroid Build Coastguard Worker         H264_DEC_DEBUG_PRINT("error code = %d\n", *(ptr_err + 1));
7264*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
7265*495ae853SAndroid Build Coastguard Worker     }
7266*495ae853SAndroid Build Coastguard Worker 
7267*495ae853SAndroid Build Coastguard Worker     pu2_ptr_cmd = (UWORD32 *) pv_api_ip;
7268*495ae853SAndroid Build Coastguard Worker     pu2_ptr_cmd++;
7269*495ae853SAndroid Build Coastguard Worker 
7270*495ae853SAndroid Build Coastguard Worker     command = *pu2_ptr_cmd;
7271*495ae853SAndroid Build Coastguard Worker     switch(command)
7272*495ae853SAndroid Build Coastguard Worker     {
7273*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_CREATE:
7274*495ae853SAndroid Build Coastguard Worker             u4_api_ret = isvcd_create(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
7275*495ae853SAndroid Build Coastguard Worker             break;
7276*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_DELETE:
7277*495ae853SAndroid Build Coastguard Worker             u4_api_ret = isvcd_delete(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
7278*495ae853SAndroid Build Coastguard Worker             break;
7279*495ae853SAndroid Build Coastguard Worker 
7280*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_VIDEO_DECODE:
7281*495ae853SAndroid Build Coastguard Worker             u4_api_ret = isvcd_video_decode(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
7282*495ae853SAndroid Build Coastguard Worker             break;
7283*495ae853SAndroid Build Coastguard Worker 
7284*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_GET_DISPLAY_FRAME:
7285*495ae853SAndroid Build Coastguard Worker             u4_api_ret = ih264d_get_display_frame(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
7286*495ae853SAndroid Build Coastguard Worker 
7287*495ae853SAndroid Build Coastguard Worker             break;
7288*495ae853SAndroid Build Coastguard Worker 
7289*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_SET_DISPLAY_FRAME:
7290*495ae853SAndroid Build Coastguard Worker             u4_api_ret = isvcd_set_display_frame(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
7291*495ae853SAndroid Build Coastguard Worker 
7292*495ae853SAndroid Build Coastguard Worker             break;
7293*495ae853SAndroid Build Coastguard Worker 
7294*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_REL_DISPLAY_FRAME:
7295*495ae853SAndroid Build Coastguard Worker             u4_api_ret = isvcd_rel_display_frame(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
7296*495ae853SAndroid Build Coastguard Worker             break;
7297*495ae853SAndroid Build Coastguard Worker 
7298*495ae853SAndroid Build Coastguard Worker         case IVD_CMD_VIDEO_CTL:
7299*495ae853SAndroid Build Coastguard Worker             u4_api_ret = isvcd_ctl(dec_hdl, (void *) pv_api_ip, (void *) pv_api_op);
7300*495ae853SAndroid Build Coastguard Worker             break;
7301*495ae853SAndroid Build Coastguard Worker         default:
7302*495ae853SAndroid Build Coastguard Worker             u4_api_ret = IV_FAIL;
7303*495ae853SAndroid Build Coastguard Worker             break;
7304*495ae853SAndroid Build Coastguard Worker     }
7305*495ae853SAndroid Build Coastguard Worker 
7306*495ae853SAndroid Build Coastguard Worker     return u4_api_ret;
7307*495ae853SAndroid Build Coastguard Worker }
7308