/* aviffmt.h * * This header file describes the AVI File Format. * * Initial version: David Maymudes 1/7/91, based heavily on EricLe's avi0.h * Last updated: David Maymudes 12/5/91. * * Prerequisites: , * * An AVI file is the following RIFF form: * * RIFF('AVI' * LIST('hdrl') * hdra() * dibh() * [ wavf() ] * [ vidc() ] * [ audc() ] * [ JUNK() ] * LIST('movi' * { LIST('rec' * SubChunk... * ) * | SubChunk } .... * ) * [ ] * ) * * SubChunk = { dibh() * | dibb() * | dibc() * | palc() * | wavb() * | wavs() * | midi() * | additonal custom chunks } * * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * We need a better description of the AVI file header here. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * * * The grouping into LIST 'rec' chunks implies only that the contents of * the chunk should be read into memory at the same time. This * grouping is only necessary for interleaved files. * * For loading efficiency, the beginning of each LIST 'rec' chunk may * be aligned on a 2K boundary. (Actually, the beginning of the LIST * chunk should be 12 bytes before a 2K boundary, so that the data chunks * inside the LIST chunk are aligned.) * * If the AVI file is being played from CD-ROM in, it is recommended that * the file be padded. * * * Limitations for the Alpha release: * If the AVI file has audio, each record LIST must contain exactly * one audio chunk, which must be the first chunk. * Each record must contain exactly one video chunk (possibly preceded * by one or more palette change chunks). * No wave format or DIB header chunks may occur outside of the header. */ #ifndef mmioFOURCC #define mmioFOURCC( ch0, ch1, ch2, ch3 ) \ ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) #endif /* form types, list types, and chunk types */ #define formtypeAVI mmioFOURCC('A', 'V', 'I', ' ') #define listtypeAVIHEADER mmioFOURCC('h', 'd', 'r', 'l') #define listtypeAVIRECORD mmioFOURCC('r', 'e', 'c', ' ') #define listtypeAVIMOVIE mmioFOURCC('m', 'o', 'v', 'i') #define ckidAVIHDR mmioFOURCC('h', 'd', 'r', 'a') #define ckidAVIINDEX mmioFOURCC('i', 'n', 'd', 'x') #define ckidAVINEWINDEX mmioFOURCC('i', 'd', 'x', '1') #define ckidAVIAuthorInfo mmioFOURCC('a', 'v', 'i', 'a') #define ckidAVIVideoCompInfo mmioFOURCC('v', 'i', 'd', 'c') #define ckidAVIAudioCompInfo mmioFOURCC('a', 'u', 'd', 'c') #define ckidAVIAdditionalInfo mmioFOURCC('i', 'n', 'f', 'o') #define ckidDIBheader mmioFOURCC('d', 'i', 'b', 'h') #define ckidPALchange mmioFOURCC('p', 'a', 'l', 'c') #define ckidDIBbits mmioFOURCC('d', 'i', 'b', 'b') #define ckidDIBcompressed mmioFOURCC('d', 'i', 'b', 'c') #define ckidDIBhalfframe mmioFOURCC('d', 'i', 'b', 'x') #define ckidCCCbits mmioFOURCC('C', 'C', 'C', 'b') #define BI_CCC 0x20434343 #define ckidWAVEformat mmioFOURCC('w', 'a', 'v', 'f') #define ckidWAVEbytes mmioFOURCC('w', 'a', 'v', 'b') #define ckidWAVEsilence mmioFOURCC('w', 'a', 'v', 's') #define ckidMIDIdata mmioFOURCC('m', 'i', 'd', 'i') #define ckidAVIPADDING mmioFOURCC('J', 'U', 'N', 'K') #define ckidOLDPADDING mmioFOURCC('p', 'a', 'd', 'd') // #define comptypeCCC mmioFOURCC('C','C','C',' ') #define comptypeRLE0 mmioFOURCC('R','L','E','0') #define comptypeRLE mmioFOURCC('R','L','E',' ') #define comptypeDIB mmioFOURCC('D','I','B',' ') #define comptypeNONE mmioFOURCC('N','O','N','E') #define comptypePCM mmioFOURCC('P','C','M',' ') #define OLDRLEF_MERGECOLORS 0x0010 #define OLDRLEF_SKIPSINGLE 0x0020 #define OLDRLEF_ADAPTIVE 0x0040 /* flags for use in in AVIFileHdr */ #define AVIF_HASWAVE 0x00000001 #define AVIF_HASMIDI 0x00000002 #define AVIF_HASINDEX 0x00000010 // Index at end of file? #define AVIF_ISINTERLEAVED 0x00000100 #define AVIF_VARIABLESIZEREC 0x00000200 #define AVIF_NOPADDING 0x00000400 #define AVIF_ONEPALETTE 0x00001000 // No palette changes? /* The AVI File Header LIST chunk should be padded to this size */ #define AVI_HEADERSIZE 2048 // size of AVI header list typedef struct _AVIFileHdr { DWORD dwMicroSecPerFrame; // frame display rate (or 0L) DWORD dwMaxBytesPerSec; // max. transfer rate DWORD dwPaddingGranularity; // pad to multiples of this // size; normally 2K. DWORD dwFlags; // the ever-present flags DWORD dwTotalFrames; // # frames in file DWORD dwInitialVideoFrames; DWORD dwNumAudioChunks; DWORD dwAudioOffsetFrames; // how many frames is audio // ahead of video in file? } AVIFileHdr; typedef struct _AVIWAVEheader { PCMWAVEFORMAT waveformat; // or some other format } AVIWAVEheader; #ifndef WIN32 /* * this section not used and causes warnings on NT (zero-length arrays * are disallowed). */ // Note: no time information here: wave audio always starts at time 0, // and continues without stopping. typedef struct _AVIWAVEbytes { BYTE abBits[0]; // bits of audio } AVIWAVEbytes; typedef struct _AVIWAVEsilence { DWORD dwSamples; // # samples with no sound } AVIWAVEsilence; /* Possibly, we shouldn't have a whole BITMAPINFOHEADER here. */ typedef struct _AVIDIBheader { BITMAPINFOHEADER bih; // DIB header to use RGBQUAD argbq[0]; // optional colors } AVIDIBheader; typedef struct _AVIDIBbits { BYTE abBits[0]; // bits of video } AVIDIBbits; typedef struct _AVIPALchange { BYTE bFirstEntry; /* first entry to change */ BYTE bNumEntries; /* # entries to change (0 if 256) */ WORD wFlags; /* Mostly to preserve alignment... */ PALETTEENTRY peNew[]; /* New color specifications */ } AVIPALchange; typedef struct _MIDIdata { BYTE abData[0]; // Raw MIDI data } MIDIdata; #endif //WIN32 #define AVIIF_LIST 0x00000001L #define AVIIF_KEYFRAME 0x00000010L typedef struct _AVIIndexEntry { DWORD ckid; DWORD dwFlags; DWORD dwChunkOffset; // Position of chunk DWORD dwChunkLength; // Length of chunk } AVIIndexEntry; #ifndef WIN32 typedef struct tagCOMPRESSIONINFO { DWORD fccCompType; /* Which compressor to use */ BYTE abData[]; /* Compressor-dependent data */ } COMPRESSIONINFO; /* OBSOLETE BELOW THIS LINE */ /* flags for use in in AVIAuthorInfo */ #define AVIF_PADTOMAX 0x0001 // pad records to maximum size #define AVIF_IDENTITY 0x0002 // translate to identity palette #define AVIF_MERGECOLORS 0x0010 // use #define AVIF_SKIPSINGLE 0x0020 #define AVIF_FILTERFRAMES 0x0100 // use typedef struct _AVIAuthorInfo { DWORD dwAuthorFlags; // flags provided at author time WORD wInterFrameThreshold; WORD wIntraFrameThreshold; } AVIAuthorInfo; #endif //WIN32