xref: /aosp_15_r20/external/libavc/decoder/mvc/imvcd_api_utils.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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