Coverage Report

Created: 2026-06-10 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/ih264d_parse_pslice.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2015 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
 **************************************************************************
23
 * \file ih264d_parse_pslice.c
24
 *
25
 * \brief
26
 *    Contains routines that decode a I slice type
27
 *
28
 * Detailed_description
29
 *
30
 * \date
31
 *    07/07/2003
32
 *
33
 * \author  NS
34
 **************************************************************************
35
 */
36
37
#include <string.h>
38
#include "ih264_defs.h"
39
#include "ih264d_bitstrm.h"
40
#include "ih264d_defs.h"
41
#include "ih264d_debug.h"
42
#include "ih264d_tables.h"
43
#include "ih264d_structs.h"
44
#include "ih264d_defs.h"
45
#include "ih264d_parse_cavlc.h"
46
#include "ih264d_mb_utils.h"
47
#include "ih264d_parse_slice.h"
48
#include "ih264d_mvpred.h"
49
#include "ih264d_parse_islice.h"
50
#include "ih264d_process_intra_mb.h"
51
#include "ih264d_inter_pred.h"
52
#include "ih264d_process_pslice.h"
53
#include "ih264d_deblocking.h"
54
#include "ih264d_cabac.h"
55
#include "ih264d_parse_mb_header.h"
56
#include "ih264d_error_handler.h"
57
#include "ih264d_defs.h"
58
#include "ih264d_format_conv.h"
59
#include "ih264d_quant_scaling.h"
60
#include "ih264d_thread_parse_decode.h"
61
#include "ih264d_thread_compute_bs.h"
62
#include "ih264d_process_bslice.h"
63
#include "ithread.h"
64
#include "ih264d_utils.h"
65
#include "ih264d_format_conv.h"
66
67
void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
68
void ih264d_deblock_mb_level(dec_struct_t *ps_dec,
69
                             dec_mb_info_t *ps_cur_mb_info,
70
                             UWORD32 nmb_index);
71
72
/*!
73
 **************************************************************************
74
 * \if Function name : ih264d_parse_pmb_cavlc \endif
75
 *
76
 * \brief
77
 *    This function parses CAVLC syntax of a P MB.
78
 *
79
 * \return
80
 *    0 on Success and Error code otherwise
81
 **************************************************************************
82
 */
83
WORD32 ih264d_parse_pmb_cavlc(dec_struct_t * ps_dec,
84
                              dec_mb_info_t * ps_cur_mb_info,
85
                              UWORD32 u4_mb_num,
86
                              UWORD32 u4_num_mbsNby2)
87
109k
{
88
109k
    UWORD32 u1_num_mb_part;
89
109k
    UWORD32 uc_sub_mb;
90
109k
    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
91
109k
    UWORD32 * const pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
92
109k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
93
94
109k
    parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
95
109k
                    + u4_num_mbsNby2;
96
109k
    WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
97
109k
    const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
98
109k
    const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
99
109k
    UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
100
101
109k
    UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
102
109k
    UWORD32 u4_sum_mb_mode_pack = 0;
103
109k
    WORD32 ret;
104
105
109k
    UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
106
109k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
107
109k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
108
109
109k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
110
111
109k
    ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
112
109k
    uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
113
114
    /* Reading the subMB type */
115
109k
    if(uc_sub_mb)
116
9.15k
    {
117
9.15k
        WORD32 i;
118
9.15k
        UWORD8 u1_colz = (PRED_8x8 << 6);
119
120
44.2k
        for(i = 0; i < 4; i++)
121
35.6k
        {
122
35.6k
            UWORD32 ui_sub_mb_mode;
123
124
            //Inlined ih264d_uev
125
35.6k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
126
35.6k
            UWORD32 u4_word, u4_ldz;
127
128
            /***************************************************************/
129
            /* Find leading zeros in next 32 bits                          */
130
            /***************************************************************/
131
35.6k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
132
35.6k
            u4_ldz = CLZ(u4_word);
133
            /* Flush the ps_bitstrm */
134
35.6k
            u4_bitstream_offset += (u4_ldz + 1);
135
            /* Read the suffix from the ps_bitstrm */
136
35.6k
            u4_word = 0;
137
35.6k
            if(u4_ldz)
138
27.0k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
139
35.6k
                        u4_ldz);
140
35.6k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
141
35.6k
            ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1);
142
            //Inlined ih264d_uev
143
144
35.6k
            if(ui_sub_mb_mode > 3)
145
538
            {
146
538
                return ERROR_SUB_MB_TYPE;
147
538
            }
148
35.1k
            else
149
35.1k
            {
150
35.1k
                u4_sum_mb_mode_pack = (u4_sum_mb_mode_pack << 8) | ui_sub_mb_mode;
151
                /* Storing collocated information */
152
35.1k
                *pu1_col_info++ = u1_colz | (UWORD8)(ui_sub_mb_mode << 4);
153
154
35.1k
                COPYTHECONTEXT("sub_mb_type", ui_sub_mb_mode);
155
35.1k
            }
156
157
            /* check if Motion compensation is done below 8x8 */
158
35.1k
            if(ui_sub_mb_mode != P_L0_8x8)
159
26.4k
            {
160
26.4k
                u1_no_submb_part_size_lt8x8_flag = 0;
161
26.4k
            }
162
35.1k
        }
163
164
        //
165
8.61k
        u1_num_mb_part = 4;
166
8.61k
    }
167
99.8k
    else
168
99.8k
    {
169
99.8k
        *pu1_col_info++ = (u1_mb_type << 6);
170
99.8k
        if(u1_mb_type)
171
24.0k
            *pu1_col_info++ = (u1_mb_type << 6);
172
99.8k
        u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
173
174
99.8k
    }
175
176
    /* Decoding reference index 0: For simple profile the following   */
177
    /* conditions are always true (mb_field_decoding_flag == 0);      */
178
    /* (MbPartPredMode != PredL1)                                     */
179
180
108k
    {
181
182
108k
        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
183
108k
        UWORD8 uc_num_ref_idx_l0_active_minus1 =
184
108k
                        (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
185
108k
                                        << (u1_mbaff & uc_field)) - 1;
186
187
108k
        if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
188
63.5k
        {
189
63.5k
            if(1 == uc_num_ref_idx_l0_active_minus1)
190
16.8k
                ih264d_parse_pmb_ref_index_cavlc_range1(
191
16.8k
                                u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
192
16.8k
                                uc_num_ref_idx_l0_active_minus1);
193
46.6k
            else
194
46.6k
            {
195
46.6k
                ret = ih264d_parse_pmb_ref_index_cavlc(
196
46.6k
                                u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
197
46.6k
                                uc_num_ref_idx_l0_active_minus1);
198
46.6k
                if(ret != OK)
199
503
                    return ret;
200
46.6k
            }
201
63.5k
        }
202
44.9k
        else
203
44.9k
        {
204
            /* When there exists only a single frame to predict from */
205
44.9k
            UWORD32 uc_i;
206
109k
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
207
                /* Storing Reference Idx Information */
208
64.2k
                pi1_ref_idx[uc_i] = 0;
209
44.9k
        }
210
108k
    }
211
212
107k
    {
213
107k
        UWORD8 u1_p_idx;
214
107k
        UWORD32 uc_i;
215
107k
        parse_part_params_t * ps_part = ps_dec->ps_part;
216
107k
        UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
217
107k
        UWORD32 u4_sub_mb_num;
218
107k
        const UWORD8 * pu1_top_left_sub_mb_indx;
219
107k
        mv_pred_t * ps_mv, *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
220
        /* Loading the table pointers */
221
107k
        const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
222
107k
        const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
223
107k
        const UWORD8 * pu1_sub_mb_indx_mod =
224
107k
                        (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
225
107k
                                        + (uc_sub_mb * 6);
226
107k
        const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
227
107k
        const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
228
107k
        const UWORD8 * pu1_num_sub_mb_part =
229
107k
                        (const UWORD8 *)gau1_ih264d_num_submb_part;
230
231
107k
        UWORD16 u2_sub_mb_num = 0x028A;
232
233
        /*********************************************************/
234
        /* default initialisations for condition (uc_sub_mb == 0) */
235
        /* i.e. all are subpartitions of 8x8                     */
236
        /*********************************************************/
237
107k
        u1_sub_mb_mode = 0;
238
107k
        u1_num_subpart = 1;
239
107k
        u1_mb_part_width = pu1_mb_partw[u1_mb_type];
240
107k
        u1_mb_part_height = pu1_mb_parth[u1_mb_type];
241
107k
        pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
242
107k
        u4_sub_mb_num = 0;
243
244
        /* Loop on number of partitions */
245
265k
        for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
246
157k
        {
247
157k
            UWORD8 uc_j;
248
157k
            if(uc_sub_mb)
249
34.4k
            {
250
34.4k
                u1_sub_mb_mode = u4_sum_mb_mode_pack >> 24;
251
34.4k
                u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
252
34.4k
                u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
253
34.4k
                u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
254
34.4k
                pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
255
34.4k
                u4_sub_mb_num = u2_sub_mb_num >> 12;
256
34.4k
                u4_sum_mb_mode_pack <<= 8;
257
34.4k
                u2_sub_mb_num <<= 4;
258
34.4k
            }
259
260
            /* Loop on Number of sub-partitions */
261
364k
            for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
262
207k
            {
263
207k
                WORD16 i2_mvx, i2_mvy;
264
207k
                u4_sub_mb_num += *pu1_top_left_sub_mb_indx;
265
207k
                ps_mv = ps_mv_start + u4_sub_mb_num;
266
267
                /* Reading the differential Mv from the bitstream */
268
                //i2_mvx = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
269
                //inlining ih264d_sev
270
207k
                {
271
207k
                    UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
272
207k
                    UWORD32 u4_word, u4_ldz, u4_abs_val;
273
274
                    /***************************************************************/
275
                    /* Find leading zeros in next 32 bits                          */
276
                    /***************************************************************/
277
207k
                    NEXTBITS_32(u4_word, u4_bitstream_offset,
278
207k
                                pu4_bitstrm_buf);
279
207k
                    u4_ldz = CLZ(u4_word);
280
281
                    /* Flush the ps_bitstrm */
282
207k
                    u4_bitstream_offset += (u4_ldz + 1);
283
284
                    /* Read the suffix from the ps_bitstrm */
285
207k
                    u4_word = 0;
286
207k
                    if(u4_ldz)
287
121k
                        GETBITS(u4_word, u4_bitstream_offset,
288
207k
                                pu4_bitstrm_buf, u4_ldz);
289
290
207k
                    *pu4_bitstrm_ofst = u4_bitstream_offset;
291
207k
                    u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
292
293
207k
                    if(u4_word & 0x1)
294
33.6k
                        i2_mvx = (-(WORD32)u4_abs_val);
295
173k
                    else
296
173k
                        i2_mvx = (u4_abs_val);
297
207k
                }
298
                //inlinined ih264d_sev
299
207k
                COPYTHECONTEXT("MVD", i2_mvx);
300
207k
                i2_mvy = ih264d_sev(pu4_bitstrm_ofst,
301
207k
                                     pu4_bitstrm_buf);
302
207k
                COPYTHECONTEXT("MVD", i2_mvy);
303
304
                /* Storing Info for partitions */
305
207k
                ps_part->u1_is_direct = PART_NOT_DIRECT;
306
207k
                ps_part->u1_sub_mb_num = u4_sub_mb_num;
307
207k
                ps_part->u1_partheight = u1_mb_part_height;
308
207k
                ps_part->u1_partwidth = u1_mb_part_width;
309
310
                /* Storing Mv residuals */
311
207k
                ps_mv->i2_mv[0] = i2_mvx;
312
207k
                ps_mv->i2_mv[1] = i2_mvy;
313
314
                /* Increment partition Index */
315
207k
                u1_p_idx++;
316
207k
                ps_part++;
317
207k
            }
318
157k
        }
319
107k
        ps_parse_mb_data->u1_num_part = u1_p_idx;
320
107k
        ps_dec->ps_part = ps_part;
321
107k
    }
322
323
107k
    {
324
107k
        UWORD32 u4_cbp;
325
326
        /* Read the Coded block pattern */
327
107k
        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
328
107k
        UWORD32 u4_word, u4_ldz;
329
330
        /***************************************************************/
331
        /* Find leading zeros in next 32 bits                          */
332
        /***************************************************************/
333
107k
        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
334
107k
        u4_ldz = CLZ(u4_word);
335
        /* Flush the ps_bitstrm */
336
107k
        u4_bitstream_offset += (u4_ldz + 1);
337
        /* Read the suffix from the ps_bitstrm */
338
107k
        u4_word = 0;
339
107k
        if(u4_ldz)
340
36.7k
            GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
341
107k
        *pu4_bitstrm_ofst = u4_bitstream_offset;
342
107k
        u4_cbp = ((1 << u4_ldz) + u4_word - 1);
343
344
107k
        if(u4_cbp > 47)
345
1.40k
            return ERROR_CBP;
346
347
106k
        u4_cbp = *((UWORD8*)gau1_ih264d_cbp_inter + u4_cbp);
348
106k
        COPYTHECONTEXT("coded_block_pattern", u4_cbp);
349
106k
        ps_cur_mb_info->u1_cbp = u4_cbp;
350
351
        /* Read the transform8x8 u4_flag if present */
352
106k
        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & 0xf)
353
4.45k
                        && u1_no_submb_part_size_lt8x8_flag)
354
3.81k
        {
355
3.81k
            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
356
3.81k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
357
3.81k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
358
3.81k
        }
359
360
        /* Read mb_qp_delta */
361
106k
        if(u4_cbp)
362
35.2k
        {
363
35.2k
            WORD32 i_temp;
364
365
35.2k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
366
35.2k
            UWORD32 u4_word, u4_ldz, u4_abs_val;
367
368
            /***************************************************************/
369
            /* Find leading zeros in next 32 bits                          */
370
            /***************************************************************/
371
35.2k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
372
35.2k
            u4_ldz = CLZ(u4_word);
373
374
            /* Flush the ps_bitstrm */
375
35.2k
            u4_bitstream_offset += (u4_ldz + 1);
376
377
            /* Read the suffix from the ps_bitstrm */
378
35.2k
            u4_word = 0;
379
35.2k
            if(u4_ldz)
380
14.8k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
381
35.2k
                        u4_ldz);
382
383
35.2k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
384
35.2k
            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
385
386
35.2k
            if(u4_word & 0x1)
387
5.12k
                i_temp = (-(WORD32)u4_abs_val);
388
30.1k
            else
389
30.1k
                i_temp = (u4_abs_val);
390
391
35.2k
            if((i_temp < -26) || (i_temp > 25))
392
413
                return ERROR_INV_RANGE_QP_T;
393
            //inlinined ih264d_sev
394
395
34.8k
            COPYTHECONTEXT("mb_qp_delta", i_temp);
396
34.8k
            if(i_temp)
397
14.4k
            {
398
14.4k
                ret = ih264d_update_qp(ps_dec, (WORD8)i_temp);
399
14.4k
                if(ret != OK)
400
0
                    return ret;
401
14.4k
            }
402
403
34.8k
            ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0);
404
34.8k
            if(ret != OK)
405
2.68k
                return ret;
406
32.1k
            if(EXCEED_OFFSET(ps_bitstrm))
407
794
                return ERROR_EOB_TERMINATE_T;
408
32.1k
        }
409
71.2k
        else
410
71.2k
        {
411
71.2k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
412
71.2k
        }
413
414
415
416
106k
    }
417
418
102k
    return OK;
419
106k
}
420
421
/*!
422
 **************************************************************************
423
 * \if Function name : ih264d_parse_pmb_cabac \endif
424
 *
425
 * \brief
426
 *    This function parses CABAC syntax of a P MB.
427
 *
428
 * \return
429
 *    0 on Success and Error code otherwise
430
 **************************************************************************
431
 */
432
WORD32 ih264d_parse_pmb_cabac(dec_struct_t * ps_dec,
433
                              dec_mb_info_t * ps_cur_mb_info,
434
                              UWORD32 u4_mb_num,
435
                              UWORD32 u4_num_mbsNby2)
436
280k
{
437
280k
    UWORD32 u1_num_mb_part;
438
280k
    UWORD32 uc_sub_mb;
439
280k
    parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
440
280k
                    + u4_num_mbsNby2;
441
280k
    WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
442
280k
    const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
443
280k
    const UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
444
280k
    UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
445
280k
    UWORD32 u1_mb_mc_mode = u1_mb_type;
446
280k
    ctxt_inc_mb_info_t * p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
447
280k
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
448
280k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
449
280k
    UWORD32 u4_sub_mb_pack = 0;
450
280k
    WORD32 ret;
451
452
280k
    UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
453
280k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
454
280k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
455
456
280k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
457
458
280k
    p_curr_ctxt->u1_mb_type = CAB_P;
459
280k
    ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
460
280k
    uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
461
462
    /* Reading the subMB type */
463
280k
    if(uc_sub_mb)
464
41.3k
    {
465
466
41.3k
        UWORD8 u1_colz = (PRED_8x8 << 6);
467
41.3k
        u1_mb_mc_mode = 0;
468
469
41.3k
        {
470
41.3k
            UWORD8 u1_sub_mb_mode;
471
41.3k
            u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
472
41.3k
                            0, ps_cab_env, ps_bitstrm,
473
41.3k
                            ps_dec->p_sub_mb_type_t);
474
41.3k
            if(u1_sub_mb_mode > 3)
475
0
                return ERROR_SUB_MB_TYPE;
476
477
41.3k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
478
            /* Storing collocated information */
479
41.3k
            *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
480
41.3k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
481
            /* check if Motion compensation is done below 8x8 */
482
41.3k
            if(u1_sub_mb_mode != P_L0_8x8)
483
19.8k
            {
484
19.8k
                u1_no_submb_part_size_lt8x8_flag = 0;
485
19.8k
            }
486
41.3k
        }
487
0
        {
488
41.3k
            UWORD8 u1_sub_mb_mode;
489
41.3k
            u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
490
41.3k
                            0, ps_cab_env, ps_bitstrm,
491
41.3k
                            ps_dec->p_sub_mb_type_t);
492
41.3k
            if(u1_sub_mb_mode > 3)
493
0
                return ERROR_SUB_MB_TYPE;
494
495
41.3k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
496
            /* Storing collocated information */
497
41.3k
            *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
498
41.3k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
499
            /* check if Motion compensation is done below 8x8 */
500
41.3k
            if(u1_sub_mb_mode != P_L0_8x8)
501
20.7k
            {
502
20.7k
                u1_no_submb_part_size_lt8x8_flag = 0;
503
20.7k
            }
504
41.3k
        }
505
0
        {
506
41.3k
            UWORD8 u1_sub_mb_mode;
507
41.3k
            u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
508
41.3k
                            0, ps_cab_env, ps_bitstrm,
509
41.3k
                            ps_dec->p_sub_mb_type_t);
510
41.3k
            if(u1_sub_mb_mode > 3)
511
0
                return ERROR_SUB_MB_TYPE;
512
513
41.3k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
514
            /* Storing collocated information */
515
41.3k
            *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
516
41.3k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
517
            /* check if Motion compensation is done below 8x8 */
518
41.3k
            if(u1_sub_mb_mode != P_L0_8x8)
519
21.1k
            {
520
21.1k
                u1_no_submb_part_size_lt8x8_flag = 0;
521
21.1k
            }
522
41.3k
        }
523
0
        {
524
41.3k
            UWORD8 u1_sub_mb_mode;
525
41.3k
            u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
526
41.3k
                            0, ps_cab_env, ps_bitstrm,
527
41.3k
                            ps_dec->p_sub_mb_type_t);
528
41.3k
            if(u1_sub_mb_mode > 3)
529
0
                return ERROR_SUB_MB_TYPE;
530
531
41.3k
            u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
532
            /* Storing collocated information */
533
41.3k
            *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
534
41.3k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
535
            /* check if Motion compensation is done below 8x8 */
536
41.3k
            if(u1_sub_mb_mode != P_L0_8x8)
537
20.1k
            {
538
20.1k
                u1_no_submb_part_size_lt8x8_flag = 0;
539
20.1k
            }
540
41.3k
        }
541
0
        u1_num_mb_part = 4;
542
41.3k
    }
543
239k
    else
544
239k
    {
545
239k
        u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
546
        /* Storing collocated Mb and SubMb mode information */
547
239k
        *pu1_col_info++ = (u1_mb_type << 6);
548
239k
        if(u1_mb_type)
549
139k
            *pu1_col_info++ = (u1_mb_type << 6);
550
239k
    }
551
    /* Decoding reference index 0: For simple profile the following   */
552
    /* conditions are always true (mb_field_decoding_flag == 0);      */
553
    /* (MbPartPredMode != PredL1)                                     */
554
280k
    {
555
280k
        WORD8 * pi1_top_ref_idx_ctx_inc_arr = p_curr_ctxt->i1_ref_idx;
556
280k
        WORD8 * pi1_left_ref_idx_ctxt_inc = ps_dec->pi1_left_ref_idx_ctxt_inc;
557
280k
        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
558
280k
        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
559
280k
        UWORD8 uc_num_ref_idx_l0_active_minus1 =
560
280k
                        (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
561
280k
                                        << (u1_mbaff & uc_field)) - 1;
562
563
280k
        if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
564
219k
        {
565
            /* force the routine to decode ref idx for each partition */
566
219k
            *((UWORD32 *)pi1_ref_idx) = 0x01010101;
567
219k
            ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0,
568
219k
                                             uc_num_ref_idx_l0_active_minus1,
569
219k
                                             u1_mb_mc_mode, pi1_ref_idx,
570
219k
                                             pi1_left_ref_idx_ctxt_inc,
571
219k
                                             pi1_top_ref_idx_ctx_inc_arr, ps_cab_env,
572
219k
                                             ps_bitstrm, ps_dec->p_ref_idx_t);
573
219k
            if(ret != OK)
574
192
                return ret;
575
219k
        }
576
61.5k
        else
577
61.5k
        {
578
            /* When there exists only a single frame to predict from */
579
61.5k
            pi1_left_ref_idx_ctxt_inc[0] = 0;
580
61.5k
            pi1_left_ref_idx_ctxt_inc[1] = 0;
581
61.5k
            pi1_top_ref_idx_ctx_inc_arr[0] = 0;
582
61.5k
            pi1_top_ref_idx_ctx_inc_arr[1] = 0;
583
61.5k
            *((UWORD32 *)pi1_ref_idx) = 0;
584
61.5k
        }
585
280k
    }
586
587
280k
    {
588
280k
        UWORD8 u1_p_idx;
589
280k
        UWORD32 uc_i;
590
280k
        parse_part_params_t * ps_part = ps_dec->ps_part;
591
280k
        UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
592
280k
        UWORD32 u4_sub_mb_num;
593
280k
        const UWORD8 * pu1_top_left_sub_mb_indx;
594
280k
        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
595
280k
        UWORD16 u2_sub_mb_num_pack = 0x028A;
596
597
        /* Loading the table pointers */
598
280k
        const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
599
280k
        const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
600
280k
        const UWORD8 * pu1_sub_mb_indx_mod =
601
280k
                        (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
602
280k
                                        + (uc_sub_mb * 6);
603
280k
        const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
604
280k
        const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
605
280k
        const UWORD8 * pu1_num_sub_mb_part =
606
280k
                        (const UWORD8 *)gau1_ih264d_num_submb_part;
607
608
        /*********************************************************/
609
        /* default initialisations for condition (uc_sub_mb == 0) */
610
        /* i.e. all are subpartitions of 8x8                     */
611
        /*********************************************************/
612
280k
        u1_sub_mb_mode = 0;
613
280k
        u1_num_subpart = 1;
614
280k
        u1_mb_part_width = pu1_mb_partw[u1_mb_type];
615
280k
        u1_mb_part_height = pu1_mb_parth[u1_mb_type];
616
280k
        pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
617
280k
        u4_sub_mb_num = 0;
618
619
        /* Loop on number of partitions */
620
823k
        for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
621
543k
        {
622
543k
            UWORD8 uc_j;
623
543k
            if(uc_sub_mb)
624
164k
            {
625
164k
                u1_sub_mb_mode = u4_sub_mb_pack >> 24;
626
164k
                u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
627
164k
                u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
628
164k
                u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
629
164k
                pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
630
164k
                u4_sub_mb_num = u2_sub_mb_num_pack >> 12;
631
164k
                u4_sub_mb_pack <<= 8;
632
164k
                u2_sub_mb_num_pack <<= 4;
633
164k
            }
634
            /* Loop on Number of sub-partitions */
635
1.19M
            for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
636
650k
            {
637
650k
                mv_pred_t * ps_mv;
638
639
650k
                u4_sub_mb_num += *pu1_top_left_sub_mb_indx;
640
650k
                ps_mv = ps_mv_start + u4_sub_mb_num;
641
642
                /* Storing Info for partitions */
643
650k
                ps_part->u1_is_direct = PART_NOT_DIRECT;
644
650k
                ps_part->u1_sub_mb_num = u4_sub_mb_num;
645
650k
                ps_part->u1_partheight = u1_mb_part_height;
646
650k
                ps_part->u1_partwidth = u1_mb_part_width;
647
648
                /* Increment partition Index */
649
650k
                u1_p_idx++;
650
650k
                ps_part++;
651
652
650k
                ih264d_get_mvd_cabac(u4_sub_mb_num, 0, u1_mb_part_width,
653
650k
                                     u1_mb_part_height, 1, ps_dec, ps_mv);
654
650k
            }
655
543k
        }
656
280k
        ps_parse_mb_data->u1_num_part = u1_p_idx;
657
280k
        ps_dec->ps_part = ps_part;
658
280k
    }
659
280k
    {
660
280k
        UWORD8 u1_cbp;
661
662
        /* Read the Coded block pattern */
663
280k
        u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec);
664
280k
        COPYTHECONTEXT("coded_block_pattern", u1_cbp);
665
280k
        ps_cur_mb_info->u1_cbp = u1_cbp;
666
280k
        p_curr_ctxt->u1_cbp = u1_cbp;
667
280k
        p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
668
280k
        p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
669
280k
        ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
670
671
280k
        if(u1_cbp > 47)
672
0
            return ERROR_CBP;
673
674
280k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
675
280k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
676
677
        /* Read the transform8x8 u4_flag if present */
678
280k
        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & 0xf)
679
60.1k
                        && u1_no_submb_part_size_lt8x8_flag)
680
52.6k
        {
681
52.6k
            ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac(
682
52.6k
                            ps_dec, ps_cur_mb_info);
683
52.6k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
684
52.6k
            p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
685
52.6k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
686
687
52.6k
        }
688
227k
        else
689
227k
        {
690
227k
            p_curr_ctxt->u1_transform8x8_ctxt = 0;
691
227k
        }
692
693
        /* Read mb_qp_delta */
694
280k
        if(u1_cbp)
695
99.0k
        {
696
99.0k
            WORD8 c_temp;
697
99.0k
            ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp);
698
99.0k
            if(ret != OK)
699
73
                return ret;
700
98.9k
            COPYTHECONTEXT("mb_qp_delta", c_temp);
701
98.9k
            if(c_temp != 0)
702
22.1k
            {
703
22.1k
                ret = ih264d_update_qp(ps_dec, c_temp);
704
22.1k
                if(ret != OK)
705
0
                    return ret;
706
22.1k
            }
707
98.9k
        }
708
181k
        else
709
181k
            ps_dec->i1_prev_mb_qp_delta = 0;
710
711
712
713
280k
        ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0);
714
280k
        if(EXCEED_OFFSET(ps_dec->ps_bitstrm))
715
2.91k
            return ERROR_EOB_TERMINATE_T;
716
280k
    }
717
277k
    return OK;
718
280k
}
719
720
/*!
721
 **************************************************************************
722
 * \if Function name : parsePSliceData \endif
723
 *
724
 * \brief
725
 *    This function parses CAVLC syntax of N MB's of a P slice.
726
 *    1. After parsing syntax of N MB's, for those N MB's (less than N, incase
727
 *       of end of slice or end of row), MB is decoded. This process is carried
728
 *       for one complete MB row or till end of slice.
729
 *    2. Bottom one row of current MB is copied to IntraPredLine buffers.
730
 *       IntraPredLine buffers are used for Intra prediction of next row.
731
 *    3. Current MB row along with previous 4 rows of Luma (and 2 of Chroma) are
732
 *       deblocked.
733
 *    4. 4 rows (2 for Chroma) previous row and 12 rows (6 for Chroma) are
734
 *       DMA'ed to picture buffers.
735
 *
736
 * \return
737
 *    0 on Success and Error code otherwise
738
 **************************************************************************
739
 */
740
741
/*!
742
 **************************************************************************
743
 * \if Function name : ih264d_update_nnz_for_skipmb \endif
744
 *
745
 * \brief
746
 *
747
 * \return
748
 *    None
749
 *
750
 **************************************************************************
751
 */
752
void ih264d_update_nnz_for_skipmb(dec_struct_t * ps_dec,
753
                                  dec_mb_info_t * ps_cur_mb_info,
754
                                  UWORD8 u1_entrpy)
755
33.0M
{
756
33.0M
    UWORD32 *pu4_buf;
757
33.0M
    UWORD8 *pu1_buf;
758
33.0M
    UNUSED(u1_entrpy);
759
33.0M
    pu1_buf = ps_dec->pu1_left_nnz_y;
760
33.0M
    pu4_buf = (UWORD32 *)pu1_buf;
761
33.0M
    *pu4_buf = 0;
762
33.0M
    pu1_buf = ps_dec->pu1_left_nnz_uv;
763
33.0M
    pu4_buf = (UWORD32 *)pu1_buf;
764
33.0M
    *pu4_buf = 0;
765
33.0M
    pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
766
33.0M
    pu4_buf = (UWORD32 *)pu1_buf;
767
33.0M
    *pu4_buf = 0;
768
33.0M
    pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
769
33.0M
    pu4_buf = (UWORD32 *)pu1_buf;
770
33.0M
    *pu4_buf = 0;
771
33.0M
    ps_cur_mb_info->ps_curmb->u2_luma_csbp = 0;
772
33.0M
    ps_cur_mb_info->u2_luma_csbp = 0;
773
33.0M
    ps_cur_mb_info->u2_chroma_csbp = 0;
774
33.0M
}
775
776
777
778
/*****************************************************************************/
779
/*                                                                           */
780
/*  Function Name : ih264d_parse_inter_slice_data_cabac                             */
781
/*                                                                           */
782
/*  Description   : This function parses cabac syntax of a inter slice on    */
783
/*                  N MB basis.                                              */
784
/*                                                                           */
785
/*  Inputs        : ps_dec                                                   */
786
/*                  sliceparams                                              */
787
/*                  firstMbInSlice                                           */
788
/*                                                                           */
789
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
790
/*                     decoded till the end of slice.                        */
791
/*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
792
/*                                                                           */
793
/*  Returns       : 0                                                        */
794
/*                                                                           */
795
/*  Issues        : <List any issues or problems with this function>         */
796
/*                                                                           */
797
/*  Revision History:                                                        */
798
/*                                                                           */
799
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
800
/*         13 07 2002   Jay             Draft                                */
801
/*                                                                           */
802
/*****************************************************************************/
803
WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec,
804
                                           dec_slice_params_t * ps_slice,
805
                                           UWORD16 u2_first_mb_in_slice)
806
10.4k
{
807
10.4k
    UWORD32 uc_more_data_flag;
808
10.4k
    WORD32 i2_cur_mb_addr;
809
10.4k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
810
10.4k
    UWORD32 u1_mbaff;
811
10.4k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
812
10.4k
    const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
813
10.4k
    UWORD32 u1_slice_end = 0;
814
10.4k
    UWORD32 u1_tfr_n_mb = 0;
815
10.4k
    UWORD32 u1_decode_nmb = 0;
816
817
818
10.4k
    deblk_mb_t *ps_cur_deblk_mb;
819
10.4k
    dec_mb_info_t *ps_cur_mb_info;
820
821
10.4k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
822
10.4k
    UWORD32 u1_inter_mb_skip_type;
823
10.4k
    UWORD32 u1_inter_mb_type;
824
10.4k
    UWORD32 u1_deblk_mb_type;
825
10.4k
    UWORD32 u1_mb_threshold;
826
10.4k
    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
827
10.4k
    WORD32 ret = OK;
828
829
    /******************************************************/
830
    /* Initialisations specific to B or P slice           */
831
    /******************************************************/
832
10.4k
    if(ps_slice->u1_slice_type == P_SLICE)
833
4.15k
    {
834
4.15k
        u1_inter_mb_skip_type = CAB_P_SKIP;
835
4.15k
        u1_inter_mb_type = P_MB;
836
4.15k
        u1_deblk_mb_type = D_INTER_MB;
837
4.15k
        u1_mb_threshold = 5;
838
4.15k
    }
839
6.26k
    else // B_SLICE
840
6.26k
    {
841
6.26k
        u1_inter_mb_skip_type = CAB_B_SKIP;
842
6.26k
        u1_inter_mb_type = B_MB;
843
6.26k
        u1_deblk_mb_type = D_B_SLICE;
844
6.26k
        u1_mb_threshold = 23;
845
6.26k
    }
846
847
    /******************************************************/
848
    /* Slice Level Initialisations                        */
849
    /******************************************************/
850
10.4k
    i2_cur_mb_addr = u2_first_mb_in_slice;
851
10.4k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
852
10.4k
    ih264d_update_qp(ps_dec, 0);
853
10.4k
    u1_mb_idx = ps_dec->u4_mb_idx;
854
10.4k
    u1_num_mbs = u1_mb_idx;
855
10.4k
    u1_num_mbsNby2 = 0;
856
10.4k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
857
10.4k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
858
10.4k
    uc_more_data_flag = 1;
859
860
    /* Initialisations specific to cabac */
861
10.4k
    if(ps_bitstrm->u4_ofst & 0x07)
862
8.44k
    {
863
8.44k
        ps_bitstrm->u4_ofst += 8;
864
8.44k
        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
865
8.44k
    }
866
867
10.4k
    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
868
10.4k
    if(ret != OK)
869
81
        return ret;
870
871
10.3k
    ps_dec->i1_prev_mb_qp_delta = 0;
872
873
856k
    while(!u1_slice_end)
874
852k
    {
875
852k
        UWORD8 u1_mb_type;
876
852k
        UWORD32 u4_mb_skip;
877
878
852k
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
879
880
852k
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
881
5.25k
        {
882
5.25k
            break;
883
5.25k
        }
884
885
847k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
886
847k
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
887
888
847k
        ps_cur_mb_info->u1_Mux = 0;
889
847k
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
890
847k
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
891
892
847k
        ps_cur_mb_info->u1_end_of_slice = 0;
893
894
        /* Storing Default partition info */
895
847k
        ps_parse_mb_data->u1_num_part = 1;
896
847k
        ps_parse_mb_data->u4_isI_mb = 0;
897
898
        /***************************************************************/
899
        /* Get the required information for decoding of MB             */
900
        /* mb_x, mb_y , neighbour availablity,                         */
901
        /***************************************************************/
902
847k
        u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1);
903
904
        /*********************************************************************/
905
        /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
906
        /*********************************************************************/
907
847k
        ps_cur_mb_info->u1_tran_form8x8 = 0;
908
847k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
909
910
        /***************************************************************/
911
        /* Set the deblocking parameters for this MB                   */
912
        /***************************************************************/
913
847k
        if(ps_dec->u4_app_disable_deblk_frm == 0)
914
847k
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
915
847k
                                             ps_dec->u1_mb_ngbr_availablity,
916
847k
                                             ps_dec->u1_cur_mb_fld_dec_flag);
917
918
847k
        if(u4_mb_skip)
919
547k
        {
920
921
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
922
547k
            memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t));
923
547k
            ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type;
924
925
547k
            MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
926
927
547k
            *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
928
547k
            *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
929
930
547k
            ps_dec->i1_prev_mb_qp_delta = 0;
931
547k
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
932
547k
            ps_cur_mb_info->u1_cbp = 0;
933
934
547k
            {
935
                /* Storing Skip partition info */
936
547k
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
937
547k
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
938
547k
                ps_part_info->u1_sub_mb_num = 0;
939
547k
                ps_dec->ps_part++;
940
547k
            }
941
942
            /* Update Nnzs */
943
547k
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC);
944
945
547k
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
946
547k
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
947
547k
            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
948
949
547k
        }
950
299k
        else
951
299k
        {
952
953
            /* Macroblock Layer Begins */
954
            /* Decode the u1_mb_type */
955
299k
            u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec);
956
299k
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
957
299k
            if(u1_mb_type > (25 + u1_mb_threshold))
958
0
                return ERROR_MB_TYPE;
959
960
            /* Parse Macroblock Data */
961
299k
            if(u1_mb_type < u1_mb_threshold)
962
268k
            {
963
268k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
964
268k
                *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6;
965
966
268k
                ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs,
967
268k
                                          u1_num_mbsNby2);
968
268k
                if(ret != OK)
969
1.20k
                    return ret;
970
266k
                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
971
266k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
972
266k
            }
973
31.4k
            else
974
31.4k
            {
975
                /* Storing Intra partition info */
976
31.4k
                ps_parse_mb_data->u1_num_part = 0;
977
31.4k
                ps_parse_mb_data->u4_isI_mb = 1;
978
979
31.4k
                if((25 + u1_mb_threshold) == u1_mb_type)
980
438
                {
981
                    /* I_PCM_MB */
982
438
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
983
438
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
984
438
                    if(ret != OK)
985
87
                        return ret;
986
351
                    ps_cur_deblk_mb->u1_mb_qp = 0;
987
351
                }
988
30.9k
                else
989
30.9k
                {
990
30.9k
                    if(u1_mb_type == u1_mb_threshold)
991
16.9k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
992
14.0k
                    else
993
14.0k
                        ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
994
995
30.9k
                    ret = ih264d_parse_imb_cabac(
996
30.9k
                                    ps_dec, ps_cur_mb_info,
997
30.9k
                                    (UWORD8)(u1_mb_type - u1_mb_threshold));
998
30.9k
                    if(ret != OK)
999
152
                        return ret;
1000
30.8k
                    ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1001
30.8k
                }
1002
31.1k
                ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1003
1004
31.1k
            }
1005
1006
299k
        }
1007
1008
845k
        if(ps_dec->u1_enable_mb_info)
1009
0
        {
1010
0
            ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1011
0
                                        ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1012
0
        }
1013
1014
845k
        if(u1_mbaff)
1015
147k
        {
1016
147k
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1017
147k
        }
1018
1019
1020
845k
        if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1021
74.0k
            uc_more_data_flag = 1;
1022
771k
        else
1023
771k
        {
1024
771k
            uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env,
1025
771k
                                                      ps_bitstrm);
1026
771k
            uc_more_data_flag = !uc_more_data_flag;
1027
771k
            COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag);
1028
771k
        }
1029
1030
845k
        if(u1_mbaff)
1031
147k
        {
1032
147k
            if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1033
0
            {
1034
0
                return ERROR_EOB_FLUSHBITS_T;
1035
0
            }
1036
147k
        }
1037
        /* Next macroblock information */
1038
845k
        i2_cur_mb_addr++;
1039
845k
        u1_num_mbs++;
1040
845k
        u1_num_mbsNby2++;
1041
845k
        ps_parse_mb_data++;
1042
1043
        /****************************************************************/
1044
        /* Check for End Of Row and other flags that determine when to  */
1045
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1046
        /* N-Mb                                                         */
1047
        /****************************************************************/
1048
845k
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1049
845k
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1050
845k
        u1_slice_end = !uc_more_data_flag;
1051
845k
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row
1052
810k
                        || u1_slice_end;
1053
845k
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1054
845k
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1055
        /*u1_dma_nby2mb   = u1_decode_nmb ||
1056
         (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/
1057
1058
//if(u1_dma_nby2mb)
1059
845k
        if(u1_decode_nmb)
1060
37.8k
        {
1061
1062
37.8k
            ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1063
37.8k
            u1_num_mbsNby2 = 0;
1064
1065
37.8k
            {
1066
37.8k
                ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1067
37.8k
                ps_dec->ps_part = ps_dec->ps_parse_part_params;
1068
37.8k
            }
1069
37.8k
        }
1070
1071
        /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
1072
         ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
1073
         ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
1074
         H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d, u1_num_mbs: %d", u1_decode_nmb, u1_num_mbs);*/
1075
845k
        if(u1_decode_nmb)
1076
37.8k
        {
1077
1078
37.8k
            if(ps_dec->u1_separate_parse)
1079
24.5k
            {
1080
24.5k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1081
24.5k
                                     u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1082
24.5k
                ps_dec->ps_nmb_info +=  u1_num_mbs;
1083
24.5k
            }
1084
13.3k
            else
1085
13.3k
            {
1086
13.3k
                ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1087
13.3k
                                            u1_num_mbs_next, u1_tfr_n_mb,
1088
13.3k
                                            u1_end_of_row);
1089
13.3k
            }
1090
37.8k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1091
37.8k
            if(u1_tfr_n_mb)
1092
37.8k
                u1_num_mbs = 0;
1093
37.8k
            u1_mb_idx = u1_num_mbs;
1094
37.8k
            ps_dec->u4_mb_idx = u1_num_mbs;
1095
1096
37.8k
        }
1097
845k
    }
1098
1099
1100
8.89k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1101
8.89k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
1102
1103
8.89k
                        - (u2_first_mb_in_slice << u1_mbaff);
1104
1105
8.89k
    return ret;
1106
10.3k
}
1107
1108
/*****************************************************************************/
1109
/*                                                                           */
1110
/*  Function Name : ih264d_parse_inter_slice_data_cavlc                             */
1111
/*                                                                           */
1112
/*  Description   : This function parses cavlc syntax of a inter slice on    */
1113
/*                  N MB basis.                                              */
1114
/*                                                                           */
1115
/*  Inputs        : ps_dec                                                   */
1116
/*                  sliceparams                                              */
1117
/*                  firstMbInSlice                                           */
1118
/*                                                                           */
1119
/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1120
/*                     decoded till the end of slice.                        */
1121
/*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
1122
/*                                                                           */
1123
/*  Returns       : 0                                                        */
1124
/*                                                                           */
1125
/*  Issues        : <List any issues or problems with this function>         */
1126
/*                                                                           */
1127
/*  Revision History:                                                        */
1128
/*                                                                           */
1129
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1130
/*         13 07 2002   Jay             Draft                                */
1131
/*                                                                           */
1132
/*****************************************************************************/
1133
1134
WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec,
1135
                                           dec_slice_params_t * ps_slice,
1136
                                           UWORD16 u2_first_mb_in_slice)
1137
55.9k
{
1138
55.9k
    UWORD32 uc_more_data_flag;
1139
55.9k
    WORD32 i2_cur_mb_addr;
1140
55.9k
    UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
1141
55.9k
    UWORD32 i2_mb_skip_run;
1142
55.9k
    UWORD32 u1_read_mb_type;
1143
1144
55.9k
    UWORD32 u1_mbaff;
1145
55.9k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
1146
55.9k
    const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1147
55.9k
    UWORD32 u1_slice_end = 0;
1148
55.9k
    UWORD32 u1_tfr_n_mb = 0;
1149
55.9k
    UWORD32 u1_decode_nmb = 0;
1150
1151
55.9k
    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1152
55.9k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1153
55.9k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1154
55.9k
    deblk_mb_t *ps_cur_deblk_mb;
1155
55.9k
    dec_mb_info_t *ps_cur_mb_info;
1156
55.9k
    parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1157
55.9k
    UWORD32 u1_inter_mb_type;
1158
55.9k
    UWORD32 u1_deblk_mb_type;
1159
55.9k
    UWORD32 u1_mb_threshold;
1160
55.9k
    WORD32 ret = OK;
1161
1162
    /******************************************************/
1163
    /* Initialisations specific to B or P slice           */
1164
    /******************************************************/
1165
1166
55.9k
    if(ps_slice->u1_slice_type == P_SLICE)
1167
32.6k
    {
1168
32.6k
        u1_inter_mb_type = P_MB;
1169
32.6k
        u1_deblk_mb_type = D_INTER_MB;
1170
32.6k
        u1_mb_threshold = 5;
1171
32.6k
    }
1172
23.2k
    else // B_SLICE
1173
23.2k
    {
1174
23.2k
        u1_inter_mb_type = B_MB;
1175
23.2k
        u1_deblk_mb_type = D_B_SLICE;
1176
23.2k
        u1_mb_threshold = 23;
1177
23.2k
    }
1178
    /******************************************************/
1179
    /* Slice Level Initialisations                        */
1180
    /******************************************************/
1181
55.9k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1182
55.9k
    ih264d_update_qp(ps_dec, 0);
1183
55.9k
    u1_mb_idx = ps_dec->u4_mb_idx;
1184
55.9k
    u1_num_mbs = u1_mb_idx;
1185
1186
55.9k
    u1_num_mbsNby2 = 0;
1187
55.9k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1188
55.9k
    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1189
55.9k
    i2_mb_skip_run = 0;
1190
55.9k
    uc_more_data_flag = 1;
1191
55.9k
    u1_read_mb_type = 0;
1192
1193
5.02M
    while(!u1_slice_end)
1194
5.01M
    {
1195
5.01M
        UWORD8 u1_mb_type;
1196
1197
5.01M
        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1198
1199
5.01M
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1200
44.2k
        {
1201
44.2k
            break;
1202
44.2k
        }
1203
1204
1205
4.97M
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1206
4.97M
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1207
1208
4.97M
        ps_cur_mb_info->u1_Mux = 0;
1209
4.97M
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1210
4.97M
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1211
1212
4.97M
        ps_cur_mb_info->u1_end_of_slice = 0;
1213
1214
        /* Storing Default partition info */
1215
4.97M
        ps_parse_mb_data->u1_num_part = 1;
1216
4.97M
        ps_parse_mb_data->u4_isI_mb = 0;
1217
1218
4.97M
        if((!i2_mb_skip_run) && (!u1_read_mb_type))
1219
259k
        {
1220
1221
            //Inlined ih264d_uev
1222
259k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1223
259k
            UWORD32 u4_word, u4_ldz;
1224
1225
            /***************************************************************/
1226
            /* Find leading zeros in next 32 bits                          */
1227
            /***************************************************************/
1228
259k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1229
1230
259k
            u4_ldz = CLZ(u4_word);
1231
1232
            /* Flush the ps_bitstrm */
1233
259k
            u4_bitstream_offset += (u4_ldz + 1);
1234
            /* Read the suffix from the ps_bitstrm */
1235
259k
            u4_word = 0;
1236
259k
            if(u4_ldz)
1237
105k
            {
1238
105k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
1239
105k
                        u4_ldz);
1240
105k
            }
1241
259k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
1242
259k
            i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1);
1243
            //Inlined ih264d_uev
1244
259k
            COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run);
1245
259k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1246
259k
            u1_read_mb_type = uc_more_data_flag;
1247
259k
        }
1248
1249
        /***************************************************************/
1250
        /* Get the required information for decoding of MB                  */
1251
        /* mb_x, mb_y , neighbour availablity,                              */
1252
        /***************************************************************/
1253
4.97M
        ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1254
1255
        /***************************************************************/
1256
        /* Set the deblocking parameters for this MB                   */
1257
        /***************************************************************/
1258
4.97M
        if(ps_dec->u4_app_disable_deblk_frm == 0)
1259
4.97M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1260
4.97M
                                             ps_dec->u1_mb_ngbr_availablity,
1261
4.97M
                                             ps_dec->u1_cur_mb_fld_dec_flag);
1262
1263
4.97M
        if(i2_mb_skip_run)
1264
4.75M
        {
1265
            /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1266
4.75M
            ps_dec->i1_prev_mb_qp_delta = 0;
1267
4.75M
            ps_dec->u1_sub_mb_num = 0;
1268
4.75M
            ps_cur_mb_info->u1_mb_type = MB_SKIP;
1269
4.75M
            ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
1270
4.75M
            ps_cur_mb_info->u1_cbp = 0;
1271
1272
4.75M
            {
1273
                /* Storing Skip partition info */
1274
4.75M
                parse_part_params_t *ps_part_info = ps_dec->ps_part;
1275
4.75M
                ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1276
4.75M
                ps_part_info->u1_sub_mb_num = 0;
1277
4.75M
                ps_dec->ps_part++;
1278
4.75M
            }
1279
1280
            /* Update Nnzs */
1281
4.75M
            ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
1282
1283
4.75M
            ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1284
4.75M
            ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1285
1286
4.75M
            i2_mb_skip_run--;
1287
4.75M
        }
1288
218k
        else
1289
218k
        {
1290
218k
            u1_read_mb_type = 0;
1291
            /**************************************************************/
1292
            /* Macroblock Layer Begins, Decode the u1_mb_type                */
1293
            /**************************************************************/
1294
218k
            {
1295
218k
                UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1296
218k
                UWORD32 u4_word, u4_ldz, u4_temp;
1297
1298
1299
                //Inlined ih264d_uev
1300
                /***************************************************************/
1301
                /* Find leading zeros in next 32 bits                          */
1302
                /***************************************************************/
1303
218k
                NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1304
218k
                u4_ldz = CLZ(u4_word);
1305
                /* Flush the ps_bitstrm */
1306
218k
                u4_bitstream_offset += (u4_ldz + 1);
1307
                /* Read the suffix from the ps_bitstrm */
1308
218k
                u4_word = 0;
1309
218k
                if(u4_ldz)
1310
133k
                    GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
1311
218k
                            u4_ldz);
1312
218k
                *pu4_bitstrm_ofst = u4_bitstream_offset;
1313
218k
                u4_temp = ((1 << u4_ldz) + u4_word - 1);
1314
                //Inlined ih264d_uev
1315
218k
                if(u4_temp > (UWORD32)(25 + u1_mb_threshold))
1316
104
                    return ERROR_MB_TYPE;
1317
218k
                u1_mb_type = u4_temp;
1318
218k
                COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1319
218k
            }
1320
0
            ps_cur_mb_info->u1_mb_type = u1_mb_type;
1321
1322
            /**************************************************************/
1323
            /* Parse Macroblock data                                      */
1324
            /**************************************************************/
1325
218k
            if(u1_mb_type < u1_mb_threshold)
1326
215k
            {
1327
215k
                ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1328
1329
215k
                ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs,
1330
215k
                                          u1_num_mbsNby2);
1331
215k
                if(ret != OK)
1332
685
                    return ret;
1333
214k
                ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1334
214k
            }
1335
3.46k
            else
1336
3.46k
            {
1337
                /* Storing Intra partition info */
1338
3.46k
                ps_parse_mb_data->u1_num_part = 0;
1339
3.46k
                ps_parse_mb_data->u4_isI_mb = 1;
1340
1341
3.46k
                if((25 + u1_mb_threshold) == u1_mb_type)
1342
1.81k
                {
1343
                    /* I_PCM_MB */
1344
1.81k
                    ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1345
1.81k
                    ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1346
1.81k
                    if(ret != OK)
1347
0
                         return ret;
1348
1.81k
                    ps_dec->u1_qp = 0;
1349
1.81k
                }
1350
1.64k
                else
1351
1.64k
                {
1352
1.64k
                    ret = ih264d_parse_imb_cavlc(
1353
1.64k
                                    ps_dec, ps_cur_mb_info, u1_num_mbs,
1354
1.64k
                                    (UWORD8)(u1_mb_type - u1_mb_threshold));
1355
1.64k
                    if(ret != OK)
1356
78
                        return ret;
1357
1.64k
                }
1358
1359
3.38k
                ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1360
3.38k
            }
1361
217k
            uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1362
217k
        }
1363
4.97M
        ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1364
1365
4.97M
        if(ps_dec->u1_enable_mb_info)
1366
0
        {
1367
0
            ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1368
0
                                        ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1369
0
        }
1370
1371
4.97M
        if(u1_mbaff)
1372
9.95k
        {
1373
9.95k
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1374
9.95k
            if(!uc_more_data_flag && !i2_mb_skip_run && (0 == (i2_cur_mb_addr & 1)))
1375
20
            {
1376
20
                return ERROR_EOB_FLUSHBITS_T;
1377
20
            }
1378
9.95k
        }
1379
        /**************************************************************/
1380
        /* Get next Macroblock address                                */
1381
        /**************************************************************/
1382
4.97M
        i2_cur_mb_addr++;
1383
1384
4.97M
        u1_num_mbs++;
1385
4.97M
        u1_num_mbsNby2++;
1386
4.97M
        ps_parse_mb_data++;
1387
1388
        /****************************************************************/
1389
        /* Check for End Of Row and other flags that determine when to  */
1390
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1391
        /* N-Mb                                                         */
1392
        /****************************************************************/
1393
4.97M
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1394
4.97M
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1395
4.97M
        u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run));
1396
4.97M
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row
1397
4.82M
                        || u1_slice_end;
1398
4.97M
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1399
4.97M
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1400
1401
        /*u1_dma_nby2mb   = u1_decode_nmb ||
1402
         (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/
1403
1404
//if(u1_dma_nby2mb)
1405
4.97M
        if(u1_decode_nmb)
1406
145k
        {
1407
145k
            ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1408
145k
            u1_num_mbsNby2 = 0;
1409
1410
145k
            {
1411
145k
                ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1412
145k
                ps_dec->ps_part = ps_dec->ps_parse_part_params;
1413
145k
            }
1414
145k
        }
1415
1416
        /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
1417
         ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
1418
         ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
1419
         H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d", u1_decode_nmb);*/
1420
4.97M
        if(u1_decode_nmb)
1421
145k
        {
1422
1423
1424
1425
145k
            if(ps_dec->u1_separate_parse)
1426
116k
            {
1427
116k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1428
116k
                                     u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1429
116k
                ps_dec->ps_nmb_info +=  u1_num_mbs;
1430
116k
            }
1431
29.8k
            else
1432
29.8k
            {
1433
29.8k
                ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1434
29.8k
                                            u1_num_mbs_next, u1_tfr_n_mb,
1435
29.8k
                                            u1_end_of_row);
1436
29.8k
            }
1437
145k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1438
145k
            if(u1_tfr_n_mb)
1439
145k
                u1_num_mbs = 0;
1440
145k
            u1_mb_idx = u1_num_mbs;
1441
145k
            ps_dec->u4_mb_idx = u1_num_mbs;
1442
1443
145k
        }
1444
//ps_dec->ps_pred++;
1445
4.97M
    }
1446
1447
55.0k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1448
55.0k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
1449
55.0k
                        - (u2_first_mb_in_slice << u1_mbaff);
1450
1451
1452
55.0k
    return ret;
1453
55.9k
}
1454
1455
WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec,
1456
                                WORD32 num_mb_skip,
1457
                                UWORD8 u1_is_idr_slice,
1458
                                UWORD16 u2_frame_num,
1459
                                pocstruct_t *ps_cur_poc,
1460
                                WORD32 prev_slice_err)
1461
13.9k
{
1462
13.9k
    WORD32 i2_cur_mb_addr;
1463
13.9k
    UWORD32 u1_num_mbs, u1_num_mbsNby2;
1464
13.9k
    UWORD32 u1_mb_idx = ps_dec->u4_mb_idx;
1465
13.9k
    UWORD32 i2_mb_skip_run;
1466
1467
13.9k
    UWORD32 u1_num_mbs_next, u1_end_of_row;
1468
13.9k
    const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1469
13.9k
    UWORD32 u1_slice_end;
1470
13.9k
    UWORD32 u1_tfr_n_mb;
1471
13.9k
    UWORD32 u1_decode_nmb;
1472
13.9k
    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1473
13.9k
    dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
1474
13.9k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1475
13.9k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1476
13.9k
    deblk_mb_t *ps_cur_deblk_mb;
1477
13.9k
    dec_mb_info_t *ps_cur_mb_info;
1478
13.9k
    parse_pmbarams_t *ps_parse_mb_data;
1479
13.9k
    UWORD32 u1_inter_mb_type;
1480
13.9k
    UWORD32 u1_deblk_mb_type;
1481
13.9k
    UWORD16 u2_total_mbs_coded;
1482
13.9k
    UWORD32 u1_mbaff;
1483
13.9k
    parse_part_params_t *ps_part_info;
1484
13.9k
    WORD32 ret;
1485
13.9k
    UNUSED(u1_is_idr_slice);
1486
1487
13.9k
    if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
1488
0
    {
1489
0
        ih264d_err_pic_dispbuf_mgr(ps_dec);
1490
0
        return 0;
1491
0
    }
1492
1493
13.9k
    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (num_mb_skip & 1))
1494
0
    {
1495
0
        num_mb_skip++;
1496
0
    }
1497
13.9k
    ps_dec->ps_dpb_cmds->u1_long_term_reference_flag = 0;
1498
13.9k
    if(prev_slice_err == 1)
1499
5.58k
    {
1500
        /* first slice - missing/header corruption */
1501
5.58k
        ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
1502
5.58k
        {
1503
5.58k
            WORD32 i, j, poc = 0;
1504
1505
5.58k
            ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0;
1506
1507
5.58k
            ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
1508
5.58k
            ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
1509
5.58k
            ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
1510
1511
5.58k
            if(ps_dec->ps_cur_pic != NULL)
1512
5.43k
            {
1513
5.43k
                poc = ps_dec->ps_cur_pic->i4_poc;
1514
5.43k
                if (poc <= INT32_MAX - 2)
1515
5.43k
                    poc += 2;
1516
5.43k
            }
1517
1518
5.58k
            j = -1;
1519
6.87k
            for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
1520
6.87k
            {
1521
6.87k
                   if(ps_dec->ps_pps[i].u1_is_valid == TRUE)
1522
5.58k
                   {
1523
5.58k
                       if(ps_dec->ps_pps[i].ps_sps->u1_is_valid == TRUE)
1524
5.58k
                       {
1525
5.58k
                           j = i;
1526
5.58k
                           break;
1527
5.58k
                       }
1528
5.58k
                   }
1529
6.87k
            }
1530
1531
            //if valid SPS PPS is not found return error
1532
5.58k
            if(j == -1)
1533
0
            {
1534
0
                return ERROR_INV_SLICE_HDR_T;
1535
0
            }
1536
1537
            /* call ih264d_start_of_pic only if it was not called earlier*/
1538
5.58k
            if(ps_dec->u4_pic_buf_got == 0)
1539
5.58k
            {
1540
                //initialize slice params required by ih264d_start_of_pic to valid values
1541
5.58k
                ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
1542
5.58k
                ps_dec->ps_cur_slice->u1_nal_ref_idc = 1;
1543
5.58k
                ps_dec->ps_cur_slice->u1_nal_unit_type = 1;
1544
5.58k
                ret = ih264d_start_of_pic(ps_dec, poc, ps_cur_poc,
1545
5.58k
                        ps_dec->ps_cur_slice->u2_frame_num,
1546
5.58k
                        &ps_dec->ps_pps[j]);
1547
1548
5.58k
                if(ret != OK)
1549
845
                {
1550
845
                    return ret;
1551
845
                }
1552
5.58k
            }
1553
1554
4.73k
            ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0;
1555
1556
4.73k
            ps_dec->u4_output_present = 0;
1557
1558
4.73k
            {
1559
4.73k
                ih264d_get_next_display_field(ps_dec,
1560
4.73k
                                              ps_dec->ps_out_buffer,
1561
4.73k
                                              &(ps_dec->s_disp_op));
1562
                /* If error code is non-zero then there is no buffer available for display,
1563
                 hence avoid format conversion */
1564
1565
4.73k
                if(0 != ps_dec->s_disp_op.u4_error_code)
1566
1.29k
                {
1567
1.29k
                    ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
1568
1.29k
                }
1569
3.43k
                else
1570
3.43k
                    ps_dec->u4_output_present = 1;
1571
4.73k
            }
1572
1573
4.73k
            if(ps_dec->u1_separate_parse == 1)
1574
2.61k
            {
1575
2.61k
                if(ps_dec->u4_dec_thread_created == 0)
1576
70
                {
1577
70
                    ithread_create(ps_dec->pv_dec_thread_handle, NULL,
1578
70
                                   (void *)ih264d_decode_picture_thread,
1579
70
                                   (void *)ps_dec);
1580
1581
70
                    ps_dec->u4_dec_thread_created = 1;
1582
70
                }
1583
2.61k
                if(ps_dec->i4_threads_active)
1584
2.61k
                {
1585
2.61k
                    ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
1586
2.61k
                    RETURN_IF((ret != IV_SUCCESS), ret);
1587
1588
2.61k
                    ps_dec->ai4_process_start[0] = PROC_START;
1589
2.61k
                    ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[0]);
1590
2.61k
                    RETURN_IF((ret != IV_SUCCESS), ret);
1591
1592
2.61k
                    ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
1593
2.61k
                    RETURN_IF((ret != IV_SUCCESS), ret);
1594
2.61k
                }
1595
1596
2.61k
                if((ps_dec->u4_num_cores == 3) &&
1597
1.34k
                                ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
1598
1.34k
                                && (ps_dec->u4_bs_deblk_thread_created == 0))
1599
26
                {
1600
26
                    ps_dec->u4_start_recon_deblk = 0;
1601
26
                    ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
1602
26
                                   (void *)ih264d_recon_deblk_thread,
1603
26
                                   (void *)ps_dec);
1604
26
                    ps_dec->u4_bs_deblk_thread_created = 1;
1605
26
                }
1606
2.61k
                if(ps_dec->i4_threads_active)
1607
2.61k
                {
1608
2.61k
                    if (ps_dec->u4_bs_deblk_thread_created)
1609
1.34k
                    {
1610
1.34k
                        ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
1611
1.34k
                        RETURN_IF((ret != IV_SUCCESS), ret);
1612
1613
1.34k
                        ps_dec->ai4_process_start[1] = PROC_START;
1614
1.34k
                        ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[1]);
1615
1.34k
                        RETURN_IF((ret != IV_SUCCESS), ret);
1616
1617
1.34k
                        ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
1618
1.34k
                        RETURN_IF((ret != IV_SUCCESS), ret);
1619
1.34k
                    }
1620
2.61k
                }
1621
2.61k
            }
1622
4.73k
        }
1623
4.73k
    }
1624
8.39k
    else
1625
8.39k
    {
1626
        // Middle / last slice
1627
1628
8.39k
        dec_slice_struct_t *ps_parse_cur_slice;
1629
8.39k
        ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
1630
1631
8.39k
        if(ps_dec->u1_slice_header_done
1632
6.75k
            && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice)
1633
6.75k
        {
1634
            // Slice data corrupted
1635
            // in the case of mbaff, conceal from the even mb.
1636
6.75k
            if((ps_dec->ps_cur_slice->u1_mbaff_frame_flag) && (ps_dec->u4_num_mbs_cur_nmb & 1))
1637
677
            {
1638
677
                ps_dec->u4_num_mbs_cur_nmb = ps_dec->u4_num_mbs_cur_nmb - 1;
1639
677
                ps_dec->u4_cur_mb_addr--;
1640
677
            }
1641
1642
6.75k
            u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb;
1643
6.75k
            if(u1_num_mbs)
1644
2.35k
            {
1645
2.35k
                ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1;
1646
2.35k
            }
1647
4.40k
            else
1648
4.40k
            {
1649
4.40k
                if(ps_dec->u1_separate_parse)
1650
2.65k
                {
1651
2.65k
                    ps_cur_mb_info = ps_dec->ps_nmb_info;
1652
2.65k
                }
1653
1.74k
                else
1654
1.74k
                {
1655
1.74k
                    ps_cur_mb_info = ps_dec->ps_nmb_info
1656
1.74k
                            + ps_dec->u4_num_mbs_prev_nmb - 1;
1657
1.74k
                }
1658
4.40k
            }
1659
1660
6.75k
            ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
1661
6.75k
            ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
1662
1663
6.75k
            ps_dec->u1_mb_ngbr_availablity =
1664
6.75k
                    ps_cur_mb_info->u1_mb_ngbr_availablity;
1665
1666
6.75k
            if(u1_num_mbs)
1667
2.35k
            {
1668
                // Going back 1 mb
1669
2.35k
                ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data;
1670
2.35k
                ps_dec->u4_cur_mb_addr--;
1671
2.35k
                ps_dec->i4_submb_ofst -= SUB_BLK_SIZE;
1672
1673
                // Parse/decode N-MB left unparsed
1674
2.35k
                if (ps_dec->u1_pr_sl_type == P_SLICE
1675
1.57k
                        || ps_dec->u1_pr_sl_type == B_SLICE)
1676
1.39k
                {
1677
1.39k
                    ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx,    u1_num_mbs);
1678
1.39k
                    ps_dec->ps_part = ps_dec->ps_parse_part_params;
1679
1.39k
                }
1680
1681
2.35k
                u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1682
2.35k
                u1_end_of_row = (!u1_num_mbs_next)
1683
0
                        && (!(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (u1_num_mbs & 0x01)));
1684
2.35k
                u1_slice_end = 1;
1685
2.35k
                u1_tfr_n_mb = 1;
1686
2.35k
                ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1687
1688
2.35k
                if(ps_dec->u1_separate_parse)
1689
1.38k
                {
1690
1.38k
                    ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1691
1.38k
                            u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1692
1.38k
                    ps_dec->ps_nmb_info += u1_num_mbs;
1693
1.38k
                }
1694
974
                else
1695
974
                {
1696
974
                    ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1697
974
                            u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1698
974
                }
1699
2.35k
                ps_dec->u4_total_mbs_coded += u1_num_mbs;
1700
2.35k
                ps_dec->u4_mb_idx = 0;
1701
2.35k
                ps_dec->u4_num_mbs_cur_nmb = 0;
1702
2.35k
            }
1703
1704
6.75k
            if(ps_dec->u4_total_mbs_coded
1705
6.75k
                    >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1706
0
            {
1707
0
                ps_dec->u1_pic_decode_done = 1;
1708
0
                return 0;
1709
0
            }
1710
1711
            /* Inserting new slice only if the current slice has atleast 1 MB*/
1712
6.75k
            if(ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice <
1713
6.75k
                    (UWORD32)(ps_dec->u4_total_mbs_coded >> ps_slice->u1_mbaff_frame_flag))
1714
5.56k
            {
1715
5.56k
                ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1716
5.56k
                ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1717
5.56k
                ps_dec->u2_cur_slice_num++;
1718
5.56k
                ps_dec->ps_parse_cur_slice++;
1719
5.56k
            }
1720
1721
6.75k
        }
1722
1.63k
        else
1723
1.63k
        {
1724
            // Slice missing / header corrupted
1725
1.63k
            ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf
1726
1.63k
                                            + ps_dec->u2_cur_slice_num;
1727
1.63k
        }
1728
8.39k
    }
1729
1730
    /******************************************************/
1731
    /* Initializations to new slice                       */
1732
    /******************************************************/
1733
13.1k
    {
1734
13.1k
        WORD32 num_entries;
1735
13.1k
        WORD32 size;
1736
13.1k
        UWORD8 *pu1_buf;
1737
1738
13.1k
        num_entries = MAX_FRAMES;
1739
13.1k
        if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
1740
3.38k
            (0 == ps_dec->i4_display_delay))
1741
0
        {
1742
0
            num_entries = 1;
1743
0
        }
1744
13.1k
        num_entries = ((2 * num_entries) + 1);
1745
13.1k
        num_entries *= 2;
1746
1747
13.1k
        size = num_entries * sizeof(void *);
1748
13.1k
        size += PAD_MAP_IDX_POC * sizeof(void *);
1749
1750
13.1k
        pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
1751
13.1k
        pu1_buf += size * ps_dec->u2_cur_slice_num;
1752
13.1k
        ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf;
1753
13.1k
    }
1754
13.1k
    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1755
13.1k
    ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u4_total_mbs_coded >> u1_mbaff;
1756
13.1k
    ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0;
1757
13.1k
    ps_dec->ps_cur_slice->i1_slice_beta_offset = 0;
1758
1759
13.1k
    if(ps_dec->ps_cur_slice->u1_field_pic_flag)
1760
3.94k
        ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num;
1761
1762
13.1k
    ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u4_total_mbs_coded >> u1_mbaff;
1763
13.1k
    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =    ps_dec->ps_cur_slice->u2_log2Y_crwd;
1764
1765
1766
13.1k
    if(ps_dec->u1_separate_parse)
1767
7.27k
    {
1768
7.27k
        ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1769
7.27k
    }
1770
5.85k
    else
1771
5.85k
    {
1772
5.85k
        ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1773
5.85k
    }
1774
1775
    /******************************************************/
1776
    /* Initializations specific to P slice                */
1777
    /******************************************************/
1778
13.1k
    u1_inter_mb_type = P_MB;
1779
13.1k
    u1_deblk_mb_type = D_INTER_MB;
1780
1781
13.1k
    ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
1782
13.1k
    ps_dec->ps_parse_cur_slice->slice_type = P_SLICE;
1783
13.1k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
1784
13.1k
    ps_dec->ps_part = ps_dec->ps_parse_part_params;
1785
13.1k
    ps_dec->u2_mbx =
1786
13.1k
                    (MOD(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
1787
13.1k
    ps_dec->u2_mby =
1788
13.1k
                    (DIV(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
1789
13.1k
    ps_dec->u2_mby <<= u1_mbaff;
1790
1791
    /******************************************************/
1792
    /* Parsing / decoding the slice                       */
1793
    /******************************************************/
1794
13.1k
    ps_dec->u1_slice_header_done = 2;
1795
13.1k
    ps_dec->u1_qp = ps_slice->u1_slice_qp;
1796
13.1k
    ih264d_update_qp(ps_dec, 0);
1797
13.1k
    u1_mb_idx = ps_dec->u4_mb_idx;
1798
13.1k
    ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1799
13.1k
    u1_num_mbs = u1_mb_idx;
1800
1801
13.1k
    u1_slice_end = 0;
1802
13.1k
    u1_tfr_n_mb = 0;
1803
13.1k
    u1_decode_nmb = 0;
1804
13.1k
    u1_num_mbsNby2 = 0;
1805
13.1k
    i2_cur_mb_addr = ps_dec->u4_total_mbs_coded;
1806
13.1k
    i2_mb_skip_run = num_mb_skip;
1807
1808
15.4M
    while(!u1_slice_end)
1809
15.4M
    {
1810
15.4M
        UWORD8 u1_mb_type;
1811
1812
15.4M
        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr)
1813
1.97k
            break;
1814
1815
15.4M
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1816
15.4M
        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1817
1818
15.4M
        ps_cur_mb_info->u1_Mux = 0;
1819
15.4M
        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1820
15.4M
        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1821
1822
15.4M
        ps_cur_mb_info->u1_end_of_slice = 0;
1823
1824
        /* Storing Default partition info */
1825
15.4M
        ps_parse_mb_data->u1_num_part = 1;
1826
15.4M
        ps_parse_mb_data->u4_isI_mb = 0;
1827
1828
        /**************************************************************/
1829
        /* Get the required information for decoding of MB            */
1830
        /**************************************************************/
1831
        /* mb_x, mb_y, neighbor availablity, */
1832
15.4M
        if (u1_mbaff)
1833
2.03M
            ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1834
13.3M
        else
1835
13.3M
            ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1836
1837
        /* Set the deblocking parameters for this MB */
1838
15.4M
        if(ps_dec->u4_app_disable_deblk_frm == 0)
1839
15.4M
        {
1840
15.4M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1841
15.4M
                                             ps_dec->u1_mb_ngbr_availablity,
1842
15.4M
                                             ps_dec->u1_cur_mb_fld_dec_flag);
1843
15.4M
        }
1844
1845
        /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1846
15.4M
        ps_dec->i1_prev_mb_qp_delta = 0;
1847
15.4M
        ps_dec->u1_sub_mb_num = 0;
1848
15.4M
        ps_cur_mb_info->u1_mb_type = MB_SKIP;
1849
15.4M
        ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
1850
15.4M
        ps_cur_mb_info->u1_cbp = 0;
1851
1852
        /* Storing Skip partition info */
1853
15.4M
        ps_part_info = ps_dec->ps_part;
1854
15.4M
        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1855
15.4M
        ps_part_info->u1_sub_mb_num = 0;
1856
15.4M
        ps_dec->ps_part++;
1857
1858
        /* Update Nnzs */
1859
15.4M
        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
1860
1861
15.4M
        ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1862
15.4M
        ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1863
1864
15.4M
        i2_mb_skip_run--;
1865
1866
15.4M
        ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1867
1868
15.4M
        if (u1_mbaff)
1869
2.03M
        {
1870
2.03M
            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1871
2.03M
        }
1872
1873
        /**************************************************************/
1874
        /* Get next Macroblock address                                */
1875
        /**************************************************************/
1876
15.4M
        i2_cur_mb_addr++;
1877
1878
15.4M
        u1_num_mbs++;
1879
15.4M
        u1_num_mbsNby2++;
1880
15.4M
        ps_parse_mb_data++;
1881
1882
        /****************************************************************/
1883
        /* Check for End Of Row and other flags that determine when to  */
1884
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1885
        /* N-Mb                                                         */
1886
        /****************************************************************/
1887
15.4M
        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1888
15.4M
        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1889
15.4M
        u1_slice_end = !i2_mb_skip_run;
1890
15.4M
        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row
1891
15.2M
                        || u1_slice_end;
1892
15.4M
        u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1893
15.4M
        ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1894
1895
15.4M
        if(u1_decode_nmb)
1896
211k
        {
1897
211k
            ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1898
211k
            u1_num_mbsNby2 = 0;
1899
1900
211k
            ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1901
211k
            ps_dec->ps_part = ps_dec->ps_parse_part_params;
1902
1903
211k
            if(ps_dec->u1_separate_parse)
1904
141k
            {
1905
141k
                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1906
141k
                                     u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1907
141k
                ps_dec->ps_nmb_info +=  u1_num_mbs;
1908
141k
            }
1909
69.8k
            else
1910
69.8k
            {
1911
69.8k
                ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
1912
69.8k
                                            u1_tfr_n_mb, u1_end_of_row);
1913
69.8k
            }
1914
211k
            ps_dec->u4_total_mbs_coded += u1_num_mbs;
1915
211k
            if(u1_tfr_n_mb)
1916
211k
                u1_num_mbs = 0;
1917
211k
            u1_mb_idx = u1_num_mbs;
1918
211k
            ps_dec->u4_mb_idx = u1_num_mbs;
1919
211k
        }
1920
15.4M
    }
1921
1922
13.1k
    ps_dec->u4_num_mbs_cur_nmb = 0;
1923
13.1k
    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
1924
13.1k
                        - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice;
1925
1926
13.1k
    H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice);
1927
1928
1929
    /* incremented here only if first slice is inserted */
1930
13.1k
    if(ps_dec->u4_first_slice_in_pic != 0)
1931
0
    {
1932
0
        ps_dec->ps_parse_cur_slice++;
1933
0
        ps_dec->u2_cur_slice_num++;
1934
0
    }
1935
1936
13.1k
    ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1937
13.1k
    ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1938
1939
13.1k
    if(ps_dec->u4_total_mbs_coded
1940
13.1k
            >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1941
7.67k
    {
1942
7.67k
        ps_dec->u1_pic_decode_done = 1;
1943
7.67k
    }
1944
1945
13.1k
    return 0;
1946
1947
13.9k
}
1948
1949
/*!
1950
 **************************************************************************
1951
 * \if Function name : ih264d_decode_pslice \endif
1952
 *
1953
 * \brief
1954
 *    Decodes a P Slice
1955
 *
1956
 *
1957
 * \return
1958
 *    0 on Success and Error code otherwise
1959
 **************************************************************************
1960
 */
1961
WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice)
1962
4.55k
{
1963
4.55k
    dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
1964
4.55k
    dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
1965
4.55k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1966
4.55k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1967
4.55k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1968
4.55k
    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag;
1969
4.55k
    UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
1970
1971
4.55k
    UWORD64 u8_ref_idx_l0;
1972
4.55k
    UWORD32 u4_temp;
1973
4.55k
    WORD32 i_temp;
1974
4.55k
    WORD32 ret;
1975
1976
    /*--------------------------------------------------------------------*/
1977
    /* Read remaining contents of the slice header                        */
1978
    /*--------------------------------------------------------------------*/
1979
4.55k
    {
1980
4.55k
        WORD8 *pi1_buf;
1981
4.55k
        WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
1982
4.55k
        WORD32 *pi4_mv = (WORD32*)pi2_mv;
1983
4.55k
        WORD16 *pi16_refFrame;
1984
1985
4.55k
        pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
1986
4.55k
        pi16_refFrame = (WORD16*)pi1_buf;
1987
4.55k
        *pi4_mv = 0;
1988
4.55k
        *(pi4_mv + 1) = 0;
1989
4.55k
        *pi16_refFrame = OUT_OF_RANGE_REF;
1990
4.55k
        ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
1991
4.55k
        ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
1992
4.55k
    }
1993
1994
4.55k
    ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
1995
4.55k
                    ps_bitstrm);
1996
1997
4.55k
    COPYTHECONTEXT("SH: num_ref_idx_override_flag",
1998
4.55k
                    ps_cur_slice->u1_num_ref_idx_active_override_flag);
1999
2000
4.55k
    u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
2001
4.55k
    if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
2002
2.24k
    {
2003
2.24k
        u8_ref_idx_l0 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64)1;
2004
2.24k
    }
2005
2006
4.55k
    {
2007
4.55k
        UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS << u1_field_pic_flag;
2008
4.55k
        if(u8_ref_idx_l0 > u1_max_ref_idx)
2009
19
        {
2010
19
            return ERROR_NUM_REF;
2011
19
        }
2012
4.53k
        ps_cur_slice->u1_num_ref_idx_lx_active[0] = u8_ref_idx_l0;
2013
4.53k
        COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
2014
4.53k
                        ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
2015
2016
4.53k
    }
2017
2018
0
    {
2019
4.53k
        UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
2020
4.53k
        COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0);
2021
2022
4.53k
        ih264d_init_ref_idx_lx_p(ps_dec);
2023
        /* Store the value for future slices in the same picture */
2024
4.53k
        ps_dec->u1_num_ref_idx_lx_active_prev =
2025
4.53k
                        ps_cur_slice->u1_num_ref_idx_lx_active[0];
2026
2027
        /* Modified temporarily */
2028
4.53k
        if(uc_refIdxReFlagL0)
2029
1.53k
        {
2030
1.53k
            WORD8 ret;
2031
1.53k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
2032
1.53k
            ret = ih264d_ref_idx_reordering(ps_dec, 0);
2033
1.53k
            if(ret == -1)
2034
0
                return ERROR_REFIDX_ORDER_T;
2035
1.53k
            ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
2036
1.53k
        }
2037
3.00k
        else
2038
3.00k
            ps_dec->ps_ref_pic_buf_lx[0] =
2039
3.00k
                            ps_dec->ps_dpb_mgr->ps_init_dpb[0];
2040
4.53k
    }
2041
    /* Create refIdx to POC mapping */
2042
4.53k
    {
2043
4.53k
        void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
2044
4.53k
        WORD8 idx;
2045
4.53k
        struct pic_buffer_t *ps_pic;
2046
2047
4.53k
        pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
2048
4.53k
        pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1
2049
4.53k
        pui_map_ref_idx_to_poc_lx0++;
2050
19.5k
        for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
2051
15.0k
        {
2052
15.0k
            ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
2053
15.0k
            pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
2054
15.0k
        }
2055
2056
        /* Bug Fix Deblocking */
2057
4.53k
        pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
2058
4.53k
        pui_map_ref_idx_to_poc_lx1[0] = 0;
2059
2060
4.53k
        if(u1_mbaff)
2061
909
        {
2062
909
            void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
2063
909
            void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1;
2064
909
            ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
2065
909
                            + TOP_LIST_FLD_L0;
2066
909
            ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
2067
909
                            + BOT_LIST_FLD_L0;
2068
2069
909
            ppv_map_ref_idx_to_poc_lx_t[0] = 0; //  For ref_idx = -1
2070
909
            ppv_map_ref_idx_to_poc_lx_t++;
2071
909
            ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1
2072
909
            ppv_map_ref_idx_to_poc_lx_b++;
2073
2074
909
            idx = 0;
2075
7.75k
            for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
2076
6.84k
            {
2077
6.84k
                ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
2078
6.84k
                ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
2079
6.84k
                ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
2080
2081
6.84k
                ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
2082
6.84k
                ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
2083
2084
6.84k
                ppv_map_ref_idx_to_poc_lx_t += 2;
2085
6.84k
                ppv_map_ref_idx_to_poc_lx_b += 2;
2086
6.84k
            }
2087
909
            ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc
2088
909
                            + TOP_LIST_FLD_L1;
2089
909
            ppv_map_ref_idx_to_poc_lx_t1[0] = 0;
2090
909
            ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc
2091
909
                            + BOT_LIST_FLD_L1;
2092
909
            ppv_map_ref_idx_to_poc_lx_b1[0] = 0;
2093
2094
909
        }
2095
2096
4.53k
        if(ps_dec->u4_num_cores >= 3)
2097
2.26k
        {
2098
2.26k
            WORD32 num_entries;
2099
2.26k
            WORD32 size;
2100
2101
2.26k
            num_entries = MAX_FRAMES;
2102
2.26k
            if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
2103
730
                (0 == ps_dec->i4_display_delay))
2104
0
            {
2105
0
                num_entries = 1;
2106
0
            }
2107
2.26k
            num_entries = ((2 * num_entries) + 1);
2108
2.26k
            num_entries *= 2;
2109
2110
2.26k
            size = num_entries * sizeof(void *);
2111
2.26k
            size += PAD_MAP_IDX_POC * sizeof(void *);
2112
2113
2.26k
            memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
2114
2.26k
                   ps_dec->ppv_map_ref_idx_to_poc,
2115
2.26k
                   size);
2116
2.26k
        }
2117
2118
2119
4.53k
    }
2120
4.53k
    if(ps_pps->u1_wted_pred_flag)
2121
1.48k
    {
2122
1.48k
        ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
2123
1.48k
        if(ret != OK)
2124
187
            return ret;
2125
1.29k
        ih264d_form_pred_weight_matrix(ps_dec);
2126
1.29k
        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
2127
1.29k
    }
2128
3.05k
    else
2129
3.05k
    {
2130
3.05k
        ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
2131
3.05k
        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
2132
3.05k
    }
2133
2134
4.34k
    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
2135
4.34k
                    ps_dec->ps_cur_slice->u2_log2Y_crwd;
2136
2137
4.34k
    if(u1_mbaff && (u1_field_pic_flag == 0))
2138
848
    {
2139
848
        ih264d_convert_frm_mbaff_list(ps_dec);
2140
848
    }
2141
2142
    /* G050 */
2143
4.34k
    if(ps_cur_slice->u1_nal_ref_idc != 0)
2144
3.16k
    {
2145
3.16k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
2146
1.45k
        {
2147
1.45k
            i_temp = ih264d_read_mmco_commands(ps_dec);
2148
1.45k
            if (i_temp < 0)
2149
0
            {
2150
0
                return ERROR_DBP_MANAGER_T;
2151
0
            }
2152
1.45k
            ps_dec->u4_bitoffset = i_temp;
2153
1.45k
        }
2154
1.71k
        else
2155
1.71k
            ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
2156
2157
3.16k
    }
2158
    /* G050 */
2159
2160
4.34k
    if(ps_pps->u1_entropy_coding_mode == CABAC)
2161
2.02k
    {
2162
2.02k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2163
2164
2.02k
        if(u4_temp > MAX_CABAC_INIT_IDC)
2165
80
        {
2166
80
            return ERROR_INV_SLICE_HDR_T;
2167
80
        }
2168
1.94k
        ps_cur_slice->u1_cabac_init_idc = u4_temp;
2169
1.94k
        COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc);
2170
1.94k
    }
2171
4.26k
    {
2172
4.26k
        WORD64 i8_temp;
2173
        /* Read slice_qp_delta */
2174
4.26k
        i8_temp = (WORD64)ps_pps->u1_pic_init_qp
2175
4.26k
                            + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2176
4.26k
        if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
2177
489
        {
2178
489
            return ERROR_INV_RANGE_QP_T;
2179
489
        }
2180
3.77k
        ps_cur_slice->u1_slice_qp = i8_temp;
2181
3.77k
        COPYTHECONTEXT("SH: slice_qp_delta",
2182
3.77k
                        (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
2183
3.77k
    }
2184
2185
3.77k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
2186
2.55k
    {
2187
2.55k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2188
2.55k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
2189
50
        {
2190
50
            return ERROR_INV_SLICE_HDR_T;
2191
50
        }
2192
2193
2.50k
        COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
2194
2.50k
        ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
2195
2.50k
        if(u4_temp != 1)
2196
2.49k
        {
2197
2.49k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
2198
2.49k
                            << 1;
2199
2.49k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2200
1
            {
2201
1
                return ERROR_INV_SLICE_HDR_T;
2202
1
            }
2203
2.49k
            ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
2204
2.49k
            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
2205
2.49k
                            ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
2206
2207
2.49k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
2208
2.49k
                            << 1;
2209
2.49k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2210
6
            {
2211
6
                return ERROR_INV_SLICE_HDR_T;
2212
6
            }
2213
2.48k
            ps_cur_slice->i1_slice_beta_offset = i_temp;
2214
2.48k
            COPYTHECONTEXT("SH: slice_beta_offset_div2",
2215
2.48k
                            ps_cur_slice->i1_slice_beta_offset >> 1);
2216
2.48k
        }
2217
6
        else
2218
6
        {
2219
6
            ps_cur_slice->i1_slice_alpha_c0_offset = 0;
2220
6
            ps_cur_slice->i1_slice_beta_offset = 0;
2221
6
        }
2222
2.50k
    }
2223
1.22k
    else
2224
1.22k
    {
2225
1.22k
        ps_cur_slice->u1_disable_dblk_filter_idc = 0;
2226
1.22k
        ps_cur_slice->i1_slice_alpha_c0_offset = 0;
2227
1.22k
        ps_cur_slice->i1_slice_beta_offset = 0;
2228
1.22k
    }
2229
2230
3.72k
    ps_dec->u1_slice_header_done = 2;
2231
2232
3.72k
    if(ps_pps->u1_entropy_coding_mode)
2233
1.89k
    {
2234
1.89k
        SWITCHOFFTRACE; SWITCHONTRACECABAC;
2235
1.89k
        ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
2236
1.89k
        ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
2237
1.89k
        ih264d_init_cabac_contexts(P_SLICE, ps_dec);
2238
2239
1.89k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2240
572
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
2241
1.32k
        else
2242
1.32k
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
2243
1.89k
    }
2244
1.82k
    else
2245
1.82k
    {
2246
1.82k
        SWITCHONTRACE; SWITCHOFFTRACECABAC;
2247
1.82k
        ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
2248
1.82k
        ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
2249
1.82k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2250
183
        {
2251
183
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
2252
183
        }
2253
1.64k
        else
2254
1.64k
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
2255
1.82k
    }
2256
2257
3.72k
    ps_dec->u1_B = 0;
2258
3.72k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
2259
3.72k
    ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice);
2260
3.72k
    if(ret != OK)
2261
1.02k
        return ret;
2262
//    ps_dec->curr_slice_in_error = 0 ;
2263
2.70k
    return OK;
2264
3.72k
}