Coverage Report

Created: 2026-02-26 07:09

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.28k
{
47
2.28k
    nalu_mvc_ext_t *ps_nalu_mvc_ext =
48
2.28k
        &ps_mvcd_ctxt->as_nalu_mvc_ext[ps_mvcd_ctxt->u2_num_views_decoded];
49
50
2.28k
    ps_nalu_mvc_ext->u1_non_idr_flag = ih264d_get_bit_h264(ps_bitstrm);
51
2.28k
    ps_nalu_mvc_ext->u1_priority_id = ih264d_get_bits_h264(ps_bitstrm, 6);
52
2.28k
    ps_nalu_mvc_ext->u2_view_id = ih264d_get_bits_h264(ps_bitstrm, 10);
53
54
2.28k
    if((ps_nalu_mvc_ext->u2_view_id >= MAX_NUM_VIEWS) ||
55
2.27k
       (ps_nalu_mvc_ext->u2_view_id >= ps_mvcd_ctxt->u2_num_views))
56
2
    {
57
2
        return IVD_INVALID_BITSTREAM;
58
2
    }
59
60
2.27k
    ps_nalu_mvc_ext->u1_temporal_id = ih264d_get_bits_h264(ps_bitstrm, 3);
61
2.27k
    ps_nalu_mvc_ext->u1_anchor_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
62
2.27k
    ps_nalu_mvc_ext->u1_inter_view_flag = ih264d_get_bit_h264(ps_bitstrm);
63
64
2.27k
    if(0 == ih264d_get_bit_h264(ps_bitstrm))
65
3
    {
66
3
        return IVD_INVALID_BITSTREAM;
67
3
    }
68
69
2.27k
    return OK;
70
2.27k
}
71
72
static WORD32 imvcd_parse_subset_sps(mvc_dec_ctxt_t *ps_mvcd_ctxt, dec_bit_stream_t *ps_bitstrm)
73
4.49k
{
74
4.49k
    subset_sps_t *ps_subset_sps = NULL;
75
4.49k
    dec_seq_params_t *ps_sps = NULL;
76
77
4.49k
    WORD32 i, j, k;
78
4.49k
    UWORD8 u1_profile_idc;
79
4.49k
    UWORD8 au1_constraint_set_flags[6];
80
4.49k
    UWORD8 u1_level_idc;
81
4.49k
    UWORD8 u1_seq_parameter_set_id;
82
4.49k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
83
4.49k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
84
4.49k
    UWORD32 u4_temp;
85
4.49k
    UWORD16 u2_num_views_m1;
86
4.49k
    UWORD8 u1_num_refs;
87
4.49k
    UWORD8 u1_num_level_values_signalled_m1;
88
4.49k
    UWORD8 u2_num_ops_m1;
89
90
4.49k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
91
92
4.49k
    WORD32 i4_error_code = OK;
93
94
4.49k
    if(0 == ps_mvcd_ctxt->u1_num_sps)
95
7
    {
96
7
        return ERROR_INV_SPS_PPS_T;
97
7
    }
98
99
4.89k
    for(i = 0; i < MAX_NUM_SEQ_PARAMS; i++)
100
4.89k
    {
101
4.89k
        if(ps_view_ctxt->ps_sps[i].u1_is_valid)
102
4.48k
        {
103
4.48k
            ps_sps = &ps_view_ctxt->ps_sps[i];
104
105
4.48k
            break;
106
4.48k
        }
107
4.89k
    }
108
109
4.48k
    if(NULL == ps_sps)
110
0
    {
111
0
        return ERROR_INV_SPS_PPS_T;
112
0
    }
113
114
4.48k
    u1_profile_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
115
116
31.3k
    for(i = 0; i < 6; i++)
117
26.9k
    {
118
26.9k
        au1_constraint_set_flags[i] = ih264d_get_bit_h264(ps_bitstrm);
119
26.9k
    }
120
121
4.48k
    if((u1_profile_idc != MULTIVIEW_HIGH_PROFILE_IDC) || (au1_constraint_set_flags[1] == 1))
122
2
    {
123
2
        return ERROR_FEATURE_UNAVAIL;
124
2
    }
125
126
    /*****************************************************/
127
    /* Read reserved_zero_2bits (2 bits)                 */
128
    /*****************************************************/
129
4.48k
    ih264d_get_bits_h264(ps_bitstrm, 2);
130
131
4.48k
    u1_level_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
132
133
4.48k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
134
4.48k
    u1_seq_parameter_set_id = u4_temp;
135
136
4.48k
    if(u4_temp & MASK_ERR_SEQ_SET_ID)
137
3
    {
138
3
        return ERROR_INV_SPS_PPS_T;
139
3
    }
140
141
4.47k
    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.47k
    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.47k
    ps_subset_sps->s_sps_data.u1_profile_idc = HIGH_PROFILE_IDC;
152
4.47k
    ps_subset_sps->s_sps_data.u1_level_idc = u1_level_idc;
153
4.47k
    ps_subset_sps->s_sps_data.u1_seq_parameter_set_id = u1_seq_parameter_set_id;
154
155
4.47k
    ps_subset_sps->s_sps_data.i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
156
157
4.47k
    if(ps_subset_sps->s_sps_data.i4_chroma_format_idc != 1)
158
4
    {
159
4
        return ERROR_FEATURE_UNAVAIL;
160
4
    }
161
162
4.47k
    ps_subset_sps->s_sps_data.i4_bit_depth_luma_minus8 =
163
4.47k
        ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
164
165
4.47k
    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.47k
    ps_subset_sps->s_sps_data.i4_bit_depth_chroma_minus8 =
171
4.47k
        ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
172
173
4.47k
    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.47k
    ps_subset_sps->s_sps_data.i4_qpprime_y_zero_transform_bypass_flag =
179
4.47k
        ih264d_get_bit_h264(ps_bitstrm);
180
181
4.47k
    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.47k
    ps_subset_sps->s_sps_data.i4_seq_scaling_matrix_present_flag = ih264d_get_bit_h264(ps_bitstrm);
187
188
4.47k
    if(ps_subset_sps->s_sps_data.i4_seq_scaling_matrix_present_flag)
189
1.98k
    {
190
17.8k
        for(i = 0; i < 8; i++)
191
15.8k
        {
192
15.8k
            ps_subset_sps->s_sps_data.u1_seq_scaling_list_present_flag[i] =
193
15.8k
                ih264d_get_bit_h264(ps_bitstrm);
194
15.8k
        }
195
1.98k
    }
196
197
4.47k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
198
199
4.47k
    if(u4_temp > (MAX_BITS_IN_FRAME_NUM - 4))
200
1
    {
201
1
        return ERROR_INV_SPS_PPS_T;
202
1
    }
203
204
4.47k
    ps_subset_sps->s_sps_data.u1_bits_in_frm_num = 4 + u4_temp;
205
206
4.47k
    ps_subset_sps->s_sps_data.u2_u4_max_pic_num_minus1 =
207
4.47k
        (1 << (ps_subset_sps->s_sps_data.u1_bits_in_frm_num)) - 1;
208
209
4.47k
    ps_subset_sps->s_sps_data.u1_pic_order_cnt_type = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
210
211
4.47k
    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.47k
    ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle = 1;
217
218
4.47k
    if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type == 0)
219
2.72k
    {
220
2.72k
        UWORD32 u1_log2_max_pic_order_cnt_lsb_minus4 =
221
2.72k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
222
223
2.72k
        if(u1_log2_max_pic_order_cnt_lsb_minus4 > (MAX_BITS_IN_POC_LSB - 4))
224
0
        {
225
0
            return ERROR_INV_SPS_PPS_T;
226
0
        }
227
228
2.72k
        ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus =
229
2.72k
            4 + u1_log2_max_pic_order_cnt_lsb_minus4;
230
231
2.72k
        ps_subset_sps->s_sps_data.i4_max_pic_order_cntLsb =
232
2.72k
            (1 << ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus);
233
2.72k
    }
234
1.75k
    else if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type == 1)
235
663
    {
236
663
        ps_subset_sps->s_sps_data.u1_delta_pic_order_always_zero_flag =
237
663
            ih264d_get_bit_h264(ps_bitstrm);
238
239
663
        ps_subset_sps->s_sps_data.i4_ofst_for_non_ref_pic =
240
663
            ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
241
242
663
        ps_subset_sps->s_sps_data.i4_ofst_for_top_to_bottom_field =
243
663
            ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
244
245
663
        ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle =
246
663
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
247
248
663
        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.84k
        for(i = 0; i < ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
254
1.18k
        {
255
1.18k
            ps_subset_sps->s_sps_data.i4_ofst_for_ref_frame[i] =
256
1.18k
                ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
257
1.18k
        }
258
663
    }
259
260
4.47k
    ps_subset_sps->s_sps_data.u1_num_ref_frames = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
261
262
4.47k
    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.47k
    ps_subset_sps->s_sps_data.u1_gaps_in_frame_num_value_allowed_flag =
268
4.47k
        ih264d_get_bit_h264(ps_bitstrm);
269
270
4.47k
    ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
271
272
4.47k
    if(ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs > (H264_MAX_FRAME_WIDTH >> 4))
273
0
    {
274
0
        return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
275
0
    }
276
277
4.47k
    ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
278
279
4.47k
    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.47k
    ps_subset_sps->s_sps_data.u4_max_mb_addr =
285
4.47k
        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.47k
    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.47k
    ps_subset_sps->s_sps_data.u1_frame_mbs_only_flag = ih264d_get_bit_h264(ps_bitstrm);
290
291
4.47k
    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.47k
    ps_subset_sps->s_sps_data.u1_mb_aff_flag = 0;
297
298
4.47k
    ps_subset_sps->s_sps_data.u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
299
300
    /* Frame cropping flag */
301
4.47k
    u4_temp = ih264d_get_bit_h264(ps_bitstrm);
302
303
4.47k
    if(u4_temp)
304
1.85k
    {
305
1.85k
        ps_subset_sps->s_disp_offsets.u2_left_offset =
306
1.85k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
307
1.85k
        ps_subset_sps->s_disp_offsets.u2_right_offset =
308
1.85k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
309
1.85k
        ps_subset_sps->s_disp_offsets.u2_top_offset = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
310
1.85k
        ps_subset_sps->s_disp_offsets.u2_bottom_offset =
311
1.85k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
312
1.85k
    }
313
2.61k
    else
314
2.61k
    {
315
2.61k
        memset(&ps_subset_sps->s_disp_offsets, 0, sizeof(ps_subset_sps->s_disp_offsets));
316
2.61k
    }
317
318
4.47k
    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.47k
    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.47k
    if(ps_view_ctxt->u2_disp_width != (ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs * MB_SIZE -
333
4.47k
                                       ps_subset_sps->s_disp_offsets.u2_left_offset -
334
4.47k
                                       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.47k
    if(ps_view_ctxt->u2_disp_height != (ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs * MB_SIZE -
342
4.47k
                                        ps_subset_sps->s_disp_offsets.u2_top_offset -
343
4.47k
                                        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.47k
    ps_subset_sps->s_sps_data.u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
351
352
4.47k
    if(ps_subset_sps->s_sps_data.u1_vui_parameters_present_flag)
353
264
    {
354
264
        i4_error_code = ih264d_parse_vui_parametres(&ps_subset_sps->s_sps_data.s_vui, ps_bitstrm);
355
356
264
        if(i4_error_code != OK)
357
0
        {
358
0
            return i4_error_code;
359
0
        }
360
361
264
        if(ps_subset_sps->s_sps_data.s_vui.u1_bitstream_restriction_flag &&
362
205
           (ps_sps->s_vui.u4_num_reorder_frames !=
363
205
            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
264
    }
370
371
4.47k
    if(ih264d_get_bit_h264(ps_bitstrm) != 1)
372
0
    {
373
0
        return ERROR_INV_SPS_PPS_T;
374
0
    }
375
376
4.47k
    u2_num_views_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
377
378
4.47k
    if(u2_num_views_m1 >= MAX_NUM_VIEWS)
379
1
    {
380
1
        return ERROR_INVALID_SEQ_PARAM;
381
1
    }
382
383
4.47k
    ps_subset_sps->s_sps_mvc_ext.u2_num_views = 1 + u2_num_views_m1;
384
385
4.47k
    if(ps_view_ctxt->i4_decode_header)
386
2.55k
    {
387
2.55k
        ps_mvcd_ctxt->u2_num_views = MAX(ps_mvcd_ctxt->u2_num_views, 1 + u2_num_views_m1);
388
2.55k
    }
389
1.91k
    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.6k
    for(i = 0; i <= u2_num_views_m1; i++)
395
7.16k
    {
396
7.16k
        ps_subset_sps->s_sps_mvc_ext.au2_view_ids[i] =
397
7.16k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
398
7.16k
    }
399
400
13.4k
    for(i = 0; i < 2; i++)
401
8.94k
    {
402
8.94k
        ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[i][0].u1_num_refs = 0;
403
8.94k
        ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[i][0].u1_num_refs = 0;
404
8.94k
    }
405
406
7.16k
    for(i = 1; i <= u2_num_views_m1; i++)
407
2.69k
    {
408
2.69k
        u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
409
2.69k
        ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].u1_num_refs = u1_num_refs;
410
411
2.69k
        if(u1_num_refs > MAX_NUM_IVP_REFS)
412
0
        {
413
0
            return ERROR_INVALID_SEQ_PARAM;
414
0
        }
415
416
4.87k
        for(j = 0; j < u1_num_refs; j++)
417
2.17k
        {
418
2.17k
            ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].au2_ref_view_ids[j] =
419
2.17k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
420
2.17k
        }
421
422
2.69k
        u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
423
2.69k
        ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].u1_num_refs = u1_num_refs;
424
425
2.69k
        if(u1_num_refs > MAX_NUM_IVP_REFS)
426
0
        {
427
0
            return ERROR_INVALID_SEQ_PARAM;
428
0
        }
429
430
5.49k
        for(j = 0; j < u1_num_refs; j++)
431
2.80k
        {
432
2.80k
            ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].au2_ref_view_ids[j] =
433
2.80k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
434
2.80k
        }
435
2.69k
    }
436
437
7.16k
    for(i = 1; i <= u2_num_views_m1; i++)
438
2.69k
    {
439
2.69k
        u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
440
2.69k
        ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].u1_num_refs = u1_num_refs;
441
442
2.69k
        if(u1_num_refs > MAX_NUM_IVP_REFS)
443
0
        {
444
0
            return ERROR_INVALID_SEQ_PARAM;
445
0
        }
446
447
6.82k
        for(j = 0; j < u1_num_refs; j++)
448
4.13k
        {
449
4.13k
            ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].au2_ref_view_ids[j] =
450
4.13k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
451
4.13k
        }
452
453
2.69k
        u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
454
2.69k
        ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].u1_num_refs = u1_num_refs;
455
456
2.69k
        if(u1_num_refs > MAX_NUM_IVP_REFS)
457
3
        {
458
3
            return ERROR_INVALID_SEQ_PARAM;
459
3
        }
460
461
5.63k
        for(j = 0; j < u1_num_refs; j++)
462
2.94k
        {
463
2.94k
            ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].au2_ref_view_ids[j] =
464
2.94k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
465
2.94k
        }
466
2.69k
    }
467
468
4.46k
    u1_num_level_values_signalled_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
469
4.46k
    ps_subset_sps->s_sps_mvc_ext.u1_num_level_values_signalled =
470
4.46k
        u1_num_level_values_signalled_m1 + 1;
471
472
4.46k
    if(u1_num_level_values_signalled_m1 >= MAX_NUM_LEVEL_VALUES_SIGNALLED)
473
1
    {
474
1
        return ERROR_INVALID_SEQ_PARAM;
475
1
    }
476
477
8.93k
    for(i = 0; i <= u1_num_level_values_signalled_m1; i++)
478
4.46k
    {
479
4.46k
        ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info[i].u4_level_idc =
480
4.46k
            ih264d_get_bits_h264(ps_bitstrm, 8);
481
482
4.46k
        u2_num_ops_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
483
4.46k
        ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[i].u2_num_ops =
484
4.46k
            1 + u2_num_ops_m1;
485
486
4.46k
        if(u2_num_ops_m1 >= MAX_NUM_OPERATING_POINTS)
487
2
        {
488
2
            return ERROR_INVALID_SEQ_PARAM;
489
2
        }
490
491
8.92k
        for(j = 0; j <= u2_num_ops_m1; j++)
492
4.46k
        {
493
4.46k
            UWORD16 u2_num_target_views_m1;
494
495
4.46k
            ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u1_temporal_id =
496
4.46k
                ih264d_get_bits_h264(ps_bitstrm, 3);
497
498
4.46k
            u2_num_target_views_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
499
500
4.46k
            ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u2_num_target_views =
501
4.46k
                1 + u2_num_target_views_m1;
502
503
4.46k
            if(u2_num_target_views_m1 >= MAX_NUM_VIEWS)
504
0
            {
505
0
                return ERROR_INVALID_SEQ_PARAM;
506
0
            }
507
508
10.0k
            for(k = 0; k <= u2_num_target_views_m1; k++)
509
5.56k
            {
510
5.56k
                ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j]
511
5.56k
                    .au2_target_view_ids[k] = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
512
5.56k
            }
513
514
4.46k
            ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u2_num_views =
515
4.46k
                (UWORD16) 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
516
4.46k
        }
517
4.46k
    }
518
519
4.46k
    ps_subset_sps->u1_mvc_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
520
521
4.46k
    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.46k
    if(EXCEED_OFFSET(ps_bitstrm))
529
0
    {
530
0
        return ERROR_INV_SPS_PPS_T;
531
0
    }
532
533
4.46k
    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.46k
    ps_view_ctxt->ps_sps[ps_subset_sps->s_sps_data.u1_seq_parameter_set_id] =
537
4.46k
        ps_subset_sps->s_sps_data;
538
539
4.46k
    ps_mvcd_ctxt->u1_num_subset_sps++;
540
541
4.46k
    return OK;
542
4.46k
}
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
99.0k
{
549
99.0k
    UWORD32 ui4_word;
550
99.0k
    UWORD8 u1_cur_byte;
551
552
99.0k
    static const UWORD32 u4_num_bytes_in_word = sizeof(ui4_word) / sizeof(u1_cur_byte);
553
99.0k
    UWORD32 u4_num_bytes_in_rbsp = 0;
554
99.0k
    WORD32 i = 0, j;
555
99.0k
    WORD8 c_count = 0;
556
99.0k
    UWORD32 *puc_bitstream_buffer = (UWORD32 *) pu1_nal_unit;
557
99.0k
    UWORD8 u1_nal_header_size = 1;
558
99.0k
    UWORD8 u1_num_bytes_copied = 0;
559
560
99.0k
    ps_bitstrm->pu4_buffer = puc_bitstream_buffer;
561
562
99.0k
    ui4_word = *pu1_nal_unit++;
563
99.0k
    u1_num_bytes_copied++;
564
565
99.0k
    if((NAL_UNIT_TYPE(ui4_word) == PREFIX_NAL) ||
566
96.7k
       (NAL_UNIT_TYPE(ui4_word) == CODED_SLICE_EXTENSION))
567
2.28k
    {
568
2.28k
        u1_nal_header_size += 3;
569
2.28k
    }
570
571
297k
    for(j = 0; j < 2; j++)
572
198k
    {
573
198k
        u1_cur_byte = *pu1_nal_unit++;
574
575
198k
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
576
198k
        u1_num_bytes_copied++;
577
578
198k
        c_count++;
579
198k
        u4_num_bytes_in_rbsp++;
580
581
198k
        if(u1_cur_byte != 0x00)
582
167k
        {
583
167k
            c_count = 0;
584
167k
        }
585
198k
    }
586
587
99.0k
    if(u4_numbytes_in_nal_unit > 2)
588
75.8k
    {
589
75.8k
        i = ((u4_numbytes_in_nal_unit - 3));
590
75.8k
    }
591
592
3.75M
    for(; i > 8; i -= 4)
593
3.66M
    {
594
        // loop 0
595
3.66M
        u1_cur_byte = *pu1_nal_unit++;
596
597
3.66M
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
598
31.7k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
599
955
        {
600
955
            c_count = 0;
601
955
            u1_cur_byte = *pu1_nal_unit++;
602
955
            i--;
603
955
        }
604
605
3.66M
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
606
3.66M
        u1_num_bytes_copied++;
607
3.66M
        if(u4_num_bytes_in_word == u1_num_bytes_copied)
608
3.66M
        {
609
3.66M
            *puc_bitstream_buffer = ui4_word;
610
3.66M
            puc_bitstream_buffer++;
611
3.66M
            u1_num_bytes_copied = 0;
612
3.66M
        }
613
614
3.66M
        c_count++;
615
3.66M
        if(u1_cur_byte != 0x00) c_count = 0;
616
617
        // loop 1
618
3.66M
        u1_cur_byte = *pu1_nal_unit++;
619
620
3.66M
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
621
30.4k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
622
785
        {
623
785
            c_count = 0;
624
785
            u1_cur_byte = *pu1_nal_unit++;
625
785
            i--;
626
785
        }
627
3.66M
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
628
3.66M
        u1_num_bytes_copied++;
629
3.66M
        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.66M
        c_count++;
637
3.66M
        if(u1_cur_byte != 0x00) c_count = 0;
638
639
        // loop 2
640
3.66M
        u1_cur_byte = *pu1_nal_unit++;
641
642
3.66M
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
643
31.1k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
644
829
        {
645
829
            c_count = 0;
646
829
            u1_cur_byte = *pu1_nal_unit++;
647
829
            i--;
648
829
        }
649
650
3.66M
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
651
3.66M
        u1_num_bytes_copied++;
652
3.66M
        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.66M
        c_count++;
660
3.66M
        if(u1_cur_byte != 0x00) c_count = 0;
661
662
        // loop 3
663
3.66M
        u1_cur_byte = *pu1_nal_unit++;
664
665
3.66M
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
666
32.2k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
667
739
        {
668
739
            c_count = 0;
669
739
            u1_cur_byte = *pu1_nal_unit++;
670
739
            i--;
671
739
        }
672
673
3.66M
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
674
3.66M
        u1_num_bytes_copied++;
675
3.66M
        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.66M
        c_count++;
683
3.66M
        if(u1_cur_byte != 0x00) c_count = 0;
684
685
3.66M
        u4_num_bytes_in_rbsp += 4;
686
3.66M
    }
687
688
442k
    for(; i > 0; i--)
689
343k
    {
690
343k
        u1_cur_byte = *pu1_nal_unit++;
691
692
343k
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
693
9.82k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
694
540
        {
695
540
            c_count = 0;
696
540
            i--;
697
540
            u1_cur_byte = *pu1_nal_unit++;
698
540
        }
699
700
343k
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
701
343k
        u4_num_bytes_in_rbsp++;
702
703
343k
        if((u4_num_bytes_in_rbsp & 0x03) == 0x03)
704
117k
        {
705
117k
            *puc_bitstream_buffer = ui4_word;
706
117k
            puc_bitstream_buffer++;
707
117k
        }
708
343k
        c_count++;
709
343k
        if(u1_cur_byte != 0x00) c_count = 0;
710
343k
    }
711
712
99.0k
    *puc_bitstream_buffer = (ui4_word << ((3 - (((u4_num_bytes_in_rbsp << 30) >> 30))) << 3));
713
99.0k
    ps_bitstrm->u4_ofst = 0;
714
99.0k
    ps_bitstrm->u4_max_ofst = ((u4_num_bytes_in_rbsp + u1_nal_header_size) << 3);
715
716
99.0k
    return (u4_num_bytes_in_rbsp);
717
99.0k
}
718
719
WORD32 imvcd_nalu_parser(mvc_dec_ctxt_t *ps_mvcd_ctxt, UWORD8 *pu1_bitstream_buf,
720
                         UWORD32 i4_nalu_length)
721
99.0k
{
722
99.0k
    AVC_EXT_NALU_ID_T e_nalu_id;
723
724
99.0k
    UWORD8 u1_first_byte;
725
726
99.0k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
727
99.0k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
728
729
99.0k
    WORD32 i4_error_code = NOT_OK;
730
731
99.0k
    if((NULL != pu1_bitstream_buf) && (i4_nalu_length > 0))
732
99.0k
    {
733
99.0k
        imvcd_transform_nalu(ps_bitstrm, pu1_bitstream_buf, i4_nalu_length);
734
735
99.0k
        u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
736
737
99.0k
        if(NAL_FORBIDDEN_BIT(u1_first_byte))
738
15
        {
739
15
            return NOT_OK;
740
15
        }
741
742
99.0k
        e_nalu_id = NAL_UNIT_TYPE(u1_first_byte);
743
99.0k
        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
99.0k
        if((ps_view_ctxt->u4_slice_start_code_found == 1) &&
748
364
           (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
99.0k
        switch(e_nalu_id)
754
99.0k
        {
755
2.28k
            case PREFIX_NAL:
756
2.28k
            {
757
2.28k
                if(!ps_view_ctxt->i4_decode_header)
758
2.28k
                {
759
2.28k
                    if(1 == ih264d_get_bit_h264(ps_bitstrm))
760
1
                    {
761
1
                        return IVD_INVALID_BITSTREAM;
762
1
                    }
763
764
2.28k
                    i4_error_code = imvcd_nalu_mvc_ext_parser(ps_mvcd_ctxt, ps_bitstrm);
765
766
2.28k
                    if(i4_error_code != OK)
767
4
                    {
768
4
                        return i4_error_code;
769
4
                    }
770
2.28k
                }
771
772
2.27k
                break;
773
2.28k
            }
774
4.49k
            case SUBSET_SPS:
775
4.49k
            {
776
4.49k
                ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
777
778
4.49k
                i4_error_code = imvcd_parse_subset_sps(ps_mvcd_ctxt, ps_bitstrm);
779
780
4.49k
                if(OK != i4_error_code)
781
28
                {
782
28
                    return i4_error_code;
783
28
                }
784
785
4.46k
                ps_view_ctxt->i4_header_decoded |= 1 << SUBSET_SPS;
786
787
4.46k
                break;
788
4.49k
            }
789
66.7k
            case SLICE_NON_IDR:
790
92.2k
            case SLICE_IDR:
791
92.2k
            {
792
92.2k
                if(!ps_view_ctxt->i4_decode_header)
793
92.2k
                {
794
92.2k
                    if(is_header_decoded(ps_view_ctxt->i4_header_decoded, SPS) &&
795
92.2k
                       is_header_decoded(ps_view_ctxt->i4_header_decoded, PPS))
796
92.2k
                    {
797
92.2k
                        nalu_mvc_ext_t *ps_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
798
799
92.2k
                        ps_view_ctxt->u4_slice_start_code_found = 1;
800
801
92.2k
                        if((0 == ps_mvcd_ctxt->u2_num_views_decoded) &&
802
90.7k
                           !ps_nalu_mvc_ext->u1_inter_view_flag)
803
90.4k
                        {
804
90.4k
                            ps_nalu_mvc_ext->u1_inter_view_flag = 1;
805
90.4k
                        }
806
807
92.2k
                        ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
808
809
92.2k
                        i4_error_code = imvcd_parse_decode_slice(ps_mvcd_ctxt);
810
811
92.2k
                        if(i4_error_code != OK)
812
2.09k
                        {
813
2.09k
                            return i4_error_code;
814
2.09k
                        }
815
92.2k
                    }
816
0
                    else
817
0
                    {
818
0
                        return IVD_INVALID_BITSTREAM;
819
0
                    }
820
92.2k
                }
821
822
90.1k
                break;
823
92.2k
            }
824
90.1k
            case CODED_SLICE_EXTENSION:
825
2
            {
826
2
                if(!ps_view_ctxt->i4_decode_header)
827
2
                {
828
2
                    if(is_header_decoded(ps_view_ctxt->i4_header_decoded, SPS) &&
829
2
                       is_header_decoded(ps_view_ctxt->i4_header_decoded, PPS) &&
830
2
                       is_header_decoded(ps_view_ctxt->i4_header_decoded, SUBSET_SPS))
831
2
                    {
832
2
                        ps_view_ctxt->u4_slice_start_code_found = 1;
833
834
2
                        if(1 == ih264d_get_bit_h264(ps_bitstrm))
835
1
                        {
836
1
                            return IVD_INVALID_BITSTREAM;
837
1
                        }
838
839
1
                        i4_error_code = imvcd_nalu_mvc_ext_parser(ps_mvcd_ctxt, ps_bitstrm);
840
841
1
                        if(i4_error_code != OK)
842
1
                        {
843
1
                            return i4_error_code;
844
1
                        }
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
2
                }
860
861
0
                break;
862
2
            }
863
4
            default:
864
4
            {
865
4
                i4_error_code = ERROR_UNKNOWN_NAL;
866
867
4
                break;
868
2
            }
869
99.0k
        }
870
99.0k
    }
871
872
96.9k
    return i4_error_code;
873
99.0k
}