2 * avi.h library for AVI file format i/o
3 * Copyright (C) 2000 - 2002 Arne Schirmacher <arne@schirmacher.de>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software Foundation,
17 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 * Revision 1.1 2005/04/15 14:28:26 lilo_booter
27 * Revision 1.16 2005/04/01 23:43:10 ddennedy
28 * apply endian fixes from Daniel Kobras
30 * Revision 1.15 2004/10/11 01:37:11 ddennedy
31 * mutex safety locks in RIFF and AVI classes, type 2 AVI optimization, mencoder export script
33 * Revision 1.14 2003/11/25 23:00:52 ddennedy
34 * cleanup and a few bugfixes
36 * Revision 1.13 2003/10/21 16:34:32 ddennedy
37 * GNOME2 port phase 1: initial checkin
39 * Revision 1.11.2.5 2003/07/24 14:13:57 ddennedy
40 * support for distinct audio stream in type2 AVI and Quicktime; support for more DV FOURCCs
42 * Revision 1.11.2.4 2003/06/10 23:53:36 ddennedy
43 * Daniel Kobras' WriteFrame error handling and automatic OpenDML, bugfixes in scene list updates, export AV/C Record
45 * Revision 1.11.2.3 2003/02/20 21:59:57 ddennedy
46 * bugfixes to capture and AVI
48 * Revision 1.11.2.2 2003/01/13 05:15:31 ddennedy
49 * added More Info panel and supporting methods
51 * Revision 1.11.2.1 2002/11/25 04:48:31 ddennedy
52 * bugfix to report errors when loading files
54 * Revision 1.11 2002/10/08 07:46:41 ddennedy
55 * AVI bugfixes, compatibility, optimization, warn bad file in capture and export dv file, allow no mplex
57 * Revision 1.10 2002/05/17 08:04:25 ddennedy
58 * revert const-ness of Frame references in Frame, FileHandler, and AVI classes
60 * Revision 1.9 2002/05/15 04:39:35 ddennedy
61 * bugfixes to dv2 AVI write, audio export, Xv init
63 * Revision 1.8 2002/04/29 05:09:22 ddennedy
64 * raw dv file support, Frame::ExtractAudio uses libdv, audioScrub prefs
66 * Revision 1.7 2002/04/09 06:53:42 ddennedy
67 * cleanup, new libdv 0.9.5, large AVI, dnd storyboard
69 * Revision 1.7 2002/03/25 21:34:25 arne
70 * Support for large (64 bit) files mostly completed
72 * Revision 1.6 2002/03/10 13:29:41 arne
73 * more changes for 64 bit access
75 * Revision 1.5 2002/03/09 17:59:28 arne
76 * moved index routines to AVIFile
78 * Revision 1.4 2002/03/09 10:26:26 arne
79 * improved constructors and assignment operator
81 * Revision 1.3 2002/03/09 08:55:57 arne
82 * moved a few variables to AVIFile
84 * Revision 1.2 2002/03/04 19:22:43 arne
85 * updated to latest Kino avi code
87 * Revision 1.1.1.1 2002/03/03 19:08:08 arne
88 * import of version 1.01
92 /** Common AVI declarations
94 Some of this comes from the public domain AVI specification, which
95 explains the microsoft-style definitions.
105 #define PACKED(x) __attribute__((packed)) x
107 #define AVI_SMALL_INDEX (0x01)
108 #define AVI_LARGE_INDEX (0x02)
109 #define AVI_INDEX_OF_INDEXES (0x00)
110 #define AVI_INDEX_OF_CHUNKS (0x01)
111 #define AVI_INDEX_2FIELD (0x01)
113 enum { AVI_PAL, AVI_NTSC, AVI_AUDIO_48KHZ, AVI_AUDIO_44KHZ, AVI_AUDIO_32KHZ };
115 /** Declarations of the main AVI file header
117 The contents of this struct goes into the 'avih' chunk. */
121 /// frame display rate (or 0L)
122 DWORD dwMicroSecPerFrame;
124 /// max. transfer rate
125 DWORD dwMaxBytesPerSec;
127 /// pad to multiples of this size, normally 2K
128 DWORD dwPaddingGranularity;
130 /// the ever-present flags
135 DWORD dwInitialFrames;
137 DWORD dwSuggestedBufferSize;
142 DWORD dwReserved[ 4 ];
144 PACKED(MainAVIHeader);
148 WORD top, bottom, left, right;
152 /** Declaration of a stream header
154 The contents of this struct goes into the 'strh' header. */
160 DWORD dwFlags; /* Contains AVITF_* flags */
163 DWORD dwInitialFrames;
165 DWORD dwRate; /* dwRate / dwScale == samples/second */
167 DWORD dwLength; /* In units above... */
168 DWORD dwSuggestedBufferSize;
173 PACKED(AVIStreamHeader);
183 DWORD dwDVReserved[ 2 ];
196 LONG biXPelsPerMeter;
197 LONG biYPelsPerMeter;
199 DWORD biClrImportant;
201 PACKED(BITMAPINFOHEADER);
207 DWORD nSamplesPerSec;
208 DWORD nAvgBytesPerSec;
214 PACKED(WAVEFORMATEX);
223 DWORD dwReserved[ 3 ];
224 struct avisuperindex_entry
232 PACKED(AVISuperIndex);
241 QUADWORD qwBaseOffset;
243 struct avifieldindex_entry
254 struct avisimpleindex_entry
264 PACKED(AVISimpleIndex);
270 DWORD dirEntryLength;
271 size_t dirEntryOffset;
272 int dirEntryWrittenFlag;
273 int dirEntryParentList;
278 /** base class for all AVI type files
280 It contains methods and members which are the same in all AVI type files regardless of the particular compression, number
283 The AVIFile class also contains methods for handling several indexes to the video frame content. */
285 class AVIFile : public RIFFFile
289 AVIFile( const AVIFile& );
291 virtual AVIFile& operator=( const AVIFile& );
293 virtual void Init( int format, int sampleFrequency, int indexType );
294 virtual int GetDVFrameInfo( off_t &offset, int &size, int frameNum );
295 virtual int GetFrameInfo( off_t &offset, int &size, int frameNum, FOURCC chunkID );
296 virtual int GetDVFrame( uint8_t *data, int frameNum );
297 virtual int getFrame( void *data, int frameNum, FOURCC chunkID );
298 virtual int GetTotalFrames() const;
299 virtual void PrintDirectoryEntryData( const RIFFDirEntry &entry ) const;
300 //virtual bool WriteFrame( const Frame &frame ) { return false; }
301 virtual void ParseList( int parent );
302 virtual void ParseRIFF( void );
303 virtual void ReadIndex( void );
304 virtual void WriteRIFF( void )
306 virtual void FlushIndx( int stream );
307 virtual void UpdateIndx( int stream, int chunk, int duration );
308 virtual void UpdateIdx1( int chunk, int flags );
309 virtual bool verifyStreamFormat( FOURCC type );
310 virtual bool verifyStream( FOURCC type );
311 virtual bool isOpenDML( void );
312 virtual void setDVINFO( DVINFO& )
314 virtual void setFccHandler( FOURCC type, FOURCC handler );
315 virtual bool getStreamFormat( void* data, FOURCC type );
318 MainAVIHeader mainHdr;
319 AVISimpleIndex *idx1;
328 AVIStreamHeader streamHdr[ 2 ];
329 AVISuperIndex *indx[ 2 ];
330 AVIStdIndex *ix[ 2 ];
348 /** writing Type 1 DV AVIs
352 class AVI1File : public AVIFile
358 virtual void Init( int format, int sampleFrequency, int indexType );
359 //virtual bool WriteFrame( const Frame &frame );
360 virtual void WriteRIFF( void );
361 virtual void setDVINFO( DVINFO& );
366 AVI1File( const AVI1File& );
367 AVI1File& operator=( const AVI1File& );
371 /** writing Type 2 (separate audio data) DV AVIs
373 This file type contains both audio and video tracks. It is therefore more compatible
374 to certain Windows programs, which expect any AVI having both audio and video tracks.
375 The video tracks contain the raw DV data (as in type 1) and the extracted audio tracks.
377 Note that because the DV data contains audio information anyway, this means duplication
378 of data and a slight increase of file size.
382 class AVI2File : public AVIFile
388 virtual void Init( int format, int sampleFrequency, int indexType );
389 //virtual bool WriteFrame( const Frame &frame );
390 virtual void WriteRIFF( void );
391 virtual void setDVINFO( DVINFO& );
394 BITMAPINFOHEADER bitmapinfo;
395 WAVEFORMATEX waveformatex;
397 AVI2File( const AVI2File& );
398 AVI2File& operator=( const AVI2File& );