MPGUTIL.H
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. //  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. //  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. //  PURPOSE.
  7. //
  8. //  Copyright (c) 1996 - 1997  Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. /*  MPEG-2 utility functions */
  12. #include <streams.h>
  13. #include "mmreg.h"
  14. /*  Packet header info */
  15. typedef struct tag_MPEG_PACKET_DATA {
  16.     DWORD    dwHeaderLen;
  17.     DWORD    dwPacketLen;
  18.     BOOL     bHasPts;
  19.     LONGLONG llPts;
  20. } MPEG_PACKET_DATA;
  21. /*  Read an normal MPEG-1 style clock */
  22. BOOL GetClock(const BYTE * pData, LONGLONG *Clock);
  23. BOOL SetClock(BYTE * pData, LONGLONG *Clock);
  24. /*  Read an extended clock */
  25. BOOL GetExtendedClock(const BYTE * pbData, LONGLONG *pllClock);
  26. //BOOL GetMPEG1ExtendedClock(const BYTE * pbData, LONGLONG *pllClock);
  27. //BOOL PutMPEG1ExtendedClock( BYTE * pbData, LONGLONG pllClock);
  28. //BOOL GetMPEG1TimeCode(const BYTE * pbData,  MMTIME * pllTimeCode);
  29. //BOOL PutMPEG1TimeCode(BYTE * pbData,  MMTIME pllTimeCode);
  30. inline GetStartCode(const BYTE * pbData)
  31. {
  32.     return DWORD_SWAP(*(UNALIGNED DWORD *)pbData);
  33. }
  34. /*  Since dwCode is normally a constant just swap that instead */
  35. inline BOOL IsStartCode(const BYTE * pbData, DWORD dwCode)
  36. {
  37.     return DWORD_SWAP(dwCode) == *(UNALIGNED DWORD *)pbData;
  38. }
  39. /*  Parse pack header
  40.     Parameters :
  41.         pbData - pointer to data containing the system header
  42.         cbData - length of data
  43.     Returns :
  44.         Number of bytes processed (0 if the header doesn't fit
  45.         in the data or 4 if the header is invalid)
  46.         We will return 0 if we can't see the next start code to
  47.         check whether it's a system header start code
  48. */
  49. //DWORD ParseMPEG2PackHeader(const BYTE * pbData, DWORD cbData);
  50. /*  Length of pack header - returns 0 if < cbData */
  51. /*
  52. inline DWORD MPEG2PackHeaderLength(const BYTE * pbData, DWORD cbData)
  53. {
  54.     //  Need more data 
  55.     if (cbData < 14) {
  56.         return 0;
  57.     } else {
  58.         DWORD dwLen = 14 + (pbData[13] & 0x07);
  59.         if (dwLen > cbData) {
  60.             return 0;
  61.         } else {
  62.             return dwLen;
  63.         }
  64.     }
  65. }
  66. */
  67. /*  Parse system header
  68.     Parameters :
  69.         pbData - pointer to data containing the system header
  70.         cbData - length of data
  71.     Returns :
  72.         Number of bytes processed (0 if the header doesn't fit
  73.         in the data or 4 if the header is invalid)
  74. */
  75. LONG ParseSystemHeader(const BYTE * pbData, DWORD cbData);
  76. /*  Parse an MPEG2 packet and extract information */
  77. /*
  78. DWORD ParseMPEG2Packet(
  79.     const BYTE * pbData,
  80.     DWORD cbData,
  81.     MPEG_PACKET_DATA *pPacketData
  82. );
  83. */
  84. /*  Parse an MPEG1 packet and extract information */
  85. DWORD ParseMPEG1Packet(
  86.     const BYTE * pbData,
  87.     DWORD cbData,
  88.     MPEG_PACKET_DATA *pPacketData,
  89. DWORD *Pts
  90. );
  91. /*
  92. BOOL ParseMPEG2PacketHeader(
  93.     const BYTE * pbData,
  94.     DWORD dwLen,
  95.     MPEG_PACKET_DATA *pPacketData
  96. );
  97. */
  98. /*  Inlines to get PTSs from MPEG2 packets */
  99. /*
  100. inline BOOL MPEG2PacketHasPTS(const BYTE * pbPacket)
  101. {
  102.     //  Just check if the PTS_DTS_flags are 10 or 11 (ie the first
  103.     //  bit is one
  104.     
  105.     return 0 != (pbPacket[7] & 0x80);
  106. }
  107. */
  108. /*  Get the PTS from an MPEG2 packet */
  109. //LONGLONG MPEG2PacketPTS(const BYTE * pbPacket);
  110. typedef struct {
  111.     DWORD          dwProfile;          //  Profile - MPEG2 only
  112.     DWORD          dwLevel;            //  Level - MPEG2 only
  113.     LONG           lWidth;             //  Native Width in pixels
  114.     LONG           lHeight;            //  Native Height in pixels
  115.     LONG           lvbv;               //  vbv
  116.     REFERENCE_TIME  tPictureTime;      //  Time per picture in 100ns units
  117.     float          fPictureRate;       //  In frames per second
  118.     LONG           lTimePerFrame;      //  Time per picture in MPEG units
  119.     LONG           dwBitRate;          //  Bits per second
  120.     LONG           lXPelsPerMeter;     //  Pel aspect ratio
  121.     LONG           lYPelsPerMeter;     //  Pel aspect ratio
  122.     DWORD          dwStartTimeCode;    //  First GOP time code (or -1)
  123.     LONG           lActualHeaderLen;   //  Length of valid bytes in raw seq hdr
  124.     BYTE           RawHeader[140];     //  The real sequence header
  125. } SEQHDR_INFO;
  126. /*  MPEG2 stuff */
  127. typedef struct {
  128.     BOOL           bExtensionPresent;
  129.     BOOL           bDisplayExtensionPresent;
  130.     BOOL           bScalableExtensionPresent;
  131.     SEQHDR_INFO    seqhdrInfo;
  132. } MPEG2_SEQHDR_INFO;
  133. /*  Helper */
  134. int inline SequenceHeaderSize(const BYTE *pb)
  135. {
  136.     /*  No quantization matrices ? */
  137.     if ((pb[11] & 0x03) == 0x00) {
  138.         return 12;
  139.     }
  140.     /*  Just non-intra quantization matrix ? */
  141.     if ((pb[11] & 0x03) == 0x01) {
  142.         return 12 + 64;
  143.     }
  144.     /*  Intra found - is there a non-intra ? */
  145.     if (pb[11 + 64] & 0x01) {
  146.         return 12 + 64 + 64;
  147.     } else {
  148.         return 12 + 64;
  149.     }
  150. }
  151. /*  Extract info from video sequence header
  152.     Returns FALSE if the sequence header is invalid
  153. */
  154. BOOL ParseSequenceHeader(const BYTE *pbData, LONG lData, SEQHDR_INFO *hdrInfo);
  155. BOOL ParseAudioHeader(const BYTE * pbData, MPEG1WAVEFORMAT *pFormat);
  156. /*  Construct a media type from the video info */
  157. HRESULT GetVideoMediaType(CMediaType *cmt, BOOL bPayload, const SEQHDR_INFO *pInfo);
  158. /*  Find the next start code */
  159. BOOL NextStartCode(const BYTE * *ppbData, DWORD *pdwLeft);
  160. /*  Parse AC3 header */
  161. //BOOL ParseAC3Header(const BYTE * pbData, DOLBYAC3WAVEFORMAT *pwf);