Coverage Report

Created: 2025-08-26 06:38

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