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