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