1 /**
2  * This file is part of the mingw-w64 runtime package.
3  * No warranty is given; refer to the file DISCLAIMER within this package.
4  */
5 
6 #include <winapifamily.h>
7 
8 #ifndef AVIRIFF_H
9 #define AVIRIFF_H
10 
11 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
12 
13 #ifndef NUMELMS
14 #define NUMELMS (aa) (sizeof (aa) / sizeof ((aa)[0]))
15 #endif
16 
17 #define FCC(ch4) ((((DWORD)(ch4) & 0xff) << 24) | (((DWORD)(ch4) & 0xff00) << 8) | (((DWORD)(ch4) & 0xff0000) >> 8) | (((DWORD)(ch4) & 0xff000000) >> 24))
18 
19 #include <pshpack2.h>
20 typedef struct _riffchunk {
21   FOURCC fcc;
22   DWORD cb;
23 } RIFFCHUNK,*LPRIFFCHUNK;
24 
25 typedef struct _rifflist {
26   FOURCC fcc;
27   DWORD cb;
28   FOURCC fccListType;
29 } RIFFLIST,*LPRIFFLIST;
30 
31 #define RIFFROUND(cb) ((cb) + ((cb) & 1))
32 #define RIFFNEXT(pChunk) (LPRIFFCHUNK) ((LPBYTE) (pChunk) + sizeof (RIFFCHUNK) + RIFFROUND (((LPRIFFCHUNK)pChunk)->cb))
33 
34 #define ckidMAINAVIHEADER FCC('avih')
35 #define ckidAVIEXTHEADER FCC('dmlh')
36 #define ckidAVIOLDINDEX FCC('idx1')
37 #define ckidAVISUPERINDEX FCC('indx')
38 #define ckidODML FCC('odml')
39 
40 #ifndef ckidSTREAMFORMAT
41 #define ckidSTREAMFORMAT FCC('strf')
42 #endif
43 #ifndef ckidSTREAMHEADER
44 #define ckidSTREAMHEADER FCC('strh')
45 #endif
46 
47 #define ckidSTREAMLIST FCC('strl')
48 
49 #ifndef streamtypeVIDEO
50 #define streamtypeAUDIO FCC('auds')
51 #define streamtypeMIDI FCC('mids')
52 #define streamtypeTEXT FCC('txts')
53 #define streamtypeVIDEO FCC('vids')
54 #endif
55 
56 #define AVIF_HASINDEX 0x00000010
57 #define AVIF_MUSTUSEINDEX 0x00000020
58 #define AVIF_ISINTERLEAVED 0x00000100
59 #define AVIF_TRUSTCKTYPE 0x00000800
60 #define AVIF_WASCAPTUREFILE 0x00010000
61 #define AVIF_COPYRIGHTED 0x00020000
62 
63 #ifndef AVIIF_LIST
64 #define AVIIF_LIST 0x1
65 #define AVIIF_KEYFRAME 0x10
66 #endif
67 #define AVIIF_NO_TIME 0x100
68 #define AVIIF_COMPRESSOR 0xfff0000
69 
70 #define AVISF_DISABLED 0x00000001
71 #define AVISF_VIDEO_PALCHANGES 0x00010000
72 
73 #define TIMECODE_RATE_30DROP 0
74 
75 #define TIMECODE_SMPTE_BINARY_GROUP 0x7
76 #define TIMECODE_SMPTE_COLOR_FRAME 0x8
77 
78 #define AVI_INDEX_OF_INDEXES 0x0
79 #define AVI_INDEX_OF_CHUNKS 0x1
80 #define AVI_INDEX_OF_TIMED_CHUNKS 0x2
81 #define AVI_INDEX_OF_SUB_2FIELD 0x3
82 #define AVI_INDEX_IS_DATA 0x80
83 
84 #define AVI_INDEX_SUB_DEFAULT 0x0
85 #define AVI_INDEX_SUB_2FIELD 0x1
86 
87 #define STDINDEXSIZE 0x4000
88 #define NUMINDEX(wLongsPerEntry) ((STDINDEXSIZE - 32) / 4 / (wLongsPerEntry))
89 #define NUMINDEXFILL(wLongsPerEntry) ((STDINDEXSIZE / 4) - NUMINDEX (wLongsPerEntry))
90 
91 #define Valid_SUPERINDEX(pi) (*(DWORD *) (&((pi)->wLongsPerEntry)) == 4)
92 
93 typedef struct _avimainheader {
94   FOURCC fcc;
95   DWORD cb;
96   DWORD dwMicroSecPerFrame;
97   DWORD dwMaxBytesPerSec;
98   DWORD dwPaddingGranularity;
99   DWORD dwFlags;
100   DWORD dwTotalFrames;
101   DWORD dwInitialFrames;
102   DWORD dwStreams;
103   DWORD dwSuggestedBufferSize;
104   DWORD dwWidth;
105   DWORD dwHeight;
106   DWORD dwReserved[4];
107 } AVIMAINHEADER;
108 
109 typedef struct _aviextheader {
110   FOURCC fcc;
111   DWORD cb;
112   DWORD dwGrandFrames;
113   DWORD dwFuture[61];
114 } AVIEXTHEADER;
115 
116 typedef struct _avistreamheader {
117   FOURCC fcc;
118   DWORD cb;
119   FOURCC fccType;
120   FOURCC fccHandler;
121   DWORD dwFlags;
122   WORD wPriority;
123   WORD wLanguage;
124   DWORD dwInitialFrames;
125   DWORD dwScale;
126   DWORD dwRate;
127   DWORD dwStart;
128   DWORD dwLength;
129   DWORD dwSuggestedBufferSize;
130   DWORD dwQuality;
131   DWORD dwSampleSize;
132   struct {
133     short int left;
134     short int top;
135     short int right;
136     short int bottom;
137   } rcFrame;
138 } AVISTREAMHEADER;
139 
140 typedef struct _avioldindex {
141   FOURCC fcc;
142   DWORD cb;
143   struct _avioldindex_entry {
144     DWORD dwChunkId;
145     DWORD dwFlags;
146     DWORD dwOffset;
147     DWORD dwSize;
148   } aIndex[];
149 } AVIOLDINDEX;
150 
151 #ifndef TIMECODE_DEFINED
152 #define TIMECODE_DEFINED
153 typedef union _timecode {
154   __C89_NAMELESS struct {
155     WORD wFrameRate;
156     WORD wFrameFract;
157     LONG cFrames;
158   };
159   DWORDLONG qw;
160 } TIMECODE;
161 #endif
162 
163 typedef struct _timecodedata {
164   TIMECODE time;
165   DWORD dwSMPTEflags;
166   DWORD dwUser;
167 } TIMECODEDATA;
168 
169 typedef struct _avimetaindex {
170   FOURCC fcc;
171   UINT cb;
172   WORD wLongsPerEntry;
173   BYTE bIndexSubType;
174   BYTE bIndexType;
175   DWORD nEntriesInUse;
176   DWORD dwChunkId;
177   DWORD dwReserved[3];
178   DWORD adwIndex[];
179 } AVIMETAINDEX;
180 
181 typedef struct _avisuperindex {
182   FOURCC fcc;
183   UINT cb;
184   WORD wLongsPerEntry;
185   BYTE bIndexSubType;
186   BYTE bIndexType;
187   DWORD nEntriesInUse;
188   DWORD dwChunkId;
189   DWORD dwReserved[3];
190   struct _avisuperindex_entry {
191     DWORDLONG qwOffset;
192     DWORD dwSize;
193     DWORD dwDuration;
194   } aIndex[NUMINDEX (4)];
195 } AVISUPERINDEX;
196 
197 typedef struct _avistdindex_entry {
198   DWORD dwOffset;
199   DWORD dwSize;
200 } AVISTDINDEX_ENTRY;
201 
202 #define AVISTDINDEX_DELTAFRAME (0x80000000)
203 #define AVISTDINDEX_SIZEMASK (~0x80000000)
204 
205 typedef struct _avistdindex {
206   FOURCC fcc;
207   UINT cb;
208   WORD wLongsPerEntry;
209   BYTE bIndexSubType;
210   BYTE bIndexType;
211   DWORD nEntriesInUse;
212   DWORD dwChunkId;
213   DWORDLONG qwBaseOffset;
214   DWORD dwReserved_3;
215   AVISTDINDEX_ENTRY aIndex[NUMINDEX (2)];
216 } AVISTDINDEX;
217 
218 typedef struct _avitimedindex_entry {
219   DWORD dwOffset;
220   DWORD dwSize;
221   DWORD dwDuration;
222 } AVITIMEDINDEX_ENTRY;
223 
224 typedef struct _avitimedindex {
225   FOURCC fcc;
226   UINT cb;
227   WORD wLongsPerEntry;
228   BYTE bIndexSubType;
229   BYTE bIndexType;
230   DWORD nEntriesInUse;
231   DWORD dwChunkId;
232   DWORDLONG qwBaseOffset;
233   DWORD dwReserved_3;
234   AVITIMEDINDEX_ENTRY aIndex[NUMINDEX (3)];
235   DWORD adwTrailingFill[NUMINDEXFILL (3)];
236 } AVITIMEDINDEX;
237 
238 typedef struct _avitimecodeindex {
239   FOURCC fcc;
240   UINT cb;
241   WORD wLongsPerEntry;
242   BYTE bIndexSubType;
243   BYTE bIndexType;
244   DWORD nEntriesInUse;
245   DWORD dwChunkId;
246   DWORD dwReserved[3];
247   TIMECODEDATA aIndex[NUMINDEX (sizeof (TIMECODEDATA)/sizeof (LONG))];
248 } AVITIMECODEINDEX;
249 
250 typedef struct _avitcdlindex_entry {
251   DWORD dwTick;
252   TIMECODE time;
253   DWORD dwSMPTEflags;
254   DWORD dwUser;
255   TCHAR szReelId[12];
256 } AVITCDLINDEX_ENTRY;
257 
258 typedef struct _avitcdlindex {
259   FOURCC fcc;
260   UINT cb;
261   WORD wLongsPerEntry;
262   BYTE bIndexSubType;
263   BYTE bIndexType;
264   DWORD nEntriesInUse;
265   DWORD dwChunkId;
266   DWORD dwReserved[3];
267   AVITCDLINDEX_ENTRY aIndex[NUMINDEX (7)];
268   DWORD adwTrailingFill[NUMINDEXFILL (7)];
269 } AVITCDLINDEX;
270 
271 typedef struct _avifieldindex_chunk {
272   FOURCC fcc;
273   DWORD cb;
274   WORD wLongsPerEntry;
275   BYTE bIndexSubType;
276   BYTE bIndexType;
277   DWORD nEntriesInUse;
278   DWORD dwChunkId;
279   DWORDLONG qwBaseOffset;
280   DWORD dwReserved3;
281   struct _avifieldindex_entry {
282     DWORD dwOffset;
283     DWORD dwSize;
284     DWORD dwOffsetField2;
285   } aIndex[];
286 } AVIFIELDINDEX,*PAVIFIELDINDEX;
287 #include <poppack.h>
288 
289 #endif
290 
291 #endif
292