blob: cfb238f066ee80ecc7993a83c89f0071f40fa88c [file] [log] [blame]
/*!
***********************************************************************
* \file
* mbuffer.h
*
* \brief
* Frame buffer functions
*
* \author
* Main contributors (see contributors.h for copyright, address and affiliation details)
* - Karsten Sühring <suehring@hhi.de>
***********************************************************************
*/
#ifndef _MBUFFER_H_
#define _MBUFFER_H_
#define MAX_LIST_SIZE 33
//! definition a picture (field or frame)
typedef struct storable_picture
{
PictureStructure structure;
int poc;
int top_poc;
int bottom_poc;
int frame_poc;
int order_num;
int64 ref_pic_num[6][MAX_LIST_SIZE];
int64 frm_ref_pic_num[6][MAX_LIST_SIZE];
int64 top_ref_pic_num[6][MAX_LIST_SIZE];
int64 bottom_ref_pic_num[6][MAX_LIST_SIZE];
unsigned frame_num;
int pic_num;
int long_term_pic_num;
int long_term_frame_idx;
int is_long_term;
int used_for_reference;
int is_output;
int non_existing;
int size_x, size_y, size_x_cr, size_y_cr;
int size_x_pad, size_y_pad;
int size_x_cr_pad, size_y_cr_pad;
int chroma_vector_adjustment;
int coded_frame;
int MbaffFrameFlag;
imgpel ** imgY; //!< Y picture component
imgpel **** imgY_sub; //!< Y picture component upsampled (Quarter pel)
imgpel **** imgY_sub_w; //!< Y picture component upsampled (Quarter pel) for weighted prediction
imgpel ***** imgUV_sub; //!< UV picture component upsampled (Quarter/One-Eighth pel)
imgpel *** imgUV; //!< U and V picture components
byte * mb_field; //!< field macroblock indicator
signed char *** ref_idx; //!< reference picture [list][subblock_y][subblock_x]
int64 *** ref_pic_id; //!< reference picture identifier [list][subblock_y][subblock_x]
// (not simply index)
int64 *** ref_id; //!< reference picture identifier [list][subblock_y][subblock_x]
// (not simply index)
short **** mv; //!< motion vector [list][subblock_x][subblock_y][component]
byte ** moving_block;
byte ** field_frame; //!< indicates if co_located is field or frame.
struct storable_picture *top_field; // for mb aff, if frame for referencing the top field
struct storable_picture *bottom_field; // for mb aff, if frame for referencing the bottom field
struct storable_picture *frame; // for mb aff, if field for referencing the combined frame
int chroma_format_idc;
int frame_mbs_only_flag;
int frame_cropping_flag;
int frame_cropping_rect_left_offset;
int frame_cropping_rect_right_offset;
int frame_cropping_rect_top_offset;
int frame_cropping_rect_bottom_offset;
} StorablePicture;
//! definition a picture (field or frame)
typedef struct colocated_params
{
int mb_adaptive_frame_field_flag;
int size_x, size_y;
int64 ref_pic_num[6][MAX_LIST_SIZE];
signed char *** ref_idx; //!< reference picture [list][subblock_y][subblock_x]
int64 *** ref_pic_id; //!< reference picture identifier [list][subblock_y][subblock_x]
short **** mv; //!< motion vector [list][subblock_x][subblock_y][component]
byte ** moving_block;
// Top field params
int64 top_ref_pic_num[6][MAX_LIST_SIZE];
signed char *** top_ref_idx; //!< reference picture [list][subblock_y][subblock_x]
int64 *** top_ref_pic_id; //!< reference picture identifier [list][subblock_y][subblock_x]
short **** top_mv; //!< motion vector [list][subblock_x][subblock_y][component]
byte ** top_moving_block;
// Bottom field params
int64 bottom_ref_pic_num[6][MAX_LIST_SIZE];
signed char *** bottom_ref_idx; //!< reference picture [list][subblock_y][subblock_x]
int64 *** bottom_ref_pic_id; //!< reference picture identifier [list][subblock_y][subblock_x]
short **** bottom_mv; //!< motion vector [list][subblock_x][subblock_y][component]
byte ** bottom_moving_block;
byte is_long_term;
byte ** field_frame; //!< indicates if co_located is field or frame.
} ColocatedParams;
//! Frame Stores for Decoded Picture Buffer
typedef struct frame_store
{
int is_used; //!< 0=empty; 1=top; 2=bottom; 3=both fields (or frame)
int is_reference; //!< 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
int is_long_term; //!< 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
int is_orig_reference; //!< original marking by nal_ref_idc: 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
int is_non_existent;
unsigned frame_num;
int frame_num_wrap;
int long_term_frame_idx;
int is_output;
int poc;
StorablePicture *frame;
StorablePicture *top_field;
StorablePicture *bottom_field;
} FrameStore;
//! Decoded Picture Buffer
typedef struct decoded_picture_buffer
{
FrameStore **fs;
FrameStore **fs_ref;
FrameStore **fs_ltref;
unsigned size;
unsigned used_size;
unsigned ref_frames_in_buffer;
unsigned ltref_frames_in_buffer;
int last_output_poc;
int max_long_term_pic_idx;
int init_done;
FrameStore *last_picture;
} DecodedPictureBuffer;
extern DecodedPictureBuffer dpb;
extern StorablePicture **listX[6];
extern int listXsize[6];
void init_dpb(void);
void free_dpb(void);
FrameStore* alloc_frame_store(void);
void free_frame_store(FrameStore* f);
StorablePicture* alloc_storable_picture(PictureStructure type, int size_x, int size_y, int size_x_cr, int size_y_cr);
void free_storable_picture(StorablePicture* p);
void store_picture_in_dpb(StorablePicture* p);
void replace_top_pic_with_frame(StorablePicture* p);
void flush_dpb(void);
void dpb_split_field(FrameStore *fs);
void dpb_combine_field(FrameStore *fs);
void dpb_combine_field_yuv(FrameStore *fs);
void init_lists(int currSliceType, PictureStructure currPicStructure);
void reorder_ref_pic_list(StorablePicture **list, int *list_size,
int num_ref_idx_lX_active_minus1, int *reordering_of_pic_nums_idc,
int *abs_diff_pic_num_minus1, int *long_term_pic_idx);
void init_mbaff_lists(void);
void alloc_ref_pic_list_reordering_buffer(Slice *currSlice);
void free_ref_pic_list_reordering_buffer(Slice *currSlice);
void fill_frame_num_gap(ImageParameters *img);
ColocatedParams* alloc_colocated(int size_x, int size_y,int mb_adaptive_frame_field_flag);
void free_colocated(ColocatedParams* p);
void compute_colocated(ColocatedParams* p, StorablePicture **listX[6]);
#endif