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