home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / misc / vfwdk / inc / avifmt.h next >
C/C++ Source or Header  |  1993-01-28  |  9KB  |  247 lines

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