xref: /aosp_15_r20/external/libavc/decoder/ih264d_dpb_manager.h (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker #ifndef _IH264D_DPB_MANAGER_H_
21*495ae853SAndroid Build Coastguard Worker #define _IH264D_DPB_MANAGER_H_
22*495ae853SAndroid Build Coastguard Worker /*!
23*495ae853SAndroid Build Coastguard Worker ***************************************************************************
24*495ae853SAndroid Build Coastguard Worker * \file ih264d_dpb_manager.h
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * \brief
27*495ae853SAndroid Build Coastguard Worker *    Decoded Picture Buffer Manager Include File
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * Detailed_description
30*495ae853SAndroid Build Coastguard Worker *
31*495ae853SAndroid Build Coastguard Worker * \date
32*495ae853SAndroid Build Coastguard Worker *    19-12-2002
33*495ae853SAndroid Build Coastguard Worker *
34*495ae853SAndroid Build Coastguard Worker * \author  Sriram Sethuraman
35*495ae853SAndroid Build Coastguard Worker ***************************************************************************
36*495ae853SAndroid Build Coastguard Worker */
37*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
42*495ae853SAndroid Build Coastguard Worker 
43*495ae853SAndroid Build Coastguard Worker #define END_OF_MMCO                 0
44*495ae853SAndroid Build Coastguard Worker #define MARK_ST_PICNUM_AS_NONREF    1
45*495ae853SAndroid Build Coastguard Worker #define MARK_LT_INDEX_AS_NONREF     2
46*495ae853SAndroid Build Coastguard Worker #define MARK_ST_PICNUM_AS_LT_INDEX  3
47*495ae853SAndroid Build Coastguard Worker #define SET_MAX_LT_INDEX            4
48*495ae853SAndroid Build Coastguard Worker #define RESET_REF_PICTURES          5
49*495ae853SAndroid Build Coastguard Worker #define SET_LT_INDEX                6
50*495ae853SAndroid Build Coastguard Worker #define RESET_NONREF_PICTURES       7
51*495ae853SAndroid Build Coastguard Worker #define RESET_ALL_PICTURES          8
52*495ae853SAndroid Build Coastguard Worker 
53*495ae853SAndroid Build Coastguard Worker #define NO_LONG_TERM_INDICIES      255
54*495ae853SAndroid Build Coastguard Worker struct field_t
55*495ae853SAndroid Build Coastguard Worker {
56*495ae853SAndroid Build Coastguard Worker     /* picNum of tbe reference field              */
57*495ae853SAndroid Build Coastguard Worker     WORD32 i4_pic_num;
58*495ae853SAndroid Build Coastguard Worker 
59*495ae853SAndroid Build Coastguard Worker     /*  assigned when used for long term reference */
60*495ae853SAndroid Build Coastguard Worker     /* else MAX_REF_BUFS+1 */
61*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_long_term_frame_idx;
62*495ae853SAndroid Build Coastguard Worker 
63*495ae853SAndroid Build Coastguard Worker     /* 0 : unused for reference                   */
64*495ae853SAndroid Build Coastguard Worker     /* 1 : used for short term reference          */
65*495ae853SAndroid Build Coastguard Worker     /* 2 : used for long term reference           */
66*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_reference_info;
67*495ae853SAndroid Build Coastguard Worker };
68*495ae853SAndroid Build Coastguard Worker 
69*495ae853SAndroid Build Coastguard Worker 
70*495ae853SAndroid Build Coastguard Worker struct dpb_info_t
71*495ae853SAndroid Build Coastguard Worker {
72*495ae853SAndroid Build Coastguard Worker   struct pic_buffer_t *ps_pic_buf;       /** Pointer to picture buffer structure */
73*495ae853SAndroid Build Coastguard Worker   WORD32 i4_frame_num;      /** frame number of picture - unique for each ref*/
74*495ae853SAndroid Build Coastguard Worker   struct dpb_info_t *ps_prev_short;/** Link to the DPB with previous picNum */
75*495ae853SAndroid Build Coastguard Worker   struct dpb_info_t *ps_prev_long;     /** Link to the DPB with previous long term frame*/
76*495ae853SAndroid Build Coastguard Worker   struct field_t s_top_field;       /** Contains information of the top_field
77*495ae853SAndroid Build Coastguard Worker                                      reference info, pic num and longt term frame idx */
78*495ae853SAndroid Build Coastguard Worker   struct field_t s_bot_field;       /** Contains information of the bot_field
79*495ae853SAndroid Build Coastguard Worker                                      reference info, pic num and longt term frame idx */
80*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_buf_id;     /** bufID from bufAPI */
81*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_used_as_ref;        /** whether buffer is used as ref for frame or
82*495ae853SAndroid Build Coastguard Worker                                      complementary reference field pair */
83*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_lt_idx;     /** If buf is assigned long-term index; else MAX_REF_BUFS+1 */
84*495ae853SAndroid Build Coastguard Worker 
85*495ae853SAndroid Build Coastguard Worker };
86*495ae853SAndroid Build Coastguard Worker 
87*495ae853SAndroid Build Coastguard Worker typedef struct
88*495ae853SAndroid Build Coastguard Worker {
89*495ae853SAndroid Build Coastguard Worker   struct pic_buffer_t *ps_def_dpb[MAX_REF_BUFS];/** DPB in default index order */
90*495ae853SAndroid Build Coastguard Worker   struct pic_buffer_t *ps_mod_dpb[2][2 * MAX_REF_BUFS];/** DPB in reordered index order, 0-fwd,1-bwd */
91*495ae853SAndroid Build Coastguard Worker   struct pic_buffer_t *ps_init_dpb[2][2 * MAX_REF_BUFS];/** DPB in reordered index order, 0-fwd,1-bwd */
92*495ae853SAndroid Build Coastguard Worker   struct dpb_info_t *ps_dpb_st_head;     /** Pointer to the most recent picNum */
93*495ae853SAndroid Build Coastguard Worker   struct dpb_info_t *ps_dpb_ht_head;     /** Pointer to the smallest LT index */
94*495ae853SAndroid Build Coastguard Worker   struct dpb_info_t as_dpb_info[MAX_REF_BUFS];       /** Physical storage for dpbInfo for ref bufs */
95*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_num_st_ref_bufs;        /** Number of short term ref. buffers */
96*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_num_lt_ref_bufs;        /** Number of long term ref. buffer */
97*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_max_lt_frame_idx;       /** Maximum long term frame index */
98*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_num_gaps;       /** Total number of outstanding gaps */
99*495ae853SAndroid Build Coastguard Worker   void * pv_codec_handle;             /* For Error Handling */
100*495ae853SAndroid Build Coastguard Worker   WORD32 i4_max_frm_num;        /** Max frame number */
101*495ae853SAndroid Build Coastguard Worker   WORD32 ai4_gaps_start_frm_num[MAX_FRAMES];/** start frame number for a gap seqn */
102*495ae853SAndroid Build Coastguard Worker   WORD32 ai4_gaps_end_frm_num[MAX_FRAMES];       /** start frame number for a gap seqn */
103*495ae853SAndroid Build Coastguard Worker   WORD8  ai1_gaps_per_seq[MAX_FRAMES];      /** number of gaps with each gap seqn */
104*495ae853SAndroid Build Coastguard Worker   WORD32 ai4_poc_buf_id_map[MAX_FRAMES][3];
105*495ae853SAndroid Build Coastguard Worker   WORD8 i1_poc_buf_id_entries;
106*495ae853SAndroid Build Coastguard Worker   WORD8 i1_gaps_deleted;
107*495ae853SAndroid Build Coastguard Worker   UWORD16 u2_pic_wd;
108*495ae853SAndroid Build Coastguard Worker   UWORD16 u2_pic_ht;
109*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_mmco_error_in_seq;
110*495ae853SAndroid Build Coastguard Worker }dpb_manager_t;
111*495ae853SAndroid Build Coastguard Worker 
112*495ae853SAndroid Build Coastguard Worker /** Structure store the MMC Commands */
113*495ae853SAndroid Build Coastguard Worker struct MMCParams
114*495ae853SAndroid Build Coastguard Worker {
115*495ae853SAndroid Build Coastguard Worker   UWORD32 u4_mmco;      /** memory managemet control operation */
116*495ae853SAndroid Build Coastguard Worker   UWORD32 u4_diff_pic_num;      /** diff Of Pic Nums Minus1 */
117*495ae853SAndroid Build Coastguard Worker   UWORD32 u4_lt_idx;        /** Long Term Pic Idx */
118*495ae853SAndroid Build Coastguard Worker   UWORD32 u4_max_lt_idx_plus1;      /** MaxLongTermPicIdxPlus1 */
119*495ae853SAndroid Build Coastguard Worker };
120*495ae853SAndroid Build Coastguard Worker 
121*495ae853SAndroid Build Coastguard Worker typedef struct
122*495ae853SAndroid Build Coastguard Worker {
123*495ae853SAndroid Build Coastguard Worker   UWORD8  u1_dpb_commands_read;     /** Flag to indicate that DBP commands are read */
124*495ae853SAndroid Build Coastguard Worker   UWORD8  u1_buf_mode;      /** decoder Pic bugffering mode*/
125*495ae853SAndroid Build Coastguard Worker   UWORD8  u1_num_of_commands;       /** Number of MMC commands */
126*495ae853SAndroid Build Coastguard Worker   /* These variables are ised in case of IDR pictures only */
127*495ae853SAndroid Build Coastguard Worker   UWORD8  u1_idr_pic;       /** = 1 ,IDR pic */
128*495ae853SAndroid Build Coastguard Worker   UWORD8  u1_no_output_of_prior_pics_flag;
129*495ae853SAndroid Build Coastguard Worker   UWORD8  u1_long_term_reference_flag;
130*495ae853SAndroid Build Coastguard Worker   struct MMCParams  as_mmc_params[MAX_REF_BUFS];      /* < Buffer to store MMC commands */
131*495ae853SAndroid Build Coastguard Worker   UWORD8 u1_dpb_commands_read_slc;
132*495ae853SAndroid Build Coastguard Worker }dpb_commands_t;
133*495ae853SAndroid Build Coastguard Worker 
134*495ae853SAndroid Build Coastguard Worker void ih264d_init_ref_bufs(dpb_manager_t *ps_dpb_mgr);
135*495ae853SAndroid Build Coastguard Worker 
136*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_insert_st_node(dpb_manager_t *ps_dpb_mgr,
137*495ae853SAndroid Build Coastguard Worker                           struct pic_buffer_t *ps_pic_buf,
138*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_buf_id,
139*495ae853SAndroid Build Coastguard Worker                           UWORD32 u2_cur_pic_num);
140*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_update_default_index_list(dpb_manager_t *ps_dpb_mgr);
141*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_do_mmco_buffer(dpb_commands_t *ps_dpb_cmds,
142*495ae853SAndroid Build Coastguard Worker                           dpb_manager_t *ps_dpb_mgr,
143*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_numRef_frames_for_seq,
144*495ae853SAndroid Build Coastguard Worker                           UWORD32 u4_cur_pic_num,
145*495ae853SAndroid Build Coastguard Worker                           UWORD32 u2_u4_max_pic_num_minus1,
146*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_nal_unit_type,
147*495ae853SAndroid Build Coastguard Worker                           struct pic_buffer_t *ps_pic_buf,
148*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_buf_id,
149*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_fld_pic_flag,
150*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_curr_pic_in_err);
151*495ae853SAndroid Build Coastguard Worker void ih264d_release_pics_in_dpb(void *pv_dec,
152*495ae853SAndroid Build Coastguard Worker                                 UWORD8 u1_disp_bufs);
153*495ae853SAndroid Build Coastguard Worker void ih264d_reset_ref_bufs(dpb_manager_t *ps_dpb_mgr);
154*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_delete_st_node_or_make_lt(dpb_manager_t *ps_dpb_mgr,
155*495ae853SAndroid Build Coastguard Worker                                       WORD32 u4_pic_num,
156*495ae853SAndroid Build Coastguard Worker                                       UWORD32 u4_lt_idx,
157*495ae853SAndroid Build Coastguard Worker                                       UWORD8 u1_fld_pic_flag);
158*495ae853SAndroid Build Coastguard Worker 
159*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_delete_gap_frm_mmco(dpb_manager_t *ps_dpb_mgr,
160*495ae853SAndroid Build Coastguard Worker                                   WORD32 i4_frame_num,
161*495ae853SAndroid Build Coastguard Worker                                   UWORD8 *pu1_del_node);
162*495ae853SAndroid Build Coastguard Worker 
163*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_delete_gap_frm_sliding(dpb_manager_t *ps_dpb_mgr,
164*495ae853SAndroid Build Coastguard Worker                                      WORD32 i4_frame_num,
165*495ae853SAndroid Build Coastguard Worker                                      UWORD8 *pu1_del_node);
166*495ae853SAndroid Build Coastguard Worker 
167*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_do_mmco_for_gaps(dpb_manager_t *ps_dpb_mgr,
168*495ae853SAndroid Build Coastguard Worker                              UWORD8 u1_num_ref_frames);
169*495ae853SAndroid Build Coastguard Worker 
170*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_insert_pic_in_display_list(dpb_manager_t *ps_dpb_mgr,
171*495ae853SAndroid Build Coastguard Worker                                          UWORD8 u1_buf_id,
172*495ae853SAndroid Build Coastguard Worker                                          WORD32 i4_display_poc,
173*495ae853SAndroid Build Coastguard Worker                                          UWORD32 u4_frame_num);
174*495ae853SAndroid Build Coastguard Worker void ih264d_delete_nonref_nondisplay_pics(dpb_manager_t *ps_dpb_mgr);
175*495ae853SAndroid Build Coastguard Worker #endif /*  _IH264D_DPB_MANAGER_H_ */
176