Coverage Report

Created: 2026-09-01 06:44

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