MSVIDC32: port ffmpeg's MS Video 1 codec to wine
Mike McCormack
mike at codeweavers.com
Thu Jan 22 00:31:17 CST 2004
Hi All,
This code is derived from the ffmpeg project's MS Video 1 decoder,
written by Mike Melanson. See:
http://www.pcisys.net/~melanson/codecs/
http://www1.mplayerhq.hu/cgi-bin/cvsweb.cgi/ffmpeg/libavcodec/msvideo1.c?rev=1.5&content-type=text/x-cvsweb-markup&cvsroot=FFMpeg
You need to regenerate configure after applying this patch.
Mike
ChangeLog:
* merge ffmpeg's MS Video 1 decoder by Mike Melanson into Wine
-------------- next part --------------
Index: configure.ac
===================================================================
RCS file: /home/wine/wine/configure.ac,v
retrieving revision 1.232
diff -u -r1.232 configure.ac
--- configure.ac 20 Jan 2004 00:21:42 -0000 1.232
+++ configure.ac 22 Jan 2004 05:55:05 -0000
@@ -1530,6 +1542,7 @@
dlls/msvcrt20/Makefile
dlls/msvcrt40/Makefile
dlls/msvcrtd/Makefile
+dlls/msvidc32/Makefile
dlls/msvideo/Makefile
dlls/msvideo/msrle32/Makefile
dlls/mswsock/Makefile
Index: dlls/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/Makefile.in,v
retrieving revision 1.199
diff -u -r1.199 Makefile.in
--- dlls/Makefile.in 20 Jan 2004 00:21:42 -0000 1.199
+++ dlls/Makefile.in 22 Jan 2004 05:55:05 -0000
@@ -72,6 +72,7 @@
msvcrt20 \
msvcrt40 \
msvcrtd \
+ msvidc32 \
msvideo \
msvideo/msrle32 \
mswsock \
@@ -275,6 +276,7 @@
msvcrt40.dll$(DLLEXT) \
msvcrtd.dll$(DLLEXT) \
msvfw32.dll$(DLLEXT) \
+ msvidc32.dll$(DLLEXT) \
mswsock.dll$(DLLEXT) \
netapi32.dll$(DLLEXT) \
newdev.dll$(DLLEXT) \
@@ -579,6 +581,9 @@
msvideo.dll$(DLLEXT) : msvfw32.dll$(DLLEXT)
$(RM) $@ && $(LN_S) msvfw32.dll$(DLLEXT) $@
+msvidc32.dll$(DLLEXT): msvidc32/msvidc32.dll$(DLLEXT)
+ $(RM) $@ && $(LN_S) msvidc32/msvidc32.dll$(DLLEXT) $@
+
mswsock.dll$(DLLEXT): mswsock/mswsock.dll$(DLLEXT)
$(RM) $@ && $(LN_S) mswsock/mswsock.dll$(DLLEXT) $@
@@ -870,6 +875,7 @@
libmsvcrt40 \
libmsvcrtd \
libmsvfw32 \
+ libmsvidc32 \
libmswsock \
libnetapi32 \
libnewdev \
@@ -1217,6 +1223,11 @@
libmsvfw32.a: msvideo/msvfw32.spec.def
$(DLLTOOL) -k -l $@ -d msvideo/msvfw32.spec.def
+libmsvidc32.def: msvidc32/msvidc32.spec.def
+ $(RM) $@ && $(LN_S) msvidc32/msvidc32.spec.def $@
+libmsvidc32.a: msvidc32/msvidc32.spec.def
+ $(DLLTOOL) -k -l $@ -d msvidc32/msvidc32.spec.def
+
libmswsock.def: mswsock/mswsock.spec.def
$(RM) $@ && $(LN_S) mswsock/mswsock.spec.def $@
libmswsock.a: mswsock/mswsock.spec.def
@@ -1531,6 +1542,7 @@
msvcrt40/msvcrt40.spec.def: $(WINEBUILD)
msvcrtd/msvcrtd.spec.def: $(WINEBUILD)
msvideo/msvfw32.spec.def: $(WINEBUILD)
+msvidc32/msvidc32.spec.def: $(WINEBUILD)
mswsock/mswsock.spec.def: $(WINEBUILD)
netapi32/netapi32.spec.def: $(WINEBUILD)
newdev/newdev.spec.def: $(WINEBUILD)
@@ -1660,6 +1672,7 @@
msvcrt40/msvcrt40.dll$(DLLEXT): msvcrt40
msvcrtd/msvcrtd.dll$(DLLEXT): msvcrtd
msvideo/msvfw32.dll$(DLLEXT): msvideo
+msvidc32/msvidc32.dll$(DLLEXT): msvidc32
mswsock/mswsock.dll$(DLLEXT): mswsock
netapi32/netapi32.dll$(DLLEXT): netapi32
newdev/newdev.dll$(DLLEXT): newdev
--- /dev/null 1994-07-18 08:46:18.000000000 +0900
+++ dlls/msvidc32/Makefile.in 2004-01-22 15:16:52.000000000 +0900
@@ -0,0 +1,17 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+MODULE = msvidc32.dll
+IMPORTS = user32 advapi32 kernel32 ntdll
+EXTRALIBS = $(LIBUNICODE)
+
+LDDLLFLAGS = @LDDLLFLAGS@
+SYMBOLFILE = $(MODULE).tmp.o
+
+C_SRCS = \
+ msvideo1.c
+
+ at MAKE_DLL_RULES@
+
+### Dependencies:
--- /dev/null 1994-07-18 08:46:18.000000000 +0900
+++ dlls/msvidc32/msvideo1.c 2004-01-22 15:17:11.000000000 +0900
@@ -0,0 +1,528 @@
+/*
+ * Microsoft Video-1 Decoder
+ * Copyright (C) 2003 the ffmpeg project
+ *
+ * Portions Copyright (C) 2004 Mike McCormack for Codeweavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/**
+ * @file msvideo1.c
+ * Microsoft Video-1 Decoder by Mike Melanson (melanson at pcisys.net)
+ * For more information about the MS Video-1 format, visit:
+ * http://www.pcisys.net/~melanson/codecs/
+ *
+ * This decoder outputs either PAL8 or RGB555 data, depending on the
+ * whether a RGB palette was passed through palctrl;
+ * if it's present, then the data is PAL8; RGB555 otherwise.
+ */
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "commdlg.h"
+#include "vfw.h"
+
+#include "mmsystem.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msvidc32);
+
+#define CRAM_MAGIC mmioFOURCC('C', 'R', 'A', 'M')
+#define MSVC_MAGIC mmioFOURCC('M', 'S', 'V', 'C')
+#define WHAM_MAGIC mmioFOURCC('W', 'H', 'A', 'M')
+
+#define PALETTE_COUNT 256
+#define LE_16(x) ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0])
+
+/* FIXME - check the stream size */
+#define CHECK_STREAM_PTR(n) \
+ if ((stream_ptr + n) > buf_size ) { \
+ WARN("stream_ptr out of bounds (%d >= %d)\n", \
+ stream_ptr + n, buf_size); \
+ return; \
+ }
+
+typedef BYTE uint8_t;
+
+typedef struct Msvideo1Context {
+ DWORD dwMagic;
+ int mode_8bit; /* if it's not 8-bit, it's 16-bit */
+} Msvideo1Context;
+
+static void
+msvideo1_decode_8bit( int width, int height, unsigned char *buf, int buf_size,
+ unsigned char *pixels, int stride)
+{
+ int block_ptr, pixel_ptr;
+ int total_blocks;
+ int pixel_x, pixel_y; /* pixel width and height iterators */
+ int block_x, block_y; /* block width and height iterators */
+ int blocks_wide, blocks_high; /* width and height in 4x4 blocks */
+ int block_inc;
+ int row_dec;
+
+ /* decoding parameters */
+ int stream_ptr;
+ unsigned char byte_a, byte_b;
+ unsigned short flags;
+ int skip_blocks;
+ unsigned char colors[8];
+
+ stream_ptr = 0;
+ skip_blocks = 0;
+ blocks_wide = width / 4;
+ blocks_high = height / 4;
+ total_blocks = blocks_wide * blocks_high;
+ block_inc = 4;
+ row_dec = stride + 4;
+
+ for (block_y = blocks_high; block_y > 0; block_y--) {
+ block_ptr = ((block_y * 4) - 1) * stride;
+ for (block_x = blocks_wide; block_x > 0; block_x--) {
+ /* check if this block should be skipped */
+ if (skip_blocks) {
+ block_ptr += block_inc;
+ skip_blocks--;
+ total_blocks--;
+ continue;
+ }
+
+ pixel_ptr = block_ptr;
+
+ /* get the next two bytes in the encoded data stream */
+ CHECK_STREAM_PTR(2);
+ byte_a = buf[stream_ptr++];
+ byte_b = buf[stream_ptr++];
+
+ /* check if the decode is finished */
+ if ((byte_a == 0) && (byte_b == 0) && (total_blocks == 0))
+ return;
+ else if ((byte_b & 0xFC) == 0x84) {
+ /* skip code, but don't count the current block */
+ skip_blocks = ((byte_b - 0x84) << 8) + byte_a - 1;
+ } else if (byte_b < 0x80) {
+ /* 2-color encoding */
+ flags = (byte_b << 8) | byte_a;
+
+ CHECK_STREAM_PTR(2);
+ colors[0] = buf[stream_ptr++];
+ colors[1] = buf[stream_ptr++];
+
+ for (pixel_y = 0; pixel_y < 4; pixel_y++) {
+ for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
+ {
+#if ORIGINAL
+ pixels[pixel_ptr++] = colors[(flags & 0x1) ^ 1];
+#else
+ pixels[width*(height-(pixel_ptr/width)-1) +
+ pixel_ptr%width] =
+ colors[(flags & 0x1) ^ 1];
+ pixel_ptr++;
+#endif
+ }
+ pixel_ptr -= row_dec;
+ }
+ } else if (byte_b >= 0x90) {
+ /* 8-color encoding */
+ flags = (byte_b << 8) | byte_a;
+
+ CHECK_STREAM_PTR(8);
+ memcpy(colors, &buf[stream_ptr], 8);
+ stream_ptr += 8;
+
+ for (pixel_y = 0; pixel_y < 4; pixel_y++) {
+ for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
+ {
+#if ORIGINAL
+ pixels[pixel_ptr++] =
+ colors[((pixel_y & 0x2) << 1) +
+ (pixel_x & 0x2) + ((flags & 0x1) ^ 1)];
+#else
+ pixels[width*(height-(pixel_ptr/width)-1) +
+ pixel_ptr%width] =
+ colors[((pixel_y & 0x2) << 1) +
+ (pixel_x & 0x2) + ((flags & 0x1) ^ 1)];
+ pixel_ptr++;
+#endif
+ }
+ pixel_ptr -= row_dec;
+ }
+ } else {
+ /* 1-color encoding */
+ colors[0] = byte_a;
+
+ for (pixel_y = 0; pixel_y < 4; pixel_y++) {
+ for (pixel_x = 0; pixel_x < 4; pixel_x++)
+ {
+#if ORIGINAL
+ pixels[pixel_ptr++] = colors[0];
+#else
+ pixels[width*(height-(pixel_ptr/width)-1) +
+ pixel_ptr%width] = colors[0];
+ pixel_ptr++;
+#endif
+ }
+ pixel_ptr -= row_dec;
+ }
+ }
+
+ block_ptr += block_inc;
+ total_blocks--;
+ }
+ }
+}
+
+static void
+msvideo1_decode_16bit( int width, int height, unsigned char *buf, int buf_size,
+ unsigned short *pixels, int stride)
+{
+ int block_ptr, pixel_ptr;
+ int total_blocks;
+ int pixel_x, pixel_y; /* pixel width and height iterators */
+ int block_x, block_y; /* block width and height iterators */
+ int blocks_wide, blocks_high; /* width and height in 4x4 blocks */
+ int block_inc;
+ int row_dec;
+
+ /* decoding parameters */
+ int stream_ptr;
+ unsigned char byte_a, byte_b;
+ unsigned short flags;
+ int skip_blocks;
+ unsigned short colors[8];
+
+ stream_ptr = 0;
+ skip_blocks = 0;
+ blocks_wide = width / 4;
+ blocks_high = height / 4;
+ total_blocks = blocks_wide * blocks_high;
+ block_inc = 4;
+ row_dec = stride + 4;
+
+ for (block_y = blocks_high; block_y > 0; block_y--) {
+ block_ptr = ((block_y * 4) - 1) * stride;
+ for (block_x = blocks_wide; block_x > 0; block_x--) {
+ /* check if this block should be skipped */
+ if (skip_blocks) {
+ block_ptr += block_inc;
+ skip_blocks--;
+ total_blocks--;
+ continue;
+ }
+
+ pixel_ptr = block_ptr;
+
+ /* get the next two bytes in the encoded data stream */
+ CHECK_STREAM_PTR(2);
+ byte_a = buf[stream_ptr++];
+ byte_b = buf[stream_ptr++];
+
+ /* check if the decode is finished */
+ if ((byte_a == 0) && (byte_b == 0) && (total_blocks == 0)) {
+ return;
+ } else if ((byte_b & 0xFC) == 0x84) {
+ /* skip code, but don't count the current block */
+ skip_blocks = ((byte_b - 0x84) << 8) + byte_a - 1;
+ } else if (byte_b < 0x80) {
+ /* 2- or 8-color encoding modes */
+ flags = (byte_b << 8) | byte_a;
+
+ CHECK_STREAM_PTR(4);
+ colors[0] = LE_16(&buf[stream_ptr]);
+ stream_ptr += 2;
+ colors[1] = LE_16(&buf[stream_ptr]);
+ stream_ptr += 2;
+
+ if (colors[0] & 0x8000) {
+ /* 8-color encoding */
+ CHECK_STREAM_PTR(12);
+ colors[2] = LE_16(&buf[stream_ptr]);
+ stream_ptr += 2;
+ colors[3] = LE_16(&buf[stream_ptr]);
+ stream_ptr += 2;
+ colors[4] = LE_16(&buf[stream_ptr]);
+ stream_ptr += 2;
+ colors[5] = LE_16(&buf[stream_ptr]);
+ stream_ptr += 2;
+ colors[6] = LE_16(&buf[stream_ptr]);
+ stream_ptr += 2;
+ colors[7] = LE_16(&buf[stream_ptr]);
+ stream_ptr += 2;
+
+ for (pixel_y = 0; pixel_y < 4; pixel_y++) {
+ for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
+ pixels[pixel_ptr++] =
+ colors[((pixel_y & 0x2) << 1) +
+ (pixel_x & 0x2) + ((flags & 0x1) ^ 1)];
+ pixel_ptr -= row_dec;
+ }
+ } else {
+ /* 2-color encoding */
+ for (pixel_y = 0; pixel_y < 4; pixel_y++) {
+ for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
+ pixels[pixel_ptr++] = colors[(flags & 0x1) ^ 1];
+ pixel_ptr -= row_dec;
+ }
+ }
+ } else {
+ /* otherwise, it's a 1-color block */
+ colors[0] = (byte_b << 8) | byte_a;
+
+ for (pixel_y = 0; pixel_y < 4; pixel_y++) {
+ for (pixel_x = 0; pixel_x < 4; pixel_x++)
+ pixels[pixel_ptr++] = colors[0];
+ pixel_ptr -= row_dec;
+ }
+ }
+
+ block_ptr += block_inc;
+ total_blocks--;
+ }
+ }
+}
+
+static LRESULT
+CRAM_DecompressQuery( Msvideo1Context *info, LPBITMAPINFO in, LPBITMAPINFO out )
+{
+ TRACE("ICM_DECOMPRESS_QUERY %p %p %p\n", info, in, out);
+
+ if( (info==NULL) || (info->dwMagic!=CRAM_MAGIC) )
+ return ICERR_BADPARAM;
+
+ TRACE("planes = %d\n", in->bmiHeader.biPlanes );
+ TRACE("bpp = %d\n", in->bmiHeader.biBitCount );
+ TRACE("height = %ld\n", in->bmiHeader.biHeight );
+ TRACE("width = %ld\n", in->bmiHeader.biWidth );
+ TRACE("compr = %lx\n", in->bmiHeader.biCompression );
+
+ if( ( in->bmiHeader.biCompression != CRAM_MAGIC ) &&
+ ( in->bmiHeader.biCompression != MSVC_MAGIC ) &&
+ ( in->bmiHeader.biCompression != WHAM_MAGIC ) )
+ return ICERR_UNSUPPORTED;
+
+ if( ( in->bmiHeader.biBitCount != 16 ) &&
+ ( in->bmiHeader.biBitCount != 8 ) )
+ {
+ TRACE("can't do %d bpp\n", in->bmiHeader.biBitCount );
+ return ICERR_UNSUPPORTED;
+ }
+
+ /* output must be same dimensions as input */
+ if( out )
+ {
+ if( in->bmiHeader.biBitCount != out->bmiHeader.biBitCount )
+ return ICERR_UNSUPPORTED;
+ if( in->bmiHeader.biPlanes != out->bmiHeader.biPlanes )
+ return ICERR_UNSUPPORTED;
+ if( in->bmiHeader.biHeight != out->bmiHeader.biHeight )
+ return ICERR_UNSUPPORTED;
+ if( in->bmiHeader.biWidth != out->bmiHeader.biWidth )
+ return ICERR_UNSUPPORTED;
+ }
+
+ TRACE("OK!\n");
+
+ return ICERR_OK;
+}
+
+static LRESULT
+CRAM_DecompressGetFormat( Msvideo1Context *info, LPBITMAPINFO in, LPBITMAPINFO out )
+{
+ TRACE("ICM_DECOMPRESS_GETFORMAT %p %p %p\n", info, in, out);
+
+ if( (info==NULL) || (info->dwMagic!=CRAM_MAGIC) )
+ return ICERR_BADPARAM;
+
+ if( out )
+ {
+ memcpy( out, in, sizeof (BITMAPINFO) );
+ out->bmiHeader.biCompression = BI_RGB;
+ out->bmiHeader.biSizeImage = in->bmiHeader.biHeight
+ * in->bmiHeader.biWidth *4;
+ out->bmiHeader.biBitCount = in->bmiHeader.biBitCount;
+ }
+
+ return sizeof (BITMAPINFO);
+}
+
+LRESULT CRAM_DecompressBegin( Msvideo1Context *info, LPBITMAPINFO in, LPBITMAPINFO out )
+{
+ TRACE("ICM_DECOMPRESS_BEGIN %p %p %p\n", info, in, out);
+
+ if( (info==NULL) || (info->dwMagic!=CRAM_MAGIC) )
+ return ICERR_BADPARAM;
+
+ TRACE("bitmap is %d bpp\n", in->bmiHeader.biBitCount);
+ if( in->bmiHeader.biBitCount == 8 )
+ info->mode_8bit = 1;
+ else if( in->bmiHeader.biBitCount == 16 )
+ info->mode_8bit = 0;
+ else
+ {
+ ERR("Bad output format\n");
+ return ICERR_BADPARAM;
+ }
+
+ return ICERR_OK;
+}
+
+LRESULT CRAM_Decompress( Msvideo1Context *info, ICDECOMPRESS *icd, DWORD size )
+{
+ LONG width, height, stride, sz;
+ WORD bit_per_pixel;
+
+ TRACE("ICM_DECOMPRESS %p %p %ld\n", info, icd, size);
+
+ if( (info==NULL) || (info->dwMagic!=CRAM_MAGIC) )
+ return ICERR_BADPARAM;
+
+ /* FIXME: flags are ignored */
+
+ width = icd->lpbiInput->biWidth;
+ height = icd->lpbiInput->biHeight;
+ bit_per_pixel = icd->lpbiInput->biBitCount;
+ stride = width*bit_per_pixel/8;
+ sz = icd->lpbiInput->biSizeImage;
+
+ if (info->mode_8bit)
+ {
+ msvideo1_decode_8bit( width, height, icd->lpInput, sz,
+ icd->lpOutput, stride);
+ }
+ else
+ {
+ msvideo1_decode_16bit( width, height, icd->lpInput, sz,
+ icd->lpOutput, stride);
+ }
+
+ return ICERR_OK;
+}
+
+LRESULT CRAM_DecompressEx( Msvideo1Context *info, ICDECOMPRESSEX *icd, DWORD size )
+{
+ LONG width, height, stride, sz;
+ WORD bit_per_pixel;
+
+ TRACE("ICM_DECOMPRESSEX %p %p %ld\n", info, icd, size);
+
+ if( (info==NULL) || (info->dwMagic!=CRAM_MAGIC) )
+ return ICERR_BADPARAM;
+
+ /* FIXME: flags are ignored */
+
+ width = icd->lpbiSrc->biWidth;
+ height = icd->lpbiSrc->biHeight;
+ bit_per_pixel = icd->lpbiSrc->biBitCount;
+ stride = width*bit_per_pixel/8;
+ sz = icd->lpbiSrc->biSizeImage;
+
+ if (info->mode_8bit)
+ {
+ msvideo1_decode_8bit( width, height, icd->lpSrc, sz,
+ icd->lpDst, stride);
+ }
+ else
+ {
+ msvideo1_decode_16bit( width, height, icd->lpSrc, sz,
+ icd->lpDst, stride);
+ }
+
+ return ICERR_OK;
+}
+
+LRESULT WINAPI CRAM_DriverProc( DWORD dwDriverId, HDRVR hdrvr, UINT msg,
+ LONG lParam1, LONG lParam2)
+{
+ Msvideo1Context *info = (Msvideo1Context *) dwDriverId;
+ LRESULT r = 0;
+
+ TRACE("%ld %p %d %ld %ld\n", dwDriverId, hdrvr, msg, lParam1, lParam2);
+
+ switch( msg )
+ {
+ case DRV_LOAD:
+ TRACE("Loaded\n");
+ r = 1;
+ break;
+
+ case DRV_ENABLE:
+ break;
+
+ case DRV_OPEN:
+ TRACE("Opened\n");
+ info = HeapAlloc( GetProcessHeap(), 0, sizeof (Msvideo1Context) );
+ if( info )
+ {
+ memset( info, 0, sizeof info );
+ info->dwMagic = CRAM_MAGIC;
+ }
+ r = (LRESULT) info;
+ break;
+
+ case ICM_DECOMPRESS_QUERY:
+ r = CRAM_DecompressQuery( info, (LPBITMAPINFO) lParam1,
+ (LPBITMAPINFO) lParam2 );
+ break;
+
+ case ICM_DECOMPRESS_GET_FORMAT:
+ r = CRAM_DecompressGetFormat( info, (LPBITMAPINFO) lParam1,
+ (LPBITMAPINFO) lParam2 );
+ break;
+
+ case ICM_DECOMPRESS_GET_PALETTE:
+ FIXME("ICM_DECOMPRESS_GET_PALETTE\n");
+ break;
+
+ case ICM_DECOMPRESSEX_QUERY:
+ FIXME("ICM_DECOMPRESSEX_QUERY\n");
+ break;
+
+ case ICM_DECOMPRESS:
+ r = CRAM_Decompress( info, (ICDECOMPRESS*) lParam1,
+ (DWORD) lParam2 );
+ break;
+
+ case ICM_DECOMPRESS_BEGIN:
+ r = CRAM_DecompressBegin( info, (LPBITMAPINFO) lParam1,
+ (LPBITMAPINFO) lParam2 );
+ break;
+
+ case ICM_DECOMPRESSEX:
+ r = CRAM_DecompressEx( info, (ICDECOMPRESSEX*) lParam1,
+ (DWORD) lParam2 );
+ break;
+
+ case DRV_CLOSE:
+ HeapFree( GetProcessHeap(), 0, info );
+ break;
+
+ case DRV_DISABLE:
+ break;
+
+ case DRV_FREE:
+ break;
+
+ default:
+ FIXME("Unknown message: %04x %ld %ld\n", msg, lParam1, lParam2);
+ }
+
+ return r;
+}
--- /dev/null 1994-07-18 08:46:18.000000000 +0900
+++ dlls/msvidc32/msvidc32.spec 2004-01-22 15:17:21.000000000 +0900
@@ -0,0 +1 @@
+@ stdcall DriverProc(long ptr long long long) CRAM_DriverProc
--- /dev/null 1994-07-18 08:46:18.000000000 +0900
+++ dlls/msvidc32/.cvsignore 2004-01-22 15:17:26.000000000 +0900
@@ -0,0 +1,4 @@
+Makefile
+msvidc32.dll.dbg.c
+msvidc32.spec.c
+msvidc32.spec.def
More information about the wine-patches
mailing list