Coverage Report

Created: 2026-05-16 06:30

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