5932bbb12cf893eedb2bcadb415c92c8f5021f3e
[blender.git] / source / blender / avi / AVI_avi.h
1 /**
2  * @mainpage AVI - AVI module external interface
3  *
4  * @section about About the AVI module
5  *
6  * This is external code. It provides avi file import/export and
7  * conversions. It has been adapted to make use of Blender memory
8  * management functions, and because of this it needs module
9  * blenlib. You need to provide this lib when linking with libavi.a .
10  *
11  * @section issues Known issues with AVI
12  *
13  * - avi uses mallocN, freeN from blenlib. 
14  * - Not all functions that are used externally are properly
15  *   prototyped.
16  *
17  * This header has not been split, since it interleaves type defines
18  * and functions. You would need the types to be able to include the
19  * function headers anyway. And, after all, it is someone else's
20  * code. So we keep it like this.
21  *
22  * $Id$ 
23  *
24  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
25  *
26  * This program is free software; you can redistribute it and/or
27  * modify it under the terms of the GNU General Public License
28  * as published by the Free Software Foundation; either version 2
29  * of the License, or (at your option) any later version. The Blender
30  * Foundation also sells licenses for use in proprietary software under
31  * the Blender License.  See http://www.blender.org/BL/ for information
32  * about this.
33  *
34  * This program is distributed in the hope that it will be useful,
35  * but WITHOUT ANY WARRANTY; without even the implied warranty of
36  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37  * GNU General Public License for more details.
38  *
39  * You should have received a copy of the GNU General Public License
40  * along with this program; if not, write to the Free Software Foundation,
41  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
42  *
43  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
44  * All rights reserved.
45  *
46  * The Original Code is: all of this file.
47  *
48  * Contributor(s): none yet.
49  *
50  * ***** END GPL/BL DUAL LICENSE BLOCK *****
51  *
52  */
53
54 #ifndef __AVI_H__
55 #define __AVI_H__
56
57 #include <stdio.h> /* for FILE */
58
59 typedef struct _AviChunk {
60   int fcc;
61   int size;
62 } AviChunk;
63
64 typedef struct _AviList {
65   int fcc;
66   int size;
67   int ids;
68 } AviList;
69
70 typedef struct _AviMainHeader {
71   int fcc;
72   int size;  
73   int MicroSecPerFrame;       /* MicroSecPerFrame - timing between frames */
74   int MaxBytesPerSec;        /* MaxBytesPerSec - approx bps system must handle */
75   int PaddingGranularity;
76   int Flags;
77 #define AVIF_HASINDEX           0x00000010        /* had idx1 chunk */
78 #define AVIF_MUSTUSEINDEX       0x00000020        /* must use idx1 chunk to determine order */
79 #define AVIF_ISINTERLEAVED      0x00000100        /* AVI file is interleaved */
80 #define AVIF_TRUSTCKTYPE        0x00000800
81 #define AVIF_WASCAPTUREFILE     0x00010000        /* specially allocated used for capturing real time video */
82 #define AVIF_COPYRIGHTED        0x00020000        /* contains copyrighted data */
83
84   int TotalFrames;
85   int InitialFrames;    /* InitialFrames - initial frame before interleaving */
86   int Streams;
87   int SuggestedBufferSize;
88   int Width;
89   int Height;
90   int Reserved[4];
91 } AviMainHeader;
92
93 typedef struct _AviStreamHeader {
94   int fcc;
95   int size;  
96   int Type;
97 #define AVIST_VIDEO FCC("vids")
98 #define AVIST_AUDIO FCC("auds")
99 #define AVIST_MIDI  FCC("mids")
100 #define AVIST_TEXT  FCC("txts")
101   
102   int Handler;
103   int Flags;
104 #define AVISF_DISABLED 0x00000001
105 #define AVISF_VIDEO_PALCHANGES 0x00010000
106
107   short Priority;
108   short Language;
109   int InitialFrames;
110   int Scale;
111   int Rate;
112   int Start;
113   int Length;
114   int SuggestedBufferSize;
115   int Quality;
116   int SampleSize;
117   short left;
118   short top;
119   short right;
120   short bottom;
121 } AviStreamHeader;
122
123 typedef struct _AviBitmapInfoHeader {
124   int fcc;
125   int size;  
126   int Size;
127   int Width;
128   int Height;
129   short Planes;
130   short BitCount;
131   int Compression;
132   int SizeImage;
133   int XPelsPerMeter;
134   int YPelsPerMeter;
135   int ClrUsed;
136   int ClrImportant;
137 } AviBitmapInfoHeader;
138
139 typedef struct _AviMJPEGUnknown {
140   int a;
141   int b;
142   int c;
143   int d;
144   int e;
145   int f;
146   int g;
147 } AviMJPEGUnknown;
148
149 typedef struct _AviIndexEntry {
150   int ChunkId;
151   int Flags;
152 #define AVIIF_LIST       0x00000001
153 #define AVIIF_KEYFRAME   0x00000010 
154 #define AVIIF_NO_TIME    0x00000100
155 #define AVIIF_COMPRESSOR 0x0FFF0000
156   int Offset;
157   int Size;
158 } AviIndexEntry;
159
160 typedef struct _AviIndex {
161   int fcc;
162   int size;
163   AviIndexEntry *entrys;
164 } AviIndex;
165
166 typedef enum {
167   AVI_FORMAT_RGB24,  /* The most basic of forms, 3 bytes per pixel, 1 per r, g, b */
168   AVI_FORMAT_RGB32,  /* The second most basic of forms, 4 bytes per pixel, 1 per r, g, b, alpha */
169   AVI_FORMAT_AVI_RGB, /* Same as above, but is in the wierd AVI order (bottom to top, left to right) */
170   AVI_FORMAT_MJPEG /* Motion-JPEG */
171 } AviFormat;
172
173 typedef struct _AviStreamRec {
174   AviStreamHeader sh;
175   void *sf;
176   int sf_size;
177   AviFormat format;
178 } AviStreamRec;
179
180 typedef struct _AviMovie {
181     FILE *fp; 
182         
183         int type;
184 #define AVI_MOVIE_READ  0
185 #define AVI_MOVIE_WRITE 1
186         
187         unsigned long size;
188
189         AviMainHeader *header;
190         AviStreamRec *streams;
191         AviIndexEntry *entries;
192         int index_entries;
193         
194         int movi_offset;
195         int read_offset;
196         long *offset_table;
197         
198         /* Local data goes here */
199         int interlace;
200         int odd_fields;
201 } AviMovie;
202
203 typedef enum {
204   AVI_ERROR_NONE=0,
205   AVI_ERROR_COMPRESSION,
206   AVI_ERROR_OPEN,
207   AVI_ERROR_READING,
208   AVI_ERROR_WRITING,
209   AVI_ERROR_FORMAT,
210   AVI_ERROR_ALLOC,
211   AVI_ERROR_FOUND,
212   AVI_ERROR_OPTION
213 } AviError;
214
215 /* belongs to the option-setting function. */
216 typedef enum {
217   AVI_OPTION_WIDTH=0,
218   AVI_OPTION_HEIGHT, 
219   AVI_OPTION_QUALITY,
220   AVI_OPTION_FRAMERATE
221 } AviOption;
222
223 /* The offsets that will always stay the same in AVI files we
224  * write... used to seek around to the places where we need to write
225  * the sizes */
226
227 #define AVI_RIFF_SOFF 4L
228 #define AVI_HDRL_SOFF 16L
229
230 /**
231  * This is a sort of MAKE_ID thing. Used in imbuf :( It is used
232  * through options in the AVI header (AviStreamHeader). */
233 #define FCC(ch4) (ch4[0] | ch4[1]<<8 | ch4[2]<<16 | ch4[3] << 24)
234
235 /**
236  * Test whether this is an avi-format.
237  */
238 int AVI_is_avi (char *name);
239
240
241 /**
242  * Open a compressed file, decompress it into memory.
243  */
244 AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...);
245
246 /**
247  * Finalize a compressed output stream.
248  */
249 AviError AVI_close_compress (AviMovie *movie);
250
251 /**
252  * Choose a compression option for <movie>. Possible options are
253  * AVI_OPTION_TYPE_MAIN, AVI_OPTION_TYPE_STRH, AVI_OPTION_TYPE_STRF
254  */
255 AviError AVI_set_compress_option (AviMovie *movie,
256                                                                   int option_type,
257                                                                   int stream,
258                                                                   AviOption option,
259                                                                   void *opt_data);
260 /* Hmmm... there should be some explanantion about what these mean */
261 /**
262  * Compression option, for use in avi_set_compress_option
263  */
264 #define AVI_OPTION_TYPE_MAIN 0
265 /**
266  * Compression option, for use in avi_set_compress_option
267  */
268 #define AVI_OPTION_TYPE_STRH 1
269 /**
270  * Compression option, for use in avi_set_compress_option
271  */
272 #define AVI_OPTION_TYPE_STRF 2
273
274 /**
275  * Direct the streams <avist_type> to <movie>. Redirect <stream_num>
276  * streams.
277  */
278 int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num);
279
280 /**
281  * Open a movie stream from file.
282  */
283 AviError AVI_open_movie (char *name, AviMovie *movie);
284
285 /**
286  * Read a frame from a movie stream.
287  */
288 void *AVI_read_frame (AviMovie *movie,
289                                           AviFormat format,
290                                           int frame,
291                                           int stream);
292 /**
293  * Close an open movie stream.
294  */
295 AviError AVI_close (AviMovie *movie);
296
297 /**
298  * Write frames to a movie stream.
299  */
300 AviError AVI_write_frame (AviMovie *movie, int frame_num, ...);
301
302 /**
303  * Unused but still external
304  */
305 AviError AVI_print_error (AviError error);
306 void AVI_set_debug (int mode);
307
308 #endif /* __AVI_H__ */