Coverage Report

Created: 2025-08-26 06:38

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