Coverage Report

Created: 2026-04-12 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/ih264d_parse_bslice.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
 * \file ih264d_parse_bslice.c
23
 *
24
 * \brief
25
 *    Contains routines that decode a I slice type
26
 *
27
 * Detailed_description
28
 *
29
 * \date
30
 *    07/07/2003
31
 *
32
 * \author  NS
33
 **************************************************************************
34
 */
35
36
#include <string.h>
37
#include "ih264_defs.h"
38
#include "ih264d_bitstrm.h"
39
#include "ih264d_defs.h"
40
#include "ih264d_debug.h"
41
#include "ih264d_tables.h"
42
#include "ih264d_structs.h"
43
#include "ih264d_defs.h"
44
#include "ih264d_parse_cavlc.h"
45
#include "ih264d_mb_utils.h"
46
#include "ih264d_parse_slice.h"
47
#include "ih264d_process_intra_mb.h"
48
#include "ih264d_mvpred.h"
49
#include "ih264d_parse_islice.h"
50
#include "ih264d_inter_pred.h"
51
#include "ih264d_process_pslice.h"
52
#include "ih264d_process_bslice.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_mvpred.h"
58
#include "ih264d_cabac.h"
59
#include "ih264d_utils.h"
60
61
void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
62
63
/*!
64
 **************************************************************************
65
 * \if Function name : ParseMb_SubMb_PredBCav\endif
66
 *
67
 * \brief
68
 *    Implements sub_mb_pred() of 7.3.5.2. & mb_pred() of 7.3.5.1
69
 *
70
 * \return
71
 *    None.
72
 *
73
 **************************************************************************
74
 */
75
WORD32 ih264d_parse_bmb_non_direct_cavlc(dec_struct_t * ps_dec,
76
                                       dec_mb_info_t * ps_cur_mb_info,
77
                                       UWORD32 u4_mb_num,
78
                                       UWORD32 u4_num_mbsNby2)
79
131k
{
80
131k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
81
131k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
82
131k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
83
131k
    UWORD8 * pu1_sub_mb_pred_modes = (UWORD8 *)(gau1_ih264d_submb_pred_modes) + 4;
84
131k
    const UWORD8 (*pu1_mb_pred_modes)[32] =
85
131k
                    (const UWORD8 (*)[32])gau1_ih264d_mb_pred_modes;
86
131k
    const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
87
131k
    const UWORD8 * pu1_sub_mb_mc_mode = (const UWORD8 *)(gau1_ih264d_submb_mc_mode)
88
131k
                    + 4;
89
90
131k
    parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
91
131k
                    + u4_num_mbsNby2;
92
131k
    UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
93
131k
    WORD8 (*pi1_ref_idx)[MAX_REFIDX_INFO_PER_MB] = ps_parse_mb_data->i1_ref_idx;
94
131k
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
95
131k
    UWORD8 u1_mb_mc_mode, u1_num_mb_part, u1_sub_mb = !(u1_mb_type ^ B_8x8);
96
131k
    UWORD32 u4_mb_mc_mode = 0, u4_mb_pred_mode = 0;
97
131k
    WORD32 ret;
98
99
131k
    if(u1_sub_mb)
100
2.87k
    {
101
2.87k
        UWORD8 uc_i;
102
2.87k
        u1_mb_mc_mode = 0;
103
2.87k
        u1_num_mb_part = 4;
104
        /* Reading the subMB type */
105
14.1k
        for(uc_i = 0; uc_i < 4; uc_i++)
106
11.4k
        {
107
108
11.4k
            UWORD32 ui_sub_mb_mode;
109
110
//Inlined ih264d_uev
111
11.4k
            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
112
11.4k
            UWORD32 u4_word, u4_ldz;
113
114
            /***************************************************************/
115
            /* Find leading zeros in next 32 bits                          */
116
            /***************************************************************/
117
11.4k
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
118
11.4k
            u4_ldz = CLZ(u4_word);
119
            /* Flush the ps_bitstrm */
120
11.4k
            u4_bitstream_offset += (u4_ldz + 1);
121
            /* Read the suffix from the ps_bitstrm */
122
11.4k
            u4_word = 0;
123
11.4k
            if(u4_ldz)
124
6.38k
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
125
11.4k
                        u4_ldz);
126
11.4k
            *pu4_bitstrm_ofst = u4_bitstream_offset;
127
11.4k
            ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1);
128
//Inlined ih264d_uev
129
130
11.4k
            if(ui_sub_mb_mode > 12)
131
211
                return ERROR_SUB_MB_TYPE;
132
11.2k
            else
133
11.2k
            {
134
11.2k
                UWORD8 u1_subMbPredMode = pu1_sub_mb_pred_modes[ui_sub_mb_mode];
135
11.2k
                u4_mb_mc_mode = (u4_mb_mc_mode << 8)
136
11.2k
                                | pu1_sub_mb_mc_mode[ui_sub_mb_mode];
137
11.2k
                u4_mb_pred_mode = (u4_mb_pred_mode << 8) | u1_subMbPredMode;
138
11.2k
                pi1_ref_idx[0][uc_i] = ((u1_subMbPredMode & PRED_L0) - 1) >> 1;
139
11.2k
                pi1_ref_idx[1][uc_i] = ((u1_subMbPredMode & PRED_L1) - 1) >> 1;
140
11.2k
                COPYTHECONTEXT("sub_mb_type", u1_subMbPredMode);
141
11.2k
            }
142
            /* Storing collocated Mb and SubMb mode information */
143
11.2k
            *pu1_col_info++ = ((PRED_8x8) << 6)
144
11.2k
                            | ((pu1_sub_mb_mc_mode[ui_sub_mb_mode] << 4));
145
11.2k
            if(ui_sub_mb_mode != B_DIRECT_8x8)
146
6.17k
            {
147
6.17k
                if(ui_sub_mb_mode > B_BI_8x8)
148
3.99k
                {
149
3.99k
                    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
150
3.99k
                }
151
6.17k
            }
152
5.08k
            else if(!ps_dec->s_high_profile.u1_direct_8x8_inference_flag)
153
3.21k
            {
154
3.21k
                ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
155
3.21k
            }
156
11.2k
        }
157
2.87k
    }
158
128k
    else
159
128k
    {
160
128k
        UWORD8 u1_mb_pred_mode_idx = 5 + u1_mb_type;
161
128k
        UWORD8 u1_mb_pred_mode_part0 = pu1_mb_pred_modes[0][u1_mb_pred_mode_idx];
162
128k
        UWORD8 u1_mb_pred_mode_part1 = pu1_mb_pred_modes[1][u1_mb_pred_mode_idx];
163
128k
        u1_mb_mc_mode = ps_cur_mb_info->u1_mb_mc_mode;
164
128k
        u1_num_mb_part = pu1_num_mb_part[u1_mb_mc_mode];
165
166
128k
        pi1_ref_idx[0][0] = ((u1_mb_pred_mode_part0 & PRED_L0) - 1) >> 1;
167
128k
        pi1_ref_idx[1][0] = ((u1_mb_pred_mode_part0 & PRED_L1) - 1) >> 1;
168
128k
        pi1_ref_idx[0][1] = ((u1_mb_pred_mode_part1 & PRED_L0) - 1) >> 1;
169
128k
        pi1_ref_idx[1][1] = ((u1_mb_pred_mode_part1 & PRED_L1) - 1) >> 1;
170
171
128k
        u4_mb_pred_mode = (u1_mb_pred_mode_part0 << 8) | u1_mb_pred_mode_part1;
172
128k
        u4_mb_mc_mode = u1_mb_mc_mode | (u1_mb_mc_mode << 8);
173
128k
        u4_mb_mc_mode <<= 16;
174
128k
        u4_mb_pred_mode <<= 16;
175
176
        /* Storing collocated Mb and SubMb mode information */
177
128k
        *pu1_col_info++ = (u1_mb_mc_mode << 6);
178
128k
        if(u1_mb_mc_mode)
179
51.8k
            *pu1_col_info++ = (u1_mb_mc_mode << 6);
180
128k
    }
181
182
131k
    {
183
131k
        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
184
131k
        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
185
131k
        UWORD8 *pu1_num_ref_idx_lx_active =
186
131k
                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active;
187
131k
        const UWORD8 u1_mbaff_field = (u1_mbaff & uc_field);
188
131k
        UWORD8 u4_num_ref_idx_lx_active;
189
190
131k
        u4_num_ref_idx_lx_active = (pu1_num_ref_idx_lx_active[0]
191
131k
                        << u1_mbaff_field) - 1;
192
193
131k
        if(u4_num_ref_idx_lx_active)
194
46.2k
        {
195
46.2k
            if(1 == u4_num_ref_idx_lx_active)
196
5.60k
                ih264d_parse_bmb_ref_index_cavlc_range1(
197
5.60k
                                u1_num_mb_part, ps_bitstrm, pi1_ref_idx[0],
198
5.60k
                                u4_num_ref_idx_lx_active);
199
40.6k
            else
200
40.6k
            {
201
40.6k
                ret = ih264d_parse_bmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm,
202
40.6k
                                                 pi1_ref_idx[0],
203
40.6k
                                                 u4_num_ref_idx_lx_active);
204
40.6k
                if(ret != OK)
205
389
                    return ret;
206
40.6k
            }
207
46.2k
        }
208
209
131k
        u4_num_ref_idx_lx_active = (pu1_num_ref_idx_lx_active[1]
210
131k
                        << u1_mbaff_field) - 1;
211
212
131k
        if(u4_num_ref_idx_lx_active)
213
29.9k
        {
214
29.9k
            if(1 == u4_num_ref_idx_lx_active)
215
12.2k
                ih264d_parse_bmb_ref_index_cavlc_range1(
216
12.2k
                                u1_num_mb_part, ps_bitstrm, pi1_ref_idx[1],
217
12.2k
                                u4_num_ref_idx_lx_active);
218
17.6k
            else
219
17.6k
            {
220
17.6k
                ret = ih264d_parse_bmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm,
221
17.6k
                                                 pi1_ref_idx[1],
222
17.6k
                                                 u4_num_ref_idx_lx_active);
223
17.6k
                if(ret != OK)
224
152
                    return ret;
225
17.6k
            }
226
29.9k
        }
227
131k
    }
228
229
    /* Read MotionVectors */
230
131k
    {
231
131k
        const UWORD8 * pu1_top_left_sub_mb_indx;
232
233
131k
        const UWORD8 * pu1_sub_mb_indx_mod =
234
131k
                        (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
235
131k
                                        + (u1_sub_mb * 6);
236
131k
        const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
237
131k
        const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
238
131k
        const UWORD8 * pu1_num_sub_mb_part =
239
131k
                        (const UWORD8 *)gau1_ih264d_num_submb_part;
240
131k
        const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
241
131k
        const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
242
131k
        UWORD8 u1_p_idx = 0, u1_num_submb_part, uc_lx;
243
131k
        parse_part_params_t * ps_part;
244
131k
        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
245
131k
        UWORD8 u1_mb_part_wd, u1_mb_part_ht;
246
247
        /* Initialisations */
248
131k
        ps_part = ps_dec->ps_part;
249
        /* Default Initialization for Non subMb Case Mode */
250
131k
        u1_mb_part_wd = pu1_mb_partw[u1_mb_mc_mode];
251
131k
        u1_mb_part_ht = pu1_mb_parth[u1_mb_mc_mode];
252
131k
        u1_num_submb_part = 1;
253
254
        /* Decoding the MV for the subMB */
255
393k
        for(uc_lx = 0; uc_lx < 2; uc_lx++)
256
262k
        {
257
262k
            UWORD8 u1_sub_mb_num = 0, u1_pred_mode, uc_i;
258
262k
            UWORD32 u4_mb_mc_mode_tmp = u4_mb_mc_mode;
259
262k
            UWORD32 u4_mb_pred_mode_tmp = u4_mb_pred_mode;
260
262k
            UWORD16 u2_sub_mb_num = 0x028A; // for sub mb case
261
262k
            UWORD8 u1_b2 = uc_lx << 1;
262
262k
            u1_pred_mode = (uc_lx) ? PRED_L1 : PRED_L0;
263
262k
            pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode << 1);
264
265
642k
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
266
380k
            {
267
380k
                UWORD8 u1_mb_mc_mode, uc_j;
268
380k
                UWORD8 i1_pred = u4_mb_pred_mode_tmp >> 24;
269
380k
                u1_mb_mc_mode = u4_mb_mc_mode_tmp >> 24;
270
380k
                u4_mb_pred_mode_tmp <<= 8;
271
380k
                u4_mb_mc_mode_tmp <<= 8;
272
                /* subMb prediction mode */
273
380k
                if(u1_sub_mb)
274
19.8k
                {
275
276
19.8k
                    u1_mb_part_wd = pu1_sub_mb_partw[u1_mb_mc_mode];
277
19.8k
                    u1_mb_part_ht = pu1_sub_mb_parth[u1_mb_mc_mode];
278
19.8k
                    u1_sub_mb_num = u2_sub_mb_num >> 12;
279
19.8k
                    u1_num_submb_part = pu1_num_sub_mb_part[u1_mb_mc_mode];
280
19.8k
                    pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod
281
19.8k
                                    + (u1_mb_mc_mode << 1);
282
19.8k
                    u2_sub_mb_num <<= 4;
283
19.8k
                }
284
775k
                for(uc_j = 0; uc_j < u1_num_submb_part;
285
395k
                                uc_j++, pu1_top_left_sub_mb_indx++)
286
395k
                {
287
395k
                    mv_pred_t * ps_mv;
288
395k
                    u1_sub_mb_num = u1_sub_mb_num + *pu1_top_left_sub_mb_indx;
289
395k
                    ps_mv = ps_mv_start + u1_sub_mb_num;
290
291
                    /* Storing Info for partitions, writing only once */
292
395k
                    if(uc_lx)
293
197k
                    {
294
197k
                        ps_part->u1_is_direct = (!i1_pred);
295
197k
                        ps_part->u1_pred_mode = i1_pred;
296
197k
                        ps_part->u1_sub_mb_num = u1_sub_mb_num;
297
197k
                        ps_part->u1_partheight = u1_mb_part_ht;
298
197k
                        ps_part->u1_partwidth = u1_mb_part_wd;
299
                        /* Increment partition Index */
300
197k
                        u1_p_idx++;
301
197k
                        ps_part++;
302
197k
                    }
303
304
395k
                    if(i1_pred & u1_pred_mode)
305
210k
                    {
306
210k
                        WORD16 i2_mvx, i2_mvy;
307
308
//inlining ih264d_sev
309
210k
                        {
310
210k
                            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
311
210k
                            UWORD32 u4_word, u4_ldz, u4_abs_val;
312
313
                            /***************************************************************/
314
                            /* Find leading zeros in next 32 bits                          */
315
                            /***************************************************************/
316
210k
                            NEXTBITS_32(u4_word, u4_bitstream_offset,
317
210k
                                        pu4_bitstrm_buf);
318
210k
                            u4_ldz = CLZ(u4_word);
319
320
                            /* Flush the ps_bitstrm */
321
210k
                            u4_bitstream_offset += (u4_ldz + 1);
322
323
                            /* Read the suffix from the ps_bitstrm */
324
210k
                            u4_word = 0;
325
210k
                            if(u4_ldz)
326
152k
                                GETBITS(u4_word, u4_bitstream_offset,
327
210k
                                        pu4_bitstrm_buf, u4_ldz);
328
329
210k
                            *pu4_bitstrm_ofst = u4_bitstream_offset;
330
210k
                            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
331
332
210k
                            if(u4_word & 0x1)
333
105k
                                i2_mvx = (-(WORD32)u4_abs_val);
334
104k
                            else
335
104k
                                i2_mvx = (u4_abs_val);
336
210k
                        }
337
//inlinined ih264d_sev
338
339
//inlining ih264d_sev
340
210k
                        {
341
210k
                            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
342
210k
                            UWORD32 u4_word, u4_ldz, u4_abs_val;
343
344
                            /***************************************************************/
345
                            /* Find leading zeros in next 32 bits                          */
346
                            /***************************************************************/
347
210k
                            NEXTBITS_32(u4_word, u4_bitstream_offset,
348
210k
                                        pu4_bitstrm_buf);
349
210k
                            u4_ldz = CLZ(u4_word);
350
351
                            /* Flush the ps_bitstrm */
352
210k
                            u4_bitstream_offset += (u4_ldz + 1);
353
354
                            /* Read the suffix from the ps_bitstrm */
355
210k
                            u4_word = 0;
356
210k
                            if(u4_ldz)
357
144k
                                GETBITS(u4_word, u4_bitstream_offset,
358
210k
                                        pu4_bitstrm_buf, u4_ldz);
359
360
210k
                            *pu4_bitstrm_ofst = u4_bitstream_offset;
361
210k
                            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
362
363
210k
                            if(u4_word & 0x1)
364
108k
                                i2_mvy = (-(WORD32)u4_abs_val);
365
101k
                            else
366
101k
                                i2_mvy = (u4_abs_val);
367
210k
                        }
368
//inlinined ih264d_sev
369
370
                        /* Storing Mv residuals */
371
210k
                        ps_mv->i2_mv[u1_b2] = i2_mvx;
372
210k
                        ps_mv->i2_mv[u1_b2 + 1] = i2_mvy;
373
210k
                    }
374
395k
                }
375
380k
            }
376
262k
        }
377
        /* write back to the scratch partition info */
378
131k
        ps_dec->ps_part = ps_part;
379
131k
        ps_parse_mb_data->u1_num_part = u1_sub_mb ? u1_p_idx : u1_num_mb_part;
380
381
131k
    }
382
131k
    return OK;
383
131k
}
384
385
/*!
386
 **************************************************************************
387
 * \if Function name : ParseMb_SubMb_PredBCab\endif
388
 *
389
 * \brief
390
 *    Implements sub_mb_pred() of 7.3.5.2. & mb_pred() of 7.3.5.1
391
 *
392
 * \return
393
 *    None.
394
 *
395
 **************************************************************************
396
 */
397
398
WORD32 ih264d_parse_bmb_non_direct_cabac(dec_struct_t * ps_dec,
399
                                       dec_mb_info_t * ps_cur_mb_info,
400
                                       UWORD32 u4_mb_num,
401
                                       UWORD32 u4_num_mbsNby2)
402
204k
{
403
    /* Loads from ps_dec */
404
204k
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
405
204k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
406
204k
    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
407
204k
    parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
408
204k
                    + u4_num_mbsNby2;
409
410
    /* table pointer loads */
411
204k
    const UWORD8 * pu1_sub_mb_pred_modes = (UWORD8 *)(gau1_ih264d_submb_pred_modes)
412
204k
                    + 4;
413
204k
    const UWORD8 (*pu1_mb_pred_modes)[32] =
414
204k
                    (const UWORD8 (*)[32])gau1_ih264d_mb_pred_modes;
415
204k
    const UWORD8 *pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
416
204k
    const UWORD8 *pu1_sub_mb_mc_mode = (UWORD8 *)(gau1_ih264d_submb_mc_mode) + 4;
417
418
204k
    const UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
419
204k
    UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
420
204k
    WORD8 *pi1_ref_idx_l0 = &ps_parse_mb_data->i1_ref_idx[0][0];
421
204k
    WORD8 *pi1_ref_idx_l1 = &ps_parse_mb_data->i1_ref_idx[1][0];
422
204k
    UWORD8 u1_dec_ref_l0, u1_dec_ref_l1;
423
424
204k
    UWORD8 u1_num_mb_part, u1_mb_mc_mode, u1_sub_mb, u1_mbpred_mode = 5
425
204k
                    + u1_mb_type;
426
204k
    UWORD32 u4_mb_mc_mode = 0, u4_mb_pred_mode = 0;
427
204k
    WORD32 ret;
428
429
204k
    p_curr_ctxt->u1_mb_type = CAB_NON_BD16x16;
430
204k
    u1_sub_mb = !(u1_mb_type ^ B_8x8);
431
432
204k
    {
433
204k
        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
434
204k
        UWORD8 *pu1_num_ref_idx_lx_active =
435
204k
                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active;
436
204k
        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
437
204k
        UWORD8 u1_mbaff_field = (u1_mbaff & uc_field);
438
204k
        u1_dec_ref_l0 = (pu1_num_ref_idx_lx_active[0] << u1_mbaff_field) - 1;
439
204k
        u1_dec_ref_l1 = (pu1_num_ref_idx_lx_active[1] << u1_mbaff_field) - 1;
440
204k
    }
441
442
204k
    if(u1_sub_mb)
443
53.6k
    {
444
53.6k
        const UWORD8 u1_colz = ((PRED_8x8) << 6);
445
53.6k
        UWORD8 uc_i;
446
53.6k
        u1_mb_mc_mode = 0;
447
53.6k
        u1_num_mb_part = 4;
448
        /* Reading the subMB type */
449
268k
        for(uc_i = 0; uc_i < 4; uc_i++)
450
214k
        {
451
214k
            UWORD8 u1_sub_mb_mode, u1_subMbPredModes;
452
214k
            u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
453
214k
                            1, ps_cab_env, ps_bitstrm,
454
214k
                            ps_dec->p_sub_mb_type_t);
455
456
214k
            if(u1_sub_mb_mode > 12)
457
0
                return ERROR_SUB_MB_TYPE;
458
459
214k
            u1_subMbPredModes = pu1_sub_mb_pred_modes[u1_sub_mb_mode];
460
214k
            u4_mb_mc_mode = (u4_mb_mc_mode << 8) | pu1_sub_mb_mc_mode[u1_sub_mb_mode];
461
214k
            u4_mb_pred_mode = (u4_mb_pred_mode << 8) | u1_subMbPredModes;
462
214k
            *pi1_ref_idx_l0++ =
463
214k
                            (u1_subMbPredModes & PRED_L0) ? u1_dec_ref_l0 : -1;
464
214k
            *pi1_ref_idx_l1++ =
465
214k
                            (u1_subMbPredModes & PRED_L1) ? u1_dec_ref_l1 : -1;
466
214k
            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
467
            /* Storing collocated Mb and SubMb mode information */
468
214k
            *pu1_col_info++ =
469
214k
                            (u1_colz | (pu1_sub_mb_mc_mode[u1_sub_mb_mode] << 4));
470
214k
            if(u1_sub_mb_mode != B_DIRECT_8x8)
471
195k
            {
472
195k
                if(u1_sub_mb_mode > B_BI_8x8)
473
37.7k
                {
474
37.7k
                    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
475
37.7k
                }
476
195k
            }
477
18.8k
            else if(!ps_dec->s_high_profile.u1_direct_8x8_inference_flag)
478
13.0k
            {
479
13.0k
                ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
480
13.0k
            }
481
214k
        }
482
53.6k
        pi1_ref_idx_l0 -= 4;
483
53.6k
        pi1_ref_idx_l1 -= 4;
484
53.6k
    }
485
151k
    else
486
151k
    {
487
151k
        UWORD8 u1_mb_pred_mode_part0 = pu1_mb_pred_modes[0][u1_mbpred_mode];
488
151k
        UWORD8 u1_mb_pred_mode_part1 = pu1_mb_pred_modes[1][u1_mbpred_mode];
489
151k
        u1_mb_mc_mode = ps_cur_mb_info->u1_mb_mc_mode;
490
151k
        u1_num_mb_part = pu1_num_mb_part[u1_mb_mc_mode];
491
        /* Storing collocated Mb and SubMb mode information */
492
151k
        *pu1_col_info++ = (u1_mb_mc_mode << 6);
493
151k
        if(u1_mb_mc_mode)
494
69.3k
            *pu1_col_info++ = (u1_mb_mc_mode << 6);
495
151k
        u4_mb_mc_mode = u1_mb_mc_mode | (u1_mb_mc_mode << 8);
496
151k
        u4_mb_mc_mode <<= 16;
497
151k
        u4_mb_pred_mode = ((u1_mb_pred_mode_part0 << 8) | u1_mb_pred_mode_part1) << 16;
498
499
151k
        *pi1_ref_idx_l0++ = (u1_mb_pred_mode_part0 & PRED_L0) ? u1_dec_ref_l0 : -1;
500
151k
        *pi1_ref_idx_l0-- = (u1_mb_pred_mode_part1 & PRED_L0) ? u1_dec_ref_l0 : -1;
501
151k
        *pi1_ref_idx_l1++ = (u1_mb_pred_mode_part0 & PRED_L1) ? u1_dec_ref_l1 : -1;
502
151k
        *pi1_ref_idx_l1-- = (u1_mb_pred_mode_part1 & PRED_L1) ? u1_dec_ref_l1 : -1;
503
151k
    }
504
204k
    {
505
204k
        WORD8 *pi1_lft_cxt = ps_dec->pi1_left_ref_idx_ctxt_inc;
506
204k
        WORD8 *pi1_top_cxt = p_curr_ctxt->i1_ref_idx;
507
508
204k
        ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0, u1_dec_ref_l0,
509
204k
                                   u1_mb_mc_mode, pi1_ref_idx_l0, pi1_lft_cxt,
510
204k
                                   pi1_top_cxt, ps_cab_env, ps_bitstrm,
511
204k
                                   ps_dec->p_ref_idx_t);
512
204k
        if(ret != OK)
513
251
            return ret;
514
515
204k
        ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 2, u1_dec_ref_l1,
516
204k
                                   u1_mb_mc_mode, pi1_ref_idx_l1, pi1_lft_cxt,
517
204k
                                   pi1_top_cxt, ps_cab_env, ps_bitstrm,
518
204k
                                   ps_dec->p_ref_idx_t);
519
204k
        if(ret != OK)
520
217
            return ret;
521
204k
    }
522
    /* Read MotionVectors */
523
204k
    {
524
204k
        const UWORD8 *pu1_top_left_sub_mb_indx;
525
204k
        UWORD8 uc_j, uc_lx;
526
204k
        UWORD8 u1_mb_part_wd, u1_mb_part_ht;
527
528
204k
        const UWORD8 *pu1_sub_mb_indx_mod =
529
204k
                        (const UWORD8 *)gau1_ih264d_submb_indx_mod
530
204k
                                        + (u1_sub_mb * 6);
531
204k
        const UWORD8 *pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
532
204k
        const UWORD8 *pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
533
204k
        const UWORD8 *pu1_num_sub_mb_part =
534
204k
                        (const UWORD8 *)gau1_ih264d_num_submb_part;
535
204k
        const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
536
204k
        const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
537
538
204k
        UWORD8 u1_p_idx = 0;
539
204k
        UWORD8 u1_num_submb_part;
540
204k
        parse_part_params_t *ps_part;
541
        /* Initialisations */
542
204k
        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
543
204k
        ps_part = ps_dec->ps_part;
544
545
        /* Default initialization for non subMb case */
546
204k
        u1_mb_part_wd = pu1_mb_partw[u1_mb_mc_mode];
547
204k
        u1_mb_part_ht = pu1_mb_parth[u1_mb_mc_mode];
548
204k
        u1_num_submb_part = 1;
549
550
        /* Decoding the MV for the subMB */
551
612k
        for(uc_lx = 0; uc_lx < 2; uc_lx++)
552
408k
        {
553
408k
            UWORD32 u4_sub_mb_num = 0;
554
408k
            UWORD32 u4_mb_pred_mode_tmp = u4_mb_pred_mode;
555
408k
            UWORD32 u4_mb_mc_mode_tmp = u4_mb_mc_mode;
556
408k
            UWORD8 u1_mb_mc_mode_1, u1_pred_mode, uc_i;
557
408k
            UWORD16 u2_sub_mb_num = 0x028A;
558
408k
            UWORD8 u1_b2 = uc_lx << 1;
559
408k
            u1_pred_mode = (uc_lx) ? PRED_L1 : PRED_L0;
560
            /* Default for Cabac */
561
408k
            pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode << 1);
562
1.27M
            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
563
868k
            {
564
565
868k
                WORD8 i1_pred = (UWORD8)(u4_mb_pred_mode_tmp >> 24);
566
868k
                u1_mb_mc_mode_1 = (UWORD8)(u4_mb_mc_mode_tmp >> 24);
567
868k
                u4_mb_pred_mode_tmp <<= 8;
568
868k
                u4_mb_mc_mode_tmp <<= 8;
569
570
                /* subMb prediction mode */
571
868k
                if(u1_sub_mb)
572
428k
                {
573
428k
                    u1_mb_part_wd = pu1_sub_mb_partw[u1_mb_mc_mode_1];
574
428k
                    u1_mb_part_ht = pu1_sub_mb_parth[u1_mb_mc_mode_1];
575
428k
                    u4_sub_mb_num = u2_sub_mb_num >> 12;
576
428k
                    pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode_1 << 1);
577
428k
                    u1_num_submb_part = pu1_num_sub_mb_part[u1_mb_mc_mode_1];
578
428k
                    u2_sub_mb_num = u2_sub_mb_num << 4;
579
428k
                }
580
581
1.83M
                for(uc_j = 0; uc_j < u1_num_submb_part;
582
965k
                                uc_j++, pu1_top_left_sub_mb_indx++)
583
965k
                {
584
965k
                    mv_pred_t *ps_mv;
585
965k
                    u4_sub_mb_num = u4_sub_mb_num + *pu1_top_left_sub_mb_indx;
586
965k
                    ps_mv = ps_mv_start + u4_sub_mb_num;
587
588
                    /* Storing Info for partitions, writing only once */
589
965k
                    if(uc_lx)
590
482k
                    {
591
482k
                        ps_part->u1_is_direct = (!i1_pred);
592
482k
                        ps_part->u1_pred_mode = i1_pred;
593
482k
                        ps_part->u1_sub_mb_num = u4_sub_mb_num;
594
482k
                        ps_part->u1_partheight = u1_mb_part_ht;
595
482k
                        ps_part->u1_partwidth = u1_mb_part_wd;
596
597
                        /* Increment partition Index */
598
482k
                        u1_p_idx++;
599
482k
                        ps_part++;
600
482k
                    }
601
602
965k
                    ih264d_get_mvd_cabac(u4_sub_mb_num, u1_b2, u1_mb_part_wd,
603
965k
                                         u1_mb_part_ht,
604
965k
                                         (UWORD8)(i1_pred & u1_pred_mode), ps_dec,
605
965k
                                         ps_mv);
606
965k
                }
607
868k
            }
608
408k
        }
609
        /* write back to the scratch partition info */
610
611
204k
        ps_dec->ps_part = ps_part;
612
204k
        ps_parse_mb_data->u1_num_part = u1_sub_mb ? u1_p_idx : u1_num_mb_part;
613
614
204k
    }
615
616
204k
    return OK;
617
204k
}
618
619
/*!
620
 **************************************************************************
621
 * \if Function name : ih264d_parse_bmb_cabac \endif
622
 *
623
 * \brief
624
 *    This function parses CABAC syntax of a B MB.
625
 *
626
 * \return
627
 *    0 on Success and Error code otherwise
628
 **************************************************************************
629
 */
630
WORD32 ih264d_parse_bmb_cabac(dec_struct_t * ps_dec,
631
                              dec_mb_info_t * ps_cur_mb_info,
632
                              UWORD32 u4_mb_num,
633
                              UWORD32 u4_num_mbsNby2)
634
213k
{
635
213k
    UWORD8 u1_cbp;
636
213k
    deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_mb_num;
637
213k
    const UWORD8 *puc_mb_mc_mode = (const UWORD8 *)gau1_ih264d_mb_mc_mode;
638
213k
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
639
213k
    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
640
641
213k
    WORD32 ret;
642
213k
    UWORD8 u1_Bdirect_tranform_read = 1;
643
213k
    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 1;
644
645
213k
    ps_cur_mb_info->u1_mb_mc_mode = puc_mb_mc_mode[5 + u1_mb_type];
646
647
213k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
648
649
213k
    ps_cur_deblk_mb->u1_mb_type |= D_B_SLICE;
650
213k
    if(u1_mb_type != B_DIRECT)
651
204k
    {
652
204k
        ret = ih264d_parse_bmb_non_direct_cabac(ps_dec, ps_cur_mb_info, u4_mb_num,
653
204k
                                          u4_num_mbsNby2);
654
204k
        if(ret != OK)
655
468
            return ret;
656
204k
    }
657
8.54k
    else
658
8.54k
    {
659
660
        /************ STORING PARTITION INFO ***********/
661
8.54k
        parse_part_params_t * ps_part_info;
662
8.54k
        ps_part_info = ps_dec->ps_part;
663
8.54k
        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
664
8.54k
        ps_part_info->u1_sub_mb_num = 0;
665
8.54k
        ps_dec->ps_part++;
666
8.54k
        p_curr_ctxt->u1_mb_type = CAB_BD16x16;
667
668
8.54k
        MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
669
8.54k
        memset(ps_dec->pi1_left_ref_idx_ctxt_inc, 0, 4);
670
8.54k
        MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
671
8.54k
        memset(p_curr_ctxt->i1_ref_idx, 0, 4);
672
673
        /* check whether transform8x8 u4_flag to be read or not */
674
8.54k
        u1_Bdirect_tranform_read =
675
8.54k
                        ps_dec->s_high_profile.u1_direct_8x8_inference_flag;
676
8.54k
    }
677
678
    /* Read the Coded block pattern */
679
212k
    u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec);
680
212k
    p_curr_ctxt->u1_cbp = u1_cbp;
681
212k
    ps_cur_mb_info->u1_cbp = u1_cbp;
682
683
212k
    if(u1_cbp > 47)
684
0
        return ERROR_CBP;
685
686
212k
    COPYTHECONTEXT("coded_block_pattern", u1_cbp);
687
688
212k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
689
212k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
690
691
212k
    if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & (0xf))
692
35.2k
                    && (ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag)
693
31.0k
                    && (u1_Bdirect_tranform_read))
694
30.1k
    {
695
30.1k
        ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac(
696
30.1k
                        ps_dec, ps_cur_mb_info);
697
30.1k
        COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
698
699
30.1k
        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
700
30.1k
        p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
701
30.1k
    }
702
182k
    else
703
182k
    {
704
182k
        p_curr_ctxt->u1_transform8x8_ctxt = 0;
705
182k
    }
706
707
212k
    p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
708
212k
    p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
709
212k
    ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
710
711
    /* Read mb_qp_delta */
712
212k
    if(u1_cbp)
713
70.8k
    {
714
70.8k
        WORD8 c_temp;
715
70.8k
        ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp);
716
70.8k
        if(ret != OK)
717
106
            return ret;
718
70.7k
        COPYTHECONTEXT("mb_qp_delta", c_temp);
719
70.7k
        if(c_temp)
720
8.67k
        {
721
8.67k
            ret = ih264d_update_qp(ps_dec, c_temp);
722
8.67k
            if(ret != OK)
723
0
                return ret;
724
8.67k
        }
725
70.7k
    }
726
141k
    else
727
141k
        ps_dec->i1_prev_mb_qp_delta = 0;
728
729
212k
    ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0);
730
212k
    if(EXCEED_OFFSET(ps_dec->ps_bitstrm))
731
2.12k
        return ERROR_EOB_TERMINATE_T;
732
210k
    return OK;
733
212k
}
734
/*!
735
 **************************************************************************
736
 * \if Function name : ih264d_parse_bmb_cavlc \endif
737
 *
738
 * \brief
739
 *    This function parses CAVLC syntax of a B MB.
740
 *
741
 * \return
742
 *    0 on Success and Error code otherwise
743
 **************************************************************************
744
 */
745
WORD32 ih264d_parse_bmb_cavlc(dec_struct_t * ps_dec,
746
                              dec_mb_info_t * ps_cur_mb_info,
747
                              UWORD32 u4_mb_num,
748
                              UWORD32 u4_num_mbsNby2)
749
191k
{
750
191k
    UWORD32 u4_cbp;
751
191k
    deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_mb_num;
752
191k
    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
753
191k
    UWORD32 * pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
754
191k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
755
191k
    const UWORD8 *puc_mb_mc_mode = (const UWORD8 *)gau1_ih264d_mb_mc_mode;
756
191k
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
757
758
191k
    WORD32 ret;
759
191k
    UWORD8 u1_Bdirect_tranform_read = 1;
760
191k
    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 1;
761
191k
    ps_cur_mb_info->u1_tran_form8x8 = 0;
762
191k
    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
763
764
191k
    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
765
766
191k
    ps_cur_mb_info->u1_mb_mc_mode = puc_mb_mc_mode[5 + u1_mb_type];
767
768
191k
    ps_cur_deblk_mb->u1_mb_type |= D_B_SLICE;
769
191k
    if(u1_mb_type != B_DIRECT)
770
131k
    {
771
131k
        ret = ih264d_parse_bmb_non_direct_cavlc(ps_dec, ps_cur_mb_info, u4_mb_num,
772
131k
                                          u4_num_mbsNby2);
773
131k
        if(ret != OK)
774
752
            return ret;
775
131k
    }
776
60.1k
    else
777
60.1k
    {
778
        /************ STORING PARTITION INFO ***********/
779
60.1k
        parse_part_params_t * ps_part_info;
780
60.1k
        ps_part_info = ps_dec->ps_part;
781
60.1k
        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
782
60.1k
        ps_part_info->u1_sub_mb_num = 0;
783
60.1k
        ps_dec->ps_part++;
784
        /* check whether transform8x8 u4_flag to be read or not */
785
60.1k
        u1_Bdirect_tranform_read =
786
60.1k
                        ps_dec->s_high_profile.u1_direct_8x8_inference_flag;
787
60.1k
    }
788
789
    /* Read the Coded block pattern */
790
191k
    {
791
191k
        const UWORD8 * puc_CbpInter = gau1_ih264d_cbp_inter;
792
//Inlined ih264d_uev
793
191k
        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
794
191k
        UWORD32 u4_word, u4_ldz;
795
796
        /***************************************************************/
797
        /* Find leading zeros in next 32 bits                          */
798
        /***************************************************************/
799
191k
        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
800
191k
        u4_ldz = CLZ(u4_word);
801
        /* Flush the ps_bitstrm */
802
191k
        u4_bitstream_offset += (u4_ldz + 1);
803
        /* Read the suffix from the ps_bitstrm */
804
191k
        u4_word = 0;
805
191k
        if(u4_ldz)
806
108k
            GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
807
191k
        *pu4_bitstrm_ofst = u4_bitstream_offset;
808
191k
        u4_cbp = ((1 << u4_ldz) + u4_word - 1);
809
//Inlined ih264d_uev
810
191k
        if(u4_cbp > 47)
811
1.08k
            return ERROR_CBP;
812
190k
        u4_cbp = puc_CbpInter[u4_cbp];
813
814
190k
        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & (0xf))
815
36.0k
                        && (ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag)
816
35.5k
                        && (u1_Bdirect_tranform_read))
817
33.5k
        {
818
33.5k
            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
819
33.5k
            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
820
33.5k
            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
821
33.5k
        }
822
823
190k
    }
824
825
0
    COPYTHECONTEXT("coded_block_pattern", u4_cbp);
826
190k
    ps_cur_mb_info->u1_cbp = u4_cbp;
827
828
    /* Read mb_qp_delta */
829
190k
    if(u4_cbp)
830
107k
    {
831
107k
        WORD32 i_temp;
832
//inlining ih264d_sev
833
834
107k
        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
835
107k
        UWORD32 u4_word, u4_ldz, u4_abs_val;
836
837
        /***************************************************************/
838
        /* Find leading zeros in next 32 bits                          */
839
        /***************************************************************/
840
107k
        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
841
107k
        u4_ldz = CLZ(u4_word);
842
843
        /* Flush the ps_bitstrm */
844
107k
        u4_bitstream_offset += (u4_ldz + 1);
845
846
        /* Read the suffix from the ps_bitstrm */
847
107k
        u4_word = 0;
848
107k
        if(u4_ldz)
849
92.4k
            GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
850
851
107k
        *pu4_bitstrm_ofst = u4_bitstream_offset;
852
107k
        u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
853
854
107k
        if(u4_word & 0x1)
855
74.6k
            i_temp = (-(WORD32)u4_abs_val);
856
32.7k
        else
857
32.7k
            i_temp = (u4_abs_val);
858
859
107k
        if(i_temp < -26 || i_temp > 25)
860
378
            return ERROR_INV_RANGE_QP_T;
861
//inlinined ih264d_sev
862
107k
        COPYTHECONTEXT("mb_qp_delta", i_temp);
863
107k
        if(i_temp)
864
92.0k
        {
865
92.0k
            ret = ih264d_update_qp(ps_dec, (WORD8)i_temp);
866
92.0k
            if(ret != OK)
867
0
                return ret;
868
92.0k
        }
869
870
107k
        ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0);
871
107k
        if(ret != OK)
872
1.06k
            return ret;
873
105k
        if(EXCEED_OFFSET(ps_bitstrm))
874
701
            return ERROR_EOB_TERMINATE_T;
875
105k
    }
876
82.7k
    else
877
82.7k
    {
878
82.7k
        ps_dec->i1_prev_mb_qp_delta = 0;
879
82.7k
        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
880
82.7k
    }
881
882
187k
    return OK;
883
190k
}
884
885
WORD32 ih264d_mv_pred_ref_tfr_nby2_bmb(dec_struct_t * ps_dec,
886
                                     UWORD32 u4_mb_idx,
887
                                     UWORD32 u4_num_mbs)
888
214k
{
889
214k
    parse_pmbarams_t * ps_mb_part_info;
890
214k
    parse_part_params_t * ps_part;
891
214k
    mv_pred_t *ps_mv_nmb, *ps_mv_nmb_start, *ps_mv_ntop, *ps_mv_ntop_start;
892
214k
    pic_buffer_t * ps_ref_frame;
893
214k
    UWORD8 u1_direct_mode_width;
894
214k
    UWORD32 i;
895
214k
    UWORD8 j;
896
214k
    dec_mb_info_t * ps_cur_mb_info;
897
214k
    const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
898
214k
    UWORD8 u1_field;
899
214k
    WORD32 ret = 0;
900
901
214k
    ps_dec->i4_submb_ofst -= (WORD32)(u4_num_mbs - u4_mb_idx) << 4;
902
214k
    ps_mb_part_info = ps_dec->ps_parse_mb_data;
903
214k
    ps_part = ps_dec->ps_parse_part_params;
904
905
    /* N/2 Mb MvPred and Transfer Setup Loop */
906
6.23M
    for(i = u4_mb_idx; i < u4_num_mbs; i++, ps_mb_part_info++)
907
6.02M
    {
908
6.02M
        UWORD8 u1_colz = 0;
909
6.02M
        ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
910
        /* Restore the slice scratch MbX and MbY context */
911
6.02M
        ps_cur_mb_info = ps_dec->ps_nmb_info + i;
912
913
914
6.02M
        u1_field = ps_cur_mb_info->u1_mb_field_decodingflag;
915
916
6.02M
        ps_mv_nmb_start = ps_dec->ps_mv_cur + (i << 4);
917
6.02M
        ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
918
6.02M
        ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
919
6.02M
        ps_dec->u1_currB_type = 0;
920
6.02M
        ps_dec->u2_mv_2mb[i & 0x1] = 0;
921
922
        /* Look for MV Prediction and Reference Transfer in Non-I Mbs */
923
6.02M
        if(!ps_mb_part_info->u4_isI_mb)
924
6.02M
        {
925
6.02M
            UWORD8 u1_blk_no;
926
6.02M
            WORD16 i1_ref_idx, i1_ref_idx1;
927
6.02M
            UWORD8 u1_pred_mode;
928
6.02M
            UWORD8 u1_sub_mb_x, u1_sub_mb_y, u1_sub_mb_num;
929
6.02M
            UWORD8 u1_lx, u1_lx_start, u1_lxend, u1_tmp_lx;
930
6.02M
            UWORD8 u1_num_part, u1_num_ref, u1_wd, u1_ht;
931
6.02M
            UWORD32 *pu4_wt_offst;
932
6.02M
            UWORD8 u1_scale_ref, u4_bot_mb;
933
6.02M
            deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + i;
934
6.02M
            WORD8 (*pi1_ref_idx)[MAX_REFIDX_INFO_PER_MB] =
935
6.02M
                            ps_mb_part_info->i1_ref_idx;
936
6.02M
            WORD8 *pi1_ref_idx0 = pi1_ref_idx[0],
937
6.02M
                            *pi1_ref_idx1 = pi1_ref_idx[1];
938
6.02M
            UWORD32 **ppu4_wt_ofst = ps_mb_part_info->pu4_wt_offst;
939
940
            /* MB Level initialisations */
941
6.02M
            ps_dec->u4_num_pmbair = i >> u1_mbaff;
942
6.02M
            ps_dec->u4_mb_idx_mv = i;
943
944
            /* CHANGED CODE */
945
6.02M
            ps_mv_ntop_start = ps_mv_nmb_start
946
6.02M
                            - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
947
948
6.02M
            u1_num_part = ps_mb_part_info->u1_num_part;
949
6.02M
            ps_cur_deblk_mb->u1_mb_type |= (u1_num_part > 1) << 1;
950
6.02M
            u1_direct_mode_width = (1 == ps_mb_part_info->u1_num_part) ? 16 : 8;
951
952
953
6.02M
            ps_cur_mb_info->u4_pred_info_pkd_idx = ps_dec->u4_pred_info_pkd_idx;
954
6.02M
            ps_cur_mb_info->u1_num_pred_parts = 0;
955
956
            /****************************************************/
957
            /* weighted u4_ofst pointer calculations, this loop  */
958
            /* runs maximum 4 times, even in direct cases       */
959
            /****************************************************/
960
6.02M
            u1_scale_ref = u1_mbaff & ps_cur_mb_info->u1_mb_field_decodingflag;
961
6.02M
            u4_bot_mb = 1 - ps_cur_mb_info->u1_topmb;
962
6.02M
            if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
963
4.77M
            {
964
4.77M
                u1_num_ref = MIN(u1_num_part, 4);
965
4.77M
                if(PART_DIRECT_16x16 != ps_part->u1_is_direct)
966
176k
                {
967
456k
                    for(u1_blk_no = 0; u1_blk_no < u1_num_ref; u1_blk_no++)
968
279k
                    {
969
279k
                        i1_ref_idx = MAX(pi1_ref_idx0[u1_blk_no], 0);
970
279k
                        if(u1_scale_ref)
971
1.25k
                            i1_ref_idx >>= 1;
972
279k
                        i1_ref_idx *=
973
279k
                                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
974
279k
                        if(u1_scale_ref)
975
1.25k
                            i1_ref_idx +=
976
1.25k
                                            (MAX(pi1_ref_idx1[u1_blk_no], 0)
977
1.25k
                                                            >> 1);
978
278k
                        else
979
278k
                            i1_ref_idx += MAX(pi1_ref_idx1[u1_blk_no], 0);
980
279k
                        pu4_wt_offst = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
981
279k
                                        * X3(i1_ref_idx)];
982
983
279k
                        if(pi1_ref_idx0[u1_blk_no] < 0)
984
145k
                            pu4_wt_offst += 1;
985
986
279k
                        ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
987
279k
                        if(u1_scale_ref
988
1.25k
                                        && (ps_dec->ps_cur_pps->u1_wted_bipred_idc
989
1.25k
                                                        == 2))
990
399
                        {
991
399
                            i1_ref_idx = MAX(pi1_ref_idx0[u1_blk_no], 0);
992
399
                            i1_ref_idx *=
993
399
                                            (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
994
399
                                                            << 1);
995
399
                            i1_ref_idx += MAX(pi1_ref_idx1[u1_blk_no], 0);
996
399
                            if(u4_bot_mb)
997
125
                            {
998
125
                                i1_ref_idx +=
999
125
                                                (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
1000
125
                                                                << 1)
1001
125
                                                                * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
1002
125
                                                                                << 1);
1003
125
                            }
1004
399
                            pu4_wt_offst = (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
1005
399
                                            * X3(i1_ref_idx)];
1006
399
                            ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
1007
399
                        }
1008
279k
                    }
1009
176k
                }
1010
4.77M
            }
1011
1012
            /**************************************************/
1013
            /* Loop on Partitions                             */
1014
            /* direct mode is reflected as a single partition */
1015
            /**************************************************/
1016
12.3M
            for(j = 0; j < u1_num_part; j++, ps_part++)
1017
6.35M
            {
1018
6.35M
                u1_sub_mb_num = ps_part->u1_sub_mb_num;
1019
6.35M
                ps_dec->u1_sub_mb_num = u1_sub_mb_num;
1020
1021
6.35M
                if(PART_NOT_DIRECT != ps_part->u1_is_direct)
1022
5.71M
                {
1023
                    /**************************************************/
1024
                    /* Direct Mode, Call DecodeSpatial/TemporalDirect */
1025
                    /* only (those will in turn call FormMbPartInfo)  */
1026
                    /**************************************************/
1027
5.71M
                    ret = ps_dec->ps_cur_slice->pf_decodeDirect(ps_dec,
1028
5.71M
                                                                u1_direct_mode_width,
1029
5.71M
                                                                ps_cur_mb_info, i);
1030
5.71M
                    if(ret != OK)
1031
0
                        return ret;
1032
5.71M
                    ps_cur_deblk_mb->u1_mb_type |= (ps_dec->u1_currB_type << 1);
1033
1034
5.71M
                }
1035
636k
                else
1036
636k
                {
1037
636k
                    mv_pred_t s_mvPred;
1038
                    /**************************************************/
1039
                    /* Non Direct Mode, Call Motion Vector Predictor  */
1040
                    /* and FormMbpartInfo                             */
1041
                    /**************************************************/
1042
636k
                    u1_sub_mb_x = u1_sub_mb_num & 0x03;
1043
636k
                    u1_sub_mb_y = u1_sub_mb_num >> 2;
1044
636k
                    u1_blk_no =
1045
636k
                                    (u1_num_part < 4) ?
1046
392k
                                                    j :
1047
636k
                                                    (((u1_sub_mb_y >> 1) << 1)
1048
243k
                                                                    + (u1_sub_mb_x
1049
243k
                                                                                    >> 1));
1050
1051
636k
                    ps_mv_ntop = ps_mv_ntop_start + u1_sub_mb_x;
1052
636k
                    ps_mv_nmb = ps_mv_nmb_start + u1_sub_mb_num;
1053
1054
636k
                    u1_pred_mode = ps_part->u1_pred_mode;
1055
636k
                    u1_wd = ps_part->u1_partwidth;
1056
636k
                    u1_ht = ps_part->u1_partheight;
1057
1058
636k
                    u1_lx_start = 0;
1059
636k
                    u1_lxend = 2;
1060
636k
                    if( PRED_L0 == u1_pred_mode)
1061
234k
                    {
1062
234k
                        s_mvPred.i2_mv[2] = 0;
1063
234k
                        s_mvPred.i2_mv[3] = 0;
1064
234k
                        u1_lxend = 1;
1065
234k
                    }
1066
636k
                    if( PRED_L1 == u1_pred_mode)
1067
257k
                    {
1068
257k
                        s_mvPred.i2_mv[0] = 0;
1069
257k
                        s_mvPred.i2_mv[1] = 0;
1070
257k
                        u1_lx_start = 1;
1071
257k
                    }
1072
1073
                    /* Populate the colpic info and reference frames */
1074
636k
                    s_mvPred.i1_ref_frame[0] = pi1_ref_idx0[u1_blk_no];
1075
636k
                    s_mvPred.i1_ref_frame[1] = pi1_ref_idx1[u1_blk_no];
1076
1077
636k
                    ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb, ps_mv_ntop,
1078
636k
                                      &s_mvPred, u1_sub_mb_num, u1_wd,
1079
636k
                                      u1_lx_start, u1_lxend,
1080
636k
                                      ps_cur_mb_info->u1_mb_mc_mode);
1081
1082
                    /**********************************************************/
1083
                    /* Loop on number of predictors, 1 Each for Forw Backw    */
1084
                    /* Loop 2 times for BiDirect mode                         */
1085
                    /**********************************************************/
1086
1.41M
                    for(u1_lx = u1_lx_start; u1_lx < u1_lxend; u1_lx++)
1087
779k
                    {
1088
779k
                        WORD16 i2_mv_x, i2_mv_y;
1089
1090
                        /********************************************************/
1091
                        /* Predict Mv                                           */
1092
                        /* Add Mv Residuals and store back                      */
1093
                        /********************************************************/
1094
779k
                        i1_ref_idx = s_mvPred.i1_ref_frame[u1_lx];
1095
779k
                        u1_tmp_lx = (u1_lx << 1);
1096
1097
779k
                        i2_mv_x = ps_mv_nmb->i2_mv[u1_tmp_lx];
1098
779k
                        i2_mv_y = ps_mv_nmb->i2_mv[u1_tmp_lx + 1];
1099
1100
779k
                        i2_mv_x += s_mvPred.i2_mv[u1_tmp_lx];
1101
779k
                        i2_mv_y += s_mvPred.i2_mv[u1_tmp_lx + 1];
1102
779k
                        s_mvPred.i2_mv[u1_tmp_lx] = i2_mv_x;
1103
779k
                        s_mvPred.i2_mv[u1_tmp_lx + 1] = i2_mv_y;
1104
1105
                        /********************************************************/
1106
                        /* Transfer setup call                                  */
1107
                        /* convert RefIdx if it is MbAff                        */
1108
                        /* Pass Weight Offset and refFrame                      */
1109
                        /********************************************************/
1110
779k
                        i1_ref_idx1 = i1_ref_idx >> u1_scale_ref;
1111
779k
                        if(u1_scale_ref && ((i1_ref_idx & 0x01) != u4_bot_mb))
1112
2.30k
                            i1_ref_idx1 += MAX_REF_BUFS;
1113
779k
                        ps_ref_frame =
1114
779k
                                        ps_dec->ps_ref_pic_buf_lx[u1_lx][i1_ref_idx1];
1115
1116
                        /* Storing Colocated-Zero u4_flag */
1117
779k
                        if(u1_lx == u1_lx_start)
1118
636k
                        {
1119
                            /* Fill colocated info in MvPred structure */
1120
636k
                            s_mvPred.u1_col_ref_pic_idx =
1121
636k
                                            ps_ref_frame->u1_mv_buf_id;
1122
636k
                            s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
1123
1124
                            /* Calculating colocated zero information */
1125
636k
                            u1_colz =
1126
636k
                                            (u1_field << 1)
1127
636k
                                                            | ((i1_ref_idx == 0)
1128
523k
                                                                            && (ABS(i2_mv_x)
1129
523k
                                                                                            <= 1)
1130
212k
                                                                            && (ABS(i2_mv_y)
1131
212k
                                                                                            <= 1));
1132
636k
                            u1_colz |= ps_mb_part_info->u1_col_info[u1_blk_no];
1133
636k
                        }
1134
1135
779k
                        pu4_wt_offst = ppu4_wt_ofst[u1_blk_no];
1136
779k
                        {
1137
779k
                            pred_info_pkd_t *ps_pred_pkd;
1138
779k
                           WORD16 i2_mv[2];
1139
1140
779k
                           i2_mv[0] = i2_mv_x;
1141
779k
                           i2_mv[1] = i2_mv_y;
1142
1143
779k
                           ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
1144
779k
                        ih264d_fill_pred_info(i2_mv,u1_wd,u1_ht,u1_sub_mb_num,u1_pred_mode,
1145
779k
                                        ps_pred_pkd,ps_ref_frame->u1_pic_buf_id,i1_ref_idx,pu4_wt_offst,
1146
779k
                                        ps_ref_frame->u1_pic_type);
1147
779k
                        ps_dec->u4_pred_info_pkd_idx++;
1148
779k
                        ps_cur_mb_info->u1_num_pred_parts++;
1149
1150
1151
779k
                        }
1152
1153
779k
                    }
1154
636k
                    ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb,
1155
636k
                                       u1_sub_mb_num, u1_colz, u1_ht,
1156
636k
                                       u1_wd);
1157
636k
                }
1158
6.35M
            }
1159
1160
6.02M
        }
1161
3.63k
        else
1162
3.63k
        {
1163
            /* Set zero values in case of Intra Mbs */
1164
3.63k
            mv_pred_t s_mvPred =
1165
3.63k
                {
1166
3.63k
                    { 0, 0, 0, 0 },
1167
3.63k
                      { -1, -1 }, 0, 0};
1168
            /* Storing colocated zero information */
1169
3.63k
            ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1170
3.63k
                               (UWORD8)(u1_field << 1), 4, 4);
1171
3.63k
        }
1172
1173
        /*if num _cores is set to 3 ,compute bs will be done in another thread*/
1174
6.02M
        if(ps_dec->u4_num_cores < 3)
1175
1.26M
        {
1176
1.26M
            if(ps_dec->u4_app_disable_deblk_frm == 0)
1177
1.26M
                ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info,
1178
1.26M
                                     (UWORD16)(i >> u1_mbaff));
1179
1.26M
        }
1180
6.02M
    }
1181
214k
    return OK;
1182
214k
}
1183
/*!
1184
 **************************************************************************
1185
 * \if Function name : ih264d_get_implicit_weights \endif
1186
 *
1187
 * \brief
1188
 *    Calculates Implicit Weights.
1189
 *
1190
 * \return
1191
 *    None
1192
 *
1193
 **************************************************************************
1194
 */
1195
void ih264d_get_implicit_weights(dec_struct_t *ps_dec)
1196
32.2k
{
1197
32.2k
    UWORD32 *pu4_iwt_ofst;
1198
32.2k
    UWORD8 i, j;
1199
32.2k
    struct pic_buffer_t *ps_pic_buff0, *ps_pic_buff1;
1200
32.2k
    WORD16 i2_dist_scale_factor;
1201
32.2k
    WORD16 i2_tb, i2_td, i2_tx;
1202
32.2k
    WORD64 i8_tb, i8_td;
1203
32.2k
    WORD32 i4_poc0, i4_poc1;
1204
32.2k
    UWORD32 ui_temp0, ui_temp1;
1205
32.2k
    UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active;
1206
1207
32.2k
    pu4_iwt_ofst = ps_dec->pu4_wts_ofsts_mat;
1208
32.2k
    uc_num_ref_idx_l0_active =
1209
32.2k
                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1210
32.2k
    uc_num_ref_idx_l1_active =
1211
32.2k
                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
1212
1213
109k
    for(i = 0; i < uc_num_ref_idx_l0_active; i++)
1214
77.7k
    {
1215
77.7k
        ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][i];
1216
77.7k
        i4_poc0 = ps_pic_buff0->i4_avg_poc;
1217
251k
        for(j = 0; j < uc_num_ref_idx_l1_active; j++)
1218
173k
        {
1219
173k
            ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][j];
1220
173k
            i4_poc1 = ps_pic_buff1->i4_avg_poc;
1221
1222
173k
            if(i4_poc1 != i4_poc0)
1223
57.2k
            {
1224
57.2k
                i8_tb = (WORD64)ps_dec->ps_cur_pic->i4_poc - i4_poc0;
1225
57.2k
                i2_tb = CLIP_S8(i8_tb);
1226
57.2k
                i8_td = (WORD64)i4_poc1 - i4_poc0;
1227
57.2k
                i2_td = CLIP_S8(i8_td);
1228
57.2k
                i2_tx = (16384 + ABS(SIGN_POW2_DIV(i2_td, 1))) / i2_td;
1229
57.2k
                i2_dist_scale_factor = CLIP_S11(
1230
57.2k
                                            (((i2_tb * i2_tx) + 32) >> 6));
1231
1232
57.2k
                if(/*((u4_poc1 - u4_poc0) == 0) ||*/
1233
57.2k
                (!(ps_pic_buff1->u1_is_short && ps_pic_buff0->u1_is_short))
1234
18.5k
                                || ((i2_dist_scale_factor >> 2) < -64)
1235
17.0k
                                || ((i2_dist_scale_factor >> 2) > 128))
1236
42.0k
                {
1237
                    /* same for forward and backward, wt=32 and Offset = 0 */
1238
42.0k
                    ui_temp0 = 0x00000020;
1239
42.0k
                    ui_temp1 = 0x00000020;
1240
42.0k
                }
1241
15.2k
                else
1242
15.2k
                {
1243
15.2k
                    ui_temp0 = 64 - (i2_dist_scale_factor >> 2);
1244
15.2k
                    ui_temp1 = (i2_dist_scale_factor >> 2);
1245
15.2k
                }
1246
57.2k
            }
1247
116k
            else
1248
116k
            {
1249
116k
                ui_temp0 = 0x00000020;
1250
116k
                ui_temp1 = 0x00000020;
1251
116k
            }
1252
173k
            pu4_iwt_ofst[0] = pu4_iwt_ofst[2] = pu4_iwt_ofst[4] = ui_temp0;
1253
173k
            pu4_iwt_ofst[1] = pu4_iwt_ofst[3] = pu4_iwt_ofst[5] = ui_temp1;
1254
173k
            pu4_iwt_ofst += 6;
1255
173k
        }
1256
77.7k
    }
1257
32.2k
    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1258
348
    {
1259
348
        UWORD8 k;
1260
348
        WORD32 i4_cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1261
348
        UWORD32* pu4_wt_mat = ps_dec->pu4_mbaff_wt_mat;
1262
        /* Form the Implicit Weighted prediction matrix for field MBs also */
1263
1.04k
        for(k = 0; k < 2; k++)
1264
696
        {
1265
4.02k
            for(i = 0; i < (uc_num_ref_idx_l0_active << 1); i++)
1266
3.32k
            {
1267
3.32k
                UWORD16 u2_l0_idx;
1268
1269
                /*u2_l0_idx = (i >= uc_num_ref_idx_l0_active)
1270
                 ?(MAX_REF_BUFS + i - uc_num_ref_idx_l0_active) : (i) ;*/
1271
1272
3.32k
                u2_l0_idx = i >> 1;
1273
3.32k
                if((i & 0x01) != k)
1274
1.66k
                {
1275
1.66k
                    u2_l0_idx += MAX_REF_BUFS;
1276
1.66k
                }
1277
3.32k
                ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u2_l0_idx];
1278
3.32k
                i4_poc0 = ps_pic_buff0->i4_poc;
1279
12.6k
                for(j = 0; j < (uc_num_ref_idx_l1_active << 1); j++)
1280
9.36k
                {
1281
9.36k
                    UWORD16 u2_l1_idx;
1282
                    /*u2_l1_idx = (j >= uc_num_ref_idx_l1_active)
1283
                     ? (MAX_REF_BUFS + j - uc_num_ref_idx_l1_active ) : (j) ;*/
1284
1285
9.36k
                    u2_l1_idx = j >> 1;
1286
9.36k
                    if((j & 0x01) != k)
1287
4.68k
                    {
1288
4.68k
                        u2_l1_idx += MAX_REF_BUFS;
1289
4.68k
                    }
1290
9.36k
                    ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u2_l1_idx];
1291
9.36k
                    i4_poc1 = ps_pic_buff1->i4_poc;
1292
9.36k
                    if(i4_poc1 != i4_poc0)
1293
2.61k
                    {
1294
2.61k
                        i8_tb = (WORD64)i4_cur_poc - i4_poc0;
1295
2.61k
                        i2_tb = CLIP_S8(i8_tb);
1296
2.61k
                        i8_td = (WORD64)i4_poc1 - i4_poc0;
1297
2.61k
                        i2_td = CLIP_S8(i8_td);
1298
2.61k
                        i2_tx = (16384 + ABS(SIGN_POW2_DIV(i2_td, 1)))
1299
2.61k
                                        / i2_td;
1300
2.61k
                        i2_dist_scale_factor = CLIP_S11(
1301
2.61k
                                                    (((i2_tb * i2_tx) + 32) >> 6));
1302
1303
2.61k
                        if(/*((u4_poc1 - u4_poc0) == 0) ||*/
1304
2.61k
                        (!(ps_pic_buff1->u1_is_short && ps_pic_buff0->u1_is_short))
1305
2.34k
                                        || ((i2_dist_scale_factor >> 2) < -64)
1306
2.11k
                                        || ((i2_dist_scale_factor >> 2) > 128))
1307
655
                        {
1308
                            /* same for forward and backward, wt=32 and Offset = 0 */
1309
655
                            ui_temp0 = 0x00000020;
1310
655
                            ui_temp1 = 0x00000020;
1311
655
                        }
1312
1.95k
                        else
1313
1.95k
                        {
1314
1.95k
                            ui_temp0 = 64 - (i2_dist_scale_factor >> 2);
1315
1.95k
                            ui_temp1 = (i2_dist_scale_factor >> 2);
1316
1.95k
                        }
1317
2.61k
                    }
1318
6.75k
                    else
1319
6.75k
                    {
1320
6.75k
                        ui_temp0 = 0x00000020;
1321
6.75k
                        ui_temp1 = 0x00000020;
1322
6.75k
                    }
1323
                    /* Store in the weight matrix */
1324
9.36k
                    *pu4_wt_mat++ = ui_temp0;
1325
9.36k
                    *pu4_wt_mat++ = ui_temp1;
1326
9.36k
                    *pu4_wt_mat++ = ui_temp0;
1327
9.36k
                    *pu4_wt_mat++ = ui_temp1;
1328
9.36k
                    *pu4_wt_mat++ = ui_temp0;
1329
9.36k
                    *pu4_wt_mat++ = ui_temp1;
1330
1331
9.36k
                }
1332
3.32k
            }
1333
696
            i4_cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1334
696
        }
1335
348
    }
1336
32.2k
}
1337
1338
/*!
1339
 **************************************************************************
1340
 * \if Function name : ih264d_decode_bslice \endif
1341
 *
1342
 * \brief
1343
 *    Decodes a B Slice
1344
 *
1345
 *
1346
 * \return
1347
 *    0 on Success and Error code otherwise
1348
 **************************************************************************
1349
 */
1350
WORD32 ih264d_parse_bslice(dec_struct_t * ps_dec, UWORD16 u2_first_mb_in_slice)
1351
5.47k
{
1352
5.47k
    dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
1353
5.47k
    dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
1354
5.47k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1355
5.47k
    UWORD8 u1_ref_idx_re_flag_lx;
1356
5.47k
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1357
5.47k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1358
1359
5.47k
    UWORD64 u8_ref_idx_l0, u8_ref_idx_l1;
1360
5.47k
    UWORD32 u4_temp, ui_temp1;
1361
5.47k
    WORD32 i_temp;
1362
5.47k
    WORD32 ret;
1363
1364
    /*--------------------------------------------------------------------*/
1365
    /* Read remaining contents of the slice header                        */
1366
    /*--------------------------------------------------------------------*/
1367
5.47k
    {
1368
5.47k
        WORD8 *pi1_buf;
1369
5.47k
        WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
1370
5.47k
        WORD32 *pi4_mv = (WORD32*)pi2_mv;
1371
5.47k
        WORD16 *pi16_refFrame;
1372
5.47k
        pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
1373
5.47k
        pi16_refFrame = (WORD16*)pi1_buf;
1374
5.47k
        *pi4_mv = 0;
1375
5.47k
        *(pi4_mv + 1) = 0;
1376
5.47k
        *pi16_refFrame = OUT_OF_RANGE_REF;
1377
5.47k
        ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
1378
5.47k
        ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
1379
5.47k
    }
1380
1381
5.47k
    ps_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
1382
5.47k
                    ps_bitstrm);
1383
5.47k
    COPYTHECONTEXT("SH: num_ref_idx_override_flag",
1384
5.47k
                    ps_slice->u1_num_ref_idx_active_override_flag);
1385
1386
5.47k
    u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
1387
5.47k
    u8_ref_idx_l1 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[1];
1388
5.47k
    if(ps_slice->u1_num_ref_idx_active_override_flag)
1389
2.98k
    {
1390
2.98k
        u8_ref_idx_l0 = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1391
2.98k
        COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
1392
2.98k
                        u8_ref_idx_l0 - 1);
1393
1394
2.98k
        u8_ref_idx_l1 = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1395
2.98k
        COPYTHECONTEXT("SH: num_ref_idx_l1_active_minus1",
1396
2.98k
                        u8_ref_idx_l1 - 1);
1397
2.98k
    }
1398
1399
5.47k
    {
1400
5.47k
        UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS;
1401
5.47k
        if(ps_slice->u1_field_pic_flag)
1402
2.59k
        {
1403
2.59k
            u1_max_ref_idx = H264_MAX_REF_PICS << 1;
1404
2.59k
        }
1405
5.47k
        if((u8_ref_idx_l0 > u1_max_ref_idx) || (u8_ref_idx_l1 > u1_max_ref_idx))
1406
59
        {
1407
59
            return ERROR_NUM_REF;
1408
59
        }
1409
5.41k
        ps_slice->u1_num_ref_idx_lx_active[0] = u8_ref_idx_l0;
1410
5.41k
        ps_slice->u1_num_ref_idx_lx_active[1] = u8_ref_idx_l1;
1411
5.41k
    }
1412
1413
1414
0
    ih264d_init_ref_idx_lx_b(ps_dec);
1415
    /* Store the value for future slices in the same picture */
1416
5.41k
    ps_dec->u1_num_ref_idx_lx_active_prev =
1417
5.41k
                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1418
1419
5.41k
    u1_ref_idx_re_flag_lx = ih264d_get_bit_h264(ps_bitstrm);
1420
5.41k
    COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",u1_ref_idx_re_flag_lx);
1421
1422
    /* Modified temporarily */
1423
5.41k
    if(u1_ref_idx_re_flag_lx)
1424
730
    {
1425
730
        WORD8 ret;
1426
730
        ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
1427
730
        ret = ih264d_ref_idx_reordering(ps_dec, 0);
1428
730
        if(ret == -1)
1429
0
            return ERROR_REFIDX_ORDER_T;
1430
730
    }
1431
4.68k
    else
1432
4.68k
        ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
1433
1434
5.41k
    u1_ref_idx_re_flag_lx = ih264d_get_bit_h264(ps_bitstrm);
1435
5.41k
    COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l1",u1_ref_idx_re_flag_lx);
1436
1437
    /* Modified temporarily */
1438
5.41k
    if(u1_ref_idx_re_flag_lx)
1439
1.00k
    {
1440
1.00k
        WORD8 ret;
1441
1.00k
        ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_mod_dpb[1];
1442
1.00k
        ret = ih264d_ref_idx_reordering(ps_dec, 1);
1443
1.00k
        if(ret == -1)
1444
0
            return ERROR_REFIDX_ORDER_T;
1445
1.00k
    }
1446
4.41k
    else
1447
4.41k
        ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_init_dpb[1];
1448
1449
    /* Create refIdx to POC mapping */
1450
5.41k
    {
1451
5.41k
        void **ppv_map_ref_idx_to_poc_lx;
1452
5.41k
        WORD8 idx;
1453
5.41k
        struct pic_buffer_t *ps_pic;
1454
1455
5.41k
        ppv_map_ref_idx_to_poc_lx = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
1456
5.41k
        ppv_map_ref_idx_to_poc_lx[0] = 0;
1457
5.41k
        ppv_map_ref_idx_to_poc_lx++;
1458
18.2k
        for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1459
12.8k
                        idx++)
1460
12.8k
        {
1461
12.8k
            ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
1462
12.8k
            ppv_map_ref_idx_to_poc_lx[idx] = (ps_pic->pu1_buf1);
1463
12.8k
        }
1464
1465
5.41k
        ppv_map_ref_idx_to_poc_lx = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
1466
1467
5.41k
        ppv_map_ref_idx_to_poc_lx[0] = 0;
1468
5.41k
        ppv_map_ref_idx_to_poc_lx++;
1469
15.1k
        for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
1470
9.74k
                        idx++)
1471
9.74k
        {
1472
9.74k
            ps_pic = ps_dec->ps_ref_pic_buf_lx[1][idx];
1473
9.74k
            ppv_map_ref_idx_to_poc_lx[idx] = (ps_pic->pu1_buf1);
1474
9.74k
        }
1475
1476
5.41k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1477
711
        {
1478
711
            void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
1479
1480
711
            ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
1481
711
                            + TOP_LIST_FLD_L0;
1482
711
            ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
1483
711
                            + BOT_LIST_FLD_L0;
1484
1485
711
            ppv_map_ref_idx_to_poc_lx_t[0] = 0;
1486
711
            ppv_map_ref_idx_to_poc_lx_t++;
1487
711
            ppv_map_ref_idx_to_poc_lx_b[0] = 0;
1488
711
            ppv_map_ref_idx_to_poc_lx_b++;
1489
2.73k
            for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1490
2.02k
                            idx++)
1491
2.02k
            {
1492
2.02k
                ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
1493
2.02k
                ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
1494
2.02k
                ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
1495
1496
2.02k
                ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
1497
2.02k
                ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
1498
1499
2.02k
                ppv_map_ref_idx_to_poc_lx_t += 2;
1500
2.02k
                ppv_map_ref_idx_to_poc_lx_b += 2;
1501
2.02k
            }
1502
1503
711
            ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
1504
711
                            + TOP_LIST_FLD_L1;
1505
711
            ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
1506
711
                            + BOT_LIST_FLD_L1;
1507
1508
711
            ppv_map_ref_idx_to_poc_lx_t[0] = 0;
1509
711
            ppv_map_ref_idx_to_poc_lx_t++;
1510
711
            ppv_map_ref_idx_to_poc_lx_b[0] = 0;
1511
711
            ppv_map_ref_idx_to_poc_lx_b++;
1512
1.81k
            for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
1513
1.10k
                            idx++)
1514
1.10k
            {
1515
1.10k
                UWORD8 u1_tmp_idx = idx << 1;
1516
1.10k
                ps_pic = ps_dec->ps_ref_pic_buf_lx[1][idx];
1517
1.10k
                ppv_map_ref_idx_to_poc_lx_t[u1_tmp_idx] = (ps_pic->pu1_buf1);
1518
1.10k
                ppv_map_ref_idx_to_poc_lx_b[u1_tmp_idx + 1] = (ps_pic->pu1_buf1);
1519
1520
1.10k
                ppv_map_ref_idx_to_poc_lx_b[u1_tmp_idx] = (ps_pic->pu1_buf1) + 1;
1521
1.10k
                ppv_map_ref_idx_to_poc_lx_t[u1_tmp_idx + 1] = (ps_pic->pu1_buf1) + 1;
1522
1523
1.10k
            }
1524
711
        }
1525
1526
5.41k
        if(ps_dec->u4_num_cores >= 3)
1527
2.18k
        {
1528
2.18k
            WORD32 num_entries;
1529
2.18k
            WORD32 size;
1530
2.18k
            num_entries = MAX_FRAMES;
1531
2.18k
            if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
1532
264
                (0 == ps_dec->i4_display_delay))
1533
0
            {
1534
0
                num_entries = 1;
1535
0
            }
1536
1537
2.18k
            num_entries = ((2 * num_entries) + 1);
1538
2.18k
            num_entries *= 2;
1539
1540
2.18k
            size = num_entries * sizeof(void *);
1541
2.18k
            size += PAD_MAP_IDX_POC * sizeof(void *);
1542
1543
2.18k
            memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
1544
2.18k
               ps_dec->ppv_map_ref_idx_to_poc,
1545
2.18k
               size);
1546
2.18k
        }
1547
1548
5.41k
    }
1549
1550
5.41k
    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag
1551
711
                    && (ps_dec->ps_cur_slice->u1_field_pic_flag == 0))
1552
711
    {
1553
711
        ih264d_convert_frm_mbaff_list(ps_dec);
1554
711
    }
1555
1556
5.41k
    if(ps_pps->u1_wted_bipred_idc == 1)
1557
281
    {
1558
281
        ret = ih264d_parse_pred_weight_table(ps_slice, ps_bitstrm);
1559
281
        if(ret != OK)
1560
149
            return ret;
1561
132
        ih264d_form_pred_weight_matrix(ps_dec);
1562
132
        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
1563
132
    }
1564
5.13k
    else if(ps_pps->u1_wted_bipred_idc == 2)
1565
3.87k
    {
1566
        /* Implicit Weighted prediction */
1567
3.87k
        ps_slice->u2_log2Y_crwd = 0x0505;
1568
3.87k
        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
1569
3.87k
        ih264d_get_implicit_weights(ps_dec);
1570
3.87k
    }
1571
1.26k
    else
1572
1.26k
        ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
1573
1574
5.26k
    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
1575
5.26k
                    ps_dec->ps_cur_slice->u2_log2Y_crwd;
1576
1577
    /* G050 */
1578
5.26k
    if(ps_slice->u1_nal_ref_idc != 0)
1579
2.14k
    {
1580
2.14k
        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1581
1.81k
        {
1582
1.81k
            i_temp = ih264d_read_mmco_commands(ps_dec);
1583
1.81k
            if (i_temp < 0)
1584
2
            {
1585
2
                return ERROR_DBP_MANAGER_T;
1586
2
            }
1587
1.81k
            ps_dec->u4_bitoffset = i_temp;
1588
1.81k
        }
1589
335
        else
1590
335
            ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
1591
2.14k
    }
1592
    /* G050 */
1593
1594
5.26k
    if(ps_pps->u1_entropy_coding_mode == CABAC)
1595
3.67k
    {
1596
3.67k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1597
3.67k
        if(u4_temp > MAX_CABAC_INIT_IDC)
1598
279
        {
1599
279
            return ERROR_INV_SLICE_HDR_T;
1600
279
        }
1601
3.39k
        ps_slice->u1_cabac_init_idc = u4_temp;
1602
3.39k
        COPYTHECONTEXT("SH: cabac_init_idc",ps_slice->u1_cabac_init_idc);
1603
3.39k
    }
1604
1605
4.98k
    {
1606
4.98k
        WORD64 i8_temp;
1607
        /* Read slice_qp_delta */
1608
4.98k
        i8_temp = (WORD64)ps_pps->u1_pic_init_qp
1609
4.98k
                            + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1610
4.98k
        if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
1611
239
        {
1612
239
            return ERROR_INV_RANGE_QP_T;
1613
239
        }
1614
4.74k
        ps_slice->u1_slice_qp = i8_temp;
1615
4.74k
        COPYTHECONTEXT("SH: slice_qp_delta",
1616
4.74k
                        (WORD8)(ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
1617
4.74k
    }
1618
1619
4.74k
    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
1620
2.74k
    {
1621
2.74k
        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1622
2.74k
        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
1623
61
        {
1624
61
            return ERROR_INV_SLICE_HDR_T;
1625
2.68k
        } COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
1626
2.68k
        ps_slice->u1_disable_dblk_filter_idc = u4_temp;
1627
2.68k
        if(u4_temp != 1)
1628
2.55k
        {
1629
2.55k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
1630
2.55k
                            << 1;
1631
2.55k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1632
19
            {
1633
19
                return ERROR_INV_SLICE_HDR_T;
1634
19
            }
1635
2.53k
            ps_slice->i1_slice_alpha_c0_offset = i_temp;
1636
2.53k
            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
1637
2.53k
                            ps_slice->i1_slice_alpha_c0_offset >> 1);
1638
1639
2.53k
            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
1640
2.53k
                            << 1;
1641
2.53k
            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1642
17
            {
1643
17
                return ERROR_INV_SLICE_HDR_T;
1644
17
            }
1645
2.52k
            ps_slice->i1_slice_beta_offset = i_temp;
1646
2.52k
            COPYTHECONTEXT("SH: slice_beta_offset_div2",
1647
2.52k
                            ps_slice->i1_slice_beta_offset >> 1);
1648
1649
2.52k
        }
1650
123
        else
1651
123
        {
1652
123
            ps_slice->i1_slice_alpha_c0_offset = 0;
1653
123
            ps_slice->i1_slice_beta_offset = 0;
1654
123
        }
1655
2.68k
    }
1656
2.00k
    else
1657
2.00k
    {
1658
2.00k
        ps_slice->u1_disable_dblk_filter_idc = 0;
1659
2.00k
        ps_slice->i1_slice_alpha_c0_offset = 0;
1660
2.00k
        ps_slice->i1_slice_beta_offset = 0;
1661
2.00k
    }
1662
1663
4.65k
    ps_dec->u1_slice_header_done = 2;
1664
1665
4.65k
    if(ps_pps->u1_entropy_coding_mode)
1666
3.34k
    {
1667
3.34k
        SWITCHOFFTRACE; SWITCHONTRACECABAC;
1668
3.34k
        ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
1669
3.34k
        ps_dec->pf_parse_inter_mb = ih264d_parse_bmb_cabac;
1670
3.34k
        ih264d_init_cabac_contexts(B_SLICE, ps_dec);
1671
1672
3.34k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1673
312
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
1674
3.02k
        else
1675
3.02k
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
1676
3.34k
    }
1677
1.31k
    else
1678
1.31k
    {
1679
1.31k
        SWITCHONTRACE; SWITCHOFFTRACECABAC;
1680
1.31k
        ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
1681
1.31k
        ps_dec->pf_parse_inter_mb = ih264d_parse_bmb_cavlc;
1682
1.31k
        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1683
204
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
1684
1.10k
        else
1685
1.10k
            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
1686
1.31k
    }
1687
1688
4.65k
    ret = ih264d_cal_col_pic(ps_dec);
1689
4.65k
    if(ret != OK)
1690
6
        return ret;
1691
4.64k
    ps_dec->u1_B = 1;
1692
4.64k
    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_bmb;
1693
4.64k
    ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_slice, u2_first_mb_in_slice);
1694
4.64k
    if(ret != OK)
1695
1.17k
        return ret;
1696
3.46k
    return OK;
1697
4.64k
}