Coverage Report

Created: 2026-01-10 06:44

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