Coverage Report

Created: 2026-07-16 06:20

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