From c5485a4bf06e65190b042a5b171af8cf1fc27df3 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 1 Mar 2016 18:31:48 +0000 Subject: [PATCH] [AVIFIL32] Sync with Wine Staging 1.9.4. CORE-10912 svn path=/trunk/; revision=70842 --- reactos/dll/win32/avifil32/CMakeLists.txt | 9 +- reactos/dll/win32/avifil32/api.c | 28 ++--- reactos/dll/win32/avifil32/avifil32.idl | 25 +++-- reactos/dll/win32/avifil32/avifile_ifaces.idl | 105 ++++++++++++++++++ reactos/dll/win32/avifil32/avifile_private.h | 1 + reactos/dll/win32/avifil32/factory.c | 8 +- reactos/dll/win32/avifil32/getframe.c | 102 +++++++++-------- reactos/media/doc/README.WINE | 2 +- 8 files changed, 198 insertions(+), 82 deletions(-) create mode 100644 reactos/dll/win32/avifil32/avifile_ifaces.idl diff --git a/reactos/dll/win32/avifil32/CMakeLists.txt b/reactos/dll/win32/avifil32/CMakeLists.txt index 1b73ab76da8..ba25a4b6fda 100644 --- a/reactos/dll/win32/avifil32/CMakeLists.txt +++ b/reactos/dll/win32/avifil32/CMakeLists.txt @@ -2,9 +2,10 @@ remove_definitions(-D_WIN32_WINNT=0x502) add_definitions(-D_WIN32_WINNT=0x600) -add_definitions(-D__WINESRC__) +add_definitions(-D__WINESRC__ -DENTRY_PREFIX=avifil32_) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) spec2def(avifil32.dll avifil32.spec ADD_IMPORTLIB) +add_rpcproxy_files(avifil32.idl) list(APPEND SOURCE acmstream.c @@ -17,16 +18,18 @@ list(APPEND SOURCE icmstream.c tmpfile.c wavfile.c + ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c avifile_private.h) add_library(avifil32 SHARED ${SOURCE} guid.c rsrc.rc + ${CMAKE_CURRENT_BINARY_DIR}/avifil32_p.c ${CMAKE_CURRENT_BINARY_DIR}/avifil32.def) set_module_type(avifil32 win32dll) -target_link_libraries(avifil32 wine) -add_importlibs(avifil32 msacm32 msvfw32 winmm ole32 user32 advapi32 msvcrt kernel32 ntdll) +target_link_libraries(avifil32 wine ${PSEH_LIB}) +add_importlibs(avifil32 msacm32 msvfw32 winmm ole32 user32 advapi32 rpcrt4 msvcrt kernel32 ntdll) add_pch(avifil32 avifile_private.h SOURCE) add_cd_file(TARGET avifil32 DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/avifil32/api.c b/reactos/dll/win32/avifil32/api.c index 7f9e768990c..191c29d4655 100644 --- a/reactos/dll/win32/avifil32/api.c +++ b/reactos/dll/win32/avifil32/api.c @@ -2256,7 +2256,7 @@ HRESULT WINAPI AVIPutFileOnClipboard(PAVIFILE pfile) HRESULT WINAPIV AVISaveA(LPCSTR szFile, CLSID * pclsidHandler, AVISAVECALLBACK lpfnCallback, int nStreams, PAVISTREAM pavi, LPAVICOMPRESSOPTIONS lpOptions, ...) { - va_list vl; + __ms_va_list vl; int i; HRESULT ret; PAVISTREAM *streams; @@ -2267,8 +2267,8 @@ HRESULT WINAPIV AVISaveA(LPCSTR szFile, CLSID * pclsidHandler, AVISAVECALLBACK l if (nStreams <= 0) return AVIERR_BADPARAM; - streams = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(void *)); - options = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(void *)); + streams = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(*streams)); + options = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(*options)); if (!streams || !options) { ret = AVIERR_MEMORY; @@ -2278,13 +2278,13 @@ HRESULT WINAPIV AVISaveA(LPCSTR szFile, CLSID * pclsidHandler, AVISAVECALLBACK l streams[0] = pavi; options[0] = lpOptions; - va_start(vl, lpOptions); + __ms_va_start(vl, lpOptions); for (i = 1; i < nStreams; i++) { - streams[i] = va_arg(vl, void *); - options[i] = va_arg(vl, void *); + streams[i] = va_arg(vl, PAVISTREAM); + options[i] = va_arg(vl, PAVICOMPRESSOPTIONS); } - va_end(vl); + __ms_va_end(vl); for (i = 0; i < nStreams; i++) TRACE("Pair[%d] - Stream = %p, Options = %p\n", i, streams[i], options[i]); @@ -2299,7 +2299,7 @@ error: HRESULT WINAPIV AVISaveW(LPCWSTR szFile, CLSID * pclsidHandler, AVISAVECALLBACK lpfnCallback, int nStreams, PAVISTREAM pavi, LPAVICOMPRESSOPTIONS lpOptions, ...) { - va_list vl; + __ms_va_list vl; int i; HRESULT ret; PAVISTREAM *streams; @@ -2310,8 +2310,8 @@ HRESULT WINAPIV AVISaveW(LPCWSTR szFile, CLSID * pclsidHandler, AVISAVECALLBACK if (nStreams <= 0) return AVIERR_BADPARAM; - streams = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(void *)); - options = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(void *)); + streams = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(*streams)); + options = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(*options)); if (!streams || !options) { ret = AVIERR_MEMORY; @@ -2321,13 +2321,13 @@ HRESULT WINAPIV AVISaveW(LPCWSTR szFile, CLSID * pclsidHandler, AVISAVECALLBACK streams[0] = pavi; options[0] = lpOptions; - va_start(vl, lpOptions); + __ms_va_start(vl, lpOptions); for (i = 1; i < nStreams; i++) { - streams[i] = va_arg(vl, void *); - options[i] = va_arg(vl, void *); + streams[i] = va_arg(vl, PAVISTREAM); + options[i] = va_arg(vl, PAVICOMPRESSOPTIONS); } - va_end(vl); + __ms_va_end(vl); for (i = 0; i < nStreams; i++) TRACE("Pair[%d] - Stream = %p, Options = %p\n", i, streams[i], options[i]); diff --git a/reactos/dll/win32/avifil32/avifil32.idl b/reactos/dll/win32/avifil32/avifil32.idl index 1f50f154ae1..e23c1760513 100644 --- a/reactos/dll/win32/avifil32/avifil32.idl +++ b/reactos/dll/win32/avifil32/avifil32.idl @@ -18,39 +18,42 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#pragma makedep proxy #pragma makedep register +#include "avifile_ifaces.idl" + +[ + helpstring("IAVIStream & IAVIFile Proxy"), + threading(both), + uuid(0002000d-0000-0000-c000-000000000046) +] +coclass PSFactoryBuffer { interface IFactoryBuffer; } + [ helpstring("Microsoft AVI Files"), - threading(apartment), + threading(both), uuid(00020000-0000-0000-C000-000000000046) ] coclass AVIFile { interface IAVIFile; } [ helpstring("AVI Compressed Stream"), - threading(apartment), + threading(both), uuid(00020001-0000-0000-c000-000000000046) ] coclass ICMStream { interface IAVIStream; } [ helpstring("Microsoft Wave File"), - threading(apartment), + threading(both), uuid(00020003-0000-0000-c000-000000000046) ] coclass WAVFile { interface IAVIFile; } -[ - helpstring("IAVIStream & IAVIFile Proxy"), - threading(apartment), - uuid(0002000d-0000-0000-c000-000000000046) -] -coclass AVIProxy { } - [ helpstring("ACM Compressed Audio Stream"), - threading(apartment), + threading(both), uuid(0002000f-0000-0000-c000-000000000046) ] coclass ACMStream { interface IAVIStream; } diff --git a/reactos/dll/win32/avifil32/avifile_ifaces.idl b/reactos/dll/win32/avifil32/avifile_ifaces.idl new file mode 100644 index 00000000000..f9280e57287 --- /dev/null +++ b/reactos/dll/win32/avifil32/avifile_ifaces.idl @@ -0,0 +1,105 @@ +/* + * Proxy support for avifil32 + * + * Copyright 2016 Dmitry Timoshkov + * + * 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.1 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* + * These interface descriptions are supposed to be used for automatic proxy + * generation by an IDL compiler. + * + * While it's possible to convert include/vfw.h to an .idl, that's proved to + * be a major waste of an effort because the resulting interface descriptions + * can't be used for automatic proxy generation since they are not compatible + * with IDL compiler restrictions for proxies, and fixing them up would make + * generated vfw.h source incompatible with PSDK's equivalent. + */ + +import "wtypes.idl"; +import "unknwn.idl"; + +typedef struct _AVISTREAMINFOW +{ + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; + DWORD dwCaps; + WORD wPriority; + WORD wLanguage; + DWORD dwScale; + DWORD dwRate; + DWORD dwStart; + DWORD dwLength; + DWORD dwInitialFrames; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT rcFrame; + DWORD dwEditCount; + DWORD dwFormatChangeCount; + WCHAR szName[64]; +} AVISTREAMINFOW; + +[ + object, + uuid(00020021-0000-0000-c000-000000000046) +] +interface IAVIStream : IUnknown +{ + HRESULT Create(LPARAM lParam1, LPARAM lParam2); + HRESULT Info(AVISTREAMINFOW *psi, LONG lSize); + LONG FindSample(LONG lPos, LONG lFlags); + HRESULT ReadFormat(LONG lPos, [out,size_is(*lpcbFormat)] char *lpFormat, [in,out] LONG *lpcbFormat); + HRESULT SetFormat(LONG lPos, [in,size_is(cbFormat)] char *lpFormat, LONG cbFormat); + HRESULT Read(LONG lStart, LONG lSamples, [out,size_is(cbBuffer)] char *lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples); + HRESULT Write(LONG lStart, LONG lSamples, [in,size_is(cbBuffer)] char *lpBuffer, LONG cbBuffer, DWORD dwFlags, LONG *plSampWritten, LONG *plBytesWritten); + HRESULT Delete(LONG lStart, LONG lSamples); + HRESULT ReadData(DWORD fcc, [out,size_is(*lpcbBuffer)] char *lpBuffer, [in,out] LONG *lpcbBuffer); + HRESULT WriteData(DWORD fcc, [in,size_is(cbBuffer)] char *lpBuffer, LONG cbBuffer); + HRESULT SetInfo(AVISTREAMINFOW *plInfo, LONG cbInfo); +}; + +typedef struct _AVIFILEINFOW +{ + 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]; +} AVIFILEINFOW; + +[ + object, + uuid(00020020-0000-0000-c000-000000000046) +] +interface IAVIFile : IUnknown +{ + HRESULT Info(AVIFILEINFOW *pfi, LONG lSize); + HRESULT GetStream(IAVIStream **ppStream, DWORD fccType, LONG lParam); + HRESULT CreateStream(IAVIStream **ppStream, AVISTREAMINFOW *psi); + HRESULT WriteData(DWORD fcc, [in,size_is(cbBuffer)] char *lpBuffer, LONG cbBuffer); + HRESULT ReadData(DWORD fcc, [out,size_is(*lpcbBuffer)] char *lpBuffer, [in,out] LONG *lpcbBuffer); + HRESULT EndRecord(void); + HRESULT DeleteStream(DWORD fccType, LONG lParam); +}; diff --git a/reactos/dll/win32/avifil32/avifile_private.h b/reactos/dll/win32/avifil32/avifile_private.h index 45fe468fa78..95d350cb7f2 100644 --- a/reactos/dll/win32/avifil32/avifile_private.h +++ b/reactos/dll/win32/avifil32/avifile_private.h @@ -70,5 +70,6 @@ extern PGETFRAME AVIFILE_CreateGetFrame(PAVISTREAM pstream) DECLSPEC_HIDDEN; extern PAVIFILE AVIFILE_CreateAVITempFile(int nStreams, const PAVISTREAM *ppStreams) DECLSPEC_HIDDEN; extern LPCWSTR AVIFILE_BasenameW(LPCWSTR szFileName) DECLSPEC_HIDDEN; +extern HRESULT WINAPI avifil32_DllGetClassObject(REFCLSID pclsid, REFIID piid, LPVOID *ppv) DECLSPEC_HIDDEN; #endif /* __AVIFILE_PRIVATE_H */ diff --git a/reactos/dll/win32/avifil32/factory.c b/reactos/dll/win32/avifil32/factory.c index d0eb1efdb3b..5e939cf49e4 100644 --- a/reactos/dll/win32/avifil32/factory.c +++ b/reactos/dll/win32/avifil32/factory.c @@ -179,12 +179,18 @@ LPCWSTR AVIFILE_BasenameW(LPCWSTR szPath) */ HRESULT WINAPI DllGetClassObject(REFCLSID pclsid, REFIID piid, LPVOID *ppv) { + HRESULT hr; + TRACE("(%s,%s,%p)\n", debugstr_guid(pclsid), debugstr_guid(piid), ppv); if (pclsid == NULL || piid == NULL || ppv == NULL) return E_FAIL; - return AVIFILE_CreateClassFactory(pclsid,piid,ppv); + hr = AVIFILE_CreateClassFactory(pclsid,piid,ppv); + if (SUCCEEDED(hr)) + return hr; + + return avifil32_DllGetClassObject(pclsid,piid,ppv); } /***************************************************************************** diff --git a/reactos/dll/win32/avifil32/getframe.c b/reactos/dll/win32/avifil32/getframe.c index 8dac825e404..23da880c0ee 100644 --- a/reactos/dll/win32/avifil32/getframe.c +++ b/reactos/dll/win32/avifil32/getframe.c @@ -394,8 +394,6 @@ static HRESULT WINAPI IGetFrame_fnSetFormat(IGetFrame *iface, lpbi->biSize + lpbi->biClrUsed * sizeof(RGBQUAD)); if (lpbi->biBitCount <= 8) ICDecompressGetPalette(This->hic, This->lpInFormat, This->lpOutFormat); - - return AVIERR_OK; } else { if (bBestDisplay) { ICGetDisplayFormat(This->hic, This->lpInFormat, @@ -405,64 +403,64 @@ static HRESULT WINAPI IGetFrame_fnSetFormat(IGetFrame *iface, AVIFILE_CloseCompressor(This); return AVIERR_NOCOMPRESSOR; } + } - /* check output format */ - if (This->lpOutFormat->biClrUsed == 0 && - This->lpOutFormat->biBitCount <= 8) - This->lpOutFormat->biClrUsed = 1u << This->lpOutFormat->biBitCount; - if (This->lpOutFormat->biSizeImage == 0 && - This->lpOutFormat->biCompression == BI_RGB) { - This->lpOutFormat->biSizeImage = - DIBWIDTHBYTES(*This->lpOutFormat) * This->lpOutFormat->biHeight; - } + /* check output format */ + if (This->lpOutFormat->biClrUsed == 0 && + This->lpOutFormat->biBitCount <= 8) + This->lpOutFormat->biClrUsed = 1u << This->lpOutFormat->biBitCount; + if (This->lpOutFormat->biSizeImage == 0 && + This->lpOutFormat->biCompression == BI_RGB) { + This->lpOutFormat->biSizeImage = + DIBWIDTHBYTES(*This->lpOutFormat) * This->lpOutFormat->biHeight; + } - if (lpBits == NULL) { - DWORD size = This->lpOutFormat->biClrUsed * sizeof(RGBQUAD); + if (lpBits == NULL) { + DWORD size = This->lpOutFormat->biClrUsed * sizeof(RGBQUAD); - size += This->lpOutFormat->biSize + This->lpOutFormat->biSizeImage; - This->lpOutFormat = HeapReAlloc(GetProcessHeap(), 0, This->lpOutFormat, size); - if (This->lpOutFormat == NULL) { - AVIFILE_CloseCompressor(This); - return AVIERR_MEMORY; - } - This->lpOutBuffer = DIBPTR(This->lpOutFormat); - } else - This->lpOutBuffer = lpBits; - - /* for user size was irrelevant */ - if (dx == -1) - dx = This->lpOutFormat->biWidth; - if (dy == -1) - dy = This->lpOutFormat->biHeight; - - /* need to resize? */ - if (x != 0 || y != 0) { - if (dy == This->lpOutFormat->biHeight && - dx == This->lpOutFormat->biWidth) - This->bResize = FALSE; - else - This->bResize = TRUE; + size += This->lpOutFormat->biSize + This->lpOutFormat->biSizeImage; + This->lpOutFormat = HeapReAlloc(GetProcessHeap(), 0, This->lpOutFormat, size); + if (This->lpOutFormat == NULL) { + AVIFILE_CloseCompressor(This); + return AVIERR_MEMORY; } + This->lpOutBuffer = DIBPTR(This->lpOutFormat); + } else + This->lpOutBuffer = lpBits; + + /* for user size was irrelevant */ + if (dx == -1) + dx = This->lpOutFormat->biWidth; + if (dy == -1) + dy = This->lpOutFormat->biHeight; + + /* need to resize? */ + if (x != 0 || y != 0) { + if (dy == This->lpOutFormat->biHeight && + dx == This->lpOutFormat->biWidth) + This->bResize = FALSE; + else + This->bResize = TRUE; + } - if (This->bResize) { - This->x = x; - This->y = y; - This->dx = dx; - This->dy = dy; - - if (ICDecompressExBegin(This->hic,0,This->lpInFormat,This->lpInBuffer,0, - 0,This->lpInFormat->biWidth, - This->lpInFormat->biHeight,This->lpOutFormat, - This->lpOutBuffer, x, y, dx, dy) == ICERR_OK) - return AVIERR_OK; - } else if (ICDecompressBegin(This->hic, This->lpInFormat, - This->lpOutFormat) == ICERR_OK) + if (This->bResize) { + This->x = x; + This->y = y; + This->dx = dx; + This->dy = dy; + + if (ICDecompressExBegin(This->hic,0,This->lpInFormat,This->lpInBuffer,0, + 0,This->lpInFormat->biWidth, + This->lpInFormat->biHeight,This->lpOutFormat, + This->lpOutBuffer, x, y, dx, dy) == ICERR_OK) return AVIERR_OK; + } else if (ICDecompressBegin(This->hic, This->lpInFormat, + This->lpOutFormat) == ICERR_OK) + return AVIERR_OK; - AVIFILE_CloseCompressor(This); + AVIFILE_CloseCompressor(This); - return AVIERR_COMPRESSOR; - } + return AVIERR_COMPRESSOR; } static const struct IGetFrameVtbl igetframeVtbl = { diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 18429fe72b6..b60cf3181f1 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -48,7 +48,7 @@ reactos/dll/win32/advpack # Synced to WineStaging-1.7.55 reactos/dll/win32/atl # Synced to WineStaging-1.9.4 reactos/dll/win32/atl80 # Synced to WineStaging-1.7.55 reactos/dll/win32/atl100 # Synced to WineStaging-1.7.55 -reactos/dll/win32/avifil32 # Synced to WineStaging-1.7.55 +reactos/dll/win32/avifil32 # Synced to WineStaging-1.9.4 reactos/dll/win32/bcrypt # Synced to WineStaging-1.9.4 reactos/dll/win32/browseui # Out of sync reactos/dll/win32/cabinet # Synced to WineStaging-1.9.4 -- 2.17.1