📄 mp4.h
字号:
Ipp32s MacroBlockPerRow;
Ipp32s MacroBlockPerCol;
Ipp32s MacroBlockPerVOP;
Ipp32s mbns; // num bits for MacroBlockPerVOP
mp4_MacroBlock* MBinfo;
mp4_IntraPredBuff IntraPredBuff;
mp4_DataPartMacroBlock* DataPartBuff;
IppiQuantInvIntraSpec_MPEG4* QuantInvIntraSpec;
IppiQuantInvInterSpec_MPEG4* QuantInvInterSpec;
IppiWarpSpec_MPEG4* WarpSpec;
// for B-VOP
Ipp32s prevPlaneIsB;
// for interlaced B-VOP direct mode
Ipp32s Tframe;
IppMotionVector* FieldMV;
// for B-VOP direct mode
Ipp32s TRB, TRD;
// time increment of past and future VOP for B-VOP
Ipp64s rTime, nTime;
// VOP global time
Ipp64s vop_sync_time, vop_sync_time_b;
#ifdef USE_NOTCODED_STATE
// not_coded MB state
Ipp8u* ncState;
Ipp32s ncStateCleared;
#endif
} mp4_VideoObject;
/* StillTexture Object Info */
typedef struct _mp4_StillTextureObject {
Ipp32s dummy;
} mp4_StillTextureObject;
/* Mesh Object Info */
typedef struct _mp4_MeshObject {
Ipp32s dummy;
} mp4_MeshObject;
/* Face Object Info */
typedef struct _mp4_FaceObject {
Ipp32s dummy;
} mp4_FaceObject;
/* video_signal_type Info */
typedef struct _mp4_VideoSignalType {
Ipp32s is_video_signal_type;
Ipp32s video_format;
Ipp32s video_range;
Ipp32s is_colour_description;
Ipp32s colour_primaries;
Ipp32s transfer_characteristics;
Ipp32s matrix_coefficients;
} mp4_VideoSignalType;
/* Visual Object Info */
typedef struct _mp4_VisualObject {
Ipp32s is_identifier;
Ipp32s verid;
Ipp32s priority;
Ipp32s type;
mp4_VideoSignalType VideoSignalType;
mp4_VideoObject VideoObject;
mp4_StillTextureObject StillTextureObject;
mp4_MeshObject MeshObject;
mp4_FaceObject FaceObject;
mp4_Frame sFrame; // static sprite
mp4_Frame cFrame; // current
mp4_Frame rFrame; // reference in past
mp4_Frame nFrame; // reference in future
mp4_Frame *vFrame; // frame for display
Ipp32s frameCount;
Ipp32s frameInterval;
Ipp32s frameScale;
mp4_Statistic Statistic;
} mp4_VisualObject;
#ifdef _OMP_KARABAS
/* MacroBlock Info for MT */
typedef struct _mp4_MacroBlockMT {
Ipp16s dctCoeffs[64*6];
IppMotionVector mvF[4]; // B-VOP
IppMotionVector mvB[4]; // B-VOP
Ipp32s lnz[6];
Ipp8u pat;
Ipp8u mb_type; // B-VOP
Ipp8u dct_type; // interlaced
Ipp8u field_info; // interlaced
Ipp8u mcsel; // S(GMC)-VOP
Ipp8u dummy[3]; // align 16
} mp4_MacroBlockMT;
#endif // _OMP_KARABAS
/* Full Info */
typedef struct _mp4_Info {
Ipp32s ftype; // 0 - raw, 1 - mp4, 2 - avi
Ipp32s ftype_f; // ftype == 1 (0 - QuickTime(tm)), ftype == 2 (0 - DivX(tm) v. < 5, XVID, 1 - DivX(tm) v. >= 5)
Ipp8u* buffer; /* buffer header for saving MPEG-4 stream */
size_t buflen; /* total buffer length */
size_t len; /* valid data in buffer */
Ipp8u* bufptr; /* current frame, point to header or data */
Ipp32s bitoff; /* mostly point to next frame header or PSC */
Ipp32s profile_and_level_indication;
mp4_VisualObject VisualObject;
#ifdef _OMP_KARABAS
vm_thread_priority mTreadPriority;
mp4_MacroBlockMT* pMBinfoMT; /* OpenMP buffer */
Ipp32s mbInVideoPacket; /* needed for dcVLC */
#endif // _OMP_KARABAS
Ipp32s num_threads; /* OpenMP number of threads */
Ipp32s stopOnErr;
int strictSyntaxCheck;
int noPVOPs;
int noBVOPs;
} mp4_Info;
/* bitstream functions */
extern Ipp8u* mp4_FindStartCodePtr(mp4_Info* pInfo);
extern Ipp8u* mp4_FindStartCodeOrShortPtr(mp4_Info* pInfo);
extern Ipp32s mp4_SeekStartCodePtr(mp4_Info* pInfo);
extern Ipp32s mp4_SeekStartCodeOrShortPtr(mp4_Info* pInfo);
extern Ipp32s mp4_SeekStartCodeValue(mp4_Info* pInfo, Ipp8u code);
extern Ipp8u* mp4_FindShortVideoStartMarkerPtr(mp4_Info* pInfo);
extern Ipp32s mp4_SeekShortVideoStartMarker(mp4_Info* pInfo);
extern Ipp32s mp4_SeekGOBMarker(mp4_Info* pInfo);
extern Ipp32s mp4_SeekResyncMarker(mp4_Info* pInfo);
extern Ipp32s mp4_FindResyncMarker(mp4_Info* pInfo);
extern int mp4_IsStartCodeOrShort(mp4_Info* pInfo);
extern int mp4_IsStartCodeValue(mp4_Info* pInfo, int min, int max);
extern int mp4_IsShortCode(mp4_Info* pInfo);
/* tables */
typedef struct _mp4_VLC1 {
Ipp8u code;
Ipp8u len;
} mp4_VLC1;
extern const Ipp8u mp4_DefaultIntraQuantMatrix[];
extern const Ipp8u mp4_DefaultNonIntraQuantMatrix[];
extern const Ipp8u mp4_ClassicalZigzag[];
extern const Ipp8u mp4_DCScalerLuma[];
extern const Ipp8u mp4_DCScalerChroma[];
extern const Ipp8u mp4_cCbCrMvRound16[];
extern const Ipp8u mp4_cCbCrMvRound12[];
extern const Ipp8u mp4_cCbCrMvRound8[];
extern const Ipp8u mp4_cCbCrMvRound4[];
extern const Ipp8s mp4_dquant[];
extern const mp4_VLC1 mp4_cbpy1[];
extern const mp4_VLC1 mp4_cbpy2[];
extern const mp4_VLC1 mp4_cbpy3[];
extern const mp4_VLC1 mp4_cbpy4[];
extern const mp4_VLC1* mp4_cbpy_t[];
extern const Ipp8u mp4_cbpy_b[];
extern const Ipp32s mp4_DC_vlc_Threshold[];
extern const Ipp8u mp4_PVOPmb_type[];
extern const Ipp8u mp4_PVOPmb_cbpc[];
extern const Ipp8u mp4_PVOPmb_bits[];
extern const mp4_VLC1 mp4_BVOPmb_type[];
extern const mp4_VLC1 mp4_MVD_B12_1[];
extern const mp4_VLC1 mp4_MVD_B12_2[];
extern const Ipp32s mp4_H263_width[];
extern const Ipp32s mp4_H263_height[];
extern const Ipp32s mp4_H263_mbgob[];
extern const Ipp32s mp4_H263_gobvop[];
extern const Ipp32s mp4_H263_rowgob[];
extern const Ipp8u mp4_aux_comp_count[];
extern const Ipp8u mp4_aux_comp_is_alpha[];
extern const Ipp8u mp4_BABtypeIntra[][3];
extern const Ipp32s mp4_DivIntraDivisor[];
// project functions
//extern void mp4_Error(Ipp8s *str);
#define mp4_Error(str) vm_debug_trace(VM_DEBUG_ERROR, __VM_STRING(str))
extern mp4_Status mp4_InitDecoder(mp4_Info *pInfo, Ipp8s *mp4FileName, Ipp32s StopOnErr);
extern mp4_Status mp4_CloseDecoder(mp4_Info *pInfo);
extern mp4_Status mp4_InitVOL(mp4_Info *pInfo);
extern mp4_Status mp4_FreeVOL(mp4_Info *pInfo);
extern void mp4_ResetVOL(mp4_Info *pInfo);
//extern void mp4_ShowFrame(mp4_Frame *frame);
#define mp4_ShowFrame(frame)
extern mp4_Status mp4_Parse_VisualObjectSequence(mp4_Info* pInfo);
extern mp4_Status mp4_Parse_VisualObject(mp4_Info* pInfo);
extern mp4_Status mp4_Parse_VideoObject(mp4_Info* pInfo);
extern mp4_Status mp4_Parse_GroupOfVideoObjectPlane(mp4_Info* pInfo);
extern mp4_Status mp4_Parse_VideoObjectPlane(mp4_Info* pInfo);
extern mp4_Status mp4_DecodeVideoObjectPlane(mp4_Info* pInfo);
#ifdef _OMP_KARABAS
#ifdef _OPENMP
#include <omp.h>
#endif
extern Ipp32s mp4_GetNumOfThreads(void);
#endif // _OMP_KARABAS
#ifndef USE_INLINE_BITS_FUNC
extern Ipp32u mp4_ShowBits(mp4_Info* pInfo, Ipp32s n);
extern Ipp32u mp4_ShowBit(mp4_Info* pInfo);
extern Ipp32u mp4_ShowBits9(mp4_Info* pInfo, Ipp32s n);
extern void mp4_FlushBits(mp4_Info* pInfo, Ipp32s n);
extern Ipp32u mp4_GetBits(mp4_Info* pInfo, Ipp32s n);
//extern Ipp32u mp4_GetBit(mp4_Info* pInfo);
extern Ipp32u mp4_GetBits9(mp4_Info* pInfo, Ipp32s n);
extern void mp4_AlignBits(mp4_Info* pInfo);
extern void mp4_AlignBits7F(mp4_Info* pInfo);
extern Ipp32u mp4_ShowBitsAlign(mp4_Info* pInfo, Ipp32s n);
extern Ipp32u mp4_ShowBitsAlign7F(mp4_Info* pInfo, Ipp32s n);
#else
__INLINE Ipp32u mp4_ShowBits(mp4_Info* pInfo, Ipp32s n)
{
Ipp8u* ptr = pInfo->bufptr;
Ipp32u tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
tmp <<= pInfo->bitoff;
tmp >>= 32 - n;
return tmp;
}
__INLINE Ipp32u mp4_ShowBit(mp4_Info* pInfo)
{
Ipp32u tmp = pInfo->bufptr[0];
tmp >>= 7 - pInfo->bitoff;
return (tmp & 1);
}
__INLINE Ipp32u mp4_ShowBits9(mp4_Info* pInfo, Ipp32s n)
{
Ipp8u* ptr = pInfo->bufptr;
Ipp32u tmp = (ptr[0] << 8) | ptr[1];
tmp <<= (pInfo->bitoff + 16);
tmp >>= 32 - n;
return tmp;
}
__INLINE void mp4_FlushBits(mp4_Info* pInfo, Ipp32s n)
{
n = n + pInfo->bitoff;
pInfo->bufptr += n >> 3;
pInfo->bitoff = n & 7;
}
__INLINE Ipp32u mp4_GetBits(mp4_Info* pInfo, Ipp32s n)
{
Ipp8u* ptr = pInfo->bufptr;
Ipp32u tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
tmp <<= pInfo->bitoff;
tmp >>= 32 - n;
n = n + pInfo->bitoff;
pInfo->bufptr += n >> 3;
pInfo->bitoff = n & 7;
return tmp;
}
__INLINE Ipp32u mp4_GetBits9(mp4_Info* pInfo, Ipp32s n)
{
Ipp8u* ptr = pInfo->bufptr;
Ipp32u tmp = (ptr[0] << 8) | ptr[1];
tmp <<= (pInfo->bitoff + 16);
tmp >>= 32 - n;
n = n + pInfo->bitoff;
pInfo->bufptr += n >> 3;
pInfo->bitoff = n & 7;
return tmp;
}
__INLINE void mp4_AlignBits(mp4_Info* pInfo)
{
if (pInfo->bitoff > 0) {
pInfo->bitoff = 0;
(pInfo->bufptr)++;
}
}
__INLINE void mp4_AlignBits7F(mp4_Info* pInfo)
{
if (pInfo->bitoff > 0) {
pInfo->bitoff = 0;
(pInfo->bufptr)++;
} else {
if (*pInfo->bufptr == 0x7F)
(pInfo->bufptr)++;
}
}
__INLINE Ipp32u mp4_ShowBitsAlign(mp4_Info* pInfo, Ipp32s n)
{
Ipp8u* ptr = pInfo->bitoff ? (pInfo->bufptr + 1) : pInfo->bufptr;
Ipp32u tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
tmp >>= 32 - n;
return tmp;
}
__INLINE Ipp32u mp4_ShowBitsAlign7F(mp4_Info* pInfo, Ipp32s n)
{
Ipp8u* ptr = pInfo->bitoff ? (pInfo->bufptr + 1) : pInfo->bufptr;
Ipp32u tmp;
if (!pInfo->bitoff) {
if (*ptr == 0x7F)
ptr ++;
}
tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
tmp >>= 32 - n;
return tmp;
}
#endif // USE_INLINE_BITS_FUNC
__INLINE Ipp32u mp4_GetBit(mp4_Info* pInfo)
{
Ipp32u tmp = pInfo->bufptr[0];
if (pInfo->bitoff != 7) {
tmp >>= 7 - pInfo->bitoff;
pInfo->bitoff ++;
} else {
pInfo->bitoff = 0;
pInfo->bufptr ++;
}
return (tmp & 1);
}
__INLINE Ipp32s mp4_GetMarkerBit(mp4_Info* pInfo) {
if (!mp4_GetBit(pInfo)) {
mp4_Error("Error: wrong marker bit");
return 0;
}
return 1;
}
#ifdef __cplusplus
}
#endif
#endif // __MP4_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -