Coverage Report

Created: 2026-04-12 06:59

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
1.96k
{
47
1.96k
    nalu_mvc_ext_t *ps_nalu_mvc_ext =
48
1.96k
        &ps_mvcd_ctxt->as_nalu_mvc_ext[ps_mvcd_ctxt->u2_num_views_decoded];
49
50
1.96k
    ps_nalu_mvc_ext->u1_non_idr_flag = ih264d_get_bit_h264(ps_bitstrm);
51
1.96k
    ps_nalu_mvc_ext->u1_priority_id = ih264d_get_bits_h264(ps_bitstrm, 6);
52
1.96k
    ps_nalu_mvc_ext->u2_view_id = ih264d_get_bits_h264(ps_bitstrm, 10);
53
54
1.96k
    if((ps_nalu_mvc_ext->u2_view_id >= MAX_NUM_VIEWS) ||
55
1.96k
       (ps_nalu_mvc_ext->u2_view_id >= ps_mvcd_ctxt->u2_num_views))
56
1
    {
57
1
        return IVD_INVALID_BITSTREAM;
58
1
    }
59
60
1.96k
    ps_nalu_mvc_ext->u1_temporal_id = ih264d_get_bits_h264(ps_bitstrm, 3);
61
1.96k
    ps_nalu_mvc_ext->u1_anchor_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
62
1.96k
    ps_nalu_mvc_ext->u1_inter_view_flag = ih264d_get_bit_h264(ps_bitstrm);
63
64
1.96k
    if(0 == ih264d_get_bit_h264(ps_bitstrm))
65
8
    {
66
8
        return IVD_INVALID_BITSTREAM;
67
8
    }
68
69
1.95k
    return OK;
70
1.96k
}
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
5
    {
96
5
        return ERROR_INV_SPS_PPS_T;
97
5
    }
98
99
4.85k
    for(i = 0; i < MAX_NUM_SEQ_PARAMS; i++)
100
4.85k
    {
101
4.85k
        if(ps_view_ctxt->ps_sps[i].u1_is_valid)
102
4.28k
        {
103
4.28k
            ps_sps = &ps_view_ctxt->ps_sps[i];
104
105
4.28k
            break;
106
4.28k
        }
107
4.85k
    }
108
109
4.28k
    if(NULL == ps_sps)
110
0
    {
111
0
        return ERROR_INV_SPS_PPS_T;
112
0
    }
113
114
4.28k
    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.28k
    if((u1_profile_idc != MULTIVIEW_HIGH_PROFILE_IDC) || (au1_constraint_set_flags[1] == 1))
122
1
    {
123
1
        return ERROR_FEATURE_UNAVAIL;
124
1
    }
125
126
    /*****************************************************/
127
    /* Read reserved_zero_2bits (2 bits)                 */
128
    /*****************************************************/
129
4.28k
    ih264d_get_bits_h264(ps_bitstrm, 2);
130
131
4.28k
    u1_level_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
132
133
4.28k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
134
4.28k
    u1_seq_parameter_set_id = u4_temp;
135
136
4.28k
    if(u4_temp & MASK_ERR_SEQ_SET_ID)
137
2
    {
138
2
        return ERROR_INV_SPS_PPS_T;
139
2
    }
140
141
4.28k
    if(ps_sps->u1_level_idc != u1_level_idc)
142
0
    {
143
0
        ps_view_ctxt->u1_res_changed = 1;
144
145
0
        return IVD_RES_CHANGED;
146
0
    }
147
148
4.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
4.28k
    ps_subset_sps->s_sps_data.u1_profile_idc = HIGH_PROFILE_IDC;
152
4.28k
    ps_subset_sps->s_sps_data.u1_level_idc = u1_level_idc;
153
4.28k
    ps_subset_sps->s_sps_data.u1_seq_parameter_set_id = u1_seq_parameter_set_id;
154
155
4.28k
    ps_subset_sps->s_sps_data.i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
156
157
4.28k
    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.27k
    ps_subset_sps->s_sps_data.i4_bit_depth_luma_minus8 =
163
4.27k
        ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
164
165
4.27k
    if(ps_subset_sps->s_sps_data.i4_bit_depth_luma_minus8 != 0)
166
1
    {
167
1
        return ERROR_FEATURE_UNAVAIL;
168
1
    }
169
170
4.27k
    ps_subset_sps->s_sps_data.i4_bit_depth_chroma_minus8 =
171
4.27k
        ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
172
173
4.27k
    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.27k
    ps_subset_sps->s_sps_data.i4_qpprime_y_zero_transform_bypass_flag =
179
4.27k
        ih264d_get_bit_h264(ps_bitstrm);
180
181
4.27k
    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.27k
    ps_subset_sps->s_sps_data.i4_seq_scaling_matrix_present_flag = ih264d_get_bit_h264(ps_bitstrm);
187
188
4.27k
    if(ps_subset_sps->s_sps_data.i4_seq_scaling_matrix_present_flag)
189
1.95k
    {
190
17.5k
        for(i = 0; i < 8; i++)
191
15.6k
        {
192
15.6k
            ps_subset_sps->s_sps_data.u1_seq_scaling_list_present_flag[i] =
193
15.6k
                ih264d_get_bit_h264(ps_bitstrm);
194
15.6k
        }
195
1.95k
    }
196
197
4.27k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
198
199
4.27k
    if(u4_temp > (MAX_BITS_IN_FRAME_NUM - 4))
200
0
    {
201
0
        return ERROR_INV_SPS_PPS_T;
202
0
    }
203
204
4.27k
    ps_subset_sps->s_sps_data.u1_bits_in_frm_num = 4 + u4_temp;
205
206
4.27k
    ps_subset_sps->s_sps_data.u2_u4_max_pic_num_minus1 =
207
4.27k
        (1 << (ps_subset_sps->s_sps_data.u1_bits_in_frm_num)) - 1;
208
209
4.27k
    ps_subset_sps->s_sps_data.u1_pic_order_cnt_type = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
210
211
4.27k
    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.27k
    ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle = 1;
217
218
4.27k
    if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type == 0)
219
2.57k
    {
220
2.57k
        UWORD32 u1_log2_max_pic_order_cnt_lsb_minus4 =
221
2.57k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
222
223
2.57k
        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.57k
        ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus =
229
2.57k
            4 + u1_log2_max_pic_order_cnt_lsb_minus4;
230
231
2.57k
        ps_subset_sps->s_sps_data.i4_max_pic_order_cntLsb =
232
2.57k
            (1 << ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus);
233
2.57k
    }
234
1.69k
    else if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type == 1)
235
606
    {
236
606
        ps_subset_sps->s_sps_data.u1_delta_pic_order_always_zero_flag =
237
606
            ih264d_get_bit_h264(ps_bitstrm);
238
239
606
        ps_subset_sps->s_sps_data.i4_ofst_for_non_ref_pic =
240
606
            ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
241
242
606
        ps_subset_sps->s_sps_data.i4_ofst_for_top_to_bottom_field =
243
606
            ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
244
245
606
        ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle =
246
606
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
247
248
606
        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.61k
        for(i = 0; i < ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
254
1.00k
        {
255
1.00k
            ps_subset_sps->s_sps_data.i4_ofst_for_ref_frame[i] =
256
1.00k
                ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
257
1.00k
        }
258
606
    }
259
260
4.27k
    ps_subset_sps->s_sps_data.u1_num_ref_frames = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
261
262
4.27k
    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.27k
    ps_subset_sps->s_sps_data.u1_gaps_in_frame_num_value_allowed_flag =
268
4.27k
        ih264d_get_bit_h264(ps_bitstrm);
269
270
4.27k
    ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
271
272
4.27k
    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.27k
    ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
278
279
4.27k
    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.27k
    ps_subset_sps->s_sps_data.u4_max_mb_addr =
285
4.27k
        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.27k
    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.27k
    ps_subset_sps->s_sps_data.u1_frame_mbs_only_flag = ih264d_get_bit_h264(ps_bitstrm);
290
291
4.27k
    if(!ps_subset_sps->s_sps_data.u1_frame_mbs_only_flag)
292
0
    {
293
0
        return ERROR_FEATURE_UNAVAIL;
294
0
    }
295
296
4.27k
    ps_subset_sps->s_sps_data.u1_mb_aff_flag = 0;
297
298
4.27k
    ps_subset_sps->s_sps_data.u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
299
300
    /* Frame cropping flag */
301
4.27k
    u4_temp = ih264d_get_bit_h264(ps_bitstrm);
302
303
4.27k
    if(u4_temp)
304
1.79k
    {
305
1.79k
        ps_subset_sps->s_disp_offsets.u2_left_offset =
306
1.79k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
307
1.79k
        ps_subset_sps->s_disp_offsets.u2_right_offset =
308
1.79k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
309
1.79k
        ps_subset_sps->s_disp_offsets.u2_top_offset = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
310
1.79k
        ps_subset_sps->s_disp_offsets.u2_bottom_offset =
311
1.79k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
312
1.79k
    }
313
2.47k
    else
314
2.47k
    {
315
2.47k
        memset(&ps_subset_sps->s_disp_offsets, 0, sizeof(ps_subset_sps->s_disp_offsets));
316
2.47k
    }
317
318
4.27k
    if(ps_sps->u2_frm_wd_in_mbs != ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs)
319
0
    {
320
0
        ps_view_ctxt->u1_res_changed = 1;
321
322
0
        return IVD_RES_CHANGED;
323
0
    }
324
325
4.27k
    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.27k
    if(ps_view_ctxt->u2_disp_width != (ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs * MB_SIZE -
333
4.27k
                                       ps_subset_sps->s_disp_offsets.u2_left_offset -
334
4.27k
                                       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.27k
    if(ps_view_ctxt->u2_disp_height != (ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs * MB_SIZE -
342
4.27k
                                        ps_subset_sps->s_disp_offsets.u2_top_offset -
343
4.27k
                                        ps_subset_sps->s_disp_offsets.u2_bottom_offset))
344
1
    {
345
1
        ps_view_ctxt->u1_res_changed = 1;
346
347
1
        return IVD_RES_CHANGED;
348
1
    }
349
350
4.27k
    ps_subset_sps->s_sps_data.u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
351
352
4.27k
    if(ps_subset_sps->s_sps_data.u1_vui_parameters_present_flag)
353
441
    {
354
441
        i4_error_code = ih264d_parse_vui_parametres(&ps_subset_sps->s_sps_data.s_vui, ps_bitstrm);
355
356
441
        if(i4_error_code != OK)
357
1
        {
358
1
            return i4_error_code;
359
1
        }
360
361
440
        if(ps_subset_sps->s_sps_data.s_vui.u1_bitstream_restriction_flag &&
362
234
           (ps_sps->s_vui.u4_num_reorder_frames !=
363
234
            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
440
    }
370
371
4.27k
    if(ih264d_get_bit_h264(ps_bitstrm) != 1)
372
1
    {
373
1
        return ERROR_INV_SPS_PPS_T;
374
1
    }
375
376
4.27k
    u2_num_views_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
377
378
4.27k
    if(u2_num_views_m1 >= MAX_NUM_VIEWS)
379
0
    {
380
0
        return ERROR_INVALID_SEQ_PARAM;
381
0
    }
382
383
4.27k
    ps_subset_sps->s_sps_mvc_ext.u2_num_views = 1 + u2_num_views_m1;
384
385
4.27k
    if(ps_view_ctxt->i4_decode_header)
386
2.36k
    {
387
2.36k
        ps_mvcd_ctxt->u2_num_views = MAX(ps_mvcd_ctxt->u2_num_views, 1 + u2_num_views_m1);
388
2.36k
    }
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
10.7k
    for(i = 0; i <= u2_num_views_m1; i++)
395
6.48k
    {
396
6.48k
        ps_subset_sps->s_sps_mvc_ext.au2_view_ids[i] =
397
6.48k
            ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
398
6.48k
    }
399
400
12.8k
    for(i = 0; i < 2; i++)
401
8.54k
    {
402
8.54k
        ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[i][0].u1_num_refs = 0;
403
8.54k
        ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[i][0].u1_num_refs = 0;
404
8.54k
    }
405
406
6.48k
    for(i = 1; i <= u2_num_views_m1; i++)
407
2.21k
    {
408
2.21k
        u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
409
2.21k
        ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].u1_num_refs = u1_num_refs;
410
411
2.21k
        if(u1_num_refs > MAX_NUM_IVP_REFS)
412
0
        {
413
0
            return ERROR_INVALID_SEQ_PARAM;
414
0
        }
415
416
3.83k
        for(j = 0; j < u1_num_refs; j++)
417
1.62k
        {
418
1.62k
            ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].au2_ref_view_ids[j] =
419
1.62k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
420
1.62k
        }
421
422
2.21k
        u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
423
2.21k
        ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].u1_num_refs = u1_num_refs;
424
425
2.21k
        if(u1_num_refs > MAX_NUM_IVP_REFS)
426
0
        {
427
0
            return ERROR_INVALID_SEQ_PARAM;
428
0
        }
429
430
4.96k
        for(j = 0; j < u1_num_refs; j++)
431
2.75k
        {
432
2.75k
            ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].au2_ref_view_ids[j] =
433
2.75k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
434
2.75k
        }
435
2.21k
    }
436
437
6.47k
    for(i = 1; i <= u2_num_views_m1; i++)
438
2.20k
    {
439
2.20k
        u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
440
2.20k
        ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].u1_num_refs = u1_num_refs;
441
442
2.20k
        if(u1_num_refs > MAX_NUM_IVP_REFS)
443
0
        {
444
0
            return ERROR_INVALID_SEQ_PARAM;
445
0
        }
446
447
5.27k
        for(j = 0; j < u1_num_refs; j++)
448
3.06k
        {
449
3.06k
            ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].au2_ref_view_ids[j] =
450
3.06k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
451
3.06k
        }
452
453
2.20k
        u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
454
2.20k
        ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].u1_num_refs = u1_num_refs;
455
456
2.20k
        if(u1_num_refs > MAX_NUM_IVP_REFS)
457
1
        {
458
1
            return ERROR_INVALID_SEQ_PARAM;
459
1
        }
460
461
4.17k
        for(j = 0; j < u1_num_refs; j++)
462
1.96k
        {
463
1.96k
            ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].au2_ref_view_ids[j] =
464
1.96k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
465
1.96k
        }
466
2.20k
    }
467
468
4.27k
    u1_num_level_values_signalled_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
469
4.27k
    ps_subset_sps->s_sps_mvc_ext.u1_num_level_values_signalled =
470
4.27k
        u1_num_level_values_signalled_m1 + 1;
471
472
4.27k
    if(u1_num_level_values_signalled_m1 >= MAX_NUM_LEVEL_VALUES_SIGNALLED)
473
2
    {
474
2
        return ERROR_INVALID_SEQ_PARAM;
475
2
    }
476
477
8.53k
    for(i = 0; i <= u1_num_level_values_signalled_m1; i++)
478
4.26k
    {
479
4.26k
        ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info[i].u4_level_idc =
480
4.26k
            ih264d_get_bits_h264(ps_bitstrm, 8);
481
482
4.26k
        u2_num_ops_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
483
4.26k
        ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[i].u2_num_ops =
484
4.26k
            1 + u2_num_ops_m1;
485
486
4.26k
        if(u2_num_ops_m1 >= MAX_NUM_OPERATING_POINTS)
487
1
        {
488
1
            return ERROR_INVALID_SEQ_PARAM;
489
1
        }
490
491
8.53k
        for(j = 0; j <= u2_num_ops_m1; j++)
492
4.26k
        {
493
4.26k
            UWORD16 u2_num_target_views_m1;
494
495
4.26k
            ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u1_temporal_id =
496
4.26k
                ih264d_get_bits_h264(ps_bitstrm, 3);
497
498
4.26k
            u2_num_target_views_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
499
500
4.26k
            ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u2_num_target_views =
501
4.26k
                1 + u2_num_target_views_m1;
502
503
4.26k
            if(u2_num_target_views_m1 >= MAX_NUM_VIEWS)
504
1
            {
505
1
                return ERROR_INVALID_SEQ_PARAM;
506
1
            }
507
508
9.19k
            for(k = 0; k <= u2_num_target_views_m1; k++)
509
4.93k
            {
510
4.93k
                ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j]
511
4.93k
                    .au2_target_view_ids[k] = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
512
4.93k
            }
513
514
4.26k
            ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u2_num_views =
515
4.26k
                (UWORD16) 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
516
4.26k
        }
517
4.26k
    }
518
519
4.26k
    ps_subset_sps->u1_mvc_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
520
521
4.26k
    if(ps_subset_sps->u1_mvc_vui_parameters_present_flag)
522
4
    {
523
4
        return ERROR_INV_SPS_PPS_T;
524
4
    }
525
526
    /* In case bitstream read has exceeded the filled size, then
527
     return an error */
528
4.26k
    if(EXCEED_OFFSET(ps_bitstrm))
529
0
    {
530
0
        return ERROR_INV_SPS_PPS_T;
531
0
    }
532
533
4.26k
    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.26k
    ps_view_ctxt->ps_sps[ps_subset_sps->s_sps_data.u1_seq_parameter_set_id] =
537
4.26k
        ps_subset_sps->s_sps_data;
538
539
4.26k
    ps_mvcd_ctxt->u1_num_subset_sps++;
540
541
4.26k
    return OK;
542
4.26k
}
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.1k
{
549
99.1k
    UWORD32 ui4_word;
550
99.1k
    UWORD8 u1_cur_byte;
551
552
99.1k
    static const UWORD32 u4_num_bytes_in_word = sizeof(ui4_word) / sizeof(u1_cur_byte);
553
99.1k
    UWORD32 u4_num_bytes_in_rbsp = 0;
554
99.1k
    WORD32 i = 0, j;
555
99.1k
    WORD8 c_count = 0;
556
99.1k
    UWORD32 *puc_bitstream_buffer = (UWORD32 *) pu1_nal_unit;
557
99.1k
    UWORD8 u1_nal_header_size = 1;
558
99.1k
    UWORD8 u1_num_bytes_copied = 0;
559
560
99.1k
    ps_bitstrm->pu4_buffer = puc_bitstream_buffer;
561
562
99.1k
    ui4_word = *pu1_nal_unit++;
563
99.1k
    u1_num_bytes_copied++;
564
565
99.1k
    if((NAL_UNIT_TYPE(ui4_word) == PREFIX_NAL) ||
566
97.2k
       (NAL_UNIT_TYPE(ui4_word) == CODED_SLICE_EXTENSION))
567
1.97k
    {
568
1.97k
        u1_nal_header_size += 3;
569
1.97k
    }
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.1k
    if(u4_numbytes_in_nal_unit > 2)
588
79.0k
    {
589
79.0k
        i = ((u4_numbytes_in_nal_unit - 3));
590
79.0k
    }
591
592
2.69M
    for(; i > 8; i -= 4)
593
2.59M
    {
594
        // loop 0
595
2.59M
        u1_cur_byte = *pu1_nal_unit++;
596
597
2.59M
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
598
24.7k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
599
429
        {
600
429
            c_count = 0;
601
429
            u1_cur_byte = *pu1_nal_unit++;
602
429
            i--;
603
429
        }
604
605
2.59M
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
606
2.59M
        u1_num_bytes_copied++;
607
2.59M
        if(u4_num_bytes_in_word == u1_num_bytes_copied)
608
2.59M
        {
609
2.59M
            *puc_bitstream_buffer = ui4_word;
610
2.59M
            puc_bitstream_buffer++;
611
2.59M
            u1_num_bytes_copied = 0;
612
2.59M
        }
613
614
2.59M
        c_count++;
615
2.59M
        if(u1_cur_byte != 0x00) c_count = 0;
616
617
        // loop 1
618
2.59M
        u1_cur_byte = *pu1_nal_unit++;
619
620
2.59M
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
621
25.7k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
622
347
        {
623
347
            c_count = 0;
624
347
            u1_cur_byte = *pu1_nal_unit++;
625
347
            i--;
626
347
        }
627
2.59M
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
628
2.59M
        u1_num_bytes_copied++;
629
2.59M
        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.59M
        c_count++;
637
2.59M
        if(u1_cur_byte != 0x00) c_count = 0;
638
639
        // loop 2
640
2.59M
        u1_cur_byte = *pu1_nal_unit++;
641
642
2.59M
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
643
24.9k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
644
583
        {
645
583
            c_count = 0;
646
583
            u1_cur_byte = *pu1_nal_unit++;
647
583
            i--;
648
583
        }
649
650
2.59M
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
651
2.59M
        u1_num_bytes_copied++;
652
2.59M
        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.59M
        c_count++;
660
2.59M
        if(u1_cur_byte != 0x00) c_count = 0;
661
662
        // loop 3
663
2.59M
        u1_cur_byte = *pu1_nal_unit++;
664
665
2.59M
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
666
25.3k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
667
408
        {
668
408
            c_count = 0;
669
408
            u1_cur_byte = *pu1_nal_unit++;
670
408
            i--;
671
408
        }
672
673
2.59M
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
674
2.59M
        u1_num_bytes_copied++;
675
2.59M
        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.59M
        c_count++;
683
2.59M
        if(u1_cur_byte != 0x00) c_count = 0;
684
685
2.59M
        u4_num_bytes_in_rbsp += 4;
686
2.59M
    }
687
688
449k
    for(; i > 0; i--)
689
350k
    {
690
350k
        u1_cur_byte = *pu1_nal_unit++;
691
692
350k
        if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
693
9.84k
           u1_cur_byte == EMULATION_PREVENTION_BYTE)
694
894
        {
695
894
            c_count = 0;
696
894
            i--;
697
894
            u1_cur_byte = *pu1_nal_unit++;
698
894
        }
699
700
350k
        ui4_word = ((ui4_word << 8) | u1_cur_byte);
701
350k
        u4_num_bytes_in_rbsp++;
702
703
350k
        if((u4_num_bytes_in_rbsp & 0x03) == 0x03)
704
120k
        {
705
120k
            *puc_bitstream_buffer = ui4_word;
706
120k
            puc_bitstream_buffer++;
707
120k
        }
708
350k
        c_count++;
709
350k
        if(u1_cur_byte != 0x00) c_count = 0;
710
350k
    }
711
712
99.1k
    *puc_bitstream_buffer = (ui4_word << ((3 - (((u4_num_bytes_in_rbsp << 30) >> 30))) << 3));
713
99.1k
    ps_bitstrm->u4_ofst = 0;
714
99.1k
    ps_bitstrm->u4_max_ofst = ((u4_num_bytes_in_rbsp + u1_nal_header_size) << 3);
715
716
99.1k
    return (u4_num_bytes_in_rbsp);
717
99.1k
}
718
719
WORD32 imvcd_nalu_parser(mvc_dec_ctxt_t *ps_mvcd_ctxt, UWORD8 *pu1_bitstream_buf,
720
                         UWORD32 i4_nalu_length)
721
99.1k
{
722
99.1k
    AVC_EXT_NALU_ID_T e_nalu_id;
723
724
99.1k
    UWORD8 u1_first_byte;
725
726
99.1k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
727
99.1k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
728
729
99.1k
    WORD32 i4_error_code = NOT_OK;
730
731
99.1k
    if((NULL != pu1_bitstream_buf) && (i4_nalu_length > 0))
732
99.1k
    {
733
99.1k
        imvcd_transform_nalu(ps_bitstrm, pu1_bitstream_buf, i4_nalu_length);
734
735
99.1k
        u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
736
737
99.1k
        if(NAL_FORBIDDEN_BIT(u1_first_byte))
738
11
        {
739
11
            return NOT_OK;
740
11
        }
741
742
99.1k
        e_nalu_id = NAL_UNIT_TYPE(u1_first_byte);
743
99.1k
        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.1k
        if((ps_view_ctxt->u4_slice_start_code_found == 1) &&
748
199
           (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.1k
        switch(e_nalu_id)
754
99.1k
        {
755
1.92k
            case PREFIX_NAL:
756
1.92k
            {
757
1.92k
                if(!ps_view_ctxt->i4_decode_header)
758
1.91k
                {
759
1.91k
                    if(1 == ih264d_get_bit_h264(ps_bitstrm))
760
0
                    {
761
0
                        return IVD_INVALID_BITSTREAM;
762
0
                    }
763
764
1.91k
                    i4_error_code = imvcd_nalu_mvc_ext_parser(ps_mvcd_ctxt, ps_bitstrm);
765
766
1.91k
                    if(i4_error_code != OK)
767
4
                    {
768
4
                        return i4_error_code;
769
4
                    }
770
1.91k
                }
771
772
1.91k
                break;
773
1.92k
            }
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
25
                {
782
25
                    return i4_error_code;
783
25
                }
784
785
4.26k
                ps_view_ctxt->i4_header_decoded |= 1 << SUBSET_SPS;
786
787
4.26k
                break;
788
4.28k
            }
789
65.1k
            case SLICE_NON_IDR:
790
92.8k
            case SLICE_IDR:
791
92.8k
            {
792
92.8k
                if(!ps_view_ctxt->i4_decode_header)
793
92.8k
                {
794
92.8k
                    if(is_header_decoded(ps_view_ctxt->i4_header_decoded, SPS) &&
795
92.8k
                       is_header_decoded(ps_view_ctxt->i4_header_decoded, PPS))
796
92.8k
                    {
797
92.8k
                        nalu_mvc_ext_t *ps_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
798
799
92.8k
                        ps_view_ctxt->u4_slice_start_code_found = 1;
800
801
92.8k
                        if((0 == ps_mvcd_ctxt->u2_num_views_decoded) &&
802
91.4k
                           !ps_nalu_mvc_ext->u1_inter_view_flag)
803
91.3k
                        {
804
91.3k
                            ps_nalu_mvc_ext->u1_inter_view_flag = 1;
805
91.3k
                        }
806
807
92.8k
                        ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
808
809
92.8k
                        i4_error_code = imvcd_parse_decode_slice(ps_mvcd_ctxt);
810
811
92.8k
                        if(i4_error_code != OK)
812
2.02k
                        {
813
2.02k
                            return i4_error_code;
814
2.02k
                        }
815
92.8k
                    }
816
0
                    else
817
0
                    {
818
0
                        return IVD_INVALID_BITSTREAM;
819
0
                    }
820
92.8k
                }
821
822
90.8k
                break;
823
92.8k
            }
824
90.8k
            case CODED_SLICE_EXTENSION:
825
54
            {
826
54
                if(!ps_view_ctxt->i4_decode_header)
827
54
                {
828
54
                    if(is_header_decoded(ps_view_ctxt->i4_header_decoded, SPS) &&
829
54
                       is_header_decoded(ps_view_ctxt->i4_header_decoded, PPS) &&
830
54
                       is_header_decoded(ps_view_ctxt->i4_header_decoded, SUBSET_SPS))
831
51
                    {
832
51
                        ps_view_ctxt->u4_slice_start_code_found = 1;
833
834
51
                        if(1 == ih264d_get_bit_h264(ps_bitstrm))
835
1
                        {
836
1
                            return IVD_INVALID_BITSTREAM;
837
1
                        }
838
839
50
                        i4_error_code = imvcd_nalu_mvc_ext_parser(ps_mvcd_ctxt, ps_bitstrm);
840
841
50
                        if(i4_error_code != OK)
842
5
                        {
843
5
                            return i4_error_code;
844
5
                        }
845
846
45
                        ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
847
848
45
                        i4_error_code = imvcd_parse_decode_slice(ps_mvcd_ctxt);
849
850
45
                        if(i4_error_code != OK)
851
1
                        {
852
1
                            return i4_error_code;
853
1
                        }
854
45
                    }
855
3
                    else
856
3
                    {
857
3
                        return IVD_INVALID_BITSTREAM;
858
3
                    }
859
54
                }
860
861
44
                break;
862
54
            }
863
44
            default:
864
9
            {
865
9
                i4_error_code = ERROR_UNKNOWN_NAL;
866
867
9
                break;
868
54
            }
869
99.1k
        }
870
99.1k
    }
871
872
97.0k
    return i4_error_code;
873
99.1k
}