Coverage Report

Created: 2025-11-12 06:11

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.87k
{
109
3.87k
    UWORD8 uc_more_data_flag;
110
3.87k
    UWORD32 u4_num_mbs, u4_mb_idx;
111
3.87k
    dec_mb_info_t *ps_cur_mb_info;
112
3.87k
    deblk_mb_t *ps_cur_deblk_mb;
113
3.87k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
114
3.87k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
115
3.87k
    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
116
3.87k
    WORD32 i4_cur_mb_addr;
117
3.87k
    UWORD8 u1_mbaff;
118
3.87k
    UWORD32 u4_num_mbs_next, u4_end_of_row, u4_tfr_n_mb;
119
3.87k
    WORD32 ret = OK;
120
121
3.87k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
122
3.87k
    ih264d_update_qp(ps_dec, 0);
123
3.87k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
124
125
3.87k
    if(ps_bitstrm->u4_ofst & 0x07)
126
3.23k
    {
127
3.23k
        ps_bitstrm->u4_ofst += 8;
128
3.23k
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
129
3.23k
    }
130
3.87k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
131
3.87k
    if(ret != OK) return ret;
132
3.58k
    ih264d_init_cabac_contexts(I_SLICE, ps_dec);
133
134
3.58k
    ps_dec->i1_prev_mb_qp_delta = 0;
135
136
    /* initializations */
137
3.58k
    u4_mb_idx = ps_dec->u4_mb_idx;
138
3.58k
    u4_num_mbs = u4_mb_idx;
139
3.58k
    uc_more_data_flag = 1;
140
3.58k
    i4_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
141
3.58k
    do
142
73.9k
    {
143
73.9k
        UWORD16 u2_mbx;
144
73.9k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
145
146
73.9k
        if(i4_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
147
95
        {
148
95
            break;
149
95
        }
150
151
73.8k
        {
152
73.8k
            UWORD8 u1_mb_type;
153
73.8k
            ps_cur_mb_info = ps_dec->ps_nmb_info + u4_num_mbs;
154
73.8k
            ps_dec->u4_num_mbs_cur_nmb = u4_num_mbs;
155
73.8k
            ps_dec->u4_num_pmbair = (u4_num_mbs >> u1_mbaff);
156
73.8k
            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
73.8k
            ps_dec->pf_get_mb_info(ps_dec, i4_cur_mb_addr, ps_cur_mb_info, 0);
163
73.8k
            u2_mbx = ps_dec->u2_mbx;
164
165
            /*********************************************************************/
166
            /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
167
            /*********************************************************************/
168
73.8k
            ps_cur_mb_info->u1_tran_form8x8 = 0;
169
73.8k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
170
171
            /***************************************************************/
172
            /* Set the deblocking parameters for this MB                   */
173
            /***************************************************************/
174
73.8k
            ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_num_mbs;
175
73.8k
            if(ps_dec->u4_app_disable_deblk_frm == 0)
176
73.8k
                ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
177
73.8k
                                                 ps_dec->u1_mb_ngbr_availablity,
178
73.8k
                                                 ps_dec->u1_cur_mb_fld_dec_flag);
179
180
73.8k
            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
73.8k
            u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
185
73.8k
            if(u1_mb_type > 25) return ERROR_MB_TYPE;
186
73.8k
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
187
73.8k
            COPYTHECONTEXT("u1_mb_type", u1_mb_type);
188
189
            /* Parse Macroblock Data */
190
73.8k
            if(25 == u1_mb_type)
191
791
            {
192
                /* I_PCM_MB */
193
791
                ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
194
791
                ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u4_num_mbs);
195
791
                if(ret != OK) return ret;
196
382
                ps_cur_deblk_mb->u1_mb_qp = 0;
197
382
            }
198
73.0k
            else
199
73.0k
            {
200
73.0k
                ret = ih264d_parse_imb_cabac(ps_dec, ps_cur_mb_info, u1_mb_type);
201
73.0k
                if(ret != OK) return ret;
202
70.6k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
203
70.6k
            }
204
205
71.0k
            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.0k
            if(u1_mbaff)
211
0
            {
212
0
                ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
213
0
            }
214
215
71.0k
            if(ps_cur_mb_info->u1_topmb && u1_mbaff)
216
0
                uc_more_data_flag = 1;
217
71.0k
            else
218
71.0k
            {
219
71.0k
                uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
220
71.0k
                uc_more_data_flag = !uc_more_data_flag;
221
71.0k
                COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
222
71.0k
            }
223
224
71.0k
            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.0k
            i4_cur_mb_addr++;
233
            /* Store the colocated information */
234
71.0k
            {
235
71.0k
                mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u4_num_mbs << 4);
236
71.0k
                mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
237
71.0k
                ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
238
71.0k
                                   (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
239
71.0k
            }
240
            /*if num _cores is set to 3,compute bs will be done in another thread*/
241
71.0k
            if(ps_dec->u4_num_cores < 3)
242
71.0k
            {
243
71.0k
                if(ps_dec->u4_app_disable_deblk_frm == 0)
244
71.0k
                    ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
245
71.0k
                                                      (UWORD16) (u4_num_mbs >> u1_mbaff));
246
71.0k
            }
247
71.0k
            u4_num_mbs++;
248
71.0k
        }
249
250
        /****************************************************************/
251
        /* Check for End Of Row                                         */
252
        /****************************************************************/
253
0
        u4_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
254
71.0k
        u4_end_of_row = (!u4_num_mbs_next) && (!(u1_mbaff && (u4_num_mbs & 0x01)));
255
71.0k
        u4_tfr_n_mb =
256
71.0k
            (u4_num_mbs == ps_dec->u4_recon_mb_grp) || u4_end_of_row || (!uc_more_data_flag);
257
71.0k
        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
258
259
71.0k
        if(u4_tfr_n_mb || (!uc_more_data_flag))
260
13.5k
        {
261
13.5k
            if(ps_dec->u1_separate_parse)
262
5.45k
            {
263
5.45k
                ih264d_parse_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next, u4_tfr_n_mb,
264
5.45k
                                     u4_end_of_row);
265
5.45k
                ps_dec->ps_nmb_info += u4_num_mbs;
266
5.45k
                ps_svc_lyr_dec->ps_svc_nmb_info += u4_num_mbs;
267
5.45k
            }
268
8.13k
            else
269
8.13k
            {
270
8.13k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
271
5.97k
                {
272
5.97k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next,
273
5.97k
                                                u4_tfr_n_mb, u4_end_of_row);
274
5.97k
                }
275
2.15k
                else
276
2.15k
                {
277
2.15k
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u4_mb_idx, u4_num_mbs,
278
2.15k
                                                        u4_num_mbs_next, u4_tfr_n_mb,
279
2.15k
                                                        u4_end_of_row);
280
2.15k
                }
281
8.13k
            }
282
13.5k
            ps_dec->u4_total_mbs_coded += u4_num_mbs;
283
13.5k
            if(u4_tfr_n_mb) u4_num_mbs = 0;
284
13.5k
            u4_mb_idx = u4_num_mbs;
285
13.5k
            ps_dec->u4_mb_idx = u4_num_mbs;
286
13.5k
        }
287
71.0k
    } while(uc_more_data_flag);
288
289
839
    ps_dec->u4_num_mbs_cur_nmb = 0;
290
839
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i4_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
291
292
839
    return ret;
293
3.58k
}
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.29k
{
323
2.29k
    UWORD8 uc_more_data_flag;
324
2.29k
    UWORD32 u4_num_mbs, u4_mb_idx;
325
2.29k
    dec_mb_info_t *ps_cur_mb_info;
326
2.29k
    deblk_mb_t *ps_cur_deblk_mb;
327
2.29k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
328
2.29k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
329
2.29k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
330
2.29k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
331
2.29k
    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
332
2.29k
    WORD32 i4_cur_mb_addr;
333
2.29k
    UWORD8 u1_mbaff;
334
2.29k
    UWORD32 u4_num_mbs_next, u4_end_of_row, u4_tfr_n_mb;
335
2.29k
    WORD32 ret = OK;
336
337
2.29k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
338
2.29k
    ih264d_update_qp(ps_dec, 0);
339
2.29k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
340
341
    /* initializations */
342
2.29k
    u4_mb_idx = ps_dec->u4_mb_idx;
343
2.29k
    u4_num_mbs = u4_mb_idx;
344
345
2.29k
    uc_more_data_flag = 1;
346
2.29k
    i4_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
347
2.29k
    do
348
41.5k
    {
349
41.5k
        UWORD8 u1_mb_type;
350
41.5k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
351
41.5k
        if(i4_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
352
80
        {
353
80
            break;
354
80
        }
355
356
41.5k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u4_num_mbs;
357
41.5k
        ps_dec->u4_num_mbs_cur_nmb = u4_num_mbs;
358
41.5k
        ps_dec->u4_num_pmbair = (u4_num_mbs >> u1_mbaff);
359
41.5k
        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
41.5k
        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
41.5k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_num_mbs;
371
41.5k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
372
41.5k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
373
41.5k
                                             ps_dec->u1_mb_ngbr_availablity,
374
41.5k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
375
376
41.5k
        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
41.5k
        {
383
41.5k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
384
41.5k
            UWORD32 u4_word, u4_ldz, u4_temp;
385
386
            /***************************************************************/
387
            /* Find leading zeros in next 32 bits                          */
388
            /***************************************************************/
389
41.5k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
390
41.5k
            u4_ldz = CLZ(u4_word);
391
            /* Flush the ps_bitstrm */
392
41.5k
            u4_bitstream_offset += (u4_ldz + 1);
393
            /* Read the suffix from the ps_bitstrm */
394
41.5k
            u4_word = 0;
395
41.5k
            if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
396
41.5k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
397
41.5k
            u4_temp = ((1 << u4_ldz) + u4_word - 1);
398
41.5k
            if(u4_temp > 25) return ERROR_MB_TYPE;
399
41.3k
            u1_mb_type = u4_temp;
400
41.3k
        }
401
        /* Inlined ih264d_uev */
402
0
        ps_cur_mb_info->u1_mb_type = u1_mb_type;
403
41.3k
        COPYTHECONTEXT("u1_mb_type", u1_mb_type);
404
405
        /**************************************************************/
406
        /* Parse Macroblock data                                      */
407
        /**************************************************************/
408
41.3k
        if(25 == u1_mb_type)
409
77
        {
410
            /* I_PCM_MB */
411
77
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
412
77
            ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u4_num_mbs);
413
77
            if(ret != OK) return ret;
414
77
            ps_cur_deblk_mb->u1_mb_qp = 0;
415
77
        }
416
41.2k
        else
417
41.2k
        {
418
41.2k
            ret = ih264d_parse_imb_cavlc(ps_dec, ps_cur_mb_info, u4_num_mbs, u1_mb_type);
419
41.2k
            if(ret != OK) return ret;
420
39.4k
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
421
39.4k
        }
422
39.5k
        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
39.5k
        uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
428
39.5k
        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
39.5k
        i4_cur_mb_addr++;
440
        /* Store the colocated information */
441
39.5k
        {
442
39.5k
            mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u4_num_mbs << 4);
443
39.5k
            mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
444
39.5k
            ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
445
39.5k
                               (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
446
39.5k
        }
447
448
        /*if num _cores is set to 3,compute bs will be done in another thread*/
449
39.5k
        if(ps_dec->u4_num_cores < 3)
450
39.5k
        {
451
39.5k
            if(ps_dec->u4_app_disable_deblk_frm == 0)
452
39.5k
                ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
453
39.5k
                                                  (UWORD16) (u4_num_mbs >> u1_mbaff));
454
39.5k
        }
455
39.5k
        u4_num_mbs++;
456
457
        /****************************************************************/
458
        /* Check for End Of Row                                         */
459
        /****************************************************************/
460
39.5k
        u4_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
461
39.5k
        u4_end_of_row = (!u4_num_mbs_next) && (!(u1_mbaff && (u4_num_mbs & 0x01)));
462
39.5k
        u4_tfr_n_mb =
463
39.5k
            (u4_num_mbs == ps_dec->u4_recon_mb_grp) || u4_end_of_row || (!uc_more_data_flag);
464
39.5k
        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
465
466
39.5k
        if(u4_tfr_n_mb || (!uc_more_data_flag))
467
6.28k
        {
468
6.28k
            if(ps_dec->u1_separate_parse)
469
1.90k
            {
470
1.90k
                ih264d_parse_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next, u4_tfr_n_mb,
471
1.90k
                                     u4_end_of_row);
472
1.90k
                ps_dec->ps_nmb_info += u4_num_mbs;
473
1.90k
                ps_svc_lyr_dec->ps_svc_nmb_info += u4_num_mbs;
474
1.90k
            }
475
4.38k
            else
476
4.38k
            {
477
4.38k
                if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
478
3.79k
                {
479
3.79k
                    ih264d_decode_recon_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next,
480
3.79k
                                                u4_tfr_n_mb, u4_end_of_row);
481
3.79k
                }
482
582
                else
483
582
                {
484
582
                    isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u4_mb_idx, u4_num_mbs,
485
582
                                                        u4_num_mbs_next, u4_tfr_n_mb,
486
582
                                                        u4_end_of_row);
487
582
                }
488
4.38k
            }
489
6.28k
            ps_dec->u4_total_mbs_coded += u4_num_mbs;
490
6.28k
            if(u4_tfr_n_mb) u4_num_mbs = 0;
491
6.28k
            u4_mb_idx = u4_num_mbs;
492
6.28k
            ps_dec->u4_mb_idx = u4_num_mbs;
493
6.28k
        }
494
39.5k
    } while(uc_more_data_flag);
495
496
282
    ps_dec->u4_num_mbs_cur_nmb = 0;
497
282
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i4_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
498
499
282
    return ret;
500
2.29k
}
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
220k
{
518
220k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
519
220k
    WORD32 i4_delta_qp;
520
220k
    UWORD32 u4_temp;
521
220k
    UWORD32 ui_is_top_mb_available;
522
220k
    UWORD32 ui_is_left_mb_available;
523
220k
    UWORD32 u4_cbp;
524
220k
    UWORD32 u4_offset;
525
220k
    UWORD32 *pu4_bitstrm_buf;
526
220k
    WORD32 ret;
527
220k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
528
220k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
529
220k
    UNUSED(u4_mb_num);
530
531
220k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
532
220k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
533
220k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
534
220k
    u4_temp = ps_dec->u1_mb_ngbr_availablity;
535
220k
    ui_is_top_mb_available = BOOLEAN(u4_temp & TOP_MB_AVAILABLE_MASK);
536
220k
    ui_is_left_mb_available = BOOLEAN(u4_temp & LEFT_MB_AVAILABLE_MASK);
537
220k
    pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
538
539
220k
    ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB;
540
220k
    if(!ps_svc_cur_mb_info->u1_base_mode_flag)
541
14.6k
    {
542
14.6k
        if(u1_mb_type == I_4x4_MB)
543
5.44k
        {
544
5.44k
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
545
5.44k
            u4_offset = 0;
546
547
            /*--------------------------------------------------------------------*/
548
            /* Read transform_size_8x8_flag if present                            */
549
            /*--------------------------------------------------------------------*/
550
5.44k
            if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag)
551
4.41k
            {
552
4.41k
                ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
553
4.41k
                COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
554
4.41k
                ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
555
4.41k
            }
556
557
            /*--------------------------------------------------------------------*/
558
            /* Read the IntraPrediction modes for LUMA                            */
559
            /*--------------------------------------------------------------------*/
560
5.44k
            if(!ps_cur_mb_info->u1_tran_form8x8)
561
1.63k
            {
562
1.63k
                UWORD8 *pu1_temp;
563
1.63k
                ih264d_read_intra_pred_modes(ps_dec, ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
564
1.63k
                                             ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16),
565
1.63k
                                             ps_cur_mb_info->u1_tran_form8x8);
566
1.63k
                pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
567
1.63k
                pu1_temp += 32;
568
1.63k
                ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
569
1.63k
            }
570
3.80k
            else
571
3.80k
            {
572
3.80k
                UWORD8 *pu1_temp;
573
3.80k
                ih264d_read_intra_pred_modes(ps_dec, ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
574
3.80k
                                             ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4),
575
3.80k
                                             ps_cur_mb_info->u1_tran_form8x8);
576
3.80k
                pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
577
3.80k
                pu1_temp += 8;
578
3.80k
                ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
579
3.80k
            }
580
            /*--------------------------------------------------------------------*/
581
            /* Read the IntraPrediction mode for CHROMA                           */
582
            /*--------------------------------------------------------------------*/
583
            /* Inlined ih264d_uev */
584
5.44k
            {
585
5.44k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
586
5.44k
                UWORD32 u4_word, u4_ldz, u4_temp;
587
588
                /***************************************************************/
589
                /* Find leading zeros in next 32 bits                          */
590
                /***************************************************************/
591
5.44k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
592
5.44k
                u4_ldz = CLZ(u4_word);
593
                /* Flush the ps_bitstrm */
594
5.44k
                u4_bitstream_offset += (u4_ldz + 1);
595
                /* Read the suffix from the ps_bitstrm */
596
5.44k
                u4_word = 0;
597
5.44k
                if(u4_ldz)
598
1.36k
                {
599
1.36k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
600
1.36k
                }
601
5.44k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
602
5.44k
                u4_temp = ((1 << u4_ldz) + u4_word - 1);
603
5.44k
                if(u4_temp > 3)
604
225
                {
605
225
                    return ERROR_CHROMA_PRED_MODE;
606
225
                }
607
5.21k
                ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
608
5.21k
                COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
609
5.21k
            }
610
            /*--------------------------------------------------------------------*/
611
            /* Read the Coded block pattern                                       */
612
            /*--------------------------------------------------------------------*/
613
0
            {
614
5.21k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
615
5.21k
                UWORD32 u4_word, u4_ldz;
616
617
                /***************************************************************/
618
                /* Find leading zeros in next 32 bits                          */
619
                /***************************************************************/
620
5.21k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
621
5.21k
                u4_ldz = CLZ(u4_word);
622
                /* Flush the ps_bitstrm */
623
5.21k
                u4_bitstream_offset += (u4_ldz + 1);
624
                /* Read the suffix from the ps_bitstrm */
625
5.21k
                u4_word = 0;
626
5.21k
                if(u4_ldz)
627
1.81k
                {
628
1.81k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
629
1.81k
                }
630
5.21k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
631
5.21k
                u4_cbp = ((1 << u4_ldz) + u4_word - 1);
632
5.21k
            }
633
5.21k
            if(u4_cbp > 47)
634
122
            {
635
122
                return ERROR_CBP;
636
122
            }
637
638
5.09k
            u4_cbp = gau1_ih264d_cbp_table[u4_cbp][0];
639
5.09k
            COPYTHECONTEXT("coded_block_pattern", u4_cbp);
640
5.09k
            ps_cur_mb_info->u1_cbp = u4_cbp;
641
642
            /*--------------------------------------------------------------------*/
643
            /* Read mb_qp_delta                                                   */
644
            /*--------------------------------------------------------------------*/
645
5.09k
            if(ps_cur_mb_info->u1_cbp)
646
4.74k
            {
647
4.74k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
648
4.74k
                UWORD32 u4_word, u4_ldz, u4_abs_val;
649
650
                /***************************************************************/
651
                /* Find leading zeros in next 32 bits                          */
652
                /***************************************************************/
653
4.74k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
654
4.74k
                u4_ldz = CLZ(u4_word);
655
656
                /* Flush the ps_bitstrm */
657
4.74k
                u4_bitstream_offset += (u4_ldz + 1);
658
659
                /* Read the suffix from the ps_bitstrm */
660
4.74k
                u4_word = 0;
661
4.74k
                if(u4_ldz)
662
2.04k
                {
663
2.04k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
664
2.04k
                }
665
666
4.74k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
667
4.74k
                u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
668
669
4.74k
                if(u4_word & 0x1)
670
1.01k
                {
671
1.01k
                    i4_delta_qp = (-(WORD32) u4_abs_val);
672
1.01k
                }
673
3.72k
                else
674
3.72k
                {
675
3.72k
                    i4_delta_qp = (u4_abs_val);
676
3.72k
                }
677
678
4.74k
                if((i4_delta_qp < -26) || (i4_delta_qp > 25))
679
424
                {
680
424
                    return ERROR_INV_RANGE_QP_T;
681
424
                }
682
683
4.32k
                COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
684
4.32k
                if(i4_delta_qp != 0)
685
1.62k
                {
686
1.62k
                    ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
687
1.62k
                    if(ret != OK) return ret;
688
1.62k
                }
689
4.32k
            }
690
5.09k
        }
691
9.21k
        else
692
9.21k
        {
693
9.21k
            u4_offset = 1;
694
9.21k
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
695
            /*-------------------------------------------------------------------*/
696
            /* Read the IntraPrediction mode for CHROMA                          */
697
            /*-------------------------------------------------------------------*/
698
9.21k
            {
699
9.21k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
700
9.21k
                UWORD32 u4_word, u4_ldz;
701
702
                /***************************************************************/
703
                /* Find leading zeros in next 32 bits                          */
704
                /***************************************************************/
705
9.21k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
706
9.21k
                u4_ldz = CLZ(u4_word);
707
                /* Flush the ps_bitstrm */
708
9.21k
                u4_bitstream_offset += (u4_ldz + 1);
709
                /* Read the suffix from the ps_bitstrm */
710
9.21k
                u4_word = 0;
711
9.21k
                if(u4_ldz)
712
3.16k
                {
713
3.16k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
714
3.16k
                }
715
9.21k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
716
9.21k
                u4_temp = ((1 << u4_ldz) + u4_word - 1);
717
718
                /* Inlined ih264d_uev */
719
9.21k
                if(u4_temp > 3)
720
581
                {
721
581
                    return ERROR_CHROMA_PRED_MODE;
722
581
                }
723
8.63k
                ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
724
8.63k
                COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
725
8.63k
            }
726
            /*-------------------------------------------------------------------*/
727
            /* Read the Coded block pattern                                      */
728
            /*-------------------------------------------------------------------*/
729
0
            u4_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
730
8.63k
            ps_cur_mb_info->u1_cbp = u4_cbp;
731
732
            /*-------------------------------------------------------------------*/
733
            /* Read mb_qp_delta                                                  */
734
            /*-------------------------------------------------------------------*/
735
8.63k
            {
736
8.63k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
737
8.63k
                UWORD32 u4_word, u4_ldz, u4_abs_val;
738
739
                /***************************************************************/
740
                /* Find leading zeros in next 32 bits                          */
741
                /***************************************************************/
742
8.63k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
743
8.63k
                u4_ldz = CLZ(u4_word);
744
745
                /* Flush the ps_bitstrm */
746
8.63k
                u4_bitstream_offset += (u4_ldz + 1);
747
748
                /* Read the suffix from the ps_bitstrm */
749
8.63k
                u4_word = 0;
750
8.63k
                if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
751
752
8.63k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
753
8.63k
                u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
754
755
8.63k
                if(u4_word & 0x1)
756
1.13k
                    i4_delta_qp = (-(WORD32) u4_abs_val);
757
7.50k
                else
758
7.50k
                    i4_delta_qp = (u4_abs_val);
759
760
8.63k
                if((i4_delta_qp < -26) || (i4_delta_qp > 25)) return ERROR_INV_RANGE_QP_T;
761
8.63k
            }
762
            /* inlinined ih264d_sev */
763
8.45k
            COPYTHECONTEXT("Delta quant", i1_delta_qp);
764
765
8.45k
            if(i4_delta_qp != 0)
766
3.30k
            {
767
3.30k
                ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
768
3.30k
                if(ret != OK) return ret;
769
3.30k
            }
770
771
8.45k
            {
772
8.45k
                WORD16 i_scaleFactor;
773
8.45k
                UWORD32 ui_N = 0;
774
8.45k
                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.45k
                if(ps_dec->s_high_profile.u1_scaling_present)
780
3.42k
                {
781
3.42k
                    pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0];
782
3.42k
                }
783
5.03k
                else
784
5.03k
                {
785
5.03k
                    i_scaleFactor = 16;
786
5.03k
                    pi2_scale_matrix_ptr = &i_scaleFactor;
787
5.03k
                }
788
789
                /*---------------------------------------------------------------*/
790
                /* Decode DC coefficients                                        */
791
                /*---------------------------------------------------------------*/
792
                /*---------------------------------------------------------------*/
793
                /* Calculation of N                                              */
794
                /*---------------------------------------------------------------*/
795
8.45k
                if(ui_is_left_mb_available)
796
5.56k
                {
797
5.56k
                    if(ui_is_top_mb_available)
798
4.54k
                    {
799
4.54k
                        ui_N = ((ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0] +
800
4.54k
                                 ps_dec->pu1_left_nnz_y[0] + 1) >>
801
4.54k
                                1);
802
4.54k
                    }
803
1.01k
                    else
804
1.01k
                    {
805
1.01k
                        ui_N = ps_dec->pu1_left_nnz_y[0];
806
1.01k
                    }
807
5.56k
                }
808
2.89k
                else if(ui_is_top_mb_available)
809
2.04k
                {
810
2.04k
                    ui_N = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0];
811
2.04k
                }
812
813
8.45k
                {
814
8.45k
                    WORD16 pi2_dc_coef[16] = {0};
815
8.45k
                    WORD32 pi4_tmp[16] = {0};
816
8.45k
                    tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
817
8.45k
                        (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data;
818
8.45k
                    WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data;
819
8.45k
                    UWORD32 u4_num_coeff;
820
8.45k
                    ps_tu_4x4->u2_sig_coeff_map = 0;
821
8.45k
                    ret = ps_dec->pf_cavlc_parse4x4coeff[(ui_N > 7)](pi2_dc_coef, 0, ui_N, ps_dec,
822
8.45k
                                                                     &u4_num_coeff);
823
8.45k
                    if(ret != OK) return ret;
824
825
8.36k
                    if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
826
8.24k
                    if(ps_tu_4x4->u2_sig_coeff_map)
827
2.12k
                    {
828
2.12k
                        memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef));
829
2.12k
                        ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef,
830
2.12k
                                                         ps_dec->pu1_inv_scan);
831
832
2.12k
                        PROFILE_DISABLE_IQ_IT_RECON()
833
2.12k
                        ps_dec->pf_ihadamard_scaling_4x4(
834
2.12k
                            pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y,
835
2.12k
                            (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp);
836
2.12k
                        pi2_coeff_block += 16;
837
2.12k
                        ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block;
838
2.12k
                        SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0);
839
2.12k
                    }
840
8.24k
                }
841
8.24k
            }
842
8.24k
        }
843
14.6k
    }
844
206k
    else
845
206k
    {
846
206k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
847
206k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
848
206k
        u4_offset = 0;
849
        /*--------------------------------------------------------------------*/
850
        /* Read the Coded block pattern                                       */
851
        /*--------------------------------------------------------------------*/
852
206k
        {
853
206k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
854
206k
            UWORD32 u4_word, u4_ldz;
855
856
            /***************************************************************/
857
            /* Find leading zeros in next 32 bits                          */
858
            /***************************************************************/
859
206k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
860
206k
            u4_ldz = CLZ(u4_word);
861
            /* Flush the ps_bitstrm */
862
206k
            u4_bitstream_offset += (u4_ldz + 1);
863
            /* Read the suffix from the ps_bitstrm */
864
206k
            u4_word = 0;
865
206k
            if(u4_ldz)
866
21.1k
            {
867
21.1k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
868
21.1k
            }
869
206k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
870
206k
            u4_cbp = ((1 << u4_ldz) + u4_word - 1);
871
206k
        }
872
206k
        if(u4_cbp > 47)
873
707
        {
874
707
            return ERROR_CBP;
875
707
        }
876
877
        /*  inter cbp table to be used for base mode flag*/
878
205k
        u4_cbp = gau1_ih264d_cbp_table[u4_cbp][1];
879
205k
        COPYTHECONTEXT("coded_block_pattern", u4_cbp);
880
205k
        ps_cur_mb_info->u1_cbp = u4_cbp;
881
205k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
882
205k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
883
884
        /*--------------------------------------------------------------------*/
885
        /* Read transform_size_8x8_flag if present                            */
886
        /*--------------------------------------------------------------------*/
887
205k
        if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (ps_cur_mb_info->u1_cbp & 0xf))
888
5.15k
        {
889
5.15k
            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
890
5.15k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
891
5.15k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
892
5.15k
        }
893
        /*--------------------------------------------------------------------*/
894
        /* Read mb_qp_delta                                                   */
895
        /*--------------------------------------------------------------------*/
896
205k
        if(ps_cur_mb_info->u1_cbp)
897
20.4k
        {
898
20.4k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
899
20.4k
            UWORD32 u4_word, u4_ldz, u4_abs_val;
900
901
            /***************************************************************/
902
            /* Find leading zeros in next 32 bits                          */
903
            /***************************************************************/
904
20.4k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
905
20.4k
            u4_ldz = CLZ(u4_word);
906
907
            /* Flush the ps_bitstrm */
908
20.4k
            u4_bitstream_offset += (u4_ldz + 1);
909
910
            /* Read the suffix from the ps_bitstrm */
911
20.4k
            u4_word = 0;
912
20.4k
            if(u4_ldz)
913
7.26k
            {
914
7.26k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
915
7.26k
            }
916
917
20.4k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
918
20.4k
            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
919
920
20.4k
            if(u4_word & 0x1)
921
2.62k
            {
922
2.62k
                i4_delta_qp = (-(WORD32) u4_abs_val);
923
2.62k
            }
924
17.8k
            else
925
17.8k
            {
926
17.8k
                i4_delta_qp = (u4_abs_val);
927
17.8k
            }
928
929
20.4k
            if((i4_delta_qp < -26) || (i4_delta_qp > 25))
930
421
            {
931
421
                return ERROR_INV_RANGE_QP_T;
932
421
            }
933
934
20.0k
            COPYTHECONTEXT("mb_qp_delta", i4_delta_qp);
935
20.0k
            if(i4_delta_qp != 0)
936
6.84k
            {
937
6.84k
                ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
938
6.84k
                if(ret != OK) return ret;
939
6.84k
            }
940
20.0k
        }
941
205k
    }
942
217k
    if(u4_cbp)
943
25.1k
    {
944
25.1k
        ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, (UWORD8) u4_offset);
945
25.1k
        if(ret != OK) return ret;
946
24.4k
        if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
947
948
        /* Store Left Mb NNZ and TOP chroma NNZ */
949
24.4k
    }
950
192k
    else
951
192k
    {
952
192k
        ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
953
192k
        ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
954
192k
        ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
955
192k
        ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
956
192k
        ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
957
192k
        ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
958
192k
        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
959
192k
    }
960
961
216k
    return OK;
962
217k
}
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
6.07k
{
978
6.07k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
979
6.07k
    WORD32 i_status = OK;
980
6.07k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
981
6.07k
    dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
982
6.07k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
983
6.07k
    dec_seq_params_t *ps_seq;
984
6.07k
    dec_svc_seq_params_t *ps_subset_seq;
985
6.07k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
986
6.07k
    dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
987
6.07k
    dec_nal_unit_svc_ext_params_t *ps_nal_svc_ext = NULL;
988
6.07k
    UWORD32 u4_temp;
989
6.07k
    WORD32 i_temp;
990
6.07k
    WORD32 ret;
991
6.07k
    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
992
6.07k
    UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
993
994
6.07k
    ps_nal_svc_ext = ps_svc_lyr_dec->ps_nal_svc_ext;
995
6.07k
    ps_seq = ps_dec->ps_cur_sps;
996
6.07k
    ps_subset_seq =
997
6.07k
        &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
998
6.07k
    ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
999
6.07k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1000
1001
6.07k
    if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
1002
6.07k
    {
1003
        /*--------------------------------------------------------------------*/
1004
        /* Read remaining contents of the slice header                        */
1005
        /*--------------------------------------------------------------------*/
1006
        /* dec_ref_pic_marking function */
1007
        /* G050 */
1008
6.07k
        if(ps_slice->u1_nal_ref_idc != 0)
1009
5.99k
        {
1010
5.99k
            if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1011
5.89k
            {
1012
5.89k
                dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1013
5.89k
                dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
1014
5.89k
                UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
1015
1016
5.89k
                ps_pps->ps_sps = ps_dec->ps_cur_sps;
1017
5.89k
                if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
1018
4.35k
                    ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
1019
1020
5.89k
                i_temp = ih264d_read_mmco_commands(ps_dec);
1021
1022
5.89k
                ps_pps->ps_sps = ps_sps_tmp;
1023
5.89k
                ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
1024
5.89k
                if(i_temp < 0)
1025
67
                {
1026
67
                    return ERROR_DBP_MANAGER_T;
1027
67
                }
1028
5.82k
                ps_dec->u4_bitoffset = i_temp;
1029
5.82k
            }
1030
99
            else
1031
99
                ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
1032
1033
5.92k
            if(!ps_sps_svc_ext->u1_slice_header_restriction_flag)
1034
4.58k
            {
1035
4.58k
                ps_svc_slice_params->u1_store_ref_base_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
1036
4.58k
                COPYTHECONTEXT("SPS_SVC_EXT: u1_store_ref_base_pic_flag",
1037
4.58k
                               ps_svc_slice_params->u1_store_ref_base_pic_flag);
1038
1039
4.58k
                if(0 != ps_svc_slice_params->u1_store_ref_base_pic_flag)
1040
128
                {
1041
128
                    return NOT_OK;
1042
128
                }
1043
4.45k
                if(((1 == ps_nal_svc_ext->u1_use_ref_base_pic_flag) ||
1044
4.45k
                    (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.45k
            }
1055
5.92k
        }
1056
6.07k
    }
1057
1058
5.87k
    {
1059
        /* G050 */
1060
        /* Read slice_qp_delta */
1061
5.87k
        WORD64 i8_temp =
1062
5.87k
            (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1063
5.87k
        if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T;
1064
5.48k
        ps_slice->u1_slice_qp = (UWORD8) i8_temp;
1065
5.48k
        COPYTHECONTEXT("Slice Header SVC ext: slice_qp_delta",
1066
5.48k
                       ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
1067
5.48k
    }
1068
1069
5.48k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
1070
3.37k
    {
1071
3.37k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1072
3.37k
        COPYTHECONTEXT("Slice Header SVC ext: disable_deblocking_filter_idc", u4_temp);
1073
1074
3.37k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
1075
164
        {
1076
164
            return ERROR_INV_SLICE_HDR_T;
1077
164
        }
1078
3.20k
        ps_slice->u1_disable_dblk_filter_idc = u4_temp;
1079
3.20k
        if(u4_temp != 1)
1080
2.91k
        {
1081
2.91k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
1082
2.91k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1083
173
            {
1084
173
                return ERROR_INV_SLICE_HDR_T;
1085
173
            }
1086
2.74k
            ps_slice->i1_slice_alpha_c0_offset = i_temp;
1087
2.74k
            COPYTHECONTEXT("Slice Header SVC ext: slice_alpha_c0_offset_div2",
1088
2.74k
                           ps_slice->i1_slice_alpha_c0_offset >> 1);
1089
1090
2.74k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
1091
2.74k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1092
142
            {
1093
142
                return ERROR_INV_SLICE_HDR_T;
1094
142
            }
1095
2.60k
            ps_slice->i1_slice_beta_offset = i_temp;
1096
2.60k
            COPYTHECONTEXT("Slice Header SVC ext: slice_beta_offset_div2",
1097
2.60k
                           ps_slice->i1_slice_beta_offset >> 1);
1098
2.60k
        }
1099
290
        else
1100
290
        {
1101
290
            ps_slice->i1_slice_alpha_c0_offset = 0;
1102
290
            ps_slice->i1_slice_beta_offset = 0;
1103
290
        }
1104
3.20k
    }
1105
2.11k
    else
1106
2.11k
    {
1107
2.11k
        ps_slice->u1_disable_dblk_filter_idc = 0;
1108
2.11k
        ps_slice->i1_slice_alpha_c0_offset = 0;
1109
2.11k
        ps_slice->i1_slice_beta_offset = 0;
1110
2.11k
    }
1111
1112
    /* add the remaining part of the code for svc extension from reference */
1113
5.00k
    ret = isvcd_set_default_slice_header_ext(ps_svc_lyr_dec);
1114
5.00k
    if(ret != OK)
1115
0
    {
1116
0
        return ERROR_INV_SLICE_HDR_T;
1117
0
    }
1118
1119
5.00k
    ret = isvcd_parse_slice_header(ps_svc_lyr_dec);
1120
5.00k
    if(ret != OK)
1121
186
    {
1122
186
        return ERROR_INV_SLICE_HDR_T;
1123
186
    }
1124
1125
    /* Initialization to check if number of motion vector per 2 Mbs */
1126
    /* are exceeding the range or not */
1127
4.81k
    ps_dec->u2_mv_2mb[0] = 0;
1128
4.81k
    ps_dec->u2_mv_2mb[1] = 0;
1129
1130
    /*set slice header cone to 2 ,to indicate  correct header*/
1131
4.81k
    ps_dec->u1_slice_header_done = 2;
1132
1133
4.81k
    if(!ps_svc_slice_params->u1_slice_skip_flag)
1134
4.67k
    {
1135
4.67k
        if(ps_pps->u1_entropy_coding_mode)
1136
1.42k
        {
1137
1.42k
            SWITCHOFFTRACE;
1138
1.42k
            SWITCHONTRACECABAC;
1139
1.42k
            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.42k
            else
1144
1.42k
                ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
1145
1146
1.42k
            ret = isvcd_parse_eislice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
1147
1.42k
            if(ret != OK) return ret;
1148
472
            SWITCHONTRACE;
1149
472
            SWITCHOFFTRACECABAC;
1150
472
        }
1151
3.24k
        else
1152
3.24k
        {
1153
3.24k
            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.24k
            else
1158
3.24k
                ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
1159
3.24k
            ret = isvcd_parse_eislice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
1160
3.24k
            if(ret != OK) return ret;
1161
3.24k
        }
1162
4.67k
    }
1163
143
    else
1164
143
    {
1165
143
        return ERROR_FEATURE_UNAVAIL;
1166
143
    }
1167
1168
1.93k
    return OK;
1169
4.81k
}
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.42k
{
1198
1.42k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1199
1.42k
    UWORD8 uc_more_data_flag;
1200
1.42k
    UWORD8 u1_num_mbs, u1_mb_idx;
1201
1.42k
    dec_mb_info_t *ps_cur_mb_info;
1202
1.42k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1203
1.42k
    deblk_mb_t *ps_cur_deblk_mb;
1204
1.42k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1205
1.42k
    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1206
1.42k
    WORD16 i2_cur_mb_addr;
1207
1.42k
    UWORD8 u1_mbaff;
1208
1.42k
    UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
1209
1.42k
    WORD32 ret = OK;
1210
1.42k
    decoding_envirnoment_t *ps_cab_env;
1211
1.42k
    UWORD8 *pu1_cur_svc_base_mode_flag;
1212
1.42k
    UWORD8 u1_left_svc_base_mode_flag;
1213
1.42k
    UWORD8 u1_top_svc_base_mode_flag;
1214
1.42k
    UWORD32 u4_a, u4_b, u4_ctxt_inc;
1215
1.42k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1216
1217
1.42k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1218
1.42k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1219
1.42k
    ih264d_update_qp(ps_dec, 0);
1220
1.42k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1221
1222
1.42k
    if(ps_bitstrm->u4_ofst & 0x07)
1223
1.14k
    {
1224
1.14k
        ps_bitstrm->u4_ofst += 8;
1225
1.14k
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
1226
1.14k
    }
1227
1.42k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
1228
1.42k
    if(ret != OK) return ret;
1229
1.30k
    isvcd_init_cabac_contexts(I_SLICE, ps_dec);
1230
1.30k
    ps_dec->i1_prev_mb_qp_delta = 0;
1231
1.30k
    ps_cab_env = &ps_dec->s_cab_dec_env;
1232
    /* initializations */
1233
1.30k
    u1_mb_idx = ps_dec->u4_mb_idx;
1234
1.30k
    u1_num_mbs = u1_mb_idx;
1235
1.30k
    uc_more_data_flag = 1;
1236
1.30k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1237
1.30k
    do
1238
21.6k
    {
1239
21.6k
        UWORD16 u2_mbx;
1240
21.6k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1241
21.6k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1242
383
        {
1243
383
            break;
1244
383
        }
1245
1246
21.2k
        {
1247
21.2k
            UWORD8 u1_mb_type;
1248
21.2k
            ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1249
21.2k
            ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1250
21.2k
            ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1251
21.2k
            ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1252
21.2k
            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
21.2k
            ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1258
21.2k
            u2_mbx = ps_dec->u2_mbx;
1259
21.2k
            ps_svc_cur_mb_info->u1_crop_window_flag =
1260
21.2k
                *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1261
21.2k
                  (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
21.2k
            ps_cur_mb_info->u1_tran_form8x8 = 0;
1266
21.2k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1267
            /***************************************************************/
1268
            /* Set the deblocking parameters for this MB                   */
1269
            /***************************************************************/
1270
21.2k
            ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1271
21.2k
            if(ps_dec->u4_app_disable_deblk_frm == 0)
1272
21.2k
                ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1273
21.2k
                                                 ps_dec->u1_mb_ngbr_availablity,
1274
21.2k
                                                 ps_dec->u1_cur_mb_fld_dec_flag);
1275
1276
21.2k
            ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1277
            /* Macroblock Layer Begins */
1278
21.2k
            if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1279
20.9k
               ps_svc_slice_params->u1_adaptive_base_mode_flag)
1280
15.5k
            {
1281
15.5k
                pu1_cur_svc_base_mode_flag =
1282
15.5k
                    ps_svc_lyr_dec->pu1_svc_base_mode_flag + ps_cur_mb_info->u2_mbx;
1283
15.5k
                pu1_cur_svc_base_mode_flag +=
1284
15.5k
                    ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride;
1285
1286
15.5k
                u1_left_svc_base_mode_flag = 0;
1287
15.5k
                if(ps_dec->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
1288
11.2k
                    u1_left_svc_base_mode_flag = *(pu1_cur_svc_base_mode_flag - 1);
1289
1290
15.5k
                u1_top_svc_base_mode_flag = 0;
1291
15.5k
                if(ps_dec->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
1292
12.5k
                    u1_top_svc_base_mode_flag =
1293
12.5k
                        *(pu1_cur_svc_base_mode_flag -
1294
12.5k
                          ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride);
1295
1296
15.5k
                u4_a = 1;
1297
15.5k
                u4_b = 1;
1298
1299
15.5k
                if(u1_top_svc_base_mode_flag)
1300
9.61k
                {
1301
9.61k
                    u4_a = 0;
1302
9.61k
                }
1303
1304
15.5k
                if(u1_left_svc_base_mode_flag)
1305
8.51k
                {
1306
8.51k
                    u4_b = 0;
1307
8.51k
                }
1308
1309
15.5k
                u4_ctxt_inc = u4_a + u4_b;
1310
15.5k
                ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_decode_bin(
1311
15.5k
                    u4_ctxt_inc, ps_svc_lyr_dec->ps_base_mode_flag, ps_bitstrm, ps_cab_env);
1312
15.5k
                COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1313
15.5k
                *pu1_cur_svc_base_mode_flag = ps_svc_cur_mb_info->u1_base_mode_flag;
1314
15.5k
            }
1315
5.71k
            else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1316
5.39k
            {
1317
5.39k
                ps_svc_cur_mb_info->u1_base_mode_flag =
1318
5.39k
                    ps_svc_slice_params->u1_default_base_mode_flag;
1319
5.39k
            }
1320
1321
21.2k
            if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1322
8.28k
            {
1323
                /* Decode the u1_mb_type */
1324
8.28k
                u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
1325
8.28k
                if(u1_mb_type > 25) return ERROR_MB_TYPE;
1326
8.28k
                ps_cur_mb_info->u1_mb_type = u1_mb_type;
1327
8.28k
                COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1328
8.28k
                ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
1329
8.28k
            }
1330
12.9k
            else
1331
12.9k
            {
1332
12.9k
                ps_cur_mb_info->u1_mb_type = MB_INFER;
1333
12.9k
                ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL;
1334
12.9k
            }
1335
            /* Parse Macroblock Data */
1336
21.2k
            u1_mb_type = ps_cur_mb_info->u1_mb_type;
1337
21.2k
            if(25 == u1_mb_type)
1338
144
            {
1339
                /* I_PCM_MB */
1340
144
                ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1341
144
                ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1342
144
                if(ret != OK) return ret;
1343
66
                ps_cur_deblk_mb->u1_mb_qp = 0;
1344
66
            }
1345
21.0k
            else
1346
21.0k
            {
1347
21.0k
                ret = isvcd_parse_imb_cabac(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1348
21.0k
                                            u1_mb_type);
1349
21.0k
                if(ret != OK) return ret;
1350
20.3k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1351
20.3k
            }
1352
1353
20.3k
            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
20.3k
            if(u1_mbaff)
1359
0
            {
1360
0
                ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1361
0
            }
1362
1363
20.3k
            if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1364
0
                uc_more_data_flag = 1;
1365
20.3k
            else
1366
20.3k
            {
1367
20.3k
                uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
1368
20.3k
                uc_more_data_flag = !uc_more_data_flag;
1369
20.3k
                COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
1370
20.3k
            }
1371
1372
20.3k
            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
20.3k
            i2_cur_mb_addr++;
1381
            /* Store the colocated information */
1382
20.3k
            {
1383
20.3k
                mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1384
20.3k
                mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
1385
20.3k
                if(ps_mv_nmb_start)
1386
20.3k
                {
1387
20.3k
                    ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1388
20.3k
                                       (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
1389
20.3k
                }
1390
0
                else
1391
0
                {
1392
0
                    return NOT_OK;
1393
0
                }
1394
20.3k
            }
1395
1396
20.3k
            u1_num_mbs++;
1397
20.3k
        }
1398
1399
        /****************************************************************/
1400
        /* Check for End Of Row                                         */
1401
        /****************************************************************/
1402
0
        u1_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
1403
20.3k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1404
20.3k
        u1_tfr_n_mb =
1405
20.3k
            (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
1406
20.3k
        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1407
1408
20.3k
        if(u1_tfr_n_mb || (!uc_more_data_flag))
1409
4.95k
        {
1410
4.95k
            if(ps_dec->u1_separate_parse)
1411
1.08k
            {
1412
1.08k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1413
1.08k
                                     u1_end_of_row);
1414
1.08k
                ps_dec->ps_nmb_info += u1_num_mbs;
1415
1.08k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1416
1.08k
            }
1417
3.87k
            else
1418
3.87k
            {
1419
3.87k
                ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1420
3.87k
                                                              u1_num_mbs_next, u1_tfr_n_mb,
1421
3.87k
                                                              u1_end_of_row);
1422
3.87k
                if(ret != OK) return ret;
1423
3.87k
            }
1424
4.95k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1425
4.95k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1426
4.95k
            u1_mb_idx = u1_num_mbs;
1427
4.95k
            ps_dec->u4_mb_idx = u1_num_mbs;
1428
4.95k
        }
1429
20.3k
    } while(uc_more_data_flag);
1430
1431
472
    ps_dec->u4_num_mbs_cur_nmb = 0;
1432
472
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1433
1434
472
    return ret;
1435
1.30k
}
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.24k
{
1464
3.24k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1465
3.24k
    UWORD8 uc_more_data_flag;
1466
3.24k
    UWORD8 u1_num_mbs, u1_mb_idx;
1467
3.24k
    dec_mb_info_t *ps_cur_mb_info;
1468
3.24k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1469
3.24k
    deblk_mb_t *ps_cur_deblk_mb;
1470
3.24k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1471
3.24k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1472
3.24k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1473
3.24k
    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1474
3.24k
    WORD16 i2_cur_mb_addr;
1475
3.24k
    UWORD8 u1_mbaff;
1476
3.24k
    UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
1477
3.24k
    WORD32 ret = OK;
1478
3.24k
    dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1479
1480
3.24k
    ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1481
3.24k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1482
3.24k
    ih264d_update_qp(ps_dec, 0);
1483
3.24k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1484
1485
3.24k
    u1_mb_idx = ps_dec->u4_mb_idx;
1486
3.24k
    u1_num_mbs = u1_mb_idx;
1487
3.24k
    uc_more_data_flag = 1;
1488
3.24k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1489
1490
3.24k
    do
1491
70.3k
    {
1492
70.3k
        UWORD8 u1_mb_type;
1493
70.3k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1494
70.3k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1495
1.05k
        {
1496
1.05k
            break;
1497
1.05k
        }
1498
1499
69.3k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1500
69.3k
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1501
69.3k
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1502
69.3k
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1503
69.3k
        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.3k
        ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1509
69.3k
        ps_svc_cur_mb_info->u1_crop_window_flag =
1510
69.3k
            *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1511
69.3k
              (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.3k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1517
69.3k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
1518
69.3k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1519
69.3k
                                             ps_dec->u1_mb_ngbr_availablity,
1520
69.3k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
1521
1522
69.3k
        ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1523
69.3k
        if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1524
69.1k
           ps_svc_slice_params->u1_adaptive_base_mode_flag)
1525
41.8k
        {
1526
41.8k
            ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1527
41.8k
            COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1528
41.8k
        }
1529
27.4k
        else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1530
27.2k
        {
1531
27.2k
            ps_svc_cur_mb_info->u1_base_mode_flag = ps_svc_slice_params->u1_default_base_mode_flag;
1532
27.2k
        }
1533
1534
        /**************************************************************/
1535
        /* Macroblock Layer Begins, Decode the u1_mb_type                */
1536
        /**************************************************************/
1537
69.3k
        if(!ps_svc_cur_mb_info->u1_base_mode_flag) /* Inlined ih264d_uev */
1538
13.0k
        {
1539
13.0k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1540
13.0k
            UWORD32 u4_word, u4_ldz, u4_temp;
1541
1542
            /***************************************************************/
1543
            /* Find leading zeros in next 32 bits                          */
1544
            /***************************************************************/
1545
13.0k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1546
13.0k
            u4_ldz = CLZ(u4_word);
1547
            /* Flush the ps_bitstrm */
1548
13.0k
            u4_bitstream_offset += (u4_ldz + 1);
1549
            /* Read the suffix from the ps_bitstrm */
1550
13.0k
            u4_word = 0;
1551
13.0k
            if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1552
13.0k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
1553
13.0k
            u4_temp = ((1 << u4_ldz) + u4_word - 1);
1554
13.0k
            if(u4_temp > 25) return ERROR_MB_TYPE;
1555
12.8k
            u1_mb_type = u4_temp;
1556
1557
            /* Inlined ih264d_uev */
1558
12.8k
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
1559
12.8k
            COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1560
1561
12.8k
            ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
1562
12.8k
        }
1563
56.2k
        else
1564
56.2k
        {
1565
56.2k
            ps_cur_mb_info->u1_mb_type = MB_INFER;
1566
56.2k
            ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL;
1567
56.2k
        }
1568
1569
        /**************************************************************/
1570
        /* Parse Macroblock data                                      */
1571
        /**************************************************************/
1572
69.1k
        u1_mb_type = ps_cur_mb_info->u1_mb_type;
1573
69.1k
        if(25 == u1_mb_type)
1574
73
        {
1575
            /* I_PCM_MB */
1576
73
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1577
73
            ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1578
73
            if(ret != OK) return ret;
1579
73
            ps_cur_deblk_mb->u1_mb_qp = 0;
1580
73
        }
1581
69.0k
        else
1582
69.0k
        {
1583
69.0k
            ret = isvcd_parse_imb_cavlc(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1584
69.0k
                                        u1_num_mbs, u1_mb_type);
1585
69.0k
            if(ret != OK) return ret;
1586
67.4k
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1587
67.4k
        }
1588
1589
67.5k
        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.5k
        uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1595
1596
67.5k
        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.5k
        i2_cur_mb_addr++;
1608
        /* Store the colocated information */
1609
67.5k
        {
1610
67.5k
            mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1611
67.5k
            mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
1612
67.5k
            if(ps_mv_nmb_start)
1613
67.5k
            {
1614
67.5k
                ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1615
67.5k
                                   (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
1616
67.5k
            }
1617
0
            else
1618
0
            {
1619
0
                return NOT_OK;
1620
0
            }
1621
67.5k
        }
1622
67.5k
        u1_num_mbs++;
1623
1624
        /****************************************************************/
1625
        /* Check for End Of Row                                         */
1626
        /****************************************************************/
1627
67.5k
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1628
67.5k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1629
67.5k
        u1_tfr_n_mb =
1630
67.5k
            (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
1631
67.5k
        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1632
1633
67.5k
        if(u1_tfr_n_mb || (!uc_more_data_flag))
1634
19.1k
        {
1635
19.1k
            if(ps_dec->u1_separate_parse)
1636
13.5k
            {
1637
13.5k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1638
13.5k
                                     u1_end_of_row);
1639
13.5k
                ps_dec->ps_nmb_info += u1_num_mbs;
1640
13.5k
                ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1641
13.5k
            }
1642
5.53k
            else
1643
5.53k
            {
1644
5.53k
                ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1645
5.53k
                                                              u1_num_mbs_next, u1_tfr_n_mb,
1646
5.53k
                                                              u1_end_of_row);
1647
5.53k
                if(ret != OK) return ret;
1648
5.53k
            }
1649
19.1k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1650
19.1k
            if(u1_tfr_n_mb) u1_num_mbs = 0;
1651
19.1k
            u1_mb_idx = u1_num_mbs;
1652
19.1k
            ps_dec->u4_mb_idx = u1_num_mbs;
1653
19.1k
        }
1654
67.5k
    } while(uc_more_data_flag);
1655
1656
1.46k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1657
1.46k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1658
1659
1.46k
    return ret;
1660
3.24k
}
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
48.6k
{
1678
48.6k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1679
48.6k
    WORD8 i1_delta_qp;
1680
48.6k
    UWORD8 u1_cbp;
1681
48.6k
    UWORD8 u1_offset;
1682
    /* Variables for handling Cabac contexts */
1683
48.6k
    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1684
48.6k
    ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
1685
48.6k
    dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1686
48.6k
    bin_ctxt_model_t *p_bin_ctxt;
1687
48.6k
    UWORD8 u1_intra_chrom_pred_mode;
1688
48.6k
    UWORD8 u1_dc_block_flag = 0;
1689
48.6k
    WORD32 ret;
1690
1691
48.6k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
1692
1693
48.6k
    if(ps_left_ctxt == ps_dec->ps_def_ctxt_mb_info)
1694
12.5k
    {
1695
12.5k
        ps_dec->pu1_left_yuv_dc_csbp[0] = 0xf;
1696
12.5k
    }
1697
1698
48.6k
    if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE)
1699
27.5k
    {
1700
27.5k
        MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
1701
27.5k
        *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
1702
27.5k
        MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
1703
27.5k
        memset(p_curr_ctxt->i1_ref_idx, 0, 4);
1704
27.5k
    }
1705
1706
    /* default */
1707
48.6k
    ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB;
1708
48.6k
    if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1709
10.0k
    {
1710
10.0k
        if(u1_mb_type == I_4x4_MB)
1711
5.25k
        {
1712
5.25k
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
1713
5.25k
            p_curr_ctxt->u1_mb_type = CAB_I4x4;
1714
5.25k
            u1_offset = 0;
1715
5.25k
            ps_cur_mb_info->u1_tran_form8x8 = 0;
1716
5.25k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1717
            /*--------------------------------------------------------------------*/
1718
            /* Read transform_size_8x8_flag if present                            */
1719
            /*--------------------------------------------------------------------*/
1720
5.25k
            if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag)
1721
4.62k
            {
1722
4.62k
                ps_cur_mb_info->u1_tran_form8x8 =
1723
4.62k
                    ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
1724
4.62k
                COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
1725
4.62k
                p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
1726
4.62k
                ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
1727
4.62k
            }
1728
624
            else
1729
624
            {
1730
624
                p_curr_ctxt->u1_transform8x8_ctxt = 0;
1731
624
            }
1732
1733
            /*--------------------------------------------------------------------*/
1734
            /* Read the IntraPrediction modes for LUMA                            */
1735
            /*--------------------------------------------------------------------*/
1736
5.25k
            if(!ps_cur_mb_info->u1_tran_form8x8)
1737
1.05k
            {
1738
1.05k
                UWORD8 *pu1_temp;
1739
1.05k
                ih264d_read_intra_pred_modes_cabac(ps_dec,
1740
1.05k
                                                   ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
1741
1.05k
                                                   ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16),
1742
1.05k
                                                   ps_cur_mb_info->u1_tran_form8x8);
1743
1.05k
                pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
1744
1.05k
                pu1_temp += 32;
1745
1.05k
                ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
1746
1.05k
            }
1747
4.20k
            else
1748
4.20k
            {
1749
4.20k
                UWORD8 *pu1_temp;
1750
4.20k
                ih264d_read_intra_pred_modes_cabac(ps_dec,
1751
4.20k
                                                   ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
1752
4.20k
                                                   ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4),
1753
4.20k
                                                   ps_cur_mb_info->u1_tran_form8x8);
1754
4.20k
                pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
1755
4.20k
                pu1_temp += 8;
1756
4.20k
                ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
1757
4.20k
            }
1758
            /*--------------------------------------------------------------------*/
1759
            /* Read the IntraPrediction mode for CHROMA                           */
1760
            /*--------------------------------------------------------------------*/
1761
5.25k
            u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
1762
5.25k
            COPYTHECONTEXT("intra_chroma_pred_mode", u1_intra_chrom_pred_mode);
1763
5.25k
            p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
1764
5.25k
                u1_intra_chrom_pred_mode;
1765
1766
            /*--------------------------------------------------------------------*/
1767
            /* Read the Coded block pattern                                       */
1768
            /*--------------------------------------------------------------------*/
1769
5.25k
            u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
1770
5.25k
            COPYTHECONTEXT("coded_block_pattern", u1_cbp);
1771
5.25k
            ps_cur_mb_info->u1_cbp = u1_cbp;
1772
5.25k
            p_curr_ctxt->u1_cbp = u1_cbp;
1773
1774
            /*--------------------------------------------------------------------*/
1775
            /* Read mb_qp_delta                                                   */
1776
            /*--------------------------------------------------------------------*/
1777
5.25k
            if(ps_cur_mb_info->u1_cbp)
1778
4.27k
            {
1779
4.27k
                ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1780
4.27k
                if(ret != OK) return ret;
1781
4.20k
                COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1782
4.20k
                if(i1_delta_qp != 0)
1783
1.01k
                {
1784
1.01k
                    ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1785
1.01k
                    if(ret != OK) return ret;
1786
1.01k
                }
1787
4.20k
            }
1788
978
            else
1789
978
                ps_dec->i1_prev_mb_qp_delta = 0;
1790
5.17k
            p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1791
5.17k
        }
1792
4.75k
        else
1793
4.75k
        {
1794
4.75k
            u1_offset = 1;
1795
4.75k
            ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
1796
4.75k
            p_curr_ctxt->u1_mb_type = CAB_I16x16;
1797
4.75k
            ps_cur_mb_info->u1_tran_form8x8 = 0;
1798
4.75k
            p_curr_ctxt->u1_transform8x8_ctxt = 0;
1799
4.75k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1800
            /*--------------------------------------------------------------------*/
1801
            /* Read the IntraPrediction mode for CHROMA                           */
1802
            /*--------------------------------------------------------------------*/
1803
4.75k
            u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
1804
4.75k
            if(u1_intra_chrom_pred_mode > 3) return ERROR_CHROMA_PRED_MODE;
1805
1806
4.75k
            COPYTHECONTEXT("Chroma intra_chroma_pred_mode pred mode", u1_intra_chrom_pred_mode);
1807
4.75k
            p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
1808
4.75k
                u1_intra_chrom_pred_mode;
1809
1810
            /*--------------------------------------------------------------------*/
1811
            /* Read the Coded block pattern                                       */
1812
            /*--------------------------------------------------------------------*/
1813
4.75k
            u1_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
1814
4.75k
            ps_cur_mb_info->u1_cbp = u1_cbp;
1815
4.75k
            p_curr_ctxt->u1_cbp = u1_cbp;
1816
1817
            /*--------------------------------------------------------------------*/
1818
            /* Read mb_qp_delta                                                   */
1819
            /*--------------------------------------------------------------------*/
1820
4.75k
            ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1821
4.75k
            if(ret != OK) return ret;
1822
4.68k
            COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1823
4.68k
            if(i1_delta_qp != 0)
1824
933
            {
1825
933
                ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1826
933
                if(ret != OK) return ret;
1827
933
            }
1828
1829
4.68k
            {
1830
4.68k
                WORD16 i_scaleFactor;
1831
4.68k
                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.68k
                if(ps_dec->s_high_profile.u1_scaling_present)
1837
998
                {
1838
998
                    pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0];
1839
998
                }
1840
3.69k
                else
1841
3.69k
                {
1842
3.69k
                    i_scaleFactor = 16;
1843
3.69k
                    pi2_scale_matrix_ptr = &i_scaleFactor;
1844
3.69k
                }
1845
4.68k
                {
1846
4.68k
                    ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
1847
4.68k
                    UWORD8 uc_a, uc_b;
1848
4.68k
                    UWORD32 u4_ctx_inc;
1849
4.68k
                    INC_SYM_COUNT(&(ps_dec->s_cab_dec_env));
1850
1851
                    /* if MbAddrN not available then CondTermN = 1 */
1852
4.68k
                    uc_b = ((ps_top_ctxt->u1_yuv_dc_csbp) & 0x01);
1853
1854
                    /* if MbAddrN not available then CondTermN = 1 */
1855
4.68k
                    uc_a = ((ps_dec->pu1_left_yuv_dc_csbp[0]) & 0x01);
1856
1857
4.68k
                    u4_ctx_inc = (uc_a + (uc_b << 1));
1858
4.68k
                    {
1859
4.68k
                        WORD16 pi2_dc_coef[16] = {0};
1860
4.68k
                        tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
1861
4.68k
                            (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data;
1862
4.68k
                        WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data;
1863
1864
4.68k
                        p_bin_ctxt = (ps_dec->p_cbf_t[LUMA_DC_CTXCAT]) + u4_ctx_inc;
1865
1866
4.68k
                        u1_dc_block_flag = ih264d_read_coeff4x4_cabac(
1867
4.68k
                            ps_bitstrm, LUMA_DC_CTXCAT,
1868
4.68k
                            ps_dec->p_significant_coeff_flag_t[LUMA_DC_CTXCAT], ps_dec, p_bin_ctxt);
1869
1870
                        /* Store coded_block_flag */
1871
4.68k
                        p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1872
4.68k
                        p_curr_ctxt->u1_yuv_dc_csbp |= u1_dc_block_flag;
1873
4.68k
                        if(u1_dc_block_flag)
1874
3.05k
                        {
1875
3.05k
                            WORD32 pi4_tmp[16] = {0};
1876
3.05k
                            memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef));
1877
3.05k
                            ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef,
1878
3.05k
                                                             ps_dec->pu1_inv_scan);
1879
1880
3.05k
                            PROFILE_DISABLE_IQ_IT_RECON()
1881
3.05k
                            ps_dec->pf_ihadamard_scaling_4x4(
1882
3.05k
                                pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y,
1883
3.05k
                                (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp);
1884
3.05k
                            pi2_coeff_block += 16;
1885
3.05k
                            ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block;
1886
3.05k
                            SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0);
1887
3.05k
                        }
1888
4.68k
                    }
1889
4.68k
                }
1890
4.68k
            }
1891
4.68k
        }
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
38.6k
    else
1896
38.6k
    {
1897
38.6k
        u1_offset = 0;
1898
        /*--------------------------------------------------------------------*/
1899
        /* Read the Coded block pattern                                       */
1900
        /*--------------------------------------------------------------------*/
1901
38.6k
        u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
1902
38.6k
        COPYTHECONTEXT("coded_block_pattern", u1_cbp);
1903
1904
38.6k
        ps_cur_mb_info->u1_cbp = u1_cbp;
1905
38.6k
        p_curr_ctxt->u1_cbp = u1_cbp;
1906
38.6k
        p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1907
38.6k
        ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
1908
38.6k
        p_curr_ctxt->u1_mb_type = CAB_INFERRED;
1909
38.6k
        p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
1910
38.6k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
1911
38.6k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1912
1913
        /*--------------------------------------------------------------------*/
1914
        /* Read transform_size_8x8_flag if present                            */
1915
        /*--------------------------------------------------------------------*/
1916
38.6k
        if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (u1_cbp & 0xf))
1917
12.3k
        {
1918
12.3k
            ps_cur_mb_info->u1_tran_form8x8 =
1919
12.3k
                ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
1920
12.3k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
1921
12.3k
            p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
1922
12.3k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
1923
12.3k
        }
1924
26.2k
        else
1925
26.2k
        {
1926
26.2k
            p_curr_ctxt->u1_transform8x8_ctxt = 0;
1927
26.2k
        }
1928
1929
        /*--------------------------------------------------------------------*/
1930
        /* Read mb_qp_delta                                                   */
1931
        /*--------------------------------------------------------------------*/
1932
38.6k
        if(ps_cur_mb_info->u1_cbp)
1933
27.4k
        {
1934
27.4k
            ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1935
27.4k
            if(ret != OK) return ret;
1936
27.4k
            COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1937
27.4k
            if(i1_delta_qp != 0)
1938
4.59k
            {
1939
4.59k
                ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1940
4.59k
                if(ret != OK) return ret;
1941
4.59k
            }
1942
27.4k
        }
1943
11.1k
        else
1944
11.1k
            ps_dec->i1_prev_mb_qp_delta = 0;
1945
38.6k
    }
1946
1947
48.4k
    ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, u1_offset);
1948
48.4k
    if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
1949
46.7k
    return OK;
1950
48.4k
}
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.17k
    {
1982
7.17k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1983
6.30k
        {
1984
6.30k
            dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1985
6.30k
            dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
1986
6.30k
            UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
1987
1988
6.30k
            ps_pps->ps_sps = ps_dec->ps_cur_sps;
1989
6.30k
            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.30k
            i_temp = ih264d_read_mmco_commands(ps_dec);
1993
6.30k
            ps_pps->ps_sps = ps_sps_tmp;
1994
6.30k
            ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
1995
1996
6.30k
            if(i_temp < 0)
1997
143
            {
1998
143
                return ERROR_DBP_MANAGER_T;
1999
143
            }
2000
6.16k
            ps_dec->u4_bitoffset = i_temp;
2001
6.16k
        }
2002
870
        else
2003
870
            ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
2004
7.17k
    }
2005
2006
7.52k
    {
2007
        /* G050 */
2008
        /* Read slice_qp_delta */
2009
7.52k
        WORD64 i8_temp =
2010
7.52k
            (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2011
7.52k
        if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T;
2012
6.83k
        ps_slice->u1_slice_qp = (UWORD8) i8_temp;
2013
6.83k
        COPYTHECONTEXT("SH: slice_qp_delta", ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
2014
6.83k
    }
2015
6.83k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
2016
3.80k
    {
2017
3.80k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2018
3.80k
        COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
2019
2020
3.80k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
2021
226
        {
2022
226
            return ERROR_INV_SLICE_HDR_T;
2023
226
        }
2024
3.57k
        ps_slice->u1_disable_dblk_filter_idc = u4_temp;
2025
3.57k
        if(u4_temp != 1)
2026
3.26k
        {
2027
3.26k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
2028
3.26k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2029
233
            {
2030
233
                return ERROR_INV_SLICE_HDR_T;
2031
233
            }
2032
3.03k
            ps_slice->i1_slice_alpha_c0_offset = i_temp;
2033
3.03k
            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
2034
3.03k
                           ps_slice->i1_slice_alpha_c0_offset >> 1);
2035
2036
3.03k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
2037
3.03k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2038
207
            {
2039
207
                return ERROR_INV_SLICE_HDR_T;
2040
207
            }
2041
2.82k
            ps_slice->i1_slice_beta_offset = i_temp;
2042
2.82k
            COPYTHECONTEXT("SH: slice_beta_offset_div2", ps_slice->i1_slice_beta_offset >> 1);
2043
2.82k
        }
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.57k
    }
2050
3.03k
    else
2051
3.03k
    {
2052
3.03k
        ps_slice->u1_disable_dblk_filter_idc = 0;
2053
3.03k
        ps_slice->i1_slice_alpha_c0_offset = 0;
2054
3.03k
        ps_slice->i1_slice_beta_offset = 0;
2055
3.03k
    }
2056
2057
    /* Initialization to check if number of motion vector per 2 Mbs */
2058
    /* are exceeding the range or not */
2059
6.17k
    ps_dec->u2_mv_2mb[0] = 0;
2060
6.17k
    ps_dec->u2_mv_2mb[1] = 0;
2061
2062
    /*set slice header cone to 2 ,to indicate  correct header*/
2063
6.17k
    ps_dec->u1_slice_header_done = 2;
2064
6.17k
    if(ps_pps->u1_entropy_coding_mode)
2065
3.87k
    {
2066
3.87k
        SWITCHOFFTRACE;
2067
3.87k
        SWITCHONTRACECABAC;
2068
3.87k
        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.87k
        else
2073
3.87k
            ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
2074
2075
3.87k
        ret = isvcd_parse_islice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
2076
3.87k
        if(ret != OK) return ret;
2077
839
        SWITCHONTRACE;
2078
839
        SWITCHOFFTRACECABAC;
2079
839
    }
2080
2.29k
    else
2081
2.29k
    {
2082
2.29k
        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.29k
        else
2087
2.29k
            ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
2088
2.29k
        ret = isvcd_parse_islice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
2089
2.29k
        if(ret != OK) return ret;
2090
2.29k
    }
2091
2092
1.12k
    return OK;
2093
6.17k
}