From 32b32d8f3d6373291b57b7d4001c5cbb95f793c6 Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Fri, 29 Jan 1999 15:12:10 +0000 Subject: [PATCH] Updated msvideo. New program 'icinfo [-about] [-configure]' to query installed (win32) compressors. Started on AVIFILE support. --- configure | 2 + configure.in | 1 + include/debug.h | 129 ++++++------- include/debugdefs.h | 4 +- include/oleauto.h | 2 - include/vfw.h | 434 ++++++++++++++++++++++++++++++++++++++++-- include/winerror.h | 1 + include/wintypes.h | 2 + multimedia/msvideo.c | 128 +++++++++++-- ole/guid.c | 1 + programs/Makefile.in | 1 + programs/avitools/.cvsignore | 2 + programs/avitools/Makefile.in | 56 ++++++ programs/avitools/icinfo.c | 77 ++++++++ relay32/msvfw32.spec | 19 +- 15 files changed, 751 insertions(+), 108 deletions(-) create mode 100644 programs/avitools/.cvsignore create mode 100644 programs/avitools/Makefile.in create mode 100644 programs/avitools/icinfo.c diff --git a/configure b/configure index 13fc1ddec1e..f91e9dbb8a8 100755 --- a/configure +++ b/configure @@ -4156,6 +4156,7 @@ ole/Makefile programs/Makefile programs/clock/Makefile programs/control/Makefile +programs/avitools/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regtest/Makefile @@ -4310,6 +4311,7 @@ ole/Makefile programs/Makefile programs/clock/Makefile programs/control/Makefile +programs/avitools/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regtest/Makefile diff --git a/configure.in b/configure.in index cd4ad40eae6..f86104ee729 100644 --- a/configure.in +++ b/configure.in @@ -600,6 +600,7 @@ ole/Makefile programs/Makefile programs/clock/Makefile programs/control/Makefile +programs/avitools/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regtest/Makefile diff --git a/include/debug.h b/include/debug.h index 8d0ea7ab6aa..ae9450b314d 100644 --- a/include/debug.h +++ b/include/debug.h @@ -89,70 +89,71 @@ #define dbch_mpr 81 #define dbch_msacm 82 #define dbch_msg 83 -#define dbch_nativefont 84 -#define dbch_nonclient 85 -#define dbch_ntdll 86 -#define dbch_ole 87 -#define dbch_pager 88 -#define dbch_palette 89 -#define dbch_pidl 90 -#define dbch_print 91 -#define dbch_process 92 -#define dbch_profile 93 -#define dbch_progress 94 -#define dbch_prop 95 -#define dbch_propsheet 96 -#define dbch_psapi 97 -#define dbch_psdrv 98 -#define dbch_ras 99 -#define dbch_rebar 100 -#define dbch_reg 101 -#define dbch_region 102 -#define dbch_relay 103 -#define dbch_resource 104 -#define dbch_scroll 105 -#define dbch_security 106 -#define dbch_segment 107 -#define dbch_selector 108 -#define dbch_sem 109 -#define dbch_sendmsg 110 -#define dbch_server 111 -#define dbch_shell 112 -#define dbch_shm 113 -#define dbch_snoop 114 -#define dbch_sound 115 -#define dbch_static 116 -#define dbch_statusbar 117 -#define dbch_stress 118 -#define dbch_string 119 -#define dbch_syscolor 120 -#define dbch_system 121 -#define dbch_tab 122 -#define dbch_task 123 -#define dbch_text 124 -#define dbch_thread 125 -#define dbch_thunk 126 -#define dbch_timer 127 -#define dbch_toolbar 128 -#define dbch_toolhelp 129 -#define dbch_tooltips 130 -#define dbch_trackbar 131 -#define dbch_treeview 132 -#define dbch_tweak 133 -#define dbch_uitools 134 -#define dbch_updown 135 -#define dbch_ver 136 -#define dbch_virtual 137 -#define dbch_vxd 138 -#define dbch_wave 139 -#define dbch_win 140 -#define dbch_win16drv 141 -#define dbch_win32 142 -#define dbch_wing 143 -#define dbch_winsock 144 -#define dbch_wnet 145 -#define dbch_x11 146 -#define dbch_x11drv 147 +#define dbch_msvideo 84 +#define dbch_nativefont 85 +#define dbch_nonclient 86 +#define dbch_ntdll 87 +#define dbch_ole 88 +#define dbch_pager 89 +#define dbch_palette 90 +#define dbch_pidl 91 +#define dbch_print 92 +#define dbch_process 93 +#define dbch_profile 94 +#define dbch_progress 95 +#define dbch_prop 96 +#define dbch_propsheet 97 +#define dbch_psapi 98 +#define dbch_psdrv 99 +#define dbch_ras 100 +#define dbch_rebar 101 +#define dbch_reg 102 +#define dbch_region 103 +#define dbch_relay 104 +#define dbch_resource 105 +#define dbch_scroll 106 +#define dbch_security 107 +#define dbch_segment 108 +#define dbch_selector 109 +#define dbch_sem 110 +#define dbch_sendmsg 111 +#define dbch_server 112 +#define dbch_shell 113 +#define dbch_shm 114 +#define dbch_snoop 115 +#define dbch_sound 116 +#define dbch_static 117 +#define dbch_statusbar 118 +#define dbch_stress 119 +#define dbch_string 120 +#define dbch_syscolor 121 +#define dbch_system 122 +#define dbch_tab 123 +#define dbch_task 124 +#define dbch_text 125 +#define dbch_thread 126 +#define dbch_thunk 127 +#define dbch_timer 128 +#define dbch_toolbar 129 +#define dbch_toolhelp 130 +#define dbch_tooltips 131 +#define dbch_trackbar 132 +#define dbch_treeview 133 +#define dbch_tweak 134 +#define dbch_uitools 135 +#define dbch_updown 136 +#define dbch_ver 137 +#define dbch_virtual 138 +#define dbch_vxd 139 +#define dbch_wave 140 +#define dbch_win 141 +#define dbch_win16drv 142 +#define dbch_win32 143 +#define dbch_wing 144 +#define dbch_winsock 145 +#define dbch_wnet 146 +#define dbch_x11 147 +#define dbch_x11drv 148 /* Definitions for classes identifiers */ #define dbcl_fixme 0 #define dbcl_err 1 diff --git a/include/debugdefs.h b/include/debugdefs.h index cd1a4721322..77f7c283ebe 100644 --- a/include/debugdefs.h +++ b/include/debugdefs.h @@ -4,7 +4,7 @@ #include "debugtools.h" #endif -#define DEBUG_CHANNEL_COUNT 148 +#define DEBUG_CHANNEL_COUNT 149 #ifdef DEBUG_RUNTIME short debug_msg_enabled[][DEBUG_CLASS_COUNT] = { {1, 1, 0, 0}, @@ -155,6 +155,7 @@ short debug_msg_enabled[][DEBUG_CLASS_COUNT] = { {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 0}, +{1, 1, 0, 0}, }; const char* debug_ch_name[] = { "accel", @@ -241,6 +242,7 @@ const char* debug_ch_name[] = { "mpr", "msacm", "msg", +"msvideo", "nativefont", "nonclient", "ntdll", diff --git a/include/oleauto.h b/include/oleauto.h index 30552182b15..ec344ff5696 100644 --- a/include/oleauto.h +++ b/include/oleauto.h @@ -158,8 +158,6 @@ typedef short VARIANT_BOOL; #define VARIANT_TRUE ((VARIANT_BOOL)0xFFFF) #define VARIANT_FALSE ((VARIANT_BOOL)0x0000) -typedef LONG SCODE; - enum VARENUM { VT_EMPTY = 0, VT_NULL = 1, diff --git a/include/vfw.h b/include/vfw.h index 6aeeb1b5e78..ae0a174ef2e 100644 --- a/include/vfw.h +++ b/include/vfw.h @@ -3,12 +3,19 @@ #include #include +#include #define VFWAPI WINAPI #define VFWAPIV WINAPIV DWORD VFWAPI VideoForWindowsVersion(void); +#ifndef mmioFOURCC +#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \ + ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ + ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) +#endif + #ifndef aviTWOCC #define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8)) #endif @@ -16,7 +23,6 @@ DWORD VFWAPI VideoForWindowsVersion(void); #define ICTYPE_VIDEO mmioFOURCC('v', 'i', 'd', 'c') #define ICTYPE_AUDIO mmioFOURCC('a', 'u', 'd', 'c') - /* Installable Compressor M? */ /* HIC32 struct (same layout as Win95 one) */ @@ -146,7 +152,87 @@ typedef struct { /* 24: */ } ICOPEN,*LPICOPEN; -/* Values for dwFlags of ICOpen() */ +#define ICCOMPRESS_KEYFRAME 0x00000001L + +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiOutput; + LPVOID lpOutput; + LPBITMAPINFOHEADER lpbiInput; + LPVOID lpInput; + LPDWORD lpckid; + LPDWORD lpdwFlags; + LONG lFrameNum; + DWORD dwFrameSize; + DWORD dwQuality; + LPBITMAPINFOHEADER lpbiPrev; + LPVOID lpPrev; +} ICCOMPRESS; + +DWORD VFWAPIV ICCompress32( + HIC32 hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiOutput,LPVOID lpData, + LPBITMAPINFOHEADER lpbiInput,LPVOID lpBits,LPDWORD lpckid, + LPDWORD lpdwFlags,LONG lFrameNum,DWORD dwFrameSize,DWORD dwQuality, + LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev +); + +#define ICCompressGetFormat32(hic, lpbiInput, lpbiOutput) \ + ICSendMessage32( \ + hic,ICM_COMPRESS_GET_FORMAT,(DWORD)(LPVOID)(lpbiInput), \ + (DWORD)(LPVOID)(lpbiOutput) \ + ) +#define ICCompressGetFormat WINELIB_NAME(ICCompressGetFormat) + +#define ICCompressGetFormatSize32(hic,lpbi) ICCompressGetFormat32(hic,lpbi,NULL) +#define ICCompressGetFormatSize WINELIB_NAME(ICCompressGetFormatSize) + +#define ICCompressBegin32(hic, lpbiInput, lpbiOutput) \ + ICSendMessage32( \ + hic, ICM_COMPRESS_BEGIN, (DWORD)(LPVOID)(lpbiInput), \ + (DWORD)(LPVOID)(lpbiOutput) \ + ) +#define ICCompressBegin WINELIB_NAME(ICCompressBegin) + +#define ICCompressGetSize32(hic, lpbiInput, lpbiOutput) \ + ICSendMessage32( \ + hic, ICM_COMPRESS_GET_SIZE, (DWORD)(LPVOID)(lpbiInput), \ + (DWORD)(LPVOID)(lpbiOutput) \ + ) +#define ICCompressGetSize WINELIB_NAME(ICCompressGetSize) + +#define ICCompressQuery32(hic, lpbiInput, lpbiOutput) \ + ICSendMessage32( \ + hic, ICM_COMPRESS_QUERY, (DWORD)(LPVOID)(lpbiInput), \ + (DWORD)(LPVOID)(lpbiOutput) \ + ) +#define ICCompressQuery WINELIB_NAME(ICCompressQuery) + + +#define ICCompressEnd32(hic) ICSendMessage32(hic, ICM_COMPRESS_END, 0, 0) +#define ICCompressEnd WINELIB_NAME(ICCompressEnd) + +/* ICCOMPRESSFRAMES.dwFlags */ +#define ICCOMPRESSFRAMES_PADDING 0x00000001 +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiOutput; + LPARAM lOutput; + LPBITMAPINFOHEADER lpbiInput; + LPARAM lInput; + LONG lStartFrame; + LONG lFrameCount; + LONG lQuality; + LONG lDataRate; + LONG lKeyRate; + DWORD dwRate; + DWORD dwScale; + DWORD dwOverheadPerFrame; + DWORD dwReserved2; + LONG (CALLBACK *GetData)(LPARAM lInput,LONG lFrame,LPVOID lpBits,LONG len); + LONG (CALLBACK *PutData)(LPARAM lOutput,LONG lFrame,LPVOID lpBits,LONG len); +} ICCOMPRESSFRAMES; + +/* Values for wMode of ICOpen() */ #define ICMODE_COMPRESS 1 #define ICMODE_DECOMPRESS 2 #define ICMODE_FASTDECOMPRESS 3 @@ -174,9 +260,9 @@ typedef struct { WCHAR szDriver[128]; /* 138:driver that contains compressor*/ /* 238: */ } ICINFO32; +DECL_WINELIB_TYPE(ICINFO); - -/* Flags for the field of the structure. */ +/* ICINFO.dwFlags */ #define VIDCF_QUALITY 0x0001 /* supports quality */ #define VIDCF_CRUNCH 0x0002 /* supports crunching to a frame size */ #define VIDCF_TEMPORAL 0x0004 /* supports inter-frame compress */ @@ -193,19 +279,22 @@ typedef struct { /* ICM_ABOUT */ #define ICMF_ABOUT_QUERY 0x00000001 -#define ICQueryAbout(hic) \ - (ICSendMessage(hic,ICM_ABOUT,(DWORD)-1,ICMF_ABOUT_QUERY)==ICERR_OK) +#define ICQueryAbout32(hic) \ + (ICSendMessage32(hic,ICM_ABOUT,(DWORD)-1,ICMF_ABOUT_QUERY)==ICERR_OK) +#define ICQueryAbout WINELIB_NAME(ICQueryAbout) -#define ICAbout(hic, hwnd) \ - ICSendMessage(hic,ICM_ABOUT,(DWORD)(UINT)(hwnd),0) +#define ICAbout32(hic, hwnd) ICSendMessage32(hic,ICM_ABOUT,(DWORD)(UINT)(hwnd),0) +#define ICAbout WINELIB_NAME(ICAbout) /* ICM_CONFIGURE */ #define ICMF_CONFIGURE_QUERY 0x00000001 -#define ICQueryConfigure(hic) \ - (ICSendMessage(hic,ICM_CONFIGURE,(DWORD)-1,ICMF_CONFIGURE_QUERY)==ICERR_OK) +#define ICQueryConfigure32(hic) \ + (ICSendMessage32(hic,ICM_CONFIGURE,(DWORD)-1,ICMF_CONFIGURE_QUERY)==ICERR_OK) +#define ICQueryConfigure WINELIB_NAME(ICQueryConfigure) -#define ICConfigure(hic,hwnd) \ - ICSendMessage(hic,ICM_CONFIGURE,(DWORD)(UINT)(hwnd),0) +#define ICConfigure32(hic,hwnd) \ + ICSendMessage32(hic,ICM_CONFIGURE,(DWORD)(UINT)(hwnd),0) +#define ICConfigure WINELIB_NAME(ICConfigure) /* Decompression stuff */ #define ICDECOMPRESS_HURRYUP 0x80000000 /* don't draw just buffer (hurry up!) */ @@ -242,15 +331,67 @@ typedef struct { INT32 dySrc; } ICDECOMPRESSEX; +DWORD VFWAPIV ICDecompress32(HIC32 hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,LPVOID lpData,LPBITMAPINFOHEADER lpbi,LPVOID lpBits); +#define ICDecompress WINELIB_NAME(ICDecompress) + + +#define ICDecompressBegin32(hic, lpbiInput, lpbiOutput) \ + ICSendMessage32( \ + hic, ICM_DECOMPRESS_BEGIN, (DWORD)(LPVOID)(lpbiInput), \ + (DWORD)(LPVOID)(lpbiOutput) \ + ) +#define ICDecompressBegin WINELIB_NAME(ICDecompressBegin) + +#define ICDecompressQuery32(hic, lpbiInput, lpbiOutput) \ + ICSendMessage32( \ + hic,ICM_DECOMPRESS_QUERY, (DWORD)(LPVOID)(lpbiInput), \ + (DWORD) (LPVOID)(lpbiOutput) \ + ) +#define ICDecompressQuery WINELIB_NAME(ICDecompressQuery) + +#define ICDecompressGetFormat32(hic, lpbiInput, lpbiOutput) \ + ((LONG)ICSendMessage32( \ + hic,ICM_DECOMPRESS_GET_FORMAT, (DWORD)(LPVOID)(lpbiInput), \ + (DWORD)(LPVOID)(lpbiOutput) \ + )) +#define ICDecompressGetFormat WINELIB_NAME(ICDecompressGetFormat) + +#define ICDecompressGetFormatSize32(hic, lpbi) \ + ICDecompressGetFormat32(hic, lpbi, NULL) +#define ICDecompressGetFormatSize WINELIB_NAME(ICDecompressGetFormatSize) + +#define ICDecompressGetPalette32(hic, lpbiInput, lpbiOutput) \ + ICSendMessage32( \ + hic, ICM_DECOMPRESS_GET_PALETTE, (DWORD)(LPVOID)(lpbiInput), \ + (DWORD)(LPVOID)(lpbiOutput) \ + ) +#define ICDecompressGetPalette WINELIB_NAME(ICDecompressGetPalette) + +#define ICDecompressSetPalette32(hic,lpbiPalette) \ + ICSendMessage32( \ + hic,ICM_DECOMPRESS_SET_PALETTE, \ + (DWORD)(LPVOID)(lpbiPalette),0 \ + ) +#define ICDecompressSetPalette WINELIB_NAME(ICDecompressSetPalette) + +#define ICDecompressEnd32(hic) ICSendMessage32(hic, ICM_DECOMPRESS_END, 0, 0) +#define ICDecompressEnd WINELIB_NAME(ICDecompressEnd) + + #define ICDRAW_QUERY 0x00000001L /* test for support */ #define ICDRAW_FULLSCREEN 0x00000002L /* draw to full screen */ #define ICDRAW_HDC 0x00000004L /* draw to a HDC/HWND */ - BOOL32 VFWAPI ICInfo32(DWORD fccType, DWORD fccHandler, ICINFO32 * lpicinfo); +#define ICInfo WINELIB_NAME(ICInfo) LRESULT VFWAPI ICGetInfo32(HIC32 hic,ICINFO32 *picinfo, DWORD cb); +#define ICGetInfo WINELIB_NAME(ICGetInfo) HIC32 VFWAPI ICOpen32(DWORD fccType, DWORD fccHandler, UINT32 wMode); +#define ICOpen WINELIB_NAME(ICOpen) +LRESULT VFWAPI ICClose32(HIC32 hic); +#define ICClose WINELIB_NAME(ICClose) LRESULT VFWAPI ICSendMessage32(HIC32 hic, UINT32 msg, DWORD dw1, DWORD dw2); +#define ICSendMessage WINELIB_NAME(ICSendMessage) DWORD VFWAPIV ICDrawBegin32( HIC32 hic, DWORD dwFlags,/* flags */ @@ -267,6 +408,271 @@ DWORD VFWAPIV ICDrawBegin32( INT32 dxSrc, INT32 dySrc, DWORD dwRate, /* frames/second = (dwRate/dwScale) */ - DWORD dwScale); + DWORD dwScale +); +#define ICDrawBegin WINELIB_NAME(ICDrawBegin) + +/********************* AVIFILE function declarations *************************/ + +/* AVIFileHdr.dwFlags */ +#define AVIF_HASINDEX 0x00000010 /* Index at end of file? */ +#define AVIF_MUSTUSEINDEX 0x00000020 +#define AVIF_ISINTERLEAVED 0x00000100 +#define AVIF_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames*/ +#define AVIF_WASCAPTUREFILE 0x00010000 +#define AVIF_COPYRIGHTED 0x00020000 + +#define AVI_HEADERSIZE 2048 + +/* AVIStreamHeader.dwFlags */ +#define AVISF_DISABLED 0x00000001 +#define AVISF_VIDEO_PALCHANGES 0x00010000 + +typedef struct { + FOURCC fccType; + FOURCC fccHandler; + DWORD dwFlags; /* AVISF_* */ + WORD wPriority; + WORD wLanguage; + DWORD dwInitialFrames; + DWORD dwScale; + DWORD dwRate; /* dwRate / dwScale == samples/second */ + DWORD dwStart; + DWORD dwLength; /* In units above... */ + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT32 rcFrame; +} AVIStreamHeader; + +/* AVIINDEXENTRY.dwFlags */ +#define AVIIF_LIST 0x00000001 /* chunk is a 'LIST' */ +#define AVIIF_KEYFRAME 0x00000010 /* this frame is a key frame. */ + +#define AVIIF_NOTIME 0x00000100 /* this frame doesn't take any time */ +#define AVIIF_COMPUSE 0x0FFF0000 + +typedef struct _AVIINDEXENTRY { + DWORD ckid; + DWORD dwFlags; + DWORD dwChunkOffset; + DWORD dwChunkLength; +} AVIINDEXENTRY; + +typedef struct _AVIPALCHANGE { + BYTE bFirstEntry; + BYTE bNumEntries; + WORD wFlags; /* pad */ + PALETTEENTRY peNew[1]; +} AVIPALCHANGE; + +#define AVIIF_KEYFRAME 0x00000010 /* this frame is a key frame. */ + +#define AVIGETFRAMEF_BESTDISPLAYFMT 1 + +typedef struct _AVISTREAMINFO32A { + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; /* AVIIF_* */ + DWORD dwCaps; + WORD wPriority; + WORD wLanguage; + DWORD dwScale; + DWORD dwRate; /* dwRate / dwScale == samples/second */ + DWORD dwStart; + DWORD dwLength; /* In units above... */ + DWORD dwInitialFrames; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT32 rcFrame; + DWORD dwEditCount; + DWORD dwFormatChangeCount; + CHAR szName[64]; +} AVISTREAMINFO32A, * LPAVISTREAMINFO32A, *PAVISTREAMINFO32A; + +typedef struct _AVISTREAMINFO32W { + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; + DWORD dwCaps; + WORD wPriority; + WORD wLanguage; + DWORD dwScale; + DWORD dwRate; /* dwRate / dwScale == samples/second */ + DWORD dwStart; + DWORD dwLength; /* In units above... */ + DWORD dwInitialFrames; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT32 rcFrame; + DWORD dwEditCount; + DWORD dwFormatChangeCount; + WCHAR szName[64]; +} AVISTREAMINFO32W, * LPAVISTREAMINFO32W, *PAVISTREAMINFO32W; +DECL_WINELIB_TYPE_AW(AVISTREAMINFO); +DECL_WINELIB_TYPE_AW(LPAVISTREAMINFO); +DECL_WINELIB_TYPE_AW(PAVISTREAMINFO); + +#define AVISTREAMINFO_DISABLED 0x00000001 +#define AVISTREAMINFO_FORMATCHANGES 0x00010000 + +/* AVIFILEINFO.dwFlags */ +#define AVIFILEINFO_HASINDEX 0x00000010 +#define AVIFILEINFO_MUSTUSEINDEX 0x00000020 +#define AVIFILEINFO_ISINTERLEAVED 0x00000100 +#define AVIFILEINFO_WASCAPTUREFILE 0x00010000 +#define AVIFILEINFO_COPYRIGHTED 0x00020000 + +/* AVIFILEINFO.dwCaps */ +#define AVIFILECAPS_CANREAD 0x00000001 +#define AVIFILECAPS_CANWRITE 0x00000002 +#define AVIFILECAPS_ALLKEYFRAMES 0x00000010 +#define AVIFILECAPS_NOCOMPRESSION 0x00000020 + +typedef struct _AVIFILEINFO32W { + DWORD dwMaxBytesPerSec; + DWORD dwFlags; + DWORD dwCaps; + DWORD dwStreams; + DWORD dwSuggestedBufferSize; + DWORD dwWidth; + DWORD dwHeight; + DWORD dwScale; + DWORD dwRate; + DWORD dwLength; + DWORD dwEditCount; + WCHAR szFileType[64]; +} AVIFILEINFO32W, * LPAVIFILEINFO32W, *PAVIFILEINFO32W; +typedef struct _AVIFILEINFO32A { + DWORD dwMaxBytesPerSec; + DWORD dwFlags; + DWORD dwCaps; + DWORD dwStreams; + DWORD dwSuggestedBufferSize; + DWORD dwWidth; + DWORD dwHeight; + DWORD dwScale; + DWORD dwRate; + DWORD dwLength; + DWORD dwEditCount; + CHAR szFileType[64]; +} AVIFILEINFO32A, * LPAVIFILEINFO32A, *PAVIFILEINFO32A; +DECL_WINELIB_TYPE_AW(AVIFILEINFO); +DECL_WINELIB_TYPE_AW(PAVIFILEINFO); +DECL_WINELIB_TYPE_AW(LPAVIFILEINFO); + +/* AVICOMPRESSOPTIONS.dwFlags. determines presence of fields in below struct */ +#define AVICOMPRESSF_INTERLEAVE 0x00000001 +#define AVICOMPRESSF_DATARATE 0x00000002 +#define AVICOMPRESSF_KEYFRAMES 0x00000004 +#define AVICOMPRESSF_VALID 0x00000008 + +typedef struct { + DWORD fccType; /* stream type, for consistency */ + DWORD fccHandler; /* compressor */ + DWORD dwKeyFrameEvery; /* keyframe rate */ + DWORD dwQuality; /* compress quality 0-10,000 */ + DWORD dwBytesPerSecond; /* bytes per second */ + DWORD dwFlags; /* flags... see below */ + LPVOID lpFormat; /* save format */ + DWORD cbFormat; + LPVOID lpParms; /* compressor options */ + DWORD cbParms; + DWORD dwInterleaveEvery; /* for non-video streams only */ +} AVICOMPRESSOPTIONS, *LPAVICOMPRESSOPTIONS,*PAVICOMPRESSOPTIONS; + + + +#define DEFINE_AVIGUID(name, l, w1, w2) \ + DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46) + +DEFINE_AVIGUID(IID_IAVIFile, 0x00020020, 0, 0); +DEFINE_AVIGUID(IID_IAVIStream, 0x00020021, 0, 0); +DEFINE_AVIGUID(IID_IAVIStreaming, 0x00020022, 0, 0); +DEFINE_AVIGUID(IID_IGetFrame, 0x00020023, 0, 0); +DEFINE_AVIGUID(IID_IAVIEditStream, 0x00020024, 0, 0); + +DEFINE_AVIGUID(CLSID_AVIFile, 0x00020000, 0, 0); + + +/* IAVIStream32 interface. */ +#define ICOM_INTERFACE IAVIStream32 +typedef struct IAVIStream32 IAVIStream32,*PAVISTREAM32; +ICOM_BEGIN(IAVIStream32, IUnknown) + ICOM_METHOD2(HRESULT,Create,LPARAM,,LPARAM,); + ICOM_METHOD2(HRESULT,Info,AVISTREAMINFO32W*,,LONG,); + ICOM_METHOD2(LONG,FindSample,LONG,,LONG,); + ICOM_METHOD3(HRESULT,ReadFormat,LONG,,LPVOID,,LONG*,); + ICOM_METHOD3(HRESULT,SetFormat,LONG,,LPVOID,,LONG,); + ICOM_METHOD6(HRESULT,Read,LONG,,LONG,,LPVOID,,LONG,,LONG*,,LONG*,); + ICOM_METHOD7(HRESULT,Write,LONG,,LONG,,LPVOID,,LONG,,DWORD,,LONG*,,LONG*,); + ICOM_METHOD2(HRESULT,Delete,LONG,,LONG,); + ICOM_METHOD3(HRESULT,ReadData,DWORD,,LPVOID,,LONG*,); + ICOM_METHOD3(HRESULT,WriteData,DWORD,,LPVOID,,LONG,); + ICOM_METHOD2(HRESULT,SetInfo,AVISTREAMINFO32W*,,LONG,); +ICOM_END(IAVIStream32) +#undef ICOM_INTERFACE + +/* IAVIFile32 interface. In Win32 this interface uses UNICODE only */ +#define ICOM_INTERFACE IAVIFile32 +typedef struct IAVIFile32 IAVIFile32,*PAVIFILE32; +ICOM_BEGIN(IAVIFile32,IUnknown) + ICOM_METHOD2(HRESULT,Info,AVIFILEINFO32W*,,LONG,); + ICOM_METHOD3(HRESULT,GetStream,PAVISTREAM32*,,DWORD,,LONG,); + ICOM_METHOD2(HRESULT,CreateStream,PAVISTREAM32*,,AVISTREAMINFO32W*,); + ICOM_METHOD3(HRESULT,WriteData,DWORD,,LPVOID,,LONG,); + ICOM_METHOD3(HRESULT,ReadData,DWORD,,LPVOID,,LONG*,); + ICOM_METHOD (HRESULT,EndRecord); + ICOM_METHOD2(HRESULT,DeleteStream,DWORD,,LONG,); +ICOM_END(IAVIFile32) +#undef ICOM_INTERFACE + +#define AVIERR_OK 0 +#define MAKE_AVIERR(error) MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x4000+error) + +#define AVIERR_UNSUPPORTED MAKE_AVIERR(101) +#define AVIERR_BADFORMAT MAKE_AVIERR(102) +#define AVIERR_MEMORY MAKE_AVIERR(103) +#define AVIERR_INTERNAL MAKE_AVIERR(104) +#define AVIERR_BADFLAGS MAKE_AVIERR(105) +#define AVIERR_BADPARAM MAKE_AVIERR(106) +#define AVIERR_BADSIZE MAKE_AVIERR(107) +#define AVIERR_BADHANDLE MAKE_AVIERR(108) +#define AVIERR_FILEREAD MAKE_AVIERR(109) +#define AVIERR_FILEWRITE MAKE_AVIERR(110) +#define AVIERR_FILEOPEN MAKE_AVIERR(111) +#define AVIERR_COMPRESSOR MAKE_AVIERR(112) +#define AVIERR_NOCOMPRESSOR MAKE_AVIERR(113) +#define AVIERR_READONLY MAKE_AVIERR(114) +#define AVIERR_NODATA MAKE_AVIERR(115) +#define AVIERR_BUFFERTOOSMALL MAKE_AVIERR(116) +#define AVIERR_CANTCOMPRESS MAKE_AVIERR(117) +#define AVIERR_USERABORT MAKE_AVIERR(198) +#define AVIERR_ERROR MAKE_AVIERR(199) + +void WINAPI AVIFileInit32(void); +#define AVIFileInit WINELIB_NAME(AVIFileInit) + +HRESULT WINAPI AVIFileOpen32A(PAVIFILE32 * ppfile,LPCSTR szFile,UINT32 uMode,LPCLSID lpHandler); +#define AVIFileOpen WINELIB_NAME_AW(AVIFileOpen) + +HRESULT WINAPI AVIFileCreateStream32A(PAVIFILE32 pfile,PAVISTREAM32 *ppavi,AVISTREAMINFO32A * psi); +HRESULT WINAPI AVIFileCreateStream32W(PAVIFILE32 pfile,PAVISTREAM32 *ppavi,AVISTREAMINFO32W * psi); +#define AVIFileCreateStream WINELIB_NAME_AW(AVIFileCreateStream) +HRESULT WINAPI AVIMakeCompressedStream32(PAVISTREAM32*ppsCompressed,PAVISTREAM32 ppsSource,AVICOMPRESSOPTIONS *lpOptions,CLSID*pclsidHandler); +#define AVIMakeCompressedStream WINELIB_NAME_AW(AVIMakeCompressedStream) +HRESULT WINAPI AVIStreamSetFormat32(PAVISTREAM32 iface,LONG pos,LPVOID format,LONG formatsize); +#define AVIStreamSetFormat WINELIB_NAME(AVIStreamSetFormat) +HRESULT WINAPI AVIStreamWrite32(PAVISTREAM32 iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten); +#define AVIStreamWrite WINELIB_NAME(AVIStreamWrite) +ULONG WINAPI AVIStreamRelease32(PAVISTREAM32 iface); +#define AVIStreamRelease WINELIB_NAME(AVIStreamRelease) +ULONG WINAPI AVIFileRelease32(PAVIFILE32 iface); +#define AVIFileRelease WINELIB_NAME(AVIFileRelease) +void WINAPI AVIFileExit32(void); +#define AVIFileExit WINELIB_NAME(AVIFileExit) + #endif diff --git a/include/winerror.h b/include/winerror.h index ea61294467b..f3367b3b8ba 100644 --- a/include/winerror.h +++ b/include/winerror.h @@ -4,6 +4,7 @@ extern int WIN32_LastError; +#define FACILITY_ITF 4 #define FACILITY_WIN32 7 #define SEVERITY_ERROR 1 diff --git a/include/wintypes.h b/include/wintypes.h index e456dadd512..fc981dd6e86 100644 --- a/include/wintypes.h +++ b/include/wintypes.h @@ -89,6 +89,7 @@ typedef unsigned short WCHAR; typedef unsigned short BOOL16; typedef int BOOL32; typedef double DATE; +typedef long SCODE; typedef long LONG_PTR; typedef unsigned long ULONG_PTR; #ifdef __i386__ @@ -301,6 +302,7 @@ DECL_WINELIB_TYPE(HFILE) DECL_WINELIB_TYPE(HFONT) DECL_WINELIB_TYPE(HGDIOBJ) DECL_WINELIB_TYPE(HGLOBAL) +DECL_WINELIB_TYPE(HIC) DECL_WINELIB_TYPE(HICON) DECL_WINELIB_TYPE(HINSTANCE) DECL_WINELIB_TYPE(HLOCAL) diff --git a/multimedia/msvideo.c b/multimedia/msvideo.c index 177803d91c2..38aea13b91b 100644 --- a/multimedia/msvideo.c +++ b/multimedia/msvideo.c @@ -2,6 +2,7 @@ * Copyright 1998 Marcus Meissner */ #include +#include #include "windows.h" #include "driver.h" @@ -36,7 +37,7 @@ ICInfo32( char type[5],buf[2000]; memcpy(type,&fccType,4);type[4]=0; - TRACE(mmsys,"(%s,%ld,%p).\n",type,fccHandler,lpicinfo); + TRACE(msvideo,"(%s,%ld,%p).\n",type,fccHandler,lpicinfo); /* does OpenDriver/CloseDriver */ lpicinfo->dwSize = sizeof(ICINFO32); lpicinfo->fccType = fccType; @@ -69,8 +70,13 @@ ICOpen32(DWORD fccType,DWORD fccHandler,UINT32 wMode) { memcpy(type,&fccType,4);type[4]=0; memcpy(handler,&fccHandler,4);handler[4]=0; - TRACE(mmsys,"(%s,%s,0x%08lx)\n",type,handler,(DWORD)wMode); - sprintf(codecname,"%s.%s",type,handler); + TRACE(msvideo,"(%s,%s,0x%08lx)\n",type,handler,(DWORD)wMode); + /* FIXME: When do we use 'vids' , when 'vidc'? Unclear */ + if (!strcasecmp(type,"vids")) { + sprintf(codecname,"vidc.%s",handler); + fccType = mmioFOURCC('v','i','d','c'); + } else + sprintf(codecname,"%s.%s",type,handler); hdrv=OpenDriver32A(codecname,"drivers32",0); if (!hdrv) return 0; @@ -83,7 +89,8 @@ ICOpen32(DWORD fccType,DWORD fccHandler,UINT32 wMode) { icopen.fccType = fccType; icopen.fccHandler = fccHandler; icopen.dwSize = sizeof(ICOPEN); - /* FIXME: fill out rest too... */ + icopen.dwFlags = wMode; + /* FIXME: do we need to fill out the rest too? */ whic->private = whic->driverproc(0,hdrv,DRV_OPEN,0,&icopen); return (HIC32)whic; } @@ -91,20 +98,60 @@ ICOpen32(DWORD fccType,DWORD fccHandler,UINT32 wMode) { LRESULT WINAPI ICGetInfo32(HIC32 hic,ICINFO32 *picinfo,DWORD cb) { LRESULT ret; - WINE_HIC *whic = (WINE_HIC*)hic; - TRACE(mmsys,"(0x%08lx,%p,%ld)\n",(DWORD)hic,picinfo,cb); - ret = ICSendMessage32(whic,ICM_GETINFO,(DWORD)picinfo,cb); - TRACE(mmsys," -> 0x%08lx\n",ret); + TRACE(msvideo,"(0x%08lx,%p,%ld)\n",(DWORD)hic,picinfo,cb); + ret = ICSendMessage32(hic,ICM_GETINFO,(DWORD)picinfo,cb); + TRACE(msvideo," -> 0x%08lx\n",ret); return ret; } +DWORD VFWAPIV +ICCompress32( + HIC32 hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiOutput,LPVOID lpData, + LPBITMAPINFOHEADER lpbiInput,LPVOID lpBits,LPDWORD lpckid, + LPDWORD lpdwFlags,LONG lFrameNum,DWORD dwFrameSize,DWORD dwQuality, + LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev +) { + ICCOMPRESS iccmp; + + iccmp.dwFlags = dwFlags; + + iccmp.lpbiOutput = lpbiOutput; + iccmp.lpOutput = lpData; + iccmp.lpbiInput = lpbiInput; + iccmp.lpInput = lpBits; + + iccmp.lpckid = lpckid; + iccmp.lpdwFlags = lpdwFlags; + iccmp.lFrameNum = lFrameNum; + iccmp.dwFrameSize = dwFrameSize; + iccmp.dwQuality = dwQuality; + iccmp.lpbiPrev = lpbiPrev; + iccmp.lpPrev = lpPrev; + return ICSendMessage32(hic,ICM_COMPRESS,(LPARAM)&iccmp,sizeof(iccmp)); +} + +DWORD VFWAPIV +ICDecompress32(HIC32 hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,LPVOID lpData,LPBITMAPINFOHEADER lpbi,LPVOID lpBits) { + ICDECOMPRESS icd; + + icd.dwFlags = dwFlags; + icd.lpbiInput = lpbiFormat; + icd.lpInput = lpData; + + icd.lpbiOutput = lpbi; + icd.lpOutput = lpBits; + /* + icd.ckid = ??? ckid from AVI file? how do we get it? ; + */ + return ICSendMessage32(hic,ICM_DECOMPRESS,(LPARAM)&icd,sizeof(icd)); +} HIC32 WINAPI ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags ) { - FIXME(mmsys,"stub!\n"); + FIXME(msvideo,"stub!\n"); return 0; } @@ -113,19 +160,57 @@ ICSendMessage32(HIC32 hic,UINT32 msg,DWORD lParam1,DWORD lParam2) { LRESULT ret; WINE_HIC *whic = (WINE_HIC*)hic; +#define XX(x) case x: TRACE(msvideo,"(0x%08lx,"#x",0x%08lx,0x%08lx)\n",(DWORD)hic,lParam1,lParam2);break; + switch (msg) { - case ICM_GETINFO: - FIXME(mmsys,"(0x%08lx,ICM_GETINFO,0x%08lx,0x%08lx)\n",(DWORD)hic,lParam1,lParam2); - break; + XX(ICM_ABOUT) + XX(ICM_GETINFO) + XX(ICM_COMPRESS_FRAMES_INFO) + XX(ICM_COMPRESS_GET_FORMAT) + XX(ICM_COMPRESS_GET_SIZE) + XX(ICM_COMPRESS_QUERY) + XX(ICM_COMPRESS_BEGIN) + XX(ICM_COMPRESS) + XX(ICM_COMPRESS_END) + XX(ICM_DECOMPRESS_GET_FORMAT) + XX(ICM_DECOMPRESS_QUERY) + XX(ICM_DECOMPRESS_BEGIN) + XX(ICM_DECOMPRESS) + XX(ICM_DECOMPRESS_END) + XX(ICM_DECOMPRESS_SET_PALETTE) + XX(ICM_DECOMPRESS_GET_PALETTE) + XX(ICM_DRAW_QUERY) + XX(ICM_DRAW_BEGIN) + XX(ICM_DRAW_GET_PALETTE) + XX(ICM_DRAW_START) + XX(ICM_DRAW_STOP) + XX(ICM_DRAW_END) + XX(ICM_DRAW_GETTIME) + XX(ICM_DRAW) + XX(ICM_DRAW_WINDOW) + XX(ICM_DRAW_SETTIME) + XX(ICM_DRAW_REALIZE) + XX(ICM_DRAW_FLUSH) + XX(ICM_DRAW_RENDERBUFFER) + XX(ICM_DRAW_START_PLAY) + XX(ICM_DRAW_STOP_PLAY) + XX(ICM_DRAW_SUGGESTFORMAT) + XX(ICM_DRAW_CHANGEPALETTE) + XX(ICM_GETBUFFERSWANTED) + XX(ICM_GETDEFAULTKEYFRAMERATE) + XX(ICM_DECOMPRESSEX_BEGIN) + XX(ICM_DECOMPRESSEX_QUERY) + XX(ICM_DECOMPRESSEX) + XX(ICM_DECOMPRESSEX_END) + XX(ICM_SET_STATUS_PROC) default: - FIXME(mmsys,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx)\n",(DWORD)hic,(DWORD)msg,lParam1,lParam2); + FIXME(msvideo,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx)\n",(DWORD)hic,(DWORD)msg,lParam1,lParam2); } ret = whic->driverproc(whic->private,whic->hdrv,msg,lParam1,lParam2); - FIXME(mmsys," -> 0x%08lx\n",ret); + TRACE(msvideo," -> 0x%08lx\n",ret); return ret; } - DWORD VFWAPIV ICDrawBegin32( HIC32 hic, DWORD dwFlags,/* flags */ @@ -146,23 +231,28 @@ DWORD VFWAPIV ICDrawBegin32( return 0; } +LRESULT WINAPI ICClose32(HIC32 hic) { + FIXME(msvideo,"(%d),stub!\n",hic); + return 0; +} + HANDLE32 /* HDRAWDIB */ WINAPI DrawDibOpen32( void ) { - FIXME(mmsys,"stub!\n"); + FIXME(msvideo,"stub!\n"); return 0; } HWND32 VFWAPIV MCIWndCreate32 (HWND32 hwndParent, HINSTANCE32 hInstance, DWORD dwStyle,LPVOID szFile) -{ FIXME(mmsys,"%x %x %lx %p\n",hwndParent, hInstance, dwStyle, szFile); +{ FIXME(msvideo,"%x %x %lx %p\n",hwndParent, hInstance, dwStyle, szFile); return 0; } HWND32 VFWAPIV MCIWndCreate32A(HWND32 hwndParent, HINSTANCE32 hInstance, DWORD dwStyle,LPCSTR szFile) -{ FIXME(mmsys,"%x %x %lx %s\n",hwndParent, hInstance, dwStyle, szFile); +{ FIXME(msvideo,"%x %x %lx %s\n",hwndParent, hInstance, dwStyle, szFile); return 0; } HWND32 VFWAPIV MCIWndCreate32W(HWND32 hwndParent, HINSTANCE32 hInstance, DWORD dwStyle,LPCWSTR szFile) -{ FIXME(mmsys,"%x %x %lx %s\n",hwndParent, hInstance, dwStyle, debugstr_w(szFile)); +{ FIXME(msvideo,"%x %x %lx %s\n",hwndParent, hInstance, dwStyle, debugstr_w(szFile)); return 0; } diff --git a/ole/guid.c b/ole/guid.c index 5de3c108e94..1477676f546 100644 --- a/ole/guid.c +++ b/ole/guid.c @@ -15,5 +15,6 @@ #include "dinput.h" #include "dsound.h" #include "dplay.h" +#include "vfw.h" #endif diff --git a/programs/Makefile.in b/programs/Makefile.in index 3d498e777b4..4e15ece7421 100644 --- a/programs/Makefile.in +++ b/programs/Makefile.in @@ -1,4 +1,5 @@ SUBDIRS = \ + avitools \ clock \ control \ notepad \ diff --git a/programs/avitools/.cvsignore b/programs/avitools/.cvsignore new file mode 100644 index 00000000000..365d3f2f316 --- /dev/null +++ b/programs/avitools/.cvsignore @@ -0,0 +1,2 @@ +Makefile +icinfo diff --git a/programs/avitools/Makefile.in b/programs/avitools/Makefile.in new file mode 100644 index 00000000000..f031d955551 --- /dev/null +++ b/programs/avitools/Makefile.in @@ -0,0 +1,56 @@ +DEFS = -DWINELIB +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = none +PROGRAMS = icinfo +ALL_LIBS = $(WINELIB) $(X_LIBS) $(XLIB) $(LIBS) +RCFLAGS = -w32 -h +WRCEXTRA = -A -p $* + +LANGUAGES = +LICENSELANG = + +MOSTSRCS = \ + icinfo.c + +# Some strings need addresses >= 0x10000 +STRINGSRCS = \ + $(LICENSELANG:%=License_%.c) + +RC_SRCS = $(LANGUAGES:%=%.rc) + +C_SRCS = $(MOSTSRCS) $(STRINGSRCS) + +MOSTOBJS = $(MOSTSRCS:.c=.o) +STRINGOBJS = $(STRINGSRCS:.c=.o) $(RC_SRCS:.rc=.o) + +all: check_wrc $(PROGRAMS) + +depend:: + +@MAKE_RULES@ + +# Override resource compiler rules +.rc.s: + $(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P -x c $< | $(WRC) $(WRCFLAGS) $(WRCEXTRA) -o $*.s + +.rc.h: + $(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P -x c $< | $(WRC) $(WRCFLAGS) $(WRCEXTRA) -nH $*.h + + +icinfo: $(MOSTOBJS) $(STRINGOBJS) + $(CC) -o icinfo $(MOSTOBJS) $(LDOPTIONS) $(ALL_LIBS) $(STRINGOBJS) + +install: dummy + $(INSTALL_PROGRAM) clock $(bindir)/clock + +uninstall: dummy + $(RM) $(bindir)/clock + +$(RC_SRCS:.rc=.s): $(WRC) + +dummy: + +### Dependencies: diff --git a/programs/avitools/icinfo.c b/programs/avitools/icinfo.c new file mode 100644 index 00000000000..e3c12913b30 --- /dev/null +++ b/programs/avitools/icinfo.c @@ -0,0 +1,77 @@ +#include +#include +#include "wintypes.h" +#include "windows.h" +#include "mmsystem.h" +#include "vfw.h" + + +int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show) +{ + int n=0,doabout=0,doconfigure=0; + char buf[128],type[5],handler[5]; + HMODULE msvfw32 = LoadLibrary("msvfw32.dll"); + +BOOL32 (VFWAPI *fnICInfo)(DWORD fccType, DWORD fccHandler, ICINFO * lpicinfo); +LRESULT (VFWAPI *fnICClose)(HIC hic); +HIC (VFWAPI *fnICOpen)(DWORD fccType, DWORD fccHandler, UINT wMode); +LRESULT (VFWAPI *fnICGetInfo)(HIC hic,ICINFO *picinfo, DWORD cb); +LRESULT (VFWAPI *fnICSendMessage)(HIC hic, UINT msg, DWORD dw1, DWORD dw2); + +#define XX(x) fn##x = (void*)GetProcAddress(msvfw32,#x); + XX(ICInfo); + XX(ICOpen); + XX(ICClose); + XX(ICGetInfo); + XX(ICSendMessage); +#undef XX + + if (strstr(cmdline,"-about")) + doabout = 1; + if (strstr(cmdline,"-configure")) + doconfigure = 1; + + printf("Currently installed Video Compressors:\n"); + while (1) { + ICINFO ii; + HIC hic; + + ii.dwSize = sizeof(ii); + if (!fnICInfo(ICTYPE_VIDEO,n++,&ii)) + break; + if (!(hic=fnICOpen(ii.fccType,ii.fccHandler,ICMODE_QUERY))) + continue; + if (!fnICGetInfo(hic,&ii,sizeof(ii))) { + fnICClose(hic); + continue; + } +#define w2s(w,s) WideCharToMultiByte(0,0,w,-1,s,128,0,NULL) + + w2s(ii.szName,buf); + memcpy(type,&(ii.fccType),4);type[4]='\0'; + memcpy(handler,&(ii.fccHandler),4);handler[4]='\0'; + printf("%s.%s: %s\n",type,handler,buf); + printf("\tdwFlags: 0x%08lx (",ii.dwFlags); +#define XX(x) if (ii.dwFlags & x) printf(#x" "); + XX(VIDCF_QUALITY); + XX(VIDCF_CRUNCH); + XX(VIDCF_TEMPORAL); + XX(VIDCF_COMPRESSFRAMES); + XX(VIDCF_DRAW); + XX(VIDCF_FASTTEMPORALC); + XX(VIDCF_FASTTEMPORALD); + XX(VIDCF_QUALITYTIME); +#undef XX + printf(")\n"); + printf("\tdwVersion: 0x%08lx\n",ii.dwVersion); + printf("\tdwVersionICM: 0x%08lx\n",ii.dwVersionICM); + w2s(ii.szDescription,buf); + printf("\tszDescription: %s\n",buf); + if (doabout) ICAbout(hic,0); + if (doconfigure && ICQueryConfigure32(hic)) + ICConfigure(hic,0); + fnICClose(hic); + } + return 0; +} + diff --git a/relay32/msvfw32.spec b/relay32/msvfw32.spec index b289038a72a..9fc550a9b00 100644 --- a/relay32/msvfw32.spec +++ b/relay32/msvfw32.spec @@ -1,6 +1,9 @@ name msvfw32 type win32 +# Yes, ICCompress,ICDecompress,MCIWnd* and ICDraw* are cdecl (VFWAPIV). +# The rest is stdcall (VFWAPI) however. -Marcus Meissner, 990124 + 2 stdcall VideoForWindowsVersion() VideoForWindowsVersion 3 stub DrawDibBegin 4 stub DrawDibChangePalette @@ -21,13 +24,13 @@ type win32 19 stub GetOpenFileNamePreviewW 20 stub GetSaveFileNamePreviewA 21 stub GetSaveFileNamePreviewW - 22 stub ICClose - 23 stub ICCompress + 22 stdcall ICClose(long) ICClose32 + 23 cdecl ICCompress(long long ptr ptr ptr ptr ptr ptr long long long ptr ptr) ICCompress32 24 stub ICCompressorChoose 25 stub ICCompressorFree - 26 stub ICDecompress - 27 stub ICDraw - 28 stdcall ICDrawBegin(long long long long long long long long long ptr long long long long long long) ICDrawBegin32 + 26 cdecl ICDecompress(long long ptr ptr ptr ptr) ICDecompress32 + 27 stub ICDraw # CDECL too + 28 cdecl ICDrawBegin(long long long long long long long long long ptr long long long long long long) ICDrawBegin32 29 stub ICGetDisplayFormat 30 stdcall ICGetInfo(long ptr long) ICGetInfo32 31 stub ICImageCompress @@ -43,9 +46,9 @@ type win32 41 stub ICSeqCompressFrame 42 stub ICSeqCompressFrameEnd 43 stub ICSeqCompressFrameStart - 44 stdcall MCIWndCreate (long long long ptr) MCIWndCreate32 - 45 stdcall MCIWndCreateA (long long long str) MCIWndCreate32A - 46 stdcall MCIWndCreateW (long long long wstr) MCIWndCreate32W + 44 cdecl MCIWndCreate (long long long ptr) MCIWndCreate32 + 45 cdecl MCIWndCreateA (long long long str) MCIWndCreate32A + 46 cdecl MCIWndCreateW (long long long wstr) MCIWndCreate32W 47 stub MCIWndRegisterClass 48 stub StretchDIB 49 stub ls_ThunkData32 -- 2.11.4.GIT