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