Coverage Report

Created: 2025-10-10 06:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/mvc/imvcd_dpb_manager.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_nalu_parser.h                                  */
24
/*                                                                           */
25
/*  Description       : Functions for MVC NALU parsing                       */
26
/*                                                                           */
27
/*****************************************************************************/
28
#include <stdbool.h>
29
30
#include "ih264_typedefs.h"
31
#include "ih264d_error_handler.h"
32
#include "imvcd_dpb_manager.h"
33
#include "imvcd_structs.h"
34
#include "imvcd_utils.h"
35
36
void imvcd_dpb_set_display_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_display_num)
37
12.1k
{
38
12.1k
    ps_dpb_mgr->i4_cur_display_seq = i4_display_num;
39
12.1k
}
40
41
void imvcd_dpb_set_max_pic_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_max_pic_num)
42
125k
{
43
125k
    ps_dpb_mgr->i4_max_pic_num = i4_max_pic_num;
44
125k
}
45
46
void imvcd_dpb_set_num_views(mvc_dpb_manager_t *ps_dpb_mgr, UWORD16 u2_num_views)
47
125k
{
48
125k
    ps_dpb_mgr->u2_num_views = u2_num_views;
49
125k
}
50
51
void imvcd_dpb_set_display_delay(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_display_delay)
52
12.1k
{
53
12.1k
    ps_dpb_mgr->i4_display_delay = i4_display_delay;
54
12.1k
}
55
56
void imvcd_dpb_init_au_bufs(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buffer_t *ps_cur_au)
57
125k
{
58
125k
    WORD32 i;
59
60
376k
    for(i = 0; i < 2; i++)
61
250k
    {
62
250k
        ps_dpb_mgr->as_init_dpb[i][0] = ps_cur_au[0];
63
250k
    }
64
125k
}
65
66
void imvcd_dpb_init_view_bufs(mvc_dpb_manager_t *ps_dpb_mgr, UWORD16 u2_view_order_id,
67
                              UWORD16 u2_view_id)
68
2.85k
{
69
2.85k
    WORD32 i;
70
71
8.56k
    for(i = 0; i < 2; i++)
72
5.71k
    {
73
5.71k
        imvcd_convert_au_buf_to_view_buf(&ps_dpb_mgr->as_init_dpb[i][0],
74
5.71k
                                         &ps_dpb_mgr->as_view_init_dpb[i][0], u2_view_order_id,
75
5.71k
                                         u2_view_id);
76
5.71k
    }
77
2.85k
}
78
79
void imvcd_dpb_init_ivp_ctxt(mvc_dpb_manager_t *ps_dpb_mgr, sps_mvc_ext_t *ps_sps_mvc_ext,
80
                             nalu_mvc_ext_t *ps_nalu_mvc_exts)
81
2.85k
{
82
2.85k
    ps_dpb_mgr->s_dpb_ivp_ctxt.ps_nalu_mvc_exts = ps_nalu_mvc_exts;
83
2.85k
    ps_dpb_mgr->s_dpb_ivp_ctxt.ps_sps_mvc_ext = ps_sps_mvc_ext;
84
85
2.85k
    ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs = 0;
86
2.85k
}
87
88
void imvcd_dpb_reset_ivp_ctxt(mvc_dpb_manager_t *ps_dpb_mgr)
89
126k
{
90
126k
    UWORD32 i;
91
92
129k
    for(i = 0; i < ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs; i++)
93
2.26k
    {
94
2.26k
        ih264_buf_mgr_release(ps_dpb_mgr->ps_mvc_au_buf_mgr->ps_buf_mgr_ctxt,
95
2.26k
                              ps_dpb_mgr->s_dpb_ivp_ctxt.au1_au_buf_ids[i],
96
2.26k
                              BUF_MGR_REF | BUF_MGR_IO);
97
98
2.26k
        ih264_buf_mgr_release(ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr->ps_buf_mgr_ctxt,
99
2.26k
                              ps_dpb_mgr->s_dpb_ivp_ctxt.au1_mv_buf_ids[i],
100
2.26k
                              BUF_MGR_REF | BUF_MGR_IO);
101
2.26k
    }
102
103
126k
    ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs = 0;
104
126k
}
105
106
pic_buffer_t **imvcd_dpb_get_view_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr,
107
                                               UWORD16 u2_view_order_id, UWORD16 u2_view_id,
108
                                               UWORD8 u1_pred_dir)
109
360k
{
110
360k
    WORD32 i;
111
112
360k
    UWORD8 u1_num_ref_bufs = ps_dpb_mgr->au1_num_active_st_refs[u1_pred_dir] +
113
360k
                             ps_dpb_mgr->au1_num_active_lt_refs[u1_pred_dir];
114
115
1.16M
    for(i = 0; i < u1_num_ref_bufs; i++)
116
805k
    {
117
805k
        imvcd_convert_au_buf_to_view_buf(ps_dpb_mgr->aps_mod_dpb[u1_pred_dir][i],
118
805k
                                         &ps_dpb_mgr->as_view_init_dpb[u1_pred_dir][i],
119
805k
                                         u2_view_order_id, u2_view_id);
120
121
805k
        ps_dpb_mgr->aps_view_mod_dpb[u1_pred_dir][i] =
122
805k
            &ps_dpb_mgr->as_view_init_dpb[u1_pred_dir][i];
123
805k
    }
124
125
360k
    return ps_dpb_mgr->aps_view_mod_dpb[u1_pred_dir];
126
360k
}
127
128
void imvcd_init_dpb_mgr(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buf_mgr_t *ps_mvc_au_buf_mgr,
129
                        mvc_au_mv_pred_buf_mgr_t *ps_mvc_au_mv_pred_buf_mgr,
130
                        disp_mgr_t *ps_disp_buf_mgr)
131
16.7k
{
132
16.7k
    WORD32 i, j, k, l;
133
134
16.7k
    mvc_dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
135
136
50.3k
    for(i = 0; i < 2; i++)
137
33.5k
    {
138
33.5k
        mvc_au_buffer_t *ps_init_dpb = ps_dpb_mgr->as_init_dpb[i];
139
33.5k
        pic_buffer_t *ps_view_init_dpb = ps_dpb_mgr->as_view_init_dpb[i];
140
141
1.64M
        for(j = 0; j < MVC_MAX_REF_PICS; j++)
142
1.61M
        {
143
11.2M
            for(k = 0; k < MAX_NUM_VIEWS; k++)
144
9.66M
            {
145
38.6M
                for(l = 0; l < NUM_COMPONENTS; l++)
146
28.9M
                {
147
28.9M
                    ps_init_dpb->as_view_buffers[k].as_component_bufs[l].pv_data = NULL;
148
28.9M
                }
149
9.66M
            }
150
151
1.61M
            ps_view_init_dpb->pu1_buf1 = NULL;
152
1.61M
            ps_view_init_dpb->pu1_buf2 = NULL;
153
1.61M
            ps_view_init_dpb->pu1_buf3 = NULL;
154
155
1.61M
            ps_dpb_mgr->aps_mod_dpb[i][j] = ps_init_dpb;
156
1.61M
            ps_dpb_mgr->aps_view_mod_dpb[i][j] = ps_view_init_dpb;
157
158
1.61M
            ps_init_dpb++;
159
1.61M
            ps_view_init_dpb++;
160
1.61M
        }
161
33.5k
    }
162
163
822k
    for(i = 0; i < MVC_MAX_REF_PICS; i++)
164
805k
    {
165
805k
        ps_dpb_info[i].b_used_as_ref = false;
166
805k
        ps_dpb_info[i].ps_prev_short = NULL;
167
805k
        ps_dpb_info[i].ps_prev_long = NULL;
168
805k
        ps_dpb_info[i].ps_au_buf = NULL;
169
805k
        ps_dpb_info[i].s_top_field.u1_reference_info = UNUSED_FOR_REF;
170
805k
        ps_dpb_info[i].s_bot_field.u1_reference_info = UNUSED_FOR_REF;
171
805k
        ps_dpb_info[i].s_top_field.u1_long_term_frame_idx = MVC_MAX_REF_PICS + 1;
172
805k
        ps_dpb_info[i].s_bot_field.u1_long_term_frame_idx = MVC_MAX_REF_PICS + 1;
173
805k
    }
174
175
16.7k
    ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
176
16.7k
    ps_dpb_mgr->ps_dpb_st_head = NULL;
177
16.7k
    ps_dpb_mgr->ps_dpb_lt_head = NULL;
178
16.7k
    ps_dpb_mgr->i1_gaps_deleted = 0;
179
16.7k
    ps_dpb_mgr->i1_poc_buf_id_entries = 0;
180
16.7k
    ps_dpb_mgr->u1_mmco_error_in_seq = 0;
181
16.7k
    ps_dpb_mgr->u1_num_gaps = 0;
182
16.7k
    ps_dpb_mgr->i4_display_delay = 0;
183
16.7k
    ps_dpb_mgr->i4_cur_display_seq = 0;
184
185
285k
    for(i = 0; i < MAX_FRAMES; i++)
186
268k
    {
187
268k
        ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
188
268k
        ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
189
268k
        ps_dpb_mgr->ai1_gaps_per_seq[i] = 0;
190
268k
        ps_dpb_mgr->as_display_buf_info[i].i4_poc_buf_id = -1;
191
268k
        ps_dpb_mgr->as_display_buf_info[i].i4_poc = INT32_MAX;
192
268k
        ps_dpb_mgr->as_display_buf_info[i].i4_frame_num = 0;
193
268k
    }
194
195
16.7k
    ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs = 0;
196
16.7k
    ps_dpb_mgr->s_dpb_ivp_ctxt.ps_nalu_mvc_exts = NULL;
197
16.7k
    ps_dpb_mgr->s_dpb_ivp_ctxt.ps_sps_mvc_ext = NULL;
198
199
16.7k
    ps_dpb_mgr->ps_mvc_au_buf_mgr = ps_mvc_au_buf_mgr;
200
16.7k
    ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr = ps_mvc_au_mv_pred_buf_mgr;
201
16.7k
    ps_dpb_mgr->ps_disp_buf_mgr = ps_disp_buf_mgr;
202
16.7k
}
203
204
WORD32 imvcd_dpb_assign_display_seq(mvc_dpb_manager_t *ps_dpb_mgr)
205
124k
{
206
124k
    WORD32 i;
207
208
124k
    display_buf_info_t *ps_display_buf_info = ps_dpb_mgr->as_display_buf_info;
209
210
124k
    WORD32 i4_min_poc = INT32_MAX;
211
124k
    WORD32 i4_min_poc_buf_id = -1;
212
124k
    WORD32 i4_min_index = -1;
213
214
124k
    if(ps_dpb_mgr->i1_poc_buf_id_entries >= ps_dpb_mgr->i4_display_delay)
215
34.0k
    {
216
578k
        for(i = 0; i < MAX_FRAMES; i++)
217
544k
        {
218
544k
            if((-1 != ps_display_buf_info[i].i4_poc_buf_id) &&
219
438k
               (DO_NOT_DISP != ps_display_buf_info[i].i4_poc_buf_id))
220
350k
            {
221
                /* Checking for <= is necessary to handle cases where there is one
222
                   valid buffer with poc set to 0x7FFFFFFF. */
223
350k
                if(ps_display_buf_info[i].i4_poc <= i4_min_poc)
224
227k
                {
225
227k
                    i4_min_poc = ps_display_buf_info[i].i4_poc;
226
227k
                    i4_min_poc_buf_id = ps_display_buf_info[i].i4_poc_buf_id;
227
227k
                    i4_min_index = i;
228
227k
                }
229
350k
            }
230
544k
        }
231
232
34.0k
        if((i4_min_index != -1) && (DO_NOT_DISP != i4_min_poc_buf_id))
233
31.2k
        {
234
31.2k
            ps_dpb_mgr->i4_cur_display_seq++;
235
236
31.2k
            ih264_disp_mgr_add(
237
31.2k
                ps_dpb_mgr->ps_disp_buf_mgr, i4_min_poc_buf_id, ps_dpb_mgr->i4_cur_display_seq,
238
31.2k
                ps_dpb_mgr->ps_mvc_au_buf_mgr->aps_buf_id_to_au_buf_map[i4_min_poc_buf_id]);
239
240
31.2k
            ps_display_buf_info[i4_min_index].i4_poc_buf_id = -1;
241
31.2k
            ps_display_buf_info[i4_min_index].i4_poc = 0x7fffffff;
242
243
31.2k
            ps_dpb_mgr->i1_poc_buf_id_entries--;
244
31.2k
        }
245
2.80k
        else if(DO_NOT_DISP == i4_min_poc_buf_id)
246
0
        {
247
0
            return ERROR_GAPS_IN_FRM_NUM;
248
0
        }
249
34.0k
    }
250
251
124k
    return OK;
252
124k
}
253
254
WORD32 imvcd_dpb_insert_pic_in_display_list(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_display_poc,
255
                                            UWORD32 u4_frame_num, WORD32 i4_buf_id)
256
345k
{
257
345k
    WORD32 i;
258
259
345k
    display_buf_info_t *ps_display_buf_info = ps_dpb_mgr->as_display_buf_info;
260
261
2.19M
    for(i = 0; i < MAX_FRAMES; i++)
262
2.19M
    {
263
        /* Find an empty slot */
264
2.19M
        if(ps_display_buf_info[i].i4_poc_buf_id == -1)
265
345k
        {
266
345k
            if(GAP_FRAME_NUM == ps_display_buf_info[i].i4_frame_num)
267
0
            {
268
0
                ps_dpb_mgr->i1_gaps_deleted--;
269
0
            }
270
345k
            else
271
345k
            {
272
345k
                ps_dpb_mgr->i1_poc_buf_id_entries++;
273
345k
            }
274
275
345k
            ps_display_buf_info[i].i4_poc_buf_id = i4_buf_id;
276
345k
            ps_display_buf_info[i].i4_poc = i4_display_poc;
277
345k
            ps_display_buf_info[i].i4_frame_num = u4_frame_num;
278
279
345k
            break;
280
345k
        }
281
2.19M
    }
282
283
345k
    if(MAX_FRAMES == i)
284
95
    {
285
95
        return ERROR_GAPS_IN_FRM_NUM;
286
95
    }
287
288
345k
    return OK;
289
345k
}
290
291
static WORD32 imvcd_dpb_delete_gap_frm_sliding(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_pic_num,
292
                                               UWORD8 *pu1_del_node)
293
23.7k
{
294
23.7k
    WORD32 i, j, j_min;
295
23.7k
    WORD8 i1_gap_idx;
296
23.7k
    WORD32 *pi4_gaps_start_frm_num, *pi4_gaps_end_frm_num, i4_gap_frame_num;
297
23.7k
    WORD32 i4_start_frm_num, i4_end_frm_num;
298
23.7k
    WORD32 i4_max_pic_num;
299
23.7k
    WORD32 i4_frm_num, i4_gap_frm_num_min;
300
301
    /* find the least frame num from gaps and current DPB node    */
302
    /* Delete the least one                                       */
303
23.7k
    *pu1_del_node = 1;
304
305
23.7k
    if(0 == ps_dpb_mgr->u1_num_gaps)
306
15.7k
    {
307
15.7k
        return OK;
308
15.7k
    }
309
310
7.96k
    pi4_gaps_start_frm_num = ps_dpb_mgr->ai4_gaps_start_frm_num;
311
7.96k
    pi4_gaps_end_frm_num = ps_dpb_mgr->ai4_gaps_end_frm_num;
312
7.96k
    i4_gap_frame_num = INVALID_FRAME_NUM;
313
7.96k
    i4_max_pic_num = ps_dpb_mgr->i4_max_pic_num;
314
315
7.96k
    i1_gap_idx = -1;
316
317
7.96k
    if(INVALID_FRAME_NUM != i4_pic_num)
318
7.66k
    {
319
7.66k
        i4_gap_frame_num = i4_pic_num;
320
321
130k
        for(i = 0; i < MAX_FRAMES; i++)
322
122k
        {
323
122k
            i4_start_frm_num = pi4_gaps_start_frm_num[i];
324
325
122k
            if(INVALID_FRAME_NUM != i4_start_frm_num)
326
18.7k
            {
327
18.7k
                i4_end_frm_num = pi4_gaps_end_frm_num[i];
328
329
18.7k
                if(i4_end_frm_num < i4_max_pic_num)
330
14.4k
                {
331
14.4k
                    if(i4_start_frm_num <= i4_gap_frame_num)
332
8.59k
                    {
333
8.59k
                        i4_gap_frame_num = i4_start_frm_num;
334
8.59k
                        i1_gap_idx = i;
335
8.59k
                    }
336
14.4k
                }
337
4.25k
                else
338
4.25k
                {
339
4.25k
                    if(((i4_start_frm_num <= i4_gap_frame_num) &&
340
1.71k
                        (i4_gap_frame_num <= i4_max_pic_num)) ||
341
3.23k
                       ((i4_start_frm_num >= i4_gap_frame_num) &&
342
2.53k
                        ((i4_gap_frame_num + i4_max_pic_num) >= i4_end_frm_num)))
343
2.63k
                    {
344
2.63k
                        i4_gap_frame_num = i4_start_frm_num;
345
2.63k
                        i1_gap_idx = i;
346
2.63k
                    }
347
4.25k
                }
348
18.7k
            }
349
122k
        }
350
7.66k
    }
351
295
    else
352
295
    {
353
        /* no valid short term buffers, delete one gap from the least start */
354
        /* of gap sequence                                                  */
355
295
        i4_gap_frame_num = pi4_gaps_start_frm_num[0];
356
295
        i1_gap_idx = 0;
357
358
4.72k
        for(i = 1; i < MAX_FRAMES; i++)
359
4.42k
        {
360
4.42k
            if(INVALID_FRAME_NUM != pi4_gaps_start_frm_num[i])
361
578
            {
362
578
                if(pi4_gaps_start_frm_num[i] < i4_gap_frame_num)
363
84
                {
364
84
                    i4_gap_frame_num = pi4_gaps_start_frm_num[i];
365
84
                    i1_gap_idx = i;
366
84
                }
367
578
            }
368
4.42k
        }
369
295
        if(INVALID_FRAME_NUM == i4_gap_frame_num)
370
0
        {
371
0
            return ERROR_DBP_MANAGER_T;
372
0
        }
373
295
    }
374
375
7.96k
    if(-1 != i1_gap_idx)
376
6.28k
    {
377
        /* find least frame_num in the poc_map, which is in this range */
378
6.28k
        i4_start_frm_num = pi4_gaps_start_frm_num[i1_gap_idx];
379
380
6.28k
        if(i4_start_frm_num < 0)
381
618
        {
382
618
            i4_start_frm_num += i4_max_pic_num;
383
618
        }
384
385
6.28k
        i4_end_frm_num = pi4_gaps_end_frm_num[i1_gap_idx];
386
387
6.28k
        if(i4_end_frm_num < 0)
388
644
        {
389
644
            i4_end_frm_num += i4_max_pic_num;
390
644
        }
391
392
6.28k
        i4_gap_frm_num_min = INT32_MIN;
393
6.28k
        j_min = MAX_FRAMES;
394
395
106k
        for(j = 0; j < MAX_FRAMES; j++)
396
100k
        {
397
100k
            i4_frm_num = ps_dpb_mgr->as_display_buf_info[j].i4_frame_num;
398
399
100k
            if((i4_start_frm_num <= i4_frm_num) && (i4_end_frm_num >= i4_frm_num))
400
42.7k
            {
401
42.7k
                if(i4_frm_num < i4_gap_frm_num_min)
402
0
                {
403
0
                    j_min = j;
404
0
                    i4_gap_frm_num_min = i4_frm_num;
405
0
                }
406
42.7k
            }
407
100k
        }
408
409
6.28k
        if(j_min != MAX_FRAMES)
410
0
        {
411
0
            ps_dpb_mgr->as_display_buf_info[j_min].i4_poc_buf_id = -1;
412
0
            ps_dpb_mgr->as_display_buf_info[j_min].i4_poc = 0x7fffffff;
413
0
            ps_dpb_mgr->as_display_buf_info[j_min].i4_frame_num = GAP_FRAME_NUM;
414
415
0
            ps_dpb_mgr->i1_gaps_deleted++;
416
0
            ps_dpb_mgr->ai1_gaps_per_seq[i1_gap_idx]--;
417
0
            ps_dpb_mgr->u1_num_gaps--;
418
0
            *pu1_del_node = 0;
419
420
0
            if(0 == ps_dpb_mgr->ai1_gaps_per_seq[i1_gap_idx])
421
0
            {
422
0
                ps_dpb_mgr->ai4_gaps_start_frm_num[i1_gap_idx] = INVALID_FRAME_NUM;
423
0
                ps_dpb_mgr->ai4_gaps_end_frm_num[i1_gap_idx] = 0;
424
0
            }
425
0
        }
426
6.28k
    }
427
428
7.96k
    return OK;
429
7.96k
}
430
431
WORD32 imvcd_dpb_do_mmco_for_gaps(mvc_dpb_manager_t *ps_dpb_mgr, UWORD8 u1_num_ref_frames)
432
226k
{
433
226k
    mvc_dpb_info_t *ps_next_dpb;
434
435
226k
    WORD32 i;
436
226k
    WORD32 i4_error_code;
437
226k
    UWORD8 u1_num_gaps;
438
226k
    UWORD8 u1_num_st_ref_bufs, u1_num_lt_ref_bufs, u1_del_node;
439
440
226k
    WORD32 i4_frame_gaps = 1;
441
442
    // Sliding window - implements 8.2.5.3, flush out buffers
443
226k
    u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_st_ref_bufs;
444
226k
    u1_num_lt_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs;
445
446
323k
    while(1)
447
323k
    {
448
323k
        u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
449
450
323k
        if((u1_num_st_ref_bufs + u1_num_lt_ref_bufs + u1_num_gaps + i4_frame_gaps) >
451
323k
           u1_num_ref_frames)
452
97.7k
        {
453
97.7k
            if(0 == (u1_num_st_ref_bufs + u1_num_gaps))
454
89.5k
            {
455
89.5k
                i4_frame_gaps = 0;
456
457
89.5k
                ps_dpb_mgr->u1_num_gaps = (u1_num_ref_frames - u1_num_lt_ref_bufs);
458
89.5k
            }
459
8.20k
            else
460
8.20k
            {
461
8.20k
                u1_del_node = 1;
462
8.20k
                ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
463
464
8.20k
                if(u1_num_st_ref_bufs > 1)
465
3.75k
                {
466
14.8k
                    for(i = 1; i < (u1_num_st_ref_bufs - 1); i++)
467
11.1k
                    {
468
11.1k
                        if(ps_next_dpb == NULL)
469
0
                        {
470
0
                            return ERROR_DBP_MANAGER_T;
471
0
                        }
472
473
11.1k
                        ps_next_dpb = ps_next_dpb->ps_prev_short;
474
11.1k
                    }
475
476
3.75k
                    if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
477
1
                    {
478
1
                        return ERROR_DBP_MANAGER_T;
479
1
                    }
480
481
3.75k
                    if(u1_num_gaps)
482
3.54k
                    {
483
3.54k
                        i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
484
3.54k
                            ps_dpb_mgr, ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_num,
485
3.54k
                            &u1_del_node);
486
487
3.54k
                        if(i4_error_code != OK)
488
0
                        {
489
0
                            return i4_error_code;
490
0
                        }
491
3.54k
                    }
492
493
3.75k
                    if(u1_del_node)
494
3.75k
                    {
495
3.75k
                        u1_num_st_ref_bufs--;
496
3.75k
                        ps_next_dpb->ps_prev_short->b_used_as_ref = false;
497
3.75k
                        ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info = UNUSED_FOR_REF;
498
3.75k
                        ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
499
500
3.75k
                        imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
501
3.75k
                                            ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
502
3.75k
                                            ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_buf_id);
503
504
3.75k
                        ps_next_dpb->ps_prev_short->ps_au_buf = NULL;
505
3.75k
                        ps_next_dpb->ps_prev_short = NULL;
506
3.75k
                    }
507
3.75k
                }
508
4.45k
                else
509
4.45k
                {
510
4.45k
                    if(u1_num_st_ref_bufs)
511
4.21k
                    {
512
4.21k
                        if(u1_num_gaps)
513
1.68k
                        {
514
1.68k
                            i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
515
1.68k
                                ps_dpb_mgr, ps_next_dpb->ps_au_buf->i4_pic_num, &u1_del_node);
516
517
1.68k
                            if(i4_error_code != OK)
518
0
                            {
519
0
                                return i4_error_code;
520
0
                            }
521
1.68k
                        }
522
523
4.21k
                        if(u1_del_node)
524
4.21k
                        {
525
4.21k
                            u1_num_st_ref_bufs--;
526
4.21k
                            ps_next_dpb->b_used_as_ref = false;
527
4.21k
                            ps_next_dpb->s_top_field.u1_reference_info = UNUSED_FOR_REF;
528
4.21k
                            ps_next_dpb->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
529
530
4.21k
                            imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
531
4.21k
                                                ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
532
4.21k
                                                ps_next_dpb->ps_au_buf->i4_pic_buf_id);
533
534
4.21k
                            ps_next_dpb->ps_au_buf = NULL;
535
4.21k
                            ps_next_dpb = NULL;
536
4.21k
                            ps_dpb_mgr->ps_dpb_st_head = NULL;
537
4.21k
                            ps_dpb_mgr->u1_num_st_ref_bufs = u1_num_st_ref_bufs;
538
4.21k
                        }
539
4.21k
                    }
540
232
                    else
541
232
                    {
542
232
                        i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
543
232
                            ps_dpb_mgr, INVALID_FRAME_NUM, &u1_del_node);
544
545
232
                        if(i4_error_code != OK)
546
0
                        {
547
0
                            return i4_error_code;
548
0
                        }
549
550
232
                        if(u1_del_node)
551
232
                        {
552
232
                            return ERROR_DBP_MANAGER_T;
553
232
                        }
554
232
                    }
555
4.45k
                }
556
8.20k
            }
557
97.7k
        }
558
225k
        else
559
225k
        {
560
225k
            ps_dpb_mgr->u1_num_gaps += i4_frame_gaps;
561
562
225k
            break;
563
225k
        }
564
323k
    }
565
566
225k
    ps_dpb_mgr->u1_num_st_ref_bufs = u1_num_st_ref_bufs;
567
568
225k
    return OK;
569
226k
}
570
571
void imvcd_dpb_delete_nonref_nondisplay_pics(mvc_dpb_manager_t *ps_dpb_mgr)
572
617k
{
573
617k
    WORD32 i;
574
575
617k
    display_buf_info_t *ps_display_buf_info = ps_dpb_mgr->as_display_buf_info;
576
577
    /* remove all gaps marked as unused for ref */
578
630k
    for(i = 0; (i < MAX_FRAMES) && ps_dpb_mgr->i1_gaps_deleted; i++)
579
13.6k
    {
580
13.6k
        if(GAP_FRAME_NUM == ps_display_buf_info[i].i4_frame_num)
581
4.40k
        {
582
4.40k
            ps_dpb_mgr->i1_gaps_deleted--;
583
4.40k
            ps_dpb_mgr->i1_poc_buf_id_entries--;
584
4.40k
            ps_display_buf_info[i].i4_poc_buf_id = -1;
585
4.40k
            ps_display_buf_info[i].i4_poc = 0x7fffffff;
586
4.40k
            ps_display_buf_info[i].i4_frame_num = 0;
587
4.40k
        }
588
13.6k
    }
589
617k
}
590
591
void imvcd_reset_dpb(mvc_dpb_manager_t *ps_dpb_mgr)
592
61.3k
{
593
61.3k
    WORD32 i;
594
595
61.3k
    mvc_dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
596
597
3.00M
    for(i = 0; i < MVC_MAX_REF_PICS; i++)
598
2.94M
    {
599
2.94M
        if(ps_dpb_info[i].b_used_as_ref)
600
37.5k
        {
601
37.5k
            imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
602
37.5k
                                ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
603
37.5k
                                ps_dpb_info[i].ps_au_buf->i4_pic_buf_id);
604
605
37.5k
            ps_dpb_info[i].b_used_as_ref = false;
606
37.5k
            ps_dpb_info[i].ps_prev_short = NULL;
607
37.5k
            ps_dpb_info[i].ps_prev_long = NULL;
608
37.5k
            ps_dpb_info[i].ps_au_buf = NULL;
609
37.5k
            ps_dpb_info[i].s_top_field.u1_reference_info = UNUSED_FOR_REF;
610
37.5k
            ps_dpb_info[i].s_bot_field.u1_reference_info = UNUSED_FOR_REF;
611
37.5k
            ps_dpb_info[i].s_top_field.u1_long_term_frame_idx = MVC_MAX_REF_PICS + 1;
612
37.5k
            ps_dpb_info[i].s_bot_field.u1_long_term_frame_idx = MVC_MAX_REF_PICS + 1;
613
37.5k
        }
614
2.94M
    }
615
616
61.3k
    ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
617
61.3k
    ps_dpb_mgr->ps_dpb_st_head = NULL;
618
61.3k
    ps_dpb_mgr->ps_dpb_lt_head = NULL;
619
61.3k
    ps_dpb_mgr->u1_mmco_error_in_seq = 0;
620
621
    /* release all gaps */
622
61.3k
    ps_dpb_mgr->u1_num_gaps = 0;
623
624
1.04M
    for(i = 0; i < MAX_FRAMES; i++)
625
982k
    {
626
982k
        ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
627
982k
        ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
628
982k
        ps_dpb_mgr->ai1_gaps_per_seq[i] = 0;
629
982k
    }
630
61.3k
}
631
632
void imvcd_dpb_release_display_bufs(mvc_dpb_manager_t *ps_dpb_mgr)
633
46.1k
{
634
46.1k
    WORD32 i, j;
635
636
46.1k
    display_buf_info_t *ps_display_buf_info = ps_dpb_mgr->as_display_buf_info;
637
638
46.1k
    WORD32 i4_min_poc = 0x7fffffff;
639
46.1k
    WORD32 i4_min_poc_buf_id = 0;
640
46.1k
    WORD32 i4_min_index = 0;
641
642
46.1k
    imvcd_dpb_delete_nonref_nondisplay_pics(ps_dpb_mgr);
643
644
318k
    for(j = 0; j < ps_dpb_mgr->i1_poc_buf_id_entries; j++)
645
271k
    {
646
271k
        i4_min_poc = 0x7fffffff;
647
648
4.62M
        for(i = 0; i < MAX_FRAMES; i++)
649
4.35M
        {
650
4.35M
            if(ps_display_buf_info[i].i4_poc_buf_id != -1)
651
1.67M
            {
652
                /* Checking for <= is necessary to handle cases where there is one
653
                   valid buffer with poc set to 0x7FFFFFFF. */
654
1.67M
                if(ps_display_buf_info[i].i4_poc <= i4_min_poc)
655
504k
                {
656
504k
                    i4_min_poc = ps_display_buf_info[i].i4_poc;
657
504k
                    i4_min_poc_buf_id = ps_display_buf_info[i].i4_poc_buf_id;
658
504k
                    i4_min_index = i;
659
504k
                }
660
1.67M
            }
661
4.35M
        }
662
663
271k
        if(DO_NOT_DISP != i4_min_poc_buf_id)
664
61.8k
        {
665
61.8k
            ps_dpb_mgr->i4_cur_display_seq++;
666
667
61.8k
            ih264_disp_mgr_add(
668
61.8k
                ps_dpb_mgr->ps_disp_buf_mgr, i4_min_poc_buf_id, ps_dpb_mgr->i4_cur_display_seq,
669
61.8k
                ps_dpb_mgr->ps_mvc_au_buf_mgr->aps_buf_id_to_au_buf_map[i4_min_poc_buf_id]);
670
671
61.8k
            ps_display_buf_info[i4_min_index].i4_poc_buf_id = -1;
672
61.8k
            ps_display_buf_info[i4_min_index].i4_poc = 0x7fffffff;
673
61.8k
            ps_display_buf_info[i4_min_index].i4_frame_num = 0;
674
61.8k
        }
675
210k
        else
676
210k
        {
677
210k
            ps_display_buf_info[i4_min_index].i4_poc_buf_id = -1;
678
210k
            ps_display_buf_info[i4_min_index].i4_poc = 0x7fffffff;
679
210k
            ps_display_buf_info[i4_min_index].i4_frame_num = 0;
680
210k
        }
681
271k
    }
682
683
46.1k
    ps_dpb_mgr->i1_poc_buf_id_entries = 0;
684
46.1k
}
685
686
void imvcd_assign_pic_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_max_frame_num,
687
                          WORD32 i4_cur_frame_num, bool b_are_gaps_in_frame_num_value_allowed)
688
125k
{
689
125k
    mvc_dpb_info_t *ps_next_dpb;
690
691
125k
    WORD32 i;
692
125k
    WORD32 i4_ref_frame_num;
693
694
    /* Start from ST head */
695
125k
    ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
696
697
258k
    for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
698
132k
    {
699
132k
        WORD32 i4_pic_num;
700
701
132k
        i4_ref_frame_num = ps_next_dpb->ps_au_buf->i4_pic_num;
702
703
132k
        if(i4_ref_frame_num > i4_cur_frame_num)
704
13.4k
        {
705
13.4k
            i4_pic_num = i4_ref_frame_num - i4_max_frame_num;
706
13.4k
        }
707
119k
        else
708
119k
        {
709
119k
            i4_pic_num = i4_ref_frame_num;
710
119k
        }
711
712
132k
        ps_next_dpb->ps_au_buf->i4_pic_num = i4_pic_num;
713
714
132k
        ps_next_dpb = ps_next_dpb->ps_prev_short;
715
132k
    }
716
717
125k
    if(b_are_gaps_in_frame_num_value_allowed && ps_dpb_mgr->u1_num_gaps)
718
23.5k
    {
719
23.5k
        WORD32 i4_start_frm, i4_end_frm;
720
721
        /* Assign pic numbers for gaps */
722
400k
        for(i = 0; i < MAX_FRAMES; i++)
723
376k
        {
724
376k
            i4_start_frm = ps_dpb_mgr->ai4_gaps_start_frm_num[i];
725
726
376k
            if(i4_start_frm != INVALID_FRAME_NUM)
727
33.4k
            {
728
33.4k
                if(i4_start_frm > i4_cur_frame_num)
729
822
                {
730
                    /* gap's frame_num is before Current frame_num in
731
                     decode order */
732
822
                    i4_start_frm -= i4_max_frame_num;
733
822
                }
734
735
33.4k
                ps_dpb_mgr->ai4_gaps_start_frm_num[i] = i4_start_frm;
736
33.4k
                i4_end_frm = ps_dpb_mgr->ai4_gaps_end_frm_num[i];
737
738
33.4k
                if(i4_end_frm > i4_cur_frame_num)
739
2.14k
                {
740
                    /* gap's frame_num is before Current frame_num in
741
                     decode order */
742
2.14k
                    i4_end_frm -= i4_max_frame_num;
743
2.14k
                }
744
745
33.4k
                ps_dpb_mgr->ai4_gaps_end_frm_num[i] = i4_end_frm;
746
33.4k
            }
747
376k
        }
748
23.5k
    }
749
125k
}
750
751
/* If there is common node in both lt_list and st_list, then delete it from */
752
/* st_list */
753
UWORD8 imvcd_dpb_st_lt_deduplicator(mvc_dpb_manager_t *ps_dpb_mgr)
754
125k
{
755
125k
    mvc_dpb_info_t *ps_dpb_lt_head = ps_dpb_mgr->ps_dpb_lt_head;
756
125k
    mvc_dpb_info_t *ps_lt_curr_dpb = ps_dpb_mgr->ps_dpb_lt_head;
757
125k
    mvc_dpb_info_t *ps_dpb_st_head = ps_dpb_mgr->ps_dpb_st_head;
758
759
125k
    UWORD8 u1_no_of_nodes_deleted = 0;
760
125k
    UWORD8 u1_num_lt_refs = ps_dpb_mgr->u1_num_lt_ref_bufs;
761
125k
    UWORD8 u1_num_st_refs = ps_dpb_mgr->u1_num_st_ref_bufs;
762
763
200k
    while(u1_num_lt_refs && ps_dpb_lt_head)
764
75.3k
    {
765
75.3k
        if(ps_dpb_st_head &&
766
37.8k
           ((ps_dpb_lt_head->s_bot_field.u1_reference_info |
767
37.8k
             ps_dpb_lt_head->s_top_field.u1_reference_info) == (IS_SHORT_TERM | IS_LONG_TERM)))
768
0
        {
769
0
            mvc_dpb_info_t *ps_st_next_dpb = ps_dpb_st_head;
770
0
            mvc_dpb_info_t *ps_st_curr_dpb = ps_dpb_st_head;
771
772
0
            while(u1_num_st_refs && ps_st_curr_dpb)
773
0
            {
774
0
                if(ps_st_curr_dpb == ps_lt_curr_dpb)
775
0
                {
776
0
                    if(u1_num_st_refs == ps_dpb_mgr->u1_num_st_ref_bufs)
777
0
                    {
778
0
                        ps_dpb_mgr->ps_dpb_st_head = ps_dpb_mgr->ps_dpb_st_head->ps_prev_short;
779
0
                        ps_st_curr_dpb = ps_dpb_mgr->ps_dpb_st_head;
780
0
                    }
781
0
                    else
782
0
                    {
783
0
                        ps_st_next_dpb->ps_prev_short = ps_st_curr_dpb->ps_prev_short;
784
0
                    }
785
786
0
                    ps_dpb_mgr->u1_num_st_ref_bufs--;
787
0
                    u1_no_of_nodes_deleted++;
788
789
0
                    break;
790
0
                }
791
792
0
                ps_st_next_dpb = ps_st_curr_dpb;
793
0
                ps_st_curr_dpb = ps_st_curr_dpb->ps_prev_short;
794
0
                u1_num_st_refs--;
795
0
            }
796
0
        }
797
798
75.3k
        ps_lt_curr_dpb = ps_lt_curr_dpb->ps_prev_long;
799
75.3k
        u1_num_lt_refs--;
800
75.3k
    }
801
802
125k
    return u1_no_of_nodes_deleted;
803
125k
}
804
805
static int qsort_pic_num_compare(const void *pv_au1, const void *pv_au2)
806
56.4k
{
807
56.4k
    return ((mvc_au_buffer_t **) pv_au1)[0]->i4_pic_num -
808
56.4k
           ((mvc_au_buffer_t **) pv_au2)[0]->i4_pic_num;
809
56.4k
}
810
811
static int qsort_poc_compare(const void *pv_au1, const void *pv_au2)
812
28.9k
{
813
28.9k
    return ((mvc_au_buffer_t **) pv_au1)[0]->i4_poc - ((mvc_au_buffer_t **) pv_au2)[0]->i4_poc;
814
28.9k
}
815
816
static int qsort_lt_idx_compare(const void *pv_au1, const void *pv_au2)
817
9.81k
{
818
9.81k
    return ((mvc_au_buffer_t **) pv_au1)[0]->u1_long_term_frm_idx -
819
9.81k
           ((mvc_au_buffer_t **) pv_au2)[0]->u1_long_term_frm_idx;
820
9.81k
}
821
822
WORD32 imvcd_init_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr, nalu_mvc_ext_t *ps_cur_nalu_mvc_ext,
823
                               mvc_au_buffer_t *ps_cur_au, UWORD16 u2_view_order_id)
824
79.4k
{
825
79.4k
    mvc_dpb_info_t *ps_ref_au_data;
826
79.4k
    mvc_ivp_ref_data_t *ps_mvc_ivp_ref_data;
827
828
79.4k
    WORD32 i, j;
829
830
79.4k
    mvc_au_buffer_t *aps_st_au_bufs[MVC_MAX_REF_PICS] = {NULL};
831
79.4k
    mvc_au_buffer_t *aps_lt_au_bufs[MVC_MAX_REF_PICS] = {NULL};
832
79.4k
    mvc_au_buffer_t *aps_ref_pic_buf_lx[2] = {ps_dpb_mgr->as_init_dpb[0],
833
79.4k
                                              ps_dpb_mgr->as_init_dpb[1]};
834
79.4k
    sps_mvc_ext_t *ps_sps_mvc_ext = ps_dpb_mgr->s_dpb_ivp_ctxt.ps_sps_mvc_ext;
835
836
79.4k
    UWORD16 u2_view_id = ps_cur_nalu_mvc_ext->u2_view_id;
837
79.4k
    WORD32 i4_cur_poc = ps_cur_au->i4_poc;
838
79.4k
    bool b_is_b_pic = !!(ps_cur_au->au4_pack_slc_typ[u2_view_order_id] & B_SLC_BIT);
839
79.4k
    UWORD8 *pu1_num_short_term_refs = ps_dpb_mgr->au1_num_active_st_refs;
840
79.4k
    UWORD8 *pu1_num_long_term_refs = ps_dpb_mgr->au1_num_active_lt_refs;
841
79.4k
    UWORD8 au1_total_num_refs[2] = {0};
842
843
79.4k
    memset(pu1_num_short_term_refs, 0, 2 * sizeof(pu1_num_short_term_refs[0]));
844
845
79.4k
    memset(pu1_num_long_term_refs, 0, 2 * sizeof(pu1_num_long_term_refs[0]));
846
847
79.4k
    ps_ref_au_data = ps_dpb_mgr->ps_dpb_st_head;
848
849
183k
    for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
850
103k
    {
851
103k
        aps_st_au_bufs[i] = ps_ref_au_data->ps_au_buf;
852
103k
        ps_ref_au_data = ps_ref_au_data->ps_prev_short;
853
103k
    }
854
855
79.4k
    qsort(aps_st_au_bufs, ps_dpb_mgr->u1_num_st_ref_bufs, sizeof(aps_st_au_bufs[0]),
856
79.4k
          b_is_b_pic ? qsort_poc_compare : qsort_pic_num_compare);
857
858
79.4k
    ps_ref_au_data = ps_dpb_mgr->ps_dpb_lt_head;
859
860
142k
    for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
861
62.8k
    {
862
62.8k
        aps_lt_au_bufs[i] = ps_ref_au_data->ps_au_buf;
863
62.8k
        ps_ref_au_data = ps_ref_au_data->ps_prev_long;
864
62.8k
    }
865
866
79.4k
    qsort(aps_lt_au_bufs, ps_dpb_mgr->u1_num_lt_ref_bufs, sizeof(aps_lt_au_bufs[0]),
867
79.4k
          qsort_lt_idx_compare);
868
869
79.4k
    if(b_is_b_pic)
870
28.2k
    {
871
34.0k
        for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
872
17.0k
        {
873
17.0k
            if(aps_st_au_bufs[i]->i4_poc >= i4_cur_poc)
874
11.3k
            {
875
11.3k
                break;
876
11.3k
            }
877
17.0k
        }
878
879
34.0k
        for(j = i - 1; j >= 0; j--)
880
5.71k
        {
881
5.71k
            aps_ref_pic_buf_lx[0][0] = aps_st_au_bufs[j][0];
882
5.71k
            aps_ref_pic_buf_lx[0]++;
883
5.71k
            pu1_num_short_term_refs[0]++;
884
5.71k
        }
885
886
55.9k
        for(j = i; j < ps_dpb_mgr->u1_num_st_ref_bufs; j++)
887
27.6k
        {
888
27.6k
            aps_ref_pic_buf_lx[1][0] = aps_st_au_bufs[j][0];
889
27.6k
            aps_ref_pic_buf_lx[1]++;
890
27.6k
            pu1_num_short_term_refs[1]++;
891
27.6k
        }
892
28.2k
    }
893
51.1k
    else
894
51.1k
    {
895
121k
        for(i = ps_dpb_mgr->u1_num_st_ref_bufs - 1; i >= 0; i--)
896
70.6k
        {
897
70.6k
            aps_ref_pic_buf_lx[0][0] = aps_st_au_bufs[i][0];
898
70.6k
            aps_ref_pic_buf_lx[0]++;
899
70.6k
            pu1_num_short_term_refs[0]++;
900
70.6k
        }
901
51.1k
    }
902
903
142k
    for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
904
62.8k
    {
905
153k
        for(j = 0; j < 1 + ((WORD32) b_is_b_pic); j++)
906
90.9k
        {
907
90.9k
            aps_ref_pic_buf_lx[j][0] = aps_lt_au_bufs[i][0];
908
90.9k
            aps_ref_pic_buf_lx[j]->u1_long_term_pic_num =
909
90.9k
                aps_ref_pic_buf_lx[j]->u1_long_term_frm_idx;
910
90.9k
            aps_ref_pic_buf_lx[j]++;
911
90.9k
            pu1_num_long_term_refs[j]++;
912
90.9k
        }
913
62.8k
    }
914
915
79.4k
    if(0 != u2_view_order_id)
916
1.15k
    {
917
1.15k
        ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs = 0;
918
919
2.30k
        for(i = 0; i < 1 + ((WORD32) b_is_b_pic); i++)
920
1.15k
        {
921
1.15k
            WORD32 i4_num_refs;
922
923
1.15k
            if(ps_cur_nalu_mvc_ext->u1_anchor_pic_flag)
924
29
            {
925
29
                ps_mvc_ivp_ref_data = &ps_sps_mvc_ext->as_anchor_ref_data[i][u2_view_order_id];
926
29
            }
927
1.12k
            else
928
1.12k
            {
929
1.12k
                ps_mvc_ivp_ref_data = &ps_sps_mvc_ext->as_non_anchor_ref_data[i][u2_view_order_id];
930
1.12k
            }
931
932
1.15k
            i4_num_refs = ps_mvc_ivp_ref_data->u1_num_refs;
933
934
3.41k
            for(j = 0; j < i4_num_refs; j++)
935
2.26k
            {
936
2.26k
                mvc_au_buffer_t *ps_au_buf;
937
2.26k
                mvc_au_mv_pred_t *ps_au_mv_data;
938
2.26k
                nalu_mvc_ext_t *ps_ref_nalu_mvc_ext;
939
940
2.26k
                WORD32 i4_pic_buf_id;
941
2.26k
                WORD32 i4_mv_buf_id;
942
943
2.26k
                UWORD16 u2_ref_view_id = ps_mvc_ivp_ref_data->au2_ref_view_ids[j];
944
945
2.26k
                ps_ref_nalu_mvc_ext = imvcd_get_nalu_mvc_ext(
946
2.26k
                    ps_dpb_mgr->s_dpb_ivp_ctxt.ps_nalu_mvc_exts, u2_view_order_id, u2_ref_view_id);
947
948
2.26k
                if(!ps_ref_nalu_mvc_ext->u1_inter_view_flag)
949
0
                {
950
0
                    continue;
951
0
                }
952
953
2.26k
                ps_au_buf = ih264_buf_mgr_get_next_free(
954
2.26k
                    ps_dpb_mgr->ps_mvc_au_buf_mgr->ps_buf_mgr_ctxt, &i4_pic_buf_id);
955
956
2.26k
                if(NULL == ps_au_buf)
957
0
                {
958
0
                    return ERROR_UNAVAIL_PICBUF_T;
959
0
                }
960
2.26k
                else
961
2.26k
                {
962
2.26k
                    ih264_buf_mgr_set_status(ps_dpb_mgr->ps_mvc_au_buf_mgr->ps_buf_mgr_ctxt,
963
2.26k
                                             i4_pic_buf_id, BUF_MGR_REF);
964
2.26k
                }
965
966
2.26k
                ps_au_mv_data = ih264_buf_mgr_get_next_free(
967
2.26k
                    ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr->ps_buf_mgr_ctxt, &i4_mv_buf_id);
968
969
2.26k
                if(NULL == ps_au_mv_data)
970
0
                {
971
0
                    return ERROR_UNAVAIL_PICBUF_T;
972
0
                }
973
2.26k
                else
974
2.26k
                {
975
2.26k
                    ih264_buf_mgr_set_status(ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr->ps_buf_mgr_ctxt,
976
2.26k
                                             i4_mv_buf_id, BUF_MGR_REF);
977
2.26k
                }
978
979
2.26k
                ps_au_buf->i4_pic_buf_id = i4_pic_buf_id;
980
2.26k
                ps_au_buf->i4_mv_buf_id = i4_mv_buf_id;
981
2.26k
                ps_au_buf->s_ivp_data.b_is_ivp_ref = true;
982
2.26k
                ps_au_buf->s_ivp_data.u2_ref_view_id = u2_ref_view_id;
983
984
2.26k
                imvcd_ivp_buf_copier(ps_cur_au, ps_au_buf, ps_cur_au->ps_au_mv_data, ps_au_mv_data,
985
2.26k
                                     u2_ref_view_id, u2_view_id);
986
987
2.26k
                ps_dpb_mgr->ps_mvc_au_buf_mgr->au1_au_buf_id_to_mv_buf_id_map[i4_pic_buf_id] =
988
2.26k
                    i4_mv_buf_id;
989
2.26k
                ps_dpb_mgr->ps_mvc_au_buf_mgr->aps_buf_id_to_au_buf_map[i4_pic_buf_id] = ps_au_buf;
990
2.26k
                ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr->aps_buf_id_to_mv_pred_buf_map[i4_mv_buf_id] =
991
2.26k
                    ps_au_mv_data;
992
993
2.26k
                ps_dpb_mgr->s_dpb_ivp_ctxt
994
2.26k
                    .au1_au_buf_ids[ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs] = i4_pic_buf_id;
995
2.26k
                ps_dpb_mgr->s_dpb_ivp_ctxt
996
2.26k
                    .au1_mv_buf_ids[ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs] = i4_mv_buf_id;
997
998
2.26k
                aps_ref_pic_buf_lx[i][0] = ps_au_buf[0];
999
1000
2.26k
                aps_ref_pic_buf_lx[i]++;
1001
2.26k
                pu1_num_short_term_refs[i]++;
1002
2.26k
                ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs++;
1003
2.26k
            }
1004
1.15k
        }
1005
1.15k
    }
1006
1007
187k
    for(i = 0; i < 1 + ((WORD32) b_is_b_pic); i++)
1008
107k
    {
1009
107k
        au1_total_num_refs[i] = pu1_num_short_term_refs[i] + pu1_num_long_term_refs[i];
1010
1011
107k
        if(pu1_num_short_term_refs[i] > MVC_MAX_REF_PICS)
1012
0
        {
1013
0
            return ERROR_NUM_REF;
1014
0
        }
1015
1016
107k
        if(au1_total_num_refs[i] > MVC_MAX_REF_PICS)
1017
0
        {
1018
0
            return ERROR_NUM_REF;
1019
0
        }
1020
1021
107k
        if(0 == au1_total_num_refs[i])
1022
31
        {
1023
31
            return ERROR_NUM_REF;
1024
31
        }
1025
107k
    }
1026
1027
    /* If list0 and list1 entries are same then swap the 0th and 1st entry */
1028
    /* of list 1 */
1029
79.3k
    {
1030
79.3k
        mvc_au_buffer_t *aps_ref_pic_bufs_lx[2] = {ps_dpb_mgr->as_init_dpb[0],
1031
79.3k
                                                   ps_dpb_mgr->as_init_dpb[1]};
1032
1033
79.3k
        if((au1_total_num_refs[0] == au1_total_num_refs[1]) && (au1_total_num_refs[0] > 1))
1034
1.41k
        {
1035
1.41k
            bool b_swap;
1036
1037
1.41k
            b_swap = true;
1038
1039
1.42k
            for(i = 0; i < au1_total_num_refs[0]; i++)
1040
1.41k
            {
1041
1.41k
                if(aps_ref_pic_bufs_lx[0][i]
1042
1.41k
                       .as_view_buffers[u2_view_id]
1043
1.41k
                       .as_component_bufs[Y]
1044
1.41k
                       .pv_data != aps_ref_pic_bufs_lx[1][i]
1045
1.41k
                                       .as_view_buffers[u2_view_id]
1046
1.41k
                                       .as_component_bufs[Y]
1047
1.41k
                                       .pv_data)
1048
1.40k
                {
1049
1.40k
                    b_swap = false;
1050
1051
1.40k
                    break;
1052
1.40k
                }
1053
1.41k
            }
1054
1055
1.41k
            if(b_swap)
1056
6
            {
1057
6
                SWAP(aps_ref_pic_bufs_lx[1][0], aps_ref_pic_bufs_lx[1][1], mvc_au_buffer_t);
1058
6
            }
1059
1.41k
        }
1060
79.3k
    }
1061
1062
79.3k
    return OK;
1063
79.4k
}
1064
1065
void imvcd_dpb_set_missing_refs_to_default(mvc_dpb_manager_t *ps_dpb_mgr,
1066
                                           ref_pic_list_mod_data_t *ps_ref_pic_list_mod_data,
1067
                                           mvc_au_buffer_t *ps_cur_au, UWORD8 u1_pred_lx)
1068
107k
{
1069
107k
    UWORD8 u1_num_refs = ps_dpb_mgr->au1_num_active_st_refs[u1_pred_lx] +
1070
107k
                         ps_dpb_mgr->au1_num_active_lt_refs[u1_pred_lx];
1071
1072
303k
    while(u1_num_refs < ps_ref_pic_list_mod_data->au1_num_active_refs[u1_pred_lx])
1073
196k
    {
1074
196k
        ps_dpb_mgr->as_init_dpb[u1_pred_lx][u1_num_refs] = ps_cur_au[0];
1075
196k
        ps_dpb_mgr->au1_num_active_st_refs[u1_pred_lx]++;
1076
196k
        u1_num_refs++;
1077
196k
    }
1078
107k
}
1079
1080
void imvcd_dpb_normalise_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr, UWORD16 u2_buf_mod_bitfield,
1081
                                      UWORD8 u1_num_bufs_modified, UWORD8 u1_pred_lx)
1082
107k
{
1083
107k
    WORD32 i;
1084
1085
107k
    UWORD8 u1_num_ref_bufs = ps_dpb_mgr->au1_num_active_st_refs[u1_pred_lx] +
1086
107k
                             ps_dpb_mgr->au1_num_active_lt_refs[u1_pred_lx];
1087
1088
499k
    for(i = 0; i < u1_num_ref_bufs; i++)
1089
392k
    {
1090
392k
        if(u1_num_bufs_modified >= MVC_MAX_REF_PICS)
1091
39
        {
1092
39
            return;
1093
39
        }
1094
1095
392k
        if(!(u2_buf_mod_bitfield & (1 << i)))
1096
389k
        {
1097
389k
            ps_dpb_mgr->aps_mod_dpb[u1_pred_lx][u1_num_bufs_modified++] =
1098
389k
                &ps_dpb_mgr->as_init_dpb[u1_pred_lx][i];
1099
389k
        }
1100
392k
    }
1101
107k
}
1102
1103
WORD32 imvcd_dpb_reorder_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr,
1104
                                      nalu_mvc_ext_t *ps_cur_nalu_mvc_ext,
1105
                                      mvc_au_buffer_t *ps_cur_au,
1106
                                      ref_pic_list_mod_data_t *ps_ref_pic_list_mod_data,
1107
                                      UWORD16 u2_view_order_id)
1108
79.2k
{
1109
79.2k
    WORD32 i, j;
1110
1111
79.2k
    sps_mvc_ext_t *ps_sps_mvc_ext = ps_dpb_mgr->s_dpb_ivp_ctxt.ps_sps_mvc_ext;
1112
1113
79.2k
    UWORD8 u1_anchor_pic_flag = ps_cur_nalu_mvc_ext->u1_anchor_pic_flag;
1114
79.2k
    WORD32 i4_cur_pic_num = ps_cur_au->i4_pic_num;
1115
79.2k
    WORD32 i4_max_pic_num = ps_dpb_mgr->i4_max_pic_num;
1116
79.2k
    bool b_is_b_pic = !!(ps_cur_au->au4_pack_slc_typ[u2_view_order_id] & B_SLC_BIT);
1117
1118
186k
    for(i = 0; i < 1 + ((WORD32) b_is_b_pic); i++)
1119
107k
    {
1120
107k
        mvc_ivp_ref_data_t *ps_mvc_ivp_ref_data;
1121
1122
107k
        UWORD16 u2_max_view_idx;
1123
1124
107k
        WORD32 i4_pred_pic_num = i4_cur_pic_num;
1125
107k
        WORD16 i2_pred_view_order_id = 0;  // -1; Need to check spec and JMVM implementation match
1126
107k
        UWORD8 *pu1_modification_of_pic_nums_idc =
1127
107k
            ps_ref_pic_list_mod_data->au1_modification_of_pic_nums_idc[i];
1128
107k
        WORD32 *pi4_abs_diff_pic_num_minus1 =
1129
107k
            ps_ref_pic_list_mod_data->ai4_abs_diff_pic_num_minus1[i];
1130
107k
        WORD32 *pi4_long_term_pic_num = ps_ref_pic_list_mod_data->ai4_long_term_pic_num[i];
1131
107k
        WORD32 *pi4_abs_diff_view_idx_minus1 =
1132
107k
            ps_ref_pic_list_mod_data->ai4_abs_diff_view_idx_minus1[i];
1133
107k
        UWORD8 u1_num_ref_bufs =
1134
107k
            ps_dpb_mgr->au1_num_active_st_refs[i] + ps_dpb_mgr->au1_num_active_lt_refs[i];
1135
107k
        UWORD16 u2_buf_mod_bitfield = 0;
1136
107k
        UWORD8 u1_num_bufs_modified = 0;
1137
1138
107k
        if(!ps_ref_pic_list_mod_data->au1_ref_pic_list_modification_flag_lx[i] ||
1139
5.22k
           (3 == pu1_modification_of_pic_nums_idc[0]))
1140
104k
        {
1141
104k
            imvcd_dpb_set_missing_refs_to_default(ps_dpb_mgr, ps_ref_pic_list_mod_data, ps_cur_au,
1142
104k
                                                  i);
1143
1144
104k
            imvcd_dpb_normalise_ref_pic_list(ps_dpb_mgr, u2_buf_mod_bitfield, u1_num_bufs_modified,
1145
104k
                                             i);
1146
1147
104k
            continue;
1148
104k
        }
1149
1150
2.71k
        ps_mvc_ivp_ref_data =
1151
2.71k
            (0 == u2_view_order_id)
1152
2.71k
                ? NULL
1153
2.71k
                : (u1_anchor_pic_flag
1154
1.14k
                       ? &ps_sps_mvc_ext->as_anchor_ref_data[i][u2_view_order_id]
1155
1.14k
                       : &ps_sps_mvc_ext->as_non_anchor_ref_data[i][u2_view_order_id]);
1156
2.71k
        u2_max_view_idx = (0 == u2_view_order_id) ? 0 : ps_mvc_ivp_ref_data->u1_num_refs;
1157
1158
2.71k
        do
1159
9.91k
        {
1160
9.91k
            if((0 == pu1_modification_of_pic_nums_idc[0]) ||
1161
8.85k
               (1 == pu1_modification_of_pic_nums_idc[0]))
1162
2.02k
            {
1163
2.02k
                WORD32 i4_mod_pic_num = pi4_abs_diff_pic_num_minus1[0];
1164
1165
2.02k
                UWORD8 u1_mod_buf_idx = u1_num_ref_bufs;
1166
1167
                /* According to section 7.4.3.1 from spec, */
1168
                /* this value is expected to be from the */
1169
                /* closed interval [0, i4_max_pic_num - 1] */
1170
2.02k
                if((i4_mod_pic_num < 0) || (i4_mod_pic_num >= i4_max_pic_num))
1171
54
                {
1172
54
                    return ERROR_DBP_MANAGER_T;
1173
54
                }
1174
1175
                /* +1 not accounted during initialisation, */
1176
                /* mainly to preclude integer overflow */
1177
1.96k
                i4_mod_pic_num++;
1178
1179
1.96k
                if(0 == pu1_modification_of_pic_nums_idc[0])
1180
1.01k
                {
1181
1.01k
                    i4_mod_pic_num = i4_pred_pic_num - i4_mod_pic_num;
1182
1183
1.01k
                    if(i4_mod_pic_num < 0)
1184
676
                    {
1185
676
                        i4_mod_pic_num += i4_max_pic_num;
1186
676
                    }
1187
1.01k
                }
1188
950
                else
1189
950
                {
1190
950
                    i4_mod_pic_num = i4_pred_pic_num + i4_mod_pic_num;
1191
1192
950
                    if(i4_mod_pic_num >= i4_max_pic_num)
1193
739
                    {
1194
739
                        i4_mod_pic_num -= i4_max_pic_num;
1195
739
                    }
1196
950
                }
1197
1198
1.96k
                if(i4_mod_pic_num > i4_cur_pic_num)
1199
880
                {
1200
880
                    i4_mod_pic_num -= i4_max_pic_num;
1201
880
                }
1202
1203
5.72k
                for(j = 0; j < u1_num_ref_bufs; j++)
1204
5.66k
                {
1205
5.66k
                    if(ps_dpb_mgr->as_init_dpb[i][j].i4_pic_num == i4_mod_pic_num)
1206
1.90k
                    {
1207
1.90k
                        u1_mod_buf_idx = j;
1208
1209
1.90k
                        break;
1210
1.90k
                    }
1211
5.66k
                }
1212
1213
1.96k
                if(u1_mod_buf_idx == u1_num_ref_bufs)
1214
59
                {
1215
59
                    return ERROR_DBP_MANAGER_T;
1216
59
                }
1217
1218
1.90k
                ps_dpb_mgr->aps_mod_dpb[i][u1_num_bufs_modified++] =
1219
1.90k
                    &ps_dpb_mgr->as_init_dpb[i][u1_mod_buf_idx];
1220
1221
1.90k
                u2_buf_mod_bitfield |= (1 << u1_mod_buf_idx);
1222
1.90k
                i4_pred_pic_num = i4_mod_pic_num;
1223
1.90k
            }
1224
7.89k
            else if(2 == pu1_modification_of_pic_nums_idc[0])
1225
1.90k
            {
1226
1.90k
                WORD32 i4_mod_lt_pic_num = pi4_long_term_pic_num[0];
1227
1.90k
                UWORD8 u1_mod_buf_idx = u1_num_ref_bufs;
1228
1229
1.90k
                if(pi4_long_term_pic_num[0] > (MAX_REF_BUFS + 1))
1230
1
                {
1231
1
                    return ERROR_DBP_MANAGER_T;
1232
1
                }
1233
1234
5.62k
                for(j = 0; j < u1_num_ref_bufs; j++)
1235
5.59k
                {
1236
5.59k
                    if(!ps_dpb_mgr->as_init_dpb[i][j].b_is_short_term_ref &&
1237
1.91k
                       (i4_mod_lt_pic_num == ps_dpb_mgr->as_init_dpb[i][j].u1_long_term_pic_num))
1238
1.87k
                    {
1239
1.87k
                        u1_mod_buf_idx = j;
1240
1241
1.87k
                        break;
1242
1.87k
                    }
1243
5.59k
                }
1244
1245
1.90k
                if(u1_mod_buf_idx == u1_num_ref_bufs)
1246
29
                {
1247
29
                    return ERROR_DBP_MANAGER_T;
1248
29
                }
1249
1250
1.87k
                ps_dpb_mgr->aps_mod_dpb[i][u1_num_bufs_modified++] =
1251
1.87k
                    &ps_dpb_mgr->as_init_dpb[i][u1_mod_buf_idx];
1252
1253
1.87k
                u2_buf_mod_bitfield |= (1 << u1_mod_buf_idx);
1254
1.87k
            }
1255
5.98k
            else if((4 == pu1_modification_of_pic_nums_idc[0]) ||
1256
2.58k
                    (5 == pu1_modification_of_pic_nums_idc[0]))
1257
3.46k
            {
1258
3.46k
                WORD32 i4_target_view_id;
1259
1260
3.46k
                WORD32 i4_mod_view_order_id = pi4_abs_diff_view_idx_minus1[0];
1261
3.46k
                UWORD8 u1_mod_buf_idx = u1_num_ref_bufs;
1262
1263
                /* According to section H.7.4.3.1.1 from spec, */
1264
                /* this value is expected to be from the */
1265
                /* closed interval [0, u2_max_view_idx - 1] */
1266
3.46k
                if((i4_mod_view_order_id < 0) || (i4_mod_view_order_id >= u2_max_view_idx))
1267
45
                {
1268
45
                    return ERROR_DBP_MANAGER_T;
1269
45
                }
1270
1271
                /* +1 not accounted during initialisation, */
1272
                /* mainly to preclude integer overflow */
1273
3.41k
                i4_mod_view_order_id++;
1274
1275
3.41k
                if(4 == pu1_modification_of_pic_nums_idc[0])
1276
3.39k
                {
1277
3.39k
                    i4_mod_view_order_id = i2_pred_view_order_id - i4_mod_view_order_id;
1278
1279
3.39k
                    if(i4_mod_view_order_id < 0)
1280
2.28k
                    {
1281
2.28k
                        i4_mod_view_order_id += u2_max_view_idx;
1282
2.28k
                    }
1283
3.39k
                }
1284
27
                else
1285
27
                {
1286
27
                    i4_mod_view_order_id = i2_pred_view_order_id + i4_mod_view_order_id;
1287
1288
27
                    if(i4_mod_view_order_id >= u2_max_view_idx)
1289
17
                    {
1290
17
                        i4_mod_view_order_id -= u2_max_view_idx;
1291
17
                    }
1292
27
                }
1293
1294
3.41k
                if((0 == u2_view_order_id) || (NULL == ps_mvc_ivp_ref_data))
1295
0
                {
1296
0
                    return ERROR_DBP_MANAGER_T;
1297
0
                }
1298
1299
3.41k
                i4_target_view_id = ps_mvc_ivp_ref_data->au2_ref_view_ids[i4_mod_view_order_id];
1300
1301
6.58k
                for(j = 0; j < u1_num_ref_bufs; j++)
1302
6.58k
                {
1303
6.58k
                    if(ps_dpb_mgr->as_init_dpb[i][j].s_ivp_data.b_is_ivp_ref)
1304
3.41k
                    {
1305
3.41k
                        if((ps_dpb_mgr->as_init_dpb[i][j].i4_pic_num == i4_cur_pic_num) &&
1306
3.41k
                           (ps_dpb_mgr->as_init_dpb[i][j].s_ivp_data.u2_ref_view_id ==
1307
3.41k
                            i4_target_view_id))
1308
3.41k
                        {
1309
3.41k
                            u1_mod_buf_idx = j;
1310
1311
3.41k
                            break;
1312
3.41k
                        }
1313
3.41k
                    }
1314
6.58k
                }
1315
1316
3.41k
                if(u1_mod_buf_idx == u1_num_ref_bufs)
1317
0
                {
1318
0
                    return ERROR_DBP_MANAGER_T;
1319
0
                }
1320
1321
3.41k
                u2_buf_mod_bitfield |= (1 << u1_mod_buf_idx);
1322
3.41k
                ps_dpb_mgr->aps_mod_dpb[i][u1_num_bufs_modified++] =
1323
3.41k
                    &ps_dpb_mgr->as_init_dpb[i][u1_mod_buf_idx];
1324
3.41k
                i2_pred_view_order_id = i4_mod_view_order_id;
1325
3.41k
            }
1326
2.52k
            else if(3 != pu1_modification_of_pic_nums_idc[0])
1327
0
            {
1328
0
                return ERROR_REFIDX_ORDER_T;
1329
0
            }
1330
2.52k
            else
1331
2.52k
            {
1332
2.52k
                break;
1333
2.52k
            }
1334
1335
7.20k
            pu1_modification_of_pic_nums_idc++;
1336
7.20k
            pi4_abs_diff_pic_num_minus1++;
1337
7.20k
            pi4_long_term_pic_num++;
1338
7.20k
            pi4_abs_diff_view_idx_minus1++;
1339
7.20k
        } while(true);
1340
1341
2.52k
        imvcd_dpb_set_missing_refs_to_default(ps_dpb_mgr, ps_ref_pic_list_mod_data, ps_cur_au, i);
1342
1343
2.52k
        imvcd_dpb_normalise_ref_pic_list(ps_dpb_mgr, u2_buf_mod_bitfield, u1_num_bufs_modified, i);
1344
2.52k
    }
1345
1346
79.0k
    return OK;
1347
79.2k
}
1348
1349
WORD32 imvcd_dpb_insert_st_node(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buffer_t *ps_au_buf)
1350
84.2k
{
1351
84.2k
    WORD32 i;
1352
1353
84.2k
    mvc_dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
1354
84.2k
    UWORD8 u1_picture_type = ps_au_buf->u1_picturetype;
1355
1356
189k
    for(i = 0; i < MVC_MAX_REF_PICS; i++)
1357
189k
    {
1358
189k
        if((ps_dpb_info[i].ps_au_buf == ps_au_buf) && ps_dpb_info[i].b_used_as_ref)
1359
0
        {
1360
            /* Can occur only for field bottom pictures */
1361
0
            if(ps_dpb_info[i].ps_au_buf->u1_pic_type == FRM_PIC)
1362
0
            {
1363
0
                return ERROR_DBP_MANAGER_T;
1364
0
            }
1365
0
            else
1366
0
            {
1367
0
                ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
1368
1369
0
                return OK;
1370
0
            }
1371
0
        }
1372
1373
189k
        if(!ps_dpb_info[i].b_used_as_ref &&
1374
84.2k
           (ps_dpb_info[i].s_top_field.u1_reference_info == UNUSED_FOR_REF) &&
1375
84.2k
           (ps_dpb_info[i].s_bot_field.u1_reference_info == UNUSED_FOR_REF))
1376
84.2k
        {
1377
84.2k
            break;
1378
84.2k
        }
1379
189k
    }
1380
1381
84.2k
    if(i == MVC_MAX_REF_PICS)
1382
0
    {
1383
0
        return ERROR_DBP_MANAGER_T;
1384
0
    }
1385
1386
84.2k
    ps_dpb_info[i].ps_au_buf = ps_au_buf;
1387
84.2k
    ps_dpb_info[i].ps_prev_short = ps_dpb_mgr->ps_dpb_st_head;
1388
84.2k
    ps_dpb_info[i].b_used_as_ref = true;
1389
1390
84.2k
    ps_dpb_mgr->ps_dpb_st_head = ps_dpb_info + i;
1391
1392
84.2k
    ps_dpb_mgr->u1_num_st_ref_bufs++;
1393
1394
84.2k
    ps_au_buf->b_is_short_term_ref = true;
1395
1396
84.2k
    if((u1_picture_type & 0x03) == FRM_PIC)
1397
84.2k
    {
1398
84.2k
        ps_dpb_info[i].s_top_field.u1_reference_info = IS_SHORT_TERM;
1399
84.2k
        ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
1400
84.2k
    }
1401
0
    else if((u1_picture_type & 0x03) == TOP_FLD)
1402
0
    {
1403
0
        ps_dpb_info[i].s_top_field.u1_reference_info = IS_SHORT_TERM;
1404
0
    }
1405
0
    else if((u1_picture_type & 0x03) == BOT_FLD)
1406
0
    {
1407
0
        ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
1408
0
    }
1409
1410
84.2k
    return OK;
1411
84.2k
}
1412
1413
static WORD32 imvcd_dpb_delete_gap_frm_mmco(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_frame_num,
1414
                                            UWORD8 *pu1_del_node)
1415
9.01k
{
1416
9.01k
    WORD8 i, j;
1417
9.01k
    WORD32 *pi4_start, *pi4_end;
1418
9.01k
    WORD32 i4_start_frm_num, i4_end_frm_num, i4_max_pic_num;
1419
1420
    /* find the least frame num from gaps and current DPB node    */
1421
    /* Delete the gaps                                            */
1422
9.01k
    *pu1_del_node = 1;
1423
9.01k
    pi4_start = ps_dpb_mgr->ai4_gaps_start_frm_num;
1424
9.01k
    pi4_end = ps_dpb_mgr->ai4_gaps_end_frm_num;
1425
9.01k
    i4_max_pic_num = ps_dpb_mgr->i4_max_pic_num;
1426
1427
9.01k
    if(0 == ps_dpb_mgr->u1_num_gaps)
1428
2.64k
    {
1429
2.64k
        return OK;
1430
2.64k
    }
1431
1432
6.36k
    if(i4_frame_num < 0)
1433
1.45k
    {
1434
1.45k
        i4_frame_num += i4_max_pic_num;
1435
1.45k
    }
1436
1437
21.2k
    for(i = 0; i < MAX_FRAMES; i++)
1438
20.3k
    {
1439
20.3k
        i4_start_frm_num = pi4_start[i];
1440
1441
20.3k
        if(i4_start_frm_num < 0)
1442
103
        {
1443
103
            i4_start_frm_num += i4_max_pic_num;
1444
103
        }
1445
1446
20.3k
        if(INVALID_FRAME_NUM != i4_start_frm_num)
1447
6.63k
        {
1448
6.63k
            i4_end_frm_num = pi4_end[i];
1449
1450
6.63k
            if(i4_end_frm_num < 0)
1451
262
            {
1452
262
                i4_end_frm_num += i4_max_pic_num;
1453
262
            }
1454
1455
6.63k
            if((i4_frame_num >= i4_start_frm_num) && (i4_frame_num <= i4_end_frm_num))
1456
5.24k
            {
1457
5.24k
                break;
1458
5.24k
            }
1459
1.38k
            else
1460
1.38k
            {
1461
1.38k
                if(((i4_frame_num + i4_max_pic_num) >= i4_start_frm_num) &&
1462
982
                   ((i4_frame_num + i4_max_pic_num) <= i4_end_frm_num))
1463
203
                {
1464
203
                    return ERROR_DBP_MANAGER_T;
1465
203
                }
1466
1.38k
            }
1467
6.63k
        }
1468
20.3k
    }
1469
1470
    /* find frame_num index, in the poc_map which needs to be deleted */
1471
49.5k
    for(j = 0; j < MAX_FRAMES; j++)
1472
48.1k
    {
1473
48.1k
        if(i4_frame_num == ps_dpb_mgr->as_display_buf_info[j].i4_frame_num)
1474
4.74k
        {
1475
4.74k
            break;
1476
4.74k
        }
1477
48.1k
    }
1478
1479
6.16k
    if(MAX_FRAMES != i)
1480
5.24k
    {
1481
5.24k
        if(j == MAX_FRAMES)
1482
629
        {
1483
629
            return ERROR_DBP_MANAGER_T;
1484
629
        }
1485
1486
4.61k
        ps_dpb_mgr->as_display_buf_info[j].i4_poc_buf_id = -1;
1487
4.61k
        ps_dpb_mgr->as_display_buf_info[j].i4_poc = 0x7fffffff;
1488
4.61k
        ps_dpb_mgr->as_display_buf_info[j].i4_frame_num = GAP_FRAME_NUM;
1489
1490
4.61k
        ps_dpb_mgr->i1_gaps_deleted++;
1491
4.61k
        ps_dpb_mgr->ai1_gaps_per_seq[i]--;
1492
4.61k
        ps_dpb_mgr->u1_num_gaps--;
1493
4.61k
        *pu1_del_node = 0;
1494
1495
4.61k
        if(0 == ps_dpb_mgr->ai1_gaps_per_seq[i])
1496
464
        {
1497
464
            ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
1498
464
            ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
1499
464
        }
1500
4.61k
    }
1501
917
    else
1502
917
    {
1503
917
        return ERROR_DBP_MANAGER_T;
1504
917
    }
1505
1506
4.61k
    return OK;
1507
6.16k
}
1508
1509
static WORD32 imvcd_dpb_insert_lt_node(mvc_dpb_manager_t *ps_dpb_mgr, mvc_dpb_info_t *ps_new_node,
1510
                                       UWORD32 u4_lt_idx)
1511
28.1k
{
1512
28.1k
    ps_new_node->s_top_field.u1_reference_info = IS_LONG_TERM;
1513
28.1k
    ps_new_node->s_bot_field.u1_reference_info = IS_LONG_TERM;
1514
28.1k
    ps_new_node->s_top_field.u1_long_term_frame_idx = u4_lt_idx;
1515
28.1k
    ps_new_node->s_bot_field.u1_long_term_frame_idx = u4_lt_idx;
1516
28.1k
    ps_new_node->ps_au_buf->u1_long_term_frm_idx = u4_lt_idx;
1517
28.1k
    ps_new_node->b_used_as_ref = true;
1518
1519
28.1k
    if(ps_dpb_mgr->u1_num_lt_ref_bufs > 0)
1520
4.69k
    {
1521
4.69k
        WORD32 i;
1522
1523
4.69k
        mvc_dpb_info_t **pps_next_node = &ps_dpb_mgr->ps_dpb_lt_head;
1524
1525
8.45k
        for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1526
8.45k
        {
1527
8.45k
            if((*pps_next_node)->ps_au_buf->u1_long_term_frm_idx > u4_lt_idx)
1528
1.91k
            {
1529
1.91k
                ps_new_node->ps_prev_long = *pps_next_node;
1530
1.91k
                *pps_next_node = ps_new_node;
1531
1532
1.91k
                break;
1533
1.91k
            }
1534
6.53k
            else if(NULL == (*pps_next_node)->ps_prev_long)
1535
2.78k
            {
1536
2.78k
                (*pps_next_node)->ps_prev_long = ps_new_node;
1537
2.78k
                ps_new_node->ps_prev_long = NULL;
1538
1539
2.78k
                break;
1540
2.78k
            }
1541
1542
3.75k
            pps_next_node = &(*pps_next_node)->ps_prev_long;
1543
3.75k
        }
1544
4.69k
    }
1545
23.4k
    else
1546
23.4k
    {
1547
23.4k
        ps_dpb_mgr->ps_dpb_lt_head = ps_new_node;
1548
23.4k
        ps_new_node->ps_prev_long = NULL;
1549
23.4k
    }
1550
1551
28.1k
    ps_new_node->ps_au_buf->b_is_short_term_ref = false;
1552
1553
28.1k
    ps_dpb_mgr->u1_num_lt_ref_bufs++;
1554
1555
28.1k
    return OK;
1556
28.1k
}
1557
1558
static WORD32 imvcd_dpb_delete_lt_node(mvc_dpb_manager_t *ps_dpb_mgr, UWORD32 u4_lt_idx)
1559
38.1k
{
1560
38.1k
    mvc_dpb_info_t *ps_next_dpb;
1561
38.1k
    mvc_dpb_info_t *ps_unmark_node;
1562
1563
38.1k
    WORD32 i;
1564
1565
38.1k
    if(ps_dpb_mgr->u1_num_lt_ref_bufs > 0)
1566
11.3k
    {
1567
11.3k
        ps_next_dpb = ps_dpb_mgr->ps_dpb_lt_head;
1568
1569
11.3k
        if(ps_next_dpb->ps_au_buf->u1_long_term_frm_idx == u4_lt_idx)
1570
1.65k
        {
1571
1.65k
            ps_unmark_node = ps_next_dpb;
1572
1.65k
        }
1573
9.69k
        else
1574
9.69k
        {
1575
19.6k
            for(i = 1; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1576
12.8k
            {
1577
12.8k
                if(ps_next_dpb->ps_prev_long->ps_au_buf->u1_long_term_frm_idx == u4_lt_idx)
1578
2.87k
                {
1579
2.87k
                    break;
1580
2.87k
                }
1581
1582
9.99k
                ps_next_dpb = ps_next_dpb->ps_prev_long;
1583
9.99k
            }
1584
1585
9.69k
            if(i < ps_dpb_mgr->u1_num_lt_ref_bufs)
1586
2.87k
            {
1587
2.87k
                ps_unmark_node = ps_next_dpb->ps_prev_long;
1588
2.87k
            }
1589
6.82k
            else
1590
6.82k
            {
1591
6.82k
                return OK;
1592
6.82k
            }
1593
9.69k
        }
1594
1595
4.52k
        ps_unmark_node->b_used_as_ref = false;
1596
1597
4.52k
        if(ps_unmark_node == ps_dpb_mgr->ps_dpb_lt_head)
1598
1.65k
        {
1599
1.65k
            ps_dpb_mgr->ps_dpb_lt_head = ps_next_dpb->ps_prev_long;
1600
1.65k
        }
1601
1602
4.52k
        ps_unmark_node->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1603
4.52k
        ps_unmark_node->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1604
1605
4.52k
        imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr, ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1606
4.52k
                            ps_unmark_node->ps_au_buf->i4_pic_buf_id);
1607
1608
4.52k
        ps_next_dpb->ps_prev_long = ps_unmark_node->ps_prev_long;
1609
4.52k
        ps_unmark_node->ps_prev_long = NULL;
1610
4.52k
        ps_dpb_mgr->u1_num_lt_ref_bufs--;
1611
4.52k
    }
1612
1613
31.2k
    return OK;
1614
38.1k
}
1615
1616
WORD32 imvcd_dpb_delete_st_node_or_make_lt(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_pic_num,
1617
                                           UWORD32 u4_lt_idx)
1618
32.1k
{
1619
32.1k
    WORD32 i4_error_code;
1620
1621
32.1k
    mvc_dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1622
32.1k
    mvc_dpb_info_t *ps_unmark_node = NULL;
1623
1624
32.1k
    UWORD8 u1_del_node = 0, u1_del_st = 0;
1625
32.1k
    WORD32 i = 0;
1626
1627
32.1k
    if(ps_next_dpb->ps_au_buf->i4_pic_num == i4_pic_num)
1628
28.7k
    {
1629
28.7k
        ps_unmark_node = ps_next_dpb;
1630
28.7k
    }
1631
3.40k
    else
1632
3.40k
    {
1633
4.79k
        for(i = 1; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1634
1.61k
        {
1635
1.61k
            if(ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_num == i4_pic_num)
1636
222
            {
1637
222
                ps_unmark_node = ps_next_dpb->ps_prev_short;
1638
1639
222
                break;
1640
222
            }
1641
1642
1.38k
            ps_next_dpb = ps_next_dpb->ps_prev_short;
1643
1.38k
        }
1644
3.40k
    }
1645
1646
32.1k
    if(i == ps_dpb_mgr->u1_num_st_ref_bufs)
1647
3.18k
    {
1648
3.18k
        if(ps_dpb_mgr->u1_num_gaps)
1649
3.02k
        {
1650
3.02k
            i4_error_code = imvcd_dpb_delete_gap_frm_mmco(ps_dpb_mgr, i4_pic_num, &u1_del_st);
1651
1652
3.02k
            if(i4_error_code != OK)
1653
445
            {
1654
445
                return i4_error_code;
1655
445
            }
1656
3.02k
        }
1657
162
        else
1658
162
        {
1659
162
            return ERROR_DBP_MANAGER_T;
1660
162
        }
1661
1662
2.57k
        if(u1_del_st)
1663
0
        {
1664
0
            return ERROR_DBP_MANAGER_T;
1665
0
        }
1666
2.57k
        else
1667
2.57k
        {
1668
2.57k
            return 0;
1669
2.57k
        }
1670
2.57k
    }
1671
1672
28.9k
    ps_unmark_node->b_used_as_ref = false;
1673
28.9k
    ps_unmark_node->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1674
28.9k
    ps_unmark_node->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1675
1676
28.9k
    if(ps_unmark_node == ps_dpb_mgr->ps_dpb_st_head)
1677
28.7k
    {
1678
28.7k
        ps_dpb_mgr->ps_dpb_st_head = ps_next_dpb->ps_prev_short;
1679
28.7k
    }
1680
222
    else
1681
222
    {
1682
222
        ps_next_dpb->ps_prev_short = ps_unmark_node->ps_prev_short;
1683
222
    }
1684
1685
28.9k
    ps_dpb_mgr->u1_num_st_ref_bufs--;
1686
28.9k
    u1_del_node = 1;
1687
1688
28.9k
    if(u4_lt_idx == (MAX_REF_BUFS + 1))
1689
816
    {
1690
816
        if(u1_del_node)
1691
816
        {
1692
816
            imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
1693
816
                                ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1694
816
                                ps_unmark_node->ps_au_buf->i4_pic_buf_id);
1695
1696
816
            ps_unmark_node->ps_prev_short = NULL;
1697
816
        }
1698
816
    }
1699
28.1k
    else
1700
28.1k
    {
1701
28.1k
        i4_error_code = imvcd_dpb_delete_lt_node(ps_dpb_mgr, u4_lt_idx);
1702
1703
28.1k
        if(i4_error_code != OK)
1704
0
        {
1705
0
            return i4_error_code;
1706
0
        }
1707
1708
28.1k
        i4_error_code = imvcd_dpb_insert_lt_node(ps_dpb_mgr, ps_unmark_node, u4_lt_idx);
1709
1710
28.1k
        if(i4_error_code != OK)
1711
0
        {
1712
0
            return i4_error_code;
1713
0
        }
1714
28.1k
    }
1715
1716
28.9k
    return OK;
1717
28.9k
}
1718
1719
WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_mgr,
1720
                         mvc_au_buffer_t *ps_cur_au, UWORD8 u1_max_num_ref_frames,
1721
                         UWORD8 u1_curr_pic_in_err)
1722
56.9k
{
1723
56.9k
    mvc_dpb_info_t *ps_next_dpb;
1724
1725
56.9k
    WORD32 i, j;
1726
56.9k
    UWORD8 u1_buf_mode, u1_marked_lt;
1727
56.9k
    UWORD8 u1_num_gaps;
1728
56.9k
    WORD32 i4_error_code;
1729
1730
56.9k
    UWORD8 u1_del_node = 1;
1731
56.9k
    UWORD8 u1_insert_st_pic = 1;
1732
1733
    // 0 - sliding window; 1 - Adaptive
1734
56.9k
    u1_buf_mode = ps_dpb_cmds->u1_buf_mode;
1735
56.9k
    u1_marked_lt = 0;
1736
56.9k
    u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
1737
1738
56.9k
    if(!u1_buf_mode)
1739
31.3k
    {
1740
        // Sliding window - implements 8.2.5.3
1741
31.3k
        if((ps_dpb_mgr->u1_num_st_ref_bufs + ps_dpb_mgr->u1_num_lt_ref_bufs + u1_num_gaps) ==
1742
31.3k
           u1_max_num_ref_frames)
1743
19.0k
        {
1744
19.0k
            UWORD8 u1_new_node_flag = 1;
1745
1746
19.0k
            if((0 == ps_dpb_mgr->u1_num_st_ref_bufs) && (0 == u1_num_gaps))
1747
74
            {
1748
74
                return ERROR_DBP_MANAGER_T;
1749
74
            }
1750
1751
            // Chase the links to reach the last but one picNum, if available
1752
18.9k
            ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1753
1754
18.9k
            if(ps_dpb_mgr->u1_num_st_ref_bufs > 1)
1755
3.09k
            {
1756
3.09k
                if(ps_next_dpb->ps_au_buf->i4_pic_num == ps_cur_au->i4_pic_num)
1757
181
                {
1758
181
                    return ERROR_DBP_MANAGER_T;
1759
181
                }
1760
1761
4.02k
                for(i = 1; i < (ps_dpb_mgr->u1_num_st_ref_bufs - 1); i++)
1762
1.13k
                {
1763
1.13k
                    if(ps_next_dpb == NULL)
1764
0
                    {
1765
0
                        return ERROR_DBP_MANAGER_T;
1766
0
                    }
1767
1768
1.13k
                    if(ps_next_dpb->ps_au_buf->i4_pic_num == ps_cur_au->i4_pic_num)
1769
27
                    {
1770
27
                        return ERROR_DBP_MANAGER_T;
1771
27
                    }
1772
1773
1.10k
                    ps_next_dpb = ps_next_dpb->ps_prev_short;
1774
1.10k
                }
1775
1776
2.88k
                if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
1777
25
                {
1778
25
                    return ERROR_DBP_MANAGER_T;
1779
25
                }
1780
1781
2.85k
                if(u1_new_node_flag)
1782
2.85k
                {
1783
2.85k
                    if(u1_num_gaps)
1784
2.40k
                    {
1785
2.40k
                        i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
1786
2.40k
                            ps_dpb_mgr, ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_num,
1787
2.40k
                            &u1_del_node);
1788
1789
2.40k
                        if(i4_error_code != OK)
1790
0
                        {
1791
0
                            return i4_error_code;
1792
0
                        }
1793
2.40k
                    }
1794
1795
2.85k
                    if(u1_del_node)
1796
2.85k
                    {
1797
2.85k
                        ps_dpb_mgr->u1_num_st_ref_bufs--;
1798
2.85k
                        ps_next_dpb->ps_prev_short->b_used_as_ref = false;
1799
2.85k
                        ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1800
2.85k
                        ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1801
1802
2.85k
                        imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
1803
2.85k
                                            ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1804
2.85k
                                            ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_buf_id);
1805
1806
2.85k
                        ps_next_dpb->ps_prev_short->ps_au_buf = NULL;
1807
2.85k
                        ps_next_dpb->ps_prev_short = NULL;
1808
2.85k
                    }
1809
2.85k
                }
1810
2.85k
            }
1811
15.8k
            else
1812
15.8k
            {
1813
15.8k
                if(ps_dpb_mgr->u1_num_st_ref_bufs)
1814
15.7k
                {
1815
15.7k
                    i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
1816
15.7k
                        ps_dpb_mgr, ps_next_dpb->ps_au_buf->i4_pic_num, &u1_del_node);
1817
1818
15.7k
                    if(i4_error_code != OK)
1819
0
                    {
1820
0
                        return i4_error_code;
1821
0
                    }
1822
1823
15.7k
                    if((ps_next_dpb->ps_au_buf->i4_pic_num != ps_cur_au->i4_pic_num) && u1_del_node)
1824
3.88k
                    {
1825
3.88k
                        ps_dpb_mgr->u1_num_st_ref_bufs--;
1826
3.88k
                        ps_next_dpb->b_used_as_ref = false;
1827
3.88k
                        ps_next_dpb->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1828
3.88k
                        ps_next_dpb->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1829
1830
3.88k
                        imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
1831
3.88k
                                            ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1832
3.88k
                                            ps_next_dpb->ps_au_buf->i4_pic_buf_id);
1833
1834
3.88k
                        ps_next_dpb->ps_au_buf = NULL;
1835
3.88k
                        ps_next_dpb->ps_prev_short = NULL;
1836
3.88k
                        ps_dpb_mgr->ps_dpb_st_head = NULL;
1837
3.88k
                        ps_next_dpb = NULL;
1838
3.88k
                    }
1839
11.8k
                    else if(ps_next_dpb->ps_au_buf->i4_pic_num == ps_cur_au->i4_pic_num)
1840
11.8k
                    {
1841
11.8k
                        if(u1_curr_pic_in_err)
1842
0
                        {
1843
0
                            u1_insert_st_pic = 0;
1844
0
                        }
1845
11.8k
                        else if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1846
11.8k
                        {
1847
11.8k
                            ps_dpb_mgr->u1_num_st_ref_bufs--;
1848
11.8k
                            ps_next_dpb->b_used_as_ref = false;
1849
11.8k
                            ps_next_dpb->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1850
11.8k
                            ps_next_dpb->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1851
1852
11.8k
                            imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
1853
11.8k
                                                ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1854
11.8k
                                                ps_next_dpb->ps_au_buf->i4_pic_buf_id);
1855
1856
11.8k
                            ps_next_dpb->ps_au_buf = NULL;
1857
11.8k
                            ps_next_dpb = NULL;
1858
11.8k
                        }
1859
11.8k
                    }
1860
15.7k
                }
1861
63
                else
1862
63
                {
1863
63
                    i4_error_code = imvcd_dpb_delete_gap_frm_sliding(ps_dpb_mgr, INVALID_FRAME_NUM,
1864
63
                                                                     &u1_del_node);
1865
1866
63
                    if(i4_error_code != OK)
1867
0
                    {
1868
0
                        return i4_error_code;
1869
0
                    }
1870
1871
63
                    if(u1_del_node)
1872
63
                    {
1873
63
                        return ERROR_DBP_MANAGER_T;
1874
63
                    }
1875
63
                }
1876
15.8k
            }
1877
18.9k
        }
1878
31.3k
    }
1879
25.6k
    else
1880
25.6k
    {
1881
        // Adaptive memory control - implements 8.2.5.4
1882
25.6k
        struct MMCParams *ps_mmc_params;
1883
1884
25.6k
        UWORD32 u4_mmco;
1885
25.6k
        UWORD32 u4_diff_pic_num;
1886
25.6k
        UWORD32 u4_lt_idx;
1887
1888
25.6k
        UWORD32 au4_num_mmco_cmds[NUM_MMCO_CMD_IDS] = {0};
1889
1890
62.0k
        for(j = 0; j < ps_dpb_cmds->u1_num_of_commands; j++)
1891
46.7k
        {
1892
46.7k
            ps_mmc_params = &ps_dpb_cmds->as_mmc_params[j];
1893
46.7k
            u4_mmco = ps_mmc_params->u4_mmco;
1894
1895
46.7k
            switch(u4_mmco)
1896
46.7k
            {
1897
9.90k
                case MARK_ST_PICNUM_AS_NONREF:
1898
9.90k
                {
1899
9.90k
                    WORD64 i8_pic_num;
1900
1901
9.90k
                    u4_diff_pic_num = ps_mmc_params->u4_diff_pic_num;
1902
9.90k
                    i8_pic_num =
1903
9.90k
                        ((WORD64) ps_cur_au->i4_pic_num) - ((WORD64) (u4_diff_pic_num + 1));
1904
1905
9.90k
                    if(IS_OUT_OF_RANGE_S32(i8_pic_num))
1906
97
                    {
1907
97
                        return ERROR_DBP_MANAGER_T;
1908
97
                    }
1909
1910
9.80k
                    if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1911
3.81k
                    {
1912
3.81k
                        i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
1913
3.81k
                            ps_dpb_mgr, (WORD32) i8_pic_num, MAX_REF_BUFS + 1);
1914
1915
3.81k
                        if(i4_error_code != OK)
1916
559
                        {
1917
559
                            return i4_error_code;
1918
559
                        }
1919
3.81k
                    }
1920
5.99k
                    else
1921
5.99k
                    {
1922
5.99k
                        UWORD8 u1_dummy;
1923
1924
5.99k
                        i4_error_code = imvcd_dpb_delete_gap_frm_mmco(
1925
5.99k
                            ps_dpb_mgr, (WORD32) i8_pic_num, &u1_dummy);
1926
1927
5.99k
                        if(i4_error_code != OK)
1928
1.30k
                        {
1929
1.30k
                            return i4_error_code;
1930
1.30k
                        }
1931
5.99k
                    }
1932
1933
7.94k
                    break;
1934
9.80k
                }
1935
9.94k
                case MARK_LT_INDEX_AS_NONREF:
1936
9.94k
                {
1937
9.94k
                    u4_lt_idx = ps_mmc_params->u4_lt_idx;
1938
1939
9.94k
                    i4_error_code = imvcd_dpb_delete_lt_node(ps_dpb_mgr, u4_lt_idx);
1940
1941
9.94k
                    if(i4_error_code != OK)
1942
0
                    {
1943
0
                        return i4_error_code;
1944
0
                    }
1945
1946
9.94k
                    break;
1947
9.94k
                }
1948
9.94k
                case MARK_ST_PICNUM_AS_LT_INDEX:
1949
754
                {
1950
754
                    WORD64 i8_pic_num;
1951
1952
754
                    u4_diff_pic_num = ps_mmc_params->u4_diff_pic_num;
1953
1954
754
                    i8_pic_num =
1955
754
                        ((WORD64) ps_cur_au->i4_pic_num) - ((WORD64) (u4_diff_pic_num + 1));
1956
1957
754
                    if(IS_OUT_OF_RANGE_S32(i8_pic_num))
1958
82
                    {
1959
82
                        return ERROR_DBP_MANAGER_T;
1960
82
                    }
1961
1962
672
                    u4_lt_idx = ps_mmc_params->u4_lt_idx;
1963
1964
672
                    if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
1965
626
                       (u4_lt_idx > ps_dpb_mgr->u1_max_lt_frame_idx))
1966
172
                    {
1967
172
                        return ERROR_DBP_MANAGER_T;
1968
172
                    }
1969
1970
500
                    if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1971
191
                    {
1972
191
                        i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
1973
191
                            ps_dpb_mgr, (WORD32) i8_pic_num, u4_lt_idx);
1974
1975
191
                        if(i4_error_code != OK)
1976
48
                        {
1977
48
                            return i4_error_code;
1978
48
                        }
1979
191
                    }
1980
1981
452
                    break;
1982
500
                }
1983
8.00k
                case SET_MAX_LT_INDEX:
1984
8.00k
                {
1985
8.00k
                    if(au4_num_mmco_cmds[SET_MAX_LT_INDEX] > 0)
1986
495
                    {
1987
495
                        return ERROR_DBP_MANAGER_T;
1988
495
                    }
1989
1990
7.51k
                    u4_lt_idx =
1991
7.51k
                        ps_mmc_params->u4_max_lt_idx_plus1;  // Get Max_long_term_index_plus1
1992
1993
7.51k
                    if((u4_lt_idx <= ps_dpb_mgr->u1_max_lt_frame_idx) &&
1994
2.14k
                       (ps_dpb_mgr->u1_num_lt_ref_bufs > 0))
1995
1.44k
                    {
1996
1.44k
                        mvc_dpb_info_t *ps_nxtDPB;
1997
1998
                        // Set all LT buffers with index >= u4_lt_idx to nonreference
1999
1.44k
                        ps_nxtDPB = ps_dpb_mgr->ps_dpb_lt_head;
2000
1.44k
                        ps_next_dpb = ps_nxtDPB->ps_prev_long;
2001
2002
1.44k
                        if(ps_nxtDPB->ps_au_buf->u1_long_term_frm_idx >= u4_lt_idx)
2003
195
                        {
2004
195
                            i = 0;
2005
195
                            ps_dpb_mgr->ps_dpb_lt_head = NULL;
2006
195
                        }
2007
1.24k
                        else
2008
1.24k
                        {
2009
2.27k
                            for(i = 1; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
2010
1.36k
                            {
2011
1.36k
                                if(ps_next_dpb->ps_au_buf->u1_long_term_frm_idx >= u4_lt_idx)
2012
335
                                {
2013
335
                                    break;
2014
335
                                }
2015
2016
1.02k
                                ps_nxtDPB = ps_next_dpb;
2017
1.02k
                                ps_next_dpb = ps_next_dpb->ps_prev_long;
2018
1.02k
                            }
2019
2020
1.24k
                            ps_nxtDPB->ps_prev_long = NULL;  // Terminate the link of the
2021
                                                             // closest LTIndex that is <=Max
2022
1.24k
                        }
2023
2024
1.44k
                        ps_dpb_mgr->u1_num_lt_ref_bufs = i;
2025
2026
1.44k
                        if(i == 0)
2027
195
                        {
2028
195
                            ps_next_dpb = ps_nxtDPB;
2029
195
                        }
2030
2031
1.44k
                        for(; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
2032
0
                        {
2033
0
                            ps_nxtDPB = ps_next_dpb;
2034
0
                            ps_nxtDPB->b_used_as_ref = false;
2035
0
                            ps_nxtDPB->s_top_field.u1_reference_info = UNUSED_FOR_REF;
2036
0
                            ps_nxtDPB->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
2037
2038
0
                            imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
2039
0
                                                ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
2040
0
                                                ps_nxtDPB->ps_au_buf->i4_pic_buf_id);
2041
2042
0
                            ps_nxtDPB->ps_au_buf = NULL;
2043
2044
0
                            ps_next_dpb = ps_nxtDPB->ps_prev_long;
2045
0
                            ps_nxtDPB->ps_prev_long = NULL;
2046
0
                        }
2047
1.44k
                    }
2048
2049
7.51k
                    if(u4_lt_idx == 0)
2050
732
                    {
2051
732
                        ps_dpb_mgr->u1_max_lt_frame_idx = NO_LONG_TERM_INDICIES;
2052
732
                    }
2053
6.78k
                    else
2054
6.78k
                    {
2055
6.78k
                        ps_dpb_mgr->u1_max_lt_frame_idx = u4_lt_idx - 1;
2056
6.78k
                    }
2057
2058
7.51k
                    break;
2059
8.00k
                }
2060
11.2k
                case SET_LT_INDEX:
2061
11.2k
                {
2062
11.2k
                    if(au4_num_mmco_cmds[SET_LT_INDEX] > 0)
2063
511
                    {
2064
511
                        return ERROR_DBP_MANAGER_T;
2065
511
                    }
2066
2067
10.7k
                    u4_lt_idx = ps_mmc_params->u4_lt_idx;  // Get long term index
2068
2069
10.7k
                    if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
2070
10.7k
                       (u4_lt_idx > ps_dpb_mgr->u1_max_lt_frame_idx))
2071
188
                    {
2072
188
                        return ERROR_DBP_MANAGER_T;
2073
188
                    }
2074
2075
10.5k
                    i4_error_code = imvcd_dpb_insert_st_node(ps_dpb_mgr, ps_cur_au);
2076
2077
10.5k
                    if(i4_error_code != OK)
2078
0
                    {
2079
0
                        return i4_error_code;
2080
0
                    }
2081
2082
10.5k
                    if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
2083
10.5k
                    {
2084
10.5k
                        i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
2085
10.5k
                            ps_dpb_mgr, ps_cur_au->i4_pic_num, u4_lt_idx);
2086
2087
10.5k
                        if(i4_error_code != OK)
2088
0
                        {
2089
0
                            return i4_error_code;
2090
0
                        }
2091
10.5k
                    }
2092
0
                    else
2093
0
                    {
2094
0
                        return ERROR_DBP_MANAGER_T;
2095
0
                    }
2096
2097
10.5k
                    u1_marked_lt = 1;
2098
2099
10.5k
                    break;
2100
10.5k
                }
2101
5.09k
                case RESET_REF_PICTURES:
2102
5.09k
                {
2103
5.09k
                    if((au4_num_mmco_cmds[RESET_REF_PICTURES] > 0) ||
2104
5.09k
                       (au4_num_mmco_cmds[MARK_ST_PICNUM_AS_NONREF] > 0) ||
2105
4.40k
                       (au4_num_mmco_cmds[MARK_LT_INDEX_AS_NONREF] > 0) ||
2106
3.20k
                       (au4_num_mmco_cmds[MARK_ST_PICNUM_AS_LT_INDEX] > 0))
2107
2.08k
                    {
2108
2.08k
                        return ERROR_DBP_MANAGER_T;
2109
2.08k
                    }
2110
2111
3.00k
                    if((j > 0) && (ps_dpb_cmds->as_mmc_params[j - 1].u4_mmco == SET_LT_INDEX))
2112
224
                    {
2113
224
                        return ERROR_DBP_MANAGER_T;
2114
224
                    }
2115
2116
2.78k
                    __attribute__((fallthrough));
2117
2.78k
                }
2118
3.60k
                case RESET_ALL_PICTURES:
2119
3.60k
                {
2120
3.60k
                    WORD32 i4_pic_num = ps_cur_au->i4_frame_num;
2121
2122
3.60k
                    imvcd_reset_dpb(ps_dpb_mgr);
2123
2124
3.60k
                    ps_cur_au->i4_frame_num = 0;
2125
2126
3.60k
                    if(!u1_marked_lt && u1_insert_st_pic)
2127
2.88k
                    {
2128
2.88k
                        i4_error_code = imvcd_dpb_insert_st_node(ps_dpb_mgr, ps_cur_au);
2129
2130
2.88k
                        if(i4_error_code != OK)
2131
0
                        {
2132
0
                            return i4_error_code;
2133
0
                        }
2134
2.88k
                    }
2135
2136
3.60k
                    ps_cur_au->i4_frame_num = i4_pic_num;
2137
2138
3.60k
                    return OK;
2139
3.60k
                }
2140
974
                default:
2141
974
                {
2142
974
                    return ERROR_DBP_MANAGER_T;
2143
3.60k
                }
2144
46.7k
            }
2145
2146
36.4k
            au4_num_mmco_cmds[u4_mmco]++;
2147
36.4k
        }
2148
25.6k
    }
2149
2150
46.2k
    if(!u1_marked_lt && u1_insert_st_pic)
2151
41.4k
    {
2152
41.4k
        i4_error_code = imvcd_dpb_insert_st_node(ps_dpb_mgr, ps_cur_au);
2153
2154
41.4k
        if(i4_error_code != OK)
2155
0
        {
2156
0
            return i4_error_code;
2157
0
        }
2158
41.4k
    }
2159
2160
46.2k
    return OK;
2161
46.2k
}
2162
2163
WORD32 imvcd_dpb_update_default_index_list(mvc_dpb_manager_t *ps_dpb_mgr)
2164
87.1k
{
2165
87.1k
    WORD32 i;
2166
2167
87.1k
    mvc_dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
2168
2169
222k
    for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
2170
135k
    {
2171
135k
        ps_dpb_mgr->aps_def_dpb[i] = ps_next_dpb->ps_au_buf;
2172
135k
        ps_next_dpb = ps_next_dpb->ps_prev_short;
2173
135k
    }
2174
2175
87.1k
    ps_next_dpb = ps_dpb_mgr->ps_dpb_lt_head;
2176
2177
148k
    for(; i < ps_dpb_mgr->u1_num_st_ref_bufs + ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
2178
61.8k
    {
2179
61.8k
        ps_dpb_mgr->aps_def_dpb[i] = ps_next_dpb->ps_au_buf;
2180
61.8k
        ps_next_dpb = ps_next_dpb->ps_prev_long;
2181
61.8k
    }
2182
2183
87.1k
    return OK;
2184
87.1k
}
2185
2186
bool imvcd_dpb_is_diff_poc_valid(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_curr_poc)
2187
126k
{
2188
126k
    WORD32 i;
2189
2190
126k
    mvc_dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
2191
2192
    /* Check in conformance with section 8.2.1 from spec */
2193
    /* Particularly the statement - */
2194
    /* 'The bitstream shall not contain data that result in values of DiffPicOrderCnt(picA, picB)
2195
     * used in the decoding process that exceed the range of -2^15 to 2^15 - 1 inclusive' */
2196
260k
    for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
2197
133k
    {
2198
133k
        if(((((WORD64) i4_curr_poc) - ((WORD64) ps_next_dpb->ps_au_buf->i4_poc)) >= (1 << 15)) ||
2199
133k
           ((((WORD64) i4_curr_poc) - ((WORD64) ps_next_dpb->ps_au_buf->i4_poc)) < -(1 << 15)))
2200
56
        {
2201
56
            return false;
2202
56
        }
2203
2204
133k
        ps_next_dpb = ps_next_dpb->ps_prev_short;
2205
133k
    }
2206
2207
126k
    return true;
2208
126k
}