Coverage Report

Created: 2026-08-31 06:32

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
145k
{
96
145k
    switch(u1_level_idc)
97
145k
    {
98
340
        case H264_LEVEL_1_0:
99
35.9k
        case H264_LEVEL_1_1:
100
40.2k
        case H264_LEVEL_1_2:
101
43.1k
        case H264_LEVEL_1_3:
102
91.3k
        case H264_LEVEL_2_0:
103
98.5k
        case H264_LEVEL_2_1:
104
99.5k
        case H264_LEVEL_2_2:
105
102k
        case H264_LEVEL_3_0:
106
104k
        case H264_LEVEL_3_1:
107
122k
        case H264_LEVEL_3_2:
108
140k
        case H264_LEVEL_4_0:
109
142k
        case H264_LEVEL_4_1:
110
145k
        case H264_LEVEL_4_2:
111
145k
        case H264_LEVEL_5_0:
112
145k
        case H264_LEVEL_5_1:
113
145k
            return OK;
114
383
        default:
115
383
            return NOT_OK;
116
145k
    }
117
145k
}
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
136k
{
134
136k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
135
136k
    pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc;
136
136k
    pocstruct_t *ps_cur_poc = ps_temp_poc;
137
138
136k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
139
136k
    dec_seq_params_t *ps_seq = ps_dec->ps_cur_sps;
140
136k
    UWORD8 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
141
136k
    UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
142
    /* high profile related declarations */
143
136k
    WORD32 ret;
144
145
136k
    H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
146
147
136k
    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
136k
    if(check_app_out_buf_size(ps_dec) != IV_SUCCESS) return IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
155
156
134k
    ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
157
134k
    ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
158
134k
    ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom;
159
134k
    ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0];
160
134k
    ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1];
161
134k
    ps_prev_poc->u1_bot_field = ps_dec->ps_cur_slice->u1_bottom_field_flag;
162
134k
    ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
163
134k
    ps_prev_poc->u2_frame_num = u2_frame_num;
164
134k
    ps_dec->i1_prev_mb_qp_delta = 0;
165
134k
    ps_dec->i1_next_ctxt_idx = 0;
166
167
134k
    ps_dec->u4_nmb_deblk = 0;
168
134k
    if(ps_dec->u4_num_cores == 1) ps_dec->u4_nmb_deblk = 1;
169
170
134k
    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
134k
    ps_dec->u4_use_intrapred_line_copy = 0;
177
178
134k
    if(ps_seq->u1_mb_aff_flag == 0)
179
134k
    {
180
134k
        ps_dec->u4_use_intrapred_line_copy = 1;
181
134k
    }
182
183
134k
    ps_dec->u4_app_disable_deblk_frm = 0;
184
    /* If degrade is enabled, set the degrade flags appropriately */
185
134k
    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
134k
    {
242
134k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
243
134k
        if((ps_cur_slice->u1_slice_type == I_SLICE) || (ps_cur_slice->u1_slice_type == SI_SLICE))
244
13.3k
            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
134k
        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
134k
        if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
255
112k
        {
256
112k
            if(ps_err->u1_err_flag) ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
257
112k
            ps_err->u1_err_flag = ACCEPT_ALL_PICS;
258
112k
        }
259
134k
    }
260
261
134k
    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
134k
    ret = isvcd_init_pic(ps_svc_lyr_dec, u2_frame_num, i4_poc, ps_pps);
284
134k
    if(ret != OK) return ret;
285
286
134k
    ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
287
134k
    ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
288
134k
    ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info;
289
134k
    ps_svc_lyr_dec->ps_svc_nmb_info = ps_svc_lyr_dec->ps_svc_frm_mb_info;
290
134k
    if(ps_dec->u1_separate_parse)
291
52.0k
    {
292
52.0k
        UWORD32 num_mbs;
293
52.0k
        num_mbs = ps_dec->ps_cur_sps->u4_total_num_of_mbs
294
52.0k
                  << (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag);
295
296
52.0k
        if(ps_dec->pu1_dec_mb_map)
297
52.0k
        {
298
52.0k
            memset((void *) ps_dec->pu1_dec_mb_map, 0, num_mbs);
299
52.0k
        }
300
301
52.0k
        if(ps_dec->pu1_recon_mb_map)
302
52.0k
        {
303
52.0k
            memset((void *) ps_dec->pu1_recon_mb_map, 0, num_mbs);
304
52.0k
        }
305
306
52.0k
        if(ps_dec->pu2_slice_num_map)
307
52.0k
        {
308
52.0k
            memset((void *) ps_dec->pu2_slice_num_map, 0, (num_mbs * sizeof(UWORD16)));
309
52.0k
        }
310
52.0k
    }
311
312
134k
    ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
313
134k
    ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
314
134k
    ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
315
134k
    ps_dec->u2_cur_slice_num = 0;
316
317
    /* Initialize all the HP toolsets to zero */
318
134k
    ps_dec->s_high_profile.u1_scaling_present = 0;
319
134k
    ps_dec->s_high_profile.u1_transform8x8_present = 0;
320
321
    /* Get Next Free Picture */
322
134k
    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
134k
    if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded))
335
134k
    {
336
134k
        pic_buffer_t *ps_cur_pic;
337
134k
        WORD32 cur_pic_buf_id, cur_mv_buf_id;
338
134k
        col_mv_buf_t *ps_col_mv;
339
134k
        while(1)
340
134k
        {
341
134k
            ps_cur_pic = (pic_buffer_t *) ih264_buf_mgr_get_next_free(
342
134k
                (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
134k
            if((ps_cur_pic == NULL) && (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
348
974
            {
349
974
                WORD32 j;
350
351
63.3k
                for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
352
62.3k
                {
353
62.3k
                    ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, j, BUF_MGR_REF);
354
62.3k
                    ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_mv_buf_mgr,
355
62.3k
                                          ps_dec->as_buf_id_info_map[j].mv_buf_id, BUF_MGR_REF);
356
357
62.3k
                    ih264_buf_mgr_release((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, j, BUF_MGR_IO);
358
62.3k
                }
359
974
                ps_cur_pic = (pic_buffer_t *) ih264_buf_mgr_get_next_free(
360
974
                    (buf_mgr_t *) ps_dec->pv_pic_buf_mgr, &cur_pic_buf_id);
361
974
            }
362
134k
            if(ps_cur_pic == NULL)
363
113
            {
364
113
                ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
365
113
                ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC;
366
113
                return ERROR_UNAVAIL_PICBUF_T;
367
113
            }
368
134k
            if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id])
369
134k
            {
370
134k
                break;
371
134k
            }
372
134k
        }
373
134k
        ps_col_mv = (col_mv_buf_t *) ih264_buf_mgr_get_next_free(
374
134k
            (buf_mgr_t *) ps_dec->pv_mv_buf_mgr, &cur_mv_buf_id);
375
134k
        if(ps_col_mv == NULL)
376
744
        {
377
744
            ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
378
744
            ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC;
379
744
            return ERROR_UNAVAIL_MVBUF_T;
380
744
        }
381
382
134k
        ps_dec->ps_cur_pic = ps_cur_pic;
383
134k
        ps_dec->u1_pic_buf_id = cur_pic_buf_id;
384
134k
        ps_cur_pic->u4_ts = ps_dec->u4_ts;
385
134k
        memcpy(&ps_cur_pic->s_sei_pic, ps_dec->ps_sei, sizeof(sei));
386
387
134k
        ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
388
134k
        ps_dec->as_buf_id_info_map[cur_pic_buf_id].mv_buf_id = cur_mv_buf_id;
389
390
134k
        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
134k
        ps_cur_pic->pu1_col_zero_flag = (UWORD8 *) ps_col_mv->pv_col_zero_flag;
401
134k
        ps_cur_pic->ps_mv = (mv_pred_t *) ps_col_mv->pv_mv;
402
134k
        ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
403
404
134k
        {
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
134k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
409
134k
            ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_init_dpb[1];
410
134k
            *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic;
411
            /* Initialize for field reference as well */
412
134k
            *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
413
414
134k
            *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][0]) = *ps_cur_pic;
415
            /* Initialize for field reference as well */
416
134k
            *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
417
134k
            *(ps_dec->ps_dpb_mgr->ps_init_dpb[1][0]) = *ps_cur_pic;
418
            /* Initialize for field reference as well */
419
134k
            *(ps_dec->ps_dpb_mgr->ps_init_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic;
420
134k
            *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][0]) = *ps_cur_pic;
421
            /* Initialize for field reference as well */
422
134k
            *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic;
423
134k
        }
424
425
134k
        ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag;
426
134k
        ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE;
427
134k
        H264_DEC_DEBUG_PRINT("got a buffer\n");
428
134k
    }
429
0
    else
430
0
    {
431
0
        H264_DEC_DEBUG_PRINT("did not get a buffer\n");
432
0
    }
433
434
134k
    ps_dec->u4_pic_buf_got = 1;
435
436
134k
    ps_dec->ps_cur_pic->i4_poc = i4_poc;
437
134k
    ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num;
438
134k
    ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num;
439
134k
    ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt;
440
134k
    ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = ps_pps->i4_bottom_field_order_cnt;
441
134k
    ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc;
442
134k
    ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts;
443
444
134k
    ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic);
445
134k
    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
134k
    ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
463
134k
    ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag << 2);
464
465
134k
    ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row;
466
134k
    ps_dec->ps_cur_mb_row += 2;
467
134k
    ps_dec->ps_top_mb_row = ps_dec->ps_nbr_mb_row;
468
134k
    ps_dec->ps_top_mb_row +=
469
134k
        ((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
134k
    ps_dec->ps_top_mb_row += 2;
472
134k
    ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
473
134k
    ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
474
134k
    ps_dec->u1_mv_top_p = 0;
475
134k
    ps_dec->u4_mb_idx = 0;
476
134k
    ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
477
134k
    ps_dec->u4_total_mbs_coded = 0;
478
134k
    ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE);
479
134k
    ps_dec->u4_pred_info_idx = 0;
480
134k
    ps_dec->u4_pred_info_pkd_idx = 0;
481
134k
    ps_dec->u4_dma_buf_idx = 0;
482
134k
    ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv;
483
134k
    ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv;
484
134k
    ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag;
485
134k
    ps_dec->ps_part = ps_dec->ps_parse_part_params;
486
134k
    ps_dec->i2_prev_slice_mbx = -1;
487
134k
    ps_dec->i2_prev_slice_mby = 0;
488
134k
    ps_dec->u2_mv_2mb[0] = 0;
489
134k
    ps_dec->u2_mv_2mb[1] = 0;
490
134k
    ps_dec->u1_last_pic_not_decoded = 0;
491
492
134k
    ps_dec->u2_cur_slice_num_dec_thread = 0;
493
134k
    ps_dec->u2_cur_slice_num_bs = 0;
494
134k
    ps_dec->u4_intra_pred_line_ofst = 0;
495
134k
    ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line;
496
134k
    ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line;
497
134k
    ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line;
498
499
134k
    ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line;
500
134k
    ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line;
501
134k
    ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line;
502
503
134k
    ps_dec->pu1_prev_y_intra_pred_line =
504
134k
        ps_dec->pu1_y_intra_pred_line + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE);
505
506
134k
    ps_dec->pu1_prev_u_intra_pred_line =
507
134k
        ps_dec->pu1_u_intra_pred_line + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR;
508
134k
    ps_dec->pu1_prev_v_intra_pred_line =
509
134k
        ps_dec->pu1_v_intra_pred_line + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE;
510
511
134k
    ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
512
    /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag
513
     */
514
134k
    {
515
134k
        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
134k
        else
522
134k
        {
523
134k
            ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff;
524
134k
            ps_svc_lyr_dec->pf_svc_compute_bs = isvcd_compute_bs_non_mbaff;
525
134k
            ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag;
526
527
134k
            if((ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) &&
528
88.1k
               (0 == ps_svc_lyr_dec->u1_base_res_flag))
529
33.1k
            {
530
33.1k
                ps_svc_lyr_dec->pf_svc_compute_bs = isvcd_compute_bs_non_mbaff_target_lyr;
531
33.1k
            }
532
533
134k
            if((ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) &&
534
88.1k
               (1 == ps_svc_lyr_dec->u1_base_res_flag))
535
55.0k
            {
536
55.0k
                ps_svc_lyr_dec->pf_svc_compute_bs =
537
55.0k
                    isvcd_compute_bs_non_mbaff_target_lyr_no_inter_layer;
538
55.0k
            }
539
540
134k
            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
134k
        }
546
134k
    }
547
    /* Set up the Parameter for DMA transfer */
548
134k
    {
549
134k
        UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
550
134k
        UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag;
551
134k
        UWORD16 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4) % (ps_dec->u4_recon_mb_grp >> u1_mbaff));
552
134k
        UWORD16 ui16_lastmbs_widthY =
553
134k
            (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u4_recon_mb_grp >> u1_mbaff) << 4));
554
134k
        UWORD16 ui16_lastmbs_widthUV =
555
134k
            uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u4_recon_mb_grp >> u1_mbaff) << 3);
556
557
134k
        ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
558
134k
        ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
559
134k
        ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
560
561
134k
        ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
562
134k
        ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
563
564
134k
        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
134k
        ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u4_recon_mb_grp << 4) >> u1_mbaff);
572
134k
        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
134k
        ps_dec->s_tran_addrecon.u4_inc_y[1] =
576
134k
            (ui16_lastmbs_widthY + (PAD_LEN_Y_H << 1) +
577
134k
             ps_dec->s_tran_addrecon.u2_frm_wd_y * ((15 << u1_mbaff) + u1_mbaff));
578
134k
        ps_dec->s_tran_addrecon.u4_inc_uv[1] =
579
134k
            (ui16_lastmbs_widthUV + (PAD_LEN_UV_H << 2) +
580
134k
             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
134k
        ih264d_assign_pic_num(ps_dec);
585
134k
        ps_dec->s_tran_addrecon.u2_mv_top_left_inc =
586
134k
            (ps_dec->u4_recon_mb_grp << 2) - 1 - (u1_mbaff << 2);
587
134k
        ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u4_recon_mb_grp >> u1_mbaff) - 1)
588
134k
                                                 << (4 + u1_mbaff);
589
134k
    }
590
    /**********************************************************************/
591
    /* High profile related initialization at pictrue level               */
592
    /**********************************************************************/
593
134k
    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
14.7k
    {
597
14.7k
        if((ps_seq->i4_seq_scaling_matrix_present_flag) ||
598
4.64k
           (ps_pps->i4_pic_scaling_matrix_present_flag))
599
11.8k
        {
600
11.8k
            ret = ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec);
601
11.8k
            ps_dec->s_high_profile.u1_scaling_present = 1;
602
11.8k
        }
603
2.92k
        else
604
2.92k
        {
605
2.92k
            ret = ih264d_form_default_scaling_matrix(ps_dec);
606
2.92k
        }
607
608
14.7k
        if(ps_pps->i4_transform_8x8_mode_flag)
609
8.44k
        {
610
8.44k
            ps_dec->s_high_profile.u1_transform8x8_present = 1;
611
8.44k
        }
612
14.7k
    }
613
119k
    else
614
119k
    {
615
119k
        ret = ih264d_form_default_scaling_matrix(ps_dec);
616
119k
    }
617
618
134k
    if(ret != OK) return ret;
619
620
    /* required while reading the transform_size_8x8 u4_flag */
621
134k
    ps_dec->s_high_profile.u1_direct_8x8_inference_flag = ps_seq->u1_direct_8x8_inference_flag;
622
134k
    ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt;
623
624
134k
    ps_dec->i1_recon_in_thread3_flag = 1;
625
134k
    ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon;
626
134k
    if(ps_dec->u1_separate_parse)
627
51.4k
    {
628
51.4k
        memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon, sizeof(tfr_ctxt_t));
629
51.4k
    }
630
631
134k
    ih264d_init_deblk_tfr_ctxt(ps_dec, &(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon),
632
134k
                               ps_dec->u2_frm_wd_in_mbs, 0);
633
634
134k
    ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic;
635
134k
    ps_dec->u4_cur_deblk_mb_num = 0;
636
134k
    ps_dec->u4_deblk_mb_x = 0;
637
134k
    ps_dec->u4_deblk_mb_y = 0;
638
134k
    ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
639
640
134k
    ps_dec->u4_first_slice_in_pic = 0;
641
134k
    H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
642
134k
    return OK;
643
134k
}
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
215
    {
696
215
        return ERROR_CORRUPTED_SLICE;
697
215
    }
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.0k
       (ps_dec->u4_first_slice_in_pic == 0))
702
55
    {
703
55
        return ERROR_CORRUPTED_SLICE;
704
55
    }
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
84
        {
710
84
            return ERROR_CORRUPTED_SLICE;
711
84
        }
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
305
    {
727
305
        u1_slice_type -= 5;
728
305
    }
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
85
    {
737
85
        return ERROR_INV_SLICE_HDR_T;
738
85
    }
739
    /* slices in a layer should have same PPS id*/
740
37.6k
    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
838
    else if(u4_temp != ps_svc_lyr_dec->u4_pps_id_for_layer)
745
69
    {
746
69
        return ERROR_INV_SLICE_HDR_T;
747
69
    }
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.2k
    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
36.9k
    if(OK != isvcd_verify_level(ps_seq->u1_level_idc)) return ERROR_INV_SLICE_HDR_T;
762
763
36.8k
    if(ps_dec->u1_init_dec_flag == 1)
764
30.5k
    {
765
30.5k
        if(ps_dec->u2_frm_wd_in_mbs != ps_seq->u2_frm_wd_in_mbs) return ERROR_INV_SLICE_HDR_T;
766
30.4k
        if(ps_dec->u2_frm_ht_in_mbs != ps_seq->u2_frm_ht_in_mbs) return ERROR_INV_SLICE_HDR_T;
767
30.4k
    }
768
769
36.7k
    if(ps_dec->u1_init_dec_flag == 1)
770
30.3k
    {
771
30.3k
        if(ps_dec->u2_disp_height != ps_subset_seq->u2_disp_height) return ERROR_INV_SLICE_HDR_T;
772
30.3k
        if(ps_dec->u2_disp_width != ps_subset_seq->u2_disp_width) return ERROR_INV_SLICE_HDR_T;
773
30.3k
    }
774
775
36.5k
    ps_dec->i4_reorder_depth = ps_subset_seq->i4_reorder_depth;
776
777
36.5k
    ps_dec->u2_disp_height = ps_subset_seq->u2_disp_height;
778
36.5k
    ps_dec->u2_disp_width = ps_subset_seq->u2_disp_width;
779
780
36.5k
    if(ps_svc_lyr_dec->u1_layer_id > 0)
781
36.5k
    {
782
36.5k
        psvcd_dec_ctxt = ps_svc_lyr_dec->ps_svcd_ctxt;
783
36.5k
        ps_svc_cur_lyr_dec_minus_1 =
784
36.5k
            &psvcd_dec_ctxt->ps_svc_dec_lyr[ps_svc_lyr_dec->u1_layer_id - 1];
785
786
36.5k
        ps_dec_cur_lyr_minus_1 = &ps_svc_cur_lyr_dec_minus_1->s_dec;
787
788
36.5k
        if((ps_dec_cur_lyr_minus_1->u2_pic_wd > ps_subset_seq->u2_pic_wd) ||
789
36.4k
           (ps_dec_cur_lyr_minus_1->u2_pic_ht > ps_subset_seq->u2_pic_ht))
790
161
        {
791
161
            return ERROR_CORRUPTED_SLICE;
792
161
        }
793
36.5k
    }
794
795
36.4k
    ps_dec->u2_pic_wd = ps_subset_seq->u2_pic_wd;
796
36.4k
    ps_dec->u2_pic_ht = ps_subset_seq->u2_pic_ht;
797
36.4k
    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.4k
    ps_dec->u2_frm_wd_y = ps_subset_seq->u2_frm_wd_y;
801
36.4k
    ps_dec->u2_frm_ht_y = ps_subset_seq->u2_frm_ht_y;
802
803
36.4k
    ps_dec->u2_frm_wd_uv = ps_subset_seq->u2_frm_wd_uv;
804
36.4k
    ps_dec->u2_frm_ht_uv = ps_subset_seq->u2_frm_ht_uv;
805
806
36.4k
    ps_dec->s_pad_mgr.u1_pad_len_y_v = ps_subset_seq->u1_pad_len_y_v;
807
36.4k
    ps_dec->s_pad_mgr.u1_pad_len_cr_v = ps_subset_seq->u1_pad_len_cr_v;
808
809
36.4k
    ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
810
36.4k
    ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
811
812
36.4k
    ps_dec->u2_crop_offset_y = ps_subset_seq->u2_crop_offset_y;
813
36.4k
    ps_dec->u2_crop_offset_uv = ps_subset_seq->u2_crop_offset_uv;
814
815
    /* Get the frame num */
816
36.4k
    u2_frame_num = ih264d_get_bits_h264(ps_bitstrm, ps_seq->u1_bits_in_frm_num);
817
818
36.4k
    COPYTHECONTEXT("Slice Header SVC ext: frame_num", u2_frame_num);
819
36.4k
    if(!ps_dec->u1_first_slice_in_stream && ps_dec->u4_first_slice_in_pic)
820
23.3k
    {
821
23.3k
        pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
822
23.3k
        pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
823
824
23.3k
        ps_dec->u2_mbx = 0xffff;
825
23.3k
        ps_dec->u2_mby = 0;
826
827
23.3k
        if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
828
2.03k
            ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
829
830
23.3k
        if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5) ps_dec->u2_prev_ref_frame_num = 0;
831
832
23.3k
        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
23.3k
        ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
838
23.3k
        ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
839
23.3k
        ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
840
23.3k
        if(ps_cur_slice->u1_nal_ref_idc)
841
19.9k
        {
842
19.9k
            ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
843
19.9k
            ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
844
19.9k
            ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom;
845
19.9k
            ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0];
846
19.9k
            ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1];
847
19.9k
            ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
848
19.9k
        }
849
850
23.3k
        ps_dec->u4_total_mbs_coded = 0;
851
23.3k
    }
852
    /* Get the field related flags  */
853
36.4k
    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.4k
    else
871
36.4k
    {
872
36.4k
        u1_field_pic_flag = 0;
873
36.4k
        u1_bottom_field_flag = 0;
874
36.4k
        ps_dec->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan;
875
36.4k
    }
876
877
36.4k
    u1_nal_unit_type = SLICE_NAL;
878
36.4k
    if(u1_is_idr_slice)
879
32.2k
    {
880
32.2k
        u1_nal_unit_type = IDR_SLICE_NAL;
881
32.2k
        u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
882
32.2k
        if(u4_idr_pic_id > 65535) return ERROR_INV_SLICE_HDR_T;
883
31.7k
        COPYTHECONTEXT("Slice Header SVC ext:  ", u4_idr_pic_id);
884
31.7k
    }
885
886
    /* read delta pic order count information*/
887
35.9k
    i_delta_poc[0] = i_delta_poc[1] = 0;
888
35.9k
    s_tmp_poc.i4_pic_order_cnt_lsb = 0;
889
35.9k
    s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
890
35.9k
    u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
891
35.9k
    if(u1_pic_order_cnt_type == 0)
892
33.9k
    {
893
33.9k
        i_temp = ih264d_get_bits_h264(ps_bitstrm, ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
894
33.9k
        if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb) return ERROR_INV_SLICE_HDR_T;
895
33.9k
        s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
896
33.9k
        COPYTHECONTEXT("Slice Header SVC ext: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
897
898
33.9k
        if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
899
4.01k
        {
900
4.01k
            s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
901
4.01k
            COPYTHECONTEXT("Slice Header SVC ext: delta_pic_order_cnt_bottom",
902
4.01k
                           s_tmp_poc.i4_delta_pic_order_cnt_bottom);
903
4.01k
        }
904
33.9k
    }
905
906
35.9k
    s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
907
35.9k
    s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
908
35.9k
    if(u1_pic_order_cnt_type == 1 && (!ps_seq->u1_delta_pic_order_always_zero_flag))
909
919
    {
910
919
        s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
911
919
        COPYTHECONTEXT("Slice Header SVC ext: delta_pic_order_cnt[0]",
912
919
                       s_tmp_poc.i4_delta_pic_order_cnt[0]);
913
914
919
        if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
915
406
        {
916
406
            s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
917
406
            COPYTHECONTEXT("Slice Header SVC ext: delta_pic_order_cnt[1]",
918
406
                           s_tmp_poc.i4_delta_pic_order_cnt[1]);
919
406
        }
920
919
    }
921
922
35.9k
    if(ps_pps->u1_redundant_pic_cnt_present_flag)
923
13.6k
    {
924
13.6k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
925
13.6k
        if(u4_temp > MAX_REDUNDANT_PIC_CNT) return ERROR_INV_SLICE_HDR_T;
926
13.5k
        u1_redundant_pic_cnt = u4_temp;
927
13.5k
        COPYTHECONTEXT("Slice Header SVC ext: redundant_pic_cnt", u1_redundant_pic_cnt);
928
13.5k
    }
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.8k
    i1_is_end_of_poc = 1;
935
35.8k
    ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
936
937
35.8k
    if(ps_dec->u4_first_slice_in_pic == 0)
938
769
    {
939
769
        i1_is_end_of_poc =
940
769
            ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc, &s_tmp_poc, &ps_dec->s_cur_pic_poc,
941
769
                                 ps_cur_slice, u1_pic_order_cnt_type, u1_nal_unit_type,
942
769
                                 u4_idr_pic_id, u1_field_pic_flag, u1_bottom_field_flag);
943
769
        if(i1_is_end_of_poc)
944
51
        {
945
51
            ps_dec->u1_first_slice_in_stream = 0;
946
51
            return ERROR_INCOMPLETE_FRAME;
947
51
        }
948
769
    }
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.7k
    u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
955
35.7k
    prev_slice_err = 0;
956
957
35.7k
    if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
958
35.0k
    {
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.0k
        if((u1_field_pic_flag == 0 || u2_frame_num != ps_dec->u2_prv_frame_num) &&
965
35.0k
           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.0k
        else if(ps_dec->u4_first_slice_in_pic)
992
35.0k
        {
993
35.0k
            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.0k
        }
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.0k
    }
1022
718
    else
1023
718
    {
1024
718
        if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u4_total_mbs_coded)
1025
39
        {
1026
            // previous slice - missing/corruption
1027
39
            prev_slice_err = 2;
1028
39
            num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff) - ps_dec->u4_total_mbs_coded;
1029
39
            ps_cur_poc = &s_tmp_poc;
1030
39
        }
1031
679
        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
718
    }
1036
35.7k
    if(prev_slice_err)
1037
39
    {
1038
39
        ret = isvcd_mark_err_slice_skip((svc_dec_lyr_struct_t *) ps_dec, num_mb_skipped,
1039
39
                                        u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err);
1040
1041
39
        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
39
        if(prev_slice_err == 2)
1050
39
        {
1051
39
            ps_dec->u1_first_slice_in_stream = 0;
1052
39
            return ERROR_INCOMPLETE_FRAME;
1053
39
        }
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.7k
    if(u1_field_pic_flag)
1074
0
    {
1075
0
        ps_dec->u2_prv_frame_num = u2_frame_num;
1076
0
    }
1077
1078
35.7k
    if(ps_cur_slice->u1_mmco_equalto5)
1079
951
    {
1080
951
        WORD32 i4_temp_poc;
1081
951
        WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
1082
951
        WORD64 i8_result;
1083
951
        if(!ps_cur_slice->u1_field_pic_flag)  // or a complementary field pair
1084
951
        {
1085
951
            i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1086
951
            i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1087
951
            i4_temp_poc = MIN(i4_top_field_order_poc, i4_bot_field_order_poc);
1088
951
        }
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
951
        i8_result = (WORD64) i4_temp_poc - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1095
951
        if(IS_OUT_OF_RANGE_S32(i8_result))
1096
0
        {
1097
0
            return ERROR_INV_POC;
1098
0
        }
1099
951
        ps_dec->ps_cur_pic->i4_top_field_order_cnt = (WORD32) i8_result;
1100
951
        i8_result = (WORD64) i4_temp_poc - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1101
951
        if(IS_OUT_OF_RANGE_S32(i8_result))
1102
0
        {
1103
0
            return ERROR_INV_POC;
1104
0
        }
1105
951
        ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = (WORD32) i8_result;
1106
951
        ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
1107
951
        ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
1108
951
    }
1109
35.7k
    if(ps_dec->u4_first_slice_in_pic)
1110
35.0k
    {
1111
35.0k
        ret = isvcd_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num, &ps_dec->s_prev_pic_poc,
1112
35.0k
                                         &s_tmp_poc, ps_cur_slice, ps_pps, u1_nal_ref_idc,
1113
35.0k
                                         u1_bottom_field_flag, u1_field_pic_flag, &i4_poc, ps_dec);
1114
35.0k
        if(ret != OK) return ret;
1115
        /* Display seq no calculations */
1116
34.9k
        if(i4_poc >= ps_dec->i4_max_poc) ps_dec->i4_max_poc = i4_poc;
1117
        /* IDR Picture or POC wrap around */
1118
34.9k
        if(i4_poc == 0)
1119
4.41k
        {
1120
4.41k
            WORD64 i8_temp;
1121
4.41k
            i8_temp = (WORD64) ps_dec->i4_prev_max_display_seq + ps_dec->i4_max_poc +
1122
4.41k
                      ps_dec->u1_max_dec_frame_buffering + 1;
1123
            /*If i4_prev_max_display_seq overflows integer range, reset it */
1124
4.41k
            ps_dec->i4_prev_max_display_seq = IS_OUT_OF_RANGE_S32(i8_temp) ? 0 : i8_temp;
1125
4.41k
            ps_dec->i4_max_poc = 0;
1126
4.41k
        }
1127
34.9k
    }
1128
1129
    /* Increment only if the current slice has atleast 1 more MB */
1130
35.6k
    if(ps_dec->u4_first_slice_in_pic == 0 &&
1131
679
       (ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice <
1132
679
        (UWORD32) (ps_dec->u4_total_mbs_coded >> ps_dec->ps_cur_slice->u1_mbaff_frame_flag)))
1133
679
    {
1134
679
        ps_dec->ps_parse_cur_slice++;
1135
679
        ps_dec->u2_cur_slice_num++;
1136
        // in the case of single core increment ps_decode_cur_slice
1137
679
        if(ps_dec->u1_separate_parse == 0)
1138
417
        {
1139
417
            ps_dec->ps_decode_cur_slice++;
1140
417
        }
1141
679
    }
1142
1143
35.6k
    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.6k
    ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
1151
35.6k
    ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
1152
35.6k
    ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1153
35.6k
    ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
1154
35.6k
    ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1155
35.6k
    ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1156
35.6k
    ps_cur_slice->u1_slice_type = u1_slice_type;
1157
35.6k
    ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
1158
1159
35.6k
    ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1160
35.6k
    ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1161
35.6k
    ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1162
35.6k
    ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
1163
1164
35.6k
    if(ps_seq->u1_frame_mbs_only_flag)
1165
35.6k
        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.6k
    if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
1170
35.6k
    {
1171
35.6k
        if(B_SLICE == u1_slice_type)
1172
12.2k
        {
1173
12.2k
            ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
1174
12.2k
            COPYTHECONTEXT("Slice Header SVC ext: direct_spatial_mv_pred_flag",
1175
12.2k
                           ps_cur_slice->u1_direct_spatial_mv_pred_flag);
1176
1177
12.2k
            if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
1178
4.50k
                ps_cur_slice->pf_decodeDirect = isvcd_decode_spatial_direct;
1179
7.78k
            else
1180
7.78k
                ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
1181
12.2k
            if(!((ps_seq->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1182
12.2k
                ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
1183
12.2k
        }
1184
23.3k
        else
1185
23.3k
        {
1186
23.3k
            if(!((ps_seq->u1_mb_aff_flag) && (!u1_field_pic_flag))) /*check if this is valid here */
1187
23.3k
                ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
1188
23.3k
        }
1189
35.6k
    }
1190
1191
35.6k
    if(ps_dec->u4_first_slice_in_pic)
1192
34.9k
    {
1193
34.9k
        if(u2_first_mb_in_slice == 0)
1194
34.9k
        {
1195
34.9k
            ret = isvcd_start_of_pic(ps_svc_lyr_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
1196
34.9k
            if(ret != OK) return ret;
1197
            /*inter layer buffer intialization */
1198
33.1k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1199
33.1k
                ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start;
1200
33.1k
            ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_cur_mb =
1201
33.1k
                ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_base;
1202
33.1k
        }
1203
1204
33.1k
        ps_dec->u4_output_present = 0;
1205
1206
33.1k
        {
1207
33.1k
            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.1k
            if(0 != ps_dec->s_disp_op.u4_error_code)
1212
9.82k
            {
1213
9.82k
                ps_dec->u4_output_present = 0;
1214
9.82k
                ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
1215
9.82k
            }
1216
23.3k
            else
1217
23.3k
                ps_dec->u4_output_present = 1;
1218
33.1k
        }
1219
33.1k
        ret = isvcd_parse_interlayer_resamp_func_init(ps_svc_lyr_dec, u2_first_mb_in_slice);
1220
33.1k
        if(ret != OK)
1221
433
        {
1222
433
            return ERROR_CORRUPTED_SLICE;
1223
433
        }
1224
32.6k
        if((ps_dec->u1_separate_parse == 1) &&
1225
19.9k
           (ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) && (ps_svc_lyr_dec->u1_res_init_done == 1))
1226
19.9k
        {
1227
19.9k
            if(ps_dec->u4_dec_thread_created == 0)
1228
19.9k
            {
1229
19.9k
                ithread_create(ps_dec->pv_dec_thread_handle, NULL,
1230
19.9k
                               (void *) isvcd_decode_picture_thread, (void *) ps_dec);
1231
1232
19.9k
                ps_dec->u4_dec_thread_created = 1;
1233
19.9k
            }
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
19.9k
        }
1260
32.6k
    }
1261
1262
    /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
1263
33.3k
    {
1264
33.3k
        UWORD8 uc_nofield_nombaff;
1265
1266
33.3k
        uc_nofield_nombaff =
1267
33.3k
            ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0) &&
1268
33.3k
             (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0) && (u1_slice_type != B_SLICE) &&
1269
21.7k
             (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.3k
        if(uc_nofield_nombaff)
1274
17.8k
        {
1275
17.8k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
1276
17.8k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
1277
17.8k
        }
1278
15.4k
        else
1279
15.4k
        {
1280
15.4k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
1281
15.4k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
1282
15.4k
        }
1283
33.3k
    }
1284
1285
    /*
1286
     * Decide whether to decode the current picture or not
1287
     */
1288
33.3k
    {
1289
33.3k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
1290
33.3k
        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.3k
        ps_err->u4_cur_frm = u2_frame_num;
1296
33.3k
    }
1297
1298
    /* Decision for decoding if the picture is to be skipped */
1299
33.3k
    {
1300
33.3k
        WORD32 i4_skip_b_pic, i4_skip_p_pic;
1301
1302
33.3k
        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.3k
        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.3k
        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.3k
        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.3k
    }
1337
1338
33.3k
    {
1339
33.3k
        UWORD16 u2_mb_x, u2_mb_y;
1340
1341
33.3k
        ps_dec->i4_submb_ofst =
1342
33.3k
            ((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE) -
1343
33.3k
            SUB_BLK_SIZE;
1344
33.3k
        if(u2_first_mb_in_slice)
1345
679
        {
1346
679
            UWORD8 u1_mb_aff;
1347
679
            UWORD8 u1_field_pic;
1348
679
            UWORD16 u2_frm_wd_in_mbs;
1349
679
            u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
1350
679
            u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
1351
679
            u1_field_pic = ps_cur_slice->u1_field_pic_flag;
1352
1353
679
            {
1354
679
                UWORD32 x_offset;
1355
679
                UWORD32 y_offset;
1356
679
                UWORD32 u4_frame_stride;
1357
679
                tfr_ctxt_t *ps_trns_addr;  // = &ps_dec->s_tran_addrecon_parse;
1358
1359
679
                if(ps_dec->u1_separate_parse)
1360
262
                {
1361
262
                    ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1362
262
                }
1363
417
                else
1364
417
                {
1365
417
                    ps_trns_addr = &ps_dec->s_tran_addrecon;
1366
417
                }
1367
679
                u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1368
679
                u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1369
1370
679
                u2_mb_y <<= u1_mb_aff;
1371
1372
679
                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
679
                u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
1378
679
                x_offset = u2_mb_x << 4;
1379
679
                y_offset = (u2_mb_y * u4_frame_stride) << 4;
1380
1381
679
                ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset + y_offset;
1382
1383
679
                u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
1384
679
                x_offset >>= 1;
1385
679
                y_offset = (u2_mb_y * u4_frame_stride) << 3;
1386
1387
679
                x_offset *= YUV420SP_FACTOR;
1388
1389
679
                ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset + y_offset;
1390
679
                ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset + y_offset;
1391
1392
679
                ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1393
679
                ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1394
679
                ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1395
1396
                // assign the deblock structure pointers to start of slice
1397
679
                if(ps_dec->u1_separate_parse == 1)
1398
262
                {
1399
262
                    ps_dec->ps_deblk_mbn =
1400
262
                        ps_dec->ps_deblk_pic + (u2_first_mb_in_slice << u1_mb_aff);
1401
262
                }
1402
417
                else
1403
417
                {
1404
417
                    ps_dec->ps_deblk_mbn =
1405
417
                        ps_dec->ps_deblk_pic + (u2_first_mb_in_slice << u1_mb_aff);
1406
417
                }
1407
1408
679
                ps_dec->u4_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
1409
1410
679
                ps_dec->ps_mv_cur =
1411
679
                    ps_dec->s_cur_pic.ps_mv + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
1412
679
            }
1413
679
        }
1414
32.6k
        else
1415
32.6k
        {
1416
32.6k
            tfr_ctxt_t *ps_trns_addr;
1417
1418
32.6k
            if(ps_dec->u1_separate_parse)
1419
19.9k
            {
1420
19.9k
                ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1421
19.9k
            }
1422
12.7k
            else
1423
12.7k
            {
1424
12.7k
                ps_trns_addr = &ps_dec->s_tran_addrecon;
1425
12.7k
            }
1426
1427
32.6k
            u2_mb_x = 0xffff;
1428
32.6k
            u2_mb_y = 0;
1429
            // assign the deblock structure pointers to start of slice
1430
32.6k
            ps_dec->u4_cur_mb_addr = 0;
1431
32.6k
            ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
1432
32.6k
            ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
1433
32.6k
            ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
1434
32.6k
            ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
1435
32.6k
            ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
1436
1437
32.6k
            ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1438
32.6k
            ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1439
32.6k
            ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1440
32.6k
        }
1441
1442
33.3k
        ps_dec->ps_part = ps_dec->ps_parse_part_params;
1443
1444
33.3k
        ps_dec->u2_mbx = (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1445
33.3k
        ps_dec->u2_mby = (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1446
33.3k
        ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
1447
33.3k
        ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1448
33.3k
        ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1449
33.3k
    }
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.3k
    ps_dec->u1_B = (u1_slice_type == B_SLICE);
1455
33.3k
    ps_dec->u4_next_mb_skip = 0;
1456
1457
33.3k
    ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->ps_cur_slice->u2_first_mb_in_slice;
1458
33.3k
    ps_dec->ps_parse_cur_slice->slice_type = ps_dec->ps_cur_slice->u1_slice_type;
1459
1460
33.3k
    ps_dec->u4_start_recon_deblk = 1;
1461
33.3k
    {
1462
33.3k
        WORD32 num_entries;
1463
33.3k
        WORD32 size;
1464
33.3k
        UWORD8 *pu1_buf;
1465
1466
33.3k
        num_entries = MAX_FRAMES;
1467
33.3k
        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.3k
        num_entries = ((2 * num_entries) + 1);
1472
33.3k
        num_entries *= 2;
1473
1474
33.3k
        size = num_entries * sizeof(void *);
1475
33.3k
        size += PAD_MAP_IDX_POC * sizeof(void *);
1476
1477
33.3k
        pu1_buf = (UWORD8 *) ps_dec->pv_map_ref_idx_to_poc_buf;
1478
33.3k
        pu1_buf += size * ps_dec->u2_cur_slice_num;
1479
33.3k
        ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (void *) pu1_buf;
1480
33.3k
    }
1481
1482
33.3k
    if(ps_dec->u1_separate_parse)
1483
20.2k
    {
1484
20.2k
        ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1485
20.2k
    }
1486
13.1k
    else
1487
13.1k
    {
1488
13.1k
        ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1489
13.1k
    }
1490
1491
33.3k
    ret = ih264d_fix_error_in_dpb(ps_dec);
1492
33.3k
    if(ret < 0) return ERROR_DBP_MANAGER_T;
1493
1494
    /*Default initializing default values for some parameters*/
1495
33.3k
    ps_svc_slice_params->u1_slice_skip_flag = 0;
1496
33.3k
    ps_svc_slice_params->u1_adaptive_base_mode_flag = 0;
1497
33.3k
    ps_svc_slice_params->u1_default_base_mode_flag = 0;
1498
33.3k
    ps_svc_slice_params->u1_adaptive_motion_prediction_flag = 0;
1499
33.3k
    ps_svc_slice_params->u1_default_motion_prediction_flag = 0;
1500
33.3k
    ps_svc_slice_params->u1_adaptive_residual_prediction_flag = 0;
1501
33.3k
    ps_svc_slice_params->u1_default_residual_prediction_flag = 0;
1502
1503
33.3k
    if(u1_slice_type == I_SLICE)
1504
6.18k
    {
1505
6.18k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
1506
1507
6.18k
        ret = isvcd_parse_eislice(ps_svc_lyr_dec, u2_first_mb_in_slice);
1508
6.18k
        ps_dec->u1_pr_sl_type = u1_slice_type;
1509
6.18k
        if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
1510
5.94k
            ps_dec->i4_pic_type = I_SLICE;
1511
6.18k
    }
1512
27.1k
    else if(u1_slice_type == P_SLICE)
1513
15.4k
    {
1514
15.4k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1515
15.4k
        ret = isvcd_parse_epslice(ps_svc_lyr_dec, u2_first_mb_in_slice);
1516
15.4k
        ps_dec->u1_pr_sl_type = u1_slice_type;
1517
15.4k
        if(ps_dec->i4_pic_type != B_SLICE) ps_dec->i4_pic_type = P_SLICE;
1518
15.4k
    }
1519
11.7k
    else if(u1_slice_type == B_SLICE)
1520
11.6k
    {
1521
11.6k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1522
11.6k
        ret = isvcd_parse_ebslice(ps_svc_lyr_dec, u2_first_mb_in_slice);
1523
11.6k
        ps_dec->u1_pr_sl_type = u1_slice_type;
1524
11.6k
        ps_dec->i4_pic_type = B_SLICE;
1525
11.6k
    }
1526
83
    else
1527
83
        return ERROR_INV_SLC_TYPE_T;
1528
1529
33.2k
    if(ps_dec->u1_slice_header_done)
1530
23.9k
    {
1531
        /* set to zero to indicate a valid slice has been decoded */
1532
23.9k
        ps_dec->u1_first_slice_in_stream = 0;
1533
23.9k
    }
1534
1535
33.2k
    if(ret != OK) return ret;
1536
1537
11.0k
    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.0k
    ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1548
11.0k
    ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1549
1550
    /* End of Picture detection */
1551
11.0k
    if(ps_dec->u4_total_mbs_coded >= (ps_seq->u4_max_mb_addr + 1))
1552
6.99k
    {
1553
6.99k
        ps_dec->u1_pic_decode_done = 1;
1554
6.99k
    }
1555
1556
11.0k
    {
1557
11.0k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
1558
11.0k
        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.0k
    }
1563
1564
11.0k
    PRINT_BIN_BIT_RATIO(ps_dec)
1565
1566
11.0k
    return ret;
1567
33.2k
}
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
25.9k
{
1582
25.9k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1583
25.9k
    WORD32 i_status = OK;
1584
25.9k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1585
25.9k
    dec_seq_params_t *ps_seq;
1586
25.9k
    dec_svc_seq_params_t *ps_subset_seq;
1587
25.9k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1588
25.9k
    dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
1589
25.9k
    ps_seq = ps_pps->ps_sps;
1590
25.9k
    ps_seq += MAX_NUM_SEQ_PARAMS;
1591
25.9k
    ps_subset_seq =
1592
25.9k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
1593
25.9k
    ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
1594
25.9k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1595
1596
25.9k
    if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
1597
25.9k
    {
1598
25.9k
        ps_svc_slice_params->u1_ref_layer_chroma_phase_y_plus1 =
1599
25.9k
            ps_sps_svc_ext->u1_seq_ref_layer_chroma_phase_y_plus1;
1600
1601
25.9k
        ps_svc_slice_params->u1_ref_layer_chroma_phase_x_plus1_flag =
1602
25.9k
            ps_sps_svc_ext->u1_seq_ref_layer_chroma_phase_x_plus1_flag;
1603
25.9k
    }
1604
1605
25.9k
    ps_svc_slice_params->u4_ref_layer_dq_id = UINT32_MAX;
1606
25.9k
    ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc = 0;
1607
25.9k
    ps_svc_slice_params->u1_scan_idx_start = 0;
1608
25.9k
    ps_svc_slice_params->u1_scan_idx_end = 15;
1609
25.9k
    ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2 = 0;
1610
25.9k
    ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2 = 0;
1611
25.9k
    ps_svc_slice_params->u1_constrained_intra_resampling_flag = 0;
1612
1613
25.9k
    return i_status;
1614
25.9k
}
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
25.9k
{
1629
25.9k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1630
25.9k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1631
25.9k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1632
25.9k
    dec_seq_params_t *ps_seq;
1633
25.9k
    dec_svc_seq_params_t *ps_subset_seq;
1634
25.9k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1635
25.9k
    dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
1636
25.9k
    svc_dec_ctxt_t *ps_svcd_ctxt;
1637
25.9k
    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
1638
25.9k
    UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
1639
25.9k
    ps_svcd_ctxt = ps_svc_lyr_dec->ps_svcd_ctxt;
1640
25.9k
    ps_seq = ps_pps->ps_sps;
1641
25.9k
    ps_seq += MAX_NUM_SEQ_PARAMS;
1642
25.9k
    ps_subset_seq =
1643
25.9k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
1644
25.9k
    ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
1645
25.9k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1646
1647
25.9k
    if(!ps_svc_lyr_dec->ps_nal_svc_ext->u1_no_inter_layer_pred_flag &&
1648
25.9k
       (0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id))
1649
25.9k
    {
1650
25.9k
        ps_svc_slice_params->u4_ref_layer_dq_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1651
25.9k
        COPYTHECONTEXT("Slice Header SVC ext: u4_ref_layer_dq_id",
1652
25.9k
                       ps_svc_slice_params->u4_ref_layer_dq_id);
1653
25.9k
        if(ps_svc_slice_params->u4_ref_layer_dq_id > MAX_REF_DEP_ID)
1654
301
        {
1655
301
            return ERROR_INV_SLICE_HDR_T;
1656
301
        }
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
25.6k
        ps_svc_lyr_dec->ps_dec_svc_ref_layer =
1666
25.6k
            &ps_svcd_ctxt->ps_svc_dec_lyr[ps_svc_lyr_dec->u1_ref_layer_id];
1667
1668
25.6k
        if(ps_sps_svc_ext->u1_inter_layer_deblocking_filter_control_present_flag)
1669
1.66k
        {
1670
1.66k
            ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc =
1671
1.66k
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1672
1.66k
            COPYTHECONTEXT("Slice Header SVC ext: u4_disable_inter_layer_deblk_filter_idc",
1673
1.66k
                           ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc);
1674
1675
1.66k
            if(ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc > 6)
1676
118
            {
1677
118
                return ERROR_INV_SLICE_HDR_T;
1678
118
            }
1679
1680
1.54k
            if(1 != ps_svc_slice_params->u4_disable_inter_layer_deblk_filter_idc)
1681
1.24k
            {
1682
1.24k
                ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2 =
1683
1.24k
                    ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1684
1.24k
                COPYTHECONTEXT("Slice Header SVC ext: i4_inter_layer_slice_alpha_c0_offset_div2",
1685
1.24k
                               ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2);
1686
1687
1.24k
                if(ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2 > 6 ||
1688
1.16k
                   ps_svc_slice_params->i4_inter_layer_slice_alpha_c0_offset_div2 < -6)
1689
175
                {
1690
175
                    return ERROR_INV_SLICE_HDR_T;
1691
175
                }
1692
1693
1.07k
                ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2 =
1694
1.07k
                    ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1695
1.07k
                COPYTHECONTEXT("Slice Header SVC ext: i4_inter_layer_slice_beta_offset_div2",
1696
1.07k
                               ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2);
1697
1698
1.07k
                if(ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2 > 6 ||
1699
899
                   ps_svc_slice_params->i4_inter_layer_slice_beta_offset_div2 < -6)
1700
296
                {
1701
296
                    return ERROR_INV_SLICE_HDR_T;
1702
296
                }
1703
1.07k
            }
1704
1.54k
        }
1705
1706
25.0k
        ps_svc_slice_params->u1_constrained_intra_resampling_flag = ih264d_get_bit_h264(ps_bitstrm);
1707
25.0k
        COPYTHECONTEXT("Slice Header SVC ext: u1_constrained_intra_resampling_flag",
1708
25.0k
                       ps_svc_slice_params->u1_constrained_intra_resampling_flag);
1709
1710
25.0k
        ps_svc_lyr_dec->s_res_prms.i1_constrained_intra_rsmpl_flag =
1711
25.0k
            ps_svc_lyr_dec->s_svc_slice_params.u1_constrained_intra_resampling_flag;
1712
25.0k
        isvcd_intra_resamp_res_init_update_flags(ps_svc_lyr_dec);
1713
1714
25.0k
        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.0k
        else
1800
25.0k
        {
1801
25.0k
            ps_svc_slice_params->i4_scaled_ref_layer_left_offset =
1802
25.0k
                ps_sps_svc_ext->i4_seq_scaled_ref_layer_left_offset;
1803
25.0k
            ps_svc_slice_params->i4_scaled_ref_layer_top_offset =
1804
25.0k
                ps_sps_svc_ext->i4_seq_scaled_ref_layer_top_offset;
1805
25.0k
            ps_svc_slice_params->i4_scaled_ref_layer_right_offset =
1806
25.0k
                ps_sps_svc_ext->i4_seq_scaled_ref_layer_right_offset;
1807
25.0k
            ps_svc_slice_params->i4_scaled_ref_layer_bottom_offset =
1808
25.0k
                ps_sps_svc_ext->i4_seq_scaled_ref_layer_bottom_offset;
1809
25.0k
        }
1810
25.0k
    }
1811
1812
25.0k
    if(!ps_svc_lyr_dec->ps_nal_svc_ext->u1_no_inter_layer_pred_flag)
1813
25.0k
    {
1814
25.0k
        ps_svc_slice_params->u1_slice_skip_flag = ih264d_get_bit_h264(ps_bitstrm);
1815
25.0k
        COPYTHECONTEXT("Slice Header SVC ext: u1_slice_skip_flag",
1816
25.0k
                       ps_svc_slice_params->u1_slice_skip_flag);
1817
1818
25.0k
        if(ps_svc_slice_params->u1_slice_skip_flag)
1819
977
        {
1820
977
            ps_svc_slice_params->u4_num_mbs_in_slice_minus1 =
1821
977
                ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1822
977
            COPYTHECONTEXT("Slice Header SVC ext: u4_num_mbs_in_slice_minus1",
1823
977
                           ps_svc_slice_params->u4_num_mbs_in_slice_minus1);
1824
977
        }
1825
24.0k
        else
1826
24.0k
        {
1827
24.0k
            ps_svc_slice_params->u1_adaptive_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1828
24.0k
            COPYTHECONTEXT("Slice Header SVC ext: u1_adaptive_base_mode_flag",
1829
24.0k
                           ps_svc_slice_params->u1_adaptive_base_mode_flag);
1830
1831
24.0k
            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.0k
            if(!ps_svc_slice_params->u1_default_base_mode_flag)
1838
18.4k
            {
1839
18.4k
                ps_svc_slice_params->u1_adaptive_motion_prediction_flag =
1840
18.4k
                    ih264d_get_bit_h264(ps_bitstrm);
1841
18.4k
                COPYTHECONTEXT("Slice Header SVC ext: u1_adaptive_motion_prediction_flag",
1842
18.4k
                               ps_svc_slice_params->u1_adaptive_motion_prediction_flag);
1843
1844
18.4k
                if(!ps_svc_slice_params->u1_adaptive_motion_prediction_flag)
1845
11.1k
                {
1846
11.1k
                    ps_svc_slice_params->u1_default_motion_prediction_flag =
1847
11.1k
                        ih264d_get_bit_h264(ps_bitstrm);
1848
11.1k
                    COPYTHECONTEXT("Slice Header SVC ext: u1_default_motion_prediction_flag",
1849
11.1k
                                   ps_svc_slice_params->u1_default_motion_prediction_flag);
1850
11.1k
                }
1851
18.4k
            }
1852
24.0k
            ps_svc_slice_params->u1_adaptive_residual_prediction_flag =
1853
24.0k
                ih264d_get_bit_h264(ps_bitstrm);
1854
24.0k
            COPYTHECONTEXT("Slice Header SVC ext: u1_adaptive_residual_prediction_flag",
1855
24.0k
                           ps_svc_slice_params->u1_adaptive_residual_prediction_flag);
1856
1857
24.0k
            if(!ps_svc_slice_params->u1_adaptive_residual_prediction_flag)
1858
16.8k
            {
1859
16.8k
                ps_svc_slice_params->u1_default_residual_prediction_flag =
1860
16.8k
                    ih264d_get_bit_h264(ps_bitstrm);
1861
16.8k
                COPYTHECONTEXT("Slice Header SVC ext: u1_default_residual_prediction_flag",
1862
16.8k
                               ps_svc_slice_params->u1_default_residual_prediction_flag);
1863
16.8k
            }
1864
24.0k
        }
1865
1866
25.0k
        if(ps_sps_svc_ext->u1_adaptive_tcoeff_level_prediction_flag)
1867
1.43k
        {
1868
1.43k
            ps_svc_slice_params->u1_tcoeff_level_prediction_flag = ih264d_get_bit_h264(ps_bitstrm);
1869
1.43k
            COPYTHECONTEXT("Slice Header SVC ext: u1_tcoeff_level_prediction_flag",
1870
1.43k
                           ps_svc_slice_params->u1_tcoeff_level_prediction_flag);
1871
1872
1.43k
            if(ps_svc_slice_params->u1_tcoeff_level_prediction_flag != 0)
1873
164
            {
1874
164
                return ERROR_INV_SPS_PPS_T;
1875
164
            }
1876
1.43k
        }
1877
25.0k
    }
1878
1879
24.8k
    if(!ps_sps_svc_ext->u1_slice_header_restriction_flag &&
1880
20.2k
       !ps_svc_slice_params->u1_slice_skip_flag)
1881
19.6k
    {
1882
19.6k
        ps_svc_slice_params->u1_scan_idx_start = ih264d_get_bits_h264(ps_bitstrm, 4);
1883
19.6k
        COPYTHECONTEXT("Slice Header SVC ext: u1_scan_idx_start",
1884
19.6k
                       ps_svc_slice_params->u1_scan_idx_start);
1885
19.6k
        ps_svc_slice_params->u1_scan_idx_end = ih264d_get_bits_h264(ps_bitstrm, 4);
1886
19.6k
        COPYTHECONTEXT("Slice Header SVC ext: u1_scan_idx_end",
1887
19.6k
                       ps_svc_slice_params->u1_scan_idx_end);
1888
1889
19.6k
        if(0 != ps_svc_slice_params->u1_scan_idx_start &&
1890
11.6k
           15 != ps_svc_slice_params->u1_scan_idx_end)
1891
913
            return ERROR_SVC_INV_SCAN_IDX;
1892
19.6k
    }
1893
23.9k
    return OK;
1894
24.8k
}
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
133k
{
1912
133k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1913
133k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1914
133k
    dec_pic_params_t *ps_pps;
1915
133k
    dec_seq_params_t *ps_seq;
1916
133k
    dec_svc_seq_params_t *ps_subset_seq;
1917
133k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
1918
133k
    pocstruct_t s_tmp_poc = {0};
1919
133k
    WORD32 i_delta_poc[2] = {0};
1920
133k
    WORD32 i4_poc = 0;
1921
133k
    UWORD16 u2_first_mb_in_slice, u2_frame_num;
1922
133k
    UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type;
1923
133k
    UWORD32 u4_idr_pic_id = 0;
1924
133k
    UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type;
1925
133k
    UWORD8 u1_nal_unit_type;
1926
133k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1927
133k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1928
133k
    WORD8 i1_is_end_of_poc;
1929
1930
133k
    WORD32 ret;
1931
133k
    WORD32 prev_slice_err, num_mb_skipped;
1932
133k
    UWORD32 u4_mbaff;
1933
133k
    pocstruct_t *ps_cur_poc;
1934
1935
133k
    UWORD32 u4_temp;
1936
133k
    WORD32 i_temp;
1937
133k
    svc_dec_ctxt_t *psvcd_dec_ctxt;
1938
133k
    dec_struct_t *ps_dec_cur_lyr_minus_1;
1939
133k
    svc_dec_lyr_struct_t *ps_svc_cur_lyr_dec_minus_1;
1940
1941
    /* read FirstMbInSlice  and slice type*/
1942
133k
    ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
1943
133k
    u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1944
133k
    if(u2_first_mb_in_slice > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs))
1945
13.2k
    {
1946
13.2k
        return ERROR_CORRUPTED_SLICE;
1947
13.2k
    }
1948
1949
    /*we currently don not support ASO*/
1950
120k
    if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) <= ps_dec->u4_cur_mb_addr) &&
1951
111k
       (ps_dec->u4_first_slice_in_pic == 0))
1952
958
    {
1953
958
        return ERROR_CORRUPTED_SLICE;
1954
958
    }
1955
1956
119k
    if(ps_dec->u4_first_slice_in_pic == 1)
1957
116k
    {
1958
116k
        if(u2_first_mb_in_slice != 0)
1959
5.01k
        {
1960
5.01k
            return ERROR_CORRUPTED_SLICE;
1961
5.01k
        }
1962
116k
    }
1963
1964
114k
    COPYTHECONTEXT("SH: first_mb_in_slice", u2_first_mb_in_slice);
1965
1966
114k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1967
114k
    if(u4_temp > 9) return ERROR_INV_SLC_TYPE_T;
1968
1969
113k
    u1_slice_type = u4_temp;
1970
113k
    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
113k
    if(u1_slice_type > 4)
1975
3.36k
    {
1976
3.36k
        u1_slice_type -= 5;
1977
3.36k
    }
1978
1979
113k
    u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1980
113k
    if(u4_temp & MASK_ERR_PIC_SET_ID) return ERROR_INV_SLICE_HDR_T;
1981
    /* discard slice if pic param is invalid */
1982
113k
    COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp);
1983
113k
    ps_pps = &ps_dec->ps_pps[u4_temp];
1984
113k
    if(FALSE == ps_pps->u1_is_valid)
1985
3.15k
    {
1986
3.15k
        return ERROR_INV_SLICE_HDR_T;
1987
3.15k
    }
1988
    /* slices in a layer should have same PPS id*/
1989
109k
    if(UINT32_MAX == ps_svc_lyr_dec->u4_pps_id_for_layer)
1990
106k
    {
1991
106k
        ps_svc_lyr_dec->u4_pps_id_for_layer = u4_temp;
1992
106k
    }
1993
3.02k
    else if(u4_temp != ps_svc_lyr_dec->u4_pps_id_for_layer)
1994
144
    {
1995
144
        return ERROR_INV_SLICE_HDR_T;
1996
144
    }
1997
109k
    ps_seq = ps_pps->ps_sps;
1998
109k
    ps_dec->ps_cur_sps = ps_seq;
1999
109k
    ps_subset_seq = &ps_svc_lyr_dec->ps_subset_sps[ps_seq->u1_seq_parameter_set_id];
2000
109k
    ps_svc_lyr_dec->ps_cur_subset_sps = ps_subset_seq;
2001
109k
    if(!ps_seq) return ERROR_INV_SLICE_HDR_T;
2002
109k
    if(FALSE == ps_seq->u1_is_valid) return ERROR_INV_SLICE_HDR_T;
2003
109k
    if(ps_seq->u1_mb_aff_flag) return ERROR_INV_SLICE_HDR_T;
2004
109k
    if(ps_seq->u1_level_idc > H264_LEVEL_4_2) return ERROR_INV_SLICE_HDR_T;
2005
109k
    if(!ps_seq->u1_frame_mbs_only_flag) return ERROR_INV_SLICE_HDR_T;
2006
108k
    if(OK != isvcd_verify_level(ps_seq->u1_level_idc)) return ERROR_INV_SLICE_HDR_T;
2007
108k
    if(ps_dec->u1_init_dec_flag == 1)
2008
93.5k
    {
2009
93.5k
        if(ps_dec->u2_frm_wd_in_mbs != ps_seq->u2_frm_wd_in_mbs) return ERROR_INV_SLICE_HDR_T;
2010
93.3k
        if(ps_dec->u2_frm_ht_in_mbs != ps_seq->u2_frm_ht_in_mbs) return ERROR_INV_SLICE_HDR_T;
2011
93.3k
    }
2012
2013
108k
    if(ps_dec->u1_init_dec_flag == 1)
2014
93.2k
    {
2015
93.2k
        if(ps_dec->u2_disp_height != ps_subset_seq->u2_disp_height) return ERROR_INV_SLICE_HDR_T;
2016
93.1k
        if(ps_dec->u2_disp_width != ps_subset_seq->u2_disp_width) return ERROR_INV_SLICE_HDR_T;
2017
93.1k
    }
2018
2019
108k
    if(ps_seq->u1_profile_idc == BASE_PROFILE_IDC)
2020
22.1k
    {
2021
22.1k
        if(ps_pps->u1_entropy_coding_mode != 0)
2022
164
        {
2023
164
            return ERROR_INV_SPS_PPS_T;
2024
164
        }
2025
22.1k
    }
2026
2027
107k
    ps_dec->i4_reorder_depth = ps_subset_seq->i4_reorder_depth;
2028
107k
    ps_dec->u2_disp_height = ps_subset_seq->u2_disp_height;
2029
107k
    ps_dec->u2_disp_width = ps_subset_seq->u2_disp_width;
2030
2031
107k
    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
107k
    ps_dec->u2_pic_wd = ps_subset_seq->u2_pic_wd;
2047
107k
    ps_dec->u2_pic_ht = ps_subset_seq->u2_pic_ht;
2048
107k
    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
107k
    ps_dec->u2_frm_wd_y = ps_subset_seq->u2_frm_wd_y;
2052
107k
    ps_dec->u2_frm_ht_y = ps_subset_seq->u2_frm_ht_y;
2053
2054
107k
    ps_dec->u2_frm_wd_uv = ps_subset_seq->u2_frm_wd_uv;
2055
107k
    ps_dec->u2_frm_ht_uv = ps_subset_seq->u2_frm_ht_uv;
2056
2057
107k
    ps_dec->s_pad_mgr.u1_pad_len_y_v = ps_subset_seq->u1_pad_len_y_v;
2058
107k
    ps_dec->s_pad_mgr.u1_pad_len_cr_v = ps_subset_seq->u1_pad_len_cr_v;
2059
107k
    ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
2060
107k
    ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
2061
2062
107k
    ps_dec->u2_crop_offset_y = ps_subset_seq->u2_crop_offset_y;
2063
107k
    ps_dec->u2_crop_offset_uv = ps_subset_seq->u2_crop_offset_uv;
2064
2065
    /* Get the frame num */
2066
107k
    u2_frame_num = ih264d_get_bits_h264(ps_bitstrm, ps_seq->u1_bits_in_frm_num);
2067
107k
    COPYTHECONTEXT("SH: frame_num", u2_frame_num);
2068
2069
107k
    if(!ps_dec->u1_first_slice_in_stream && ps_dec->u4_first_slice_in_pic)
2070
83.3k
    {
2071
83.3k
        pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
2072
83.3k
        pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
2073
2074
83.3k
        ps_dec->u2_mbx = 0xffff;
2075
83.3k
        ps_dec->u2_mby = 0;
2076
2077
83.3k
        if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
2078
11.0k
            ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
2079
2080
83.3k
        if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5) ps_dec->u2_prev_ref_frame_num = 0;
2081
2082
83.3k
        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
83.3k
        ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
2088
83.3k
        ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
2089
83.3k
        ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
2090
83.3k
        if(ps_cur_slice->u1_nal_ref_idc)
2091
74.7k
        {
2092
74.7k
            ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
2093
74.7k
            ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
2094
74.7k
            ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom;
2095
74.7k
            ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0];
2096
74.7k
            ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1];
2097
74.7k
            ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
2098
74.7k
        }
2099
2100
83.3k
        ps_dec->u4_total_mbs_coded = 0;
2101
83.3k
    }
2102
    /* Get the field related flags  */
2103
107k
    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
107k
    else
2121
107k
    {
2122
107k
        u1_field_pic_flag = 0;
2123
107k
        u1_bottom_field_flag = 0;
2124
2125
107k
        ps_dec->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan;
2126
107k
    }
2127
2128
107k
    u1_nal_unit_type = SLICE_NAL;
2129
107k
    if(u1_is_idr_slice)
2130
86.0k
    {
2131
86.0k
        u1_nal_unit_type = IDR_SLICE_NAL;
2132
86.0k
        u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2133
86.0k
        if(u4_idr_pic_id > 65535) return ERROR_INV_SLICE_HDR_T;
2134
85.1k
        COPYTHECONTEXT("SH:  ", u4_idr_pic_id);
2135
85.1k
    }
2136
2137
    /* read delta pic order count information*/
2138
107k
    i_delta_poc[0] = i_delta_poc[1] = 0;
2139
107k
    s_tmp_poc.i4_pic_order_cnt_lsb = 0;
2140
107k
    s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
2141
107k
    u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
2142
107k
    if(u1_pic_order_cnt_type == 0)
2143
77.0k
    {
2144
77.0k
        i_temp = ih264d_get_bits_h264(ps_bitstrm, ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
2145
77.0k
        if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb) return ERROR_INV_SLICE_HDR_T;
2146
77.0k
        s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
2147
77.0k
        COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
2148
2149
77.0k
        if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
2150
31.5k
        {
2151
31.5k
            s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2152
31.5k
            COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom",
2153
31.5k
                           s_tmp_poc.i4_delta_pic_order_cnt_bottom);
2154
31.5k
        }
2155
77.0k
    }
2156
2157
107k
    s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
2158
107k
    s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
2159
107k
    if(u1_pic_order_cnt_type == 1 && (!ps_seq->u1_delta_pic_order_always_zero_flag))
2160
25.2k
    {
2161
25.2k
        s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2162
25.2k
        COPYTHECONTEXT("SH: delta_pic_order_cnt[0]", s_tmp_poc.i4_delta_pic_order_cnt[0]);
2163
2164
25.2k
        if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
2165
22.9k
        {
2166
22.9k
            s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2167
22.9k
            COPYTHECONTEXT("SH: delta_pic_order_cnt[1]", s_tmp_poc.i4_delta_pic_order_cnt[1]);
2168
22.9k
        }
2169
25.2k
    }
2170
2171
107k
    if(ps_pps->u1_redundant_pic_cnt_present_flag)
2172
30.7k
    {
2173
30.7k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2174
30.7k
        if(u4_temp > MAX_REDUNDANT_PIC_CNT) return ERROR_INV_SLICE_HDR_T;
2175
30.0k
        u1_redundant_pic_cnt = u4_temp;
2176
30.0k
        COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt);
2177
30.0k
    }
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
106k
    i1_is_end_of_poc = 1;
2184
106k
    ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
2185
2186
106k
    if(ps_dec->u4_first_slice_in_pic == 0)
2187
2.88k
    {
2188
2.88k
        i1_is_end_of_poc =
2189
2.88k
            ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc, &s_tmp_poc, &ps_dec->s_cur_pic_poc,
2190
2.88k
                                 ps_cur_slice, u1_pic_order_cnt_type, u1_nal_unit_type,
2191
2.88k
                                 u4_idr_pic_id, u1_field_pic_flag, u1_bottom_field_flag);
2192
2.88k
        if(i1_is_end_of_poc)
2193
171
        {
2194
171
            ps_dec->u1_first_slice_in_stream = 0;
2195
171
            return ERROR_INCOMPLETE_FRAME;
2196
171
        }
2197
2.88k
    }
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
106k
    u4_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
2204
106k
    prev_slice_err = 0;
2205
2206
106k
    if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
2207
103k
    {
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
103k
        if((u1_field_pic_flag == 0 || u2_frame_num != ps_dec->u2_prv_frame_num) &&
2214
103k
           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
103k
        else if(ps_dec->u4_first_slice_in_pic)
2241
103k
        {
2242
103k
            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
103k
        }
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
103k
    }
2271
2.71k
    else
2272
2.71k
    {
2273
2.71k
        if((u2_first_mb_in_slice << u4_mbaff) > ps_dec->u4_total_mbs_coded)
2274
86
        {
2275
            // previous slice - missing/corruption
2276
86
            prev_slice_err = 2;
2277
86
            num_mb_skipped = (u2_first_mb_in_slice << u4_mbaff) - ps_dec->u4_total_mbs_coded;
2278
86
            ps_cur_poc = &s_tmp_poc;
2279
86
        }
2280
2.62k
        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
2.71k
    }
2285
106k
    if(prev_slice_err)
2286
86
    {
2287
86
        ret = isvcd_mark_err_slice_skip((svc_dec_lyr_struct_t *) ps_dec, num_mb_skipped,
2288
86
                                        u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err);
2289
2290
86
        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
86
        if(prev_slice_err == 2)
2299
86
        {
2300
86
            ps_dec->u1_first_slice_in_stream = 0;
2301
86
            return ERROR_INCOMPLETE_FRAME;
2302
86
        }
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
106k
    if(u1_field_pic_flag)
2323
0
    {
2324
0
        ps_dec->u2_prv_frame_num = u2_frame_num;
2325
0
    }
2326
2327
106k
    if(ps_cur_slice->u1_mmco_equalto5 && NULL != ps_dec->ps_cur_pic)
2328
2.63k
    {
2329
2.63k
        WORD32 i4_temp_poc;
2330
2.63k
        WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
2331
2.63k
        WORD64 i8_result;
2332
2.63k
        if(!ps_cur_slice->u1_field_pic_flag)
2333
2.63k
        {
2334
2.63k
            i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
2335
2.63k
            i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
2336
2.63k
            i4_temp_poc = MIN(i4_top_field_order_poc, i4_bot_field_order_poc);
2337
2.63k
        }
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.63k
        i8_result = (WORD64) i4_temp_poc - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
2344
2.63k
        if(IS_OUT_OF_RANGE_S32(i8_result))
2345
99
        {
2346
99
            return ERROR_INV_POC;
2347
99
        }
2348
2.53k
        ps_dec->ps_cur_pic->i4_top_field_order_cnt = (WORD32) i8_result;
2349
2.53k
        i8_result = (WORD64) i4_temp_poc - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
2350
2.53k
        if(IS_OUT_OF_RANGE_S32(i8_result))
2351
147
        {
2352
147
            return ERROR_INV_POC;
2353
147
        }
2354
2.39k
        ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = (WORD32) i8_result;
2355
2.39k
        ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
2356
2.39k
        ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
2357
2.39k
    }
2358
105k
    if(ps_dec->u4_first_slice_in_pic)
2359
103k
    {
2360
103k
        ret = isvcd_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num, &ps_dec->s_prev_pic_poc,
2361
103k
                                         &s_tmp_poc, ps_cur_slice, ps_pps, u1_nal_ref_idc,
2362
103k
                                         u1_bottom_field_flag, u1_field_pic_flag, &i4_poc, ps_dec);
2363
103k
        if(ret != OK) return ret;
2364
        /* Display seq no calculations */
2365
102k
        if(i4_poc >= ps_dec->i4_max_poc) ps_dec->i4_max_poc = i4_poc;
2366
        /* IDR Picture or POC wrap around */
2367
102k
        if(i4_poc == 0)
2368
22.1k
        {
2369
22.1k
            WORD64 i8_temp;
2370
22.1k
            i8_temp = (WORD64) ps_dec->i4_prev_max_display_seq + ps_dec->i4_max_poc +
2371
22.1k
                      ps_dec->u1_max_dec_frame_buffering + 1;
2372
            /*If i4_prev_max_display_seq overflows integer range, reset it */
2373
22.1k
            ps_dec->i4_prev_max_display_seq = IS_OUT_OF_RANGE_S32(i8_temp) ? 0 : i8_temp;
2374
22.1k
            ps_dec->i4_max_poc = 0;
2375
22.1k
        }
2376
102k
    }
2377
2378
    /* Increment only if the current slice has atleast 1 more MB */
2379
104k
    if(ps_dec->u4_first_slice_in_pic == 0 &&
2380
2.62k
       (ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice <
2381
2.62k
        (UWORD32) (ps_dec->u4_total_mbs_coded >> ps_dec->ps_cur_slice->u1_mbaff_frame_flag)))
2382
2.62k
    {
2383
2.62k
        ps_dec->ps_parse_cur_slice++;
2384
2.62k
        ps_dec->u2_cur_slice_num++;
2385
        // in the case of single core increment ps_decode_cur_slice
2386
2.62k
        if(ps_dec->u1_separate_parse == 0)
2387
1.06k
        {
2388
1.06k
            ps_dec->ps_decode_cur_slice++;
2389
1.06k
        }
2390
2.62k
    }
2391
2392
104k
    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
104k
    ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
2400
104k
    ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
2401
104k
    ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
2402
104k
    ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
2403
104k
    ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
2404
104k
    ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
2405
104k
    ps_cur_slice->u1_slice_type = u1_slice_type;
2406
104k
    ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
2407
2408
104k
    ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
2409
104k
    ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
2410
104k
    ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
2411
104k
    ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
2412
2413
104k
    if(ps_seq->u1_frame_mbs_only_flag)
2414
104k
        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
104k
    if(u1_slice_type == B_SLICE)
2419
30.1k
    {
2420
30.1k
        ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
2421
30.1k
        COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag",
2422
30.1k
                       ps_cur_slice->u1_direct_spatial_mv_pred_flag);
2423
2424
30.1k
        if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
2425
16.1k
            ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct;
2426
13.9k
        else
2427
13.9k
            ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
2428
30.1k
        if(!((ps_seq->u1_mb_aff_flag) && (!u1_field_pic_flag)))
2429
30.1k
            ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
2430
30.1k
    }
2431
74.5k
    else
2432
74.5k
    {
2433
74.5k
        if(!((ps_seq->u1_mb_aff_flag) && (!u1_field_pic_flag)))
2434
74.5k
            ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
2435
74.5k
    }
2436
2437
104k
    if(ps_dec->u4_first_slice_in_pic)
2438
102k
    {
2439
102k
        if(u2_first_mb_in_slice == 0)
2440
102k
        {
2441
102k
            ret = isvcd_start_of_pic(ps_svc_lyr_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
2442
102k
            if(ret != OK) return ret;
2443
            /*inter layer buffer intialization */
2444
100k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
2445
100k
                ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start;
2446
100k
            ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_cur_mb =
2447
100k
                ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_base;
2448
100k
        }
2449
2450
100k
        ps_dec->u4_output_present = 0;
2451
2452
100k
        {
2453
100k
            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
100k
            if(0 != ps_dec->s_disp_op.u4_error_code)
2458
37.7k
            {
2459
37.7k
                ps_dec->u4_output_present = 0;
2460
37.7k
                ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
2461
37.7k
            }
2462
63.2k
            else
2463
63.2k
                ps_dec->u4_output_present = 1;
2464
100k
        }
2465
100k
        ret = isvcd_parse_interlayer_resamp_func_init(ps_svc_lyr_dec, u2_first_mb_in_slice);
2466
100k
        if(ret != OK)
2467
0
        {
2468
0
            return ERROR_CORRUPTED_SLICE;
2469
0
        }
2470
100k
        if((ps_dec->u1_separate_parse == 1) && (ps_svc_lyr_dec->u1_res_init_done == 1))
2471
31.3k
        {
2472
31.3k
            if(ps_dec->u4_dec_thread_created == 0)
2473
31.3k
            {
2474
31.3k
                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
31.3k
                else
2482
31.3k
                {
2483
31.3k
                    ithread_create(ps_dec->pv_dec_thread_handle, NULL,
2484
31.3k
                                   (void *) ih264d_decode_picture_thread, (void *) ps_dec);
2485
2486
31.3k
                    ps_dec->u4_dec_thread_created = 1;
2487
31.3k
                }
2488
31.3k
            }
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
31.3k
        }
2515
100k
    }
2516
2517
    /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
2518
103k
    {
2519
103k
        UWORD8 uc_nofield_nombaff;
2520
2521
103k
        uc_nofield_nombaff =
2522
103k
            ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0) &&
2523
103k
             (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0) && (u1_slice_type != B_SLICE) &&
2524
73.9k
             (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
103k
        if(uc_nofield_nombaff)
2529
51.4k
        {
2530
51.4k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
2531
51.4k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
2532
51.4k
        }
2533
52.0k
        else
2534
52.0k
        {
2535
52.0k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
2536
52.0k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
2537
52.0k
        }
2538
103k
    }
2539
2540
    /*
2541
     * Decide whether to decode the current picture or not
2542
     */
2543
103k
    {
2544
103k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
2545
103k
        if(ps_err->u4_frm_sei_sync == u2_frame_num)
2546
48
        {
2547
48
            ps_err->u1_err_flag = ACCEPT_ALL_PICS;
2548
48
            ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
2549
48
        }
2550
103k
        ps_err->u4_cur_frm = u2_frame_num;
2551
103k
    }
2552
2553
    /* Decision for decoding if the picture is to be skipped */
2554
103k
    {
2555
103k
        WORD32 i4_skip_b_pic, i4_skip_p_pic;
2556
2557
103k
        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
103k
        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
103k
        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
103k
        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
103k
    }
2592
2593
103k
    {
2594
103k
        UWORD16 u2_mb_x, u2_mb_y;
2595
2596
103k
        ps_dec->i4_submb_ofst =
2597
103k
            ((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE) -
2598
103k
            SUB_BLK_SIZE;
2599
103k
        if(u2_first_mb_in_slice)
2600
2.62k
        {
2601
2.62k
            UWORD8 u1_mb_aff;
2602
2.62k
            UWORD8 u1_field_pic;
2603
2.62k
            UWORD16 u2_frm_wd_in_mbs;
2604
2.62k
            u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
2605
2.62k
            u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
2606
2.62k
            u1_field_pic = ps_cur_slice->u1_field_pic_flag;
2607
2608
2.62k
            {
2609
2.62k
                UWORD32 x_offset;
2610
2.62k
                UWORD32 y_offset;
2611
2.62k
                UWORD32 u4_frame_stride;
2612
2.62k
                tfr_ctxt_t *ps_trns_addr;
2613
2614
2.62k
                if(ps_dec->u1_separate_parse)
2615
1.55k
                {
2616
1.55k
                    ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
2617
1.55k
                }
2618
1.06k
                else
2619
1.06k
                {
2620
1.06k
                    ps_trns_addr = &ps_dec->s_tran_addrecon;
2621
1.06k
                }
2622
2.62k
                u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
2623
2.62k
                u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
2624
2625
2.62k
                u2_mb_y <<= u1_mb_aff;
2626
2627
2.62k
                if((u2_mb_x > u2_frm_wd_in_mbs - 1) || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1))
2628
75
                {
2629
75
                    return ERROR_CORRUPTED_SLICE;
2630
75
                }
2631
2632
2.55k
                u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
2633
2.55k
                x_offset = u2_mb_x << 4;
2634
2.55k
                y_offset = (u2_mb_y * u4_frame_stride) << 4;
2635
2636
2.55k
                ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset + y_offset;
2637
2638
2.55k
                u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
2639
2.55k
                x_offset >>= 1;
2640
2.55k
                y_offset = (u2_mb_y * u4_frame_stride) << 3;
2641
2642
2.55k
                x_offset *= YUV420SP_FACTOR;
2643
2644
2.55k
                ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset + y_offset;
2645
2.55k
                ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset + y_offset;
2646
2647
2.55k
                ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
2648
2.55k
                ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
2649
2.55k
                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.55k
                if(ps_dec->u1_separate_parse == 1)
2653
1.49k
                {
2654
1.49k
                    ps_dec->ps_deblk_mbn =
2655
1.49k
                        ps_dec->ps_deblk_pic + (u2_first_mb_in_slice << u1_mb_aff);
2656
1.49k
                }
2657
1.05k
                else
2658
1.05k
                {
2659
1.05k
                    ps_dec->ps_deblk_mbn =
2660
1.05k
                        ps_dec->ps_deblk_pic + (u2_first_mb_in_slice << u1_mb_aff);
2661
1.05k
                }
2662
2663
2.55k
                ps_dec->u4_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
2664
2665
2.55k
                ps_dec->ps_mv_cur =
2666
2.55k
                    ps_dec->s_cur_pic.ps_mv + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
2667
2.55k
            }
2668
2.55k
        }
2669
100k
        else
2670
100k
        {
2671
100k
            tfr_ctxt_t *ps_trns_addr;
2672
2673
100k
            if(ps_dec->u1_separate_parse)
2674
31.3k
            {
2675
31.3k
                ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
2676
31.3k
            }
2677
69.5k
            else
2678
69.5k
            {
2679
69.5k
                ps_trns_addr = &ps_dec->s_tran_addrecon;
2680
69.5k
            }
2681
2682
100k
            u2_mb_x = 0xffff;
2683
100k
            u2_mb_y = 0;
2684
            // assign the deblock structure pointers to start of slice
2685
100k
            ps_dec->u4_cur_mb_addr = 0;
2686
100k
            ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
2687
100k
            ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
2688
100k
            ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
2689
100k
            ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
2690
100k
            ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
2691
2692
100k
            ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
2693
100k
            ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
2694
100k
            ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
2695
100k
        }
2696
2697
103k
        ps_dec->ps_part = ps_dec->ps_parse_part_params;
2698
2699
103k
        ps_dec->u2_mbx = (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
2700
103k
        ps_dec->u2_mby = (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
2701
103k
        ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
2702
103k
        ps_dec->i2_prev_slice_mbx = (WORD16) ps_dec->u2_mbx;
2703
103k
        ps_dec->i2_prev_slice_mby = (WORD16) ps_dec->u2_mby;
2704
103k
    }
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
103k
    ps_dec->u1_B = (u1_slice_type == B_SLICE);
2710
103k
    ps_dec->u4_next_mb_skip = 0;
2711
2712
103k
    ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->ps_cur_slice->u2_first_mb_in_slice;
2713
103k
    ps_dec->ps_parse_cur_slice->slice_type = ps_dec->ps_cur_slice->u1_slice_type;
2714
2715
103k
    ps_dec->u4_start_recon_deblk = 1;
2716
103k
    {
2717
103k
        WORD32 num_entries;
2718
103k
        WORD32 size;
2719
103k
        UWORD8 *pu1_buf;
2720
2721
103k
        num_entries = MAX_FRAMES;
2722
103k
        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
103k
        num_entries = ((2 * num_entries) + 1);
2727
103k
        num_entries *= 2;
2728
2729
103k
        size = num_entries * sizeof(void *);
2730
103k
        size += PAD_MAP_IDX_POC * sizeof(void *);
2731
2732
103k
        pu1_buf = (UWORD8 *) ps_dec->pv_map_ref_idx_to_poc_buf;
2733
103k
        pu1_buf += size * ps_dec->u2_cur_slice_num;
2734
103k
        ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (void *) pu1_buf;
2735
103k
    }
2736
2737
103k
    if(ps_dec->u1_separate_parse)
2738
32.8k
    {
2739
32.8k
        ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
2740
32.8k
    }
2741
70.6k
    else
2742
70.6k
    {
2743
70.6k
        ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
2744
70.6k
    }
2745
2746
103k
    ret = ih264d_fix_error_in_dpb(ps_dec);
2747
103k
    if(ret < 0) return ERROR_DBP_MANAGER_T;
2748
2749
103k
    if(u1_slice_type == I_SLICE)
2750
7.81k
    {
2751
7.81k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
2752
2753
7.81k
        ret = isvcd_parse_islice(ps_svc_lyr_dec, u2_first_mb_in_slice);
2754
7.81k
        ps_dec->u1_pr_sl_type = u1_slice_type;
2755
7.81k
        if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
2756
7.00k
            ps_dec->i4_pic_type = I_SLICE;
2757
7.81k
    }
2758
95.6k
    else if(u1_slice_type == P_SLICE)
2759
65.7k
    {
2760
65.7k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
2761
65.7k
        ret = isvcd_parse_pslice(ps_svc_lyr_dec, u2_first_mb_in_slice);
2762
65.7k
        ps_dec->u1_pr_sl_type = u1_slice_type;
2763
65.7k
        if(ps_dec->i4_pic_type != B_SLICE) ps_dec->i4_pic_type = P_SLICE;
2764
65.7k
    }
2765
29.8k
    else if(u1_slice_type == B_SLICE)
2766
29.5k
    {
2767
29.5k
        ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
2768
29.5k
        ret = isvcd_parse_bslice(ps_svc_lyr_dec, u2_first_mb_in_slice);
2769
29.5k
        ps_dec->u1_pr_sl_type = u1_slice_type;
2770
29.5k
        ps_dec->i4_pic_type = B_SLICE;
2771
29.5k
    }
2772
321
    else
2773
321
        return ERROR_INV_SLC_TYPE_T;
2774
2775
103k
    if(ps_dec->u1_slice_header_done)
2776
78.2k
    {
2777
        /* set to zero to indicate a valid slice has been decoded */
2778
78.2k
        ps_dec->u1_first_slice_in_stream = 0;
2779
78.2k
    }
2780
2781
103k
    if(ret != OK) return ret;
2782
2783
53.5k
    if(u1_nal_ref_idc != 0)
2784
48.7k
    {
2785
48.7k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
2786
48.1k
        {
2787
48.1k
            memcpy((void *) ps_dec->ps_dpb_cmds, (void *) (&(ps_dec->s_dpb_cmds_scratch)),
2788
48.1k
                   sizeof(dpb_commands_t));
2789
48.1k
        }
2790
48.7k
    }
2791
2792
    /* storing last Mb X and MbY of the slice */
2793
53.5k
    ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
2794
53.5k
    ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
2795
2796
    /* End of Picture detection */
2797
2798
53.5k
    if(ps_dec->u4_total_mbs_coded >= (ps_seq->u4_max_mb_addr + 1))
2799
26.1k
    {
2800
26.1k
        ps_dec->u1_pic_decode_done = 1;
2801
26.1k
    }
2802
2803
53.5k
    {
2804
53.5k
        dec_err_status_t *ps_err = ps_dec->ps_dec_err_status;
2805
53.5k
        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.5k
    }
2810
2811
53.5k
    PRINT_BIN_BIT_RATIO(ps_dec)
2812
2813
53.5k
    return ret;
2814
103k
}