|
|
1.1 ! root 1: /* these structures are based on vfw.h ! 2: * ! 3: * here is a nice example from http://www.microsoft.com/ ! 4: * DirectX/dxm/help/ds/FiltDev/DV_Data_AVI_File_Format.htm ! 5: * ! 6: * 00000000 RIFF (103E2920) 'AVI ' ! 7: * 0000000C LIST (00000146) 'hdrl' ! 8: * 00000018 avih (00000038) ! 9: * dwMicroSecPerFrame : 33367 ! 10: * dwMaxBytesPerSec : 3728000 ! 11: * dwPaddingGranularity : 0 ! 12: * dwFlags : 0x810 HASINDEX | TRUSTCKTYPE ! 13: * dwTotalFrames : 2192 ! 14: * dwInitialFrames : 0 ! 15: * dwStreams : 2 ! 16: * dwSuggestedBufferSize : 120000 ! 17: * dwWidth : 720 ! 18: * dwHeight : 480 ! 19: * dwReserved : 0x0 ! 20: * 00000058 LIST (00000094) 'strl' ! 21: * 00000064 strh (00000038) ! 22: * fccType : 'vids' ! 23: * fccHandler : 'dvsd' ! 24: * dwFlags : 0x0 ! 25: * wPriority : 0 ! 26: * wLanguage : 0x0 undefined ! 27: * dwInitialFrames : 0 ! 28: * dwScale : 100 (29.970 Frames/Sec) ! 29: * dwRate : 2997 ! 30: * dwStart : 0 ! 31: * dwLength : 2192 ! 32: * dwSuggestedBufferSize : 120000 ! 33: * dwQuality : 0 ! 34: * dwSampleSize : 0 ! 35: * rcFrame : 0,0,720,480 ! 36: * 000000A4 strf (00000048) ! 37: * biSize : 40 ! 38: * biWidth : 720 ! 39: * biHeight : 480 ! 40: * biPlanes : 1 ! 41: * biBitCount : 24 ! 42: * biCompression : 0x64737664 'dvsd' ! 43: * biSizeImage : 120000 ! 44: * biXPelsPerMeter : 0 ! 45: * biYPelsPerMeter : 0 ! 46: * biClrUsed : 0 ! 47: * biClrImportant : 0 ! 48: * dwDVAAuxSrc : 0x........ ! 49: * dwDVAAuxCtl : 0x........ ! 50: * dwDVAAuxSrc1 : 0x........ ! 51: * dwDVAAuxCtl1 : 0x........ ! 52: * dwDVVAuxSrc : 0x........ ! 53: * dwDVVAuxCtl : 0x........ ! 54: * dwDVReserved[2] : 0,0 ! 55: * 000000F4 LIST (0000005E) 'strl' ! 56: * 00000100 strh (00000038) ! 57: * fccType : 'auds' ! 58: * fccHandler : ' ' ! 59: * dwFlags : 0x0 ! 60: * wPriority : 0 ! 61: * wLanguage : 0x0 undefined ! 62: * dwInitialFrames : 0 ! 63: * dwScale : 1 (32000.000 Samples/Sec) ! 64: * dwRate : 32000 ! 65: * dwStart : 0 ! 66: * dwLength : 2340474 ! 67: * dwSuggestedBufferSize : 4272 ! 68: * dwQuality : 0 ! 69: * dwSampleSize : 4 ! 70: * rcFrame : 0,0,0,0 ! 71: * 00000140 strf (00000012) ! 72: * wFormatTag : 1 PCM ! 73: * nChannels : 2 ! 74: * nSamplesPerSec : 32000 ! 75: * nAvgBytesPerSec : 128000 ! 76: * nBlockAlign : 4 ! 77: * wBitsPerSample : 16 ! 78: * cbSize : 0 ! 79: * 00000814 LIST (103D0EF4) 'movi' ! 80: * 103D1710 idx1 (00011210) ! 81: * ! 82: */ ! 83: ! 84: typedef struct { ! 85: uint32 left; ! 86: uint32 top; ! 87: uint32 right; ! 88: uint32 bottom; ! 89: } t_win_rect; ! 90: ! 91: typedef struct { ! 92: char avih[4]; /* "avih" */ ! 93: uint32 length; /* chunk length */ ! 94: uint32 MicroSecPerFrame; /* frame display rate (or 0L) */ ! 95: uint32 MaxBytesPerSec; /* max. transfer rate */ ! 96: uint32 PaddingGranularity; /* pad to multiples of this ! 97: size; normally 2K. */ ! 98: uint32 Flags; /* the ever-present flags */ ! 99: uint32 TotalFrames; /* # frames in file */ ! 100: uint32 InitialFrames; ! 101: uint32 Streams; ! 102: uint32 SuggestedBufferSize; ! 103: uint32 Width; ! 104: uint32 Height; ! 105: uint32 Reserved[4]; ! 106: } t_avichunk_avih; ! 107: ! 108: typedef struct { ! 109: char strh[4]; /* "strh" */ ! 110: uint32 length; /* chunk length */ ! 111: char Type[4]; ! 112: char Handler[4]; ! 113: uint32 Flags; /* Contains AVITF_* flags */ ! 114: uint16 Priority; ! 115: uint16 Language; ! 116: uint32 InitialFrames; ! 117: uint32 Scale; ! 118: uint32 Rate; /* dwRate / dwScale == samples/second */ ! 119: uint32 Start; ! 120: uint32 Length; /* In units above... */ ! 121: uint32 SuggestedBufferSize; ! 122: uint32 Quality; ! 123: uint32 SampleSize; ! 124: t_win_rect rcFrame; /* should this be 4 16 bit vals or 4 32 bit vals? */ ! 125: } t_avichunk_strh; ! 126: ! 127: /* BITMAPINFOHEADER - see dib.h */ ! 128: ! 129: /* the structure below is for PCMWAVEFORMAT - as far as I understand it the ! 130: WAVEFORMAT structure was extended to include wBitsPerSample. The ! 131: PCMWAVEFORMAT was in turn extended to be the WAVEFORMATEX structure which ! 132: includes an extra word cbSize that indicates the size of the extension ! 133: words for whatever wFormatTag specifies. We do not include the cbSize ! 134: word (i.e. this really is a PCMWAVEFORMAT not a WAVEFORMATEX) as this ! 135: would un-align 32-bit words. Some chips, Sparc for example, can't cope ! 136: with non-aligned 32-bit access, and I want to construct this stuff in ! 137: memory without hassles. */ ! 138: ! 139: /* http://www.xiph.org/archives/vorbis-dev/200108/0199.html */ ! 140: ! 141: typedef struct { ! 142: char strf[4]; /* "strf" */ ! 143: uint32 length; /* chunk length */ ! 144: uint16 wFormatTag; /* WAVE_FORMAT_PCM = 1 */ ! 145: uint16 nChannels; /* 1 for mono, 2 for stereo */ ! 146: uint32 nSamplesPerSec; /* typically 22050 or 44100 */ ! 147: uint32 nAvgBytesPerSec; /* must be nBlockAlign * nSamplesPerSec */ ! 148: uint16 nBlockAlign; /* must be nChannels * BitsPerSample / 8 */ ! 149: uint16 wBitsPerSample; /* must be 8 or 16 */ ! 150: } t_avichunk_strf_audio; ! 151: ! 152: typedef struct { ! 153: char strf[4]; /* "strf" */ ! 154: uint32 length; /* chunk length */ ! 155: t_bmih bmih; /* BMP header */ ! 156: } t_avichunk_strf_video; ! 157: ! 158: /* the structure below is a BITMAPINFO (or so says vfw.h), which is simply ! 159: a DIB header (the structure found in BMP files) */ ! 160: ! 161: typedef struct { ! 162: t_bmih bmih; /* DIB bit map header */ ! 163: } t_avilist_strf_video; ! 164: ! 165: typedef struct { ! 166: char list[4]; /* "LIST" */ ! 167: uint32 length; /* list length */ ! 168: char strl[4]; /* "strl" */ ! 169: t_avichunk_strh strh; /* stream header block */ ! 170: t_avichunk_strf_video strf; /* stream format block */ ! 171: } t_avilist_strl_video; ! 172: ! 173: typedef struct { ! 174: char list[4]; /* "LIST" */ ! 175: uint32 length; /* list length */ ! 176: char strl[4]; /* "strl" */ ! 177: t_avichunk_strh strh; /* stream header block */ ! 178: t_avichunk_strf_audio strf; /* stream format block */ ! 179: } t_avilist_strl_audio; ! 180: ! 181: typedef struct { ! 182: char list[4]; /* "LIST" */ ! 183: uint32 length; /* list length */ ! 184: char hdrl[4]; /* hdrl */ ! 185: t_avichunk_avih avih; /* avi header */ ! 186: t_avilist_strl_video strl_video; /* strl block for video stream */ ! 187: t_avilist_strl_audio strl_audio; /* strl block for audio stream */ ! 188: } t_avilist_hdrl; ! 189: ! 190: typedef struct { ! 191: char list[4]; /* "LIST" */ ! 192: uint32 length; /* list length */ ! 193: char movi[4]; /* movi */ ! 194: /* the rest of the data is streamed to disk... */ ! 195: } t_avilist_movi; ! 196: ! 197: typedef struct { ! 198: char riff[4]; /* "RIFF" */ ! 199: uint32 length; /* size of whole file */ ! 200: char avi[4]; /* "AVI " */ ! 201: t_avilist_hdrl hdrl; ! 202: t_avilist_movi movi; ! 203: } t_avi_header; ! 204: ! 205: typedef struct { ! 206: uint32 width; ! 207: uint32 height; ! 208: uint32 sampspersec; ! 209: uint32 fps; /* fps * 1000 */ ! 210: uint32 jpegquality; /* 0 - 100, if applicable */ ! 211: } t_aviinfo; ! 212: ! 213: typedef struct { ! 214: t_aviinfo info; ! 215: FILE *fd; ! 216: uint32 linebytes; /* number of video bytes per line */ ! 217: char dibchunkh[8]; /* 00dbXXXX where XXXX is size */ ! 218: char wavechunkh[8]; /* 01wbXXXX where XXXX is size */ ! 219: uint32 frames; /* video frames done */ ! 220: uint32 audiolength; /* samples output so far */ ! 221: uint32 movilength; /* movi bytes output so far */ ! 222: uint32 off_length; /* offset in file to update */ ! 223: uint32 off_movilength; /* offset in file to update */ ! 224: uint32 off_totalframes; /* offset in file to update */ ! 225: uint32 off_videolength; /* offset in file to update */ ! 226: uint32 off_audiolength; /* offset in file to update */ ! 227: uint32 error; /* 1000ths of a byte we haven't output */ ! 228: uint32 jpeg; /* writing jpegs? */ ! 229: uint32 bgr; /* need BGR data instead of RGB? */ ! 230: } t_avi; ! 231: ! 232: #define AVIF_HASINDEX 0x00000010 /* Index at end of file? */ ! 233: #define AVIF_MUSTUSEINDEX 0x00000020 ! 234: #define AVIF_ISINTERLEAVED 0x00000100 ! 235: #define AVIF_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames? */ ! 236: #define AVIF_WASCAPTUREFILE 0x00010000 ! 237: #define AVIF_COPYRIGHTED 0x00020000 ! 238: #define WAVE_FORMAT_PCM 1 ! 239: ! 240: t_avi *avi_open(char *filename, t_aviinfo *info, int jpeg); ! 241: int avi_close(t_avi *avi); ! 242: int avi_video(t_avi *avi, uint8 *video); ! 243: int avi_audio(t_avi *avi, uint8 *audio, uint32 samples);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.