Coverage Report

Created: 2025-10-10 06:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/mvc/imvcd_slice_functions.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2021 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
 */
20
21
/*****************************************************************************/
22
/*                                                                           */
23
/*  File Name         : imvcd_slice_functions.c                              */
24
/*                                                                           */
25
/*  Description       : Functions for MVC Slice parsing, etc.                */
26
/*                                                                           */
27
/*****************************************************************************/
28
29
#include "ih264_typedefs.h"
30
#include "ih264_error.h"
31
#include "ih264_buf_mgr.h"
32
#include "ih264d_bitstrm.h"
33
#include "ih264d_deblocking.h"
34
#include "ih264d_debug.h"
35
#include "ih264d_defs.h"
36
#include "ih264d_error_handler.h"
37
#include "ih264d_inter_pred.h"
38
#include "ih264d_mb_utils.h"
39
#include "ih264d_mvpred.h"
40
#include "ih264d_parse_slice.h"
41
#include "ih264d_parse_islice.h"
42
#include "ih264d_process_bslice.h"
43
#include "ih264d_process_pslice.h"
44
#include "ih264d_quant_scaling.h"
45
#include "ih264d_tables.h"
46
#include "ih264d_thread_compute_bs.h"
47
#include "ih264d_thread_parse_decode.h"
48
#include "ih264d_structs.h"
49
#include "ih264d_utils.h"
50
#include "ih264d_api_utils.h"
51
#include "ithread.h"
52
#include "imvc_defs.h"
53
#include "imvcd_dpb_manager.h"
54
#include "imvcd_error_handler.h"
55
#include "imvcd_structs.h"
56
#include "imvcd_utils.h"
57
58
static WORD32 imvcd_set_first_mb_in_slice(dec_struct_t *ps_view_ctxt)
59
128k
{
60
128k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
61
128k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
62
63
128k
    ps_cur_slice->u2_first_mb_in_slice = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
64
65
128k
    if(ps_cur_slice->u2_first_mb_in_slice >=
66
128k
       (ps_view_ctxt->u2_frm_ht_in_mbs * ps_view_ctxt->u2_frm_wd_in_mbs))
67
545
    {
68
545
        return ERROR_CORRUPTED_SLICE;
69
545
    }
70
71
127k
    if(((ps_cur_slice->u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) <=
72
127k
        ps_view_ctxt->u4_cur_mb_addr) &&
73
127k
       (ps_view_ctxt->u4_first_slice_in_pic == 0))
74
7
    {
75
7
        return ERROR_CORRUPTED_SLICE;
76
7
    }
77
78
127k
    COPYTHECONTEXT("SH: first_mb_in_slice", ps_cur_slice->u2_first_mb_in_slice);
79
80
127k
    return OK;
81
127k
}
82
83
static WORD32 imvcd_set_slice_type(dec_struct_t *ps_view_ctxt)
84
127k
{
85
127k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
86
127k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
87
88
127k
    ps_cur_slice->u1_slice_type = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
89
90
127k
    if(ps_cur_slice->u1_slice_type > 9)
91
27
    {
92
27
        return ERROR_INV_SLC_TYPE_T;
93
27
    }
94
95
127k
    if(ps_cur_slice->u1_slice_type > 4)
96
9.11k
    {
97
9.11k
        ps_cur_slice->u1_slice_type -= 5;
98
9.11k
    }
99
100
127k
    COPYTHECONTEXT("SH: slice_type", ps_cur_slice->u1_slice_type);
101
102
127k
    return OK;
103
127k
}
104
105
static WORD32 imvcd_set_cur_pps(dec_struct_t *ps_view_ctxt, UWORD8 *pu1_pps_id)
106
127k
{
107
127k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
108
109
127k
    pu1_pps_id[0] = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
110
111
127k
    ps_view_ctxt->ps_cur_pps = &ps_view_ctxt->ps_pps[pu1_pps_id[0]];
112
127k
    ps_view_ctxt->ps_cur_sps = ps_view_ctxt->ps_pps[pu1_pps_id[0]].ps_sps;
113
114
127k
    if(!ps_view_ctxt->ps_cur_pps->u1_is_valid || !ps_view_ctxt->ps_cur_pps->ps_sps->u1_is_valid)
115
84
    {
116
84
        return ERROR_INV_SLICE_HDR_T;
117
84
    }
118
119
127k
    COPYTHECONTEXT("SH: pps_id", pu1_pps_id[0]);
120
121
127k
    return OK;
122
127k
}
123
124
static WORD32 imvcd_set_frame_num(dec_struct_t *ps_view_ctxt, UWORD8 u1_bits_in_frm_num)
125
127k
{
126
127k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
127
127k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
128
129
127k
    ps_cur_slice->u2_frame_num = ih264d_get_bits_h264(ps_bitstrm, u1_bits_in_frm_num);
130
131
127k
    COPYTHECONTEXT("SH: frame_num", ps_cur_slice->u2_frame_num);
132
133
127k
    return OK;
134
127k
}
135
136
static WORD32 imvcd_set_idr_pic_id(dec_struct_t *ps_view_ctxt, UWORD32 *pu4_idr_pic_id)
137
42.2k
{
138
42.2k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
139
140
42.2k
    pu4_idr_pic_id[0] = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
141
142
42.2k
    if(pu4_idr_pic_id[0] > 65535)
143
82
    {
144
82
        return ERROR_INV_SLICE_HDR_T;
145
82
    }
146
147
42.1k
    COPYTHECONTEXT("SH: idr_pic_id", pu4_idr_pic_id[0]);
148
149
42.1k
    return OK;
150
42.2k
}
151
152
static WORD32 imvcd_set_poc_lsb(dec_struct_t *ps_view_ctxt, WORD32 *pi4_pic_order_cnt_lsb,
153
                                WORD32 i4_max_poc_lsb, UWORD8 u1_log2_max_poc_lsb)
154
36.6k
{
155
36.6k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
156
157
36.6k
    pi4_pic_order_cnt_lsb[0] = ih264d_get_bits_h264(ps_bitstrm, u1_log2_max_poc_lsb);
158
159
36.6k
    if((pi4_pic_order_cnt_lsb[0] < 0) || (pi4_pic_order_cnt_lsb[0] > i4_max_poc_lsb))
160
0
    {
161
0
        return ERROR_INV_SLICE_HDR_T;
162
0
    }
163
164
36.6k
    COPYTHECONTEXT("SH: pic_order_cnt_lsb", pi4_pic_order_cnt_lsb[0]);
165
166
36.6k
    return OK;
167
36.6k
}
168
169
static WORD32 imvcd_set_delta_poc(dec_struct_t *ps_view_ctxt, WORD32 *pi4_delta_poc)
170
37.3k
{
171
37.3k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
172
173
37.3k
    pi4_delta_poc[0] = ih264d_sev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
174
175
37.3k
    COPYTHECONTEXT("SH: delta_pic_order_cnt", pi4_delta_poc[0]);
176
177
37.3k
    return OK;
178
37.3k
}
179
180
static WORD32 imvcd_set_redundant_pic_cnt(dec_struct_t *ps_view_ctxt, UWORD8 *pu1_redundant_pic_cnt)
181
35.2k
{
182
35.2k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
183
184
35.2k
    pu1_redundant_pic_cnt[0] = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
185
186
35.2k
    if(pu1_redundant_pic_cnt[0] > MAX_REDUNDANT_PIC_CNT)
187
13
    {
188
13
        return ERROR_INV_SLICE_HDR_T;
189
13
    }
190
191
35.2k
    COPYTHECONTEXT("SH: redundant_pic_cnt", pu1_redundant_pic_cnt[0]);
192
193
35.2k
    return OK;
194
35.2k
}
195
196
static WORD32 imvcd_set_direct_spatial_mv_pred_flag(dec_struct_t *ps_view_ctxt)
197
28.3k
{
198
28.3k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
199
28.3k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
200
201
28.3k
    ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
202
203
28.3k
    COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag", ps_cur_slice->u1_direct_spatial_mv_pred_flag);
204
205
28.3k
    return OK;
206
28.3k
}
207
208
static WORD32 imvcd_set_ref_idx_override_flag(dec_struct_t *ps_view_ctxt)
209
79.4k
{
210
79.4k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
211
79.4k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
212
213
79.4k
    ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(ps_bitstrm);
214
215
79.4k
    COPYTHECONTEXT("SH: num_ref_idx_override_flag",
216
79.4k
                   ps_cur_slice->u1_num_ref_idx_active_override_flag);
217
218
79.4k
    return OK;
219
79.4k
}
220
221
static WORD32 imvcd_set_num_ref_idx_active(dec_struct_t *ps_view_ctxt, UWORD8 *pu1_num_ref_idx)
222
37.1k
{
223
37.1k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
224
37.1k
    UWORD32 u4_num_ref_idx_m1 = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
225
226
37.1k
    if(u4_num_ref_idx_m1 >= H264_MAX_REF_PICS)
227
79
    {
228
79
        return ERROR_NUM_REF;
229
79
    }
230
231
37.0k
    pu1_num_ref_idx[0] = 1 + u4_num_ref_idx_m1;
232
233
37.0k
    COPYTHECONTEXT("SH: num_ref_idx_lx_active_minus1", u4_num_ref_idx_m1);
234
235
37.0k
    return OK;
236
37.1k
}
237
238
static WORD32 imvcd_set_ref_pic_list_reordering_flag(dec_struct_t *ps_view_ctxt,
239
                                                     UWORD8 *pu1_ref_idx_reorder_flag)
240
107k
{
241
107k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
242
243
107k
    pu1_ref_idx_reorder_flag[0] = ih264d_get_bit_h264(ps_bitstrm);
244
245
107k
    COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_lx", pu1_ref_idx_reorder_flag[0]);
246
247
107k
    return OK;
248
107k
}
249
250
static WORD32 imvcd_set_modification_of_pic_nums_idc(dec_struct_t *ps_view_ctxt,
251
                                                     UWORD8 *pu1_modification_of_pic_nums_idc)
252
13.5k
{
253
13.5k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
254
255
13.5k
    pu1_modification_of_pic_nums_idc[0] = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
256
257
13.5k
    COPYTHECONTEXT("SH: modification_of_pic_nums_idc", pu1_modification_of_pic_nums_idc[0]);
258
259
13.5k
    return OK;
260
13.5k
}
261
262
static WORD32 imvcd_set_abs_diff_pic_num_minus1(dec_struct_t *ps_view_ctxt,
263
                                                WORD32 *pi4_abs_diff_pic_num_minus1)
264
2.61k
{
265
2.61k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
266
267
2.61k
    pi4_abs_diff_pic_num_minus1[0] = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
268
269
2.61k
    COPYTHECONTEXT("SH: abs_diff_pic_num_minus1", pi4_abs_diff_pic_num_minus1[0]);
270
271
2.61k
    return OK;
272
2.61k
}
273
274
static WORD32 imvcd_set_abs_diff_view_idx_minus1(dec_struct_t *ps_view_ctxt,
275
                                                 WORD32 *pi4_abs_diff_view_idx_minus1)
276
3.61k
{
277
3.61k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
278
279
3.61k
    pi4_abs_diff_view_idx_minus1[0] = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
280
281
3.61k
    COPYTHECONTEXT("SH: abs_diff_view_idx_minus1", pi4_abs_diff_view_idx_minus1[0]);
282
283
3.61k
    return OK;
284
3.61k
}
285
286
static WORD32 imvcd_set_long_term_pic_num(dec_struct_t *ps_view_ctxt, WORD32 *pi4_long_term_pic_num)
287
2.04k
{
288
2.04k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
289
290
2.04k
    pi4_long_term_pic_num[0] = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
291
292
2.04k
    COPYTHECONTEXT("SH: long_term_pic_num", pi4_long_term_pic_num[0]);
293
294
2.04k
    return OK;
295
2.04k
}
296
297
static WORD32 imvcd_set_cabac_init_idc(dec_struct_t *ps_view_ctxt)
298
9.43k
{
299
9.43k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
300
9.43k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
301
302
9.43k
    ps_cur_slice->u1_cabac_init_idc = ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
303
304
9.43k
    if(ps_cur_slice->u1_cabac_init_idc > MAX_CABAC_INIT_IDC)
305
16
    {
306
16
        return ERROR_INV_SLICE_HDR_T;
307
16
    }
308
309
9.42k
    COPYTHECONTEXT("SH: cabac_init_idc", ps_cur_slice->u1_cabac_init_idc);
310
311
9.42k
    return OK;
312
9.43k
}
313
314
static WORD32 imvcd_set_slice_qp(dec_struct_t *ps_view_ctxt)
315
78.6k
{
316
78.6k
    WORD8 i1_slice_qp_delta;
317
318
78.6k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
319
78.6k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
320
78.6k
    dec_pic_params_t *ps_cur_pps = ps_view_ctxt->ps_cur_pps;
321
322
78.6k
    i1_slice_qp_delta = ih264d_sev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
323
78.6k
    ps_cur_slice->u1_slice_qp = i1_slice_qp_delta + ps_cur_pps->u1_pic_init_qp;
324
325
78.6k
    if(ps_cur_slice->u1_slice_qp > MAX_H264_QP)
326
78
    {
327
78
        return ERROR_INV_RANGE_QP_T;
328
78
    }
329
330
78.5k
    COPYTHECONTEXT("SH: slice_qp_delta", i1_slice_qp_delta);
331
332
78.5k
    return OK;
333
78.6k
}
334
335
static WORD32 imvcd_set_slice_deblk_params(dec_struct_t *ps_view_ctxt)
336
78.5k
{
337
78.5k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
338
78.5k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
339
78.5k
    dec_pic_params_t *ps_cur_pps = ps_view_ctxt->ps_cur_pps;
340
341
78.5k
    if(ps_cur_pps->u1_deblocking_filter_parameters_present_flag)
342
8.05k
    {
343
8.05k
        ps_cur_slice->u1_disable_dblk_filter_idc =
344
8.05k
            ih264d_uev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
345
346
8.05k
        if(ps_cur_slice->u1_disable_dblk_filter_idc > SLICE_BOUNDARY_DBLK_DISABLED)
347
11
        {
348
11
            return ERROR_INV_SLICE_HDR_T;
349
11
        }
350
351
8.03k
        COPYTHECONTEXT("SH: disable_deblocking_filter_idc",
352
8.03k
                       ps_cur_slice->u1_disable_dblk_filter_idc);
353
354
8.03k
        if(ps_cur_slice->u1_disable_dblk_filter_idc != 1)
355
7.00k
        {
356
7.00k
            ps_cur_slice->i1_slice_alpha_c0_offset =
357
7.00k
                ih264d_sev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer) << 1;
358
359
7.00k
            if((MIN_DBLK_FIL_OFF > ps_cur_slice->i1_slice_alpha_c0_offset) ||
360
7.00k
               (ps_cur_slice->i1_slice_alpha_c0_offset > MAX_DBLK_FIL_OFF))
361
4
            {
362
4
                return ERROR_INV_SLICE_HDR_T;
363
4
            }
364
365
7.00k
            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
366
7.00k
                           ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
367
368
7.00k
            ps_cur_slice->i1_slice_beta_offset =
369
7.00k
                ih264d_sev(&ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer) << 1;
370
371
7.00k
            if((MIN_DBLK_FIL_OFF > ps_cur_slice->i1_slice_beta_offset) ||
372
7.00k
               (ps_cur_slice->i1_slice_beta_offset > MAX_DBLK_FIL_OFF))
373
6
            {
374
6
                return ERROR_INV_SLICE_HDR_T;
375
6
            }
376
377
6.99k
            COPYTHECONTEXT("SH: slice_beta_offset_div2", ps_cur_slice->i1_slice_beta_offset >> 1);
378
6.99k
        }
379
1.03k
        else
380
1.03k
        {
381
1.03k
            ps_cur_slice->i1_slice_alpha_c0_offset = 0;
382
1.03k
            ps_cur_slice->i1_slice_beta_offset = 0;
383
1.03k
        }
384
8.03k
    }
385
70.4k
    else
386
70.4k
    {
387
70.4k
        ps_cur_slice->u1_disable_dblk_filter_idc = 0;
388
70.4k
        ps_cur_slice->i1_slice_alpha_c0_offset = 0;
389
70.4k
        ps_cur_slice->i1_slice_beta_offset = 0;
390
70.4k
    }
391
392
78.5k
    return OK;
393
78.5k
}
394
395
static WORD32 imvcd_set_ref_pic_list_mod_data(mvc_dec_ctxt_t *ps_mvcd_ctxt)
396
79.3k
{
397
79.3k
    WORD32 i4_error_code;
398
79.3k
    WORD32 i;
399
400
79.3k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
401
79.3k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
402
79.3k
    ref_pic_list_mod_data_t *ps_ref_pic_list_mod_data =
403
79.3k
        imvcd_get_cur_ref_pic_list_mod_data(ps_mvcd_ctxt);
404
405
79.3k
    bool b_is_b_pic = ps_cur_slice->u1_slice_type == BSLICE;
406
407
186k
    for(i = 0; i < 1 + ((WORD32) b_is_b_pic); i++)
408
107k
    {
409
107k
        ps_ref_pic_list_mod_data->au1_num_active_refs[i] =
410
107k
            ps_cur_slice->u1_num_ref_idx_lx_active[i];
411
412
107k
        i4_error_code = imvcd_set_ref_pic_list_reordering_flag(
413
107k
            ps_view_ctxt, &ps_ref_pic_list_mod_data->au1_ref_pic_list_modification_flag_lx[i]);
414
415
107k
        if(OK != i4_error_code)
416
0
        {
417
0
            return i4_error_code;
418
0
        }
419
420
107k
        if(ps_ref_pic_list_mod_data->au1_ref_pic_list_modification_flag_lx[i])
421
5.36k
        {
422
5.36k
            UWORD8 *pu1_modification_of_pic_nums_idc =
423
5.36k
                ps_ref_pic_list_mod_data->au1_modification_of_pic_nums_idc[i];
424
5.36k
            WORD32 *pi4_abs_diff_pic_num_minus1 =
425
5.36k
                ps_ref_pic_list_mod_data->ai4_abs_diff_pic_num_minus1[i];
426
5.36k
            WORD32 *pi4_long_term_pic_num = ps_ref_pic_list_mod_data->ai4_long_term_pic_num[i];
427
5.36k
            WORD32 *pi4_abs_diff_view_idx_minus1 =
428
5.36k
                ps_ref_pic_list_mod_data->ai4_abs_diff_view_idx_minus1[i];
429
5.36k
            UWORD32 u4_pic_num_mod_count = 0;
430
431
5.36k
            do
432
13.5k
            {
433
13.5k
                i4_error_code = imvcd_set_modification_of_pic_nums_idc(
434
13.5k
                    ps_view_ctxt, pu1_modification_of_pic_nums_idc);
435
436
13.5k
                if(OK != i4_error_code)
437
0
                {
438
0
                    return i4_error_code;
439
0
                }
440
441
13.5k
                if((0 == pu1_modification_of_pic_nums_idc[0]) ||
442
12.0k
                   (1 == pu1_modification_of_pic_nums_idc[0]))
443
2.61k
                {
444
2.61k
                    i4_error_code = imvcd_set_abs_diff_pic_num_minus1(ps_view_ctxt,
445
2.61k
                                                                      pi4_abs_diff_pic_num_minus1);
446
447
2.61k
                    if(OK != i4_error_code)
448
0
                    {
449
0
                        return i4_error_code;
450
0
                    }
451
2.61k
                }
452
10.9k
                else if(2 == pu1_modification_of_pic_nums_idc[0])
453
2.04k
                {
454
2.04k
                    i4_error_code =
455
2.04k
                        imvcd_set_long_term_pic_num(ps_view_ctxt, pi4_long_term_pic_num);
456
457
2.04k
                    if(OK != i4_error_code)
458
0
                    {
459
0
                        return i4_error_code;
460
0
                    }
461
2.04k
                }
462
8.91k
                else if((4 == pu1_modification_of_pic_nums_idc[0]) ||
463
5.41k
                        (5 == pu1_modification_of_pic_nums_idc[0]))
464
3.61k
                {
465
3.61k
                    i4_error_code = imvcd_set_abs_diff_view_idx_minus1(
466
3.61k
                        ps_view_ctxt, pi4_abs_diff_view_idx_minus1);
467
468
3.61k
                    if(OK != i4_error_code)
469
0
                    {
470
0
                        return i4_error_code;
471
0
                    }
472
3.61k
                }
473
5.29k
                else if(3 != pu1_modification_of_pic_nums_idc[0])
474
70
                {
475
70
                    return ERROR_REFIDX_ORDER_T;
476
70
                }
477
5.22k
                else
478
5.22k
                {
479
5.22k
                    break;
480
5.22k
                }
481
482
8.28k
                pu1_modification_of_pic_nums_idc++;
483
8.28k
                pi4_abs_diff_pic_num_minus1++;
484
8.28k
                pi4_long_term_pic_num++;
485
8.28k
                pi4_abs_diff_view_idx_minus1++;
486
8.28k
                u4_pic_num_mod_count++;
487
488
8.28k
                if(u4_pic_num_mod_count > ps_ref_pic_list_mod_data->au1_num_active_refs[i])
489
67
                {
490
67
                    return ERROR_INV_SLICE_HDR_T;
491
67
                }
492
8.28k
            } while(true);
493
5.36k
        }
494
107k
    }
495
496
79.2k
    return OK;
497
79.3k
}
498
499
static WORD32 imvcd_decode_gaps_in_frame_num(mvc_dec_ctxt_t *ps_mvcd_ctxt)
500
34.3k
{
501
34.3k
    pocstruct_t s_tmp_poc;
502
503
34.3k
    UWORD32 u4_start_frm_num;
504
34.3k
    WORD32 i4_poc;
505
34.3k
    WORD8 i1_gap_idx;
506
34.3k
    WORD8 *pi1_gaps_per_seq;
507
34.3k
    WORD32 i4_error_code;
508
34.3k
    WORD64 i8_display_poc;
509
510
34.3k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
511
34.3k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
512
34.3k
    dec_pic_params_t *ps_pps = ps_view_ctxt->ps_cur_pps;
513
34.3k
    mvc_dpb_manager_t *ps_dpb_mgr = ps_mvcd_ctxt->ps_dpb_mgr;
514
515
34.3k
    UWORD16 u2_frame_num = ps_cur_slice->u2_frame_num;
516
34.3k
    UWORD32 u4_next_frm_num = ps_view_ctxt->u2_prev_ref_frame_num + 1;
517
34.3k
    UWORD32 u4_max_frm_num = ps_view_ctxt->ps_cur_sps->u2_u4_max_pic_num_minus1 + 1;
518
34.3k
    WORD32 *pi4_gaps_start_frm_num = ps_dpb_mgr->ai4_gaps_start_frm_num;
519
34.3k
    bool b_is_idr_slice = imvcd_is_idr_au(ps_mvcd_ctxt);
520
521
34.3k
    if(ps_cur_slice->u1_field_pic_flag)
522
0
    {
523
0
        if(ps_view_ctxt->u2_prev_ref_frame_num == u2_frame_num)
524
0
        {
525
0
            return OK;
526
0
        }
527
0
    }
528
529
34.3k
    if(u4_next_frm_num >= u4_max_frm_num)
530
166
    {
531
166
        u4_next_frm_num -= u4_max_frm_num;
532
166
    }
533
534
34.3k
    if(u4_next_frm_num == u2_frame_num)
535
4.48k
    {
536
4.48k
        return OK;
537
4.48k
    }
538
539
29.8k
    if(b_is_idr_slice && (u4_next_frm_num >= u2_frame_num))
540
1.09k
    {
541
1.09k
        return OK;
542
1.09k
    }
543
544
28.7k
    u4_start_frm_num = u4_next_frm_num;
545
546
28.7k
    s_tmp_poc.i4_pic_order_cnt_lsb = 0;
547
28.7k
    s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
548
28.7k
    s_tmp_poc.i4_pic_order_cnt_lsb = 0;
549
28.7k
    s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
550
28.7k
    s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
551
28.7k
    s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
552
553
38.2k
    for(i1_gap_idx = 0; i1_gap_idx < MAX_FRAMES; i1_gap_idx++)
554
38.2k
    {
555
38.2k
        if(INVALID_FRAME_NUM == pi4_gaps_start_frm_num[i1_gap_idx])
556
28.7k
        {
557
28.7k
            break;
558
28.7k
        }
559
38.2k
    }
560
561
28.7k
    if(MAX_FRAMES == i1_gap_idx)
562
0
    {
563
0
        return ERROR_DBP_MANAGER_T;
564
0
    }
565
566
28.7k
    i4_poc = 0;
567
28.7k
    pi4_gaps_start_frm_num[i1_gap_idx] = u4_start_frm_num;
568
28.7k
    ps_dpb_mgr->ai4_gaps_end_frm_num[i1_gap_idx] = u2_frame_num - 1;
569
28.7k
    pi1_gaps_per_seq = ps_dpb_mgr->ai1_gaps_per_seq;
570
28.7k
    pi1_gaps_per_seq[i1_gap_idx] = 0;
571
572
254k
    while(u4_next_frm_num != u2_frame_num)
573
226k
    {
574
226k
        imvcd_dpb_delete_nonref_nondisplay_pics(ps_dpb_mgr);
575
576
226k
        if(ps_pps->ps_sps->u1_pic_order_cnt_type)
577
187k
        {
578
            /* allocate a picture buffer and insert it as ST node */
579
187k
            i4_error_code =
580
187k
                ih264d_decode_pic_order_cnt(0, u4_next_frm_num, &ps_view_ctxt->s_prev_pic_poc,
581
187k
                                            &s_tmp_poc, ps_cur_slice, ps_pps, 1, 0, 0, &i4_poc);
582
583
187k
            if(i4_error_code != OK)
584
3
            {
585
3
                return i4_error_code;
586
3
            }
587
588
            /* Display seq no calculations */
589
187k
            if(i4_poc >= ps_view_ctxt->i4_max_poc)
590
180k
            {
591
180k
                ps_view_ctxt->i4_max_poc = i4_poc;
592
180k
            }
593
594
            /* IDR Picture or POC wrap around */
595
187k
            if(i4_poc == 0)
596
113k
            {
597
113k
                imvcd_modulate_max_disp_seq(ps_view_ctxt);
598
113k
            }
599
600
187k
            ps_cur_slice->u1_mmco_equalto5 = 0;
601
187k
            ps_cur_slice->u2_frame_num = u4_next_frm_num;
602
187k
        }
603
604
226k
        if(ps_dpb_mgr->i1_poc_buf_id_entries >= ps_view_ctxt->u1_max_dec_frame_buffering)
605
5.84k
        {
606
5.84k
            i4_error_code = imvcd_dpb_assign_display_seq(ps_mvcd_ctxt->ps_dpb_mgr);
607
608
5.84k
            if(i4_error_code != OK)
609
0
            {
610
0
                return i4_error_code;
611
0
            }
612
5.84k
        }
613
614
226k
        i8_display_poc = ((WORD64) ps_view_ctxt->i4_prev_max_display_seq) + ((WORD64) i4_poc);
615
616
226k
        if(IS_OUT_OF_RANGE_S32(i8_display_poc))
617
76
        {
618
76
            ps_view_ctxt->i4_prev_max_display_seq = 0;
619
76
            i8_display_poc = i4_poc;
620
76
        }
621
622
226k
        i4_error_code = imvcd_dpb_insert_pic_in_display_list(ps_dpb_mgr, (WORD32) i8_display_poc,
623
226k
                                                             u4_next_frm_num, DO_NOT_DISP);
624
625
226k
        if(i4_error_code != OK)
626
94
        {
627
94
            return i4_error_code;
628
94
        }
629
630
226k
        pi1_gaps_per_seq[i1_gap_idx]++;
631
632
226k
        i4_error_code =
633
226k
            imvcd_dpb_do_mmco_for_gaps(ps_dpb_mgr, ps_view_ctxt->ps_cur_sps->u1_num_ref_frames);
634
635
226k
        if(i4_error_code != OK)
636
233
        {
637
233
            return i4_error_code;
638
233
        }
639
640
225k
        imvcd_dpb_delete_nonref_nondisplay_pics(ps_dpb_mgr);
641
642
225k
        u4_next_frm_num++;
643
644
225k
        if(u4_next_frm_num >= u4_max_frm_num)
645
442
        {
646
442
            u4_next_frm_num -= u4_max_frm_num;
647
442
        }
648
225k
    }
649
650
28.4k
    return OK;
651
28.7k
}
652
653
static void imvcd_pocstruct_init(dec_struct_t *ps_view_ctxt)
654
113k
{
655
113k
    pocstruct_t *ps_prev_poc = &ps_view_ctxt->s_prev_pic_poc;
656
113k
    pocstruct_t *ps_cur_poc = &ps_view_ctxt->s_cur_pic_poc;
657
658
113k
    ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
659
113k
    ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
660
113k
    ps_prev_poc->u1_mmco_equalto5 = ps_cur_poc->u1_mmco_equalto5;
661
662
113k
    if(ps_view_ctxt->ps_cur_slice->u1_nal_ref_idc)
663
80.9k
    {
664
80.9k
        ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
665
80.9k
        ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
666
80.9k
        ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom;
667
80.9k
        ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0];
668
80.9k
        ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1];
669
80.9k
        ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
670
80.9k
    }
671
113k
}
672
673
static WORD32 imvcd_pic_init(mvc_dec_ctxt_t *ps_mvcd_ctxt, pocstruct_t *ps_cur_poc, WORD32 i4_poc,
674
                             bool b_is_idr_slice)
675
126k
{
676
126k
    WORD32 i4_error_code;
677
126k
    WORD32 i;
678
679
126k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
680
126k
    pocstruct_t *ps_prev_poc = &ps_view_ctxt->s_cur_pic_poc;
681
126k
    dec_slice_params_t *ps_cur_slice = ps_view_ctxt->ps_cur_slice;
682
126k
    dec_pic_params_t *ps_pps = ps_view_ctxt->ps_cur_pps;
683
126k
    dec_seq_params_t *ps_sps = ps_pps->ps_sps;
684
126k
    subset_sps_t *ps_subset_sps = imvcd_get_valid_subset_sps(ps_mvcd_ctxt);
685
126k
    nalu_mvc_ext_t *ps_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
686
126k
    dec_err_status_t *ps_err = ps_view_ctxt->ps_dec_err_status;
687
126k
    prev_seq_params_t *ps_prev_seq_params = &ps_view_ctxt->s_prev_seq_params;
688
689
126k
    UWORD16 u2_num_views = ps_mvcd_ctxt->u2_num_views;
690
126k
    UWORD16 u2_view_order_id = ps_mvcd_ctxt->u2_num_views_decoded;
691
126k
    UWORD16 u2_view_id = ps_nalu_mvc_ext->u2_view_id;
692
126k
    UWORD16 u2_frame_num = ps_cur_slice->u2_frame_num;
693
694
126k
    ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
695
126k
    ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
696
126k
    ps_prev_poc->i4_delta_pic_order_cnt_bottom = ps_cur_poc->i4_delta_pic_order_cnt_bottom;
697
126k
    ps_prev_poc->i4_delta_pic_order_cnt[0] = ps_cur_poc->i4_delta_pic_order_cnt[0];
698
126k
    ps_prev_poc->i4_delta_pic_order_cnt[1] = ps_cur_poc->i4_delta_pic_order_cnt[1];
699
126k
    ps_prev_poc->u1_bot_field = ps_view_ctxt->ps_cur_slice->u1_bottom_field_flag;
700
126k
    ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
701
126k
    ps_prev_poc->u2_frame_num = u2_frame_num;
702
703
126k
    ps_view_ctxt->i1_prev_mb_qp_delta = 0;
704
126k
    ps_view_ctxt->i1_next_ctxt_idx = 0;
705
126k
    ps_view_ctxt->u4_use_intrapred_line_copy = 1;
706
707
126k
    if(ps_view_ctxt->u4_num_cores == 1)
708
50.7k
    {
709
50.7k
        ps_view_ctxt->u4_nmb_deblk = 1;
710
50.7k
    }
711
76.1k
    else
712
76.1k
    {
713
76.1k
        ps_view_ctxt->u4_nmb_deblk = 0;
714
76.1k
    }
715
716
126k
    ps_view_ctxt->u4_app_disable_deblk_frm = 0;
717
126k
    if(ps_view_ctxt->i4_degrade_type && ps_view_ctxt->i4_degrade_pics)
718
0
    {
719
0
        WORD32 i4_degrade_pic = 0;
720
721
0
        ps_view_ctxt->i4_degrade_pic_cnt++;
722
723
        /* If degrade is to be done in all frames, then do not check further */
724
0
        switch(ps_view_ctxt->i4_degrade_pics)
725
0
        {
726
0
            case 4:
727
0
            {
728
0
                i4_degrade_pic = 1;
729
730
0
                break;
731
0
            }
732
0
            case 3:
733
0
            {
734
0
                if(ps_cur_slice->u1_slice_type != I_SLICE)
735
0
                {
736
0
                    i4_degrade_pic = 1;
737
0
                }
738
739
0
                break;
740
0
            }
741
0
            case 2:
742
0
            {
743
0
                if((ps_cur_slice->u1_slice_type != I_SLICE) &&
744
0
                   (ps_view_ctxt->i4_degrade_pic_cnt != ps_view_ctxt->i4_nondegrade_interval))
745
0
                {
746
0
                    i4_degrade_pic = 1;
747
0
                }
748
749
0
                break;
750
0
            }
751
0
            case 1:
752
0
            {
753
0
                if(0 == ps_cur_slice->u1_nal_ref_idc)
754
0
                {
755
0
                    i4_degrade_pic = 1;
756
0
                }
757
758
0
                break;
759
0
            }
760
0
        }
761
762
0
        if(i4_degrade_pic)
763
0
        {
764
0
            if(ps_view_ctxt->i4_degrade_type & 0x2)
765
0
            {
766
0
                ps_view_ctxt->u4_app_disable_deblk_frm = 1;
767
0
            }
768
769
0
            if(0 == ps_cur_slice->u1_nal_ref_idc)
770
0
            {
771
0
                if(ps_view_ctxt->i4_degrade_type & 0x4)
772
0
                {
773
0
                    ps_view_ctxt->i4_mv_frac_mask = 0;
774
0
                }
775
776
0
                if(ps_view_ctxt->i4_degrade_type & 0x8)
777
0
                {
778
0
                    ps_view_ctxt->i4_mv_frac_mask = 0;
779
0
                }
780
0
            }
781
0
        }
782
0
        else
783
0
        {
784
0
            ps_view_ctxt->i4_degrade_pic_cnt = 0;
785
0
        }
786
0
    }
787
788
126k
    if((ps_cur_slice->u1_slice_type == I_SLICE) || (ps_cur_slice->u1_slice_type == SI_SLICE))
789
47.3k
    {
790
47.3k
        ps_err->u1_cur_pic_type = PIC_TYPE_I;
791
47.3k
    }
792
79.5k
    else
793
79.5k
    {
794
79.5k
        ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN;
795
79.5k
    }
796
797
126k
    if(ps_err->u1_pic_aud_i == PIC_TYPE_I)
798
20
    {
799
20
        ps_err->u1_cur_pic_type = PIC_TYPE_I;
800
20
        ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
801
20
    }
802
803
126k
    if(b_is_idr_slice)
804
41.9k
    {
805
41.9k
        if(ps_err->u1_err_flag)
806
0
        {
807
0
            imvcd_reset_dpb(ps_mvcd_ctxt->ps_dpb_mgr);
808
0
        }
809
810
41.9k
        ps_err->u1_err_flag = ACCEPT_ALL_PICS;
811
41.9k
    }
812
813
126k
    if(ps_view_ctxt->u1_init_dec_flag && ps_view_ctxt->s_prev_seq_params.u1_eoseq_pending &&
814
0
       (u2_view_order_id == (u2_num_views - 1)))
815
0
    {
816
0
        imvcd_release_all_ref_and_io_bufs(ps_mvcd_ctxt, MAX_DISP_BUFS_NEW);
817
818
0
        ps_view_ctxt->u1_second_field = 0;
819
0
        ps_view_ctxt->i4_cur_display_seq = 0;
820
0
        ps_view_ctxt->s_prev_seq_params.u1_eoseq_pending = 0;
821
822
0
        imvcd_dpb_set_display_num(ps_mvcd_ctxt->ps_dpb_mgr, 0);
823
0
    }
824
825
126k
    if(0 == u2_view_order_id)
826
125k
    {
827
125k
        imvcd_dpb_set_max_pic_num(ps_mvcd_ctxt->ps_dpb_mgr, ps_sps->u2_u4_max_pic_num_minus1 + 1);
828
125k
        imvcd_dpb_set_num_views(ps_mvcd_ctxt->ps_dpb_mgr, u2_num_views);
829
125k
    }
830
831
126k
    ps_view_ctxt->i4_pic_type = NA_SLICE;
832
126k
    ps_view_ctxt->i4_frametype = IV_NA_FRAME;
833
126k
    ps_view_ctxt->i4_content_type = IV_CONTENTTYPE_NA;
834
835
126k
    ps_sps->u4_max_mb_addr = ps_sps->u2_frm_wd_in_mbs * ps_sps->u2_frm_ht_in_mbs - 1;
836
126k
    ps_view_ctxt->u2_frm_ht_in_mbs = ps_sps->u2_frm_ht_in_mbs;
837
838
126k
    if(!ps_view_ctxt->u1_init_dec_flag)
839
12.1k
    {
840
12.1k
        ps_view_ctxt->u1_max_dec_frame_buffering = ih264d_get_dpb_size(ps_sps);
841
842
12.1k
        ps_view_ctxt->i4_display_delay = ps_view_ctxt->u1_max_dec_frame_buffering;
843
844
12.1k
        if(ps_sps->u1_vui_parameters_present_flag && ps_sps->s_vui.u1_bitstream_restriction_flag)
845
167
        {
846
167
            if(ps_sps->u1_frame_mbs_only_flag)
847
167
            {
848
167
                ps_view_ctxt->i4_display_delay = ps_sps->s_vui.u4_num_reorder_frames + 1;
849
167
            }
850
0
            else
851
0
            {
852
0
                ps_view_ctxt->i4_display_delay = ps_sps->s_vui.u4_num_reorder_frames * 2 + 2;
853
0
            }
854
167
        }
855
856
12.1k
        if(IVD_DECODE_FRAME_OUT == ps_view_ctxt->e_frm_out_mode)
857
0
        {
858
0
            ps_view_ctxt->i4_display_delay = 0;
859
0
        }
860
861
12.1k
        imvcd_dpb_set_display_delay(ps_mvcd_ctxt->ps_dpb_mgr, ps_view_ctxt->i4_display_delay);
862
863
12.1k
        ps_view_ctxt->u1_pic_bufs = ps_view_ctxt->i4_display_delay + ps_sps->u1_num_ref_frames + 1;
864
12.1k
        ps_view_ctxt->u1_pic_bufs += imvcd_get_max_num_ivp_refs(ps_mvcd_ctxt);
865
12.1k
        ps_view_ctxt->u1_pic_bufs = CLIP3(2, MVC_MAX_REF_PICS, ps_view_ctxt->u1_pic_bufs);
866
867
12.1k
        ps_view_ctxt->u1_max_dec_frame_buffering =
868
12.1k
            MIN(ps_view_ctxt->u1_max_dec_frame_buffering, ps_view_ctxt->u1_pic_bufs);
869
870
        /*********************************************************************/
871
        /* Configuring decoder parameters based on level and then            */
872
        /* fresh pointer initialisation in decoder scratch and state buffers */
873
        /*********************************************************************/
874
12.1k
        i4_error_code = ih264d_init_dec_mb_grp(ps_view_ctxt);
875
876
12.1k
        if(i4_error_code != OK)
877
0
        {
878
0
            return i4_error_code;
879
0
        }
880
881
12.1k
        i4_error_code = imvcd_allocate_dynamic_bufs(ps_mvcd_ctxt);
882
883
12.1k
        if(i4_error_code != OK)
884
0
        {
885
0
            imvcd_free_dynamic_bufs(ps_mvcd_ctxt);
886
887
0
            return IVD_MEM_ALLOC_FAILED;
888
0
        }
889
890
12.1k
        i4_error_code = imvcd_init_au_buffers(ps_mvcd_ctxt);
891
892
12.1k
        if(i4_error_code != OK)
893
0
        {
894
0
            return i4_error_code;
895
0
        }
896
897
12.1k
        i4_error_code = imvcd_init_au_mv_pred_bufs(ps_mvcd_ctxt);
898
899
12.1k
        if(i4_error_code != OK)
900
0
        {
901
0
            return i4_error_code;
902
0
        }
903
904
12.1k
        ps_view_ctxt->u1_init_dec_flag = 1;
905
12.1k
        ps_prev_seq_params->u2_frm_wd_in_mbs = ps_sps->u2_frm_wd_in_mbs;
906
12.1k
        ps_prev_seq_params->u1_level_idc = ps_sps->u1_level_idc;
907
12.1k
        ps_prev_seq_params->u1_profile_idc = ps_sps->u1_profile_idc;
908
12.1k
        ps_prev_seq_params->u2_frm_ht_in_mbs = ps_sps->u2_frm_ht_in_mbs;
909
12.1k
        ps_prev_seq_params->u1_frame_mbs_only_flag = ps_sps->u1_frame_mbs_only_flag;
910
12.1k
        ps_prev_seq_params->u1_direct_8x8_inference_flag = ps_sps->u1_direct_8x8_inference_flag;
911
912
12.1k
        ps_view_ctxt->i4_cur_display_seq = 0;
913
12.1k
        ps_view_ctxt->i4_prev_max_display_seq = 0;
914
12.1k
        ps_view_ctxt->i4_max_poc = 0;
915
916
12.1k
        imvcd_dpb_set_display_num(ps_mvcd_ctxt->ps_dpb_mgr, 0);
917
918
12.1k
        {
919
            /* 0th entry of CtxtIncMbMap will be always be containing default values
920
             for CABAC context representing MB not available */
921
12.1k
            ctxt_inc_mb_info_t *p_DefCtxt = ps_view_ctxt->p_ctxt_inc_mb_map - 1;
922
12.1k
            UWORD8 *pu1_temp;
923
924
12.1k
            p_DefCtxt->u1_mb_type = CAB_SKIP;
925
926
12.1k
            p_DefCtxt->u1_cbp = 0x0f;
927
12.1k
            p_DefCtxt->u1_intra_chroma_pred_mode = 0;
928
929
12.1k
            p_DefCtxt->u1_yuv_dc_csbp = 0x7;
930
931
12.1k
            p_DefCtxt->u1_transform8x8_ctxt = 0;
932
933
12.1k
            pu1_temp = (UWORD8 *) p_DefCtxt->i1_ref_idx;
934
60.5k
            for(i = 0; i < 4; i++, pu1_temp++)
935
48.4k
            {
936
48.4k
                (*pu1_temp) = 0;
937
48.4k
            }
938
939
12.1k
            pu1_temp = (UWORD8 *) p_DefCtxt->u1_mv;
940
205k
            for(i = 0; i < 16; i++, pu1_temp++)
941
193k
            {
942
193k
                (*pu1_temp) = 0;
943
193k
            }
944
945
12.1k
            ps_view_ctxt->ps_def_ctxt_mb_info = p_DefCtxt;
946
12.1k
        }
947
12.1k
    }
948
949
    /* reset DBP commands read u4_flag */
950
126k
    ps_view_ctxt->ps_dpb_cmds->u1_dpb_commands_read = 0;
951
952
126k
    ps_view_ctxt->pv_parse_tu_coeff_data = ps_view_ctxt->pv_pic_tu_coeff_data;
953
126k
    ps_view_ctxt->pv_proc_tu_coeff_data = ps_view_ctxt->pv_pic_tu_coeff_data;
954
126k
    ps_view_ctxt->ps_nmb_info = ps_view_ctxt->ps_frm_mb_info;
955
956
126k
    if(ps_view_ctxt->u1_separate_parse)
957
76.1k
    {
958
76.1k
        UWORD32 num_mbs;
959
960
76.1k
        num_mbs = ps_view_ctxt->ps_cur_sps->u4_total_num_of_mbs;
961
962
76.1k
        if(ps_view_ctxt->pu1_dec_mb_map)
963
76.1k
        {
964
76.1k
            memset((void *) ps_view_ctxt->pu1_dec_mb_map, 0, num_mbs);
965
76.1k
        }
966
967
76.1k
        if(ps_view_ctxt->pu1_recon_mb_map)
968
76.1k
        {
969
76.1k
            memset((void *) ps_view_ctxt->pu1_recon_mb_map, 0, num_mbs);
970
76.1k
        }
971
972
76.1k
        if(ps_view_ctxt->pu2_slice_num_map)
973
76.1k
        {
974
76.1k
            memset((void *) ps_view_ctxt->pu2_slice_num_map, 0, (num_mbs * sizeof(UWORD16)));
975
76.1k
        }
976
76.1k
    }
977
978
126k
    ps_view_ctxt->ps_parse_cur_slice = &(ps_view_ctxt->ps_dec_slice_buf[0]);
979
126k
    ps_view_ctxt->ps_decode_cur_slice = &(ps_view_ctxt->ps_dec_slice_buf[0]);
980
126k
    ps_view_ctxt->ps_computebs_cur_slice = &(ps_view_ctxt->ps_dec_slice_buf[0]);
981
126k
    ps_view_ctxt->u2_cur_slice_num = 0;
982
983
126k
    ps_view_ctxt->s_high_profile.u1_scaling_present = 0;
984
126k
    ps_view_ctxt->s_high_profile.u1_transform8x8_present = 0;
985
986
126k
    if(0 == u2_view_order_id)
987
125k
    {
988
125k
        mvc_au_buffer_t *ps_cur_au;
989
125k
        mvc_au_mv_pred_t *ps_au_mv_data;
990
991
125k
        WORD32 i4_pic_buf_id, i4_mv_buf_id;
992
993
125k
        ps_cur_au = (mvc_au_buffer_t *) ih264_buf_mgr_get_next_free(
994
125k
            ps_mvcd_ctxt->s_mvc_au_buf_mgr.ps_buf_mgr_ctxt, &i4_pic_buf_id);
995
996
125k
        if(NULL == ps_cur_au)
997
37
        {
998
37
            return ERROR_UNAVAIL_PICBUF_T;
999
37
        }
1000
125k
        else
1001
125k
        {
1002
            /* Buf will alwys be marked as REF here to ensure IVP works */
1003
            /* If AU nalRefIdc=0, REF status will be removed during endOfAU processing
1004
             */
1005
125k
            ih264_buf_mgr_set_status(ps_mvcd_ctxt->s_mvc_au_buf_mgr.ps_buf_mgr_ctxt, i4_pic_buf_id,
1006
125k
                                     BUF_MGR_IO | BUF_MGR_REF);
1007
125k
        }
1008
1009
125k
        ps_au_mv_data = (mvc_au_mv_pred_t *) ih264_buf_mgr_get_next_free(
1010
125k
            ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.ps_buf_mgr_ctxt, &i4_mv_buf_id);
1011
1012
125k
        if(ps_au_mv_data == NULL)
1013
0
        {
1014
0
            return ERROR_UNAVAIL_MVBUF_T;
1015
0
        }
1016
125k
        else
1017
125k
        {
1018
            /* Buf will alwys be marked as REF here to ensure IVP works */
1019
            /* If AU nalRefIdc=0, REF status will be removed during endOfAU processing
1020
             */
1021
125k
            ih264_buf_mgr_set_status(ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.ps_buf_mgr_ctxt,
1022
125k
                                     i4_mv_buf_id, BUF_MGR_REF);
1023
125k
        }
1024
1025
125k
        ps_mvcd_ctxt->ps_cur_au = ps_cur_au;
1026
1027
125k
        ps_cur_au->s_sei_pic = ps_view_ctxt->ps_sei[0];
1028
1029
125k
        ps_cur_au->i4_mv_buf_id = i4_mv_buf_id;
1030
125k
        ps_cur_au->ps_au_mv_data = ps_au_mv_data;
1031
125k
        ps_cur_au->i4_poc = i4_poc;
1032
125k
        ps_cur_au->i4_avg_poc = i4_poc;
1033
125k
        ps_cur_au->i4_frame_num = u2_frame_num;
1034
125k
        ps_cur_au->i4_pic_num = u2_frame_num;
1035
125k
        ps_cur_au->u4_time_stamp = ps_view_ctxt->u4_ts;
1036
125k
        ps_cur_au->u1_picturetype = FRM_PIC;
1037
125k
        ps_cur_au->u2_disp_width = ps_view_ctxt->u2_disp_width;
1038
125k
        ps_cur_au->u2_disp_height = ps_view_ctxt->u2_disp_height;
1039
1040
125k
        memset(ps_cur_au->au4_pack_slc_typ, 0, sizeof(ps_cur_au->au4_pack_slc_typ));
1041
1042
125k
        ps_mvcd_ctxt->s_mvc_au_buf_mgr.au1_au_buf_id_to_mv_buf_id_map[i4_pic_buf_id] = i4_mv_buf_id;
1043
125k
        ps_mvcd_ctxt->s_mvc_au_buf_mgr.aps_buf_id_to_au_buf_map[i4_pic_buf_id] = ps_cur_au;
1044
125k
        ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.aps_buf_id_to_mv_pred_buf_map[i4_mv_buf_id] =
1045
125k
            ps_au_mv_data;
1046
1047
125k
        ps_view_ctxt->au1_pic_buf_ref_flag[i4_pic_buf_id] = 0;
1048
1049
125k
        ps_cur_au->s_ivp_data.b_is_ivp_ref = false;
1050
1051
125k
        imvcd_dpb_init_au_bufs(ps_mvcd_ctxt->ps_dpb_mgr, ps_cur_au);
1052
125k
    }
1053
1054
126k
    if(u2_view_order_id > 0)
1055
1.39k
    {
1056
1.39k
        ps_mvcd_ctxt->ps_cur_au->as_disp_offsets[u2_view_id] =
1057
1.39k
            ps_mvcd_ctxt->aps_pps_id_to_subset_sps_map[ps_pps->u1_pic_parameter_set_id]
1058
1.39k
                ->s_disp_offsets;
1059
1.39k
    }
1060
125k
    else
1061
125k
    {
1062
        /* Accounting for lihbavc's idiocy */
1063
125k
        ps_mvcd_ctxt->ps_cur_au->as_disp_offsets[u2_view_id].u2_left_offset =
1064
125k
            ps_view_ctxt->u2_crop_offset_y;
1065
125k
        ps_mvcd_ctxt->ps_cur_au->as_disp_offsets[u2_view_id].u2_right_offset = 0;
1066
125k
        ps_mvcd_ctxt->ps_cur_au->as_disp_offsets[u2_view_id].u2_top_offset = 0;
1067
125k
        ps_mvcd_ctxt->ps_cur_au->as_disp_offsets[u2_view_id].u2_bottom_offset = 0;
1068
125k
    }
1069
1070
380k
    for(i = 0; i < 2; i++)
1071
253k
    {
1072
253k
        ps_view_ctxt->ps_ref_pic_buf_lx[i] = imvcd_dpb_get_view_ref_pic_list(
1073
253k
            ps_mvcd_ctxt->ps_dpb_mgr, u2_view_order_id, u2_view_id, i);
1074
1075
253k
        imvcd_set_view_buf_id_to_buf_map(ps_view_ctxt);
1076
253k
    }
1077
1078
126k
    if(ps_mvcd_ctxt->u2_num_views > 1)
1079
2.85k
    {
1080
2.85k
        imvcd_dpb_init_view_bufs(ps_mvcd_ctxt->ps_dpb_mgr, u2_view_order_id, u2_view_id);
1081
1082
2.85k
        imvcd_dpb_init_ivp_ctxt(ps_mvcd_ctxt->ps_dpb_mgr, &ps_subset_sps->s_sps_mvc_ext,
1083
2.85k
                                ps_mvcd_ctxt->as_nalu_mvc_ext);
1084
2.85k
    }
1085
1086
126k
    ps_view_ctxt->u4_pic_buf_got = 1;
1087
126k
    ps_cur_slice->u1_mbaff_frame_flag = 0;
1088
1089
126k
    ps_view_ctxt->ps_cur_mb_row = ps_view_ctxt->ps_nbr_mb_row;
1090
    // Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be
1091
    // valid
1092
126k
    ps_view_ctxt->ps_cur_mb_row += 2;
1093
126k
    ps_view_ctxt->ps_top_mb_row = ps_view_ctxt->ps_nbr_mb_row;
1094
126k
    ps_view_ctxt->ps_top_mb_row += ps_view_ctxt->u2_frm_wd_in_mbs + 2;
1095
    // Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be
1096
    // valid
1097
126k
    ps_view_ctxt->ps_top_mb_row += 2;
1098
126k
    ps_view_ctxt->u4_mb_idx = 0;
1099
126k
    ps_view_ctxt->u4_total_mbs_coded = 0;
1100
126k
    ps_view_ctxt->i4_submb_ofst = -(SUB_BLK_SIZE);
1101
126k
    ps_view_ctxt->i2_prev_slice_mbx = -1;
1102
126k
    ps_view_ctxt->i2_prev_slice_mby = 0;
1103
1104
126k
    ps_view_ctxt->u4_pred_info_idx = 0;
1105
126k
    ps_view_ctxt->u4_pred_info_pkd_idx = 0;
1106
126k
    ps_view_ctxt->ps_part = ps_view_ctxt->ps_parse_part_params;
1107
1108
126k
    ps_view_ctxt->u4_dma_buf_idx = 0;
1109
1110
126k
    ps_view_ctxt->ps_mv_cur = ps_mvcd_ctxt->ps_cur_au->ps_au_mv_data->aps_mvs[u2_view_id];
1111
126k
    ps_view_ctxt->ps_mv_top = ps_view_ctxt->ps_mv_top_p[0];
1112
126k
    ps_view_ctxt->u1_mv_top_p = 0;
1113
126k
    ps_view_ctxt->ps_mv_left = ps_mvcd_ctxt->ps_cur_au->ps_au_mv_data->aps_mvs[u2_view_id];
1114
126k
    ps_view_ctxt->ps_mv = ps_mvcd_ctxt->ps_cur_au->ps_au_mv_data->aps_mvs[u2_view_id];
1115
126k
    ps_view_ctxt->ps_mv_bank_cur = ps_mvcd_ctxt->ps_cur_au->ps_au_mv_data->aps_mvs[u2_view_id];
1116
126k
    ps_view_ctxt->pu1_col_zero_flag =
1117
126k
        ps_mvcd_ctxt->ps_cur_au->ps_au_mv_data->apu1_mode_descriptors[u2_view_id];
1118
126k
    ps_view_ctxt->u2_mv_2mb[0] = 0;
1119
126k
    ps_view_ctxt->u2_mv_2mb[1] = 0;
1120
1121
126k
    ps_view_ctxt->u1_last_pic_not_decoded = 0;
1122
126k
    ps_view_ctxt->u2_cur_slice_num_dec_thread = 0;
1123
126k
    ps_view_ctxt->u2_cur_slice_num_bs = 0;
1124
1125
126k
    ps_view_ctxt->u4_intra_pred_line_ofst = 0;
1126
126k
    ps_view_ctxt->pu1_cur_y_intra_pred_line = ps_view_ctxt->pu1_y_intra_pred_line;
1127
126k
    ps_view_ctxt->pu1_cur_u_intra_pred_line = ps_view_ctxt->pu1_u_intra_pred_line;
1128
126k
    ps_view_ctxt->pu1_cur_v_intra_pred_line = ps_view_ctxt->pu1_v_intra_pred_line;
1129
126k
    ps_view_ctxt->pu1_cur_y_intra_pred_line_base = ps_view_ctxt->pu1_y_intra_pred_line;
1130
126k
    ps_view_ctxt->pu1_cur_u_intra_pred_line_base = ps_view_ctxt->pu1_u_intra_pred_line;
1131
126k
    ps_view_ctxt->pu1_cur_v_intra_pred_line_base = ps_view_ctxt->pu1_v_intra_pred_line;
1132
126k
    ps_view_ctxt->pu1_prev_y_intra_pred_line =
1133
126k
        ps_view_ctxt->pu1_y_intra_pred_line + (ps_view_ctxt->u2_frm_wd_in_mbs * MB_SIZE);
1134
126k
    ps_view_ctxt->pu1_prev_u_intra_pred_line =
1135
126k
        ps_view_ctxt->pu1_u_intra_pred_line +
1136
126k
        ps_view_ctxt->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR;
1137
126k
    ps_view_ctxt->pu1_prev_v_intra_pred_line =
1138
126k
        ps_view_ctxt->pu1_v_intra_pred_line + ps_view_ctxt->u2_frm_wd_in_mbs * BLK8x8SIZE;
1139
1140
126k
    ps_view_ctxt->ps_deblk_mbn = ps_view_ctxt->ps_deblk_pic;
1141
1142
126k
    ps_view_ctxt->pf_compute_bs = ih264d_compute_bs_non_mbaff;
1143
126k
    ps_view_ctxt->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag;
1144
1145
126k
    if(0 == u2_view_order_id)
1146
125k
    {
1147
125k
        imvcd_assign_pic_num(ps_mvcd_ctxt->ps_dpb_mgr, ps_sps->u2_u4_max_pic_num_minus1 + 1,
1148
125k
                             ps_mvcd_ctxt->ps_cur_au->i4_frame_num,
1149
125k
                             ps_sps->u1_gaps_in_frame_num_value_allowed_flag);
1150
1151
125k
        ps_view_ctxt->s_tran_addrecon.u2_mv_top_left_inc = (ps_view_ctxt->u4_recon_mb_grp << 2) - 1;
1152
125k
        ps_view_ctxt->s_tran_addrecon.u2_mv_left_inc = (ps_view_ctxt->u4_recon_mb_grp - 1) << 4;
1153
125k
    }
1154
1155
126k
    if((ps_sps->u1_profile_idc == HIGH_PROFILE_IDC) ||
1156
97.0k
       (ps_sps->u1_profile_idc == MULTIVIEW_HIGH_PROFILE_IDC))
1157
29.8k
    {
1158
29.8k
        if((ps_sps->i4_seq_scaling_matrix_present_flag) ||
1159
23.9k
           (ps_pps->i4_pic_scaling_matrix_present_flag))
1160
10.2k
        {
1161
10.2k
            i4_error_code = ih264d_form_scaling_matrix_picture(ps_sps, ps_pps, ps_view_ctxt);
1162
10.2k
            ps_view_ctxt->s_high_profile.u1_scaling_present = 1;
1163
10.2k
        }
1164
19.5k
        else
1165
19.5k
        {
1166
19.5k
            i4_error_code = ih264d_form_default_scaling_matrix(ps_view_ctxt);
1167
19.5k
        }
1168
1169
29.8k
        if(ps_pps->i4_transform_8x8_mode_flag)
1170
15.8k
        {
1171
15.8k
            ps_view_ctxt->s_high_profile.u1_transform8x8_present = 1;
1172
15.8k
        }
1173
29.8k
    }
1174
97.0k
    else
1175
97.0k
    {
1176
97.0k
        i4_error_code = ih264d_form_default_scaling_matrix(ps_view_ctxt);
1177
97.0k
    }
1178
1179
126k
    if(i4_error_code != OK)
1180
0
    {
1181
0
        return i4_error_code;
1182
0
    }
1183
1184
126k
    ps_view_ctxt->s_high_profile.u1_direct_8x8_inference_flag =
1185
126k
        ps_sps->u1_direct_8x8_inference_flag;
1186
126k
    ps_view_ctxt->s_high_profile.s_cavlc_ctxt = ps_view_ctxt->s_cavlc_ctxt;
1187
1188
126k
    ps_view_ctxt->i1_recon_in_thread3_flag = 1;
1189
1190
126k
    ps_view_ctxt->ps_cur_pic = &ps_view_ctxt->s_cur_pic;
1191
126k
    imvcd_convert_au_buf_to_view_buf(ps_mvcd_ctxt->ps_cur_au, &ps_view_ctxt->s_cur_pic,
1192
126k
                                     u2_view_order_id, u2_view_id);
1193
1194
126k
    ih264d_init_deblk_tfr_ctxt(ps_view_ctxt, &ps_view_ctxt->s_pad_mgr,
1195
126k
                               &ps_view_ctxt->s_tran_addrecon, ps_view_ctxt->u2_frm_wd_in_mbs, 0);
1196
1197
126k
    ps_view_ctxt->ps_frame_buf_ip_recon = &ps_view_ctxt->s_tran_addrecon;
1198
1199
126k
    if(ps_view_ctxt->u1_separate_parse)
1200
76.1k
    {
1201
76.1k
        ps_view_ctxt->s_tran_addrecon_parse = ps_view_ctxt->s_tran_addrecon;
1202
1203
76.1k
        if((ps_view_ctxt->u4_num_cores >= 3) && ps_view_ctxt->i1_recon_in_thread3_flag)
1204
39.5k
        {
1205
39.5k
            ps_view_ctxt->s_tran_iprecon = ps_view_ctxt->s_tran_addrecon;
1206
39.5k
            ps_view_ctxt->ps_frame_buf_ip_recon = &ps_view_ctxt->s_tran_iprecon;
1207
39.5k
        }
1208
76.1k
    }
1209
1210
126k
    ps_view_ctxt->ps_cur_deblk_mb = ps_view_ctxt->ps_deblk_pic;
1211
126k
    ps_view_ctxt->u4_cur_deblk_mb_num = 0;
1212
1213
126k
    ps_view_ctxt->u4_deblk_mb_x = 0;
1214
126k
    ps_view_ctxt->u4_deblk_mb_y = 0;
1215
126k
    ps_view_ctxt->pu4_wt_ofsts = ps_view_ctxt->pu4_wts_ofsts_mat;
1216
1217
126k
    ps_view_ctxt->u4_first_slice_in_pic = 0;
1218
1219
126k
    return OK;
1220
126k
}
1221
1222
static WORD32 imvcd_corrupted_slice_handler(mvc_dec_ctxt_t *ps_mvcd_ctxt)
1223
6.31k
{
1224
6.31k
    dec_mb_info_t *ps_cur_mb_info;
1225
6.31k
    parse_pmbarams_t *ps_parse_mb_data;
1226
6.31k
    deblk_mb_t *ps_cur_deblk_mb;
1227
6.31k
    parse_part_params_t *ps_part_info;
1228
1229
6.31k
    UWORD32 u4_num_mbs_next;
1230
6.31k
    bool b_is_end_of_row;
1231
6.31k
    bool b_is_slice_end;
1232
6.31k
    bool b_tfr_n_mb;
1233
6.31k
    bool b_decode_nmb;
1234
6.31k
    UWORD8 u1_inter_mb_type;
1235
6.31k
    UWORD8 u1_deblk_mb_type;
1236
6.31k
    UWORD16 i2_cur_mb_addr;
1237
6.31k
    UWORD32 u4_mb_skip_run;
1238
6.31k
    WORD32 i, j;
1239
1240
6.31k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
1241
6.31k
    dec_slice_params_t *ps_slice = ps_view_ctxt->ps_cur_slice;
1242
6.31k
    nalu_mvc_ext_t *ps_cur_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
1243
1244
6.31k
    UWORD32 u4_num_mbs = 0;
1245
6.31k
    UWORD32 u4_mb_idx = ps_view_ctxt->u4_mb_idx;
1246
6.31k
    UWORD32 u4_remaining_mbs =
1247
6.31k
        (ps_view_ctxt->ps_cur_sps->u4_max_mb_addr + 1) - ps_view_ctxt->u4_total_mbs_coded;
1248
1249
6.31k
    if(ps_view_ctxt->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
1250
0
    {
1251
0
        imvcd_free_ref_and_io_bufs(&ps_mvcd_ctxt->s_mvc_au_buf_mgr,
1252
0
                                   &ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr,
1253
0
                                   ps_mvcd_ctxt->ps_cur_au->i4_pic_buf_id);
1254
1255
0
        return OK;
1256
0
    }
1257
1258
6.31k
    if((ISLICE == ps_slice->u1_slice_type) || (0 == ps_view_ctxt->u4_total_mbs_coded))
1259
5.49k
    {
1260
5.49k
        yuv_buf_props_t *ps_view_buf =
1261
5.49k
            &ps_mvcd_ctxt->ps_cur_au->as_view_buffers[ps_cur_nalu_mvc_ext->u2_view_id];
1262
1263
16.4k
        for(i = 0; i < NUM_SP_COMPONENTS; i++)
1264
10.9k
        {
1265
10.9k
            buffer_container_t *ps_component_buf = &ps_view_buf->as_component_bufs[i];
1266
1267
10.9k
            bool b_is_chroma = ((COMPONENT_TYPES_T) i) != Y;
1268
10.9k
            UWORD16 u2_height = ps_view_buf->u2_height >> b_is_chroma;
1269
10.9k
            UWORD16 u2_width = ps_view_buf->u2_width;
1270
1271
3.17M
            for(j = 0; j < u2_height; j++)
1272
3.16M
            {
1273
3.16M
                UWORD8 *pu1_data =
1274
3.16M
                    ((UWORD8 *) ps_component_buf->pv_data) + j * ps_component_buf->i4_data_stride;
1275
1276
3.16M
                memset(pu1_data, 128, u2_width * sizeof(pu1_data[0]));
1277
3.16M
            }
1278
10.9k
        }
1279
1280
5.49k
        memset(ps_view_ctxt->apv_buf_id_pic_buf_map, 0,
1281
5.49k
               sizeof(ps_view_ctxt->apv_buf_id_pic_buf_map));
1282
1283
5.49k
        ps_view_ctxt->apv_buf_id_pic_buf_map[ps_mvcd_ctxt->ps_cur_au->i4_pic_buf_id] =
1284
5.49k
            &ps_view_ctxt->s_cur_pic;
1285
5.49k
        ps_view_ctxt->ps_ref_pic_buf_lx[0] = &ps_view_ctxt->ps_cur_pic;
1286
5.49k
        (ps_view_ctxt->ppv_map_ref_idx_to_poc + FRM_LIST_L0)[0] =
1287
5.49k
            ps_view_ctxt->ps_cur_pic->pu1_buf1;
1288
5.49k
        (ps_view_ctxt->ppv_map_ref_idx_to_poc + FRM_LIST_L1)[0] = NULL;
1289
5.49k
    }
1290
1291
6.31k
    ps_view_ctxt->ps_dpb_cmds->u1_long_term_reference_flag = 0;
1292
1293
6.31k
    if(ps_view_ctxt->u4_total_mbs_coded > 0)
1294
2.41k
    {
1295
2.41k
        ps_view_ctxt->u4_total_mbs_coded -=
1296
2.41k
            ps_view_ctxt->u4_total_mbs_coded % ps_view_ctxt->ps_cur_sps->u2_frm_wd_in_mbs;
1297
2.41k
        u4_remaining_mbs =
1298
2.41k
            (ps_view_ctxt->ps_cur_sps->u4_max_mb_addr + 1) - ps_view_ctxt->u4_total_mbs_coded;
1299
1300
103k
        while(ps_view_ctxt->u4_dec_thread_created &&
1301
102k
              (ps_view_ctxt->cur_dec_mb_num < ps_view_ctxt->u4_total_mbs_coded))
1302
100k
        {
1303
100k
            NOP(1 << 10);
1304
100k
        }
1305
1306
145k
        while(ps_view_ctxt->u4_bs_deblk_thread_created &&
1307
144k
              (ps_view_ctxt->cur_recon_mb_num < ps_view_ctxt->u4_total_mbs_coded))
1308
143k
        {
1309
143k
            NOP(1 << 10);
1310
143k
        }
1311
1312
12.4k
        while(ps_view_ctxt->u4_bs_deblk_thread_created &&
1313
10.6k
              (ps_view_ctxt->u4_cur_deblk_mb_num < ps_view_ctxt->u4_total_mbs_coded))
1314
10.0k
        {
1315
10.0k
            NOP(1 << 10);
1316
10.0k
        }
1317
1318
2.41k
        ps_view_ctxt->ps_nmb_info = ps_view_ctxt->ps_frm_mb_info + ps_view_ctxt->u4_total_mbs_coded;
1319
2.41k
        ps_view_ctxt->ps_deblk_mbn = ps_view_ctxt->ps_cur_deblk_mb =
1320
2.41k
            ps_view_ctxt->ps_deblk_pic + ps_view_ctxt->u4_total_mbs_coded;
1321
2.41k
    }
1322
1323
6.31k
    u4_num_mbs = ps_view_ctxt->u4_num_mbs_cur_nmb = 0;
1324
1325
6.31k
    if(ps_view_ctxt->u1_separate_parse)
1326
5.34k
    {
1327
5.34k
        ps_cur_mb_info = ps_view_ctxt->ps_nmb_info;
1328
5.34k
    }
1329
976
    else
1330
976
    {
1331
976
        ps_cur_mb_info = ps_view_ctxt->ps_nmb_info + ps_view_ctxt->u4_num_mbs_prev_nmb - 1;
1332
976
    }
1333
1334
6.31k
    ps_view_ctxt->u2_mby = ps_cur_mb_info->u2_mby;
1335
6.31k
    ps_view_ctxt->u2_mbx = ps_cur_mb_info->u2_mbx;
1336
1337
6.31k
    ps_view_ctxt->u1_mb_ngbr_availablity = ps_cur_mb_info->u1_mb_ngbr_availablity;
1338
1339
6.31k
    if(ps_view_ctxt->u4_total_mbs_coded >= (ps_view_ctxt->ps_cur_sps->u4_max_mb_addr + 1))
1340
0
    {
1341
0
        ps_view_ctxt->u1_pic_decode_done = 1;
1342
1343
0
        return OK;
1344
0
    }
1345
1346
    /******************************************************/
1347
    /* Initializations to new slice                       */
1348
    /******************************************************/
1349
6.31k
    ps_view_ctxt->ps_parse_cur_slice->ppv_map_ref_idx_to_poc =
1350
6.31k
        (volatile void **) ps_view_ctxt->pv_map_ref_idx_to_poc_buf;
1351
6.31k
    ps_slice->i1_slice_alpha_c0_offset = 0;
1352
6.31k
    ps_slice->i1_slice_beta_offset = 0;
1353
6.31k
    ps_slice->u2_first_mb_in_slice = ps_view_ctxt->u4_total_mbs_coded;
1354
6.31k
    ps_view_ctxt->ps_parse_cur_slice->u4_first_mb_in_slice = ps_view_ctxt->u4_total_mbs_coded;
1355
6.31k
    ps_view_ctxt->ps_parse_cur_slice->u2_log2Y_crwd = ps_slice->u2_log2Y_crwd;
1356
1357
6.31k
    if(ps_view_ctxt->u1_separate_parse)
1358
5.34k
    {
1359
5.34k
        ps_view_ctxt->ps_parse_cur_slice->pv_tu_coeff_data_start =
1360
5.34k
            ps_view_ctxt->pv_parse_tu_coeff_data;
1361
5.34k
    }
1362
976
    else
1363
976
    {
1364
976
        ps_view_ctxt->pv_proc_tu_coeff_data = ps_view_ctxt->pv_parse_tu_coeff_data;
1365
976
    }
1366
1367
    /******************************************************/
1368
    /* Initializations specific to P slice                */
1369
    /******************************************************/
1370
6.31k
    u1_inter_mb_type = P_MB;
1371
6.31k
    u1_deblk_mb_type = D_INTER_MB;
1372
1373
6.31k
    ps_slice->u1_slice_type = P_SLICE;
1374
6.31k
    ps_view_ctxt->ps_parse_cur_slice->slice_type = P_SLICE;
1375
6.31k
    ps_view_ctxt->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
1376
6.31k
    ps_view_ctxt->ps_part = ps_view_ctxt->ps_parse_part_params;
1377
6.31k
    ps_view_ctxt->u2_mbx =
1378
6.31k
        MOD((WORD32)ps_view_ctxt->u4_total_mbs_coded - 1, ps_view_ctxt->u2_frm_wd_in_mbs);
1379
6.31k
    ps_view_ctxt->u2_mby =
1380
6.31k
        DIV((WORD32)ps_view_ctxt->u4_total_mbs_coded - 1, ps_view_ctxt->u2_frm_wd_in_mbs);
1381
1382
    /******************************************************/
1383
    /* Parsing / decoding the slice                       */
1384
    /******************************************************/
1385
6.31k
    ps_view_ctxt->u1_qp = ps_slice->u1_slice_qp;
1386
6.31k
    ih264d_update_qp(ps_view_ctxt, 0);
1387
6.31k
    u4_mb_idx = ps_view_ctxt->u4_mb_idx;
1388
6.31k
    ps_parse_mb_data = ps_view_ctxt->ps_parse_mb_data;
1389
6.31k
    u4_num_mbs = u4_mb_idx;
1390
1391
6.31k
    b_is_slice_end = false;
1392
6.31k
    b_tfr_n_mb = false;
1393
6.31k
    b_decode_nmb = false;
1394
6.31k
    i2_cur_mb_addr = ps_view_ctxt->u4_total_mbs_coded;
1395
6.31k
    u4_mb_skip_run = u4_remaining_mbs;
1396
1397
1.37M
    while(!b_is_slice_end)
1398
1.36M
    {
1399
1.36M
        if(i2_cur_mb_addr > ps_view_ctxt->ps_cur_sps->u4_max_mb_addr)
1400
0
        {
1401
0
            break;
1402
0
        }
1403
1404
1.36M
        ps_cur_mb_info = ps_view_ctxt->ps_nmb_info + u4_num_mbs;
1405
1.36M
        ps_view_ctxt->u4_num_mbs_cur_nmb = u4_num_mbs;
1406
1407
1.36M
        ps_cur_mb_info->u1_Mux = 0;
1408
1.36M
        ps_cur_mb_info->u1_end_of_slice = 0;
1409
1410
1.36M
        ps_view_ctxt->u4_num_pmbair = u4_num_mbs;
1411
1.36M
        ps_cur_deblk_mb = ps_view_ctxt->ps_deblk_mbn + u4_num_mbs;
1412
1413
1.36M
        ps_parse_mb_data->u1_num_part = 1;
1414
1.36M
        ps_parse_mb_data->u4_isI_mb = 0;
1415
1416
        /**************************************************************/
1417
        /* Get the required information for decoding of MB            */
1418
        /**************************************************************/
1419
        /* mb_x, mb_y, neighbor availablity, */
1420
1.36M
        ih264d_get_mb_info_cavlc_nonmbaff(ps_view_ctxt, i2_cur_mb_addr, ps_cur_mb_info,
1421
1.36M
                                          u4_mb_skip_run);
1422
1423
1.36M
        if(ps_view_ctxt->u4_app_disable_deblk_frm == 0)
1424
1.36M
        {
1425
1.36M
            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1426
1.36M
                                             ps_view_ctxt->u1_mb_ngbr_availablity,
1427
1.36M
                                             ps_view_ctxt->u1_cur_mb_fld_dec_flag);
1428
1.36M
        }
1429
1430
1.36M
        ps_view_ctxt->i1_prev_mb_qp_delta = 0;
1431
1.36M
        ps_view_ctxt->u1_sub_mb_num = 0;
1432
1.36M
        ps_cur_mb_info->u1_mb_type = MB_SKIP;
1433
1.36M
        ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
1434
1.36M
        ps_cur_mb_info->u1_cbp = 0;
1435
1436
        /* Storing Skip partition info */
1437
1.36M
        ps_part_info = ps_view_ctxt->ps_part;
1438
1.36M
        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1439
1.36M
        ps_part_info->u1_sub_mb_num = 0;
1440
1.36M
        ps_view_ctxt->ps_part++;
1441
1442
        /* Update Nnzs */
1443
1.36M
        ih264d_update_nnz_for_skipmb(ps_view_ctxt, ps_cur_mb_info, CAVLC);
1444
1445
1.36M
        ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1446
1.36M
        ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1447
1448
1.36M
        u4_mb_skip_run--;
1449
1450
1.36M
        ps_cur_deblk_mb->u1_mb_qp = ps_view_ctxt->u1_qp;
1451
1.36M
        ps_cur_deblk_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1452
1453
1.36M
        i2_cur_mb_addr++;
1454
1.36M
        u4_num_mbs++;
1455
1.36M
        ps_parse_mb_data++;
1456
1457
        /****************************************************************/
1458
        /* Check for End Of Row and other flags that determine when to  */
1459
        /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1460
        /* N-Mb                                                         */
1461
        /****************************************************************/
1462
1.36M
        u4_num_mbs_next = ps_view_ctxt->ps_cur_sps->u2_frm_wd_in_mbs - 1 - ps_view_ctxt->u2_mbx;
1463
1.36M
        b_is_end_of_row = (0 == u4_num_mbs_next);
1464
1.36M
        b_is_slice_end = !u4_mb_skip_run;
1465
1.36M
        ps_cur_mb_info->u1_end_of_slice = !u4_mb_skip_run;
1466
1.36M
        b_tfr_n_mb =
1467
1.36M
            (u4_num_mbs == ps_view_ctxt->u4_recon_mb_grp) || b_is_end_of_row || b_is_slice_end;
1468
1.36M
        b_decode_nmb = b_tfr_n_mb || b_is_slice_end;
1469
1470
1.36M
        if(b_decode_nmb)
1471
115k
        {
1472
115k
            ps_view_ctxt->pf_mvpred_ref_tfr_nby2mb(ps_view_ctxt, u4_mb_idx, u4_num_mbs);
1473
1474
115k
            ps_parse_mb_data = ps_view_ctxt->ps_parse_mb_data;
1475
115k
            ps_view_ctxt->ps_part = ps_view_ctxt->ps_parse_part_params;
1476
1477
115k
            if(ps_view_ctxt->u1_separate_parse)
1478
98.2k
            {
1479
98.2k
                ih264d_parse_tfr_nmb(ps_view_ctxt, u4_mb_idx, u4_num_mbs, u4_num_mbs_next,
1480
98.2k
                                     b_tfr_n_mb, b_is_end_of_row);
1481
1482
98.2k
                ps_view_ctxt->ps_nmb_info += u4_num_mbs;
1483
98.2k
            }
1484
16.8k
            else
1485
16.8k
            {
1486
16.8k
                ih264d_decode_recon_tfr_nmb(ps_view_ctxt, u4_mb_idx, u4_num_mbs, u4_num_mbs_next,
1487
16.8k
                                            b_tfr_n_mb, b_is_end_of_row);
1488
16.8k
            }
1489
1490
115k
            ps_view_ctxt->u4_total_mbs_coded += u4_num_mbs;
1491
1492
115k
            if(b_tfr_n_mb)
1493
115k
            {
1494
115k
                u4_num_mbs = 0;
1495
115k
            }
1496
1497
115k
            u4_mb_idx = u4_num_mbs;
1498
115k
            ps_view_ctxt->u4_mb_idx = u4_num_mbs;
1499
115k
        }
1500
1.36M
    }
1501
1502
6.31k
    ps_view_ctxt->u4_num_mbs_cur_nmb = 0;
1503
6.31k
    ps_view_ctxt->i2_prev_slice_mbx = ps_view_ctxt->u2_mbx;
1504
6.31k
    ps_view_ctxt->i2_prev_slice_mby = ps_view_ctxt->u2_mby;
1505
1506
6.31k
    if(ps_view_ctxt->u4_total_mbs_coded >= (ps_view_ctxt->ps_cur_sps->u4_max_mb_addr + 1))
1507
6.31k
    {
1508
6.31k
        ps_view_ctxt->u1_pic_decode_done = 1;
1509
6.31k
    }
1510
1511
6.31k
    return 0;
1512
6.31k
}
1513
1514
static WORD32 imvcd_parse_pslice(mvc_dec_ctxt_t *ps_mvcd_ctxt)
1515
51.1k
{
1516
51.1k
    UWORD8 u1_num_ref_idx_l0, u1_num_ref_idx_l1;
1517
51.1k
    WORD32 i4_error_code;
1518
51.1k
    WORD32 i;
1519
1520
51.1k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
1521
51.1k
    nalu_mvc_ext_t *ps_cur_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
1522
51.1k
    dec_pic_params_t *ps_pps = ps_view_ctxt->ps_cur_pps;
1523
51.1k
    dec_slice_params_t *ps_slice = ps_view_ctxt->ps_cur_slice;
1524
51.1k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
1525
1526
51.1k
    ps_view_ctxt->s_default_mv_pred = imvcd_get_default_mv_pred();
1527
1528
51.1k
    i4_error_code = imvcd_set_ref_idx_override_flag(ps_view_ctxt);
1529
1530
51.1k
    if(OK != i4_error_code)
1531
0
    {
1532
0
        return i4_error_code;
1533
0
    }
1534
1535
51.1k
    if(ps_slice->u1_num_ref_idx_active_override_flag)
1536
25.5k
    {
1537
25.5k
        i4_error_code = imvcd_set_num_ref_idx_active(ps_view_ctxt, &u1_num_ref_idx_l0);
1538
1539
25.5k
        if(OK != i4_error_code)
1540
12
        {
1541
12
            return i4_error_code;
1542
12
        }
1543
25.5k
    }
1544
25.6k
    else
1545
25.6k
    {
1546
25.6k
        u1_num_ref_idx_l0 = ps_view_ctxt->ps_cur_pps->u1_num_ref_idx_lx_active[0];
1547
25.6k
    }
1548
1549
51.1k
    u1_num_ref_idx_l1 = 0;
1550
1551
51.1k
    ps_slice->u1_num_ref_idx_lx_active[0] = u1_num_ref_idx_l0;
1552
51.1k
    ps_slice->u1_num_ref_idx_lx_active[1] = u1_num_ref_idx_l1;
1553
51.1k
    ps_view_ctxt->u1_num_ref_idx_lx_active_prev = ps_slice->u1_num_ref_idx_lx_active[0];
1554
1555
51.1k
    i4_error_code =
1556
51.1k
        imvcd_init_ref_pic_list(ps_mvcd_ctxt->ps_dpb_mgr, ps_cur_nalu_mvc_ext,
1557
51.1k
                                ps_mvcd_ctxt->ps_cur_au, ps_mvcd_ctxt->u2_num_views_decoded);
1558
1559
51.1k
    if(OK != i4_error_code)
1560
12
    {
1561
12
        return i4_error_code;
1562
12
    }
1563
1564
51.1k
    i4_error_code = imvcd_set_ref_pic_list_mod_data(ps_mvcd_ctxt);
1565
1566
51.1k
    if(OK != i4_error_code)
1567
54
    {
1568
54
        return i4_error_code;
1569
54
    }
1570
1571
51.0k
    i4_error_code = imvcd_dpb_reorder_ref_pic_list(
1572
51.0k
        ps_mvcd_ctxt->ps_dpb_mgr, ps_cur_nalu_mvc_ext, ps_mvcd_ctxt->ps_cur_au,
1573
51.0k
        imvcd_get_cur_ref_pic_list_mod_data(ps_mvcd_ctxt), ps_mvcd_ctxt->u2_num_views_decoded);
1574
1575
51.0k
    if(OK != i4_error_code)
1576
123
    {
1577
123
        return i4_error_code;
1578
123
    }
1579
1580
50.9k
    ps_view_ctxt->ps_ref_pic_buf_lx[0] = imvcd_dpb_get_view_ref_pic_list(
1581
50.9k
        ps_mvcd_ctxt->ps_dpb_mgr, ps_mvcd_ctxt->u2_num_views_decoded,
1582
50.9k
        ps_cur_nalu_mvc_ext->u2_view_id, 0);
1583
1584
194k
    for(i = 0; i < u1_num_ref_idx_l0; i++)
1585
144k
    {
1586
144k
        if(NULL == ps_view_ctxt->ps_ref_pic_buf_lx[0][i]->pu1_buf1)
1587
0
        {
1588
0
            return ERROR_FEATURE_UNAVAIL;
1589
0
        }
1590
144k
    }
1591
1592
50.9k
    imvcd_set_view_buf_id_to_buf_map(ps_view_ctxt);
1593
1594
50.9k
    imvcd_init_ref_idx_to_ref_buf_map(ps_mvcd_ctxt);
1595
1596
50.9k
    if(ps_pps->u1_wted_pred_flag)
1597
10.8k
    {
1598
10.8k
        i4_error_code = ih264d_parse_pred_weight_table(ps_slice, ps_bitstrm);
1599
1600
10.8k
        if(i4_error_code != OK)
1601
196
        {
1602
196
            return i4_error_code;
1603
196
        }
1604
1605
10.6k
        ih264d_form_pred_weight_matrix(ps_view_ctxt);
1606
10.6k
    }
1607
40.1k
    else
1608
40.1k
    {
1609
40.1k
        ps_view_ctxt->ps_cur_slice->u2_log2Y_crwd = 0;
1610
40.1k
    }
1611
1612
50.7k
    ps_view_ctxt->pu4_wt_ofsts = ps_view_ctxt->pu4_wts_ofsts_mat;
1613
50.7k
    ps_view_ctxt->ps_parse_cur_slice->u2_log2Y_crwd = ps_view_ctxt->ps_cur_slice->u2_log2Y_crwd;
1614
1615
50.7k
    if(ps_slice->u1_nal_ref_idc != 0)
1616
40.8k
    {
1617
40.8k
        if(!ps_view_ctxt->ps_dpb_cmds->u1_dpb_commands_read)
1618
40.8k
        {
1619
40.8k
            WORD32 i4_bit_offset = ih264d_read_mmco_commands(ps_view_ctxt);
1620
1621
40.8k
            if(i4_bit_offset < 0)
1622
32
            {
1623
32
                return ERROR_DBP_MANAGER_T;
1624
32
            }
1625
1626
40.8k
            ps_view_ctxt->u4_bitoffset = i4_bit_offset;
1627
40.8k
        }
1628
0
        else
1629
0
        {
1630
0
            ps_bitstrm->u4_ofst += ps_view_ctxt->u4_bitoffset;
1631
0
        }
1632
40.8k
    }
1633
1634
50.6k
    if(ps_pps->u1_entropy_coding_mode == CABAC)
1635
5.02k
    {
1636
5.02k
        i4_error_code = imvcd_set_cabac_init_idc(ps_view_ctxt);
1637
1638
5.02k
        if(i4_error_code != OK)
1639
3
        {
1640
3
            return i4_error_code;
1641
3
        }
1642
5.02k
    }
1643
1644
50.6k
    i4_error_code = imvcd_set_slice_qp(ps_view_ctxt);
1645
1646
50.6k
    if(i4_error_code != OK)
1647
23
    {
1648
23
        return i4_error_code;
1649
23
    }
1650
1651
50.6k
    i4_error_code = imvcd_set_slice_deblk_params(ps_view_ctxt);
1652
1653
50.6k
    if(i4_error_code != OK)
1654
6
    {
1655
6
        return i4_error_code;
1656
6
    }
1657
1658
50.6k
    ps_view_ctxt->u1_slice_header_done = 1;
1659
1660
50.6k
    if(ps_pps->u1_entropy_coding_mode)
1661
5.02k
    {
1662
5.02k
        ps_view_ctxt->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
1663
5.02k
        ps_view_ctxt->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
1664
5.02k
        ps_view_ctxt->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
1665
1666
5.02k
        ih264d_init_cabac_contexts(P_SLICE, ps_view_ctxt);
1667
5.02k
    }
1668
45.6k
    else
1669
45.6k
    {
1670
45.6k
        ps_view_ctxt->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
1671
45.6k
        ps_view_ctxt->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
1672
45.6k
        ps_view_ctxt->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
1673
45.6k
    }
1674
1675
50.6k
    ps_view_ctxt->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
1676
1677
50.6k
    ps_view_ctxt->u1_B = 0;
1678
1679
50.6k
    i4_error_code =
1680
50.6k
        ps_view_ctxt->pf_parse_inter_slice(ps_view_ctxt, ps_slice, ps_slice->u2_first_mb_in_slice);
1681
1682
50.6k
    return i4_error_code;
1683
50.6k
}
1684
1685
static WORD32 imvcd_parse_bslice(mvc_dec_ctxt_t *ps_mvcd_ctxt)
1686
28.3k
{
1687
28.3k
    UWORD8 u1_num_ref_idx_l0, u1_num_ref_idx_l1;
1688
28.3k
    WORD32 i4_error_code;
1689
28.3k
    WORD32 i, j;
1690
1691
28.3k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
1692
28.3k
    nalu_mvc_ext_t *ps_cur_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
1693
28.3k
    dec_pic_params_t *ps_pps = ps_view_ctxt->ps_cur_pps;
1694
28.3k
    dec_slice_params_t *ps_slice = ps_view_ctxt->ps_cur_slice;
1695
28.3k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
1696
1697
28.3k
    ps_view_ctxt->s_default_mv_pred = imvcd_get_default_mv_pred();
1698
1699
28.3k
    i4_error_code = imvcd_set_ref_idx_override_flag(ps_view_ctxt);
1700
1701
28.3k
    if(OK != i4_error_code)
1702
0
    {
1703
0
        return i4_error_code;
1704
0
    }
1705
1706
28.3k
    if(ps_slice->u1_num_ref_idx_active_override_flag)
1707
5.85k
    {
1708
5.85k
        i4_error_code = imvcd_set_num_ref_idx_active(ps_view_ctxt, &u1_num_ref_idx_l0);
1709
1710
5.85k
        if(OK != i4_error_code)
1711
49
        {
1712
49
            return i4_error_code;
1713
49
        }
1714
1715
5.80k
        i4_error_code = imvcd_set_num_ref_idx_active(ps_view_ctxt, &u1_num_ref_idx_l1);
1716
1717
5.80k
        if(OK != i4_error_code)
1718
18
        {
1719
18
            return i4_error_code;
1720
18
        }
1721
5.80k
    }
1722
22.5k
    else
1723
22.5k
    {
1724
22.5k
        u1_num_ref_idx_l0 = ps_view_ctxt->ps_cur_pps->u1_num_ref_idx_lx_active[0];
1725
22.5k
        u1_num_ref_idx_l1 = ps_view_ctxt->ps_cur_pps->u1_num_ref_idx_lx_active[1];
1726
22.5k
    }
1727
1728
28.2k
    if((0 == u1_num_ref_idx_l0) || (0 == u1_num_ref_idx_l1))
1729
0
    {
1730
0
        return ERROR_FEATURE_UNAVAIL;
1731
0
    }
1732
1733
28.2k
    ps_slice->u1_num_ref_idx_lx_active[0] = u1_num_ref_idx_l0;
1734
28.2k
    ps_slice->u1_num_ref_idx_lx_active[1] = u1_num_ref_idx_l1;
1735
28.2k
    ps_view_ctxt->u1_num_ref_idx_lx_active_prev =
1736
28.2k
        ps_view_ctxt->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1737
1738
28.2k
    i4_error_code =
1739
28.2k
        imvcd_init_ref_pic_list(ps_mvcd_ctxt->ps_dpb_mgr, ps_cur_nalu_mvc_ext,
1740
28.2k
                                ps_mvcd_ctxt->ps_cur_au, ps_mvcd_ctxt->u2_num_views_decoded);
1741
1742
28.2k
    if(OK != i4_error_code)
1743
19
    {
1744
19
        return i4_error_code;
1745
19
    }
1746
1747
28.2k
    i4_error_code = imvcd_set_ref_pic_list_mod_data(ps_mvcd_ctxt);
1748
1749
28.2k
    if(OK != i4_error_code)
1750
83
    {
1751
83
        return i4_error_code;
1752
83
    }
1753
1754
28.1k
    i4_error_code = imvcd_dpb_reorder_ref_pic_list(
1755
28.1k
        ps_mvcd_ctxt->ps_dpb_mgr, ps_cur_nalu_mvc_ext, ps_mvcd_ctxt->ps_cur_au,
1756
28.1k
        imvcd_get_cur_ref_pic_list_mod_data(ps_mvcd_ctxt), ps_mvcd_ctxt->u2_num_views_decoded);
1757
1758
28.1k
    if(OK != i4_error_code)
1759
65
    {
1760
65
        return i4_error_code;
1761
65
    }
1762
1763
84.3k
    for(i = 0; i < 2; i++)
1764
56.2k
    {
1765
56.2k
        ps_view_ctxt->ps_ref_pic_buf_lx[i] = imvcd_dpb_get_view_ref_pic_list(
1766
56.2k
            ps_mvcd_ctxt->ps_dpb_mgr, ps_mvcd_ctxt->u2_num_views_decoded,
1767
56.2k
            ps_cur_nalu_mvc_ext->u2_view_id, i);
1768
1769
240k
        for(j = 0; j < ps_slice->u1_num_ref_idx_lx_active[i]; j++)
1770
184k
        {
1771
184k
            if(NULL == ps_view_ctxt->ps_ref_pic_buf_lx[i][j]->pu1_buf1)
1772
0
            {
1773
0
                return ERROR_FEATURE_UNAVAIL;
1774
0
            }
1775
184k
        }
1776
56.2k
    }
1777
1778
28.1k
    imvcd_set_view_buf_id_to_buf_map(ps_view_ctxt);
1779
1780
28.1k
    imvcd_init_ref_idx_to_ref_buf_map(ps_mvcd_ctxt);
1781
1782
28.1k
    if(ps_pps->u1_wted_bipred_idc == 1)
1783
729
    {
1784
729
        i4_error_code = ih264d_parse_pred_weight_table(ps_slice, ps_bitstrm);
1785
1786
729
        if(i4_error_code != OK)
1787
113
        {
1788
113
            return i4_error_code;
1789
113
        }
1790
1791
616
        ih264d_form_pred_weight_matrix(ps_view_ctxt);
1792
1793
616
        ps_view_ctxt->pu4_wt_ofsts = ps_view_ctxt->pu4_wts_ofsts_mat;
1794
616
    }
1795
27.3k
    else if(ps_pps->u1_wted_bipred_idc == 2)
1796
13.1k
    {
1797
        /* Implicit Weighted prediction */
1798
13.1k
        ps_slice->u2_log2Y_crwd = 0x0505;
1799
13.1k
        ps_view_ctxt->pu4_wt_ofsts = ps_view_ctxt->pu4_wts_ofsts_mat;
1800
1801
13.1k
        ih264d_get_implicit_weights(ps_view_ctxt);
1802
13.1k
    }
1803
14.2k
    else
1804
14.2k
    {
1805
14.2k
        ps_view_ctxt->ps_cur_slice->u2_log2Y_crwd = 0;
1806
14.2k
    }
1807
1808
28.0k
    ps_view_ctxt->ps_parse_cur_slice->u2_log2Y_crwd = ps_view_ctxt->ps_cur_slice->u2_log2Y_crwd;
1809
1810
28.0k
    if(ps_slice->u1_nal_ref_idc != 0)
1811
15.2k
    {
1812
15.2k
        if(!ps_view_ctxt->ps_dpb_cmds->u1_dpb_commands_read)
1813
15.2k
        {
1814
15.2k
            WORD32 i4_bit_offset = ih264d_read_mmco_commands(ps_view_ctxt);
1815
1816
15.2k
            if(i4_bit_offset < 0)
1817
74
            {
1818
74
                return ERROR_DBP_MANAGER_T;
1819
74
            }
1820
1821
15.1k
            ps_view_ctxt->u4_bitoffset = i4_bit_offset;
1822
15.1k
        }
1823
0
        else
1824
0
        {
1825
0
            ps_bitstrm->u4_ofst += ps_view_ctxt->u4_bitoffset;
1826
0
        }
1827
15.2k
    }
1828
1829
27.9k
    if(ps_pps->u1_entropy_coding_mode == CABAC)
1830
4.40k
    {
1831
4.40k
        i4_error_code = imvcd_set_cabac_init_idc(ps_view_ctxt);
1832
1833
4.40k
        if(i4_error_code != OK)
1834
13
        {
1835
13
            return i4_error_code;
1836
13
        }
1837
4.40k
    }
1838
1839
27.9k
    i4_error_code = imvcd_set_slice_qp(ps_view_ctxt);
1840
1841
27.9k
    if(i4_error_code != OK)
1842
55
    {
1843
55
        return i4_error_code;
1844
55
    }
1845
1846
27.8k
    i4_error_code = imvcd_set_slice_deblk_params(ps_view_ctxt);
1847
1848
27.8k
    if(i4_error_code != OK)
1849
15
    {
1850
15
        return i4_error_code;
1851
15
    }
1852
1853
27.8k
    ps_view_ctxt->u1_slice_header_done = 1;
1854
1855
27.8k
    if(ps_pps->u1_entropy_coding_mode)
1856
4.39k
    {
1857
4.39k
        ps_view_ctxt->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
1858
4.39k
        ps_view_ctxt->pf_parse_inter_mb = ih264d_parse_bmb_cabac;
1859
4.39k
        ps_view_ctxt->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
1860
1861
4.39k
        ih264d_init_cabac_contexts(B_SLICE, ps_view_ctxt);
1862
4.39k
    }
1863
23.4k
    else
1864
23.4k
    {
1865
23.4k
        ps_view_ctxt->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
1866
23.4k
        ps_view_ctxt->pf_parse_inter_mb = ih264d_parse_bmb_cavlc;
1867
23.4k
        ps_view_ctxt->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
1868
23.4k
    }
1869
1870
27.8k
    i4_error_code = ih264d_cal_col_pic(ps_view_ctxt);
1871
1872
27.8k
    if(i4_error_code != OK)
1873
0
    {
1874
0
        return i4_error_code;
1875
0
    }
1876
1877
27.8k
    ps_view_ctxt->u1_B = 1;
1878
1879
27.8k
    ps_view_ctxt->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_bmb;
1880
1881
27.8k
    i4_error_code =
1882
27.8k
        ps_view_ctxt->pf_parse_inter_slice(ps_view_ctxt, ps_slice, ps_slice->u2_first_mb_in_slice);
1883
1884
27.8k
    return i4_error_code;
1885
27.8k
}
1886
1887
static WORD32 imvcd_parse_islice(mvc_dec_ctxt_t *ps_mvcd_ctxt)
1888
47.3k
{
1889
47.3k
    WORD32 i4_error_code;
1890
1891
47.3k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
1892
1893
47.3k
    i4_error_code =
1894
47.3k
        ih264d_parse_islice(ps_view_ctxt, ps_view_ctxt->ps_cur_slice->u2_first_mb_in_slice);
1895
1896
47.3k
    return i4_error_code;
1897
47.3k
}
1898
1899
static WORD32 imvcd_finish_slice_decode(mvc_dec_ctxt_t *ps_mvcd_ctxt)
1900
126k
{
1901
126k
    WORD32 i;
1902
1903
126k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
1904
126k
    dec_err_status_t *ps_err = ps_view_ctxt->ps_dec_err_status;
1905
1906
126k
    UWORD16 u2_view_order_id = ps_mvcd_ctxt->u2_num_views_decoded;
1907
126k
    UWORD16 u2_num_views = ps_mvcd_ctxt->u2_num_views;
1908
1909
126k
    imvcd_dpb_reset_ivp_ctxt(ps_mvcd_ctxt->ps_dpb_mgr);
1910
1911
    /* End of Picture detection */
1912
126k
    if(ps_view_ctxt->u4_total_mbs_coded >= (ps_view_ctxt->ps_cur_sps->u4_max_mb_addr + 1))
1913
120k
    {
1914
120k
        ps_view_ctxt->u1_pic_decode_done = 1;
1915
120k
    }
1916
6.31k
    else
1917
6.31k
    {
1918
6.31k
        imvcd_corrupted_slice_handler(ps_mvcd_ctxt);
1919
1920
6.31k
        return ERROR_CORRUPTED_SLICE;
1921
6.31k
    }
1922
1923
120k
    if((ps_view_ctxt->u1_slice_header_done) && (u2_view_order_id == (u2_num_views - 1)))
1924
119k
    {
1925
119k
        ps_view_ctxt->u1_first_slice_in_stream = 0;
1926
119k
    }
1927
1928
120k
    if((ps_mvcd_ctxt->au1_nal_ref_idc[u2_view_order_id] != 0) && (0 == u2_view_order_id))
1929
87.1k
    {
1930
87.1k
        if(!ps_view_ctxt->ps_dpb_cmds->u1_dpb_commands_read)
1931
87.1k
        {
1932
87.1k
            ps_view_ctxt->ps_dpb_cmds[0] = ps_view_ctxt->s_dpb_cmds_scratch;
1933
87.1k
        }
1934
87.1k
    }
1935
1936
    /* storing last Mb X and MbY of the slice */
1937
120k
    ps_view_ctxt->i2_prev_slice_mbx = ps_view_ctxt->u2_mbx;
1938
120k
    ps_view_ctxt->i2_prev_slice_mby = ps_view_ctxt->u2_mby;
1939
1940
120k
    if((ps_err->u1_err_flag & REJECT_PB_PICS) && (ps_err->u1_cur_pic_type == PIC_TYPE_I))
1941
0
    {
1942
0
        ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1943
0
    }
1944
1945
    /* Accounting for idiocy in 'ih264d_parse_sps' */
1946
120k
    if(u2_view_order_id > 0)
1947
1.35k
    {
1948
1.99k
        for(i = 0; i < MAX_NUM_SEQ_PARAMS; i++)
1949
1.97k
        {
1950
1.97k
            if(ps_view_ctxt->ps_sps->u1_is_valid)
1951
1.33k
            {
1952
1.33k
                ps_view_ctxt->ps_cur_sps = ps_view_ctxt->ps_sps;
1953
1954
1.33k
                break;
1955
1.33k
            }
1956
1.97k
        }
1957
1.35k
    }
1958
1959
120k
    return OK;
1960
126k
}
1961
1962
WORD32 imvcd_parse_decode_slice(mvc_dec_ctxt_t *ps_mvcd_ctxt)
1963
128k
{
1964
128k
    dec_pic_params_t *ps_pps;
1965
128k
    dec_seq_params_t *ps_sps;
1966
128k
    dec_slice_params_t *ps_cur_slice;
1967
1968
128k
    WORD32 i4_error_code;
1969
128k
    UWORD8 u1_pps_id;
1970
128k
    UWORD8 u1_pic_order_cnt_type;
1971
1972
128k
    dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
1973
128k
    nalu_mvc_ext_t *ps_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
1974
128k
    dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
1975
128k
    pocstruct_t s_tmp_poc = {0};
1976
128k
    dec_err_status_t *ps_err = ps_view_ctxt->ps_dec_err_status;
1977
1978
128k
    WORD32 ai4_delta_poc[2] = {0};
1979
128k
    WORD32 i4_poc = 0;
1980
128k
    UWORD32 u4_idr_pic_id = 0;
1981
128k
    UWORD16 u2_view_id = ps_nalu_mvc_ext->u2_view_id;
1982
128k
    UWORD16 u2_view_order_id = ps_mvcd_ctxt->u2_num_views_decoded;
1983
128k
    bool b_is_idr_slice = imvcd_is_idr_au(ps_mvcd_ctxt);
1984
128k
    UWORD16 u2_num_views = ps_mvcd_ctxt->u2_num_views;
1985
128k
    UWORD8 u1_redundant_pic_cnt = 0;
1986
128k
    const UWORD8 u1_field_pic_flag = 0;
1987
128k
    const UWORD8 u1_bottom_field_flag = 0;
1988
1989
128k
    ps_view_ctxt->ps_cur_slice = ps_cur_slice = &ps_mvcd_ctxt->as_slices[u2_view_id];
1990
128k
    ps_view_ctxt->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
1991
1992
128k
    ps_cur_slice->u1_nal_unit_type = ps_mvcd_ctxt->ae_nalu_id[u2_view_order_id];
1993
128k
    ps_cur_slice->u1_nal_ref_idc = ps_mvcd_ctxt->au1_nal_ref_idc[u2_view_order_id];
1994
1995
128k
    i4_error_code = imvcd_set_first_mb_in_slice(ps_view_ctxt);
1996
1997
128k
    if(OK != i4_error_code)
1998
552
    {
1999
552
        return i4_error_code;
2000
552
    }
2001
2002
127k
    i4_error_code = imvcd_set_slice_type(ps_view_ctxt);
2003
2004
127k
    if(OK != i4_error_code)
2005
27
    {
2006
27
        return i4_error_code;
2007
27
    }
2008
2009
127k
    i4_error_code = imvcd_set_cur_pps(ps_view_ctxt, &u1_pps_id);
2010
2011
127k
    if(OK != i4_error_code)
2012
84
    {
2013
84
        return i4_error_code;
2014
84
    }
2015
2016
127k
    ps_pps = ps_view_ctxt->ps_cur_pps;
2017
127k
    ps_sps = ps_view_ctxt->ps_cur_sps;
2018
2019
127k
    i4_error_code = imvcd_set_frame_num(ps_view_ctxt, ps_sps->u1_bits_in_frm_num);
2020
2021
127k
    if(OK != i4_error_code)
2022
0
    {
2023
0
        return i4_error_code;
2024
0
    }
2025
2026
127k
    if(!ps_view_ctxt->u1_first_slice_in_stream && ps_view_ctxt->u4_first_slice_in_pic)
2027
115k
    {
2028
115k
        ps_view_ctxt->u2_mbx = 0xffff;
2029
115k
        ps_view_ctxt->u2_mby = 0;
2030
115k
        ps_view_ctxt->u4_total_mbs_coded = 0;
2031
2032
115k
        if(0 == u2_view_order_id)
2033
113k
        {
2034
113k
            if(b_is_idr_slice || ps_cur_slice->u1_mmco_equalto5)
2035
35.9k
            {
2036
35.9k
                ps_view_ctxt->u2_prev_ref_frame_num = 0;
2037
35.9k
            }
2038
2039
113k
            if(ps_view_ctxt->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
2040
34.3k
            {
2041
34.3k
                i4_error_code = imvcd_decode_gaps_in_frame_num(ps_mvcd_ctxt);
2042
2043
34.3k
                if(OK != i4_error_code)
2044
330
                {
2045
330
                    return i4_error_code;
2046
330
                }
2047
34.3k
            }
2048
2049
113k
            if(!b_is_idr_slice && ps_cur_slice->u1_nal_ref_idc)
2050
60.9k
            {
2051
60.9k
                ps_view_ctxt->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
2052
60.9k
            }
2053
2054
113k
            imvcd_pocstruct_init(ps_view_ctxt);
2055
113k
        }
2056
115k
    }
2057
2058
127k
    if(b_is_idr_slice)
2059
42.2k
    {
2060
42.2k
        i4_error_code = imvcd_set_idr_pic_id(ps_view_ctxt, &u4_idr_pic_id);
2061
2062
42.2k
        if(OK != i4_error_code)
2063
82
        {
2064
82
            return i4_error_code;
2065
82
        }
2066
2067
        /* 'ih264d_read_mmco_commands' asssumes AVC semantics */
2068
42.1k
        ps_view_ctxt->u1_nal_unit_type = SLICE_IDR;
2069
42.1k
    }
2070
85.2k
    else
2071
85.2k
    {
2072
85.2k
        ps_view_ctxt->u1_nal_unit_type = SLICE_NON_IDR;
2073
85.2k
    }
2074
2075
127k
    u1_pic_order_cnt_type = ps_sps->u1_pic_order_cnt_type;
2076
2077
127k
    if(0 == u1_pic_order_cnt_type)
2078
36.6k
    {
2079
36.6k
        i4_error_code = imvcd_set_poc_lsb(ps_view_ctxt, &s_tmp_poc.i4_pic_order_cnt_lsb,
2080
36.6k
                                          ps_sps->i4_max_pic_order_cntLsb,
2081
36.6k
                                          ps_sps->u1_log2_max_pic_order_cnt_lsb_minus);
2082
2083
36.6k
        if(OK != i4_error_code)
2084
0
        {
2085
0
            return i4_error_code;
2086
0
        }
2087
2088
36.6k
        if(ps_pps->u1_pic_order_present_flag)
2089
14.6k
        {
2090
14.6k
            i4_error_code =
2091
14.6k
                imvcd_set_delta_poc(ps_view_ctxt, &s_tmp_poc.i4_delta_pic_order_cnt_bottom);
2092
2093
14.6k
            if(OK != i4_error_code)
2094
0
            {
2095
0
                return i4_error_code;
2096
0
            }
2097
14.6k
        }
2098
36.6k
    }
2099
2100
127k
    if((1 == u1_pic_order_cnt_type) && !ps_sps->u1_delta_pic_order_always_zero_flag)
2101
12.7k
    {
2102
12.7k
        i4_error_code = imvcd_set_delta_poc(ps_view_ctxt, &s_tmp_poc.i4_delta_pic_order_cnt[0]);
2103
2104
12.7k
        if(OK != i4_error_code)
2105
0
        {
2106
0
            return i4_error_code;
2107
0
        }
2108
2109
12.7k
        if(ps_pps->u1_pic_order_present_flag)
2110
9.94k
        {
2111
9.94k
            i4_error_code = imvcd_set_delta_poc(ps_view_ctxt, &s_tmp_poc.i4_delta_pic_order_cnt[1]);
2112
2113
9.94k
            if(OK != i4_error_code)
2114
0
            {
2115
0
                return i4_error_code;
2116
0
            }
2117
9.94k
        }
2118
12.7k
    }
2119
2120
127k
    if(ps_pps->u1_redundant_pic_cnt_present_flag)
2121
35.2k
    {
2122
35.2k
        i4_error_code = imvcd_set_redundant_pic_cnt(ps_view_ctxt, &u1_redundant_pic_cnt);
2123
2124
35.2k
        if(OK != i4_error_code)
2125
13
        {
2126
13
            return i4_error_code;
2127
13
        }
2128
35.2k
    }
2129
2130
127k
    ps_view_ctxt->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
2131
2132
127k
    ps_view_ctxt->u1_slice_header_done = 0;
2133
2134
127k
    if(ps_view_ctxt->u4_first_slice_in_pic)
2135
127k
    {
2136
127k
        i4_error_code = ih264d_decode_pic_order_cnt(
2137
127k
            b_is_idr_slice, ps_cur_slice->u2_frame_num, &ps_view_ctxt->s_prev_pic_poc, &s_tmp_poc,
2138
127k
            ps_cur_slice, ps_pps, ps_mvcd_ctxt->au1_nal_ref_idc[u2_view_order_id],
2139
127k
            u1_bottom_field_flag, u1_field_pic_flag, &i4_poc);
2140
2141
127k
        if(i4_error_code != OK)
2142
66
        {
2143
66
            return i4_error_code;
2144
66
        }
2145
2146
        /* Display seq no calculations */
2147
127k
        if(i4_poc >= ps_view_ctxt->i4_max_poc)
2148
93.5k
        {
2149
93.5k
            ps_view_ctxt->i4_max_poc = i4_poc;
2150
93.5k
        }
2151
2152
        /* IDR Picture or POC wrap around */
2153
127k
        if(i4_poc == 0)
2154
75.5k
        {
2155
75.5k
            imvcd_modulate_max_disp_seq(ps_view_ctxt);
2156
75.5k
        }
2157
127k
    }
2158
2159
127k
    if((0 == i4_poc) && (ps_mvcd_ctxt->ae_nalu_id[u2_view_order_id] == SLICE_IDR) &&
2160
42.0k
       (ps_cur_slice->u1_slice_type != ISLICE))
2161
28
    {
2162
28
        return ERROR_INV_SLICE_HDR_T;
2163
28
    }
2164
2165
    /*--------------------------------------------------------------------*/
2166
    /* Copy the values read from the bitstream to the slice header and then*/
2167
    /* If the slice is first slice in picture, then do Start of Picture   */
2168
    /* processing.                                                        */
2169
    /*--------------------------------------------------------------------*/
2170
127k
    ps_cur_slice->i4_delta_pic_order_cnt[0] = ai4_delta_poc[0];
2171
127k
    ps_cur_slice->i4_delta_pic_order_cnt[1] = ai4_delta_poc[1];
2172
127k
    ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
2173
127k
    ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
2174
127k
    ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
2175
127k
    ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
2176
127k
    ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
2177
127k
    ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
2178
127k
    ps_cur_slice->i4_poc = i4_poc;
2179
2180
127k
    ps_cur_slice->u1_direct_8x8_inference_flag = ps_sps->u1_direct_8x8_inference_flag;
2181
2182
127k
    if(IV_SUCCESS != imvcd_view_error_checks(ps_mvcd_ctxt))
2183
398
    {
2184
398
        return ERROR_INV_SLICE_HDR_T;
2185
398
    }
2186
2187
126k
    if(ps_cur_slice->u1_slice_type == B_SLICE)
2188
28.3k
    {
2189
28.3k
        i4_error_code = imvcd_set_direct_spatial_mv_pred_flag(ps_view_ctxt);
2190
2191
28.3k
        if(OK != i4_error_code)
2192
0
        {
2193
0
            return i4_error_code;
2194
0
        }
2195
2196
28.3k
        if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
2197
12.9k
        {
2198
12.9k
            ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct;
2199
12.9k
        }
2200
15.4k
        else
2201
15.4k
        {
2202
15.4k
            ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
2203
15.4k
        }
2204
2205
28.3k
        ps_view_ctxt->pf_mvpred = ih264d_mvpred_nonmbaffB;
2206
28.3k
    }
2207
98.5k
    else
2208
98.5k
    {
2209
98.5k
        ps_view_ctxt->pf_mvpred = ih264d_mvpred_nonmbaff;
2210
98.5k
    }
2211
2212
126k
    if(ps_view_ctxt->u4_first_slice_in_pic)
2213
126k
    {
2214
126k
        if(0 == ps_cur_slice->u2_first_mb_in_slice)
2215
126k
        {
2216
126k
            i4_error_code = imvcd_pic_init(ps_mvcd_ctxt, &s_tmp_poc, i4_poc, b_is_idr_slice);
2217
2218
126k
            if(i4_error_code != OK)
2219
37
            {
2220
37
                return i4_error_code;
2221
37
            }
2222
126k
        }
2223
0
        else
2224
0
        {
2225
0
            return ERROR_INV_SLICE_HDR_T;
2226
0
        }
2227
2228
126k
        ps_view_ctxt->u4_output_present = 0;
2229
2230
126k
        if(u2_view_order_id == (u2_num_views - 1))
2231
125k
        {
2232
125k
            if(IV_SUCCESS == imvcd_get_next_display_au_buf(ps_mvcd_ctxt))
2233
89.4k
            {
2234
89.4k
                ps_view_ctxt->u4_output_present = 1;
2235
89.4k
            }
2236
125k
        }
2237
2238
126k
        if(!imvcd_dpb_is_diff_poc_valid(ps_mvcd_ctxt->ps_dpb_mgr, ps_cur_slice->i4_poc))
2239
56
        {
2240
56
            return ERROR_INV_SLICE_HDR_T;
2241
56
        }
2242
2243
126k
        if(ps_view_ctxt->u1_separate_parse == 1)
2244
76.0k
        {
2245
76.0k
            if(!ps_view_ctxt->u4_dec_thread_created)
2246
76.0k
            {
2247
76.0k
                ithread_create(ps_view_ctxt->pv_dec_thread_handle, NULL,
2248
76.0k
                               ih264d_decode_picture_thread, ps_view_ctxt);
2249
2250
76.0k
                ps_view_ctxt->u4_dec_thread_created = 1;
2251
76.0k
            }
2252
2253
76.0k
            if((3 == ps_view_ctxt->u4_num_cores) &&
2254
39.4k
               (!ps_view_ctxt->u4_app_disable_deblk_frm ||
2255
0
                ps_view_ctxt->i1_recon_in_thread3_flag) &&
2256
39.4k
               !ps_view_ctxt->u4_bs_deblk_thread_created)
2257
39.4k
            {
2258
39.4k
                ps_view_ctxt->u4_start_recon_deblk = 0;
2259
2260
39.4k
                ithread_create(ps_view_ctxt->pv_bs_deblk_thread_handle, NULL,
2261
39.4k
                               ih264d_recon_deblk_thread, ps_view_ctxt);
2262
2263
39.4k
                ps_view_ctxt->u4_bs_deblk_thread_created = 1;
2264
39.4k
            }
2265
76.0k
        }
2266
126k
    }
2267
2268
126k
    if((ps_cur_slice->u1_slice_type != B_SLICE) &&
2269
98.4k
       (ps_view_ctxt->ps_cur_pps->u1_wted_pred_flag == 0))
2270
59.6k
    {
2271
59.6k
        ps_view_ctxt->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
2272
59.6k
        ps_view_ctxt->p_motion_compensate = ih264d_motion_compensate_bp;
2273
59.6k
    }
2274
67.1k
    else
2275
67.1k
    {
2276
67.1k
        ps_view_ctxt->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
2277
67.1k
        ps_view_ctxt->p_motion_compensate = ih264d_motion_compensate_mp;
2278
67.1k
    }
2279
2280
126k
    if(ps_err->u4_frm_sei_sync == ps_cur_slice->u2_frame_num)
2281
316
    {
2282
316
        ps_err->u1_err_flag = ACCEPT_ALL_PICS;
2283
316
        ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
2284
316
    }
2285
2286
126k
    ps_err->u4_cur_frm = ps_cur_slice->u2_frame_num;
2287
2288
126k
    ps_view_ctxt->i4_submb_ofst = -SUB_BLK_SIZE;
2289
2290
126k
    ps_view_ctxt->u4_cur_mb_addr = 0;
2291
126k
    ps_view_ctxt->ps_deblk_mbn = ps_view_ctxt->ps_deblk_pic;
2292
126k
    ps_view_ctxt->ps_mv_cur = ps_mvcd_ctxt->ps_cur_au->ps_au_mv_data->aps_mvs[u2_view_id];
2293
2294
126k
    ps_view_ctxt->s_tran_addrecon.pu1_dest_y =
2295
126k
        ps_mvcd_ctxt->ps_cur_au->as_view_buffers[u2_view_id].as_component_bufs[Y].pv_data;
2296
126k
    ps_view_ctxt->s_tran_addrecon.pu1_dest_u =
2297
126k
        ps_mvcd_ctxt->ps_cur_au->as_view_buffers[u2_view_id].as_component_bufs[UV].pv_data;
2298
126k
    ps_view_ctxt->s_tran_addrecon.pu1_dest_v = NULL;
2299
2300
126k
    ps_view_ctxt->s_tran_addrecon.pu1_mb_y =
2301
126k
        ps_mvcd_ctxt->ps_cur_au->as_view_buffers[u2_view_id].as_component_bufs[Y].pv_data;
2302
126k
    ps_view_ctxt->s_tran_addrecon.pu1_mb_u =
2303
126k
        ps_mvcd_ctxt->ps_cur_au->as_view_buffers[u2_view_id].as_component_bufs[UV].pv_data;
2304
126k
    ps_view_ctxt->s_tran_addrecon.pu1_mb_v = NULL;
2305
2306
126k
    ps_view_ctxt->ps_part = ps_view_ctxt->ps_parse_part_params;
2307
2308
126k
    ps_view_ctxt->u2_mbx = (MOD(ps_cur_slice->u2_first_mb_in_slice - 1, ps_sps->u2_frm_wd_in_mbs));
2309
126k
    ps_view_ctxt->u2_mby = (DIV(ps_cur_slice->u2_first_mb_in_slice - 1, ps_sps->u2_frm_wd_in_mbs));
2310
126k
    ps_view_ctxt->i2_prev_slice_mbx = ps_view_ctxt->u2_mbx;
2311
126k
    ps_view_ctxt->i2_prev_slice_mby = ps_view_ctxt->u2_mby;
2312
2313
    /* RBSP stop bit is used for CABAC decoding*/
2314
126k
    ps_bitstrm->u4_max_ofst += ps_view_ctxt->ps_cur_pps->u1_entropy_coding_mode;
2315
2316
126k
    ps_view_ctxt->u1_B = (ps_cur_slice->u1_slice_type == B_SLICE);
2317
126k
    ps_view_ctxt->u4_next_mb_skip = 0;
2318
2319
126k
    ps_view_ctxt->ps_parse_cur_slice->u4_first_mb_in_slice = ps_cur_slice->u2_first_mb_in_slice;
2320
126k
    ps_view_ctxt->ps_parse_cur_slice->slice_type = ps_cur_slice->u1_slice_type;
2321
2322
126k
    ps_view_ctxt->u4_start_recon_deblk = 1;
2323
2324
126k
    ps_view_ctxt->ps_parse_cur_slice->ppv_map_ref_idx_to_poc =
2325
126k
        ps_view_ctxt->pv_map_ref_idx_to_poc_buf;
2326
2327
126k
    if(ps_view_ctxt->u1_separate_parse)
2328
76.0k
    {
2329
76.0k
        ps_view_ctxt->ps_parse_cur_slice->pv_tu_coeff_data_start =
2330
76.0k
            ps_view_ctxt->pv_parse_tu_coeff_data;
2331
76.0k
    }
2332
50.7k
    else
2333
50.7k
    {
2334
50.7k
        ps_view_ctxt->pv_proc_tu_coeff_data = ps_view_ctxt->pv_parse_tu_coeff_data;
2335
50.7k
    }
2336
2337
126k
    if(0 == u2_view_order_id)
2338
125k
    {
2339
125k
        i4_error_code = imvcd_dpb_st_lt_deduplicator(ps_mvcd_ctxt->ps_dpb_mgr);
2340
2341
125k
        if(i4_error_code < 0)
2342
0
        {
2343
0
            i4_error_code = ERROR_DBP_MANAGER_T;
2344
0
        }
2345
125k
    }
2346
2347
126k
    if(ps_cur_slice->u1_slice_type == I_SLICE)
2348
47.3k
    {
2349
47.3k
        ps_mvcd_ctxt->ps_cur_au->au4_pack_slc_typ[u2_view_order_id] |= I_SLC_BIT;
2350
2351
47.3k
        i4_error_code = imvcd_parse_islice(ps_mvcd_ctxt);
2352
2353
47.3k
        ps_view_ctxt->u1_pr_sl_type = ps_cur_slice->u1_slice_type;
2354
2355
47.3k
        if(ps_view_ctxt->i4_pic_type != B_SLICE && ps_view_ctxt->i4_pic_type != P_SLICE)
2356
47.3k
        {
2357
47.3k
            ps_view_ctxt->i4_pic_type = I_SLICE;
2358
47.3k
        }
2359
47.3k
    }
2360
79.4k
    else if(ps_cur_slice->u1_slice_type == P_SLICE)
2361
51.1k
    {
2362
51.1k
        ps_mvcd_ctxt->ps_cur_au->au4_pack_slc_typ[u2_view_order_id] |= P_SLC_BIT;
2363
2364
51.1k
        i4_error_code = imvcd_parse_pslice(ps_mvcd_ctxt);
2365
2366
51.1k
        ps_view_ctxt->u1_pr_sl_type = ps_cur_slice->u1_slice_type;
2367
2368
51.1k
        if(ps_view_ctxt->i4_pic_type != B_SLICE)
2369
51.1k
        {
2370
51.1k
            ps_view_ctxt->i4_pic_type = P_SLICE;
2371
51.1k
        }
2372
51.1k
    }
2373
28.3k
    else if(ps_cur_slice->u1_slice_type == B_SLICE)
2374
28.3k
    {
2375
28.3k
        ps_mvcd_ctxt->ps_cur_au->au4_pack_slc_typ[u2_view_order_id] |= B_SLC_BIT;
2376
2377
28.3k
        i4_error_code = imvcd_parse_bslice(ps_mvcd_ctxt);
2378
2379
28.3k
        ps_view_ctxt->u1_pr_sl_type = ps_cur_slice->u1_slice_type;
2380
2381
28.3k
        ps_view_ctxt->i4_pic_type = B_SLICE;
2382
28.3k
    }
2383
12
    else
2384
12
    {
2385
12
        i4_error_code = ERROR_INV_SLC_TYPE_T;
2386
12
    }
2387
2388
126k
    i4_error_code = imvcd_finish_slice_decode(ps_mvcd_ctxt);
2389
2390
126k
    return i4_error_code;
2391
126k
}