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_nalu_parser.h */
24*495ae853SAndroid Build Coastguard Worker /* */
25*495ae853SAndroid Build Coastguard Worker /* Description : Functions for MVC NALU parsing */
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 "ih264d_error_handler.h"
34*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
35*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
36*495ae853SAndroid Build Coastguard Worker #include "ih264d_nal.h"
37*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264d_vui.h"
40*495ae853SAndroid Build Coastguard Worker #include "imvcd_defs.h"
41*495ae853SAndroid Build Coastguard Worker #include "imvcd_slice_functions.h"
42*495ae853SAndroid Build Coastguard Worker #include "imvcd_structs.h"
43*495ae853SAndroid Build Coastguard Worker #include "imvcd_utils.h"
44*495ae853SAndroid Build Coastguard Worker
imvcd_nalu_mvc_ext_parser(mvc_dec_ctxt_t * ps_mvcd_ctxt,dec_bit_stream_t * ps_bitstrm)45*495ae853SAndroid Build Coastguard Worker static WORD32 imvcd_nalu_mvc_ext_parser(mvc_dec_ctxt_t *ps_mvcd_ctxt, dec_bit_stream_t *ps_bitstrm)
46*495ae853SAndroid Build Coastguard Worker {
47*495ae853SAndroid Build Coastguard Worker nalu_mvc_ext_t *ps_nalu_mvc_ext =
48*495ae853SAndroid Build Coastguard Worker &ps_mvcd_ctxt->as_nalu_mvc_ext[ps_mvcd_ctxt->u2_num_views_decoded];
49*495ae853SAndroid Build Coastguard Worker
50*495ae853SAndroid Build Coastguard Worker ps_nalu_mvc_ext->u1_non_idr_flag = ih264d_get_bit_h264(ps_bitstrm);
51*495ae853SAndroid Build Coastguard Worker ps_nalu_mvc_ext->u1_priority_id = ih264d_get_bits_h264(ps_bitstrm, 6);
52*495ae853SAndroid Build Coastguard Worker ps_nalu_mvc_ext->u2_view_id = ih264d_get_bits_h264(ps_bitstrm, 10);
53*495ae853SAndroid Build Coastguard Worker
54*495ae853SAndroid Build Coastguard Worker if((ps_nalu_mvc_ext->u2_view_id >= MAX_NUM_VIEWS) ||
55*495ae853SAndroid Build Coastguard Worker (ps_nalu_mvc_ext->u2_view_id >= ps_mvcd_ctxt->u2_num_views))
56*495ae853SAndroid Build Coastguard Worker {
57*495ae853SAndroid Build Coastguard Worker return IVD_INVALID_BITSTREAM;
58*495ae853SAndroid Build Coastguard Worker }
59*495ae853SAndroid Build Coastguard Worker
60*495ae853SAndroid Build Coastguard Worker ps_nalu_mvc_ext->u1_temporal_id = ih264d_get_bits_h264(ps_bitstrm, 3);
61*495ae853SAndroid Build Coastguard Worker ps_nalu_mvc_ext->u1_anchor_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
62*495ae853SAndroid Build Coastguard Worker ps_nalu_mvc_ext->u1_inter_view_flag = ih264d_get_bit_h264(ps_bitstrm);
63*495ae853SAndroid Build Coastguard Worker
64*495ae853SAndroid Build Coastguard Worker if(0 == ih264d_get_bit_h264(ps_bitstrm))
65*495ae853SAndroid Build Coastguard Worker {
66*495ae853SAndroid Build Coastguard Worker return IVD_INVALID_BITSTREAM;
67*495ae853SAndroid Build Coastguard Worker }
68*495ae853SAndroid Build Coastguard Worker
69*495ae853SAndroid Build Coastguard Worker return OK;
70*495ae853SAndroid Build Coastguard Worker }
71*495ae853SAndroid Build Coastguard Worker
imvcd_parse_subset_sps(mvc_dec_ctxt_t * ps_mvcd_ctxt,dec_bit_stream_t * ps_bitstrm)72*495ae853SAndroid Build Coastguard Worker static WORD32 imvcd_parse_subset_sps(mvc_dec_ctxt_t *ps_mvcd_ctxt, dec_bit_stream_t *ps_bitstrm)
73*495ae853SAndroid Build Coastguard Worker {
74*495ae853SAndroid Build Coastguard Worker subset_sps_t *ps_subset_sps = NULL;
75*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps = NULL;
76*495ae853SAndroid Build Coastguard Worker
77*495ae853SAndroid Build Coastguard Worker WORD32 i, j, k;
78*495ae853SAndroid Build Coastguard Worker UWORD8 u1_profile_idc;
79*495ae853SAndroid Build Coastguard Worker UWORD8 au1_constraint_set_flags[6];
80*495ae853SAndroid Build Coastguard Worker UWORD8 u1_level_idc;
81*495ae853SAndroid Build Coastguard Worker UWORD8 u1_seq_parameter_set_id;
82*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
83*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
84*495ae853SAndroid Build Coastguard Worker UWORD32 u4_temp;
85*495ae853SAndroid Build Coastguard Worker UWORD16 u2_num_views_m1;
86*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_refs;
87*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_level_values_signalled_m1;
88*495ae853SAndroid Build Coastguard Worker UWORD8 u2_num_ops_m1;
89*495ae853SAndroid Build Coastguard Worker
90*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
91*495ae853SAndroid Build Coastguard Worker
92*495ae853SAndroid Build Coastguard Worker WORD32 i4_error_code = OK;
93*495ae853SAndroid Build Coastguard Worker
94*495ae853SAndroid Build Coastguard Worker if(0 == ps_mvcd_ctxt->u1_num_sps)
95*495ae853SAndroid Build Coastguard Worker {
96*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
97*495ae853SAndroid Build Coastguard Worker }
98*495ae853SAndroid Build Coastguard Worker
99*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_NUM_SEQ_PARAMS; i++)
100*495ae853SAndroid Build Coastguard Worker {
101*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->ps_sps[i].u1_is_valid)
102*495ae853SAndroid Build Coastguard Worker {
103*495ae853SAndroid Build Coastguard Worker ps_sps = &ps_view_ctxt->ps_sps[i];
104*495ae853SAndroid Build Coastguard Worker
105*495ae853SAndroid Build Coastguard Worker break;
106*495ae853SAndroid Build Coastguard Worker }
107*495ae853SAndroid Build Coastguard Worker }
108*495ae853SAndroid Build Coastguard Worker
109*495ae853SAndroid Build Coastguard Worker if(NULL == ps_sps)
110*495ae853SAndroid Build Coastguard Worker {
111*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
112*495ae853SAndroid Build Coastguard Worker }
113*495ae853SAndroid Build Coastguard Worker
114*495ae853SAndroid Build Coastguard Worker u1_profile_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
115*495ae853SAndroid Build Coastguard Worker
116*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 6; i++)
117*495ae853SAndroid Build Coastguard Worker {
118*495ae853SAndroid Build Coastguard Worker au1_constraint_set_flags[i] = ih264d_get_bit_h264(ps_bitstrm);
119*495ae853SAndroid Build Coastguard Worker }
120*495ae853SAndroid Build Coastguard Worker
121*495ae853SAndroid Build Coastguard Worker if((u1_profile_idc != MULTIVIEW_HIGH_PROFILE_IDC) || (au1_constraint_set_flags[1] == 1))
122*495ae853SAndroid Build Coastguard Worker {
123*495ae853SAndroid Build Coastguard Worker return ERROR_FEATURE_UNAVAIL;
124*495ae853SAndroid Build Coastguard Worker }
125*495ae853SAndroid Build Coastguard Worker
126*495ae853SAndroid Build Coastguard Worker /*****************************************************/
127*495ae853SAndroid Build Coastguard Worker /* Read reserved_zero_2bits (2 bits) */
128*495ae853SAndroid Build Coastguard Worker /*****************************************************/
129*495ae853SAndroid Build Coastguard Worker ih264d_get_bits_h264(ps_bitstrm, 2);
130*495ae853SAndroid Build Coastguard Worker
131*495ae853SAndroid Build Coastguard Worker u1_level_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
132*495ae853SAndroid Build Coastguard Worker
133*495ae853SAndroid Build Coastguard Worker u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
134*495ae853SAndroid Build Coastguard Worker u1_seq_parameter_set_id = u4_temp;
135*495ae853SAndroid Build Coastguard Worker
136*495ae853SAndroid Build Coastguard Worker if(u4_temp & MASK_ERR_SEQ_SET_ID)
137*495ae853SAndroid Build Coastguard Worker {
138*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
139*495ae853SAndroid Build Coastguard Worker }
140*495ae853SAndroid Build Coastguard Worker
141*495ae853SAndroid Build Coastguard Worker if(ps_sps->u1_level_idc != u1_level_idc)
142*495ae853SAndroid Build Coastguard Worker {
143*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_res_changed = 1;
144*495ae853SAndroid Build Coastguard Worker
145*495ae853SAndroid Build Coastguard Worker return IVD_RES_CHANGED;
146*495ae853SAndroid Build Coastguard Worker }
147*495ae853SAndroid Build Coastguard Worker
148*495ae853SAndroid Build Coastguard Worker ps_subset_sps = &ps_mvcd_ctxt->as_subset_sps[u1_seq_parameter_set_id];
149*495ae853SAndroid Build Coastguard Worker
150*495ae853SAndroid Build Coastguard Worker /* Accounting for the idiocy in 'ih264d_parse_pps' */
151*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_profile_idc = HIGH_PROFILE_IDC;
152*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_level_idc = u1_level_idc;
153*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_seq_parameter_set_id = u1_seq_parameter_set_id;
154*495ae853SAndroid Build Coastguard Worker
155*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
156*495ae853SAndroid Build Coastguard Worker
157*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.i4_chroma_format_idc != 1)
158*495ae853SAndroid Build Coastguard Worker {
159*495ae853SAndroid Build Coastguard Worker return ERROR_FEATURE_UNAVAIL;
160*495ae853SAndroid Build Coastguard Worker }
161*495ae853SAndroid Build Coastguard Worker
162*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_bit_depth_luma_minus8 =
163*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
164*495ae853SAndroid Build Coastguard Worker
165*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.i4_bit_depth_luma_minus8 != 0)
166*495ae853SAndroid Build Coastguard Worker {
167*495ae853SAndroid Build Coastguard Worker return ERROR_FEATURE_UNAVAIL;
168*495ae853SAndroid Build Coastguard Worker }
169*495ae853SAndroid Build Coastguard Worker
170*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_bit_depth_chroma_minus8 =
171*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
172*495ae853SAndroid Build Coastguard Worker
173*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.i4_bit_depth_chroma_minus8 != 0)
174*495ae853SAndroid Build Coastguard Worker {
175*495ae853SAndroid Build Coastguard Worker return ERROR_FEATURE_UNAVAIL;
176*495ae853SAndroid Build Coastguard Worker }
177*495ae853SAndroid Build Coastguard Worker
178*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_qpprime_y_zero_transform_bypass_flag =
179*495ae853SAndroid Build Coastguard Worker ih264d_get_bit_h264(ps_bitstrm);
180*495ae853SAndroid Build Coastguard Worker
181*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.i4_qpprime_y_zero_transform_bypass_flag != 0)
182*495ae853SAndroid Build Coastguard Worker {
183*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
184*495ae853SAndroid Build Coastguard Worker }
185*495ae853SAndroid Build Coastguard Worker
186*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_seq_scaling_matrix_present_flag = ih264d_get_bit_h264(ps_bitstrm);
187*495ae853SAndroid Build Coastguard Worker
188*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.i4_seq_scaling_matrix_present_flag)
189*495ae853SAndroid Build Coastguard Worker {
190*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 8; i++)
191*495ae853SAndroid Build Coastguard Worker {
192*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_seq_scaling_list_present_flag[i] =
193*495ae853SAndroid Build Coastguard Worker ih264d_get_bit_h264(ps_bitstrm);
194*495ae853SAndroid Build Coastguard Worker }
195*495ae853SAndroid Build Coastguard Worker }
196*495ae853SAndroid Build Coastguard Worker
197*495ae853SAndroid Build Coastguard Worker u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
198*495ae853SAndroid Build Coastguard Worker
199*495ae853SAndroid Build Coastguard Worker if(u4_temp > (MAX_BITS_IN_FRAME_NUM - 4))
200*495ae853SAndroid Build Coastguard Worker {
201*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
202*495ae853SAndroid Build Coastguard Worker }
203*495ae853SAndroid Build Coastguard Worker
204*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_bits_in_frm_num = 4 + u4_temp;
205*495ae853SAndroid Build Coastguard Worker
206*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u2_u4_max_pic_num_minus1 =
207*495ae853SAndroid Build Coastguard Worker (1 << (ps_subset_sps->s_sps_data.u1_bits_in_frm_num)) - 1;
208*495ae853SAndroid Build Coastguard Worker
209*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_pic_order_cnt_type = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
210*495ae853SAndroid Build Coastguard Worker
211*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type > MAX_PIC_ORDER_CNT_TYPE)
212*495ae853SAndroid Build Coastguard Worker {
213*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC_TYPE_T;
214*495ae853SAndroid Build Coastguard Worker }
215*495ae853SAndroid Build Coastguard Worker
216*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle = 1;
217*495ae853SAndroid Build Coastguard Worker
218*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type == 0)
219*495ae853SAndroid Build Coastguard Worker {
220*495ae853SAndroid Build Coastguard Worker UWORD32 u1_log2_max_pic_order_cnt_lsb_minus4 =
221*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
222*495ae853SAndroid Build Coastguard Worker
223*495ae853SAndroid Build Coastguard Worker if(u1_log2_max_pic_order_cnt_lsb_minus4 > (MAX_BITS_IN_POC_LSB - 4))
224*495ae853SAndroid Build Coastguard Worker {
225*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
226*495ae853SAndroid Build Coastguard Worker }
227*495ae853SAndroid Build Coastguard Worker
228*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus =
229*495ae853SAndroid Build Coastguard Worker 4 + u1_log2_max_pic_order_cnt_lsb_minus4;
230*495ae853SAndroid Build Coastguard Worker
231*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_max_pic_order_cntLsb =
232*495ae853SAndroid Build Coastguard Worker (1 << ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus);
233*495ae853SAndroid Build Coastguard Worker }
234*495ae853SAndroid Build Coastguard Worker else if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type == 1)
235*495ae853SAndroid Build Coastguard Worker {
236*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_delta_pic_order_always_zero_flag =
237*495ae853SAndroid Build Coastguard Worker ih264d_get_bit_h264(ps_bitstrm);
238*495ae853SAndroid Build Coastguard Worker
239*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_ofst_for_non_ref_pic =
240*495ae853SAndroid Build Coastguard Worker ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
241*495ae853SAndroid Build Coastguard Worker
242*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_ofst_for_top_to_bottom_field =
243*495ae853SAndroid Build Coastguard Worker ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
244*495ae853SAndroid Build Coastguard Worker
245*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle =
246*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
247*495ae853SAndroid Build Coastguard Worker
248*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle > MVC_MAX_REF_PICS)
249*495ae853SAndroid Build Coastguard Worker {
250*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
251*495ae853SAndroid Build Coastguard Worker }
252*495ae853SAndroid Build Coastguard Worker
253*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
254*495ae853SAndroid Build Coastguard Worker {
255*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.i4_ofst_for_ref_frame[i] =
256*495ae853SAndroid Build Coastguard Worker ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
257*495ae853SAndroid Build Coastguard Worker }
258*495ae853SAndroid Build Coastguard Worker }
259*495ae853SAndroid Build Coastguard Worker
260*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_num_ref_frames = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
261*495ae853SAndroid Build Coastguard Worker
262*495ae853SAndroid Build Coastguard Worker if((ps_subset_sps->s_sps_data.u1_num_ref_frames > MVC_MAX_REF_PICS))
263*495ae853SAndroid Build Coastguard Worker {
264*495ae853SAndroid Build Coastguard Worker return ERROR_NUM_REF;
265*495ae853SAndroid Build Coastguard Worker }
266*495ae853SAndroid Build Coastguard Worker
267*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_gaps_in_frame_num_value_allowed_flag =
268*495ae853SAndroid Build Coastguard Worker ih264d_get_bit_h264(ps_bitstrm);
269*495ae853SAndroid Build Coastguard Worker
270*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
271*495ae853SAndroid Build Coastguard Worker
272*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs > (H264_MAX_FRAME_WIDTH >> 4))
273*495ae853SAndroid Build Coastguard Worker {
274*495ae853SAndroid Build Coastguard Worker return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
275*495ae853SAndroid Build Coastguard Worker }
276*495ae853SAndroid Build Coastguard Worker
277*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
278*495ae853SAndroid Build Coastguard Worker
279*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs > (H264_MAX_FRAME_HEIGHT >> 4))
280*495ae853SAndroid Build Coastguard Worker {
281*495ae853SAndroid Build Coastguard Worker return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
282*495ae853SAndroid Build Coastguard Worker }
283*495ae853SAndroid Build Coastguard Worker
284*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u2_max_mb_addr =
285*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs * ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs - 1;
286*495ae853SAndroid Build Coastguard Worker
287*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u2_total_num_of_mbs = ps_subset_sps->s_sps_data.u2_max_mb_addr + 1;
288*495ae853SAndroid Build Coastguard Worker
289*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_frame_mbs_only_flag = ih264d_get_bit_h264(ps_bitstrm);
290*495ae853SAndroid Build Coastguard Worker
291*495ae853SAndroid Build Coastguard Worker if(!ps_subset_sps->s_sps_data.u1_frame_mbs_only_flag)
292*495ae853SAndroid Build Coastguard Worker {
293*495ae853SAndroid Build Coastguard Worker return ERROR_FEATURE_UNAVAIL;
294*495ae853SAndroid Build Coastguard Worker }
295*495ae853SAndroid Build Coastguard Worker
296*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_mb_aff_flag = 0;
297*495ae853SAndroid Build Coastguard Worker
298*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
299*495ae853SAndroid Build Coastguard Worker
300*495ae853SAndroid Build Coastguard Worker /* Frame cropping flag */
301*495ae853SAndroid Build Coastguard Worker u4_temp = ih264d_get_bit_h264(ps_bitstrm);
302*495ae853SAndroid Build Coastguard Worker
303*495ae853SAndroid Build Coastguard Worker if(u4_temp)
304*495ae853SAndroid Build Coastguard Worker {
305*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_disp_offsets.u2_left_offset =
306*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
307*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_disp_offsets.u2_right_offset =
308*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
309*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_disp_offsets.u2_top_offset = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
310*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_disp_offsets.u2_bottom_offset =
311*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
312*495ae853SAndroid Build Coastguard Worker }
313*495ae853SAndroid Build Coastguard Worker else
314*495ae853SAndroid Build Coastguard Worker {
315*495ae853SAndroid Build Coastguard Worker memset(&ps_subset_sps->s_disp_offsets, 0, sizeof(ps_subset_sps->s_disp_offsets));
316*495ae853SAndroid Build Coastguard Worker }
317*495ae853SAndroid Build Coastguard Worker
318*495ae853SAndroid Build Coastguard Worker if(ps_sps->u2_frm_wd_in_mbs != ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs)
319*495ae853SAndroid Build Coastguard Worker {
320*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_res_changed = 1;
321*495ae853SAndroid Build Coastguard Worker
322*495ae853SAndroid Build Coastguard Worker return IVD_RES_CHANGED;
323*495ae853SAndroid Build Coastguard Worker }
324*495ae853SAndroid Build Coastguard Worker
325*495ae853SAndroid Build Coastguard Worker if(ps_sps->u2_frm_ht_in_mbs != ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs)
326*495ae853SAndroid Build Coastguard Worker {
327*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_res_changed = 1;
328*495ae853SAndroid Build Coastguard Worker
329*495ae853SAndroid Build Coastguard Worker return IVD_RES_CHANGED;
330*495ae853SAndroid Build Coastguard Worker }
331*495ae853SAndroid Build Coastguard Worker
332*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->u2_disp_width != (ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs * MB_SIZE -
333*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_disp_offsets.u2_left_offset -
334*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_disp_offsets.u2_right_offset))
335*495ae853SAndroid Build Coastguard Worker {
336*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_res_changed = 1;
337*495ae853SAndroid Build Coastguard Worker
338*495ae853SAndroid Build Coastguard Worker return IVD_RES_CHANGED;
339*495ae853SAndroid Build Coastguard Worker }
340*495ae853SAndroid Build Coastguard Worker
341*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->u2_disp_height != (ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs * MB_SIZE -
342*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_disp_offsets.u2_top_offset -
343*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_disp_offsets.u2_bottom_offset))
344*495ae853SAndroid Build Coastguard Worker {
345*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_res_changed = 1;
346*495ae853SAndroid Build Coastguard Worker
347*495ae853SAndroid Build Coastguard Worker return IVD_RES_CHANGED;
348*495ae853SAndroid Build Coastguard Worker }
349*495ae853SAndroid Build Coastguard Worker
350*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
351*495ae853SAndroid Build Coastguard Worker
352*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.u1_vui_parameters_present_flag)
353*495ae853SAndroid Build Coastguard Worker {
354*495ae853SAndroid Build Coastguard Worker i4_error_code = ih264d_parse_vui_parametres(&ps_subset_sps->s_sps_data.s_vui, ps_bitstrm);
355*495ae853SAndroid Build Coastguard Worker
356*495ae853SAndroid Build Coastguard Worker if(i4_error_code != OK)
357*495ae853SAndroid Build Coastguard Worker {
358*495ae853SAndroid Build Coastguard Worker return i4_error_code;
359*495ae853SAndroid Build Coastguard Worker }
360*495ae853SAndroid Build Coastguard Worker
361*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->s_sps_data.s_vui.u1_bitstream_restriction_flag &&
362*495ae853SAndroid Build Coastguard Worker (ps_sps->s_vui.u4_num_reorder_frames !=
363*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.s_vui.u4_num_reorder_frames))
364*495ae853SAndroid Build Coastguard Worker {
365*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_res_changed = 1;
366*495ae853SAndroid Build Coastguard Worker
367*495ae853SAndroid Build Coastguard Worker return IVD_RES_CHANGED;
368*495ae853SAndroid Build Coastguard Worker }
369*495ae853SAndroid Build Coastguard Worker }
370*495ae853SAndroid Build Coastguard Worker
371*495ae853SAndroid Build Coastguard Worker if(ih264d_get_bit_h264(ps_bitstrm) != 1)
372*495ae853SAndroid Build Coastguard Worker {
373*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
374*495ae853SAndroid Build Coastguard Worker }
375*495ae853SAndroid Build Coastguard Worker
376*495ae853SAndroid Build Coastguard Worker u2_num_views_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
377*495ae853SAndroid Build Coastguard Worker
378*495ae853SAndroid Build Coastguard Worker if(u2_num_views_m1 >= MAX_NUM_VIEWS)
379*495ae853SAndroid Build Coastguard Worker {
380*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
381*495ae853SAndroid Build Coastguard Worker }
382*495ae853SAndroid Build Coastguard Worker
383*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.u2_num_views = 1 + u2_num_views_m1;
384*495ae853SAndroid Build Coastguard Worker
385*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->i4_decode_header)
386*495ae853SAndroid Build Coastguard Worker {
387*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->u2_num_views = MAX(ps_mvcd_ctxt->u2_num_views, 1 + u2_num_views_m1);
388*495ae853SAndroid Build Coastguard Worker }
389*495ae853SAndroid Build Coastguard Worker else if(ps_mvcd_ctxt->u2_num_views != (1 + u2_num_views_m1))
390*495ae853SAndroid Build Coastguard Worker {
391*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
392*495ae853SAndroid Build Coastguard Worker }
393*495ae853SAndroid Build Coastguard Worker
394*495ae853SAndroid Build Coastguard Worker for(i = 0; i <= u2_num_views_m1; i++)
395*495ae853SAndroid Build Coastguard Worker {
396*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.au2_view_ids[i] =
397*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
398*495ae853SAndroid Build Coastguard Worker }
399*495ae853SAndroid Build Coastguard Worker
400*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 2; i++)
401*495ae853SAndroid Build Coastguard Worker {
402*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[i][0].u1_num_refs = 0;
403*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[i][0].u1_num_refs = 0;
404*495ae853SAndroid Build Coastguard Worker }
405*495ae853SAndroid Build Coastguard Worker
406*495ae853SAndroid Build Coastguard Worker for(i = 1; i <= u2_num_views_m1; i++)
407*495ae853SAndroid Build Coastguard Worker {
408*495ae853SAndroid Build Coastguard Worker u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
409*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].u1_num_refs = u1_num_refs;
410*495ae853SAndroid Build Coastguard Worker
411*495ae853SAndroid Build Coastguard Worker if(u1_num_refs > MAX_NUM_IVP_REFS)
412*495ae853SAndroid Build Coastguard Worker {
413*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
414*495ae853SAndroid Build Coastguard Worker }
415*495ae853SAndroid Build Coastguard Worker
416*495ae853SAndroid Build Coastguard Worker for(j = 0; j < u1_num_refs; j++)
417*495ae853SAndroid Build Coastguard Worker {
418*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].au2_ref_view_ids[j] =
419*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
420*495ae853SAndroid Build Coastguard Worker }
421*495ae853SAndroid Build Coastguard Worker
422*495ae853SAndroid Build Coastguard Worker u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
423*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].u1_num_refs = u1_num_refs;
424*495ae853SAndroid Build Coastguard Worker
425*495ae853SAndroid Build Coastguard Worker if(u1_num_refs > MAX_NUM_IVP_REFS)
426*495ae853SAndroid Build Coastguard Worker {
427*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
428*495ae853SAndroid Build Coastguard Worker }
429*495ae853SAndroid Build Coastguard Worker
430*495ae853SAndroid Build Coastguard Worker for(j = 0; j < u1_num_refs; j++)
431*495ae853SAndroid Build Coastguard Worker {
432*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].au2_ref_view_ids[j] =
433*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
434*495ae853SAndroid Build Coastguard Worker }
435*495ae853SAndroid Build Coastguard Worker }
436*495ae853SAndroid Build Coastguard Worker
437*495ae853SAndroid Build Coastguard Worker for(i = 1; i <= u2_num_views_m1; i++)
438*495ae853SAndroid Build Coastguard Worker {
439*495ae853SAndroid Build Coastguard Worker u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
440*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].u1_num_refs = u1_num_refs;
441*495ae853SAndroid Build Coastguard Worker
442*495ae853SAndroid Build Coastguard Worker if(u1_num_refs > MAX_NUM_IVP_REFS)
443*495ae853SAndroid Build Coastguard Worker {
444*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
445*495ae853SAndroid Build Coastguard Worker }
446*495ae853SAndroid Build Coastguard Worker
447*495ae853SAndroid Build Coastguard Worker for(j = 0; j < u1_num_refs; j++)
448*495ae853SAndroid Build Coastguard Worker {
449*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].au2_ref_view_ids[j] =
450*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
451*495ae853SAndroid Build Coastguard Worker }
452*495ae853SAndroid Build Coastguard Worker
453*495ae853SAndroid Build Coastguard Worker u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
454*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].u1_num_refs = u1_num_refs;
455*495ae853SAndroid Build Coastguard Worker
456*495ae853SAndroid Build Coastguard Worker if(u1_num_refs > MAX_NUM_IVP_REFS)
457*495ae853SAndroid Build Coastguard Worker {
458*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
459*495ae853SAndroid Build Coastguard Worker }
460*495ae853SAndroid Build Coastguard Worker
461*495ae853SAndroid Build Coastguard Worker for(j = 0; j < u1_num_refs; j++)
462*495ae853SAndroid Build Coastguard Worker {
463*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].au2_ref_view_ids[j] =
464*495ae853SAndroid Build Coastguard Worker ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
465*495ae853SAndroid Build Coastguard Worker }
466*495ae853SAndroid Build Coastguard Worker }
467*495ae853SAndroid Build Coastguard Worker
468*495ae853SAndroid Build Coastguard Worker u1_num_level_values_signalled_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
469*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.u1_num_level_values_signalled =
470*495ae853SAndroid Build Coastguard Worker u1_num_level_values_signalled_m1 + 1;
471*495ae853SAndroid Build Coastguard Worker
472*495ae853SAndroid Build Coastguard Worker if(u1_num_level_values_signalled_m1 >= MAX_NUM_LEVEL_VALUES_SIGNALLED)
473*495ae853SAndroid Build Coastguard Worker {
474*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
475*495ae853SAndroid Build Coastguard Worker }
476*495ae853SAndroid Build Coastguard Worker
477*495ae853SAndroid Build Coastguard Worker for(i = 0; i <= u1_num_level_values_signalled_m1; i++)
478*495ae853SAndroid Build Coastguard Worker {
479*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info[i].u4_level_idc =
480*495ae853SAndroid Build Coastguard Worker ih264d_get_bits_h264(ps_bitstrm, 8);
481*495ae853SAndroid Build Coastguard Worker
482*495ae853SAndroid Build Coastguard Worker u2_num_ops_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
483*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[i].u2_num_ops =
484*495ae853SAndroid Build Coastguard Worker 1 + u2_num_ops_m1;
485*495ae853SAndroid Build Coastguard Worker
486*495ae853SAndroid Build Coastguard Worker if(u2_num_ops_m1 >= MAX_NUM_OPERATING_POINTS)
487*495ae853SAndroid Build Coastguard Worker {
488*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
489*495ae853SAndroid Build Coastguard Worker }
490*495ae853SAndroid Build Coastguard Worker
491*495ae853SAndroid Build Coastguard Worker for(j = 0; j <= u2_num_ops_m1; j++)
492*495ae853SAndroid Build Coastguard Worker {
493*495ae853SAndroid Build Coastguard Worker UWORD16 u2_num_target_views_m1;
494*495ae853SAndroid Build Coastguard Worker
495*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u1_temporal_id =
496*495ae853SAndroid Build Coastguard Worker ih264d_get_bits_h264(ps_bitstrm, 3);
497*495ae853SAndroid Build Coastguard Worker
498*495ae853SAndroid Build Coastguard Worker u2_num_target_views_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
499*495ae853SAndroid Build Coastguard Worker
500*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u2_num_target_views =
501*495ae853SAndroid Build Coastguard Worker 1 + u2_num_target_views_m1;
502*495ae853SAndroid Build Coastguard Worker
503*495ae853SAndroid Build Coastguard Worker if(u2_num_target_views_m1 >= MAX_NUM_VIEWS)
504*495ae853SAndroid Build Coastguard Worker {
505*495ae853SAndroid Build Coastguard Worker return ERROR_INVALID_SEQ_PARAM;
506*495ae853SAndroid Build Coastguard Worker }
507*495ae853SAndroid Build Coastguard Worker
508*495ae853SAndroid Build Coastguard Worker for(k = 0; k <= u2_num_target_views_m1; k++)
509*495ae853SAndroid Build Coastguard Worker {
510*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j]
511*495ae853SAndroid Build Coastguard Worker .au2_target_view_ids[k] = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
512*495ae853SAndroid Build Coastguard Worker }
513*495ae853SAndroid Build Coastguard Worker
514*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u2_num_views =
515*495ae853SAndroid Build Coastguard Worker (UWORD16) 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
516*495ae853SAndroid Build Coastguard Worker }
517*495ae853SAndroid Build Coastguard Worker }
518*495ae853SAndroid Build Coastguard Worker
519*495ae853SAndroid Build Coastguard Worker ps_subset_sps->u1_mvc_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
520*495ae853SAndroid Build Coastguard Worker
521*495ae853SAndroid Build Coastguard Worker if(ps_subset_sps->u1_mvc_vui_parameters_present_flag)
522*495ae853SAndroid Build Coastguard Worker {
523*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
524*495ae853SAndroid Build Coastguard Worker }
525*495ae853SAndroid Build Coastguard Worker
526*495ae853SAndroid Build Coastguard Worker /* In case bitstream read has exceeded the filled size, then
527*495ae853SAndroid Build Coastguard Worker return an error */
528*495ae853SAndroid Build Coastguard Worker if(EXCEED_OFFSET(ps_bitstrm))
529*495ae853SAndroid Build Coastguard Worker {
530*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
531*495ae853SAndroid Build Coastguard Worker }
532*495ae853SAndroid Build Coastguard Worker
533*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data.u1_is_valid = 1;
534*495ae853SAndroid Build Coastguard Worker
535*495ae853SAndroid Build Coastguard Worker /* This ensures PPS has valid data in SPS array for reference */
536*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_sps[ps_subset_sps->s_sps_data.u1_seq_parameter_set_id] =
537*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_data;
538*495ae853SAndroid Build Coastguard Worker
539*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->u1_num_subset_sps++;
540*495ae853SAndroid Build Coastguard Worker
541*495ae853SAndroid Build Coastguard Worker return OK;
542*495ae853SAndroid Build Coastguard Worker }
543*495ae853SAndroid Build Coastguard Worker
544*495ae853SAndroid Build Coastguard Worker /* This function removes emulation byte "0x03" from bitstream(EBSP to RBSP).
545*495ae853SAndroid Build Coastguard Worker It also converts bytestream format into 32 bit little - endian format. */
imvcd_transform_nalu(dec_bit_stream_t * ps_bitstrm,UWORD8 * pu1_nal_unit,UWORD32 u4_numbytes_in_nal_unit)546*495ae853SAndroid Build Coastguard Worker static WORD32 imvcd_transform_nalu(dec_bit_stream_t *ps_bitstrm, UWORD8 *pu1_nal_unit,
547*495ae853SAndroid Build Coastguard Worker UWORD32 u4_numbytes_in_nal_unit)
548*495ae853SAndroid Build Coastguard Worker {
549*495ae853SAndroid Build Coastguard Worker UWORD32 ui4_word;
550*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cur_byte;
551*495ae853SAndroid Build Coastguard Worker
552*495ae853SAndroid Build Coastguard Worker static const UWORD32 u4_num_bytes_in_word = sizeof(ui4_word) / sizeof(u1_cur_byte);
553*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_bytes_in_rbsp = 0;
554*495ae853SAndroid Build Coastguard Worker WORD32 i = 0, j;
555*495ae853SAndroid Build Coastguard Worker WORD8 c_count = 0;
556*495ae853SAndroid Build Coastguard Worker UWORD32 *puc_bitstream_buffer = (UWORD32 *) pu1_nal_unit;
557*495ae853SAndroid Build Coastguard Worker UWORD8 u1_nal_header_size = 1;
558*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_bytes_copied = 0;
559*495ae853SAndroid Build Coastguard Worker
560*495ae853SAndroid Build Coastguard Worker ps_bitstrm->pu4_buffer = puc_bitstream_buffer;
561*495ae853SAndroid Build Coastguard Worker
562*495ae853SAndroid Build Coastguard Worker ui4_word = *pu1_nal_unit++;
563*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied++;
564*495ae853SAndroid Build Coastguard Worker
565*495ae853SAndroid Build Coastguard Worker if((NAL_UNIT_TYPE(ui4_word) == PREFIX_NAL) ||
566*495ae853SAndroid Build Coastguard Worker (NAL_UNIT_TYPE(ui4_word) == CODED_SLICE_EXTENSION))
567*495ae853SAndroid Build Coastguard Worker {
568*495ae853SAndroid Build Coastguard Worker u1_nal_header_size += 3;
569*495ae853SAndroid Build Coastguard Worker }
570*495ae853SAndroid Build Coastguard Worker
571*495ae853SAndroid Build Coastguard Worker for(j = 0; j < 2; j++)
572*495ae853SAndroid Build Coastguard Worker {
573*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
574*495ae853SAndroid Build Coastguard Worker
575*495ae853SAndroid Build Coastguard Worker ui4_word = ((ui4_word << 8) | u1_cur_byte);
576*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied++;
577*495ae853SAndroid Build Coastguard Worker
578*495ae853SAndroid Build Coastguard Worker c_count++;
579*495ae853SAndroid Build Coastguard Worker u4_num_bytes_in_rbsp++;
580*495ae853SAndroid Build Coastguard Worker
581*495ae853SAndroid Build Coastguard Worker if(u1_cur_byte != 0x00)
582*495ae853SAndroid Build Coastguard Worker {
583*495ae853SAndroid Build Coastguard Worker c_count = 0;
584*495ae853SAndroid Build Coastguard Worker }
585*495ae853SAndroid Build Coastguard Worker }
586*495ae853SAndroid Build Coastguard Worker
587*495ae853SAndroid Build Coastguard Worker if(u4_numbytes_in_nal_unit > 2)
588*495ae853SAndroid Build Coastguard Worker {
589*495ae853SAndroid Build Coastguard Worker i = ((u4_numbytes_in_nal_unit - 3));
590*495ae853SAndroid Build Coastguard Worker }
591*495ae853SAndroid Build Coastguard Worker
592*495ae853SAndroid Build Coastguard Worker for(; i > 8; i -= 4)
593*495ae853SAndroid Build Coastguard Worker {
594*495ae853SAndroid Build Coastguard Worker // loop 0
595*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
596*495ae853SAndroid Build Coastguard Worker
597*495ae853SAndroid Build Coastguard Worker if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
598*495ae853SAndroid Build Coastguard Worker u1_cur_byte == EMULATION_PREVENTION_BYTE)
599*495ae853SAndroid Build Coastguard Worker {
600*495ae853SAndroid Build Coastguard Worker c_count = 0;
601*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
602*495ae853SAndroid Build Coastguard Worker i--;
603*495ae853SAndroid Build Coastguard Worker }
604*495ae853SAndroid Build Coastguard Worker
605*495ae853SAndroid Build Coastguard Worker ui4_word = ((ui4_word << 8) | u1_cur_byte);
606*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied++;
607*495ae853SAndroid Build Coastguard Worker if(u4_num_bytes_in_word == u1_num_bytes_copied)
608*495ae853SAndroid Build Coastguard Worker {
609*495ae853SAndroid Build Coastguard Worker *puc_bitstream_buffer = ui4_word;
610*495ae853SAndroid Build Coastguard Worker puc_bitstream_buffer++;
611*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied = 0;
612*495ae853SAndroid Build Coastguard Worker }
613*495ae853SAndroid Build Coastguard Worker
614*495ae853SAndroid Build Coastguard Worker c_count++;
615*495ae853SAndroid Build Coastguard Worker if(u1_cur_byte != 0x00) c_count = 0;
616*495ae853SAndroid Build Coastguard Worker
617*495ae853SAndroid Build Coastguard Worker // loop 1
618*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
619*495ae853SAndroid Build Coastguard Worker
620*495ae853SAndroid Build Coastguard Worker if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
621*495ae853SAndroid Build Coastguard Worker u1_cur_byte == EMULATION_PREVENTION_BYTE)
622*495ae853SAndroid Build Coastguard Worker {
623*495ae853SAndroid Build Coastguard Worker c_count = 0;
624*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
625*495ae853SAndroid Build Coastguard Worker i--;
626*495ae853SAndroid Build Coastguard Worker }
627*495ae853SAndroid Build Coastguard Worker ui4_word = ((ui4_word << 8) | u1_cur_byte);
628*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied++;
629*495ae853SAndroid Build Coastguard Worker if(u4_num_bytes_in_word == u1_num_bytes_copied)
630*495ae853SAndroid Build Coastguard Worker {
631*495ae853SAndroid Build Coastguard Worker *puc_bitstream_buffer = ui4_word;
632*495ae853SAndroid Build Coastguard Worker puc_bitstream_buffer++;
633*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied = 0;
634*495ae853SAndroid Build Coastguard Worker }
635*495ae853SAndroid Build Coastguard Worker
636*495ae853SAndroid Build Coastguard Worker c_count++;
637*495ae853SAndroid Build Coastguard Worker if(u1_cur_byte != 0x00) c_count = 0;
638*495ae853SAndroid Build Coastguard Worker
639*495ae853SAndroid Build Coastguard Worker // loop 2
640*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
641*495ae853SAndroid Build Coastguard Worker
642*495ae853SAndroid Build Coastguard Worker if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
643*495ae853SAndroid Build Coastguard Worker u1_cur_byte == EMULATION_PREVENTION_BYTE)
644*495ae853SAndroid Build Coastguard Worker {
645*495ae853SAndroid Build Coastguard Worker c_count = 0;
646*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
647*495ae853SAndroid Build Coastguard Worker i--;
648*495ae853SAndroid Build Coastguard Worker }
649*495ae853SAndroid Build Coastguard Worker
650*495ae853SAndroid Build Coastguard Worker ui4_word = ((ui4_word << 8) | u1_cur_byte);
651*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied++;
652*495ae853SAndroid Build Coastguard Worker if(u4_num_bytes_in_word == u1_num_bytes_copied)
653*495ae853SAndroid Build Coastguard Worker {
654*495ae853SAndroid Build Coastguard Worker *puc_bitstream_buffer = ui4_word;
655*495ae853SAndroid Build Coastguard Worker puc_bitstream_buffer++;
656*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied = 0;
657*495ae853SAndroid Build Coastguard Worker }
658*495ae853SAndroid Build Coastguard Worker
659*495ae853SAndroid Build Coastguard Worker c_count++;
660*495ae853SAndroid Build Coastguard Worker if(u1_cur_byte != 0x00) c_count = 0;
661*495ae853SAndroid Build Coastguard Worker
662*495ae853SAndroid Build Coastguard Worker // loop 3
663*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
664*495ae853SAndroid Build Coastguard Worker
665*495ae853SAndroid Build Coastguard Worker if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
666*495ae853SAndroid Build Coastguard Worker u1_cur_byte == EMULATION_PREVENTION_BYTE)
667*495ae853SAndroid Build Coastguard Worker {
668*495ae853SAndroid Build Coastguard Worker c_count = 0;
669*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
670*495ae853SAndroid Build Coastguard Worker i--;
671*495ae853SAndroid Build Coastguard Worker }
672*495ae853SAndroid Build Coastguard Worker
673*495ae853SAndroid Build Coastguard Worker ui4_word = ((ui4_word << 8) | u1_cur_byte);
674*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied++;
675*495ae853SAndroid Build Coastguard Worker if(u4_num_bytes_in_word == u1_num_bytes_copied)
676*495ae853SAndroid Build Coastguard Worker {
677*495ae853SAndroid Build Coastguard Worker *puc_bitstream_buffer = ui4_word;
678*495ae853SAndroid Build Coastguard Worker puc_bitstream_buffer++;
679*495ae853SAndroid Build Coastguard Worker u1_num_bytes_copied = 0;
680*495ae853SAndroid Build Coastguard Worker }
681*495ae853SAndroid Build Coastguard Worker
682*495ae853SAndroid Build Coastguard Worker c_count++;
683*495ae853SAndroid Build Coastguard Worker if(u1_cur_byte != 0x00) c_count = 0;
684*495ae853SAndroid Build Coastguard Worker
685*495ae853SAndroid Build Coastguard Worker u4_num_bytes_in_rbsp += 4;
686*495ae853SAndroid Build Coastguard Worker }
687*495ae853SAndroid Build Coastguard Worker
688*495ae853SAndroid Build Coastguard Worker for(; i > 0; i--)
689*495ae853SAndroid Build Coastguard Worker {
690*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
691*495ae853SAndroid Build Coastguard Worker
692*495ae853SAndroid Build Coastguard Worker if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
693*495ae853SAndroid Build Coastguard Worker u1_cur_byte == EMULATION_PREVENTION_BYTE)
694*495ae853SAndroid Build Coastguard Worker {
695*495ae853SAndroid Build Coastguard Worker c_count = 0;
696*495ae853SAndroid Build Coastguard Worker i--;
697*495ae853SAndroid Build Coastguard Worker u1_cur_byte = *pu1_nal_unit++;
698*495ae853SAndroid Build Coastguard Worker }
699*495ae853SAndroid Build Coastguard Worker
700*495ae853SAndroid Build Coastguard Worker ui4_word = ((ui4_word << 8) | u1_cur_byte);
701*495ae853SAndroid Build Coastguard Worker u4_num_bytes_in_rbsp++;
702*495ae853SAndroid Build Coastguard Worker
703*495ae853SAndroid Build Coastguard Worker if((u4_num_bytes_in_rbsp & 0x03) == 0x03)
704*495ae853SAndroid Build Coastguard Worker {
705*495ae853SAndroid Build Coastguard Worker *puc_bitstream_buffer = ui4_word;
706*495ae853SAndroid Build Coastguard Worker puc_bitstream_buffer++;
707*495ae853SAndroid Build Coastguard Worker }
708*495ae853SAndroid Build Coastguard Worker c_count++;
709*495ae853SAndroid Build Coastguard Worker if(u1_cur_byte != 0x00) c_count = 0;
710*495ae853SAndroid Build Coastguard Worker }
711*495ae853SAndroid Build Coastguard Worker
712*495ae853SAndroid Build Coastguard Worker *puc_bitstream_buffer = (ui4_word << ((3 - (((u4_num_bytes_in_rbsp << 30) >> 30))) << 3));
713*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = 0;
714*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_max_ofst = ((u4_num_bytes_in_rbsp + u1_nal_header_size) << 3);
715*495ae853SAndroid Build Coastguard Worker
716*495ae853SAndroid Build Coastguard Worker return (u4_num_bytes_in_rbsp);
717*495ae853SAndroid Build Coastguard Worker }
718*495ae853SAndroid Build Coastguard Worker
imvcd_nalu_parser(mvc_dec_ctxt_t * ps_mvcd_ctxt,UWORD8 * pu1_bitstream_buf,UWORD32 i4_nalu_length)719*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_nalu_parser(mvc_dec_ctxt_t *ps_mvcd_ctxt, UWORD8 *pu1_bitstream_buf,
720*495ae853SAndroid Build Coastguard Worker UWORD32 i4_nalu_length)
721*495ae853SAndroid Build Coastguard Worker {
722*495ae853SAndroid Build Coastguard Worker AVC_EXT_NALU_ID_T e_nalu_id;
723*495ae853SAndroid Build Coastguard Worker
724*495ae853SAndroid Build Coastguard Worker UWORD8 u1_first_byte;
725*495ae853SAndroid Build Coastguard Worker
726*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
727*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
728*495ae853SAndroid Build Coastguard Worker
729*495ae853SAndroid Build Coastguard Worker WORD32 i4_error_code = NOT_OK;
730*495ae853SAndroid Build Coastguard Worker
731*495ae853SAndroid Build Coastguard Worker if((NULL != pu1_bitstream_buf) && (i4_nalu_length > 0))
732*495ae853SAndroid Build Coastguard Worker {
733*495ae853SAndroid Build Coastguard Worker imvcd_transform_nalu(ps_bitstrm, pu1_bitstream_buf, i4_nalu_length);
734*495ae853SAndroid Build Coastguard Worker
735*495ae853SAndroid Build Coastguard Worker u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
736*495ae853SAndroid Build Coastguard Worker
737*495ae853SAndroid Build Coastguard Worker if(NAL_FORBIDDEN_BIT(u1_first_byte))
738*495ae853SAndroid Build Coastguard Worker {
739*495ae853SAndroid Build Coastguard Worker return NOT_OK;
740*495ae853SAndroid Build Coastguard Worker }
741*495ae853SAndroid Build Coastguard Worker
742*495ae853SAndroid Build Coastguard Worker e_nalu_id = NAL_UNIT_TYPE(u1_first_byte);
743*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u1_nal_unit_type = e_nalu_id;
744*495ae853SAndroid Build Coastguard Worker
745*495ae853SAndroid Build Coastguard Worker // if any other nal unit other than slice nal is encountered in between a
746*495ae853SAndroid Build Coastguard Worker // frame break out of loop without consuming header
747*495ae853SAndroid Build Coastguard Worker if((ps_view_ctxt->u4_slice_start_code_found == 1) &&
748*495ae853SAndroid Build Coastguard Worker (ps_view_ctxt->u1_pic_decode_done != 1) && is_slice_nalu_type(e_nalu_id))
749*495ae853SAndroid Build Coastguard Worker {
750*495ae853SAndroid Build Coastguard Worker return ERROR_INCOMPLETE_FRAME;
751*495ae853SAndroid Build Coastguard Worker }
752*495ae853SAndroid Build Coastguard Worker
753*495ae853SAndroid Build Coastguard Worker switch(e_nalu_id)
754*495ae853SAndroid Build Coastguard Worker {
755*495ae853SAndroid Build Coastguard Worker case PREFIX_NAL:
756*495ae853SAndroid Build Coastguard Worker {
757*495ae853SAndroid Build Coastguard Worker if(!ps_view_ctxt->i4_decode_header)
758*495ae853SAndroid Build Coastguard Worker {
759*495ae853SAndroid Build Coastguard Worker if(1 == ih264d_get_bit_h264(ps_bitstrm))
760*495ae853SAndroid Build Coastguard Worker {
761*495ae853SAndroid Build Coastguard Worker return IVD_INVALID_BITSTREAM;
762*495ae853SAndroid Build Coastguard Worker }
763*495ae853SAndroid Build Coastguard Worker
764*495ae853SAndroid Build Coastguard Worker i4_error_code = imvcd_nalu_mvc_ext_parser(ps_mvcd_ctxt, ps_bitstrm);
765*495ae853SAndroid Build Coastguard Worker
766*495ae853SAndroid Build Coastguard Worker if(i4_error_code != OK)
767*495ae853SAndroid Build Coastguard Worker {
768*495ae853SAndroid Build Coastguard Worker return i4_error_code;
769*495ae853SAndroid Build Coastguard Worker }
770*495ae853SAndroid Build Coastguard Worker }
771*495ae853SAndroid Build Coastguard Worker
772*495ae853SAndroid Build Coastguard Worker break;
773*495ae853SAndroid Build Coastguard Worker }
774*495ae853SAndroid Build Coastguard Worker case SUBSET_SPS:
775*495ae853SAndroid Build Coastguard Worker {
776*495ae853SAndroid Build Coastguard Worker ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
777*495ae853SAndroid Build Coastguard Worker
778*495ae853SAndroid Build Coastguard Worker i4_error_code = imvcd_parse_subset_sps(ps_mvcd_ctxt, ps_bitstrm);
779*495ae853SAndroid Build Coastguard Worker
780*495ae853SAndroid Build Coastguard Worker if(OK != i4_error_code)
781*495ae853SAndroid Build Coastguard Worker {
782*495ae853SAndroid Build Coastguard Worker return i4_error_code;
783*495ae853SAndroid Build Coastguard Worker }
784*495ae853SAndroid Build Coastguard Worker
785*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_header_decoded |= 1 << SUBSET_SPS;
786*495ae853SAndroid Build Coastguard Worker
787*495ae853SAndroid Build Coastguard Worker break;
788*495ae853SAndroid Build Coastguard Worker }
789*495ae853SAndroid Build Coastguard Worker case SLICE_NON_IDR:
790*495ae853SAndroid Build Coastguard Worker case SLICE_IDR:
791*495ae853SAndroid Build Coastguard Worker {
792*495ae853SAndroid Build Coastguard Worker if(!ps_view_ctxt->i4_decode_header)
793*495ae853SAndroid Build Coastguard Worker {
794*495ae853SAndroid Build Coastguard Worker if(is_header_decoded(ps_view_ctxt->i4_header_decoded, SPS) &&
795*495ae853SAndroid Build Coastguard Worker is_header_decoded(ps_view_ctxt->i4_header_decoded, PPS))
796*495ae853SAndroid Build Coastguard Worker {
797*495ae853SAndroid Build Coastguard Worker nalu_mvc_ext_t *ps_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
798*495ae853SAndroid Build Coastguard Worker
799*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_slice_start_code_found = 1;
800*495ae853SAndroid Build Coastguard Worker
801*495ae853SAndroid Build Coastguard Worker if((0 == ps_mvcd_ctxt->u2_num_views_decoded) &&
802*495ae853SAndroid Build Coastguard Worker !ps_nalu_mvc_ext->u1_inter_view_flag)
803*495ae853SAndroid Build Coastguard Worker {
804*495ae853SAndroid Build Coastguard Worker ps_nalu_mvc_ext->u1_inter_view_flag = 1;
805*495ae853SAndroid Build Coastguard Worker }
806*495ae853SAndroid Build Coastguard Worker
807*495ae853SAndroid Build Coastguard Worker ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
808*495ae853SAndroid Build Coastguard Worker
809*495ae853SAndroid Build Coastguard Worker i4_error_code = imvcd_parse_decode_slice(ps_mvcd_ctxt);
810*495ae853SAndroid Build Coastguard Worker
811*495ae853SAndroid Build Coastguard Worker if(i4_error_code != OK)
812*495ae853SAndroid Build Coastguard Worker {
813*495ae853SAndroid Build Coastguard Worker return i4_error_code;
814*495ae853SAndroid Build Coastguard Worker }
815*495ae853SAndroid Build Coastguard Worker }
816*495ae853SAndroid Build Coastguard Worker else
817*495ae853SAndroid Build Coastguard Worker {
818*495ae853SAndroid Build Coastguard Worker return IVD_INVALID_BITSTREAM;
819*495ae853SAndroid Build Coastguard Worker }
820*495ae853SAndroid Build Coastguard Worker }
821*495ae853SAndroid Build Coastguard Worker
822*495ae853SAndroid Build Coastguard Worker break;
823*495ae853SAndroid Build Coastguard Worker }
824*495ae853SAndroid Build Coastguard Worker case CODED_SLICE_EXTENSION:
825*495ae853SAndroid Build Coastguard Worker {
826*495ae853SAndroid Build Coastguard Worker if(!ps_view_ctxt->i4_decode_header)
827*495ae853SAndroid Build Coastguard Worker {
828*495ae853SAndroid Build Coastguard Worker if(is_header_decoded(ps_view_ctxt->i4_header_decoded, SPS) &&
829*495ae853SAndroid Build Coastguard Worker is_header_decoded(ps_view_ctxt->i4_header_decoded, PPS) &&
830*495ae853SAndroid Build Coastguard Worker is_header_decoded(ps_view_ctxt->i4_header_decoded, SUBSET_SPS))
831*495ae853SAndroid Build Coastguard Worker {
832*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_slice_start_code_found = 1;
833*495ae853SAndroid Build Coastguard Worker
834*495ae853SAndroid Build Coastguard Worker if(1 == ih264d_get_bit_h264(ps_bitstrm))
835*495ae853SAndroid Build Coastguard Worker {
836*495ae853SAndroid Build Coastguard Worker return IVD_INVALID_BITSTREAM;
837*495ae853SAndroid Build Coastguard Worker }
838*495ae853SAndroid Build Coastguard Worker
839*495ae853SAndroid Build Coastguard Worker i4_error_code = imvcd_nalu_mvc_ext_parser(ps_mvcd_ctxt, ps_bitstrm);
840*495ae853SAndroid Build Coastguard Worker
841*495ae853SAndroid Build Coastguard Worker if(i4_error_code != OK)
842*495ae853SAndroid Build Coastguard Worker {
843*495ae853SAndroid Build Coastguard Worker return i4_error_code;
844*495ae853SAndroid Build Coastguard Worker }
845*495ae853SAndroid Build Coastguard Worker
846*495ae853SAndroid Build Coastguard Worker ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
847*495ae853SAndroid Build Coastguard Worker
848*495ae853SAndroid Build Coastguard Worker i4_error_code = imvcd_parse_decode_slice(ps_mvcd_ctxt);
849*495ae853SAndroid Build Coastguard Worker
850*495ae853SAndroid Build Coastguard Worker if(i4_error_code != OK)
851*495ae853SAndroid Build Coastguard Worker {
852*495ae853SAndroid Build Coastguard Worker return i4_error_code;
853*495ae853SAndroid Build Coastguard Worker }
854*495ae853SAndroid Build Coastguard Worker }
855*495ae853SAndroid Build Coastguard Worker else
856*495ae853SAndroid Build Coastguard Worker {
857*495ae853SAndroid Build Coastguard Worker return IVD_INVALID_BITSTREAM;
858*495ae853SAndroid Build Coastguard Worker }
859*495ae853SAndroid Build Coastguard Worker }
860*495ae853SAndroid Build Coastguard Worker
861*495ae853SAndroid Build Coastguard Worker break;
862*495ae853SAndroid Build Coastguard Worker }
863*495ae853SAndroid Build Coastguard Worker default:
864*495ae853SAndroid Build Coastguard Worker {
865*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_UNKNOWN_NAL;
866*495ae853SAndroid Build Coastguard Worker
867*495ae853SAndroid Build Coastguard Worker break;
868*495ae853SAndroid Build Coastguard Worker }
869*495ae853SAndroid Build Coastguard Worker }
870*495ae853SAndroid Build Coastguard Worker }
871*495ae853SAndroid Build Coastguard Worker
872*495ae853SAndroid Build Coastguard Worker return i4_error_code;
873*495ae853SAndroid Build Coastguard Worker }
874