1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
22*495ae853SAndroid Build Coastguard Worker /* */
23*495ae853SAndroid Build Coastguard Worker /* File Name : imvcd_api_utils.c */
24*495ae853SAndroid Build Coastguard Worker /* */
25*495ae853SAndroid Build Coastguard Worker /* Description : Utility functions used by 'imvcd_api.c' */
26*495ae853SAndroid Build Coastguard Worker /* */
27*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
28*495ae853SAndroid Build Coastguard Worker #include <string.h>
29*495ae853SAndroid Build Coastguard Worker
30*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
31*495ae853SAndroid Build Coastguard Worker #include "iv.h"
32*495ae853SAndroid Build Coastguard Worker #include "imvcd.h"
33*495ae853SAndroid Build Coastguard Worker #include "ih264_disp_mgr.h"
34*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
35*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
36*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
37*495ae853SAndroid Build Coastguard Worker #include "imvcd_structs.h"
38*495ae853SAndroid Build Coastguard Worker #include "imvcd_utils.h"
39*495ae853SAndroid Build Coastguard Worker
imvcd_check_dec_handle(iv_obj_t * ps_handle)40*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T imvcd_check_dec_handle(iv_obj_t *ps_handle)
41*495ae853SAndroid Build Coastguard Worker {
42*495ae853SAndroid Build Coastguard Worker if(ps_handle == NULL)
43*495ae853SAndroid Build Coastguard Worker {
44*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
45*495ae853SAndroid Build Coastguard Worker }
46*495ae853SAndroid Build Coastguard Worker
47*495ae853SAndroid Build Coastguard Worker if(ps_handle->pv_codec_handle == NULL)
48*495ae853SAndroid Build Coastguard Worker {
49*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
50*495ae853SAndroid Build Coastguard Worker }
51*495ae853SAndroid Build Coastguard Worker
52*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
53*495ae853SAndroid Build Coastguard Worker }
54*495ae853SAndroid Build Coastguard Worker
imvcd_check_create_structs(imvcd_create_ip_t * ps_ip,imvcd_create_op_t * ps_op)55*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T imvcd_check_create_structs(imvcd_create_ip_t *ps_ip, imvcd_create_op_t *ps_op)
56*495ae853SAndroid Build Coastguard Worker {
57*495ae853SAndroid Build Coastguard Worker if(NULL == ps_ip)
58*495ae853SAndroid Build Coastguard Worker {
59*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
60*495ae853SAndroid Build Coastguard Worker }
61*495ae853SAndroid Build Coastguard Worker
62*495ae853SAndroid Build Coastguard Worker if(NULL == ps_op)
63*495ae853SAndroid Build Coastguard Worker {
64*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
65*495ae853SAndroid Build Coastguard Worker }
66*495ae853SAndroid Build Coastguard Worker
67*495ae853SAndroid Build Coastguard Worker if(ps_ip->s_ivd_ip.e_output_format != IV_YUV_420P)
68*495ae853SAndroid Build Coastguard Worker {
69*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
70*495ae853SAndroid Build Coastguard Worker }
71*495ae853SAndroid Build Coastguard Worker
72*495ae853SAndroid Build Coastguard Worker if(NULL == ps_ip->s_ivd_ip.pf_aligned_alloc)
73*495ae853SAndroid Build Coastguard Worker {
74*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
75*495ae853SAndroid Build Coastguard Worker }
76*495ae853SAndroid Build Coastguard Worker
77*495ae853SAndroid Build Coastguard Worker if(NULL == ps_ip->s_ivd_ip.pf_aligned_free)
78*495ae853SAndroid Build Coastguard Worker {
79*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
80*495ae853SAndroid Build Coastguard Worker }
81*495ae853SAndroid Build Coastguard Worker
82*495ae853SAndroid Build Coastguard Worker if(0 != ps_ip->s_ivd_ip.u4_share_disp_buf)
83*495ae853SAndroid Build Coastguard Worker {
84*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
85*495ae853SAndroid Build Coastguard Worker }
86*495ae853SAndroid Build Coastguard Worker
87*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
88*495ae853SAndroid Build Coastguard Worker }
89*495ae853SAndroid Build Coastguard Worker
imvcd_check_ctl_structs(void * pv_ip,void * pv_op)90*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T imvcd_check_ctl_structs(void *pv_ip, void *pv_op)
91*495ae853SAndroid Build Coastguard Worker {
92*495ae853SAndroid Build Coastguard Worker ivd_ctl_set_config_ip_t *ps_ip = (ivd_ctl_set_config_ip_t *) pv_ip;
93*495ae853SAndroid Build Coastguard Worker ivd_ctl_set_config_op_t *ps_op = (ivd_ctl_set_config_op_t *) pv_op;
94*495ae853SAndroid Build Coastguard Worker
95*495ae853SAndroid Build Coastguard Worker WORD32 i4_sub_cmd = ps_ip->e_sub_cmd;
96*495ae853SAndroid Build Coastguard Worker
97*495ae853SAndroid Build Coastguard Worker if(NULL == ps_ip)
98*495ae853SAndroid Build Coastguard Worker {
99*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
100*495ae853SAndroid Build Coastguard Worker }
101*495ae853SAndroid Build Coastguard Worker
102*495ae853SAndroid Build Coastguard Worker if(NULL == ps_op)
103*495ae853SAndroid Build Coastguard Worker {
104*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
105*495ae853SAndroid Build Coastguard Worker }
106*495ae853SAndroid Build Coastguard Worker
107*495ae853SAndroid Build Coastguard Worker switch(i4_sub_cmd)
108*495ae853SAndroid Build Coastguard Worker {
109*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_SETPARAMS:
110*495ae853SAndroid Build Coastguard Worker {
111*495ae853SAndroid Build Coastguard Worker if((ps_ip->u4_size != sizeof(ivd_ctl_set_config_ip_t)) ||
112*495ae853SAndroid Build Coastguard Worker (ps_op->u4_size != sizeof(ivd_ctl_set_config_op_t)))
113*495ae853SAndroid Build Coastguard Worker {
114*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
115*495ae853SAndroid Build Coastguard Worker }
116*495ae853SAndroid Build Coastguard Worker else
117*495ae853SAndroid Build Coastguard Worker {
118*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
119*495ae853SAndroid Build Coastguard Worker }
120*495ae853SAndroid Build Coastguard Worker }
121*495ae853SAndroid Build Coastguard Worker case IMVCD_CTL_SET_NUM_CORES:
122*495ae853SAndroid Build Coastguard Worker {
123*495ae853SAndroid Build Coastguard Worker if((ps_ip->u4_size != sizeof(imvcd_set_num_cores_ip_t)) ||
124*495ae853SAndroid Build Coastguard Worker (ps_op->u4_size != sizeof(imvcd_set_num_cores_op_t)))
125*495ae853SAndroid Build Coastguard Worker {
126*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
127*495ae853SAndroid Build Coastguard Worker }
128*495ae853SAndroid Build Coastguard Worker else
129*495ae853SAndroid Build Coastguard Worker {
130*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
131*495ae853SAndroid Build Coastguard Worker }
132*495ae853SAndroid Build Coastguard Worker }
133*495ae853SAndroid Build Coastguard Worker case IMVCD_CTL_SET_PROCESSOR:
134*495ae853SAndroid Build Coastguard Worker {
135*495ae853SAndroid Build Coastguard Worker if((ps_ip->u4_size != sizeof(imvcd_set_arch_ip_t)) ||
136*495ae853SAndroid Build Coastguard Worker (ps_op->u4_size != sizeof(imvcd_set_arch_op_t)))
137*495ae853SAndroid Build Coastguard Worker {
138*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
139*495ae853SAndroid Build Coastguard Worker }
140*495ae853SAndroid Build Coastguard Worker else
141*495ae853SAndroid Build Coastguard Worker {
142*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
143*495ae853SAndroid Build Coastguard Worker }
144*495ae853SAndroid Build Coastguard Worker }
145*495ae853SAndroid Build Coastguard Worker case IMVCD_CTL_DEGRADE:
146*495ae853SAndroid Build Coastguard Worker {
147*495ae853SAndroid Build Coastguard Worker if((ps_ip->u4_size != sizeof(imvcd_set_degrade_mode_ip_t)) ||
148*495ae853SAndroid Build Coastguard Worker (ps_op->u4_size != sizeof(imvcd_set_degrade_mode_op_t)))
149*495ae853SAndroid Build Coastguard Worker {
150*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
151*495ae853SAndroid Build Coastguard Worker }
152*495ae853SAndroid Build Coastguard Worker else
153*495ae853SAndroid Build Coastguard Worker {
154*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
155*495ae853SAndroid Build Coastguard Worker }
156*495ae853SAndroid Build Coastguard Worker }
157*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_FLUSH:
158*495ae853SAndroid Build Coastguard Worker {
159*495ae853SAndroid Build Coastguard Worker if((ps_ip->u4_size != sizeof(ivd_ctl_flush_ip_t)) ||
160*495ae853SAndroid Build Coastguard Worker (ps_op->u4_size != sizeof(ivd_ctl_flush_op_t)))
161*495ae853SAndroid Build Coastguard Worker {
162*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
163*495ae853SAndroid Build Coastguard Worker }
164*495ae853SAndroid Build Coastguard Worker else
165*495ae853SAndroid Build Coastguard Worker {
166*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
167*495ae853SAndroid Build Coastguard Worker }
168*495ae853SAndroid Build Coastguard Worker }
169*495ae853SAndroid Build Coastguard Worker case IVD_CMD_CTL_GETBUFINFO:
170*495ae853SAndroid Build Coastguard Worker {
171*495ae853SAndroid Build Coastguard Worker if((ps_ip->u4_size != sizeof(ivd_ctl_getbufinfo_ip_t)) ||
172*495ae853SAndroid Build Coastguard Worker (ps_op->u4_size != sizeof(ivd_ctl_getbufinfo_op_t)))
173*495ae853SAndroid Build Coastguard Worker {
174*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
175*495ae853SAndroid Build Coastguard Worker }
176*495ae853SAndroid Build Coastguard Worker else
177*495ae853SAndroid Build Coastguard Worker {
178*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
179*495ae853SAndroid Build Coastguard Worker }
180*495ae853SAndroid Build Coastguard Worker }
181*495ae853SAndroid Build Coastguard Worker case IMVCD_CTL_GET_VUI_PARAMS:
182*495ae853SAndroid Build Coastguard Worker {
183*495ae853SAndroid Build Coastguard Worker if((ps_ip->u4_size != sizeof(imvcd_get_vui_ip_t)) ||
184*495ae853SAndroid Build Coastguard Worker (ps_op->u4_size != sizeof(imvcd_get_vui_op_t)))
185*495ae853SAndroid Build Coastguard Worker {
186*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
187*495ae853SAndroid Build Coastguard Worker }
188*495ae853SAndroid Build Coastguard Worker else
189*495ae853SAndroid Build Coastguard Worker {
190*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
191*495ae853SAndroid Build Coastguard Worker }
192*495ae853SAndroid Build Coastguard Worker }
193*495ae853SAndroid Build Coastguard Worker default:
194*495ae853SAndroid Build Coastguard Worker {
195*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
196*495ae853SAndroid Build Coastguard Worker }
197*495ae853SAndroid Build Coastguard Worker }
198*495ae853SAndroid Build Coastguard Worker }
199*495ae853SAndroid Build Coastguard Worker
imvcd_check_decode_structs(iv_obj_t * ps_dec_hdl,imvcd_video_decode_ip_t * ps_ip,imvcd_video_decode_op_t * ps_op)200*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T imvcd_check_decode_structs(iv_obj_t *ps_dec_hdl,
201*495ae853SAndroid Build Coastguard Worker imvcd_video_decode_ip_t *ps_ip,
202*495ae853SAndroid Build Coastguard Worker imvcd_video_decode_op_t *ps_op)
203*495ae853SAndroid Build Coastguard Worker {
204*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
205*495ae853SAndroid Build Coastguard Worker
206*495ae853SAndroid Build Coastguard Worker mvc_dec_ctxt_t *ps_mvcd_ctxt = (mvc_dec_ctxt_t *) ps_dec_hdl->pv_codec_handle;
207*495ae853SAndroid Build Coastguard Worker
208*495ae853SAndroid Build Coastguard Worker UWORD16 u2_num_views = 1;
209*495ae853SAndroid Build Coastguard Worker
210*495ae853SAndroid Build Coastguard Worker if(NULL == ps_ip)
211*495ae853SAndroid Build Coastguard Worker {
212*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
213*495ae853SAndroid Build Coastguard Worker }
214*495ae853SAndroid Build Coastguard Worker
215*495ae853SAndroid Build Coastguard Worker if(NULL == ps_op)
216*495ae853SAndroid Build Coastguard Worker {
217*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
218*495ae853SAndroid Build Coastguard Worker }
219*495ae853SAndroid Build Coastguard Worker
220*495ae853SAndroid Build Coastguard Worker if(!ps_mvcd_ctxt->b_flush_enabled && !ps_mvcd_ctxt->b_header_only_decode)
221*495ae853SAndroid Build Coastguard Worker {
222*495ae853SAndroid Build Coastguard Worker if(NULL == ps_ip->s_ivd_ip.pv_stream_buffer)
223*495ae853SAndroid Build Coastguard Worker {
224*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
225*495ae853SAndroid Build Coastguard Worker }
226*495ae853SAndroid Build Coastguard Worker
227*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u2_num_views; i++)
228*495ae853SAndroid Build Coastguard Worker {
229*495ae853SAndroid Build Coastguard Worker for(j = 0; j < NUM_COMPONENTS; j++)
230*495ae853SAndroid Build Coastguard Worker {
231*495ae853SAndroid Build Coastguard Worker if(NULL == ps_ip->s_ivd_ip.s_out_buffer.pu1_bufs[i * NUM_COMPONENTS + j])
232*495ae853SAndroid Build Coastguard Worker {
233*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
234*495ae853SAndroid Build Coastguard Worker }
235*495ae853SAndroid Build Coastguard Worker }
236*495ae853SAndroid Build Coastguard Worker }
237*495ae853SAndroid Build Coastguard Worker
238*495ae853SAndroid Build Coastguard Worker if(0 == ps_ip->s_ivd_ip.u4_num_Bytes)
239*495ae853SAndroid Build Coastguard Worker {
240*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
241*495ae853SAndroid Build Coastguard Worker }
242*495ae853SAndroid Build Coastguard Worker }
243*495ae853SAndroid Build Coastguard Worker
244*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
245*495ae853SAndroid Build Coastguard Worker }
246*495ae853SAndroid Build Coastguard Worker
imvcd_convert_app_out_buf(mvc_dec_ctxt_t * ps_mvcd_ctxt,ivd_out_bufdesc_t * ps_app_buffer)247*495ae853SAndroid Build Coastguard Worker static void imvcd_convert_app_out_buf(mvc_dec_ctxt_t *ps_mvcd_ctxt,
248*495ae853SAndroid Build Coastguard Worker ivd_out_bufdesc_t *ps_app_buffer)
249*495ae853SAndroid Build Coastguard Worker {
250*495ae853SAndroid Build Coastguard Worker if(!ps_mvcd_ctxt->b_header_only_decode)
251*495ae853SAndroid Build Coastguard Worker {
252*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
253*495ae853SAndroid Build Coastguard Worker
254*495ae853SAndroid Build Coastguard Worker subset_sps_t *ps_subset_sps = imvcd_get_valid_subset_sps(ps_mvcd_ctxt);
255*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
256*495ae853SAndroid Build Coastguard Worker
257*495ae853SAndroid Build Coastguard Worker UWORD16 u2_num_views =
258*495ae853SAndroid Build Coastguard Worker (NULL == ps_subset_sps) ? 1 : ps_subset_sps->s_sps_mvc_ext.u2_num_views;
259*495ae853SAndroid Build Coastguard Worker
260*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u2_num_views; i++)
261*495ae853SAndroid Build Coastguard Worker {
262*495ae853SAndroid Build Coastguard Worker yuv_buf_props_t *ps_view_buf = &ps_mvcd_ctxt->s_out_buffer.as_view_buf_props[i];
263*495ae853SAndroid Build Coastguard Worker
264*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_bit_depth = 8;
265*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_height = ps_view_ctxt->u2_disp_height;
266*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_width = ps_view_ctxt->u2_disp_width;
267*495ae853SAndroid Build Coastguard Worker
268*495ae853SAndroid Build Coastguard Worker for(j = 0; j < NUM_COMPONENTS; j++)
269*495ae853SAndroid Build Coastguard Worker {
270*495ae853SAndroid Build Coastguard Worker buffer_container_t *ps_component_buf = &ps_view_buf->as_component_bufs[j];
271*495ae853SAndroid Build Coastguard Worker bool b_is_chroma = (((COMPONENT_TYPES_T) j) != Y);
272*495ae853SAndroid Build Coastguard Worker
273*495ae853SAndroid Build Coastguard Worker ps_component_buf->pv_data = ps_app_buffer->pu1_bufs[i * NUM_COMPONENTS + j];
274*495ae853SAndroid Build Coastguard Worker ps_component_buf->i4_data_stride = ps_view_buf->u2_width >> b_is_chroma;
275*495ae853SAndroid Build Coastguard Worker }
276*495ae853SAndroid Build Coastguard Worker }
277*495ae853SAndroid Build Coastguard Worker }
278*495ae853SAndroid Build Coastguard Worker }
279*495ae853SAndroid Build Coastguard Worker
imvcd_convert_to_app_disp_buf(mvc_dec_ctxt_t * ps_mvcd_ctxt,iv_yuv_buf_t * ps_view_disp_bufs)280*495ae853SAndroid Build Coastguard Worker void imvcd_convert_to_app_disp_buf(mvc_dec_ctxt_t *ps_mvcd_ctxt, iv_yuv_buf_t *ps_view_disp_bufs)
281*495ae853SAndroid Build Coastguard Worker {
282*495ae853SAndroid Build Coastguard Worker WORD32 i;
283*495ae853SAndroid Build Coastguard Worker
284*495ae853SAndroid Build Coastguard Worker UWORD16 u2_num_views = ps_mvcd_ctxt->u2_num_views;
285*495ae853SAndroid Build Coastguard Worker
286*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u2_num_views; i++)
287*495ae853SAndroid Build Coastguard Worker {
288*495ae853SAndroid Build Coastguard Worker yuv_buf_props_t *ps_view_buf = &ps_mvcd_ctxt->s_out_buffer.as_view_buf_props[i];
289*495ae853SAndroid Build Coastguard Worker
290*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_size = sizeof(ps_view_disp_bufs[i]);
291*495ae853SAndroid Build Coastguard Worker
292*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].pv_y_buf = ps_view_buf->as_component_bufs[Y].pv_data;
293*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_y_strd = ps_view_buf->as_component_bufs[Y].i4_data_stride;
294*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_y_wd = ps_view_buf->u2_width;
295*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_y_ht = ps_view_buf->u2_height;
296*495ae853SAndroid Build Coastguard Worker
297*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].pv_u_buf = ps_view_buf->as_component_bufs[U].pv_data;
298*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_u_strd = ps_view_buf->as_component_bufs[U].i4_data_stride;
299*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_u_wd = ps_view_buf->u2_width / 2;
300*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_u_ht = ps_view_buf->u2_height / 2;
301*495ae853SAndroid Build Coastguard Worker
302*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].pv_v_buf = ps_view_buf->as_component_bufs[V].pv_data;
303*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_v_strd = ps_view_buf->as_component_bufs[V].i4_data_stride;
304*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_v_wd = ps_view_buf->u2_width / 2;
305*495ae853SAndroid Build Coastguard Worker ps_view_disp_bufs[i].u4_v_ht = ps_view_buf->u2_height / 2;
306*495ae853SAndroid Build Coastguard Worker }
307*495ae853SAndroid Build Coastguard Worker }
308*495ae853SAndroid Build Coastguard Worker
imvcd_au_init(iv_obj_t * ps_dec_hdl,imvcd_video_decode_ip_t * ps_ip,imvcd_video_decode_op_t * ps_op)309*495ae853SAndroid Build Coastguard Worker void imvcd_au_init(iv_obj_t *ps_dec_hdl, imvcd_video_decode_ip_t *ps_ip,
310*495ae853SAndroid Build Coastguard Worker imvcd_video_decode_op_t *ps_op)
311*495ae853SAndroid Build Coastguard Worker {
312*495ae853SAndroid Build Coastguard Worker subset_sps_t *ps_subset_sps;
313*495ae853SAndroid Build Coastguard Worker
314*495ae853SAndroid Build Coastguard Worker mvc_dec_ctxt_t *ps_mvcd_ctxt = (mvc_dec_ctxt_t *) ps_dec_hdl->pv_codec_handle;
315*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
316*495ae853SAndroid Build Coastguard Worker
317*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->u2_num_views_decoded = 0;
318*495ae853SAndroid Build Coastguard Worker ps_subset_sps = imvcd_get_valid_subset_sps(ps_mvcd_ctxt);
319*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->u2_num_views =
320*495ae853SAndroid Build Coastguard Worker (NULL == ps_subset_sps) ? 1 : ps_subset_sps->s_sps_mvc_ext.u2_num_views;
321*495ae853SAndroid Build Coastguard Worker imvcd_convert_app_out_buf(ps_mvcd_ctxt, &ps_ip->s_ivd_ip.s_out_buffer);
322*495ae853SAndroid Build Coastguard Worker
323*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.u4_num_bytes_consumed = 0;
324*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.u4_output_present = 0;
325*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.u4_error_code = 0;
326*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.e_pic_type = IV_FRAMETYPE_DEFAULT;
327*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.u4_frame_decoded_flag = 0;
328*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.u4_new_seq = 0;
329*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.u4_progressive_frame_flag = 1;
330*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.u4_is_ref_flag = 1;
331*495ae853SAndroid Build Coastguard Worker ps_op->s_ivd_op.e4_fld_type = IV_NA_FLD;
332*495ae853SAndroid Build Coastguard Worker
333*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_fmt_conv_cur_row = 0;
334*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_output_present = 0;
335*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_fmt_conv_num_rows = FMT_CONV_NUM_ROWS;
336*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_ts = ps_ip->s_ivd_ip.u4_ts;
337*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_frametype = IV_NA_FRAME;
338*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_content_type = IV_CONTENTTYPE_NA;
339*495ae853SAndroid Build Coastguard Worker
340*495ae853SAndroid Build Coastguard Worker /* Mimicking the hack in lines '2005' in 'ih264d_api.c' and '1323' in
341*495ae853SAndroid Build Coastguard Worker * 'ih264d_parse_headers.c */
342*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_sps_cnt_in_process = 0;
343*495ae853SAndroid Build Coastguard Worker
344*495ae853SAndroid Build Coastguard Worker memset(ps_mvcd_ctxt->as_nalu_mvc_ext, 0, sizeof(ps_mvcd_ctxt->as_nalu_mvc_ext));
345*495ae853SAndroid Build Coastguard Worker }
346*495ae853SAndroid Build Coastguard Worker
imvcd_view_init(mvc_dec_ctxt_t * ps_mvcd_ctxt)347*495ae853SAndroid Build Coastguard Worker void imvcd_view_init(mvc_dec_ctxt_t *ps_mvcd_ctxt)
348*495ae853SAndroid Build Coastguard Worker {
349*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
350*495ae853SAndroid Build Coastguard Worker
351*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_num_fld_in_frm = 0;
352*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_slice_start_code_found = 0;
353*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u2_cur_mb_addr = 0;
354*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u2_total_mbs_coded = 0;
355*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u2_cur_slice_num = 0;
356*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->cur_dec_mb_num = 0;
357*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->cur_recon_mb_num = 0;
358*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_first_slice_in_pic = 1;
359*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_slice_header_done = 0;
360*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_dangling_field = 0;
361*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_dec_thread_created = 0;
362*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_bs_deblk_thread_created = 0;
363*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_cur_bs_mb_num = 0;
364*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_start_recon_deblk = 0;
365*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_pic_buf_got = 0;
366*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan;
367*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_pic_decode_done = 0;
368*495ae853SAndroid Build Coastguard Worker
369*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_init_dpb_base = NULL;
370*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_dpb_mgr = NULL;
371*495ae853SAndroid Build Coastguard Worker }
372*495ae853SAndroid Build Coastguard Worker
imvcd_bitstream_buf_alloc(dec_struct_t * ps_view_ctxt,UWORD16 u2_num_views)373*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T imvcd_bitstream_buf_alloc(dec_struct_t *ps_view_ctxt, UWORD16 u2_num_views)
374*495ae853SAndroid Build Coastguard Worker {
375*495ae853SAndroid Build Coastguard Worker UWORD32 u4_size;
376*495ae853SAndroid Build Coastguard Worker
377*495ae853SAndroid Build Coastguard Worker u4_size = MAX(MIN_BITSTREAMS_BUF_SIZE,
378*495ae853SAndroid Build Coastguard Worker ((ps_view_ctxt->u2_pic_wd * ps_view_ctxt->u2_pic_ht * 3 / 2) + EXTRA_BS_OFFSET) *
379*495ae853SAndroid Build Coastguard Worker u2_num_views * sizeof(ps_view_ctxt->pu1_bits_buf_dynamic[0]));
380*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_bits_buf_dynamic =
381*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pf_aligned_alloc(ps_view_ctxt->pv_mem_ctxt, 128, u4_size);
382*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == ps_view_ctxt->pu1_bits_buf_dynamic), IV_FAIL);
383*495ae853SAndroid Build Coastguard Worker
384*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->pu1_bits_buf_dynamic, 0, u4_size);
385*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_dynamic_bits_buf_size = u4_size;
386*495ae853SAndroid Build Coastguard Worker
387*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
388*495ae853SAndroid Build Coastguard Worker }
389*495ae853SAndroid Build Coastguard Worker
imvcd_bitsteam_buf_free(dec_struct_t * ps_view_ctxt)390*495ae853SAndroid Build Coastguard Worker void imvcd_bitsteam_buf_free(dec_struct_t *ps_view_ctxt)
391*495ae853SAndroid Build Coastguard Worker {
392*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pu1_bits_buf_dynamic);
393*495ae853SAndroid Build Coastguard Worker }
394*495ae853SAndroid Build Coastguard Worker
imvcd_bitstream_buf_realloc(dec_struct_t * ps_view_ctxt,UWORD32 u4_size)395*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T imvcd_bitstream_buf_realloc(dec_struct_t *ps_view_ctxt, UWORD32 u4_size)
396*495ae853SAndroid Build Coastguard Worker {
397*495ae853SAndroid Build Coastguard Worker imvcd_bitsteam_buf_free(ps_view_ctxt);
398*495ae853SAndroid Build Coastguard Worker
399*495ae853SAndroid Build Coastguard Worker u4_size = MAX(MIN_BITSTREAMS_BUF_SIZE, u4_size);
400*495ae853SAndroid Build Coastguard Worker
401*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_bits_buf_dynamic =
402*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pf_aligned_alloc(ps_view_ctxt->pv_mem_ctxt, 128, u4_size);
403*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == ps_view_ctxt->pu1_bits_buf_dynamic), IV_FAIL);
404*495ae853SAndroid Build Coastguard Worker
405*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->pu1_bits_buf_dynamic, 0, u4_size);
406*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_dynamic_bits_buf_size = u4_size;
407*495ae853SAndroid Build Coastguard Worker
408*495ae853SAndroid Build Coastguard Worker return IV_SUCCESS;
409*495ae853SAndroid Build Coastguard Worker }
410