Coverage Report

Created: 2025-11-12 06:11

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