Coverage Report

Created: 2026-03-07 07:01

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