avifmt.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /****************************************************************************
  2.  *
  3.  *  AVIFMT - AVI file format definitions
  4.  *
  5.  ****************************************************************************/
  6. #ifndef AVIFMT 
  7. #define AVIFMT
  8. #ifndef NOAVIFMT 
  9. #ifndef  __WINE_WINDEF_H
  10. #include "wine/windef.h"
  11. #endif
  12. #ifndef __WINE_MMSYSTEM_H
  13. #ifndef __WINE_MSACM_H
  14. typedef DWORD FOURCC;
  15. #endif
  16. #endif
  17. #ifdef _MSC_VER
  18. #pragma warning(disable:4200)
  19. #endif
  20.     
  21. /* The following is a short description of the AVI file format.  Please
  22.  * see the accompanying documentation for a full explanation.
  23.  *
  24.  * An AVI file is the following RIFF form:
  25.  *
  26.  * RIFF('AVI' 
  27.  *       LIST('hdrl'
  28.  *     avih(<MainAVIHeader>)
  29.  *                  LIST ('strl'
  30.  *                      strh(<Stream header>)
  31.  *                      strf(<Stream format>)
  32.  *                      ... additional header data
  33.  *            LIST('movi'  
  34.  *         { LIST('rec' 
  35.  *             SubChunk...
  36.  *          )
  37.  *             | SubChunk } ....     
  38.  *            )
  39.  *            [ <AVIIndex> ]
  40.  *      )
  41.  *
  42.  * The main file header specifies how many streams are present.  For
  43.  * each one, there must be a stream header chunk and a stream format
  44.  * chunk, enlosed in a 'strl' LIST chunk.  The 'strf' chunk contains
  45.  * type-specific format information; for a video stream, this should
  46.  * be a BITMAPINFO structure, including palette.  For an audio stream,
  47.  * this should be a WAVEFORMAT (or PCMWAVEFORMAT) structure.
  48.  *
  49.  * The actual data is contained in subchunks within the 'movi' LIST 
  50.  * chunk.  The first two characters of each data chunk are the
  51.  * stream number with which that data is associated.
  52.  *
  53.  * Some defined chunk types:
  54.  *           Video Streams:
  55.  *                  ##db: RGB DIB bits
  56.  *                  ##dc: RLE8 compressed DIB bits
  57.  *                  ##pc: Palette Change
  58.  *
  59.  *           Audio Streams:
  60.  *                  ##wb: waveform audio bytes
  61.  *
  62.  * The grouping into LIST 'rec' chunks implies only that the contents of
  63.  *   the chunk should be read into memory at the same time.  This
  64.  *   grouping is used for files specifically intended to be played from 
  65.  *   CD-ROM.
  66.  *
  67.  * The index chunk at the end of the file should contain one entry for 
  68.  *   each data chunk in the file.
  69.  *       
  70.  * Limitations for the current software:
  71.  * Only one video stream and one audio stream are allowed.
  72.  * The streams must start at the beginning of the file.
  73.  *
  74.  * 
  75.  * To register codec types please obtain a copy of the Multimedia
  76.  * Developer Registration Kit from:
  77.  *
  78.  *  Microsoft Corporation
  79.  *  Multimedia Systems Group
  80.  *  Product Marketing
  81.  *  One Microsoft Way
  82.  *  Redmond, WA 98052-6399
  83.  *
  84.  */
  85. #ifndef mmioFOURCC
  86. #define mmioFOURCC( ch0, ch1, ch2, ch3 )
  87. ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |
  88. ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
  89. #endif
  90. /* Macro to make a TWOCC out of two characters */
  91. #ifndef aviTWOCC
  92. #define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8))
  93. #endif
  94. typedef WORD TWOCC;
  95. /* form types, list types, and chunk types */
  96. #define formtypeAVI             mmioFOURCC('A', 'V', 'I', ' ')
  97. #define listtypeAVIHEADER       mmioFOURCC('h', 'd', 'r', 'l')
  98. #define ckidAVIMAINHDR          mmioFOURCC('a', 'v', 'i', 'h')
  99. #define listtypeSTREAMHEADER    mmioFOURCC('s', 't', 'r', 'l')
  100. #define ckidSTREAMHEADER        mmioFOURCC('s', 't', 'r', 'h')
  101. #define ckidSTREAMFORMAT        mmioFOURCC('s', 't', 'r', 'f')
  102. #define ckidSTREAMHANDLERDATA   mmioFOURCC('s', 't', 'r', 'd')
  103. #define ckidSTREAMNAME mmioFOURCC('s', 't', 'r', 'n')
  104. #define listtypeAVIMOVIE        mmioFOURCC('m', 'o', 'v', 'i')
  105. #define listtypeAVIRECORD       mmioFOURCC('r', 'e', 'c', ' ')
  106. #define ckidAVINEWINDEX         mmioFOURCC('i', 'd', 'x', '1')
  107. /*
  108. ** Stream types for the <fccType> field of the stream header.
  109. */
  110. #define streamtypeVIDEO         mmioFOURCC('v', 'i', 'd', 's')
  111. #define streamtypeAUDIO         mmioFOURCC('a', 'u', 'd', 's')
  112. #define streamtypeMIDI mmioFOURCC('m', 'i', 'd', 's')
  113. #define streamtypeTEXT          mmioFOURCC('t', 'x', 't', 's')
  114. /* Basic chunk types */
  115. #define cktypeDIBbits           aviTWOCC('d', 'b')
  116. #define cktypeDIBcompressed     aviTWOCC('d', 'c')
  117. #define cktypePALchange         aviTWOCC('p', 'c')
  118. #define cktypeWAVEbytes         aviTWOCC('w', 'b')
  119. /* Chunk id to use for extra chunks for padding. */
  120. #define ckidAVIPADDING          mmioFOURCC('J', 'U', 'N', 'K')
  121. /*
  122. ** Useful macros
  123. **
  124. ** Warning: These are nasty macro, and MS C 6.0 compiles some of them
  125. ** incorrectly if optimizations are on.  Ack.
  126. */
  127. /* Macro to get stream number out of a FOURCC ckid */
  128. #define FromHex(n) (((n) >= 'A') ? ((n) + 10 - 'A') : ((n) - '0'))
  129. #define StreamFromFOURCC(fcc) ((WORD) ((FromHex(LOBYTE(LOWORD(fcc))) << 4) + 
  130.                                              (FromHex(HIBYTE(LOWORD(fcc))))))
  131. /* Macro to get TWOCC chunk type out of a FOURCC ckid */
  132. #define TWOCCFromFOURCC(fcc)    HIWORD(fcc)
  133. /* Macro to make a ckid for a chunk out of a TWOCC and a stream number
  134. ** from 0-255.
  135. */
  136. #define ToHex(n) ((BYTE) (((n) > 9) ? ((n) - 10 + 'A') : ((n) + '0')))
  137. #define MAKEAVICKID(tcc, stream) 
  138.         MAKELONG((ToHex((stream) & 0x0f) << 8) | 
  139.     (ToHex(((stream) & 0xf0) >> 4)), tcc)
  140. /*
  141. ** Main AVI File Header 
  142. */      
  143.      
  144. /* flags for use in <dwFlags> in AVIFileHdr */
  145. #define AVIF_HASINDEX 0x00000010 // Index at end of file?
  146. #define AVIF_MUSTUSEINDEX 0x00000020
  147. #define AVIF_ISINTERLEAVED 0x00000100
  148. #define AVIF_TRUSTCKTYPE 0x00000800 // Use CKType to find key frames?
  149. #define AVIF_WASCAPTUREFILE 0x00010000
  150. #define AVIF_COPYRIGHTED 0x00020000
  151. /* The AVI File Header LIST chunk should be padded to this size */
  152. #define AVI_HEADERSIZE  2048                    // size of AVI header list
  153. typedef struct
  154. {
  155.     DWORD dwMicroSecPerFrame; // frame display rate (or 0L)
  156.     DWORD dwMaxBytesPerSec; // max. transfer rate
  157.     DWORD dwPaddingGranularity; // pad to multiples of this
  158.                                                 // size; normally 2K.
  159.     DWORD dwFlags; // the ever-present flags
  160.     DWORD dwTotalFrames; // # frames in file
  161.     DWORD dwInitialFrames;
  162.     DWORD dwStreams;
  163.     DWORD dwSuggestedBufferSize;
  164.     
  165.     DWORD dwWidth;
  166.     DWORD dwHeight;
  167.     
  168.     DWORD dwReserved[4];
  169. } MainAVIHeader;
  170. /*
  171. ** Stream header
  172. */
  173. #define AVISF_DISABLED 0x00000001
  174. #define AVISF_VIDEO_PALCHANGES 0x00010000
  175.   
  176. typedef struct {
  177.     FOURCC fccType;
  178.     FOURCC fccHandler;
  179.     DWORD dwFlags; /* Contains AVITF_* flags */
  180.     WORD wPriority;
  181.     WORD wLanguage;
  182.     DWORD dwInitialFrames;
  183.     DWORD dwScale;
  184.     DWORD dwRate; /* dwRate / dwScale == samples/second */
  185.     DWORD dwStart;
  186.     DWORD dwLength; /* In units above... */
  187.     DWORD dwSuggestedBufferSize;
  188.     DWORD dwQuality;
  189.     DWORD dwSampleSize;
  190.     RECT rcFrame;
  191. } AVIStreamHeader;
  192. /* Flags for index */
  193. #define AVIIF_LIST          0x00000001L // chunk is a 'LIST'
  194. #define AVIIF_KEYFRAME      0x00000010L // this frame is a key frame.
  195. #define AVIIF_NOTIME     0x00000100L // this frame doesn't take any time
  196. #define AVIIF_COMPUSE       0x0FFF0000L // these bits are for compressor use
  197. #define FOURCC_RIFF     mmioFOURCC('R', 'I', 'F', 'F')
  198. #define FOURCC_LIST     mmioFOURCC('L', 'I', 'S', 'T')
  199. typedef struct
  200. {
  201.     DWORD ckid;
  202.     DWORD dwFlags;
  203.     DWORD dwChunkOffset; // Position of chunk
  204.     DWORD dwChunkLength; // Length of chunk
  205. } AVIINDEXENTRY;
  206. #define AVISTREAMREAD_CONVENIENT (-1L)
  207. /*
  208. ** Palette change chunk
  209. **
  210. ** Used in video streams.
  211. */
  212. #endif /* NOAVIFMT */
  213. #endif