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