⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp4.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 3 页
字号:
    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 + -