summaryrefslogtreecommitdiffstats
path: root/decoder/ih264d_dpb_manager.h
blob: a9539c8466ce7ef4af4751a7066add25d4037e3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/******************************************************************************
 *
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
#ifndef _IH264D_DPB_MANAGER_H_
#define _IH264D_DPB_MANAGER_H_
/*!
***************************************************************************
* \file ih264d_dpb_manager.h
*
* \brief
*    Decoded Picture Buffer Manager Include File
*
* Detailed_description
*
* \date
*    19-12-2002
*
* \author  Sriram Sethuraman
***************************************************************************
*/
#include "ih264_typedefs.h"
#include "ih264_macros.h"
#include "ih264_platform_macros.h"
#include "ih264d_bitstrm.h"
#include "ih264d_defs.h"

#define END_OF_MMCO                 0
#define MARK_ST_PICNUM_AS_NONREF    1
#define MARK_LT_INDEX_AS_NONREF     2
#define MARK_ST_PICNUM_AS_LT_INDEX  3
#define SET_MAX_LT_INDEX            4
#define RESET_REF_PICTURES          5
#define SET_LT_INDEX                6
#define RESET_NONREF_PICTURES       7
#define RESET_ALL_PICTURES          8

struct field_t
{
    /* picNum of tbe reference field              */
    WORD32 i4_pic_num;

    /*  assigned when used for long term reference */
    /* else MAX_REF_BUFS+1 */
    UWORD8 u1_long_term_frame_idx;

    /* 0 : unused for reference                   */
    /* 1 : used for short term reference          */
    /* 2 : used for long term reference           */
    UWORD8 u1_reference_info;
};


struct dpb_info_t
{
  struct pic_buffer_t *ps_pic_buf;       /** Pointer to picture buffer structure */
  WORD32 i4_frame_num;      /** frame number of picture - unique for each ref*/
  struct dpb_info_t *ps_prev_short;/** Link to the DPB with previous picNum */
  struct dpb_info_t *ps_prev_long;     /** Link to the DPB with previous long term frame*/
  struct field_t s_top_field;       /** Contains information of the top_field
                                     reference info, pic num and longt term frame idx */
  struct field_t s_bot_field;       /** Contains information of the bot_field
                                     reference info, pic num and longt term frame idx */
  UWORD8 u1_buf_id;     /** bufID from bufAPI */
  UWORD8 u1_used_as_ref;        /** whether buffer is used as ref for frame or
                                     complementary reference field pair */
  UWORD8 u1_lt_idx;     /** If buf is assigned long-term index; else MAX_REF_BUFS+1 */

};

typedef struct
{
  struct pic_buffer_t *ps_def_dpb[MAX_REF_BUFS];/** DPB in default index order */
  struct pic_buffer_t *ps_mod_dpb[2][2 * MAX_REF_BUFS];/** DPB in reordered index order, 0-fwd,1-bwd */
  struct pic_buffer_t *ps_init_dpb[2][2 * MAX_REF_BUFS];/** DPB in reordered index order, 0-fwd,1-bwd */
  struct dpb_info_t *ps_dpb_st_head;     /** Pointer to the most recent picNum */
  struct dpb_info_t *ps_dpb_ht_head;     /** Pointer to the smallest LT index */
  struct dpb_info_t as_dpb_info[MAX_REF_BUFS];       /** Physical storage for dpbInfo for ref bufs */
  UWORD8 u1_num_st_ref_bufs;        /** Number of short term ref. buffers */
  UWORD8 u1_num_lt_ref_bufs;        /** Number of long term ref. buffer */
  UWORD8 u1_max_lt_pic_idx_plus1;       /** Maximum long term pictures - 0 to max_long_term_pic_idx */
  UWORD8 u1_num_gaps;       /** Total number of outstanding gaps */
  void * pv_codec_handle;             /* For Error Handling */
  WORD32 i4_max_frm_num;        /** Max frame number */
  WORD32 ai4_gaps_start_frm_num[MAX_FRAMES];/** start frame number for a gap seqn */
  WORD32 ai4_gaps_end_frm_num[MAX_FRAMES];       /** start frame number for a gap seqn */
  WORD8  ai1_gaps_per_seq[MAX_FRAMES];      /** number of gaps with each gap seqn */
  WORD32 ai4_poc_buf_id_map[MAX_FRAMES][3];
  WORD8 i1_poc_buf_id_entries;
  WORD8 i1_gaps_deleted;
  UWORD16 u2_pic_wd;
  UWORD16 u2_pic_ht;
}dpb_manager_t;

/** Structure store the MMC Commands */
struct MMCParams
{
  UWORD32 u4_mmco;      /** memory managemet control operation */
  UWORD32 u4_diff_pic_num;      /** diff Of Pic Nums Minus1 */
  UWORD32 u4_lt_idx;        /** Long Term Pic Idx */
  UWORD32 u4_max_lt_idx_plus1;      /** MaxLongTermPicIdxPlus1 */
};

typedef struct
{
  UWORD8  u1_dpb_commands_read;     /** Flag to indicate that DBP commands are read */
  UWORD8  u1_buf_mode;      /** decoder Pic bugffering mode*/
  UWORD8  u1_num_of_commands;       /** Number of MMC commands */
  /* These variables are ised in case of IDR pictures only */
  UWORD8  u1_idr_pic;       /** = 1 ,IDR pic */
  UWORD8  u1_no_output_of_prior_pics_flag;
  UWORD8  u1_long_term_reference_flag;
  struct MMCParams  as_mmc_params[MAX_REF_BUFS];      /* < Buffer to store MMC commands */
  UWORD8 u1_dpb_commands_read_slc;
}dpb_commands_t;

void ih264d_init_ref_bufs(dpb_manager_t *ps_dpb_mgr);

WORD32 ih264d_insert_st_node(dpb_manager_t *ps_dpb_mgr,
                          struct pic_buffer_t *ps_pic_buf,
                          UWORD8 u1_buf_id,
                          UWORD32 u2_cur_pic_num);
WORD32 ih264d_update_default_index_list(dpb_manager_t *ps_dpb_mgr);
WORD32 ih264d_do_mmco_buffer(dpb_commands_t *ps_dpb_cmds,
                          dpb_manager_t *ps_dpb_mgr,
                          UWORD8 u1_numRef_frames_for_seq,
                          UWORD32 u4_cur_pic_num,
                          UWORD32 u2_u4_max_pic_num_minus1,
                          UWORD8 u1_nal_unit_type,
                          struct pic_buffer_t *ps_pic_buf,
                          UWORD8 u1_buf_id,
                          UWORD8 u1_fld_pic_flag,
                          UWORD8 u1_curr_pic_in_err);
void ih264d_release_pics_in_dpb(void *pv_dec,
                                UWORD8 u1_disp_bufs);
void ih264d_reset_ref_bufs(dpb_manager_t *ps_dpb_mgr);
WORD32 ih264d_delete_st_node_or_make_lt(dpb_manager_t *ps_dpb_mgr,
                                      WORD32 u4_pic_num,
                                      UWORD32 u4_lt_idx,
                                      UWORD8 u1_fld_pic_flag);

WORD32 ih264d_delete_gap_frm_mmco(dpb_manager_t *ps_dpb_mgr,
                                  WORD32 i4_frame_num,
                                  UWORD8 *pu1_del_node);

WORD32 ih264d_delete_gap_frm_sliding(dpb_manager_t *ps_dpb_mgr,
                                     WORD32 i4_frame_num,
                                     UWORD8 *pu1_del_node);

WORD32 ih264d_do_mmco_for_gaps(dpb_manager_t *ps_dpb_mgr,
                             UWORD8 u1_num_ref_frames);

WORD32 ih264d_insert_pic_in_display_list(dpb_manager_t *ps_dpb_mgr,
                                         UWORD8 u1_buf_id,
                                         WORD32 i4_display_poc,
                                         UWORD32 u4_frame_num);
void ih264d_delete_nonref_nondisplay_pics(dpb_manager_t *ps_dpb_mgr);
#endif /*  _IH264D_DPB_MANAGER_H_ */