diff options
Diffstat (limited to 'Src/h264dec/ldecod/inc/mbuffer.h')
-rw-r--r-- | Src/h264dec/ldecod/inc/mbuffer.h | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/Src/h264dec/ldecod/inc/mbuffer.h b/Src/h264dec/ldecod/inc/mbuffer.h new file mode 100644 index 00000000..c06e9fb0 --- /dev/null +++ b/Src/h264dec/ldecod/inc/mbuffer.h @@ -0,0 +1,235 @@ + +/*! + *********************************************************************** + * \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> + * - Alexis Michael Tourapis <alexismt@ieee.org> + + * - Jill Boyce <jill.boyce@thomson.net> + * - Saurav K Bandyopadhyay <saurav@ieee.org> + * - Zhenyu Wu <Zhenyu.Wu@thomson.net + * - Purvin Pandit <Purvin.Pandit@thomson.net> + * + *********************************************************************** + */ +#ifndef _MBUFFER_H_ +#define _MBUFFER_H_ + +#include "global.h" +#include <bfc/platform/types.h> + +#define MAX_LIST_SIZE 33 +//! definition of pic motion parameters + +typedef struct pic_motion_params +{ + PicMotion **motion[2]; + h264_ref_t ***field_references; + byte * mb_field; //!< field macroblock indicator + byte ** field_frame; //!< indicates if co_located is field or frame. + int padding[1]; +} PicMotionParams; + +typedef struct video_image +{ + imgpel **img; + imgpel *base_address; + size_t stride; + struct video_image *next; // for the memory cacher +} VideoImage; +//! definition a picture (field or frame) +typedef struct storable_picture +{ + PictureStructure structure; + + int poc; + int top_poc; + int bottom_poc; + int frame_poc; + h264_ref_t ref_pic_num [MAX_NUM_SLICES][6][MAX_LIST_SIZE]; + h264_ref_t frm_ref_pic_num [MAX_NUM_SLICES][6][MAX_LIST_SIZE]; + h264_ref_t top_ref_pic_num [MAX_NUM_SLICES][6][MAX_LIST_SIZE]; + h264_ref_t bottom_ref_pic_num [MAX_NUM_SLICES][6][MAX_LIST_SIZE]; + unsigned frame_num; + unsigned recovery_frame; + + int pic_num; + int long_term_pic_num; + int long_term_frame_idx; + + byte is_long_term; + int used_for_reference; + int is_output; + int non_existing; + + short max_slice_id; + + int size_x, size_y, size_x_cr, size_y_cr; + int size_x_m1, size_y_m1, size_x_cr_m1, size_y_cr_m1; + int chroma_vector_adjustment; + int coded_frame; + int mb_aff_frame_flag; + unsigned PicWidthInMbs; + unsigned PicSizeInMbs; + + //imgpel ** imgY; //!< Y picture component + union + { + VideoImage *plane_images[3]; // to ensure array alignment + struct + { + VideoImage *imgY; + VideoImage *imgUV[2]; //!< U and V picture components + }; + }; + + struct pic_motion_params motion; //!< Motion info + struct pic_motion_params JVmotion[MAX_PLANE]; //!< Motion info for 4:4:4 independent mode decoding + + short ** slice_id; //!< reference picture [mb_x][mb_y] + + 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 slice_type; + int idr_flag; + int no_output_of_prior_pics_flag; + int long_term_reference_flag; + int adaptive_ref_pic_buffering_flag; + + 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; + int qp; + int chroma_qp_offset[2]; + int slice_qp_delta; + DecRefPicMarking_t *dec_ref_pic_marking_buffer; //!< stores the memory management control operations + + // picture error concealment + int concealed_pic; //indicates if this is a concealed picture + + // variables for tone mapping + int seiHasTone_mapping; + int tone_mapping_model_id; + int tonemapped_bit_depth; + imgpel* tone_mapping_lut; //!< tone mapping look up table + + int retain_count; // benski> we're going to reference count these things + uint64_t time_code; // user-passed timecode for this frame +} StorablePicture; + +//! definition a picture (field or frame) +typedef struct colocated_params +{ + int mb_adaptive_frame_field_flag; + int size_x, size_y; + byte is_long_term; + + MotionParams frame; + MotionParams top; + MotionParams bottom; + +} 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; + unsigned recovery_frame; + + int frame_num_wrap; + int long_term_frame_idx; + int is_output; + int poc; + + // picture error concealment + int concealment_reference; + + StorablePicture *frame; + StorablePicture *top_field; + StorablePicture *bottom_field; + +} FrameStore; + + +//! Decoded Picture Buffer +typedef struct decoded_picture_buffer +{ + VideoParameters *p_Vid; + InputParameters *p_Inp; + 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; + int num_ref_frames; + + FrameStore *last_picture; +} DecodedPictureBuffer; + +extern void init_dpb(VideoParameters *p_Vid); +extern void free_dpb(VideoParameters *p_Vid); +extern FrameStore* alloc_frame_store(void); +extern void free_frame_store(VideoParameters *p_Vid, FrameStore* f); +extern StorablePicture* alloc_storable_picture(VideoParameters *p_Vid, PictureStructure type, int size_x, int size_y, int size_x_cr, int size_y_cr); +extern void free_storable_picture(VideoParameters *p_Vid, StorablePicture* p); +extern void store_picture_in_dpb(VideoParameters *p_Vid, StorablePicture* p); +extern void flush_dpb(VideoParameters *p_Vid); + +extern void dpb_split_field (VideoParameters *p_Vid, FrameStore *fs); +extern void dpb_combine_field(VideoParameters *p_Vid, FrameStore *fs); +extern void dpb_combine_field_yuv(VideoParameters *p_Vid, FrameStore *fs); + +extern void init_lists (Slice *currSlice); +extern void reorder_ref_pic_list(VideoParameters *p_Vid, StorablePicture **list, char *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); + +extern void init_mbaff_lists(VideoParameters *p_Vid); +extern void alloc_ref_pic_list_reordering_buffer(Slice *currSlice); +extern void free_ref_pic_list_reordering_buffer(Slice *currSlice); + +extern void fill_frame_num_gap(VideoParameters *p_Vid); + +extern ColocatedParams* alloc_colocated(VideoParameters *p_Vid, int size_x, int size_y,int mb_adaptive_frame_field_flag); +extern void free_colocated(VideoParameters *p_Vid, ColocatedParams* p); +extern void compute_colocated (Slice *currSlice, ColocatedParams* p, StorablePicture **listX[6]); +extern void compute_colocated_frames_mbs (Slice *currSlice, ColocatedParams* p, StorablePicture **listX[6]); + +// For 4:4:4 independent mode +extern void compute_colocated_JV ( Slice *currSlice, ColocatedParams* p, StorablePicture **listX[6]); +extern void copy_storable_param_JV( VideoParameters *p_Vid, PicMotionParams *JVplane, PicMotionParams *motion ); + +// benski> decoded output pictures +void out_storable_picture_get(VideoParameters *img, StorablePicture **pic); +void out_storable_picture_add(VideoParameters *img, StorablePicture *pic); +void out_storable_pictures_init(VideoParameters *img, size_t count); +void out_storable_pictures_destroy(VideoParameters *img); + +#endif + |