Did all of the .h's in source
[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 #ifdef HAVE_CONFIG_H
60 #include <config.h>
61 #endif
62
63 typedef struct _AviChunk {
64   int fcc;
65   int size;
66 } AviChunk;
67
68 typedef struct _AviList {
69   int fcc;
70   int size;
71   int ids;
72 } AviList;
73
74 typedef struct _AviMainHeader {
75   int fcc;
76   int size;  
77   int MicroSecPerFrame;       /* MicroSecPerFrame - timing between frames */
78   int MaxBytesPerSec;        /* MaxBytesPerSec - approx bps system must handle */
79   int PaddingGranularity;
80   int Flags;
81 #define AVIF_HASINDEX           0x00000010        /* had idx1 chunk */
82 #define AVIF_MUSTUSEINDEX       0x00000020        /* must use idx1 chunk to determine order */
83 #define AVIF_ISINTERLEAVED      0x00000100        /* AVI file is interleaved */
84 #define AVIF_TRUSTCKTYPE        0x00000800
85 #define AVIF_WASCAPTUREFILE     0x00010000        /* specially allocated used for capturing real time video */
86 #define AVIF_COPYRIGHTED        0x00020000        /* contains copyrighted data */
87
88   int TotalFrames;
89   int InitialFrames;    /* InitialFrames - initial frame before interleaving */
90   int Streams;
91   int SuggestedBufferSize;
92   int Width;
93   int Height;
94   int Reserved[4];
95 } AviMainHeader;
96
97 typedef struct _AviStreamHeader {
98   int fcc;
99   int size;  
100   int Type;
101 #define AVIST_VIDEO FCC("vids")
102 #define AVIST_AUDIO FCC("auds")
103 #define AVIST_MIDI  FCC("mids")
104 #define AVIST_TEXT  FCC("txts")
105   
106   int Handler;
107   int Flags;
108 #define AVISF_DISABLED 0x00000001
109 #define AVISF_VIDEO_PALCHANGES 0x00010000
110
111   short Priority;
112   short Language;
113   int InitialFrames;
114   int Scale;
115   int Rate;
116   int Start;
117   int Length;
118   int SuggestedBufferSize;
119   int Quality;
120   int SampleSize;
121   short left;
122   short top;
123   short right;
124   short bottom;
125 } AviStreamHeader;
126
127 typedef struct _AviBitmapInfoHeader {
128   int fcc;
129   int size;  
130   int Size;
131   int Width;
132   int Height;
133   short Planes;
134   short BitCount;
135   int Compression;
136   int SizeImage;
137   int XPelsPerMeter;
138   int YPelsPerMeter;
139   int ClrUsed;
140   int ClrImportant;
141 } AviBitmapInfoHeader;
142
143 typedef struct _AviMJPEGUnknown {
144   int a;
145   int b;
146   int c;
147   int d;
148   int e;
149   int f;
150   int g;
151 } AviMJPEGUnknown;
152
153 typedef struct _AviIndexEntry {
154   int ChunkId;
155   int Flags;
156 #define AVIIF_LIST       0x00000001
157 #define AVIIF_KEYFRAME   0x00000010 
158 #define AVIIF_NO_TIME    0x00000100
159 #define AVIIF_COMPRESSOR 0x0FFF0000
160   int Offset;
161   int Size;
162 } AviIndexEntry;
163
164 typedef struct _AviIndex {
165   int fcc;
166   int size;
167   AviIndexEntry *entrys;
168 } AviIndex;
169
170 typedef enum {
171   AVI_FORMAT_RGB24,  /* The most basic of forms, 3 bytes per pixel, 1 per r, g, b */
172   AVI_FORMAT_RGB32,  /* The second most basic of forms, 4 bytes per pixel, 1 per r, g, b, alpha */
173   AVI_FORMAT_AVI_RGB, /* Same as above, but is in the wierd AVI order (bottom to top, left to right) */
174   AVI_FORMAT_MJPEG /* Motion-JPEG */
175 } AviFormat;
176
177 typedef struct _AviStreamRec {
178   AviStreamHeader sh;
179   void *sf;
180   int sf_size;
181   AviFormat format;
182 } AviStreamRec;
183
184 typedef struct _AviMovie {
185     FILE *fp; 
186         
187         int type;
188 #define AVI_MOVIE_READ  0
189 #define AVI_MOVIE_WRITE 1
190         
191         unsigned long size;
192
193         AviMainHeader *header;
194         AviStreamRec *streams;
195         AviIndexEntry *entries;
196         int index_entries;
197         
198         int movi_offset;
199         int read_offset;
200         long *offset_table;
201         
202         /* Local data goes here */
203         int interlace;
204         int odd_fields;
205 } AviMovie;
206
207 typedef enum {
208   AVI_ERROR_NONE=0,
209   AVI_ERROR_COMPRESSION,
210   AVI_ERROR_OPEN,
211   AVI_ERROR_READING,
212   AVI_ERROR_WRITING,
213   AVI_ERROR_FORMAT,
214   AVI_ERROR_ALLOC,
215   AVI_ERROR_FOUND,
216   AVI_ERROR_OPTION
217 } AviError;
218
219 /* belongs to the option-setting function. */
220 typedef enum {
221   AVI_OPTION_WIDTH=0,
222   AVI_OPTION_HEIGHT, 
223   AVI_OPTION_QUALITY,
224   AVI_OPTION_FRAMERATE
225 } AviOption;
226
227 /* The offsets that will always stay the same in AVI files we
228  * write... used to seek around to the places where we need to write
229  * the sizes */
230
231 #define AVI_RIFF_SOFF 4L
232 #define AVI_HDRL_SOFF 16L
233
234 /**
235  * This is a sort of MAKE_ID thing. Used in imbuf :( It is used
236  * through options in the AVI header (AviStreamHeader). */
237 #define FCC(ch4) (ch4[0] | ch4[1]<<8 | ch4[2]<<16 | ch4[3] << 24)
238
239 /**
240  * Test whether this is an avi-format.
241  */
242 int AVI_is_avi (char *name);
243
244
245 /**
246  * Open a compressed file, decompress it into memory.
247  */
248 AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...);
249
250 /**
251  * Finalize a compressed output stream.
252  */
253 AviError AVI_close_compress (AviMovie *movie);
254
255 /**
256  * Choose a compression option for <movie>. Possible options are
257  * AVI_OPTION_TYPE_MAIN, AVI_OPTION_TYPE_STRH, AVI_OPTION_TYPE_STRF
258  */
259 AviError AVI_set_compress_option (AviMovie *movie,
260                                                                   int option_type,
261                                                                   int stream,
262                                                                   AviOption option,
263                                                                   void *opt_data);
264 /* Hmmm... there should be some explanantion about what these mean */
265 /**
266  * Compression option, for use in avi_set_compress_option
267  */
268 #define AVI_OPTION_TYPE_MAIN 0
269 /**
270  * Compression option, for use in avi_set_compress_option
271  */
272 #define AVI_OPTION_TYPE_STRH 1
273 /**
274  * Compression option, for use in avi_set_compress_option
275  */
276 #define AVI_OPTION_TYPE_STRF 2
277
278 /**
279  * Direct the streams <avist_type> to <movie>. Redirect <stream_num>
280  * streams.
281  */
282 int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num);
283
284 /**
285  * Open a movie stream from file.
286  */
287 AviError AVI_open_movie (char *name, AviMovie *movie);
288
289 /**
290  * Read a frame from a movie stream.
291  */
292 void *AVI_read_frame (AviMovie *movie,
293                                           AviFormat format,
294                                           int frame,
295                                           int stream);
296 /**
297  * Close an open movie stream.
298  */
299 AviError AVI_close (AviMovie *movie);
300
301 /**
302  * Write frames to a movie stream.
303  */
304 AviError AVI_write_frame (AviMovie *movie, int frame_num, ...);
305
306 /**
307  * Unused but still external
308  */
309 AviError AVI_print_error (AviError error);
310 void AVI_set_debug (int mode);
311
312 #endif /* __AVI_H__ */
313