GetFullPathName: get "drive" value too for absolute paths.
[wine] / include / vfw.h
1 #ifndef __WINE_VFW_H
2 #define __WINE_VFW_H
3
4 #include "windef.h"
5 #include "mmsystem.h"
6 #include "wingdi.h"
7 #include "wine/obj_base.h"
8 #include "unknwn.h"
9
10 #define VFWAPI  WINAPI
11 #define VFWAPIV WINAPIV
12
13 DWORD VFWAPI VideoForWindowsVersion(void);
14
15 #ifndef mmioFOURCC
16 #define mmioFOURCC( ch0, ch1, ch2, ch3 )                                \
17         ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |            \
18         ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
19 #endif
20
21 #ifndef aviTWOCC
22 #define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8))
23 #endif
24
25 #define ICTYPE_VIDEO    mmioFOURCC('v', 'i', 'd', 'c')
26 #define ICTYPE_AUDIO    mmioFOURCC('a', 'u', 'd', 'c')
27
28 /*****************************************************************************
29  * Predeclare the interfaces
30  */
31 typedef struct IAVIStream IAVIStream,*PAVISTREAM;
32 typedef struct IAVIFile IAVIFile,*PAVIFILE;
33 typedef struct IGetFrame IGetFrame,*PGETFRAME;
34
35 /* Installable Compressor M? */
36
37 DECLARE_HANDLE(HIC);
38
39 #ifdef __WINE__
40 /* HIC struct (same layout as Win95 one) */
41 typedef struct tagWINE_HIC {
42         DWORD           magic;          /* 00: 'Smag' */
43         HANDLE  curthread;      /* 04: */
44         DWORD           type;           /* 08: */
45         DWORD           handler;        /* 0C: */
46         HDRVR           hdrv;           /* 10: */
47         DWORD           private;        /* 14:(handled by SendDriverMessage)*/
48         FARPROC driverproc;     /* 18:(handled by SendDriverMessage)*/
49         DWORD           x1;             /* 1c: name? */
50         WORD            x2;             /* 20: */
51         DWORD           x3;             /* 22: */
52                                         /* 26: */
53 } WINE_HIC;
54 #endif
55
56 /* error return codes */
57 #define ICERR_OK                0
58 #define ICERR_DONTDRAW          1
59 #define ICERR_NEWPALETTE        2
60 #define ICERR_GOTOKEYFRAME      3
61 #define ICERR_STOPDRAWING       4
62
63 #define ICERR_UNSUPPORTED       -1
64 #define ICERR_BADFORMAT         -2
65 #define ICERR_MEMORY            -3
66 #define ICERR_INTERNAL          -4
67 #define ICERR_BADFLAGS          -5
68 #define ICERR_BADPARAM          -6
69 #define ICERR_BADSIZE           -7
70 #define ICERR_BADHANDLE         -8
71 #define ICERR_CANTUPDATE        -9
72 #define ICERR_ABORT             -10
73 #define ICERR_ERROR             -100
74 #define ICERR_BADBITDEPTH       -200
75 #define ICERR_BADIMAGESIZE      -201
76
77 #define ICERR_CUSTOM            -400
78
79 /* ICM Messages */
80 #define ICM_USER                (DRV_USER+0x0000)
81
82 /* ICM driver message range */
83 #define ICM_RESERVED_LOW        (DRV_USER+0x1000)
84 #define ICM_RESERVED_HIGH       (DRV_USER+0x2000)
85 #define ICM_RESERVED            ICM_RESERVED_LOW
86
87 #define ICM_GETSTATE            (ICM_RESERVED+0)
88 #define ICM_SETSTATE            (ICM_RESERVED+1)
89 #define ICM_GETINFO             (ICM_RESERVED+2)
90
91 #define ICM_CONFIGURE           (ICM_RESERVED+10)
92 #define ICM_ABOUT               (ICM_RESERVED+11)
93 /* */
94
95 #define ICM_GETDEFAULTQUALITY   (ICM_RESERVED+30)
96 #define ICM_GETQUALITY          (ICM_RESERVED+31)
97 #define ICM_SETQUALITY          (ICM_RESERVED+32)
98
99 #define ICM_SET                 (ICM_RESERVED+40)
100 #define ICM_GET                 (ICM_RESERVED+41)
101
102 /* 2 constant FOURCC codes */
103 #define ICM_FRAMERATE           mmioFOURCC('F','r','m','R')
104 #define ICM_KEYFRAMERATE        mmioFOURCC('K','e','y','R')
105
106 #define ICM_COMPRESS_GET_FORMAT         (ICM_USER+4)
107 #define ICM_COMPRESS_GET_SIZE           (ICM_USER+5)
108 #define ICM_COMPRESS_QUERY              (ICM_USER+6)
109 #define ICM_COMPRESS_BEGIN              (ICM_USER+7)
110 #define ICM_COMPRESS                    (ICM_USER+8)
111 #define ICM_COMPRESS_END                (ICM_USER+9)
112
113 #define ICM_DECOMPRESS_GET_FORMAT       (ICM_USER+10)
114 #define ICM_DECOMPRESS_QUERY            (ICM_USER+11)
115 #define ICM_DECOMPRESS_BEGIN            (ICM_USER+12)
116 #define ICM_DECOMPRESS                  (ICM_USER+13)
117 #define ICM_DECOMPRESS_END              (ICM_USER+14)
118 #define ICM_DECOMPRESS_SET_PALETTE      (ICM_USER+29)
119 #define ICM_DECOMPRESS_GET_PALETTE      (ICM_USER+30)
120
121 #define ICM_DRAW_QUERY                  (ICM_USER+31)
122 #define ICM_DRAW_BEGIN                  (ICM_USER+15)
123 #define ICM_DRAW_GET_PALETTE            (ICM_USER+16)
124 #define ICM_DRAW_START                  (ICM_USER+18)
125 #define ICM_DRAW_STOP                   (ICM_USER+19)
126 #define ICM_DRAW_END                    (ICM_USER+21)
127 #define ICM_DRAW_GETTIME                (ICM_USER+32)
128 #define ICM_DRAW                        (ICM_USER+33)
129 #define ICM_DRAW_WINDOW                 (ICM_USER+34)
130 #define ICM_DRAW_SETTIME                (ICM_USER+35)
131 #define ICM_DRAW_REALIZE                (ICM_USER+36)
132 #define ICM_DRAW_FLUSH                  (ICM_USER+37)
133 #define ICM_DRAW_RENDERBUFFER           (ICM_USER+38)
134
135 #define ICM_DRAW_START_PLAY             (ICM_USER+39)
136 #define ICM_DRAW_STOP_PLAY              (ICM_USER+40)
137
138 #define ICM_DRAW_SUGGESTFORMAT          (ICM_USER+50)
139 #define ICM_DRAW_CHANGEPALETTE          (ICM_USER+51)
140
141 #define ICM_GETBUFFERSWANTED            (ICM_USER+41)
142
143 #define ICM_GETDEFAULTKEYFRAMERATE      (ICM_USER+42)
144
145 #define ICM_DECOMPRESSEX_BEGIN          (ICM_USER+60)
146 #define ICM_DECOMPRESSEX_QUERY          (ICM_USER+61)
147 #define ICM_DECOMPRESSEX                (ICM_USER+62)
148 #define ICM_DECOMPRESSEX_END            (ICM_USER+63)
149
150 #define ICM_COMPRESS_FRAMES_INFO        (ICM_USER+70)
151 #define ICM_SET_STATUS_PROC             (ICM_USER+72)
152
153 /* structs */
154
155 typedef struct {
156         DWORD   dwSize;         /* 00: size */
157         DWORD   fccType;        /* 04: type 'vidc' usually */
158         DWORD   fccHandler;     /* 08: */
159         DWORD   dwVersion;      /* 0c: version of compman opening you */
160         DWORD   dwFlags;        /* 10: LOWORD is type specific */
161         LRESULT dwError;        /* 14: */
162         LPVOID  pV1Reserved;    /* 18: */
163         LPVOID  pV2Reserved;    /* 1c: */
164         DWORD   dnDevNode;      /* 20: */
165                                 /* 24: */
166 } ICOPEN,*LPICOPEN;
167
168 #define ICCOMPRESS_KEYFRAME     0x00000001L
169
170 typedef struct {
171     DWORD               dwFlags;
172     LPBITMAPINFOHEADER  lpbiOutput;
173     LPVOID              lpOutput;
174     LPBITMAPINFOHEADER  lpbiInput;
175     LPVOID              lpInput;
176     LPDWORD             lpckid;
177     LPDWORD             lpdwFlags;
178     LONG                lFrameNum;
179     DWORD               dwFrameSize;
180     DWORD               dwQuality;
181     LPBITMAPINFOHEADER  lpbiPrev;
182     LPVOID              lpPrev;
183 } ICCOMPRESS;
184
185 DWORD VFWAPIV ICCompress(
186         HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiOutput,LPVOID lpData,
187         LPBITMAPINFOHEADER lpbiInput,LPVOID lpBits,LPDWORD lpckid,
188         LPDWORD lpdwFlags,LONG lFrameNum,DWORD dwFrameSize,DWORD dwQuality,
189         LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev
190 );
191
192 #define ICCompressGetFormat(hic, lpbiInput, lpbiOutput)                 \
193         ICSendMessage(                                          \
194             hic,ICM_COMPRESS_GET_FORMAT,(DWORD)(LPVOID)(lpbiInput),     \
195             (DWORD)(LPVOID)(lpbiOutput)                                 \
196         )
197
198 #define ICCompressGetFormatSize(hic,lpbi) ICCompressGetFormat(hic,lpbi,NULL)
199
200 #define ICCompressBegin(hic, lpbiInput, lpbiOutput)                     \
201     ICSendMessage(                                                      \
202         hic, ICM_COMPRESS_BEGIN, (DWORD)(LPVOID)(lpbiInput),            \
203         (DWORD)(LPVOID)(lpbiOutput)                                     \
204     )
205
206 #define ICCompressGetSize(hic, lpbiInput, lpbiOutput)           \
207     ICSendMessage(                                                      \
208         hic, ICM_COMPRESS_GET_SIZE, (DWORD)(LPVOID)(lpbiInput),         \
209         (DWORD)(LPVOID)(lpbiOutput)                                     \
210     )
211
212 #define ICCompressQuery(hic, lpbiInput, lpbiOutput)             \
213     ICSendMessage(                                              \
214         hic, ICM_COMPRESS_QUERY, (DWORD)(LPVOID)(lpbiInput),    \
215         (DWORD)(LPVOID)(lpbiOutput)                             \
216     )
217
218
219 #define ICCompressEnd(hic) ICSendMessage(hic, ICM_COMPRESS_END, 0, 0)
220
221 /* ICCOMPRESSFRAMES.dwFlags */
222 #define ICCOMPRESSFRAMES_PADDING        0x00000001
223 typedef struct {
224     DWORD               dwFlags;
225     LPBITMAPINFOHEADER  lpbiOutput;
226     LPARAM              lOutput;
227     LPBITMAPINFOHEADER  lpbiInput;
228     LPARAM              lInput;
229     LONG                lStartFrame;
230     LONG                lFrameCount;
231     LONG                lQuality;
232     LONG                lDataRate;
233     LONG                lKeyRate;
234     DWORD               dwRate;
235     DWORD               dwScale;
236     DWORD               dwOverheadPerFrame;
237     DWORD               dwReserved2;
238     LONG CALLBACK (*GetData)(LPARAM lInput,LONG lFrame,LPVOID lpBits,LONG len);
239     LONG CALLBACK (*PutData)(LPARAM lOutput,LONG lFrame,LPVOID lpBits,LONG len);
240 } ICCOMPRESSFRAMES;
241
242 /* Values for wMode of ICOpen() */
243 #define ICMODE_COMPRESS         1
244 #define ICMODE_DECOMPRESS       2
245 #define ICMODE_FASTDECOMPRESS   3
246 #define ICMODE_QUERY            4
247 #define ICMODE_FASTCOMPRESS     5
248 #define ICMODE_DRAW             8
249
250 /* quality flags */
251 #define ICQUALITY_LOW       0
252 #define ICQUALITY_HIGH      10000
253 #define ICQUALITY_DEFAULT   -1
254
255 typedef struct {
256         DWORD   dwSize;         /* 00: */
257         DWORD   fccType;        /* 04:compressor type     'vidc' 'audc' */
258         DWORD   fccHandler;     /* 08:compressor sub-type 'rle ' 'jpeg' 'pcm '*/
259         DWORD   dwFlags;        /* 0c:flags LOWORD is type specific */
260         DWORD   dwVersion;      /* 10:version of the driver */
261         DWORD   dwVersionICM;   /* 14:version of the ICM used */
262         /*
263          * under Win32, the driver always returns UNICODE strings.
264          */
265         WCHAR   szName[16];             /* 18:short name */
266         WCHAR   szDescription[128];     /* 38:long name */
267         WCHAR   szDriver[128];          /* 138:driver that contains compressor*/
268                                         /* 238: */
269 } ICINFO;
270
271 /* ICINFO.dwFlags */
272 #define VIDCF_QUALITY           0x0001  /* supports quality */
273 #define VIDCF_CRUNCH            0x0002  /* supports crunching to a frame size */
274 #define VIDCF_TEMPORAL          0x0004  /* supports inter-frame compress */
275 #define VIDCF_COMPRESSFRAMES    0x0008  /* wants the compress all frames message */
276 #define VIDCF_DRAW              0x0010  /* supports drawing */
277 #define VIDCF_FASTTEMPORALC     0x0020  /* does not need prev frame on compress */
278 #define VIDCF_FASTTEMPORALD     0x0080  /* does not need prev frame on decompress */
279 #define VIDCF_QUALITYTIME       0x0040  /* supports temporal quality */
280
281 #define VIDCF_FASTTEMPORAL      (VIDCF_FASTTEMPORALC|VIDCF_FASTTEMPORALD)
282
283
284 /* function shortcuts */
285 /* ICM_ABOUT */
286 #define ICMF_ABOUT_QUERY         0x00000001
287
288 #define ICQueryAbout(hic) \
289         (ICSendMessage(hic,ICM_ABOUT,(DWORD)-1,ICMF_ABOUT_QUERY)==ICERR_OK)
290
291 #define ICAbout(hic, hwnd) ICSendMessage(hic,ICM_ABOUT,(DWORD)(UINT)(hwnd),0)
292
293 /* ICM_CONFIGURE */
294 #define ICMF_CONFIGURE_QUERY    0x00000001
295 #define ICQueryConfigure(hic) \
296         (ICSendMessage(hic,ICM_CONFIGURE,(DWORD)-1,ICMF_CONFIGURE_QUERY)==ICERR_OK)
297
298 #define ICConfigure(hic,hwnd) \
299         ICSendMessage(hic,ICM_CONFIGURE,(DWORD)(UINT)(hwnd),0)
300
301 /* Decompression stuff */
302 #define ICDECOMPRESS_HURRYUP            0x80000000      /* don't draw just buffer (hurry up!) */
303 #define ICDECOMPRESS_UPDATE             0x40000000      /* don't draw just update screen */
304 #define ICDECOMPRESS_PREROL             0x20000000      /* this frame is before real start */
305 #define ICDECOMPRESS_NULLFRAME          0x10000000      /* repeat last frame */
306 #define ICDECOMPRESS_NOTKEYFRAME        0x08000000      /* this frame is not a key frame */
307
308 typedef struct {
309     DWORD               dwFlags;        /* flags (from AVI index...) */
310     LPBITMAPINFOHEADER  lpbiInput;      /* BITMAPINFO of compressed data */
311     LPVOID              lpInput;        /* compressed data */
312     LPBITMAPINFOHEADER  lpbiOutput;     /* DIB to decompress to */
313     LPVOID              lpOutput;
314     DWORD               ckid;           /* ckid from AVI file */
315 } ICDECOMPRESS;
316
317 typedef struct {
318     DWORD               dwFlags;
319     LPBITMAPINFOHEADER  lpbiSrc;
320     LPVOID              lpSrc;
321     LPBITMAPINFOHEADER  lpbiDst;
322     LPVOID              lpDst;
323
324     /* changed for ICM_DECOMPRESSEX */
325     INT         xDst;       /* destination rectangle */
326     INT         yDst;
327     INT         dxDst;
328     INT         dyDst;
329
330     INT         xSrc;       /* source rectangle */
331     INT         ySrc;
332     INT         dxSrc;
333     INT         dySrc;
334 } ICDECOMPRESSEX;
335
336 DWORD VFWAPIV ICDecompress(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,LPVOID lpData,LPBITMAPINFOHEADER lpbi,LPVOID lpBits);
337
338
339 #define ICDecompressBegin(hic, lpbiInput, lpbiOutput)   \
340     ICSendMessage(                                              \
341         hic, ICM_DECOMPRESS_BEGIN, (DWORD)(LPVOID)(lpbiInput),  \
342         (DWORD)(LPVOID)(lpbiOutput)                             \
343     )
344
345 #define ICDecompressQuery(hic, lpbiInput, lpbiOutput)   \
346     ICSendMessage(                                              \
347         hic,ICM_DECOMPRESS_QUERY, (DWORD)(LPVOID)(lpbiInput),   \
348         (DWORD) (LPVOID)(lpbiOutput)                            \
349     )
350
351 #define ICDecompressGetFormat(hic, lpbiInput, lpbiOutput)               \
352     ((LONG)ICSendMessage(                                               \
353         hic,ICM_DECOMPRESS_GET_FORMAT, (DWORD)(LPVOID)(lpbiInput),      \
354         (DWORD)(LPVOID)(lpbiOutput)                                     \
355     ))
356
357 #define ICDecompressGetFormatSize(hic, lpbi)                            \
358         ICDecompressGetFormat(hic, lpbi, NULL)
359
360 #define ICDecompressGetPalette(hic, lpbiInput, lpbiOutput)              \
361     ICSendMessage(                                                      \
362         hic, ICM_DECOMPRESS_GET_PALETTE, (DWORD)(LPVOID)(lpbiInput),    \
363         (DWORD)(LPVOID)(lpbiOutput)                                     \
364     )
365
366 #define ICDecompressSetPalette(hic,lpbiPalette) \
367         ICSendMessage(                          \
368                 hic,ICM_DECOMPRESS_SET_PALETTE,         \
369                 (DWORD)(LPVOID)(lpbiPalette),0          \
370         )
371
372 #define ICDecompressEnd(hic) ICSendMessage(hic, ICM_DECOMPRESS_END, 0, 0)
373
374
375 #define ICDRAW_QUERY        0x00000001L   /* test for support */
376 #define ICDRAW_FULLSCREEN   0x00000002L   /* draw to full screen */
377 #define ICDRAW_HDC          0x00000004L   /* draw to a HDC/HWND */
378
379 BOOL    VFWAPI  ICInfo(DWORD fccType, DWORD fccHandler, ICINFO * lpicinfo);
380 LRESULT VFWAPI  ICGetInfo(HIC hic,ICINFO *picinfo, DWORD cb);
381 HIC     VFWAPI  ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode);
382 HIC     VFWAPI  ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler);
383
384 LRESULT VFWAPI ICClose(HIC hic);
385 LRESULT VFWAPI  ICSendMessage(HIC hic, UINT msg, DWORD dw1, DWORD dw2);
386 HIC     VFWAPI ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags);
387
388 DWORD   VFWAPIV ICDrawBegin(
389         HIC                     hic,
390         DWORD                   dwFlags,/* flags */
391         HPALETTE                hpal,   /* palette to draw with */
392         HWND                    hwnd,   /* window to draw to */
393         HDC                     hdc,    /* HDC to draw to */
394         INT                     xDst,   /* destination rectangle */
395         INT                     yDst,
396         INT                     dxDst,
397         INT                     dyDst,
398         LPBITMAPINFOHEADER      lpbi,   /* format of frame to draw */
399         INT                     xSrc,   /* source rectangle */
400         INT                     ySrc,
401         INT                     dxSrc,
402         INT                     dySrc,
403         DWORD                   dwRate, /* frames/second = (dwRate/dwScale) */
404         DWORD                   dwScale
405 );
406
407 /* as passed to ICM_DRAW_BEGIN (FIXME: correct only for Win32?)  */
408 typedef struct {
409         DWORD           dwFlags;
410         HPALETTE        hpal;
411         HWND            hwnd;
412         HDC             hdc;
413         INT             xDst;
414         INT             yDst;
415         INT             dxDst;
416         INT             dyDst;
417         LPBITMAPINFOHEADER      lpbi;
418         INT             xSrc;
419         INT             ySrc;
420         INT             dxSrc;
421         INT             dySrc;
422         DWORD           dwRate;
423         DWORD           dwScale;
424 } ICDRAWBEGIN;
425
426 #define ICDRAW_HURRYUP      0x80000000L   /* don't draw just buffer (hurry up!) */
427 #define ICDRAW_UPDATE       0x40000000L   /* don't draw just update screen */
428 #define ICDRAW_PREROLL      0x20000000L   /* this frame is before real start */
429 #define ICDRAW_NULLFRAME    0x10000000L   /* repeat last frame */
430 #define ICDRAW_NOTKEYFRAME  0x08000000L   /* this frame is not a key frame */
431
432 typedef struct {
433         DWORD   dwFlags;
434         LPVOID  lpFormat;
435         LPVOID  lpData;
436         DWORD   cbData;
437         LONG    lTime;
438 } ICDRAW;
439
440 DWORD VFWAPIV ICDraw(HIC hic,DWORD dwFlags,LPVOID lpFormat,LPVOID lpData,DWORD cbData,LONG lTime);
441
442 /********************* AVIFILE function declarations *************************/
443
444 #define streamtypeVIDEO         mmioFOURCC('v', 'i', 'd', 's')
445 #define streamtypeAUDIO         mmioFOURCC('a', 'u', 'd', 's')
446 #define streamtypeMIDI          mmioFOURCC('m', 'i', 'd', 's')
447 #define streamtypeTEXT          mmioFOURCC('t', 'x', 't', 's')
448
449 /* Basic chunk types */
450 #define cktypeDIBbits           aviTWOCC('d', 'b')
451 #define cktypeDIBcompressed     aviTWOCC('d', 'c')
452 #define cktypePALchange         aviTWOCC('p', 'c')
453 #define cktypeWAVEbytes         aviTWOCC('w', 'b')
454
455 /* Chunk id to use for extra chunks for padding. */
456 #define ckidAVIPADDING          mmioFOURCC('J', 'U', 'N', 'K')
457
458 /* AVIFileHdr.dwFlags */
459 #define AVIF_HASINDEX           0x00000010      /* Index at end of file? */
460 #define AVIF_MUSTUSEINDEX       0x00000020
461 #define AVIF_ISINTERLEAVED      0x00000100
462 #define AVIF_TRUSTCKTYPE        0x00000800      /* Use CKType to find key frames*/
463 #define AVIF_WASCAPTUREFILE     0x00010000
464 #define AVIF_COPYRIGHTED        0x00020000
465
466 #define AVI_HEADERSIZE  2048
467
468 typedef struct _MainAVIHeader
469 {
470     DWORD       dwMicroSecPerFrame;
471     DWORD       dwMaxBytesPerSec;
472     DWORD       dwPaddingGranularity;
473     DWORD       dwFlags;
474     DWORD       dwTotalFrames;
475     DWORD       dwInitialFrames;
476     DWORD       dwStreams;
477     DWORD       dwSuggestedBufferSize;
478     DWORD       dwWidth;
479     DWORD       dwHeight;
480     DWORD       dwReserved[4];
481 } MainAVIHeader;
482
483 /* AVIStreamHeader.dwFlags */
484 #define AVISF_DISABLED                  0x00000001
485 #define AVISF_VIDEO_PALCHANGES          0x00010000
486
487 typedef struct {
488     FOURCC      fccType;
489     FOURCC      fccHandler;
490     DWORD       dwFlags;        /* AVISF_* */
491     WORD        wPriority;
492     WORD        wLanguage;
493     DWORD       dwInitialFrames;
494     DWORD       dwScale;        
495     DWORD       dwRate; /* dwRate / dwScale == samples/second */
496     DWORD       dwStart;
497     DWORD       dwLength; /* In units above... */
498     DWORD       dwSuggestedBufferSize;
499     DWORD       dwQuality;
500     DWORD       dwSampleSize;
501     RECT16      rcFrame;        /* word.word - word.word in file */
502 } AVIStreamHeader;
503
504 /* AVIINDEXENTRY.dwFlags */
505 #define AVIIF_LIST      0x00000001      /* chunk is a 'LIST' */
506 #define AVIIF_KEYFRAME  0x00000010      /* this frame is a key frame. */
507
508 #define AVIIF_NOTIME    0x00000100      /* this frame doesn't take any time */
509 #define AVIIF_COMPUSE   0x0FFF0000
510
511 typedef struct _AVIINDEXENTRY {
512     DWORD       ckid;
513     DWORD       dwFlags;
514     DWORD       dwChunkOffset;
515     DWORD       dwChunkLength;
516 } AVIINDEXENTRY;
517
518 typedef struct _AVIPALCHANGE {
519     BYTE                bFirstEntry;
520     BYTE                bNumEntries;
521     WORD                wFlags;         /* pad */
522     PALETTEENTRY        peNew[1];
523 } AVIPALCHANGE;
524
525 #define AVIIF_KEYFRAME  0x00000010      /* this frame is a key frame. */
526
527 #define AVIGETFRAMEF_BESTDISPLAYFMT     1
528
529 typedef struct _AVISTREAMINFOA {
530     DWORD       fccType;
531     DWORD       fccHandler;
532     DWORD       dwFlags;        /* AVIIF_* */
533     DWORD       dwCaps;
534     WORD        wPriority;
535     WORD        wLanguage;
536     DWORD       dwScale;
537     DWORD       dwRate;         /* dwRate / dwScale == samples/second */
538     DWORD       dwStart;
539     DWORD       dwLength;       /* In units above... */
540     DWORD       dwInitialFrames;
541     DWORD       dwSuggestedBufferSize;
542     DWORD       dwQuality;
543     DWORD       dwSampleSize;
544     RECT        rcFrame;
545     DWORD       dwEditCount;
546     DWORD       dwFormatChangeCount;
547     CHAR        szName[64];
548 } AVISTREAMINFOA, * LPAVISTREAMINFOA, *PAVISTREAMINFOA;
549
550 typedef struct _AVISTREAMINFOW {
551     DWORD       fccType;
552     DWORD       fccHandler;
553     DWORD       dwFlags;
554     DWORD       dwCaps;
555     WORD        wPriority;
556     WORD        wLanguage;
557     DWORD       dwScale;
558     DWORD       dwRate;         /* dwRate / dwScale == samples/second */
559     DWORD       dwStart;
560     DWORD       dwLength;       /* In units above... */
561     DWORD       dwInitialFrames;
562     DWORD       dwSuggestedBufferSize;
563     DWORD       dwQuality;
564     DWORD       dwSampleSize;
565     RECT        rcFrame;
566     DWORD       dwEditCount;
567     DWORD       dwFormatChangeCount;
568     WCHAR       szName[64];
569 } AVISTREAMINFOW, * LPAVISTREAMINFOW, *PAVISTREAMINFOW;
570 DECL_WINELIB_TYPE_AW(AVISTREAMINFO)
571 DECL_WINELIB_TYPE_AW(LPAVISTREAMINFO)
572 DECL_WINELIB_TYPE_AW(PAVISTREAMINFO)
573
574 #define AVISTREAMINFO_DISABLED          0x00000001
575 #define AVISTREAMINFO_FORMATCHANGES     0x00010000
576
577 /* AVIFILEINFO.dwFlags */
578 #define AVIFILEINFO_HASINDEX            0x00000010
579 #define AVIFILEINFO_MUSTUSEINDEX        0x00000020
580 #define AVIFILEINFO_ISINTERLEAVED       0x00000100
581 #define AVIFILEINFO_WASCAPTUREFILE      0x00010000
582 #define AVIFILEINFO_COPYRIGHTED         0x00020000
583
584 /* AVIFILEINFO.dwCaps */
585 #define AVIFILECAPS_CANREAD             0x00000001
586 #define AVIFILECAPS_CANWRITE            0x00000002
587 #define AVIFILECAPS_ALLKEYFRAMES        0x00000010
588 #define AVIFILECAPS_NOCOMPRESSION       0x00000020
589
590 typedef struct _AVIFILEINFOW {
591     DWORD               dwMaxBytesPerSec;
592     DWORD               dwFlags;
593     DWORD               dwCaps;
594     DWORD               dwStreams;
595     DWORD               dwSuggestedBufferSize;
596     DWORD               dwWidth;
597     DWORD               dwHeight;
598     DWORD               dwScale;        
599     DWORD               dwRate;
600     DWORD               dwLength;
601     DWORD               dwEditCount;
602     WCHAR               szFileType[64];
603 } AVIFILEINFOW, * LPAVIFILEINFOW, *PAVIFILEINFOW;
604 typedef struct _AVIFILEINFOA {
605     DWORD               dwMaxBytesPerSec;
606     DWORD               dwFlags;
607     DWORD               dwCaps;
608     DWORD               dwStreams;
609     DWORD               dwSuggestedBufferSize;
610     DWORD               dwWidth;
611     DWORD               dwHeight;
612     DWORD               dwScale;        
613     DWORD               dwRate;
614     DWORD               dwLength;
615     DWORD               dwEditCount;
616     CHAR                szFileType[64];
617 } AVIFILEINFOA, * LPAVIFILEINFOA, *PAVIFILEINFOA;
618 DECL_WINELIB_TYPE_AW(AVIFILEINFO)
619 DECL_WINELIB_TYPE_AW(PAVIFILEINFO)
620 DECL_WINELIB_TYPE_AW(LPAVIFILEINFO)
621
622 /* AVICOMPRESSOPTIONS.dwFlags. determines presence of fields in below struct */
623 #define AVICOMPRESSF_INTERLEAVE 0x00000001
624 #define AVICOMPRESSF_DATARATE   0x00000002
625 #define AVICOMPRESSF_KEYFRAMES  0x00000004
626 #define AVICOMPRESSF_VALID      0x00000008
627
628 typedef struct {
629     DWORD       fccType;                /* stream type, for consistency */
630     DWORD       fccHandler;             /* compressor */
631     DWORD       dwKeyFrameEvery;        /* keyframe rate */
632     DWORD       dwQuality;              /* compress quality 0-10,000 */
633     DWORD       dwBytesPerSecond;       /* bytes per second */
634     DWORD       dwFlags;                /* flags... see below */
635     LPVOID      lpFormat;               /* save format */
636     DWORD       cbFormat;
637     LPVOID      lpParms;                /* compressor options */
638     DWORD       cbParms;
639     DWORD       dwInterleaveEvery;      /* for non-video streams only */
640 } AVICOMPRESSOPTIONS, *LPAVICOMPRESSOPTIONS,*PAVICOMPRESSOPTIONS;
641
642
643
644 #define DEFINE_AVIGUID(name, l, w1, w2) \
645     DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
646
647 DEFINE_AVIGUID(IID_IAVIFile,            0x00020020, 0, 0);
648 DEFINE_AVIGUID(IID_IAVIStream,          0x00020021, 0, 0);
649 DEFINE_AVIGUID(IID_IAVIStreaming,       0x00020022, 0, 0);
650 DEFINE_AVIGUID(IID_IGetFrame,           0x00020023, 0, 0);
651 DEFINE_AVIGUID(IID_IAVIEditStream,      0x00020024, 0, 0);
652
653 DEFINE_AVIGUID(CLSID_AVIFile,           0x00020000, 0, 0);
654
655 /*****************************************************************************
656  * IAVIStream interface
657  */
658 #define ICOM_INTERFACE IAVIStream
659 #define IAVIStream_METHODS                                              \
660     ICOM_METHOD2(HRESULT,Create,     LPARAM,lParam1, LPARAM,lParam2) \
661     ICOM_METHOD2(HRESULT,Info,       AVISTREAMINFOW*,psi, LONG,lSize) \
662     ICOM_METHOD2(LONG,   FindSample, LONG,lPos, LONG,lFlags) \
663     ICOM_METHOD3(HRESULT,ReadFormat, LONG,lPos, LPVOID,lpFormat, LONG*,lpcbFormat) \
664     ICOM_METHOD3(HRESULT,SetFormat,  LONG,lPos, LPVOID,lpFormat, LONG,cbFormat) \
665     ICOM_METHOD6(HRESULT,Read,       LONG,lStart, LONG,lSamples, LPVOID,lpBuffer, LONG,cbBuffer, LONG*,plBytes, LONG*,plSamples) \
666     ICOM_METHOD7(HRESULT,Write,      LONG,lStart, LONG,lSamples, LPVOID,lpBuffer, LONG,cbBuffer, DWORD,dwFlags, LONG*,plSampWritten, LONG*,plBytesWritten) \
667     ICOM_METHOD2(HRESULT,Delete,     LONG,lStart, LONG,lSamples) \
668     ICOM_METHOD3(HRESULT,ReadData,   DWORD,fcc, LPVOID,lpBuffer, LONG*,lpcbBuffer) \
669     ICOM_METHOD3(HRESULT,WriteData,  DWORD,fcc, LPVOID,lpBuffer, LONG,cbBuffer) \
670     ICOM_METHOD2(HRESULT,SetInfo,    AVISTREAMINFOW*,plInfo, LONG,cbInfo)
671 #define IAVIStream_IMETHODS     \
672         IUnknown_IMETHODS       \
673         IAVIStream_METHODS
674 ICOM_DEFINE(IAVIStream, IUnknown)
675 #undef ICOM_INTERFACE
676
677 /*** IUnknown methods ***/
678 #define IAVIStream_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
679 #define IAVIStream_AddRef(p)             ICOM_CALL (AddRef,p)
680 #define IAVIStream_Release(p)            ICOM_CALL (Release,p)
681 /*** IAVIStream methods ***/
682 #define IAVIStream_Create(p,a,b)          ICOM_CALL2(Create,p,a,b)
683 #define IAVIStream_Info(p,a,b)            ICOM_CALL2(Info,p,a,b)
684 #define IAVIStream_FindSample(p,a,b)      ICOM_CALL2(FindSample,p,a,b)
685 #define IAVIStream_ReadFormat(p,a,b,c)    ICOM_CALL3(ReadFormat,p,a,b,c)
686 #define IAVIStream_SetFormat(p,a,b,c)     ICOM_CALL3(SetFormat,p,a,b,c)
687 #define IAVIStream_Read(p,a,b,c,d,e,f)    ICOM_CALL6(Read,p,a,b,c,d,e,f)
688 #define IAVIStream_Write(p,a,b,c,d,e,f,g) ICOM_CALL7(Write,p,a,b,c,d,e,f,g)
689 #define IAVIStream_Delete(p,a,b)          ICOM_CALL2(Delete,p,a,b)
690 #define IAVIStream_ReadData(p,a,b,c)      ICOM_CALL3(ReadData,p,a,b,c)
691 #define IAVIStream_WriteData(p,a,b,c)     ICOM_CALL3(WriteData,p,a,b,c)
692 #define IAVIStream_SetInfo(p,a,b)         ICOM_CALL2(SetInfo,p,a,b)
693
694 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM*ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *lpOptions,CLSID*pclsidHandler); 
695
696 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM iface,AVISTREAMINFOA *asi,LONG size);
697 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM iface,AVISTREAMINFOW *asi,LONG size);
698 #define AVIStreamInfo WINELIB_NAME_AW(AVIStreamInfo)
699 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pg,LONG pos);
700 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pg);
701 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM pavi,LPBITMAPINFOHEADER lpbiWanted);
702 LONG WINAPI AVIStreamLength(PAVISTREAM iface);
703 HRESULT WINAPI AVIStreamRead(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread);
704 HRESULT WINAPI AVIStreamReadData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG *lpread);
705 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG *formatsize);
706 ULONG WINAPI AVIStreamRelease(PAVISTREAM iface);
707 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG formatsize);
708 LONG WINAPI AVIStreamStart(PAVISTREAM iface);
709 HRESULT WINAPI AVIStreamWrite(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten);
710 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG size);
711
712
713 /*****************************************************************************
714  * IAVIFile interface
715  */
716 /* In Win32 this interface uses UNICODE only */
717 #define ICOM_INTERFACE IAVIFile
718 #define IAVIFile_METHODS                                                \
719     ICOM_METHOD2(HRESULT,Info,         AVIFILEINFOW*,pfi, LONG,lSize) \
720     ICOM_METHOD3(HRESULT,GetStream,    PAVISTREAM*,ppStream, DWORD,fccType, LONG,lParam) \
721     ICOM_METHOD2(HRESULT,CreateStream, PAVISTREAM*,ppStream, AVISTREAMINFOW*,psi) \
722     ICOM_METHOD3(HRESULT,WriteData,    DWORD,fcc, LPVOID,lpBuffer, LONG,cbBuffer) \
723     ICOM_METHOD3(HRESULT,ReadData,     DWORD,fcc, LPVOID,lpBuffer, LONG*,lpcbBuffer) \
724         ICOM_METHOD (HRESULT,EndRecord)                                 \
725     ICOM_METHOD2(HRESULT,DeleteStream, DWORD,fccType, LONG,lParam)
726 #define IAVIFile_IMETHODS       \
727         IUnknown_IMETHODS       \
728         IAVIFile_METHODS
729 ICOM_DEFINE(IAVIFile,IUnknown)
730 #undef ICOM_INTERFACE
731
732 /*** IUnknown methods ***/
733 #define IAVIFile_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
734 #define IAVIFile_AddRef(p)             ICOM_CALL (AddRef,p)
735 #define IAVIFile_Release(p)            ICOM_CALL (Release,p)
736 /*** IAVIFile methods ***/
737 #define IAVIFile_Info(p,a,b)         ICOM_CALL2(Info,p,a,b)
738 #define IAVIFile_GetStream(p,a,b,c)  ICOM_CALL3(GetStream,p,a,b,c)
739 #define IAVIFile_CreateStream(p,a,b) ICOM_CALL2(CreateStream,p,a,b)
740 #define IAVIFile_WriteData(p,a,b,c)  ICOM_CALL3(WriteData,p,a,b,c)
741 #define IAVIFile_ReadData(p,a,b,c)   ICOM_CALL3(ReadData,p,a,b,c)
742 #define IAVIFile_EndRecord(p)        ICOM_CALL (EndRecord,p)
743 #define IAVIFile_DeleteStream(p,a,b) ICOM_CALL2(DeleteStream,p,a,b)
744
745 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE pfile,PAVISTREAM* ppavi,AVISTREAMINFOA* psi);
746 HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE pfile,PAVISTREAM* ppavi,AVISTREAMINFOW* psi);
747 #define AVIFileCreateStream WINELIB_NAME_AW(AVIFileCreateStream)
748 void WINAPI AVIFileExit(void);
749 HRESULT WINAPI AVIFileGetStream(PAVIFILE pfile,PAVISTREAM* avis,DWORD fccType,LONG lParam);
750 HRESULT WINAPI AVIFileInfoA(PAVIFILE pfile,PAVIFILEINFOA pfi,LONG lSize);
751 HRESULT WINAPI AVIFileInfoW(PAVIFILE pfile,PAVIFILEINFOW pfi,LONG lSize);
752 #define AVIFileInfo WINELIB_NAME_AW(AVIFileInfo)
753 void WINAPI AVIFileInit(void);
754 HRESULT WINAPI AVIFileOpenA(PAVIFILE* ppfile,LPCSTR szFile,UINT uMode,LPCLSID lpHandler);
755 HRESULT WINAPI AVIFileOpenW(PAVIFILE* ppfile,LPCWSTR szFile,UINT uMode,LPCLSID lpHandler);
756 #define AVIFileOpen WINELIB_NAME_AW(AVIFileOpen)
757 ULONG WINAPI AVIFileRelease(PAVIFILE iface);
758
759
760 /*****************************************************************************
761  * IGetFrame interface
762  */
763 #define ICOM_INTERFACE IGetFrame
764 #define IGetFrame_METHODS                                       \
765     ICOM_METHOD1(LPVOID, GetFrame,  LONG,lPos) \
766     ICOM_METHOD3(HRESULT,Begin,     LONG,lStart, LONG,lEnd, LONG,lRate) \
767         ICOM_METHOD (HRESULT,End)                               \
768     ICOM_METHOD6(HRESULT,SetFormat, LPBITMAPINFOHEADER,lpbi, LPVOID,lpBits, INT,x, INT,y, INT,dx, INT,dy)
769 #define IGetFrame_IMETHODS      \
770         IUnknown_IMETHODS       \
771         IGetFrame_METHODS
772 ICOM_DEFINE(IGetFrame,IUnknown)
773 #undef ICOM_INTERFACE
774
775 /*** IUnknown methods ***/
776 #define IGetFrame_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
777 #define IGetFrame_AddRef(p)             ICOM_CALL (AddRef,p)
778 #define IGetFrame_Release(p)            ICOM_CALL (Release,p)
779 /*** IGetFrame methods ***/
780 #define IGetFrame_GetFrame(p,a)            ICOM_CALL1(GetFrame,p,a)
781 #define IGetFrame_Begin(p,a,b,c)           ICOM_CALL3(Begin,p,a,b,c)
782 #define IGetFrame_End(p)                   ICOM_CALL (End,p)
783 #define IGetFrame_SetFormat(p,a,b,c,d,e,f) ICOM_CALL6(SetFormat,p,a,b,c,d,e,f)
784
785 #define AVIERR_OK               0
786 #define MAKE_AVIERR(error)      MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x4000+error)
787
788 #define AVIERR_UNSUPPORTED      MAKE_AVIERR(101)
789 #define AVIERR_BADFORMAT        MAKE_AVIERR(102)
790 #define AVIERR_MEMORY           MAKE_AVIERR(103)
791 #define AVIERR_INTERNAL         MAKE_AVIERR(104)
792 #define AVIERR_BADFLAGS         MAKE_AVIERR(105)
793 #define AVIERR_BADPARAM         MAKE_AVIERR(106)
794 #define AVIERR_BADSIZE          MAKE_AVIERR(107)
795 #define AVIERR_BADHANDLE        MAKE_AVIERR(108)
796 #define AVIERR_FILEREAD         MAKE_AVIERR(109)
797 #define AVIERR_FILEWRITE        MAKE_AVIERR(110)
798 #define AVIERR_FILEOPEN         MAKE_AVIERR(111)
799 #define AVIERR_COMPRESSOR       MAKE_AVIERR(112)
800 #define AVIERR_NOCOMPRESSOR     MAKE_AVIERR(113)
801 #define AVIERR_READONLY         MAKE_AVIERR(114)
802 #define AVIERR_NODATA           MAKE_AVIERR(115)
803 #define AVIERR_BUFFERTOOSMALL   MAKE_AVIERR(116)
804 #define AVIERR_CANTCOMPRESS     MAKE_AVIERR(117)
805 #define AVIERR_USERABORT        MAKE_AVIERR(198)
806 #define AVIERR_ERROR            MAKE_AVIERR(199)
807
808
809 #endif /* __WINE_VFW_H */