Coverage Report

Created: 2025-10-10 06:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/svc/isvcd_parse_eislice.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2022 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
 */
20
/**
21
 *******************************************************************************
22
 * @file
23
 *  isvcd_parse_eislice.c
24
 *
25
 * @brief
26
 *  Contains routines that decode a EI slice type
27
 *
28
 * @author
29
 *  Kishore
30
 *
31
 * @par List of Functions:
32
 *  - isvcd_parse_islice_data_cabac()
33
 *  - isvcd_parse_islice_data_cavlc()
34
 *  - isvcd_parse_imb_cavlc()
35
 *  - isvcd_parse_eislice()
36
 *  - isvcd_parse_eislice_data_cabac()
37
 *  - isvcd_parse_eislice_data_cavlc()
38
 *  - isvcd_parse_imb_cabac()
39
 *  - isvcd_parse_islice()
40
 *
41
 * @remarks
42
 *  None
43
 *
44
 *******************************************************************************
45
 */
46
47
#include <string.h>
48
#include "ih264_defs.h"
49
#include "ih264d_error_handler.h"
50
#include "ih264d_debug.h"
51
#include "ih264d_bitstrm.h"
52
#include "ih264d_defs.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_deblocking.h"
58
#include "ih264d_cabac.h"
59
#include "ih264d_parse_cabac.h"
60
#include "ih264d_parse_mb_header.h"
61
#include "ih264d_parse_slice.h"
62
#include "ih264d_process_pslice.h"
63
#include "isvcd_process_epslice.h"
64
#include "ih264d_process_intra_mb.h"
65
#include "ih264d_parse_islice.h"
66
#include "ih264d_error_handler.h"
67
#include "ih264d_mvpred.h"
68
#include "ih264d_thread_parse_decode.h"
69
#include "ithread.h"
70
#include "ih264d_parse_mb_header.h"
71
#include "assert.h"
72
#include "ih264d_utils.h"
73
#include "ih264d_format_conv.h"
74
#include "ih264d_parse_headers.h"
75
#include "isvcd_parse_headers.h"
76
#include "isvcd_parse_slice.h"
77
#include "isvcd_mb_utils.h"
78
79
void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec);
80
void isvcd_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec);
81
82
/*****************************************************************************/
83
/*                                                                           */
84
/*  Function Name : isvcd_parse_islice_data_cabac                            */
85
/*                                                                           */
86
/*  Description   : This function parses cabac syntax of a inter slice on    */
87
/*                  N MB basis.                                              */
88
/*                                                                           */
89
/*  Inputs        : ps_dec                                                   */
90
/*                  sliceparams                                              */
91
/*                  firstMbInSlice                                           */
92
/*                                                                           */
93
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
94
/*                     decoded till the end of slice.                        */
95
/*                                                                           */
96
/*  Returns       : 0                                                        */
97
/*                                                                           */
98
/*  Issues        : <List any issues or problems with this function>         */
99
/*                                                                           */
100
/*  Revision History:                                                        */
101
/*                                                                           */
102
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
103
/*         24 06 2005   Kishore         Draft                                */
104
/*                                                                           */
105
/*****************************************************************************/
106
WORD32 isvcd_parse_islice_data_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
107
                                     dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
108
3.54k
{
109
3.54k
    UWORD8 uc_more_data_flag;
110
3.54k
    UWORD32 u4_num_mbs, u4_mb_idx;
111
3.54k
    dec_mb_info_t *ps_cur_mb_info;
112
3.54k
    deblk_mb_t *ps_cur_deblk_mb;
113
3.54k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
114
3.54k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
115
3.54k
    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
116
3.54k
    WORD32 i4_cur_mb_addr;
117
3.54k
    UWORD8 u1_mbaff;
118
3.54k
    UWORD32 u4_num_mbs_next, u4_end_of_row, u4_tfr_n_mb;
119
3.54k
    WORD32 ret = OK;
120
121
3.54k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
122
3.54k
    ih264d_update_qp(ps_dec, 0);
123
3.54k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
124
125
3.54k
    if(ps_bitstrm->u4_ofst & 0x07)
126
2.89k
    {
127
2.89k
        ps_bitstrm->u4_ofst += 8;
128
2.89k
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
129
2.89k
    }
130
3.54k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
131
3.54k
    if(ret != OK) return ret;
132
3.24k
    ih264d_init_cabac_contexts(I_SLICE, ps_dec);
133
134
3.24k
    ps_dec->i1_prev_mb_qp_delta = 0;
135
136
    /* initializations */
137
3.24k
    u4_mb_idx = ps_dec->u4_mb_idx;
138
3.24k
    u4_num_mbs = u4_mb_idx;
139
3.24k
    uc_more_data_flag = 1;
140
3.24k
    i4_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
141
3.24k
    do
142
74.2k
    {
143
74.2k
        UWORD16 u2_mbx;
144
74.2k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
145
146
74.2k
        if(i4_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
147
101
        {
148
101
            break;
149
101
        }
150
151
74.1k
        {
152
74.1k
            UWORD8 u1_mb_type;
153
74.1k
            ps_cur_mb_info = ps_dec->ps_nmb_info + u4_num_mbs;
154
74.1k
            ps_dec->u4_num_mbs_cur_nmb = u4_num_mbs;
155
74.1k
            ps_dec->u4_num_pmbair = (u4_num_mbs >> u1_mbaff);
156
74.1k
            ps_cur_mb_info->u1_end_of_slice = 0;
157
158
            /***************************************************************/
159
            /* Get the required information for decoding of MB                  */
160
            /* mb_x, mb_y , neighbour availablity,                              */
161
            /***************************************************************/
162
74.1k
            ps_dec->pf_get_mb_info(ps_dec, i4_cur_mb_addr, ps_cur_mb_info, 0);
163
74.1k
            u2_mbx = ps_dec->u2_mbx;
164
165
            /*********************************************************************/
166
            /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
167
            /*********************************************************************/
168
74.1k
            ps_cur_mb_info->u1_tran_form8x8 = 0;
169
74.1k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
170
171
            /***************************************************************/
172
            /* Set the deblocking parameters for this MB                   */
173
            /***************************************************************/
174
74.1k
            ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_num_mbs;
175
74.1k
            if(ps_dec->u4_app_disable_deblk_frm == 0)
176
74.1k
                ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
177
74.1k
                                                 ps_dec->u1_mb_ngbr_availablity,
178
74.1k
                                                 ps_dec->u1_cur_mb_fld_dec_flag);
179
180
74.1k
            ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
181
182
            /* Macroblock Layer Begins */
183
            /* Decode the u1_mb_type */
184
74.1k
            u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
185
74.1k
            if(u1_mb_type > 25) return ERROR_MB_TYPE;
186
74.1k
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
187
74.1k
            COPYTHECONTEXT("u1_mb_type", u1_mb_type);
188
189
            /* Parse Macroblock Data */
190
74.1k
            if(25 == u1_mb_type)
191
436
            {
192
                /* I_PCM_MB */
193
436
                ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
194
436
                ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u4_num_mbs);
195
436
                if(ret != OK) return ret;
196
134
                ps_cur_deblk_mb->u1_mb_qp = 0;
197
134
            }
198
73.6k
            else
199
73.6k
            {
200
73.6k
                ret = ih264d_parse_imb_cabac(ps_dec, ps_cur_mb_info, u1_mb_type);
201
73.6k
                if(ret != OK) return ret;
202
71.3k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
203
71.3k
            }
204
205
71.5k
            if(ps_dec->u1_enable_mb_info)
206
0
            {
207
0
                ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
208
0
                                            ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
209
0
            }
210
71.5k
            if(u1_mbaff)
211
0
            {
212
0
                ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
213
0
            }
214
215
71.5k
            if(ps_cur_mb_info->u1_topmb && u1_mbaff)
216
0
                uc_more_data_flag = 1;
217
71.5k
            else
218
71.5k
            {
219
71.5k
                uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
220
71.5k
                uc_more_data_flag = !uc_more_data_flag;
221
71.5k
                COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
222
71.5k
            }
223
224
71.5k
            if(u1_mbaff)
225
0
            {
226
0
                if(!uc_more_data_flag && (0 == (i4_cur_mb_addr & 1)))
227
0
                {
228
0
                    return ERROR_EOB_FLUSHBITS_T;
229
0
                }
230
0
            }
231
            /* Next macroblock information */
232
71.5k
            i4_cur_mb_addr++;
233
            /* Store the colocated information */
234
71.5k
            {
235
71.5k
                mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u4_num_mbs << 4);
236
71.5k
                mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
237
71.5k
                ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
238
71.5k
                                   (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
239
71.5k
            }
240
            /*if num _cores is set to 3,compute bs will be done in another thread*/
241
71.5k
            if(ps_dec->u4_num_cores < 3)
242
71.5k
            {
243
71.5k
                if(ps_dec->u4_app_disable_deblk_frm == 0)
244
71.5k
                    ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
245
71.5k
                                                      (UWORD16) (u4_num_mbs >> u1_mbaff));
246
71.5k
            }
247
71.5k
            u4_num_mbs++;
248
71.5k
        }
249
250
        /****************************************************************/
251
        /* Check for End Of Row                                         */
252
        /****************************************************************/
253
0
        u4_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
254
71.5k
        u4_end_of_row = (!u4_num_mbs_next) && (!(u1_mbaff && (u4_num_mbs & 0x01)));
255
71.5k
        u4_tfr_n_mb =
256
71.5k
            (u4_num_mbs == ps_dec->u4_recon_mb_grp) || u4_end_of_row || (!uc_more_data_flag);
257
71.5k
        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
258
259
71.5k
        if(u4_tfr_n_mb || (!uc_more_data_flag))
260
13.0k
        {
261
13.0k
            if(ps_dec->u1_separate_parse)
262
4.83k
            {
263
4.83k
                ih264d_parse_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next, u4_tfr_n_mb,
264
4.83k
                                     u4_end_of_row);
265
4.83k
                ps_dec->ps_nmb_info += u4_num_mbs;
266
4.83k
                ps_svc_lyr_dec->ps_svc_nmb_info += u4_num_mbs;
267
4.83k
            }
268
8.25k
            else
269
8.25k
            {
270
8.25k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
271
6.35k
                {
272
6.35k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next,
273
6.35k
                                                u4_tfr_n_mb, u4_end_of_row);
274
6.35k
                }
275
1.89k
                else
276
1.89k
                {
277
1.89k
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u4_mb_idx, u4_num_mbs,
278
1.89k
                                                        u4_num_mbs_next, u4_tfr_n_mb,
279
1.89k
                                                        u4_end_of_row);
280
1.89k
                }
281
8.25k
            }
282
13.0k
            ps_dec->u4_total_mbs_coded += u4_num_mbs;
283
13.0k
            if(u4_tfr_n_mb) u4_num_mbs = 0;
284
13.0k
            u4_mb_idx = u4_num_mbs;
285
13.0k
            ps_dec->u4_mb_idx = u4_num_mbs;
286
13.0k
        }
287
71.5k
    } while(uc_more_data_flag);
288
289
652
    ps_dec->u4_num_mbs_cur_nmb = 0;
290
652
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i4_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
291
292
652
    return ret;
293
3.24k
}
294
295
/*****************************************************************************/
296
/*                                                                           */
297
/*  Function Name : isvcd_parse_islice_data_cavlc                            */
298
/*                                                                           */
299
/*  Description   : This function parses cabac syntax of a inter slice on    */
300
/*                  N MB basis.                                              */
301
/*                                                                           */
302
/*  Inputs        : ps_dec                                                   */
303
/*                  sliceparams                                              */
304
/*                  firstMbInSlice                                           */
305
/*                                                                           */
306
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
307
/*                     decoded till the end of slice.                        */
308
/*                                                                           */
309
/*  Returns       : 0                                                        */
310
/*                                                                           */
311
/*  Issues        : <List any issues or problems with this function>         */
312
/*                                                                           */
313
/*  Revision History:                                                        */
314
/*                                                                           */
315
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
316
/*         24 06 2005   Kishore         Draft                                */
317
/*                                                                           */
318
/*****************************************************************************/
319
320
WORD32 isvcd_parse_islice_data_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
321
                                     dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
322
2.48k
{
323
2.48k
    UWORD8 uc_more_data_flag;
324
2.48k
    UWORD32 u4_num_mbs, u4_mb_idx;
325
2.48k
    dec_mb_info_t *ps_cur_mb_info;
326
2.48k
    deblk_mb_t *ps_cur_deblk_mb;
327
2.48k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
328
2.48k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
329
2.48k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
330
2.48k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
331
2.48k
    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
332
2.48k
    WORD32 i4_cur_mb_addr;
333
2.48k
    UWORD8 u1_mbaff;
334
2.48k
    UWORD32 u4_num_mbs_next, u4_end_of_row, u4_tfr_n_mb;
335
2.48k
    WORD32 ret = OK;
336
337
2.48k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
338
2.48k
    ih264d_update_qp(ps_dec, 0);
339
2.48k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
340
341
    /* initializations */
342
2.48k
    u4_mb_idx = ps_dec->u4_mb_idx;
343
2.48k
    u4_num_mbs = u4_mb_idx;
344
345
2.48k
    uc_more_data_flag = 1;
346
2.48k
    i4_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
347
2.48k
    do
348
77.1k
    {
349
77.1k
        UWORD8 u1_mb_type;
350
77.1k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
351
77.1k
        if(i4_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
352
81
        {
353
81
            break;
354
81
        }
355
356
77.0k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u4_num_mbs;
357
77.0k
        ps_dec->u4_num_mbs_cur_nmb = u4_num_mbs;
358
77.0k
        ps_dec->u4_num_pmbair = (u4_num_mbs >> u1_mbaff);
359
77.0k
        ps_cur_mb_info->u1_end_of_slice = 0;
360
361
        /***************************************************************/
362
        /* Get the required information for decoding of MB             */
363
        /* mb_x, mb_y , neighbour availablity,                         */
364
        /***************************************************************/
365
77.0k
        ps_dec->pf_get_mb_info(ps_dec, i4_cur_mb_addr, ps_cur_mb_info, 0);
366
367
        /***************************************************************/
368
        /* Set the deblocking parameters for this MB                   */
369
        /***************************************************************/
370
77.0k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_num_mbs;
371
77.0k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
372
77.0k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
373
77.0k
                                             ps_dec->u1_mb_ngbr_availablity,
374
77.0k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
375
376
77.0k
        ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
377
378
        /**************************************************************/
379
        /* Macroblock Layer Begins, Decode the u1_mb_type             */
380
        /**************************************************************/
381
        /* Inlined ih264d_uev */
382
77.0k
        {
383
77.0k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
384
77.0k
            UWORD32 u4_word, u4_ldz, u4_temp;
385
386
            /***************************************************************/
387
            /* Find leading zeros in next 32 bits                          */
388
            /***************************************************************/
389
77.0k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
390
77.0k
            u4_ldz = CLZ(u4_word);
391
            /* Flush the ps_bitstrm */
392
77.0k
            u4_bitstream_offset += (u4_ldz + 1);
393
            /* Read the suffix from the ps_bitstrm */
394
77.0k
            u4_word = 0;
395
77.0k
            if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
396
77.0k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
397
77.0k
            u4_temp = ((1 << u4_ldz) + u4_word - 1);
398
77.0k
            if(u4_temp > 25) return ERROR_MB_TYPE;
399
76.8k
            u1_mb_type = u4_temp;
400
76.8k
        }
401
        /* Inlined ih264d_uev */
402
0
        ps_cur_mb_info->u1_mb_type = u1_mb_type;
403
76.8k
        COPYTHECONTEXT("u1_mb_type", u1_mb_type);
404
405
        /**************************************************************/
406
        /* Parse Macroblock data                                      */
407
        /**************************************************************/
408
76.8k
        if(25 == u1_mb_type)
409
81
        {
410
            /* I_PCM_MB */
411
81
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
412
81
            ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u4_num_mbs);
413
81
            if(ret != OK) return ret;
414
81
            ps_cur_deblk_mb->u1_mb_qp = 0;
415
81
        }
416
76.7k
        else
417
76.7k
        {
418
76.7k
            ret = ih264d_parse_imb_cavlc(ps_dec, ps_cur_mb_info, u4_num_mbs, u1_mb_type);
419
76.7k
            if(ret != OK) return ret;
420
74.7k
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
421
74.7k
        }
422
74.8k
        if(ps_dec->u1_enable_mb_info)
423
0
        {
424
0
            ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
425
0
                                        ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
426
0
        }
427
74.8k
        uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
428
74.8k
        if(u1_mbaff)
429
0
        {
430
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
431
0
            if(!uc_more_data_flag && (0 == (i4_cur_mb_addr & 1)))
432
0
            {
433
0
                return ERROR_EOB_FLUSHBITS_T;
434
0
            }
435
0
        }
436
        /**************************************************************/
437
        /* Get next Macroblock address                                */
438
        /**************************************************************/
439
74.8k
        i4_cur_mb_addr++;
440
        /* Store the colocated information */
441
74.8k
        {
442
74.8k
            mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u4_num_mbs << 4);
443
74.8k
            mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
444
74.8k
            ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
445
74.8k
                               (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
446
74.8k
        }
447
448
        /*if num _cores is set to 3,compute bs will be done in another thread*/
449
74.8k
        if(ps_dec->u4_num_cores < 3)
450
74.8k
        {
451
74.8k
            if(ps_dec->u4_app_disable_deblk_frm == 0)
452
74.8k
                ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
453
74.8k
                                                  (UWORD16) (u4_num_mbs >> u1_mbaff));
454
74.8k
        }
455
74.8k
        u4_num_mbs++;
456
457
        /****************************************************************/
458
        /* Check for End Of Row                                         */
459
        /****************************************************************/
460
74.8k
        u4_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
461
74.8k
        u4_end_of_row = (!u4_num_mbs_next) && (!(u1_mbaff && (u4_num_mbs & 0x01)));
462
74.8k
        u4_tfr_n_mb =
463
74.8k
            (u4_num_mbs == ps_dec->u4_recon_mb_grp) || u4_end_of_row || (!uc_more_data_flag);
464
74.8k
        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
465
466
74.8k
        if(u4_tfr_n_mb || (!uc_more_data_flag))
467
6.37k
        {
468
6.37k
            if(ps_dec->u1_separate_parse)
469
2.35k
            {
470
2.35k
                ih264d_parse_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next, u4_tfr_n_mb,
471
2.35k
                                     u4_end_of_row);
472
2.35k
                ps_dec->ps_nmb_info += u4_num_mbs;
473
2.35k
                ps_svc_lyr_dec->ps_svc_nmb_info += u4_num_mbs;
474
2.35k
            }
475
4.01k
            else
476
4.01k
            {
477
4.01k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
478
3.80k
                {
479
3.80k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next,
480
3.80k
                                                u4_tfr_n_mb, u4_end_of_row);
481
3.80k
                }
482
215
                else
483
215
                {
484
215
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u4_mb_idx, u4_num_mbs,
485
215
                                                        u4_num_mbs_next, u4_tfr_n_mb,
486
215
                                                        u4_end_of_row);
487
215
                }
488
4.01k
            }
489
6.37k
            ps_dec->u4_total_mbs_coded += u4_num_mbs;
490
6.37k
            if(u4_tfr_n_mb) u4_num_mbs = 0;
491
6.37k
            u4_mb_idx = u4_num_mbs;
492
6.37k
            ps_dec->u4_mb_idx = u4_num_mbs;
493
6.37k
        }
494
74.8k
    } while(uc_more_data_flag);
495
496
269
    ps_dec->u4_num_mbs_cur_nmb = 0;
497
269
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i4_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
498
499
269
    return ret;
500
2.48k
}
501
/*!
502
**************************************************************************
503
* \if Function name : ParseIMb \endif
504
*
505
* \brief
506
*    This function parses CAVLC syntax of a I MB. If 16x16 Luma DC transform
507
*    is also done here. Transformed Luma DC values are copied in their
508
*    0th pixel location of corrosponding CoeffBlock.
509
*
510
* \return
511
*    0 on Success and Error code otherwise
512
**************************************************************************
513
*/
514
WORD32 isvcd_parse_imb_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
515
                             dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD32 u4_mb_num,
516
                             UWORD8 u1_mb_type)
517
212k
{
518
212k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
519
212k
    WORD32 i4_delta_qp;
520
212k
    UWORD32 u4_temp;
521
212k
    UWORD32 ui_is_top_mb_available;
522
212k
    UWORD32 ui_is_left_mb_available;
523
212k
    UWORD32 u4_cbp;
524
212k
    UWORD32 u4_offset;
525
212k
    UWORD32 *pu4_bitstrm_buf;
526
212k
    WORD32 ret;
527
212k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
528
212k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
529
212k
    UNUSED(u4_mb_num);
530
531
212k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
532
212k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
533
212k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
534
212k
    u4_temp = ps_dec->u1_mb_ngbr_availablity;
535
212k
    ui_is_top_mb_available = BOOLEAN(u4_temp & TOP_MB_AVAILABLE_MASK);
536
212k
    ui_is_left_mb_available = BOOLEAN(u4_temp & LEFT_MB_AVAILABLE_MASK);
537
212k
    pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
538
539
212k
    ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB;
540
212k
    if(!ps_svc_cur_mb_info->u1_base_mode_flag)
541
16.0k
    {
542
16.0k
        if(u1_mb_type == I_4x4_MB)
543
6.57k
        {
544
6.57k
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
545
6.57k
            u4_offset = 0;
546
547
            /*--------------------------------------------------------------------*/
548
            /* Read transform_size_8x8_flag if present                            */
549
            /*--------------------------------------------------------------------*/
550
6.57k
            if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag)
551
5.37k
            {
552
5.37k
                ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
553
5.37k
                COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
554
5.37k
                ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
555
5.37k
            }
556
557
            /*--------------------------------------------------------------------*/
558
            /* Read the IntraPrediction modes for LUMA                            */
559
            /*--------------------------------------------------------------------*/
560
6.57k
            if(!ps_cur_mb_info->u1_tran_form8x8)
561
1.85k
            {
562
1.85k
                UWORD8 *pu1_temp;
563
1.85k
                ih264d_read_intra_pred_modes(ps_dec, ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
564
1.85k
                                             ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16),
565
1.85k
                                             ps_cur_mb_info->u1_tran_form8x8);
566
1.85k
                pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
567
1.85k
                pu1_temp += 32;
568
1.85k
                ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
569
1.85k
            }
570
4.71k
            else
571
4.71k
            {
572
4.71k
                UWORD8 *pu1_temp;
573
4.71k
                ih264d_read_intra_pred_modes(ps_dec, ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
574
4.71k
                                             ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4),
575
4.71k
                                             ps_cur_mb_info->u1_tran_form8x8);
576
4.71k
                pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
577
4.71k
                pu1_temp += 8;
578
4.71k
                ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
579
4.71k
            }
580
            /*--------------------------------------------------------------------*/
581
            /* Read the IntraPrediction mode for CHROMA                           */
582
            /*--------------------------------------------------------------------*/
583
            /* Inlined ih264d_uev */
584
6.57k
            {
585
6.57k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
586
6.57k
                UWORD32 u4_word, u4_ldz, u4_temp;
587
588
                /***************************************************************/
589
                /* Find leading zeros in next 32 bits                          */
590
                /***************************************************************/
591
6.57k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
592
6.57k
                u4_ldz = CLZ(u4_word);
593
                /* Flush the ps_bitstrm */
594
6.57k
                u4_bitstream_offset += (u4_ldz + 1);
595
                /* Read the suffix from the ps_bitstrm */
596
6.57k
                u4_word = 0;
597
6.57k
                if(u4_ldz)
598
1.51k
                {
599
1.51k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
600
1.51k
                }
601
6.57k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
602
6.57k
                u4_temp = ((1 << u4_ldz) + u4_word - 1);
603
6.57k
                if(u4_temp > 3)
604
256
                {
605
256
                    return ERROR_CHROMA_PRED_MODE;
606
256
                }
607
6.31k
                ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
608
6.31k
                COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
609
6.31k
            }
610
            /*--------------------------------------------------------------------*/
611
            /* Read the Coded block pattern                                       */
612
            /*--------------------------------------------------------------------*/
613
0
            {
614
6.31k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
615
6.31k
                UWORD32 u4_word, u4_ldz;
616
617
                /***************************************************************/
618
                /* Find leading zeros in next 32 bits                          */
619
                /***************************************************************/
620
6.31k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
621
6.31k
                u4_ldz = CLZ(u4_word);
622
                /* Flush the ps_bitstrm */
623
6.31k
                u4_bitstream_offset += (u4_ldz + 1);
624
                /* Read the suffix from the ps_bitstrm */
625
6.31k
                u4_word = 0;
626
6.31k
                if(u4_ldz)
627
2.75k
                {
628
2.75k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
629
2.75k
                }
630
6.31k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
631
6.31k
                u4_cbp = ((1 << u4_ldz) + u4_word - 1);
632
6.31k
            }
633
6.31k
            if(u4_cbp > 47)
634
130
            {
635
130
                return ERROR_CBP;
636
130
            }
637
638
6.18k
            u4_cbp = gau1_ih264d_cbp_table[u4_cbp][0];
639
6.18k
            COPYTHECONTEXT("coded_block_pattern", u4_cbp);
640
6.18k
            ps_cur_mb_info->u1_cbp = u4_cbp;
641
642
            /*--------------------------------------------------------------------*/
643
            /* Read mb_qp_delta                                                   */
644
            /*--------------------------------------------------------------------*/
645
6.18k
            if(ps_cur_mb_info->u1_cbp)
646
5.89k
            {
647
5.89k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
648
5.89k
                UWORD32 u4_word, u4_ldz, u4_abs_val;
649
650
                /***************************************************************/
651
                /* Find leading zeros in next 32 bits                          */
652
                /***************************************************************/
653
5.89k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
654
5.89k
                u4_ldz = CLZ(u4_word);
655
656
                /* Flush the ps_bitstrm */
657
5.89k
                u4_bitstream_offset += (u4_ldz + 1);
658
659
                /* Read the suffix from the ps_bitstrm */
660
5.89k
                u4_word = 0;
661
5.89k
                if(u4_ldz)
662
2.33k
                {
663
2.33k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
664
2.33k
                }
665
666
5.89k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
667
5.89k
                u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
668
669
5.89k
                if(u4_word & 0x1)
670
1.18k
                {
671
1.18k
                    i4_delta_qp = (-(WORD32) u4_abs_val);
672
1.18k
                }
673
4.70k
                else
674
4.70k
                {
675
4.70k
                    i4_delta_qp = (u4_abs_val);
676
4.70k
                }
677
678
5.89k
                if((i4_delta_qp < -26) || (i4_delta_qp > 25))
679
366
                {
680
366
                    return ERROR_INV_RANGE_QP_T;
681
366
                }
682
683
5.52k
                COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
684
5.52k
                if(i4_delta_qp != 0)
685
1.96k
                {
686
1.96k
                    ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
687
1.96k
                    if(ret != OK) return ret;
688
1.96k
                }
689
5.52k
            }
690
6.18k
        }
691
9.48k
        else
692
9.48k
        {
693
9.48k
            u4_offset = 1;
694
9.48k
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
695
            /*-------------------------------------------------------------------*/
696
            /* Read the IntraPrediction mode for CHROMA                          */
697
            /*-------------------------------------------------------------------*/
698
9.48k
            {
699
9.48k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
700
9.48k
                UWORD32 u4_word, u4_ldz;
701
702
                /***************************************************************/
703
                /* Find leading zeros in next 32 bits                          */
704
                /***************************************************************/
705
9.48k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
706
9.48k
                u4_ldz = CLZ(u4_word);
707
                /* Flush the ps_bitstrm */
708
9.48k
                u4_bitstream_offset += (u4_ldz + 1);
709
                /* Read the suffix from the ps_bitstrm */
710
9.48k
                u4_word = 0;
711
9.48k
                if(u4_ldz)
712
3.05k
                {
713
3.05k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
714
3.05k
                }
715
9.48k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
716
9.48k
                u4_temp = ((1 << u4_ldz) + u4_word - 1);
717
718
                /* Inlined ih264d_uev */
719
9.48k
                if(u4_temp > 3)
720
595
                {
721
595
                    return ERROR_CHROMA_PRED_MODE;
722
595
                }
723
8.88k
                ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
724
8.88k
                COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
725
8.88k
            }
726
            /*-------------------------------------------------------------------*/
727
            /* Read the Coded block pattern                                      */
728
            /*-------------------------------------------------------------------*/
729
0
            u4_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
730
8.88k
            ps_cur_mb_info->u1_cbp = u4_cbp;
731
732
            /*-------------------------------------------------------------------*/
733
            /* Read mb_qp_delta                                                  */
734
            /*-------------------------------------------------------------------*/
735
8.88k
            {
736
8.88k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
737
8.88k
                UWORD32 u4_word, u4_ldz, u4_abs_val;
738
739
                /***************************************************************/
740
                /* Find leading zeros in next 32 bits                          */
741
                /***************************************************************/
742
8.88k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
743
8.88k
                u4_ldz = CLZ(u4_word);
744
745
                /* Flush the ps_bitstrm */
746
8.88k
                u4_bitstream_offset += (u4_ldz + 1);
747
748
                /* Read the suffix from the ps_bitstrm */
749
8.88k
                u4_word = 0;
750
8.88k
                if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
751
752
8.88k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
753
8.88k
                u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
754
755
8.88k
                if(u4_word & 0x1)
756
1.24k
                    i4_delta_qp = (-(WORD32) u4_abs_val);
757
7.64k
                else
758
7.64k
                    i4_delta_qp = (u4_abs_val);
759
760
8.88k
                if((i4_delta_qp < -26) || (i4_delta_qp > 25)) return ERROR_INV_RANGE_QP_T;
761
8.88k
            }
762
            /* inlinined ih264d_sev */
763
8.71k
            COPYTHECONTEXT("Delta quant", i1_delta_qp);
764
765
8.71k
            if(i4_delta_qp != 0)
766
3.38k
            {
767
3.38k
                ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
768
3.38k
                if(ret != OK) return ret;
769
3.38k
            }
770
771
8.71k
            {
772
8.71k
                WORD16 i_scaleFactor;
773
8.71k
                UWORD32 ui_N = 0;
774
8.71k
                WORD16 *pi2_scale_matrix_ptr;
775
                /*******************************************************************/
776
                /* for luma DC coefficients the scaling is done during the parsing */
777
                /* to preserve the precision                                       */
778
                /*******************************************************************/
779
8.71k
                if(ps_dec->s_high_profile.u1_scaling_present)
780
3.78k
                {
781
3.78k
                    pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0];
782
3.78k
                }
783
4.92k
                else
784
4.92k
                {
785
4.92k
                    i_scaleFactor = 16;
786
4.92k
                    pi2_scale_matrix_ptr = &i_scaleFactor;
787
4.92k
                }
788
789
                /*---------------------------------------------------------------*/
790
                /* Decode DC coefficients                                        */
791
                /*---------------------------------------------------------------*/
792
                /*---------------------------------------------------------------*/
793
                /* Calculation of N                                              */
794
                /*---------------------------------------------------------------*/
795
8.71k
                if(ui_is_left_mb_available)
796
5.74k
                {
797
5.74k
                    if(ui_is_top_mb_available)
798
4.72k
                    {
799
4.72k
                        ui_N = ((ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0] +
800
4.72k
                                 ps_dec->pu1_left_nnz_y[0] + 1) >>
801
4.72k
                                1);
802
4.72k
                    }
803
1.02k
                    else
804
1.02k
                    {
805
1.02k
                        ui_N = ps_dec->pu1_left_nnz_y[0];
806
1.02k
                    }
807
5.74k
                }
808
2.96k
                else if(ui_is_top_mb_available)
809
2.11k
                {
810
2.11k
                    ui_N = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0];
811
2.11k
                }
812
813
8.71k
                {
814
8.71k
                    WORD16 pi2_dc_coef[16] = {0};
815
8.71k
                    WORD32 pi4_tmp[16] = {0};
816
8.71k
                    tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
817
8.71k
                        (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data;
818
8.71k
                    WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data;
819
8.71k
                    UWORD32 u4_num_coeff;
820
8.71k
                    ps_tu_4x4->u2_sig_coeff_map = 0;
821
8.71k
                    ret = ps_dec->pf_cavlc_parse4x4coeff[(ui_N > 7)](pi2_dc_coef, 0, ui_N, ps_dec,
822
8.71k
                                                                     &u4_num_coeff);
823
8.71k
                    if(ret != OK) return ret;
824
825
8.62k
                    if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
826
8.51k
                    if(ps_tu_4x4->u2_sig_coeff_map)
827
1.90k
                    {
828
1.90k
                        memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef));
829
1.90k
                        ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef,
830
1.90k
                                                         ps_dec->pu1_inv_scan);
831
832
1.90k
                        PROFILE_DISABLE_IQ_IT_RECON()
833
1.90k
                        ps_dec->pf_ihadamard_scaling_4x4(
834
1.90k
                            pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y,
835
1.90k
                            (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp);
836
1.90k
                        pi2_coeff_block += 16;
837
1.90k
                        ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block;
838
1.90k
                        SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0);
839
1.90k
                    }
840
8.51k
                }
841
8.51k
            }
842
8.51k
        }
843
16.0k
    }
844
196k
    else
845
196k
    {
846
196k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
847
196k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
848
196k
        u4_offset = 0;
849
        /*--------------------------------------------------------------------*/
850
        /* Read the Coded block pattern                                       */
851
        /*--------------------------------------------------------------------*/
852
196k
        {
853
196k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
854
196k
            UWORD32 u4_word, u4_ldz;
855
856
            /***************************************************************/
857
            /* Find leading zeros in next 32 bits                          */
858
            /***************************************************************/
859
196k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
860
196k
            u4_ldz = CLZ(u4_word);
861
            /* Flush the ps_bitstrm */
862
196k
            u4_bitstream_offset += (u4_ldz + 1);
863
            /* Read the suffix from the ps_bitstrm */
864
196k
            u4_word = 0;
865
196k
            if(u4_ldz)
866
21.3k
            {
867
21.3k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
868
21.3k
            }
869
196k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
870
196k
            u4_cbp = ((1 << u4_ldz) + u4_word - 1);
871
196k
        }
872
196k
        if(u4_cbp > 47)
873
654
        {
874
654
            return ERROR_CBP;
875
654
        }
876
877
        /*  inter cbp table to be used for base mode flag*/
878
195k
        u4_cbp = gau1_ih264d_cbp_table[u4_cbp][1];
879
195k
        COPYTHECONTEXT("coded_block_pattern", u4_cbp);
880
195k
        ps_cur_mb_info->u1_cbp = u4_cbp;
881
195k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
882
195k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
883
884
        /*--------------------------------------------------------------------*/
885
        /* Read transform_size_8x8_flag if present                            */
886
        /*--------------------------------------------------------------------*/
887
195k
        if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (ps_cur_mb_info->u1_cbp & 0xf))
888
5.22k
        {
889
5.22k
            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
890
5.22k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
891
5.22k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
892
5.22k
        }
893
        /*--------------------------------------------------------------------*/
894
        /* Read mb_qp_delta                                                   */
895
        /*--------------------------------------------------------------------*/
896
195k
        if(ps_cur_mb_info->u1_cbp)
897
20.7k
        {
898
20.7k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
899
20.7k
            UWORD32 u4_word, u4_ldz, u4_abs_val;
900
901
            /***************************************************************/
902
            /* Find leading zeros in next 32 bits                          */
903
            /***************************************************************/
904
20.7k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
905
20.7k
            u4_ldz = CLZ(u4_word);
906
907
            /* Flush the ps_bitstrm */
908
20.7k
            u4_bitstream_offset += (u4_ldz + 1);
909
910
            /* Read the suffix from the ps_bitstrm */
911
20.7k
            u4_word = 0;
912
20.7k
            if(u4_ldz)
913
7.50k
            {
914
7.50k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
915
7.50k
            }
916
917
20.7k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
918
20.7k
            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
919
920
20.7k
            if(u4_word & 0x1)
921
2.60k
            {
922
2.60k
                i4_delta_qp = (-(WORD32) u4_abs_val);
923
2.60k
            }
924
18.1k
            else
925
18.1k
            {
926
18.1k
                i4_delta_qp = (u4_abs_val);
927
18.1k
            }
928
929
20.7k
            if((i4_delta_qp < -26) || (i4_delta_qp > 25))
930
379
            {
931
379
                return ERROR_INV_RANGE_QP_T;
932
379
            }
933
934
20.3k
            COPYTHECONTEXT("mb_qp_delta", i4_delta_qp);
935
20.3k
            if(i4_delta_qp != 0)
936
7.12k
            {
937
7.12k
                ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
938
7.12k
                if(ret != OK) return ret;
939
7.12k
            }
940
20.3k
        }
941
195k
    }
942
209k
    if(u4_cbp)
943
26.5k
    {
944
26.5k
        ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, (UWORD8) u4_offset);
945
26.5k
        if(ret != OK) return ret;
946
25.7k
        if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
947
948
        /* Store Left Mb NNZ and TOP chroma NNZ */
949
25.7k
    }
950
182k
    else
951
182k
    {
952
182k
        ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
953
182k
        ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
954
182k
        ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
955
182k
        ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
956
182k
        ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
957
182k
        ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
958
182k
        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
959
182k
    }
960
961
208k
    return OK;
962
209k
}
963
964
/*!
965
**************************************************************************
966
* \if Function name : ih264d_decode_eislice \endif
967
*
968
* \brief
969
*    Decodes an EI Slice
970
*
971
*
972
* \return
973
*    0 on Success and Error code otherwise
974
**************************************************************************
975
*/
976
WORD32 isvcd_parse_eislice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice)
977
5.98k
{
978
5.98k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
979
5.98k
    WORD32 i_status = OK;
980
5.98k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
981
5.98k
    dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
982
5.98k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
983
5.98k
    dec_seq_params_t *ps_seq;
984
5.98k
    dec_svc_seq_params_t *ps_subset_seq;
985
5.98k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
986
5.98k
    dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
987
5.98k
    dec_nal_unit_svc_ext_params_t *ps_nal_svc_ext = NULL;
988
5.98k
    UWORD32 u4_temp;
989
5.98k
    WORD32 i_temp;
990
5.98k
    WORD32 ret;
991
5.98k
    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
992
5.98k
    UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
993
994
5.98k
    ps_nal_svc_ext = ps_svc_lyr_dec->ps_nal_svc_ext;
995
5.98k
    ps_seq = ps_dec->ps_cur_sps;
996
5.98k
    ps_subset_seq =
997
5.98k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
998
5.98k
    ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
999
5.98k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1000
1001
5.98k
    if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
1002
5.98k
    {
1003
        /*--------------------------------------------------------------------*/
1004
        /* Read remaining contents of the slice header                        */
1005
        /*--------------------------------------------------------------------*/
1006
        /* dec_ref_pic_marking function */
1007
        /* G050 */
1008
5.98k
        if(ps_slice->u1_nal_ref_idc != 0)
1009
5.90k
        {
1010
5.90k
            if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1011
5.81k
            {
1012
5.81k
                dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1013
5.81k
                dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
1014
5.81k
                UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
1015
1016
5.81k
                ps_pps->ps_sps = ps_dec->ps_cur_sps;
1017
5.81k
                if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
1018
4.14k
                    ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
1019
1020
5.81k
                i_temp = ih264d_read_mmco_commands(ps_dec);
1021
1022
5.81k
                ps_pps->ps_sps = ps_sps_tmp;
1023
5.81k
                ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
1024
5.81k
                if(i_temp < 0)
1025
92
                {
1026
92
                    return ERROR_DBP_MANAGER_T;
1027
92
                }
1028
5.72k
                ps_dec->u4_bitoffset = i_temp;
1029
5.72k
            }
1030
91
            else
1031
91
                ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
1032
1033
5.81k
            if(!ps_sps_svc_ext->u1_slice_header_restriction_flag)
1034
4.35k
            {
1035
4.35k
                ps_svc_slice_params->u1_store_ref_base_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
1036
4.35k
                COPYTHECONTEXT("SPS_SVC_EXT: u1_store_ref_base_pic_flag",
1037
4.35k
                               ps_svc_slice_params->u1_store_ref_base_pic_flag);
1038
1039
4.35k
                if(0 != ps_svc_slice_params->u1_store_ref_base_pic_flag)
1040
132
                {
1041
132
                    return NOT_OK;
1042
132
                }
1043
4.21k
                if(((1 == ps_nal_svc_ext->u1_use_ref_base_pic_flag) ||
1044
4.21k
                    (1 == ps_svc_slice_params->u1_store_ref_base_pic_flag)) &&
1045
0
                   (!ps_nal_svc_ext->u1_idr_flag))
1046
0
                {
1047
0
                    i_status = isvcd_dec_ref_base_pic_marking(
1048
0
                        &ps_svc_slice_params->s_ref_base_pic_marking_svc_ext, ps_bitstrm);
1049
0
                    if(i_status != OK)
1050
0
                    {
1051
0
                        return i_status;
1052
0
                    }
1053
0
                }
1054
4.21k
            }
1055
5.81k
        }
1056
5.98k
    }
1057
1058
5.76k
    {
1059
        /* G050 */
1060
        /* Read slice_qp_delta */
1061
5.76k
        WORD64 i8_temp =
1062
5.76k
            (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1063
5.76k
        if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T;
1064
5.44k
        ps_slice->u1_slice_qp = (UWORD8) i8_temp;
1065
5.44k
        COPYTHECONTEXT("Slice Header SVC ext: slice_qp_delta",
1066
5.44k
                       ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
1067
5.44k
    }
1068
1069
5.44k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
1070
3.22k
    {
1071
3.22k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1072
3.22k
        COPYTHECONTEXT("Slice Header SVC ext: disable_deblocking_filter_idc", u4_temp);
1073
1074
3.22k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
1075
179
        {
1076
179
            return ERROR_INV_SLICE_HDR_T;
1077
179
        }
1078
3.04k
        ps_slice->u1_disable_dblk_filter_idc = u4_temp;
1079
3.04k
        if(u4_temp != 1)
1080
2.74k
        {
1081
2.74k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
1082
2.74k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1083
215
            {
1084
215
                return ERROR_INV_SLICE_HDR_T;
1085
215
            }
1086
2.53k
            ps_slice->i1_slice_alpha_c0_offset = i_temp;
1087
2.53k
            COPYTHECONTEXT("Slice Header SVC ext: slice_alpha_c0_offset_div2",
1088
2.53k
                           ps_slice->i1_slice_alpha_c0_offset >> 1);
1089
1090
2.53k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
1091
2.53k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1092
135
            {
1093
135
                return ERROR_INV_SLICE_HDR_T;
1094
135
            }
1095
2.39k
            ps_slice->i1_slice_beta_offset = i_temp;
1096
2.39k
            COPYTHECONTEXT("Slice Header SVC ext: slice_beta_offset_div2",
1097
2.39k
                           ps_slice->i1_slice_beta_offset >> 1);
1098
2.39k
        }
1099
297
        else
1100
297
        {
1101
297
            ps_slice->i1_slice_alpha_c0_offset = 0;
1102
297
            ps_slice->i1_slice_beta_offset = 0;
1103
297
        }
1104
3.04k
    }
1105
2.21k
    else
1106
2.21k
    {
1107
2.21k
        ps_slice->u1_disable_dblk_filter_idc = 0;
1108
2.21k
        ps_slice->i1_slice_alpha_c0_offset = 0;
1109
2.21k
        ps_slice->i1_slice_beta_offset = 0;
1110
2.21k
    }
1111
1112
    /* add the remaining part of the code for svc extension from reference */
1113
4.91k
    ret = isvcd_set_default_slice_header_ext(ps_svc_lyr_dec);
1114
4.91k
    if(ret != OK)
1115
0
    {
1116
0
        return ERROR_INV_SLICE_HDR_T;
1117
0
    }
1118
1119
4.91k
    ret = isvcd_parse_slice_header(ps_svc_lyr_dec);
1120
4.91k
    if(ret != OK)
1121
240
    {
1122
240
        return ERROR_INV_SLICE_HDR_T;
1123
240
    }
1124
1125
    /* Initialization to check if number of motion vector per 2 Mbs */
1126
    /* are exceeding the range or not */
1127
4.67k
    ps_dec->u2_mv_2mb[0] = 0;
1128
4.67k
    ps_dec->u2_mv_2mb[1] = 0;
1129
1130
    /*set slice header cone to 2 ,to indicate  correct header*/
1131
4.67k
    ps_dec->u1_slice_header_done = 2;
1132
1133
4.67k
    if(!ps_svc_slice_params->u1_slice_skip_flag)
1134
4.49k
    {
1135
4.49k
        if(ps_pps->u1_entropy_coding_mode)
1136
1.26k
        {
1137
1.26k
            SWITCHOFFTRACE;
1138
1.26k
            SWITCHONTRACECABAC;
1139
1.26k
            if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1140
0
            {
1141
0
                ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
1142
0
            }
1143
1.26k
            else
1144
1.26k
                ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
1145
1146
1.26k
            ret = isvcd_parse_eislice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
1147
1.26k
            if(ret != OK) return ret;
1148
446
            SWITCHONTRACE;
1149
446
            SWITCHOFFTRACECABAC;
1150
446
        }
1151
3.22k
        else
1152
3.22k
        {
1153
3.22k
            if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1154
0
            {
1155
0
                ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
1156
0
            }
1157
3.22k
            else
1158
3.22k
                ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
1159
3.22k
            ret = isvcd_parse_eislice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
1160
3.22k
            if(ret != OK) return ret;
1161
3.22k
        }
1162
4.49k
    }
1163
181
    else
1164
181
    {
1165
181
        return ERROR_FEATURE_UNAVAIL;
1166
181
    }
1167
1168
1.90k
    return OK;
1169
4.67k
}
1170
1171
/*****************************************************************************/
1172
/*                                                                           */
1173
/*  Function Name : isvcd_parse_eislice_data_cabac                          */
1174
/*                                                                           */
1175
/*  Description   : This function parses cabac syntax of a inter slice on    */
1176
/*                  N MB basis.                                              */
1177
/*                                                                           */
1178
/*  Inputs        : ps_dec                                                   */
1179
/*                  sliceparams                                              */
1180
/*                  firstMbInSlice                                           */
1181
/*                                                                           */
1182
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1183
/*                     decoded till the end of slice.                        */
1184
/*                                                                           */
1185
/*  Returns       : 0                                                        */
1186
/*                                                                           */
1187
/*  Issues        : <List any issues or problems with this function>         */
1188
/*                                                                           */
1189
/*  Revision History:                                                        */
1190
/*                                                                           */
1191
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1192
/*         24 06 2005   Kishore         Draft                                */
1193
/*                                                                           */
1194
/*****************************************************************************/
1195
WORD32 isvcd_parse_eislice_data_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1196
                                      dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
1197
1.26k
{
1198
1.26k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1199
1.26k
    UWORD8 uc_more_data_flag;
1200
1.26k
    UWORD8 u1_num_mbs, u1_mb_idx;
1201
1.26k
    dec_mb_info_t *ps_cur_mb_info;
1202
1.26k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1203
1.26k
    deblk_mb_t *ps_cur_deblk_mb;
1204
1.26k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1205
1.26k
    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1206
1.26k
    WORD16 i2_cur_mb_addr;
1207
1.26k
    UWORD8 u1_mbaff;
1208
1.26k
    UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
1209
1.26k
    WORD32 ret = OK;
1210
1.26k
    decoding_envirnoment_t *ps_cab_env;
1211
1.26k
    UWORD8 *pu1_cur_svc_base_mode_flag;
1212
1.26k
    UWORD8 u1_left_svc_base_mode_flag;
1213
1.26k
    UWORD8 u1_top_svc_base_mode_flag;
1214
1.26k
    UWORD32 u4_a, u4_b, u4_ctxt_inc;
1215
1.26k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1216
1217
1.26k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1218
1.26k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1219
1.26k
    ih264d_update_qp(ps_dec, 0);
1220
1.26k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1221
1222
1.26k
    if(ps_bitstrm->u4_ofst & 0x07)
1223
988
    {
1224
988
        ps_bitstrm->u4_ofst += 8;
1225
988
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
1226
988
    }
1227
1.26k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
1228
1.26k
    if(ret != OK) return ret;
1229
1.15k
    isvcd_init_cabac_contexts(I_SLICE, ps_dec);
1230
1.15k
    ps_dec->i1_prev_mb_qp_delta = 0;
1231
1.15k
    ps_cab_env = &ps_dec->s_cab_dec_env;
1232
    /* initializations */
1233
1.15k
    u1_mb_idx = ps_dec->u4_mb_idx;
1234
1.15k
    u1_num_mbs = u1_mb_idx;
1235
1.15k
    uc_more_data_flag = 1;
1236
1.15k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1237
1.15k
    do
1238
20.0k
    {
1239
20.0k
        UWORD16 u2_mbx;
1240
20.0k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1241
20.0k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1242
359
        {
1243
359
            break;
1244
359
        }
1245
1246
19.7k
        {
1247
19.7k
            UWORD8 u1_mb_type;
1248
19.7k
            ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1249
19.7k
            ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1250
19.7k
            ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1251
19.7k
            ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1252
19.7k
            ps_cur_mb_info->u1_end_of_slice = 0;
1253
            /***************************************************************/
1254
            /* Get the required information for decoding of MB                  */
1255
            /* mb_x, mb_y , neighbour availablity,                              */
1256
            /***************************************************************/
1257
19.7k
            ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1258
19.7k
            u2_mbx = ps_dec->u2_mbx;
1259
19.7k
            ps_svc_cur_mb_info->u1_crop_window_flag =
1260
19.7k
                *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1261
19.7k
                  (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1262
            /*********************************************************************/
1263
            /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
1264
            /*********************************************************************/
1265
19.7k
            ps_cur_mb_info->u1_tran_form8x8 = 0;
1266
19.7k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1267
            /***************************************************************/
1268
            /* Set the deblocking parameters for this MB                   */
1269
            /***************************************************************/
1270
19.7k
            ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1271
19.7k
            if(ps_dec->u4_app_disable_deblk_frm == 0)
1272
19.7k
                ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1273
19.7k
                                                 ps_dec->u1_mb_ngbr_availablity,
1274
19.7k
                                                 ps_dec->u1_cur_mb_fld_dec_flag);
1275
1276
19.7k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1277
            /* Macroblock Layer Begins */
1278
19.7k
            if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1279
19.5k
               ps_svc_slice_params->u1_adaptive_base_mode_flag)
1280
14.7k
            {
1281
14.7k
                pu1_cur_svc_base_mode_flag =
1282
14.7k
                    ps_svc_lyr_dec->pu1_svc_base_mode_flag + ps_cur_mb_info->u2_mbx;
1283
14.7k
                pu1_cur_svc_base_mode_flag +=
1284
14.7k
                    ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride;
1285
1286
14.7k
                u1_left_svc_base_mode_flag = 0;
1287
14.7k
                if(ps_dec->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
1288
10.7k
                    u1_left_svc_base_mode_flag = *(pu1_cur_svc_base_mode_flag - 1);
1289
1290
14.7k
                u1_top_svc_base_mode_flag = 0;
1291
14.7k
                if(ps_dec->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
1292
11.9k
                    u1_top_svc_base_mode_flag =
1293
11.9k
                        *(pu1_cur_svc_base_mode_flag -
1294
11.9k
                          ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride);
1295
1296
14.7k
                u4_a = 1;
1297
14.7k
                u4_b = 1;
1298
1299
14.7k
                if(u1_top_svc_base_mode_flag)
1300
9.11k
                {
1301
9.11k
                    u4_a = 0;
1302
9.11k
                }
1303
1304
14.7k
                if(u1_left_svc_base_mode_flag)
1305
8.08k
                {
1306
8.08k
                    u4_b = 0;
1307
8.08k
                }
1308
1309
14.7k
                u4_ctxt_inc = u4_a + u4_b;
1310
14.7k
                ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_decode_bin(
1311
14.7k
                    u4_ctxt_inc, ps_svc_lyr_dec->ps_base_mode_flag, ps_bitstrm, ps_cab_env);
1312
14.7k
                COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1313
14.7k
                *pu1_cur_svc_base_mode_flag = ps_svc_cur_mb_info->u1_base_mode_flag;
1314
14.7k
            }
1315
5.01k
            else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1316
4.81k
            {
1317
4.81k
                ps_svc_cur_mb_info->u1_base_mode_flag =
1318
4.81k
                    ps_svc_slice_params->u1_default_base_mode_flag;
1319
4.81k
            }
1320
1321
19.7k
            if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1322
8.08k
            {
1323
                /* Decode the u1_mb_type */
1324
8.08k
                u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
1325
8.08k
                if(u1_mb_type > 25) return ERROR_MB_TYPE;
1326
8.08k
                ps_cur_mb_info->u1_mb_type = u1_mb_type;
1327
8.08k
                COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1328
8.08k
                ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
1329
8.08k
            }
1330
11.6k
            else
1331
11.6k
            {
1332
11.6k
                ps_cur_mb_info->u1_mb_type = MB_INFER;
1333
11.6k
                ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL;
1334
11.6k
            }
1335
            /* Parse Macroblock Data */
1336
19.7k
            u1_mb_type = ps_cur_mb_info->u1_mb_type;
1337
19.7k
            if(25 == u1_mb_type)
1338
149
            {
1339
                /* I_PCM_MB */
1340
149
                ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1341
149
                ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1342
149
                if(ret != OK) return ret;
1343
69
                ps_cur_deblk_mb->u1_mb_qp = 0;
1344
69
            }
1345
19.5k
            else
1346
19.5k
            {
1347
19.5k
                ret = isvcd_parse_imb_cabac(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1348
19.5k
                                            u1_mb_type);
1349
19.5k
                if(ret != OK) return ret;
1350
18.9k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1351
18.9k
            }
1352
1353
19.0k
            if(ps_dec->u1_enable_mb_info)
1354
0
            {
1355
0
                ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1356
0
                                            ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1357
0
            }
1358
19.0k
            if(u1_mbaff)
1359
0
            {
1360
0
                ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1361
0
            }
1362
1363
19.0k
            if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1364
0
                uc_more_data_flag = 1;
1365
19.0k
            else
1366
19.0k
            {
1367
19.0k
                uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
1368
19.0k
                uc_more_data_flag = !uc_more_data_flag;
1369
19.0k
                COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
1370
19.0k
            }
1371
1372
19.0k
            if(u1_mbaff)
1373
0
            {
1374
0
                if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1375
0
                {
1376
0
                    return ERROR_EOB_FLUSHBITS_T;
1377
0
                }
1378
0
            }
1379
            /* Next macroblock information */
1380
19.0k
            i2_cur_mb_addr++;
1381
            /* Store the colocated information */
1382
19.0k
            {
1383
19.0k
                mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1384
19.0k
                mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
1385
19.0k
                if(ps_mv_nmb_start)
1386
19.0k
                {
1387
19.0k
                    ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1388
19.0k
                                       (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
1389
19.0k
                }
1390
0
                else
1391
0
                {
1392
0
                    return NOT_OK;
1393
0
                }
1394
19.0k
            }
1395
1396
19.0k
            u1_num_mbs++;
1397
19.0k
        }
1398
1399
        /****************************************************************/
1400
        /* Check for End Of Row                                         */
1401
        /****************************************************************/
1402
0
        u1_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
1403
19.0k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1404
19.0k
        u1_tfr_n_mb =
1405
19.0k
            (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
1406
19.0k
        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1407
1408
19.0k
        if(u1_tfr_n_mb || (!uc_more_data_flag))
1409
4.61k
        {
1410
4.61k
            if(ps_dec->u1_separate_parse)
1411
1.53k
            {
1412
1.53k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1413
1.53k
                                     u1_end_of_row);
1414
1.53k
                ps_dec->ps_nmb_info += u1_num_mbs;
1415
1.53k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1416
1.53k
            }
1417
3.08k
            else
1418
3.08k
            {
1419
3.08k
                ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1420
3.08k
                                                              u1_num_mbs_next, u1_tfr_n_mb,
1421
3.08k
                                                              u1_end_of_row);
1422
3.08k
                if(ret != OK) return ret;
1423
3.08k
            }
1424
4.61k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1425
4.61k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1426
4.61k
            u1_mb_idx = u1_num_mbs;
1427
4.61k
            ps_dec->u4_mb_idx = u1_num_mbs;
1428
4.61k
        }
1429
19.0k
    } while(uc_more_data_flag);
1430
1431
446
    ps_dec->u4_num_mbs_cur_nmb = 0;
1432
446
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1433
1434
446
    return ret;
1435
1.15k
}
1436
1437
/*****************************************************************************/
1438
/*                                                                           */
1439
/*  Function Name : isvcd_parse_eislice_data_cavlc */
1440
/*                                                                           */
1441
/*  Description   : This function parses cabac syntax of a inter slice on    */
1442
/*                  N MB basis.                                              */
1443
/*                                                                           */
1444
/*  Inputs        : ps_dec                                                   */
1445
/*                  sliceparams                                              */
1446
/*                  firstMbInSlice                                           */
1447
/*                                                                           */
1448
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1449
/*                     decoded till the end of slice.                        */
1450
/*                                                                           */
1451
/*  Returns       : 0                                                        */
1452
/*                                                                           */
1453
/*  Issues        : <List any issues or problems with this function>         */
1454
/*                                                                           */
1455
/*  Revision History:                                                        */
1456
/*                                                                           */
1457
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1458
/*         24 06 2005   Kishore         Draft                                */
1459
/*                                                                           */
1460
/*****************************************************************************/
1461
WORD32 isvcd_parse_eislice_data_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1462
                                      dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
1463
3.22k
{
1464
3.22k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1465
3.22k
    UWORD8 uc_more_data_flag;
1466
3.22k
    UWORD8 u1_num_mbs, u1_mb_idx;
1467
3.22k
    dec_mb_info_t *ps_cur_mb_info;
1468
3.22k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1469
3.22k
    deblk_mb_t *ps_cur_deblk_mb;
1470
3.22k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1471
3.22k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1472
3.22k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1473
3.22k
    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1474
3.22k
    WORD16 i2_cur_mb_addr;
1475
3.22k
    UWORD8 u1_mbaff;
1476
3.22k
    UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
1477
3.22k
    WORD32 ret = OK;
1478
3.22k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1479
1480
3.22k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1481
3.22k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1482
3.22k
    ih264d_update_qp(ps_dec, 0);
1483
3.22k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1484
1485
3.22k
    u1_mb_idx = ps_dec->u4_mb_idx;
1486
3.22k
    u1_num_mbs = u1_mb_idx;
1487
3.22k
    uc_more_data_flag = 1;
1488
3.22k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1489
1490
3.22k
    do
1491
70.7k
    {
1492
70.7k
        UWORD8 u1_mb_type;
1493
70.7k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1494
70.7k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1495
1.08k
        {
1496
1.08k
            break;
1497
1.08k
        }
1498
1499
69.6k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1500
69.6k
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1501
69.6k
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1502
69.6k
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1503
69.6k
        ps_cur_mb_info->u1_end_of_slice = 0;
1504
        /***************************************************************/
1505
        /* Get the required information for decoding of MB             */
1506
        /* mb_x, mb_y , neighbour availablity,                         */
1507
        /***************************************************************/
1508
69.6k
        ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1509
69.6k
        ps_svc_cur_mb_info->u1_crop_window_flag =
1510
69.6k
            *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1511
69.6k
              (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1512
1513
        /***************************************************************/
1514
        /* Set the deblocking parameters for this MB                   */
1515
        /***************************************************************/
1516
69.6k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1517
69.6k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
1518
69.6k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1519
69.6k
                                             ps_dec->u1_mb_ngbr_availablity,
1520
69.6k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
1521
1522
69.6k
        ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1523
69.6k
        if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1524
69.4k
           ps_svc_slice_params->u1_adaptive_base_mode_flag)
1525
41.3k
        {
1526
41.3k
            ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1527
41.3k
            COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1528
41.3k
        }
1529
28.3k
        else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1530
28.1k
        {
1531
28.1k
            ps_svc_cur_mb_info->u1_base_mode_flag = ps_svc_slice_params->u1_default_base_mode_flag;
1532
28.1k
        }
1533
1534
        /**************************************************************/
1535
        /* Macroblock Layer Begins, Decode the u1_mb_type                */
1536
        /**************************************************************/
1537
69.6k
        if(!ps_svc_cur_mb_info->u1_base_mode_flag) /* Inlined ih264d_uev */
1538
14.5k
        {
1539
14.5k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1540
14.5k
            UWORD32 u4_word, u4_ldz, u4_temp;
1541
1542
            /***************************************************************/
1543
            /* Find leading zeros in next 32 bits                          */
1544
            /***************************************************************/
1545
14.5k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1546
14.5k
            u4_ldz = CLZ(u4_word);
1547
            /* Flush the ps_bitstrm */
1548
14.5k
            u4_bitstream_offset += (u4_ldz + 1);
1549
            /* Read the suffix from the ps_bitstrm */
1550
14.5k
            u4_word = 0;
1551
14.5k
            if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1552
14.5k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
1553
14.5k
            u4_temp = ((1 << u4_ldz) + u4_word - 1);
1554
14.5k
            if(u4_temp > 25) return ERROR_MB_TYPE;
1555
14.3k
            u1_mb_type = u4_temp;
1556
1557
            /* Inlined ih264d_uev */
1558
14.3k
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
1559
14.3k
            COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1560
1561
14.3k
            ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
1562
14.3k
        }
1563
55.1k
        else
1564
55.1k
        {
1565
55.1k
            ps_cur_mb_info->u1_mb_type = MB_INFER;
1566
55.1k
            ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL;
1567
55.1k
        }
1568
1569
        /**************************************************************/
1570
        /* Parse Macroblock data                                      */
1571
        /**************************************************************/
1572
69.4k
        u1_mb_type = ps_cur_mb_info->u1_mb_type;
1573
69.4k
        if(25 == u1_mb_type)
1574
107
        {
1575
            /* I_PCM_MB */
1576
107
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1577
107
            ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1578
107
            if(ret != OK) return ret;
1579
107
            ps_cur_deblk_mb->u1_mb_qp = 0;
1580
107
        }
1581
69.3k
        else
1582
69.3k
        {
1583
69.3k
            ret = isvcd_parse_imb_cavlc(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1584
69.3k
                                        u1_num_mbs, u1_mb_type);
1585
69.3k
            if(ret != OK) return ret;
1586
67.8k
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1587
67.8k
        }
1588
1589
67.9k
        if(ps_dec->u1_enable_mb_info)
1590
0
        {
1591
0
            ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1592
0
                                        ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1593
0
        }
1594
67.9k
        uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1595
1596
67.9k
        if(u1_mbaff)
1597
0
        {
1598
0
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1599
0
            if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1600
0
            {
1601
0
                return ERROR_EOB_FLUSHBITS_T;
1602
0
            }
1603
0
        }
1604
        /**************************************************************/
1605
        /* Get next Macroblock address                                */
1606
        /**************************************************************/
1607
67.9k
        i2_cur_mb_addr++;
1608
        /* Store the colocated information */
1609
67.9k
        {
1610
67.9k
            mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1611
67.9k
            mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
1612
67.9k
            if(ps_mv_nmb_start)
1613
67.9k
            {
1614
67.9k
                ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1615
67.9k
                                   (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
1616
67.9k
            }
1617
0
            else
1618
0
            {
1619
0
                return NOT_OK;
1620
0
            }
1621
67.9k
        }
1622
67.9k
        u1_num_mbs++;
1623
1624
        /****************************************************************/
1625
        /* Check for End Of Row                                         */
1626
        /****************************************************************/
1627
67.9k
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1628
67.9k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1629
67.9k
        u1_tfr_n_mb =
1630
67.9k
            (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
1631
67.9k
        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1632
1633
67.9k
        if(u1_tfr_n_mb || (!uc_more_data_flag))
1634
19.2k
        {
1635
19.2k
            if(ps_dec->u1_separate_parse)
1636
12.7k
            {
1637
12.7k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1638
12.7k
                                     u1_end_of_row);
1639
12.7k
                ps_dec->ps_nmb_info += u1_num_mbs;
1640
12.7k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1641
12.7k
            }
1642
6.46k
            else
1643
6.46k
            {
1644
6.46k
                ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1645
6.46k
                                                              u1_num_mbs_next, u1_tfr_n_mb,
1646
6.46k
                                                              u1_end_of_row);
1647
6.46k
                if(ret != OK) return ret;
1648
6.46k
            }
1649
19.2k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1650
19.2k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1651
19.2k
            u1_mb_idx = u1_num_mbs;
1652
19.2k
            ps_dec->u4_mb_idx = u1_num_mbs;
1653
19.2k
        }
1654
67.9k
    } while(uc_more_data_flag);
1655
1656
1.45k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1657
1.45k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1658
1659
1.45k
    return ret;
1660
3.22k
}
1661
1662
/*!
1663
**************************************************************************
1664
* \if Function name : ParseIMbCab \endif
1665
*
1666
* \brief
1667
*    This function parses CABAC syntax of a I MB. If 16x16 Luma DC transform
1668
*    is also done here. Transformed Luma DC values are copied in their
1669
*    0th pixel location of corrosponding CoeffBlock.
1670
*
1671
* \return
1672
*    0 on Success and Error code otherwise
1673
**************************************************************************
1674
*/
1675
WORD32 isvcd_parse_imb_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
1676
                             dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD8 u1_mb_type)
1677
46.3k
{
1678
46.3k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1679
46.3k
    WORD8 i1_delta_qp;
1680
46.3k
    UWORD8 u1_cbp;
1681
46.3k
    UWORD8 u1_offset;
1682
    /* Variables for handling Cabac contexts */
1683
46.3k
    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1684
46.3k
    ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
1685
46.3k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1686
46.3k
    bin_ctxt_model_t *p_bin_ctxt;
1687
46.3k
    UWORD8 u1_intra_chrom_pred_mode;
1688
46.3k
    UWORD8 u1_dc_block_flag = 0;
1689
46.3k
    WORD32 ret;
1690
1691
46.3k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
1692
1693
46.3k
    if(ps_left_ctxt == ps_dec->ps_def_ctxt_mb_info)
1694
12.0k
    {
1695
12.0k
        ps_dec->pu1_left_yuv_dc_csbp[0] = 0xf;
1696
12.0k
    }
1697
1698
46.3k
    if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE)
1699
26.8k
    {
1700
26.8k
        MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
1701
26.8k
        *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
1702
26.8k
        MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
1703
26.8k
        memset(p_curr_ctxt->i1_ref_idx, 0, 4);
1704
26.8k
    }
1705
1706
    /* default */
1707
46.3k
    ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB;
1708
46.3k
    if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1709
9.99k
    {
1710
9.99k
        if(u1_mb_type == I_4x4_MB)
1711
5.05k
        {
1712
5.05k
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
1713
5.05k
            p_curr_ctxt->u1_mb_type = CAB_I4x4;
1714
5.05k
            u1_offset = 0;
1715
5.05k
            ps_cur_mb_info->u1_tran_form8x8 = 0;
1716
5.05k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1717
            /*--------------------------------------------------------------------*/
1718
            /* Read transform_size_8x8_flag if present                            */
1719
            /*--------------------------------------------------------------------*/
1720
5.05k
            if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag)
1721
4.47k
            {
1722
4.47k
                ps_cur_mb_info->u1_tran_form8x8 =
1723
4.47k
                    ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
1724
4.47k
                COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
1725
4.47k
                p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
1726
4.47k
                ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
1727
4.47k
            }
1728
583
            else
1729
583
            {
1730
583
                p_curr_ctxt->u1_transform8x8_ctxt = 0;
1731
583
            }
1732
1733
            /*--------------------------------------------------------------------*/
1734
            /* Read the IntraPrediction modes for LUMA                            */
1735
            /*--------------------------------------------------------------------*/
1736
5.05k
            if(!ps_cur_mb_info->u1_tran_form8x8)
1737
1.01k
            {
1738
1.01k
                UWORD8 *pu1_temp;
1739
1.01k
                ih264d_read_intra_pred_modes_cabac(ps_dec,
1740
1.01k
                                                   ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
1741
1.01k
                                                   ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16),
1742
1.01k
                                                   ps_cur_mb_info->u1_tran_form8x8);
1743
1.01k
                pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
1744
1.01k
                pu1_temp += 32;
1745
1.01k
                ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
1746
1.01k
            }
1747
4.04k
            else
1748
4.04k
            {
1749
4.04k
                UWORD8 *pu1_temp;
1750
4.04k
                ih264d_read_intra_pred_modes_cabac(ps_dec,
1751
4.04k
                                                   ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
1752
4.04k
                                                   ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4),
1753
4.04k
                                                   ps_cur_mb_info->u1_tran_form8x8);
1754
4.04k
                pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
1755
4.04k
                pu1_temp += 8;
1756
4.04k
                ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
1757
4.04k
            }
1758
            /*--------------------------------------------------------------------*/
1759
            /* Read the IntraPrediction mode for CHROMA                           */
1760
            /*--------------------------------------------------------------------*/
1761
5.05k
            u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
1762
5.05k
            COPYTHECONTEXT("intra_chroma_pred_mode", u1_intra_chrom_pred_mode);
1763
5.05k
            p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
1764
5.05k
                u1_intra_chrom_pred_mode;
1765
1766
            /*--------------------------------------------------------------------*/
1767
            /* Read the Coded block pattern                                       */
1768
            /*--------------------------------------------------------------------*/
1769
5.05k
            u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
1770
5.05k
            COPYTHECONTEXT("coded_block_pattern", u1_cbp);
1771
5.05k
            ps_cur_mb_info->u1_cbp = u1_cbp;
1772
5.05k
            p_curr_ctxt->u1_cbp = u1_cbp;
1773
1774
            /*--------------------------------------------------------------------*/
1775
            /* Read mb_qp_delta                                                   */
1776
            /*--------------------------------------------------------------------*/
1777
5.05k
            if(ps_cur_mb_info->u1_cbp)
1778
4.04k
            {
1779
4.04k
                ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1780
4.04k
                if(ret != OK) return ret;
1781
3.97k
                COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1782
3.97k
                if(i1_delta_qp != 0)
1783
972
                {
1784
972
                    ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1785
972
                    if(ret != OK) return ret;
1786
972
                }
1787
3.97k
            }
1788
1.01k
            else
1789
1.01k
                ps_dec->i1_prev_mb_qp_delta = 0;
1790
4.99k
            p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1791
4.99k
        }
1792
4.93k
        else
1793
4.93k
        {
1794
4.93k
            u1_offset = 1;
1795
4.93k
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
1796
4.93k
            p_curr_ctxt->u1_mb_type = CAB_I16x16;
1797
4.93k
            ps_cur_mb_info->u1_tran_form8x8 = 0;
1798
4.93k
            p_curr_ctxt->u1_transform8x8_ctxt = 0;
1799
4.93k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1800
            /*--------------------------------------------------------------------*/
1801
            /* Read the IntraPrediction mode for CHROMA                           */
1802
            /*--------------------------------------------------------------------*/
1803
4.93k
            u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
1804
4.93k
            if(u1_intra_chrom_pred_mode > 3) return ERROR_CHROMA_PRED_MODE;
1805
1806
4.93k
            COPYTHECONTEXT("Chroma intra_chroma_pred_mode pred mode", u1_intra_chrom_pred_mode);
1807
4.93k
            p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
1808
4.93k
                u1_intra_chrom_pred_mode;
1809
1810
            /*--------------------------------------------------------------------*/
1811
            /* Read the Coded block pattern                                       */
1812
            /*--------------------------------------------------------------------*/
1813
4.93k
            u1_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
1814
4.93k
            ps_cur_mb_info->u1_cbp = u1_cbp;
1815
4.93k
            p_curr_ctxt->u1_cbp = u1_cbp;
1816
1817
            /*--------------------------------------------------------------------*/
1818
            /* Read mb_qp_delta                                                   */
1819
            /*--------------------------------------------------------------------*/
1820
4.93k
            ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1821
4.93k
            if(ret != OK) return ret;
1822
4.87k
            COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1823
4.87k
            if(i1_delta_qp != 0)
1824
947
            {
1825
947
                ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1826
947
                if(ret != OK) return ret;
1827
947
            }
1828
1829
4.87k
            {
1830
4.87k
                WORD16 i_scaleFactor;
1831
4.87k
                WORD16 *pi2_scale_matrix_ptr;
1832
                /*******************************************************************/
1833
                /* for luma DC coefficients the scaling is done during the parsing */
1834
                /* to preserve the precision                                       */
1835
                /*******************************************************************/
1836
4.87k
                if(ps_dec->s_high_profile.u1_scaling_present)
1837
1.09k
                {
1838
1.09k
                    pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0];
1839
1.09k
                }
1840
3.77k
                else
1841
3.77k
                {
1842
3.77k
                    i_scaleFactor = 16;
1843
3.77k
                    pi2_scale_matrix_ptr = &i_scaleFactor;
1844
3.77k
                }
1845
4.87k
                {
1846
4.87k
                    ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
1847
4.87k
                    UWORD8 uc_a, uc_b;
1848
4.87k
                    UWORD32 u4_ctx_inc;
1849
4.87k
                    INC_SYM_COUNT(&(ps_dec->s_cab_dec_env));
1850
1851
                    /* if MbAddrN not available then CondTermN = 1 */
1852
4.87k
                    uc_b = ((ps_top_ctxt->u1_yuv_dc_csbp) & 0x01);
1853
1854
                    /* if MbAddrN not available then CondTermN = 1 */
1855
4.87k
                    uc_a = ((ps_dec->pu1_left_yuv_dc_csbp[0]) & 0x01);
1856
1857
4.87k
                    u4_ctx_inc = (uc_a + (uc_b << 1));
1858
4.87k
                    {
1859
4.87k
                        WORD16 pi2_dc_coef[16] = {0};
1860
4.87k
                        tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
1861
4.87k
                            (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data;
1862
4.87k
                        WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data;
1863
1864
4.87k
                        p_bin_ctxt = (ps_dec->p_cbf_t[LUMA_DC_CTXCAT]) + u4_ctx_inc;
1865
1866
4.87k
                        u1_dc_block_flag = ih264d_read_coeff4x4_cabac(
1867
4.87k
                            ps_bitstrm, LUMA_DC_CTXCAT,
1868
4.87k
                            ps_dec->p_significant_coeff_flag_t[LUMA_DC_CTXCAT], ps_dec, p_bin_ctxt);
1869
1870
                        /* Store coded_block_flag */
1871
4.87k
                        p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1872
4.87k
                        p_curr_ctxt->u1_yuv_dc_csbp |= u1_dc_block_flag;
1873
4.87k
                        if(u1_dc_block_flag)
1874
3.20k
                        {
1875
3.20k
                            WORD32 pi4_tmp[16] = {0};
1876
3.20k
                            memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef));
1877
3.20k
                            ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef,
1878
3.20k
                                                             ps_dec->pu1_inv_scan);
1879
1880
3.20k
                            PROFILE_DISABLE_IQ_IT_RECON()
1881
3.20k
                            ps_dec->pf_ihadamard_scaling_4x4(
1882
3.20k
                                pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y,
1883
3.20k
                                (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp);
1884
3.20k
                            pi2_coeff_block += 16;
1885
3.20k
                            ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block;
1886
3.20k
                            SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0);
1887
3.20k
                        }
1888
4.87k
                    }
1889
4.87k
                }
1890
4.87k
            }
1891
4.87k
        }
1892
9.86k
        ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
1893
9.86k
        ps_dec->pu1_left_yuv_dc_csbp[0] |= u1_dc_block_flag;
1894
9.86k
    }
1895
36.3k
    else
1896
36.3k
    {
1897
36.3k
        u1_offset = 0;
1898
        /*--------------------------------------------------------------------*/
1899
        /* Read the Coded block pattern                                       */
1900
        /*--------------------------------------------------------------------*/
1901
36.3k
        u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
1902
36.3k
        COPYTHECONTEXT("coded_block_pattern", u1_cbp);
1903
1904
36.3k
        ps_cur_mb_info->u1_cbp = u1_cbp;
1905
36.3k
        p_curr_ctxt->u1_cbp = u1_cbp;
1906
36.3k
        p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1907
36.3k
        ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
1908
36.3k
        p_curr_ctxt->u1_mb_type = CAB_INFERRED;
1909
36.3k
        p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
1910
36.3k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
1911
36.3k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1912
1913
        /*--------------------------------------------------------------------*/
1914
        /* Read transform_size_8x8_flag if present                            */
1915
        /*--------------------------------------------------------------------*/
1916
36.3k
        if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (u1_cbp & 0xf))
1917
12.2k
        {
1918
12.2k
            ps_cur_mb_info->u1_tran_form8x8 =
1919
12.2k
                ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
1920
12.2k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
1921
12.2k
            p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
1922
12.2k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
1923
12.2k
        }
1924
24.0k
        else
1925
24.0k
        {
1926
24.0k
            p_curr_ctxt->u1_transform8x8_ctxt = 0;
1927
24.0k
        }
1928
1929
        /*--------------------------------------------------------------------*/
1930
        /* Read mb_qp_delta                                                   */
1931
        /*--------------------------------------------------------------------*/
1932
36.3k
        if(ps_cur_mb_info->u1_cbp)
1933
25.9k
        {
1934
25.9k
            ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1935
25.9k
            if(ret != OK) return ret;
1936
25.9k
            COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1937
25.9k
            if(i1_delta_qp != 0)
1938
5.79k
            {
1939
5.79k
                ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1940
5.79k
                if(ret != OK) return ret;
1941
5.79k
            }
1942
25.9k
        }
1943
10.4k
        else
1944
10.4k
            ps_dec->i1_prev_mb_qp_delta = 0;
1945
36.3k
    }
1946
1947
46.1k
    ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, u1_offset);
1948
46.1k
    if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
1949
44.7k
    return OK;
1950
46.1k
}
1951
1952
/*!
1953
**************************************************************************
1954
* \if Function name : isvcd_decode_islice \endif
1955
*
1956
* \brief
1957
*    Decodes an I Slice
1958
*
1959
*
1960
* \return
1961
*    0 on Success and Error code otherwise
1962
**************************************************************************
1963
*/
1964
WORD32 isvcd_parse_islice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice)
1965
7.67k
{
1966
7.67k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1967
7.67k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1968
7.67k
    dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
1969
7.67k
    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
1970
7.67k
    UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
1971
7.67k
    UWORD32 u4_temp;
1972
7.67k
    WORD32 i_temp;
1973
7.67k
    WORD32 ret;
1974
1975
    /*--------------------------------------------------------------------*/
1976
    /* Read remaining contents of the slice header                        */
1977
    /*--------------------------------------------------------------------*/
1978
    /* dec_ref_pic_marking function */
1979
    /* G050 */
1980
7.67k
    if(ps_slice->u1_nal_ref_idc != 0)
1981
7.09k
    {
1982
7.09k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1983
6.38k
        {
1984
6.38k
            dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1985
6.38k
            dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
1986
6.38k
            UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
1987
1988
6.38k
            ps_pps->ps_sps = ps_dec->ps_cur_sps;
1989
6.38k
            if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
1990
5.95k
                ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
1991
1992
6.38k
            i_temp = ih264d_read_mmco_commands(ps_dec);
1993
6.38k
            ps_pps->ps_sps = ps_sps_tmp;
1994
6.38k
            ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
1995
1996
6.38k
            if(i_temp < 0)
1997
160
            {
1998
160
                return ERROR_DBP_MANAGER_T;
1999
160
            }
2000
6.22k
            ps_dec->u4_bitoffset = i_temp;
2001
6.22k
        }
2002
708
        else
2003
708
            ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
2004
7.09k
    }
2005
2006
7.51k
    {
2007
        /* G050 */
2008
        /* Read slice_qp_delta */
2009
7.51k
        WORD64 i8_temp =
2010
7.51k
            (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2011
7.51k
        if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T;
2012
6.75k
        ps_slice->u1_slice_qp = (UWORD8) i8_temp;
2013
6.75k
        COPYTHECONTEXT("SH: slice_qp_delta", ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
2014
6.75k
    }
2015
6.75k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
2016
3.73k
    {
2017
3.73k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2018
3.73k
        COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
2019
2020
3.73k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
2021
241
        {
2022
241
            return ERROR_INV_SLICE_HDR_T;
2023
241
        }
2024
3.48k
        ps_slice->u1_disable_dblk_filter_idc = u4_temp;
2025
3.48k
        if(u4_temp != 1)
2026
3.17k
        {
2027
3.17k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
2028
3.17k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2029
280
            {
2030
280
                return ERROR_INV_SLICE_HDR_T;
2031
280
            }
2032
2.89k
            ps_slice->i1_slice_alpha_c0_offset = i_temp;
2033
2.89k
            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
2034
2.89k
                           ps_slice->i1_slice_alpha_c0_offset >> 1);
2035
2036
2.89k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
2037
2.89k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2038
210
            {
2039
210
                return ERROR_INV_SLICE_HDR_T;
2040
210
            }
2041
2.68k
            ps_slice->i1_slice_beta_offset = i_temp;
2042
2.68k
            COPYTHECONTEXT("SH: slice_beta_offset_div2", ps_slice->i1_slice_beta_offset >> 1);
2043
2.68k
        }
2044
312
        else
2045
312
        {
2046
312
            ps_slice->i1_slice_alpha_c0_offset = 0;
2047
312
            ps_slice->i1_slice_beta_offset = 0;
2048
312
        }
2049
3.48k
    }
2050
3.02k
    else
2051
3.02k
    {
2052
3.02k
        ps_slice->u1_disable_dblk_filter_idc = 0;
2053
3.02k
        ps_slice->i1_slice_alpha_c0_offset = 0;
2054
3.02k
        ps_slice->i1_slice_beta_offset = 0;
2055
3.02k
    }
2056
2057
    /* Initialization to check if number of motion vector per 2 Mbs */
2058
    /* are exceeding the range or not */
2059
6.02k
    ps_dec->u2_mv_2mb[0] = 0;
2060
6.02k
    ps_dec->u2_mv_2mb[1] = 0;
2061
2062
    /*set slice header cone to 2 ,to indicate  correct header*/
2063
6.02k
    ps_dec->u1_slice_header_done = 2;
2064
6.02k
    if(ps_pps->u1_entropy_coding_mode)
2065
3.54k
    {
2066
3.54k
        SWITCHOFFTRACE;
2067
3.54k
        SWITCHONTRACECABAC;
2068
3.54k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2069
0
        {
2070
0
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
2071
0
        }
2072
3.54k
        else
2073
3.54k
            ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
2074
2075
3.54k
        ret = isvcd_parse_islice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
2076
3.54k
        if(ret != OK) return ret;
2077
652
        SWITCHONTRACE;
2078
652
        SWITCHOFFTRACECABAC;
2079
652
    }
2080
2.48k
    else
2081
2.48k
    {
2082
2.48k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2083
0
        {
2084
0
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
2085
0
        }
2086
2.48k
        else
2087
2.48k
            ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
2088
2.48k
        ret = isvcd_parse_islice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
2089
2.48k
        if(ret != OK) return ret;
2090
2.48k
    }
2091
2092
921
    return OK;
2093
6.02k
}