Coverage Report

Created: 2026-11-12 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/svc/isvcd_parse_epslice.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_epslice.c
24
 *
25
 * @brief
26
 *  Contains routines that decode a EP slice type
27
 *
28
 * @author
29
 *  Kishore
30
 *
31
 * @par List of Functions:
32
 *  - isvcd_parse_epslice()
33
 *  - isvcd_parse_inter_slice_data_cabac()
34
 *  - isvcd_parse_inter_slice_data_cabac_enh_lyr()
35
 *  - isvcd_parse_inter_slice_data_cavlc_enh_lyr()
36
 *  - isvcd_parse_pmb_cabac()
37
 *  - isvcd_parse_pmb_cavlc()
38
 *  - isvcd_mark_err_slice_skip()
39
 *  - isvcd_parse_interlayer_resamp_func_init()
40
 *  - isvcd_parse_pslice()
41
 *
42
 * @remarks
43
 *  None
44
 *
45
 *******************************************************************************
46
 */
47
48
#include <string.h>
49
#include "ih264_defs.h"
50
#include "ih264d_bitstrm.h"
51
#include "ih264d_defs.h"
52
#include "ih264d_debug.h"
53
#include "ih264d_tables.h"
54
#include "isvcd_structs.h"
55
#include "ih264d_parse_cavlc.h"
56
#include "ih264d_mb_utils.h"
57
#include "ih264d_parse_slice.h"
58
#include "ih264d_mvpred.h"
59
#include "ih264d_parse_islice.h"
60
#include "ih264d_process_intra_mb.h"
61
#include "ih264d_inter_pred.h"
62
#include "ih264d_process_pslice.h"
63
#include "ih264d_deblocking.h"
64
#include "ih264d_cabac.h"
65
#include "ih264d_parse_mb_header.h"
66
#include "ih264d_error_handler.h"
67
#include "ih264d_format_conv.h"
68
#include "ih264d_quant_scaling.h"
69
#include "ih264d_thread_parse_decode.h"
70
#include "ih264d_thread_compute_bs.h"
71
#include "ih264d_process_bslice.h"
72
#include "ithread.h"
73
#include "ih264d_utils.h"
74
#include "ih264d_format_conv.h"
75
#include "ih264d_parse_headers.h"
76
#include "isvcd_parse_headers.h"
77
#include "isvcd_process_epslice.h"
78
#include "isvcd_mode_mv_resamp.h"
79
#include "isvcd_parse_slice.h"
80
#include "isvcd_parse_cavlc.h"
81
#include "isvcd_mb_utils.h"
82
83
void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec);
84
void isvcd_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec);
85
86
/*!
87
**************************************************************************
88
* \if Function name : isvcd_parse_epslice \endif
89
*
90
* \brief
91
*    Decodes a EP Slice
92
*
93
*
94
* \return
95
*    0 on Success and Error code otherwise
96
**************************************************************************
97
*/
98
WORD32 isvcd_parse_epslice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice)
99
19.9k
{
100
19.9k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
101
19.9k
    WORD32 i_status = OK;
102
19.9k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
103
19.9k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
104
19.9k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
105
19.9k
    dec_seq_params_t *ps_seq;
106
19.9k
    dec_svc_seq_params_t *ps_subset_seq;
107
19.9k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
108
19.9k
    dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
109
19.9k
    dec_nal_unit_svc_ext_params_t *ps_nal_svc_ext = NULL;
110
111
19.9k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
112
19.9k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
113
19.9k
    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
114
19.9k
    UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
115
116
19.9k
    UWORD64 u8_ref_idx_l0;
117
19.9k
    UWORD32 u4_temp;
118
19.9k
    WORD32 i_temp;
119
19.9k
    WORD32 ret;
120
19.9k
    WORD64 i8_temp;
121
122
19.9k
    ps_nal_svc_ext = ps_svc_lyr_dec->ps_nal_svc_ext;
123
19.9k
    ps_seq = ps_pps->ps_sps;
124
19.9k
    ps_seq += MAX_NUM_SEQ_PARAMS;
125
19.9k
    ps_subset_seq =
126
19.9k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
127
19.9k
    ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
128
19.9k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
129
130
    /*--------------------------------------------------------------------*/
131
    /* Read remaining contents of the slice header                        */
132
    /*--------------------------------------------------------------------*/
133
19.9k
    {
134
19.9k
        WORD8 *pi1_buf;
135
19.9k
        WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
136
19.9k
        WORD32 *pi4_mv = (WORD32 *) pi2_mv;
137
19.9k
        WORD16 *pi16_refFrame;
138
139
19.9k
        pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
140
19.9k
        pi16_refFrame = (WORD16 *) pi1_buf;
141
19.9k
        *pi4_mv = 0;
142
19.9k
        *(pi4_mv + 1) = 0;
143
19.9k
        *pi16_refFrame = OUT_OF_RANGE_REF;
144
19.9k
        ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8) -1;
145
19.9k
        ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8) -1;
146
19.9k
    }
147
148
19.9k
    if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
149
19.9k
    {
150
19.9k
        ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(ps_bitstrm);
151
152
19.9k
        COPYTHECONTEXT("Slice Header SVC ext: num_ref_idx_override_flag",
153
19.9k
                       ps_cur_slice->u1_num_ref_idx_active_override_flag);
154
155
19.9k
        u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
156
19.9k
        if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
157
12.9k
        {
158
12.9k
            u8_ref_idx_l0 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64) 1;
159
12.9k
        }
160
161
19.9k
        {
162
19.9k
            UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS << u1_field_pic_flag;
163
19.9k
            if(u8_ref_idx_l0 > u1_max_ref_idx)
164
221
            {
165
221
                return ERROR_NUM_REF;
166
221
            }
167
19.7k
            ps_cur_slice->u1_num_ref_idx_lx_active[0] = (UWORD8) u8_ref_idx_l0;
168
19.7k
            COPYTHECONTEXT("Slice Header SVC ext: num_ref_idx_l0_active_minus1",
169
19.7k
                           ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
170
19.7k
        }
171
172
0
        {
173
19.7k
            UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
174
19.7k
            COPYTHECONTEXT("Slice Header SVC ext: ref_pic_list_reordering_flag_l0",
175
19.7k
                           uc_refIdxReFlagL0);
176
177
19.7k
            ih264d_init_ref_idx_lx_p(ps_dec);
178
            /* Store the value for future slices in the same picture */
179
19.7k
            ps_dec->u1_num_ref_idx_lx_active_prev = ps_cur_slice->u1_num_ref_idx_lx_active[0];
180
181
            /* Modified temporarily */
182
19.7k
            if(uc_refIdxReFlagL0)
183
9.98k
            {
184
9.98k
                WORD8 ret;
185
9.98k
                ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
186
9.98k
                ret = ih264d_ref_idx_reordering(ps_dec, 0);
187
9.98k
                if(ret == -1) return ERROR_REFIDX_ORDER_T;
188
9.98k
                ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
189
9.98k
            }
190
9.75k
            else
191
9.75k
                ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
192
19.7k
        }
193
        /* Create refIdx to POC mapping */
194
19.7k
        {
195
19.7k
            void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
196
19.7k
            WORD8 idx;
197
19.7k
            struct pic_buffer_t *ps_pic;
198
199
19.7k
            pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
200
19.7k
            pui_map_ref_idx_to_poc_lx0[0] = 0;
201
19.7k
            pui_map_ref_idx_to_poc_lx0++;
202
68.3k
            for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
203
48.6k
            {
204
48.6k
                ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
205
48.6k
                pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
206
48.6k
            }
207
208
            /* Bug Fix Deblocking */
209
19.7k
            pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
210
19.7k
            pui_map_ref_idx_to_poc_lx1[0] = 0;
211
212
19.7k
            if(u1_mbaff)
213
0
            {
214
0
                void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
215
0
                void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1;
216
0
                ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc + TOP_LIST_FLD_L0;
217
0
                ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc + BOT_LIST_FLD_L0;
218
219
0
                ppv_map_ref_idx_to_poc_lx_t[0] = 0;
220
0
                ppv_map_ref_idx_to_poc_lx_t++;
221
0
                ppv_map_ref_idx_to_poc_lx_b[0] = 0;
222
0
                ppv_map_ref_idx_to_poc_lx_b++;
223
224
0
                idx = 0;
225
0
                for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
226
0
                {
227
0
                    ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
228
0
                    ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
229
0
                    ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
230
231
0
                    ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
232
0
                    ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
233
234
0
                    ppv_map_ref_idx_to_poc_lx_t += 2;
235
0
                    ppv_map_ref_idx_to_poc_lx_b += 2;
236
0
                }
237
0
                ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc + TOP_LIST_FLD_L1;
238
0
                ppv_map_ref_idx_to_poc_lx_t1[0] = 0;
239
0
                ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc + BOT_LIST_FLD_L1;
240
0
                ppv_map_ref_idx_to_poc_lx_b1[0] = 0;
241
0
            }
242
            /* BS is moved post recon gen in libsvc*/
243
19.7k
            if(ps_dec->u4_num_cores >= 2)
244
10.9k
            {
245
10.9k
                WORD32 num_entries;
246
10.9k
                WORD32 size;
247
248
10.9k
                num_entries = MAX_FRAMES;
249
10.9k
                if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && (0 == ps_dec->i4_display_delay))
250
0
                {
251
0
                    num_entries = 1;
252
0
                }
253
10.9k
                num_entries = ((2 * num_entries) + 1);
254
10.9k
                num_entries *= 2;
255
256
10.9k
                size = num_entries * sizeof(void *);
257
10.9k
                size += PAD_MAP_IDX_POC * sizeof(void *);
258
259
10.9k
                memcpy((void *) ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
260
10.9k
                       ps_dec->ppv_map_ref_idx_to_poc, size);
261
10.9k
            }
262
19.7k
        }
263
19.7k
        if(ps_pps->u1_wted_pred_flag)
264
3.60k
        {
265
3.60k
            if(!ps_nal_svc_ext->u1_no_inter_layer_pred_flag)
266
3.60k
            {
267
3.60k
                ps_svc_slice_params->u1_base_pred_weight_table_flag =
268
3.60k
                    ih264d_get_bit_h264(ps_bitstrm);
269
3.60k
                COPYTHECONTEXT("Slice Header SVC ext: u1_base_pred_weight_table_flag",
270
3.60k
                               ps_svc_slice_params->u1_base_pred_weight_table_flag);
271
3.60k
            }
272
273
3.60k
            if(ps_nal_svc_ext->u1_no_inter_layer_pred_flag ||
274
3.60k
               !ps_svc_slice_params->u1_base_pred_weight_table_flag)
275
3.22k
            {
276
3.22k
                ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
277
3.22k
                if(ret != OK) return ret;
278
279
3.07k
                ih264d_form_pred_weight_matrix(ps_dec);
280
3.07k
                ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
281
3.07k
            }
282
3.60k
        }
283
16.1k
        else
284
16.1k
        {
285
16.1k
            ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
286
16.1k
            ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
287
16.1k
        }
288
289
19.5k
        ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd;
290
291
19.5k
        if(u1_mbaff && (u1_field_pic_flag == 0))
292
0
        {
293
0
            ih264d_convert_frm_mbaff_list(ps_dec);
294
0
        }
295
296
        /* G050 */
297
19.5k
        if(ps_cur_slice->u1_nal_ref_idc != 0)
298
19.3k
        {
299
19.3k
            if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
300
19.1k
            {
301
19.1k
                dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
302
19.1k
                dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
303
19.1k
                UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
304
305
19.1k
                ps_pps->ps_sps = ps_dec->ps_cur_sps;
306
307
19.1k
                if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
308
16.9k
                    ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
309
310
19.1k
                i_temp = ih264d_read_mmco_commands(ps_dec);
311
312
19.1k
                ps_pps->ps_sps = ps_sps_tmp;
313
19.1k
                ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
314
315
19.1k
                if(i_temp < 0)
316
147
                {
317
147
                    return ERROR_DBP_MANAGER_T;
318
147
                }
319
18.9k
                ps_dec->u4_bitoffset = i_temp;
320
18.9k
            }
321
181
            else
322
181
                ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
323
324
19.1k
            if(!ps_sps_svc_ext->u1_slice_header_restriction_flag)
325
13.3k
            {
326
13.3k
                ps_svc_slice_params->u1_store_ref_base_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
327
13.3k
                COPYTHECONTEXT("SPS_SVC_EXT: u1_store_ref_base_pic_flag",
328
13.3k
                               ps_svc_slice_params->u1_store_ref_base_pic_flag);
329
330
13.3k
                if(0 != ps_svc_slice_params->u1_store_ref_base_pic_flag)
331
984
                {
332
984
                    return NOT_OK;
333
984
                }
334
12.3k
                if(((1 == ps_nal_svc_ext->u1_use_ref_base_pic_flag) ||
335
12.3k
                    (1 == ps_svc_slice_params->u1_store_ref_base_pic_flag)) &&
336
0
                   (!ps_nal_svc_ext->u1_idr_flag))
337
0
                {
338
0
                    i_status = isvcd_dec_ref_base_pic_marking(
339
0
                        &ps_svc_slice_params->s_ref_base_pic_marking_svc_ext, ps_bitstrm);
340
0
                    if(i_status != OK)
341
0
                    {
342
0
                        return i_status;
343
0
                    }
344
0
                }
345
12.3k
            }
346
19.1k
        }
347
19.5k
    }
348
    /* G050 */
349
350
18.4k
    if(ps_pps->u1_entropy_coding_mode == CABAC)
351
3.77k
    {
352
3.77k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
353
354
3.77k
        if(u4_temp > MAX_CABAC_INIT_IDC)
355
171
        {
356
171
            return ERROR_INV_SLICE_HDR_T;
357
171
        }
358
3.60k
        ps_cur_slice->u1_cabac_init_idc = u4_temp;
359
3.60k
        COPYTHECONTEXT("Slice Header SVC ext: cabac_init_idc", ps_cur_slice->u1_cabac_init_idc);
360
3.60k
    }
361
362
    /* Read slice_qp_delta */
363
18.2k
    i8_temp = (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
364
18.2k
    if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
365
763
    {
366
763
        return ERROR_INV_RANGE_QP_T;
367
763
    }
368
17.5k
    ps_cur_slice->u1_slice_qp = (UWORD8) i8_temp;
369
17.5k
    COPYTHECONTEXT("Slice Header SVC ext: slice_qp_delta",
370
17.5k
                   (WORD8) (ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
371
372
17.5k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
373
7.28k
    {
374
7.28k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
375
7.28k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
376
372
        {
377
372
            return ERROR_INV_SLICE_HDR_T;
378
372
        }
379
380
6.90k
        COPYTHECONTEXT("Slice Header SVC ext: disable_deblocking_filter_idc", u4_temp);
381
6.90k
        ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
382
6.90k
        if(u4_temp != 1)
383
5.71k
        {
384
5.71k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
385
5.71k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
386
245
            {
387
245
                return ERROR_INV_SLICE_HDR_T;
388
245
            }
389
5.46k
            ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
390
5.46k
            COPYTHECONTEXT("Slice Header SVC ext: slice_alpha_c0_offset_div2",
391
5.46k
                           ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
392
393
5.46k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
394
5.46k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
395
144
            {
396
144
                return ERROR_INV_SLICE_HDR_T;
397
144
            }
398
5.32k
            ps_cur_slice->i1_slice_beta_offset = i_temp;
399
5.32k
            COPYTHECONTEXT("Slice Header SVC ext: slice_beta_offset_div2",
400
5.32k
                           ps_cur_slice->i1_slice_beta_offset >> 1);
401
5.32k
        }
402
1.19k
        else
403
1.19k
        {
404
1.19k
            ps_cur_slice->i1_slice_alpha_c0_offset = 0;
405
1.19k
            ps_cur_slice->i1_slice_beta_offset = 0;
406
1.19k
        }
407
6.90k
    }
408
10.2k
    else
409
10.2k
    {
410
10.2k
        ps_cur_slice->u1_disable_dblk_filter_idc = 0;
411
10.2k
        ps_cur_slice->i1_slice_alpha_c0_offset = 0;
412
10.2k
        ps_cur_slice->i1_slice_beta_offset = 0;
413
10.2k
    }
414
415
    /* add the remaining part of the code for svc extension from reference */
416
16.7k
    ret = isvcd_set_default_slice_header_ext(ps_svc_lyr_dec);
417
16.7k
    if(ret != OK)
418
0
    {
419
0
        return ERROR_INV_SLICE_HDR_T;
420
0
    }
421
422
16.7k
    ret = isvcd_parse_slice_header(ps_svc_lyr_dec);
423
16.7k
    if(ret != OK)
424
1.83k
    {
425
1.83k
        return ERROR_INV_SLICE_HDR_T;
426
1.83k
    }
427
428
14.9k
    ps_dec->u1_slice_header_done = 2;
429
430
14.9k
    if(!ps_svc_slice_params->u1_slice_skip_flag)
431
14.1k
    {
432
14.1k
        if(ps_pps->u1_entropy_coding_mode)
433
3.36k
        {
434
3.36k
            SWITCHOFFTRACE;
435
3.36k
            SWITCHONTRACECABAC;
436
3.36k
            ps_svc_lyr_dec->pf_parse_inter_slice_svc_ext =
437
3.36k
                isvcd_parse_inter_slice_data_cabac_enh_lyr;
438
3.36k
            ps_svc_lyr_dec->pf_parse_inter_mb_svc_ext = isvcd_parse_pmb_cabac;
439
440
3.36k
            isvcd_init_cabac_contexts(P_SLICE, ps_dec);
441
442
3.36k
            if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
443
0
                ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
444
3.36k
            else
445
3.36k
                ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
446
3.36k
        }
447
10.8k
        else
448
10.8k
        {
449
10.8k
            SWITCHONTRACE;
450
10.8k
            SWITCHOFFTRACECABAC;
451
10.8k
            ps_svc_lyr_dec->pf_parse_inter_slice_svc_ext =
452
10.8k
                isvcd_parse_inter_slice_data_cavlc_enh_lyr;
453
10.8k
            ps_svc_lyr_dec->pf_parse_inter_mb_svc_ext = isvcd_parse_pmb_cavlc;
454
455
10.8k
            if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
456
0
            {
457
0
                ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
458
0
            }
459
10.8k
            else
460
10.8k
                ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
461
10.8k
        }
462
14.1k
    }
463
741
    else
464
741
    {
465
741
        return ERROR_FEATURE_UNAVAIL;
466
741
    }
467
468
14.1k
    ps_dec->u1_B = 0;
469
14.1k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = isvcd_mv_pred_ref_tfr_nby2_epmb;
470
14.1k
    ret = ps_svc_lyr_dec->pf_parse_inter_slice_svc_ext(ps_svc_lyr_dec, ps_cur_slice,
471
14.1k
                                                       u2_first_mb_in_slice);
472
14.1k
    if(ret != OK) return ret;
473
474
7.18k
    return OK;
475
14.1k
}
476
477
/*****************************************************************************/
478
/*                                                                           */
479
/*  Function Name : isvcd_parse_inter_slice_data_cabac                       */
480
/*                                                                           */
481
/*  Description   : This function parses cabac syntax of a inter slice on    */
482
/*                  N MB basis.                                              */
483
/*                                                                           */
484
/*  Inputs        : ps_dec                                                   */
485
/*                  sliceparams                                              */
486
/*                  firstMbInSlice                                           */
487
/*                                                                           */
488
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
489
/*                     decoded till the end of slice.                        */
490
/*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
491
/*                                                                           */
492
/*  Returns       : 0                                                        */
493
/*                                                                           */
494
/*  Issues        : <List any issues or problems with this function>         */
495
/*                                                                           */
496
/*  Revision History:                                                        */
497
/*                                                                           */
498
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
499
/*         13 07 2002   Jay             Draft                                */
500
/*                                                                           */
501
/*****************************************************************************/
502
WORD32 isvcd_parse_inter_slice_data_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
503
                                          dec_slice_params_t *ps_slice,
504
                                          UWORD16 u2_first_mb_in_slice)
505
20.3k
{
506
20.3k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
507
508
20.3k
    UWORD32 uc_more_data_flag;
509
20.3k
    WORD32 i2_cur_mb_addr;
510
20.3k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
511
20.3k
    UWORD32 u1_mbaff;
512
20.3k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
513
20.3k
    const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
514
20.3k
    UWORD32 u1_slice_end = 0;
515
20.3k
    UWORD32 u1_tfr_n_mb = 0;
516
20.3k
    UWORD32 u1_decode_nmb = 0;
517
518
20.3k
    deblk_mb_t *ps_cur_deblk_mb;
519
20.3k
    dec_mb_info_t *ps_cur_mb_info;
520
20.3k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
521
20.3k
    UWORD32 u1_inter_mb_skip_type;
522
20.3k
    UWORD32 u1_inter_mb_type;
523
20.3k
    UWORD32 u1_deblk_mb_type;
524
20.3k
    UWORD32 u1_mb_threshold;
525
20.3k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
526
20.3k
    WORD32 ret = OK;
527
528
    /******************************************************/
529
    /* Initialisations specific to B or P slice           */
530
    /******************************************************/
531
20.3k
    if(ps_slice->u1_slice_type == P_SLICE)
532
9.59k
    {
533
9.59k
        u1_inter_mb_skip_type = CAB_P_SKIP;
534
9.59k
        u1_inter_mb_type = P_MB;
535
9.59k
        u1_deblk_mb_type = D_INTER_MB;
536
9.59k
        u1_mb_threshold = 5;
537
9.59k
    }
538
10.7k
    else  // B_SLICE
539
10.7k
    {
540
10.7k
        u1_inter_mb_skip_type = CAB_B_SKIP;
541
10.7k
        u1_inter_mb_type = B_MB;
542
10.7k
        u1_deblk_mb_type = D_B_SLICE;
543
10.7k
        u1_mb_threshold = 23;
544
10.7k
    }
545
546
    /******************************************************/
547
    /* Slice Level Initialisations                        */
548
    /******************************************************/
549
20.3k
    i2_cur_mb_addr = u2_first_mb_in_slice;
550
20.3k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
551
20.3k
    ih264d_update_qp(ps_dec, 0);
552
20.3k
    u1_mb_idx = ps_dec->u4_mb_idx;
553
20.3k
    u1_num_mbs = u1_mb_idx;
554
20.3k
    u1_num_mbsNby2 = 0;
555
20.3k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
556
20.3k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
557
20.3k
    uc_more_data_flag = 1;
558
559
    /* Initialisations specific to cabac */
560
20.3k
    if(ps_bitstrm->u4_ofst & 0x07)
561
17.1k
    {
562
17.1k
        ps_bitstrm->u4_ofst += 8;
563
17.1k
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
564
17.1k
    }
565
566
20.3k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
567
20.3k
    if(ret != OK) return ret;
568
569
19.2k
    ps_dec->i1_prev_mb_qp_delta = 0;
570
571
2.23M
    while(!u1_slice_end)
572
2.23M
    {
573
2.23M
        UWORD8 u1_mb_type;
574
2.23M
        UWORD32 u4_mb_skip;
575
576
2.23M
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
577
578
2.23M
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
579
8.62k
        {
580
8.62k
            break;
581
8.62k
        }
582
583
2.22M
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
584
2.22M
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
585
586
2.22M
        ps_cur_mb_info->u1_Mux = 0;
587
2.22M
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
588
2.22M
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
589
2.22M
        ps_cur_mb_info->u1_end_of_slice = 0;
590
591
        /* Storing Default partition info */
592
2.22M
        ps_parse_mb_data->u1_num_part = 1;
593
2.22M
        ps_parse_mb_data->u4_isI_mb = 0;
594
595
        /***************************************************************/
596
        /* Get the required information for decoding of MB             */
597
        /* mb_x, mb_y , neighbour availablity,                         */
598
        /***************************************************************/
599
2.22M
        u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1);
600
601
        /*********************************************************************/
602
        /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
603
        /*********************************************************************/
604
2.22M
        ps_cur_mb_info->u1_tran_form8x8 = 0;
605
2.22M
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
606
607
        /***************************************************************/
608
        /* Set the deblocking parameters for this MB                   */
609
        /***************************************************************/
610
2.22M
        if(ps_dec->u4_app_disable_deblk_frm == 0)
611
2.22M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
612
2.22M
                                             ps_dec->u1_mb_ngbr_availablity,
613
2.22M
                                             ps_dec->u1_cur_mb_fld_dec_flag);
614
615
2.22M
        if(u4_mb_skip)
616
1.91M
        {
617
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
618
1.91M
            memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t));
619
1.91M
            ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type;
620
621
1.91M
            MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
622
623
1.91M
            *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
624
1.91M
            *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
625
1.91M
            ps_dec->i1_prev_mb_qp_delta = 0;
626
1.91M
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
627
1.91M
            ps_cur_mb_info->u1_cbp = 0;
628
629
1.91M
            {
630
                /* Storing Skip partition info */
631
1.91M
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
632
1.91M
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
633
1.91M
                ps_part_info->u1_sub_mb_num = 0;
634
1.91M
                ps_dec->ps_part++;
635
1.91M
            }
636
637
            /* Update Nnzs */
638
1.91M
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC);
639
1.91M
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
640
1.91M
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
641
1.91M
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
642
1.91M
            if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
643
467k
            {
644
467k
                ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
645
467k
            }
646
1.91M
        }
647
310k
        else
648
310k
        {
649
            /* Macroblock Layer Begins */
650
            /* Decode the u1_mb_type */
651
310k
            u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec);
652
310k
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
653
310k
            if(u1_mb_type > (25 + u1_mb_threshold)) return ERROR_MB_TYPE;
654
655
            /* Parse Macroblock Data */
656
310k
            if(u1_mb_type < u1_mb_threshold)
657
294k
            {
658
294k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
659
294k
                *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6;
660
661
294k
                ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, u1_num_mbsNby2);
662
294k
                if(ret != OK) return ret;
663
289k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
664
289k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
665
289k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
666
94.7k
                {
667
94.7k
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
668
94.7k
                }
669
289k
            }
670
15.8k
            else
671
15.8k
            {
672
                /* Storing Intra partition info */
673
15.8k
                ps_parse_mb_data->u1_num_part = 0;
674
15.8k
                ps_parse_mb_data->u4_isI_mb = 1;
675
676
15.8k
                if((25 + u1_mb_threshold) == u1_mb_type)
677
229
                {
678
                    /* I_PCM_MB */
679
229
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
680
229
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
681
229
                    if(ret != OK) return ret;
682
74
                    ps_cur_deblk_mb->u1_mb_qp = 0;
683
74
                }
684
15.6k
                else
685
15.6k
                {
686
15.6k
                    if(u1_mb_type == u1_mb_threshold)
687
8.31k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
688
7.32k
                    else
689
7.32k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
690
691
15.6k
                    ret = ih264d_parse_imb_cabac(ps_dec, ps_cur_mb_info,
692
15.6k
                                                 (UWORD8) (u1_mb_type - u1_mb_threshold));
693
15.6k
                    if(ret != OK) return ret;
694
14.8k
                    ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
695
14.8k
                }
696
14.9k
                ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
697
14.9k
            }
698
310k
        }
699
700
2.21M
        if(ps_dec->u1_enable_mb_info)
701
0
        {
702
0
            ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
703
0
                                        ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
704
0
        }
705
2.21M
        if(u1_mbaff)
706
0
        {
707
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
708
0
        }
709
710
2.21M
        if(ps_cur_mb_info->u1_topmb && u1_mbaff)
711
0
            uc_more_data_flag = 1;
712
2.21M
        else
713
2.21M
        {
714
2.21M
            uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
715
2.21M
            uc_more_data_flag = !uc_more_data_flag;
716
2.21M
            COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
717
2.21M
        }
718
719
2.21M
        if(u1_mbaff)
720
0
        {
721
0
            if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
722
0
            {
723
0
                return ERROR_EOB_FLUSHBITS_T;
724
0
            }
725
0
        }
726
        /* Next macroblock information */
727
2.21M
        i2_cur_mb_addr++;
728
2.21M
        u1_num_mbs++;
729
2.21M
        u1_num_mbsNby2++;
730
2.21M
        ps_parse_mb_data++;
731
732
        /****************************************************************/
733
        /* Check for End Of Row and other flags that determine when to  */
734
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
735
        /* N-Mb                                                         */
736
        /****************************************************************/
737
2.21M
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
738
2.21M
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
739
2.21M
        u1_slice_end = !uc_more_data_flag;
740
2.21M
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
741
2.21M
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
742
2.21M
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
743
744
2.21M
        if(u1_decode_nmb)
745
200k
        {
746
200k
            ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
747
200k
            u1_num_mbsNby2 = 0;
748
200k
            {
749
200k
                ps_parse_mb_data = ps_dec->ps_parse_mb_data;
750
200k
                ps_dec->ps_part = ps_dec->ps_parse_part_params;
751
200k
            }
752
200k
            if(ret != OK) return ret;
753
200k
        }
754
755
2.21M
        if(u1_decode_nmb)
756
200k
        {
757
200k
            if(ps_dec->u1_separate_parse)
758
18.5k
            {
759
18.5k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
760
18.5k
                                     u1_end_of_row);
761
18.5k
                ps_dec->ps_nmb_info += u1_num_mbs;
762
18.5k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
763
18.5k
            }
764
182k
            else
765
182k
            {
766
182k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
767
86.1k
                {
768
86.1k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
769
86.1k
                                                u1_tfr_n_mb, u1_end_of_row);
770
86.1k
                }
771
96.1k
                else
772
96.1k
                {
773
96.1k
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
774
96.1k
                                                        u1_num_mbs_next, u1_tfr_n_mb,
775
96.1k
                                                        u1_end_of_row);
776
96.1k
                }
777
182k
            }
778
200k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
779
200k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
780
200k
            u1_mb_idx = u1_num_mbs;
781
200k
            ps_dec->u4_mb_idx = u1_num_mbs;
782
200k
        }
783
2.21M
    }
784
785
13.0k
    ps_dec->u4_num_mbs_cur_nmb = 0;
786
13.0k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
787
788
13.0k
    return ret;
789
19.2k
}
790
791
/*****************************************************************************/
792
/*                                                                           */
793
/*  Function Name : isvcd_parse_inter_slice_data_cavlc                       */
794
/*                                                                           */
795
/*  Description   : This function parses cavlc syntax of a inter slice on    */
796
/*                  N MB basis.                                              */
797
/*                                                                           */
798
/*  Inputs        : ps_dec                                                   */
799
/*                  sliceparams                                              */
800
/*                  firstMbInSlice                                           */
801
/*                                                                           */
802
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
803
/*                     decoded till the end of slice.                        */
804
/*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
805
/*                                                                           */
806
/*  Returns       : 0                                                        */
807
/*                                                                           */
808
/*  Issues        : <List any issues or problems with this function>         */
809
/*                                                                           */
810
/*  Revision History:                                                        */
811
/*                                                                           */
812
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
813
/*         13 07 2002   Jay             Draft                                */
814
/*                                                                           */
815
/*****************************************************************************/
816
817
WORD32 isvcd_parse_inter_slice_data_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
818
                                          dec_slice_params_t *ps_slice,
819
                                          UWORD16 u2_first_mb_in_slice)
820
82.0k
{
821
82.0k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
822
82.0k
    UWORD32 uc_more_data_flag;
823
82.0k
    WORD32 i2_cur_mb_addr;
824
82.0k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
825
82.0k
    UWORD32 i2_mb_skip_run;
826
82.0k
    UWORD32 u1_read_mb_type;
827
828
82.0k
    UWORD32 u1_mbaff;
829
82.0k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
830
82.0k
    const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
831
82.0k
    UWORD32 u1_slice_end = 0;
832
82.0k
    UWORD32 u1_tfr_n_mb = 0;
833
82.0k
    UWORD32 u1_decode_nmb = 0;
834
835
82.0k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
836
82.0k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
837
82.0k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
838
82.0k
    deblk_mb_t *ps_cur_deblk_mb;
839
82.0k
    dec_mb_info_t *ps_cur_mb_info;
840
82.0k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
841
82.0k
    UWORD32 u1_inter_mb_type;
842
82.0k
    UWORD32 u1_deblk_mb_type;
843
82.0k
    UWORD32 u1_mb_threshold;
844
82.0k
    WORD32 ret = OK;
845
846
    /******************************************************/
847
    /* Initialisations specific to B or P slice           */
848
    /******************************************************/
849
82.0k
    if(ps_slice->u1_slice_type == P_SLICE)
850
64.7k
    {
851
64.7k
        u1_inter_mb_type = P_MB;
852
64.7k
        u1_deblk_mb_type = D_INTER_MB;
853
64.7k
        u1_mb_threshold = 5;
854
64.7k
    }
855
17.2k
    else  // B_SLICE
856
17.2k
    {
857
17.2k
        u1_inter_mb_type = B_MB;
858
17.2k
        u1_deblk_mb_type = D_B_SLICE;
859
17.2k
        u1_mb_threshold = 23;
860
17.2k
    }
861
862
    /******************************************************/
863
    /* Slice Level Initialisations                        */
864
    /******************************************************/
865
82.0k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
866
82.0k
    ih264d_update_qp(ps_dec, 0);
867
82.0k
    u1_mb_idx = ps_dec->u4_mb_idx;
868
82.0k
    u1_num_mbs = u1_mb_idx;
869
870
82.0k
    u1_num_mbsNby2 = 0;
871
82.0k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
872
82.0k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
873
82.0k
    i2_mb_skip_run = 0;
874
82.0k
    uc_more_data_flag = 1;
875
82.0k
    u1_read_mb_type = 0;
876
877
1.31M
    while(!u1_slice_end)
878
1.27M
    {
879
1.27M
        UWORD8 u1_mb_type;
880
881
1.27M
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
882
1.27M
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
883
25.9k
        {
884
25.9k
            break;
885
25.9k
        }
886
887
1.25M
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
888
1.25M
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
889
1.25M
        ps_cur_mb_info->u1_Mux = 0;
890
1.25M
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
891
1.25M
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
892
893
1.25M
        ps_cur_mb_info->u1_end_of_slice = 0;
894
895
        /* Storing Default partition info */
896
1.25M
        ps_parse_mb_data->u1_num_part = 1;
897
1.25M
        ps_parse_mb_data->u4_isI_mb = 0;
898
899
1.25M
        if((!i2_mb_skip_run) && (!u1_read_mb_type))
900
284k
        {
901
            // Inlined ih264d_uev
902
284k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
903
284k
            UWORD32 u4_word, u4_ldz;
904
905
            /***************************************************************/
906
            /* Find leading zeros in next 32 bits                          */
907
            /***************************************************************/
908
284k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
909
910
284k
            u4_ldz = CLZ(u4_word);
911
912
            /* Flush the ps_bitstrm */
913
284k
            u4_bitstream_offset += (u4_ldz + 1);
914
            /* Read the suffix from the ps_bitstrm */
915
284k
            u4_word = 0;
916
284k
            if(u4_ldz)
917
98.1k
            {
918
98.1k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
919
98.1k
            }
920
284k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
921
284k
            i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1);
922
            // Inlined ih264d_uev
923
284k
            COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run);
924
284k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
925
284k
            u1_read_mb_type = uc_more_data_flag;
926
284k
        }
927
928
        /***************************************************************/
929
        /* Get the required information for decoding of MB            */
930
        /* mb_x, mb_y , neighbour availablity,                              */
931
        /***************************************************************/
932
1.25M
        ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
933
934
        /***************************************************************/
935
        /* Set the deblocking parameters for this MB */
936
        /***************************************************************/
937
1.25M
        if(ps_dec->u4_app_disable_deblk_frm == 0)
938
1.25M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
939
1.25M
                                             ps_dec->u1_mb_ngbr_availablity,
940
1.25M
                                             ps_dec->u1_cur_mb_fld_dec_flag);
941
942
1.25M
        if(i2_mb_skip_run)
943
999k
        {
944
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
945
999k
            ps_dec->i1_prev_mb_qp_delta = 0;
946
999k
            ps_dec->u1_sub_mb_num = 0;
947
999k
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
948
999k
            ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
949
999k
            ps_cur_mb_info->u1_cbp = 0;
950
951
999k
            {
952
                /* Storing Skip partition info */
953
999k
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
954
999k
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
955
999k
                ps_part_info->u1_sub_mb_num = 0;
956
999k
                ps_dec->ps_part++;
957
999k
            }
958
959
            /* Update Nnzs */
960
999k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
961
962
999k
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
963
999k
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
964
965
999k
            if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
966
417k
            {
967
417k
                ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
968
417k
            }
969
970
999k
            i2_mb_skip_run--;
971
999k
        }
972
252k
        else
973
252k
        {
974
252k
            u1_read_mb_type = 0;
975
            /**************************************************************/
976
            /* Macroblock Layer Begins, Decode the u1_mb_type                */
977
            /**************************************************************/
978
252k
            {
979
252k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
980
252k
                UWORD32 u4_word, u4_ldz, u4_temp;
981
982
                // Inlined ih264d_uev
983
                /***************************************************************/
984
                /* Find leading zeros in next 32 bits                          */
985
                /***************************************************************/
986
252k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
987
252k
                u4_ldz = CLZ(u4_word);
988
                /* Flush the ps_bitstrm */
989
252k
                u4_bitstream_offset += (u4_ldz + 1);
990
                /* Read the suffix from the ps_bitstrm */
991
252k
                u4_word = 0;
992
252k
                if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
993
252k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
994
252k
                u4_temp = ((1 << u4_ldz) + u4_word - 1);
995
                // Inlined ih264d_uev
996
252k
                if(u4_temp > (UWORD32) (25 + u1_mb_threshold)) return ERROR_MB_TYPE;
997
250k
                u1_mb_type = u4_temp;
998
250k
                COPYTHECONTEXT("u1_mb_type", u1_mb_type);
999
250k
            }
1000
0
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
1001
1002
            /**************************************************************/
1003
            /* Parse Macroblock data                                      */
1004
            /**************************************************************/
1005
250k
            if(u1_mb_type < u1_mb_threshold)
1006
209k
            {
1007
209k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1008
1009
209k
                ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, u1_num_mbsNby2);
1010
209k
                if(ret != OK) return ret;
1011
196k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1012
1013
196k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
1014
74.3k
                {
1015
74.3k
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1016
74.3k
                }
1017
196k
            }
1018
40.9k
            else
1019
40.9k
            {
1020
                /* Storing Intra partition info */
1021
40.9k
                ps_parse_mb_data->u1_num_part = 0;
1022
40.9k
                ps_parse_mb_data->u4_isI_mb = 1;
1023
1024
40.9k
                if((25 + u1_mb_threshold) == u1_mb_type)
1025
1.05k
                {
1026
                    /* I_PCM_MB */
1027
1.05k
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1028
1.05k
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1029
1.05k
                    if(ret != OK) return ret;
1030
1.05k
                    ps_dec->u1_qp = 0;
1031
1.05k
                }
1032
39.8k
                else
1033
39.8k
                {
1034
39.8k
                    ret = ih264d_parse_imb_cavlc(ps_dec, ps_cur_mb_info, u1_num_mbs,
1035
39.8k
                                                 (UWORD8) (u1_mb_type - u1_mb_threshold));
1036
39.8k
                    if(ret != OK) return ret;
1037
39.8k
                }
1038
1039
35.2k
                ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1040
35.2k
            }
1041
231k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1042
231k
        }
1043
1.23M
        ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1044
1045
1.23M
        if(ps_dec->u1_enable_mb_info)
1046
0
        {
1047
0
            ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1048
0
                                        ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1049
0
        }
1050
1.23M
        if(u1_mbaff)
1051
0
        {
1052
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1053
0
            if(!uc_more_data_flag && !i2_mb_skip_run && (0 == (i2_cur_mb_addr & 1)))
1054
0
            {
1055
0
                return ERROR_EOB_FLUSHBITS_T;
1056
0
            }
1057
0
        }
1058
1059
        /**************************************************************/
1060
        /* Get next Macroblock address                                */
1061
        /**************************************************************/
1062
1.23M
        i2_cur_mb_addr++;
1063
1064
1.23M
        u1_num_mbs++;
1065
1.23M
        u1_num_mbsNby2++;
1066
1.23M
        ps_parse_mb_data++;
1067
1068
        /****************************************************************/
1069
        /* Check for End Of Row and other flags that determine when to  */
1070
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1071
        /* N-Mb                                                         */
1072
        /****************************************************************/
1073
1.23M
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1074
1.23M
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1075
1.23M
        u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run));
1076
1.23M
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
1077
1.23M
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1078
1.23M
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1079
1080
1.23M
        if(u1_decode_nmb)
1081
262k
        {
1082
262k
            ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1083
262k
            u1_num_mbsNby2 = 0;
1084
262k
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1085
262k
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
1086
262k
            if(ret != OK) return ret;
1087
262k
        }
1088
1089
1.23M
        if(u1_decode_nmb)
1090
262k
        {
1091
262k
            if(ps_dec->u1_separate_parse)
1092
17.3k
            {
1093
17.3k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1094
17.3k
                                     u1_end_of_row);
1095
17.3k
                ps_dec->ps_nmb_info += u1_num_mbs;
1096
17.3k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1097
17.3k
            }
1098
245k
            else
1099
245k
            {
1100
245k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1101
55.4k
                {
1102
55.4k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
1103
55.4k
                                                u1_tfr_n_mb, u1_end_of_row);
1104
55.4k
                }
1105
189k
                else
1106
189k
                {
1107
189k
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1108
189k
                                                        u1_num_mbs_next, u1_tfr_n_mb,
1109
189k
                                                        u1_end_of_row);
1110
189k
                }
1111
245k
            }
1112
262k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1113
262k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1114
262k
            u1_mb_idx = u1_num_mbs;
1115
262k
            ps_dec->u4_mb_idx = u1_num_mbs;
1116
262k
        }
1117
1.23M
    }
1118
1119
60.6k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1120
60.6k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1121
1122
60.6k
    return ret;
1123
82.0k
}
1124
1125
/*****************************************************************************/
1126
/*                                                                           */
1127
/*  Function Name : isvcd_parse_inter_slice_data_cabac_enh_lyr               */
1128
/*                                                                           */
1129
/*  Description   : This function parses cabac syntax of a inter slice on    */
1130
/*                  N MB basis for svc ext                                   */
1131
/*                                                                           */
1132
/*  Inputs        : ps_dec                                                   */
1133
/*                  sliceparams                                              */
1134
/*                  firstMbInSlice                                           */
1135
/*                                                                           */
1136
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1137
/*                     decoded till the end of slice.                        */
1138
/*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
1139
/*                                                                           */
1140
/*  Returns       : 0                                                        */
1141
/*                                                                           */
1142
/*  Issues        : <List any issues or problems with this function>         */
1143
/*                                                                           */
1144
/*  Revision History:                                                        */
1145
/*                                                                           */
1146
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1147
/*         09 06 2021   Jay             Draft                                */
1148
/*                                                                           */
1149
/*****************************************************************************/
1150
WORD32
1151
isvcd_parse_inter_slice_data_cabac_enh_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1152
                                           dec_slice_params_t *ps_slice,
1153
                                           UWORD16 u2_first_mb_in_slice)
1154
5.63k
{
1155
5.63k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1156
5.63k
    UWORD32 uc_more_data_flag;
1157
5.63k
    WORD32 i2_cur_mb_addr;
1158
5.63k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
1159
5.63k
    UWORD32 u1_mbaff;
1160
5.63k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
1161
5.63k
    const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1162
5.63k
    UWORD32 u1_slice_end = 0;
1163
5.63k
    UWORD32 u1_tfr_n_mb = 0;
1164
5.63k
    UWORD32 u1_decode_nmb = 0;
1165
1166
5.63k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1167
5.63k
    deblk_mb_t *ps_cur_deblk_mb;
1168
5.63k
    dec_mb_info_t *ps_cur_mb_info;
1169
5.63k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1170
1171
5.63k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1172
5.63k
    UWORD32 u1_inter_mb_skip_type;
1173
5.63k
    UWORD32 u1_inter_mb_type;
1174
5.63k
    UWORD32 u1_deblk_mb_type;
1175
5.63k
    UWORD32 u1_mb_threshold;
1176
5.63k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1177
5.63k
    decoding_envirnoment_t *ps_cab_env = NULL;
1178
5.63k
    WORD32 ret = OK;
1179
1180
5.63k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1181
1182
    /******************************************************/
1183
    /* Initialisations specific to B or P slice           */
1184
    /******************************************************/
1185
5.63k
    if(ps_slice->u1_slice_type == P_SLICE)
1186
3.36k
    {
1187
3.36k
        u1_inter_mb_skip_type = CAB_P_SKIP;
1188
3.36k
        u1_inter_mb_type = P_MB;
1189
3.36k
        u1_deblk_mb_type = D_INTER_MB;
1190
3.36k
        u1_mb_threshold = 5;
1191
3.36k
    }
1192
2.26k
    else  // EB_SLICE
1193
2.26k
    {
1194
2.26k
        u1_inter_mb_skip_type = CAB_B_SKIP;
1195
2.26k
        u1_inter_mb_type = B_MB;
1196
2.26k
        u1_deblk_mb_type = D_B_SLICE;
1197
2.26k
        u1_mb_threshold = 23;
1198
2.26k
    }
1199
1200
    /******************************************************/
1201
    /* Slice Level Initialisations                        */
1202
    /******************************************************/
1203
5.63k
    i2_cur_mb_addr = u2_first_mb_in_slice;
1204
5.63k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1205
5.63k
    ih264d_update_qp(ps_dec, 0);
1206
5.63k
    u1_mb_idx = ps_dec->u4_mb_idx;
1207
5.63k
    u1_num_mbs = u1_mb_idx;
1208
5.63k
    u1_num_mbsNby2 = 0;
1209
5.63k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1210
5.63k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1211
5.63k
    uc_more_data_flag = 1;
1212
1213
    /* Initialisations specific to cabac */
1214
5.63k
    if(ps_bitstrm->u4_ofst & 0x07)
1215
5.39k
    {
1216
5.39k
        ps_bitstrm->u4_ofst += 8;
1217
5.39k
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
1218
5.39k
    }
1219
1220
5.63k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
1221
5.63k
    if(ret != OK) return ret;
1222
1223
5.47k
    ps_cab_env = &ps_dec->s_cab_dec_env;
1224
5.47k
    ps_dec->i1_prev_mb_qp_delta = 0;
1225
1226
119k
    while(!u1_slice_end)
1227
119k
    {
1228
119k
        UWORD8 u1_mb_type;
1229
119k
        UWORD32 u4_mb_skip;
1230
119k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1231
119k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1232
1.26k
        {
1233
1.26k
            break;
1234
1.26k
        }
1235
1236
118k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1237
118k
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1238
118k
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1239
118k
        ps_cur_mb_info->u1_Mux = 0;
1240
118k
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1241
118k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1242
118k
        ps_cur_mb_info->u1_end_of_slice = 0;
1243
1244
        /* Storing Default partition info */
1245
118k
        ps_parse_mb_data->u1_num_part = 1;
1246
118k
        ps_parse_mb_data->u4_isI_mb = 0;
1247
1248
        /***************************************************************/
1249
        /* Get the required information for decoding of MB             */
1250
        /* mb_x, mb_y , neighbour availablity,                         */
1251
        /***************************************************************/
1252
118k
        u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1);
1253
118k
        ps_svc_cur_mb_info->u1_crop_window_flag =
1254
118k
            *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1255
118k
              (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1256
        /*********************************************************************/
1257
        /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
1258
        /*********************************************************************/
1259
118k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
1260
118k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1261
1262
        /***************************************************************/
1263
        /* Set the deblocking parameters for this MB                   */
1264
        /***************************************************************/
1265
118k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
1266
118k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1267
118k
                                             ps_dec->u1_mb_ngbr_availablity,
1268
118k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
1269
1270
118k
        if(u4_mb_skip)
1271
36.0k
        {
1272
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1273
36.0k
            memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t));
1274
36.0k
            ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type;
1275
1276
36.0k
            MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
1277
1278
36.0k
            *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
1279
36.0k
            *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
1280
1281
36.0k
            ps_dec->i1_prev_mb_qp_delta = 0;
1282
36.0k
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
1283
36.0k
            ps_cur_mb_info->u1_cbp = 0;
1284
36.0k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1285
36.0k
            ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
1286
36.0k
            ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
1287
36.0k
            ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
1288
1289
36.0k
            {
1290
                /* Storing Skip partition info */
1291
36.0k
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
1292
36.0k
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1293
36.0k
                ps_part_info->u1_sub_mb_num = 0;
1294
36.0k
                ps_dec->ps_part++;
1295
36.0k
            }
1296
1297
            /* Update Nnzs */
1298
36.0k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC);
1299
36.0k
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1300
36.0k
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1301
36.0k
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1302
36.0k
            if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
1303
0
            {
1304
0
                ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1305
0
            }
1306
36.0k
        }
1307
81.9k
        else
1308
81.9k
        {
1309
            /* Variables for handling Cabac contexts */
1310
81.9k
            UWORD8 *pu1_cur_svc_base_mode_flag;
1311
81.9k
            UWORD8 u1_left_svc_base_mode_flag;
1312
81.9k
            UWORD8 u1_top_svc_base_mode_flag;
1313
1314
81.9k
            UWORD32 u4_a, u4_b, u4_ctxt_inc;
1315
81.9k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1316
            /* Macroblock Layer Begins */
1317
81.9k
            if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1318
81.5k
               ps_svc_slice_params->u1_adaptive_base_mode_flag)
1319
23.7k
            {
1320
23.7k
                pu1_cur_svc_base_mode_flag =
1321
23.7k
                    ps_svc_lyr_dec->pu1_svc_base_mode_flag + ps_cur_mb_info->u2_mbx;
1322
23.7k
                pu1_cur_svc_base_mode_flag +=
1323
23.7k
                    ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride;
1324
1325
23.7k
                u1_left_svc_base_mode_flag = 0;
1326
23.7k
                if(ps_dec->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
1327
17.8k
                    u1_left_svc_base_mode_flag = *(pu1_cur_svc_base_mode_flag - 1);
1328
1329
23.7k
                u1_top_svc_base_mode_flag = 0;
1330
23.7k
                if(ps_dec->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
1331
20.5k
                    u1_top_svc_base_mode_flag =
1332
20.5k
                        *(pu1_cur_svc_base_mode_flag -
1333
20.5k
                          ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride);
1334
1335
23.7k
                u4_a = 1;
1336
23.7k
                u4_b = 1;
1337
1338
23.7k
                if(u1_top_svc_base_mode_flag)
1339
5.86k
                {
1340
5.86k
                    u4_a = 0;
1341
5.86k
                }
1342
1343
23.7k
                if(u1_left_svc_base_mode_flag)
1344
5.01k
                {
1345
5.01k
                    u4_b = 0;
1346
5.01k
                }
1347
1348
23.7k
                u4_ctxt_inc = u4_a + u4_b;
1349
23.7k
                ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_decode_bin(
1350
23.7k
                    u4_ctxt_inc, ps_svc_lyr_dec->ps_base_mode_flag, ps_bitstrm, ps_cab_env);
1351
23.7k
                COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_svc_cur_mb_info->u1_base_mode_flag);
1352
23.7k
                *pu1_cur_svc_base_mode_flag = ps_svc_cur_mb_info->u1_base_mode_flag;
1353
23.7k
            }
1354
58.1k
            else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1355
57.7k
            {
1356
57.7k
                ps_svc_cur_mb_info->u1_base_mode_flag =
1357
57.7k
                    ps_svc_slice_params->u1_default_base_mode_flag;
1358
57.7k
            }
1359
1360
81.9k
            if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1361
58.1k
            {
1362
                /* Decode the u1_mb_type */
1363
58.1k
                u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec);
1364
58.1k
                ps_cur_mb_info->u1_mb_type = u1_mb_type;
1365
58.1k
                if(u1_mb_type > (25 + u1_mb_threshold)) return ERROR_MB_TYPE;
1366
58.1k
                COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1367
58.1k
            }
1368
23.7k
            else
1369
23.7k
            {
1370
                // default intialization for Base mode flag : reserved
1371
23.7k
                ps_dec->ps_part += MAX_NUM_MB_PART;
1372
1373
23.7k
                ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
1374
23.7k
                ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
1375
23.7k
                ps_cur_mb_info->u1_mb_type = MB_INFER;
1376
23.7k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1377
23.7k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
1378
0
                {
1379
0
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1380
0
                }
1381
1382
                /*SVC EXT needs to update incropwindow*/
1383
23.7k
                if(ps_svc_slice_params->u1_adaptive_residual_prediction_flag &&
1384
16.7k
                   ps_svc_cur_mb_info->u1_crop_window_flag)
1385
16.7k
                {
1386
16.7k
                    ps_svc_cur_mb_info->u1_residual_prediction_flag = ih264d_decode_bin(
1387
16.7k
                        0, ps_svc_lyr_dec->ps_residual_prediction_flag, ps_bitstrm, ps_cab_env);
1388
16.7k
                    COPYTHECONTEXT("SVC ext: u1_residual_prediction_flag",
1389
16.7k
                                   ps_svc_cur_mb_info->u1_residual_prediction_flag);
1390
16.7k
                }
1391
7.00k
                else
1392
7.00k
                {
1393
                    /*residual flag inference code */
1394
7.00k
                    if(1 == ps_svc_cur_mb_info->u1_crop_window_flag)
1395
7.00k
                    {
1396
7.00k
                        ps_svc_cur_mb_info->u1_residual_prediction_flag =
1397
7.00k
                            ps_svc_slice_params->u1_default_residual_prediction_flag;
1398
7.00k
                    }
1399
0
                    else
1400
0
                    {
1401
0
                        ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
1402
0
                    }
1403
7.00k
                }
1404
23.7k
            }
1405
1406
            /* Parse Macroblock Data */
1407
81.9k
            u1_mb_type = ps_cur_mb_info->u1_mb_type;
1408
81.9k
            if(u1_mb_type < u1_mb_threshold)
1409
51.7k
            {
1410
51.7k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1411
51.7k
                *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6;
1412
1413
51.7k
                ret = ps_svc_lyr_dec->pf_parse_inter_mb_svc_ext(
1414
51.7k
                    ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, u1_num_mbs, u1_num_mbsNby2);
1415
51.7k
                if(ret != OK) return ret;
1416
49.3k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1417
49.3k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1418
49.3k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
1419
0
                {
1420
0
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1421
0
                }
1422
49.3k
            }
1423
30.2k
            else
1424
30.2k
            {
1425
                /* Storing Intra partition info */
1426
30.2k
                ps_parse_mb_data->u1_num_part = 0;
1427
30.2k
                ps_parse_mb_data->u4_isI_mb = 1;
1428
1429
30.2k
                if((25 + u1_mb_threshold) == u1_mb_type)
1430
43
                {
1431
                    /* I_PCM_MB */
1432
43
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1433
43
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1434
43
                    if(ret != OK) return ret;
1435
21
                    ps_cur_deblk_mb->u1_mb_qp = 0;
1436
21
                    ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1437
21
                }
1438
30.2k
                else
1439
30.2k
                {
1440
30.2k
                    if(u1_mb_type == u1_mb_threshold)
1441
3.09k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
1442
27.1k
                    else
1443
27.1k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
1444
1445
30.2k
                    ret = isvcd_parse_imb_cabac(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1446
30.2k
                                                (UWORD8) (u1_mb_type - u1_mb_threshold));
1447
30.2k
                    if(ret != OK) return ret;
1448
28.9k
                    ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1449
28.9k
                    if(0 == ps_svc_cur_mb_info->u1_base_mode_flag)
1450
6.29k
                    {
1451
6.29k
                        ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1452
6.29k
                    }
1453
28.9k
                }
1454
28.9k
                ps_parse_mb_data->u4_isI_mb = !ps_svc_cur_mb_info->u1_base_mode_flag;
1455
28.9k
            }
1456
81.9k
        }
1457
1458
114k
        if(ps_dec->u1_enable_mb_info)
1459
0
        {
1460
0
            ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1461
0
                                        ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1462
0
        }
1463
114k
        if(u1_mbaff)
1464
0
        {
1465
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1466
0
        }
1467
1468
114k
        if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1469
0
            uc_more_data_flag = 1;
1470
114k
        else
1471
114k
        {
1472
114k
            uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
1473
114k
            uc_more_data_flag = !uc_more_data_flag;
1474
114k
            COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
1475
114k
        }
1476
1477
114k
        if(u1_mbaff)
1478
0
        {
1479
0
            if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1480
0
            {
1481
0
                return ERROR_EOB_FLUSHBITS_T;
1482
0
            }
1483
0
        }
1484
        /* Next macroblock information */
1485
114k
        i2_cur_mb_addr++;
1486
114k
        u1_num_mbs++;
1487
114k
        u1_num_mbsNby2++;
1488
114k
        ps_parse_mb_data++;
1489
1490
        /****************************************************************/
1491
        /* Check for End Of Row and other flags that determine when to  */
1492
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1493
        /* N-Mb                                                         */
1494
        /****************************************************************/
1495
114k
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1496
114k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1497
114k
        u1_slice_end = !uc_more_data_flag;
1498
114k
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
1499
114k
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1500
114k
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1501
1502
114k
        if(u1_decode_nmb)
1503
27.5k
        {
1504
27.5k
            ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1505
27.5k
            u1_num_mbsNby2 = 0;
1506
27.5k
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1507
27.5k
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
1508
27.5k
            if(ret != OK) return ret;
1509
27.5k
        }
1510
1511
114k
        if(u1_decode_nmb)
1512
27.4k
        {
1513
27.4k
            if(ps_dec->u1_separate_parse)
1514
20.0k
            {
1515
20.0k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1516
20.0k
                                     u1_end_of_row);
1517
20.0k
                ps_dec->ps_nmb_info += u1_num_mbs;
1518
20.0k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1519
20.0k
            }
1520
7.45k
            else
1521
7.45k
            {
1522
7.45k
                ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1523
7.45k
                                                              u1_num_mbs_next, u1_tfr_n_mb,
1524
7.45k
                                                              u1_end_of_row);
1525
7.45k
                if(ret != OK) return ret;
1526
7.45k
            }
1527
27.4k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1528
27.4k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1529
27.4k
            u1_mb_idx = u1_num_mbs;
1530
27.4k
            ps_dec->u4_mb_idx = u1_num_mbs;
1531
27.4k
        }
1532
114k
    }
1533
1534
1.76k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1535
1.76k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1536
1537
1.76k
    return ret;
1538
5.47k
}
1539
1540
/*****************************************************************************/
1541
/*                                                                           */
1542
/*  Function Name : isvcd_parse_inter_slice_data_cavlc_enh_lyr               */
1543
/*                                                                           */
1544
/*  Description   : This function parses cavlc syntax of a inter slice on    */
1545
/*                  N MB basis.                                              */
1546
/*                                                                           */
1547
/*  Inputs        : ps_dec                                                   */
1548
/*                  sliceparams                                              */
1549
/*                  firstMbInSlice                                           */
1550
/*                                                                           */
1551
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1552
/*                     decoded till the end of slice.                        */
1553
/*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
1554
/*                                                                           */
1555
/*  Returns       : 0                                                        */
1556
/*                                                                           */
1557
/*  Issues        : <List any issues or problems with this function>         */
1558
/*                                                                           */
1559
/*  Revision History:                                                        */
1560
/*                                                                           */
1561
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1562
/*         09 06 2021   Kishore             Draft                            */
1563
/*                                                                           */
1564
/*****************************************************************************/
1565
1566
WORD32 isvcd_parse_inter_slice_data_cavlc_enh_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1567
                                                  dec_slice_params_t *ps_slice,
1568
                                                  UWORD16 u2_first_mb_in_slice)
1569
18.5k
{
1570
18.5k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1571
18.5k
    UWORD32 uc_more_data_flag;
1572
18.5k
    WORD32 i2_cur_mb_addr;
1573
18.5k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
1574
18.5k
    UWORD32 i2_mb_skip_run;
1575
18.5k
    UWORD32 u1_read_mb_type;
1576
1577
18.5k
    UWORD32 u1_mbaff;
1578
18.5k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
1579
18.5k
    const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1580
18.5k
    UWORD32 u1_slice_end = 0;
1581
18.5k
    UWORD32 u1_tfr_n_mb = 0;
1582
18.5k
    UWORD32 u1_decode_nmb = 0;
1583
1584
18.5k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1585
18.5k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1586
18.5k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1587
1588
18.5k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1589
1590
18.5k
    deblk_mb_t *ps_cur_deblk_mb;
1591
18.5k
    dec_mb_info_t *ps_cur_mb_info;
1592
18.5k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1593
1594
18.5k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1595
18.5k
    UWORD32 u1_inter_mb_type;
1596
18.5k
    UWORD32 u1_deblk_mb_type;
1597
18.5k
    UWORD32 u1_mb_threshold;
1598
18.5k
    WORD32 ret = OK;
1599
1600
18.5k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1601
1602
    /******************************************************/
1603
    /* Initialisations specific to EB or EP slice           */
1604
    /******************************************************/
1605
1606
18.5k
    if(ps_slice->u1_slice_type == P_SLICE)
1607
10.8k
    {
1608
10.8k
        u1_inter_mb_type = P_MB;
1609
10.8k
        u1_deblk_mb_type = D_INTER_MB;
1610
10.8k
        u1_mb_threshold = 5;
1611
10.8k
    }
1612
7.72k
    else
1613
7.72k
    {
1614
7.72k
        u1_inter_mb_type = B_MB;
1615
7.72k
        u1_deblk_mb_type = D_B_SLICE;
1616
7.72k
        u1_mb_threshold = 23;
1617
7.72k
    }
1618
1619
    /******************************************************/
1620
    /* Slice Level Initialisations                        */
1621
    /******************************************************/
1622
18.5k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1623
18.5k
    ih264d_update_qp(ps_dec, 0);
1624
18.5k
    u1_mb_idx = ps_dec->u4_mb_idx;
1625
18.5k
    u1_num_mbs = u1_mb_idx;
1626
18.5k
    u1_num_mbsNby2 = 0;
1627
18.5k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1628
18.5k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1629
18.5k
    i2_mb_skip_run = 0;
1630
18.5k
    uc_more_data_flag = 1;
1631
18.5k
    u1_read_mb_type = 0;
1632
1633
376k
    while(!u1_slice_end)
1634
372k
    {
1635
372k
        UWORD8 u1_mb_type;
1636
1637
372k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1638
1639
372k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1640
6.08k
        {
1641
6.08k
            break;
1642
6.08k
        }
1643
1644
366k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1645
366k
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1646
366k
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1647
1648
366k
        ps_cur_mb_info->u1_Mux = 0;
1649
366k
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1650
366k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1651
1652
366k
        ps_cur_mb_info->u1_end_of_slice = 0;
1653
1654
        /* Storing Default partition info */
1655
366k
        ps_parse_mb_data->u1_num_part = 1;
1656
366k
        ps_parse_mb_data->u4_isI_mb = 0;
1657
1658
366k
        if((!i2_mb_skip_run) && (!u1_read_mb_type))
1659
242k
        {
1660
242k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1661
242k
            UWORD32 u4_word, u4_ldz;
1662
1663
            /***************************************************************/
1664
            /* Find leading zeros in next 32 bits                          */
1665
            /***************************************************************/
1666
242k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1667
1668
242k
            u4_ldz = CLZ(u4_word);
1669
1670
            /* Flush the ps_bitstrm */
1671
242k
            u4_bitstream_offset += (u4_ldz + 1);
1672
            /* Read the suffix from the ps_bitstrm */
1673
242k
            u4_word = 0;
1674
242k
            if(u4_ldz)
1675
32.3k
            {
1676
32.3k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1677
32.3k
            }
1678
242k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
1679
242k
            i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1);
1680
1681
242k
            COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run);
1682
242k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1683
242k
            u1_read_mb_type = uc_more_data_flag;
1684
242k
        }
1685
1686
        /***************************************************************/
1687
        /* Get the required information for decoding of MB             */
1688
        /* mb_x, mb_y , neighbour availablity,                         */
1689
        /***************************************************************/
1690
366k
        ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1691
366k
        ps_svc_cur_mb_info->u1_crop_window_flag =
1692
366k
            *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1693
366k
              (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1694
        /***************************************************************/
1695
        /* Set the deblocking parameters for this MB                   */
1696
        /***************************************************************/
1697
366k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
1698
366k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1699
366k
                                             ps_dec->u1_mb_ngbr_availablity,
1700
366k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
1701
1702
366k
        if(i2_mb_skip_run)
1703
128k
        {
1704
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1705
128k
            ps_dec->i1_prev_mb_qp_delta = 0;
1706
128k
            ps_dec->u1_sub_mb_num = 0;
1707
128k
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
1708
128k
            ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
1709
128k
            ps_cur_mb_info->u1_cbp = 0;
1710
128k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1711
128k
            ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
1712
128k
            ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
1713
128k
            ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
1714
1715
128k
            {
1716
                /* Storing Skip partition info */
1717
128k
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
1718
128k
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1719
128k
                ps_part_info->u1_sub_mb_num = 0;
1720
128k
                ps_dec->ps_part++;
1721
128k
            }
1722
1723
            /* Update Nnzs */
1724
128k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
1725
1726
128k
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1727
128k
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1728
1729
128k
            if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
1730
0
            {
1731
0
                ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1732
0
            }
1733
128k
            i2_mb_skip_run--;
1734
128k
        }
1735
237k
        else
1736
237k
        {
1737
237k
            UWORD32 u4_word, u4_ldz, u4_temp;
1738
1739
237k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1740
237k
            if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1741
235k
               ps_svc_slice_params->u1_adaptive_base_mode_flag)
1742
134k
            {
1743
134k
                ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1744
134k
                COPYTHECONTEXT("SVC :u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1745
134k
            }
1746
103k
            else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1747
101k
            {
1748
101k
                ps_svc_cur_mb_info->u1_base_mode_flag =
1749
101k
                    ps_svc_slice_params->u1_default_base_mode_flag;
1750
101k
            }
1751
1752
237k
            if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1753
64.1k
            {
1754
64.1k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1755
1756
64.1k
                u1_read_mb_type = 0;
1757
                /**************************************************************/
1758
                /* Macroblock Layer Begins, Decode the u1_mb_type              */
1759
                /**************************************************************/
1760
64.1k
                {
1761
                    /***************************************************************/
1762
                    /* Find leading zeros in next 32 bits                          */
1763
                    /***************************************************************/
1764
64.1k
                    NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1765
64.1k
                    u4_ldz = CLZ(u4_word);
1766
                    /* Flush the ps_bitstrm */
1767
64.1k
                    u4_bitstream_offset += (u4_ldz + 1);
1768
                    /* Read the suffix from the ps_bitstrm */
1769
64.1k
                    u4_word = 0;
1770
64.1k
                    if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1771
64.1k
                    *pu4_bitstrm_ofst = u4_bitstream_offset;
1772
64.1k
                    u4_temp = ((1 << u4_ldz) + u4_word - 1);
1773
1774
64.1k
                    if(u4_temp > (UWORD32) (25 + u1_mb_threshold)) return ERROR_MB_TYPE;
1775
63.6k
                    u1_mb_type = u4_temp;
1776
63.6k
                    COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1777
63.6k
                }
1778
0
                ps_cur_mb_info->u1_mb_type = u1_mb_type;
1779
63.6k
            }
1780
173k
            else
1781
173k
            {
1782
                /* default intialization for Base mode flag : reserved */
1783
173k
                ps_dec->ps_part += MAX_NUM_MB_PART;
1784
173k
                u1_read_mb_type = 0;
1785
173k
                ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
1786
173k
                ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
1787
173k
                ps_cur_mb_info->u1_mb_type = MB_INFER;
1788
173k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1789
173k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
1790
0
                {
1791
0
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1792
0
                }
1793
1794
                /*SVC EXT needs to update incropwindow*/
1795
173k
                if(ps_svc_slice_params->u1_adaptive_residual_prediction_flag &&
1796
40.5k
                   ps_svc_cur_mb_info->u1_crop_window_flag)
1797
40.5k
                {
1798
40.5k
                    ps_svc_cur_mb_info->u1_residual_prediction_flag =
1799
40.5k
                        ih264d_get_bit_h264(ps_bitstrm);
1800
40.5k
                    COPYTHECONTEXT("SVC ext: u1_residual_prediction_flag",
1801
40.5k
                                   ps_cur_mb_info->u1_residual_prediction_flag);
1802
40.5k
                }
1803
132k
                else
1804
132k
                {
1805
                    /*residual flag inference code */
1806
132k
                    if(1 == ps_svc_cur_mb_info->u1_crop_window_flag)
1807
132k
                    {
1808
132k
                        ps_svc_cur_mb_info->u1_residual_prediction_flag =
1809
132k
                            ps_svc_slice_params->u1_default_residual_prediction_flag;
1810
132k
                    }
1811
0
                    else
1812
0
                    {
1813
0
                        ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
1814
0
                    }
1815
132k
                }
1816
173k
            }
1817
1818
            /**************************************************************/
1819
            /* Parse Macroblock data                                      */
1820
            /**************************************************************/
1821
237k
            u1_mb_type = ps_cur_mb_info->u1_mb_type;
1822
237k
            if(u1_mb_type < u1_mb_threshold)
1823
61.5k
            {
1824
61.5k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1825
1826
61.5k
                ret = ps_svc_lyr_dec->pf_parse_inter_mb_svc_ext(
1827
61.5k
                    ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, u1_num_mbs, u1_num_mbsNby2);
1828
61.5k
                if(ret != OK) return ret;
1829
57.3k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1830
1831
57.3k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
1832
0
                {
1833
0
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1834
0
                }
1835
57.3k
            }
1836
175k
            else
1837
175k
            {
1838
                /* Storing Intra partition info */
1839
175k
                ps_parse_mb_data->u1_num_part = 0;
1840
1841
175k
                if((25 + u1_mb_threshold) == u1_mb_type)
1842
75
                {
1843
                    /* I_PCM_MB */
1844
75
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1845
75
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1846
75
                    if(ret != OK) return ret;
1847
75
                    ps_dec->u1_qp = 0;
1848
75
                    ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1849
75
                }
1850
175k
                else
1851
175k
                {
1852
175k
                    ret =
1853
175k
                        isvcd_parse_imb_cavlc(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1854
175k
                                              u1_num_mbs, (UWORD8) (u1_mb_type - u1_mb_threshold));
1855
175k
                    if(ret != OK) return ret;
1856
1857
172k
                    if(0 == ps_svc_cur_mb_info->u1_base_mode_flag)
1858
1.04k
                    {
1859
1.04k
                        ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1860
1.04k
                    }
1861
172k
                }
1862
172k
                ps_parse_mb_data->u4_isI_mb = !ps_svc_cur_mb_info->u1_base_mode_flag;
1863
172k
            }
1864
229k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1865
229k
        }
1866
358k
        ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1867
1868
358k
        if(ps_dec->u1_enable_mb_info)
1869
0
        {
1870
0
            ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1871
0
                                        ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1872
0
        }
1873
358k
        if(u1_mbaff)
1874
0
        {
1875
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1876
0
            if(!uc_more_data_flag && !i2_mb_skip_run && (0 == (i2_cur_mb_addr & 1)))
1877
0
            {
1878
0
                return ERROR_EOB_FLUSHBITS_T;
1879
0
            }
1880
0
        }
1881
        /**************************************************************/
1882
        /* Get next Macroblock address                                */
1883
        /**************************************************************/
1884
358k
        i2_cur_mb_addr++;
1885
358k
        u1_num_mbs++;
1886
358k
        u1_num_mbsNby2++;
1887
358k
        ps_parse_mb_data++;
1888
1889
        /****************************************************************/
1890
        /* Check for End Of Row and other flags that determine when to  */
1891
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1892
        /* N-Mb                                                         */
1893
        /****************************************************************/
1894
358k
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1895
358k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1896
358k
        u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run));
1897
358k
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
1898
358k
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1899
358k
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1900
1901
358k
        if(u1_decode_nmb)
1902
110k
        {
1903
110k
            ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1904
110k
            u1_num_mbsNby2 = 0;
1905
110k
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1906
110k
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
1907
110k
            if(ret != OK) return ret;
1908
110k
        }
1909
1910
358k
        if(u1_decode_nmb)
1911
110k
        {
1912
110k
            if(ps_dec->u1_separate_parse)
1913
70.8k
            {
1914
70.8k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1915
70.8k
                                     u1_end_of_row);
1916
70.8k
                ps_dec->ps_nmb_info += u1_num_mbs;
1917
70.8k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1918
70.8k
            }
1919
39.4k
            else
1920
39.4k
            {
1921
39.4k
                ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1922
39.4k
                                                              u1_num_mbs_next, u1_tfr_n_mb,
1923
39.4k
                                                              u1_end_of_row);
1924
39.4k
                if(ret != OK) return ret;
1925
39.4k
            }
1926
110k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1927
110k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1928
110k
            u1_mb_idx = u1_num_mbs;
1929
110k
            ps_dec->u4_mb_idx = u1_num_mbs;
1930
110k
        }
1931
358k
    }
1932
1933
10.4k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1934
10.4k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1935
1936
10.4k
    return ret;
1937
18.5k
}
1938
1939
/*!
1940
**************************************************************************
1941
* \if Function name : ih264d_parse_pmb_cabac_svc \endif
1942
*
1943
* \brief
1944
*    This function parses CABAC syntax of a P MB.
1945
*
1946
* \return
1947
*    0 on Success and Error code otherwise
1948
**************************************************************************
1949
*/
1950
WORD32 isvcd_parse_pmb_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
1951
                             dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD32 u4_mb_num,
1952
                             UWORD32 u4_num_mbsNby2)
1953
34.2k
{
1954
34.2k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1955
34.2k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1956
1957
34.2k
    UWORD32 u1_num_mb_part;
1958
34.2k
    UWORD32 uc_sub_mb;
1959
34.2k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data + u4_num_mbsNby2;
1960
34.2k
    WORD8 *pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
1961
34.2k
    const UWORD8 *pu1_num_mb_part = (const UWORD8 *) gau1_ih264d_num_mb_part;
1962
34.2k
    const UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
1963
34.2k
    UWORD8 *pu1_col_info = ps_parse_mb_data->u1_col_info;
1964
34.2k
    UWORD32 u1_mb_mc_mode = u1_mb_type;
1965
34.2k
    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1966
34.2k
    decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
1967
34.2k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1968
34.2k
    UWORD32 u4_sub_mb_pack = 0;
1969
34.2k
    WORD32 ret;
1970
1971
34.2k
    UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
1972
34.2k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1973
1974
34.2k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
1975
34.2k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1976
34.2k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
1977
34.2k
    p_curr_ctxt->u1_mb_type = CAB_P;
1978
34.2k
    ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
1979
34.2k
    uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
1980
1981
    /* Reading the subMB type */
1982
34.2k
    if(uc_sub_mb)
1983
6.75k
    {
1984
6.75k
        UWORD8 u1_colz = (PRED_8x8 << 6);
1985
6.75k
        u1_mb_mc_mode = 0;
1986
6.75k
        {
1987
6.75k
            UWORD8 u1_sub_mb_mode;
1988
6.75k
            u1_sub_mb_mode =
1989
6.75k
                ih264d_parse_submb_type_cabac(0, ps_cab_env, ps_bitstrm, ps_dec->p_sub_mb_type_t);
1990
6.75k
            if(u1_sub_mb_mode > 3) return ERROR_SUB_MB_TYPE;
1991
1992
6.75k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
1993
            /* Storing collocated information */
1994
6.75k
            *pu1_col_info++ = u1_colz | ((UWORD8) (u1_sub_mb_mode << 4));
1995
6.75k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
1996
            /* check if Motion compensation is done below 8x8 */
1997
6.75k
            if(u1_sub_mb_mode != P_L0_8x8)
1998
5.00k
            {
1999
5.00k
                u1_no_submb_part_size_lt8x8_flag = 0;
2000
5.00k
            }
2001
6.75k
        }
2002
0
        {
2003
6.75k
            UWORD8 u1_sub_mb_mode;
2004
6.75k
            u1_sub_mb_mode =
2005
6.75k
                ih264d_parse_submb_type_cabac(0, ps_cab_env, ps_bitstrm, ps_dec->p_sub_mb_type_t);
2006
6.75k
            if(u1_sub_mb_mode > 3) return ERROR_SUB_MB_TYPE;
2007
2008
6.75k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
2009
            /* Storing collocated information */
2010
6.75k
            *pu1_col_info++ = u1_colz | ((UWORD8) (u1_sub_mb_mode << 4));
2011
6.75k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
2012
            /* check if Motion compensation is done below 8x8 */
2013
6.75k
            if(u1_sub_mb_mode != P_L0_8x8)
2014
4.00k
            {
2015
4.00k
                u1_no_submb_part_size_lt8x8_flag = 0;
2016
4.00k
            }
2017
6.75k
        }
2018
0
        {
2019
6.75k
            UWORD8 u1_sub_mb_mode;
2020
6.75k
            u1_sub_mb_mode =
2021
6.75k
                ih264d_parse_submb_type_cabac(0, ps_cab_env, ps_bitstrm, ps_dec->p_sub_mb_type_t);
2022
6.75k
            if(u1_sub_mb_mode > 3) return ERROR_SUB_MB_TYPE;
2023
2024
6.75k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
2025
            /* Storing collocated information */
2026
6.75k
            *pu1_col_info++ = u1_colz | ((UWORD8) (u1_sub_mb_mode << 4));
2027
6.75k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
2028
            /* check if Motion compensation is done below 8x8 */
2029
6.75k
            if(u1_sub_mb_mode != P_L0_8x8)
2030
4.46k
            {
2031
4.46k
                u1_no_submb_part_size_lt8x8_flag = 0;
2032
4.46k
            }
2033
6.75k
        }
2034
0
        {
2035
6.75k
            UWORD8 u1_sub_mb_mode;
2036
6.75k
            u1_sub_mb_mode =
2037
6.75k
                ih264d_parse_submb_type_cabac(0, ps_cab_env, ps_bitstrm, ps_dec->p_sub_mb_type_t);
2038
6.75k
            if(u1_sub_mb_mode > 3) return ERROR_SUB_MB_TYPE;
2039
2040
6.75k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
2041
            /* Storing collocated information */
2042
6.75k
            *pu1_col_info++ = u1_colz | ((UWORD8) (u1_sub_mb_mode << 4));
2043
6.75k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
2044
            /* check if Motion compensation is done below 8x8 */
2045
6.75k
            if(u1_sub_mb_mode != P_L0_8x8)
2046
3.92k
            {
2047
3.92k
                u1_no_submb_part_size_lt8x8_flag = 0;
2048
3.92k
            }
2049
6.75k
        }
2050
0
        u1_num_mb_part = 4;
2051
6.75k
    }
2052
27.4k
    else
2053
27.4k
    {
2054
27.4k
        u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
2055
        /* Storing collocated Mb and SubMb mode information */
2056
27.4k
        *pu1_col_info++ = (u1_mb_type << 6);
2057
27.4k
        if(u1_mb_type) *pu1_col_info++ = (u1_mb_type << 6);
2058
27.4k
    }
2059
2060
    /*Adding code to get Motion Prediction Flags*/
2061
34.2k
    {
2062
34.2k
        UWORD8 uc_i;
2063
34.2k
        UWORD8 *pu1_motion_pred_flag_l0;
2064
34.2k
        UWORD8 u1_mvp_flag;
2065
34.2k
        WORD8 *pi1_top_ref_idx_ctx_inc_arr = p_curr_ctxt->i1_ref_idx;
2066
34.2k
        WORD8 *pi1_left_ref_idx_ctxt_inc = ps_dec->pi1_left_ref_idx_ctxt_inc;
2067
34.2k
        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
2068
34.2k
        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
2069
34.2k
        UWORD8 uc_num_ref_idx_l0_active_minus1 =
2070
34.2k
            (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] << (u1_mbaff & uc_field)) - 1;
2071
34.2k
        pu1_motion_pred_flag_l0 = &ps_svc_cur_mb_info->au1_motion_pred_flag[0];
2072
34.2k
        *pu1_motion_pred_flag_l0 = 0;
2073
2074
34.2k
        if(ps_svc_cur_mb_info->u1_crop_window_flag &&
2075
33.9k
           ps_svc_slice_params->u1_adaptive_motion_prediction_flag)
2076
18.7k
        {
2077
61.8k
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
2078
43.1k
            {
2079
                /*usage of bins and ctxt check*/
2080
43.1k
                u1_mvp_flag = ih264d_decode_bin(0, ps_svc_lyr_dec->ps_motion_prediction_flag_l0,
2081
43.1k
                                                ps_bitstrm, ps_cab_env);
2082
43.1k
                COPYTHECONTEXT("SVC ext: ps_motion_prediction_flag_l0", u1_mvp_flag);
2083
2084
43.1k
                *pu1_motion_pred_flag_l0 |= (u1_mvp_flag << uc_i);
2085
43.1k
                if(u1_mvp_flag)
2086
14.7k
                {
2087
14.7k
                    pi1_ref_idx[uc_i] = -1;
2088
14.7k
                }
2089
43.1k
            }
2090
18.7k
        }
2091
15.5k
        else if(ps_svc_cur_mb_info->u1_crop_window_flag)
2092
15.2k
        {
2093
15.2k
            *pu1_motion_pred_flag_l0 = ps_svc_slice_params->u1_default_motion_prediction_flag
2094
15.2k
                                           ? ((1 << u1_num_mb_part) - 1)
2095
15.2k
                                           : 0;
2096
15.2k
            if(ps_svc_slice_params->u1_default_motion_prediction_flag)
2097
657
            {
2098
657
                pi1_ref_idx[0] = -1;
2099
657
                pi1_ref_idx[1] = -1;
2100
657
                pi1_ref_idx[2] = -1;
2101
657
                pi1_ref_idx[3] = -1;
2102
657
            }
2103
15.2k
        }
2104
2105
        /* Decoding reference index 0: For simple profile the following   */
2106
        /* conditions are always true (mb_field_decoding_flag == 0);      */
2107
        /* (MbPartPredMode != PredL1)                                     */
2108
34.2k
        if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
2109
1.29k
        {
2110
            /* force the routine to decode ref idx for each partition */
2111
            /*SVC added motion_prediction_flag to force it to take it only for
2112
             * !motion_pred_flag_l0*/
2113
2114
1.29k
            ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0, uc_num_ref_idx_l0_active_minus1,
2115
1.29k
                                             u1_mb_mc_mode, pi1_ref_idx, pi1_left_ref_idx_ctxt_inc,
2116
1.29k
                                             pi1_top_ref_idx_ctx_inc_arr, ps_cab_env, ps_bitstrm,
2117
1.29k
                                             ps_dec->p_ref_idx_t);
2118
1.29k
            if(ret != OK)
2119
38
            {
2120
38
                return ret;
2121
38
            }
2122
1.29k
        }
2123
32.9k
        else
2124
32.9k
        {
2125
            /* When there exists only a single frame to predict from */
2126
32.9k
            pi1_left_ref_idx_ctxt_inc[0] = 0;
2127
32.9k
            pi1_left_ref_idx_ctxt_inc[1] = 0;
2128
32.9k
            pi1_top_ref_idx_ctx_inc_arr[0] = 0;
2129
32.9k
            pi1_top_ref_idx_ctx_inc_arr[1] = 0;
2130
32.9k
            *((UWORD32 *) pi1_ref_idx) = 0;
2131
32.9k
        }
2132
34.2k
    }
2133
2134
34.2k
    {
2135
34.2k
        UWORD8 u1_p_idx;
2136
34.2k
        UWORD32 uc_i;
2137
34.2k
        parse_part_params_t *ps_part = ps_dec->ps_part;
2138
34.2k
        UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
2139
34.2k
        UWORD32 u4_sub_mb_num;
2140
34.2k
        const UWORD8 *pu1_top_left_sub_mb_indx;
2141
34.2k
        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
2142
34.2k
        UWORD16 u2_sub_mb_num_pack = 0x028A;
2143
2144
        /* Loading the table pointers */
2145
34.2k
        const UWORD8 *pu1_mb_partw = (const UWORD8 *) gau1_ih264d_mb_partw;
2146
34.2k
        const UWORD8 *pu1_mb_parth = (const UWORD8 *) gau1_ih264d_mb_parth;
2147
34.2k
        const UWORD8 *pu1_sub_mb_indx_mod =
2148
34.2k
            (const UWORD8 *) (gau1_ih264d_submb_indx_mod) + (uc_sub_mb * 6);
2149
34.2k
        const UWORD8 *pu1_sub_mb_partw = (const UWORD8 *) gau1_ih264d_submb_partw;
2150
34.2k
        const UWORD8 *pu1_sub_mb_parth = (const UWORD8 *) gau1_ih264d_submb_parth;
2151
34.2k
        const UWORD8 *pu1_num_sub_mb_part = (const UWORD8 *) gau1_ih264d_num_submb_part;
2152
2153
        /*********************************************************/
2154
        /* default initialisations for condition (uc_sub_mb == 0) */
2155
        /* i.e. all are subpartitions of 8x8                     */
2156
        /*********************************************************/
2157
34.2k
        u1_sub_mb_mode = 0;
2158
34.2k
        u1_num_subpart = 1;
2159
34.2k
        u1_mb_part_width = pu1_mb_partw[u1_mb_type];
2160
34.2k
        u1_mb_part_height = pu1_mb_parth[u1_mb_type];
2161
34.2k
        pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
2162
34.2k
        u4_sub_mb_num = 0;
2163
2164
        /* Loop on number of partitions */
2165
96.0k
        for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
2166
61.8k
        {
2167
61.8k
            UWORD8 uc_j;
2168
61.8k
            if(uc_sub_mb)
2169
26.9k
            {
2170
26.9k
                u1_sub_mb_mode = u4_sub_mb_pack >> 24;
2171
26.9k
                u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
2172
26.9k
                u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
2173
26.9k
                u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
2174
26.9k
                pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
2175
26.9k
                u4_sub_mb_num = u2_sub_mb_num_pack >> 12;
2176
26.9k
                u4_sub_mb_pack <<= 8;
2177
26.9k
                u2_sub_mb_num_pack <<= 4;
2178
26.9k
            }
2179
            /* Loop on Number of sub-partitions */
2180
148k
            for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
2181
86.7k
            {
2182
86.7k
                mv_pred_t *ps_mv;
2183
86.7k
                u4_sub_mb_num += *pu1_top_left_sub_mb_indx;
2184
86.7k
                ps_mv = ps_mv_start + u4_sub_mb_num;
2185
2186
                /* Storing Info for partitions */
2187
86.7k
                ps_part->u1_is_direct = PART_NOT_DIRECT;
2188
86.7k
                ps_part->u1_sub_mb_num = u4_sub_mb_num;
2189
86.7k
                ps_part->u1_partheight = u1_mb_part_height;
2190
86.7k
                ps_part->u1_partwidth = u1_mb_part_width;
2191
2192
                /* Increment partition Index */
2193
86.7k
                u1_p_idx++;
2194
86.7k
                ps_part++;
2195
2196
86.7k
                ih264d_get_mvd_cabac(u4_sub_mb_num, 0, u1_mb_part_width, u1_mb_part_height, 1,
2197
86.7k
                                     ps_dec, ps_mv);
2198
86.7k
            }
2199
61.8k
        }
2200
34.2k
        ps_parse_mb_data->u1_num_part = u1_p_idx;
2201
34.2k
        ps_dec->ps_part = ps_part;
2202
34.2k
    }
2203
2204
    /* update incropwindow*/
2205
34.2k
    if(ps_svc_slice_params->u1_adaptive_residual_prediction_flag &&
2206
1.71k
       ps_svc_cur_mb_info->u1_crop_window_flag)
2207
1.60k
    {
2208
1.60k
        ps_svc_cur_mb_info->u1_residual_prediction_flag = ih264d_decode_bin(
2209
1.60k
            1, ps_svc_lyr_dec->ps_residual_prediction_flag, ps_bitstrm, ps_cab_env);
2210
1.60k
        COPYTHECONTEXT("SVC ext: u1_residual_prediction_flag",
2211
1.60k
                       ps_cur_mb_info->u1_residual_prediction_flag);
2212
1.60k
    }
2213
32.6k
    else
2214
32.6k
    {
2215
        /*residual flag inference code */
2216
32.6k
        if(1 == ps_svc_cur_mb_info->u1_crop_window_flag)
2217
32.3k
        {
2218
32.3k
            ps_svc_cur_mb_info->u1_residual_prediction_flag =
2219
32.3k
                ps_svc_slice_params->u1_default_residual_prediction_flag;
2220
32.3k
        }
2221
290
        else
2222
290
        {
2223
290
            ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
2224
290
        }
2225
32.6k
    }
2226
2227
34.2k
    if(ps_svc_slice_params->u1_scan_idx_end >= ps_svc_slice_params->u1_scan_idx_start)
2228
34.2k
    {
2229
34.2k
        UWORD8 u1_cbp;
2230
        /* Read the Coded block pattern */
2231
34.2k
        u1_cbp = (WORD8) ih264d_parse_ctx_cbp_cabac(ps_dec);
2232
34.2k
        COPYTHECONTEXT("coded_block_pattern", u1_cbp);
2233
34.2k
        ps_cur_mb_info->u1_cbp = u1_cbp;
2234
34.2k
        p_curr_ctxt->u1_cbp = u1_cbp;
2235
34.2k
        p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
2236
34.2k
        p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
2237
34.2k
        ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
2238
2239
34.2k
        if(u1_cbp > 47) return ERROR_CBP;
2240
2241
34.2k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
2242
34.2k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
2243
2244
        /* Read the transform8x8 u4_flag if present */
2245
34.2k
        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & 0xf) &&
2246
22.2k
           u1_no_submb_part_size_lt8x8_flag)
2247
17.8k
        {
2248
17.8k
            ps_cur_mb_info->u1_tran_form8x8 =
2249
17.8k
                ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
2250
17.8k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
2251
17.8k
            p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
2252
17.8k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
2253
17.8k
        }
2254
16.3k
        else
2255
16.3k
        {
2256
16.3k
            p_curr_ctxt->u1_transform8x8_ctxt = 0;
2257
16.3k
        }
2258
2259
        /* Read mb_qp_delta */
2260
34.2k
        if(u1_cbp)
2261
23.9k
        {
2262
23.9k
            WORD8 c_temp;
2263
23.9k
            ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp);
2264
23.9k
            if(ret != OK) return ret;
2265
23.6k
            COPYTHECONTEXT("mb_qp_delta", c_temp);
2266
23.6k
            if(c_temp != 0)
2267
9.61k
            {
2268
9.61k
                ret = ih264d_update_qp(ps_dec, c_temp);
2269
9.61k
                if(ret != OK) return ret;
2270
9.61k
            }
2271
23.6k
        }
2272
10.2k
        else
2273
10.2k
            ps_dec->i1_prev_mb_qp_delta = 0;
2274
2275
        /*residual from start to end idx */
2276
33.8k
        ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0);
2277
33.8k
        if(EXCEED_OFFSET(ps_dec->ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
2278
33.8k
    }
2279
32.9k
    return OK;
2280
34.2k
}
2281
2282
/*!
2283
 **************************************************************************
2284
 * \if Function name : isvcd_parse_pmb_cavlc \endif
2285
 *
2286
 * \brief
2287
 *    This function parses CAVLC syntax of a P MB.
2288
 *
2289
 * \return
2290
 *    0 on Success and Error code otherwise
2291
 **************************************************************************
2292
 */
2293
WORD32 isvcd_parse_pmb_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
2294
                             dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD32 u4_mb_num,
2295
                             UWORD32 u4_num_mbsNby2)
2296
35.3k
{
2297
35.3k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
2298
35.3k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
2299
35.3k
    UWORD32 u1_num_mb_part;
2300
35.3k
    UWORD32 uc_sub_mb;
2301
35.3k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
2302
35.3k
    UWORD32 *const pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
2303
35.3k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
2304
35.3k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data + u4_num_mbsNby2;
2305
35.3k
    WORD8 *pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
2306
35.3k
    const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
2307
35.3k
    const UWORD8 *pu1_num_mb_part = (const UWORD8 *) gau1_ih264d_num_mb_part;
2308
35.3k
    UWORD8 *pu1_col_info = ps_parse_mb_data->u1_col_info;
2309
35.3k
    UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
2310
35.3k
    UWORD32 u4_sum_mb_mode_pack = 0;
2311
35.3k
    WORD32 ret;
2312
35.3k
    UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
2313
2314
35.3k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
2315
35.3k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
2316
35.3k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
2317
35.3k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
2318
35.3k
    ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
2319
35.3k
    uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
2320
2321
    /* Reading the subMB type */
2322
35.3k
    if(uc_sub_mb)
2323
3.31k
    {
2324
3.31k
        WORD32 i;
2325
3.31k
        UWORD8 u1_colz = (PRED_8x8 << 6);
2326
2327
15.6k
        for(i = 0; i < 4; i++)
2328
12.7k
        {
2329
12.7k
            UWORD32 ui_sub_mb_mode;
2330
2331
            // Inlined ih264d_uev
2332
12.7k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
2333
12.7k
            UWORD32 u4_word, u4_ldz;
2334
2335
            /***************************************************************/
2336
            /* Find leading zeros in next 32 bits                          */
2337
            /***************************************************************/
2338
12.7k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
2339
12.7k
            u4_ldz = CLZ(u4_word);
2340
            /* Flush the ps_bitstrm */
2341
12.7k
            u4_bitstream_offset += (u4_ldz + 1);
2342
            /* Read the suffix from the ps_bitstrm */
2343
12.7k
            u4_word = 0;
2344
12.7k
            if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
2345
12.7k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
2346
12.7k
            ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1);
2347
            // Inlined ih264d_uev
2348
2349
12.7k
            if(ui_sub_mb_mode > 3)
2350
379
            {
2351
379
                return ERROR_SUB_MB_TYPE;
2352
379
            }
2353
12.3k
            else
2354
12.3k
            {
2355
12.3k
                u4_sum_mb_mode_pack = (u4_sum_mb_mode_pack << 8) | ui_sub_mb_mode;
2356
                /* Storing collocated information */
2357
12.3k
                *pu1_col_info++ = u1_colz | (UWORD8) (ui_sub_mb_mode << 4);
2358
2359
12.3k
                COPYTHECONTEXT("sub_mb_type", ui_sub_mb_mode);
2360
12.3k
            }
2361
2362
            /* check if Motion compensation is done below 8x8 */
2363
12.3k
            if(ui_sub_mb_mode != P_L0_8x8)
2364
6.03k
            {
2365
6.03k
                u1_no_submb_part_size_lt8x8_flag = 0;
2366
6.03k
            }
2367
12.3k
        }
2368
2.93k
        u1_num_mb_part = 4;
2369
2.93k
    }
2370
32.0k
    else
2371
32.0k
    {
2372
32.0k
        *pu1_col_info++ = (u1_mb_type << 6);
2373
32.0k
        if(u1_mb_type) *pu1_col_info++ = (u1_mb_type << 6);
2374
32.0k
        u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
2375
32.0k
    }
2376
2377
    /*Adding code to get Motion Prediction Flags*/
2378
34.9k
    {
2379
        /*free the scratch buffer once used*/
2380
34.9k
        UWORD8 uc_i;
2381
34.9k
        UWORD8 *pu1_motion_pred_flag_l0;
2382
34.9k
        UWORD8 u1_mvp_flag;
2383
34.9k
        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
2384
34.9k
        UWORD8 uc_num_ref_idx_l0_active_minus1 =
2385
34.9k
            (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] << (u1_mbaff & uc_field)) - 1;
2386
2387
34.9k
        pu1_motion_pred_flag_l0 = &ps_svc_cur_mb_info->au1_motion_pred_flag[0];
2388
34.9k
        *pu1_motion_pred_flag_l0 = 0;
2389
34.9k
        if(ps_svc_cur_mb_info->u1_crop_window_flag &&
2390
33.8k
           ps_svc_slice_params->u1_adaptive_motion_prediction_flag)
2391
14.2k
        {
2392
41.1k
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
2393
26.9k
            {
2394
                /*usage of bins and ctxt check*/
2395
26.9k
                u1_mvp_flag = ih264d_get_bit_h264(ps_bitstrm);
2396
26.9k
                COPYTHECONTEXT("SVC ext: ps_motion_prediction_flag_l0", u1_mvp_flag);
2397
2398
26.9k
                *pu1_motion_pred_flag_l0 |= (u1_mvp_flag << uc_i);
2399
26.9k
            }
2400
14.2k
        }
2401
20.7k
        else if(ps_svc_cur_mb_info->u1_crop_window_flag)
2402
19.6k
        {
2403
19.6k
            *pu1_motion_pred_flag_l0 = ps_svc_slice_params->u1_default_motion_prediction_flag
2404
19.6k
                                           ? ((1 << u1_num_mb_part) - 1)
2405
19.6k
                                           : 0;
2406
19.6k
        }
2407
2408
        /* Decoding reference index 0: For simple profile the following   */
2409
        /* conditions are always true (mb_field_decoding_flag == 0);      */
2410
        /* (MbPartPredMode != PredL1)                                     */
2411
34.9k
        if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
2412
19.5k
        {
2413
19.5k
            if(1 == uc_num_ref_idx_l0_active_minus1)
2414
5.75k
                isvcd_parse_pmb_ref_index_cavlc_range1(u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
2415
5.75k
                                                       uc_num_ref_idx_l0_active_minus1,
2416
5.75k
                                                       pu1_motion_pred_flag_l0);
2417
13.8k
            else
2418
13.8k
            {
2419
13.8k
                ret = isvcd_parse_pmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
2420
13.8k
                                                      uc_num_ref_idx_l0_active_minus1,
2421
13.8k
                                                      pu1_motion_pred_flag_l0);
2422
13.8k
                if(ret != OK) return ret;
2423
13.8k
            }
2424
19.5k
        }
2425
15.4k
        else
2426
15.4k
        {
2427
            /* When there exists only a single frame to predict from */
2428
15.4k
            UWORD32 uc_i;
2429
37.9k
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++) /* Storing Reference Idx Information */
2430
22.5k
                pi1_ref_idx[uc_i] = 0;
2431
15.4k
        }
2432
34.9k
    }
2433
2434
34.7k
    {
2435
34.7k
        UWORD8 u1_p_idx;
2436
34.7k
        UWORD32 uc_i;
2437
34.7k
        parse_part_params_t *ps_part = ps_dec->ps_part;
2438
34.7k
        UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
2439
34.7k
        UWORD32 u4_sub_mb_num;
2440
34.7k
        const UWORD8 *pu1_top_left_sub_mb_indx;
2441
34.7k
        mv_pred_t *ps_mv, *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
2442
        /* Loading the table pointers */
2443
34.7k
        const UWORD8 *pu1_mb_partw = (const UWORD8 *) gau1_ih264d_mb_partw;
2444
34.7k
        const UWORD8 *pu1_mb_parth = (const UWORD8 *) gau1_ih264d_mb_parth;
2445
34.7k
        const UWORD8 *pu1_sub_mb_indx_mod =
2446
34.7k
            (const UWORD8 *) (gau1_ih264d_submb_indx_mod) + (uc_sub_mb * 6);
2447
34.7k
        const UWORD8 *pu1_sub_mb_partw = (const UWORD8 *) gau1_ih264d_submb_partw;
2448
34.7k
        const UWORD8 *pu1_sub_mb_parth = (const UWORD8 *) gau1_ih264d_submb_parth;
2449
34.7k
        const UWORD8 *pu1_num_sub_mb_part = (const UWORD8 *) gau1_ih264d_num_submb_part;
2450
34.7k
        UWORD16 u2_sub_mb_num = 0x028A;
2451
2452
        /*********************************************************/
2453
        /* default initialisations for condition (uc_sub_mb == 0) */
2454
        /* i.e. all are subpartitions of 8x8                     */
2455
        /*********************************************************/
2456
34.7k
        u1_sub_mb_mode = 0;
2457
34.7k
        u1_num_subpart = 1;
2458
34.7k
        u1_mb_part_width = pu1_mb_partw[u1_mb_type];
2459
34.7k
        u1_mb_part_height = pu1_mb_parth[u1_mb_type];
2460
34.7k
        pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
2461
34.7k
        u4_sub_mb_num = 0;
2462
2463
        /* Loop on number of partitions */
2464
90.5k
        for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
2465
55.8k
        {
2466
55.8k
            UWORD8 uc_j;
2467
55.8k
            if(uc_sub_mb)
2468
11.7k
            {
2469
11.7k
                u1_sub_mb_mode = u4_sum_mb_mode_pack >> 24;
2470
11.7k
                u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
2471
11.7k
                u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
2472
11.7k
                u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
2473
11.7k
                pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
2474
11.7k
                u4_sub_mb_num = u2_sub_mb_num >> 12;
2475
11.7k
                u4_sum_mb_mode_pack <<= 8;
2476
11.7k
                u2_sub_mb_num <<= 4;
2477
11.7k
            }
2478
            /* Loop on Number of sub-partitions */
2479
122k
            for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
2480
66.2k
            {
2481
66.2k
                WORD16 i2_mvx, i2_mvy;
2482
66.2k
                u4_sub_mb_num += *pu1_top_left_sub_mb_indx;
2483
66.2k
                ps_mv = ps_mv_start + u4_sub_mb_num;
2484
2485
                /* Reading the differential Mv from the bitstream */
2486
                // inlining ih264d_sev
2487
66.2k
                {
2488
66.2k
                    UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
2489
66.2k
                    UWORD32 u4_word, u4_ldz, u4_abs_val;
2490
2491
                    /***************************************************************/
2492
                    /* Find leading zeros in next 32 bits                          */
2493
                    /***************************************************************/
2494
66.2k
                    NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
2495
66.2k
                    u4_ldz = CLZ(u4_word);
2496
2497
                    /* Flush the ps_bitstrm */
2498
66.2k
                    u4_bitstream_offset += (u4_ldz + 1);
2499
2500
                    /* Read the suffix from the ps_bitstrm */
2501
66.2k
                    u4_word = 0;
2502
66.2k
                    if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
2503
2504
66.2k
                    *pu4_bitstrm_ofst = u4_bitstream_offset;
2505
66.2k
                    u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
2506
2507
66.2k
                    if(u4_word & 0x1)
2508
22.8k
                        i2_mvx = (-(WORD32) u4_abs_val);
2509
43.4k
                    else
2510
43.4k
                        i2_mvx = (u4_abs_val);
2511
66.2k
                }
2512
                // inlinined ih264d_sev
2513
66.2k
                COPYTHECONTEXT("MVD", i2_mvx);
2514
66.2k
                i2_mvy = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2515
66.2k
                COPYTHECONTEXT("MVD", i2_mvy);
2516
2517
                /* Storing Info for partitions */
2518
66.2k
                ps_part->u1_is_direct = PART_NOT_DIRECT;
2519
66.2k
                ps_part->u1_sub_mb_num = u4_sub_mb_num;
2520
66.2k
                ps_part->u1_partheight = u1_mb_part_height;
2521
66.2k
                ps_part->u1_partwidth = u1_mb_part_width;
2522
2523
                /* Storing Mv residuals */
2524
66.2k
                ps_mv->i2_mv[0] = i2_mvx;
2525
66.2k
                ps_mv->i2_mv[1] = i2_mvy;
2526
2527
                /* Increment partition Index */
2528
66.2k
                u1_p_idx++;
2529
66.2k
                ps_part++;
2530
66.2k
            }
2531
55.8k
        }
2532
34.7k
        ps_parse_mb_data->u1_num_part = u1_p_idx;
2533
34.7k
        ps_dec->ps_part = ps_part;
2534
34.7k
    }
2535
2536
34.7k
    if(ps_svc_slice_params->u1_adaptive_residual_prediction_flag &&
2537
10.1k
       ps_svc_cur_mb_info->u1_crop_window_flag)
2538
9.08k
    {
2539
9.08k
        ps_svc_cur_mb_info->u1_residual_prediction_flag = ih264d_get_bit_h264(ps_bitstrm);
2540
9.08k
        COPYTHECONTEXT("SVC ext: u1_residual_prediction_flag",
2541
9.08k
                       ps_svc_cur_mb_info->u1_residual_prediction_flag);
2542
9.08k
    }
2543
25.6k
    else
2544
25.6k
    {
2545
        /*residual flag inference code */
2546
25.6k
        if(1 == ps_svc_cur_mb_info->u1_crop_window_flag)
2547
24.5k
        {
2548
24.5k
            ps_svc_cur_mb_info->u1_residual_prediction_flag =
2549
24.5k
                ps_svc_slice_params->u1_default_residual_prediction_flag;
2550
24.5k
        }
2551
1.10k
        else
2552
1.10k
        {
2553
1.10k
            ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
2554
1.10k
        }
2555
25.6k
    }
2556
2557
34.7k
    if(ps_svc_slice_params->u1_scan_idx_end >= ps_svc_slice_params->u1_scan_idx_start)
2558
34.7k
    {
2559
34.7k
        UWORD32 u4_cbp;
2560
        /* Read the Coded block pattern */
2561
34.7k
        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
2562
34.7k
        UWORD32 u4_word, u4_ldz;
2563
2564
        /***************************************************************/
2565
        /* Find leading zeros in next 32 bits                          */
2566
        /***************************************************************/
2567
34.7k
        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
2568
34.7k
        u4_ldz = CLZ(u4_word);
2569
        /* Flush the ps_bitstrm */
2570
34.7k
        u4_bitstream_offset += (u4_ldz + 1);
2571
        /* Read the suffix from the ps_bitstrm */
2572
34.7k
        u4_word = 0;
2573
34.7k
        if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
2574
34.7k
        *pu4_bitstrm_ofst = u4_bitstream_offset;
2575
34.7k
        u4_cbp = ((1 << u4_ldz) + u4_word - 1);
2576
2577
34.7k
        if(u4_cbp > 47) return ERROR_CBP;
2578
2579
33.9k
        u4_cbp = *((UWORD8 *) gau1_ih264d_cbp_inter + u4_cbp);
2580
33.9k
        COPYTHECONTEXT("coded_block_pattern", u4_cbp);
2581
33.9k
        ps_cur_mb_info->u1_cbp = u4_cbp;
2582
2583
        /* Read the transform8x8 u4_flag if present */
2584
33.9k
        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & 0xf) &&
2585
2.93k
           u1_no_submb_part_size_lt8x8_flag)
2586
2.31k
        {
2587
2.31k
            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
2588
2.31k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
2589
2.31k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
2590
2.31k
        }
2591
2592
        /* Read mb_qp_delta */
2593
33.9k
        if(u4_cbp)
2594
12.5k
        {
2595
12.5k
            WORD32 i_temp;
2596
12.5k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
2597
12.5k
            UWORD32 u4_word, u4_ldz, u4_abs_val;
2598
2599
            /***************************************************************/
2600
            /* Find leading zeros in next 32 bits                          */
2601
            /***************************************************************/
2602
12.5k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
2603
12.5k
            u4_ldz = CLZ(u4_word);
2604
2605
            /* Flush the ps_bitstrm */
2606
12.5k
            u4_bitstream_offset += (u4_ldz + 1);
2607
2608
            /* Read the suffix from the ps_bitstrm */
2609
12.5k
            u4_word = 0;
2610
12.5k
            if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
2611
2612
12.5k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
2613
12.5k
            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
2614
2615
12.5k
            if(u4_word & 0x1)
2616
3.44k
                i_temp = (-(WORD32) u4_abs_val);
2617
9.09k
            else
2618
9.09k
                i_temp = (u4_abs_val);
2619
2620
12.5k
            if((i_temp < -26) || (i_temp > 25)) return ERROR_INV_RANGE_QP_T;
2621
            // inlinined ih264d_sev
2622
2623
12.1k
            COPYTHECONTEXT("mb_qp_delta", i_temp);
2624
12.1k
            if(i_temp)
2625
6.58k
            {
2626
6.58k
                ret = ih264d_update_qp(ps_dec, (WORD8) i_temp);
2627
6.58k
                if(ret != OK) return ret;
2628
6.58k
            }
2629
2630
            /*change to support start to end idx*/
2631
12.1k
            ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0);
2632
12.1k
            if(ret != OK) return ret;
2633
11.8k
            if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
2634
11.8k
        }
2635
21.4k
        else
2636
21.4k
        {
2637
21.4k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
2638
21.4k
        }
2639
33.9k
    }
2640
2641
32.8k
    return OK;
2642
34.7k
}
2643
/*!
2644
 **************************************************************************
2645
 * \if Function name : isvcd_mark_err_slice_skip \endif
2646
 *
2647
 * \brief
2648
 *
2649
 *
2650
 * \return
2651
 *    0 on Success and Error code otherwise
2652
 **************************************************************************
2653
 */
2654
WORD32 isvcd_mark_err_slice_skip(svc_dec_lyr_struct_t *ps_svc_lyr_dec, WORD32 num_mb_skip,
2655
                                 UWORD8 u1_is_idr_slice, UWORD16 u2_frame_num,
2656
                                 pocstruct_t *ps_cur_poc, WORD32 prev_slice_err)
2657
132k
{
2658
132k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
2659
132k
    WORD32 i2_cur_mb_addr;
2660
132k
    UWORD32 u1_num_mbs;
2661
132k
    UWORD32 u1_mb_idx = ps_dec->u4_mb_idx;
2662
132k
    UWORD32 i2_mb_skip_run;
2663
132k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
2664
132k
    const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
2665
132k
    UWORD32 u1_slice_end;
2666
132k
    UWORD32 u1_tfr_n_mb;
2667
132k
    UWORD32 u1_decode_nmb;
2668
132k
    dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
2669
132k
    deblk_mb_t *ps_cur_deblk_mb;
2670
132k
    dec_mb_info_t *ps_cur_mb_info;
2671
132k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
2672
132k
    parse_pmbarams_t *ps_parse_mb_data;
2673
132k
    UWORD32 u1_inter_mb_type;
2674
132k
    UWORD32 u1_deblk_mb_type;
2675
132k
    UWORD32 u1_mbaff;
2676
132k
    parse_part_params_t *ps_part_info;
2677
132k
    WORD32 ret;
2678
132k
    UNUSED(u1_is_idr_slice);
2679
2680
132k
    ps_svc_lyr_dec->u1_error_in_cur_frame = 1;
2681
132k
    if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
2682
0
    {
2683
0
        ih264d_err_pic_dispbuf_mgr(ps_dec);
2684
0
        return 0;
2685
0
    }
2686
2687
132k
    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (num_mb_skip & 1))
2688
0
    {
2689
0
        num_mb_skip++;
2690
0
    }
2691
132k
    ps_dec->ps_dpb_cmds->u1_long_term_reference_flag = 0;
2692
132k
    if(prev_slice_err == 1)
2693
74.3k
    {
2694
        /* first slice - missing/header corruption */
2695
74.3k
        ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
2696
74.3k
        {
2697
74.3k
            WORD32 i, j, poc = 0;
2698
74.3k
            ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0;
2699
74.3k
            ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
2700
74.3k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
2701
74.3k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
2702
2703
74.3k
            if(ps_dec->ps_cur_pic != NULL)
2704
74.3k
            {
2705
74.3k
                poc = ps_dec->ps_cur_pic->i4_poc;
2706
74.3k
                if(poc <= INT32_MAX - 2) poc += 2;
2707
74.3k
            }
2708
2709
74.3k
            j = -1;
2710
119k
            for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
2711
119k
            {
2712
119k
                if(ps_dec->ps_pps[i].u1_is_valid == TRUE)
2713
74.6k
                {
2714
74.6k
                    if(ps_dec->ps_pps[i].ps_sps->u1_is_valid == TRUE)
2715
74.3k
                    {
2716
74.3k
                        j = i;
2717
74.3k
                        break;
2718
74.3k
                    }
2719
74.6k
                }
2720
119k
            }
2721
2722
            // if valid SPS PPS is not found return error
2723
74.3k
            if(j == -1)
2724
0
            {
2725
0
                return ERROR_INV_SLICE_HDR_T;
2726
0
            }
2727
2728
            /* call ih264d_start_of_pic only if it was not called earlier*/
2729
74.3k
            if(ps_dec->u4_pic_buf_got == 0)
2730
0
            {
2731
                // initialize slice params required by isvcd_start_of_pic to valid values
2732
0
                ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
2733
0
                ps_dec->ps_cur_slice->u1_nal_ref_idc = 1;
2734
0
                ps_dec->ps_cur_slice->u1_nal_unit_type = 1;
2735
0
                ret = isvcd_start_of_pic(ps_svc_lyr_dec, poc, ps_cur_poc,
2736
0
                                         ps_dec->ps_cur_slice->u2_frame_num, &ps_dec->ps_pps[j]);
2737
2738
0
                if(ret != OK)
2739
0
                {
2740
0
                    return ret;
2741
0
                }
2742
                /*inter layer buffer intialization */
2743
0
                ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
2744
0
                    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start;
2745
0
                ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_cur_mb =
2746
0
                    ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_base;
2747
0
            }
2748
2749
74.3k
            ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0;
2750
74.3k
            ps_dec->u4_output_present = 0;
2751
2752
74.3k
            {
2753
74.3k
                ih264d_get_next_display_field(ps_dec, ps_dec->ps_out_buffer, &(ps_dec->s_disp_op));
2754
                /* If error code is non-zero then there is no buffer available for
2755
                display, hence avoid format conversion */
2756
2757
74.3k
                if(0 != ps_dec->s_disp_op.u4_error_code)
2758
67.0k
                {
2759
67.0k
                    ps_dec->u4_output_present = 0;
2760
67.0k
                    ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
2761
67.0k
                }
2762
7.25k
                else
2763
7.25k
                    ps_dec->u4_output_present = 1;
2764
74.3k
            }
2765
2766
74.3k
            if(ps_dec->u1_separate_parse == 1)
2767
34.0k
            {
2768
#ifdef KEEP_THREADS_ACTIVE
2769
                ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
2770
                RETURN_IF((ret != IV_SUCCESS), ret);
2771
2772
                ps_dec->ai4_process_start[0] = PROC_START;
2773
                ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[0]);
2774
                RETURN_IF((ret != IV_SUCCESS), ret);
2775
2776
                ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
2777
                RETURN_IF((ret != IV_SUCCESS), ret);
2778
#endif
2779
#ifdef KEEP_THREADS_ACTIVE
2780
                if(ps_dec->u4_bs_deblk_thread_created)
2781
                {
2782
                    ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
2783
                    RETURN_IF((ret != IV_SUCCESS), ret);
2784
2785
                    ps_dec->ai4_process_start[1] = PROC_START;
2786
                    ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[1]);
2787
                    RETURN_IF((ret != IV_SUCCESS), ret);
2788
2789
                    ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
2790
                    RETURN_IF((ret != IV_SUCCESS), ret);
2791
                }
2792
#endif
2793
34.0k
            }
2794
74.3k
        }
2795
74.3k
    }
2796
58.6k
    else
2797
58.6k
    {
2798
        // Middle / last slice
2799
58.6k
        dec_slice_struct_t *ps_parse_cur_slice;
2800
58.6k
        ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
2801
2802
58.6k
        if(ps_dec->u1_slice_header_done && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice)
2803
58.3k
        {
2804
            // Slice data corrupted
2805
            // in the case of mbaff, conceal from the even mb.
2806
58.3k
            if((ps_dec->ps_cur_slice->u1_mbaff_frame_flag) && (ps_dec->u4_num_mbs_cur_nmb & 1))
2807
0
            {
2808
0
                ps_dec->u4_num_mbs_cur_nmb = ps_dec->u4_num_mbs_cur_nmb - 1;
2809
0
                ps_dec->u4_cur_mb_addr--;
2810
0
            }
2811
2812
58.3k
            u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb;
2813
58.3k
            if(u1_num_mbs)
2814
13.4k
            {
2815
13.4k
                ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1;
2816
13.4k
            }
2817
44.8k
            else
2818
44.8k
            {
2819
44.8k
                if(ps_dec->u1_separate_parse)
2820
10.4k
                {
2821
10.4k
                    ps_cur_mb_info = ps_dec->ps_nmb_info;
2822
10.4k
                }
2823
34.4k
                else
2824
34.4k
                {
2825
34.4k
                    ps_cur_mb_info = ps_dec->ps_nmb_info + ps_dec->u4_num_mbs_prev_nmb - 1;
2826
34.4k
                }
2827
44.8k
            }
2828
2829
58.3k
            ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
2830
58.3k
            ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
2831
58.3k
            ps_dec->u1_mb_ngbr_availablity = ps_cur_mb_info->u1_mb_ngbr_availablity;
2832
2833
58.3k
            if(u1_num_mbs)
2834
13.4k
            {
2835
                // Going back 1 mb
2836
13.4k
                ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data;
2837
13.4k
                ps_dec->u4_cur_mb_addr--;
2838
13.4k
                ps_dec->i4_submb_ofst -= SUB_BLK_SIZE;
2839
2840
                // Parse/decode N-MB left unparsed
2841
13.4k
                if(ps_dec->u1_pr_sl_type == P_SLICE || ps_dec->u1_pr_sl_type == B_SLICE)
2842
10.2k
                {
2843
10.2k
                    if((ps_dec->i4_submb_ofst - ((WORD32) ((u1_num_mbs - u1_mb_idx) << 4))) < 0)
2844
0
                    {
2845
0
                        ps_dec->i4_submb_ofst = ((u1_num_mbs - u1_mb_idx) << 4);
2846
0
                    }
2847
2848
10.2k
                    ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
2849
10.2k
                    ps_dec->ps_part = ps_dec->ps_parse_part_params;
2850
10.2k
                    if(ret != OK) return ret;
2851
10.2k
                }
2852
2853
13.2k
                u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
2854
13.2k
                u1_end_of_row =
2855
13.2k
                    (!u1_num_mbs_next) &&
2856
0
                    (!(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (u1_num_mbs & 0x01)));
2857
13.2k
                u1_slice_end = 1;
2858
13.2k
                u1_tfr_n_mb = 1;
2859
13.2k
                ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
2860
2861
13.2k
                if(ps_dec->u1_separate_parse)
2862
6.46k
                {
2863
6.46k
                    ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
2864
6.46k
                                         u1_tfr_n_mb, u1_end_of_row);
2865
6.46k
                    ps_dec->ps_nmb_info += u1_num_mbs;
2866
6.46k
                    ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
2867
6.46k
                }
2868
6.80k
                else
2869
6.80k
                {
2870
6.80k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
2871
6.80k
                                                u1_tfr_n_mb, u1_end_of_row);
2872
6.80k
                }
2873
13.2k
                ps_dec->u4_total_mbs_coded += u1_num_mbs;
2874
13.2k
                ps_dec->u4_mb_idx = 0;
2875
13.2k
                ps_dec->u4_num_mbs_cur_nmb = 0;
2876
13.2k
            }
2877
2878
58.1k
            if(ps_dec->u4_total_mbs_coded >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
2879
0
            {
2880
0
                ps_dec->u1_pic_decode_done = 1;
2881
0
                return 0;
2882
0
            }
2883
2884
            /* Inserting new slice only if the current slice has atleast 1 MB*/
2885
58.1k
            if(ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice <
2886
58.1k
               (UWORD32) (ps_dec->u4_total_mbs_coded >> ps_slice->u1_mbaff_frame_flag))
2887
57.9k
            {
2888
57.9k
                ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
2889
57.9k
                ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
2890
57.9k
                ps_dec->u2_cur_slice_num++;
2891
57.9k
                ps_dec->ps_parse_cur_slice++;
2892
57.9k
            }
2893
58.1k
        }
2894
290
        else
2895
290
        {
2896
            // Slice missing / header corrupted
2897
290
            ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
2898
290
        }
2899
58.6k
    }
2900
2901
    /******************************************************/
2902
    /* Initializations to new slice                       */
2903
    /******************************************************/
2904
132k
    {
2905
132k
        WORD32 num_entries;
2906
132k
        WORD32 size;
2907
132k
        UWORD8 *pu1_buf;
2908
2909
132k
        num_entries = MAX_FRAMES;
2910
132k
        if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && (0 == ps_dec->i4_display_delay))
2911
0
        {
2912
0
            num_entries = 1;
2913
0
        }
2914
132k
        num_entries = ((2 * num_entries) + 1);
2915
132k
        num_entries *= 2;
2916
2917
132k
        size = num_entries * sizeof(void *);
2918
132k
        size += PAD_MAP_IDX_POC * sizeof(void *);
2919
2920
132k
        pu1_buf = (UWORD8 *) ps_dec->pv_map_ref_idx_to_poc_buf;
2921
132k
        pu1_buf += size * ps_dec->u2_cur_slice_num;
2922
132k
        ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **) pu1_buf;
2923
132k
    }
2924
132k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
2925
132k
    ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u4_total_mbs_coded >> u1_mbaff;
2926
132k
    ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0;
2927
132k
    ps_dec->ps_cur_slice->i1_slice_beta_offset = 0;
2928
2929
132k
    if(ps_dec->ps_cur_slice->u1_field_pic_flag)
2930
0
        ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num;
2931
2932
132k
    ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u4_total_mbs_coded >> u1_mbaff;
2933
132k
    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd;
2934
2935
132k
    if(ps_dec->u1_separate_parse)
2936
51.0k
    {
2937
51.0k
        ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
2938
51.0k
    }
2939
81.7k
    else
2940
81.7k
    {
2941
81.7k
        ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
2942
81.7k
    }
2943
2944
    /******************************************************/
2945
    /* Initializations specific to P slice                */
2946
    /******************************************************/
2947
132k
    u1_inter_mb_type = P_MB;
2948
132k
    u1_deblk_mb_type = D_INTER_MB;
2949
2950
132k
    ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
2951
132k
    ps_dec->ps_parse_cur_slice->slice_type = P_SLICE;
2952
132k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
2953
132k
    ps_dec->ps_part = ps_dec->ps_parse_part_params;
2954
132k
    ps_dec->u2_mbx =
2955
132k
        (MOD(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
2956
132k
    ps_dec->u2_mby =
2957
132k
        (DIV(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
2958
132k
    ps_dec->u2_mby <<= u1_mbaff;
2959
2960
    /******************************************************/
2961
    /* Parsing / decoding the slice                       */
2962
    /******************************************************/
2963
132k
    ret = isvcd_parse_interlayer_resamp_func_init(ps_svc_lyr_dec,
2964
132k
                                                  ps_dec->ps_cur_slice->u2_first_mb_in_slice);
2965
132k
    ps_dec->u1_slice_header_done = 2;
2966
2967
132k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
2968
132k
    ih264d_update_qp(ps_dec, 0);
2969
132k
    u1_mb_idx = ps_dec->u4_mb_idx;
2970
132k
    ps_parse_mb_data = ps_dec->ps_parse_mb_data;
2971
132k
    u1_num_mbs = u1_mb_idx;
2972
132k
    u1_slice_end = 0;
2973
132k
    u1_tfr_n_mb = 0;
2974
132k
    u1_decode_nmb = 0;
2975
132k
    i2_cur_mb_addr = ps_dec->u4_total_mbs_coded;
2976
132k
    i2_mb_skip_run = num_mb_skip;
2977
132k
    if(0 == ps_dec->u4_total_mbs_coded)
2978
74.3k
    {
2979
74.3k
        ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row;  //[0];
2980
        // Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be valid
2981
74.3k
        ps_dec->ps_cur_mb_row += 2;
2982
74.3k
        ps_dec->ps_top_mb_row = ps_dec->ps_nbr_mb_row;
2983
74.3k
        ps_dec->ps_top_mb_row +=
2984
74.3k
            ((ps_dec->u2_frm_wd_in_mbs + 2) << (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
2985
        // Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be valid
2986
74.3k
        ps_dec->ps_top_mb_row += 2;
2987
2988
        /* CHANGED CODE */
2989
74.3k
        ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
2990
74.3k
        ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
2991
74.3k
        ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
2992
74.3k
        ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
2993
74.3k
        ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv;
2994
74.3k
        ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv;
2995
74.3k
        ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag;
2996
74.3k
        ps_dec->ps_part = ps_dec->ps_parse_part_params;
2997
74.3k
        ps_dec->pf_mvpred_ref_tfr_nby2mb = isvcd_mv_pred_ref_tfr_nby2_epmb;
2998
74.3k
    }
2999
15.7M
    while(!u1_slice_end)
3000
15.6M
    {
3001
15.6M
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) break;
3002
3003
15.6M
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
3004
15.6M
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
3005
15.6M
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
3006
15.6M
        ps_cur_mb_info->u1_Mux = 0;
3007
15.6M
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
3008
15.6M
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
3009
15.6M
        ps_cur_mb_info->u1_end_of_slice = 0;
3010
3011
        /* Storing Default partition info */
3012
15.6M
        ps_parse_mb_data->u1_num_part = 1;
3013
15.6M
        ps_parse_mb_data->u4_isI_mb = 0;
3014
3015
        /**************************************************************/
3016
        /* Get the required information for decoding of MB            */
3017
        /**************************************************************/
3018
        /* mb_x, mb_y, neighbor availablity, */
3019
15.6M
        if(u1_mbaff)
3020
0
            ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
3021
15.6M
        else
3022
15.6M
            isvcd_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info,
3023
15.6M
                                             i2_mb_skip_run);
3024
3025
15.6M
        {
3026
15.6M
            UWORD16 *pu2_res_luma_csbp;
3027
3028
            /*Pointer assignment for Residual NNZ */
3029
15.6M
            pu2_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
3030
15.6M
            pu2_res_luma_csbp +=
3031
15.6M
                ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
3032
15.6M
            *pu2_res_luma_csbp = 0;
3033
15.6M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
3034
15.6M
                ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
3035
15.6M
                (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
3036
15.6M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_INTER_MB;
3037
15.6M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size =
3038
15.6M
                ps_cur_mb_info->u1_tran_form8x8;
3039
15.6M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
3040
15.6M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
3041
15.6M
        }
3042
3043
        /* Set the deblocking parameters for this MB */
3044
15.6M
        if(ps_dec->u4_app_disable_deblk_frm == 0)
3045
15.6M
        {
3046
15.6M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
3047
15.6M
                                             ps_dec->u1_mb_ngbr_availablity,
3048
15.6M
                                             ps_dec->u1_cur_mb_fld_dec_flag);
3049
15.6M
        }
3050
3051
        /* Set appropriate flags in ps_cur_mb_info and ps_dec */
3052
15.6M
        ps_dec->i1_prev_mb_qp_delta = 0;
3053
15.6M
        ps_dec->u1_sub_mb_num = 0;
3054
15.6M
        ps_cur_mb_info->u1_mb_type = MB_SKIP;
3055
15.6M
        ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
3056
15.6M
        ps_cur_mb_info->u1_cbp = 0;
3057
3058
        /* set appropriat flags in svc cur MB info */
3059
15.6M
        ps_svc_cur_mb_info->u1_base_mode_flag = 0;
3060
15.6M
        ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
3061
15.6M
        ps_svc_cur_mb_info->u1_crop_window_flag = 0;
3062
15.6M
        ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
3063
15.6M
        ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
3064
3065
        /* Storing Skip partition info */
3066
15.6M
        ps_part_info = ps_dec->ps_part;
3067
15.6M
        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
3068
15.6M
        ps_part_info->u1_sub_mb_num = 0;
3069
15.6M
        ps_dec->ps_part++;
3070
3071
        /* Update Nnzs */
3072
15.6M
        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
3073
3074
15.6M
        ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
3075
15.6M
        ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
3076
3077
15.6M
        if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
3078
677k
        {
3079
677k
            ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
3080
677k
        }
3081
3082
15.6M
        i2_mb_skip_run--;
3083
15.6M
        ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
3084
3085
15.6M
        if(u1_mbaff)
3086
0
        {
3087
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
3088
0
        }
3089
3090
        /**************************************************************/
3091
        /* Get next Macroblock address                                */
3092
        /**************************************************************/
3093
15.6M
        i2_cur_mb_addr++;
3094
15.6M
        u1_num_mbs++;
3095
15.6M
        ps_parse_mb_data++;
3096
3097
        /****************************************************************/
3098
        /* Check for End Of Row and other flags that determine when to  */
3099
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
3100
        /* N-Mb                                                         */
3101
        /****************************************************************/
3102
15.6M
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
3103
15.6M
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
3104
15.6M
        u1_slice_end = !i2_mb_skip_run;
3105
15.6M
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
3106
15.6M
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
3107
15.6M
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
3108
3109
15.6M
        if(u1_decode_nmb)
3110
2.25M
        {
3111
2.25M
            if((ps_dec->i4_submb_ofst - ((WORD32) ((u1_num_mbs - u1_mb_idx) << 4))) < 0)
3112
49.1k
            {
3113
49.1k
                ps_dec->i4_submb_ofst = ((u1_num_mbs - u1_mb_idx) << 4);
3114
49.1k
            }
3115
3116
2.25M
            ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
3117
2.25M
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
3118
2.25M
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
3119
3120
2.25M
            if(ps_dec->u1_separate_parse)
3121
863k
            {
3122
863k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
3123
863k
                                     u1_end_of_row);
3124
863k
                ps_dec->ps_nmb_info += u1_num_mbs;
3125
863k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
3126
863k
            }
3127
1.39M
            else
3128
1.39M
            {
3129
1.39M
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
3130
1.21M
                {
3131
1.21M
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
3132
1.21M
                                                u1_tfr_n_mb, u1_end_of_row);
3133
1.21M
                }
3134
182k
                else
3135
182k
                {
3136
182k
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
3137
182k
                                                        u1_num_mbs_next, u1_tfr_n_mb,
3138
182k
                                                        u1_end_of_row);
3139
182k
                }
3140
1.39M
            }
3141
2.25M
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
3142
2.25M
            if(u1_tfr_n_mb) u1_num_mbs = 0;
3143
2.25M
            u1_mb_idx = u1_num_mbs;
3144
2.25M
            ps_dec->u4_mb_idx = u1_num_mbs;
3145
2.25M
        }
3146
15.6M
    }
3147
3148
132k
    ps_dec->u4_num_mbs_cur_nmb = 0;
3149
132k
    ps_dec->ps_cur_slice->u4_mbs_in_slice =
3150
132k
        i2_cur_mb_addr - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice;
3151
3152
132k
    H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice);
3153
3154
    /* incremented here only if first slice is inserted */
3155
132k
    if(ps_dec->u4_first_slice_in_pic != 0)
3156
0
    {
3157
0
        ps_dec->ps_parse_cur_slice++;
3158
0
        ps_dec->u2_cur_slice_num++;
3159
0
    }
3160
3161
132k
    ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
3162
132k
    ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
3163
3164
132k
    if(ps_dec->u4_total_mbs_coded >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
3165
132k
    {
3166
132k
        ps_dec->u1_pic_decode_done = 1;
3167
132k
    }
3168
3169
132k
    return 0;
3170
132k
}
3171
/*!
3172
**************************************************************************
3173
* \if Function name : isvcd_parse_interlayer_resamp_func_init \endif
3174
3175
* \brief
3176
*    This function initilizes default values for svcd inter layer func.
3177
*
3178
* \return
3179
*    0 on Success and Error code otherwise
3180
**************************************************************************
3181
*/
3182
WORD32 isvcd_parse_interlayer_resamp_func_init(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
3183
                                               UWORD16 u2_first_mb_in_slice)
3184
324k
{
3185
324k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
3186
324k
    dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
3187
324k
    WORD32 ret = OK;
3188
324k
    if(ps_svc_lyr_dec->u1_res_init_done == 1)
3189
132k
        return ret;
3190
3191
191k
    if(TARGET_LAYER != ps_svc_lyr_dec->u1_layer_identifier)
3192
67.8k
    {
3193
67.8k
        ps_slice->u1_disable_dblk_filter_idc = ps_svc_lyr_dec->u1_inter_lyr_disable_dblk_filter_idc;
3194
67.8k
        ps_slice->i1_slice_alpha_c0_offset = ps_svc_lyr_dec->i1_inter_lyr_slice_alpha_c0_offset;
3195
67.8k
        ps_slice->i1_slice_beta_offset = ps_svc_lyr_dec->i1_inter_lyr_slice_beta_offset;
3196
67.8k
    }
3197
3198
191k
    if(0 == u2_first_mb_in_slice)
3199
191k
    {
3200
191k
        ret = isvcd_populate_res_prms(ps_svc_lyr_dec);
3201
191k
        if(ret != OK) return NOT_OK;
3202
190k
        isvcd_crop_wnd_flag_res_int(ps_svc_lyr_dec);
3203
190k
        ret = isvcd_comp_mode_mv_res_init(ps_svc_lyr_dec);
3204
190k
        if(ret != OK) return NOT_OK;
3205
190k
        ret = isvcd_ii_pred_res_init(ps_svc_lyr_dec);
3206
190k
        if(ret != OK) return NOT_OK;
3207
190k
        ret = isvcd_intra_resamp_res_init(ps_svc_lyr_dec);
3208
190k
        if(ret != OK) return NOT_OK;
3209
190k
        ret = isvcd_residual_samp_res_init(ps_svc_lyr_dec);
3210
190k
        if(ret != OK) return NOT_OK;
3211
3212
190k
        ps_svc_lyr_dec->u1_res_init_done = 1;
3213
190k
    }
3214
3215
190k
    return ret;
3216
191k
}
3217
3218
/*!
3219
**************************************************************************
3220
* \if Function name : isvcd_decode_pslice \endif
3221
*
3222
* \brief
3223
*    Decodes a P Slice
3224
*
3225
*
3226
* \return
3227
*    0 on Success and Error code otherwise
3228
**************************************************************************
3229
*/
3230
WORD32 isvcd_parse_pslice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice)
3231
95.4k
{
3232
95.4k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
3233
95.4k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
3234
95.4k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
3235
95.4k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
3236
95.4k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
3237
95.4k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
3238
95.4k
    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
3239
95.4k
    UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
3240
95.4k
    UWORD64 u8_ref_idx_l0;
3241
95.4k
    UWORD32 u4_temp;
3242
95.4k
    WORD32 i_temp;
3243
95.4k
    WORD32 ret;
3244
95.4k
    WORD64 i8_temp;
3245
3246
    /*--------------------------------------------------------------------*/
3247
    /* Read remaining contents of the slice header                        */
3248
    /*--------------------------------------------------------------------*/
3249
95.4k
    {
3250
95.4k
        WORD8 *pi1_buf;
3251
95.4k
        WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
3252
95.4k
        WORD32 *pi4_mv = (WORD32 *) pi2_mv;
3253
95.4k
        WORD16 *pi16_refFrame;
3254
3255
95.4k
        pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
3256
95.4k
        pi16_refFrame = (WORD16 *) pi1_buf;
3257
95.4k
        *pi4_mv = 0;
3258
95.4k
        *(pi4_mv + 1) = 0;
3259
95.4k
        *pi16_refFrame = OUT_OF_RANGE_REF;
3260
95.4k
        ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8) -1;
3261
95.4k
        ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8) -1;
3262
95.4k
    }
3263
3264
95.4k
    ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(ps_bitstrm);
3265
95.4k
    COPYTHECONTEXT("SH: num_ref_idx_override_flag",
3266
95.4k
                   ps_cur_slice->u1_num_ref_idx_active_override_flag);
3267
3268
95.4k
    u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
3269
95.4k
    if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
3270
54.0k
    {
3271
54.0k
        u8_ref_idx_l0 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64) 1;
3272
54.0k
    }
3273
3274
95.4k
    {
3275
95.4k
        UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS << u1_field_pic_flag;
3276
95.4k
        if(u8_ref_idx_l0 >= u1_max_ref_idx)
3277
1.02k
        {
3278
1.02k
            return ERROR_NUM_REF;
3279
1.02k
        }
3280
94.4k
        ps_cur_slice->u1_num_ref_idx_lx_active[0] = (UWORD8) u8_ref_idx_l0;
3281
94.4k
        COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
3282
94.4k
                       ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
3283
94.4k
    }
3284
3285
0
    {
3286
94.4k
        UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
3287
94.4k
        COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0", uc_refIdxReFlagL0);
3288
3289
94.4k
        ih264d_init_ref_idx_lx_p(ps_dec);
3290
        /* Store the value for future slices in the same picture */
3291
94.4k
        ps_dec->u1_num_ref_idx_lx_active_prev = ps_cur_slice->u1_num_ref_idx_lx_active[0];
3292
3293
        /* Modified temporarily */
3294
94.4k
        if(uc_refIdxReFlagL0)
3295
39.8k
        {
3296
39.8k
            WORD8 ret;
3297
39.8k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
3298
39.8k
            ret = ih264d_ref_idx_reordering(ps_dec, 0);
3299
39.8k
            if(ret == -1) return ERROR_REFIDX_ORDER_T;
3300
39.8k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
3301
39.8k
        }
3302
54.5k
        else
3303
54.5k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
3304
94.4k
    }
3305
    /* Create refIdx to POC mapping */
3306
94.4k
    {
3307
94.4k
        void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
3308
94.4k
        WORD8 idx;
3309
94.4k
        struct pic_buffer_t *ps_pic;
3310
3311
94.4k
        pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
3312
94.4k
        pui_map_ref_idx_to_poc_lx0[0] = 0;
3313
94.4k
        pui_map_ref_idx_to_poc_lx0++;
3314
280k
        for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
3315
185k
        {
3316
185k
            ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
3317
185k
            pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
3318
185k
        }
3319
3320
        /* Bug Fix Deblocking */
3321
94.4k
        pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
3322
94.4k
        pui_map_ref_idx_to_poc_lx1[0] = 0;
3323
3324
94.4k
        if(u1_mbaff)
3325
0
        {
3326
0
            void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
3327
0
            void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1;
3328
0
            ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc + TOP_LIST_FLD_L0;
3329
0
            ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc + BOT_LIST_FLD_L0;
3330
0
            ppv_map_ref_idx_to_poc_lx_t[0] = 0;
3331
0
            ppv_map_ref_idx_to_poc_lx_t++;
3332
0
            ppv_map_ref_idx_to_poc_lx_b[0] = 0;
3333
0
            ppv_map_ref_idx_to_poc_lx_b++;
3334
0
            idx = 0;
3335
0
            for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
3336
0
            {
3337
0
                ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
3338
0
                ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
3339
0
                ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
3340
0
                ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
3341
0
                ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
3342
0
                ppv_map_ref_idx_to_poc_lx_t += 2;
3343
0
                ppv_map_ref_idx_to_poc_lx_b += 2;
3344
0
            }
3345
0
            ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc + TOP_LIST_FLD_L1;
3346
0
            ppv_map_ref_idx_to_poc_lx_t1[0] = 0;
3347
0
            ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc + BOT_LIST_FLD_L1;
3348
0
            ppv_map_ref_idx_to_poc_lx_b1[0] = 0;
3349
0
        }
3350
94.4k
    }
3351
94.4k
    if(ps_pps->u1_wted_pred_flag)
3352
21.2k
    {
3353
21.2k
        ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
3354
21.2k
        if(ret != OK) return ret;
3355
3356
13.7k
        ih264d_form_pred_weight_matrix(ps_dec);
3357
13.7k
        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
3358
13.7k
    }
3359
73.2k
    else
3360
73.2k
    {
3361
73.2k
        ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
3362
73.2k
        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
3363
73.2k
    }
3364
3365
86.9k
    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd;
3366
3367
86.9k
    if(u1_mbaff && (u1_field_pic_flag == 0))
3368
0
    {
3369
0
        ih264d_convert_frm_mbaff_list(ps_dec);
3370
0
    }
3371
3372
    /* G050 */
3373
86.9k
    if(ps_cur_slice->u1_nal_ref_idc != 0)
3374
84.9k
    {
3375
84.9k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
3376
84.6k
        {
3377
84.6k
            dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
3378
84.6k
            dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
3379
84.6k
            UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
3380
3381
84.6k
            ps_pps->ps_sps = ps_dec->ps_cur_sps;
3382
84.6k
            if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
3383
81.4k
                ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
3384
3385
84.6k
            i_temp = ih264d_read_mmco_commands(ps_dec);
3386
3387
84.6k
            ps_pps->ps_sps = ps_sps_tmp;
3388
84.6k
            ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
3389
3390
84.6k
            if(i_temp < 0)
3391
109
            {
3392
109
                return ERROR_DBP_MANAGER_T;
3393
109
            }
3394
84.4k
            ps_dec->u4_bitoffset = i_temp;
3395
84.4k
        }
3396
395
        else
3397
395
            ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
3398
84.9k
    }
3399
    /* G050 */
3400
3401
86.8k
    if(ps_pps->u1_entropy_coding_mode == CABAC)
3402
11.4k
    {
3403
11.4k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3404
3405
11.4k
        if(u4_temp > MAX_CABAC_INIT_IDC)
3406
1.36k
        {
3407
1.36k
            return ERROR_INV_SLICE_HDR_T;
3408
1.36k
        }
3409
10.0k
        ps_cur_slice->u1_cabac_init_idc = u4_temp;
3410
10.0k
        COPYTHECONTEXT("SH: cabac_init_idc", ps_cur_slice->u1_cabac_init_idc);
3411
10.0k
    }
3412
3413
    /* Read slice_qp_delta */
3414
85.5k
    i8_temp = (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3415
85.5k
    if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
3416
6.78k
    {
3417
6.78k
        return ERROR_INV_RANGE_QP_T;
3418
6.78k
    }
3419
78.7k
    ps_cur_slice->u1_slice_qp = (UWORD8) i8_temp;
3420
78.7k
    COPYTHECONTEXT("SH: slice_qp_delta",
3421
78.7k
                   (WORD8) (ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
3422
3423
78.7k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
3424
42.7k
    {
3425
42.7k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3426
42.7k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
3427
2.25k
        {
3428
2.25k
            return ERROR_INV_SLICE_HDR_T;
3429
2.25k
        }
3430
3431
40.4k
        COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
3432
40.4k
        ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
3433
40.4k
        if(u4_temp != 1)
3434
33.9k
        {
3435
33.9k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
3436
33.9k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
3437
1.05k
            {
3438
1.05k
                return ERROR_INV_SLICE_HDR_T;
3439
1.05k
            }
3440
32.9k
            ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
3441
32.9k
            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
3442
32.9k
                           ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
3443
3444
32.9k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
3445
32.9k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
3446
1.04k
            {
3447
1.04k
                return ERROR_INV_SLICE_HDR_T;
3448
1.04k
            }
3449
31.8k
            ps_cur_slice->i1_slice_beta_offset = i_temp;
3450
31.8k
            COPYTHECONTEXT("SH: slice_beta_offset_div2", ps_cur_slice->i1_slice_beta_offset >> 1);
3451
31.8k
        }
3452
6.49k
        else
3453
6.49k
        {
3454
6.49k
            ps_cur_slice->i1_slice_alpha_c0_offset = 0;
3455
6.49k
            ps_cur_slice->i1_slice_beta_offset = 0;
3456
6.49k
        }
3457
40.4k
    }
3458
35.9k
    else
3459
35.9k
    {
3460
35.9k
        ps_cur_slice->u1_disable_dblk_filter_idc = 0;
3461
35.9k
        ps_cur_slice->i1_slice_alpha_c0_offset = 0;
3462
35.9k
        ps_cur_slice->i1_slice_beta_offset = 0;
3463
35.9k
    }
3464
3465
74.3k
    ps_dec->u1_slice_header_done = 2;
3466
74.3k
    if(ps_pps->u1_entropy_coding_mode)
3467
9.59k
    {
3468
9.59k
        SWITCHOFFTRACE;
3469
9.59k
        SWITCHONTRACECABAC;
3470
9.59k
        ps_svc_lyr_dec->pf_parse_svc_inter_slice = isvcd_parse_inter_slice_data_cabac;
3471
9.59k
        ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
3472
9.59k
        ih264d_init_cabac_contexts(P_SLICE, ps_dec);
3473
3474
9.59k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
3475
0
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
3476
9.59k
        else
3477
9.59k
            ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
3478
9.59k
    }
3479
64.7k
    else
3480
64.7k
    {
3481
64.7k
        SWITCHONTRACE;
3482
64.7k
        SWITCHOFFTRACECABAC;
3483
64.7k
        ps_svc_lyr_dec->pf_parse_svc_inter_slice = isvcd_parse_inter_slice_data_cavlc;
3484
64.7k
        ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
3485
64.7k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
3486
0
        {
3487
0
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
3488
0
        }
3489
64.7k
        else
3490
64.7k
            ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
3491
64.7k
    }
3492
3493
74.3k
    ps_dec->u1_B = 0;
3494
74.3k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
3495
74.3k
    ret = ps_svc_lyr_dec->pf_parse_svc_inter_slice(ps_svc_lyr_dec, ps_cur_slice,
3496
74.3k
                                                   u2_first_mb_in_slice);
3497
74.3k
    if(ret != OK) return ret;
3498
3499
55.6k
    return OK;
3500
74.3k
}