Added LGPL standard comment, and copyright notices where necessary.
[wine] / include / vfw.h
1 /*
2  * Copyright (C) the Wine project
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #ifndef __WINE_VFW_H
20 #define __WINE_VFW_H
21
22 #include "windef.h"
23 #include "mmsystem.h"
24 #include "wingdi.h"
25
26 #define VFWAPI  WINAPI
27 #define VFWAPIV WINAPIV
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif  /* __cplusplus */
32
33 typedef HANDLE HDRAWDIB;
34
35 DWORD       VFWAPI  VideoForWindowsVersion(void);
36 LONG        VFWAPI  InitVFW(void);
37 LONG        VFWAPI  TermVFW(void);
38
39 /*****************************************************************************
40  * Predeclare the interfaces
41  */
42 typedef struct IAVIStream IAVIStream,*PAVISTREAM;
43 typedef struct IAVIFile IAVIFile,*PAVIFILE;
44 typedef struct IGetFrame IGetFrame,*PGETFRAME;
45
46 /* Installable Compressor Manager */
47
48 DECLARE_HANDLE(HIC);
49
50 #ifdef __WINE__
51 /* HIC struct (same layout as Win95 one) */
52 typedef struct tagWINE_HIC {
53         DWORD           magic;          /* 00: 'Smag' */
54         HANDLE          curthread;      /* 04: */
55         DWORD           type;           /* 08: */
56         DWORD           handler;        /* 0C: */
57         HDRVR           hdrv;           /* 10: */
58         DWORD           private;        /* 14:(handled by SendDriverMessage)*/
59         FARPROC         driverproc;     /* 18:(handled by SendDriverMessage)*/
60         DWORD           x1;             /* 1c: name? */
61         WORD            x2;             /* 20: */
62         DWORD           x3;             /* 22: */
63                                         /* 26: */
64 } WINE_HIC;
65 #endif
66
67 /* error return codes */
68 #define ICERR_OK                0
69 #define ICERR_DONTDRAW          1
70 #define ICERR_NEWPALETTE        2
71 #define ICERR_GOTOKEYFRAME      3
72 #define ICERR_STOPDRAWING       4
73
74 #define ICERR_UNSUPPORTED       -1
75 #define ICERR_BADFORMAT         -2
76 #define ICERR_MEMORY            -3
77 #define ICERR_INTERNAL          -4
78 #define ICERR_BADFLAGS          -5
79 #define ICERR_BADPARAM          -6
80 #define ICERR_BADSIZE           -7
81 #define ICERR_BADHANDLE         -8
82 #define ICERR_CANTUPDATE        -9
83 #define ICERR_ABORT             -10
84 #define ICERR_ERROR             -100
85 #define ICERR_BADBITDEPTH       -200
86 #define ICERR_BADIMAGESIZE      -201
87
88 #define ICERR_CUSTOM            -400
89
90 /* ICM Messages */
91 #define ICM_USER                (DRV_USER+0x0000)
92
93 /* ICM driver message range */
94 #define ICM_RESERVED_LOW        (DRV_USER+0x1000)
95 #define ICM_RESERVED_HIGH       (DRV_USER+0x2000)
96 #define ICM_RESERVED            ICM_RESERVED_LOW
97
98 #define ICM_GETSTATE            (ICM_RESERVED+0)
99 #define ICM_SETSTATE            (ICM_RESERVED+1)
100 #define ICM_GETINFO             (ICM_RESERVED+2)
101
102 #define ICM_CONFIGURE           (ICM_RESERVED+10)
103 #define ICM_ABOUT               (ICM_RESERVED+11)
104 /* */
105
106 #define ICM_GETDEFAULTQUALITY   (ICM_RESERVED+30)
107 #define ICM_GETQUALITY          (ICM_RESERVED+31)
108 #define ICM_SETQUALITY          (ICM_RESERVED+32)
109
110 #define ICM_SET                 (ICM_RESERVED+40)
111 #define ICM_GET                 (ICM_RESERVED+41)
112
113 /* 2 constant FOURCC codes */
114 #define ICM_FRAMERATE           mmioFOURCC('F','r','m','R')
115 #define ICM_KEYFRAMERATE        mmioFOURCC('K','e','y','R')
116
117 #define ICM_COMPRESS_GET_FORMAT         (ICM_USER+4)
118 #define ICM_COMPRESS_GET_SIZE           (ICM_USER+5)
119 #define ICM_COMPRESS_QUERY              (ICM_USER+6)
120 #define ICM_COMPRESS_BEGIN              (ICM_USER+7)
121 #define ICM_COMPRESS                    (ICM_USER+8)
122 #define ICM_COMPRESS_END                (ICM_USER+9)
123
124 #define ICM_DECOMPRESS_GET_FORMAT       (ICM_USER+10)
125 #define ICM_DECOMPRESS_QUERY            (ICM_USER+11)
126 #define ICM_DECOMPRESS_BEGIN            (ICM_USER+12)
127 #define ICM_DECOMPRESS                  (ICM_USER+13)
128 #define ICM_DECOMPRESS_END              (ICM_USER+14)
129 #define ICM_DECOMPRESS_SET_PALETTE      (ICM_USER+29)
130 #define ICM_DECOMPRESS_GET_PALETTE      (ICM_USER+30)
131
132 #define ICM_DRAW_QUERY                  (ICM_USER+31)
133 #define ICM_DRAW_BEGIN                  (ICM_USER+15)
134 #define ICM_DRAW_GET_PALETTE            (ICM_USER+16)
135 #define ICM_DRAW_START                  (ICM_USER+18)
136 #define ICM_DRAW_STOP                   (ICM_USER+19)
137 #define ICM_DRAW_END                    (ICM_USER+21)
138 #define ICM_DRAW_GETTIME                (ICM_USER+32)
139 #define ICM_DRAW                        (ICM_USER+33)
140 #define ICM_DRAW_WINDOW                 (ICM_USER+34)
141 #define ICM_DRAW_SETTIME                (ICM_USER+35)
142 #define ICM_DRAW_REALIZE                (ICM_USER+36)
143 #define ICM_DRAW_FLUSH                  (ICM_USER+37)
144 #define ICM_DRAW_RENDERBUFFER           (ICM_USER+38)
145
146 #define ICM_DRAW_START_PLAY             (ICM_USER+39)
147 #define ICM_DRAW_STOP_PLAY              (ICM_USER+40)
148
149 #define ICM_DRAW_SUGGESTFORMAT          (ICM_USER+50)
150 #define ICM_DRAW_CHANGEPALETTE          (ICM_USER+51)
151
152 #define ICM_GETBUFFERSWANTED            (ICM_USER+41)
153
154 #define ICM_GETDEFAULTKEYFRAMERATE      (ICM_USER+42)
155
156 #define ICM_DECOMPRESSEX_BEGIN          (ICM_USER+60)
157 #define ICM_DECOMPRESSEX_QUERY          (ICM_USER+61)
158 #define ICM_DECOMPRESSEX                (ICM_USER+62)
159 #define ICM_DECOMPRESSEX_END            (ICM_USER+63)
160
161 #define ICM_COMPRESS_FRAMES_INFO        (ICM_USER+70)
162 #define ICM_SET_STATUS_PROC             (ICM_USER+72)
163
164 /* structs */
165
166 /* NOTE: Only the 16 bit structs are packed. Structs that are packed anyway
167  * have not been changed. If a structure is later extended, you may need to create
168  * two versions of it.
169  */
170
171 typedef struct {
172         DWORD   dwSize;         /* 00: size */
173         DWORD   fccType;        /* 04: type 'vidc' usually */
174         DWORD   fccHandler;     /* 08: */
175         DWORD   dwVersion;      /* 0c: version of compman opening you */
176         DWORD   dwFlags;        /* 10: LOWORD is type specific */
177         LRESULT dwError;        /* 14: */
178         LPVOID  pV1Reserved;    /* 18: */
179         LPVOID  pV2Reserved;    /* 1c: */
180         DWORD   dnDevNode;      /* 20: */
181                                 /* 24: */
182 } ICOPEN,*LPICOPEN;
183
184 #define ICCOMPRESS_KEYFRAME     0x00000001L
185
186 typedef struct {
187     DWORD               dwFlags;
188     LPBITMAPINFOHEADER  lpbiOutput;
189     LPVOID              lpOutput;
190     LPBITMAPINFOHEADER  lpbiInput;
191     LPVOID              lpInput;
192     LPDWORD             lpckid;
193     LPDWORD             lpdwFlags;
194     LONG                lFrameNum;
195     DWORD               dwFrameSize;
196     DWORD               dwQuality;
197     LPBITMAPINFOHEADER  lpbiPrev;
198     LPVOID              lpPrev;
199 } ICCOMPRESS;
200
201 DWORD VFWAPIV ICCompress(
202         HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiOutput,LPVOID lpData,
203         LPBITMAPINFOHEADER lpbiInput,LPVOID lpBits,LPDWORD lpckid,
204         LPDWORD lpdwFlags,LONG lFrameNum,DWORD dwFrameSize,DWORD dwQuality,
205         LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev
206 );
207
208 #define ICCompressGetFormat(hic, lpbiInput, lpbiOutput)                 \
209         ICSendMessage(                                                  \
210             hic,ICM_COMPRESS_GET_FORMAT,(DWORD)(LPVOID)(lpbiInput),     \
211             (DWORD)(LPVOID)(lpbiOutput)                                 \
212         )
213
214 #define ICCompressGetFormatSize(hic,lpbi) ICCompressGetFormat(hic,lpbi,NULL)
215
216 #define ICCompressBegin(hic, lpbiInput, lpbiOutput)                     \
217     ICSendMessage(                                                      \
218         hic, ICM_COMPRESS_BEGIN, (DWORD)(LPVOID)(lpbiInput),            \
219         (DWORD)(LPVOID)(lpbiOutput)                                     \
220     )
221
222 #define ICCompressGetSize(hic, lpbiInput, lpbiOutput)                   \
223     ICSendMessage(                                                      \
224         hic, ICM_COMPRESS_GET_SIZE, (DWORD)(LPVOID)(lpbiInput),         \
225         (DWORD)(LPVOID)(lpbiOutput)                                     \
226     )
227
228 #define ICCompressQuery(hic, lpbiInput, lpbiOutput)             \
229     ICSendMessage(                                              \
230         hic, ICM_COMPRESS_QUERY, (DWORD)(LPVOID)(lpbiInput),    \
231         (DWORD)(LPVOID)(lpbiOutput)                             \
232     )
233
234 #define ICCompressEnd(hic) ICSendMessage(hic, ICM_COMPRESS_END, 0, 0)
235
236 /* ICCOMPRESSFRAMES.dwFlags */
237 #define ICCOMPRESSFRAMES_PADDING        0x00000001
238 typedef struct {
239     DWORD               dwFlags;
240     LPBITMAPINFOHEADER  lpbiOutput;
241     LPARAM              lOutput;
242     LPBITMAPINFOHEADER  lpbiInput;
243     LPARAM              lInput;
244     LONG                lStartFrame;
245     LONG                lFrameCount;
246     LONG                lQuality;
247     LONG                lDataRate;
248     LONG                lKeyRate;
249     DWORD               dwRate;
250     DWORD               dwScale;
251     DWORD               dwOverheadPerFrame;
252     DWORD               dwReserved2;
253     LONG (CALLBACK *GetData)(LPARAM lInput,LONG lFrame,LPVOID lpBits,LONG len);
254     LONG (CALLBACK *PutData)(LPARAM lOutput,LONG lFrame,LPVOID lpBits,LONG len);
255 } ICCOMPRESSFRAMES;
256
257 typedef struct {
258     DWORD               dwFlags;
259     LPARAM              lParam;
260    /* messages for Status callback */
261 #define ICSTATUS_START      0
262 #define ICSTATUS_STATUS     1
263 #define ICSTATUS_END        2
264 #define ICSTATUS_ERROR      3
265 #define ICSTATUS_YIELD      4
266     /* FIXME: some X11 libs define Status as int... */
267     /* LONG (CALLBACK *zStatus)(LPARAM lParam, UINT message, LONG l); */
268     LONG (CALLBACK *zStatus)(LPARAM lParam, UINT message, LONG l);
269 } ICSETSTATUSPROC;
270
271 /* Values for wMode of ICOpen() */
272 #define ICMODE_COMPRESS         1
273 #define ICMODE_DECOMPRESS       2
274 #define ICMODE_FASTDECOMPRESS   3
275 #define ICMODE_QUERY            4
276 #define ICMODE_FASTCOMPRESS     5
277 #define ICMODE_DRAW             8
278
279 /* quality flags */
280 #define ICQUALITY_LOW       0
281 #define ICQUALITY_HIGH      10000
282 #define ICQUALITY_DEFAULT   -1
283
284 typedef struct {
285         DWORD   dwSize;         /* 00: */
286         DWORD   fccType;        /* 04:compressor type     'vidc' 'audc' */
287         DWORD   fccHandler;     /* 08:compressor sub-type 'rle ' 'jpeg' 'pcm '*/
288         DWORD   dwFlags;        /* 0c:flags LOWORD is type specific */
289         DWORD   dwVersion;      /* 10:version of the driver */
290         DWORD   dwVersionICM;   /* 14:version of the ICM used */
291         /*
292          * under Win32, the driver always returns UNICODE strings.
293          */
294         WCHAR   szName[16];             /* 18:short name */
295         WCHAR   szDescription[128];     /* 38:long name */
296         WCHAR   szDriver[128];          /* 138:driver that contains compressor*/
297                                         /* 238: */
298 } ICINFO;
299
300 /* ICINFO.dwFlags */
301 #define VIDCF_QUALITY           0x0001  /* supports quality */
302 #define VIDCF_CRUNCH            0x0002  /* supports crunching to a frame size */
303 #define VIDCF_TEMPORAL          0x0004  /* supports inter-frame compress */
304 #define VIDCF_COMPRESSFRAMES    0x0008  /* wants the compress all frames message */
305 #define VIDCF_DRAW              0x0010  /* supports drawing */
306 #define VIDCF_FASTTEMPORALC     0x0020  /* does not need prev frame on compress */
307 #define VIDCF_FASTTEMPORALD     0x0080  /* does not need prev frame on decompress */
308 #define VIDCF_QUALITYTIME       0x0040  /* supports temporal quality */
309
310 #define VIDCF_FASTTEMPORAL      (VIDCF_FASTTEMPORALC|VIDCF_FASTTEMPORALD)
311
312
313 /* function shortcuts */
314 /* ICM_ABOUT */
315 #define ICMF_ABOUT_QUERY         0x00000001
316
317 #define ICQueryAbout(hic) \
318         (ICSendMessage(hic,ICM_ABOUT,(DWORD)-1,ICMF_ABOUT_QUERY)==ICERR_OK)
319
320 #define ICAbout(hic, hwnd) ICSendMessage(hic,ICM_ABOUT,(DWORD)(UINT)(hwnd),0)
321
322 /* ICM_CONFIGURE */
323 #define ICMF_CONFIGURE_QUERY    0x00000001
324 #define ICQueryConfigure(hic) \
325         (ICSendMessage(hic,ICM_CONFIGURE,(DWORD)-1,ICMF_CONFIGURE_QUERY)==ICERR_OK)
326
327 #define ICConfigure(hic,hwnd) \
328         ICSendMessage(hic,ICM_CONFIGURE,(DWORD)(UINT)(hwnd),0)
329
330 /* Decompression stuff */
331 #define ICDECOMPRESS_HURRYUP            0x80000000      /* don't draw just buffer (hurry up!) */
332 #define ICDECOMPRESS_UPDATE             0x40000000      /* don't draw just update screen */
333 #define ICDECOMPRESS_PREROLL            0x20000000      /* this frame is before real start */
334 #define ICDECOMPRESS_NULLFRAME          0x10000000      /* repeat last frame */
335 #define ICDECOMPRESS_NOTKEYFRAME        0x08000000      /* this frame is not a key frame */
336
337 typedef struct {
338     DWORD               dwFlags;        /* flags (from AVI index...) */
339     LPBITMAPINFOHEADER  lpbiInput;      /* BITMAPINFO of compressed data */
340     LPVOID              lpInput;        /* compressed data */
341     LPBITMAPINFOHEADER  lpbiOutput;     /* DIB to decompress to */
342     LPVOID              lpOutput;
343     DWORD               ckid;           /* ckid from AVI file */
344 } ICDECOMPRESS;
345
346 typedef struct {
347     DWORD               dwFlags;
348     LPBITMAPINFOHEADER  lpbiSrc;
349     LPVOID              lpSrc;
350     LPBITMAPINFOHEADER  lpbiDst;
351     LPVOID              lpDst;
352
353     /* changed for ICM_DECOMPRESSEX */
354     INT                 xDst;       /* destination rectangle */
355     INT                 yDst;
356     INT                 dxDst;
357     INT                 dyDst;
358
359     INT                 xSrc;       /* source rectangle */
360     INT                 ySrc;
361     INT                 dxSrc;
362     INT                 dySrc;
363 } ICDECOMPRESSEX;
364
365 DWORD VFWAPIV ICDecompress(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,LPVOID lpData,LPBITMAPINFOHEADER lpbi,LPVOID lpBits);
366
367 #define ICDecompressBegin(hic, lpbiInput, lpbiOutput)   \
368     ICSendMessage(                                              \
369         hic, ICM_DECOMPRESS_BEGIN, (DWORD)(LPVOID)(lpbiInput),  \
370         (DWORD)(LPVOID)(lpbiOutput)                             \
371     )
372
373 #define ICDecompressQuery(hic, lpbiInput, lpbiOutput)   \
374     ICSendMessage(                                              \
375         hic,ICM_DECOMPRESS_QUERY, (DWORD)(LPVOID)(lpbiInput),   \
376         (DWORD) (LPVOID)(lpbiOutput)                            \
377     )
378
379 #define ICDecompressGetFormat(hic, lpbiInput, lpbiOutput)               \
380     ((LONG)ICSendMessage(                                               \
381         hic,ICM_DECOMPRESS_GET_FORMAT, (DWORD)(LPVOID)(lpbiInput),      \
382         (DWORD)(LPVOID)(lpbiOutput)                                     \
383     ))
384
385 #define ICDecompressGetFormatSize(hic, lpbi)                            \
386         ICDecompressGetFormat(hic, lpbi, NULL)
387
388 #define ICDecompressGetPalette(hic, lpbiInput, lpbiOutput)              \
389     ICSendMessage(                                                      \
390         hic, ICM_DECOMPRESS_GET_PALETTE, (DWORD)(LPVOID)(lpbiInput),    \
391         (DWORD)(LPVOID)(lpbiOutput)                                     \
392     )
393
394 #define ICDecompressSetPalette(hic,lpbiPalette) \
395         ICSendMessage(                          \
396                 hic,ICM_DECOMPRESS_SET_PALETTE,         \
397                 (DWORD)(LPVOID)(lpbiPalette),0          \
398         )
399
400 #define ICDecompressEnd(hic) ICSendMessage(hic, ICM_DECOMPRESS_END, 0, 0)
401
402 LRESULT VFWAPI  ICSendMessage(HIC hic, UINT msg, DWORD dw1, DWORD dw2);
403
404 inline static LRESULT VFWAPI ICDecompressEx(HIC hic, DWORD dwFlags, 
405                                             LPBITMAPINFOHEADER lpbiSrc, LPVOID lpSrc,
406                                             int xSrc, int ySrc, int dxSrc, int dySrc,
407                                             LPBITMAPINFOHEADER lpbiDst, LPVOID lpDst,
408                                             int xDst, int yDst, int dxDst, int dyDst)
409 {
410     ICDECOMPRESSEX ic;
411
412     ic.dwFlags = dwFlags;
413     ic.lpbiSrc = lpbiSrc;
414     ic.lpSrc = lpSrc;
415     ic.xSrc = xSrc;
416     ic.ySrc = ySrc;
417     ic.dxSrc = dxSrc;
418     ic.dySrc = dySrc;
419     ic.lpbiDst = lpbiDst;
420     ic.lpDst = lpDst;
421     ic.xDst = xDst;
422     ic.yDst = yDst;
423     ic.dxDst = dxDst;
424     ic.dyDst = dyDst;
425     return ICSendMessage(hic, ICM_DECOMPRESSEX, (DWORD)&ic, sizeof(ic));
426 }
427
428 inline static LRESULT VFWAPI ICDecompressExBegin(HIC hic, DWORD dwFlags,
429                                                  LPBITMAPINFOHEADER lpbiSrc,
430                                                  LPVOID lpSrc,
431                                                  int xSrc, int ySrc, int dxSrc, int dySrc,
432                                                  LPBITMAPINFOHEADER lpbiDst,
433                                                  LPVOID lpDst,
434                                                  int xDst,
435                                                  int yDst,
436                                                  int dxDst,
437                                                  int dyDst)
438 {
439     ICDECOMPRESSEX ic;
440
441     ic.dwFlags = dwFlags;
442     ic.lpbiSrc = lpbiSrc;
443     ic.lpSrc = lpSrc;
444     ic.xSrc = xSrc;
445     ic.ySrc = ySrc;
446     ic.dxSrc = dxSrc;
447     ic.dySrc = dySrc;
448     ic.lpbiDst = lpbiDst;
449     ic.lpDst = lpDst;
450     ic.xDst = xDst;
451     ic.yDst = yDst;
452     ic.dxDst = dxDst;
453     ic.dyDst = dyDst;
454     return ICSendMessage(hic, ICM_DECOMPRESSEX_BEGIN, (DWORD)&ic, sizeof(ic));
455 }
456 inline static LRESULT VFWAPI ICDecompressExQuery(HIC hic, DWORD dwFlags,
457                                                  LPBITMAPINFOHEADER lpbiSrc,
458                                                  LPVOID lpSrc,
459                                                  int xSrc, int ySrc, int dxSrc, int dySrc,
460                                                  LPBITMAPINFOHEADER lpbiDst,
461                                                  LPVOID lpDst,
462                                                  int xDst,
463                                                  int yDst,
464                                                  int dxDst,
465                                                  int dyDst)
466 {
467     ICDECOMPRESSEX ic;
468
469     ic.dwFlags = dwFlags;
470     ic.lpbiSrc = lpbiSrc;
471     ic.lpSrc = lpSrc;
472     ic.xSrc = xSrc;
473     ic.ySrc = ySrc;
474     ic.dxSrc = dxSrc;
475     ic.dySrc = dySrc;
476     ic.lpbiDst = lpbiDst;
477     ic.lpDst = lpDst;
478     ic.xDst = xDst;
479     ic.yDst = yDst;
480     ic.dxDst = dxDst;
481     ic.dyDst = dyDst;
482     return ICSendMessage(hic, ICM_DECOMPRESSEX_QUERY, (DWORD)&ic, sizeof(ic));
483 }
484
485 #define ICDecompressExEnd(hic) \
486     ICSendMessage(hic, ICM_DECOMPRESSEX_END, 0, 0)
487
488 #define ICDRAW_QUERY        0x00000001L   /* test for support */
489 #define ICDRAW_FULLSCREEN   0x00000002L   /* draw to full screen */
490 #define ICDRAW_HDC          0x00000004L   /* draw to a HDC/HWND */
491 #define ICDRAW_ANIMATE      0x00000008L   /* expect palette animation */
492 #define ICDRAW_CONTINUE     0x00000010L   /* draw is a continuation of previous draw */
493 #define ICDRAW_MEMORYDC     0x00000020L   /* DC is offscreen, by the way */
494 #define ICDRAW_UPDATING     0x00000040L   /* We're updating, as opposed to playing */
495 #define ICDRAW_RENDER       0x00000080L   /* used to render data not draw it */
496 #define ICDRAW_BUFFER       0x00000100L   /* buffer data offscreen, we will need to update it */
497
498 #define ICDecompressOpen(fccType, fccHandler, lpbiIn, lpbiOut) \
499     ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, ICMODE_DECOMPRESS)
500
501 #define ICDrawOpen(fccType, fccHandler, lpbiIn) \
502     ICLocate(fccType, fccHandler, lpbiIn, NULL, ICMODE_DRAW)
503
504 HANDLE VFWAPI ICImageCompress(HIC hic, UINT uiFlags, LPBITMAPINFO lpbiIn, 
505                               LPVOID lpBits, LPBITMAPINFO lpbiOut, LONG lQuality,
506                               LONG* plSize);
507
508 HANDLE VFWAPI ICImageDecompress(HIC hic, UINT uiFlags, LPBITMAPINFO lpbiIn,
509                                 LPVOID lpBits, LPBITMAPINFO lpbiOut);
510
511 BOOL    VFWAPI  ICInfo(DWORD fccType, DWORD fccHandler, ICINFO * lpicinfo);
512 BOOL    VFWAPI  ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDesc, UINT wFlags);
513 BOOL    VFWAPI  ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags);
514 LRESULT VFWAPI  ICGetInfo(HIC hic,ICINFO *picinfo, DWORD cb);
515 HIC     VFWAPI  ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode);
516 HIC     VFWAPI  ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler);
517
518 LRESULT VFWAPI  ICClose(HIC hic);
519 HIC     VFWAPI  ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags);
520 HIC     VFWAPI  ICGetDisplayFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, int BitDepth, int dx, int dy);
521
522 /* Values for wFlags of ICInstall() */
523 #define ICINSTALL_UNICODE       0x8000
524 #define ICINSTALL_FUNCTION      0x0001
525 #define ICINSTALL_DRIVER        0x0002
526 #define ICINSTALL_HDRV          0x0004
527 #define ICINSTALL_DRIVERW       0x8002
528
529 #define ICGetState(hic, pv, cb) \
530     ICSendMessage(hic, ICM_GETSTATE, (DWORD)(LPVOID)(pv), (DWORD)(cb))
531 #define ICSetState(hic, pv, cb) \
532     ICSendMessage(hic, ICM_SETSTATE, (DWORD)(LPVOID)(pv), (DWORD)(cb))
533 #define ICGetStateSize(hic) \
534     ICGetState(hic, NULL, 0)
535
536 inline static DWORD ICGetDefaultQuality(HIC hic)
537 {
538    DWORD dwICValue;
539    ICSendMessage(hic, ICM_GETDEFAULTQUALITY, (DWORD)(LPVOID)&dwICValue, sizeof(DWORD));
540    return dwICValue;
541 }
542
543 inline static DWORD ICGetDefaultKeyFrameRate(HIC hic)
544 {
545    DWORD dwICValue;
546    ICSendMessage(hic, ICM_GETDEFAULTKEYFRAMERATE, (DWORD)(LPVOID)&dwICValue, sizeof(DWORD));
547    return dwICValue;
548 }
549
550 #define ICDrawWindow(hic, prc) \
551     ICSendMessage(hic, ICM_DRAW_WINDOW, (DWORD)(LPVOID)(prc), sizeof(RECT))
552
553 /* As passed to ICM_DRAW_SUGGESTFORMAT */
554 typedef struct {
555         DWORD dwFlags;
556         LPBITMAPINFOHEADER lpbiIn;
557         LPBITMAPINFOHEADER lpbiSuggest;
558         INT dxSrc;
559         INT dySrc;
560         INT dxDst;
561         INT dyDst;
562         HIC hicDecompressor;
563 } ICDRAWSUGGEST;
564
565 typedef struct {
566     DWORD               dwFlags;
567     int                 iStart;
568     int                 iLen;
569     LPPALETTEENTRY      lppe;
570 } ICPALETTE;
571
572 DWORD   VFWAPIV ICDrawBegin(
573         HIC                     hic,
574         DWORD                   dwFlags,/* flags */
575         HPALETTE                hpal,   /* palette to draw with */
576         HWND                    hwnd,   /* window to draw to */
577         HDC                     hdc,    /* HDC to draw to */
578         INT                     xDst,   /* destination rectangle */
579         INT                     yDst,
580         INT                     dxDst,
581         INT                     dyDst,
582         LPBITMAPINFOHEADER      lpbi,   /* format of frame to draw */
583         INT                     xSrc,   /* source rectangle */
584         INT                     ySrc,
585         INT                     dxSrc,
586         INT                     dySrc,
587         DWORD                   dwRate, /* frames/second = (dwRate/dwScale) */
588         DWORD                   dwScale
589 );
590
591 /* as passed to ICM_DRAW_BEGIN */
592 typedef struct {
593         DWORD           dwFlags;
594         HPALETTE        hpal;
595         HWND            hwnd;
596         HDC             hdc;
597         INT             xDst;
598         INT             yDst;
599         INT             dxDst;
600         INT             dyDst;
601         LPBITMAPINFOHEADER      lpbi;
602         INT             xSrc;
603         INT             ySrc;
604         INT             dxSrc;
605         INT             dySrc;
606         DWORD           dwRate;
607         DWORD           dwScale;
608 } ICDRAWBEGIN;
609
610 #define ICDRAW_HURRYUP      0x80000000L   /* don't draw just buffer (hurry up!) */
611 #define ICDRAW_UPDATE       0x40000000L   /* don't draw just update screen */
612 #define ICDRAW_PREROLL      0x20000000L   /* this frame is before real start */
613 #define ICDRAW_NULLFRAME    0x10000000L   /* repeat last frame */
614 #define ICDRAW_NOTKEYFRAME  0x08000000L   /* this frame is not a key frame */
615
616 typedef struct {
617         DWORD   dwFlags;
618         LPVOID  lpFormat;
619         LPVOID  lpData;
620         DWORD   cbData;
621         LONG    lTime;
622 } ICDRAW;
623
624 DWORD VFWAPIV ICDraw(HIC hic,DWORD dwFlags,LPVOID lpFormat,LPVOID lpData,DWORD cbData,LONG lTime);
625
626 inline static LRESULT VFWAPI ICDrawSuggestFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn,
627                                                  LPBITMAPINFOHEADER lpbiOut,
628                                                  int dxSrc, int dySrc, 
629                                                  int dxDst, int dyDst,
630                                                  HIC hicDecomp)
631 {
632     ICDRAWSUGGEST ic;
633
634     ic.lpbiIn = lpbiIn;
635     ic.lpbiSuggest = lpbiOut;
636     ic.dxSrc = dxSrc;
637     ic.dySrc = dySrc;
638     ic.dxDst = dxDst;
639     ic.dyDst = dyDst;
640     ic.hicDecompressor = hicDecomp;
641     return ICSendMessage(hic, ICM_DRAW_SUGGESTFORMAT, (DWORD)&ic, sizeof(ic));
642 }
643
644 #define ICDrawQuery(hic, lpbiInput) \
645     ICSendMessage(hic, ICM_DRAW_QUERY, (DWORD)(LPVOID)(lpbiInput), 0L)
646
647 #define ICDrawChangePalette(hic, lpbiInput) \
648     ICSendMessage(hic, ICM_DRAW_CHANGEPALETTE, (DWORD)(LPVOID)(lpbiInput), 0L)
649
650 #define ICGetBuffersWanted(hic, lpdwBuffers) \
651     ICSendMessage(hic, ICM_GETBUFFERSWANTED, (DWORD)(LPVOID)(lpdwBuffers), 0)
652
653 #define ICDrawEnd(hic) \
654     ICSendMessage(hic, ICM_DRAW_END, 0, 0)
655
656 #define ICDrawStart(hic) \
657     ICSendMessage(hic, ICM_DRAW_START, 0, 0)
658
659 #define ICDrawStartPlay(hic, lFrom, lTo) \
660     ICSendMessage(hic, ICM_DRAW_START_PLAY, (DWORD)(lFrom), (DWORD)(lTo))
661
662 #define ICDrawStop(hic) \
663     ICSendMessage(hic, ICM_DRAW_STOP, 0, 0)
664
665 #define ICDrawStopPlay(hic) \
666     ICSendMessage(hic, ICM_DRAW_STOP_PLAY, 0, 0)
667
668 #define ICDrawGetTime(hic, lplTime) \
669     ICSendMessage(hic, ICM_DRAW_GETTIME, (DWORD)(LPVOID)(lplTime), 0)
670
671 #define ICDrawSetTime(hic, lTime) \
672     ICSendMessage(hic, ICM_DRAW_SETTIME, (DWORD)lTime, 0)
673
674 #define ICDrawRealize(hic, hdc, fBackground) \
675     ICSendMessage(hic, ICM_DRAW_REALIZE, (DWORD)(UINT)(HDC)(hdc), (DWORD)(BOOL)(fBackground))
676
677 #define ICDrawFlush(hic) \
678     ICSendMessage(hic, ICM_DRAW_FLUSH, 0, 0)
679
680 #define ICDrawRenderBuffer(hic) \
681     ICSendMessage(hic, ICM_DRAW_RENDERBUFFER, 0, 0)
682
683 inline static LRESULT VFWAPI ICSetStatusProc(HIC hic, DWORD dwFlags, LRESULT lParam,
684                                              LONG (CALLBACK *fpfnStatus)(LPARAM, UINT, LONG))
685 {
686     ICSETSTATUSPROC ic;
687
688     ic.dwFlags = dwFlags;
689     ic.lParam = lParam;
690     /* FIXME: see comment in ICSETSTATUSPROC definition */
691     ic.zStatus = fpfnStatus;
692
693     return ICSendMessage(hic, ICM_SET_STATUS_PROC, (DWORD)&ic, sizeof(ic));
694 }
695
696 typedef struct {
697     LONG                cbSize;
698     DWORD               dwFlags;
699     HIC                 hic;
700     DWORD               fccType;
701     DWORD               fccHandler;
702     LPBITMAPINFO        lpbiIn;
703     LPBITMAPINFO        lpbiOut;
704     LPVOID              lpBitsOut;
705     LPVOID              lpBitsPrev;
706     LONG                lFrame;
707     LONG                lKey;
708     LONG                lDataRate;
709     LONG                lQ;
710     LONG                lKeyCount;
711     LPVOID              lpState;
712     LONG                cbState;
713 } COMPVARS, *PCOMPVARS;
714
715 #define ICMF_COMPVARS_VALID     0x00000001
716
717 BOOL VFWAPI ICCompressorChoose(HWND hwnd, UINT uiFlags, LPVOID pvIn, LPVOID lpData,
718                                PCOMPVARS pc, LPSTR lpszTitle);
719
720 #define ICMF_CHOOSE_KEYFRAME            0x0001
721 #define ICMF_CHOOSE_DATARATE            0x0002
722 #define ICMF_CHOOSE_PREVIEW             0x0004
723 #define ICMF_CHOOSE_ALLCOMPRESSORS      0x0008
724
725 BOOL VFWAPI ICSeqCompressFrameStart(PCOMPVARS pc, LPBITMAPINFO lpbiIn);
726 void VFWAPI ICSeqCompressFrameEnd(PCOMPVARS pc);
727
728 LPVOID VFWAPI ICSeqCompressFrame(PCOMPVARS pc, UINT uiFlags, LPVOID lpBits,
729                                  BOOL *pfKey, LONG *plSize);
730 void VFWAPI ICCompressorFree(PCOMPVARS pc);
731
732 /********************* AVIFILE function declarations *************************/
733
734 #ifndef mmioFOURCC
735 #define mmioFOURCC( ch0, ch1, ch2, ch3 )                                \
736         ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |            \
737         ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
738 #endif
739
740 #ifndef aviTWOCC
741 #define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8))
742 #endif
743
744 typedef WORD TWOCC;
745
746 #define ICTYPE_VIDEO            mmioFOURCC('v', 'i', 'd', 'c')
747 #define ICTYPE_AUDIO            mmioFOURCC('a', 'u', 'd', 'c')
748
749 #define formtypeAVI             mmioFOURCC('A', 'V', 'I', ' ')
750 #define listtypeAVIHEADER       mmioFOURCC('h', 'd', 'r', 'l')
751 #define ckidAVIMAINHDR          mmioFOURCC('a', 'v', 'i', 'h')
752 #define listtypeSTREAMHEADER    mmioFOURCC('s', 't', 'r', 'l')
753 #define ckidSTREAMHEADER        mmioFOURCC('s', 't', 'r', 'h')
754 #define ckidSTREAMFORMAT        mmioFOURCC('s', 't', 'r', 'f')
755 #define ckidSTREAMHANDLERDATA   mmioFOURCC('s', 't', 'r', 'd')
756 #define ckidSTREAMNAME          mmioFOURCC('s', 't', 'r', 'n')
757
758 #define listtypeAVIMOVIE        mmioFOURCC('m', 'o', 'v', 'i')
759 #define listtypeAVIRECORD       mmioFOURCC('r', 'e', 'c', ' ')
760
761 #define ckidAVINEWINDEX         mmioFOURCC('i', 'd', 'x', '1')
762
763 #define streamtypeVIDEO         mmioFOURCC('v', 'i', 'd', 's')
764 #define streamtypeAUDIO         mmioFOURCC('a', 'u', 'd', 's')
765 #define streamtypeMIDI          mmioFOURCC('m', 'i', 'd', 's')
766 #define streamtypeTEXT          mmioFOURCC('t', 'x', 't', 's')
767
768 /* Basic chunk types */
769 #define cktypeDIBbits           aviTWOCC('d', 'b')
770 #define cktypeDIBcompressed     aviTWOCC('d', 'c')
771 #define cktypePALchange         aviTWOCC('p', 'c')
772 #define cktypeWAVEbytes         aviTWOCC('w', 'b')
773
774 /* Chunk id to use for extra chunks for padding. */
775 #define ckidAVIPADDING          mmioFOURCC('J', 'U', 'N', 'K')
776
777 #define FromHex(n)              (((n) >= 'A') ? ((n) + 10 - 'A') : ((n) - '0'))
778 #define StreamFromFOURCC(fcc)   ((WORD)((FromHex(LOBYTE(LOWORD(fcc))) << 4) + \
779                                         (FromHex(HIBYTE(LOWORD(fcc))))))
780 #define TWOCCFromFOURCC(fcc)    HIWORD(fcc)
781 #define ToHex(n)                ((BYTE)(((n) > 9) ? ((n) - 10 + 'A') : ((n) + '0')))
782 #define MAKEAVICKID(tcc, stream) \
783                                 MAKELONG((ToHex((stream) & 0x0f) << 8) | \
784                                          (ToHex(((stream) & 0xf0) >> 4)), tcc)
785
786 /* AVIFileHdr.dwFlags */
787 #define AVIF_HASINDEX           0x00000010      /* Index at end of file? */
788 #define AVIF_MUSTUSEINDEX       0x00000020
789 #define AVIF_ISINTERLEAVED      0x00000100
790 #define AVIF_TRUSTCKTYPE        0x00000800      /* Use CKType to find key frames*/
791 #define AVIF_WASCAPTUREFILE     0x00010000
792 #define AVIF_COPYRIGHTED        0x00020000
793
794 #define AVI_HEADERSIZE  2048
795
796 typedef struct _MainAVIHeader
797 {
798     DWORD       dwMicroSecPerFrame;
799     DWORD       dwMaxBytesPerSec;
800     DWORD       dwPaddingGranularity;
801     DWORD       dwFlags;
802     DWORD       dwTotalFrames;
803     DWORD       dwInitialFrames;
804     DWORD       dwStreams;
805     DWORD       dwSuggestedBufferSize;
806     DWORD       dwWidth;
807     DWORD       dwHeight;
808     DWORD       dwReserved[4];
809 } MainAVIHeader;
810
811 /* AVIStreamHeader.dwFlags */
812 #define AVISF_DISABLED                  0x00000001
813 #define AVISF_VIDEO_PALCHANGES          0x00010000
814
815 typedef struct {
816     FOURCC      fccType;
817     FOURCC      fccHandler;
818     DWORD       dwFlags;        /* AVISF_* */
819     WORD        wPriority;
820     WORD        wLanguage;
821     DWORD       dwInitialFrames;
822     DWORD       dwScale;        
823     DWORD       dwRate; /* dwRate / dwScale == samples/second */
824     DWORD       dwStart;
825     DWORD       dwLength; /* In units above... */
826     DWORD       dwSuggestedBufferSize;
827     DWORD       dwQuality;
828     DWORD       dwSampleSize;
829     struct { SHORT left, top, right, bottom; } rcFrame; /* word.word - word.word in file */
830 } AVIStreamHeader;
831
832 /* AVIINDEXENTRY.dwFlags */
833 #define AVIIF_LIST      0x00000001      /* chunk is a 'LIST' */
834 #define AVIIF_TWOCC     0x00000002
835 #define AVIIF_KEYFRAME  0x00000010      /* this frame is a key frame. */
836
837 #define AVIIF_NOTIME    0x00000100      /* this frame doesn't take any time */
838 #define AVIIF_COMPUSE   0x0FFF0000
839
840 typedef struct _AVIINDEXENTRY {
841     DWORD       ckid;
842     DWORD       dwFlags;
843     DWORD       dwChunkOffset;
844     DWORD       dwChunkLength;
845 } AVIINDEXENTRY;
846
847 typedef struct _AVIPALCHANGE {
848     BYTE                bFirstEntry;
849     BYTE                bNumEntries;
850     WORD                wFlags;         /* pad */
851     PALETTEENTRY        peNew[1];
852 } AVIPALCHANGE;
853
854 #define AVIIF_KEYFRAME  0x00000010      /* this frame is a key frame. */
855
856 #define AVIGETFRAMEF_BESTDISPLAYFMT     1
857
858 typedef struct _AVISTREAMINFOA {
859     DWORD       fccType;
860     DWORD       fccHandler;
861     DWORD       dwFlags;        /* AVIIF_* */
862     DWORD       dwCaps;
863     WORD        wPriority;
864     WORD        wLanguage;
865     DWORD       dwScale;
866     DWORD       dwRate;         /* dwRate / dwScale == samples/second */
867     DWORD       dwStart;
868     DWORD       dwLength;       /* In units above... */
869     DWORD       dwInitialFrames;
870     DWORD       dwSuggestedBufferSize;
871     DWORD       dwQuality;
872     DWORD       dwSampleSize;
873     RECT        rcFrame;
874     DWORD       dwEditCount;
875     DWORD       dwFormatChangeCount;
876     CHAR        szName[64];
877 } AVISTREAMINFOA, * LPAVISTREAMINFOA, *PAVISTREAMINFOA;
878
879 typedef struct _AVISTREAMINFOW {
880     DWORD       fccType;
881     DWORD       fccHandler;
882     DWORD       dwFlags;
883     DWORD       dwCaps;
884     WORD        wPriority;
885     WORD        wLanguage;
886     DWORD       dwScale;
887     DWORD       dwRate;         /* dwRate / dwScale == samples/second */
888     DWORD       dwStart;
889     DWORD       dwLength;       /* In units above... */
890     DWORD       dwInitialFrames;
891     DWORD       dwSuggestedBufferSize;
892     DWORD       dwQuality;
893     DWORD       dwSampleSize;
894     RECT        rcFrame;
895     DWORD       dwEditCount;
896     DWORD       dwFormatChangeCount;
897     WCHAR       szName[64];
898 } AVISTREAMINFOW, * LPAVISTREAMINFOW, *PAVISTREAMINFOW;
899 DECL_WINELIB_TYPE_AW(AVISTREAMINFO)
900 DECL_WINELIB_TYPE_AW(LPAVISTREAMINFO)
901 DECL_WINELIB_TYPE_AW(PAVISTREAMINFO)
902
903 #define AVISTREAMINFO_DISABLED          0x00000001
904 #define AVISTREAMINFO_FORMATCHANGES     0x00010000
905
906 /* AVIFILEINFO.dwFlags */
907 #define AVIFILEINFO_HASINDEX            0x00000010
908 #define AVIFILEINFO_MUSTUSEINDEX        0x00000020
909 #define AVIFILEINFO_ISINTERLEAVED       0x00000100
910 #define AVIFILEINFO_WASCAPTUREFILE      0x00010000
911 #define AVIFILEINFO_COPYRIGHTED         0x00020000
912
913 /* AVIFILEINFO.dwCaps */
914 #define AVIFILECAPS_CANREAD             0x00000001
915 #define AVIFILECAPS_CANWRITE            0x00000002
916 #define AVIFILECAPS_ALLKEYFRAMES        0x00000010
917 #define AVIFILECAPS_NOCOMPRESSION       0x00000020
918
919 typedef struct _AVIFILEINFOW {
920     DWORD               dwMaxBytesPerSec;
921     DWORD               dwFlags;
922     DWORD               dwCaps;
923     DWORD               dwStreams;
924     DWORD               dwSuggestedBufferSize;
925     DWORD               dwWidth;
926     DWORD               dwHeight;
927     DWORD               dwScale;        
928     DWORD               dwRate;
929     DWORD               dwLength;
930     DWORD               dwEditCount;
931     WCHAR               szFileType[64];
932 } AVIFILEINFOW, * LPAVIFILEINFOW, *PAVIFILEINFOW;
933 typedef struct _AVIFILEINFOA {
934     DWORD               dwMaxBytesPerSec;
935     DWORD               dwFlags;
936     DWORD               dwCaps;
937     DWORD               dwStreams;
938     DWORD               dwSuggestedBufferSize;
939     DWORD               dwWidth;
940     DWORD               dwHeight;
941     DWORD               dwScale;        
942     DWORD               dwRate;
943     DWORD               dwLength;
944     DWORD               dwEditCount;
945     CHAR                szFileType[64];
946 } AVIFILEINFOA, * LPAVIFILEINFOA, *PAVIFILEINFOA;
947 DECL_WINELIB_TYPE_AW(AVIFILEINFO)
948 DECL_WINELIB_TYPE_AW(PAVIFILEINFO)
949 DECL_WINELIB_TYPE_AW(LPAVIFILEINFO)
950
951 /* AVICOMPRESSOPTIONS.dwFlags. determines presence of fields in below struct */
952 #define AVICOMPRESSF_INTERLEAVE 0x00000001
953 #define AVICOMPRESSF_DATARATE   0x00000002
954 #define AVICOMPRESSF_KEYFRAMES  0x00000004
955 #define AVICOMPRESSF_VALID      0x00000008
956
957 typedef struct {
958     DWORD       fccType;                /* stream type, for consistency */
959     DWORD       fccHandler;             /* compressor */
960     DWORD       dwKeyFrameEvery;        /* keyframe rate */
961     DWORD       dwQuality;              /* compress quality 0-10,000 */
962     DWORD       dwBytesPerSecond;       /* bytes per second */
963     DWORD       dwFlags;                /* flags... see below */
964     LPVOID      lpFormat;               /* save format */
965     DWORD       cbFormat;
966     LPVOID      lpParms;                /* compressor options */
967     DWORD       cbParms;
968     DWORD       dwInterleaveEvery;      /* for non-video streams only */
969 } AVICOMPRESSOPTIONS, *LPAVICOMPRESSOPTIONS,*PAVICOMPRESSOPTIONS;
970
971 #include "ole2.h"
972
973 #define DEFINE_AVIGUID(name, l, w1, w2) \
974     DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
975
976 DEFINE_AVIGUID(IID_IAVIFile,            0x00020020, 0, 0);
977 DEFINE_AVIGUID(IID_IAVIStream,          0x00020021, 0, 0);
978 DEFINE_AVIGUID(IID_IAVIStreaming,       0x00020022, 0, 0);
979 DEFINE_AVIGUID(IID_IGetFrame,           0x00020023, 0, 0);
980 DEFINE_AVIGUID(IID_IAVIEditStream,      0x00020024, 0, 0);
981
982 DEFINE_AVIGUID(CLSID_AVIFile,           0x00020000, 0, 0);
983
984 /*****************************************************************************
985  * IAVIStream interface
986  */
987 #define ICOM_INTERFACE IAVIStream
988 #define IAVIStream_METHODS                                              \
989     ICOM_METHOD2(HRESULT,Create,     LPARAM,lParam1, LPARAM,lParam2) \
990     ICOM_METHOD2(HRESULT,Info,       AVISTREAMINFOW*,psi, LONG,lSize) \
991     ICOM_METHOD2(LONG,   FindSample, LONG,lPos, LONG,lFlags) \
992     ICOM_METHOD3(HRESULT,ReadFormat, LONG,lPos, LPVOID,lpFormat, LONG*,lpcbFormat) \
993     ICOM_METHOD3(HRESULT,SetFormat,  LONG,lPos, LPVOID,lpFormat, LONG,cbFormat) \
994     ICOM_METHOD6(HRESULT,Read,       LONG,lStart, LONG,lSamples, LPVOID,lpBuffer, LONG,cbBuffer, LONG*,plBytes, LONG*,plSamples) \
995     ICOM_METHOD7(HRESULT,Write,      LONG,lStart, LONG,lSamples, LPVOID,lpBuffer, LONG,cbBuffer, DWORD,dwFlags, LONG*,plSampWritten, LONG*,plBytesWritten) \
996     ICOM_METHOD2(HRESULT,Delete,     LONG,lStart, LONG,lSamples) \
997     ICOM_METHOD3(HRESULT,ReadData,   DWORD,fcc, LPVOID,lpBuffer, LONG*,lpcbBuffer) \
998     ICOM_METHOD3(HRESULT,WriteData,  DWORD,fcc, LPVOID,lpBuffer, LONG,cbBuffer) \
999     ICOM_METHOD2(HRESULT,SetInfo,    AVISTREAMINFOW*,plInfo, LONG,cbInfo)
1000 #define IAVIStream_IMETHODS     \
1001         IUnknown_IMETHODS       \
1002         IAVIStream_METHODS
1003 ICOM_DEFINE(IAVIStream, IUnknown)
1004 #undef ICOM_INTERFACE
1005
1006 /*** IUnknown methods ***/
1007 #define IAVIStream_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
1008 #define IAVIStream_AddRef(p)             ICOM_CALL (AddRef,p)
1009 #define IAVIStream_Release(p)            ICOM_CALL (Release,p)
1010 /*** IAVIStream methods ***/
1011 #define IAVIStream_Create(p,a,b)          ICOM_CALL2(Create,p,a,b)
1012 #define IAVIStream_Info(p,a,b)            ICOM_CALL2(Info,p,a,b)
1013 #define IAVIStream_FindSample(p,a,b)      ICOM_CALL2(FindSample,p,a,b)
1014 #define IAVIStream_ReadFormat(p,a,b,c)    ICOM_CALL3(ReadFormat,p,a,b,c)
1015 #define IAVIStream_SetFormat(p,a,b,c)     ICOM_CALL3(SetFormat,p,a,b,c)
1016 #define IAVIStream_Read(p,a,b,c,d,e,f)    ICOM_CALL6(Read,p,a,b,c,d,e,f)
1017 #define IAVIStream_Write(p,a,b,c,d,e,f,g) ICOM_CALL7(Write,p,a,b,c,d,e,f,g)
1018 #define IAVIStream_Delete(p,a,b)          ICOM_CALL2(Delete,p,a,b)
1019 #define IAVIStream_ReadData(p,a,b,c)      ICOM_CALL3(ReadData,p,a,b,c)
1020 #define IAVIStream_WriteData(p,a,b,c)     ICOM_CALL3(WriteData,p,a,b,c)
1021 #define IAVIStream_SetInfo(p,a,b)         ICOM_CALL2(SetInfo,p,a,b)
1022
1023 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM*ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *lpOptions,CLSID*pclsidHandler); 
1024
1025 HRESULT WINAPI AVIStreamCreate(PAVISTREAM*,LONG,LONG,CLSID*);
1026 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM iface,AVISTREAMINFOA *asi,LONG size);
1027 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM iface,AVISTREAMINFOW *asi,LONG size);
1028 #define AVIStreamInfo WINELIB_NAME_AW(AVIStreamInfo)
1029 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pg,LONG pos);
1030 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pg);
1031 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM pavi,LPBITMAPINFOHEADER lpbiWanted);
1032 LONG WINAPI AVIStreamLength(PAVISTREAM iface);
1033 HRESULT WINAPI AVIStreamRead(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread);
1034 HRESULT WINAPI AVIStreamReadData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG *lpread);
1035 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG *formatsize);
1036 ULONG WINAPI AVIStreamRelease(PAVISTREAM iface);
1037 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG formatsize);
1038 LONG WINAPI AVIStreamStart(PAVISTREAM iface);
1039 HRESULT WINAPI AVIStreamWrite(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten);
1040 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG size);
1041 HRESULT WINAPI AVIStreamOpenFromFileA(PAVISTREAM *ppavi, LPCSTR szFile,
1042                                       DWORD fccType, LONG lParam,
1043                                       UINT mode, CLSID *pclsidHandler);
1044 HRESULT WINAPI AVIStreamOpenFromFileW(PAVISTREAM *ppavi, LPCWSTR szFile,
1045                                       DWORD fccType, LONG lParam,
1046                                       UINT mode, CLSID *pclsidHandler);
1047 #define AVIStreamOpenFromFile WINELIB_NAME_AW(AVIStreamOpenFromFile)
1048
1049 #define AVIStreamFormatSize(pavi, lPos, plSize) \
1050     AVIStreamReadFormat(pavi, lPos, NULL, plSize) 
1051
1052 /*****************************************************************************
1053  * IAVIFile interface
1054  */
1055 /* In Win32 this interface uses UNICODE only */
1056 #define ICOM_INTERFACE IAVIFile
1057 #define IAVIFile_METHODS                                                \
1058     ICOM_METHOD2(HRESULT,Info,         AVIFILEINFOW*,pfi, LONG,lSize) \
1059     ICOM_METHOD3(HRESULT,GetStream,    PAVISTREAM*,ppStream, DWORD,fccType, LONG,lParam) \
1060     ICOM_METHOD2(HRESULT,CreateStream, PAVISTREAM*,ppStream, AVISTREAMINFOW*,psi) \
1061     ICOM_METHOD3(HRESULT,WriteData,    DWORD,fcc, LPVOID,lpBuffer, LONG,cbBuffer) \
1062     ICOM_METHOD3(HRESULT,ReadData,     DWORD,fcc, LPVOID,lpBuffer, LONG*,lpcbBuffer) \
1063         ICOM_METHOD (HRESULT,EndRecord)                                 \
1064     ICOM_METHOD2(HRESULT,DeleteStream, DWORD,fccType, LONG,lParam)
1065 #define IAVIFile_IMETHODS       \
1066         IUnknown_IMETHODS       \
1067         IAVIFile_METHODS
1068 ICOM_DEFINE(IAVIFile,IUnknown)
1069 #undef ICOM_INTERFACE
1070
1071 /*** IUnknown methods ***/
1072 #define IAVIFile_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
1073 #define IAVIFile_AddRef(p)             ICOM_CALL (AddRef,p)
1074 #define IAVIFile_Release(p)            ICOM_CALL (Release,p)
1075 /*** IAVIFile methods ***/
1076 #define IAVIFile_Info(p,a,b)         ICOM_CALL2(Info,p,a,b)
1077 #define IAVIFile_GetStream(p,a,b,c)  ICOM_CALL3(GetStream,p,a,b,c)
1078 #define IAVIFile_CreateStream(p,a,b) ICOM_CALL2(CreateStream,p,a,b)
1079 #define IAVIFile_WriteData(p,a,b,c)  ICOM_CALL3(WriteData,p,a,b,c)
1080 #define IAVIFile_ReadData(p,a,b,c)   ICOM_CALL3(ReadData,p,a,b,c)
1081 #define IAVIFile_EndRecord(p)        ICOM_CALL (EndRecord,p)
1082 #define IAVIFile_DeleteStream(p,a,b) ICOM_CALL2(DeleteStream,p,a,b)
1083
1084 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE pfile,PAVISTREAM* ppavi,AVISTREAMINFOA* psi);
1085 HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE pfile,PAVISTREAM* ppavi,AVISTREAMINFOW* psi);
1086 #define AVIFileCreateStream WINELIB_NAME_AW(AVIFileCreateStream)
1087 void WINAPI AVIFileExit(void);
1088 HRESULT WINAPI AVIFileGetStream(PAVIFILE pfile,PAVISTREAM* avis,DWORD fccType,LONG lParam);
1089 HRESULT WINAPI AVIFileInfoA(PAVIFILE pfile,PAVIFILEINFOA pfi,LONG lSize);
1090 HRESULT WINAPI AVIFileInfoW(PAVIFILE pfile,PAVIFILEINFOW pfi,LONG lSize);
1091 #define AVIFileInfo WINELIB_NAME_AW(AVIFileInfo)
1092 void WINAPI AVIFileInit(void);
1093 HRESULT WINAPI AVIFileOpenA(PAVIFILE* ppfile,LPCSTR szFile,UINT uMode,LPCLSID lpHandler);
1094 HRESULT WINAPI AVIFileOpenW(PAVIFILE* ppfile,LPCWSTR szFile,UINT uMode,LPCLSID lpHandler);
1095 #define AVIFileOpen WINELIB_NAME_AW(AVIFileOpen)
1096 ULONG WINAPI AVIFileRelease(PAVIFILE iface);
1097
1098
1099 /*****************************************************************************
1100  * IGetFrame interface
1101  */
1102 #define ICOM_INTERFACE IGetFrame
1103 #define IGetFrame_METHODS                                       \
1104     ICOM_METHOD1(LPVOID, GetFrame,  LONG,lPos) \
1105     ICOM_METHOD3(HRESULT,Begin,     LONG,lStart, LONG,lEnd, LONG,lRate) \
1106         ICOM_METHOD (HRESULT,End)                               \
1107     ICOM_METHOD6(HRESULT,SetFormat, LPBITMAPINFOHEADER,lpbi, LPVOID,lpBits, INT,x, INT,y, INT,dx, INT,dy)
1108 #define IGetFrame_IMETHODS      \
1109         IUnknown_IMETHODS       \
1110         IGetFrame_METHODS
1111 ICOM_DEFINE(IGetFrame,IUnknown)
1112 #undef ICOM_INTERFACE
1113
1114 /*** IUnknown methods ***/
1115 #define IGetFrame_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
1116 #define IGetFrame_AddRef(p)             ICOM_CALL (AddRef,p)
1117 #define IGetFrame_Release(p)            ICOM_CALL (Release,p)
1118 /*** IGetFrame methods ***/
1119 #define IGetFrame_GetFrame(p,a)            ICOM_CALL1(GetFrame,p,a)
1120 #define IGetFrame_Begin(p,a,b,c)           ICOM_CALL3(Begin,p,a,b,c)
1121 #define IGetFrame_End(p)                   ICOM_CALL (End,p)
1122 #define IGetFrame_SetFormat(p,a,b,c,d,e,f) ICOM_CALL6(SetFormat,p,a,b,c,d,e,f)
1123
1124 #define AVIERR_OK               0
1125 #define MAKE_AVIERR(error)      MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x4000+error)
1126
1127 #define AVIERR_UNSUPPORTED      MAKE_AVIERR(101)
1128 #define AVIERR_BADFORMAT        MAKE_AVIERR(102)
1129 #define AVIERR_MEMORY           MAKE_AVIERR(103)
1130 #define AVIERR_INTERNAL         MAKE_AVIERR(104)
1131 #define AVIERR_BADFLAGS         MAKE_AVIERR(105)
1132 #define AVIERR_BADPARAM         MAKE_AVIERR(106)
1133 #define AVIERR_BADSIZE          MAKE_AVIERR(107)
1134 #define AVIERR_BADHANDLE        MAKE_AVIERR(108)
1135 #define AVIERR_FILEREAD         MAKE_AVIERR(109)
1136 #define AVIERR_FILEWRITE        MAKE_AVIERR(110)
1137 #define AVIERR_FILEOPEN         MAKE_AVIERR(111)
1138 #define AVIERR_COMPRESSOR       MAKE_AVIERR(112)
1139 #define AVIERR_NOCOMPRESSOR     MAKE_AVIERR(113)
1140 #define AVIERR_READONLY         MAKE_AVIERR(114)
1141 #define AVIERR_NODATA           MAKE_AVIERR(115)
1142 #define AVIERR_BUFFERTOOSMALL   MAKE_AVIERR(116)
1143 #define AVIERR_CANTCOMPRESS     MAKE_AVIERR(117)
1144 #define AVIERR_USERABORT        MAKE_AVIERR(198)
1145 #define AVIERR_ERROR            MAKE_AVIERR(199)
1146
1147 HWND        VFWAPIV MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance, DWORD dwStyle, LPCSTR szFile);
1148 HWND        VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance, DWORD dwStyle, LPCWSTR szFile);
1149 #define     MCIWndCreate WINELIB_NAME_AW(MCIWndCreate)
1150
1151 #define MCIWNDOPENF_NEW                 0x0001
1152
1153 #define MCIWNDF_NOAUTOSIZEWINDOW        0x0001
1154 #define MCIWNDF_NOPLAYBAR               0x0002
1155 #define MCIWNDF_NOAUTOSIZEMOVIE         0x0004
1156 #define MCIWNDF_NOMENU                  0x0008
1157 #define MCIWNDF_SHOWNAME                0x0010
1158 #define MCIWNDF_SHOWPOS                 0x0020
1159 #define MCIWNDF_SHOWMODE                0x0040
1160 #define MCIWNDF_SHOWALL                 0x0070
1161
1162 #define MCIWNDF_NOTIFYMODE              0x0100
1163 #define MCIWNDF_NOTIFYPOS               0x0200
1164 #define MCIWNDF_NOTIFYSIZE              0x0400
1165 #define MCIWNDF_NOTIFYERROR             0x1000
1166 #define MCIWNDF_NOTIFYALL               0x1F00
1167
1168 #define MCIWNDF_NOTIFYANSI              0x0080
1169
1170 #define MCIWNDF_NOTIFYMEDIAA            0x0880
1171 #define MCIWNDF_NOTIFYMEDIAW            0x0800
1172 #define MCIWNDF_NOTIFYMEDIA WINELIB_NAME_AW(MCIWNDF_NOTIFYMEDIA)
1173
1174 #define MCIWNDF_RECORD                  0x2000
1175 #define MCIWNDF_NOERRORDLG              0x4000
1176 #define MCIWNDF_NOOPEN                  0x8000
1177
1178 #ifdef __cplusplus
1179 #define MCIWndSM ::SendMessage
1180 #else
1181 #define MCIWndSM SendMessage
1182 #endif
1183
1184 #define MCIWndCanPlay(hWnd)         (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_PLAY,0,0)
1185 #define MCIWndCanRecord(hWnd)       (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_RECORD,0,0)
1186 #define MCIWndCanSave(hWnd)         (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_SAVE,0,0)
1187 #define MCIWndCanWindow(hWnd)       (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_WINDOW,0,0)
1188 #define MCIWndCanEject(hWnd)        (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_EJECT,0,0)
1189 #define MCIWndCanConfig(hWnd)       (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_CONFIG,0,0)
1190 #define MCIWndPaletteKick(hWnd)     (BOOL)MCIWndSM(hWnd,MCIWNDM_PALETTEKICK,0,0)
1191
1192 #define MCIWndSave(hWnd,szFile)     (LONG)MCIWndSM(hWnd,MCI_SAVE,0,(LPARAM)(LPVOID)(szFile))
1193 #define MCIWndSaveDialog(hWnd)      MCIWndSave(hWnd,-1)
1194
1195 #define MCIWndNew(hWnd,lp)          (LONG)MCIWndSM(hWnd,MCIWNDM_NEW,0,(LPARAM)(LPVOID)(lp))
1196
1197 #define MCIWndRecord(hWnd)          (LONG)MCIWndSM(hWnd,MCI_RECORD,0,0)
1198 #define MCIWndOpen(hWnd,sz,f)       (LONG)MCIWndSM(hWnd,MCIWNDM_OPEN,(WPARAM)(UINT)(f),(LPARAM)(LPVOID)(sz))
1199 #define MCIWndOpenDialog(hWnd)      MCIWndOpen(hWnd,-1,0)
1200 #define MCIWndClose(hWnd)           (LONG)MCIWndSM(hWnd,MCI_CLOSE,0,0)
1201 #define MCIWndPlay(hWnd)            (LONG)MCIWndSM(hWnd,MCI_PLAY,0,0)
1202 #define MCIWndStop(hWnd)            (LONG)MCIWndSM(hWnd,MCI_STOP,0,0)
1203 #define MCIWndPause(hWnd)           (LONG)MCIWndSM(hWnd,MCI_PAUSE,0,0)
1204 #define MCIWndResume(hWnd)          (LONG)MCIWndSM(hWnd,MCI_RESUME,0,0)
1205 #define MCIWndSeek(hWnd,lPos)       (LONG)MCIWndSM(hWnd,MCI_SEEK,0,(LPARAM)(LONG)(lPos))
1206 #define MCIWndEject(hWnd)           (LONG)MCIWndSM(hWnd,MCIWNDM_EJECT,0,0)
1207
1208 #define MCIWndHome(hWnd)            MCIWndSeek(hWnd,MCIWND_START)
1209 #define MCIWndEnd(hWnd)             MCIWndSeek(hWnd,MCIWND_END)
1210
1211 #define MCIWndGetSource(hWnd,prc)   (LONG)MCIWndSM(hWnd,MCIWNDM_GET_SOURCE,0,(LPARAM)(LPRECT)(prc))
1212 #define MCIWndPutSource(hWnd,prc)   (LONG)MCIWndSM(hWnd,MCIWNDM_PUT_SOURCE,0,(LPARAM)(LPRECT)(prc))
1213
1214 #define MCIWndGetDest(hWnd,prc)     (LONG)MCIWndSM(hWnd,MCIWNDM_GET_DEST,0,(LPARAM)(LPRECT)(prc))
1215 #define MCIWndPutDest(hWnd,prc)     (LONG)MCIWndSM(hWnd,MCIWNDM_PUT_DEST,0,(LPARAM)(LPRECT)(prc))
1216
1217 #define MCIWndPlayReverse(hWnd)     (LONG)MCIWndSM(hWnd,MCIWNDM_PLAYREVERSE,0,0)
1218 #define MCIWndPlayFrom(hWnd,lPos)   (LONG)MCIWndSM(hWnd,MCIWNDM_PLAYFROM,0,(LPARAM)(LONG)(lPos))
1219 #define MCIWndPlayTo(hWnd,lPos)     (LONG)MCIWndSM(hWnd,MCIWNDM_PLAYTO,  0,(LPARAM)(LONG)(lPos))
1220 #define MCIWndPlayFromTo(hWnd,lStart,lEnd) (MCIWndSeek(hWnd,lStart),MCIWndPlayTo(hWnd,lEnd))
1221
1222 #define MCIWndGetDeviceID(hWnd)     (UINT)MCIWndSM(hWnd,MCIWNDM_GETDEVICEID,0,0)
1223 #define MCIWndGetAlias(hWnd)        (UINT)MCIWndSM(hWnd,MCIWNDM_GETALIAS,0,0)
1224 #define MCIWndGetMode(hWnd,lp,len)  (LONG)MCIWndSM(hWnd,MCIWNDM_GETMODE,(WPARAM)(UINT)(len),(LPARAM)(LPTSTR)(lp))
1225 #define MCIWndGetPosition(hWnd)     (LONG)MCIWndSM(hWnd,MCIWNDM_GETPOSITION,0,0)
1226 #define MCIWndGetPositionString(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETPOSITION,(WPARAM)(UINT)(len),(LPARAM)(LPTSTR)(lp))
1227 #define MCIWndGetStart(hWnd)        (LONG)MCIWndSM(hWnd,MCIWNDM_GETSTART,0,0)
1228 #define MCIWndGetLength(hWnd)       (LONG)MCIWndSM(hWnd,MCIWNDM_GETLENGTH,0,0)
1229 #define MCIWndGetEnd(hWnd)          (LONG)MCIWndSM(hWnd,MCIWNDM_GETEND,0,0)
1230
1231 #define MCIWndStep(hWnd,n)          (LONG)MCIWndSM(hWnd,MCI_STEP,0,(LPARAM)(long)(n))
1232
1233 #define MCIWndDestroy(hWnd)         (VOID)MCIWndSM(hWnd,WM_CLOSE,0,0)
1234 #define MCIWndSetZoom(hWnd,iZoom)   (VOID)MCIWndSM(hWnd,MCIWNDM_SETZOOM,0,(LPARAM)(UINT)(iZoom))
1235 #define MCIWndGetZoom(hWnd)         (UINT)MCIWndSM(hWnd,MCIWNDM_GETZOOM,0,0)
1236 #define MCIWndSetVolume(hWnd,iVol)  (LONG)MCIWndSM(hWnd,MCIWNDM_SETVOLUME,0,(LPARAM)(UINT)(iVol))
1237 #define MCIWndGetVolume(hWnd)       (LONG)MCIWndSM(hWnd,MCIWNDM_GETVOLUME,0,0)
1238 #define MCIWndSetSpeed(hWnd,iSpeed) (LONG)MCIWndSM(hWnd,MCIWNDM_SETSPEED,0,(LPARAM)(UINT)(iSpeed))
1239 #define MCIWndGetSpeed(hWnd)        (LONG)MCIWndSM(hWnd,MCIWNDM_GETSPEED,0,0)
1240 #define MCIWndSetTimeFormat(hWnd,lp) (LONG)MCIWndSM(hWnd,MCIWNDM_SETTIMEFORMAT,0,(LPARAM)(LPTSTR)(lp))
1241 #define MCIWndGetTimeFormat(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETTIMEFORMAT,(WPARAM)(UINT)(len),(LPARAM)(LPTSTR)(lp))
1242 #define MCIWndValidateMedia(hWnd)   (VOID)MCIWndSM(hWnd,MCIWNDM_VALIDATEMEDIA,0,0)
1243
1244 #define MCIWndSetRepeat(hWnd,f)     (void)MCIWndSM(hWnd,MCIWNDM_SETREPEAT,0,(LPARAM)(BOOL)(f))
1245 #define MCIWndGetRepeat(hWnd)       (BOOL)MCIWndSM(hWnd,MCIWNDM_GETREPEAT,0,0)
1246
1247 #define MCIWndUseFrames(hWnd)       MCIWndSetTimeFormat(hWnd,TEXT("frames"))
1248 #define MCIWndUseTime(hWnd)         MCIWndSetTimeFormat(hWnd,TEXT("ms"))
1249
1250 #define MCIWndSetActiveTimer(hWnd,active)                               \
1251         (VOID)MCIWndSM(hWnd,MCIWNDM_SETACTIVETIMER,                     \
1252         (WPARAM)(UINT)(active),0L)
1253 #define MCIWndSetInactiveTimer(hWnd,inactive)                           \
1254         (VOID)MCIWndSM(hWnd,MCIWNDM_SETINACTIVETIMER,                   \
1255         (WPARAM)(UINT)(inactive),0L)
1256 #define MCIWndSetTimers(hWnd,active,inactive)                           \
1257             (VOID)MCIWndSM(hWnd,MCIWNDM_SETTIMERS,(WPARAM)(UINT)(active),\
1258             (LPARAM)(UINT)(inactive))
1259 #define MCIWndGetActiveTimer(hWnd)                                      \
1260         (UINT)MCIWndSM(hWnd,MCIWNDM_GETACTIVETIMER,0,0L);
1261 #define MCIWndGetInactiveTimer(hWnd)                                    \
1262         (UINT)MCIWndSM(hWnd,MCIWNDM_GETINACTIVETIMER,0,0L);
1263
1264 #define MCIWndRealize(hWnd,fBkgnd) (LONG)MCIWndSM(hWnd,MCIWNDM_REALIZE,(WPARAM)(BOOL)(fBkgnd),0)
1265
1266 #define MCIWndSendString(hWnd,sz)  (LONG)MCIWndSM(hWnd,MCIWNDM_SENDSTRING,0,(LPARAM)(LPTSTR)(sz))
1267 #define MCIWndReturnString(hWnd,lp,len)  (LONG)MCIWndSM(hWnd,MCIWNDM_RETURNSTRING,(WPARAM)(UINT)(len),(LPARAM)(LPVOID)(lp))
1268 #define MCIWndGetError(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETERROR,(WPARAM)(UINT)(len),(LPARAM)(LPVOID)(lp))
1269
1270 #define MCIWndGetPalette(hWnd)      (HPALETTE)MCIWndSM(hWnd,MCIWNDM_GETPALETTE,0,0)
1271 #define MCIWndSetPalette(hWnd,hpal) (LONG)MCIWndSM(hWnd,MCIWNDM_SETPALETTE,(WPARAM)(HPALETTE)(hpal),0)
1272
1273 #define MCIWndGetFileName(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETFILENAME,(WPARAM)(UINT)(len),(LPARAM)(LPVOID)(lp))
1274 #define MCIWndGetDevice(hWnd,lp,len)   (LONG)MCIWndSM(hWnd,MCIWNDM_GETDEVICE,(WPARAM)(UINT)(len),(LPARAM)(LPVOID)(lp))
1275
1276 #define MCIWndGetStyles(hWnd) (UINT)MCIWndSM(hWnd,MCIWNDM_GETSTYLES,0,0L)
1277 #define MCIWndChangeStyles(hWnd,mask,value) (LONG)MCIWndSM(hWnd,MCIWNDM_CHANGESTYLES,(WPARAM)(UINT)(mask),(LPARAM)(LONG)(value))
1278
1279 #define MCIWndOpenInterface(hWnd,pUnk)  (LONG)MCIWndSM(hWnd,MCIWNDM_OPENINTERFACE,0,(LPARAM)(LPUNKNOWN)(pUnk))
1280
1281 #define MCIWndSetOwner(hWnd,hWndP)  (LONG)MCIWndSM(hWnd,MCIWNDM_SETOWNER,(WPARAM)(hWndP),0)
1282
1283 #define MCIWNDM_GETDEVICEID     (WM_USER + 100)
1284 #define MCIWNDM_GETSTART        (WM_USER + 103)
1285 #define MCIWNDM_GETLENGTH       (WM_USER + 104)
1286 #define MCIWNDM_GETEND          (WM_USER + 105)
1287 #define MCIWNDM_EJECT           (WM_USER + 107)
1288 #define MCIWNDM_SETZOOM         (WM_USER + 108)
1289 #define MCIWNDM_GETZOOM         (WM_USER + 109)
1290 #define MCIWNDM_SETVOLUME       (WM_USER + 110)
1291 #define MCIWNDM_GETVOLUME       (WM_USER + 111)
1292 #define MCIWNDM_SETSPEED        (WM_USER + 112)
1293 #define MCIWNDM_GETSPEED        (WM_USER + 113)
1294 #define MCIWNDM_SETREPEAT       (WM_USER + 114)
1295 #define MCIWNDM_GETREPEAT       (WM_USER + 115)
1296 #define MCIWNDM_REALIZE         (WM_USER + 118)
1297 #define MCIWNDM_VALIDATEMEDIA   (WM_USER + 121)
1298 #define MCIWNDM_PLAYFROM        (WM_USER + 122)
1299 #define MCIWNDM_PLAYTO          (WM_USER + 123)
1300 #define MCIWNDM_GETPALETTE      (WM_USER + 126)
1301 #define MCIWNDM_SETPALETTE      (WM_USER + 127)
1302 #define MCIWNDM_SETTIMERS       (WM_USER + 129)
1303 #define MCIWNDM_SETACTIVETIMER  (WM_USER + 130)
1304 #define MCIWNDM_SETINACTIVETIMER (WM_USER + 131)
1305 #define MCIWNDM_GETACTIVETIMER  (WM_USER + 132)
1306 #define MCIWNDM_GETINACTIVETIMER (WM_USER + 133)
1307 #define MCIWNDM_CHANGESTYLES    (WM_USER + 135)
1308 #define MCIWNDM_GETSTYLES       (WM_USER + 136)
1309 #define MCIWNDM_GETALIAS        (WM_USER + 137)
1310 #define MCIWNDM_PLAYREVERSE     (WM_USER + 139)
1311 #define MCIWNDM_GET_SOURCE      (WM_USER + 140)
1312 #define MCIWNDM_PUT_SOURCE      (WM_USER + 141)
1313 #define MCIWNDM_GET_DEST        (WM_USER + 142)
1314 #define MCIWNDM_PUT_DEST        (WM_USER + 143)
1315 #define MCIWNDM_CAN_PLAY        (WM_USER + 144)
1316 #define MCIWNDM_CAN_WINDOW      (WM_USER + 145)
1317 #define MCIWNDM_CAN_RECORD      (WM_USER + 146)
1318 #define MCIWNDM_CAN_SAVE        (WM_USER + 147)
1319 #define MCIWNDM_CAN_EJECT       (WM_USER + 148)
1320 #define MCIWNDM_CAN_CONFIG      (WM_USER + 149)
1321 #define MCIWNDM_PALETTEKICK     (WM_USER + 150)
1322 #define MCIWNDM_OPENINTERFACE   (WM_USER + 151)
1323 #define MCIWNDM_SETOWNER        (WM_USER + 152)
1324
1325 #define MCIWNDM_SENDSTRINGA     (WM_USER + 101)
1326 #define MCIWNDM_GETPOSITIONA    (WM_USER + 102)
1327 #define MCIWNDM_GETMODEA        (WM_USER + 106)
1328 #define MCIWNDM_SETTIMEFORMATA  (WM_USER + 119)
1329 #define MCIWNDM_GETTIMEFORMATA  (WM_USER + 120)
1330 #define MCIWNDM_GETFILENAMEA    (WM_USER + 124)
1331 #define MCIWNDM_GETDEVICEA      (WM_USER + 125)
1332 #define MCIWNDM_GETERRORA       (WM_USER + 128)
1333 #define MCIWNDM_NEWA            (WM_USER + 134)
1334 #define MCIWNDM_RETURNSTRINGA   (WM_USER + 138)
1335 #define MCIWNDM_OPENA           (WM_USER + 153)
1336
1337 #define MCIWNDM_SENDSTRINGW     (WM_USER + 201)
1338 #define MCIWNDM_GETPOSITIONW    (WM_USER + 202)
1339 #define MCIWNDM_GETMODEW        (WM_USER + 206)
1340 #define MCIWNDM_SETTIMEFORMATW  (WM_USER + 219)
1341 #define MCIWNDM_GETTIMEFORMATW  (WM_USER + 220)
1342 #define MCIWNDM_GETFILENAMEW    (WM_USER + 224)
1343 #define MCIWNDM_GETDEVICEW      (WM_USER + 225)
1344 #define MCIWNDM_GETERRORW       (WM_USER + 228)
1345 #define MCIWNDM_NEWW            (WM_USER + 234)
1346 #define MCIWNDM_RETURNSTRINGW   (WM_USER + 238)
1347 #define MCIWNDM_OPENW           (WM_USER + 252)
1348
1349 #define MCIWNDM_SENDSTRING      WINELIB_NAME_AW(MCIWNDM_SENDSTRING)
1350 #define MCIWNDM_GETPOSITION     WINELIB_NAME_AW(MCIWNDM_GETPOSITION)
1351 #define MCIWNDM_GETMODE         WINELIB_NAME_AW(MCIWNDM_GETMODE)
1352 #define MCIWNDM_SETTIMEFORMAT   WINELIB_NAME_AW(MCIWNDM_SETTIMEFORMAT)
1353 #define MCIWNDM_GETTIMEFORMAT   WINELIB_NAME_AW(MCIWNDM_GETTIMEFORMAT)
1354 #define MCIWNDM_GETFILENAME     WINELIB_NAME_AW(MCIWNDM_GETFILENAME)
1355 #define MCIWNDM_GETDEVICE       WINELIB_NAME_AW(MCIWNDM_GETDEVICE)
1356 #define MCIWNDM_GETERROR        WINELIB_NAME_AW(MCIWNDM_GETERROR)
1357 #define MCIWNDM_NEW             WINELIB_NAME_AW(MCIWNDM_NEW)
1358 #define MCIWNDM_RETURNSTRING    WINELIB_NAME_AW(MCIWNDM_RETURNSTRING)
1359 #define MCIWNDM_OPEN            WINELIB_NAME_AW(MCIWNDM_OPEN)
1360
1361 #define MCIWNDM_NOTIFYMODE      (WM_USER + 200)
1362 #define MCIWNDM_NOTIFYPOS       (WM_USER + 201)
1363 #define MCIWNDM_NOTIFYSIZE      (WM_USER + 202)
1364 #define MCIWNDM_NOTIFYMEDIA     (WM_USER + 203)
1365 #define MCIWNDM_NOTIFYERROR     (WM_USER + 205)
1366
1367 #define MCIWND_START                -1
1368 #define MCIWND_END                  -2
1369
1370 /********************************************
1371  * DrawDib declarations
1372  */
1373
1374 HDRAWDIB VFWAPI DrawDibOpen( void );
1375 UINT VFWAPI DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground);
1376
1377 BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd, HDC hdc, INT dxDst, INT dyDst,
1378                          LPBITMAPINFOHEADER lpbi, INT dxSrc, INT dySrc, UINT wFlags);
1379
1380 BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd, HDC hdc, INT xDst, INT yDst, INT dxDst, INT dyDst,
1381                         LPBITMAPINFOHEADER lpbi, LPVOID lpBits, 
1382                         INT xSrc, INT ySrc, INT dxSrc, INT dySrc, UINT wFlags);
1383
1384 /* DrawDibDraw flags */
1385
1386 #define DDF_UPDATE                      0x0002
1387 #define DDF_SAME_HDC                    0x0004
1388 #define DDF_SAME_DRAW                   0x0008
1389 #define DDF_DONTDRAW                    0x0010
1390 #define DDF_ANIMATE                     0x0020
1391 #define DDF_BUFFER                      0x0040
1392 #define DDF_JUSTDRAWIT                  0x0080
1393 #define DDF_FULLSCREEN                  0x0100
1394 #define DDF_BACKGROUNDPAL               0x0200
1395 #define DDF_NOTKEYFRAME                 0x0400
1396 #define DDF_HURRYUP                     0x0800
1397 #define DDF_HALFTONE                    0x1000
1398
1399 #define DDF_PREROLL                     DDF_DONTDRAW
1400 #define DDF_SAME_DIB                    DDF_SAME_DRAW
1401 #define DDF_SAME_SIZE                   DDF_SAME_DRAW
1402
1403 BOOL VFWAPI DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal);
1404 HPALETTE VFWAPI DrawDibGetPalette(HDRAWDIB hdd);
1405 BOOL VFWAPI DrawDibChangePalette(HDRAWDIB hdd, int iStart, int iLen, LPPALETTEENTRY lppe);
1406 LPVOID VFWAPI DrawDibGetBuffer(HDRAWDIB hdd, LPBITMAPINFOHEADER lpbi, DWORD dwSize, DWORD dwFlags);
1407
1408 BOOL VFWAPI DrawDibStart(HDRAWDIB hdd, DWORD rate);
1409 BOOL VFWAPI DrawDibStop(HDRAWDIB hdd);
1410 #define DrawDibUpdate(hdd, hdc, x, y) \
1411         DrawDibDraw(hdd, hdc, x, y, 0, 0, NULL, NULL, 0, 0, 0, 0, DDF_UPDATE)
1412
1413 BOOL VFWAPI DrawDibEnd(HDRAWDIB hdd);
1414 BOOL VFWAPI DrawDibClose(HDRAWDIB hdd);
1415
1416 /* display profiling */
1417 #define PD_CAN_DRAW_DIB         0x0001
1418 #define PD_CAN_STRETCHDIB       0x0002
1419 #define PD_STRETCHDIB_1_1_OK    0x0004
1420 #define PD_STRETCHDIB_1_2_OK    0x0008
1421 #define PD_STRETCHDIB_1_N_OK    0x0010
1422
1423 DWORD VFWAPI DrawDibProfileDisplay(LPBITMAPINFOHEADER lpbi);
1424
1425 #ifdef __cplusplus
1426 }
1427 #endif  /* __cplusplus */
1428
1429 #endif /* __WINE_VFW_H */