Coverage Report

Created: 2025-12-29 06:18

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
15.0k
{
100
15.0k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
101
15.0k
    WORD32 i_status = OK;
102
15.0k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
103
15.0k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
104
15.0k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
105
15.0k
    dec_seq_params_t *ps_seq;
106
15.0k
    dec_svc_seq_params_t *ps_subset_seq;
107
15.0k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
108
15.0k
    dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
109
15.0k
    dec_nal_unit_svc_ext_params_t *ps_nal_svc_ext = NULL;
110
111
15.0k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
112
15.0k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
113
15.0k
    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
114
15.0k
    UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
115
116
15.0k
    UWORD64 u8_ref_idx_l0;
117
15.0k
    UWORD32 u4_temp;
118
15.0k
    WORD32 i_temp;
119
15.0k
    WORD32 ret;
120
15.0k
    WORD64 i8_temp;
121
122
15.0k
    ps_nal_svc_ext = ps_svc_lyr_dec->ps_nal_svc_ext;
123
15.0k
    ps_seq = ps_pps->ps_sps;
124
15.0k
    ps_seq += MAX_NUM_SEQ_PARAMS;
125
15.0k
    ps_subset_seq =
126
15.0k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
127
15.0k
    ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
128
15.0k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
129
130
    /*--------------------------------------------------------------------*/
131
    /* Read remaining contents of the slice header                        */
132
    /*--------------------------------------------------------------------*/
133
15.0k
    {
134
15.0k
        WORD8 *pi1_buf;
135
15.0k
        WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
136
15.0k
        WORD32 *pi4_mv = (WORD32 *) pi2_mv;
137
15.0k
        WORD16 *pi16_refFrame;
138
139
15.0k
        pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
140
15.0k
        pi16_refFrame = (WORD16 *) pi1_buf;
141
15.0k
        *pi4_mv = 0;
142
15.0k
        *(pi4_mv + 1) = 0;
143
15.0k
        *pi16_refFrame = OUT_OF_RANGE_REF;
144
15.0k
        ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8) -1;
145
15.0k
        ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8) -1;
146
15.0k
    }
147
148
15.0k
    if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
149
15.0k
    {
150
15.0k
        ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(ps_bitstrm);
151
152
15.0k
        COPYTHECONTEXT("Slice Header SVC ext: num_ref_idx_override_flag",
153
15.0k
                       ps_cur_slice->u1_num_ref_idx_active_override_flag);
154
155
15.0k
        u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
156
15.0k
        if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
157
9.25k
        {
158
9.25k
            u8_ref_idx_l0 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64) 1;
159
9.25k
        }
160
161
15.0k
        {
162
15.0k
            UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS << u1_field_pic_flag;
163
15.0k
            if(u8_ref_idx_l0 > u1_max_ref_idx)
164
154
            {
165
154
                return ERROR_NUM_REF;
166
154
            }
167
14.8k
            ps_cur_slice->u1_num_ref_idx_lx_active[0] = (UWORD8) u8_ref_idx_l0;
168
14.8k
            COPYTHECONTEXT("Slice Header SVC ext: num_ref_idx_l0_active_minus1",
169
14.8k
                           ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
170
14.8k
        }
171
172
0
        {
173
14.8k
            UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
174
14.8k
            COPYTHECONTEXT("Slice Header SVC ext: ref_pic_list_reordering_flag_l0",
175
14.8k
                           uc_refIdxReFlagL0);
176
177
14.8k
            ih264d_init_ref_idx_lx_p(ps_dec);
178
            /* Store the value for future slices in the same picture */
179
14.8k
            ps_dec->u1_num_ref_idx_lx_active_prev = ps_cur_slice->u1_num_ref_idx_lx_active[0];
180
181
            /* Modified temporarily */
182
14.8k
            if(uc_refIdxReFlagL0)
183
7.98k
            {
184
7.98k
                WORD8 ret;
185
7.98k
                ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
186
7.98k
                ret = ih264d_ref_idx_reordering(ps_dec, 0);
187
7.98k
                if(ret == -1) return ERROR_REFIDX_ORDER_T;
188
7.98k
                ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
189
7.98k
            }
190
6.90k
            else
191
6.90k
                ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
192
14.8k
        }
193
        /* Create refIdx to POC mapping */
194
14.8k
        {
195
14.8k
            void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
196
14.8k
            WORD8 idx;
197
14.8k
            struct pic_buffer_t *ps_pic;
198
199
14.8k
            pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
200
14.8k
            pui_map_ref_idx_to_poc_lx0[0] = 0;
201
14.8k
            pui_map_ref_idx_to_poc_lx0++;
202
47.9k
            for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
203
33.0k
            {
204
33.0k
                ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
205
33.0k
                pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
206
33.0k
            }
207
208
            /* Bug Fix Deblocking */
209
14.8k
            pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
210
14.8k
            pui_map_ref_idx_to_poc_lx1[0] = 0;
211
212
14.8k
            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
14.8k
            if(ps_dec->u4_num_cores >= 2)
244
9.55k
            {
245
9.55k
                WORD32 num_entries;
246
9.55k
                WORD32 size;
247
248
9.55k
                num_entries = MAX_FRAMES;
249
9.55k
                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
9.55k
                num_entries = ((2 * num_entries) + 1);
254
9.55k
                num_entries *= 2;
255
256
9.55k
                size = num_entries * sizeof(void *);
257
9.55k
                size += PAD_MAP_IDX_POC * sizeof(void *);
258
259
9.55k
                memcpy((void *) ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
260
9.55k
                       ps_dec->ppv_map_ref_idx_to_poc, size);
261
9.55k
            }
262
14.8k
        }
263
14.8k
        if(ps_pps->u1_wted_pred_flag)
264
2.05k
        {
265
2.05k
            if(!ps_nal_svc_ext->u1_no_inter_layer_pred_flag)
266
2.05k
            {
267
2.05k
                ps_svc_slice_params->u1_base_pred_weight_table_flag =
268
2.05k
                    ih264d_get_bit_h264(ps_bitstrm);
269
2.05k
                COPYTHECONTEXT("Slice Header SVC ext: u1_base_pred_weight_table_flag",
270
2.05k
                               ps_svc_slice_params->u1_base_pred_weight_table_flag);
271
2.05k
            }
272
273
2.05k
            if(ps_nal_svc_ext->u1_no_inter_layer_pred_flag ||
274
2.05k
               !ps_svc_slice_params->u1_base_pred_weight_table_flag)
275
1.51k
            {
276
1.51k
                ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
277
1.51k
                if(ret != OK) return ret;
278
279
1.43k
                ih264d_form_pred_weight_matrix(ps_dec);
280
1.43k
                ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
281
1.43k
            }
282
2.05k
        }
283
12.8k
        else
284
12.8k
        {
285
12.8k
            ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
286
12.8k
            ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
287
12.8k
        }
288
289
14.8k
        ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd;
290
291
14.8k
        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
14.8k
        if(ps_cur_slice->u1_nal_ref_idc != 0)
298
14.5k
        {
299
14.5k
            if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
300
14.4k
            {
301
14.4k
                dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
302
14.4k
                dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
303
14.4k
                UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
304
305
14.4k
                ps_pps->ps_sps = ps_dec->ps_cur_sps;
306
307
14.4k
                if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
308
13.6k
                    ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
309
310
14.4k
                i_temp = ih264d_read_mmco_commands(ps_dec);
311
312
14.4k
                ps_pps->ps_sps = ps_sps_tmp;
313
14.4k
                ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
314
315
14.4k
                if(i_temp < 0)
316
126
                {
317
126
                    return ERROR_DBP_MANAGER_T;
318
126
                }
319
14.2k
                ps_dec->u4_bitoffset = i_temp;
320
14.2k
            }
321
136
            else
322
136
                ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
323
324
14.4k
            if(!ps_sps_svc_ext->u1_slice_header_restriction_flag)
325
11.2k
            {
326
11.2k
                ps_svc_slice_params->u1_store_ref_base_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
327
11.2k
                COPYTHECONTEXT("SPS_SVC_EXT: u1_store_ref_base_pic_flag",
328
11.2k
                               ps_svc_slice_params->u1_store_ref_base_pic_flag);
329
330
11.2k
                if(0 != ps_svc_slice_params->u1_store_ref_base_pic_flag)
331
642
                {
332
642
                    return NOT_OK;
333
642
                }
334
10.6k
                if(((1 == ps_nal_svc_ext->u1_use_ref_base_pic_flag) ||
335
10.6k
                    (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
10.6k
            }
346
14.4k
        }
347
14.8k
    }
348
    /* G050 */
349
350
14.0k
    if(ps_pps->u1_entropy_coding_mode == CABAC)
351
2.28k
    {
352
2.28k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
353
354
2.28k
        if(u4_temp > MAX_CABAC_INIT_IDC)
355
143
        {
356
143
            return ERROR_INV_SLICE_HDR_T;
357
143
        }
358
2.14k
        ps_cur_slice->u1_cabac_init_idc = u4_temp;
359
2.14k
        COPYTHECONTEXT("Slice Header SVC ext: cabac_init_idc", ps_cur_slice->u1_cabac_init_idc);
360
2.14k
    }
361
362
    /* Read slice_qp_delta */
363
13.8k
    i8_temp = (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
364
13.8k
    if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
365
380
    {
366
380
        return ERROR_INV_RANGE_QP_T;
367
380
    }
368
13.5k
    ps_cur_slice->u1_slice_qp = (UWORD8) i8_temp;
369
13.5k
    COPYTHECONTEXT("Slice Header SVC ext: slice_qp_delta",
370
13.5k
                   (WORD8) (ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
371
372
13.5k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
373
5.57k
    {
374
5.57k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
375
5.57k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
376
356
        {
377
356
            return ERROR_INV_SLICE_HDR_T;
378
356
        }
379
380
5.21k
        COPYTHECONTEXT("Slice Header SVC ext: disable_deblocking_filter_idc", u4_temp);
381
5.21k
        ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
382
5.21k
        if(u4_temp != 1)
383
3.90k
        {
384
3.90k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
385
3.90k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
386
168
            {
387
168
                return ERROR_INV_SLICE_HDR_T;
388
168
            }
389
3.74k
            ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
390
3.74k
            COPYTHECONTEXT("Slice Header SVC ext: slice_alpha_c0_offset_div2",
391
3.74k
                           ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
392
393
3.74k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
394
3.74k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
395
174
            {
396
174
                return ERROR_INV_SLICE_HDR_T;
397
174
            }
398
3.56k
            ps_cur_slice->i1_slice_beta_offset = i_temp;
399
3.56k
            COPYTHECONTEXT("Slice Header SVC ext: slice_beta_offset_div2",
400
3.56k
                           ps_cur_slice->i1_slice_beta_offset >> 1);
401
3.56k
        }
402
1.31k
        else
403
1.31k
        {
404
1.31k
            ps_cur_slice->i1_slice_alpha_c0_offset = 0;
405
1.31k
            ps_cur_slice->i1_slice_beta_offset = 0;
406
1.31k
        }
407
5.21k
    }
408
7.94k
    else
409
7.94k
    {
410
7.94k
        ps_cur_slice->u1_disable_dblk_filter_idc = 0;
411
7.94k
        ps_cur_slice->i1_slice_alpha_c0_offset = 0;
412
7.94k
        ps_cur_slice->i1_slice_beta_offset = 0;
413
7.94k
    }
414
415
    /* add the remaining part of the code for svc extension from reference */
416
12.8k
    ret = isvcd_set_default_slice_header_ext(ps_svc_lyr_dec);
417
12.8k
    if(ret != OK)
418
0
    {
419
0
        return ERROR_INV_SLICE_HDR_T;
420
0
    }
421
422
12.8k
    ret = isvcd_parse_slice_header(ps_svc_lyr_dec);
423
12.8k
    if(ret != OK)
424
848
    {
425
848
        return ERROR_INV_SLICE_HDR_T;
426
848
    }
427
428
11.9k
    ps_dec->u1_slice_header_done = 2;
429
430
11.9k
    if(!ps_svc_slice_params->u1_slice_skip_flag)
431
11.3k
    {
432
11.3k
        if(ps_pps->u1_entropy_coding_mode)
433
1.88k
        {
434
1.88k
            SWITCHOFFTRACE;
435
1.88k
            SWITCHONTRACECABAC;
436
1.88k
            ps_svc_lyr_dec->pf_parse_inter_slice_svc_ext =
437
1.88k
                isvcd_parse_inter_slice_data_cabac_enh_lyr;
438
1.88k
            ps_svc_lyr_dec->pf_parse_inter_mb_svc_ext = isvcd_parse_pmb_cabac;
439
440
1.88k
            isvcd_init_cabac_contexts(P_SLICE, ps_dec);
441
442
1.88k
            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
1.88k
            else
445
1.88k
                ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
446
1.88k
        }
447
9.44k
        else
448
9.44k
        {
449
9.44k
            SWITCHONTRACE;
450
9.44k
            SWITCHOFFTRACECABAC;
451
9.44k
            ps_svc_lyr_dec->pf_parse_inter_slice_svc_ext =
452
9.44k
                isvcd_parse_inter_slice_data_cavlc_enh_lyr;
453
9.44k
            ps_svc_lyr_dec->pf_parse_inter_mb_svc_ext = isvcd_parse_pmb_cavlc;
454
455
9.44k
            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
9.44k
            else
460
9.44k
                ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
461
9.44k
        }
462
11.3k
    }
463
644
    else
464
644
    {
465
644
        return ERROR_FEATURE_UNAVAIL;
466
644
    }
467
468
11.3k
    ps_dec->u1_B = 0;
469
11.3k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = isvcd_mv_pred_ref_tfr_nby2_epmb;
470
11.3k
    ret = ps_svc_lyr_dec->pf_parse_inter_slice_svc_ext(ps_svc_lyr_dec, ps_cur_slice,
471
11.3k
                                                       u2_first_mb_in_slice);
472
11.3k
    if(ret != OK) return ret;
473
474
6.39k
    return OK;
475
11.3k
}
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
17.1k
{
506
17.1k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
507
508
17.1k
    UWORD32 uc_more_data_flag;
509
17.1k
    WORD32 i2_cur_mb_addr;
510
17.1k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
511
17.1k
    UWORD32 u1_mbaff;
512
17.1k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
513
17.1k
    const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
514
17.1k
    UWORD32 u1_slice_end = 0;
515
17.1k
    UWORD32 u1_tfr_n_mb = 0;
516
17.1k
    UWORD32 u1_decode_nmb = 0;
517
518
17.1k
    deblk_mb_t *ps_cur_deblk_mb;
519
17.1k
    dec_mb_info_t *ps_cur_mb_info;
520
17.1k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
521
17.1k
    UWORD32 u1_inter_mb_skip_type;
522
17.1k
    UWORD32 u1_inter_mb_type;
523
17.1k
    UWORD32 u1_deblk_mb_type;
524
17.1k
    UWORD32 u1_mb_threshold;
525
17.1k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
526
17.1k
    WORD32 ret = OK;
527
528
    /******************************************************/
529
    /* Initialisations specific to B or P slice           */
530
    /******************************************************/
531
17.1k
    if(ps_slice->u1_slice_type == P_SLICE)
532
7.85k
    {
533
7.85k
        u1_inter_mb_skip_type = CAB_P_SKIP;
534
7.85k
        u1_inter_mb_type = P_MB;
535
7.85k
        u1_deblk_mb_type = D_INTER_MB;
536
7.85k
        u1_mb_threshold = 5;
537
7.85k
    }
538
9.28k
    else  // B_SLICE
539
9.28k
    {
540
9.28k
        u1_inter_mb_skip_type = CAB_B_SKIP;
541
9.28k
        u1_inter_mb_type = B_MB;
542
9.28k
        u1_deblk_mb_type = D_B_SLICE;
543
9.28k
        u1_mb_threshold = 23;
544
9.28k
    }
545
546
    /******************************************************/
547
    /* Slice Level Initialisations                        */
548
    /******************************************************/
549
17.1k
    i2_cur_mb_addr = u2_first_mb_in_slice;
550
17.1k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
551
17.1k
    ih264d_update_qp(ps_dec, 0);
552
17.1k
    u1_mb_idx = ps_dec->u4_mb_idx;
553
17.1k
    u1_num_mbs = u1_mb_idx;
554
17.1k
    u1_num_mbsNby2 = 0;
555
17.1k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
556
17.1k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
557
17.1k
    uc_more_data_flag = 1;
558
559
    /* Initialisations specific to cabac */
560
17.1k
    if(ps_bitstrm->u4_ofst & 0x07)
561
13.6k
    {
562
13.6k
        ps_bitstrm->u4_ofst += 8;
563
13.6k
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
564
13.6k
    }
565
566
17.1k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
567
17.1k
    if(ret != OK) return ret;
568
569
15.6k
    ps_dec->i1_prev_mb_qp_delta = 0;
570
571
1.51M
    while(!u1_slice_end)
572
1.50M
    {
573
1.50M
        UWORD8 u1_mb_type;
574
1.50M
        UWORD32 u4_mb_skip;
575
576
1.50M
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
577
578
1.50M
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
579
6.67k
        {
580
6.67k
            break;
581
6.67k
        }
582
583
1.50M
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
584
1.50M
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
585
586
1.50M
        ps_cur_mb_info->u1_Mux = 0;
587
1.50M
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
588
1.50M
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
589
1.50M
        ps_cur_mb_info->u1_end_of_slice = 0;
590
591
        /* Storing Default partition info */
592
1.50M
        ps_parse_mb_data->u1_num_part = 1;
593
1.50M
        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
1.50M
        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
1.50M
        ps_cur_mb_info->u1_tran_form8x8 = 0;
605
1.50M
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
606
607
        /***************************************************************/
608
        /* Set the deblocking parameters for this MB                   */
609
        /***************************************************************/
610
1.50M
        if(ps_dec->u4_app_disable_deblk_frm == 0)
611
1.50M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
612
1.50M
                                             ps_dec->u1_mb_ngbr_availablity,
613
1.50M
                                             ps_dec->u1_cur_mb_fld_dec_flag);
614
615
1.50M
        if(u4_mb_skip)
616
1.30M
        {
617
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
618
1.30M
            memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t));
619
1.30M
            ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type;
620
621
1.30M
            MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
622
623
1.30M
            *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
624
1.30M
            *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
625
1.30M
            ps_dec->i1_prev_mb_qp_delta = 0;
626
1.30M
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
627
1.30M
            ps_cur_mb_info->u1_cbp = 0;
628
629
1.30M
            {
630
                /* Storing Skip partition info */
631
1.30M
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
632
1.30M
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
633
1.30M
                ps_part_info->u1_sub_mb_num = 0;
634
1.30M
                ps_dec->ps_part++;
635
1.30M
            }
636
637
            /* Update Nnzs */
638
1.30M
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC);
639
1.30M
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
640
1.30M
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
641
1.30M
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
642
1.30M
            if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
643
525k
            {
644
525k
                ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
645
525k
            }
646
1.30M
        }
647
199k
        else
648
199k
        {
649
            /* Macroblock Layer Begins */
650
            /* Decode the u1_mb_type */
651
199k
            u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec);
652
199k
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
653
199k
            if(u1_mb_type > (25 + u1_mb_threshold)) return ERROR_MB_TYPE;
654
655
            /* Parse Macroblock Data */
656
199k
            if(u1_mb_type < u1_mb_threshold)
657
193k
            {
658
193k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
659
193k
                *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6;
660
661
193k
                ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, u1_num_mbsNby2);
662
193k
                if(ret != OK) return ret;
663
188k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
664
188k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
665
188k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
666
36.1k
                {
667
36.1k
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
668
36.1k
                }
669
188k
            }
670
6.14k
            else
671
6.14k
            {
672
                /* Storing Intra partition info */
673
6.14k
                ps_parse_mb_data->u1_num_part = 0;
674
6.14k
                ps_parse_mb_data->u4_isI_mb = 1;
675
676
6.14k
                if((25 + u1_mb_threshold) == u1_mb_type)
677
214
                {
678
                    /* I_PCM_MB */
679
214
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
680
214
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
681
214
                    if(ret != OK) return ret;
682
67
                    ps_cur_deblk_mb->u1_mb_qp = 0;
683
67
                }
684
5.93k
                else
685
5.93k
                {
686
5.93k
                    if(u1_mb_type == u1_mb_threshold)
687
4.16k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
688
1.77k
                    else
689
1.77k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
690
691
5.93k
                    ret = ih264d_parse_imb_cabac(ps_dec, ps_cur_mb_info,
692
5.93k
                                                 (UWORD8) (u1_mb_type - u1_mb_threshold));
693
5.93k
                    if(ret != OK) return ret;
694
5.34k
                    ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
695
5.34k
                }
696
5.41k
                ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
697
5.41k
            }
698
199k
        }
699
700
1.49M
        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
1.49M
        if(u1_mbaff)
706
0
        {
707
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
708
0
        }
709
710
1.49M
        if(ps_cur_mb_info->u1_topmb && u1_mbaff)
711
0
            uc_more_data_flag = 1;
712
1.49M
        else
713
1.49M
        {
714
1.49M
            uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
715
1.49M
            uc_more_data_flag = !uc_more_data_flag;
716
1.49M
            COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
717
1.49M
        }
718
719
1.49M
        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
1.49M
        i2_cur_mb_addr++;
728
1.49M
        u1_num_mbs++;
729
1.49M
        u1_num_mbsNby2++;
730
1.49M
        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
1.49M
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
738
1.49M
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
739
1.49M
        u1_slice_end = !uc_more_data_flag;
740
1.49M
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
741
1.49M
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
742
1.49M
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
743
744
1.49M
        if(u1_decode_nmb)
745
110k
        {
746
110k
            ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
747
110k
            u1_num_mbsNby2 = 0;
748
110k
            {
749
110k
                ps_parse_mb_data = ps_dec->ps_parse_mb_data;
750
110k
                ps_dec->ps_part = ps_dec->ps_parse_part_params;
751
110k
            }
752
110k
            if(ret != OK) return ret;
753
110k
        }
754
755
1.49M
        if(u1_decode_nmb)
756
110k
        {
757
110k
            if(ps_dec->u1_separate_parse)
758
29.2k
            {
759
29.2k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
760
29.2k
                                     u1_end_of_row);
761
29.2k
                ps_dec->ps_nmb_info += u1_num_mbs;
762
29.2k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
763
29.2k
            }
764
80.8k
            else
765
80.8k
            {
766
80.8k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
767
34.8k
                {
768
34.8k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
769
34.8k
                                                u1_tfr_n_mb, u1_end_of_row);
770
34.8k
                }
771
46.0k
                else
772
46.0k
                {
773
46.0k
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
774
46.0k
                                                        u1_num_mbs_next, u1_tfr_n_mb,
775
46.0k
                                                        u1_end_of_row);
776
46.0k
                }
777
80.8k
            }
778
110k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
779
110k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
780
110k
            u1_mb_idx = u1_num_mbs;
781
110k
            ps_dec->u4_mb_idx = u1_num_mbs;
782
110k
        }
783
1.49M
    }
784
785
10.0k
    ps_dec->u4_num_mbs_cur_nmb = 0;
786
10.0k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
787
788
10.0k
    return ret;
789
15.6k
}
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
57.1k
{
821
57.1k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
822
57.1k
    UWORD32 uc_more_data_flag;
823
57.1k
    WORD32 i2_cur_mb_addr;
824
57.1k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
825
57.1k
    UWORD32 i2_mb_skip_run;
826
57.1k
    UWORD32 u1_read_mb_type;
827
828
57.1k
    UWORD32 u1_mbaff;
829
57.1k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
830
57.1k
    const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
831
57.1k
    UWORD32 u1_slice_end = 0;
832
57.1k
    UWORD32 u1_tfr_n_mb = 0;
833
57.1k
    UWORD32 u1_decode_nmb = 0;
834
835
57.1k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
836
57.1k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
837
57.1k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
838
57.1k
    deblk_mb_t *ps_cur_deblk_mb;
839
57.1k
    dec_mb_info_t *ps_cur_mb_info;
840
57.1k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
841
57.1k
    UWORD32 u1_inter_mb_type;
842
57.1k
    UWORD32 u1_deblk_mb_type;
843
57.1k
    UWORD32 u1_mb_threshold;
844
57.1k
    WORD32 ret = OK;
845
846
    /******************************************************/
847
    /* Initialisations specific to B or P slice           */
848
    /******************************************************/
849
57.1k
    if(ps_slice->u1_slice_type == P_SLICE)
850
44.2k
    {
851
44.2k
        u1_inter_mb_type = P_MB;
852
44.2k
        u1_deblk_mb_type = D_INTER_MB;
853
44.2k
        u1_mb_threshold = 5;
854
44.2k
    }
855
12.8k
    else  // B_SLICE
856
12.8k
    {
857
12.8k
        u1_inter_mb_type = B_MB;
858
12.8k
        u1_deblk_mb_type = D_B_SLICE;
859
12.8k
        u1_mb_threshold = 23;
860
12.8k
    }
861
862
    /******************************************************/
863
    /* Slice Level Initialisations                        */
864
    /******************************************************/
865
57.1k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
866
57.1k
    ih264d_update_qp(ps_dec, 0);
867
57.1k
    u1_mb_idx = ps_dec->u4_mb_idx;
868
57.1k
    u1_num_mbs = u1_mb_idx;
869
870
57.1k
    u1_num_mbsNby2 = 0;
871
57.1k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
872
57.1k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
873
57.1k
    i2_mb_skip_run = 0;
874
57.1k
    uc_more_data_flag = 1;
875
57.1k
    u1_read_mb_type = 0;
876
877
1.15M
    while(!u1_slice_end)
878
1.13M
    {
879
1.13M
        UWORD8 u1_mb_type;
880
881
1.13M
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
882
1.13M
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
883
18.1k
        {
884
18.1k
            break;
885
18.1k
        }
886
887
1.11M
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
888
1.11M
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
889
1.11M
        ps_cur_mb_info->u1_Mux = 0;
890
1.11M
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
891
1.11M
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
892
893
1.11M
        ps_cur_mb_info->u1_end_of_slice = 0;
894
895
        /* Storing Default partition info */
896
1.11M
        ps_parse_mb_data->u1_num_part = 1;
897
1.11M
        ps_parse_mb_data->u4_isI_mb = 0;
898
899
1.11M
        if((!i2_mb_skip_run) && (!u1_read_mb_type))
900
172k
        {
901
            // Inlined ih264d_uev
902
172k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
903
172k
            UWORD32 u4_word, u4_ldz;
904
905
            /***************************************************************/
906
            /* Find leading zeros in next 32 bits                          */
907
            /***************************************************************/
908
172k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
909
910
172k
            u4_ldz = CLZ(u4_word);
911
912
            /* Flush the ps_bitstrm */
913
172k
            u4_bitstream_offset += (u4_ldz + 1);
914
            /* Read the suffix from the ps_bitstrm */
915
172k
            u4_word = 0;
916
172k
            if(u4_ldz)
917
65.9k
            {
918
65.9k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
919
65.9k
            }
920
172k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
921
172k
            i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1);
922
            // Inlined ih264d_uev
923
172k
            COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run);
924
172k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
925
172k
            u1_read_mb_type = uc_more_data_flag;
926
172k
        }
927
928
        /***************************************************************/
929
        /* Get the required information for decoding of MB            */
930
        /* mb_x, mb_y , neighbour availablity,                              */
931
        /***************************************************************/
932
1.11M
        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.11M
        if(ps_dec->u4_app_disable_deblk_frm == 0)
938
1.11M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
939
1.11M
                                             ps_dec->u1_mb_ngbr_availablity,
940
1.11M
                                             ps_dec->u1_cur_mb_fld_dec_flag);
941
942
1.11M
        if(i2_mb_skip_run)
943
966k
        {
944
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
945
966k
            ps_dec->i1_prev_mb_qp_delta = 0;
946
966k
            ps_dec->u1_sub_mb_num = 0;
947
966k
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
948
966k
            ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
949
966k
            ps_cur_mb_info->u1_cbp = 0;
950
951
966k
            {
952
                /* Storing Skip partition info */
953
966k
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
954
966k
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
955
966k
                ps_part_info->u1_sub_mb_num = 0;
956
966k
                ps_dec->ps_part++;
957
966k
            }
958
959
            /* Update Nnzs */
960
966k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
961
962
966k
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
963
966k
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
964
965
966k
            if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
966
181k
            {
967
181k
                ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
968
181k
            }
969
970
966k
            i2_mb_skip_run--;
971
966k
        }
972
148k
        else
973
148k
        {
974
148k
            u1_read_mb_type = 0;
975
            /**************************************************************/
976
            /* Macroblock Layer Begins, Decode the u1_mb_type                */
977
            /**************************************************************/
978
148k
            {
979
148k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
980
148k
                UWORD32 u4_word, u4_ldz, u4_temp;
981
982
                // Inlined ih264d_uev
983
                /***************************************************************/
984
                /* Find leading zeros in next 32 bits                          */
985
                /***************************************************************/
986
148k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
987
148k
                u4_ldz = CLZ(u4_word);
988
                /* Flush the ps_bitstrm */
989
148k
                u4_bitstream_offset += (u4_ldz + 1);
990
                /* Read the suffix from the ps_bitstrm */
991
148k
                u4_word = 0;
992
148k
                if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
993
148k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
994
148k
                u4_temp = ((1 << u4_ldz) + u4_word - 1);
995
                // Inlined ih264d_uev
996
148k
                if(u4_temp > (UWORD32) (25 + u1_mb_threshold)) return ERROR_MB_TYPE;
997
147k
                u1_mb_type = u4_temp;
998
147k
                COPYTHECONTEXT("u1_mb_type", u1_mb_type);
999
147k
            }
1000
0
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
1001
1002
            /**************************************************************/
1003
            /* Parse Macroblock data                                      */
1004
            /**************************************************************/
1005
147k
            if(u1_mb_type < u1_mb_threshold)
1006
121k
            {
1007
121k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1008
1009
121k
                ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, u1_num_mbsNby2);
1010
121k
                if(ret != OK) return ret;
1011
110k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1012
1013
110k
                if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
1014
40.2k
                {
1015
40.2k
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1016
40.2k
                }
1017
110k
            }
1018
26.3k
            else
1019
26.3k
            {
1020
                /* Storing Intra partition info */
1021
26.3k
                ps_parse_mb_data->u1_num_part = 0;
1022
26.3k
                ps_parse_mb_data->u4_isI_mb = 1;
1023
1024
26.3k
                if((25 + u1_mb_threshold) == u1_mb_type)
1025
1.00k
                {
1026
                    /* I_PCM_MB */
1027
1.00k
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1028
1.00k
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1029
1.00k
                    if(ret != OK) return ret;
1030
1.00k
                    ps_dec->u1_qp = 0;
1031
1.00k
                }
1032
25.3k
                else
1033
25.3k
                {
1034
25.3k
                    ret = ih264d_parse_imb_cavlc(ps_dec, ps_cur_mb_info, u1_num_mbs,
1035
25.3k
                                                 (UWORD8) (u1_mb_type - u1_mb_threshold));
1036
25.3k
                    if(ret != OK) return ret;
1037
25.3k
                }
1038
1039
23.4k
                ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1040
23.4k
            }
1041
134k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1042
134k
        }
1043
1.10M
        ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1044
1045
1.10M
        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.10M
        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.10M
        i2_cur_mb_addr++;
1063
1064
1.10M
        u1_num_mbs++;
1065
1.10M
        u1_num_mbsNby2++;
1066
1.10M
        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.10M
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1074
1.10M
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1075
1.10M
        u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run));
1076
1.10M
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
1077
1.10M
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1078
1.10M
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1079
1080
1.10M
        if(u1_decode_nmb)
1081
210k
        {
1082
210k
            ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1083
210k
            u1_num_mbsNby2 = 0;
1084
210k
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1085
210k
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
1086
210k
            if(ret != OK) return ret;
1087
210k
        }
1088
1089
1.10M
        if(u1_decode_nmb)
1090
210k
        {
1091
210k
            if(ps_dec->u1_separate_parse)
1092
42.8k
            {
1093
42.8k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1094
42.8k
                                     u1_end_of_row);
1095
42.8k
                ps_dec->ps_nmb_info += u1_num_mbs;
1096
42.8k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1097
42.8k
            }
1098
167k
            else
1099
167k
            {
1100
167k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1101
54.6k
                {
1102
54.6k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
1103
54.6k
                                                u1_tfr_n_mb, u1_end_of_row);
1104
54.6k
                }
1105
112k
                else
1106
112k
                {
1107
112k
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1108
112k
                                                        u1_num_mbs_next, u1_tfr_n_mb,
1109
112k
                                                        u1_end_of_row);
1110
112k
                }
1111
167k
            }
1112
210k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1113
210k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1114
210k
            u1_mb_idx = u1_num_mbs;
1115
210k
            ps_dec->u4_mb_idx = u1_num_mbs;
1116
210k
        }
1117
1.10M
    }
1118
1119
42.6k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1120
42.6k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1121
1122
42.6k
    return ret;
1123
57.1k
}
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
4.04k
{
1155
4.04k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1156
4.04k
    UWORD32 uc_more_data_flag;
1157
4.04k
    WORD32 i2_cur_mb_addr;
1158
4.04k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
1159
4.04k
    UWORD32 u1_mbaff;
1160
4.04k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
1161
4.04k
    const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1162
4.04k
    UWORD32 u1_slice_end = 0;
1163
4.04k
    UWORD32 u1_tfr_n_mb = 0;
1164
4.04k
    UWORD32 u1_decode_nmb = 0;
1165
1166
4.04k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1167
4.04k
    deblk_mb_t *ps_cur_deblk_mb;
1168
4.04k
    dec_mb_info_t *ps_cur_mb_info;
1169
4.04k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1170
1171
4.04k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1172
4.04k
    UWORD32 u1_inter_mb_skip_type;
1173
4.04k
    UWORD32 u1_inter_mb_type;
1174
4.04k
    UWORD32 u1_deblk_mb_type;
1175
4.04k
    UWORD32 u1_mb_threshold;
1176
4.04k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1177
4.04k
    decoding_envirnoment_t *ps_cab_env = NULL;
1178
4.04k
    WORD32 ret = OK;
1179
1180
4.04k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1181
1182
    /******************************************************/
1183
    /* Initialisations specific to B or P slice           */
1184
    /******************************************************/
1185
4.04k
    if(ps_slice->u1_slice_type == P_SLICE)
1186
1.88k
    {
1187
1.88k
        u1_inter_mb_skip_type = CAB_P_SKIP;
1188
1.88k
        u1_inter_mb_type = P_MB;
1189
1.88k
        u1_deblk_mb_type = D_INTER_MB;
1190
1.88k
        u1_mb_threshold = 5;
1191
1.88k
    }
1192
2.16k
    else  // EB_SLICE
1193
2.16k
    {
1194
2.16k
        u1_inter_mb_skip_type = CAB_B_SKIP;
1195
2.16k
        u1_inter_mb_type = B_MB;
1196
2.16k
        u1_deblk_mb_type = D_B_SLICE;
1197
2.16k
        u1_mb_threshold = 23;
1198
2.16k
    }
1199
1200
    /******************************************************/
1201
    /* Slice Level Initialisations                        */
1202
    /******************************************************/
1203
4.04k
    i2_cur_mb_addr = u2_first_mb_in_slice;
1204
4.04k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1205
4.04k
    ih264d_update_qp(ps_dec, 0);
1206
4.04k
    u1_mb_idx = ps_dec->u4_mb_idx;
1207
4.04k
    u1_num_mbs = u1_mb_idx;
1208
4.04k
    u1_num_mbsNby2 = 0;
1209
4.04k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1210
4.04k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1211
4.04k
    uc_more_data_flag = 1;
1212
1213
    /* Initialisations specific to cabac */
1214
4.04k
    if(ps_bitstrm->u4_ofst & 0x07)
1215
3.44k
    {
1216
3.44k
        ps_bitstrm->u4_ofst += 8;
1217
3.44k
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
1218
3.44k
    }
1219
1220
4.04k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
1221
4.04k
    if(ret != OK) return ret;
1222
1223
3.95k
    ps_cab_env = &ps_dec->s_cab_dec_env;
1224
3.95k
    ps_dec->i1_prev_mb_qp_delta = 0;
1225
1226
70.7k
    while(!u1_slice_end)
1227
70.3k
    {
1228
70.3k
        UWORD8 u1_mb_type;
1229
70.3k
        UWORD32 u4_mb_skip;
1230
70.3k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1231
70.3k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1232
773
        {
1233
773
            break;
1234
773
        }
1235
1236
69.5k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1237
69.5k
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1238
69.5k
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1239
69.5k
        ps_cur_mb_info->u1_Mux = 0;
1240
69.5k
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1241
69.5k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1242
69.5k
        ps_cur_mb_info->u1_end_of_slice = 0;
1243
1244
        /* Storing Default partition info */
1245
69.5k
        ps_parse_mb_data->u1_num_part = 1;
1246
69.5k
        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
69.5k
        u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1);
1253
69.5k
        ps_svc_cur_mb_info->u1_crop_window_flag =
1254
69.5k
            *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1255
69.5k
              (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
69.5k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
1260
69.5k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1261
1262
        /***************************************************************/
1263
        /* Set the deblocking parameters for this MB                   */
1264
        /***************************************************************/
1265
69.5k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
1266
69.5k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1267
69.5k
                                             ps_dec->u1_mb_ngbr_availablity,
1268
69.5k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
1269
1270
69.5k
        if(u4_mb_skip)
1271
23.1k
        {
1272
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1273
23.1k
            memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t));
1274
23.1k
            ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type;
1275
1276
23.1k
            MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
1277
1278
23.1k
            *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
1279
23.1k
            *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
1280
1281
23.1k
            ps_dec->i1_prev_mb_qp_delta = 0;
1282
23.1k
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
1283
23.1k
            ps_cur_mb_info->u1_cbp = 0;
1284
23.1k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1285
23.1k
            ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
1286
23.1k
            ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
1287
23.1k
            ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
1288
1289
23.1k
            {
1290
                /* Storing Skip partition info */
1291
23.1k
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
1292
23.1k
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1293
23.1k
                ps_part_info->u1_sub_mb_num = 0;
1294
23.1k
                ps_dec->ps_part++;
1295
23.1k
            }
1296
1297
            /* Update Nnzs */
1298
23.1k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC);
1299
23.1k
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1300
23.1k
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1301
23.1k
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1302
23.1k
            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
23.1k
        }
1307
46.4k
        else
1308
46.4k
        {
1309
            /* Variables for handling Cabac contexts */
1310
46.4k
            UWORD8 *pu1_cur_svc_base_mode_flag;
1311
46.4k
            UWORD8 u1_left_svc_base_mode_flag;
1312
46.4k
            UWORD8 u1_top_svc_base_mode_flag;
1313
1314
46.4k
            UWORD32 u4_a, u4_b, u4_ctxt_inc;
1315
46.4k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1316
            /* Macroblock Layer Begins */
1317
46.4k
            if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1318
45.9k
               ps_svc_slice_params->u1_adaptive_base_mode_flag)
1319
7.61k
            {
1320
7.61k
                pu1_cur_svc_base_mode_flag =
1321
7.61k
                    ps_svc_lyr_dec->pu1_svc_base_mode_flag + ps_cur_mb_info->u2_mbx;
1322
7.61k
                pu1_cur_svc_base_mode_flag +=
1323
7.61k
                    ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride;
1324
1325
7.61k
                u1_left_svc_base_mode_flag = 0;
1326
7.61k
                if(ps_dec->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
1327
5.67k
                    u1_left_svc_base_mode_flag = *(pu1_cur_svc_base_mode_flag - 1);
1328
1329
7.61k
                u1_top_svc_base_mode_flag = 0;
1330
7.61k
                if(ps_dec->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
1331
6.58k
                    u1_top_svc_base_mode_flag =
1332
6.58k
                        *(pu1_cur_svc_base_mode_flag -
1333
6.58k
                          ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride);
1334
1335
7.61k
                u4_a = 1;
1336
7.61k
                u4_b = 1;
1337
1338
7.61k
                if(u1_top_svc_base_mode_flag)
1339
2.65k
                {
1340
2.65k
                    u4_a = 0;
1341
2.65k
                }
1342
1343
7.61k
                if(u1_left_svc_base_mode_flag)
1344
2.37k
                {
1345
2.37k
                    u4_b = 0;
1346
2.37k
                }
1347
1348
7.61k
                u4_ctxt_inc = u4_a + u4_b;
1349
7.61k
                ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_decode_bin(
1350
7.61k
                    u4_ctxt_inc, ps_svc_lyr_dec->ps_base_mode_flag, ps_bitstrm, ps_cab_env);
1351
7.61k
                COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_svc_cur_mb_info->u1_base_mode_flag);
1352
7.61k
                *pu1_cur_svc_base_mode_flag = ps_svc_cur_mb_info->u1_base_mode_flag;
1353
7.61k
            }
1354
38.8k
            else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1355
38.3k
            {
1356
38.3k
                ps_svc_cur_mb_info->u1_base_mode_flag =
1357
38.3k
                    ps_svc_slice_params->u1_default_base_mode_flag;
1358
38.3k
            }
1359
1360
46.4k
            if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1361
26.2k
            {
1362
                /* Decode the u1_mb_type */
1363
26.2k
                u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec);
1364
26.2k
                ps_cur_mb_info->u1_mb_type = u1_mb_type;
1365
26.2k
                if(u1_mb_type > (25 + u1_mb_threshold)) return ERROR_MB_TYPE;
1366
26.2k
                COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1367
26.2k
            }
1368
20.1k
            else
1369
20.1k
            {
1370
                // default intialization for Base mode flag : reserved
1371
20.1k
                ps_dec->ps_part += MAX_NUM_MB_PART;
1372
1373
20.1k
                ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
1374
20.1k
                ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
1375
20.1k
                ps_cur_mb_info->u1_mb_type = MB_INFER;
1376
20.1k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1377
20.1k
                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
20.1k
                if(ps_svc_slice_params->u1_adaptive_residual_prediction_flag &&
1384
16.9k
                   ps_svc_cur_mb_info->u1_crop_window_flag)
1385
16.9k
                {
1386
16.9k
                    ps_svc_cur_mb_info->u1_residual_prediction_flag = ih264d_decode_bin(
1387
16.9k
                        0, ps_svc_lyr_dec->ps_residual_prediction_flag, ps_bitstrm, ps_cab_env);
1388
16.9k
                    COPYTHECONTEXT("SVC ext: u1_residual_prediction_flag",
1389
16.9k
                                   ps_svc_cur_mb_info->u1_residual_prediction_flag);
1390
16.9k
                }
1391
3.25k
                else
1392
3.25k
                {
1393
                    /*residual flag inference code */
1394
3.25k
                    if(1 == ps_svc_cur_mb_info->u1_crop_window_flag)
1395
3.25k
                    {
1396
3.25k
                        ps_svc_cur_mb_info->u1_residual_prediction_flag =
1397
3.25k
                            ps_svc_slice_params->u1_default_residual_prediction_flag;
1398
3.25k
                    }
1399
0
                    else
1400
0
                    {
1401
0
                        ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
1402
0
                    }
1403
3.25k
                }
1404
20.1k
            }
1405
1406
            /* Parse Macroblock Data */
1407
46.4k
            u1_mb_type = ps_cur_mb_info->u1_mb_type;
1408
46.4k
            if(u1_mb_type < u1_mb_threshold)
1409
23.9k
            {
1410
23.9k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1411
23.9k
                *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6;
1412
1413
23.9k
                ret = ps_svc_lyr_dec->pf_parse_inter_mb_svc_ext(
1414
23.9k
                    ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, u1_num_mbs, u1_num_mbsNby2);
1415
23.9k
                if(ret != OK) return ret;
1416
22.1k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1417
22.1k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1418
22.1k
                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
22.1k
            }
1423
22.4k
            else
1424
22.4k
            {
1425
                /* Storing Intra partition info */
1426
22.4k
                ps_parse_mb_data->u1_num_part = 0;
1427
22.4k
                ps_parse_mb_data->u4_isI_mb = 1;
1428
1429
22.4k
                if((25 + u1_mb_threshold) == u1_mb_type)
1430
198
                {
1431
                    /* I_PCM_MB */
1432
198
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1433
198
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1434
198
                    if(ret != OK) return ret;
1435
66
                    ps_cur_deblk_mb->u1_mb_qp = 0;
1436
66
                    ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1437
66
                }
1438
22.2k
                else
1439
22.2k
                {
1440
22.2k
                    if(u1_mb_type == u1_mb_threshold)
1441
729
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
1442
21.5k
                    else
1443
21.5k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
1444
1445
22.2k
                    ret = isvcd_parse_imb_cabac(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1446
22.2k
                                                (UWORD8) (u1_mb_type - u1_mb_threshold));
1447
22.2k
                    if(ret != OK) return ret;
1448
21.4k
                    ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1449
21.4k
                    if(0 == ps_svc_cur_mb_info->u1_base_mode_flag)
1450
1.95k
                    {
1451
1.95k
                        ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1452
1.95k
                    }
1453
21.4k
                }
1454
21.5k
                ps_parse_mb_data->u4_isI_mb = !ps_svc_cur_mb_info->u1_base_mode_flag;
1455
21.5k
            }
1456
46.4k
        }
1457
1458
66.8k
        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
66.8k
        if(u1_mbaff)
1464
0
        {
1465
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1466
0
        }
1467
1468
66.8k
        if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1469
0
            uc_more_data_flag = 1;
1470
66.8k
        else
1471
66.8k
        {
1472
66.8k
            uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
1473
66.8k
            uc_more_data_flag = !uc_more_data_flag;
1474
66.8k
            COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
1475
66.8k
        }
1476
1477
66.8k
        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
66.8k
        i2_cur_mb_addr++;
1486
66.8k
        u1_num_mbs++;
1487
66.8k
        u1_num_mbsNby2++;
1488
66.8k
        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
66.8k
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1496
66.8k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1497
66.8k
        u1_slice_end = !uc_more_data_flag;
1498
66.8k
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
1499
66.8k
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1500
66.8k
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1501
1502
66.8k
        if(u1_decode_nmb)
1503
16.2k
        {
1504
16.2k
            ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1505
16.2k
            u1_num_mbsNby2 = 0;
1506
16.2k
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1507
16.2k
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
1508
16.2k
            if(ret != OK) return ret;
1509
16.2k
        }
1510
1511
66.7k
        if(u1_decode_nmb)
1512
16.2k
        {
1513
16.2k
            if(ps_dec->u1_separate_parse)
1514
10.7k
            {
1515
10.7k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1516
10.7k
                                     u1_end_of_row);
1517
10.7k
                ps_dec->ps_nmb_info += u1_num_mbs;
1518
10.7k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1519
10.7k
            }
1520
5.45k
            else
1521
5.45k
            {
1522
5.45k
                ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1523
5.45k
                                                              u1_num_mbs_next, u1_tfr_n_mb,
1524
5.45k
                                                              u1_end_of_row);
1525
5.45k
                if(ret != OK) return ret;
1526
5.45k
            }
1527
16.2k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1528
16.2k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1529
16.2k
            u1_mb_idx = u1_num_mbs;
1530
16.2k
            ps_dec->u4_mb_idx = u1_num_mbs;
1531
16.2k
        }
1532
66.7k
    }
1533
1534
1.15k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1535
1.15k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1536
1537
1.15k
    return ret;
1538
3.95k
}
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
15.3k
{
1570
15.3k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1571
15.3k
    UWORD32 uc_more_data_flag;
1572
15.3k
    WORD32 i2_cur_mb_addr;
1573
15.3k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
1574
15.3k
    UWORD32 i2_mb_skip_run;
1575
15.3k
    UWORD32 u1_read_mb_type;
1576
1577
15.3k
    UWORD32 u1_mbaff;
1578
15.3k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
1579
15.3k
    const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1580
15.3k
    UWORD32 u1_slice_end = 0;
1581
15.3k
    UWORD32 u1_tfr_n_mb = 0;
1582
15.3k
    UWORD32 u1_decode_nmb = 0;
1583
1584
15.3k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1585
15.3k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1586
15.3k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1587
1588
15.3k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1589
1590
15.3k
    deblk_mb_t *ps_cur_deblk_mb;
1591
15.3k
    dec_mb_info_t *ps_cur_mb_info;
1592
15.3k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1593
1594
15.3k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1595
15.3k
    UWORD32 u1_inter_mb_type;
1596
15.3k
    UWORD32 u1_deblk_mb_type;
1597
15.3k
    UWORD32 u1_mb_threshold;
1598
15.3k
    WORD32 ret = OK;
1599
1600
15.3k
    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
15.3k
    if(ps_slice->u1_slice_type == P_SLICE)
1607
9.44k
    {
1608
9.44k
        u1_inter_mb_type = P_MB;
1609
9.44k
        u1_deblk_mb_type = D_INTER_MB;
1610
9.44k
        u1_mb_threshold = 5;
1611
9.44k
    }
1612
5.90k
    else
1613
5.90k
    {
1614
5.90k
        u1_inter_mb_type = B_MB;
1615
5.90k
        u1_deblk_mb_type = D_B_SLICE;
1616
5.90k
        u1_mb_threshold = 23;
1617
5.90k
    }
1618
1619
    /******************************************************/
1620
    /* Slice Level Initialisations                        */
1621
    /******************************************************/
1622
15.3k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1623
15.3k
    ih264d_update_qp(ps_dec, 0);
1624
15.3k
    u1_mb_idx = ps_dec->u4_mb_idx;
1625
15.3k
    u1_num_mbs = u1_mb_idx;
1626
15.3k
    u1_num_mbsNby2 = 0;
1627
15.3k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1628
15.3k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1629
15.3k
    i2_mb_skip_run = 0;
1630
15.3k
    uc_more_data_flag = 1;
1631
15.3k
    u1_read_mb_type = 0;
1632
1633
306k
    while(!u1_slice_end)
1634
302k
    {
1635
302k
        UWORD8 u1_mb_type;
1636
1637
302k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1638
1639
302k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1640
5.64k
        {
1641
5.64k
            break;
1642
5.64k
        }
1643
1644
297k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1645
297k
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1646
297k
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1647
1648
297k
        ps_cur_mb_info->u1_Mux = 0;
1649
297k
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1650
297k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1651
1652
297k
        ps_cur_mb_info->u1_end_of_slice = 0;
1653
1654
        /* Storing Default partition info */
1655
297k
        ps_parse_mb_data->u1_num_part = 1;
1656
297k
        ps_parse_mb_data->u4_isI_mb = 0;
1657
1658
297k
        if((!i2_mb_skip_run) && (!u1_read_mb_type))
1659
199k
        {
1660
199k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1661
199k
            UWORD32 u4_word, u4_ldz;
1662
1663
            /***************************************************************/
1664
            /* Find leading zeros in next 32 bits                          */
1665
            /***************************************************************/
1666
199k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1667
1668
199k
            u4_ldz = CLZ(u4_word);
1669
1670
            /* Flush the ps_bitstrm */
1671
199k
            u4_bitstream_offset += (u4_ldz + 1);
1672
            /* Read the suffix from the ps_bitstrm */
1673
199k
            u4_word = 0;
1674
199k
            if(u4_ldz)
1675
24.1k
            {
1676
24.1k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1677
24.1k
            }
1678
199k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
1679
199k
            i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1);
1680
1681
199k
            COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run);
1682
199k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1683
199k
            u1_read_mb_type = uc_more_data_flag;
1684
199k
        }
1685
1686
        /***************************************************************/
1687
        /* Get the required information for decoding of MB             */
1688
        /* mb_x, mb_y , neighbour availablity,                         */
1689
        /***************************************************************/
1690
297k
        ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1691
297k
        ps_svc_cur_mb_info->u1_crop_window_flag =
1692
297k
            *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1693
297k
              (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1694
        /***************************************************************/
1695
        /* Set the deblocking parameters for this MB                   */
1696
        /***************************************************************/
1697
297k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
1698
297k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1699
297k
                                             ps_dec->u1_mb_ngbr_availablity,
1700
297k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
1701
1702
297k
        if(i2_mb_skip_run)
1703
102k
        {
1704
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1705
102k
            ps_dec->i1_prev_mb_qp_delta = 0;
1706
102k
            ps_dec->u1_sub_mb_num = 0;
1707
102k
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
1708
102k
            ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
1709
102k
            ps_cur_mb_info->u1_cbp = 0;
1710
102k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1711
102k
            ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
1712
102k
            ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
1713
102k
            ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
1714
1715
102k
            {
1716
                /* Storing Skip partition info */
1717
102k
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
1718
102k
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1719
102k
                ps_part_info->u1_sub_mb_num = 0;
1720
102k
                ps_dec->ps_part++;
1721
102k
            }
1722
1723
            /* Update Nnzs */
1724
102k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
1725
1726
102k
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1727
102k
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1728
1729
102k
            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
102k
            i2_mb_skip_run--;
1734
102k
        }
1735
194k
        else
1736
194k
        {
1737
194k
            UWORD32 u4_word, u4_ldz, u4_temp;
1738
1739
194k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1740
194k
            if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1741
194k
               ps_svc_slice_params->u1_adaptive_base_mode_flag)
1742
107k
            {
1743
107k
                ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1744
107k
                COPYTHECONTEXT("SVC :u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1745
107k
            }
1746
87.2k
            else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1747
86.3k
            {
1748
86.3k
                ps_svc_cur_mb_info->u1_base_mode_flag =
1749
86.3k
                    ps_svc_slice_params->u1_default_base_mode_flag;
1750
86.3k
            }
1751
1752
194k
            if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1753
45.8k
            {
1754
45.8k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1755
1756
45.8k
                u1_read_mb_type = 0;
1757
                /**************************************************************/
1758
                /* Macroblock Layer Begins, Decode the u1_mb_type              */
1759
                /**************************************************************/
1760
45.8k
                {
1761
                    /***************************************************************/
1762
                    /* Find leading zeros in next 32 bits                          */
1763
                    /***************************************************************/
1764
45.8k
                    NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1765
45.8k
                    u4_ldz = CLZ(u4_word);
1766
                    /* Flush the ps_bitstrm */
1767
45.8k
                    u4_bitstream_offset += (u4_ldz + 1);
1768
                    /* Read the suffix from the ps_bitstrm */
1769
45.8k
                    u4_word = 0;
1770
45.8k
                    if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1771
45.8k
                    *pu4_bitstrm_ofst = u4_bitstream_offset;
1772
45.8k
                    u4_temp = ((1 << u4_ldz) + u4_word - 1);
1773
1774
45.8k
                    if(u4_temp > (UWORD32) (25 + u1_mb_threshold)) return ERROR_MB_TYPE;
1775
45.5k
                    u1_mb_type = u4_temp;
1776
45.5k
                    COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1777
45.5k
                }
1778
0
                ps_cur_mb_info->u1_mb_type = u1_mb_type;
1779
45.5k
            }
1780
149k
            else
1781
149k
            {
1782
                /* default intialization for Base mode flag : reserved */
1783
149k
                ps_dec->ps_part += MAX_NUM_MB_PART;
1784
149k
                u1_read_mb_type = 0;
1785
149k
                ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
1786
149k
                ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
1787
149k
                ps_cur_mb_info->u1_mb_type = MB_INFER;
1788
149k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1789
149k
                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
149k
                if(ps_svc_slice_params->u1_adaptive_residual_prediction_flag &&
1796
22.9k
                   ps_svc_cur_mb_info->u1_crop_window_flag)
1797
22.9k
                {
1798
22.9k
                    ps_svc_cur_mb_info->u1_residual_prediction_flag =
1799
22.9k
                        ih264d_get_bit_h264(ps_bitstrm);
1800
22.9k
                    COPYTHECONTEXT("SVC ext: u1_residual_prediction_flag",
1801
22.9k
                                   ps_cur_mb_info->u1_residual_prediction_flag);
1802
22.9k
                }
1803
126k
                else
1804
126k
                {
1805
                    /*residual flag inference code */
1806
126k
                    if(1 == ps_svc_cur_mb_info->u1_crop_window_flag)
1807
126k
                    {
1808
126k
                        ps_svc_cur_mb_info->u1_residual_prediction_flag =
1809
126k
                            ps_svc_slice_params->u1_default_residual_prediction_flag;
1810
126k
                    }
1811
0
                    else
1812
0
                    {
1813
0
                        ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
1814
0
                    }
1815
126k
                }
1816
149k
            }
1817
1818
            /**************************************************************/
1819
            /* Parse Macroblock data                                      */
1820
            /**************************************************************/
1821
194k
            u1_mb_type = ps_cur_mb_info->u1_mb_type;
1822
194k
            if(u1_mb_type < u1_mb_threshold)
1823
43.7k
            {
1824
43.7k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1825
1826
43.7k
                ret = ps_svc_lyr_dec->pf_parse_inter_mb_svc_ext(
1827
43.7k
                    ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, u1_num_mbs, u1_num_mbsNby2);
1828
43.7k
                if(ret != OK) return ret;
1829
40.4k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1830
1831
40.4k
                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
40.4k
            }
1836
150k
            else
1837
150k
            {
1838
                /* Storing Intra partition info */
1839
150k
                ps_parse_mb_data->u1_num_part = 0;
1840
1841
150k
                if((25 + u1_mb_threshold) == u1_mb_type)
1842
127
                {
1843
                    /* I_PCM_MB */
1844
127
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1845
127
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1846
127
                    if(ret != OK) return ret;
1847
127
                    ps_dec->u1_qp = 0;
1848
127
                    ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1849
127
                }
1850
150k
                else
1851
150k
                {
1852
150k
                    ret =
1853
150k
                        isvcd_parse_imb_cavlc(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1854
150k
                                              u1_num_mbs, (UWORD8) (u1_mb_type - u1_mb_threshold));
1855
150k
                    if(ret != OK) return ret;
1856
1857
148k
                    if(0 == ps_svc_cur_mb_info->u1_base_mode_flag)
1858
951
                    {
1859
951
                        ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1860
951
                    }
1861
148k
                }
1862
148k
                ps_parse_mb_data->u4_isI_mb = !ps_svc_cur_mb_info->u1_base_mode_flag;
1863
148k
            }
1864
188k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1865
188k
        }
1866
291k
        ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1867
1868
291k
        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
291k
        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
291k
        i2_cur_mb_addr++;
1885
291k
        u1_num_mbs++;
1886
291k
        u1_num_mbsNby2++;
1887
291k
        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
291k
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1895
291k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1896
291k
        u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run));
1897
291k
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
1898
291k
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1899
291k
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1900
1901
291k
        if(u1_decode_nmb)
1902
90.0k
        {
1903
90.0k
            ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1904
90.0k
            u1_num_mbsNby2 = 0;
1905
90.0k
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1906
90.0k
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
1907
90.0k
            if(ret != OK) return ret;
1908
90.0k
        }
1909
1910
291k
        if(u1_decode_nmb)
1911
89.9k
        {
1912
89.9k
            if(ps_dec->u1_separate_parse)
1913
63.3k
            {
1914
63.3k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1915
63.3k
                                     u1_end_of_row);
1916
63.3k
                ps_dec->ps_nmb_info += u1_num_mbs;
1917
63.3k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1918
63.3k
            }
1919
26.5k
            else
1920
26.5k
            {
1921
26.5k
                ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1922
26.5k
                                                              u1_num_mbs_next, u1_tfr_n_mb,
1923
26.5k
                                                              u1_end_of_row);
1924
26.5k
                if(ret != OK) return ret;
1925
26.5k
            }
1926
89.9k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1927
89.9k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1928
89.9k
            u1_mb_idx = u1_num_mbs;
1929
89.9k
            ps_dec->u4_mb_idx = u1_num_mbs;
1930
89.9k
        }
1931
291k
    }
1932
1933
9.04k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1934
9.04k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1935
1936
9.04k
    return ret;
1937
15.3k
}
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
11.0k
{
1954
11.0k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1955
11.0k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1956
1957
11.0k
    UWORD32 u1_num_mb_part;
1958
11.0k
    UWORD32 uc_sub_mb;
1959
11.0k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data + u4_num_mbsNby2;
1960
11.0k
    WORD8 *pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
1961
11.0k
    const UWORD8 *pu1_num_mb_part = (const UWORD8 *) gau1_ih264d_num_mb_part;
1962
11.0k
    const UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
1963
11.0k
    UWORD8 *pu1_col_info = ps_parse_mb_data->u1_col_info;
1964
11.0k
    UWORD32 u1_mb_mc_mode = u1_mb_type;
1965
11.0k
    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1966
11.0k
    decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
1967
11.0k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1968
11.0k
    UWORD32 u4_sub_mb_pack = 0;
1969
11.0k
    WORD32 ret;
1970
1971
11.0k
    UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
1972
11.0k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1973
1974
11.0k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
1975
11.0k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1976
11.0k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
1977
11.0k
    p_curr_ctxt->u1_mb_type = CAB_P;
1978
11.0k
    ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
1979
11.0k
    uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
1980
1981
    /* Reading the subMB type */
1982
11.0k
    if(uc_sub_mb)
1983
5.12k
    {
1984
5.12k
        UWORD8 u1_colz = (PRED_8x8 << 6);
1985
5.12k
        u1_mb_mc_mode = 0;
1986
5.12k
        {
1987
5.12k
            UWORD8 u1_sub_mb_mode;
1988
5.12k
            u1_sub_mb_mode =
1989
5.12k
                ih264d_parse_submb_type_cabac(0, ps_cab_env, ps_bitstrm, ps_dec->p_sub_mb_type_t);
1990
5.12k
            if(u1_sub_mb_mode > 3) return ERROR_SUB_MB_TYPE;
1991
1992
5.12k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
1993
            /* Storing collocated information */
1994
5.12k
            *pu1_col_info++ = u1_colz | ((UWORD8) (u1_sub_mb_mode << 4));
1995
5.12k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
1996
            /* check if Motion compensation is done below 8x8 */
1997
5.12k
            if(u1_sub_mb_mode != P_L0_8x8)
1998
4.13k
            {
1999
4.13k
                u1_no_submb_part_size_lt8x8_flag = 0;
2000
4.13k
            }
2001
5.12k
        }
2002
0
        {
2003
5.12k
            UWORD8 u1_sub_mb_mode;
2004
5.12k
            u1_sub_mb_mode =
2005
5.12k
                ih264d_parse_submb_type_cabac(0, ps_cab_env, ps_bitstrm, ps_dec->p_sub_mb_type_t);
2006
5.12k
            if(u1_sub_mb_mode > 3) return ERROR_SUB_MB_TYPE;
2007
2008
5.12k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
2009
            /* Storing collocated information */
2010
5.12k
            *pu1_col_info++ = u1_colz | ((UWORD8) (u1_sub_mb_mode << 4));
2011
5.12k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
2012
            /* check if Motion compensation is done below 8x8 */
2013
5.12k
            if(u1_sub_mb_mode != P_L0_8x8)
2014
4.18k
            {
2015
4.18k
                u1_no_submb_part_size_lt8x8_flag = 0;
2016
4.18k
            }
2017
5.12k
        }
2018
0
        {
2019
5.12k
            UWORD8 u1_sub_mb_mode;
2020
5.12k
            u1_sub_mb_mode =
2021
5.12k
                ih264d_parse_submb_type_cabac(0, ps_cab_env, ps_bitstrm, ps_dec->p_sub_mb_type_t);
2022
5.12k
            if(u1_sub_mb_mode > 3) return ERROR_SUB_MB_TYPE;
2023
2024
5.12k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
2025
            /* Storing collocated information */
2026
5.12k
            *pu1_col_info++ = u1_colz | ((UWORD8) (u1_sub_mb_mode << 4));
2027
5.12k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
2028
            /* check if Motion compensation is done below 8x8 */
2029
5.12k
            if(u1_sub_mb_mode != P_L0_8x8)
2030
4.12k
            {
2031
4.12k
                u1_no_submb_part_size_lt8x8_flag = 0;
2032
4.12k
            }
2033
5.12k
        }
2034
0
        {
2035
5.12k
            UWORD8 u1_sub_mb_mode;
2036
5.12k
            u1_sub_mb_mode =
2037
5.12k
                ih264d_parse_submb_type_cabac(0, ps_cab_env, ps_bitstrm, ps_dec->p_sub_mb_type_t);
2038
5.12k
            if(u1_sub_mb_mode > 3) return ERROR_SUB_MB_TYPE;
2039
2040
5.12k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
2041
            /* Storing collocated information */
2042
5.12k
            *pu1_col_info++ = u1_colz | ((UWORD8) (u1_sub_mb_mode << 4));
2043
5.12k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
2044
            /* check if Motion compensation is done below 8x8 */
2045
5.12k
            if(u1_sub_mb_mode != P_L0_8x8)
2046
4.21k
            {
2047
4.21k
                u1_no_submb_part_size_lt8x8_flag = 0;
2048
4.21k
            }
2049
5.12k
        }
2050
0
        u1_num_mb_part = 4;
2051
5.12k
    }
2052
5.96k
    else
2053
5.96k
    {
2054
5.96k
        u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
2055
        /* Storing collocated Mb and SubMb mode information */
2056
5.96k
        *pu1_col_info++ = (u1_mb_type << 6);
2057
5.96k
        if(u1_mb_type) *pu1_col_info++ = (u1_mb_type << 6);
2058
5.96k
    }
2059
2060
    /*Adding code to get Motion Prediction Flags*/
2061
11.0k
    {
2062
11.0k
        UWORD8 uc_i;
2063
11.0k
        UWORD8 *pu1_motion_pred_flag_l0;
2064
11.0k
        UWORD8 u1_mvp_flag;
2065
11.0k
        WORD8 *pi1_top_ref_idx_ctx_inc_arr = p_curr_ctxt->i1_ref_idx;
2066
11.0k
        WORD8 *pi1_left_ref_idx_ctxt_inc = ps_dec->pi1_left_ref_idx_ctxt_inc;
2067
11.0k
        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
2068
11.0k
        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
2069
11.0k
        UWORD8 uc_num_ref_idx_l0_active_minus1 =
2070
11.0k
            (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] << (u1_mbaff & uc_field)) - 1;
2071
11.0k
        pu1_motion_pred_flag_l0 = &ps_svc_cur_mb_info->au1_motion_pred_flag[0];
2072
11.0k
        *pu1_motion_pred_flag_l0 = 0;
2073
2074
11.0k
        if(ps_svc_cur_mb_info->u1_crop_window_flag &&
2075
10.8k
           ps_svc_slice_params->u1_adaptive_motion_prediction_flag)
2076
7.80k
        {
2077
29.8k
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
2078
22.0k
            {
2079
                /*usage of bins and ctxt check*/
2080
22.0k
                u1_mvp_flag = ih264d_decode_bin(0, ps_svc_lyr_dec->ps_motion_prediction_flag_l0,
2081
22.0k
                                                ps_bitstrm, ps_cab_env);
2082
22.0k
                COPYTHECONTEXT("SVC ext: ps_motion_prediction_flag_l0", u1_mvp_flag);
2083
2084
22.0k
                *pu1_motion_pred_flag_l0 |= (u1_mvp_flag << uc_i);
2085
22.0k
                if(u1_mvp_flag)
2086
5.10k
                {
2087
5.10k
                    pi1_ref_idx[uc_i] = -1;
2088
5.10k
                }
2089
22.0k
            }
2090
7.80k
        }
2091
3.28k
        else if(ps_svc_cur_mb_info->u1_crop_window_flag)
2092
3.03k
        {
2093
3.03k
            *pu1_motion_pred_flag_l0 = ps_svc_slice_params->u1_default_motion_prediction_flag
2094
3.03k
                                           ? ((1 << u1_num_mb_part) - 1)
2095
3.03k
                                           : 0;
2096
3.03k
            if(ps_svc_slice_params->u1_default_motion_prediction_flag)
2097
1.55k
            {
2098
1.55k
                pi1_ref_idx[0] = -1;
2099
1.55k
                pi1_ref_idx[1] = -1;
2100
1.55k
                pi1_ref_idx[2] = -1;
2101
1.55k
                pi1_ref_idx[3] = -1;
2102
1.55k
            }
2103
3.03k
        }
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
11.0k
        if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
2109
332
        {
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
332
            ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0, uc_num_ref_idx_l0_active_minus1,
2115
332
                                             u1_mb_mc_mode, pi1_ref_idx, pi1_left_ref_idx_ctxt_inc,
2116
332
                                             pi1_top_ref_idx_ctx_inc_arr, ps_cab_env, ps_bitstrm,
2117
332
                                             ps_dec->p_ref_idx_t);
2118
332
            if(ret != OK)
2119
66
            {
2120
66
                return ret;
2121
66
            }
2122
332
        }
2123
10.7k
        else
2124
10.7k
        {
2125
            /* When there exists only a single frame to predict from */
2126
10.7k
            pi1_left_ref_idx_ctxt_inc[0] = 0;
2127
10.7k
            pi1_left_ref_idx_ctxt_inc[1] = 0;
2128
10.7k
            pi1_top_ref_idx_ctx_inc_arr[0] = 0;
2129
10.7k
            pi1_top_ref_idx_ctx_inc_arr[1] = 0;
2130
10.7k
            *((UWORD32 *) pi1_ref_idx) = 0;
2131
10.7k
        }
2132
11.0k
    }
2133
2134
11.0k
    {
2135
11.0k
        UWORD8 u1_p_idx;
2136
11.0k
        UWORD32 uc_i;
2137
11.0k
        parse_part_params_t *ps_part = ps_dec->ps_part;
2138
11.0k
        UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
2139
11.0k
        UWORD32 u4_sub_mb_num;
2140
11.0k
        const UWORD8 *pu1_top_left_sub_mb_indx;
2141
11.0k
        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
2142
11.0k
        UWORD16 u2_sub_mb_num_pack = 0x028A;
2143
2144
        /* Loading the table pointers */
2145
11.0k
        const UWORD8 *pu1_mb_partw = (const UWORD8 *) gau1_ih264d_mb_partw;
2146
11.0k
        const UWORD8 *pu1_mb_parth = (const UWORD8 *) gau1_ih264d_mb_parth;
2147
11.0k
        const UWORD8 *pu1_sub_mb_indx_mod =
2148
11.0k
            (const UWORD8 *) (gau1_ih264d_submb_indx_mod) + (uc_sub_mb * 6);
2149
11.0k
        const UWORD8 *pu1_sub_mb_partw = (const UWORD8 *) gau1_ih264d_submb_partw;
2150
11.0k
        const UWORD8 *pu1_sub_mb_parth = (const UWORD8 *) gau1_ih264d_submb_parth;
2151
11.0k
        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
11.0k
        u1_sub_mb_mode = 0;
2158
11.0k
        u1_num_subpart = 1;
2159
11.0k
        u1_mb_part_width = pu1_mb_partw[u1_mb_type];
2160
11.0k
        u1_mb_part_height = pu1_mb_parth[u1_mb_type];
2161
11.0k
        pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
2162
11.0k
        u4_sub_mb_num = 0;
2163
2164
        /* Loop on number of partitions */
2165
38.7k
        for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
2166
27.7k
        {
2167
27.7k
            UWORD8 uc_j;
2168
27.7k
            if(uc_sub_mb)
2169
20.4k
            {
2170
20.4k
                u1_sub_mb_mode = u4_sub_mb_pack >> 24;
2171
20.4k
                u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
2172
20.4k
                u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
2173
20.4k
                u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
2174
20.4k
                pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
2175
20.4k
                u4_sub_mb_num = u2_sub_mb_num_pack >> 12;
2176
20.4k
                u4_sub_mb_pack <<= 8;
2177
20.4k
                u2_sub_mb_num_pack <<= 4;
2178
20.4k
            }
2179
            /* Loop on Number of sub-partitions */
2180
75.2k
            for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
2181
47.4k
            {
2182
47.4k
                mv_pred_t *ps_mv;
2183
47.4k
                u4_sub_mb_num += *pu1_top_left_sub_mb_indx;
2184
47.4k
                ps_mv = ps_mv_start + u4_sub_mb_num;
2185
2186
                /* Storing Info for partitions */
2187
47.4k
                ps_part->u1_is_direct = PART_NOT_DIRECT;
2188
47.4k
                ps_part->u1_sub_mb_num = u4_sub_mb_num;
2189
47.4k
                ps_part->u1_partheight = u1_mb_part_height;
2190
47.4k
                ps_part->u1_partwidth = u1_mb_part_width;
2191
2192
                /* Increment partition Index */
2193
47.4k
                u1_p_idx++;
2194
47.4k
                ps_part++;
2195
2196
47.4k
                ih264d_get_mvd_cabac(u4_sub_mb_num, 0, u1_mb_part_width, u1_mb_part_height, 1,
2197
47.4k
                                     ps_dec, ps_mv);
2198
47.4k
            }
2199
27.7k
        }
2200
11.0k
        ps_parse_mb_data->u1_num_part = u1_p_idx;
2201
11.0k
        ps_dec->ps_part = ps_part;
2202
11.0k
    }
2203
2204
    /* update incropwindow*/
2205
11.0k
    if(ps_svc_slice_params->u1_adaptive_residual_prediction_flag &&
2206
2.11k
       ps_svc_cur_mb_info->u1_crop_window_flag)
2207
1.86k
    {
2208
1.86k
        ps_svc_cur_mb_info->u1_residual_prediction_flag = ih264d_decode_bin(
2209
1.86k
            1, ps_svc_lyr_dec->ps_residual_prediction_flag, ps_bitstrm, ps_cab_env);
2210
1.86k
        COPYTHECONTEXT("SVC ext: u1_residual_prediction_flag",
2211
1.86k
                       ps_cur_mb_info->u1_residual_prediction_flag);
2212
1.86k
    }
2213
9.15k
    else
2214
9.15k
    {
2215
        /*residual flag inference code */
2216
9.15k
        if(1 == ps_svc_cur_mb_info->u1_crop_window_flag)
2217
8.91k
        {
2218
8.91k
            ps_svc_cur_mb_info->u1_residual_prediction_flag =
2219
8.91k
                ps_svc_slice_params->u1_default_residual_prediction_flag;
2220
8.91k
        }
2221
248
        else
2222
248
        {
2223
248
            ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
2224
248
        }
2225
9.15k
    }
2226
2227
11.0k
    if(ps_svc_slice_params->u1_scan_idx_end >= ps_svc_slice_params->u1_scan_idx_start)
2228
11.0k
    {
2229
11.0k
        UWORD8 u1_cbp;
2230
        /* Read the Coded block pattern */
2231
11.0k
        u1_cbp = (WORD8) ih264d_parse_ctx_cbp_cabac(ps_dec);
2232
11.0k
        COPYTHECONTEXT("coded_block_pattern", u1_cbp);
2233
11.0k
        ps_cur_mb_info->u1_cbp = u1_cbp;
2234
11.0k
        p_curr_ctxt->u1_cbp = u1_cbp;
2235
11.0k
        p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
2236
11.0k
        p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
2237
11.0k
        ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
2238
2239
11.0k
        if(u1_cbp > 47) return ERROR_CBP;
2240
2241
11.0k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
2242
11.0k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
2243
2244
        /* Read the transform8x8 u4_flag if present */
2245
11.0k
        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & 0xf) &&
2246
5.85k
           u1_no_submb_part_size_lt8x8_flag)
2247
1.68k
        {
2248
1.68k
            ps_cur_mb_info->u1_tran_form8x8 =
2249
1.68k
                ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
2250
1.68k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
2251
1.68k
            p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
2252
1.68k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
2253
1.68k
        }
2254
9.34k
        else
2255
9.34k
        {
2256
9.34k
            p_curr_ctxt->u1_transform8x8_ctxt = 0;
2257
9.34k
        }
2258
2259
        /* Read mb_qp_delta */
2260
11.0k
        if(u1_cbp)
2261
6.79k
        {
2262
6.79k
            WORD8 c_temp;
2263
6.79k
            ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp);
2264
6.79k
            if(ret != OK) return ret;
2265
6.66k
            COPYTHECONTEXT("mb_qp_delta", c_temp);
2266
6.66k
            if(c_temp != 0)
2267
1.28k
            {
2268
1.28k
                ret = ih264d_update_qp(ps_dec, c_temp);
2269
1.28k
                if(ret != OK) return ret;
2270
1.28k
            }
2271
6.66k
        }
2272
4.22k
        else
2273
4.22k
            ps_dec->i1_prev_mb_qp_delta = 0;
2274
2275
        /*residual from start to end idx */
2276
10.8k
        ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0);
2277
10.8k
        if(EXCEED_OFFSET(ps_dec->ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
2278
10.8k
    }
2279
10.1k
    return OK;
2280
11.0k
}
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
21.7k
{
2297
21.7k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
2298
21.7k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
2299
21.7k
    UWORD32 u1_num_mb_part;
2300
21.7k
    UWORD32 uc_sub_mb;
2301
21.7k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
2302
21.7k
    UWORD32 *const pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
2303
21.7k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
2304
21.7k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data + u4_num_mbsNby2;
2305
21.7k
    WORD8 *pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
2306
21.7k
    const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
2307
21.7k
    const UWORD8 *pu1_num_mb_part = (const UWORD8 *) gau1_ih264d_num_mb_part;
2308
21.7k
    UWORD8 *pu1_col_info = ps_parse_mb_data->u1_col_info;
2309
21.7k
    UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
2310
21.7k
    UWORD32 u4_sum_mb_mode_pack = 0;
2311
21.7k
    WORD32 ret;
2312
21.7k
    UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
2313
2314
21.7k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
2315
21.7k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
2316
21.7k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
2317
21.7k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
2318
21.7k
    ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
2319
21.7k
    uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
2320
2321
    /* Reading the subMB type */
2322
21.7k
    if(uc_sub_mb)
2323
1.83k
    {
2324
1.83k
        WORD32 i;
2325
1.83k
        UWORD8 u1_colz = (PRED_8x8 << 6);
2326
2327
8.54k
        for(i = 0; i < 4; i++)
2328
6.95k
        {
2329
6.95k
            UWORD32 ui_sub_mb_mode;
2330
2331
            // Inlined ih264d_uev
2332
6.95k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
2333
6.95k
            UWORD32 u4_word, u4_ldz;
2334
2335
            /***************************************************************/
2336
            /* Find leading zeros in next 32 bits                          */
2337
            /***************************************************************/
2338
6.95k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
2339
6.95k
            u4_ldz = CLZ(u4_word);
2340
            /* Flush the ps_bitstrm */
2341
6.95k
            u4_bitstream_offset += (u4_ldz + 1);
2342
            /* Read the suffix from the ps_bitstrm */
2343
6.95k
            u4_word = 0;
2344
6.95k
            if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
2345
6.95k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
2346
6.95k
            ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1);
2347
            // Inlined ih264d_uev
2348
2349
6.95k
            if(ui_sub_mb_mode > 3)
2350
242
            {
2351
242
                return ERROR_SUB_MB_TYPE;
2352
242
            }
2353
6.71k
            else
2354
6.71k
            {
2355
6.71k
                u4_sum_mb_mode_pack = (u4_sum_mb_mode_pack << 8) | ui_sub_mb_mode;
2356
                /* Storing collocated information */
2357
6.71k
                *pu1_col_info++ = u1_colz | (UWORD8) (ui_sub_mb_mode << 4);
2358
2359
6.71k
                COPYTHECONTEXT("sub_mb_type", ui_sub_mb_mode);
2360
6.71k
            }
2361
2362
            /* check if Motion compensation is done below 8x8 */
2363
6.71k
            if(ui_sub_mb_mode != P_L0_8x8)
2364
3.04k
            {
2365
3.04k
                u1_no_submb_part_size_lt8x8_flag = 0;
2366
3.04k
            }
2367
6.71k
        }
2368
1.59k
        u1_num_mb_part = 4;
2369
1.59k
    }
2370
19.8k
    else
2371
19.8k
    {
2372
19.8k
        *pu1_col_info++ = (u1_mb_type << 6);
2373
19.8k
        if(u1_mb_type) *pu1_col_info++ = (u1_mb_type << 6);
2374
19.8k
        u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
2375
19.8k
    }
2376
2377
    /*Adding code to get Motion Prediction Flags*/
2378
21.4k
    {
2379
        /*free the scratch buffer once used*/
2380
21.4k
        UWORD8 uc_i;
2381
21.4k
        UWORD8 *pu1_motion_pred_flag_l0;
2382
21.4k
        UWORD8 u1_mvp_flag;
2383
21.4k
        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
2384
21.4k
        UWORD8 uc_num_ref_idx_l0_active_minus1 =
2385
21.4k
            (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] << (u1_mbaff & uc_field)) - 1;
2386
2387
21.4k
        pu1_motion_pred_flag_l0 = &ps_svc_cur_mb_info->au1_motion_pred_flag[0];
2388
21.4k
        *pu1_motion_pred_flag_l0 = 0;
2389
21.4k
        if(ps_svc_cur_mb_info->u1_crop_window_flag &&
2390
21.3k
           ps_svc_slice_params->u1_adaptive_motion_prediction_flag)
2391
8.18k
        {
2392
23.2k
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
2393
15.0k
            {
2394
                /*usage of bins and ctxt check*/
2395
15.0k
                u1_mvp_flag = ih264d_get_bit_h264(ps_bitstrm);
2396
15.0k
                COPYTHECONTEXT("SVC ext: ps_motion_prediction_flag_l0", u1_mvp_flag);
2397
2398
15.0k
                *pu1_motion_pred_flag_l0 |= (u1_mvp_flag << uc_i);
2399
15.0k
            }
2400
8.18k
        }
2401
13.2k
        else if(ps_svc_cur_mb_info->u1_crop_window_flag)
2402
13.1k
        {
2403
13.1k
            *pu1_motion_pred_flag_l0 = ps_svc_slice_params->u1_default_motion_prediction_flag
2404
13.1k
                                           ? ((1 << u1_num_mb_part) - 1)
2405
13.1k
                                           : 0;
2406
13.1k
        }
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
21.4k
        if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
2412
13.2k
        {
2413
13.2k
            if(1 == uc_num_ref_idx_l0_active_minus1)
2414
3.57k
                isvcd_parse_pmb_ref_index_cavlc_range1(u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
2415
3.57k
                                                       uc_num_ref_idx_l0_active_minus1,
2416
3.57k
                                                       pu1_motion_pred_flag_l0);
2417
9.70k
            else
2418
9.70k
            {
2419
9.70k
                ret = isvcd_parse_pmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
2420
9.70k
                                                      uc_num_ref_idx_l0_active_minus1,
2421
9.70k
                                                      pu1_motion_pred_flag_l0);
2422
9.70k
                if(ret != OK) return ret;
2423
9.70k
            }
2424
13.2k
        }
2425
8.20k
        else
2426
8.20k
        {
2427
            /* When there exists only a single frame to predict from */
2428
8.20k
            UWORD32 uc_i;
2429
19.5k
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++) /* Storing Reference Idx Information */
2430
11.3k
                pi1_ref_idx[uc_i] = 0;
2431
8.20k
        }
2432
21.4k
    }
2433
2434
21.2k
    {
2435
21.2k
        UWORD8 u1_p_idx;
2436
21.2k
        UWORD32 uc_i;
2437
21.2k
        parse_part_params_t *ps_part = ps_dec->ps_part;
2438
21.2k
        UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
2439
21.2k
        UWORD32 u4_sub_mb_num;
2440
21.2k
        const UWORD8 *pu1_top_left_sub_mb_indx;
2441
21.2k
        mv_pred_t *ps_mv, *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
2442
        /* Loading the table pointers */
2443
21.2k
        const UWORD8 *pu1_mb_partw = (const UWORD8 *) gau1_ih264d_mb_partw;
2444
21.2k
        const UWORD8 *pu1_mb_parth = (const UWORD8 *) gau1_ih264d_mb_parth;
2445
21.2k
        const UWORD8 *pu1_sub_mb_indx_mod =
2446
21.2k
            (const UWORD8 *) (gau1_ih264d_submb_indx_mod) + (uc_sub_mb * 6);
2447
21.2k
        const UWORD8 *pu1_sub_mb_partw = (const UWORD8 *) gau1_ih264d_submb_partw;
2448
21.2k
        const UWORD8 *pu1_sub_mb_parth = (const UWORD8 *) gau1_ih264d_submb_parth;
2449
21.2k
        const UWORD8 *pu1_num_sub_mb_part = (const UWORD8 *) gau1_ih264d_num_submb_part;
2450
21.2k
        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
21.2k
        u1_sub_mb_mode = 0;
2457
21.2k
        u1_num_subpart = 1;
2458
21.2k
        u1_mb_part_width = pu1_mb_partw[u1_mb_type];
2459
21.2k
        u1_mb_part_height = pu1_mb_parth[u1_mb_type];
2460
21.2k
        pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
2461
21.2k
        u4_sub_mb_num = 0;
2462
2463
        /* Loop on number of partitions */
2464
54.5k
        for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
2465
33.3k
        {
2466
33.3k
            UWORD8 uc_j;
2467
33.3k
            if(uc_sub_mb)
2468
6.27k
            {
2469
6.27k
                u1_sub_mb_mode = u4_sum_mb_mode_pack >> 24;
2470
6.27k
                u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
2471
6.27k
                u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
2472
6.27k
                u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
2473
6.27k
                pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
2474
6.27k
                u4_sub_mb_num = u2_sub_mb_num >> 12;
2475
6.27k
                u4_sum_mb_mode_pack <<= 8;
2476
6.27k
                u2_sub_mb_num <<= 4;
2477
6.27k
            }
2478
            /* Loop on Number of sub-partitions */
2479
71.2k
            for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
2480
37.9k
            {
2481
37.9k
                WORD16 i2_mvx, i2_mvy;
2482
37.9k
                u4_sub_mb_num += *pu1_top_left_sub_mb_indx;
2483
37.9k
                ps_mv = ps_mv_start + u4_sub_mb_num;
2484
2485
                /* Reading the differential Mv from the bitstream */
2486
                // inlining ih264d_sev
2487
37.9k
                {
2488
37.9k
                    UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
2489
37.9k
                    UWORD32 u4_word, u4_ldz, u4_abs_val;
2490
2491
                    /***************************************************************/
2492
                    /* Find leading zeros in next 32 bits                          */
2493
                    /***************************************************************/
2494
37.9k
                    NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
2495
37.9k
                    u4_ldz = CLZ(u4_word);
2496
2497
                    /* Flush the ps_bitstrm */
2498
37.9k
                    u4_bitstream_offset += (u4_ldz + 1);
2499
2500
                    /* Read the suffix from the ps_bitstrm */
2501
37.9k
                    u4_word = 0;
2502
37.9k
                    if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
2503
2504
37.9k
                    *pu4_bitstrm_ofst = u4_bitstream_offset;
2505
37.9k
                    u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
2506
2507
37.9k
                    if(u4_word & 0x1)
2508
10.3k
                        i2_mvx = (-(WORD32) u4_abs_val);
2509
27.5k
                    else
2510
27.5k
                        i2_mvx = (u4_abs_val);
2511
37.9k
                }
2512
                // inlinined ih264d_sev
2513
37.9k
                COPYTHECONTEXT("MVD", i2_mvx);
2514
37.9k
                i2_mvy = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2515
37.9k
                COPYTHECONTEXT("MVD", i2_mvy);
2516
2517
                /* Storing Info for partitions */
2518
37.9k
                ps_part->u1_is_direct = PART_NOT_DIRECT;
2519
37.9k
                ps_part->u1_sub_mb_num = u4_sub_mb_num;
2520
37.9k
                ps_part->u1_partheight = u1_mb_part_height;
2521
37.9k
                ps_part->u1_partwidth = u1_mb_part_width;
2522
2523
                /* Storing Mv residuals */
2524
37.9k
                ps_mv->i2_mv[0] = i2_mvx;
2525
37.9k
                ps_mv->i2_mv[1] = i2_mvy;
2526
2527
                /* Increment partition Index */
2528
37.9k
                u1_p_idx++;
2529
37.9k
                ps_part++;
2530
37.9k
            }
2531
33.3k
        }
2532
21.2k
        ps_parse_mb_data->u1_num_part = u1_p_idx;
2533
21.2k
        ps_dec->ps_part = ps_part;
2534
21.2k
    }
2535
2536
21.2k
    if(ps_svc_slice_params->u1_adaptive_residual_prediction_flag &&
2537
3.32k
       ps_svc_cur_mb_info->u1_crop_window_flag)
2538
3.21k
    {
2539
3.21k
        ps_svc_cur_mb_info->u1_residual_prediction_flag = ih264d_get_bit_h264(ps_bitstrm);
2540
3.21k
        COPYTHECONTEXT("SVC ext: u1_residual_prediction_flag",
2541
3.21k
                       ps_svc_cur_mb_info->u1_residual_prediction_flag);
2542
3.21k
    }
2543
18.0k
    else
2544
18.0k
    {
2545
        /*residual flag inference code */
2546
18.0k
        if(1 == ps_svc_cur_mb_info->u1_crop_window_flag)
2547
17.9k
        {
2548
17.9k
            ps_svc_cur_mb_info->u1_residual_prediction_flag =
2549
17.9k
                ps_svc_slice_params->u1_default_residual_prediction_flag;
2550
17.9k
        }
2551
105
        else
2552
105
        {
2553
105
            ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
2554
105
        }
2555
18.0k
    }
2556
2557
21.2k
    if(ps_svc_slice_params->u1_scan_idx_end >= ps_svc_slice_params->u1_scan_idx_start)
2558
21.2k
    {
2559
21.2k
        UWORD32 u4_cbp;
2560
        /* Read the Coded block pattern */
2561
21.2k
        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
2562
21.2k
        UWORD32 u4_word, u4_ldz;
2563
2564
        /***************************************************************/
2565
        /* Find leading zeros in next 32 bits                          */
2566
        /***************************************************************/
2567
21.2k
        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
2568
21.2k
        u4_ldz = CLZ(u4_word);
2569
        /* Flush the ps_bitstrm */
2570
21.2k
        u4_bitstream_offset += (u4_ldz + 1);
2571
        /* Read the suffix from the ps_bitstrm */
2572
21.2k
        u4_word = 0;
2573
21.2k
        if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
2574
21.2k
        *pu4_bitstrm_ofst = u4_bitstream_offset;
2575
21.2k
        u4_cbp = ((1 << u4_ldz) + u4_word - 1);
2576
2577
21.2k
        if(u4_cbp > 47) return ERROR_CBP;
2578
2579
20.6k
        u4_cbp = *((UWORD8 *) gau1_ih264d_cbp_inter + u4_cbp);
2580
20.6k
        COPYTHECONTEXT("coded_block_pattern", u4_cbp);
2581
20.6k
        ps_cur_mb_info->u1_cbp = u4_cbp;
2582
2583
        /* Read the transform8x8 u4_flag if present */
2584
20.6k
        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & 0xf) &&
2585
1.74k
           u1_no_submb_part_size_lt8x8_flag)
2586
1.67k
        {
2587
1.67k
            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
2588
1.67k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
2589
1.67k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
2590
1.67k
        }
2591
2592
        /* Read mb_qp_delta */
2593
20.6k
        if(u4_cbp)
2594
8.28k
        {
2595
8.28k
            WORD32 i_temp;
2596
8.28k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
2597
8.28k
            UWORD32 u4_word, u4_ldz, u4_abs_val;
2598
2599
            /***************************************************************/
2600
            /* Find leading zeros in next 32 bits                          */
2601
            /***************************************************************/
2602
8.28k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
2603
8.28k
            u4_ldz = CLZ(u4_word);
2604
2605
            /* Flush the ps_bitstrm */
2606
8.28k
            u4_bitstream_offset += (u4_ldz + 1);
2607
2608
            /* Read the suffix from the ps_bitstrm */
2609
8.28k
            u4_word = 0;
2610
8.28k
            if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
2611
2612
8.28k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
2613
8.28k
            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
2614
2615
8.28k
            if(u4_word & 0x1)
2616
2.30k
                i_temp = (-(WORD32) u4_abs_val);
2617
5.97k
            else
2618
5.97k
                i_temp = (u4_abs_val);
2619
2620
8.28k
            if((i_temp < -26) || (i_temp > 25)) return ERROR_INV_RANGE_QP_T;
2621
            // inlinined ih264d_sev
2622
2623
8.01k
            COPYTHECONTEXT("mb_qp_delta", i_temp);
2624
8.01k
            if(i_temp)
2625
4.18k
            {
2626
4.18k
                ret = ih264d_update_qp(ps_dec, (WORD8) i_temp);
2627
4.18k
                if(ret != OK) return ret;
2628
4.18k
            }
2629
2630
            /*change to support start to end idx*/
2631
8.01k
            ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0);
2632
8.01k
            if(ret != OK) return ret;
2633
7.83k
            if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
2634
7.83k
        }
2635
12.3k
        else
2636
12.3k
        {
2637
12.3k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
2638
12.3k
        }
2639
20.6k
    }
2640
2641
19.9k
    return OK;
2642
21.2k
}
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
95.8k
{
2658
95.8k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
2659
95.8k
    WORD32 i2_cur_mb_addr;
2660
95.8k
    UWORD32 u1_num_mbs;
2661
95.8k
    UWORD32 u1_mb_idx = ps_dec->u4_mb_idx;
2662
95.8k
    UWORD32 i2_mb_skip_run;
2663
95.8k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
2664
95.8k
    const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
2665
95.8k
    UWORD32 u1_slice_end;
2666
95.8k
    UWORD32 u1_tfr_n_mb;
2667
95.8k
    UWORD32 u1_decode_nmb;
2668
95.8k
    dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
2669
95.8k
    deblk_mb_t *ps_cur_deblk_mb;
2670
95.8k
    dec_mb_info_t *ps_cur_mb_info;
2671
95.8k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
2672
95.8k
    parse_pmbarams_t *ps_parse_mb_data;
2673
95.8k
    UWORD32 u1_inter_mb_type;
2674
95.8k
    UWORD32 u1_deblk_mb_type;
2675
95.8k
    UWORD32 u1_mbaff;
2676
95.8k
    parse_part_params_t *ps_part_info;
2677
95.8k
    WORD32 ret;
2678
95.8k
    UNUSED(u1_is_idr_slice);
2679
2680
95.8k
    ps_svc_lyr_dec->u1_error_in_cur_frame = 1;
2681
95.8k
    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
95.8k
    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (num_mb_skip & 1))
2688
0
    {
2689
0
        num_mb_skip++;
2690
0
    }
2691
95.8k
    ps_dec->ps_dpb_cmds->u1_long_term_reference_flag = 0;
2692
95.8k
    if(prev_slice_err == 1)
2693
50.4k
    {
2694
        /* first slice - missing/header corruption */
2695
50.4k
        ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
2696
50.4k
        {
2697
50.4k
            WORD32 i, j, poc = 0;
2698
50.4k
            ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0;
2699
50.4k
            ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
2700
50.4k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
2701
50.4k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
2702
2703
50.4k
            if(ps_dec->ps_cur_pic != NULL)
2704
50.4k
            {
2705
50.4k
                poc = ps_dec->ps_cur_pic->i4_poc;
2706
50.4k
                if(poc <= INT32_MAX - 2) poc += 2;
2707
50.4k
            }
2708
2709
50.4k
            j = -1;
2710
82.8k
            for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
2711
82.8k
            {
2712
82.8k
                if(ps_dec->ps_pps[i].u1_is_valid == TRUE)
2713
50.6k
                {
2714
50.6k
                    if(ps_dec->ps_pps[i].ps_sps->u1_is_valid == TRUE)
2715
50.4k
                    {
2716
50.4k
                        j = i;
2717
50.4k
                        break;
2718
50.4k
                    }
2719
50.6k
                }
2720
82.8k
            }
2721
2722
            // if valid SPS PPS is not found return error
2723
50.4k
            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
50.4k
            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
50.4k
            ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0;
2750
50.4k
            ps_dec->u4_output_present = 0;
2751
2752
50.4k
            {
2753
50.4k
                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
50.4k
                if(0 != ps_dec->s_disp_op.u4_error_code)
2758
47.6k
                {
2759
47.6k
                    ps_dec->u4_output_present = 0;
2760
47.6k
                    ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
2761
47.6k
                }
2762
2.89k
                else
2763
2.89k
                    ps_dec->u4_output_present = 1;
2764
50.4k
            }
2765
2766
50.4k
            if(ps_dec->u1_separate_parse == 1)
2767
28.6k
            {
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
28.6k
            }
2794
50.4k
        }
2795
50.4k
    }
2796
45.3k
    else
2797
45.3k
    {
2798
        // Middle / last slice
2799
45.3k
        dec_slice_struct_t *ps_parse_cur_slice;
2800
45.3k
        ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
2801
2802
45.3k
        if(ps_dec->u1_slice_header_done && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice)
2803
45.1k
        {
2804
            // Slice data corrupted
2805
            // in the case of mbaff, conceal from the even mb.
2806
45.1k
            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
45.1k
            u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb;
2813
45.1k
            if(u1_num_mbs)
2814
10.7k
            {
2815
10.7k
                ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1;
2816
10.7k
            }
2817
34.4k
            else
2818
34.4k
            {
2819
34.4k
                if(ps_dec->u1_separate_parse)
2820
9.74k
                {
2821
9.74k
                    ps_cur_mb_info = ps_dec->ps_nmb_info;
2822
9.74k
                }
2823
24.7k
                else
2824
24.7k
                {
2825
24.7k
                    ps_cur_mb_info = ps_dec->ps_nmb_info + ps_dec->u4_num_mbs_prev_nmb - 1;
2826
24.7k
                }
2827
34.4k
            }
2828
2829
45.1k
            ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
2830
45.1k
            ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
2831
45.1k
            ps_dec->u1_mb_ngbr_availablity = ps_cur_mb_info->u1_mb_ngbr_availablity;
2832
2833
45.1k
            if(u1_num_mbs)
2834
10.7k
            {
2835
                // Going back 1 mb
2836
10.7k
                ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data;
2837
10.7k
                ps_dec->u4_cur_mb_addr--;
2838
10.7k
                ps_dec->i4_submb_ofst -= SUB_BLK_SIZE;
2839
2840
                // Parse/decode N-MB left unparsed
2841
10.7k
                if(ps_dec->u1_pr_sl_type == P_SLICE || ps_dec->u1_pr_sl_type == B_SLICE)
2842
8.64k
                {
2843
8.64k
                    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
8.64k
                    ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
2849
8.64k
                    ps_dec->ps_part = ps_dec->ps_parse_part_params;
2850
8.64k
                    if(ret != OK) return ret;
2851
8.64k
                }
2852
2853
10.5k
                u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
2854
10.5k
                u1_end_of_row =
2855
10.5k
                    (!u1_num_mbs_next) &&
2856
0
                    (!(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (u1_num_mbs & 0x01)));
2857
10.5k
                u1_slice_end = 1;
2858
10.5k
                u1_tfr_n_mb = 1;
2859
10.5k
                ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
2860
2861
10.5k
                if(ps_dec->u1_separate_parse)
2862
5.89k
                {
2863
5.89k
                    ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
2864
5.89k
                                         u1_tfr_n_mb, u1_end_of_row);
2865
5.89k
                    ps_dec->ps_nmb_info += u1_num_mbs;
2866
5.89k
                    ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
2867
5.89k
                }
2868
4.63k
                else
2869
4.63k
                {
2870
4.63k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
2871
4.63k
                                                u1_tfr_n_mb, u1_end_of_row);
2872
4.63k
                }
2873
10.5k
                ps_dec->u4_total_mbs_coded += u1_num_mbs;
2874
10.5k
                ps_dec->u4_mb_idx = 0;
2875
10.5k
                ps_dec->u4_num_mbs_cur_nmb = 0;
2876
10.5k
            }
2877
2878
44.9k
            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
44.9k
            if(ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice <
2886
44.9k
               (UWORD32) (ps_dec->u4_total_mbs_coded >> ps_slice->u1_mbaff_frame_flag))
2887
44.8k
            {
2888
44.8k
                ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
2889
44.8k
                ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
2890
44.8k
                ps_dec->u2_cur_slice_num++;
2891
44.8k
                ps_dec->ps_parse_cur_slice++;
2892
44.8k
            }
2893
44.9k
        }
2894
224
        else
2895
224
        {
2896
            // Slice missing / header corrupted
2897
224
            ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
2898
224
        }
2899
45.3k
    }
2900
2901
    /******************************************************/
2902
    /* Initializations to new slice                       */
2903
    /******************************************************/
2904
95.7k
    {
2905
95.7k
        WORD32 num_entries;
2906
95.7k
        WORD32 size;
2907
95.7k
        UWORD8 *pu1_buf;
2908
2909
95.7k
        num_entries = MAX_FRAMES;
2910
95.7k
        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
95.7k
        num_entries = ((2 * num_entries) + 1);
2915
95.7k
        num_entries *= 2;
2916
2917
95.7k
        size = num_entries * sizeof(void *);
2918
95.7k
        size += PAD_MAP_IDX_POC * sizeof(void *);
2919
2920
95.7k
        pu1_buf = (UWORD8 *) ps_dec->pv_map_ref_idx_to_poc_buf;
2921
95.7k
        pu1_buf += size * ps_dec->u2_cur_slice_num;
2922
95.7k
        ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **) pu1_buf;
2923
95.7k
    }
2924
95.7k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
2925
95.7k
    ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u4_total_mbs_coded >> u1_mbaff;
2926
95.7k
    ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0;
2927
95.7k
    ps_dec->ps_cur_slice->i1_slice_beta_offset = 0;
2928
2929
95.7k
    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
95.7k
    ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u4_total_mbs_coded >> u1_mbaff;
2933
95.7k
    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd;
2934
2935
95.7k
    if(ps_dec->u1_separate_parse)
2936
44.3k
    {
2937
44.3k
        ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
2938
44.3k
    }
2939
51.3k
    else
2940
51.3k
    {
2941
51.3k
        ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
2942
51.3k
    }
2943
2944
    /******************************************************/
2945
    /* Initializations specific to P slice                */
2946
    /******************************************************/
2947
95.7k
    u1_inter_mb_type = P_MB;
2948
95.7k
    u1_deblk_mb_type = D_INTER_MB;
2949
2950
95.7k
    ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
2951
95.7k
    ps_dec->ps_parse_cur_slice->slice_type = P_SLICE;
2952
95.7k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
2953
95.7k
    ps_dec->ps_part = ps_dec->ps_parse_part_params;
2954
95.7k
    ps_dec->u2_mbx =
2955
95.7k
        (MOD(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
2956
95.7k
    ps_dec->u2_mby =
2957
95.7k
        (DIV(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
2958
95.7k
    ps_dec->u2_mby <<= u1_mbaff;
2959
2960
    /******************************************************/
2961
    /* Parsing / decoding the slice                       */
2962
    /******************************************************/
2963
95.7k
    ret = isvcd_parse_interlayer_resamp_func_init(ps_svc_lyr_dec,
2964
95.7k
                                                  ps_dec->ps_cur_slice->u2_first_mb_in_slice);
2965
95.7k
    ps_dec->u1_slice_header_done = 2;
2966
2967
95.7k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
2968
95.7k
    ih264d_update_qp(ps_dec, 0);
2969
95.7k
    u1_mb_idx = ps_dec->u4_mb_idx;
2970
95.7k
    ps_parse_mb_data = ps_dec->ps_parse_mb_data;
2971
95.7k
    u1_num_mbs = u1_mb_idx;
2972
95.7k
    u1_slice_end = 0;
2973
95.7k
    u1_tfr_n_mb = 0;
2974
95.7k
    u1_decode_nmb = 0;
2975
95.7k
    i2_cur_mb_addr = ps_dec->u4_total_mbs_coded;
2976
95.7k
    i2_mb_skip_run = num_mb_skip;
2977
95.7k
    if(0 == ps_dec->u4_total_mbs_coded)
2978
50.4k
    {
2979
50.4k
        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
50.4k
        ps_dec->ps_cur_mb_row += 2;
2982
50.4k
        ps_dec->ps_top_mb_row = ps_dec->ps_nbr_mb_row;
2983
50.4k
        ps_dec->ps_top_mb_row +=
2984
50.4k
            ((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
50.4k
        ps_dec->ps_top_mb_row += 2;
2987
2988
        /* CHANGED CODE */
2989
50.4k
        ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
2990
50.4k
        ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
2991
50.4k
        ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
2992
50.4k
        ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
2993
50.4k
        ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv;
2994
50.4k
        ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv;
2995
50.4k
        ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag;
2996
50.4k
        ps_dec->ps_part = ps_dec->ps_parse_part_params;
2997
50.4k
        ps_dec->pf_mvpred_ref_tfr_nby2mb = isvcd_mv_pred_ref_tfr_nby2_epmb;
2998
50.4k
    }
2999
11.2M
    while(!u1_slice_end)
3000
11.1M
    {
3001
11.1M
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) break;
3002
3003
11.1M
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
3004
11.1M
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
3005
11.1M
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
3006
11.1M
        ps_cur_mb_info->u1_Mux = 0;
3007
11.1M
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
3008
11.1M
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
3009
11.1M
        ps_cur_mb_info->u1_end_of_slice = 0;
3010
3011
        /* Storing Default partition info */
3012
11.1M
        ps_parse_mb_data->u1_num_part = 1;
3013
11.1M
        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
11.1M
        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
11.1M
        else
3022
11.1M
            isvcd_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info,
3023
11.1M
                                             i2_mb_skip_run);
3024
3025
11.1M
        {
3026
11.1M
            UWORD16 *pu2_res_luma_csbp;
3027
3028
            /*Pointer assignment for Residual NNZ */
3029
11.1M
            pu2_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
3030
11.1M
            pu2_res_luma_csbp +=
3031
11.1M
                ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
3032
11.1M
            *pu2_res_luma_csbp = 0;
3033
11.1M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
3034
11.1M
                ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
3035
11.1M
                (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
3036
11.1M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_INTER_MB;
3037
11.1M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size =
3038
11.1M
                ps_cur_mb_info->u1_tran_form8x8;
3039
11.1M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
3040
11.1M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
3041
11.1M
        }
3042
3043
        /* Set the deblocking parameters for this MB */
3044
11.1M
        if(ps_dec->u4_app_disable_deblk_frm == 0)
3045
11.1M
        {
3046
11.1M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
3047
11.1M
                                             ps_dec->u1_mb_ngbr_availablity,
3048
11.1M
                                             ps_dec->u1_cur_mb_fld_dec_flag);
3049
11.1M
        }
3050
3051
        /* Set appropriate flags in ps_cur_mb_info and ps_dec */
3052
11.1M
        ps_dec->i1_prev_mb_qp_delta = 0;
3053
11.1M
        ps_dec->u1_sub_mb_num = 0;
3054
11.1M
        ps_cur_mb_info->u1_mb_type = MB_SKIP;
3055
11.1M
        ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
3056
11.1M
        ps_cur_mb_info->u1_cbp = 0;
3057
3058
        /* set appropriat flags in svc cur MB info */
3059
11.1M
        ps_svc_cur_mb_info->u1_base_mode_flag = 0;
3060
11.1M
        ps_svc_cur_mb_info->u1_residual_prediction_flag = 0;
3061
11.1M
        ps_svc_cur_mb_info->u1_crop_window_flag = 0;
3062
11.1M
        ps_svc_cur_mb_info->au1_motion_pred_flag[0] = 0;
3063
11.1M
        ps_svc_cur_mb_info->au1_motion_pred_flag[1] = 0;
3064
3065
        /* Storing Skip partition info */
3066
11.1M
        ps_part_info = ps_dec->ps_part;
3067
11.1M
        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
3068
11.1M
        ps_part_info->u1_sub_mb_num = 0;
3069
11.1M
        ps_dec->ps_part++;
3070
3071
        /* Update Nnzs */
3072
11.1M
        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
3073
3074
11.1M
        ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
3075
11.1M
        ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
3076
3077
11.1M
        if(ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER)
3078
321k
        {
3079
321k
            ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
3080
321k
        }
3081
3082
11.1M
        i2_mb_skip_run--;
3083
11.1M
        ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
3084
3085
11.1M
        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
11.1M
        i2_cur_mb_addr++;
3094
11.1M
        u1_num_mbs++;
3095
11.1M
        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
11.1M
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
3103
11.1M
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
3104
11.1M
        u1_slice_end = !i2_mb_skip_run;
3105
11.1M
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || u1_slice_end;
3106
11.1M
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
3107
11.1M
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
3108
3109
11.1M
        if(u1_decode_nmb)
3110
1.86M
        {
3111
1.86M
            if((ps_dec->i4_submb_ofst - ((WORD32) ((u1_num_mbs - u1_mb_idx) << 4))) < 0)
3112
31.5k
            {
3113
31.5k
                ps_dec->i4_submb_ofst = ((u1_num_mbs - u1_mb_idx) << 4);
3114
31.5k
            }
3115
3116
1.86M
            ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
3117
1.86M
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
3118
1.86M
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
3119
3120
1.86M
            if(ps_dec->u1_separate_parse)
3121
927k
            {
3122
927k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
3123
927k
                                     u1_end_of_row);
3124
927k
                ps_dec->ps_nmb_info += u1_num_mbs;
3125
927k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
3126
927k
            }
3127
935k
            else
3128
935k
            {
3129
935k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
3130
843k
                {
3131
843k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
3132
843k
                                                u1_tfr_n_mb, u1_end_of_row);
3133
843k
                }
3134
92.2k
                else
3135
92.2k
                {
3136
92.2k
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
3137
92.2k
                                                        u1_num_mbs_next, u1_tfr_n_mb,
3138
92.2k
                                                        u1_end_of_row);
3139
92.2k
                }
3140
935k
            }
3141
1.86M
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
3142
1.86M
            if(u1_tfr_n_mb) u1_num_mbs = 0;
3143
1.86M
            u1_mb_idx = u1_num_mbs;
3144
1.86M
            ps_dec->u4_mb_idx = u1_num_mbs;
3145
1.86M
        }
3146
11.1M
    }
3147
3148
95.7k
    ps_dec->u4_num_mbs_cur_nmb = 0;
3149
95.7k
    ps_dec->ps_cur_slice->u4_mbs_in_slice =
3150
95.7k
        i2_cur_mb_addr - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice;
3151
3152
95.7k
    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
95.7k
    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
95.7k
    ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
3162
95.7k
    ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
3163
3164
95.7k
    if(ps_dec->u4_total_mbs_coded >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
3165
95.4k
    {
3166
95.4k
        ps_dec->u1_pic_decode_done = 1;
3167
95.4k
    }
3168
3169
95.7k
    return 0;
3170
95.8k
}
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
229k
{
3185
229k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
3186
229k
    dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
3187
229k
    WORD32 ret = OK;
3188
229k
    if(ps_svc_lyr_dec->u1_res_init_done == 1)
3189
95.7k
        return ret;
3190
3191
134k
    if(TARGET_LAYER != ps_svc_lyr_dec->u1_layer_identifier)
3192
43.5k
    {
3193
43.5k
        ps_slice->u1_disable_dblk_filter_idc = ps_svc_lyr_dec->u1_inter_lyr_disable_dblk_filter_idc;
3194
43.5k
        ps_slice->i1_slice_alpha_c0_offset = ps_svc_lyr_dec->i1_inter_lyr_slice_alpha_c0_offset;
3195
43.5k
        ps_slice->i1_slice_beta_offset = ps_svc_lyr_dec->i1_inter_lyr_slice_beta_offset;
3196
43.5k
    }
3197
3198
134k
    if(0 == u2_first_mb_in_slice)
3199
134k
    {
3200
134k
        ret = isvcd_populate_res_prms(ps_svc_lyr_dec);
3201
134k
        if(ret != OK) return NOT_OK;
3202
133k
        isvcd_crop_wnd_flag_res_int(ps_svc_lyr_dec);
3203
133k
        ret = isvcd_comp_mode_mv_res_init(ps_svc_lyr_dec);
3204
133k
        if(ret != OK) return NOT_OK;
3205
133k
        ret = isvcd_ii_pred_res_init(ps_svc_lyr_dec);
3206
133k
        if(ret != OK) return NOT_OK;
3207
133k
        ret = isvcd_intra_resamp_res_init(ps_svc_lyr_dec);
3208
133k
        if(ret != OK) return NOT_OK;
3209
133k
        ret = isvcd_residual_samp_res_init(ps_svc_lyr_dec);
3210
133k
        if(ret != OK) return NOT_OK;
3211
3212
133k
        ps_svc_lyr_dec->u1_res_init_done = 1;
3213
133k
    }
3214
3215
133k
    return ret;
3216
134k
}
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
63.7k
{
3232
63.7k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
3233
63.7k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
3234
63.7k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
3235
63.7k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
3236
63.7k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
3237
63.7k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
3238
63.7k
    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
3239
63.7k
    UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
3240
63.7k
    UWORD64 u8_ref_idx_l0;
3241
63.7k
    UWORD32 u4_temp;
3242
63.7k
    WORD32 i_temp;
3243
63.7k
    WORD32 ret;
3244
63.7k
    WORD64 i8_temp;
3245
3246
    /*--------------------------------------------------------------------*/
3247
    /* Read remaining contents of the slice header                        */
3248
    /*--------------------------------------------------------------------*/
3249
63.7k
    {
3250
63.7k
        WORD8 *pi1_buf;
3251
63.7k
        WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
3252
63.7k
        WORD32 *pi4_mv = (WORD32 *) pi2_mv;
3253
63.7k
        WORD16 *pi16_refFrame;
3254
3255
63.7k
        pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
3256
63.7k
        pi16_refFrame = (WORD16 *) pi1_buf;
3257
63.7k
        *pi4_mv = 0;
3258
63.7k
        *(pi4_mv + 1) = 0;
3259
63.7k
        *pi16_refFrame = OUT_OF_RANGE_REF;
3260
63.7k
        ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8) -1;
3261
63.7k
        ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8) -1;
3262
63.7k
    }
3263
3264
63.7k
    ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(ps_bitstrm);
3265
63.7k
    COPYTHECONTEXT("SH: num_ref_idx_override_flag",
3266
63.7k
                   ps_cur_slice->u1_num_ref_idx_active_override_flag);
3267
3268
63.7k
    u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
3269
63.7k
    if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
3270
37.4k
    {
3271
37.4k
        u8_ref_idx_l0 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64) 1;
3272
37.4k
    }
3273
3274
63.7k
    {
3275
63.7k
        UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS << u1_field_pic_flag;
3276
63.7k
        if(u8_ref_idx_l0 >= u1_max_ref_idx)
3277
758
        {
3278
758
            return ERROR_NUM_REF;
3279
758
        }
3280
63.0k
        ps_cur_slice->u1_num_ref_idx_lx_active[0] = (UWORD8) u8_ref_idx_l0;
3281
63.0k
        COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
3282
63.0k
                       ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
3283
63.0k
    }
3284
3285
0
    {
3286
63.0k
        UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
3287
63.0k
        COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0", uc_refIdxReFlagL0);
3288
3289
63.0k
        ih264d_init_ref_idx_lx_p(ps_dec);
3290
        /* Store the value for future slices in the same picture */
3291
63.0k
        ps_dec->u1_num_ref_idx_lx_active_prev = ps_cur_slice->u1_num_ref_idx_lx_active[0];
3292
3293
        /* Modified temporarily */
3294
63.0k
        if(uc_refIdxReFlagL0)
3295
26.1k
        {
3296
26.1k
            WORD8 ret;
3297
26.1k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
3298
26.1k
            ret = ih264d_ref_idx_reordering(ps_dec, 0);
3299
26.1k
            if(ret == -1) return ERROR_REFIDX_ORDER_T;
3300
26.1k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
3301
26.1k
        }
3302
36.8k
        else
3303
36.8k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
3304
63.0k
    }
3305
    /* Create refIdx to POC mapping */
3306
63.0k
    {
3307
63.0k
        void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
3308
63.0k
        WORD8 idx;
3309
63.0k
        struct pic_buffer_t *ps_pic;
3310
3311
63.0k
        pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
3312
63.0k
        pui_map_ref_idx_to_poc_lx0[0] = 0;
3313
63.0k
        pui_map_ref_idx_to_poc_lx0++;
3314
189k
        for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
3315
126k
        {
3316
126k
            ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
3317
126k
            pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
3318
126k
        }
3319
3320
        /* Bug Fix Deblocking */
3321
63.0k
        pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
3322
63.0k
        pui_map_ref_idx_to_poc_lx1[0] = 0;
3323
3324
63.0k
        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
63.0k
    }
3351
63.0k
    if(ps_pps->u1_wted_pred_flag)
3352
16.1k
    {
3353
16.1k
        ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
3354
16.1k
        if(ret != OK) return ret;
3355
3356
11.3k
        ih264d_form_pred_weight_matrix(ps_dec);
3357
11.3k
        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
3358
11.3k
    }
3359
46.9k
    else
3360
46.9k
    {
3361
46.9k
        ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
3362
46.9k
        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
3363
46.9k
    }
3364
3365
58.3k
    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd;
3366
3367
58.3k
    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
58.3k
    if(ps_cur_slice->u1_nal_ref_idc != 0)
3374
56.2k
    {
3375
56.2k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
3376
56.0k
        {
3377
56.0k
            dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
3378
56.0k
            dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
3379
56.0k
            UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
3380
3381
56.0k
            ps_pps->ps_sps = ps_dec->ps_cur_sps;
3382
56.0k
            if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
3383
54.2k
                ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
3384
3385
56.0k
            i_temp = ih264d_read_mmco_commands(ps_dec);
3386
3387
56.0k
            ps_pps->ps_sps = ps_sps_tmp;
3388
56.0k
            ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
3389
3390
56.0k
            if(i_temp < 0)
3391
101
            {
3392
101
                return ERROR_DBP_MANAGER_T;
3393
101
            }
3394
55.9k
            ps_dec->u4_bitoffset = i_temp;
3395
55.9k
        }
3396
196
        else
3397
196
            ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
3398
56.2k
    }
3399
    /* G050 */
3400
3401
58.2k
    if(ps_pps->u1_entropy_coding_mode == CABAC)
3402
9.13k
    {
3403
9.13k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3404
3405
9.13k
        if(u4_temp > MAX_CABAC_INIT_IDC)
3406
1.14k
        {
3407
1.14k
            return ERROR_INV_SLICE_HDR_T;
3408
1.14k
        }
3409
7.98k
        ps_cur_slice->u1_cabac_init_idc = u4_temp;
3410
7.98k
        COPYTHECONTEXT("SH: cabac_init_idc", ps_cur_slice->u1_cabac_init_idc);
3411
7.98k
    }
3412
3413
    /* Read slice_qp_delta */
3414
57.0k
    i8_temp = (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3415
57.0k
    if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
3416
2.97k
    {
3417
2.97k
        return ERROR_INV_RANGE_QP_T;
3418
2.97k
    }
3419
54.0k
    ps_cur_slice->u1_slice_qp = (UWORD8) i8_temp;
3420
54.0k
    COPYTHECONTEXT("SH: slice_qp_delta",
3421
54.0k
                   (WORD8) (ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
3422
3423
54.0k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
3424
29.5k
    {
3425
29.5k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
3426
29.5k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
3427
1.03k
        {
3428
1.03k
            return ERROR_INV_SLICE_HDR_T;
3429
1.03k
        }
3430
3431
28.5k
        COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
3432
28.5k
        ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
3433
28.5k
        if(u4_temp != 1)
3434
24.0k
        {
3435
24.0k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
3436
24.0k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
3437
374
            {
3438
374
                return ERROR_INV_SLICE_HDR_T;
3439
374
            }
3440
23.6k
            ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
3441
23.6k
            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
3442
23.6k
                           ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
3443
3444
23.6k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
3445
23.6k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
3446
548
            {
3447
548
                return ERROR_INV_SLICE_HDR_T;
3448
548
            }
3449
23.0k
            ps_cur_slice->i1_slice_beta_offset = i_temp;
3450
23.0k
            COPYTHECONTEXT("SH: slice_beta_offset_div2", ps_cur_slice->i1_slice_beta_offset >> 1);
3451
23.0k
        }
3452
4.53k
        else
3453
4.53k
        {
3454
4.53k
            ps_cur_slice->i1_slice_alpha_c0_offset = 0;
3455
4.53k
            ps_cur_slice->i1_slice_beta_offset = 0;
3456
4.53k
        }
3457
28.5k
    }
3458
24.5k
    else
3459
24.5k
    {
3460
24.5k
        ps_cur_slice->u1_disable_dblk_filter_idc = 0;
3461
24.5k
        ps_cur_slice->i1_slice_alpha_c0_offset = 0;
3462
24.5k
        ps_cur_slice->i1_slice_beta_offset = 0;
3463
24.5k
    }
3464
3465
52.1k
    ps_dec->u1_slice_header_done = 2;
3466
52.1k
    if(ps_pps->u1_entropy_coding_mode)
3467
7.85k
    {
3468
7.85k
        SWITCHOFFTRACE;
3469
7.85k
        SWITCHONTRACECABAC;
3470
7.85k
        ps_svc_lyr_dec->pf_parse_svc_inter_slice = isvcd_parse_inter_slice_data_cabac;
3471
7.85k
        ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
3472
7.85k
        ih264d_init_cabac_contexts(P_SLICE, ps_dec);
3473
3474
7.85k
        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
7.85k
        else
3477
7.85k
            ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
3478
7.85k
    }
3479
44.2k
    else
3480
44.2k
    {
3481
44.2k
        SWITCHONTRACE;
3482
44.2k
        SWITCHOFFTRACECABAC;
3483
44.2k
        ps_svc_lyr_dec->pf_parse_svc_inter_slice = isvcd_parse_inter_slice_data_cavlc;
3484
44.2k
        ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
3485
44.2k
        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
44.2k
        else
3490
44.2k
            ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
3491
44.2k
    }
3492
3493
52.1k
    ps_dec->u1_B = 0;
3494
52.1k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
3495
52.1k
    ret = ps_svc_lyr_dec->pf_parse_svc_inter_slice(ps_svc_lyr_dec, ps_cur_slice,
3496
52.1k
                                                   u2_first_mb_in_slice);
3497
52.1k
    if(ret != OK) return ret;
3498
3499
38.1k
    return OK;
3500
52.1k
}