Aviriff.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:13k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //------------------------------------------------------------------------------
  2. // File: AVIRIFF.h
  3. //
  4. // Desc: Structures and defines for the RIFF AVI file format extended to
  5. //       handle very large/long files.
  6. //
  7. // Copyright (c) 1996 - 2000, Microsoft Corporation.  All rights reserved.
  8. //------------------------------------------------------------------------------
  9. #pragma warning(disable: 4097 4511 4512 4514 4705)
  10. #if !defined AVIRIFF_H
  11. #define AVIRIFF_H
  12. #if !defined NUMELMS
  13.   #define NUMELMS(aa) (sizeof(aa)/sizeof((aa)[0]))
  14. #endif
  15. // all structures in this file are packed on word boundaries
  16. //
  17. #include <pshpack2.h>
  18. /*
  19.  * heres the general layout of an AVI riff file (new format)
  20.  *
  21.  * RIFF (3F??????) AVI       <- not more than 1 GB in size
  22.  *     LIST (size) hdrl
  23.  *         avih (0038)
  24.  *         LIST (size) strl
  25.  *             strh (0038)
  26.  *             strf (????)
  27.  *             indx (3ff8)   <- size may vary, should be sector sized
  28.  *         LIST (size) strl
  29.  *             strh (0038)
  30.  *             strf (????)
  31.  *             indx (3ff8)   <- size may vary, should be sector sized
  32.  *         LIST (size) odml
  33.  *             dmlh (????)
  34.  *         JUNK (size)       <- fill to align to sector - 12
  35.  *     LIST (7f??????) movi  <- aligned on sector - 12
  36.  *         00dc (size)       <- sector aligned
  37.  *         01wb (size)       <- sector aligned
  38.  *         ix00 (size)       <- sector aligned
  39.  *     idx1 (00??????)       <- sector aligned
  40.  * RIFF (7F??????) AVIX
  41.  *     JUNK (size)           <- fill to align to sector -12
  42.  *     LIST (size) movi
  43.  *         00dc (size)       <- sector aligned
  44.  * RIFF (7F??????) AVIX      <- not more than 2GB in size
  45.  *     JUNK (size)           <- fill to align to sector - 12
  46.  *     LIST (size) movi
  47.  *         00dc (size)       <- sector aligned
  48.  *
  49.  *-===================================================================*/
  50. //
  51. // structures for manipulating RIFF headers
  52. //
  53. #define FCC(ch4) ((((DWORD)(ch4) & 0xFF) << 24) |     
  54.                   (((DWORD)(ch4) & 0xFF00) << 8) |    
  55.                   (((DWORD)(ch4) & 0xFF0000) >> 8) |  
  56.                   (((DWORD)(ch4) & 0xFF000000) >> 24))
  57. typedef struct _riffchunk {
  58.    FOURCC fcc;
  59.    DWORD  cb;
  60.    } RIFFCHUNK, * LPRIFFCHUNK;
  61. typedef struct _rifflist {
  62.    FOURCC fcc;
  63.    DWORD  cb;
  64.    FOURCC fccListType;
  65.    } RIFFLIST, * LPRIFFLIST;
  66. #define RIFFROUND(cb) ((cb) + ((cb)&1))
  67. #define RIFFNEXT(pChunk) (LPRIFFCHUNK)((LPBYTE)(pChunk) 
  68.                           + sizeof(RIFFCHUNK) 
  69.                           + RIFFROUND(((LPRIFFCHUNK)pChunk)->cb))
  70. //
  71. // ==================== avi header structures ===========================
  72. //
  73. // main header for the avi file (compatibility header)
  74. //
  75. #define ckidMAINAVIHEADER FCC('avih')
  76. typedef struct _avimainheader {
  77.     FOURCC fcc;                    // 'avih'
  78.     DWORD  cb;                     // size of this structure -8
  79.     DWORD  dwMicroSecPerFrame;     // frame display rate (or 0L)
  80.     DWORD  dwMaxBytesPerSec;       // max. transfer rate
  81.     DWORD  dwPaddingGranularity;   // pad to multiples of this size; normally 2K.
  82.     DWORD  dwFlags;                // the ever-present flags
  83.     #define AVIF_HASINDEX        0x00000010 // Index at end of file?
  84.     #define AVIF_MUSTUSEINDEX    0x00000020
  85.     #define AVIF_ISINTERLEAVED   0x00000100
  86.     #define AVIF_TRUSTCKTYPE     0x00000800 // Use CKType to find key frames
  87.     #define AVIF_WASCAPTUREFILE  0x00010000
  88.     #define AVIF_COPYRIGHTED     0x00020000
  89.     DWORD  dwTotalFrames;          // # frames in first movi list
  90.     DWORD  dwInitialFrames;
  91.     DWORD  dwStreams;
  92.     DWORD  dwSuggestedBufferSize;
  93.     DWORD  dwWidth;
  94.     DWORD  dwHeight;
  95.     DWORD  dwReserved[4];
  96.     } AVIMAINHEADER;
  97. #define ckidODML          FCC('odml')
  98. #define ckidAVIEXTHEADER  FCC('dmlh')
  99. typedef struct _aviextheader {
  100.    FOURCC  fcc;                    // 'dmlh'
  101.    DWORD   cb;                     // size of this structure -8
  102.    DWORD   dwGrandFrames;          // total number of frames in the file
  103.    DWORD   dwFuture[61];           // to be defined later
  104.    } AVIEXTHEADER;
  105. //
  106. // structure of an AVI stream header riff chunk
  107. //
  108. #define ckidSTREAMLIST   FCC('strl')
  109. #ifndef ckidSTREAMHEADER
  110. #define ckidSTREAMHEADER FCC('strh')
  111. #endif
  112. typedef struct _avistreamheader {
  113.    FOURCC fcc;          // 'strh'
  114.    DWORD  cb;           // size of this structure - 8
  115.    FOURCC fccType;      // stream type codes
  116.    #ifndef streamtypeVIDEO
  117.    #define streamtypeVIDEO FCC('vids')
  118.    #define streamtypeAUDIO FCC('auds')
  119.    #define streamtypeMIDI  FCC('mids')
  120.    #define streamtypeTEXT  FCC('txts')
  121.    #endif
  122.    FOURCC fccHandler;
  123.    DWORD  dwFlags;
  124.    #define AVISF_DISABLED          0x00000001
  125.    #define AVISF_VIDEO_PALCHANGES  0x00010000
  126.    WORD   wPriority;
  127.    WORD   wLanguage;
  128.    DWORD  dwInitialFrames;
  129.    DWORD  dwScale;
  130.    DWORD  dwRate;       // dwRate/dwScale is stream tick rate in ticks/sec
  131.    DWORD  dwStart;
  132.    DWORD  dwLength;
  133.    DWORD  dwSuggestedBufferSize;
  134.    DWORD  dwQuality;
  135.    DWORD  dwSampleSize;
  136.    struct {
  137.       short int left;
  138.       short int top;
  139.       short int right;
  140.       short int bottom;
  141.       }   rcFrame;
  142.    } AVISTREAMHEADER;
  143. //
  144. // structure of an AVI stream format chunk
  145. //
  146. #ifndef ckidSTREAMFORMAT
  147. #define ckidSTREAMFORMAT FCC('strf')
  148. #endif
  149. //
  150. // avi stream formats are different for each stream type
  151. //
  152. // BITMAPINFOHEADER for video streams
  153. // WAVEFORMATEX or PCMWAVEFORMAT for audio streams
  154. // nothing for text streams
  155. // nothing for midi streams
  156. #pragma warning(disable:4200)
  157. //
  158. // structure of old style AVI index
  159. //
  160. #define ckidAVIOLDINDEX FCC('idx1')
  161. typedef struct _avioldindex {
  162.    FOURCC  fcc;        // 'idx1'
  163.    DWORD   cb;         // size of this structure -8
  164.    struct _avioldindex_entry {
  165.       DWORD   dwChunkId;
  166.       DWORD   dwFlags;
  167.       #ifndef AVIIF_LIST
  168.       #define AVIIF_LIST       0x00000001
  169.       #define AVIIF_KEYFRAME   0x00000010
  170.       #endif
  171.      
  172.       #define AVIIF_NO_TIME    0x00000100
  173.       #define AVIIF_COMPRESSOR 0x0FFF0000  // unused?
  174.       DWORD   dwOffset;    // offset of riff chunk header for the data
  175.       DWORD   dwSize;      // size of the data (excluding riff header size)
  176.       } aIndex[];          // size of this array
  177.    } AVIOLDINDEX;
  178. //
  179. // ============ structures for timecode in an AVI file =================
  180. //
  181. #ifndef TIMECODE_DEFINED
  182. #define TIMECODE_DEFINED
  183. // defined
  184. // timecode time structure
  185. //
  186. typedef union _timecode {
  187.    struct {
  188.       WORD   wFrameRate;
  189.       WORD   wFrameFract;
  190.       LONG   cFrames;
  191.       };
  192.    DWORDLONG  qw;
  193.    } TIMECODE;
  194. #endif // TIMECODE_DEFINED
  195. #define TIMECODE_RATE_30DROP 0   // this MUST be zero
  196. // struct for all the SMPTE timecode info
  197. //
  198. typedef struct _timecodedata {
  199.    TIMECODE time;
  200.    DWORD    dwSMPTEflags;
  201.    DWORD    dwUser;
  202.    } TIMECODEDATA;
  203. // dwSMPTEflags masks/values
  204. //
  205. #define TIMECODE_SMPTE_BINARY_GROUP 0x07
  206. #define TIMECODE_SMPTE_COLOR_FRAME  0x08
  207. //
  208. // ============ structures for new style AVI indexes =================
  209. //
  210. // index type codes
  211. //
  212. #define AVI_INDEX_OF_INDEXES       0x00
  213. #define AVI_INDEX_OF_CHUNKS        0x01
  214. #define AVI_INDEX_OF_TIMED_CHUNKS  0x02
  215. #define AVI_INDEX_OF_SUB_2FIELD    0x03
  216. #define AVI_INDEX_IS_DATA          0x80
  217. // index subtype codes
  218. //
  219. #define AVI_INDEX_SUB_DEFAULT     0x00
  220. // INDEX_OF_CHUNKS subtype codes
  221. //
  222. #define AVI_INDEX_SUB_2FIELD      0x01
  223. // meta structure of all avi indexes
  224. //
  225. typedef struct _avimetaindex {
  226.    FOURCC fcc;
  227.    UINT   cb;
  228.    WORD   wLongsPerEntry;
  229.    BYTE   bIndexSubType;
  230.    BYTE   bIndexType;
  231.    DWORD  nEntriesInUse;
  232.    DWORD  dwChunkId;
  233.    DWORD  dwReserved[3];
  234.    DWORD  adwIndex[];
  235.    } AVIMETAINDEX;
  236. #define STDINDEXSIZE 0x4000
  237. #define NUMINDEX(wLongsPerEntry) ((STDINDEXSIZE-32)/4/(wLongsPerEntry))
  238. #define NUMINDEXFILL(wLongsPerEntry) ((STDINDEXSIZE/4) - NUMINDEX(wLongsPerEntry))
  239. // structure of a super index (INDEX_OF_INDEXES)
  240. //
  241. #define ckidAVISUPERINDEX FCC('indx')
  242. typedef struct _avisuperindex {
  243.    FOURCC   fcc;               // 'indx'
  244.    UINT     cb;                // size of this structure
  245.    WORD     wLongsPerEntry;    // ==4
  246.    BYTE     bIndexSubType;     // ==0 (frame index) or AVI_INDEX_SUB_2FIELD 
  247.    BYTE     bIndexType;        // ==AVI_INDEX_OF_INDEXES
  248.    DWORD    nEntriesInUse;     // offset of next unused entry in aIndex
  249.    DWORD    dwChunkId;         // chunk ID of chunks being indexed, (i.e. RGB8)
  250.    DWORD    dwReserved[3];     // must be 0
  251.    struct _avisuperindex_entry {
  252.       DWORDLONG qwOffset;    // 64 bit offset to sub index chunk
  253.       DWORD    dwSize;       // 32 bit size of sub index chunk
  254.       DWORD    dwDuration;   // time span of subindex chunk (in stream ticks)
  255.       } aIndex[NUMINDEX(4)];
  256.    } AVISUPERINDEX;
  257. #define Valid_SUPERINDEX(pi) (*(DWORD *)(&((pi)->wLongsPerEntry)) == (4 | (AVI_INDEX_OF_INDEXES << 24)))
  258. // struct of a standard index (AVI_INDEX_OF_CHUNKS)
  259. //
  260. typedef struct _avistdindex_entry {
  261.    DWORD dwOffset;       // 32 bit offset to data (points to data, not riff header)
  262.    DWORD dwSize;         // 31 bit size of data (does not include size of riff header), bit 31 is deltaframe bit
  263.    } AVISTDINDEX_ENTRY;
  264. #define AVISTDINDEX_DELTAFRAME ( 0x80000000) // Delta frames have the high bit set
  265. #define AVISTDINDEX_SIZEMASK   (~0x80000000)
  266. typedef struct _avistdindex {
  267.    FOURCC   fcc;               // 'indx' or '##ix'
  268.    UINT     cb;                // size of this structure
  269.    WORD     wLongsPerEntry;    // ==2
  270.    BYTE     bIndexSubType;     // ==0
  271.    BYTE     bIndexType;        // ==AVI_INDEX_OF_CHUNKS
  272.    DWORD    nEntriesInUse;     // offset of next unused entry in aIndex
  273.    DWORD    dwChunkId;         // chunk ID of chunks being indexed, (i.e. RGB8)
  274.    DWORDLONG qwBaseOffset;     // base offset that all index intries are relative to
  275.    DWORD    dwReserved_3;      // must be 0
  276.    AVISTDINDEX_ENTRY aIndex[NUMINDEX(2)];
  277.    } AVISTDINDEX;
  278. // struct of a time variant standard index (AVI_INDEX_OF_TIMED_CHUNKS)
  279. //
  280. typedef struct _avitimedindex_entry {
  281.    DWORD dwOffset;       // 32 bit offset to data (points to data, not riff header)
  282.    DWORD dwSize;         // 31 bit size of data (does not include size of riff header) (high bit is deltaframe bit)
  283.    DWORD dwDuration;     // how much time the chunk should be played (in stream ticks)
  284.    } AVITIMEDINDEX_ENTRY;
  285. typedef struct _avitimedindex {
  286.    FOURCC   fcc;               // 'indx' or '##ix'
  287.    UINT     cb;                // size of this structure
  288.    WORD     wLongsPerEntry;    // ==3
  289.    BYTE     bIndexSubType;     // ==0
  290.    BYTE     bIndexType;        // ==AVI_INDEX_OF_TIMED_CHUNKS
  291.    DWORD    nEntriesInUse;     // offset of next unused entry in aIndex
  292.    DWORD    dwChunkId;         // chunk ID of chunks being indexed, (i.e. RGB8)
  293.    DWORDLONG qwBaseOffset;     // base offset that all index intries are relative to
  294.    DWORD    dwReserved_3;      // must be 0
  295.    AVITIMEDINDEX_ENTRY aIndex[NUMINDEX(3)];
  296.    DWORD adwTrailingFill[NUMINDEXFILL(3)]; // to align struct to correct size
  297.    } AVITIMEDINDEX;
  298. // structure of a timecode stream
  299. //
  300. typedef struct _avitimecodeindex {
  301.    FOURCC   fcc;               // 'indx' or '##ix'
  302.    UINT     cb;                // size of this structure
  303.    WORD     wLongsPerEntry;    // ==4
  304.    BYTE     bIndexSubType;     // ==0
  305.    BYTE     bIndexType;        // ==AVI_INDEX_IS_DATA
  306.    DWORD    nEntriesInUse;     // offset of next unused entry in aIndex
  307.    DWORD    dwChunkId;         // 'time'
  308.    DWORD    dwReserved[3];     // must be 0
  309.    TIMECODEDATA aIndex[NUMINDEX(sizeof(TIMECODEDATA)/sizeof(LONG))];
  310.    } AVITIMECODEINDEX;
  311. // structure of a timecode discontinuity list (when wLongsPerEntry == 7)
  312. //
  313. typedef struct _avitcdlindex_entry {
  314.     DWORD    dwTick;           // stream tick time that maps to this timecode value
  315.     TIMECODE time;
  316.     DWORD    dwSMPTEflags;
  317.     DWORD    dwUser;
  318.     TCHAR    szReelId[12];
  319.     } AVITCDLINDEX_ENTRY;
  320. typedef struct _avitcdlindex {
  321.    FOURCC   fcc;               // 'indx' or '##ix'
  322.    UINT     cb;                // size of this structure
  323.    WORD     wLongsPerEntry;    // ==7 (must be 4 or more all 'tcdl' indexes
  324.    BYTE     bIndexSubType;     // ==0
  325.    BYTE     bIndexType;        // ==AVI_INDEX_IS_DATA
  326.    DWORD    nEntriesInUse;     // offset of next unused entry in aIndex
  327.    DWORD    dwChunkId;         // 'tcdl'
  328.    DWORD    dwReserved[3];     // must be 0
  329.    AVITCDLINDEX_ENTRY aIndex[NUMINDEX(7)];
  330.    DWORD adwTrailingFill[NUMINDEXFILL(7)]; // to align struct to correct size
  331.    } AVITCDLINDEX;
  332. typedef struct _avifieldindex_chunk {
  333.    FOURCC   fcc;               // 'ix##'
  334.    DWORD    cb;                // size of this structure
  335.    WORD     wLongsPerEntry;    // must be 3 (size of each entry in
  336.                                // aIndex array)
  337.    BYTE     bIndexSubType;     // AVI_INDEX_2FIELD
  338.    BYTE     bIndexType;        // AVI_INDEX_OF_CHUNKS
  339.    DWORD    nEntriesInUse;     //
  340.    DWORD    dwChunkId;         // '##dc' or '##db'
  341.    DWORDLONG qwBaseOffset;     // offsets in aIndex array are relative to this
  342.    DWORD    dwReserved3;       // must be 0
  343.    struct _avifieldindex_entry {
  344.       DWORD    dwOffset;
  345.       DWORD    dwSize;         // size of all fields
  346.                                // (bit 31 set for NON-keyframes)
  347.       DWORD    dwOffsetField2; // offset to second field
  348.    } aIndex[  ];
  349. } AVIFIELDINDEX, * PAVIFIELDINDEX;
  350. #include <poppack.h>
  351. #endif