Coverage Report

Created: 2026-06-08 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/svc/isvcd_parse_slice.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2022 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
23
 *  isvcd_parse_slice.c
24
 *
25
 * @brief
26
 *  Contains routines that decodes a slice NAL unit
27
 *
28
 * @author
29
 *  Kishore
30
 *
31
 * @remarks
32
 *  None
33
 *
34
 *******************************************************************************
35
 */
36
37
#include <string.h>
38
#include <assert.h>
39
#include "ih264_typedefs.h"
40
#include "ih264_macros.h"
41
#include "ih264_platform_macros.h"
42
#include "ithread.h"
43
#include "isvcd_structs.h"
44
#include "ih264d_debug.h"
45
#include "ih264d_bitstrm.h"
46
#include "ih264d_parse_mb_header.h"
47
#include "ih264d_process_bslice.h"
48
#include "ih264d_process_pslice.h"
49
#include "ih264d_parse_cavlc.h"
50
#include "ih264d_utils.h"
51
#include "isvcd_utils.h"
52
#include "ih264d_deblocking.h"
53
#include "ih264d_defs.h"
54
#include "ih264d_error_handler.h"
55
#include "ih264d_tables.h"
56
#include "ih264d_defs.h"
57
#include "ih264d_mem_request.h"
58
#include "ih264d_parse_islice.h"
59
#include "ih264d_parse_slice.h"
60
#include "ih264d_mvpred.h"
61
#include "ih264d_mb_utils.h"
62
#include "ih264d_defs.h"
63
#include "ih264d_quant_scaling.h"
64
#include "ih264d_inter_pred.h"
65
#include "ih264d_sei.h"
66
#include "ih264_error.h"
67
#include "ih264_disp_mgr.h"
68
#include "ih264_buf_mgr.h"
69
#include "ih264d_thread_parse_decode.h"
70
#include "ih264d_thread_compute_bs.h"
71
#include "ih264d_dpb_manager.h"
72
#include "ih264d_parse_islice.h"
73
#include "isvcd_parse_slice.h"
74
#include "isvcd_process_epslice.h"
75
#include "isvcd_process_ebslice.h"
76
#include "isvcd_thread_compute_bs.h"
77
#include "isvcd_thread_parse_decode.h"
78
#include "isvcd_deblocking.h"
79
80
#define RET_LAST_SKIP 0x80000000
81
82
WORD32 check_app_out_buf_size(dec_struct_t *ps_dec);
83
/*!
84
**************************************************************************
85
* \if Function name :  isvcd_verify_level \endif
86
*
87
* \brief
88
*    Initialize the Parameter required for all the slices for a picture
89
*
90
* \return           : Nothing
91
*
92
**************************************************************************
93
*/
94
WORD32 isvcd_verify_level(UWORD8 u1_level_idc)
95
143k
{
96
143k
    switch(u1_level_idc)
97
143k
    {
98
399
        case H264_LEVEL_1_0:
99
35.4k
        case H264_LEVEL_1_1:
100
39.6k
        case H264_LEVEL_1_2:
101
41.6k
        case H264_LEVEL_1_3:
102
93.2k
        case H264_LEVEL_2_0:
103
101k
        case H264_LEVEL_2_1:
104
102k
        case H264_LEVEL_2_2:
105
105k
        case H264_LEVEL_3_0:
106
106k
        case H264_LEVEL_3_1:
107
123k
        case H264_LEVEL_3_2:
108
138k
        case H264_LEVEL_4_0:
109
139k
        case H264_LEVEL_4_1:
110
143k
        case H264_LEVEL_4_2:
111
143k
        case H264_LEVEL_5_0:
112
143k
        case H264_LEVEL_5_1:
113
143k
            return OK;
114
244
        default:
115
244
            return NOT_OK;
116
143k
    }
117
143k
}
118
119
/*!
120
**************************************************************************
121
* \if Function name :  isvcd_start_of_pic \endif
122
*
123
* \brief
124
*    Initialize the Parameter required for all the slices for a picture
125
*
126
* \return           : Nothing
127
*
128
**************************************************************************
129
*/
130
131
WORD32 isvcd_start_of_pic(svc_dec_lyr_struct_t *ps_svc_lyr_dec, WORD32 i4_poc,
132
                          pocstruct_t *ps_temp_poc, UWORD16 u2_frame_num, dec_pic_params_t *ps_pps)
133
135k
{
134
135k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
135
135k
    pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc;
136
135k
    pocstruct_t *ps_cur_poc = ps_temp_poc;
137
138
135k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
139
135k
    dec_seq_params_t *ps_seq = ps_dec->ps_cur_sps;
140
135k
    UWORD8 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
141
135k
    UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
142
    /* high profile related declarations */
143
135k
    WORD32 ret;
144
145
135k
    H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
146
147
135k
    if(u1_field_pic_flag == 1)
148
0
    {
149
0
        ps_dec->i4_error_code = ERROR_SVC_FIELD_PIC_UNSUPPORTED;
150
0
        return ERROR_SVC_FIELD_PIC_UNSUPPORTED;
151
0
    }
152
153
    /* check output buffer size given by the application */
154
135k
    if(check_app_out_buf_size(ps_dec) != IV_SUCCESS) return IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
155
156
133k
    ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
157
133k
    ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
158
133k
    ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom;
159
133k
    ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0];
160
133k
    ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1];
161
133k
    ps_prev_poc->u1_bot_field = ps_dec->ps_cur_slice->u1_bottom_field_flag;
162
133k
    ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
163
133k
    ps_prev_poc->u2_frame_num = u2_frame_num;
164
133k
    ps_dec->i1_prev_mb_qp_delta = 0;
165
133k
    ps_dec->i1_next_ctxt_idx = 0;
166
167
133k
    ps_dec->u4_nmb_deblk = 0;
168
133k
    if(ps_dec->u4_num_cores == 1) ps_dec->u4_nmb_deblk = 1;
169
170
133k
    if(ps_seq->u1_mb_aff_flag == 1)
171
0
    {
172
0
        ps_dec->u4_nmb_deblk = 0;
173
0
        if(ps_dec->u4_num_cores > 2) ps_dec->u4_num_cores = 2;
174
0
    }
175
176
133k
    ps_dec->u4_use_intrapred_line_copy = 0;
177
178
133k
    if(ps_seq->u1_mb_aff_flag == 0)
179
133k
    {
180
133k
        ps_dec->u4_use_intrapred_line_copy = 1;
181
133k
    }
182
183
133k
    ps_dec->u4_app_disable_deblk_frm = 0;
184
    /* If degrade is enabled, set the degrade flags appropriately */
185
133k
    if(ps_dec->i4_degrade_type && ps_dec->i4_degrade_pics)
186
0
    {
187
0
        WORD32 degrade_pic;
188
0
        ps_dec->i4_degrade_pic_cnt++;
189
0
        degrade_pic = 0;
190
191
        /* If degrade is to be done in all frames, then do not check further */
192
0
        switch(ps_dec->i4_degrade_pics)
193
0
        {
194
0
            case 4:
195
0
            {
196
0
                degrade_pic = 1;
197
0
                break;
198
0
            }
199
0
            case 3:
200
0
            {
201
0
                if(ps_cur_slice->u1_slice_type != I_SLICE) degrade_pic = 1;
202
203
0
                break;
204
0
            }
205
0
            case 2:
206
0
            {
207
                /* If pic count hits non-degrade interval or it is an islice, then do not
208
                 * degrade */
209
0
                if((ps_cur_slice->u1_slice_type != I_SLICE) &&
210
0
                   (ps_dec->i4_degrade_pic_cnt != ps_dec->i4_nondegrade_interval))
211
0
                    degrade_pic = 1;
212
213
0
                break;
214
0
            }
215
0
            case 1:
216
0
            {
217
                /* Check if the current picture is non-ref */
218
0
                if(0 == ps_cur_slice->u1_nal_ref_idc)
219
0
                {
220
0
                    degrade_pic = 1;
221
0
                }
222
0
                break;
223
0
            }
224
0
        }
225
0
        if(degrade_pic)
226
0
        {
227
0
            if(ps_dec->i4_degrade_type & 0x2) ps_dec->u4_app_disable_deblk_frm = 1;
228
229
            /* MC degrading is done only for non-ref pictures */
230
0
            if(0 == ps_cur_slice->u1_nal_ref_idc)
231
0
            {
232
0
                if(ps_dec->i4_degrade_type & 0x4) ps_dec->i4_mv_frac_mask = 0;
233
234
0
                if(ps_dec->i4_degrade_type & 0x8) ps_dec->i4_mv_frac_mask = 0;
235
0
            }
236
0
        }
237
0
        else
238
0
            ps_dec->i4_degrade_pic_cnt = 0;
239
0
    }
240
241
133k
    {
242
133k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
243
133k
        if((ps_cur_slice->u1_slice_type == I_SLICE) || (ps_cur_slice->u1_slice_type == SI_SLICE))
244
12.5k
            ps_err->u1_cur_pic_type = PIC_TYPE_I;
245
121k
        else
246
121k
            ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN;
247
248
133k
        if(ps_err->u1_pic_aud_i == PIC_TYPE_I)
249
0
        {
250
0
            ps_err->u1_cur_pic_type = PIC_TYPE_I;
251
0
            ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
252
0
        }
253
254
133k
        if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
255
111k
        {
256
111k
            if(ps_err->u1_err_flag) ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
257
111k
            ps_err->u1_err_flag = ACCEPT_ALL_PICS;
258
111k
        }
259
133k
    }
260
261
133k
    if(ps_dec->u1_init_dec_flag && ps_dec->s_prev_seq_params.u1_eoseq_pending)
262
0
    {
263
        /* Reset the decoder picture buffers */
264
0
        WORD32 j;
265
0
        for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
266
0
        {
267
0
            ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, j, BUF_MGR_REF);
268
0
            ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_mv_buf_mgr,
269
0
                                  ps_dec->as_buf_id_info_map[j].mv_buf_id, BUF_MGR_REF);
270
0
            ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, j, BUF_MGR_IO);
271
0
        }
272
273
        /* reset the decoder structure parameters related to buffer handling */
274
0
        ps_dec->u1_second_field = 0;
275
0
        ps_dec->i4_cur_display_seq = 0;
276
277
        /********************************************************************/
278
        /* indicate in the decoder output i4_status that some frames are being */
279
        /* dropped, so that it resets timestamp and wait for a new sequence */
280
        /********************************************************************/
281
0
        ps_dec->s_prev_seq_params.u1_eoseq_pending = 0;
282
0
    }
283
133k
    ret = isvcd_init_pic(ps_svc_lyr_dec, u2_frame_num, i4_poc, ps_pps);
284
133k
    if(ret != OK) return ret;
285
286
133k
    ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
287
133k
    ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
288
133k
    ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info;
289
133k
    ps_svc_lyr_dec->ps_svc_nmb_info = ps_svc_lyr_dec->ps_svc_frm_mb_info;
290
133k
    if(ps_dec->u1_separate_parse)
291
50.5k
    {
292
50.5k
        UWORD32 num_mbs;
293
50.5k
        num_mbs = ps_dec->ps_cur_sps->u4_total_num_of_mbs
294
50.5k
                  << (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag);
295
296
50.5k
        if(ps_dec->pu1_dec_mb_map)
297
50.5k
        {
298
50.5k
            memset((void *) ps_dec->pu1_dec_mb_map, 0, num_mbs);
299
50.5k
        }
300
301
50.5k
        if(ps_dec->pu1_recon_mb_map)
302
50.5k
        {
303
50.5k
            memset((void *) ps_dec->pu1_recon_mb_map, 0, num_mbs);
304
50.5k
        }
305
306
50.5k
        if(ps_dec->pu2_slice_num_map)
307
50.5k
        {
308
50.5k
            memset((void *) ps_dec->pu2_slice_num_map, 0, (num_mbs * sizeof(UWORD16)));
309
50.5k
        }
310
50.5k
    }
311
312
133k
    ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
313
133k
    ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
314
133k
    ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
315
133k
    ps_dec->u2_cur_slice_num = 0;
316
317
    /* Initialize all the HP toolsets to zero */
318
133k
    ps_dec->s_high_profile.u1_scaling_present = 0;
319
133k
    ps_dec->s_high_profile.u1_transform8x8_present = 0;
320
321
    /* Get Next Free Picture */
322
133k
    if(1 == ps_dec->u4_share_disp_buf)
323
0
    {
324
0
        UWORD32 i;
325
        /* Free any buffer that is in the queue to be freed */
326
0
        for(i = 0; i < MAX_DISP_BUFS_NEW; i++)
327
0
        {
328
0
            if(0 == ps_dec->u4_disp_buf_to_be_freed[i]) continue;
329
0
            ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, i, BUF_MGR_IO);
330
0
            ps_dec->u4_disp_buf_to_be_freed[i] = 0;
331
0
            ps_dec->u4_disp_buf_mapping[i] = 0;
332
0
        }
333
0
    }
334
133k
    if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded))
335
133k
    {
336
133k
        pic_buffer_t *ps_cur_pic;
337
133k
        WORD32 cur_pic_buf_id, cur_mv_buf_id;
338
133k
        col_mv_buf_t *ps_col_mv;
339
133k
        while(1)
340
133k
        {
341
133k
            ps_cur_pic = (pic_buffer_t *) ih264_buf_mgr_get_next_free(
342
133k
                (buf_mgr_t *) ps_dec->pv_pic_buf_mgr, &cur_pic_buf_id);
343
344
            /* In case of IDR slices, if there is no free picture buffer, then release
345
             * all buffers from display and reference
346
             */
347
133k
            if((ps_cur_pic == NULL) && (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
348
898
            {
349
898
                WORD32 j;
350
351
58.3k
                for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
352
57.4k
                {
353
57.4k
                    ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, j, BUF_MGR_REF);
354
57.4k
                    ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_mv_buf_mgr,
355
57.4k
                                          ps_dec->as_buf_id_info_map[j].mv_buf_id, BUF_MGR_REF);
356
357
57.4k
                    ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, j, BUF_MGR_IO);
358
57.4k
                }
359
898
                ps_cur_pic = (pic_buffer_t *) ih264_buf_mgr_get_next_free(
360
898
                    (buf_mgr_t *) ps_dec->pv_pic_buf_mgr, &cur_pic_buf_id);
361
898
            }
362
133k
            if(ps_cur_pic == NULL)
363
123
            {
364
123
                ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
365
123
                ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC;
366
123
                return ERROR_UNAVAIL_PICBUF_T;
367
123
            }
368
133k
            if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id])
369
133k
            {
370
133k
                break;
371
133k
            }
372
133k
        }
373
133k
        ps_col_mv = (col_mv_buf_t *) ih264_buf_mgr_get_next_free(
374
133k
            (buf_mgr_t *) ps_dec->pv_mv_buf_mgr, &cur_mv_buf_id);
375
133k
        if(ps_col_mv == NULL)
376
604
        {
377
604
            ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
378
604
            ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC;
379
604
            return ERROR_UNAVAIL_MVBUF_T;
380
604
        }
381
382
133k
        ps_dec->ps_cur_pic = ps_cur_pic;
383
133k
        ps_dec->u1_pic_buf_id = cur_pic_buf_id;
384
133k
        ps_cur_pic->u4_ts = ps_dec->u4_ts;
385
133k
        memcpy(&ps_cur_pic->s_sei_pic, ps_dec->ps_sei, sizeof(sei));
386
387
133k
        ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
388
133k
        ps_dec->as_buf_id_info_map[cur_pic_buf_id].mv_buf_id = cur_mv_buf_id;
389
390
133k
        if(ps_dec->u1_enable_mb_info)
391
0
        {
392
0
            UWORD32 mb_info_map_size = ps_dec->u4_total_mbs << 2;
393
0
            ps_dec->as_buf_id_info_map[cur_pic_buf_id].pu1_qp_map =
394
0
                ps_dec->pu1_qp_map_base + cur_pic_buf_id * mb_info_map_size;
395
0
            ps_dec->as_buf_id_info_map[cur_pic_buf_id].pu1_mb_type_map =
396
0
                ps_dec->pu1_mb_type_map_base + cur_pic_buf_id * mb_info_map_size;
397
0
            memset(ps_dec->as_buf_id_info_map[cur_pic_buf_id].pu1_qp_map, 0, mb_info_map_size);
398
0
            memset(ps_dec->as_buf_id_info_map[cur_pic_buf_id].pu1_mb_type_map, 0, mb_info_map_size);
399
0
        }
400
133k
        ps_cur_pic->pu1_col_zero_flag = (UWORD8 *) ps_col_mv->pv_col_zero_flag;
401
133k
        ps_cur_pic->ps_mv = (mv_pred_t *) ps_col_mv->pv_mv;
402
133k
        ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
403
404
133k
        {
405
            /*make first entry of list0 and list1 point to cur pic,
406
             *so that if first slice is in error, ref pic struct will have valid
407
             *entries*/
408
133k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
409
133k
            ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_init_dpb[1];
410
133k
            *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic;
411
            /* Initialize for field reference as well */
412
133k
            *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
413
414
133k
            *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][0]) = *ps_cur_pic;
415
            /* Initialize for field reference as well */
416
133k
            *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
417
133k
            *(ps_dec->ps_dpb_mgr->ps_init_dpb[1][0]) = *ps_cur_pic;
418
            /* Initialize for field reference as well */
419
133k
            *(ps_dec->ps_dpb_mgr->ps_init_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic;
420
133k
            *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][0]) = *ps_cur_pic;
421
            /* Initialize for field reference as well */
422
133k
            *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic;
423
133k
        }
424
425
133k
        ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag;
426
133k
        ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE;
427
133k
        H264_DEC_DEBUG_PRINT("got a buffer\n");
428
133k
    }
429
0
    else
430
0
    {
431
0
        H264_DEC_DEBUG_PRINT("did not get a buffer\n");
432
0
    }
433
434
133k
    ps_dec->u4_pic_buf_got = 1;
435
436
133k
    ps_dec->ps_cur_pic->i4_poc = i4_poc;
437
133k
    ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num;
438
133k
    ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num;
439
133k
    ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt;
440
133k
    ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = ps_pps->i4_bottom_field_order_cnt;
441
133k
    ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc;
442
133k
    ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts;
443
444
133k
    ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic);
445
133k
    if(u1_field_pic_flag && u1_bottom_field_flag)
446
0
    {
447
0
        WORD32 i4_temp_poc;
448
0
        WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
449
        /* Point to odd lines, since it's bottom field */
450
0
        ps_dec->s_cur_pic.pu1_buf1 += ps_dec->s_cur_pic.u2_frm_wd_y;
451
0
        ps_dec->s_cur_pic.pu1_buf2 += ps_dec->s_cur_pic.u2_frm_wd_uv;
452
0
        ps_dec->s_cur_pic.pu1_buf3 += ps_dec->s_cur_pic.u2_frm_wd_uv;
453
0
        ps_dec->s_cur_pic.ps_mv += ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
454
0
        ps_dec->s_cur_pic.pu1_col_zero_flag += ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
455
0
        ps_dec->ps_cur_pic->u1_picturetype |= BOT_FLD;
456
0
        i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
457
0
        i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
458
0
        i4_temp_poc = MIN(i4_top_field_order_poc, i4_bot_field_order_poc);
459
0
        ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
460
0
    }
461
462
133k
    ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
463
133k
    ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag << 2);
464
465
133k
    ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row;
466
133k
    ps_dec->ps_cur_mb_row += 2;
467
133k
    ps_dec->ps_top_mb_row = ps_dec->ps_nbr_mb_row;
468
133k
    ps_dec->ps_top_mb_row +=
469
133k
        ((ps_dec->u2_frm_wd_in_mbs + 2) << (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
470
    // Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be valid
471
133k
    ps_dec->ps_top_mb_row += 2;
472
133k
    ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
473
133k
    ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
474
133k
    ps_dec->u1_mv_top_p = 0;
475
133k
    ps_dec->u4_mb_idx = 0;
476
133k
    ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
477
133k
    ps_dec->u4_total_mbs_coded = 0;
478
133k
    ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE);
479
133k
    ps_dec->u4_pred_info_idx = 0;
480
133k
    ps_dec->u4_pred_info_pkd_idx = 0;
481
133k
    ps_dec->u4_dma_buf_idx = 0;
482
133k
    ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv;
483
133k
    ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv;
484
133k
    ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag;
485
133k
    ps_dec->ps_part = ps_dec->ps_parse_part_params;
486
133k
    ps_dec->i2_prev_slice_mbx = -1;
487
133k
    ps_dec->i2_prev_slice_mby = 0;
488
133k
    ps_dec->u2_mv_2mb[0] = 0;
489
133k
    ps_dec->u2_mv_2mb[1] = 0;
490
133k
    ps_dec->u1_last_pic_not_decoded = 0;
491
492
133k
    ps_dec->u2_cur_slice_num_dec_thread = 0;
493
133k
    ps_dec->u2_cur_slice_num_bs = 0;
494
133k
    ps_dec->u4_intra_pred_line_ofst = 0;
495
133k
    ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line;
496
133k
    ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line;
497
133k
    ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line;
498
499
133k
    ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line;
500
133k
    ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line;
501
133k
    ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line;
502
503
133k
    ps_dec->pu1_prev_y_intra_pred_line =
504
133k
        ps_dec->pu1_y_intra_pred_line + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE);
505
506
133k
    ps_dec->pu1_prev_u_intra_pred_line =
507
133k
        ps_dec->pu1_u_intra_pred_line + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR;
508
133k
    ps_dec->pu1_prev_v_intra_pred_line =
509
133k
        ps_dec->pu1_v_intra_pred_line + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE;
510
511
133k
    ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
512
    /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag
513
     */
514
133k
    {
515
133k
        if(ps_cur_slice->u1_mbaff_frame_flag)
516
0
        {
517
0
            ps_dec->pf_compute_bs = ih264d_compute_bs_mbaff;
518
0
            ps_dec->pf_mvpred = ih264d_mvpred_mbaff;
519
0
            ps_svc_lyr_dec->pf_svc_compute_bs = isvcd_compute_bs_non_mbaff;
520
0
        }
521
133k
        else
522
133k
        {
523
133k
            ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff;
524
133k
            ps_svc_lyr_dec->pf_svc_compute_bs = isvcd_compute_bs_non_mbaff;
525
133k
            ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag;
526
527
133k
            if((ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) &&
528
88.7k
               (0 == ps_svc_lyr_dec->u1_base_res_flag))
529
33.8k
            {
530
33.8k
                ps_svc_lyr_dec->pf_svc_compute_bs = isvcd_compute_bs_non_mbaff_target_lyr;
531
33.8k
            }
532
533
133k
            if((ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) &&
534
88.7k
               (1 == ps_svc_lyr_dec->u1_base_res_flag))
535
54.8k
            {
536
54.8k
                ps_svc_lyr_dec->pf_svc_compute_bs =
537
54.8k
                    isvcd_compute_bs_non_mbaff_target_lyr_no_inter_layer;
538
54.8k
            }
539
540
133k
            if((ps_svc_lyr_dec->u1_layer_identifier == MEDIAL_ENHANCEMENT_LAYER) &&
541
0
               (0 == ps_svc_lyr_dec->u1_base_res_flag))
542
0
            {
543
0
                ps_svc_lyr_dec->pf_svc_compute_bs = isvcd_compute_bs_non_mbaff_medial_lyr;
544
0
            }
545
133k
        }
546
133k
    }
547
    /* Set up the Parameter for DMA transfer */
548
133k
    {
549
133k
        UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
550
133k
        UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag;
551
133k
        UWORD16 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4) % (ps_dec->u4_recon_mb_grp >> u1_mbaff));
552
133k
        UWORD16 ui16_lastmbs_widthY =
553
133k
            (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u4_recon_mb_grp >> u1_mbaff) << 4));
554
133k
        UWORD16 ui16_lastmbs_widthUV =
555
133k
            uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u4_recon_mb_grp >> u1_mbaff) << 3);
556
557
133k
        ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
558
133k
        ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
559
133k
        ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
560
561
133k
        ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
562
133k
        ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
563
564
133k
        if(u1_field_pic_flag)
565
0
        {
566
0
            ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y;
567
0
            ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv;
568
0
        }
569
570
        /* Normal Increment of Pointer */
571
133k
        ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u4_recon_mb_grp << 4) >> u1_mbaff);
572
133k
        ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u4_recon_mb_grp << 4) >> u1_mbaff);
573
574
        /* End of Row Increment */
575
133k
        ps_dec->s_tran_addrecon.u4_inc_y[1] =
576
133k
            (ui16_lastmbs_widthY + (PAD_LEN_Y_H << 1) +
577
133k
             ps_dec->s_tran_addrecon.u2_frm_wd_y * ((15 << u1_mbaff) + u1_mbaff));
578
133k
        ps_dec->s_tran_addrecon.u4_inc_uv[1] =
579
133k
            (ui16_lastmbs_widthUV + (PAD_LEN_UV_H << 2) +
580
133k
             ps_dec->s_tran_addrecon.u2_frm_wd_uv * ((15 << u1_mbaff) + u1_mbaff));
581
582
        /* Assign picture numbers to each frame/field  */
583
        /* only once per picture.                      */
584
133k
        ih264d_assign_pic_num(ps_dec);
585
133k
        ps_dec->s_tran_addrecon.u2_mv_top_left_inc =
586
133k
            (ps_dec->u4_recon_mb_grp << 2) - 1 - (u1_mbaff << 2);
587
133k
        ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u4_recon_mb_grp >> u1_mbaff) - 1)
588
133k
                                                 << (4 + u1_mbaff);
589
133k
    }
590
    /**********************************************************************/
591
    /* High profile related initialization at pictrue level               */
592
    /**********************************************************************/
593
133k
    if((ps_seq->u1_profile_idc == HIGH_PROFILE_IDC) ||
594
125k
       (ps_seq->u1_profile_idc == SCALABLE_HIGH_PROFILE_IDC) ||
595
123k
       (ps_seq->u1_profile_idc == SCALABLE_BASELINE_PROFILE_IDC))
596
13.1k
    {
597
13.1k
        if((ps_seq->i4_seq_scaling_matrix_present_flag) ||
598
4.82k
           (ps_pps->i4_pic_scaling_matrix_present_flag))
599
9.32k
        {
600
9.32k
            ret = ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec);
601
9.32k
            ps_dec->s_high_profile.u1_scaling_present = 1;
602
9.32k
        }
603
3.83k
        else
604
3.83k
        {
605
3.83k
            ret = ih264d_form_default_scaling_matrix(ps_dec);
606
3.83k
        }
607
608
13.1k
        if(ps_pps->i4_transform_8x8_mode_flag)
609
7.55k
        {
610
7.55k
            ps_dec->s_high_profile.u1_transform8x8_present = 1;
611
7.55k
        }
612
13.1k
    }
613
119k
    else
614
119k
    {
615
119k
        ret = ih264d_form_default_scaling_matrix(ps_dec);
616
119k
    }
617
618
133k
    if(ret != OK) return ret;
619
620
    /* required while reading the transform_size_8x8 u4_flag */
621
133k
    ps_dec->s_high_profile.u1_direct_8x8_inference_flag = ps_seq->u1_direct_8x8_inference_flag;
622
133k
    ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt;
623
624
133k
    ps_dec->i1_recon_in_thread3_flag = 1;
625
133k
    ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon;
626
133k
    if(ps_dec->u1_separate_parse)
627
50.0k
    {
628
50.0k
        memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon, sizeof(tfr_ctxt_t));
629
50.0k
    }
630
631
133k
    ih264d_init_deblk_tfr_ctxt(ps_dec, &(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon),
632
133k
                               ps_dec->u2_frm_wd_in_mbs, 0);
633
634
133k
    ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic;
635
133k
    ps_dec->u4_cur_deblk_mb_num = 0;
636
133k
    ps_dec->u4_deblk_mb_x = 0;
637
133k
    ps_dec->u4_deblk_mb_y = 0;
638
133k
    ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
639
640
133k
    ps_dec->u4_first_slice_in_pic = 0;
641
133k
    H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
642
133k
    return OK;
643
133k
}
644
/*!
645
**************************************************************************
646
* \if Function name : isvcd_parse_decode_slice_ext_nal \endif
647
*
648
* \brief
649
*    Parses a slice extension NAL
650
*
651
* \return
652
*    0 on Success and Error code otherwise
653
**************************************************************************
654
*/
655
WORD32 isvcd_parse_decode_slice_ext_nal(UWORD8 u1_is_idr_slice, UWORD8 u1_nal_ref_idc,
656
                                        svc_dec_lyr_struct_t *ps_svc_lyr_dec)
657
38.1k
{
658
38.1k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
659
38.1k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
660
38.1k
    dec_pic_params_t *ps_pps;
661
38.1k
    dec_seq_params_t *ps_seq;
662
38.1k
    dec_svc_seq_params_t *ps_subset_seq;
663
38.1k
    dec_slice_params_t *ps_cur_slice = NULL;
664
38.1k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
665
666
38.1k
    pocstruct_t s_tmp_poc = {0};
667
38.1k
    WORD32 i_delta_poc[2] = {0};
668
38.1k
    WORD32 i4_poc = 0;
669
38.1k
    UWORD16 u2_first_mb_in_slice, u2_frame_num;
670
38.1k
    UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type;
671
38.1k
    UWORD32 u4_idr_pic_id = 0;
672
38.1k
    UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type;
673
674
38.1k
    UWORD8 u1_nal_unit_type;
675
38.1k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
676
38.1k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
677
38.1k
    WORD8 i1_is_end_of_poc;
678
38.1k
    WORD32 ret;
679
38.1k
    WORD32 prev_slice_err, num_mb_skipped;
680
38.1k
    UWORD8 u1_mbaff;
681
38.1k
    pocstruct_t *ps_cur_poc;
682
38.1k
    UWORD32 u4_temp;
683
38.1k
    WORD32 i_temp;
684
38.1k
    svc_dec_ctxt_t *psvcd_dec_ctxt;
685
38.1k
    dec_struct_t *ps_dec_cur_lyr_minus_1;
686
38.1k
    svc_dec_lyr_struct_t *ps_svc_cur_lyr_dec_minus_1;
687
688
38.1k
    ps_cur_slice = ps_dec->ps_cur_slice;
689
38.1k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
690
691
    /* read FirstMbInSlice  and slice type*/
692
38.1k
    ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
693
38.1k
    u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
694
38.1k
    if(u2_first_mb_in_slice > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs))
695
156
    {
696
156
        return ERROR_CORRUPTED_SLICE;
697
156
    }
698
699
    /*we currently don not support ASO*/
700
37.9k
    if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) <= ps_dec->u4_cur_mb_addr) &&
701
37.1k
       (ps_dec->u4_first_slice_in_pic == 0))
702
106
    {
703
106
        return ERROR_CORRUPTED_SLICE;
704
106
    }
705
706
37.8k
    if(ps_dec->u4_first_slice_in_pic == 1)
707
37.0k
    {
708
37.0k
        if(u2_first_mb_in_slice != 0)
709
83
        {
710
83
            return ERROR_CORRUPTED_SLICE;
711
83
        }
712
37.0k
    }
713
714
37.7k
    COPYTHECONTEXT("Slice Header SVC ext: first_mb_in_slice", u2_first_mb_in_slice);
715
716
37.7k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
717
718
37.7k
    if(u4_temp > 9) return ERROR_INV_SLC_TYPE_T;
719
720
37.7k
    u1_slice_type = u4_temp;
721
37.7k
    COPYTHECONTEXT("Slice Header SVC ext: slice_type", (u1_slice_type));
722
    /* Find Out the Slice Type is 5 to 9 or not then Set the Flag   */
723
    /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/
724
    /* will be of same type of current                            */
725
37.7k
    if(u1_slice_type > 4)
726
392
    {
727
392
        u1_slice_type -= 5;
728
392
    }
729
730
37.7k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
731
37.7k
    if(u4_temp & MASK_ERR_PIC_SET_ID) return ERROR_INV_SLICE_HDR_T;
732
    /* discard slice if pic param is invalid */
733
37.6k
    COPYTHECONTEXT("Slice Header SVC ext: pic_parameter_set_id", u4_temp);
734
37.6k
    ps_pps = &ps_dec->ps_pps[u4_temp];
735
37.6k
    if(FALSE == ps_pps->u1_is_valid)
736
53
    {
737
53
        return ERROR_INV_SLICE_HDR_T;
738
53
    }
739
    /* slices in a layer should have same PPS id*/
740
37.5k
    if(UINT32_MAX == ps_svc_lyr_dec->u4_pps_id_for_layer)
741
36.7k
    {
742
36.7k
        ps_svc_lyr_dec->u4_pps_id_for_layer = u4_temp;
743
36.7k
    }
744
787
    else if(u4_temp != ps_svc_lyr_dec->u4_pps_id_for_layer)
745
79
    {
746
79
        return ERROR_INV_SLICE_HDR_T;
747
79
    }
748
37.5k
    ps_seq = ps_pps->ps_sps;
749
37.5k
    ps_seq += MAX_NUM_SEQ_PARAMS;
750
37.5k
    ps_subset_seq =
751
37.5k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
752
753
37.5k
    ps_dec->ps_cur_sps = ps_seq;
754
37.5k
    ps_svc_lyr_dec->ps_cur_subset_sps = ps_subset_seq;
755
756
37.5k
    if(!ps_seq) return ERROR_INV_SLICE_HDR_T;
757
37.5k
    if(FALSE == ps_seq->u1_is_valid) return ERROR_INV_SLICE_HDR_T;
758
37.2k
    if(ps_seq->u1_mb_aff_flag) return ERROR_INV_SLICE_HDR_T;
759
37.1k
    if(ps_seq->u1_level_idc > H264_LEVEL_4_2) return ERROR_INV_SLICE_HDR_T;
760
37.0k
    if(!ps_seq->u1_frame_mbs_only_flag) return ERROR_INV_SLICE_HDR_T;
761
37.0k
    if(OK != isvcd_verify_level(ps_seq->u1_level_idc)) return ERROR_INV_SLICE_HDR_T;
762
763
36.9k
    if(ps_dec->u1_init_dec_flag == 1)
764
29.6k
    {
765
29.6k
        if(ps_dec->u2_frm_wd_in_mbs != ps_seq->u2_frm_wd_in_mbs) return ERROR_INV_SLICE_HDR_T;
766
29.6k
        if(ps_dec->u2_frm_ht_in_mbs != ps_seq->u2_frm_ht_in_mbs) return ERROR_INV_SLICE_HDR_T;
767
29.6k
    }
768
769
36.8k
    if(ps_dec->u1_init_dec_flag == 1)
770
29.5k
    {
771
29.5k
        if(ps_dec->u2_disp_height != ps_subset_seq->u2_disp_height) return ERROR_INV_SLICE_HDR_T;
772
29.4k
        if(ps_dec->u2_disp_width != ps_subset_seq->u2_disp_width) return ERROR_INV_SLICE_HDR_T;
773
29.4k
    }
774
775
36.6k
    ps_dec->i4_reorder_depth = ps_subset_seq->i4_reorder_depth;
776
777
36.6k
    ps_dec->u2_disp_height = ps_subset_seq->u2_disp_height;
778
36.6k
    ps_dec->u2_disp_width = ps_subset_seq->u2_disp_width;
779
780
36.6k
    if(ps_svc_lyr_dec->u1_layer_id > 0)
781
36.6k
    {
782
36.6k
        psvcd_dec_ctxt = ps_svc_lyr_dec->ps_svcd_ctxt;
783
36.6k
        ps_svc_cur_lyr_dec_minus_1 =
784
36.6k
            &psvcd_dec_ctxt->ps_svc_dec_lyr[ps_svc_lyr_dec->u1_layer_id - 1];
785
786
36.6k
        ps_dec_cur_lyr_minus_1 = &ps_svc_cur_lyr_dec_minus_1->s_dec;
787
788
36.6k
        if((ps_dec_cur_lyr_minus_1->u2_pic_wd > ps_subset_seq->u2_pic_wd) ||
789
36.5k
           (ps_dec_cur_lyr_minus_1->u2_pic_ht > ps_subset_seq->u2_pic_ht))
790
144
        {
791
144
            return ERROR_CORRUPTED_SLICE;
792
144
        }
793
36.6k
    }
794
795
36.5k
    ps_dec->u2_pic_wd = ps_subset_seq->u2_pic_wd;
796
36.5k
    ps_dec->u2_pic_ht = ps_subset_seq->u2_pic_ht;
797
36.5k
    ps_dec->u4_total_mbs = ps_seq->u4_total_num_of_mbs << (1 - ps_seq->u1_frame_mbs_only_flag);
798
799
    /* Determining the Width and Height of Frame from that of Picture */
800
36.5k
    ps_dec->u2_frm_wd_y = ps_subset_seq->u2_frm_wd_y;
801
36.5k
    ps_dec->u2_frm_ht_y = ps_subset_seq->u2_frm_ht_y;
802
803
36.5k
    ps_dec->u2_frm_wd_uv = ps_subset_seq->u2_frm_wd_uv;
804
36.5k
    ps_dec->u2_frm_ht_uv = ps_subset_seq->u2_frm_ht_uv;
805
806
36.5k
    ps_dec->s_pad_mgr.u1_pad_len_y_v = ps_subset_seq->u1_pad_len_y_v;
807
36.5k
    ps_dec->s_pad_mgr.u1_pad_len_cr_v = ps_subset_seq->u1_pad_len_cr_v;
808
809
36.5k
    ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
810
36.5k
    ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
811
812
36.5k
    ps_dec->u2_crop_offset_y = ps_subset_seq->u2_crop_offset_y;
813
36.5k
    ps_dec->u2_crop_offset_uv = ps_subset_seq->u2_crop_offset_uv;
814
815
    /* Get the frame num */
816
36.5k
    u2_frame_num = ih264d_get_bits_h264(ps_bitstrm, ps_seq->u1_bits_in_frm_num);
817
818
36.5k
    COPYTHECONTEXT("Slice Header SVC ext: frame_num", u2_frame_num);
819
36.5k
    if(!ps_dec->u1_first_slice_in_stream && ps_dec->u4_first_slice_in_pic)
820
21.9k
    {
821
21.9k
        pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
822
21.9k
        pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
823
824
21.9k
        ps_dec->u2_mbx = 0xffff;
825
21.9k
        ps_dec->u2_mby = 0;
826
827
21.9k
        if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
828
1.34k
            ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
829
830
21.9k
        if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5) ps_dec->u2_prev_ref_frame_num = 0;
831
832
21.9k
        if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
833
0
        {
834
0
            isvcd_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
835
0
        }
836
837
21.9k
        ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
838
21.9k
        ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
839
21.9k
        ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
840
21.9k
        if(ps_cur_slice->u1_nal_ref_idc)
841
18.4k
        {
842
18.4k
            ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
843
18.4k
            ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
844
18.4k
            ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom;
845
18.4k
            ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0];
846
18.4k
            ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1];
847
18.4k
            ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
848
18.4k
        }
849
850
21.9k
        ps_dec->u4_total_mbs_coded = 0;
851
21.9k
    }
852
    /* Get the field related flags  */
853
36.5k
    if(!ps_seq->u1_frame_mbs_only_flag)
854
0
    {
855
0
        u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
856
0
        COPYTHECONTEXT("Slice Header SVC ext: field_pic_flag", u1_field_pic_flag);
857
0
        u1_bottom_field_flag = 0;
858
859
0
        if(u1_field_pic_flag)
860
0
        {
861
0
            ps_dec->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan_fld;
862
0
            u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm);
863
0
            COPYTHECONTEXT("Slice Header SVC ext: bottom_field_flag", u1_bottom_field_flag);
864
0
        }
865
0
        else
866
0
        {
867
0
            ps_dec->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan;
868
0
        }
869
0
    }
870
36.5k
    else
871
36.5k
    {
872
36.5k
        u1_field_pic_flag = 0;
873
36.5k
        u1_bottom_field_flag = 0;
874
36.5k
        ps_dec->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan;
875
36.5k
    }
876
877
36.5k
    u1_nal_unit_type = SLICE_NAL;
878
36.5k
    if(u1_is_idr_slice)
879
32.9k
    {
880
32.9k
        u1_nal_unit_type = IDR_SLICE_NAL;
881
32.9k
        u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
882
32.9k
        if(u4_idr_pic_id > 65535) return ERROR_INV_SLICE_HDR_T;
883
32.6k
        COPYTHECONTEXT("Slice Header SVC ext:  ", u4_idr_pic_id);
884
32.6k
    }
885
886
    /* read delta pic order count information*/
887
36.1k
    i_delta_poc[0] = i_delta_poc[1] = 0;
888
36.1k
    s_tmp_poc.i4_pic_order_cnt_lsb = 0;
889
36.1k
    s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
890
36.1k
    u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
891
36.1k
    if(u1_pic_order_cnt_type == 0)
892
34.8k
    {
893
34.8k
        i_temp = ih264d_get_bits_h264(ps_bitstrm, ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
894
34.8k
        if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb) return ERROR_INV_SLICE_HDR_T;
895
34.8k
        s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
896
34.8k
        COPYTHECONTEXT("Slice Header SVC ext: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
897
898
34.8k
        if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
899
4.00k
        {
900
4.00k
            s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
901
4.00k
            COPYTHECONTEXT("Slice Header SVC ext: delta_pic_order_cnt_bottom",
902
4.00k
                           s_tmp_poc.i4_delta_pic_order_cnt_bottom);
903
4.00k
        }
904
34.8k
    }
905
906
36.1k
    s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
907
36.1k
    s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
908
36.1k
    if(u1_pic_order_cnt_type == 1 && (!ps_seq->u1_delta_pic_order_always_zero_flag))
909
556
    {
910
556
        s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
911
556
        COPYTHECONTEXT("Slice Header SVC ext: delta_pic_order_cnt[0]",
912
556
                       s_tmp_poc.i4_delta_pic_order_cnt[0]);
913
914
556
        if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
915
375
        {
916
375
            s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
917
375
            COPYTHECONTEXT("Slice Header SVC ext: delta_pic_order_cnt[1]",
918
375
                           s_tmp_poc.i4_delta_pic_order_cnt[1]);
919
375
        }
920
556
    }
921
922
36.1k
    if(ps_pps->u1_redundant_pic_cnt_present_flag)
923
13.3k
    {
924
13.3k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
925
13.3k
        if(u4_temp > MAX_REDUNDANT_PIC_CNT) return ERROR_INV_SLICE_HDR_T;
926
13.1k
        u1_redundant_pic_cnt = u4_temp;
927
13.1k
        COPYTHECONTEXT("Slice Header SVC ext: redundant_pic_cnt", u1_redundant_pic_cnt);
928
13.1k
    }
929
930
    /*--------------------------------------------------------------------*/
931
    /* Check if the slice is part of new picture                          */
932
    /*--------------------------------------------------------------------*/
933
    /* First slice of a picture is always considered as part of new picture */
934
35.9k
    i1_is_end_of_poc = 1;
935
35.9k
    ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
936
937
35.9k
    if(ps_dec->u4_first_slice_in_pic == 0)
938
707
    {
939
707
        i1_is_end_of_poc =
940
707
            ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc, &s_tmp_poc, &ps_dec->s_cur_pic_poc,
941
707
                                 ps_cur_slice, u1_pic_order_cnt_type, u1_nal_unit_type,
942
707
                                 u4_idr_pic_id, u1_field_pic_flag, u1_bottom_field_flag);
943
707
        if(i1_is_end_of_poc)
944
70
        {
945
70
            ps_dec->u1_first_slice_in_stream = 0;
946
70
            return ERROR_INCOMPLETE_FRAME;
947
70
        }
948
707
    }
949
950
    /*--------------------------------------------------------------------*/
951
    /* Check for error in slice and parse the missing/corrupted MB's      */
952
    /* as skip-MB's in an inserted P-slice                                */
953
    /*--------------------------------------------------------------------*/
954
35.8k
    u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
955
35.8k
    prev_slice_err = 0;
956
957
35.8k
    if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
958
35.2k
    {
959
        /* If the current slice is not a field or frame number of the current
960
         * slice doesn't match with previous slice, and decoder is expecting
961
         * to decode a field i.e. ps_dec->u1_top_bottom_decoded is not 0 and
962
         * is not (TOP_FIELD_ONLY | BOT_FIELD_ONLY), treat it as a dangling
963
         * field */
964
35.2k
        if((u1_field_pic_flag == 0 || u2_frame_num != ps_dec->u2_prv_frame_num) &&
965
35.2k
           ps_dec->u1_top_bottom_decoded != 0 &&
966
0
           ps_dec->u1_top_bottom_decoded != (TOP_FIELD_ONLY | BOT_FIELD_ONLY))
967
0
        {
968
0
            ps_dec->u1_dangling_field = 1;
969
0
            if(ps_dec->u4_first_slice_in_pic)
970
0
            {
971
                // first slice - dangling field
972
0
                prev_slice_err = 1;
973
0
            }
974
0
            else
975
0
            {
976
                // last slice - dangling field
977
0
                prev_slice_err = 2;
978
0
            }
979
980
0
            if(ps_dec->u1_top_bottom_decoded == TOP_FIELD_ONLY)
981
0
                ps_cur_slice->u1_bottom_field_flag = 1;
982
0
            else
983
0
                ps_cur_slice->u1_bottom_field_flag = 0;
984
985
0
            num_mb_skipped =
986
0
                (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) - ps_dec->u4_total_mbs_coded;
987
0
            ps_cur_poc = &ps_dec->s_cur_pic_poc;
988
989
0
            u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL;
990
0
        }
991
35.2k
        else if(ps_dec->u4_first_slice_in_pic)
992
35.2k
        {
993
35.2k
            if(u2_first_mb_in_slice > 0)
994
0
            {
995
                // first slice - missing/header corruption
996
0
                prev_slice_err = 1;
997
0
                num_mb_skipped = u2_first_mb_in_slice << u1_mbaff;
998
0
                ps_cur_poc = &s_tmp_poc;
999
1000
                // initializing slice parameters
1001
0
                ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1002
0
                ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1003
0
                ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1004
0
                ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
1005
0
                ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1006
0
                ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1007
0
                ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1008
0
                ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
1009
0
                ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
1010
0
            }
1011
35.2k
        }
1012
0
        else
1013
0
        {
1014
            /* since i1_is_end_of_poc is set ,means new frame num is encountered. so
1015
             * conceal the current frame completely */
1016
0
            prev_slice_err = 2;
1017
0
            num_mb_skipped =
1018
0
                (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) - ps_dec->u4_total_mbs_coded;
1019
0
            ps_cur_poc = &s_tmp_poc;
1020
0
        }
1021
35.2k
    }
1022
637
    else
1023
637
    {
1024
637
        if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u4_total_mbs_coded)
1025
69
        {
1026
            // previous slice - missing/corruption
1027
69
            prev_slice_err = 2;
1028
69
            num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff) - ps_dec->u4_total_mbs_coded;
1029
69
            ps_cur_poc = &s_tmp_poc;
1030
69
        }
1031
568
        else if((u2_first_mb_in_slice << u1_mbaff) < ps_dec->u4_total_mbs_coded)
1032
0
        {
1033
0
            return ERROR_CORRUPTED_SLICE;
1034
0
        }
1035
637
    }
1036
35.8k
    if(prev_slice_err)
1037
69
    {
1038
69
        ret = isvcd_mark_err_slice_skip((svc_dec_lyr_struct_t *) ps_dec, num_mb_skipped,
1039
69
                                        u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err);
1040
1041
69
        if(ps_dec->u1_dangling_field == 1)
1042
0
        {
1043
0
            ps_dec->u1_second_field = 1 - ps_dec->u1_second_field;
1044
0
            ps_dec->u1_first_slice_in_stream = 0;
1045
0
            ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY;
1046
0
            return ERROR_DANGLING_FIELD_IN_PIC;
1047
0
        }
1048
1049
69
        if(prev_slice_err == 2)
1050
69
        {
1051
69
            ps_dec->u1_first_slice_in_stream = 0;
1052
69
            return ERROR_INCOMPLETE_FRAME;
1053
69
        }
1054
1055
0
        if(ps_dec->u4_total_mbs_coded >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1056
0
        {
1057
            /* return if all MBs in frame are parsed*/
1058
0
            ps_dec->u1_first_slice_in_stream = 0;
1059
0
            return ERROR_IN_LAST_SLICE_OF_PIC;
1060
0
        }
1061
1062
0
        if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
1063
0
        {
1064
0
            ih264d_err_pic_dispbuf_mgr(ps_dec);
1065
0
            return ERROR_NEW_FRAME_EXPECTED;
1066
0
        }
1067
1068
0
        if(ret != OK) return ret;
1069
1070
0
        i1_is_end_of_poc = 0;
1071
0
    }
1072
1073
35.8k
    if(u1_field_pic_flag)
1074
0
    {
1075
0
        ps_dec->u2_prv_frame_num = u2_frame_num;
1076
0
    }
1077
1078
35.8k
    if(ps_cur_slice->u1_mmco_equalto5)
1079
960
    {
1080
960
        WORD32 i4_temp_poc;
1081
960
        WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
1082
960
        WORD64 i8_result;
1083
960
        if(!ps_cur_slice->u1_field_pic_flag)  // or a complementary field pair
1084
960
        {
1085
960
            i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1086
960
            i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1087
960
            i4_temp_poc = MIN(i4_top_field_order_poc, i4_bot_field_order_poc);
1088
960
        }
1089
0
        else if(!ps_cur_slice->u1_bottom_field_flag)
1090
0
            i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1091
0
        else
1092
0
            i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1093
1094
960
        i8_result = (WORD64) i4_temp_poc - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1095
960
        if(IS_OUT_OF_RANGE_S32(i8_result))
1096
0
        {
1097
0
            return ERROR_INV_POC;
1098
0
        }
1099
960
        ps_dec->ps_cur_pic->i4_top_field_order_cnt = (WORD32) i8_result;
1100
960
        i8_result = (WORD64) i4_temp_poc - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1101
960
        if(IS_OUT_OF_RANGE_S32(i8_result))
1102
0
        {
1103
0
            return ERROR_INV_POC;
1104
0
        }
1105
960
        ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = (WORD32) i8_result;
1106
960
        ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
1107
960
        ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
1108
960
    }
1109
35.8k
    if(ps_dec->u4_first_slice_in_pic)
1110
35.2k
    {
1111
35.2k
        ret = isvcd_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num, &ps_dec->s_prev_pic_poc,
1112
35.2k
                                         &s_tmp_poc, ps_cur_slice, ps_pps, u1_nal_ref_idc,
1113
35.2k
                                         u1_bottom_field_flag, u1_field_pic_flag, &i4_poc, ps_dec);
1114
35.2k
        if(ret != OK) return ret;
1115
        /* Display seq no calculations */
1116
35.1k
        if(i4_poc >= ps_dec->i4_max_poc) ps_dec->i4_max_poc = i4_poc;
1117
        /* IDR Picture or POC wrap around */
1118
35.1k
        if(i4_poc == 0)
1119
4.27k
        {
1120
4.27k
            WORD64 i8_temp;
1121
4.27k
            i8_temp = (WORD64) ps_dec->i4_prev_max_display_seq + ps_dec->i4_max_poc +
1122
4.27k
                      ps_dec->u1_max_dec_frame_buffering + 1;
1123
            /*If i4_prev_max_display_seq overflows integer range, reset it */
1124
4.27k
            ps_dec->i4_prev_max_display_seq = IS_OUT_OF_RANGE_S32(i8_temp) ? 0 : i8_temp;
1125
4.27k
            ps_dec->i4_max_poc = 0;
1126
4.27k
        }
1127
35.1k
    }
1128
1129
    /* Increment only if the current slice has atleast 1 more MB */
1130
35.7k
    if(ps_dec->u4_first_slice_in_pic == 0 &&
1131
568
       (ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice <
1132
568
        (UWORD32) (ps_dec->u4_total_mbs_coded >> ps_dec->ps_cur_slice->u1_mbaff_frame_flag)))
1133
568
    {
1134
568
        ps_dec->ps_parse_cur_slice++;
1135
568
        ps_dec->u2_cur_slice_num++;
1136
        // in the case of single core increment ps_decode_cur_slice
1137
568
        if(ps_dec->u1_separate_parse == 0)
1138
382
        {
1139
382
            ps_dec->ps_decode_cur_slice++;
1140
382
        }
1141
568
    }
1142
1143
35.7k
    ps_dec->u1_slice_header_done = 0;
1144
1145
    /*--------------------------------------------------------------------*/
1146
    /* Copy the values read from the bitstream to the slice header and then*/
1147
    /* If the slice is first slice in picture, then do Start of Picture   */
1148
    /* processing.                                                        */
1149
    /*--------------------------------------------------------------------*/
1150
35.7k
    ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
1151
35.7k
    ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
1152
35.7k
    ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1153
35.7k
    ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
1154
35.7k
    ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1155
35.7k
    ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1156
35.7k
    ps_cur_slice->u1_slice_type = u1_slice_type;
1157
35.7k
    ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
1158
1159
35.7k
    ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1160
35.7k
    ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1161
35.7k
    ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1162
35.7k
    ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
1163
1164
35.7k
    if(ps_seq->u1_frame_mbs_only_flag)
1165
35.7k
        ps_cur_slice->u1_direct_8x8_inference_flag = ps_seq->u1_direct_8x8_inference_flag;
1166
0
    else
1167
0
        ps_cur_slice->u1_direct_8x8_inference_flag = 1;
1168
1169
35.7k
    if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
1170
35.7k
    {
1171
35.7k
        if(B_SLICE == u1_slice_type)
1172
13.8k
        {
1173
13.8k
            ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
1174
13.8k
            COPYTHECONTEXT("Slice Header SVC ext: direct_spatial_mv_pred_flag",
1175
13.8k
                           ps_cur_slice->u1_direct_spatial_mv_pred_flag);
1176
1177
13.8k
            if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
1178
5.03k
                ps_cur_slice->pf_decodeDirect = isvcd_decode_spatial_direct;
1179
8.85k
            else
1180
8.85k
                ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
1181
13.8k
            if(!((ps_seq->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1182
13.8k
                ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
1183
13.8k
        }
1184
21.8k
        else
1185
21.8k
        {
1186
21.8k
            if(!((ps_seq->u1_mb_aff_flag) && (!u1_field_pic_flag))) /*check if this is valid here */
1187
21.8k
                ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
1188
21.8k
        }
1189
35.7k
    }
1190
1191
35.7k
    if(ps_dec->u4_first_slice_in_pic)
1192
35.1k
    {
1193
35.1k
        if(u2_first_mb_in_slice == 0)
1194
35.1k
        {
1195
35.1k
            ret = isvcd_start_of_pic(ps_svc_lyr_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
1196
35.1k
            if(ret != OK) return ret;
1197
            /*inter layer buffer intialization */
1198
33.8k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1199
33.8k
                ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start;
1200
33.8k
            ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_cur_mb =
1201
33.8k
                ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_base;
1202
33.8k
        }
1203
1204
33.8k
        ps_dec->u4_output_present = 0;
1205
1206
33.8k
        {
1207
33.8k
            ih264d_get_next_display_field(ps_dec, ps_dec->ps_out_buffer, &(ps_dec->s_disp_op));
1208
            /* If error code is non-zero then there is no buffer available for
1209
            display, hence avoid format conversion */
1210
1211
33.8k
            if(0 != ps_dec->s_disp_op.u4_error_code)
1212
10.9k
            {
1213
10.9k
                ps_dec->u4_output_present = 0;
1214
10.9k
                ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
1215
10.9k
            }
1216
22.9k
            else
1217
22.9k
                ps_dec->u4_output_present = 1;
1218
33.8k
        }
1219
33.8k
        ret = isvcd_parse_interlayer_resamp_func_init(ps_svc_lyr_dec, u2_first_mb_in_slice);
1220
33.8k
        if(ret != OK)
1221
501
        {
1222
501
            return ERROR_CORRUPTED_SLICE;
1223
501
        }
1224
33.3k
        if((ps_dec->u1_separate_parse == 1) &&
1225
20.8k
           (ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) && (ps_svc_lyr_dec->u1_res_init_done == 1))
1226
20.8k
        {
1227
20.8k
            if(ps_dec->u4_dec_thread_created == 0)
1228
20.8k
            {
1229
20.8k
                ithread_create(ps_dec->pv_dec_thread_handle, NULL,
1230
20.8k
                               (void *) isvcd_decode_picture_thread, (void *) ps_dec);
1231
1232
20.8k
                ps_dec->u4_dec_thread_created = 1;
1233
20.8k
            }
1234
#ifdef KEEP_THREADS_ACTIVE
1235
            ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
1236
            RETURN_IF((ret != IV_SUCCESS), ret);
1237
1238
            ps_dec->ai4_process_start[0] = PROC_START;
1239
            ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[0]);
1240
            RETURN_IF((ret != IV_SUCCESS), ret);
1241
1242
            ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
1243
            RETURN_IF((ret != IV_SUCCESS), ret);
1244
#endif
1245
#ifdef KEEP_THREADS_ACTIVE
1246
            if(ps_dec->u4_bs_deblk_thread_created)
1247
            {
1248
                ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
1249
                RETURN_IF((ret != IV_SUCCESS), ret);
1250
1251
                ps_dec->ai4_process_start[1] = PROC_START;
1252
                ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[1]);
1253
                RETURN_IF((ret != IV_SUCCESS), ret);
1254
1255
                ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
1256
                RETURN_IF((ret != IV_SUCCESS), ret);
1257
            }
1258
#endif
1259
20.8k
        }
1260
33.3k
    }
1261
1262
    /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
1263
33.9k
    {
1264
33.9k
        UWORD8 uc_nofield_nombaff;
1265
1266
33.9k
        uc_nofield_nombaff =
1267
33.9k
            ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0) &&
1268
33.9k
             (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0) && (u1_slice_type != B_SLICE) &&
1269
20.6k
             (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0));
1270
1271
        /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
1272
1273
33.9k
        if(uc_nofield_nombaff)
1274
17.1k
        {
1275
17.1k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
1276
17.1k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
1277
17.1k
        }
1278
16.7k
        else
1279
16.7k
        {
1280
16.7k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
1281
16.7k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
1282
16.7k
        }
1283
33.9k
    }
1284
1285
    /*
1286
     * Decide whether to decode the current picture or not
1287
     */
1288
33.9k
    {
1289
33.9k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
1290
33.9k
        if(ps_err->u4_frm_sei_sync == u2_frame_num)
1291
0
        {
1292
0
            ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1293
0
            ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
1294
0
        }
1295
33.9k
        ps_err->u4_cur_frm = u2_frame_num;
1296
33.9k
    }
1297
1298
    /* Decision for decoding if the picture is to be skipped */
1299
33.9k
    {
1300
33.9k
        WORD32 i4_skip_b_pic, i4_skip_p_pic;
1301
1302
33.9k
        i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT) && (B_SLICE == u1_slice_type) &&
1303
0
                        (0 == u1_nal_ref_idc);
1304
1305
33.9k
        i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT) && (P_SLICE == u1_slice_type) &&
1306
0
                        (0 == u1_nal_ref_idc);
1307
1308
        /**************************************************************/
1309
        /* Skip the B picture if skip mask is set for B picture and   */
1310
        /* Current B picture is a non reference B picture or there is */
1311
        /* no user for reference B picture                            */
1312
        /**************************************************************/
1313
33.9k
        if(i4_skip_b_pic)
1314
0
        {
1315
0
            ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1316
            /* Don't decode the picture in SKIP-B mode if that picture is B */
1317
            /* and also it is not to be used as a reference picture         */
1318
0
            ps_dec->u1_last_pic_not_decoded = 1;
1319
1320
0
            return OK;
1321
0
        }
1322
        /**************************************************************/
1323
        /* Skip the P picture if skip mask is set for P picture and   */
1324
        /* Current P picture is a non reference P picture or there is */
1325
        /* no user for reference P picture                            */
1326
        /**************************************************************/
1327
33.9k
        if(i4_skip_p_pic)
1328
0
        {
1329
0
            ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1330
            /* Don't decode the picture in SKIP-P mode if that picture is P */
1331
            /* and also it is not to be used as a reference picture         */
1332
0
            ps_dec->u1_last_pic_not_decoded = 1;
1333
1334
0
            return OK;
1335
0
        }
1336
33.9k
    }
1337
1338
33.9k
    {
1339
33.9k
        UWORD16 u2_mb_x, u2_mb_y;
1340
1341
33.9k
        ps_dec->i4_submb_ofst =
1342
33.9k
            ((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE) -
1343
33.9k
            SUB_BLK_SIZE;
1344
33.9k
        if(u2_first_mb_in_slice)
1345
568
        {
1346
568
            UWORD8 u1_mb_aff;
1347
568
            UWORD8 u1_field_pic;
1348
568
            UWORD16 u2_frm_wd_in_mbs;
1349
568
            u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
1350
568
            u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
1351
568
            u1_field_pic = ps_cur_slice->u1_field_pic_flag;
1352
1353
568
            {
1354
568
                UWORD32 x_offset;
1355
568
                UWORD32 y_offset;
1356
568
                UWORD32 u4_frame_stride;
1357
568
                tfr_ctxt_t *ps_trns_addr;  // = &ps_dec->s_tran_addrecon_parse;
1358
1359
568
                if(ps_dec->u1_separate_parse)
1360
186
                {
1361
186
                    ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1362
186
                }
1363
382
                else
1364
382
                {
1365
382
                    ps_trns_addr = &ps_dec->s_tran_addrecon;
1366
382
                }
1367
568
                u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1368
568
                u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1369
1370
568
                u2_mb_y <<= u1_mb_aff;
1371
1372
568
                if((u2_mb_x > u2_frm_wd_in_mbs - 1) || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1))
1373
0
                {
1374
0
                    return ERROR_CORRUPTED_SLICE;
1375
0
                }
1376
1377
568
                u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
1378
568
                x_offset = u2_mb_x << 4;
1379
568
                y_offset = (u2_mb_y * u4_frame_stride) << 4;
1380
1381
568
                ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset + y_offset;
1382
1383
568
                u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
1384
568
                x_offset >>= 1;
1385
568
                y_offset = (u2_mb_y * u4_frame_stride) << 3;
1386
1387
568
                x_offset *= YUV420SP_FACTOR;
1388
1389
568
                ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset + y_offset;
1390
568
                ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset + y_offset;
1391
1392
568
                ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1393
568
                ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1394
568
                ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1395
1396
                // assign the deblock structure pointers to start of slice
1397
568
                if(ps_dec->u1_separate_parse == 1)
1398
186
                {
1399
186
                    ps_dec->ps_deblk_mbn =
1400
186
                        ps_dec->ps_deblk_pic + (u2_first_mb_in_slice << u1_mb_aff);
1401
186
                }
1402
382
                else
1403
382
                {
1404
382
                    ps_dec->ps_deblk_mbn =
1405
382
                        ps_dec->ps_deblk_pic + (u2_first_mb_in_slice << u1_mb_aff);
1406
382
                }
1407
1408
568
                ps_dec->u4_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
1409
1410
568
                ps_dec->ps_mv_cur =
1411
568
                    ps_dec->s_cur_pic.ps_mv + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
1412
568
            }
1413
568
        }
1414
33.3k
        else
1415
33.3k
        {
1416
33.3k
            tfr_ctxt_t *ps_trns_addr;
1417
1418
33.3k
            if(ps_dec->u1_separate_parse)
1419
20.8k
            {
1420
20.8k
                ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1421
20.8k
            }
1422
12.5k
            else
1423
12.5k
            {
1424
12.5k
                ps_trns_addr = &ps_dec->s_tran_addrecon;
1425
12.5k
            }
1426
1427
33.3k
            u2_mb_x = 0xffff;
1428
33.3k
            u2_mb_y = 0;
1429
            // assign the deblock structure pointers to start of slice
1430
33.3k
            ps_dec->u4_cur_mb_addr = 0;
1431
33.3k
            ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
1432
33.3k
            ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
1433
33.3k
            ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
1434
33.3k
            ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
1435
33.3k
            ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
1436
1437
33.3k
            ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1438
33.3k
            ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1439
33.3k
            ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1440
33.3k
        }
1441
1442
33.9k
        ps_dec->ps_part = ps_dec->ps_parse_part_params;
1443
1444
33.9k
        ps_dec->u2_mbx = (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1445
33.9k
        ps_dec->u2_mby = (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1446
33.9k
        ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
1447
33.9k
        ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1448
33.9k
        ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1449
33.9k
    }
1450
1451
    /* RBSP stop bit is used for CABAC decoding*/
1452
0
    ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode;
1453
1454
33.9k
    ps_dec->u1_B = (u1_slice_type == B_SLICE);
1455
33.9k
    ps_dec->u4_next_mb_skip = 0;
1456
1457
33.9k
    ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->ps_cur_slice->u2_first_mb_in_slice;
1458
33.9k
    ps_dec->ps_parse_cur_slice->slice_type = ps_dec->ps_cur_slice->u1_slice_type;
1459
1460
33.9k
    ps_dec->u4_start_recon_deblk = 1;
1461
33.9k
    {
1462
33.9k
        WORD32 num_entries;
1463
33.9k
        WORD32 size;
1464
33.9k
        UWORD8 *pu1_buf;
1465
1466
33.9k
        num_entries = MAX_FRAMES;
1467
33.9k
        if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && (0 == ps_dec->i4_display_delay))
1468
0
        {
1469
0
            num_entries = 1;
1470
0
        }
1471
33.9k
        num_entries = ((2 * num_entries) + 1);
1472
33.9k
        num_entries *= 2;
1473
1474
33.9k
        size = num_entries * sizeof(void *);
1475
33.9k
        size += PAD_MAP_IDX_POC * sizeof(void *);
1476
1477
33.9k
        pu1_buf = (UWORD8 *) ps_dec->pv_map_ref_idx_to_poc_buf;
1478
33.9k
        pu1_buf += size * ps_dec->u2_cur_slice_num;
1479
33.9k
        ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (void *) pu1_buf;
1480
33.9k
    }
1481
1482
33.9k
    if(ps_dec->u1_separate_parse)
1483
20.9k
    {
1484
20.9k
        ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1485
20.9k
    }
1486
12.9k
    else
1487
12.9k
    {
1488
12.9k
        ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1489
12.9k
    }
1490
1491
33.9k
    ret = ih264d_fix_error_in_dpb(ps_dec);
1492
33.9k
    if(ret < 0) return ERROR_DBP_MANAGER_T;
1493
1494
    /*Default initializing default values for some parameters*/
1495
33.9k
    ps_svc_slice_params->u1_slice_skip_flag = 0;
1496
33.9k
    ps_svc_slice_params->u1_adaptive_base_mode_flag = 0;
1497
33.9k
    ps_svc_slice_params->u1_default_base_mode_flag = 0;
1498
33.9k
    ps_svc_slice_params->u1_adaptive_motion_prediction_flag = 0;
1499
33.9k
    ps_svc_slice_params->u1_default_motion_prediction_flag = 0;
1500
33.9k
    ps_svc_slice_params->u1_adaptive_residual_prediction_flag = 0;
1501
33.9k
    ps_svc_slice_params->u1_default_residual_prediction_flag = 0;
1502
1503
33.9k
    if(u1_slice_type == I_SLICE)
1504
5.68k
    {
1505
5.68k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
1506
1507
5.68k
        ret = isvcd_parse_eislice(ps_svc_lyr_dec, u2_first_mb_in_slice);
1508
5.68k
        ps_dec->u1_pr_sl_type = u1_slice_type;
1509
5.68k
        if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
1510
5.52k
            ps_dec->i4_pic_type = I_SLICE;
1511
5.68k
    }
1512
28.2k
    else if(u1_slice_type == P_SLICE)
1513
14.8k
    {
1514
14.8k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1515
14.8k
        ret = isvcd_parse_epslice(ps_svc_lyr_dec, u2_first_mb_in_slice);
1516
14.8k
        ps_dec->u1_pr_sl_type = u1_slice_type;
1517
14.8k
        if(ps_dec->i4_pic_type != B_SLICE) ps_dec->i4_pic_type = P_SLICE;
1518
14.8k
    }
1519
13.3k
    else if(u1_slice_type == B_SLICE)
1520
13.3k
    {
1521
13.3k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1522
13.3k
        ret = isvcd_parse_ebslice(ps_svc_lyr_dec, u2_first_mb_in_slice);
1523
13.3k
        ps_dec->u1_pr_sl_type = u1_slice_type;
1524
13.3k
        ps_dec->i4_pic_type = B_SLICE;
1525
13.3k
    }
1526
68
    else
1527
68
        return ERROR_INV_SLC_TYPE_T;
1528
1529
33.8k
    if(ps_dec->u1_slice_header_done)
1530
24.6k
    {
1531
        /* set to zero to indicate a valid slice has been decoded */
1532
24.6k
        ps_dec->u1_first_slice_in_stream = 0;
1533
24.6k
    }
1534
1535
33.8k
    if(ret != OK) return ret;
1536
1537
11.4k
    if(u1_nal_ref_idc != 0)
1538
10.2k
    {
1539
10.2k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1540
10.0k
        {
1541
10.0k
            memcpy((void *) ps_dec->ps_dpb_cmds, (void *) (&(ps_dec->s_dpb_cmds_scratch)),
1542
10.0k
                   sizeof(dpb_commands_t));
1543
10.0k
        }
1544
10.2k
    }
1545
1546
    /* storing last Mb X and MbY of the slice */
1547
11.4k
    ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1548
11.4k
    ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1549
1550
    /* End of Picture detection */
1551
11.4k
    if(ps_dec->u4_total_mbs_coded >= (ps_seq->u4_max_mb_addr + 1))
1552
7.26k
    {
1553
7.26k
        ps_dec->u1_pic_decode_done = 1;
1554
7.26k
    }
1555
1556
11.4k
    {
1557
11.4k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
1558
11.4k
        if((ps_err->u1_err_flag & REJECT_PB_PICS) && (ps_err->u1_cur_pic_type == PIC_TYPE_I))
1559
0
        {
1560
0
            ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1561
0
        }
1562
11.4k
    }
1563
1564
11.4k
    PRINT_BIN_BIT_RATIO(ps_dec)
1565
1566
11.4k
    return ret;
1567
33.8k
}
1568
1569
/*!
1570
**************************************************************************
1571
* \if Function name : isvcd_set_default_slice_header_ext \endif
1572
*
1573
* \brief
1574
*    sets the default values for the svc slice header attr
1575
*
1576
* \return
1577
*    0 on Success and Error code otherwise
1578
**************************************************************************
1579
*/
1580
WORD32 isvcd_set_default_slice_header_ext(svc_dec_lyr_struct_t *ps_svc_lyr_dec)
1581
26.5k
{
1582
26.5k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1583
26.5k
    WORD32 i_status = OK;
1584
26.5k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1585
26.5k
    dec_seq_params_t *ps_seq;
1586
26.5k
    dec_svc_seq_params_t *ps_subset_seq;
1587
26.5k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1588
26.5k
    dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
1589
26.5k
    ps_seq = ps_pps->ps_sps;
1590
26.5k
    ps_seq += MAX_NUM_SEQ_PARAMS;
1591
26.5k
    ps_subset_seq =
1592
26.5k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
1593
26.5k
    ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
1594
26.5k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1595
1596
26.5k
    if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
1597
26.5k
    {
1598
26.5k
        ps_svc_slice_params->u1_ref_layer_chroma_phase_y_plus1 =
1599
26.5k
            ps_sps_svc_ext->u1_seq_ref_layer_chroma_phase_y_plus1;
1600
1601
26.5k
        ps_svc_slice_params->u1_ref_layer_chroma_phase_x_plus1_flag =
1602
26.5k
            ps_sps_svc_ext->u1_seq_ref_layer_chroma_phase_x_plus1_flag;
1603
26.5k
    }
1604
1605
26.5k
    ps_svc_slice_params->u4_ref_layer_dq_id = UINT32_MAX;
1606
26.5k
    ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc = 0;
1607
26.5k
    ps_svc_slice_params->u1_scan_idx_start = 0;
1608
26.5k
    ps_svc_slice_params->u1_scan_idx_end = 15;
1609
26.5k
    ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2 = 0;
1610
26.5k
    ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2 = 0;
1611
26.5k
    ps_svc_slice_params->u1_constrained_intra_resampling_flag = 0;
1612
1613
26.5k
    return i_status;
1614
26.5k
}
1615
1616
/*!
1617
**************************************************************************
1618
* \if Function name : isvcd_parse_slice_header \endif
1619
*
1620
* \brief
1621
*    parses the svc slice header attr
1622
*
1623
* \return
1624
*    0 on Success and Error code otherwise
1625
**************************************************************************
1626
*/
1627
WORD32 isvcd_parse_slice_header(svc_dec_lyr_struct_t *ps_svc_lyr_dec)
1628
26.5k
{
1629
26.5k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1630
26.5k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1631
26.5k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1632
26.5k
    dec_seq_params_t *ps_seq;
1633
26.5k
    dec_svc_seq_params_t *ps_subset_seq;
1634
26.5k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1635
26.5k
    dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
1636
26.5k
    svc_dec_ctxt_t *ps_svcd_ctxt;
1637
26.5k
    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
1638
26.5k
    UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
1639
26.5k
    ps_svcd_ctxt = ps_svc_lyr_dec->ps_svcd_ctxt;
1640
26.5k
    ps_seq = ps_pps->ps_sps;
1641
26.5k
    ps_seq += MAX_NUM_SEQ_PARAMS;
1642
26.5k
    ps_subset_seq =
1643
26.5k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
1644
26.5k
    ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
1645
26.5k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1646
1647
26.5k
    if(!ps_svc_lyr_dec->ps_nal_svc_ext->u1_no_inter_layer_pred_flag &&
1648
26.5k
       (0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id))
1649
26.5k
    {
1650
26.5k
        ps_svc_slice_params->u4_ref_layer_dq_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1651
26.5k
        COPYTHECONTEXT("Slice Header SVC ext: u4_ref_layer_dq_id",
1652
26.5k
                       ps_svc_slice_params->u4_ref_layer_dq_id);
1653
26.5k
        if(ps_svc_slice_params->u4_ref_layer_dq_id > MAX_REF_DEP_ID)
1654
289
        {
1655
289
            return ERROR_INV_SLICE_HDR_T;
1656
289
        }
1657
        /* Reference layer id update is taken care during resolution init */
1658
        /*
1659
        ps_svc_lyr_dec->u1_ref_layer_id = ps_svc_slice_params->u4_ref_layer_dq_id >> 4;
1660
        if(ps_svc_lyr_dec->u1_ref_layer_id >= ps_svc_lyr_dec->u1_layer_id)
1661
        {
1662
            return ERROR_INV_SLICE_HDR_T;
1663
        }
1664
        */
1665
26.2k
        ps_svc_lyr_dec->ps_dec_svc_ref_layer =
1666
26.2k
            &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svc_lyr_dec->u1_ref_layer_id];
1667
1668
26.2k
        if(ps_sps_svc_ext->u1_inter_layer_deblocking_filter_control_present_flag)
1669
1.41k
        {
1670
1.41k
            ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc =
1671
1.41k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1672
1.41k
            COPYTHECONTEXT("Slice Header SVC ext: u4_disable_inter_layer_deblk_filter_idc",
1673
1.41k
                           ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc);
1674
1675
1.41k
            if(ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc > 6)
1676
135
            {
1677
135
                return ERROR_INV_SLICE_HDR_T;
1678
135
            }
1679
1680
1.27k
            if(1 != ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc)
1681
1.14k
            {
1682
1.14k
                ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2 =
1683
1.14k
                    ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1684
1.14k
                COPYTHECONTEXT("Slice Header SVC ext: i4_inter_layer_slice_alpha_c0_offset_div2",
1685
1.14k
                               ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2);
1686
1687
1.14k
                if(ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2 > 6 ||
1688
1.06k
                   ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2 < -6)
1689
147
                {
1690
147
                    return ERROR_INV_SLICE_HDR_T;
1691
147
                }
1692
1693
995
                ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2 =
1694
995
                    ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1695
995
                COPYTHECONTEXT("Slice Header SVC ext: i4_inter_layer_slice_beta_offset_div2",
1696
995
                               ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2);
1697
1698
995
                if(ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2 > 6 ||
1699
848
                   ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2 < -6)
1700
232
                {
1701
232
                    return ERROR_INV_SLICE_HDR_T;
1702
232
                }
1703
995
            }
1704
1.27k
        }
1705
1706
25.7k
        ps_svc_slice_params->u1_constrained_intra_resampling_flag = ih264d_get_bit_h264(ps_bitstrm);
1707
25.7k
        COPYTHECONTEXT("Slice Header SVC ext: u1_constrained_intra_resampling_flag",
1708
25.7k
                       ps_svc_slice_params->u1_constrained_intra_resampling_flag);
1709
1710
25.7k
        ps_svc_lyr_dec->s_res_prms.i1_constrained_intra_rsmpl_flag =
1711
25.7k
            ps_svc_lyr_dec->s_svc_slice_params.u1_constrained_intra_resampling_flag;
1712
25.7k
        isvcd_intra_resamp_res_init_update_flags(ps_svc_lyr_dec);
1713
1714
25.7k
        if(2 == ps_sps_svc_ext->u1_extended_spatial_scalability_idc)
1715
0
        {
1716
            /* ChromaArrayType = i4_chroma_format_idc  if  separate_colour_plane_flag
1717
             * = 0 for all chroma format except 4:4:4 */
1718
0
            if(ps_dec->ps_cur_sps->i4_chroma_format_idc >= 0)
1719
0
            {
1720
0
                ps_svc_slice_params->u1_ref_layer_chroma_phase_x_plus1_flag =
1721
0
                    ih264d_get_bit_h264(ps_bitstrm);
1722
0
                COPYTHECONTEXT("Slice Header SVC ext: u1_ref_layer_chroma_phase_x_plus1_flag",
1723
0
                               ps_svc_slice_params->u1_ref_layer_chroma_phase_x_plus1_flag);
1724
1725
0
                ps_svc_slice_params->u1_ref_layer_chroma_phase_y_plus1 =
1726
0
                    ih264d_get_bits_h264(ps_bitstrm, 2);
1727
0
                COPYTHECONTEXT("Slice Header SVC ext: u1_ref_layer_chroma_phase_y_plus1",
1728
0
                               ps_svc_slice_params->u1_ref_layer_chroma_phase_y_plus1);
1729
1730
0
                if(ps_svc_slice_params->u1_ref_layer_chroma_phase_y_plus1 > 2)
1731
0
                {
1732
0
                    return ERROR_INV_SLICE_HDR_T;
1733
0
                }
1734
0
            }
1735
0
            else
1736
0
            {
1737
0
                if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
1738
0
                {
1739
0
                    ps_svc_slice_params->u1_ref_layer_chroma_phase_y_plus1 =
1740
0
                        ps_sps_svc_ext->u1_seq_ref_layer_chroma_phase_y_plus1;
1741
0
                }
1742
0
            }
1743
1744
0
            ps_svc_slice_params->i4_scaled_ref_layer_left_offset =
1745
0
                ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1746
0
            COPYTHECONTEXT("Slice Header SVC ext: i4_scaled_ref_layer_left_offset",
1747
0
                           ps_svc_slice_params->i4_scaled_ref_layer_left_offset);
1748
1749
0
            if(ps_svc_slice_params->i4_scaled_ref_layer_left_offset != 0)
1750
0
            {
1751
0
                return ERROR_INV_SLICE_HDR_T;
1752
0
            }
1753
1754
0
            if(ps_svc_slice_params->i4_scaled_ref_layer_left_offset >= MAX_SCLD_REF_LAYER_OFFSET ||
1755
0
               ps_svc_slice_params->i4_scaled_ref_layer_left_offset < MIN_SCLD_REF_LAYER_OFFSET)
1756
0
            {
1757
0
                return ERROR_INV_SLICE_HDR_T;
1758
0
            }
1759
1760
0
            ps_svc_slice_params->i4_scaled_ref_layer_top_offset =
1761
0
                ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1762
0
            COPYTHECONTEXT("Slice Header SVC ext: i4_scaled_ref_layer_top_offset",
1763
0
                           ps_svc_slice_params->i4_scaled_ref_layer_top_offset);
1764
1765
0
            if(ps_svc_slice_params->i4_scaled_ref_layer_top_offset != 0)
1766
0
            {
1767
0
                return ERROR_INV_SLICE_HDR_T;
1768
0
            }
1769
1770
0
            if(ps_svc_slice_params->i4_scaled_ref_layer_top_offset >= MAX_SCLD_REF_LAYER_OFFSET ||
1771
0
               ps_svc_slice_params->i4_scaled_ref_layer_top_offset < MIN_SCLD_REF_LAYER_OFFSET)
1772
0
            {
1773
0
                return ERROR_INV_SLICE_HDR_T;
1774
0
            }
1775
1776
0
            ps_svc_slice_params->i4_scaled_ref_layer_right_offset =
1777
0
                ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1778
0
            COPYTHECONTEXT("Slice Header SVC ext: i4_scaled_ref_layer_right_offset",
1779
0
                           ps_svc_slice_params->i4_scaled_ref_layer_right_offset);
1780
1781
0
            if(ps_svc_slice_params->i4_scaled_ref_layer_right_offset >= MAX_SCLD_REF_LAYER_OFFSET ||
1782
0
               ps_svc_slice_params->i4_scaled_ref_layer_right_offset < MIN_SCLD_REF_LAYER_OFFSET)
1783
0
            {
1784
0
                return ERROR_INV_SLICE_HDR_T;
1785
0
            }
1786
1787
0
            ps_svc_slice_params->i4_scaled_ref_layer_bottom_offset =
1788
0
                ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1789
0
            COPYTHECONTEXT("Slice Header SVC ext: i4_scaled_ref_layer_bottom_offset",
1790
0
                           ps_svc_slice_params->i4_scaled_ref_layer_bottom_offset);
1791
1792
0
            if(ps_svc_slice_params->i4_scaled_ref_layer_bottom_offset >=
1793
0
                   MAX_SCLD_REF_LAYER_OFFSET ||
1794
0
               ps_svc_slice_params->i4_scaled_ref_layer_bottom_offset < MIN_SCLD_REF_LAYER_OFFSET)
1795
0
            {
1796
0
                return ERROR_INV_SLICE_HDR_T;
1797
0
            }
1798
0
        }
1799
25.7k
        else
1800
25.7k
        {
1801
25.7k
            ps_svc_slice_params->i4_scaled_ref_layer_left_offset =
1802
25.7k
                ps_sps_svc_ext->i4_seq_scaled_ref_layer_left_offset;
1803
25.7k
            ps_svc_slice_params->i4_scaled_ref_layer_top_offset =
1804
25.7k
                ps_sps_svc_ext->i4_seq_scaled_ref_layer_top_offset;
1805
25.7k
            ps_svc_slice_params->i4_scaled_ref_layer_right_offset =
1806
25.7k
                ps_sps_svc_ext->i4_seq_scaled_ref_layer_right_offset;
1807
25.7k
            ps_svc_slice_params->i4_scaled_ref_layer_bottom_offset =
1808
25.7k
                ps_sps_svc_ext->i4_seq_scaled_ref_layer_bottom_offset;
1809
25.7k
        }
1810
25.7k
    }
1811
1812
25.7k
    if(!ps_svc_lyr_dec->ps_nal_svc_ext->u1_no_inter_layer_pred_flag)
1813
25.7k
    {
1814
25.7k
        ps_svc_slice_params->u1_slice_skip_flag = ih264d_get_bit_h264(ps_bitstrm);
1815
25.7k
        COPYTHECONTEXT("Slice Header SVC ext: u1_slice_skip_flag",
1816
25.7k
                       ps_svc_slice_params->u1_slice_skip_flag);
1817
1818
25.7k
        if(ps_svc_slice_params->u1_slice_skip_flag)
1819
1.25k
        {
1820
1.25k
            ps_svc_slice_params->u4_num_mbs_in_slice_minus1 =
1821
1.25k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1822
1.25k
            COPYTHECONTEXT("Slice Header SVC ext: u4_num_mbs_in_slice_minus1",
1823
1.25k
                           ps_svc_slice_params->u4_num_mbs_in_slice_minus1);
1824
1.25k
        }
1825
24.4k
        else
1826
24.4k
        {
1827
24.4k
            ps_svc_slice_params->u1_adaptive_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1828
24.4k
            COPYTHECONTEXT("Slice Header SVC ext: u1_adaptive_base_mode_flag",
1829
24.4k
                           ps_svc_slice_params->u1_adaptive_base_mode_flag);
1830
1831
24.4k
            if(!ps_svc_slice_params->u1_adaptive_base_mode_flag)
1832
13.9k
            {
1833
13.9k
                ps_svc_slice_params->u1_default_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1834
13.9k
                COPYTHECONTEXT("Slice Header SVC ext: u1_default_base_mode_flag",
1835
13.9k
                               ps_svc_slice_params->u1_default_base_mode_flag);
1836
13.9k
            }
1837
24.4k
            if(!ps_svc_slice_params->u1_default_base_mode_flag)
1838
18.7k
            {
1839
18.7k
                ps_svc_slice_params->u1_adaptive_motion_prediction_flag =
1840
18.7k
                    ih264d_get_bit_h264(ps_bitstrm);
1841
18.7k
                COPYTHECONTEXT("Slice Header SVC ext: u1_adaptive_motion_prediction_flag",
1842
18.7k
                               ps_svc_slice_params->u1_adaptive_motion_prediction_flag);
1843
1844
18.7k
                if(!ps_svc_slice_params->u1_adaptive_motion_prediction_flag)
1845
12.4k
                {
1846
12.4k
                    ps_svc_slice_params->u1_default_motion_prediction_flag =
1847
12.4k
                        ih264d_get_bit_h264(ps_bitstrm);
1848
12.4k
                    COPYTHECONTEXT("Slice Header SVC ext: u1_default_motion_prediction_flag",
1849
12.4k
                                   ps_svc_slice_params->u1_default_motion_prediction_flag);
1850
12.4k
                }
1851
18.7k
            }
1852
24.4k
            ps_svc_slice_params->u1_adaptive_residual_prediction_flag =
1853
24.4k
                ih264d_get_bit_h264(ps_bitstrm);
1854
24.4k
            COPYTHECONTEXT("Slice Header SVC ext: u1_adaptive_residual_prediction_flag",
1855
24.4k
                           ps_svc_slice_params->u1_adaptive_residual_prediction_flag);
1856
1857
24.4k
            if(!ps_svc_slice_params->u1_adaptive_residual_prediction_flag)
1858
17.3k
            {
1859
17.3k
                ps_svc_slice_params->u1_default_residual_prediction_flag =
1860
17.3k
                    ih264d_get_bit_h264(ps_bitstrm);
1861
17.3k
                COPYTHECONTEXT("Slice Header SVC ext: u1_default_residual_prediction_flag",
1862
17.3k
                               ps_svc_slice_params->u1_default_residual_prediction_flag);
1863
17.3k
            }
1864
24.4k
        }
1865
1866
25.7k
        if(ps_sps_svc_ext->u1_adaptive_tcoeff_level_prediction_flag)
1867
1.28k
        {
1868
1.28k
            ps_svc_slice_params->u1_tcoeff_level_prediction_flag = ih264d_get_bit_h264(ps_bitstrm);
1869
1.28k
            COPYTHECONTEXT("Slice Header SVC ext: u1_tcoeff_level_prediction_flag",
1870
1.28k
                           ps_svc_slice_params->u1_tcoeff_level_prediction_flag);
1871
1872
1.28k
            if(ps_svc_slice_params->u1_tcoeff_level_prediction_flag != 0)
1873
153
            {
1874
153
                return ERROR_INV_SPS_PPS_T;
1875
153
            }
1876
1.28k
        }
1877
25.7k
    }
1878
1879
25.5k
    if(!ps_sps_svc_ext->u1_slice_header_restriction_flag &&
1880
21.9k
       !ps_svc_slice_params->u1_slice_skip_flag)
1881
20.9k
    {
1882
20.9k
        ps_svc_slice_params->u1_scan_idx_start = ih264d_get_bits_h264(ps_bitstrm, 4);
1883
20.9k
        COPYTHECONTEXT("Slice Header SVC ext: u1_scan_idx_start",
1884
20.9k
                       ps_svc_slice_params->u1_scan_idx_start);
1885
20.9k
        ps_svc_slice_params->u1_scan_idx_end = ih264d_get_bits_h264(ps_bitstrm, 4);
1886
20.9k
        COPYTHECONTEXT("Slice Header SVC ext: u1_scan_idx_end",
1887
20.9k
                       ps_svc_slice_params->u1_scan_idx_end);
1888
1889
20.9k
        if(0 != ps_svc_slice_params->u1_scan_idx_start &&
1890
12.3k
           15 != ps_svc_slice_params->u1_scan_idx_end)
1891
933
            return ERROR_SVC_INV_SCAN_IDX;
1892
20.9k
    }
1893
24.6k
    return OK;
1894
25.5k
}
1895
1896
/*!
1897
**************************************************************************
1898
* \if Function name : DecodeSlice \endif
1899
*
1900
* \brief
1901
*    Parses a slice
1902
*
1903
* \return
1904
*    0 on Success and Error code otherwise
1905
**************************************************************************
1906
*/
1907
1908
WORD32 isvcd_parse_decode_slice(UWORD8 u1_is_idr_slice, UWORD8 u1_nal_ref_idc,
1909
                                svc_dec_lyr_struct_t *ps_svc_lyr_dec /* SVC Decoder parameters */
1910
)
1911
131k
{
1912
131k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1913
131k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1914
131k
    dec_pic_params_t *ps_pps;
1915
131k
    dec_seq_params_t *ps_seq;
1916
131k
    dec_svc_seq_params_t *ps_subset_seq;
1917
131k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
1918
131k
    pocstruct_t s_tmp_poc = {0};
1919
131k
    WORD32 i_delta_poc[2] = {0};
1920
131k
    WORD32 i4_poc = 0;
1921
131k
    UWORD16 u2_first_mb_in_slice, u2_frame_num;
1922
131k
    UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type;
1923
131k
    UWORD32 u4_idr_pic_id = 0;
1924
131k
    UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type;
1925
131k
    UWORD8 u1_nal_unit_type;
1926
131k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1927
131k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1928
131k
    WORD8 i1_is_end_of_poc;
1929
1930
131k
    WORD32 ret;
1931
131k
    WORD32 prev_slice_err, num_mb_skipped;
1932
131k
    UWORD32 u4_mbaff;
1933
131k
    pocstruct_t *ps_cur_poc;
1934
1935
131k
    UWORD32 u4_temp;
1936
131k
    WORD32 i_temp;
1937
131k
    svc_dec_ctxt_t *psvcd_dec_ctxt;
1938
131k
    dec_struct_t *ps_dec_cur_lyr_minus_1;
1939
131k
    svc_dec_lyr_struct_t *ps_svc_cur_lyr_dec_minus_1;
1940
1941
    /* read FirstMbInSlice  and slice type*/
1942
131k
    ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
1943
131k
    u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1944
131k
    if(u2_first_mb_in_slice > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs))
1945
13.6k
    {
1946
13.6k
        return ERROR_CORRUPTED_SLICE;
1947
13.6k
    }
1948
1949
    /*we currently don not support ASO*/
1950
117k
    if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) <= ps_dec->u4_cur_mb_addr) &&
1951
110k
       (ps_dec->u4_first_slice_in_pic == 0))
1952
935
    {
1953
935
        return ERROR_CORRUPTED_SLICE;
1954
935
    }
1955
1956
116k
    if(ps_dec->u4_first_slice_in_pic == 1)
1957
113k
    {
1958
113k
        if(u2_first_mb_in_slice != 0)
1959
4.01k
        {
1960
4.01k
            return ERROR_CORRUPTED_SLICE;
1961
4.01k
        }
1962
113k
    }
1963
1964
112k
    COPYTHECONTEXT("SH: first_mb_in_slice", u2_first_mb_in_slice);
1965
1966
112k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1967
112k
    if(u4_temp > 9) return ERROR_INV_SLC_TYPE_T;
1968
1969
111k
    u1_slice_type = u4_temp;
1970
111k
    COPYTHECONTEXT("SH: slice_type", (u1_slice_type));
1971
    /* Find Out the Slice Type is 5 to 9 or not then Set the Flag   */
1972
    /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/
1973
    /* will be of same type of current                            */
1974
111k
    if(u1_slice_type > 4)
1975
4.19k
    {
1976
4.19k
        u1_slice_type -= 5;
1977
4.19k
    }
1978
1979
111k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1980
111k
    if(u4_temp & MASK_ERR_PIC_SET_ID) return ERROR_INV_SLICE_HDR_T;
1981
    /* discard slice if pic param is invalid */
1982
111k
    COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp);
1983
111k
    ps_pps = &ps_dec->ps_pps[u4_temp];
1984
111k
    if(FALSE == ps_pps->u1_is_valid)
1985
3.51k
    {
1986
3.51k
        return ERROR_INV_SLICE_HDR_T;
1987
3.51k
    }
1988
    /* slices in a layer should have same PPS id*/
1989
108k
    if(UINT32_MAX == ps_svc_lyr_dec->u4_pps_id_for_layer)
1990
104k
    {
1991
104k
        ps_svc_lyr_dec->u4_pps_id_for_layer = u4_temp;
1992
104k
    }
1993
3.35k
    else if(u4_temp != ps_svc_lyr_dec->u4_pps_id_for_layer)
1994
66
    {
1995
66
        return ERROR_INV_SLICE_HDR_T;
1996
66
    }
1997
108k
    ps_seq = ps_pps->ps_sps;
1998
108k
    ps_dec->ps_cur_sps = ps_seq;
1999
108k
    ps_subset_seq = &ps_svc_lyr_dec->ps_subset_sps[ps_seq->u1_seq_parameter_set_id];
2000
108k
    ps_svc_lyr_dec->ps_cur_subset_sps = ps_subset_seq;
2001
108k
    if(!ps_seq) return ERROR_INV_SLICE_HDR_T;
2002
108k
    if(FALSE == ps_seq->u1_is_valid) return ERROR_INV_SLICE_HDR_T;
2003
107k
    if(ps_seq->u1_mb_aff_flag) return ERROR_INV_SLICE_HDR_T;
2004
107k
    if(ps_seq->u1_level_idc > H264_LEVEL_4_2) return ERROR_INV_SLICE_HDR_T;
2005
107k
    if(!ps_seq->u1_frame_mbs_only_flag) return ERROR_INV_SLICE_HDR_T;
2006
106k
    if(OK != isvcd_verify_level(ps_seq->u1_level_idc)) return ERROR_INV_SLICE_HDR_T;
2007
106k
    if(ps_dec->u1_init_dec_flag == 1)
2008
87.6k
    {
2009
87.6k
        if(ps_dec->u2_frm_wd_in_mbs != ps_seq->u2_frm_wd_in_mbs) return ERROR_INV_SLICE_HDR_T;
2010
87.5k
        if(ps_dec->u2_frm_ht_in_mbs != ps_seq->u2_frm_ht_in_mbs) return ERROR_INV_SLICE_HDR_T;
2011
87.5k
    }
2012
2013
106k
    if(ps_dec->u1_init_dec_flag == 1)
2014
87.4k
    {
2015
87.4k
        if(ps_dec->u2_disp_height != ps_subset_seq->u2_disp_height) return ERROR_INV_SLICE_HDR_T;
2016
87.3k
        if(ps_dec->u2_disp_width != ps_subset_seq->u2_disp_width) return ERROR_INV_SLICE_HDR_T;
2017
87.3k
    }
2018
2019
106k
    if(ps_seq->u1_profile_idc == BASE_PROFILE_IDC)
2020
18.6k
    {
2021
18.6k
        if(ps_pps->u1_entropy_coding_mode != 0)
2022
155
        {
2023
155
            return ERROR_INV_SPS_PPS_T;
2024
155
        }
2025
18.6k
    }
2026
2027
106k
    ps_dec->i4_reorder_depth = ps_subset_seq->i4_reorder_depth;
2028
106k
    ps_dec->u2_disp_height = ps_subset_seq->u2_disp_height;
2029
106k
    ps_dec->u2_disp_width = ps_subset_seq->u2_disp_width;
2030
2031
106k
    if(ps_svc_lyr_dec->u1_layer_id > 0)
2032
0
    {
2033
0
        psvcd_dec_ctxt = ps_svc_lyr_dec->ps_svcd_ctxt;
2034
0
        ps_svc_cur_lyr_dec_minus_1 =
2035
0
            &psvcd_dec_ctxt->ps_svc_dec_lyr[ps_svc_lyr_dec->u1_layer_id - 1];
2036
2037
0
        ps_dec_cur_lyr_minus_1 = &ps_svc_cur_lyr_dec_minus_1->s_dec;
2038
2039
0
        if((ps_dec_cur_lyr_minus_1->u2_pic_wd > ps_subset_seq->u2_pic_wd) ||
2040
0
           (ps_dec_cur_lyr_minus_1->u2_pic_ht > ps_subset_seq->u2_pic_ht))
2041
0
        {
2042
0
            return ERROR_CORRUPTED_SLICE;
2043
0
        }
2044
0
    }
2045
2046
106k
    ps_dec->u2_pic_wd = ps_subset_seq->u2_pic_wd;
2047
106k
    ps_dec->u2_pic_ht = ps_subset_seq->u2_pic_ht;
2048
106k
    ps_dec->u4_total_mbs = ps_seq->u4_total_num_of_mbs << (1 - ps_seq->u1_frame_mbs_only_flag);
2049
2050
    /* Determining the Width and Height of Frame from that of Picture */
2051
106k
    ps_dec->u2_frm_wd_y = ps_subset_seq->u2_frm_wd_y;
2052
106k
    ps_dec->u2_frm_ht_y = ps_subset_seq->u2_frm_ht_y;
2053
2054
106k
    ps_dec->u2_frm_wd_uv = ps_subset_seq->u2_frm_wd_uv;
2055
106k
    ps_dec->u2_frm_ht_uv = ps_subset_seq->u2_frm_ht_uv;
2056
2057
106k
    ps_dec->s_pad_mgr.u1_pad_len_y_v = ps_subset_seq->u1_pad_len_y_v;
2058
106k
    ps_dec->s_pad_mgr.u1_pad_len_cr_v = ps_subset_seq->u1_pad_len_cr_v;
2059
106k
    ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
2060
106k
    ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
2061
2062
106k
    ps_dec->u2_crop_offset_y = ps_subset_seq->u2_crop_offset_y;
2063
106k
    ps_dec->u2_crop_offset_uv = ps_subset_seq->u2_crop_offset_uv;
2064
2065
    /* Get the frame num */
2066
106k
    u2_frame_num = ih264d_get_bits_h264(ps_bitstrm, ps_seq->u1_bits_in_frm_num);
2067
106k
    COPYTHECONTEXT("SH: frame_num", u2_frame_num);
2068
2069
106k
    if(!ps_dec->u1_first_slice_in_stream && ps_dec->u4_first_slice_in_pic)
2070
76.7k
    {
2071
76.7k
        pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
2072
76.7k
        pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
2073
2074
76.7k
        ps_dec->u2_mbx = 0xffff;
2075
76.7k
        ps_dec->u2_mby = 0;
2076
2077
76.7k
        if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
2078
10.4k
            ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
2079
2080
76.7k
        if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5) ps_dec->u2_prev_ref_frame_num = 0;
2081
2082
76.7k
        if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
2083
0
        {
2084
0
            isvcd_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
2085
0
        }
2086
2087
76.7k
        ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
2088
76.7k
        ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
2089
76.7k
        ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
2090
76.7k
        if(ps_cur_slice->u1_nal_ref_idc)
2091
67.8k
        {
2092
67.8k
            ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
2093
67.8k
            ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
2094
67.8k
            ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom;
2095
67.8k
            ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0];
2096
67.8k
            ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1];
2097
67.8k
            ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
2098
67.8k
        }
2099
2100
76.7k
        ps_dec->u4_total_mbs_coded = 0;
2101
76.7k
    }
2102
    /* Get the field related flags  */
2103
106k
    if(!ps_seq->u1_frame_mbs_only_flag)
2104
0
    {
2105
0
        u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
2106
0
        COPYTHECONTEXT("SH: field_pic_flag", u1_field_pic_flag);
2107
0
        u1_bottom_field_flag = 0;
2108
2109
0
        if(u1_field_pic_flag)
2110
0
        {
2111
0
            ps_dec->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan_fld;
2112
0
            u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm);
2113
0
            COPYTHECONTEXT("SH: bottom_field_flag", u1_bottom_field_flag);
2114
0
        }
2115
0
        else
2116
0
        {
2117
0
            ps_dec->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan;
2118
0
        }
2119
0
    }
2120
106k
    else
2121
106k
    {
2122
106k
        u1_field_pic_flag = 0;
2123
106k
        u1_bottom_field_flag = 0;
2124
2125
106k
        ps_dec->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan;
2126
106k
    }
2127
2128
106k
    u1_nal_unit_type = SLICE_NAL;
2129
106k
    if(u1_is_idr_slice)
2130
84.0k
    {
2131
84.0k
        u1_nal_unit_type = IDR_SLICE_NAL;
2132
84.0k
        u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2133
84.0k
        if(u4_idr_pic_id > 65535) return ERROR_INV_SLICE_HDR_T;
2134
83.1k
        COPYTHECONTEXT("SH:  ", u4_idr_pic_id);
2135
83.1k
    }
2136
2137
    /* read delta pic order count information*/
2138
105k
    i_delta_poc[0] = i_delta_poc[1] = 0;
2139
105k
    s_tmp_poc.i4_pic_order_cnt_lsb = 0;
2140
105k
    s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
2141
105k
    u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
2142
105k
    if(u1_pic_order_cnt_type == 0)
2143
78.8k
    {
2144
78.8k
        i_temp = ih264d_get_bits_h264(ps_bitstrm, ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
2145
78.8k
        if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb) return ERROR_INV_SLICE_HDR_T;
2146
78.8k
        s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
2147
78.8k
        COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
2148
2149
78.8k
        if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
2150
34.5k
        {
2151
34.5k
            s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2152
34.5k
            COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom",
2153
34.5k
                           s_tmp_poc.i4_delta_pic_order_cnt_bottom);
2154
34.5k
        }
2155
78.8k
    }
2156
2157
105k
    s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
2158
105k
    s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
2159
105k
    if(u1_pic_order_cnt_type == 1 && (!ps_seq->u1_delta_pic_order_always_zero_flag))
2160
21.5k
    {
2161
21.5k
        s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2162
21.5k
        COPYTHECONTEXT("SH: delta_pic_order_cnt[0]", s_tmp_poc.i4_delta_pic_order_cnt[0]);
2163
2164
21.5k
        if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
2165
19.0k
        {
2166
19.0k
            s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2167
19.0k
            COPYTHECONTEXT("SH: delta_pic_order_cnt[1]", s_tmp_poc.i4_delta_pic_order_cnt[1]);
2168
19.0k
        }
2169
21.5k
    }
2170
2171
105k
    if(ps_pps->u1_redundant_pic_cnt_present_flag)
2172
31.4k
    {
2173
31.4k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2174
31.4k
        if(u4_temp > MAX_REDUNDANT_PIC_CNT) return ERROR_INV_SLICE_HDR_T;
2175
30.7k
        u1_redundant_pic_cnt = u4_temp;
2176
30.7k
        COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt);
2177
30.7k
    }
2178
2179
    /*--------------------------------------------------------------------*/
2180
    /* Check if the slice is part of new picture                          */
2181
    /*--------------------------------------------------------------------*/
2182
    /* First slice of a picture is always considered as part of new picture */
2183
104k
    i1_is_end_of_poc = 1;
2184
104k
    ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
2185
2186
104k
    if(ps_dec->u4_first_slice_in_pic == 0)
2187
3.29k
    {
2188
3.29k
        i1_is_end_of_poc =
2189
3.29k
            ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc, &s_tmp_poc, &ps_dec->s_cur_pic_poc,
2190
3.29k
                                 ps_cur_slice, u1_pic_order_cnt_type, u1_nal_unit_type,
2191
3.29k
                                 u4_idr_pic_id, u1_field_pic_flag, u1_bottom_field_flag);
2192
3.29k
        if(i1_is_end_of_poc)
2193
261
        {
2194
261
            ps_dec->u1_first_slice_in_stream = 0;
2195
261
            return ERROR_INCOMPLETE_FRAME;
2196
261
        }
2197
3.29k
    }
2198
2199
    /*--------------------------------------------------------------------*/
2200
    /* Check for error in slice and parse the missing/corrupted MB's      */
2201
    /* as skip-MB's in an inserted P-slice                                */
2202
    /*--------------------------------------------------------------------*/
2203
104k
    u4_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
2204
104k
    prev_slice_err = 0;
2205
2206
104k
    if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
2207
101k
    {
2208
        /* If the current slice is not a field or frame number of the current
2209
         * slice doesn't match with previous slice, and decoder is expecting
2210
         * to decode a field i.e. ps_dec->u1_top_bottom_decoded is not 0 and
2211
         * is not (TOP_FIELD_ONLY | BOT_FIELD_ONLY), treat it as a dangling
2212
         * field */
2213
101k
        if((u1_field_pic_flag == 0 || u2_frame_num != ps_dec->u2_prv_frame_num) &&
2214
101k
           ps_dec->u1_top_bottom_decoded != 0 &&
2215
0
           ps_dec->u1_top_bottom_decoded != (TOP_FIELD_ONLY | BOT_FIELD_ONLY))
2216
0
        {
2217
0
            ps_dec->u1_dangling_field = 1;
2218
0
            if(ps_dec->u4_first_slice_in_pic)
2219
0
            {
2220
                // first slice - dangling field
2221
0
                prev_slice_err = 1;
2222
0
            }
2223
0
            else
2224
0
            {
2225
                // last slice - dangling field
2226
0
                prev_slice_err = 2;
2227
0
            }
2228
2229
0
            if(ps_dec->u1_top_bottom_decoded == TOP_FIELD_ONLY)
2230
0
                ps_cur_slice->u1_bottom_field_flag = 1;
2231
0
            else
2232
0
                ps_cur_slice->u1_bottom_field_flag = 0;
2233
2234
0
            num_mb_skipped =
2235
0
                (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) - ps_dec->u4_total_mbs_coded;
2236
0
            ps_cur_poc = &ps_dec->s_cur_pic_poc;
2237
2238
0
            u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL;
2239
0
        }
2240
101k
        else if(ps_dec->u4_first_slice_in_pic)
2241
101k
        {
2242
101k
            if(u2_first_mb_in_slice > 0)
2243
0
            {
2244
                /* first slice - missing/header corruption */
2245
0
                prev_slice_err = 1;
2246
0
                num_mb_skipped = u2_first_mb_in_slice << u4_mbaff;
2247
0
                ps_cur_poc = &s_tmp_poc;
2248
2249
                /* initializing slice parameters */
2250
0
                ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
2251
0
                ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
2252
0
                ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
2253
0
                ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
2254
0
                ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
2255
0
                ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
2256
0
                ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
2257
0
                ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
2258
0
                ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
2259
0
            }
2260
101k
        }
2261
0
        else
2262
0
        {
2263
            /* since i1_is_end_of_poc is set ,means new frame num is encountered. so
2264
             * conceal the current frame completely */
2265
0
            prev_slice_err = 2;
2266
0
            num_mb_skipped =
2267
0
                (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) - ps_dec->u4_total_mbs_coded;
2268
0
            ps_cur_poc = &s_tmp_poc;
2269
0
        }
2270
101k
    }
2271
3.02k
    else
2272
3.02k
    {
2273
3.02k
        if((u2_first_mb_in_slice << u4_mbaff) > ps_dec->u4_total_mbs_coded)
2274
96
        {
2275
            // previous slice - missing/corruption
2276
96
            prev_slice_err = 2;
2277
96
            num_mb_skipped = (u2_first_mb_in_slice << u4_mbaff) - ps_dec->u4_total_mbs_coded;
2278
96
            ps_cur_poc = &s_tmp_poc;
2279
96
        }
2280
2.93k
        else if((u2_first_mb_in_slice << u4_mbaff) < ps_dec->u4_total_mbs_coded)
2281
0
        {
2282
0
            return ERROR_CORRUPTED_SLICE;
2283
0
        }
2284
3.02k
    }
2285
104k
    if(prev_slice_err)
2286
96
    {
2287
96
        ret = isvcd_mark_err_slice_skip((svc_dec_lyr_struct_t *) ps_dec, num_mb_skipped,
2288
96
                                        u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err);
2289
2290
96
        if(ps_dec->u1_dangling_field == 1)
2291
0
        {
2292
0
            ps_dec->u1_second_field = 1 - ps_dec->u1_second_field;
2293
0
            ps_dec->u1_first_slice_in_stream = 0;
2294
0
            ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY;
2295
0
            return ERROR_DANGLING_FIELD_IN_PIC;
2296
0
        }
2297
2298
96
        if(prev_slice_err == 2)
2299
96
        {
2300
96
            ps_dec->u1_first_slice_in_stream = 0;
2301
96
            return ERROR_INCOMPLETE_FRAME;
2302
96
        }
2303
2304
0
        if(ps_dec->u4_total_mbs_coded >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
2305
0
        {
2306
            /* return if all MBs in frame are parsed*/
2307
0
            ps_dec->u1_first_slice_in_stream = 0;
2308
0
            return ERROR_IN_LAST_SLICE_OF_PIC;
2309
0
        }
2310
2311
0
        if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
2312
0
        {
2313
0
            ih264d_err_pic_dispbuf_mgr(ps_dec);
2314
0
            return ERROR_NEW_FRAME_EXPECTED;
2315
0
        }
2316
2317
0
        if(ret != OK) return ret;
2318
2319
0
        i1_is_end_of_poc = 0;
2320
0
    }
2321
2322
104k
    if(u1_field_pic_flag)
2323
0
    {
2324
0
        ps_dec->u2_prv_frame_num = u2_frame_num;
2325
0
    }
2326
2327
104k
    if(ps_cur_slice->u1_mmco_equalto5 && NULL != ps_dec->ps_cur_pic)
2328
2.30k
    {
2329
2.30k
        WORD32 i4_temp_poc;
2330
2.30k
        WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
2331
2.30k
        WORD64 i8_result;
2332
2.30k
        if(!ps_cur_slice->u1_field_pic_flag)
2333
2.30k
        {
2334
2.30k
            i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
2335
2.30k
            i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
2336
2.30k
            i4_temp_poc = MIN(i4_top_field_order_poc, i4_bot_field_order_poc);
2337
2.30k
        }
2338
0
        else if(!ps_cur_slice->u1_bottom_field_flag)
2339
0
            i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
2340
0
        else
2341
0
            i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
2342
2343
2.30k
        i8_result = (WORD64) i4_temp_poc - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
2344
2.30k
        if(IS_OUT_OF_RANGE_S32(i8_result))
2345
66
        {
2346
66
            return ERROR_INV_POC;
2347
66
        }
2348
2.23k
        ps_dec->ps_cur_pic->i4_top_field_order_cnt = (WORD32) i8_result;
2349
2.23k
        i8_result = (WORD64) i4_temp_poc - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
2350
2.23k
        if(IS_OUT_OF_RANGE_S32(i8_result))
2351
114
        {
2352
114
            return ERROR_INV_POC;
2353
114
        }
2354
2.12k
        ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = (WORD32) i8_result;
2355
2.12k
        ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
2356
2.12k
        ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
2357
2.12k
    }
2358
104k
    if(ps_dec->u4_first_slice_in_pic)
2359
101k
    {
2360
101k
        ret = isvcd_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num, &ps_dec->s_prev_pic_poc,
2361
101k
                                         &s_tmp_poc, ps_cur_slice, ps_pps, u1_nal_ref_idc,
2362
101k
                                         u1_bottom_field_flag, u1_field_pic_flag, &i4_poc, ps_dec);
2363
101k
        if(ret != OK) return ret;
2364
        /* Display seq no calculations */
2365
100k
        if(i4_poc >= ps_dec->i4_max_poc) ps_dec->i4_max_poc = i4_poc;
2366
        /* IDR Picture or POC wrap around */
2367
100k
        if(i4_poc == 0)
2368
22.5k
        {
2369
22.5k
            WORD64 i8_temp;
2370
22.5k
            i8_temp = (WORD64) ps_dec->i4_prev_max_display_seq + ps_dec->i4_max_poc +
2371
22.5k
                      ps_dec->u1_max_dec_frame_buffering + 1;
2372
            /*If i4_prev_max_display_seq overflows integer range, reset it */
2373
22.5k
            ps_dec->i4_prev_max_display_seq = IS_OUT_OF_RANGE_S32(i8_temp) ? 0 : i8_temp;
2374
22.5k
            ps_dec->i4_max_poc = 0;
2375
22.5k
        }
2376
100k
    }
2377
2378
    /* Increment only if the current slice has atleast 1 more MB */
2379
103k
    if(ps_dec->u4_first_slice_in_pic == 0 &&
2380
2.93k
       (ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice <
2381
2.93k
        (UWORD32) (ps_dec->u4_total_mbs_coded >> ps_dec->ps_cur_slice->u1_mbaff_frame_flag)))
2382
2.93k
    {
2383
2.93k
        ps_dec->ps_parse_cur_slice++;
2384
2.93k
        ps_dec->u2_cur_slice_num++;
2385
        // in the case of single core increment ps_decode_cur_slice
2386
2.93k
        if(ps_dec->u1_separate_parse == 0)
2387
1.64k
        {
2388
1.64k
            ps_dec->ps_decode_cur_slice++;
2389
1.64k
        }
2390
2.93k
    }
2391
2392
103k
    ps_dec->u1_slice_header_done = 0;
2393
2394
    /*--------------------------------------------------------------------*/
2395
    /* Copy the values read from the bitstream to the slice header and then*/
2396
    /* If the slice is first slice in picture, then do Start of Picture   */
2397
    /* processing.                                                        */
2398
    /*--------------------------------------------------------------------*/
2399
103k
    ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
2400
103k
    ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
2401
103k
    ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
2402
103k
    ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
2403
103k
    ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
2404
103k
    ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
2405
103k
    ps_cur_slice->u1_slice_type = u1_slice_type;
2406
103k
    ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
2407
2408
103k
    ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
2409
103k
    ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
2410
103k
    ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
2411
103k
    ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
2412
2413
103k
    if(ps_seq->u1_frame_mbs_only_flag)
2414
103k
        ps_cur_slice->u1_direct_8x8_inference_flag = ps_seq->u1_direct_8x8_inference_flag;
2415
0
    else
2416
0
        ps_cur_slice->u1_direct_8x8_inference_flag = 1;
2417
2418
103k
    if(u1_slice_type == B_SLICE)
2419
30.3k
    {
2420
30.3k
        ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
2421
30.3k
        COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag",
2422
30.3k
                       ps_cur_slice->u1_direct_spatial_mv_pred_flag);
2423
2424
30.3k
        if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
2425
16.1k
            ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct;
2426
14.1k
        else
2427
14.1k
            ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
2428
30.3k
        if(!((ps_seq->u1_mb_aff_flag) && (!u1_field_pic_flag)))
2429
30.3k
            ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
2430
30.3k
    }
2431
72.6k
    else
2432
72.6k
    {
2433
72.6k
        if(!((ps_seq->u1_mb_aff_flag) && (!u1_field_pic_flag)))
2434
72.6k
            ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
2435
72.6k
    }
2436
2437
103k
    if(ps_dec->u4_first_slice_in_pic)
2438
100k
    {
2439
100k
        if(u2_first_mb_in_slice == 0)
2440
100k
        {
2441
100k
            ret = isvcd_start_of_pic(ps_svc_lyr_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
2442
100k
            if(ret != OK) return ret;
2443
            /*inter layer buffer intialization */
2444
99.2k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
2445
99.2k
                ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start;
2446
99.2k
            ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_cur_mb =
2447
99.2k
                ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_base;
2448
99.2k
        }
2449
2450
99.2k
        ps_dec->u4_output_present = 0;
2451
2452
99.2k
        {
2453
99.2k
            ih264d_get_next_display_field(ps_dec, ps_dec->ps_out_buffer, &(ps_dec->s_disp_op));
2454
            /* If error code is non-zero then there is no buffer available for
2455
            display, hence avoid format conversion */
2456
2457
99.2k
            if(0 != ps_dec->s_disp_op.u4_error_code)
2458
41.2k
            {
2459
41.2k
                ps_dec->u4_output_present = 0;
2460
41.2k
                ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
2461
41.2k
            }
2462
57.9k
            else
2463
57.9k
                ps_dec->u4_output_present = 1;
2464
99.2k
        }
2465
99.2k
        ret = isvcd_parse_interlayer_resamp_func_init(ps_svc_lyr_dec, u2_first_mb_in_slice);
2466
99.2k
        if(ret != OK)
2467
0
        {
2468
0
            return ERROR_CORRUPTED_SLICE;
2469
0
        }
2470
99.2k
        if((ps_dec->u1_separate_parse == 1) && (ps_svc_lyr_dec->u1_res_init_done == 1))
2471
29.0k
        {
2472
29.0k
            if(ps_dec->u4_dec_thread_created == 0)
2473
29.0k
            {
2474
29.0k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
2475
0
                {
2476
0
                    ithread_create(ps_dec->pv_dec_thread_handle, NULL,
2477
0
                                   (void *) isvcd_decode_picture_thread, (void *) ps_dec);
2478
2479
0
                    ps_dec->u4_dec_thread_created = 1;
2480
0
                }
2481
29.0k
                else
2482
29.0k
                {
2483
29.0k
                    ithread_create(ps_dec->pv_dec_thread_handle, NULL,
2484
29.0k
                                   (void *) ih264d_decode_picture_thread, (void *) ps_dec);
2485
2486
29.0k
                    ps_dec->u4_dec_thread_created = 1;
2487
29.0k
                }
2488
29.0k
            }
2489
#ifdef KEEP_THREADS_ACTIVE
2490
            ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
2491
            RETURN_IF((ret != IV_SUCCESS), ret);
2492
2493
            ps_dec->ai4_process_start[0] = PROC_START;
2494
            ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[0]);
2495
            RETURN_IF((ret != IV_SUCCESS), ret);
2496
2497
            ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
2498
            RETURN_IF((ret != IV_SUCCESS), ret);
2499
#endif
2500
#ifdef KEEP_THREADS_ACTIVE
2501
            if(ps_dec->u4_bs_deblk_thread_created)
2502
            {
2503
                ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
2504
                RETURN_IF((ret != IV_SUCCESS), ret);
2505
2506
                ps_dec->ai4_process_start[1] = PROC_START;
2507
                ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[1]);
2508
                RETURN_IF((ret != IV_SUCCESS), ret);
2509
2510
                ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
2511
                RETURN_IF((ret != IV_SUCCESS), ret);
2512
            }
2513
#endif
2514
29.0k
        }
2515
99.2k
    }
2516
2517
    /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
2518
102k
    {
2519
102k
        UWORD8 uc_nofield_nombaff;
2520
2521
102k
        uc_nofield_nombaff =
2522
102k
            ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0) &&
2523
102k
             (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0) && (u1_slice_type != B_SLICE) &&
2524
72.1k
             (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0));
2525
2526
        /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
2527
2528
102k
        if(uc_nofield_nombaff)
2529
49.4k
        {
2530
49.4k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
2531
49.4k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
2532
49.4k
        }
2533
52.6k
        else
2534
52.6k
        {
2535
52.6k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
2536
52.6k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
2537
52.6k
        }
2538
102k
    }
2539
2540
    /*
2541
     * Decide whether to decode the current picture or not
2542
     */
2543
102k
    {
2544
102k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
2545
102k
        if(ps_err->u4_frm_sei_sync == u2_frame_num)
2546
68
        {
2547
68
            ps_err->u1_err_flag = ACCEPT_ALL_PICS;
2548
68
            ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
2549
68
        }
2550
102k
        ps_err->u4_cur_frm = u2_frame_num;
2551
102k
    }
2552
2553
    /* Decision for decoding if the picture is to be skipped */
2554
102k
    {
2555
102k
        WORD32 i4_skip_b_pic, i4_skip_p_pic;
2556
2557
102k
        i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT) && (B_SLICE == u1_slice_type) &&
2558
0
                        (0 == u1_nal_ref_idc);
2559
2560
102k
        i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT) && (P_SLICE == u1_slice_type) &&
2561
0
                        (0 == u1_nal_ref_idc);
2562
2563
        /**************************************************************/
2564
        /* Skip the B picture if skip mask is set for B picture and   */
2565
        /* Current B picture is a non reference B picture or there is */
2566
        /* no user for reference B picture                            */
2567
        /**************************************************************/
2568
102k
        if(i4_skip_b_pic)
2569
0
        {
2570
0
            ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
2571
            /* Don't decode the picture in SKIP-B mode if that picture is B */
2572
            /* and also it is not to be used as a reference picture         */
2573
0
            ps_dec->u1_last_pic_not_decoded = 1;
2574
2575
0
            return OK;
2576
0
        }
2577
        /**************************************************************/
2578
        /* Skip the P picture if skip mask is set for P picture and   */
2579
        /* Current P picture is a non reference P picture or there is */
2580
        /* no user for reference P picture                            */
2581
        /**************************************************************/
2582
102k
        if(i4_skip_p_pic)
2583
0
        {
2584
0
            ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
2585
            /* Don't decode the picture in SKIP-P mode if that picture is P */
2586
            /* and also it is not to be used as a reference picture         */
2587
0
            ps_dec->u1_last_pic_not_decoded = 1;
2588
2589
0
            return OK;
2590
0
        }
2591
102k
    }
2592
2593
102k
    {
2594
102k
        UWORD16 u2_mb_x, u2_mb_y;
2595
2596
102k
        ps_dec->i4_submb_ofst =
2597
102k
            ((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE) -
2598
102k
            SUB_BLK_SIZE;
2599
102k
        if(u2_first_mb_in_slice)
2600
2.93k
        {
2601
2.93k
            UWORD8 u1_mb_aff;
2602
2.93k
            UWORD8 u1_field_pic;
2603
2.93k
            UWORD16 u2_frm_wd_in_mbs;
2604
2.93k
            u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
2605
2.93k
            u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
2606
2.93k
            u1_field_pic = ps_cur_slice->u1_field_pic_flag;
2607
2608
2.93k
            {
2609
2.93k
                UWORD32 x_offset;
2610
2.93k
                UWORD32 y_offset;
2611
2.93k
                UWORD32 u4_frame_stride;
2612
2.93k
                tfr_ctxt_t *ps_trns_addr;
2613
2614
2.93k
                if(ps_dec->u1_separate_parse)
2615
1.29k
                {
2616
1.29k
                    ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
2617
1.29k
                }
2618
1.64k
                else
2619
1.64k
                {
2620
1.64k
                    ps_trns_addr = &ps_dec->s_tran_addrecon;
2621
1.64k
                }
2622
2.93k
                u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
2623
2.93k
                u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
2624
2625
2.93k
                u2_mb_y <<= u1_mb_aff;
2626
2627
2.93k
                if((u2_mb_x > u2_frm_wd_in_mbs - 1) || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1))
2628
84
                {
2629
84
                    return ERROR_CORRUPTED_SLICE;
2630
84
                }
2631
2632
2.84k
                u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
2633
2.84k
                x_offset = u2_mb_x << 4;
2634
2.84k
                y_offset = (u2_mb_y * u4_frame_stride) << 4;
2635
2636
2.84k
                ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset + y_offset;
2637
2638
2.84k
                u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
2639
2.84k
                x_offset >>= 1;
2640
2.84k
                y_offset = (u2_mb_y * u4_frame_stride) << 3;
2641
2642
2.84k
                x_offset *= YUV420SP_FACTOR;
2643
2644
2.84k
                ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset + y_offset;
2645
2.84k
                ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset + y_offset;
2646
2647
2.84k
                ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
2648
2.84k
                ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
2649
2.84k
                ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
2650
2651
                /* assign the deblock structure pointers to start of slice */
2652
2.84k
                if(ps_dec->u1_separate_parse == 1)
2653
1.22k
                {
2654
1.22k
                    ps_dec->ps_deblk_mbn =
2655
1.22k
                        ps_dec->ps_deblk_pic + (u2_first_mb_in_slice << u1_mb_aff);
2656
1.22k
                }
2657
1.62k
                else
2658
1.62k
                {
2659
1.62k
                    ps_dec->ps_deblk_mbn =
2660
1.62k
                        ps_dec->ps_deblk_pic + (u2_first_mb_in_slice << u1_mb_aff);
2661
1.62k
                }
2662
2663
2.84k
                ps_dec->u4_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
2664
2665
2.84k
                ps_dec->ps_mv_cur =
2666
2.84k
                    ps_dec->s_cur_pic.ps_mv + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
2667
2.84k
            }
2668
2.84k
        }
2669
99.2k
        else
2670
99.2k
        {
2671
99.2k
            tfr_ctxt_t *ps_trns_addr;
2672
2673
99.2k
            if(ps_dec->u1_separate_parse)
2674
29.0k
            {
2675
29.0k
                ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
2676
29.0k
            }
2677
70.1k
            else
2678
70.1k
            {
2679
70.1k
                ps_trns_addr = &ps_dec->s_tran_addrecon;
2680
70.1k
            }
2681
2682
99.2k
            u2_mb_x = 0xffff;
2683
99.2k
            u2_mb_y = 0;
2684
            // assign the deblock structure pointers to start of slice
2685
99.2k
            ps_dec->u4_cur_mb_addr = 0;
2686
99.2k
            ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
2687
99.2k
            ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
2688
99.2k
            ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
2689
99.2k
            ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
2690
99.2k
            ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
2691
2692
99.2k
            ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
2693
99.2k
            ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
2694
99.2k
            ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
2695
99.2k
        }
2696
2697
102k
        ps_dec->ps_part = ps_dec->ps_parse_part_params;
2698
2699
102k
        ps_dec->u2_mbx = (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
2700
102k
        ps_dec->u2_mby = (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
2701
102k
        ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
2702
102k
        ps_dec->i2_prev_slice_mbx = (WORD16) ps_dec->u2_mbx;
2703
102k
        ps_dec->i2_prev_slice_mby = (WORD16) ps_dec->u2_mby;
2704
102k
    }
2705
2706
    /* RBSP stop bit is used for CABAC decoding*/
2707
0
    ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode;
2708
2709
102k
    ps_dec->u1_B = (u1_slice_type == B_SLICE);
2710
102k
    ps_dec->u4_next_mb_skip = 0;
2711
2712
102k
    ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->ps_cur_slice->u2_first_mb_in_slice;
2713
102k
    ps_dec->ps_parse_cur_slice->slice_type = ps_dec->ps_cur_slice->u1_slice_type;
2714
2715
102k
    ps_dec->u4_start_recon_deblk = 1;
2716
102k
    {
2717
102k
        WORD32 num_entries;
2718
102k
        WORD32 size;
2719
102k
        UWORD8 *pu1_buf;
2720
2721
102k
        num_entries = MAX_FRAMES;
2722
102k
        if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && (0 == ps_dec->i4_display_delay))
2723
0
        {
2724
0
            num_entries = 1;
2725
0
        }
2726
102k
        num_entries = ((2 * num_entries) + 1);
2727
102k
        num_entries *= 2;
2728
2729
102k
        size = num_entries * sizeof(void *);
2730
102k
        size += PAD_MAP_IDX_POC * sizeof(void *);
2731
2732
102k
        pu1_buf = (UWORD8 *) ps_dec->pv_map_ref_idx_to_poc_buf;
2733
102k
        pu1_buf += size * ps_dec->u2_cur_slice_num;
2734
102k
        ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (void *) pu1_buf;
2735
102k
    }
2736
2737
102k
    if(ps_dec->u1_separate_parse)
2738
30.2k
    {
2739
30.2k
        ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
2740
30.2k
    }
2741
71.7k
    else
2742
71.7k
    {
2743
71.7k
        ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
2744
71.7k
    }
2745
2746
102k
    ret = ih264d_fix_error_in_dpb(ps_dec);
2747
102k
    if(ret < 0) return ERROR_DBP_MANAGER_T;
2748
2749
102k
    if(u1_slice_type == I_SLICE)
2750
7.51k
    {
2751
7.51k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
2752
2753
7.51k
        ret = isvcd_parse_islice(ps_svc_lyr_dec, u2_first_mb_in_slice);
2754
7.51k
        ps_dec->u1_pr_sl_type = u1_slice_type;
2755
7.51k
        if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
2756
6.63k
            ps_dec->i4_pic_type = I_SLICE;
2757
7.51k
    }
2758
94.5k
    else if(u1_slice_type == P_SLICE)
2759
64.1k
    {
2760
64.1k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
2761
64.1k
        ret = isvcd_parse_pslice(ps_svc_lyr_dec, u2_first_mb_in_slice);
2762
64.1k
        ps_dec->u1_pr_sl_type = u1_slice_type;
2763
64.1k
        if(ps_dec->i4_pic_type != B_SLICE) ps_dec->i4_pic_type = P_SLICE;
2764
64.1k
    }
2765
30.3k
    else if(u1_slice_type == B_SLICE)
2766
29.9k
    {
2767
29.9k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
2768
29.9k
        ret = isvcd_parse_bslice(ps_svc_lyr_dec, u2_first_mb_in_slice);
2769
29.9k
        ps_dec->u1_pr_sl_type = u1_slice_type;
2770
29.9k
        ps_dec->i4_pic_type = B_SLICE;
2771
29.9k
    }
2772
434
    else
2773
434
        return ERROR_INV_SLC_TYPE_T;
2774
2775
101k
    if(ps_dec->u1_slice_header_done)
2776
79.3k
    {
2777
        /* set to zero to indicate a valid slice has been decoded */
2778
79.3k
        ps_dec->u1_first_slice_in_stream = 0;
2779
79.3k
    }
2780
2781
101k
    if(ret != OK) return ret;
2782
2783
53.3k
    if(u1_nal_ref_idc != 0)
2784
48.1k
    {
2785
48.1k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
2786
47.3k
        {
2787
47.3k
            memcpy((void *) ps_dec->ps_dpb_cmds, (void *) (&(ps_dec->s_dpb_cmds_scratch)),
2788
47.3k
                   sizeof(dpb_commands_t));
2789
47.3k
        }
2790
48.1k
    }
2791
2792
    /* storing last Mb X and MbY of the slice */
2793
53.3k
    ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
2794
53.3k
    ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
2795
2796
    /* End of Picture detection */
2797
2798
53.3k
    if(ps_dec->u4_total_mbs_coded >= (ps_seq->u4_max_mb_addr + 1))
2799
25.6k
    {
2800
25.6k
        ps_dec->u1_pic_decode_done = 1;
2801
25.6k
    }
2802
2803
53.3k
    {
2804
53.3k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
2805
53.3k
        if((ps_err->u1_err_flag & REJECT_PB_PICS) && (ps_err->u1_cur_pic_type == PIC_TYPE_I))
2806
0
        {
2807
0
            ps_err->u1_err_flag = ACCEPT_ALL_PICS;
2808
0
        }
2809
53.3k
    }
2810
2811
53.3k
    PRINT_BIN_BIT_RATIO(ps_dec)
2812
2813
53.3k
    return ret;
2814
101k
}