Coverage Report

Created: 2025-12-14 06:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/ih264d_dpb_mgr.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2015 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#ifdef __ANDROID__
21
#include <android/log.h>
22
#endif
23
#include "ih264_typedefs.h"
24
#include "ih264_macros.h"
25
#include "ih264_platform_macros.h"
26
#include "iv.h"
27
#include "ih264d_dpb_manager.h"
28
#include "ih264d_bitstrm.h"
29
#include "ih264d_parse_cavlc.h"
30
#include "ih264d_defs.h"
31
#include "ih264d_structs.h"
32
#include "ih264d_process_bslice.h"
33
#include "ih264d_debug.h"
34
#include "ih264d_tables.h"
35
#include "ih264d_error_handler.h"
36
#include "string.h"
37
#include "ih264d_defs.h"
38
#include "ih264_error.h"
39
#include "ih264_buf_mgr.h"
40
#include "assert.h"
41
42
#ifdef __ANDROID__
43
#ifndef ALOG
44
#define ALOG(priority, tag, ...) ((void)__android_log_print(ANDROID_##priority, tag, __VA_ARGS__))
45
#define ALOGE(...) ALOG(LOG_ERROR, NULL, __VA_ARGS__)
46
inline int android_errorWriteLog(int tag, const char* subTag) {
47
    ALOGE("android_errorWriteLog(%x, %s)", tag, subTag);
48
    return 0;
49
}
50
#endif
51
#endif
52
53
/*!
54
 ***************************************************************************
55
 * \file ih264d_dpb_mgr.c
56
 *
57
 * \brief
58
 *    Functions for managing the decoded picture buffer
59
 *
60
 * Detailed_description
61
 *
62
 * \date
63
 *    19-12-2002
64
 *
65
 * \author  Sriram Sethuraman
66
 ***************************************************************************
67
 */
68
69
/*!
70
 **************************************************************************
71
 * \if Function name : ih264d_init_ref_bufs \endif
72
 *
73
 * \brief
74
 *    Called at the start for initialization.
75
 *
76
 * \return
77
 *    none
78
 **************************************************************************
79
 */
80
void ih264d_init_ref_bufs(dpb_manager_t *ps_dpb_mgr)
81
128k
{
82
128k
    UWORD32 i;
83
128k
    struct dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
84
4.22M
    for(i = 0; i < MAX_REF_BUFS; i++)
85
4.09M
    {
86
4.09M
        ps_dpb_info[i].u1_used_as_ref = UNUSED_FOR_REF;
87
4.09M
        ps_dpb_info[i].u1_lt_idx = MAX_REF_BUFS + 1;
88
4.09M
        ps_dpb_info[i].ps_prev_short = NULL;
89
4.09M
        ps_dpb_info[i].ps_prev_long = NULL;
90
4.09M
        ps_dpb_info[i].ps_pic_buf = NULL;
91
4.09M
        ps_dpb_info[i].s_top_field.u1_reference_info = UNUSED_FOR_REF;
92
4.09M
        ps_dpb_info[i].s_bot_field.u1_reference_info = UNUSED_FOR_REF;
93
4.09M
        ps_dpb_info[i].s_top_field.u1_long_term_frame_idx = MAX_REF_BUFS + 1;
94
4.09M
        ps_dpb_info[i].s_bot_field.u1_long_term_frame_idx = MAX_REF_BUFS + 1;
95
96
4.09M
    }
97
128k
    ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
98
128k
    ps_dpb_mgr->ps_dpb_st_head = NULL;
99
128k
    ps_dpb_mgr->ps_dpb_ht_head = NULL;
100
128k
    ps_dpb_mgr->i1_gaps_deleted = 0;
101
128k
    ps_dpb_mgr->i1_poc_buf_id_entries = 0;
102
128k
    ps_dpb_mgr->u1_mmco_error_in_seq = 0;
103
104
128k
    ps_dpb_mgr->u1_num_gaps = 0;
105
2.17M
    for(i = 0; i < MAX_FRAMES; i++)
106
2.04M
    {
107
2.04M
        ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
108
2.04M
        ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
109
2.04M
        ps_dpb_mgr->ai1_gaps_per_seq[i] = 0;
110
2.04M
        ps_dpb_mgr->ai4_poc_buf_id_map[i][0] = -1;
111
2.04M
        ps_dpb_mgr->ai4_poc_buf_id_map[i][1] = 0x7fffffff;
112
2.04M
        ps_dpb_mgr->ai4_poc_buf_id_map[i][2] = 0;
113
2.04M
    }
114
115
128k
}
116
117
void ih264d_free_ref_pic_mv_bufs(void* pv_dec, UWORD8 pic_buf_id)
118
85.0k
{
119
85.0k
    dec_struct_t *ps_dec = (dec_struct_t *)pv_dec;
120
121
85.0k
    if((pic_buf_id == ps_dec->u1_pic_buf_id) &&
122
38.1k
                    ps_dec->ps_cur_slice->u1_field_pic_flag &&
123
204
                    (ps_dec->u1_top_bottom_decoded == 0))
124
32
    {
125
32
        return;
126
32
    }
127
128
85.0k
    ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
129
85.0k
                          pic_buf_id,
130
85.0k
                          BUF_MGR_REF);
131
85.0k
    ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
132
85.0k
                          ps_dec->as_buf_id_info_map[pic_buf_id].mv_buf_id,
133
85.0k
                          BUF_MGR_REF);
134
85.0k
}
135
/*!
136
 **************************************************************************
137
 * \if Function name : ih264d_delete_lt_node \endif
138
 *
139
 * \brief
140
 *    Delete a buffer with a long term index from the LT linked list
141
 *
142
 * \return
143
 *    none
144
 **************************************************************************
145
 */
146
WORD32 ih264d_delete_lt_node(dpb_manager_t *ps_dpb_mgr,
147
                             UWORD32 u4_lt_idx,
148
                             UWORD8 u1_fld_pic_flag,
149
                             struct dpb_info_t *ps_lt_node_to_insert,
150
                             WORD32 *pi4_status)
151
20.2k
{
152
20.2k
    *pi4_status = 0;
153
20.2k
    if(ps_dpb_mgr->u1_num_lt_ref_bufs > 0)
154
3.10k
    {
155
3.10k
        WORD32 i;
156
3.10k
        struct dpb_info_t *ps_next_dpb;
157
        /* ps_unmark_node points to the node to be removed */
158
        /* from long term list.                            */
159
3.10k
        struct dpb_info_t *ps_unmark_node;
160
        //Find the node with matching LTIndex
161
3.10k
        ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
162
3.10k
        if(ps_next_dpb->u1_lt_idx == u4_lt_idx)
163
1.40k
        {
164
1.40k
            ps_unmark_node = ps_next_dpb;
165
1.40k
        }
166
1.70k
        else
167
1.70k
        {
168
2.55k
            for(i = 1; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
169
1.24k
            {
170
1.24k
                if(ps_next_dpb->ps_prev_long->u1_lt_idx == u4_lt_idx)
171
395
                    break;
172
854
                ps_next_dpb = ps_next_dpb->ps_prev_long;
173
854
            }
174
1.70k
            if(i == ps_dpb_mgr->u1_num_lt_ref_bufs)
175
1.30k
                *pi4_status = 1;
176
395
            else
177
395
                ps_unmark_node = ps_next_dpb->ps_prev_long;
178
1.70k
        }
179
180
3.10k
        if(*pi4_status == 0)
181
1.79k
        {
182
1.79k
            if(u1_fld_pic_flag)
183
0
            {
184
0
                if(ps_lt_node_to_insert != ps_unmark_node)
185
0
                {
186
0
                    UWORD8 u1_deleted = 0;
187
                    /* for the ps_unmark_node mark the corresponding field */
188
                    /* field as unused for reference                       */
189
190
0
                    if(ps_unmark_node->s_top_field.u1_long_term_frame_idx
191
0
                                    == u4_lt_idx)
192
0
                    {
193
0
                        ps_unmark_node->s_top_field.u1_reference_info =
194
0
                                        UNUSED_FOR_REF;
195
0
                        ps_unmark_node->s_top_field.u1_long_term_frame_idx =
196
0
                        MAX_REF_BUFS + 1;
197
0
                        u1_deleted = 1;
198
0
                    }
199
0
                    if(ps_unmark_node->s_bot_field.u1_long_term_frame_idx
200
0
                                    == u4_lt_idx)
201
0
                    {
202
0
                        ps_unmark_node->s_bot_field.u1_reference_info =
203
0
                                        UNUSED_FOR_REF;
204
0
                        ps_unmark_node->s_bot_field.u1_long_term_frame_idx =
205
0
                        MAX_REF_BUFS + 1;
206
0
                        u1_deleted = 1;
207
0
                    }
208
209
0
                    if(!u1_deleted)
210
0
                    {
211
212
0
                        UWORD32 i4_error_code;
213
0
                        i4_error_code = ERROR_DBP_MANAGER_T;
214
215
0
                        return i4_error_code;
216
0
                    }
217
0
                }
218
219
0
                ps_unmark_node->u1_used_as_ref =
220
0
                                ps_unmark_node->s_top_field.u1_reference_info
221
0
                                                | ps_unmark_node->s_bot_field.u1_reference_info;
222
0
            }
223
1.79k
            else
224
1.79k
                ps_unmark_node->u1_used_as_ref = UNUSED_FOR_REF;
225
226
1.79k
            if(UNUSED_FOR_REF == ps_unmark_node->u1_used_as_ref)
227
1.79k
            {
228
1.79k
                if(ps_unmark_node == ps_dpb_mgr->ps_dpb_ht_head)
229
1.40k
                    ps_dpb_mgr->ps_dpb_ht_head = ps_next_dpb->ps_prev_long;
230
231
1.79k
                ps_unmark_node->u1_lt_idx = MAX_REF_BUFS + 1;
232
1.79k
                ps_unmark_node->s_top_field.u1_reference_info =
233
1.79k
                UNUSED_FOR_REF;
234
1.79k
                ps_unmark_node->s_bot_field.u1_reference_info =
235
1.79k
                UNUSED_FOR_REF;
236
                // Release the physical buffer
237
1.79k
                ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
238
1.79k
                                            ps_unmark_node->u1_buf_id);
239
1.79k
                ps_next_dpb->ps_prev_long = ps_unmark_node->ps_prev_long; //update link
240
1.79k
                ps_unmark_node->ps_prev_long = NULL;
241
1.79k
                ps_dpb_mgr->u1_num_lt_ref_bufs--; //decrement LT buf count
242
1.79k
            }
243
1.79k
        }
244
3.10k
    }
245
20.2k
    return OK;
246
20.2k
}
247
248
/*!
249
 **************************************************************************
250
 * \if Function name : ih264d_insert_lt_node \endif
251
 *
252
 * \brief
253
 *    Insert a buffer into the LT linked list at a given LT index
254
 *
255
 * \return
256
 *    none
257
 **************************************************************************
258
 */
259
WORD32 ih264d_insert_lt_node(dpb_manager_t *ps_dpb_mgr,
260
                           struct dpb_info_t *ps_mov_node,
261
                           UWORD32 u4_lt_idx,
262
                           UWORD8 u1_fld_pic_flag)
263
18.2k
{
264
18.2k
    UWORD8 u1_mark_top_field_long_term = 0;
265
18.2k
    UWORD8 u1_mark_bot_field_long_term = 0;
266
267
18.2k
    {
268
18.2k
        if(u1_fld_pic_flag)
269
49
        {
270
            /* Assign corresponding field (top or bottom) long_term_frame_idx */
271
272
49
            if((ps_mov_node->s_top_field.u1_reference_info == IS_LONG_TERM)
273
25
                            && (ps_mov_node->s_bot_field.u1_reference_info
274
25
                                            == IS_LONG_TERM))
275
24
            {
276
24
                if(ps_mov_node->u1_lt_idx == u4_lt_idx)
277
0
                    u1_mark_bot_field_long_term = 1;
278
24
                else
279
24
                {
280
281
24
                    UWORD32 i4_error_code;
282
24
                    i4_error_code = ERROR_DBP_MANAGER_T;
283
284
24
                    return i4_error_code;
285
286
24
                }
287
24
            }
288
25
            else if(ps_mov_node->s_top_field.u1_reference_info == IS_LONG_TERM)
289
1
            {
290
1
                u1_mark_top_field_long_term = 1;
291
1
            }
292
293
25
            if(!(u1_mark_top_field_long_term || u1_mark_bot_field_long_term))
294
24
            {
295
24
                UWORD32 i4_error_code;
296
24
                i4_error_code = ERROR_DBP_MANAGER_T;
297
24
                return i4_error_code;
298
24
            }
299
25
        }
300
18.2k
        else
301
18.2k
        {
302
18.2k
            ps_mov_node->s_top_field.u1_reference_info = IS_LONG_TERM;
303
18.2k
            ps_mov_node->s_bot_field.u1_reference_info = IS_LONG_TERM;
304
18.2k
            ps_mov_node->s_top_field.u1_long_term_frame_idx = u4_lt_idx;
305
18.2k
            ps_mov_node->s_bot_field.u1_long_term_frame_idx = u4_lt_idx;
306
18.2k
            u1_mark_bot_field_long_term = 1;
307
18.2k
            u1_mark_top_field_long_term = 1;
308
18.2k
        }
309
310
18.2k
        ps_mov_node->u1_lt_idx = u4_lt_idx; //Assign the LT index to the node
311
18.2k
        ps_mov_node->ps_pic_buf->u1_long_term_frm_idx = u4_lt_idx;
312
18.2k
        ps_mov_node->u1_used_as_ref = IS_LONG_TERM;
313
314
        /* Insert the new long term in the LT list with  u4_lt_idx    */
315
        /* in ascending order.                                         */
316
18.2k
        if(ps_dpb_mgr->u1_num_lt_ref_bufs > 0)
317
1.72k
        {
318
1.72k
            struct dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
319
1.72k
            if(u4_lt_idx < ps_next_dpb->u1_lt_idx)
320
411
            {
321
                //LTIndex to be inserted is the smallest LT index
322
                //Update head and point prev to the next higher index
323
411
                ps_mov_node->ps_prev_long = ps_next_dpb;
324
411
                ps_dpb_mgr->ps_dpb_ht_head = ps_mov_node;
325
411
            }
326
1.30k
            else
327
1.30k
            {
328
1.30k
                WORD32 i;
329
1.30k
                struct dpb_info_t *ps_nxtDPB = ps_next_dpb;
330
1.30k
                ps_next_dpb = ps_next_dpb->ps_prev_long;
331
1.87k
                for(i = 1; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
332
752
                {
333
752
                    if(ps_next_dpb->u1_lt_idx > u4_lt_idx)
334
188
                        break;
335
564
                    ps_nxtDPB = ps_next_dpb;
336
564
                    ps_next_dpb = ps_next_dpb->ps_prev_long;
337
564
                }
338
339
1.30k
                ps_nxtDPB->ps_prev_long = ps_mov_node;
340
1.30k
                ps_mov_node->ps_prev_long = ps_next_dpb;
341
1.30k
            }
342
1.72k
        }
343
16.4k
        else
344
16.4k
        {
345
16.4k
            ps_dpb_mgr->ps_dpb_ht_head = ps_mov_node;
346
16.4k
            ps_mov_node->ps_prev_long = NULL;
347
16.4k
        }
348
        /* Identify the picture buffer as a long term picture buffer */
349
18.2k
        ps_mov_node->ps_pic_buf->u1_is_short = 0;
350
351
        /* Increment LT buf count only if new LT node inserted    */
352
        /* If Increment during top_field is done, don't increment */
353
        /* for bottom field, as both them are part of same pic.   */
354
18.2k
        if(u1_mark_bot_field_long_term)
355
18.2k
            ps_dpb_mgr->u1_num_lt_ref_bufs++;
356
357
18.2k
    }
358
18.2k
    return OK;
359
18.2k
}
360
361
/*!
362
 **************************************************************************
363
 * \if Function name : ih264d_insert_st_node \endif
364
 *
365
 * \brief
366
 *    Adds a short term reference picture into the ST linked list
367
 *
368
 * \return
369
 *    None
370
 *
371
 * \note
372
 *    Called only for a new coded picture with nal_ref_idc!=0
373
 **************************************************************************
374
 */
375
WORD32 ih264d_insert_st_node(dpb_manager_t *ps_dpb_mgr,
376
                          struct pic_buffer_t *ps_pic_buf,
377
                          UWORD8 u1_buf_id,
378
                          UWORD32 u4_cur_pic_num)
379
115k
{
380
115k
    WORD32 i;
381
115k
    struct dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
382
115k
    UWORD8 u1_picture_type = ps_pic_buf->u1_picturetype;
383
    /* Find an unused dpb location */
384
130k
    for(i = 0; i < MAX_REF_BUFS; i++)
385
130k
    {
386
130k
        if((ps_dpb_info[i].ps_pic_buf == ps_pic_buf)
387
980
                        && ps_dpb_info[i].u1_used_as_ref)
388
375
        {
389
            /*signal an error in the case of frame pic*/
390
375
            if(ps_dpb_info[i].ps_pic_buf->u1_pic_type == FRM_PIC)
391
265
            {
392
265
                return ERROR_DBP_MANAGER_T;
393
265
            }
394
110
            else
395
110
            {
396
                /* Can occur only for field bottom pictures */
397
110
                ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
398
110
                return OK;
399
110
            }
400
375
        }
401
402
129k
        if((ps_dpb_info[i].u1_used_as_ref == UNUSED_FOR_REF)
403
115k
                        && (ps_dpb_info[i].s_top_field.u1_reference_info
404
115k
                                        == UNUSED_FOR_REF)
405
115k
                        && (ps_dpb_info[i].s_bot_field.u1_reference_info
406
115k
                                        == UNUSED_FOR_REF))
407
115k
            break;
408
129k
    }
409
115k
    if(i == MAX_REF_BUFS)
410
0
    {
411
0
        UWORD32 i4_error_code;
412
0
        i4_error_code = ERROR_DBP_MANAGER_T;
413
0
        return i4_error_code;
414
0
    }
415
416
    /* Create dpb info */
417
115k
    ps_dpb_info[i].ps_pic_buf = ps_pic_buf;
418
115k
    ps_dpb_info[i].ps_prev_short = ps_dpb_mgr->ps_dpb_st_head;
419
115k
    ps_dpb_info[i].u1_buf_id = u1_buf_id;
420
115k
    ps_dpb_info[i].u1_used_as_ref = TRUE;
421
115k
    ps_dpb_info[i].u1_lt_idx = MAX_REF_BUFS + 1;
422
115k
    ps_dpb_info[i].i4_frame_num = u4_cur_pic_num;
423
115k
    ps_dpb_info[i].ps_pic_buf->i4_frame_num = u4_cur_pic_num;
424
425
    /* update the head node of linked list to point to the cur Pic */
426
115k
    ps_dpb_mgr->ps_dpb_st_head = ps_dpb_info + i;
427
428
    // Increment Short term bufCount
429
115k
    ps_dpb_mgr->u1_num_st_ref_bufs++;
430
    /* Identify the picture as a short term picture buffer */
431
115k
    ps_pic_buf->u1_is_short = IS_SHORT_TERM;
432
433
115k
    if((u1_picture_type & 0x03) == FRM_PIC)
434
114k
    {
435
114k
        ps_dpb_info[i].u1_used_as_ref = IS_SHORT_TERM;
436
114k
        ps_dpb_info[i].s_top_field.u1_reference_info = IS_SHORT_TERM;
437
114k
        ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
438
114k
    }
439
440
115k
    if((u1_picture_type & 0x03) == TOP_FLD)
441
171
        ps_dpb_info[i].s_top_field.u1_reference_info = IS_SHORT_TERM;
442
443
115k
    if((u1_picture_type & 0x03) == BOT_FLD)
444
0
        ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
445
446
115k
    return OK;
447
115k
}
448
449
/*!
450
 **************************************************************************
451
 * \if Function name : ih264d_delete_st_node_or_make_lt \endif
452
 *
453
 * \brief
454
 *    Delete short term ref with a given picNum from the ST linked list or
455
 *     make it an LT node
456
 *
457
 * \return
458
 *    0 - if successful; -1 - otherwise
459
 *
460
 * \note
461
 *    Common parts to MMCO==1 and MMCO==3 have been combined here
462
 **************************************************************************
463
 */
464
WORD32 ih264d_delete_st_node_or_make_lt(dpb_manager_t *ps_dpb_mgr,
465
                                      WORD32 i4_pic_num,
466
                                      UWORD32 u4_lt_idx,
467
                                      UWORD8 u1_fld_pic_flag)
468
18.9k
{
469
18.9k
    WORD32 i;
470
18.9k
    struct dpb_info_t *ps_next_dpb;
471
18.9k
    WORD32 i4_frame_num = i4_pic_num;
472
18.9k
    struct dpb_info_t *ps_unmark_node = NULL;
473
18.9k
    UWORD8 u1_del_node = 0, u1_del_st = 0;
474
18.9k
    UWORD8 u1_reference_type = UNUSED_FOR_REF;
475
18.9k
    WORD32 ret;
476
477
18.9k
    if(u1_fld_pic_flag)
478
80
    {
479
80
        i4_frame_num = i4_frame_num >> 1;
480
481
80
        if(u4_lt_idx == (MAX_REF_BUFS + 1))
482
21
            u1_reference_type = UNUSED_FOR_REF;
483
59
        else
484
59
            u1_reference_type = IS_LONG_TERM;
485
80
    }
486
487
    //Find the node with matching picNum
488
18.9k
    ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
489
18.9k
    if((WORD32)ps_next_dpb->i4_frame_num == i4_frame_num)
490
18.3k
    {
491
18.3k
        ps_unmark_node = ps_next_dpb;
492
18.3k
    }
493
533
    else
494
533
    {
495
839
        for(i = 1; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
496
445
        {
497
445
            if((WORD32)ps_next_dpb->ps_prev_short->i4_frame_num == i4_frame_num)
498
139
                break;
499
306
            ps_next_dpb = ps_next_dpb->ps_prev_short;
500
306
        }
501
502
533
        if(i == ps_dpb_mgr->u1_num_st_ref_bufs)
503
394
        {
504
394
            if(ps_dpb_mgr->u1_num_gaps)
505
16
            {
506
16
                ret = ih264d_delete_gap_frm_mmco(ps_dpb_mgr, i4_frame_num, &u1_del_st);
507
16
                if(ret != OK)
508
0
                    return ret;
509
16
            }
510
378
            else
511
378
            {
512
378
                UWORD32 i4_error_code;
513
378
                i4_error_code = ERROR_DBP_MANAGER_T;
514
515
378
                return i4_error_code;
516
378
            }
517
518
16
            if(u1_del_st)
519
0
            {
520
0
                UWORD32 i4_error_code;
521
0
                i4_error_code = ERROR_DBP_MANAGER_T;
522
0
                return i4_error_code;
523
0
            }
524
16
            else
525
16
            {
526
16
                return 0;
527
16
            }
528
16
        }
529
139
        else
530
139
            ps_unmark_node = ps_next_dpb->ps_prev_short;
531
533
    }
532
533
18.5k
    if(u1_fld_pic_flag)
534
49
    {
535
        /* Mark the corresponding field ( top or bot) as  */
536
        /* UNUSED_FOR_REF or IS_LONG_TERM depending on    */
537
        /* u1_reference_type.                             */
538
49
        if(ps_unmark_node->s_top_field.i4_pic_num == i4_pic_num)
539
25
        {
540
25
            ps_unmark_node->s_top_field.u1_reference_info = u1_reference_type;
541
25
            ps_unmark_node->s_top_field.u1_long_term_frame_idx = u4_lt_idx;
542
25
            {
543
25
                UWORD8 *pu1_src = ps_unmark_node->ps_pic_buf->pu1_col_zero_flag;
544
25
                WORD32 i4_size = ((ps_dpb_mgr->u2_pic_wd
545
25
                                * ps_dpb_mgr->u2_pic_ht) >> 5);
546
                /* memset the colocated zero u4_flag buffer */
547
25
                memset(pu1_src, 0, i4_size);
548
25
            }
549
25
        }
550
551
24
        else if(ps_unmark_node->s_bot_field.i4_pic_num == i4_pic_num)
552
24
        {
553
554
24
            ps_unmark_node->s_bot_field.u1_reference_info = u1_reference_type;
555
24
            ps_unmark_node->s_bot_field.u1_long_term_frame_idx = u4_lt_idx;
556
24
            {
557
24
                UWORD8 *pu1_src =
558
24
                                ps_unmark_node->ps_pic_buf->pu1_col_zero_flag
559
24
                                                + ((ps_dpb_mgr->u2_pic_wd
560
24
                                                                * ps_dpb_mgr->u2_pic_ht)
561
24
                                                                >> 5);
562
24
                WORD32 i4_size = ((ps_dpb_mgr->u2_pic_wd
563
24
                                * ps_dpb_mgr->u2_pic_ht) >> 5);
564
                /* memset the colocated zero u4_flag buffer */
565
24
                memset(pu1_src, 0, i4_size);
566
24
            }
567
24
        }
568
49
        ps_unmark_node->u1_used_as_ref =
569
49
                        ps_unmark_node->s_top_field.u1_reference_info
570
49
                                        | ps_unmark_node->s_bot_field.u1_reference_info;
571
49
    }
572
18.4k
    else
573
18.4k
    {
574
18.4k
        ps_unmark_node->u1_used_as_ref = UNUSED_FOR_REF;
575
18.4k
        ps_unmark_node->s_top_field.u1_reference_info = UNUSED_FOR_REF;
576
18.4k
        ps_unmark_node->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
577
578
18.4k
        {
579
18.4k
            UWORD8 *pu1_src = ps_unmark_node->ps_pic_buf->pu1_col_zero_flag;
580
581
18.4k
            WORD32 i4_size = ((ps_dpb_mgr->u2_pic_wd
582
18.4k
                            * ps_dpb_mgr->u2_pic_ht) >> 4);
583
            /* memset the colocated zero u4_flag buffer */
584
18.4k
            memset(pu1_src, 0, i4_size);
585
18.4k
        }
586
18.4k
    }
587
588
18.5k
    if(!(ps_unmark_node->u1_used_as_ref & IS_SHORT_TERM))
589
18.5k
    {
590
18.5k
        if(ps_unmark_node == ps_dpb_mgr->ps_dpb_st_head)
591
18.3k
            ps_dpb_mgr->ps_dpb_st_head = ps_next_dpb->ps_prev_short;
592
139
        else
593
139
            ps_next_dpb->ps_prev_short = ps_unmark_node->ps_prev_short; //update link
594
18.5k
        ps_dpb_mgr->u1_num_st_ref_bufs--; //decrement ST buf count
595
18.5k
        u1_del_node = 1;
596
18.5k
    }
597
598
18.5k
    if(u4_lt_idx == MAX_REF_BUFS + 1)
599
270
    {
600
270
        if(u1_del_node)
601
270
        {
602
            // Release the physical buffer
603
270
            ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
604
270
                                        ps_unmark_node->u1_buf_id);
605
270
            ps_unmark_node->ps_prev_short = NULL;
606
270
        }
607
270
    }
608
18.2k
    else
609
18.2k
    {
610
18.2k
        WORD32 i4_status;
611
        //If another node has the same LT index, delete that node
612
18.2k
        ret = ih264d_delete_lt_node(ps_dpb_mgr, u4_lt_idx,
613
18.2k
                              u1_fld_pic_flag, ps_unmark_node, &i4_status);
614
18.2k
        if(ret != OK)
615
0
            return ret;
616
        // Now insert the short term node as a long term node
617
18.2k
        ret = ih264d_insert_lt_node(ps_dpb_mgr, ps_unmark_node, u4_lt_idx,
618
18.2k
                              u1_fld_pic_flag);
619
18.2k
        if(ret != OK)
620
48
            return ret;
621
18.2k
    }
622
18.4k
    return OK;
623
18.5k
}
624
/*!
625
 **************************************************************************
626
 * \if Function name : ih264d_reset_ref_bufs \endif
627
 *
628
 * \brief
629
 *    Called if MMCO==5/7 or on the first slice of an IDR picture
630
 *
631
 * \return
632
 *    none
633
 **************************************************************************
634
 */
635
void ih264d_reset_ref_bufs(dpb_manager_t *ps_dpb_mgr)
636
204k
{
637
204k
    WORD32 i;
638
204k
    struct dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
639
640
6.74M
    for(i = 0; i < MAX_REF_BUFS; i++)
641
6.53M
    {
642
6.53M
        if(ps_dpb_info[i].u1_used_as_ref)
643
78.2k
        {
644
78.2k
            ps_dpb_info[i].u1_used_as_ref = UNUSED_FOR_REF;
645
78.2k
            ps_dpb_info[i].u1_lt_idx = MAX_REF_BUFS + 1;
646
78.2k
            ps_dpb_info[i].ps_prev_short = NULL;
647
78.2k
            ps_dpb_info[i].ps_prev_long = NULL;
648
78.2k
            ps_dpb_info[i].ps_pic_buf = NULL;
649
78.2k
            ps_dpb_info[i].s_top_field.u1_reference_info = UNUSED_FOR_REF;
650
78.2k
            ps_dpb_info[i].s_bot_field.u1_reference_info = UNUSED_FOR_REF;
651
78.2k
            ps_dpb_info[i].s_top_field.u1_long_term_frame_idx = MAX_REF_BUFS + 1;
652
78.2k
            ps_dpb_info[i].s_bot_field.u1_long_term_frame_idx = MAX_REF_BUFS + 1;
653
654
            //Release physical buffer
655
78.2k
            ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
656
78.2k
                                        ps_dpb_info[i].u1_buf_id);
657
78.2k
        }
658
6.53M
    }
659
204k
    ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
660
204k
    ps_dpb_mgr->ps_dpb_st_head = NULL;
661
204k
    ps_dpb_mgr->ps_dpb_ht_head = NULL;
662
204k
    ps_dpb_mgr->u1_mmco_error_in_seq = 0;
663
664
    /* release all gaps */
665
204k
    ps_dpb_mgr->u1_num_gaps = 0;
666
3.47M
    for(i = 0; i < MAX_FRAMES; i++)
667
3.26M
    {
668
3.26M
        ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
669
3.26M
        ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
670
3.26M
        ps_dpb_mgr->ai1_gaps_per_seq[i] = 0;
671
3.26M
    }
672
204k
}
673
674
/*!
675
 **************************************************************************
676
 * \if Function name : Name \endif
677
 *
678
 * \brief
679
 *     create the default index list after an MMCO
680
 *
681
 * \return
682
 *    0 - if no_error; -1 - error
683
 *
684
 **************************************************************************
685
 */
686
WORD32 ih264d_update_default_index_list(dpb_manager_t *ps_dpb_mgr)
687
116k
{
688
116k
    WORD32 i;
689
116k
    struct dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
690
691
228k
    for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
692
112k
    {
693
112k
        ps_dpb_mgr->ps_def_dpb[i] = ps_next_dpb->ps_pic_buf;
694
112k
        ps_next_dpb = ps_next_dpb->ps_prev_short;
695
112k
    }
696
697
116k
    ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
698
134k
    for(;i< ps_dpb_mgr->u1_num_st_ref_bufs + ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
699
18.1k
    {
700
18.1k
        ps_dpb_mgr->ps_def_dpb[i] = ps_next_dpb->ps_pic_buf;
701
18.1k
        ps_next_dpb = ps_next_dpb->ps_prev_long;
702
18.1k
    }
703
116k
    return 0;
704
116k
}
705
706
/*!
707
 **************************************************************************
708
 * \if Function name : ref_idx_reordering \endif
709
 *
710
 * \brief
711
 *     Parse the bitstream and reorder indices for the current slice
712
 *
713
 * \return
714
 *    0 - if no_error; -1 - error
715
 *
716
 * \note
717
 *    Called only if ref_idx_reordering_flag_l0 is decoded as 1
718
 *    Remove error checking for unmatching picNum or LTIndex later (if not needed)
719
 * \para
720
 *    This section implements 7.3.3.1 and 8.2.6.4
721
 *    Uses the default index list as the starting point and
722
 *    remaps the picNums sent to the next higher index in the
723
 *    modified list. The unmodified ones are copied from the
724
 *    default to modified list retaining their order in the default list.
725
 *
726
 **************************************************************************
727
 */
728
WORD32 ih264d_ref_idx_reordering(dec_struct_t *ps_dec, UWORD8 uc_lx)
729
72.2k
{
730
72.2k
    dpb_manager_t *ps_dpb_mgr = ps_dec->ps_dpb_mgr;
731
72.2k
    UWORD16 u4_cur_pic_num = ps_dec->ps_cur_slice->u2_frame_num;
732
    /*< Maximum Picture Number Minus 1 */
733
72.2k
    UWORD32 ui_max_frame_num =
734
72.2k
                    ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1 + 1;
735
736
72.2k
    WORD32 i, count = 0;
737
72.2k
    UWORD32 ui_remapIdc, ui_nextUev;
738
72.2k
    WORD16 u2_pred_frame_num = u4_cur_pic_num;
739
72.2k
    WORD32 i_temp;
740
72.2k
    UWORD16 u2_def_mod_flag = 0; /* Flag to keep track of which indices have been remapped */
741
72.2k
    UWORD8 modCount = 0;
742
72.2k
    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
743
72.2k
    UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
744
72.2k
    dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
745
72.2k
    UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
746
747
72.2k
    if(u1_field_pic_flag)
748
886
    {
749
886
        u4_cur_pic_num = u4_cur_pic_num * 2 + 1;
750
886
        ui_max_frame_num = ui_max_frame_num * 2;
751
886
    }
752
753
72.2k
    u2_pred_frame_num = u4_cur_pic_num;
754
755
72.2k
    ui_remapIdc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
756
757
74.6k
    while((ui_remapIdc != 3)
758
73.0k
                    && (count < ps_cur_slice->u1_num_ref_idx_lx_active[uc_lx]))
759
72.1k
    {
760
72.1k
        ui_nextUev = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
761
72.1k
        if(ui_remapIdc != 2)
762
66.7k
        {
763
66.7k
            if(ui_nextUev > ui_max_frame_num)
764
3.76k
                return ERROR_DBP_MANAGER_T;
765
766
63.0k
            ui_nextUev = ui_nextUev + 1;
767
768
63.0k
            if(ui_remapIdc == 0)
769
47.6k
            {
770
                // diffPicNum is -ve
771
47.6k
                i_temp = (WORD32)u2_pred_frame_num - (WORD32)ui_nextUev;
772
47.6k
                if(i_temp < 0)
773
8.39k
                    i_temp += ui_max_frame_num;
774
47.6k
            }
775
15.3k
            else
776
15.3k
            {
777
                // diffPicNum is +ve
778
15.3k
                i_temp = (WORD32)u2_pred_frame_num + (WORD32)ui_nextUev;
779
15.3k
                if(i_temp >= (WORD32)ui_max_frame_num)
780
3.40k
                    i_temp -= ui_max_frame_num;
781
15.3k
            }
782
            /* Find the dpb with the matching picNum (picNum==frameNum for framePic) */
783
784
63.0k
            if(i_temp > u4_cur_pic_num)
785
19.9k
                i_temp = i_temp - ui_max_frame_num;
786
787
114k
            for(i = 0; i < (ps_cur_slice->u1_initial_list_size[uc_lx]); i++)
788
52.8k
            {
789
52.8k
                if(ps_dpb_mgr->ps_init_dpb[uc_lx][i]->i4_pic_num == i_temp)
790
1.78k
                    break;
791
52.8k
            }
792
63.0k
            if(i == (ps_cur_slice->u1_initial_list_size[uc_lx]))
793
61.2k
            {
794
61.2k
                UWORD32 i4_error_code;
795
61.2k
                i4_error_code = ERROR_DBP_MANAGER_T;
796
61.2k
                return i4_error_code;
797
61.2k
            }
798
799
1.78k
            u2_def_mod_flag |= (1 << i);
800
1.78k
            ps_dpb_mgr->ps_mod_dpb[uc_lx][modCount++] =
801
1.78k
                            ps_dpb_mgr->ps_init_dpb[uc_lx][i];
802
1.78k
            u2_pred_frame_num = i_temp; //update predictor to be the picNum just obtained
803
1.78k
        }
804
5.38k
        else //2
805
5.38k
        {
806
5.38k
            UWORD8 u1_lt_idx;
807
808
5.38k
            if(ui_nextUev > (MAX_REF_BUFS + 1))
809
415
                return ERROR_DBP_MANAGER_T;
810
811
4.97k
            u1_lt_idx = (UWORD8)ui_nextUev;
812
813
8.88k
            for(i = 0; i < (ps_cur_slice->u1_initial_list_size[uc_lx]); i++)
814
4.55k
            {
815
4.55k
                if(!ps_dpb_mgr->ps_init_dpb[uc_lx][i]->u1_is_short)
816
871
                {
817
871
                    if(ps_dpb_mgr->ps_init_dpb[uc_lx][i]->u1_long_term_pic_num
818
871
                                    == u1_lt_idx)
819
641
                        break;
820
871
                }
821
4.55k
            }
822
4.97k
            if(i == (ps_cur_slice->u1_initial_list_size[uc_lx]))
823
4.33k
            {
824
4.33k
                UWORD32 i4_error_code;
825
4.33k
                i4_error_code = ERROR_DBP_MANAGER_T;
826
4.33k
                return i4_error_code;
827
4.33k
            }
828
829
641
            u2_def_mod_flag |= (1 << i);
830
641
            ps_dpb_mgr->ps_mod_dpb[uc_lx][modCount++] =
831
641
                            ps_dpb_mgr->ps_init_dpb[uc_lx][i];
832
641
        }
833
834
2.42k
        ui_remapIdc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
835
        /* Get the remapping_idc - 0/1/2/3 */
836
2.42k
        count++;
837
2.42k
    }
838
839
    //Handle the ref indices that were not remapped
840
7.74k
    for(i = 0; i < (ps_cur_slice->u1_num_ref_idx_lx_active[uc_lx]); i++)
841
5.23k
    {
842
5.23k
        if(!(u2_def_mod_flag & (1 << i)))
843
4.06k
            ps_dpb_mgr->ps_mod_dpb[uc_lx][modCount++] =
844
4.06k
                            ps_dpb_mgr->ps_init_dpb[uc_lx][i];
845
5.23k
    }
846
2.51k
    return OK;
847
72.2k
}
848
/*!
849
 **************************************************************************
850
 * \if Function name : ih264d_read_mmco_commands \endif
851
 *
852
 * \brief
853
 *    Parses MMCO commands and stores them in a structure for later use.
854
 *
855
 * \return
856
 *    0 - No error; -1 - Error
857
 *
858
 * \note
859
 *    This function stores MMCO commands in structure only for the first time.
860
 *    In case of MMCO commands being issued for same Picture Number, they are
861
 *    just parsed and not stored them in the structure.
862
 *
863
 **************************************************************************
864
 */
865
WORD32 ih264d_read_mmco_commands(struct _DecStruct * ps_dec)
866
221k
{
867
221k
    dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
868
221k
    dec_seq_params_t *ps_sps = ps_pps->ps_sps;
869
221k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
870
221k
    dpb_commands_t *ps_dpb_cmds = &(ps_dec->s_dpb_cmds_scratch);
871
221k
    dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
872
221k
    WORD32 j;
873
221k
    UWORD8 u1_buf_mode;
874
221k
    struct MMCParams *ps_mmc_params;
875
221k
    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
876
221k
    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
877
221k
    UWORD32 u4_bit_ofst = ps_dec->ps_bitstrm->u4_ofst;
878
879
221k
    ps_slice->u1_mmco_equalto5 = 0;
880
221k
    {
881
221k
        if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL)
882
148k
        {
883
148k
            ps_slice->u1_no_output_of_prior_pics_flag =
884
148k
                            ih264d_get_bit_h264(ps_bitstrm);
885
148k
            COPYTHECONTEXT("SH: no_output_of_prior_pics_flag",
886
148k
                            ps_slice->u1_no_output_of_prior_pics_flag);
887
148k
            ps_slice->u1_long_term_reference_flag = ih264d_get_bit_h264(
888
148k
                            ps_bitstrm);
889
148k
            COPYTHECONTEXT("SH: long_term_reference_flag",
890
148k
                            ps_slice->u1_long_term_reference_flag);
891
148k
            ps_dpb_cmds->u1_idr_pic = 1;
892
148k
            ps_dpb_cmds->u1_no_output_of_prior_pics_flag =
893
148k
                            ps_slice->u1_no_output_of_prior_pics_flag;
894
148k
            ps_dpb_cmds->u1_long_term_reference_flag =
895
148k
                            ps_slice->u1_long_term_reference_flag;
896
148k
        }
897
73.6k
        else
898
73.6k
        {
899
73.6k
            u1_buf_mode = ih264d_get_bit_h264(ps_bitstrm); //0 - sliding window; 1 - arbitrary
900
73.6k
            COPYTHECONTEXT("SH: adaptive_ref_pic_buffering_flag", u1_buf_mode);
901
73.6k
            ps_dpb_cmds->u1_buf_mode = u1_buf_mode;
902
73.6k
            j = 0;
903
904
73.6k
            if(u1_buf_mode == 1)
905
29.0k
            {
906
29.0k
                UWORD32 u4_mmco;
907
29.0k
                UWORD32 u4_diff_pic_num;
908
29.0k
                UWORD32 u4_lt_idx, u4_max_lt_idx_plus1;
909
910
29.0k
                u4_mmco = ih264d_uev(pu4_bitstrm_ofst,
911
29.0k
                                     pu4_bitstrm_buf);
912
125k
                while(u4_mmco != END_OF_MMCO)
913
97.3k
                {
914
97.3k
                    if (j >= MAX_REF_BUFS)
915
796
                    {
916
#ifdef __ANDROID__
917
                        ALOGE("b/25818142");
918
                        android_errorWriteLog(0x534e4554, "25818142");
919
#endif
920
796
                        ps_dpb_cmds->u1_num_of_commands = 0;
921
796
                        return -1;
922
796
                    }
923
96.5k
                    ps_mmc_params = &ps_dpb_cmds->as_mmc_params[j];
924
96.5k
                    ps_mmc_params->u4_mmco = u4_mmco;
925
96.5k
                    switch(u4_mmco)
926
96.5k
                    {
927
13.2k
                        case MARK_ST_PICNUM_AS_NONREF:
928
13.2k
                            u4_diff_pic_num = ih264d_uev(pu4_bitstrm_ofst,
929
13.2k
                                                         pu4_bitstrm_buf);
930
                            //Get absDiffPicnumMinus1
931
13.2k
                            ps_mmc_params->u4_diff_pic_num = u4_diff_pic_num;
932
13.2k
                            break;
933
934
13.1k
                        case MARK_LT_INDEX_AS_NONREF:
935
13.1k
                            u4_lt_idx = ih264d_uev(pu4_bitstrm_ofst,
936
13.1k
                                                   pu4_bitstrm_buf);
937
13.1k
                            ps_mmc_params->u4_lt_idx = u4_lt_idx;
938
13.1k
                            break;
939
940
4.30k
                        case MARK_ST_PICNUM_AS_LT_INDEX:
941
4.30k
                            u4_diff_pic_num = ih264d_uev(pu4_bitstrm_ofst,
942
4.30k
                                                         pu4_bitstrm_buf);
943
4.30k
                            ps_mmc_params->u4_diff_pic_num = u4_diff_pic_num;
944
4.30k
                            u4_lt_idx = ih264d_uev(pu4_bitstrm_ofst,
945
4.30k
                                                   pu4_bitstrm_buf);
946
4.30k
                            ps_mmc_params->u4_lt_idx = u4_lt_idx;
947
4.30k
                            break;
948
949
10.2k
                        case SET_MAX_LT_INDEX:
950
10.2k
                        {
951
10.2k
                            u4_max_lt_idx_plus1 = ih264d_uev(pu4_bitstrm_ofst,
952
10.2k
                                                             pu4_bitstrm_buf);
953
10.2k
                            if (u4_max_lt_idx_plus1 > ps_sps->u1_num_ref_frames)
954
258
                            {
955
                                /* Invalid max LT ref index */
956
258
                                return -1;
957
258
                            }
958
9.99k
                            ps_mmc_params->u4_max_lt_idx_plus1 = u4_max_lt_idx_plus1;
959
9.99k
                            break;
960
10.2k
                        }
961
8.56k
                        case RESET_REF_PICTURES:
962
8.56k
                        {
963
8.56k
                            ps_slice->u1_mmco_equalto5 = 1;
964
8.56k
                            break;
965
10.2k
                        }
966
967
11.3k
                        case SET_LT_INDEX:
968
11.3k
                            u4_lt_idx = ih264d_uev(pu4_bitstrm_ofst,
969
11.3k
                                                   pu4_bitstrm_buf);
970
11.3k
                            ps_mmc_params->u4_lt_idx = u4_lt_idx;
971
11.3k
                            break;
972
973
35.6k
                        default:
974
35.6k
                            break;
975
96.5k
                    }
976
96.2k
                    u4_mmco = ih264d_uev(pu4_bitstrm_ofst,
977
96.2k
                                         pu4_bitstrm_buf);
978
979
96.2k
                    j++;
980
96.2k
                }
981
28.0k
                ps_dpb_cmds->u1_num_of_commands = j;
982
28.0k
            }
983
73.6k
        }
984
220k
        ps_dpb_cmds->u1_dpb_commands_read = 1;
985
220k
        ps_dpb_cmds->u1_dpb_commands_read_slc = 1;
986
987
220k
    }
988
0
    u4_bit_ofst = ps_dec->ps_bitstrm->u4_ofst - u4_bit_ofst;
989
220k
    return u4_bit_ofst;
990
221k
}
991
992
/*!
993
 **************************************************************************
994
 * \if Function name : ih264d_do_mmco_buffer \endif
995
 *
996
 * \brief
997
 *    Perform decoded picture buffer memory management control operations
998
 *
999
 * \return
1000
 *    0 - No error; -1 - Error
1001
 *
1002
 * \note
1003
 *    Bitstream is also parsed here to get the MMCOs
1004
 *
1005
 **************************************************************************
1006
 */
1007
WORD32 ih264d_do_mmco_buffer(dpb_commands_t *ps_dpb_cmds,
1008
                          dpb_manager_t *ps_dpb_mgr,
1009
                          UWORD8 u1_numRef_frames_for_seq, /*!< num_ref_frames from active SeqParSet*/
1010
                          UWORD32 u4_cur_pic_num,
1011
                          UWORD32 u2_u4_max_pic_num_minus1,
1012
                          UWORD8 u1_nal_unit_type,
1013
                          struct pic_buffer_t *ps_pic_buf,
1014
                          UWORD8 u1_buf_id,
1015
                          UWORD8 u1_fld_pic_flag,
1016
                          UWORD8 u1_curr_pic_in_err)
1017
12.4k
{
1018
12.4k
    WORD32 i;
1019
12.4k
    UWORD8 u1_buf_mode, u1_marked_lt;
1020
12.4k
    struct dpb_info_t *ps_next_dpb;
1021
12.4k
    UWORD8 u1_num_gaps;
1022
12.4k
    UWORD8 u1_del_node = 1;
1023
12.4k
    UWORD8 u1_insert_st_pic = 1;
1024
12.4k
    WORD32 ret;
1025
12.4k
    UNUSED(u1_nal_unit_type);
1026
12.4k
    UNUSED(u2_u4_max_pic_num_minus1);
1027
12.4k
    u1_buf_mode = ps_dpb_cmds->u1_buf_mode; //0 - sliding window; 1 - Adaptive
1028
12.4k
    u1_marked_lt = 0;
1029
12.4k
    u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
1030
1031
12.4k
    if(!u1_buf_mode)
1032
7.67k
    {
1033
        //Sliding window - implements 8.2.5.3
1034
7.67k
        if((ps_dpb_mgr->u1_num_st_ref_bufs
1035
7.67k
                        + ps_dpb_mgr->u1_num_lt_ref_bufs + u1_num_gaps)
1036
7.67k
                        == u1_numRef_frames_for_seq)
1037
3.38k
        {
1038
3.38k
            UWORD8 u1_new_node_flag = 1;
1039
3.38k
            if((0 == ps_dpb_mgr->u1_num_st_ref_bufs) && (0 == u1_num_gaps))
1040
366
            {
1041
366
                UWORD32 i4_error_code;
1042
366
                i4_error_code = ERROR_DBP_MANAGER_T;
1043
366
                return i4_error_code;
1044
366
            }
1045
1046
            // Chase the links to reach the last but one picNum, if available
1047
3.01k
            ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1048
1049
3.01k
            if(ps_dpb_mgr->u1_num_st_ref_bufs > 1)
1050
970
            {
1051
970
                if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1052
128
                {
1053
                    /* Incase of  filed pictures top_field has been allocated   */
1054
                    /* picture buffer and complementary bottom field pair comes */
1055
                    /* then the sliding window mechanism should not allocate a  */
1056
                    /* new node                                                 */
1057
128
                    u1_new_node_flag = 0;
1058
128
                }
1059
1060
2.22k
                for(i = 1; i < (ps_dpb_mgr->u1_num_st_ref_bufs - 1); i++)
1061
1.25k
                {
1062
1.25k
                    if(ps_next_dpb == NULL)
1063
0
                    {
1064
0
                        UWORD32 i4_error_code;
1065
0
                        i4_error_code = ERROR_DBP_MANAGER_T;
1066
0
                        return i4_error_code;
1067
0
                    }
1068
1.25k
                    if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1069
197
                    {
1070
                        /* Incase of  field pictures top_field has been allocated   */
1071
                        /* picture buffer and complementary bottom field pair comes */
1072
                        /* then the sliding window mechanism should not allocate a  */
1073
                        /* new node                                                 */
1074
197
                        u1_new_node_flag = 0;
1075
197
                    }
1076
1.25k
                    ps_next_dpb = ps_next_dpb->ps_prev_short;
1077
1.25k
                }
1078
1079
970
                if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
1080
36
                {
1081
36
                    UWORD32 i4_error_code;
1082
36
                    i4_error_code = ERROR_DBP_MANAGER_T;
1083
36
                    return i4_error_code;
1084
36
                }
1085
1086
934
                if(u1_new_node_flag)
1087
788
                {
1088
788
                    if(u1_num_gaps)
1089
0
                    {
1090
0
                        ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1091
0
                                                            ps_next_dpb->ps_prev_short->i4_frame_num,
1092
0
                                                            &u1_del_node);
1093
0
                        if(ret != OK)
1094
0
                            return ret;
1095
0
                    }
1096
1097
788
                    if(u1_del_node)
1098
788
                    {
1099
788
                        ps_dpb_mgr->u1_num_st_ref_bufs--;
1100
788
                        ps_next_dpb->ps_prev_short->u1_used_as_ref =
1101
788
                                        UNUSED_FOR_REF;
1102
788
                        ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info =
1103
788
                                        UNUSED_FOR_REF;
1104
788
                        ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info =
1105
788
                                        UNUSED_FOR_REF;
1106
788
                        ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1107
788
                                                    ps_next_dpb->ps_prev_short->u1_buf_id);
1108
788
                        ps_next_dpb->ps_prev_short->ps_pic_buf = NULL;
1109
788
                        ps_next_dpb->ps_prev_short = NULL;
1110
788
                    }
1111
788
                }
1112
934
            }
1113
2.04k
            else
1114
2.04k
            {
1115
2.04k
                if(ps_dpb_mgr->u1_num_st_ref_bufs)
1116
1.93k
                {
1117
1.93k
                    ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1118
1.93k
                                                       ps_next_dpb->i4_frame_num,
1119
1.93k
                                                       &u1_del_node);
1120
1.93k
                    if(ret != OK)
1121
0
                        return ret;
1122
1.93k
                    if((ps_next_dpb->i4_frame_num != (WORD32)u4_cur_pic_num)
1123
652
                                    && u1_del_node)
1124
649
                    {
1125
649
                        ps_dpb_mgr->u1_num_st_ref_bufs--;
1126
649
                        ps_next_dpb->u1_used_as_ref = FALSE;
1127
649
                        ps_next_dpb->s_top_field.u1_reference_info =
1128
649
                                        UNUSED_FOR_REF;
1129
649
                        ps_next_dpb->s_bot_field.u1_reference_info =
1130
649
                                        UNUSED_FOR_REF;
1131
649
                        ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1132
649
                                                    ps_next_dpb->u1_buf_id);
1133
649
                        ps_next_dpb->ps_pic_buf = NULL;
1134
649
                        ps_next_dpb->ps_prev_short = NULL;
1135
649
                        ps_dpb_mgr->ps_dpb_st_head = NULL;
1136
649
                        ps_next_dpb = NULL;
1137
649
                    }
1138
1.28k
                    else if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1139
1.28k
                    {
1140
1.28k
                        if(u1_curr_pic_in_err)
1141
0
                        {
1142
0
                            u1_insert_st_pic = 0;
1143
0
                        }
1144
1.28k
                        else if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1145
1.28k
                        {
1146
1.28k
                            ps_dpb_mgr->u1_num_st_ref_bufs--;
1147
1.28k
                            ps_next_dpb->u1_used_as_ref = FALSE;
1148
1.28k
                            ps_next_dpb->s_top_field.u1_reference_info =
1149
1.28k
                                            UNUSED_FOR_REF;
1150
1.28k
                            ps_next_dpb->s_bot_field.u1_reference_info =
1151
1.28k
                                            UNUSED_FOR_REF;
1152
1.28k
                            ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1153
1.28k
                                                        ps_next_dpb->u1_buf_id);
1154
1.28k
                            ps_next_dpb->ps_pic_buf = NULL;
1155
1.28k
                            ps_next_dpb = NULL;
1156
1.28k
                        }
1157
1.28k
                    }
1158
1.93k
                }
1159
113
                else
1160
113
                {
1161
113
                    ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1162
113
                                                        INVALID_FRAME_NUM,
1163
113
                                                        &u1_del_node);
1164
113
                    if(ret != OK)
1165
0
                        return ret;
1166
113
                    if(u1_del_node)
1167
0
                    {
1168
0
                        UWORD32 i4_error_code;
1169
0
                        i4_error_code = ERROR_DBP_MANAGER_T;
1170
0
                        return i4_error_code;
1171
0
                    }
1172
113
                }
1173
2.04k
            }
1174
3.01k
        }
1175
7.67k
    }
1176
4.76k
    else
1177
4.76k
    {
1178
        //Adaptive memory control - implements 8.2.5.4
1179
4.76k
        UWORD32 u4_mmco;
1180
4.76k
        UWORD32 u4_diff_pic_num;
1181
4.76k
        WORD32 i4_pic_num;
1182
4.76k
        UWORD32 u4_lt_idx;
1183
4.76k
        WORD32 j;
1184
4.76k
        struct MMCParams *ps_mmc_params;
1185
1186
35.8k
        for(j = 0; j < ps_dpb_cmds->u1_num_of_commands; j++)
1187
32.3k
        {
1188
32.3k
            ps_mmc_params = &ps_dpb_cmds->as_mmc_params[j];
1189
32.3k
            u4_mmco = ps_mmc_params->u4_mmco; //Get MMCO
1190
1191
32.3k
            switch(u4_mmco)
1192
32.3k
            {
1193
1.79k
                case MARK_ST_PICNUM_AS_NONREF:
1194
1.79k
                {
1195
1196
1.79k
                    {
1197
1.79k
                        UWORD32 i4_cur_pic_num = u4_cur_pic_num;
1198
1.79k
                        WORD64 i8_pic_num;
1199
1.79k
                        u4_diff_pic_num = ps_mmc_params->u4_diff_pic_num; //Get absDiffPicnumMinus1
1200
1.79k
                        if(u1_fld_pic_flag)
1201
26
                            i4_cur_pic_num = i4_cur_pic_num * 2 + 1;
1202
1.79k
                        i8_pic_num = ((WORD64)i4_cur_pic_num - ((WORD64)u4_diff_pic_num + 1));
1203
1.79k
                        if(IS_OUT_OF_RANGE_S32(i8_pic_num))
1204
126
                        {
1205
126
                            return ERROR_DBP_MANAGER_T;
1206
126
                        }
1207
1.67k
                        i4_pic_num = i8_pic_num;
1208
1.67k
                    }
1209
1210
1.67k
                    if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1211
573
                    {
1212
573
                        ret = ih264d_delete_st_node_or_make_lt(ps_dpb_mgr,
1213
573
                                                               i4_pic_num,
1214
573
                                                               MAX_REF_BUFS + 1,
1215
573
                                                               u1_fld_pic_flag);
1216
573
                        if(ret != OK)
1217
287
                            return ret;
1218
573
                    }
1219
1.09k
                    else
1220
1.09k
                    {
1221
1.09k
                        UWORD8 u1_dummy;
1222
1.09k
                        ret = ih264d_delete_gap_frm_mmco(ps_dpb_mgr, i4_pic_num, &u1_dummy);
1223
1.09k
                        if(ret != OK)
1224
1
                            return ret;
1225
1.09k
                    }
1226
1.38k
                    break;
1227
1.67k
                }
1228
2.00k
                case MARK_LT_INDEX_AS_NONREF:
1229
2.00k
                {
1230
2.00k
                    WORD32 i4_status;
1231
2.00k
                    u4_lt_idx = ps_mmc_params->u4_lt_idx; //Get long term index
1232
2.00k
                    ret = ih264d_delete_lt_node(ps_dpb_mgr,
1233
2.00k
                                                u4_lt_idx,
1234
2.00k
                                                u1_fld_pic_flag,
1235
2.00k
                                                0, &i4_status);
1236
2.00k
                    if(ret != OK)
1237
0
                        return ret;
1238
2.00k
                    if(i4_status)
1239
108
                    {
1240
108
                        UWORD32 i4_error_code;
1241
108
                        i4_error_code = ERROR_DBP_MANAGER_T;
1242
108
                        return i4_error_code;
1243
108
                    }
1244
1.89k
                    break;
1245
2.00k
                }
1246
1247
1.89k
                case MARK_ST_PICNUM_AS_LT_INDEX:
1248
1.51k
                {
1249
1.51k
                    {
1250
1.51k
                        UWORD32 i4_cur_pic_num = u4_cur_pic_num;
1251
1.51k
                        WORD64 i8_pic_num;
1252
1.51k
                        u4_diff_pic_num = ps_mmc_params->u4_diff_pic_num; //Get absDiffPicnumMinus1
1253
1.51k
                        if(u1_fld_pic_flag)
1254
31
                            i4_cur_pic_num = i4_cur_pic_num * 2 + 1;
1255
1256
1.51k
                        i8_pic_num = (WORD64)i4_cur_pic_num - ((WORD64)u4_diff_pic_num + 1);
1257
1.51k
                        if(IS_OUT_OF_RANGE_S32(i8_pic_num))
1258
165
                        {
1259
165
                            return ERROR_DBP_MANAGER_T;
1260
165
                        }
1261
1.34k
                        i4_pic_num = i8_pic_num;
1262
1.34k
                    }
1263
1264
0
                    u4_lt_idx = ps_mmc_params->u4_lt_idx; //Get long term index
1265
1266
1.34k
                    if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
1267
1.20k
                        (u4_lt_idx > ps_dpb_mgr->u1_max_lt_frame_idx))
1268
231
                    {
1269
231
                        return ERROR_DBP_MANAGER_T;
1270
231
                    }
1271
1272
1.11k
                    if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1273
290
                    {
1274
290
                        ret = ih264d_delete_st_node_or_make_lt(ps_dpb_mgr,
1275
290
                                                               i4_pic_num, u4_lt_idx,
1276
290
                                                               u1_fld_pic_flag);
1277
290
                        if(ret != OK)
1278
105
                            return ret;
1279
290
                    }
1280
1.01k
                    break;
1281
1.11k
                }
1282
11.0k
                case SET_MAX_LT_INDEX:
1283
11.0k
                {
1284
11.0k
                    UWORD8 uc_numLT = ps_dpb_mgr->u1_num_lt_ref_bufs;
1285
11.0k
                    u4_lt_idx = ps_mmc_params->u4_max_lt_idx_plus1; //Get Max_long_term_index_plus1
1286
11.0k
                    if(u4_lt_idx <= ps_dpb_mgr->u1_max_lt_frame_idx
1287
5.14k
                                    && uc_numLT > 0)
1288
2.63k
                    {
1289
2.63k
                        struct dpb_info_t *ps_nxtDPB;
1290
                        //Set all LT buffers with index >= u4_lt_idx to nonreference
1291
2.63k
                        ps_nxtDPB = ps_dpb_mgr->ps_dpb_ht_head;
1292
2.63k
                        ps_next_dpb = ps_nxtDPB->ps_prev_long;
1293
2.63k
                        if(ps_nxtDPB->u1_lt_idx >= u4_lt_idx)
1294
795
                        {
1295
795
                            i = 0;
1296
795
                            ps_dpb_mgr->ps_dpb_ht_head = NULL;
1297
795
                        }
1298
1.84k
                        else
1299
1.84k
                        {
1300
2.48k
                            for(i = 1; i < uc_numLT; i++)
1301
1.37k
                            {
1302
1.37k
                                if(ps_next_dpb->u1_lt_idx >= u4_lt_idx)
1303
739
                                    break;
1304
638
                                ps_nxtDPB = ps_next_dpb;
1305
638
                                ps_next_dpb = ps_next_dpb->ps_prev_long;
1306
638
                            }
1307
1.84k
                            ps_nxtDPB->ps_prev_long = NULL; //Terminate the link of the closest LTIndex that is <=Max
1308
1.84k
                        }
1309
2.63k
                        ps_dpb_mgr->u1_num_lt_ref_bufs = i;
1310
2.63k
                        if(i == 0)
1311
795
                            ps_next_dpb = ps_nxtDPB;
1312
1313
4.26k
                        for(; i < uc_numLT; i++)
1314
1.62k
                        {
1315
1.62k
                            ps_nxtDPB = ps_next_dpb;
1316
1.62k
                            ps_nxtDPB->u1_lt_idx = MAX_REF_BUFS + 1;
1317
1.62k
                            ps_nxtDPB->u1_used_as_ref = UNUSED_FOR_REF;
1318
1.62k
                            ps_nxtDPB->s_top_field.u1_reference_info =
1319
1.62k
                                            UNUSED_FOR_REF;
1320
1.62k
                            ps_nxtDPB->s_bot_field.u1_reference_info =
1321
1.62k
                                            UNUSED_FOR_REF;
1322
1323
1.62k
                            ps_nxtDPB->ps_pic_buf = NULL;
1324
                            //Release buffer
1325
1.62k
                            ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1326
1.62k
                                                        ps_nxtDPB->u1_buf_id);
1327
1.62k
                            ps_next_dpb = ps_nxtDPB->ps_prev_long;
1328
1.62k
                            ps_nxtDPB->ps_prev_long = NULL;
1329
1.62k
                        }
1330
2.63k
                    }
1331
11.0k
                    if(u4_lt_idx == 0)
1332
1.09k
                    {
1333
1.09k
                        ps_dpb_mgr->u1_max_lt_frame_idx = NO_LONG_TERM_INDICIES;
1334
1.09k
                    }
1335
9.95k
                    else
1336
9.95k
                    {
1337
9.95k
                        ps_dpb_mgr->u1_max_lt_frame_idx = u4_lt_idx - 1;
1338
9.95k
                    }
1339
1340
11.0k
                    break;
1341
1.11k
                }
1342
4.22k
                case SET_LT_INDEX:
1343
4.22k
                {
1344
4.22k
                    u4_lt_idx = ps_mmc_params->u4_lt_idx; //Get long term index
1345
4.22k
                    if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
1346
4.11k
                        (u4_lt_idx > ps_dpb_mgr->u1_max_lt_frame_idx))
1347
211
                    {
1348
211
                        return ERROR_DBP_MANAGER_T;
1349
211
                    }
1350
4.01k
                    ret = ih264d_insert_st_node(ps_dpb_mgr, ps_pic_buf, u1_buf_id,
1351
4.01k
                                          u4_cur_pic_num);
1352
4.01k
                    if(ret != OK)
1353
67
                        return ret;
1354
1355
3.94k
                    if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1356
1357
3.94k
                    {
1358
3.94k
                        ret = ih264d_delete_st_node_or_make_lt(ps_dpb_mgr,
1359
3.94k
                                                               u4_cur_pic_num,
1360
3.94k
                                                               u4_lt_idx,
1361
3.94k
                                                               u1_fld_pic_flag);
1362
3.94k
                        if(ret != OK)
1363
1
                            return ret;
1364
3.94k
                    }
1365
0
                    else
1366
0
                    {
1367
0
                        return ERROR_DBP_MANAGER_T;
1368
0
                    }
1369
1370
3.94k
                    u1_marked_lt = 1;
1371
3.94k
                    break;
1372
3.94k
                }
1373
1374
11.7k
                default:
1375
11.7k
                    break;
1376
32.3k
            }
1377
31.0k
            if(u4_mmco == RESET_REF_PICTURES || u4_mmco == RESET_ALL_PICTURES)
1378
2.45k
            {
1379
2.45k
                ih264d_reset_ref_bufs(ps_dpb_mgr);
1380
2.45k
                u4_cur_pic_num = 0;
1381
2.45k
            }
1382
31.0k
        }
1383
4.76k
    }
1384
10.7k
    if(!u1_marked_lt && u1_insert_st_pic)
1385
8.90k
    {
1386
8.90k
        ret = ih264d_insert_st_node(ps_dpb_mgr, ps_pic_buf, u1_buf_id,
1387
8.90k
                              u4_cur_pic_num);
1388
8.90k
        if(ret != OK)
1389
198
            return ret;
1390
8.90k
    }
1391
10.5k
    return OK;
1392
10.7k
}
1393
1394
/*****************************************************************************/
1395
/*                                                                           */
1396
/*  Function Name : ih264d_release_pics_in_dpb                                         */
1397
/*                                                                           */
1398
/*  Description   : This function deletes all pictures from DPB              */
1399
/*                                                                           */
1400
/*  Inputs        : h_pic_buf_api: pointer to picture buffer API               */
1401
/*                  u1_disp_bufs: number pictures ready for display           */
1402
/*                                                                           */
1403
/*  Globals       : None                                                     */
1404
/*  Outputs       : None                                                     */
1405
/*  Returns       : None                                                     */
1406
/*                                                                           */
1407
/*  Issues        : None                                                     */
1408
/*                                                                           */
1409
/*  Revision History:                                                        */
1410
/*                                                                           */
1411
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1412
/*         22 06 2005   NS              Draft                                */
1413
/*                                                                           */
1414
/*****************************************************************************/
1415
void ih264d_release_pics_in_dpb(void *pv_dec,
1416
                                UWORD8 u1_disp_bufs)
1417
3
{
1418
3
    WORD8 i;
1419
3
    dec_struct_t *ps_dec = (dec_struct_t *)pv_dec;
1420
1421
43
    for(i = 0; i < u1_disp_bufs; i++)
1422
40
    {
1423
40
        ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
1424
40
                              i,
1425
40
                              BUF_MGR_REF);
1426
40
        ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
1427
40
                              ps_dec->as_buf_id_info_map[i].mv_buf_id,
1428
40
                              BUF_MGR_REF);
1429
40
    }
1430
3
}
1431
1432
/*****************************************************************************/
1433
/*                                                                           */
1434
/*  Function Name : ih264d_delete_gap_frm_sliding                            */
1435
/*                                                                           */
1436
/*  Description   : This function deletes a picture from the list of gaps,   */
1437
/*                  if the frame number of gap frame is lesser than the one  */
1438
/*                  to be deleted by sliding window                          */
1439
/*  Inputs        : ps_dpb_mgr: pointer to dpb manager                       */
1440
/*                  i4_frame_num:  frame number of picture that's going to   */
1441
/*                  be deleted by sliding window                             */
1442
/*                  pu1_del_node: holds 0 if a gap is deleted else 1         */
1443
/*  Globals       : None                                                     */
1444
/*  Processing    : Function searches for frame number lesser than           */
1445
/*                  i4_frame_num in the gaps list                            */
1446
/*  Outputs       : None                                                     */
1447
/*  Returns       : None                                                     */
1448
/*                                                                           */
1449
/*  Issues        : None                                                     */
1450
/*                                                                           */
1451
/*  Revision History:                                                        */
1452
/*                                                                           */
1453
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1454
/*         22 06 2005   NS              Draft                                */
1455
/*                                                                           */
1456
/*****************************************************************************/
1457
WORD32 ih264d_delete_gap_frm_sliding(dpb_manager_t *ps_dpb_mgr,
1458
                                    WORD32 i4_frame_num,
1459
                                    UWORD8 *pu1_del_node)
1460
7.90k
{
1461
7.90k
    WORD8 i1_gap_idx, i, j, j_min;
1462
7.90k
    WORD32 *pi4_gaps_start_frm_num, *pi4_gaps_end_frm_num, i4_gap_frame_num;
1463
7.90k
    WORD32 i4_start_frm_num, i4_end_frm_num;
1464
7.90k
    WORD32 i4_max_frm_num;
1465
7.90k
    WORD32 i4_frm_num, i4_gap_frm_num_min;
1466
1467
    /* find the least frame num from gaps and current DPB node    */
1468
    /* Delete the least one                                       */
1469
7.90k
    *pu1_del_node = 1;
1470
7.90k
    if(0 == ps_dpb_mgr->u1_num_gaps)
1471
1.90k
        return OK;
1472
6.00k
    pi4_gaps_start_frm_num = ps_dpb_mgr->ai4_gaps_start_frm_num;
1473
6.00k
    pi4_gaps_end_frm_num = ps_dpb_mgr->ai4_gaps_end_frm_num;
1474
6.00k
    i4_gap_frame_num = INVALID_FRAME_NUM;
1475
6.00k
    i4_max_frm_num = ps_dpb_mgr->i4_max_frm_num;
1476
1477
6.00k
    i1_gap_idx = -1;
1478
6.00k
    if(INVALID_FRAME_NUM != i4_frame_num)
1479
895
    {
1480
895
        i4_gap_frame_num = i4_frame_num;
1481
15.2k
        for(i = 0; i < MAX_FRAMES; i++)
1482
14.3k
        {
1483
14.3k
            i4_start_frm_num = pi4_gaps_start_frm_num[i];
1484
14.3k
            if(INVALID_FRAME_NUM != i4_start_frm_num)
1485
1.97k
            {
1486
1.97k
                i4_end_frm_num = pi4_gaps_end_frm_num[i];
1487
1.97k
                if(i4_end_frm_num < i4_max_frm_num)
1488
1.97k
                {
1489
1.97k
                    if(i4_start_frm_num <= i4_gap_frame_num)
1490
1.11k
                    {
1491
1.11k
                        i4_gap_frame_num = i4_start_frm_num;
1492
1.11k
                        i1_gap_idx = i;
1493
1.11k
                    }
1494
1.97k
                }
1495
0
                else
1496
0
                {
1497
0
                    if(((i4_start_frm_num <= i4_gap_frame_num)
1498
0
                                    && (i4_gap_frame_num <= i4_max_frm_num))
1499
0
                                    || ((i4_start_frm_num >= i4_gap_frame_num)
1500
0
                                                    && ((i4_gap_frame_num
1501
0
                                                                    + i4_max_frm_num)
1502
0
                                                                    >= i4_end_frm_num)))
1503
0
                    {
1504
0
                        i4_gap_frame_num = i4_start_frm_num;
1505
0
                        i1_gap_idx = i;
1506
0
                    }
1507
0
                }
1508
1.97k
            }
1509
14.3k
        }
1510
895
    }
1511
5.11k
    else
1512
5.11k
    {
1513
        /* no valid short term buffers, delete one gap from the least start */
1514
        /* of gap sequence                                                  */
1515
5.11k
        i4_gap_frame_num = pi4_gaps_start_frm_num[0];
1516
5.11k
        i1_gap_idx = 0;
1517
81.7k
        for(i = 1; i < MAX_FRAMES; i++)
1518
76.6k
        {
1519
76.6k
            if(INVALID_FRAME_NUM != pi4_gaps_start_frm_num[i])
1520
1.93k
            {
1521
1.93k
                if(pi4_gaps_start_frm_num[i] < i4_gap_frame_num)
1522
1.44k
                {
1523
1.44k
                    i4_gap_frame_num = pi4_gaps_start_frm_num[i];
1524
1.44k
                    i1_gap_idx = i;
1525
1.44k
                }
1526
1.93k
            }
1527
76.6k
        }
1528
5.11k
        if(INVALID_FRAME_NUM == i4_gap_frame_num)
1529
42
        {
1530
42
            UWORD32 i4_error_code;
1531
42
            i4_error_code = ERROR_DBP_MANAGER_T;
1532
42
            return i4_error_code;
1533
42
        }
1534
5.11k
    }
1535
1536
5.96k
    if(-1 != i1_gap_idx)
1537
5.81k
    {
1538
        /* find least frame_num in the poc_map, which is in this range */
1539
5.81k
        i4_start_frm_num = pi4_gaps_start_frm_num[i1_gap_idx];
1540
5.81k
        if(i4_start_frm_num < 0)
1541
692
            i4_start_frm_num += i4_max_frm_num;
1542
5.81k
        i4_end_frm_num = pi4_gaps_end_frm_num[i1_gap_idx];
1543
5.81k
        if(i4_end_frm_num < 0)
1544
1.84k
            i4_end_frm_num += i4_max_frm_num;
1545
1546
5.81k
        i4_gap_frm_num_min = 0xfffffff;
1547
5.81k
        j_min = MAX_FRAMES;
1548
98.8k
        for(j = 0; j < MAX_FRAMES; j++)
1549
93.0k
        {
1550
93.0k
            i4_frm_num = ps_dpb_mgr->ai4_poc_buf_id_map[j][2];
1551
93.0k
            if((i4_start_frm_num <= i4_frm_num)
1552
34.8k
                            && (i4_end_frm_num >= i4_frm_num))
1553
29.6k
            {
1554
29.6k
                if(i4_frm_num < i4_gap_frm_num_min)
1555
9.52k
                {
1556
9.52k
                    j_min = j;
1557
9.52k
                    i4_gap_frm_num_min = i4_frm_num;
1558
9.52k
                }
1559
29.6k
            }
1560
93.0k
        }
1561
1562
5.81k
        if(j_min != MAX_FRAMES)
1563
5.76k
        {
1564
1565
5.76k
            ps_dpb_mgr->ai4_poc_buf_id_map[j_min][0] = -1;
1566
5.76k
            ps_dpb_mgr->ai4_poc_buf_id_map[j_min][1] = 0x7fffffff;
1567
5.76k
            ps_dpb_mgr->ai4_poc_buf_id_map[j_min][2] = GAP_FRAME_NUM;
1568
5.76k
            ps_dpb_mgr->i1_gaps_deleted++;
1569
1570
5.76k
            ps_dpb_mgr->ai1_gaps_per_seq[i1_gap_idx]--;
1571
5.76k
            ps_dpb_mgr->u1_num_gaps--;
1572
5.76k
            *pu1_del_node = 0;
1573
5.76k
            if(0 == ps_dpb_mgr->ai1_gaps_per_seq[i1_gap_idx])
1574
263
            {
1575
263
                ps_dpb_mgr->ai4_gaps_start_frm_num[i1_gap_idx] =
1576
263
                INVALID_FRAME_NUM;
1577
263
                ps_dpb_mgr->ai4_gaps_end_frm_num[i1_gap_idx] = 0;
1578
263
            }
1579
5.76k
        }
1580
5.81k
    }
1581
1582
5.96k
    return OK;
1583
6.00k
}
1584
1585
/*****************************************************************************/
1586
/*                                                                           */
1587
/*  Function Name : ih264d_delete_gap_frm_mmco                               */
1588
/*                                                                           */
1589
/*  Description   : This function deletes a picture from the list of gaps,   */
1590
/*                  if the frame number (specified by mmco commands) to be   */
1591
/*                  deleted is in the range by gap sequence.                 */
1592
/*                                                                           */
1593
/*  Inputs        : ps_dpb_mgr: pointer to dpb manager                       */
1594
/*                  i4_frame_num:  frame number of picture that's going to   */
1595
/*                  be deleted by mmco                                       */
1596
/*                  pu1_del_node: holds 0 if a gap is deleted else 1         */
1597
/*  Globals       : None                                                     */
1598
/*  Processing    : Function searches for frame number lesser in the range   */
1599
/*                  specified by gap sequence                                */
1600
/*  Outputs       : None                                                     */
1601
/*  Returns       : None                                                     */
1602
/*                                                                           */
1603
/*  Issues        : None                                                     */
1604
/*                                                                           */
1605
/*  Revision History:                                                        */
1606
/*                                                                           */
1607
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1608
/*         22 06 2005   NS              Draft                                */
1609
/*                                                                           */
1610
/*****************************************************************************/
1611
WORD32 ih264d_delete_gap_frm_mmco(dpb_manager_t *ps_dpb_mgr,
1612
                                  WORD32 i4_frame_num,
1613
                                  UWORD8 *pu1_del_node)
1614
1.11k
{
1615
1.11k
    WORD8 i, j;
1616
1.11k
    WORD32 *pi4_start, *pi4_end;
1617
1.11k
    WORD32 i4_start_frm_num, i4_end_frm_num, i4_max_frm_num;
1618
1619
    /* find the least frame num from gaps and current DPB node    */
1620
    /* Delete the gaps                                            */
1621
1.11k
    *pu1_del_node = 1;
1622
1.11k
    pi4_start = ps_dpb_mgr->ai4_gaps_start_frm_num;
1623
1.11k
    pi4_end = ps_dpb_mgr->ai4_gaps_end_frm_num;
1624
1.11k
    i4_max_frm_num = ps_dpb_mgr->i4_max_frm_num;
1625
1626
1.11k
    if(0 == ps_dpb_mgr->u1_num_gaps)
1627
1.08k
        return OK;
1628
1629
33
    if(i4_frame_num < 0)
1630
8
        i4_frame_num += i4_max_frm_num;
1631
217
    for(i = 0; i < MAX_FRAMES; i++)
1632
216
    {
1633
216
        i4_start_frm_num = pi4_start[i];
1634
216
        if(i4_start_frm_num < 0)
1635
192
            i4_start_frm_num += i4_max_frm_num;
1636
216
        if(INVALID_FRAME_NUM != i4_start_frm_num)
1637
201
        {
1638
201
            i4_end_frm_num = pi4_end[i];
1639
201
            if(i4_end_frm_num < 0)
1640
192
                i4_end_frm_num += i4_max_frm_num;
1641
1642
201
            if((i4_frame_num >= i4_start_frm_num)
1643
73
                            && (i4_frame_num <= i4_end_frm_num))
1644
32
            {
1645
32
                break;
1646
32
            }
1647
169
            else
1648
169
            {
1649
169
                if(((i4_frame_num + i4_max_frm_num) >= i4_start_frm_num)
1650
169
                                && ((i4_frame_num + i4_max_frm_num)
1651
169
                                                <= i4_end_frm_num))
1652
0
                {
1653
0
                    UWORD32 i4_error_code;
1654
0
                    i4_error_code = ERROR_DBP_MANAGER_T;
1655
0
                    return i4_error_code;
1656
0
                }
1657
169
            }
1658
201
        }
1659
216
    }
1660
1661
    /* find frame_num index, in the poc_map which needs to be deleted */
1662
185
    for(j = 0; j < MAX_FRAMES; j++)
1663
184
    {
1664
184
        if(i4_frame_num == ps_dpb_mgr->ai4_poc_buf_id_map[j][2])
1665
32
            break;
1666
184
    }
1667
1668
33
    if(MAX_FRAMES != i)
1669
32
    {
1670
32
        if(j == MAX_FRAMES)
1671
0
        {
1672
0
            UWORD32 i4_error_code;
1673
0
            i4_error_code = ERROR_DBP_MANAGER_T;
1674
0
            return i4_error_code;
1675
0
        }
1676
1677
32
        ps_dpb_mgr->ai4_poc_buf_id_map[j][0] = -1;
1678
32
        ps_dpb_mgr->ai4_poc_buf_id_map[j][1] = 0x7fffffff;
1679
32
        ps_dpb_mgr->ai4_poc_buf_id_map[j][2] = GAP_FRAME_NUM;
1680
32
        ps_dpb_mgr->i1_gaps_deleted++;
1681
1682
32
        ps_dpb_mgr->ai1_gaps_per_seq[i]--;
1683
32
        ps_dpb_mgr->u1_num_gaps--;
1684
32
        *pu1_del_node = 0;
1685
32
        if(0 == ps_dpb_mgr->ai1_gaps_per_seq[i])
1686
0
        {
1687
0
            ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
1688
0
            ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
1689
0
        }
1690
32
    }
1691
1
    else
1692
1
    {
1693
1
        UWORD32 i4_error_code;
1694
1
        i4_error_code = ERROR_DBP_MANAGER_T;
1695
1
        return i4_error_code;
1696
1
    }
1697
1698
32
    return OK;
1699
33
}
1700
1701
/*!
1702
 **************************************************************************
1703
 * \if Function name : ih264d_do_mmco_for_gaps \endif
1704
 *
1705
 * \brief
1706
 *    Perform decoded picture buffer memory management control operations
1707
 *
1708
 * \return
1709
 *    0 - No error; -1 - Error
1710
 *
1711
 * \note
1712
 *    Bitstream is also parsed here to get the MMCOs
1713
 *
1714
 **************************************************************************
1715
 */
1716
WORD32 ih264d_do_mmco_for_gaps(dpb_manager_t *ps_dpb_mgr,
1717
                             UWORD8 u1_num_ref_frames /*!< num_ref_frames from active SeqParSet*/
1718
                             )
1719
9.78k
{
1720
9.78k
    struct dpb_info_t *ps_next_dpb;
1721
9.78k
    UWORD8 u1_num_gaps;
1722
9.78k
    UWORD8 u1_st_ref_bufs, u1_lt_ref_bufs, u1_del_node;
1723
9.78k
    WORD8 i;
1724
9.78k
    WORD32 i4_frame_gaps = 1;
1725
9.78k
    WORD32 ret;
1726
1727
    //Sliding window - implements 8.2.5.3, flush out buffers
1728
9.78k
    u1_st_ref_bufs = ps_dpb_mgr->u1_num_st_ref_bufs;
1729
9.78k
    u1_lt_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs;
1730
1731
17.9k
    while(1)
1732
17.9k
    {
1733
17.9k
        u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
1734
17.9k
        if((u1_st_ref_bufs + u1_lt_ref_bufs + u1_num_gaps + i4_frame_gaps)
1735
17.9k
                        > u1_num_ref_frames)
1736
8.33k
        {
1737
8.33k
            if(0 == (u1_st_ref_bufs + u1_num_gaps))
1738
2.11k
            {
1739
2.11k
                i4_frame_gaps = 0;
1740
2.11k
                ps_dpb_mgr->u1_num_gaps = (u1_num_ref_frames
1741
2.11k
                                - u1_lt_ref_bufs);
1742
2.11k
            }
1743
6.21k
            else
1744
6.21k
            {
1745
6.21k
                u1_del_node = 1;
1746
6.21k
                ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1747
1748
6.21k
                if(u1_st_ref_bufs > 1)
1749
199
                {
1750
220
                    for(i = 1; i < (u1_st_ref_bufs - 1); i++)
1751
21
                    {
1752
21
                        if(ps_next_dpb == NULL)
1753
0
                        {
1754
0
                            UWORD32 i4_error_code;
1755
0
                            i4_error_code = ERROR_DBP_MANAGER_T;
1756
0
                            return i4_error_code;
1757
0
                        }
1758
21
                        ps_next_dpb = ps_next_dpb->ps_prev_short;
1759
21
                    }
1760
1761
199
                    if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
1762
129
                    {
1763
129
                        return ERROR_DBP_MANAGER_T;
1764
129
                    }
1765
1766
70
                    if(u1_num_gaps)
1767
68
                    {
1768
68
                        ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1769
68
                                                            ps_next_dpb->ps_prev_short->i4_frame_num,
1770
68
                                                            &u1_del_node);
1771
68
                        if(ret != OK)
1772
0
                            return ret;
1773
68
                    }
1774
1775
70
                    if(u1_del_node)
1776
12
                    {
1777
12
                        u1_st_ref_bufs--;
1778
12
                        ps_next_dpb->ps_prev_short->u1_used_as_ref =
1779
12
                                        UNUSED_FOR_REF;
1780
12
                        ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info =
1781
12
                                        UNUSED_FOR_REF;
1782
12
                        ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info =
1783
12
                                        UNUSED_FOR_REF;
1784
12
                        ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1785
12
                                                    ps_next_dpb->ps_prev_short->u1_buf_id);
1786
12
                        ps_next_dpb->ps_prev_short->ps_pic_buf = NULL;
1787
12
                        ps_next_dpb->ps_prev_short = NULL;
1788
12
                    }
1789
70
                }
1790
6.01k
                else
1791
6.01k
                {
1792
6.01k
                    if(u1_st_ref_bufs)
1793
1.01k
                    {
1794
1.01k
                        if(u1_num_gaps)
1795
795
                        {
1796
795
                            ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1797
795
                                                                ps_next_dpb->i4_frame_num,
1798
795
                                                                &u1_del_node);
1799
795
                            if(ret != OK)
1800
0
                                return ret;
1801
795
                        }
1802
1803
1.01k
                        if(u1_del_node)
1804
356
                        {
1805
356
                            u1_st_ref_bufs--;
1806
356
                            ps_next_dpb->u1_used_as_ref = FALSE;
1807
356
                            ps_next_dpb->s_top_field.u1_reference_info =
1808
356
                                            UNUSED_FOR_REF;
1809
356
                            ps_next_dpb->s_bot_field.u1_reference_info =
1810
356
                                            UNUSED_FOR_REF;
1811
356
                            ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1812
356
                                                        ps_next_dpb->u1_buf_id);
1813
356
                            ps_next_dpb->ps_pic_buf = NULL;
1814
356
                            ps_next_dpb = NULL;
1815
356
                            ps_dpb_mgr->ps_dpb_st_head = NULL;
1816
356
                            ps_dpb_mgr->u1_num_st_ref_bufs = u1_st_ref_bufs;
1817
356
                        }
1818
1.01k
                    }
1819
4.99k
                    else
1820
4.99k
                    {
1821
4.99k
                        ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1822
4.99k
                                                            INVALID_FRAME_NUM,
1823
4.99k
                                                            &u1_del_node);
1824
4.99k
                        if(ret != OK)
1825
42
                            return ret;
1826
4.95k
                        if(u1_del_node)
1827
43
                        {
1828
43
                            return ERROR_DBP_MANAGER_T;
1829
43
                        }
1830
4.95k
                    }
1831
6.01k
                }
1832
6.21k
            }
1833
8.33k
        }
1834
9.56k
        else
1835
9.56k
        {
1836
9.56k
            ps_dpb_mgr->u1_num_gaps += i4_frame_gaps;
1837
9.56k
            break;
1838
9.56k
        }
1839
17.9k
    }
1840
1841
9.56k
    ps_dpb_mgr->u1_num_st_ref_bufs = u1_st_ref_bufs;
1842
1843
9.56k
    return OK;
1844
9.78k
}
1845
/****************************************************************************/
1846
/*                                                                          */
1847
/* Function Name  : ih264d_free_node_from_dpb                                      */
1848
/*                                                                          */
1849
/* Description    :                                                         */
1850
/*                                                                          */
1851
/* Inputs         :                                                         */
1852
/*                                                                          */
1853
/* Globals        :                                                         */
1854
/*                                                                          */
1855
/* Processing     :                                                         */
1856
/*                                                                          */
1857
/* Outputs        :                                                         */
1858
/*                                                                          */
1859
/* Returns        :                                                         */
1860
/*                                                                          */
1861
/* Known Issues   :                                                         */
1862
/*                                                                          */
1863
/* Revision History                                                         */
1864
/*                                                                          */
1865
/*      DD MM YY            Author        Changes                           */
1866
/*                          Sarat                                           */
1867
/****************************************************************************/
1868
/**** Function Added for Error Resilience *****/
1869
WORD32 ih264d_free_node_from_dpb(dpb_manager_t *ps_dpb_mgr,
1870
                               UWORD32 u4_cur_pic_num,
1871
                               UWORD8 u1_numRef_frames_for_seq)
1872
0
{
1873
0
    WORD32 i;
1874
0
    UWORD8 u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
1875
0
    struct dpb_info_t *ps_next_dpb;
1876
0
    UWORD8 u1_del_node = 1;
1877
0
    WORD32 ret;
1878
1879
    //Sliding window - implements 8.2.5.3
1880
0
    if((ps_dpb_mgr->u1_num_st_ref_bufs + ps_dpb_mgr->u1_num_lt_ref_bufs
1881
0
                    + u1_num_gaps) == u1_numRef_frames_for_seq)
1882
0
    {
1883
0
        UWORD8 u1_new_node_flag = 1;
1884
0
        if((0 == ps_dpb_mgr->u1_num_st_ref_bufs) && (0 == u1_num_gaps))
1885
0
        {
1886
0
            return ERROR_DBP_MANAGER_T;
1887
0
        }
1888
1889
        // Chase the links to reach the last but one picNum, if available
1890
0
        ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1891
1892
0
        if(ps_dpb_mgr->u1_num_st_ref_bufs > 1)
1893
0
        {
1894
0
            if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1895
0
            {
1896
                /* Incase of  filed pictures top_field has been allocated   */
1897
                /* picture buffer and complementary bottom field pair comes */
1898
                /* then the sliding window mechanism should not allocate a  */
1899
                /* new node                                                 */
1900
0
                u1_new_node_flag = 0;
1901
0
            }
1902
1903
0
            for(i = 1; i < (ps_dpb_mgr->u1_num_st_ref_bufs - 1); i++)
1904
0
            {
1905
0
                if(ps_next_dpb == NULL)
1906
0
                    return ERROR_DBP_MANAGER_T;
1907
1908
0
                if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1909
0
                {
1910
                    /* Incase of  field pictures top_field has been allocated   */
1911
                    /* picture buffer and complementary bottom field pair comes */
1912
                    /* then the sliding window mechanism should not allocate a  */
1913
                    /* new node                                                 */
1914
0
                    u1_new_node_flag = 0;
1915
0
                }
1916
0
                ps_next_dpb = ps_next_dpb->ps_prev_short;
1917
0
            }
1918
1919
0
            if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
1920
0
                return ERROR_DBP_MANAGER_T;
1921
1922
0
            if(u1_new_node_flag)
1923
0
            {
1924
0
                if(u1_num_gaps)
1925
0
                {
1926
0
                    ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1927
0
                                                        ps_next_dpb->ps_prev_short->i4_frame_num,
1928
0
                                                        &u1_del_node);
1929
0
                    if(ret != OK)
1930
0
                        return ret;
1931
0
                }
1932
1933
0
                if(u1_del_node)
1934
0
                {
1935
0
                    ps_dpb_mgr->u1_num_st_ref_bufs--;
1936
0
                    ps_next_dpb->ps_prev_short->u1_used_as_ref = UNUSED_FOR_REF;
1937
0
                    ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info =
1938
0
                                    UNUSED_FOR_REF;
1939
0
                    ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info =
1940
0
                                    UNUSED_FOR_REF;
1941
0
                    ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1942
0
                                                ps_next_dpb->ps_prev_short->u1_buf_id);
1943
0
                    ps_next_dpb->ps_prev_short->ps_pic_buf = NULL;
1944
0
                    ps_next_dpb->ps_prev_short = NULL;
1945
0
                }
1946
0
            }
1947
0
        }
1948
0
        else
1949
0
        {
1950
0
            if(ps_dpb_mgr->u1_num_st_ref_bufs)
1951
0
            {
1952
0
                ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1953
0
                                                    ps_next_dpb->i4_frame_num,
1954
0
                                                    &u1_del_node);
1955
0
                if(ret != OK)
1956
0
                    return ret;
1957
0
                if((ps_next_dpb->i4_frame_num != (WORD32)u4_cur_pic_num)
1958
0
                                && u1_del_node)
1959
0
                {
1960
0
                    ps_dpb_mgr->u1_num_st_ref_bufs--;
1961
0
                    ps_next_dpb->u1_used_as_ref = FALSE;
1962
0
                    ps_next_dpb->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1963
0
                    ps_next_dpb->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1964
0
                    ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1965
0
                                                ps_next_dpb->u1_buf_id);
1966
0
                    ps_next_dpb->ps_pic_buf = NULL;
1967
0
                    ps_next_dpb = NULL;
1968
0
                }
1969
0
            }
1970
0
            else
1971
0
            {
1972
0
                ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr, INVALID_FRAME_NUM, &u1_del_node);
1973
0
                if(ret != OK)
1974
0
                    return ret;
1975
0
                if(u1_del_node)
1976
0
                    return ERROR_DBP_MANAGER_T;
1977
0
            }
1978
0
        }
1979
0
    }
1980
0
    return OK;
1981
0
}
1982
/*****************************************************************************/
1983
/*                                                                           */
1984
/*  Function Name : ih264d_delete_nonref_nondisplay_pics                            */
1985
/*                                                                           */
1986
/*  Description   :                                                          */
1987
/*                                                                           */
1988
/*                                                                           */
1989
/*  Inputs        :                                                          */
1990
/*  Globals       :                                                          */
1991
/*  Processing    :                                                          */
1992
/*                                                                           */
1993
/*  Outputs       :                                                          */
1994
/*  Returns       :                                                          */
1995
/*                                                                           */
1996
/*  Issues        :                                                          */
1997
/*                                                                           */
1998
/*  Revision History:                                                        */
1999
/*                                                                           */
2000
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2001
/*         05 06 2007   Varun           Draft                                */
2002
/*                                                                           */
2003
/*****************************************************************************/
2004
2005
void ih264d_delete_nonref_nondisplay_pics(dpb_manager_t *ps_dpb_mgr)
2006
270k
{
2007
270k
    WORD8 i;
2008
270k
    WORD32 (*i4_poc_buf_id_map)[3] = ps_dpb_mgr->ai4_poc_buf_id_map;
2009
2010
    /* remove all gaps marked as unused for ref */
2011
295k
    for(i = 0; (i < MAX_FRAMES) && ps_dpb_mgr->i1_gaps_deleted; i++)
2012
24.2k
    {
2013
24.2k
        if(GAP_FRAME_NUM == i4_poc_buf_id_map[i][2])
2014
5.78k
        {
2015
5.78k
            ps_dpb_mgr->i1_gaps_deleted--;
2016
5.78k
            ps_dpb_mgr->i1_poc_buf_id_entries--;
2017
5.78k
            i4_poc_buf_id_map[i][0] = -1;
2018
5.78k
            i4_poc_buf_id_map[i][1] = 0x7fffffff;
2019
5.78k
            i4_poc_buf_id_map[i][2] = 0;
2020
5.78k
        }
2021
24.2k
    }
2022
270k
}
2023
/*****************************************************************************/
2024
/*                                                                           */
2025
/*  Function Name : ih264d_insert_pic_in_display_list                               */
2026
/*                                                                           */
2027
/*  Description   :                                                          */
2028
/*                                                                           */
2029
/*                                                                           */
2030
/*  Inputs        :                                                          */
2031
/*  Globals       :                                                          */
2032
/*  Processing    :                                                          */
2033
/*                                                                           */
2034
/*  Outputs       :                                                          */
2035
/*  Returns       :                                                          */
2036
/*                                                                           */
2037
/*  Issues        :                                                          */
2038
/*                                                                           */
2039
/*  Revision History:                                                        */
2040
/*                                                                           */
2041
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2042
/*         05 06 2007   Varun           Draft                                */
2043
/*                                                                           */
2044
/*****************************************************************************/
2045
2046
WORD32 ih264d_insert_pic_in_display_list(dpb_manager_t *ps_dpb_mgr,
2047
                                         UWORD8 u1_buf_id,
2048
                                         WORD32 i4_display_poc,
2049
                                         UWORD32 u4_frame_num)
2050
147k
{
2051
147k
    WORD8 i;
2052
147k
    WORD32 (*i4_poc_buf_id_map)[3] = ps_dpb_mgr->ai4_poc_buf_id_map;
2053
2054
302k
    for(i = 0; i < MAX_FRAMES; i++)
2055
302k
    {
2056
        /* Find an empty slot */
2057
302k
        if(i4_poc_buf_id_map[i][0] == -1)
2058
147k
        {
2059
147k
            if(GAP_FRAME_NUM == i4_poc_buf_id_map[i][2])
2060
0
                ps_dpb_mgr->i1_gaps_deleted--;
2061
147k
            else
2062
147k
                ps_dpb_mgr->i1_poc_buf_id_entries++;
2063
2064
147k
            i4_poc_buf_id_map[i][0] = u1_buf_id;
2065
147k
            i4_poc_buf_id_map[i][1] = i4_display_poc;
2066
147k
            i4_poc_buf_id_map[i][2] = u4_frame_num;
2067
2068
147k
            break;
2069
147k
        }
2070
302k
    }
2071
2072
147k
    if(MAX_FRAMES == i)
2073
166
    {
2074
2075
166
        UWORD32 i4_error_code;
2076
166
        i4_error_code = ERROR_GAPS_IN_FRM_NUM;
2077
166
        return i4_error_code;
2078
166
    }
2079
147k
    return OK;
2080
147k
}
2081