📄 umc_h264_dec_defs_dec.h
字号:
struct FullFrameSnapshot
{
Ipp8u snapshot_id;
}full_frame_snapshot;
struct ProgressiveRefinementSegmentStart
{
Ipp8u progressive_refinement_id;
Ipp8u num_refinement_steps;
}progressive_refinement_segment_start;
struct MotionConstrainedSliceGroupSet
{
Ipp8u num_slice_groups_in_set;
Ipp8u slice_group_id[8];
Ipp8u exact_sample_value_match_flag;
Ipp8u pan_scan_rect_flag;
Ipp8u pan_scan_rect_id;
}motion_constrained_slice_group_set;
struct FilmGrainCharacteristics
{
Ipp8u film_grain_characteristics_cancel_flag;
Ipp8u model_id;
Ipp8u separate_colour_description_present_flag;
Ipp8u film_grain_bit_depth_luma;
Ipp8u film_grain_bit_depth_chroma;
Ipp8u film_grain_full_range_flag;
Ipp8u film_grain_colour_primaries;
Ipp8u film_grain_transfer_characteristics;
Ipp8u film_grain_matrix_coefficients;
Ipp8u blending_mode_id;
Ipp8u log2_scale_factor;
Ipp8u comp_model_present_flag[3];
Ipp8u num_intensity_intervals[3];
Ipp8u num_model_values[3];
Ipp8u intensity_interval_lower_bound[3][256];
Ipp8u intensity_interval_upper_bound[3][256];
Ipp8u comp_model_value[3][3][256];
Ipp8u film_grain_characteristics_repetition_period;
}film_grain_characteristics;
struct DeblockingFilterDisplayPreference
{
Ipp8u deblocking_display_preference_cancel_flag;
Ipp8u display_prior_to_deblocking_preferred_flag;
Ipp8u dec_frame_buffering_constraint_flag;
Ipp8u deblocking_display_preference_repetition_period;
}deblocking_filter_display_preference;
struct StereoVideoInfo
{
Ipp8u field_views_flag;
Ipp8u top_field_is_left_view_flag;
Ipp8u current_frame_is_left_view_flag;
Ipp8u next_frame_is_second_view_flag;
Ipp8u left_view_self_contained_flag;
Ipp8u right_view_self_contained_flag;
}stereo_video_info;
}SEI_messages;
};
#pragma pack()
// This file defines some data structures and constants used by the decoder,
// that are also needed by other classes, such as post filters and
// error concealment.
#define INTERP_FACTOR 4
#define INTERP_SHIFT 2
#define CHROMA_INTERP_FACTOR 8
#define CHROMA_INTERP_SHIFT 3
// at picture edge, clip motion vectors to only this far beyond the edge,
// in pixel units.
#define D_MV_CLIP_LIMIT 19
enum Direction_t{
D_DIR_FWD = 0,
D_DIR_BWD = 1,
D_DIR_BIDIR = 2,
D_DIR_DIRECT = 3,
D_DIR_DIRECT_SPATIAL_FWD = 4,
D_DIR_DIRECT_SPATIAL_BWD = 5,
D_DIR_DIRECT_SPATIAL_BIDIR = 6
};
inline bool IsForwardOnly(Ipp32s direction)
{
return (direction == D_DIR_FWD) || (direction == D_DIR_DIRECT_SPATIAL_FWD);
}
inline bool IsHaveForward(Ipp32s direction)
{
return (direction == D_DIR_FWD) || (direction == D_DIR_BIDIR) ||
(direction == D_DIR_DIRECT_SPATIAL_FWD) || (direction == D_DIR_DIRECT_SPATIAL_BIDIR) ||
(direction == D_DIR_DIRECT);
}
inline bool IsBackwardOnly(Ipp32s direction)
{
return (direction == D_DIR_BWD) || (direction == D_DIR_DIRECT_SPATIAL_BWD);
}
inline bool IsHaveBackward(Ipp32s direction)
{
return (direction == D_DIR_BWD) || (direction == D_DIR_BIDIR) ||
(direction == D_DIR_DIRECT_SPATIAL_BWD) || (direction == D_DIR_DIRECT_SPATIAL_BIDIR) ||
(direction == D_DIR_DIRECT);
}
inline bool IsBidirOnly(Ipp32s direction)
{
return (direction == D_DIR_BIDIR) || (direction == D_DIR_DIRECT_SPATIAL_BIDIR) ||
(direction == D_DIR_DIRECT);
}
// Warning: If these bit defines change, also need to change same
// defines and related code in sresidual.s.
enum CBP
{
D_CBP_LUMA_DC = 0x00001,
D_CBP_LUMA_AC = 0x1fffe,
D_CBP_CHROMA_DC = 0x00001,
D_CBP_CHROMA_AC = 0x1fffe,
D_CBP_CHROMA_AC_420 = 0x0001e,
D_CBP_CHROMA_AC_422 = 0x001fe,
D_CBP_CHROMA_AC_444 = 0x1fffe,
D_CBP_1ST_LUMA_AC_BITPOS = 1,
D_CBP_1ST_CHROMA_DC_BITPOS = 17,
D_CBP_1ST_CHROMA_AC_BITPOS = 19
};
enum
{
FIRST_DC_LUMA = 0,
FIRST_AC_LUMA = 1,
FIRST_DC_CHROMA = 17,
FIRST_AC_CHROMA = 19
};
enum
{
CHROMA_FORMAT_400 = 0,
CHROMA_FORMAT_420 = 1,
CHROMA_FORMAT_422 = 2,
CHROMA_FORMAT_444 = 3
};
inline
Ipp32u CreateIPPCBPMask420(Ipp32u cbpU, Ipp32u cbpV)
{
Ipp32u cbp4x4 = (((cbpU & D_CBP_CHROMA_DC) | ((cbpV & D_CBP_CHROMA_DC) << 1)) << D_CBP_1ST_CHROMA_DC_BITPOS) |
((cbpU & D_CBP_CHROMA_AC_420) << (D_CBP_1ST_CHROMA_AC_BITPOS - 1)) |
((cbpV & D_CBP_CHROMA_AC_420) << (D_CBP_1ST_CHROMA_AC_BITPOS + 4 - 1));
return cbp4x4;
} // Ipp32u CreateIPPCBPMask420(Ipp32u nUCBP, Ipp32u nVCBP)
inline
Ipp64u CreateIPPCBPMask422(Ipp32u cbpU, Ipp32u cbpV)
{
Ipp64u cbp4x4 = (((cbpU & D_CBP_CHROMA_DC) | ((cbpV & D_CBP_CHROMA_DC) << 1)) << D_CBP_1ST_CHROMA_DC_BITPOS) |
(((Ipp64u)cbpU & D_CBP_CHROMA_AC_422) << (D_CBP_1ST_CHROMA_AC_BITPOS - 1)) |
(((Ipp64u)cbpV & D_CBP_CHROMA_AC_422) << (D_CBP_1ST_CHROMA_AC_BITPOS + 8 - 1));
return cbp4x4;
} // Ipp32u CreateIPPCBPMask422(Ipp32u nUCBP, Ipp32u nVCBP)
inline
Ipp64u CreateIPPCBPMask444(Ipp32u cbpU, Ipp32u cbpV)
{
Ipp64u cbp4x4 = (((cbpU & D_CBP_CHROMA_DC) | ((cbpV & D_CBP_CHROMA_DC) << 1)) << D_CBP_1ST_CHROMA_DC_BITPOS) |
(((Ipp64u)cbpU & D_CBP_CHROMA_AC_444) << (D_CBP_1ST_CHROMA_AC_BITPOS - 1)) |
(((Ipp64u)cbpV & D_CBP_CHROMA_AC_444) << (D_CBP_1ST_CHROMA_AC_BITPOS + 16 - 1));
return cbp4x4;
} // Ipp32u CreateIPPCBPMask444(Ipp32u nUCBP, Ipp32u nVCBP)
#define BLOCK_IS_ON_LEFT_EDGE(x) (!((x)&3))
#define BLOCK_IS_ON_TOP_EDGE(x) ((x)<4)
#define CHROMA_BLOCK_IS_ON_LEFT_EDGE(x,c) (x_pos_value[c][x]==0)
#define CHROMA_BLOCK_IS_ON_TOP_EDGE(y,c) (y_pos_value[c][y]==0)
#define GetMBFieldDecodingFlag(x) (x.mbflags.fdf)
#define GetMBDirectSkipFlag(x) (x.mbflags.isDirect || x.mbflags.isSkipped)
#define GetMB8x8TSFlag(x) (x.mbflags.transform8x8)
#define pGetMBFieldDecodingFlag(x) (x->mbflags.fdf)
#define pGetMBDirectSkipFlag(x) (x->mbflags.isDirect || x->mbflags.isSkipped)
#define pGetMB8x8TSFlag(x) (x->mbflags.transform8x8)
#define GetMBSkippedFlag(x) (x.mbflags.isSkipped)
#define pGetMBSkippedFlag(x) (x->mbflags.isSkipped)
#define pSetMBDirectFlag(x) (x->mbflags.isDirect = 1);
#define SetMBDirectFlag(x) (x.mbflags.isDirect = 1);
#define pSetMBSkippedFlag(x) (x->mbflags.isSkipped = 1);
#define SetMBSkippedFlag(x) (x.mbflags.isSkipped = 1);
#define pSetMBFieldDecodingFlag(x,y) \
(x->mbflags.fdf = (Ipp8u)y)
#define SetMBFieldDecodingFlag(x,y) \
(x.mbflags.fdf = (Ipp8u)y)
#define pSetMB8x8TSFlag(x,y) \
(x->mbflags.transform8x8 = (Ipp8u)y)
#define SetMB8x8TSFlag(x,y) \
(x.mbflags.transform8x8 = (Ipp8u)y)
#define pSetPairMBFieldDecodingFlag(x1,x2,y) \
(x1->mbflags.fdf = (Ipp8u)y); \
(x2->mbflags.fdf = (Ipp8u)y)
#define SetPairMBFieldDecodingFlag(x1,x2,y) \
(x1.mbflags.fdf = (Ipp8u)y); \
(x2.mbflags.fdf = (Ipp8u)y)
///////////////// New structures
#pragma pack(1)
struct H264DecoderMotionVector
{
Ipp16s mvx;
Ipp16s mvy;
}; // 4 bytes
struct H264DecoderMacroblockRefIdxs
{
Ipp8s RefIdxs[16]; // 16 bytes
};//16bytes
struct H264DecoderMacroblockMVs
{
H264DecoderMotionVector MotionVectors[16]; // (H264DecoderMotionVector []) motion vectors for each block in macroblock
}; // 64 bytes
struct H264DecoderMacroblockCoeffsInfo
{
Ipp8u numCoeff[48]; // (Ipp8u) number of coefficients in each block in macroblock
}; // 48 bytes
struct H264MBFlags
{
Ipp8u fdf : 1;
Ipp8u transform8x8 : 1;
Ipp8u isDirect : 1;
Ipp8u isSkipped : 1;
};
struct H264DecoderMacroblockGlobalInfo
{
Ipp8s sbtype[4]; // (Ipp8u []) types of subblocks in macroblock
Ipp16s slice_id; // (Ipp16s) number of slice
Ipp8s mbtype; // (Ipp8u) type of macroblock
H264MBFlags mbflags;
}; // 8 bytes
struct H264DecoderMacroblockLocalInfo
{
Ipp32u cbp4x4_luma; // (Ipp32u) coded block pattern of luma blocks
Ipp32u cbp4x4_chroma[2]; // (Ipp32u []) coded block patterns of chroma blocks
Ipp8u cbp;
Ipp8s QP;
union
{
Ipp8s sbdir[4];
struct
{
Ipp16u edge_type;
Ipp8u intra_chroma_mode;
} IntraTypes;
};
}; // 20 bytes
struct H264DecoderBlockLocation
{
Ipp32s mb_num; // (Ipp32s) number of owning macroblock
Ipp32s block_num; // (Ipp32s) number of block
}; // 8 bytes
struct H264DecoderMacroblockNeighboursInfo
{
Ipp32s mb_A; // (Ipp32s) number of left macroblock
Ipp32s mb_B; // (Ipp32s) number of top macroblock
Ipp32s mb_C; // (Ipp32s) number of right-top macroblock
Ipp32s mb_D; // (Ipp32s) number of left-top macroblock
}; // 32 bytes
struct H264DecoderBlockNeighboursInfo
{
H264DecoderBlockLocation mbs_left[4];
H264DecoderBlockLocation mb_above;
H264DecoderBlockLocation mb_above_right;
H264DecoderBlockLocation mb_above_left;
H264DecoderBlockLocation mbs_left_chroma[2][4];
H264DecoderBlockLocation mb_above_chroma[2];
Ipp32s m_bInited;
}; // 128 bytes
#pragma pack()
enum
{
MV_DELTAS_OFFSET = 2
};
//this structure is present in each decoder frame
struct H264DecoderGlobalMacroblocksDescriptor
{
H264DecoderMacroblockMVs *MV[2];//MotionVectors L0 L1
H264DecoderMacroblockRefIdxs *RefIdxs[2];//Reference Indexes L0 l1
H264DecoderMacroblockGlobalInfo *mbs;//macroblocks
};
//this structure is one(or couple) for all decoder
class H264DecoderLocalMacroblockDescriptor
{
public:
// Default constructor
H264DecoderLocalMacroblockDescriptor(void);
// Destructor
~H264DecoderLocalMacroblockDescriptor(void);
// Allocate decoding data
bool Allocate(Ipp32s iMBCount, MemoryAllocator *pMemoryAllocator);
H264DecoderMacroblockMVs *(MVDeltas[2]); // (H264DecoderMacroblockMVs * ([])) motionVectors Deltas L0 and L1
H264DecoderMacroblockCoeffsInfo *MacroblockCoeffsInfo; // (H264DecoderMacroblockCoeffsInfo *) info about num_coeffs in each block in the current picture
H264DecoderMacroblockLocalInfo *mbs; // (H264DecoderMacroblockLocalInfo *) reconstuction info
H264DecoderMBAddr *active_next_mb_table; // (H264DecoderMBAddr *) current "next addres" table
// Assignment operator
H264DecoderLocalMacroblockDescriptor &operator = (H264DecoderLocalMacroblockDescriptor &);
protected:
// Release object
void Release(void);
Ipp8u *m_pAllocated; // (Ipp8u *) pointer to allocated memory
MemID m_midAllocated; // (MemID) mem id of allocated memory
size_t m_nAllocatedSize; // (size_t) size of allocated memory
MemoryAllocator *m_pMemoryAllocator; // (MemoryAllocator *) pointer to memory management tool
};
struct H264DecoderCurrentMacroblockDescriptor
{
H264DecoderMacroblockMVs *MVs[4];//MV L0,L1, MVDeltas 0,1
H264DecoderMacroblockRefIdxs *RefIdxs[2];//RefIdx L0, L1
H264DecoderMacroblockCoeffsInfo *MacroblockCoeffsInfo;
H264DecoderMacroblockNeighboursInfo CurrentMacroblockNeighbours;//mb neighboring info
H264DecoderBlockNeighboursInfo CurrentBlockNeighbours;//block neighboring info (if mbaff turned off remained static)
H264DecoderMacroblockGlobalInfo *GlobalMacroblockInfo;
H264DecoderMacroblockGlobalInfo *GlobalMacroblockPairInfo;
H264DecoderMacroblockLocalInfo *LocalMacroblockInfo;
H264DecoderMacroblockLocalInfo *LocalMacroblockPairInfo;
};
struct ReferenceFlags // flags use for reference frames of slice
{
char field : 3;
unsigned char isShortReference : 1;
};
inline Ipp32s GetReferenceField(ReferenceFlags *pFields, Ipp32s RefIndex)
{
/*if (0 <= RefIndex)
{*/
VM_ASSERT(pFields[RefIndex].field >= 0);
return pFields[RefIndex].field;
/*}
else
{
return -1;
}*/
} // Ipp32s GetReferenceField(Ipp8s *pFields, Ipp32s RefIndex)
// Declaration of thread-unsafe array class of simple types
template<class T>
class H264Array
{
public:
// Default constructor
H264Array(void)
{
m_Null = 0;
m_pArray = 0;
m_nItemCount = 0;
}
// Destructor
virtual
~H264Array(void)
{
Release();
}
// Initialize array
bool Init(size_t nInitialCount)
{
if (false == Reallocate(nInitialCount))
return false;
return true;
}
// Index operator
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -