Coverage Report

Created: 2025-07-12 06:37

/src/libavc/decoder/ih264d_parse_headers.c
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2015 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
 * \file ih264d_parse_headers.c
23
 *
24
 * \brief
25
 *    Contains High level syntax[above slice] parsing routines
26
 *
27
 * \date
28
 *    19/12/2002
29
 *
30
 * \author  AI
31
 **************************************************************************
32
 */
33
#include <string.h>
34
35
#include "ih264_typedefs.h"
36
#include "ih264_macros.h"
37
#include "ih264_platform_macros.h"
38
#include "ih264_defs.h"
39
#include "ih264d_bitstrm.h"
40
#include "ih264d_structs.h"
41
#include "ih264d_parse_cavlc.h"
42
#include "ih264d_defs.h"
43
#include "ih264d_defs.h"
44
#include "ih264d_defs.h"
45
#include "ih264d_parse_slice.h"
46
#include "ih264d_tables.h"
47
#include "ih264d_utils.h"
48
#include "ih264d_nal.h"
49
#include "ih264d_deblocking.h"
50
51
#include "ih264d_mem_request.h"
52
#include "ih264d_debug.h"
53
#include "ih264d_error_handler.h"
54
#include "ih264d_mb_utils.h"
55
#include "ih264d_sei.h"
56
#include "ih264d_vui.h"
57
#include "ih264d_thread_parse_decode.h"
58
#include "ih264d_thread_compute_bs.h"
59
#include "ih264d_quant_scaling.h"
60
#include "ih264d_defs.h"
61
#include "ivd.h"
62
#include "ih264d.h"
63
64
/*****************************************************************************/
65
/*                                                                           */
66
/*  Function Name : ih264d_get_pre_sei_params                                */
67
/*                                                                           */
68
/*  Description   : Gets valid pre-sei params in decoder struct from parse   */
69
/*                  struct.                                                  */
70
/*  Inputs        : u1_nal_unit_type slice type                              */
71
/*                  ps_dec    Decoder parameters                             */
72
/*  Globals       : None                                                     */
73
/*  Outputs       : None                                                     */
74
/*  Returns       : None                                                     */
75
/*                                                                           */
76
/*  Issues        : None                                                     */
77
/*                                                                           */
78
/*  Revision History:                                                        */
79
/*                                                                           */
80
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
81
/*                                          Draft                            */
82
/*                                                                           */
83
/*****************************************************************************/
84
85
void ih264d_get_pre_sei_params(dec_struct_t *ps_dec, UWORD8 u1_nal_unit_type)
86
278k
{
87
278k
    if((NULL != ps_dec->ps_sei) &&
88
278k
        ((0 == ps_dec->ps_sei->s_sei_ccv_params.u1_ccv_cancel_flag) &&
89
278k
        (0 == ps_dec->ps_sei->s_sei_ccv_params.u1_ccv_persistence_flag)))
90
277k
    {
91
277k
        ps_dec->ps_sei->u1_sei_ccv_params_present_flag = 0;
92
277k
        memset(&ps_dec->ps_sei->s_sei_ccv_params, 0, sizeof(sei_ccv_params_t));
93
277k
    }
94
95
278k
    if((NULL != ps_dec->ps_cur_sps) &&
96
278k
        ((1 == ps_dec->ps_cur_sps->u1_vui_parameters_present_flag) &&
97
250k
        ((2 != ps_dec->ps_cur_sps->s_vui.u1_colour_primaries) &&
98
70.6k
        (2 != ps_dec->ps_cur_sps->s_vui.u1_matrix_coeffs) &&
99
70.6k
        (2 != ps_dec->ps_cur_sps->s_vui.u1_tfr_chars) &&
100
70.6k
        (4 != ps_dec->ps_cur_sps->s_vui.u1_tfr_chars) &&
101
70.6k
        (5 != ps_dec->ps_cur_sps->s_vui.u1_tfr_chars))))
102
7.37k
    {
103
7.37k
        if((1 == ps_dec->ps_sei_parse->u1_sei_ccv_params_present_flag) ||
104
7.37k
            (IDR_SLICE_NAL == u1_nal_unit_type))
105
2.88k
        {
106
2.88k
            ps_dec->ps_sei->u1_sei_ccv_params_present_flag =
107
2.88k
                        ps_dec->ps_sei_parse->u1_sei_ccv_params_present_flag;
108
2.88k
            ps_dec->ps_sei->s_sei_ccv_params = ps_dec->ps_sei_parse->s_sei_ccv_params;
109
2.88k
        }
110
7.37k
    }
111
271k
    else
112
271k
    {
113
271k
        ps_dec->ps_sei->u1_sei_ccv_params_present_flag = 0;
114
271k
        memset(&ps_dec->ps_sei->s_sei_ccv_params, 0, sizeof(sei_ccv_params_t));
115
271k
    }
116
117
278k
    if(IDR_SLICE_NAL == u1_nal_unit_type)
118
149k
    {
119
149k
        ps_dec->ps_sei->u1_sei_mdcv_params_present_flag =
120
149k
                        ps_dec->ps_sei_parse->u1_sei_mdcv_params_present_flag;
121
149k
        ps_dec->ps_sei->s_sei_mdcv_params = ps_dec->ps_sei_parse->s_sei_mdcv_params;
122
149k
        ps_dec->ps_sei->u1_sei_cll_params_present_flag =
123
149k
                        ps_dec->ps_sei_parse->u1_sei_cll_params_present_flag;
124
149k
        ps_dec->ps_sei->s_sei_cll_params = ps_dec->ps_sei_parse->s_sei_cll_params;
125
149k
        ps_dec->ps_sei->u1_sei_ave_params_present_flag =
126
149k
                        ps_dec->ps_sei_parse->u1_sei_ave_params_present_flag;
127
149k
        ps_dec->ps_sei->s_sei_ave_params = ps_dec->ps_sei_parse->s_sei_ave_params;
128
149k
        ps_dec->ps_sei->u1_sei_sii_params_present_flag =
129
149k
            ps_dec->ps_sei_parse->u1_sei_sii_params_present_flag;
130
149k
        ps_dec->ps_sei->s_sei_sii_params = ps_dec->ps_sei_parse->s_sei_sii_params;
131
149k
    }
132
133
278k
    if(NULL != ps_dec->ps_sei)
134
278k
    {
135
278k
        ps_dec->ps_sei->u1_sei_fgc_params_present_flag =
136
278k
            ps_dec->ps_sei_parse->u1_sei_fgc_params_present_flag;
137
278k
        ps_dec->ps_sei->s_sei_fgc_params = ps_dec->ps_sei_parse->s_sei_fgc_params;
138
278k
    }
139
140
278k
    ps_dec->ps_sei_parse->u1_sei_mdcv_params_present_flag = 0;
141
278k
    memset(&ps_dec->ps_sei_parse->s_sei_mdcv_params, 0, sizeof(sei_mdcv_params_t));
142
278k
    ps_dec->ps_sei_parse->u1_sei_cll_params_present_flag = 0;
143
278k
    memset(&ps_dec->ps_sei_parse->s_sei_cll_params, 0, sizeof(sei_cll_params_t));
144
278k
    ps_dec->ps_sei_parse->u1_sei_ave_params_present_flag = 0;
145
278k
    memset(&ps_dec->ps_sei_parse->s_sei_ave_params, 0, sizeof(sei_ave_params_t));
146
278k
    ps_dec->ps_sei_parse->u1_sei_ccv_params_present_flag = 0;
147
278k
    memset(&ps_dec->ps_sei_parse->s_sei_ccv_params, 0, sizeof(sei_ccv_params_t));
148
278k
    ps_dec->ps_sei_parse->u1_sei_sii_params_present_flag = 0;
149
278k
    memset(&ps_dec->ps_sei_parse->s_sei_sii_params, 0, sizeof(sei_sii_params_t));
150
278k
}
151
152
/*****************************************************************************/
153
/*                                                                           */
154
/*  Function Name : ih264d_parse_slice_partition                                     */
155
/*                                                                           */
156
/*  Description   : This function is intended to parse and decode slice part */
157
/*                  itions. Currently it's not implemented. Decoder will     */
158
/*                  print a message, skips this NAL and continues            */
159
/*  Inputs        : ps_dec    Decoder parameters                             */
160
/*                  ps_bitstrm    Bitstream                                */
161
/*  Globals       : None                                                     */
162
/*  Processing    : This functionality needs to be implemented               */
163
/*  Outputs       : None                                                     */
164
/*  Returns       : None                                                     */
165
/*                                                                           */
166
/*  Issues        : Not implemented                                          */
167
/*                                                                           */
168
/*  Revision History:                                                        */
169
/*                                                                           */
170
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
171
/*         06 05 2002   NS              Draft                                */
172
/*                                                                           */
173
/*****************************************************************************/
174
175
WORD32 ih264d_parse_slice_partition(dec_struct_t * ps_dec,
176
                                    dec_bit_stream_t * ps_bitstrm)
177
1.59k
{
178
1.59k
    H264_DEC_DEBUG_PRINT("\nSlice partition not supported");
179
1.59k
    UNUSED(ps_dec);
180
1.59k
    UNUSED(ps_bitstrm);
181
1.59k
    return (0);
182
1.59k
}
183
184
/*****************************************************************************/
185
/*                                                                           */
186
/*  Function Name : ih264d_parse_sei                                                */
187
/*                                                                           */
188
/*  Description   : This function is intended to parse and decode SEI        */
189
/*                  Currently it's not implemented. Decoder will print a     */
190
/*                  message, skips this NAL and continues                    */
191
/*  Inputs        : ps_dec    Decoder parameters                       */
192
/*                  ps_bitstrm    Bitstream                                */
193
/*  Globals       : None                                                     */
194
/*  Processing    : This functionality needs to be implemented               */
195
/*  Outputs       : None                                                     */
196
/*  Returns       : None                                                     */
197
/*                                                                           */
198
/*  Issues        : Not implemented                                          */
199
/*                                                                           */
200
/*  Revision History:                                                        */
201
/*                                                                           */
202
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
203
/*         06 05 2002   NS              Draft                                */
204
/*                                                                           */
205
/*****************************************************************************/
206
WORD32 ih264d_parse_sei(dec_struct_t * ps_dec, dec_bit_stream_t * ps_bitstrm)
207
4.97k
{
208
4.97k
    UNUSED(ps_dec);
209
4.97k
    UNUSED(ps_bitstrm);
210
4.97k
    return (0);
211
4.97k
}
212
213
/*****************************************************************************/
214
/*                                                                           */
215
/*  Function Name : ih264d_parse_filler_data                                          */
216
/*                                                                           */
217
/*  Description   : This function is intended to parse and decode filler     */
218
/*                  data NAL. Currently it's not implemented. Decoder will   */
219
/*                  print a message, skips this NAL and continues            */
220
/*  Inputs        : ps_dec    Decoder parameters                       */
221
/*                  ps_bitstrm    Bitstream                                */
222
/*  Globals       : None                                                     */
223
/*  Processing    : This functionality needs to be implemented               */
224
/*  Outputs       : None                                                     */
225
/*  Returns       : None                                                     */
226
/*                                                                           */
227
/*  Issues        : Not implemented                                          */
228
/*                                                                           */
229
/*  Revision History:                                                        */
230
/*                                                                           */
231
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
232
/*         06 05 2002   NS              Draft                                */
233
/*                                                                           */
234
/*****************************************************************************/
235
WORD32 ih264d_parse_filler_data(dec_struct_t * ps_dec,
236
                                dec_bit_stream_t * ps_bitstrm)
237
3.60k
{
238
3.60k
    UNUSED(ps_dec);
239
3.60k
    UNUSED(ps_bitstrm);
240
3.60k
    return (0);
241
3.60k
}
242
243
/*****************************************************************************/
244
/*                                                                           */
245
/*  Function Name : ih264d_parse_end_of_stream                                        */
246
/*                                                                           */
247
/*  Description   : This function is intended to parse and decode end of     */
248
/*                  sequence. Currently it's not implemented. Decoder will   */
249
/*                  print a message, skips this NAL and continues            */
250
/*  Inputs        : ps_dec    Decoder parameters                       */
251
/*  Globals       : None                                                     */
252
/*  Processing    : This functionality needs to be implemented               */
253
/*  Outputs       : None                                                     */
254
/*  Returns       : None                                                     */
255
/*                                                                           */
256
/*  Issues        : Not implemented                                          */
257
/*                                                                           */
258
/*  Revision History:                                                        */
259
/*                                                                           */
260
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
261
/*         06 05 2002   NS              Draft                                */
262
/*                                                                           */
263
/*****************************************************************************/
264
void ih264d_parse_end_of_stream(dec_struct_t * ps_dec)
265
1.08k
{
266
1.08k
    UNUSED(ps_dec);
267
1.08k
    return;
268
1.08k
}
269
270
/*!
271
 **************************************************************************
272
 * \if Function name : ih264d_parse_pps \endif
273
 *
274
 * \brief
275
 *    Decodes Picture Parameter set
276
 *
277
 * \return
278
 *    0 on Success and Error code otherwise
279
 **************************************************************************
280
 */
281
WORD32 ih264d_parse_pps(dec_struct_t * ps_dec, dec_bit_stream_t * ps_bitstrm)
282
61.8k
{
283
61.8k
    UWORD8 uc_temp;
284
61.8k
    dec_seq_params_t * ps_sps = NULL;
285
61.8k
    dec_pic_params_t * ps_pps = NULL;
286
61.8k
    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
287
61.8k
    UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
288
289
    /* Variables used for error resilience checks */
290
61.8k
    UWORD64 u8_temp;
291
61.8k
    UWORD32 u4_temp;
292
61.8k
    WORD32 i_temp;
293
294
    /* For High profile related syntax elements */
295
61.8k
    UWORD8 u1_more_data_flag;
296
61.8k
    WORD32 i4_i;
297
298
61.8k
    if(!(ps_dec->i4_header_decoded & 1))
299
3.61k
        return ERROR_INV_SPS_PPS_T;
300
301
    /*--------------------------------------------------------------------*/
302
    /* Decode pic_parameter_set_id and find corresponding pic params      */
303
    /*--------------------------------------------------------------------*/
304
58.2k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
305
58.2k
    if(u4_temp & MASK_ERR_PIC_SET_ID)
306
688
        return ERROR_INV_SPS_PPS_T;
307
57.5k
    ps_pps = ps_dec->pv_scratch_sps_pps;
308
57.5k
    *ps_pps = ps_dec->ps_pps[u4_temp];
309
57.5k
    ps_pps->u1_pic_parameter_set_id = (WORD8)u4_temp;
310
57.5k
    COPYTHECONTEXT("PPS: pic_parameter_set_id",ps_pps->u1_pic_parameter_set_id);
311
312
    /************************************************/
313
    /* initilization of High profile syntax element */
314
    /************************************************/
315
57.5k
    ps_pps->i4_transform_8x8_mode_flag = 0;
316
57.5k
    ps_pps->i4_pic_scaling_matrix_present_flag = 0;
317
318
    /*--------------------------------------------------------------------*/
319
    /* Decode seq_parameter_set_id and map it to a seq_parameter_set      */
320
    /*--------------------------------------------------------------------*/
321
57.5k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
322
57.5k
    if(u4_temp & MASK_ERR_SEQ_SET_ID)
323
80
        return ERROR_INV_SPS_PPS_T;
324
57.5k
    COPYTHECONTEXT("PPS: seq_parameter_set_id",u4_temp);
325
57.5k
    ps_sps = &ps_dec->ps_sps[u4_temp];
326
327
57.5k
    if(FALSE == ps_sps->u1_is_valid)
328
1.09k
        return ERROR_INV_SPS_PPS_T;
329
56.4k
    ps_pps->ps_sps = ps_sps;
330
331
    /*--------------------------------------------------------------------*/
332
    /* Decode entropy_coding_mode                                         */
333
    /*--------------------------------------------------------------------*/
334
56.4k
    ps_pps->u1_entropy_coding_mode = ih264d_get_bit_h264(ps_bitstrm);
335
56.4k
    COPYTHECONTEXT("PPS: entropy_coding_mode_flag",ps_pps->u1_entropy_coding_mode);
336
337
56.4k
    ps_pps->u1_pic_order_present_flag = ih264d_get_bit_h264(ps_bitstrm);
338
56.4k
    COPYTHECONTEXT("PPS: pic_order_present_flag",ps_pps->u1_pic_order_present_flag);
339
340
    /*--------------------------------------------------------------------*/
341
    /* Decode num_slice_groups_minus1                                     */
342
    /*--------------------------------------------------------------------*/
343
56.4k
    u8_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64)1;
344
56.4k
    if(u8_temp != 1)
345
164
    {
346
164
        return ERROR_FEATURE_UNAVAIL;
347
164
    }
348
56.2k
    ps_pps->u1_num_slice_groups = u8_temp;
349
56.2k
    COPYTHECONTEXT("PPS: num_slice_groups_minus1",ps_pps->u1_num_slice_groups -1);
350
351
    /*--------------------------------------------------------------------*/
352
    /* Other parameter set values                                         */
353
    /*--------------------------------------------------------------------*/
354
56.2k
    u8_temp = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
355
56.2k
    if(u8_temp > H264_MAX_REF_IDX)
356
63
        return ERROR_REF_IDX;
357
56.1k
    ps_pps->u1_num_ref_idx_lx_active[0] = u8_temp;
358
56.1k
    COPYTHECONTEXT("PPS: num_ref_idx_l0_active_minus1",
359
56.1k
                    ps_pps->u1_num_ref_idx_lx_active[0] - 1);
360
361
56.1k
    u8_temp = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
362
56.1k
    if(u8_temp > H264_MAX_REF_IDX)
363
176
        return ERROR_REF_IDX;
364
56.0k
    ps_pps->u1_num_ref_idx_lx_active[1] = u8_temp;
365
56.0k
    COPYTHECONTEXT("PPS: num_ref_idx_l1_active_minus1",
366
56.0k
                    ps_pps->u1_num_ref_idx_lx_active[1] - 1);
367
368
56.0k
    ps_pps->u1_wted_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
369
56.0k
    COPYTHECONTEXT("PPS: weighted prediction u4_flag",ps_pps->u1_wted_pred_flag);
370
56.0k
    uc_temp = ih264d_get_bits_h264(ps_bitstrm, 2);
371
56.0k
    COPYTHECONTEXT("PPS: weighted_bipred_idc",uc_temp);
372
56.0k
    ps_pps->u1_wted_bipred_idc = uc_temp;
373
374
56.0k
    if(ps_pps->u1_wted_bipred_idc > MAX_WEIGHT_BIPRED_IDC)
375
283
        return ERROR_INV_SPS_PPS_T;
376
55.7k
    {
377
55.7k
        WORD64 i8_temp;
378
55.7k
        i8_temp = (WORD64)26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
379
380
55.7k
        if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
381
736
            return ERROR_INV_RANGE_QP_T;
382
383
54.9k
        ps_pps->u1_pic_init_qp = i8_temp;
384
54.9k
        COPYTHECONTEXT("PPS: pic_init_qp_minus26",ps_pps->u1_pic_init_qp - 26);
385
386
54.9k
        i8_temp = (WORD64)26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
387
388
54.9k
        if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
389
412
            return ERROR_INV_RANGE_QP_T;
390
391
54.5k
        ps_pps->u1_pic_init_qs = i8_temp;
392
54.5k
        COPYTHECONTEXT("PPS: pic_init_qs_minus26",ps_pps->u1_pic_init_qs - 26);
393
54.5k
    }
394
395
0
    i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
396
54.5k
    if((i_temp < -12) || (i_temp > 12))
397
487
        return ERROR_INV_RANGE_QP_T;
398
54.0k
    ps_pps->i1_chroma_qp_index_offset = i_temp;
399
54.0k
    COPYTHECONTEXT("PPS: chroma_qp_index_offset",ps_pps->i1_chroma_qp_index_offset);
400
401
    /***************************************************************************/
402
    /* initialize second_chroma_qp_index_offset to i1_chroma_qp_index_offset if */
403
    /* second_chroma_qp_index_offset is not present in bit-ps_bitstrm              */
404
    /***************************************************************************/
405
54.0k
    ps_pps->i1_second_chroma_qp_index_offset =
406
54.0k
                    ps_pps->i1_chroma_qp_index_offset;
407
408
54.0k
    ps_pps->u1_deblocking_filter_parameters_present_flag = ih264d_get_bit_h264(
409
54.0k
                    ps_bitstrm);
410
54.0k
    COPYTHECONTEXT("PPS: deblocking_filter_control_present_flag",
411
54.0k
                    ps_pps->u1_deblocking_filter_parameters_present_flag);
412
54.0k
    ps_pps->u1_constrained_intra_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
413
54.0k
    COPYTHECONTEXT("PPS: constrained_intra_pred_flag",
414
54.0k
                    ps_pps->u1_constrained_intra_pred_flag);
415
54.0k
    ps_pps->u1_redundant_pic_cnt_present_flag = ih264d_get_bit_h264(ps_bitstrm);
416
54.0k
    COPYTHECONTEXT("PPS: redundant_pic_cnt_present_flag",
417
54.0k
                    ps_pps->u1_redundant_pic_cnt_present_flag);
418
419
    /* High profile related syntax elements */
420
54.0k
    u1_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
421
54.0k
    if(u1_more_data_flag && (ps_pps->ps_sps->u1_profile_idc == HIGH_PROFILE_IDC))
422
15.6k
    {
423
        /* read transform_8x8_mode_flag  */
424
15.6k
        ps_pps->i4_transform_8x8_mode_flag = (WORD32)ih264d_get_bit_h264(
425
15.6k
                        ps_bitstrm);
426
427
        /* read pic_scaling_matrix_present_flag */
428
15.6k
        ps_pps->i4_pic_scaling_matrix_present_flag =
429
15.6k
                        (WORD32)ih264d_get_bit_h264(ps_bitstrm);
430
431
15.6k
        if(ps_pps->i4_pic_scaling_matrix_present_flag)
432
2.29k
        {
433
            /* read the scaling matrices */
434
17.0k
            for(i4_i = 0; i4_i < (6 + (ps_pps->i4_transform_8x8_mode_flag << 1)); i4_i++)
435
15.2k
            {
436
15.2k
                ps_pps->u1_pic_scaling_list_present_flag[i4_i] =
437
15.2k
                                ih264d_get_bit_h264(ps_bitstrm);
438
439
15.2k
                if(ps_pps->u1_pic_scaling_list_present_flag[i4_i])
440
7.56k
                {
441
7.56k
                    WORD32 ret;
442
7.56k
                    if(i4_i < 6)
443
6.46k
                    {
444
6.46k
                        ret = ih264d_scaling_list(
445
6.46k
                                        ps_pps->i2_pic_scalinglist4x4[i4_i],
446
6.46k
                                        16,
447
6.46k
                                        &ps_pps->u1_pic_use_default_scaling_matrix_flag[i4_i],
448
6.46k
                                        ps_bitstrm);
449
6.46k
                    }
450
1.10k
                    else
451
1.10k
                    {
452
1.10k
                        ret = ih264d_scaling_list(
453
1.10k
                                        ps_pps->i2_pic_scalinglist8x8[i4_i - 6],
454
1.10k
                                        64,
455
1.10k
                                        &ps_pps->u1_pic_use_default_scaling_matrix_flag[i4_i],
456
1.10k
                                        ps_bitstrm);
457
1.10k
                    }
458
459
7.56k
                    if(ret != OK)
460
482
                    {
461
482
                        return ret;
462
482
                    }
463
7.56k
                }
464
15.2k
            }
465
2.29k
        }
466
467
        /* read second_chroma_qp_index_offset syntax element */
468
15.1k
        i_temp = ih264d_sev(
469
15.1k
                        pu4_bitstrm_ofst, pu4_bitstrm_buf);
470
471
15.1k
        if((i_temp < -12) || (i_temp > 12))
472
1.00k
            return ERROR_INV_RANGE_QP_T;
473
474
14.1k
        ps_pps->i1_second_chroma_qp_index_offset = i_temp;
475
14.1k
    }
476
477
    /* In case bitstream read has exceeded the filled size, then
478
       return an error */
479
52.6k
    if(EXCEED_OFFSET(ps_bitstrm))
480
186
    {
481
186
        return ERROR_INV_SPS_PPS_T;
482
186
    }
483
52.4k
    ps_pps->u1_is_valid = TRUE;
484
52.4k
    ps_dec->ps_pps[ps_pps->u1_pic_parameter_set_id] = *ps_pps;
485
52.4k
    return OK;
486
52.6k
}
487
488
/*!
489
 **************************************************************************
490
 * \if Function name : ih264d_parse_sps \endif
491
 *
492
 * \brief
493
 *    Decodes Sequence parameter set from the bitstream
494
 *
495
 * \return
496
 *    0 on Success and Error code otherwise
497
 **************************************************************************
498
 */
499
UWORD32 ih264d_correct_level_idc(UWORD32 u4_level_idc, UWORD32 u4_total_mbs)
500
187k
{
501
187k
    UWORD32 u4_max_mbs_allowed;
502
503
187k
    switch(u4_level_idc)
504
187k
    {
505
2.86k
        case H264_LEVEL_1_0:
506
2.86k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_10;
507
2.86k
            break;
508
14.7k
        case H264_LEVEL_1_1:
509
14.7k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_11;
510
14.7k
            break;
511
5.51k
        case H264_LEVEL_1_2:
512
5.51k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_12;
513
5.51k
            break;
514
3.90k
        case H264_LEVEL_1_3:
515
3.90k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_13;
516
3.90k
            break;
517
18.8k
        case H264_LEVEL_2_0:
518
18.8k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_20;
519
18.8k
            break;
520
3.48k
        case H264_LEVEL_2_1:
521
3.48k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_21;
522
3.48k
            break;
523
9.19k
        case H264_LEVEL_2_2:
524
9.19k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_22;
525
9.19k
            break;
526
3.13k
        case H264_LEVEL_3_0:
527
3.13k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_30;
528
3.13k
            break;
529
18.7k
        case H264_LEVEL_3_1:
530
18.7k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_31;
531
18.7k
            break;
532
30.2k
        case H264_LEVEL_3_2:
533
30.2k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_32;
534
30.2k
            break;
535
8.44k
        case H264_LEVEL_4_0:
536
8.44k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_40;
537
8.44k
            break;
538
2.15k
        case H264_LEVEL_4_1:
539
2.15k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_41;
540
2.15k
            break;
541
6.83k
        case H264_LEVEL_4_2:
542
6.83k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_42;
543
6.83k
            break;
544
675
        case H264_LEVEL_5_0:
545
675
            u4_max_mbs_allowed = MAX_MBS_LEVEL_50;
546
675
            break;
547
600
        case H264_LEVEL_5_1:
548
58.2k
        default:
549
58.2k
            u4_max_mbs_allowed = MAX_MBS_LEVEL_51;
550
58.2k
            break;
551
552
187k
    }
553
554
    /*correct of the level is incorrect*/
555
187k
    if(u4_total_mbs > u4_max_mbs_allowed)
556
3.93k
    {
557
3.93k
        if(u4_total_mbs > MAX_MBS_LEVEL_50)
558
153
            u4_level_idc = H264_LEVEL_5_1;
559
3.77k
        else if(u4_total_mbs > MAX_MBS_LEVEL_42)
560
206
            u4_level_idc = H264_LEVEL_5_0;
561
3.57k
        else if(u4_total_mbs > MAX_MBS_LEVEL_41)
562
368
            u4_level_idc = H264_LEVEL_4_2;
563
3.20k
        else if(u4_total_mbs > MAX_MBS_LEVEL_40)
564
0
            u4_level_idc = H264_LEVEL_4_1;
565
3.20k
        else if(u4_total_mbs > MAX_MBS_LEVEL_32)
566
232
            u4_level_idc = H264_LEVEL_4_0;
567
2.97k
        else if(u4_total_mbs > MAX_MBS_LEVEL_31)
568
405
            u4_level_idc = H264_LEVEL_3_2;
569
2.56k
        else if(u4_total_mbs > MAX_MBS_LEVEL_30)
570
335
            u4_level_idc = H264_LEVEL_3_1;
571
2.23k
        else if(u4_total_mbs > MAX_MBS_LEVEL_21)
572
501
            u4_level_idc = H264_LEVEL_3_0;
573
1.73k
        else if(u4_total_mbs > MAX_MBS_LEVEL_20)
574
1.09k
            u4_level_idc = H264_LEVEL_2_1;
575
641
        else if(u4_total_mbs > MAX_MBS_LEVEL_10)
576
641
            u4_level_idc = H264_LEVEL_2_0;
577
3.93k
    }
578
579
187k
    return (u4_level_idc);
580
581
187k
}
582
WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
583
89.8k
{
584
89.8k
    UWORD8 i;
585
89.8k
    dec_seq_params_t *ps_seq = NULL;
586
89.8k
    UWORD8 u1_profile_idc, u1_level_idc, u1_seq_parameter_set_id, u1_mb_aff_flag = 0;
587
89.8k
    UWORD32 u4_max_frm_num;
588
89.8k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
589
89.8k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
590
89.8k
    UWORD8 u1_frm, uc_constraint_set0_flag, uc_constraint_set1_flag;
591
89.8k
    WORD32 i4_cropped_ht, i4_cropped_wd;
592
89.8k
    UWORD32 u4_temp;
593
89.8k
    UWORD64 u8_temp;
594
89.8k
    UWORD32 u4_pic_height_in_map_units, u4_pic_width_in_mbs;
595
89.8k
    UWORD32 u2_pic_wd = 0;
596
89.8k
    UWORD32 u2_pic_ht = 0;
597
89.8k
    UWORD32 u2_frm_wd_y = 0;
598
89.8k
    UWORD32 u2_frm_ht_y = 0;
599
89.8k
    UWORD32 u2_frm_wd_uv = 0;
600
89.8k
    UWORD32 u2_frm_ht_uv = 0;
601
89.8k
    UWORD32 u2_crop_offset_y = 0;
602
89.8k
    UWORD32 u2_crop_offset_uv = 0;
603
89.8k
    WORD32 ret;
604
89.8k
    WORD32 num_reorder_frames;
605
    /* High profile related syntax element */
606
89.8k
    WORD32 i4_i;
607
    /* G050 */
608
89.8k
    UWORD8 u1_frame_cropping_flag, u1_frame_cropping_rect_left_ofst,
609
89.8k
                    u1_frame_cropping_rect_right_ofst,
610
89.8k
                    u1_frame_cropping_rect_top_ofst,
611
89.8k
                    u1_frame_cropping_rect_bottom_ofst;
612
    /* G050 */
613
    /*--------------------------------------------------------------------*/
614
    /* Decode seq_parameter_set_id and profile and level values           */
615
    /*--------------------------------------------------------------------*/
616
89.8k
    SWITCHONTRACE;
617
89.8k
    u1_profile_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
618
89.8k
    COPYTHECONTEXT("SPS: profile_idc",u1_profile_idc);
619
620
    /* G050 */
621
89.8k
    uc_constraint_set0_flag = ih264d_get_bit_h264(ps_bitstrm);
622
89.8k
    uc_constraint_set1_flag = ih264d_get_bit_h264(ps_bitstrm);
623
89.8k
    ih264d_get_bit_h264(ps_bitstrm);
624
625
    /*****************************************************/
626
    /* Read 5 bits for uc_constraint_set3_flag (1 bit)   */
627
    /* and reserved_zero_4bits (4 bits) - Sushant        */
628
    /*****************************************************/
629
89.8k
    ih264d_get_bits_h264(ps_bitstrm, 5);
630
    /* G050 */
631
632
    /* Check whether particular profile is suported or not */
633
    /* Check whether particular profile is suported or not */
634
89.8k
    if((u1_profile_idc != MAIN_PROFILE_IDC) &&
635
636
89.8k
    (u1_profile_idc != BASE_PROFILE_IDC) &&
637
638
89.8k
    (u1_profile_idc != HIGH_PROFILE_IDC)
639
640
89.8k
    )
641
12.4k
    {
642
643
        /* Apart from Baseline, main and high profile,
644
         * only extended profile is supported provided
645
         * uc_constraint_set0_flag or uc_constraint_set1_flag are set to 1
646
         */
647
12.4k
        if((u1_profile_idc != EXTENDED_PROFILE_IDC) ||
648
12.4k
           ((uc_constraint_set1_flag != 1) && (uc_constraint_set0_flag != 1)))
649
4.30k
        {
650
4.30k
            return (ERROR_FEATURE_UNAVAIL);
651
4.30k
        }
652
12.4k
    }
653
654
85.5k
    u1_level_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
655
656
657
658
85.5k
    COPYTHECONTEXT("SPS: u4_level_idc",u1_level_idc);
659
660
85.5k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
661
85.5k
    if(u4_temp & MASK_ERR_SEQ_SET_ID)
662
1.12k
        return ERROR_INV_SPS_PPS_T;
663
84.3k
    u1_seq_parameter_set_id = u4_temp;
664
84.3k
    COPYTHECONTEXT("SPS: seq_parameter_set_id",
665
84.3k
                    u1_seq_parameter_set_id);
666
667
    /*--------------------------------------------------------------------*/
668
    /* Find an seq param entry in seqparam array of decStruct             */
669
    /*--------------------------------------------------------------------*/
670
671
84.3k
    ps_seq = ps_dec->pv_scratch_sps_pps;
672
84.3k
    memset(ps_seq, 0, sizeof(dec_seq_params_t));
673
674
84.3k
    if(ps_dec->i4_header_decoded & 1)
675
61.9k
    {
676
61.9k
        *ps_seq = *ps_dec->ps_cur_sps;
677
61.9k
    }
678
679
680
84.3k
    if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_profile_idc != u1_profile_idc))
681
1.74k
    {
682
1.74k
        ps_dec->u1_res_changed = 1;
683
1.74k
        return IVD_RES_CHANGED;
684
1.74k
    }
685
686
82.6k
    if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_level_idc != u1_level_idc))
687
2.15k
    {
688
2.15k
        ps_dec->u1_res_changed = 1;
689
2.15k
        return IVD_RES_CHANGED;
690
2.15k
    }
691
692
80.4k
    ps_seq->u1_profile_idc = u1_profile_idc;
693
80.4k
    ps_seq->u1_level_idc = u1_level_idc;
694
80.4k
    ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id;
695
696
    /*******************************************************************/
697
    /* Initializations for high profile - Sushant                      */
698
    /*******************************************************************/
699
80.4k
    ps_seq->i4_chroma_format_idc = 1;
700
80.4k
    ps_seq->i4_bit_depth_luma_minus8 = 0;
701
80.4k
    ps_seq->i4_bit_depth_chroma_minus8 = 0;
702
80.4k
    ps_seq->i4_qpprime_y_zero_transform_bypass_flag = 0;
703
80.4k
    ps_seq->i4_seq_scaling_matrix_present_flag = 0;
704
80.4k
    if(u1_profile_idc == HIGH_PROFILE_IDC)
705
14.5k
    {
706
707
        /* reading chroma_format_idc   */
708
14.5k
        ps_seq->i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst,
709
14.5k
                                                  pu4_bitstrm_buf);
710
711
        /* Monochrome is not supported */
712
14.5k
        if(ps_seq->i4_chroma_format_idc != 1)
713
445
        {
714
445
            return ERROR_FEATURE_UNAVAIL;
715
445
        }
716
717
        /* reading bit_depth_luma_minus8   */
718
14.0k
        ps_seq->i4_bit_depth_luma_minus8 = ih264d_uev(pu4_bitstrm_ofst,
719
14.0k
                                                      pu4_bitstrm_buf);
720
721
14.0k
        if(ps_seq->i4_bit_depth_luma_minus8 != 0)
722
64
        {
723
64
            return ERROR_FEATURE_UNAVAIL;
724
64
        }
725
726
        /* reading bit_depth_chroma_minus8   */
727
14.0k
        ps_seq->i4_bit_depth_chroma_minus8 = ih264d_uev(pu4_bitstrm_ofst,
728
14.0k
                                                        pu4_bitstrm_buf);
729
730
14.0k
        if(ps_seq->i4_bit_depth_chroma_minus8 != 0)
731
108
        {
732
108
            return ERROR_FEATURE_UNAVAIL;
733
108
        }
734
735
        /* reading qpprime_y_zero_transform_bypass_flag   */
736
13.9k
        ps_seq->i4_qpprime_y_zero_transform_bypass_flag =
737
13.9k
                        (WORD32)ih264d_get_bit_h264(ps_bitstrm);
738
739
13.9k
        if(ps_seq->i4_qpprime_y_zero_transform_bypass_flag != 0)
740
208
        {
741
208
            return ERROR_INV_SPS_PPS_T;
742
208
        }
743
744
        /* reading seq_scaling_matrix_present_flag   */
745
13.6k
        ps_seq->i4_seq_scaling_matrix_present_flag =
746
13.6k
                        (WORD32)ih264d_get_bit_h264(ps_bitstrm);
747
748
13.6k
        if(ps_seq->i4_seq_scaling_matrix_present_flag)
749
2.92k
        {
750
23.7k
            for(i4_i = 0; i4_i < 8; i4_i++)
751
21.4k
            {
752
21.4k
                ps_seq->u1_seq_scaling_list_present_flag[i4_i] =
753
21.4k
                                ih264d_get_bit_h264(ps_bitstrm);
754
755
                /* initialize u1_use_default_scaling_matrix_flag[i4_i] to zero */
756
                /* before calling scaling list                             */
757
21.4k
                ps_seq->u1_use_default_scaling_matrix_flag[i4_i] = 0;
758
759
21.4k
                if(ps_seq->u1_seq_scaling_list_present_flag[i4_i])
760
10.5k
                {
761
10.5k
                    if(i4_i < 6)
762
8.90k
                    {
763
8.90k
                        ret = ih264d_scaling_list(
764
8.90k
                                        ps_seq->i2_scalinglist4x4[i4_i],
765
8.90k
                                        16,
766
8.90k
                                        &ps_seq->u1_use_default_scaling_matrix_flag[i4_i],
767
8.90k
                                        ps_bitstrm);
768
8.90k
                    }
769
1.65k
                    else
770
1.65k
                    {
771
1.65k
                        ret = ih264d_scaling_list(
772
1.65k
                                        ps_seq->i2_scalinglist8x8[i4_i - 6],
773
1.65k
                                        64,
774
1.65k
                                        &ps_seq->u1_use_default_scaling_matrix_flag[i4_i],
775
1.65k
                                        ps_bitstrm);
776
1.65k
                    }
777
10.5k
                    if(ret != OK)
778
555
                    {
779
555
                        return ret;
780
555
                    }
781
10.5k
                }
782
21.4k
            }
783
2.92k
        }
784
13.6k
    }
785
    /*--------------------------------------------------------------------*/
786
    /* Decode MaxFrameNum                                                 */
787
    /*--------------------------------------------------------------------*/
788
79.1k
    u8_temp = (UWORD64)4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
789
79.1k
    if(u8_temp > MAX_BITS_IN_FRAME_NUM)
790
321
    {
791
321
        return ERROR_INV_SPS_PPS_T;
792
321
    }
793
78.7k
    ps_seq->u1_bits_in_frm_num = u8_temp;
794
78.7k
    COPYTHECONTEXT("SPS: log2_max_frame_num_minus4",
795
78.7k
                    (ps_seq->u1_bits_in_frm_num - 4));
796
797
78.7k
    u4_max_frm_num = (1 << (ps_seq->u1_bits_in_frm_num));
798
78.7k
    ps_seq->u2_u4_max_pic_num_minus1 = u4_max_frm_num - 1;
799
    /*--------------------------------------------------------------------*/
800
    /* Decode picture order count and related values                      */
801
    /*--------------------------------------------------------------------*/
802
78.7k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
803
804
78.7k
    if(u4_temp > MAX_PIC_ORDER_CNT_TYPE)
805
248
    {
806
248
        return ERROR_INV_POC_TYPE_T;
807
248
    }
808
78.5k
    ps_seq->u1_pic_order_cnt_type = u4_temp;
809
78.5k
    COPYTHECONTEXT("SPS: pic_order_cnt_type",ps_seq->u1_pic_order_cnt_type);
810
811
78.5k
    ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = 1;
812
78.5k
    if(ps_seq->u1_pic_order_cnt_type == 0)
813
36.3k
    {
814
36.3k
        u8_temp = (UWORD64)4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
815
36.3k
        if(u8_temp > MAX_BITS_IN_POC_LSB)
816
83
        {
817
83
            return ERROR_INV_SPS_PPS_T;
818
83
        }
819
36.2k
        ps_seq->u1_log2_max_pic_order_cnt_lsb_minus = u8_temp;
820
36.2k
        ps_seq->i4_max_pic_order_cntLsb = (1 << u8_temp);
821
36.2k
        COPYTHECONTEXT("SPS: log2_max_pic_order_cnt_lsb_minus4",(u8_temp - 4));
822
36.2k
    }
823
42.1k
    else if(ps_seq->u1_pic_order_cnt_type == 1)
824
20.0k
    {
825
20.0k
        ps_seq->u1_delta_pic_order_always_zero_flag = ih264d_get_bit_h264(
826
20.0k
                        ps_bitstrm);
827
20.0k
        COPYTHECONTEXT("SPS: delta_pic_order_always_zero_flag",
828
20.0k
                        ps_seq->u1_delta_pic_order_always_zero_flag);
829
830
20.0k
        ps_seq->i4_ofst_for_non_ref_pic = ih264d_sev(pu4_bitstrm_ofst,
831
20.0k
                                                     pu4_bitstrm_buf);
832
20.0k
        COPYTHECONTEXT("SPS: offset_for_non_ref_pic",
833
20.0k
                        ps_seq->i4_ofst_for_non_ref_pic);
834
835
20.0k
        ps_seq->i4_ofst_for_top_to_bottom_field = ih264d_sev(
836
20.0k
                        pu4_bitstrm_ofst, pu4_bitstrm_buf);
837
20.0k
        COPYTHECONTEXT("SPS: offset_for_top_to_bottom_field",
838
20.0k
                        ps_seq->i4_ofst_for_top_to_bottom_field);
839
840
20.0k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
841
20.0k
        if(u4_temp > 255)
842
119
            return ERROR_INV_SPS_PPS_T;
843
19.9k
        ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = u4_temp;
844
19.9k
        COPYTHECONTEXT("SPS: num_ref_frames_in_pic_order_cnt_cycle",
845
19.9k
                        ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle);
846
847
112k
        for(i = 0; i < ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
848
92.2k
        {
849
92.2k
            ps_seq->i4_ofst_for_ref_frame[i] = ih264d_sev(
850
92.2k
                            pu4_bitstrm_ofst, pu4_bitstrm_buf);
851
92.2k
            COPYTHECONTEXT("SPS: offset_for_ref_frame",
852
92.2k
                            ps_seq->i4_ofst_for_ref_frame[i]);
853
92.2k
        }
854
19.9k
    }
855
856
78.3k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
857
858
78.3k
    if((u4_temp > H264_MAX_REF_PICS))
859
437
    {
860
437
        return ERROR_NUM_REF;
861
437
    }
862
863
    /* Compare with older num_ref_frames is header is already once */
864
77.9k
    if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_num_ref_frames != u4_temp))
865
857
    {
866
857
        ps_dec->u1_res_changed = 1;
867
857
        return IVD_RES_CHANGED;
868
857
    }
869
870
77.0k
    ps_seq->u1_num_ref_frames = u4_temp;
871
77.0k
    COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames);
872
873
77.0k
    ps_seq->u1_gaps_in_frame_num_value_allowed_flag = ih264d_get_bit_h264(
874
77.0k
                    ps_bitstrm);
875
77.0k
    COPYTHECONTEXT("SPS: gaps_in_frame_num_value_allowed_flag",
876
77.0k
                    ps_seq->u1_gaps_in_frame_num_value_allowed_flag);
877
878
    /*--------------------------------------------------------------------*/
879
    /* Decode FrameWidth and FrameHeight and related values               */
880
    /*--------------------------------------------------------------------*/
881
77.0k
    u8_temp = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
882
    /* Check  for unsupported resolutions*/
883
77.0k
    if(u8_temp > (H264_MAX_FRAME_WIDTH >> 4))
884
126
    {
885
126
        return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
886
126
    }
887
76.9k
    u4_pic_width_in_mbs = u8_temp;
888
76.9k
    COPYTHECONTEXT("SPS: pic_width_in_mbs_minus1",
889
76.9k
                   u4_pic_width_in_mbs - 1);
890
891
76.9k
    u8_temp = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
892
76.9k
    if (u8_temp > (H264_MAX_FRAME_HEIGHT >> 4))
893
262
    {
894
262
        return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
895
262
    }
896
76.6k
    u4_pic_height_in_map_units = u8_temp;
897
898
76.6k
    ps_seq->u2_frm_wd_in_mbs = u4_pic_width_in_mbs;
899
76.6k
    ps_seq->u2_frm_ht_in_mbs = u4_pic_height_in_map_units;
900
901
76.6k
    u2_pic_wd = (u4_pic_width_in_mbs << 4);
902
76.6k
    u2_pic_ht = (u4_pic_height_in_map_units << 4);
903
    /*--------------------------------------------------------------------*/
904
    /* Get the value of MaxMbAddress and Number of bits needed for it     */
905
    /*--------------------------------------------------------------------*/
906
76.6k
    ps_seq->u2_max_mb_addr = (ps_seq->u2_frm_wd_in_mbs
907
76.6k
                    * ps_seq->u2_frm_ht_in_mbs) - 1;
908
909
76.6k
    ps_seq->u2_total_num_of_mbs = ps_seq->u2_max_mb_addr + 1;
910
911
76.6k
    ps_seq->u1_level_idc = ih264d_correct_level_idc(
912
76.6k
                    u1_level_idc, ps_seq->u2_total_num_of_mbs);
913
914
76.6k
    u1_frm = ih264d_get_bit_h264(ps_bitstrm);
915
76.6k
    if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_frame_mbs_only_flag != u1_frm))
916
417
    {
917
417
        ps_dec->u1_res_changed = 1;
918
417
        return IVD_RES_CHANGED;
919
417
    }
920
921
76.2k
    ps_seq->u1_frame_mbs_only_flag = u1_frm;
922
923
76.2k
    COPYTHECONTEXT("SPS: frame_mbs_only_flag", u1_frm);
924
925
76.2k
    if(!u1_frm)
926
15.7k
        u1_mb_aff_flag = ih264d_get_bit_h264(ps_bitstrm);
927
928
76.2k
    if((ps_dec->i4_header_decoded & 1)
929
76.2k
                    && (ps_seq->u1_mb_aff_flag != u1_mb_aff_flag))
930
206
    {
931
206
        ps_dec->u1_res_changed = 1;
932
206
        return IVD_RES_CHANGED;
933
206
    }
934
935
76.0k
    if(!u1_frm)
936
15.5k
    {
937
15.5k
        u2_pic_ht <<= 1;
938
15.5k
        ps_seq->u1_mb_aff_flag = u1_mb_aff_flag;
939
15.5k
        COPYTHECONTEXT("SPS: mb_adaptive_frame_field_flag",
940
15.5k
                        ps_seq->u1_mb_aff_flag);
941
942
15.5k
    }
943
60.4k
    else
944
60.4k
        ps_seq->u1_mb_aff_flag = 0;
945
946
76.0k
    ps_seq->u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
947
948
76.0k
    COPYTHECONTEXT("SPS: direct_8x8_inference_flag",
949
76.0k
                    ps_seq->u1_direct_8x8_inference_flag);
950
951
    /* G050 */
952
76.0k
    u1_frame_cropping_flag = ih264d_get_bit_h264(ps_bitstrm);
953
76.0k
    COPYTHECONTEXT("SPS: frame_cropping_flag",u1_frame_cropping_flag);
954
955
76.0k
    if(u1_frame_cropping_flag)
956
24.8k
    {
957
24.8k
        u1_frame_cropping_rect_left_ofst = ih264d_uev(pu4_bitstrm_ofst,
958
24.8k
                                                      pu4_bitstrm_buf);
959
24.8k
        COPYTHECONTEXT("SPS: frame_cropping_rect_left_offset",
960
24.8k
                        u1_frame_cropping_rect_left_ofst);
961
24.8k
        u1_frame_cropping_rect_right_ofst = ih264d_uev(pu4_bitstrm_ofst,
962
24.8k
                                                       pu4_bitstrm_buf);
963
24.8k
        COPYTHECONTEXT("SPS: frame_cropping_rect_right_offset",
964
24.8k
                        u1_frame_cropping_rect_right_ofst);
965
24.8k
        u1_frame_cropping_rect_top_ofst = ih264d_uev(pu4_bitstrm_ofst,
966
24.8k
                                                     pu4_bitstrm_buf);
967
24.8k
        COPYTHECONTEXT("SPS: frame_cropping_rect_top_offset",
968
24.8k
                        u1_frame_cropping_rect_top_ofst);
969
24.8k
        u1_frame_cropping_rect_bottom_ofst = ih264d_uev(pu4_bitstrm_ofst,
970
24.8k
                                                        pu4_bitstrm_buf);
971
24.8k
        COPYTHECONTEXT("SPS: frame_cropping_rect_bottom_offset",
972
24.8k
                        u1_frame_cropping_rect_bottom_ofst);
973
24.8k
    }
974
    /* G050 */
975
976
76.0k
    ps_seq->u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
977
76.0k
    COPYTHECONTEXT("SPS: vui_parameters_present_flag",
978
76.0k
                    ps_seq->u1_vui_parameters_present_flag);
979
980
76.0k
    u2_frm_wd_y = u2_pic_wd + (UWORD8)(PAD_LEN_Y_H << 1);
981
76.0k
    if(1 == ps_dec->u4_share_disp_buf)
982
0
    {
983
0
        if(ps_dec->u4_app_disp_width > u2_frm_wd_y)
984
0
            u2_frm_wd_y = ps_dec->u4_app_disp_width;
985
0
    }
986
987
76.0k
    u2_frm_ht_y = u2_pic_ht + (UWORD8)(PAD_LEN_Y_V << 2);
988
76.0k
    u2_frm_wd_uv = u2_pic_wd + (UWORD8)(PAD_LEN_UV_H << 2);
989
76.0k
    u2_frm_wd_uv = MAX(u2_frm_wd_uv, u2_frm_wd_y);
990
991
76.0k
    u2_frm_ht_uv = (u2_pic_ht >> 1) + (UWORD8)(PAD_LEN_UV_V << 2);
992
76.0k
    u2_frm_ht_uv = MAX(u2_frm_ht_uv, (u2_frm_ht_y >> 1));
993
994
995
    /* Calculate display picture width, height and start u4_ofst from YUV420 */
996
    /* pictute buffers as per cropping information parsed above             */
997
76.0k
    {
998
76.0k
        UWORD16 u2_rgt_ofst = 0;
999
76.0k
        UWORD16 u2_lft_ofst = 0;
1000
76.0k
        UWORD16 u2_top_ofst = 0;
1001
76.0k
        UWORD16 u2_btm_ofst = 0;
1002
76.0k
        UWORD8 u1_frm_mbs_flag;
1003
76.0k
        UWORD8 u1_vert_mult_factor;
1004
1005
76.0k
        if(u1_frame_cropping_flag)
1006
24.8k
        {
1007
            /* Calculate right and left u4_ofst for cropped picture           */
1008
24.8k
            u2_rgt_ofst = u1_frame_cropping_rect_right_ofst << 1;
1009
24.8k
            u2_lft_ofst = u1_frame_cropping_rect_left_ofst << 1;
1010
1011
            /* Know frame MBs only u4_flag                                      */
1012
24.8k
            u1_frm_mbs_flag = (1 == ps_seq->u1_frame_mbs_only_flag);
1013
1014
            /* Simplify the vertical u4_ofst calculation from field/frame     */
1015
24.8k
            u1_vert_mult_factor = (2 - u1_frm_mbs_flag);
1016
1017
            /* Calculate bottom and top u4_ofst for cropped  picture          */
1018
24.8k
            u2_btm_ofst = (u1_frame_cropping_rect_bottom_ofst
1019
24.8k
                            << u1_vert_mult_factor);
1020
24.8k
            u2_top_ofst = (u1_frame_cropping_rect_top_ofst
1021
24.8k
                            << u1_vert_mult_factor);
1022
24.8k
        }
1023
1024
        /* Calculate u4_ofst from start of YUV 420 picture buffer to start of*/
1025
        /* cropped picture buffer                                           */
1026
76.0k
        u2_crop_offset_y = (u2_frm_wd_y * u2_top_ofst) + (u2_lft_ofst);
1027
76.0k
        u2_crop_offset_uv = (u2_frm_wd_uv * (u2_top_ofst >> 1))
1028
76.0k
                        + (u2_lft_ofst >> 1) * YUV420SP_FACTOR;
1029
        /* Calculate the display picture width and height based on crop      */
1030
        /* information                                                       */
1031
76.0k
        i4_cropped_ht = (WORD32)u2_pic_ht - (WORD32)(u2_btm_ofst + u2_top_ofst);
1032
76.0k
        i4_cropped_wd = (WORD32)u2_pic_wd - (WORD32)(u2_rgt_ofst + u2_lft_ofst);
1033
1034
76.0k
        if((i4_cropped_ht < MB_SIZE) || (i4_cropped_wd < MB_SIZE))
1035
860
        {
1036
860
            return ERROR_INV_SPS_PPS_T;
1037
860
        }
1038
1039
75.1k
        if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_pic_wd != u2_pic_wd))
1040
96
        {
1041
96
            ps_dec->u1_res_changed = 1;
1042
96
            return IVD_RES_CHANGED;
1043
96
        }
1044
1045
75.0k
        if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_disp_width != i4_cropped_wd))
1046
478
        {
1047
478
            ps_dec->u1_res_changed = 1;
1048
478
            return IVD_RES_CHANGED;
1049
478
        }
1050
1051
74.5k
        if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_pic_ht != u2_pic_ht))
1052
98
        {
1053
98
            ps_dec->u1_res_changed = 1;
1054
98
            return IVD_RES_CHANGED;
1055
98
        }
1056
1057
74.5k
        if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_disp_height != i4_cropped_ht))
1058
622
        {
1059
622
            ps_dec->u1_res_changed = 1;
1060
622
            return IVD_RES_CHANGED;
1061
622
        }
1062
1063
        /* Check again for unsupported resolutions with updated values*/
1064
73.8k
        if((u2_pic_wd > H264_MAX_FRAME_WIDTH) || (u2_pic_ht > H264_MAX_FRAME_HEIGHT)
1065
73.8k
                || (u2_pic_wd < H264_MIN_FRAME_WIDTH) || (u2_pic_ht < H264_MIN_FRAME_HEIGHT)
1066
73.8k
                || (u2_pic_wd * (UWORD32)u2_pic_ht > H264_MAX_FRAME_SIZE))
1067
130
        {
1068
130
            return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
1069
130
        }
1070
1071
        /* If MBAff is enabled, decoder support is limited to streams with
1072
         * width less than half of H264_MAX_FRAME_WIDTH.
1073
         * In case of MBAff decoder processes two rows at a time
1074
         */
1075
73.7k
        if((u2_pic_wd << ps_seq->u1_mb_aff_flag) > H264_MAX_FRAME_WIDTH)
1076
182
        {
1077
182
            return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
1078
182
        }
1079
1080
73.7k
    }
1081
1082
    /* Backup num_reorder_frames if header is already decoded */
1083
73.5k
    if((ps_dec->i4_header_decoded & 1) &&
1084
73.5k
                    (1 == ps_seq->u1_vui_parameters_present_flag) &&
1085
73.5k
                    (1 == ps_seq->s_vui.u1_bitstream_restriction_flag))
1086
7.11k
    {
1087
7.11k
        num_reorder_frames =  (WORD32)ps_seq->s_vui.u4_num_reorder_frames;
1088
7.11k
    }
1089
66.4k
    else
1090
66.4k
    {
1091
66.4k
        num_reorder_frames = -1;
1092
66.4k
    }
1093
73.5k
    if(1 == ps_seq->u1_vui_parameters_present_flag)
1094
32.3k
    {
1095
32.3k
        ret = ih264d_parse_vui_parametres(&ps_seq->s_vui, ps_bitstrm);
1096
32.3k
        if(ret != OK)
1097
1.78k
            return ret;
1098
1099
30.5k
        if (ps_dec->pu1_bits_buf_dynamic != NULL && ps_dec->ps_cur_sps != NULL) {
1100
17.7k
            vui_t *ps_vui = &ps_seq->s_vui;
1101
17.7k
            dec_seq_params_t *ps_sps_old = ps_dec->ps_cur_sps;
1102
17.7k
            vui_t *ps_vui_old = &ps_sps_old->s_vui;
1103
1104
17.7k
            if (ps_vui->u1_video_full_range_flag != ps_vui_old->u1_video_full_range_flag ||
1105
17.7k
                ps_vui->u1_colour_primaries != ps_vui_old->u1_colour_primaries ||
1106
17.7k
                ps_vui->u1_tfr_chars != ps_vui_old->u1_tfr_chars ||
1107
17.7k
                ps_vui->u1_matrix_coeffs != ps_vui_old->u1_matrix_coeffs) {
1108
969
                ps_dec->u1_res_changed = 1;
1109
969
                return IVD_RES_CHANGED;
1110
969
            }
1111
17.7k
        }
1112
30.5k
    }
1113
1114
    /* Compare older num_reorder_frames with the new one if header is already decoded */
1115
70.8k
    if((ps_dec->i4_header_decoded & 1) &&
1116
70.8k
                    (-1 != num_reorder_frames) &&
1117
70.8k
                    (1 == ps_seq->u1_vui_parameters_present_flag) &&
1118
70.8k
                    (1 == ps_seq->s_vui.u1_bitstream_restriction_flag) &&
1119
70.8k
                    ((WORD32)ps_seq->s_vui.u4_num_reorder_frames != num_reorder_frames))
1120
301
    {
1121
301
        ps_dec->u1_res_changed = 1;
1122
301
        return IVD_RES_CHANGED;
1123
301
    }
1124
1125
    /* In case bitstream read has exceeded the filled size, then
1126
     return an error */
1127
70.5k
    if (EXCEED_OFFSET(ps_bitstrm))
1128
1.04k
    {
1129
1.04k
        return ERROR_INV_SPS_PPS_T;
1130
1.04k
    }
1131
1132
    /*--------------------------------------------------------------------*/
1133
    /* All initializations to ps_dec are beyond this point                */
1134
    /*--------------------------------------------------------------------*/
1135
69.4k
    {
1136
69.4k
        WORD32 reorder_depth = ih264d_get_dpb_size(ps_seq);
1137
69.4k
        if((1 == ps_seq->u1_vui_parameters_present_flag) &&
1138
69.4k
           (1 == ps_seq->s_vui.u1_bitstream_restriction_flag))
1139
8.36k
        {
1140
8.36k
            reorder_depth = ps_seq->s_vui.u4_num_reorder_frames + 1;
1141
8.36k
        }
1142
1143
69.4k
        if (reorder_depth > H264_MAX_REF_PICS)
1144
19
        {
1145
19
            return ERROR_INV_SPS_PPS_T;
1146
19
        }
1147
1148
69.4k
        if(ps_seq->u1_frame_mbs_only_flag != 1)
1149
13.4k
            reorder_depth *= 2;
1150
69.4k
        ps_dec->i4_reorder_depth = reorder_depth + DISPLAY_LATENCY;
1151
69.4k
    }
1152
0
    ps_dec->u2_disp_height = i4_cropped_ht;
1153
69.4k
    ps_dec->u2_disp_width = i4_cropped_wd;
1154
1155
69.4k
    ps_dec->u2_pic_wd = u2_pic_wd;
1156
69.4k
    ps_dec->u2_pic_ht = u2_pic_ht;
1157
69.4k
    ps_dec->u4_total_mbs = ps_seq->u2_total_num_of_mbs << (1 - ps_seq->u1_frame_mbs_only_flag);
1158
1159
    /* Determining the Width and Height of Frame from that of Picture */
1160
69.4k
    ps_dec->u2_frm_wd_y = u2_frm_wd_y;
1161
69.4k
    ps_dec->u2_frm_ht_y = u2_frm_ht_y;
1162
1163
69.4k
    ps_dec->u2_frm_wd_uv = u2_frm_wd_uv;
1164
69.4k
    ps_dec->u2_frm_ht_uv = u2_frm_ht_uv;
1165
69.4k
    ps_dec->s_pad_mgr.u1_pad_len_y_v = (UWORD8)(PAD_LEN_Y_V << (1 - u1_frm));
1166
69.4k
    ps_dec->s_pad_mgr.u1_pad_len_cr_v = (UWORD8)(PAD_LEN_UV_V << (1 - u1_frm));
1167
1168
69.4k
    ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
1169
69.4k
    ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
1170
1171
69.4k
    ps_dec->u2_crop_offset_y = u2_crop_offset_y;
1172
69.4k
    ps_dec->u2_crop_offset_uv = u2_crop_offset_uv;
1173
1174
69.4k
    ps_seq->u1_is_valid = TRUE;
1175
69.4k
    ps_dec->ps_sps[u1_seq_parameter_set_id] = *ps_seq;
1176
69.4k
    ps_dec->ps_cur_sps = &ps_dec->ps_sps[u1_seq_parameter_set_id];
1177
1178
69.4k
    return OK;
1179
69.4k
}
1180
1181
/*!
1182
 **************************************************************************
1183
 * \if Function name : ih264d_parse_end_of_sequence \endif
1184
 *
1185
 * \brief
1186
 *    Decodes End of Sequence.
1187
 *
1188
 * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
1189
 *
1190
 * \return
1191
 *    0 on Success and error code otherwise
1192
 **************************************************************************
1193
 */
1194
WORD32 ih264d_parse_end_of_sequence(dec_struct_t * ps_dec)
1195
0
{
1196
0
    WORD32 ret;
1197
1198
0
    ret = ih264d_end_of_pic_processing(ps_dec);
1199
0
    return ret;
1200
0
}
1201
1202
/*!
1203
 **************************************************************************
1204
 * \if Function name : AcessUnitDelimiterRbsp \endif
1205
 *
1206
 * \brief
1207
 *    Decodes AcessUnitDelimiterRbsp.
1208
 *
1209
 * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
1210
 *
1211
 * \return
1212
 *    0 on Success and error code otherwise
1213
 **************************************************************************
1214
 */
1215
1216
WORD32 ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec)
1217
2.28k
{
1218
2.28k
    UWORD8 u1_primary_pic_type;
1219
2.28k
    u1_primary_pic_type = ih264d_get_bits_h264(ps_dec->ps_bitstrm, 3);
1220
2.28k
    switch(u1_primary_pic_type)
1221
2.28k
    {
1222
902
        case I_PIC:
1223
1.39k
        case SI_PIC:
1224
1.44k
        case ISI_PIC:
1225
1.44k
            ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_I;
1226
1.44k
            break;
1227
842
        default:
1228
842
            ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
1229
2.28k
    }
1230
2.28k
    return (0);
1231
2.28k
}
1232
/*!
1233
 **************************************************************************
1234
 * \if Function name : ih264d_parse_nal_unit \endif
1235
 *
1236
 * \brief
1237
 *    Decodes NAL unit
1238
 *
1239
 * \return
1240
 *    0 on Success and error code otherwise
1241
 **************************************************************************
1242
 */
1243
1244
WORD32 ih264d_parse_nal_unit(iv_obj_t *dec_hdl,
1245
                          ivd_video_decode_op_t *ps_dec_op,
1246
                          UWORD8 *pu1_buf,
1247
                          UWORD32 u4_length)
1248
549k
{
1249
1250
549k
    dec_bit_stream_t *ps_bitstrm;
1251
1252
1253
549k
    dec_struct_t *ps_dec = (dec_struct_t *)dec_hdl->pv_codec_handle;
1254
549k
    ivd_video_decode_ip_t *ps_dec_in =
1255
549k
                    (ivd_video_decode_ip_t *)ps_dec->pv_dec_in;
1256
549k
    dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
1257
549k
    UWORD8 u1_first_byte, u1_nal_ref_idc;
1258
549k
    UWORD8 u1_nal_unit_type;
1259
549k
    WORD32 i_status = OK;
1260
549k
    ps_bitstrm = ps_dec->ps_bitstrm;
1261
1262
549k
    if(pu1_buf)
1263
549k
    {
1264
549k
        if(u4_length)
1265
549k
        {
1266
549k
            ps_dec_op->u4_frame_decoded_flag = 0;
1267
549k
            ih264d_process_nal_unit(ps_dec->ps_bitstrm, pu1_buf,
1268
549k
                                    u4_length);
1269
1270
549k
            SWITCHOFFTRACE;
1271
549k
            u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
1272
1273
549k
            if(NAL_FORBIDDEN_BIT(u1_first_byte))
1274
116k
            {
1275
116k
                H264_DEC_DEBUG_PRINT("\nForbidden bit set in Nal Unit, Let's try\n");
1276
116k
            }
1277
549k
            u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte);
1278
            // if any other nal unit other than slice nal is encountered in between a
1279
            // frame break out of loop without consuming header
1280
549k
            if ((ps_dec->u4_slice_start_code_found == 1)
1281
549k
                    && (ps_dec->u1_pic_decode_done != 1)
1282
549k
                    && (u1_nal_unit_type > IDR_SLICE_NAL))
1283
22.6k
            {
1284
22.6k
                return ERROR_INCOMPLETE_FRAME;
1285
22.6k
            }
1286
526k
            ps_dec->u1_nal_unit_type = u1_nal_unit_type;
1287
526k
            u1_nal_ref_idc = (UWORD8)(NAL_REF_IDC(u1_first_byte));
1288
            //Skip all NALUs if SPS and PPS are not decoded
1289
526k
            switch(u1_nal_unit_type)
1290
526k
            {
1291
124
                case SLICE_DATA_PARTITION_A_NAL:
1292
1.12k
                case SLICE_DATA_PARTITION_B_NAL:
1293
1.81k
                case SLICE_DATA_PARTITION_C_NAL:
1294
1.81k
                    if(!ps_dec->i4_decode_header)
1295
1.59k
                        ih264d_parse_slice_partition(ps_dec, ps_bitstrm);
1296
1297
1.81k
                    break;
1298
1299
53.6k
                case IDR_SLICE_NAL:
1300
152k
                case SLICE_NAL:
1301
1302
                    /* ! */
1303
152k
                    DEBUG_THREADS_PRINTF("Decoding  a slice NAL\n");
1304
152k
                    if(!ps_dec->i4_decode_header)
1305
113k
                    {
1306
113k
                        if(ps_dec->i4_header_decoded == 3)
1307
97.5k
                        {
1308
97.5k
                            ih264d_get_pre_sei_params(ps_dec, u1_nal_unit_type);
1309
                            /* ! */
1310
97.5k
                            ps_dec->u4_slice_start_code_found = 1;
1311
1312
97.5k
                            ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1313
1314
97.5k
                            i_status = ih264d_parse_decode_slice(
1315
97.5k
                                            (UWORD8)(u1_nal_unit_type
1316
97.5k
                                                            == IDR_SLICE_NAL),
1317
97.5k
                                            u1_nal_ref_idc, ps_dec);
1318
1319
97.5k
                            if(i_status != OK)
1320
82.7k
                            {
1321
82.7k
                                return i_status;
1322
82.7k
                            }
1323
97.5k
                        }
1324
15.8k
                        else
1325
15.8k
                        {
1326
15.8k
                            H264_DEC_DEBUG_PRINT(
1327
15.8k
                                            "\nSlice NAL Supplied but no header has been supplied\n");
1328
15.8k
                        }
1329
113k
                    }
1330
70.2k
                    break;
1331
1332
70.2k
                case SEI_NAL:
1333
51.5k
                    if(!ps_dec->i4_decode_header)
1334
36.6k
                    {
1335
36.6k
                        ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1336
36.6k
                        i_status = ih264d_parse_sei_message(ps_dec, ps_bitstrm);
1337
36.6k
                        if(i_status != OK)
1338
33.3k
                            return i_status;
1339
3.25k
                        ih264d_parse_sei(ps_dec, ps_bitstrm);
1340
3.25k
                    }
1341
18.2k
                    break;
1342
89.8k
                case SEQ_PARAM_NAL:
1343
                    /* ! */
1344
89.8k
                    ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1345
89.8k
                    i_status = ih264d_parse_sps(ps_dec, ps_bitstrm);
1346
89.8k
                    ps_dec->u4_sps_cnt_in_process++;
1347
                    /*If a resolution change happens within a process call, due to multiple sps
1348
                     * we will not support it.
1349
                     */
1350
89.8k
                    if((ps_dec->u4_sps_cnt_in_process > 1 ) &&
1351
89.8k
                                    (i_status == IVD_RES_CHANGED))
1352
2.86k
                    {
1353
2.86k
                        i_status = ERROR_INV_SPS_PPS_T;
1354
2.86k
                        ps_dec->u1_res_changed = 0;
1355
2.86k
                    }
1356
89.8k
                    if(i_status == ERROR_INV_SPS_PPS_T)
1357
8.43k
                        return i_status;
1358
81.3k
                    if(!i_status)
1359
69.4k
                        ps_dec->i4_header_decoded |= 0x1;
1360
81.3k
                    break;
1361
1362
61.8k
                case PIC_PARAM_NAL:
1363
                    /* ! */
1364
61.8k
                    ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1365
61.8k
                    i_status = ih264d_parse_pps(ps_dec, ps_bitstrm);
1366
61.8k
                    if(i_status == ERROR_INV_SPS_PPS_T)
1367
5.94k
                        return i_status;
1368
55.9k
                    if(!i_status)
1369
52.4k
                        ps_dec->i4_header_decoded |= 0x2;
1370
55.9k
                    break;
1371
4.09k
                case ACCESS_UNIT_DELIMITER_RBSP:
1372
4.09k
                    if(!ps_dec->i4_decode_header)
1373
2.28k
                    {
1374
2.28k
                        ih264d_access_unit_delimiter_rbsp(ps_dec);
1375
2.28k
                    }
1376
4.09k
                    break;
1377
                    //Let us ignore the END_OF_SEQ_RBSP NAL and decode even after this NAL
1378
1.32k
                case END_OF_STREAM_RBSP:
1379
1.32k
                    if(!ps_dec->i4_decode_header)
1380
1.08k
                    {
1381
1.08k
                        ih264d_parse_end_of_stream(ps_dec);
1382
1.08k
                    }
1383
1.32k
                    break;
1384
4.48k
                case FILLER_DATA_NAL:
1385
4.48k
                    if(!ps_dec->i4_decode_header)
1386
3.60k
                    {
1387
3.60k
                        ih264d_parse_filler_data(ps_dec, ps_bitstrm);
1388
3.60k
                    }
1389
4.48k
                    break;
1390
158k
                default:
1391
158k
                    H264_DEC_DEBUG_PRINT("\nUnknown NAL type %d\n", u1_nal_unit_type);
1392
158k
                    break;
1393
526k
            }
1394
1395
526k
        }
1396
1397
549k
    }
1398
1399
396k
    return i_status;
1400
1401
549k
}