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