[AVIFIL32] Sync with Wine Staging 1.9.4. CORE-10912
authorAmine Khaldi <amine.khaldi@reactos.org>
Tue, 1 Mar 2016 18:31:48 +0000 (18:31 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Tue, 1 Mar 2016 18:31:48 +0000 (18:31 +0000)
svn path=/trunk/; revision=70842

reactos/dll/win32/avifil32/CMakeLists.txt
reactos/dll/win32/avifil32/api.c
reactos/dll/win32/avifil32/avifil32.idl
reactos/dll/win32/avifil32/avifile_ifaces.idl [new file with mode: 0644]
reactos/dll/win32/avifil32/avifile_private.h
reactos/dll/win32/avifil32/factory.c
reactos/dll/win32/avifil32/getframe.c
reactos/media/doc/README.WINE

index 1b73ab7..ba25a4b 100644 (file)
@@ -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)
index 7f9e768..191c29d 100644 (file)
@@ -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]);
index 1f50f15..e23c176 100644 (file)
  * 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 (file)
index 0000000..f9280e5
--- /dev/null
@@ -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);
+};
index 45fe468..95d350c 100644 (file)
@@ -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 */
index d0eb1ef..5e939cf 100644 (file)
@@ -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);
 }
 
 /*****************************************************************************
index 8dac825..23da880 100644 (file)
@@ -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 = {
index 18429fe..b60cf31 100644 (file)
@@ -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