Home | History | Annotate | Download | only in common
      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 
     21 /**
     22  *******************************************************************************
     23  * @file
     24  *  ih264_dpb_mgr.h
     25  *
     26  * @brief
     27  *  Function declarations used for decoded picture buffer management
     28  *
     29  * @author
     30  *  Srinivas T
     31  *
     32  *
     33  * @remarks
     34  *  None
     35  *
     36  *******************************************************************************
     37  */
     38 #ifndef _IH264_DPB_MGR_H_
     39 #define _IH264_DPB_MGR_H_
     40 
     41 /* Temporary definitions. Have to be defined later */
     42 
     43 #define MAX_DPB_BUFS                (MAX_DPB_SIZE * 4)
     44 
     45 #define MARK_ST_PICNUM_AS_NONREF    1
     46 #define MARK_LT_INDEX_AS_NONREF     2
     47 #define MARK_ST_PICNUM_AS_LT_INDEX  3
     48 #define RESET_REF_PICTURES          5
     49 
     50 typedef struct dpb_info_t dpb_info_t;
     51 
     52 enum
     53 {
     54     INVALID = -1,
     55     UNUSED_FOR_REF = 0  ,
     56     LONG_TERM_REF       ,
     57     SHORT_TERM_REF      ,
     58 };
     59 struct dpb_info_t
     60 {
     61     /**
     62      * Pointer to picture buffer structure
     63      */
     64     pic_buf_t *ps_pic_buf;
     65 
     66     /**
     67      * Link to the DPB buffer with previous link
     68      */
     69     dpb_info_t *ps_prev_dpb;
     70 
     71 };
     72 
     73 typedef struct
     74 {
     75     /**
     76      * Pointer to the most recent pic Num
     77      */
     78     dpb_info_t *ps_dpb_short_term_head;
     79 
     80     /**
     81      * Pointer to the most recent pic Num
     82      */
     83     dpb_info_t *ps_dpb_long_term_head;
     84 
     85     /**
     86      * Physical storage for dpbInfo for ref bufs
     87      */
     88     dpb_info_t as_dpb_info[MAX_DPB_BUFS];
     89 
     90     /**
     91      * Array of structures for bottom field.
     92      */
     93     pic_buf_t as_top_field_pics[MAX_DPB_BUFS];
     94 
     95     /**
     96      * Array of structures for bottom field.
     97      */
     98     pic_buf_t as_bottom_field_pics[MAX_DPB_BUFS];
     99 
    100     /**
    101      * Number of short-term reference buffers
    102      */
    103     UWORD8 u1_num_short_term_ref_bufs;
    104 
    105     /**
    106      * Number of long-term reference buffers
    107      */
    108     UWORD8 u1_num_long_term_ref_bufs;
    109 
    110     /**
    111      * buffer ID current frame
    112      */
    113     WORD32 i4_cur_frame_buf_id;
    114 
    115 } dpb_mgr_t;
    116 
    117 void ih264_dpb_mgr_init(dpb_mgr_t *ps_dpb_mgr);
    118 
    119 WORD32 ih264_dpb_mgr_insert_ref_frame(dpb_mgr_t *ps_dpb_mgr,
    120                                       pic_buf_t *ps_pic_buf,
    121                                       WORD32 reference_type,
    122                                       UWORD32 frame_num,
    123                                       WORD32 long_term_frame_idx);
    124 
    125 WORD32 ih264_dpb_mgr_delete_ref_frame(dpb_mgr_t *ps_dpb_mgr,
    126                                       WORD32 reference_type);
    127 
    128 WORD32 ih264_dpb_mgr_delete_all_ref_frames(dpb_mgr_t *ps_dpb_mgr);
    129 
    130 WORD32 ih264_dpb_mgr_count_ref_frames(dpb_mgr_t *ps_dpb_mgr,
    131                                       WORD32 curr_frame_num,
    132                                       WORD32 max_frame_num);
    133 
    134 WORD32 ih264_dpb_mgr_delete_short_ref_frame(dpb_mgr_t *ps_dpb_mgr,
    135                                             WORD32 curr_frame_num,
    136                                             WORD32 max_frame_num);
    137 
    138 WORD32 ih264_dpb_mgr_insert_ref_field(dpb_mgr_t *ps_dpb_mgr,
    139                                       pic_buf_t *ps_pic_buf,
    140                                       WORD32 reference_type,
    141                                       UWORD32 frame_num,
    142                                       WORD32 long_term_frame_idx);
    143 
    144 WORD32 ih264_dpb_mgr_delete_ref_field(dpb_mgr_t *ps_dpb_mgr,
    145                                       WORD32 reference_type);
    146 
    147 WORD32 ih264_dpb_mgr_alternate_ref_fields(dpb_mgr_t *ps_dpb_mgr,
    148                                           WORD32 reference_type,
    149                                           WORD32 first_field_type);
    150 
    151 WORD32 ih264_dpb_mgr_sort_short_term_fields_by_frame_num(dpb_mgr_t *ps_dpb_mgr,
    152                                                          WORD32 curr_frame_num,
    153                                                          WORD32 first_field_type,
    154                                                          WORD32 max_frame_num);
    155 
    156 WORD32 ih264_dpb_mgr_sort_short_term_fields_by_poc_l0(dpb_mgr_t *ps_dpb_mgr,
    157                                                       WORD32 curr_poc,
    158                                                       WORD32 first_field_type);
    159 
    160 WORD32 ih264_dpb_mgr_sort_short_term_fields_by_poc_l1(dpb_mgr_t *ps_dpb_mgr,
    161                                                       WORD32 curr_poc,
    162                                                       WORD32 first_field_type);
    163 
    164 WORD32 ih264_dpb_mgr_sort_long_term_fields_by_frame_idx(dpb_mgr_t *ps_dpb_mgr,
    165                                                         WORD32 first_field_type);
    166 
    167 WORD32 ih264_dpb_mgr_delete_long_ref_fields_max_frame_idx(dpb_mgr_t *ps_dpb_mgr,
    168                                                           WORD32 max_frame_idx);
    169 
    170 void ih264_dpb_mgr_del_ref(dpb_mgr_t *ps_dpb_mgr,
    171                            buf_mgr_t *ps_buf_mgr,
    172                            WORD32 u4_abs_poc);
    173 
    174 pic_buf_t *ih264_dpb_mgr_get_ref_by_nearest_poc(dpb_mgr_t *ps_dpb_mgr,
    175                                                 WORD32 cur_abs_poc);
    176 
    177 pic_buf_t *ih264_dpb_mgr_get_ref_by_poc(dpb_mgr_t *ps_dpb_mgr, WORD32 abs_poc);
    178 
    179 pic_buf_t *ih264_dpb_mgr_get_ref_by_poc_lsb(dpb_mgr_t *ps_dpb_mgr,
    180                                             WORD32 poc_lsb);
    181 
    182 void ih264_dpb_mgr_reset(dpb_mgr_t *ps_dpb_mgr, buf_mgr_t *ps_buf_mgr);
    183 
    184 void ih264_dpb_mgr_release_pics(buf_mgr_t *ps_buf_mgr, UWORD8 u1_disp_bufs);
    185 
    186 #endif /*  _IH264_DPB_MGR_H_ */
    187