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.4 2005/07/25 07:21:39 lilo_booter
25 * + fixes for opendml dv avi
27 * Revision 1.3 2005/06/21 20:59:39 lilo_booter
28 * src/framework/mlt_consumer.c src/framework/mlt_consumer.h
29 * + Added a general profile handling for size, aspect ratio and display ratio
31 * src/framework/mlt_producer.c
32 * + Correction to aspect ratio properties
35 * + Minimalist support for sdl_preview (still not very good)
37 * src/modules/avformat/consumer_avformat.c
38 * + Takes consumer profile into account
40 * src/modules/core/filter_resize.c
41 * + Corrections for synthesised producers and aspect ratio (inherits from consumer)
43 * src/modules/core/producer_colour.c
44 * src/modules/core/producer_noise.c
45 * src/modules/gtk2/producer_pango.c
46 * + Ensures that resize picks up consumer aspect ratio
48 * src/modules/dv/consumer_libdv.c
49 * + Honour wide screen output
51 * src/modules/gtk2/producer_pixbuf.c
52 * + Correction for 1:1 aspect ratio
54 * src/modules/kino/Makefile
55 * src/modules/kino/avi.cc
56 * src/modules/kino/avi.h
57 * src/modules/kino/configure
58 * src/modules/kino/filehandler.cc
59 * + Attempt to allow mov dv files to provide audio
61 * src/modules/sdl/consumer_sdl.c
62 * src/modules/sdl/consumer_sdl_preview.c
63 * src/modules/sdl/consumer_sdl_still.c
64 * + Takes consumer profile into account
66 * Revision 1.2 2005/04/15 14:37:03 lilo_booter
69 * Revision 1.1 2005/04/15 14:28:26 lilo_booter
72 * Revision 1.16 2005/04/01 23:43:10 ddennedy
73 * apply endian fixes from Daniel Kobras
75 * Revision 1.15 2004/10/11 01:37:11 ddennedy
76 * mutex safety locks in RIFF and AVI classes, type 2 AVI optimization, mencoder export script
78 * Revision 1.14 2003/11/25 23:00:52 ddennedy
79 * cleanup and a few bugfixes
81 * Revision 1.13 2003/10/21 16:34:32 ddennedy
82 * GNOME2 port phase 1: initial checkin
84 * Revision 1.11.2.5 2003/07/24 14:13:57 ddennedy
85 * support for distinct audio stream in type2 AVI and Quicktime; support for more DV FOURCCs
87 * Revision 1.11.2.4 2003/06/10 23:53:36 ddennedy
88 * Daniel Kobras' WriteFrame error handling and automatic OpenDML, bugfixes in scene list updates, export AV/C Record
90 * Revision 1.11.2.3 2003/02/20 21:59:57 ddennedy
91 * bugfixes to capture and AVI
93 * Revision 1.11.2.2 2003/01/13 05:15:31 ddennedy
94 * added More Info panel and supporting methods
96 * Revision 1.11.2.1 2002/11/25 04:48:31 ddennedy
97 * bugfix to report errors when loading files
99 * Revision 1.11 2002/10/08 07:46:41 ddennedy
100 * AVI bugfixes, compatibility, optimization, warn bad file in capture and export dv file, allow no mplex
102 * Revision 1.10 2002/05/17 08:04:25 ddennedy
103 * revert const-ness of Frame references in Frame, FileHandler, and AVI classes
105 * Revision 1.9 2002/05/15 04:39:35 ddennedy
106 * bugfixes to dv2 AVI write, audio export, Xv init
108 * Revision 1.8 2002/04/29 05:09:22 ddennedy
109 * raw dv file support, Frame::ExtractAudio uses libdv, audioScrub prefs
111 * Revision 1.7 2002/04/09 06:53:42 ddennedy
112 * cleanup, new libdv 0.9.5, large AVI, dnd storyboard
114 * Revision 1.7 2002/03/25 21:34:25 arne
115 * Support for large (64 bit) files mostly completed
117 * Revision 1.6 2002/03/10 13:29:41 arne
118 * more changes for 64 bit access
120 * Revision 1.5 2002/03/09 17:59:28 arne
121 * moved index routines to AVIFile
123 * Revision 1.4 2002/03/09 10:26:26 arne
124 * improved constructors and assignment operator
126 * Revision 1.3 2002/03/09 08:55:57 arne
127 * moved a few variables to AVIFile
129 * Revision 1.2 2002/03/04 19:22:43 arne
130 * updated to latest Kino avi code
132 * Revision 1.1.1.1 2002/03/03 19:08:08 arne
133 * import of version 1.01
137 /** Common AVI declarations
139 Some of this comes from the public domain AVI specification, which
140 explains the microsoft-style definitions.
151 #define PACKED(x) __attribute__((packed)) x
153 #define AVI_SMALL_INDEX (0x01)
154 #define AVI_LARGE_INDEX (0x02)
155 #define KINO_AVI_INDEX_OF_INDEXES (0x00)
156 #define KINO_AVI_INDEX_OF_CHUNKS (0x01)
157 #define AVI_INDEX_2FIELD (0x01)
159 enum
{ AVI_PAL
, AVI_NTSC
, AVI_AUDIO_48KHZ
, AVI_AUDIO_44KHZ
, AVI_AUDIO_32KHZ
};
161 /** Declarations of the main AVI file header
163 The contents of this struct goes into the 'avih' chunk. */
167 /// frame display rate (or 0L)
168 DWORD dwMicroSecPerFrame
;
170 /// max. transfer rate
171 DWORD dwMaxBytesPerSec
;
173 /// pad to multiples of this size, normally 2K
174 DWORD dwPaddingGranularity
;
176 /// the ever-present flags
181 DWORD dwInitialFrames
;
183 DWORD dwSuggestedBufferSize
;
188 DWORD dwReserved
[ 4 ];
190 PACKED(MainAVIHeader
);
194 WORD top
, bottom
, left
, right
;
198 /** Declaration of a stream header
200 The contents of this struct goes into the 'strh' header. */
206 DWORD dwFlags
; /* Contains AVITF_* flags */
209 DWORD dwInitialFrames
;
211 DWORD dwRate
; /* dwRate / dwScale == samples/second */
213 DWORD dwLength
; /* In units above... */
214 DWORD dwSuggestedBufferSize
;
219 PACKED(AVIStreamHeader
);
229 DWORD dwDVReserved
[ 2 ];
242 LONG biXPelsPerMeter
;
243 LONG biYPelsPerMeter
;
245 DWORD biClrImportant
;
248 PACKED(BITMAPINFOHEADER
);
254 DWORD nSamplesPerSec
;
255 DWORD nAvgBytesPerSec
;
261 PACKED(WAVEFORMATEX
);
270 DWORD dwReserved
[ 3 ];
271 struct avisuperindex_entry
279 PACKED(AVISuperIndex
);
288 QUADWORD qwBaseOffset
;
290 struct avifieldindex_entry
301 struct avisimpleindex_entry
311 PACKED(AVISimpleIndex
);
317 DWORD dirEntryLength
;
318 size_t dirEntryOffset
;
319 int dirEntryWrittenFlag
;
320 int dirEntryParentList
;
325 /** base class for all AVI type files
327 It contains methods and members which are the same in all AVI type files regardless of the particular compression, number
330 The AVIFile class also contains methods for handling several indexes to the video frame content. */
332 class AVIFile
: public RIFFFile
336 AVIFile( const AVIFile
& );
338 virtual AVIFile
& operator=( const AVIFile
& );
340 virtual void Init( int format
, int sampleFrequency
, int indexType
);
341 virtual int GetDVFrameInfo( off_t
&offset
, int &size
, int frameNum
);
342 virtual int GetFrameInfo( off_t
&offset
, int &size
, int frameNum
, FOURCC chunkID
);
343 virtual int GetDVFrame( uint8_t *data
, int frameNum
);
344 virtual int getFrame( void *data
, int frameNum
, FOURCC chunkID
);
345 virtual int GetTotalFrames() const;
346 virtual void PrintDirectoryEntryData( const RIFFDirEntry
&entry
) const;
347 //virtual bool WriteFrame( const Frame &frame ) { return false; }
348 virtual void ParseList( int parent
);
349 virtual void ParseRIFF( void );
350 virtual void ReadIndex( void );
351 virtual void WriteRIFF( void )
353 virtual void FlushIndx( int stream
);
354 virtual void UpdateIndx( int stream
, int chunk
, int duration
);
355 virtual void UpdateIdx1( int chunk
, int flags
);
356 virtual bool verifyStreamFormat( FOURCC type
);
357 virtual bool verifyStream( FOURCC type
);
358 virtual bool isOpenDML( void );
359 virtual void setDVINFO( DVINFO
& )
361 virtual void setFccHandler( FOURCC type
, FOURCC handler
);
362 virtual bool getStreamFormat( void* data
, FOURCC type
);
365 MainAVIHeader mainHdr
;
366 AVISimpleIndex
*idx1
;
375 AVIStreamHeader streamHdr
[ 2 ];
376 AVISuperIndex
*indx
[ 2 ];
377 AVIStdIndex
*ix
[ 2 ];
395 /** writing Type 1 DV AVIs
399 class AVI1File
: public AVIFile
405 virtual void Init( int format
, int sampleFrequency
, int indexType
);
406 //virtual bool WriteFrame( const Frame &frame );
407 virtual void WriteRIFF( void );
408 virtual void setDVINFO( DVINFO
& );
413 AVI1File( const AVI1File
& );
414 AVI1File
& operator=( const AVI1File
& );
418 /** writing Type 2 (separate audio data) DV AVIs
420 This file type contains both audio and video tracks. It is therefore more compatible
421 to certain Windows programs, which expect any AVI having both audio and video tracks.
422 The video tracks contain the raw DV data (as in type 1) and the extracted audio tracks.
424 Note that because the DV data contains audio information anyway, this means duplication
425 of data and a slight increase of file size.
429 class AVI2File
: public AVIFile
435 virtual void Init( int format
, int sampleFrequency
, int indexType
);
436 //virtual bool WriteFrame( const Frame &frame );
437 virtual void WriteRIFF( void );
438 virtual void setDVINFO( DVINFO
& );
441 BITMAPINFOHEADER bitmapinfo
;
442 WAVEFORMATEX waveformatex
;
444 AVI2File( const AVI2File
& );
445 AVI2File
& operator=( const AVI2File
& );