Coverage Report

Created: 2025-11-24 06:53

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.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
}