[AVIFIL32]
authorAmine Khaldi <amine.khaldi@reactos.org>
Tue, 22 Apr 2014 11:31:44 +0000 (11:31 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Tue, 22 Apr 2014 11:31:44 +0000 (11:31 +0000)
* Sync with Wine 1.7.17.
CORE-8080

svn path=/trunk/; revision=62870

reactos/dll/win32/avifil32/api.c
reactos/dll/win32/avifil32/avifil32.idl
reactos/dll/win32/avifil32/avifile.c
reactos/dll/win32/avifil32/avifile_private.h
reactos/dll/win32/avifil32/factory.c
reactos/dll/win32/avifil32/icmstream.c
reactos/dll/win32/avifil32/wavfile.c
reactos/media/doc/README.WINE

index c5c4dcf..9ae26b9 100644 (file)
@@ -1493,7 +1493,7 @@ HRESULT WINAPI AVISaveVA(LPCSTR szFile, CLSID *pclsidHandler,
   HRESULT hr;
   int     len;
 
-  TRACE("%s,%p,%p,%d,%p,%p)\n", debugstr_a(szFile), pclsidHandler,
+  TRACE("(%s,%p,%p,%d,%p,%p)\n", debugstr_a(szFile), pclsidHandler,
        lpfnCallback, nStream, ppavi, plpOptions);
 
   if (szFile == NULL || ppavi == NULL || plpOptions == NULL)
index b4c563f..1f50f15 100644 (file)
@@ -18,6 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#pragma makedep register
+
 [
     helpstring("Microsoft AVI Files"),
     threading(apartment),
index 28766e9..fa71eb1 100644 (file)
 #define IDX_PER_BLOCK 2730
 #endif
 
-static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj);
-static ULONG   WINAPI IAVIStream_fnAddRef(IAVIStream*iface);
-static ULONG   WINAPI IAVIStream_fnRelease(IAVIStream* iface);
-static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2);
-static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size);
-static LONG    WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags);
-static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize);
-static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize);
-static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread);
-static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten);
-static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples);
-static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread);
-static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size);
-static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen);
-
-static const struct IAVIStreamVtbl iavist = {
-  IAVIStream_fnQueryInterface,
-  IAVIStream_fnAddRef,
-  IAVIStream_fnRelease,
-  IAVIStream_fnCreate,
-  IAVIStream_fnInfo,
-  IAVIStream_fnFindSample,
-  IAVIStream_fnReadFormat,
-  IAVIStream_fnSetFormat,
-  IAVIStream_fnRead,
-  IAVIStream_fnWrite,
-  IAVIStream_fnDelete,
-  IAVIStream_fnReadData,
-  IAVIStream_fnWriteData,
-  IAVIStream_fnSetInfo
-};
-
 typedef struct _IAVIFileImpl IAVIFileImpl;
 
 typedef struct _IAVIStreamImpl {
-  /* IUnknown stuff */
-  const IAVIStreamVtbl *lpVtbl;
-  LONG             ref;
+  IAVIStream        IAVIStream_iface;
+  LONG              ref;
 
-  /* IAVIStream stuff */
   IAVIFileImpl     *paf;
   DWORD             nStream;       /* the n-th stream in file */
   AVISTREAMINFOW    sInfo;
@@ -99,6 +65,11 @@ typedef struct _IAVIStreamImpl {
   DWORD             nIdxFmtChanges; /* upper index limit of idxFmtChanges */
 } IAVIStreamImpl;
 
+static inline IAVIStreamImpl *impl_from_IAVIStream(IAVIStream *iface)
+{
+  return CONTAINING_RECORD(iface, IAVIStreamImpl, IAVIStream_iface);
+}
+
 struct _IAVIFileImpl {
   IUnknown          IUnknown_inner;
   IAVIFile          IAVIFile_iface;
@@ -319,7 +290,7 @@ static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile *iface, IAVIStream **avis, D
   /* Does the requested stream exist? */
   if (nStream < This->fInfo.dwStreams &&
       This->ppStreams[nStream] != NULL) {
-    *avis = (PAVISTREAM)This->ppStreams[nStream];
+    *avis = &This->ppStreams[nStream]->IAVIStream_iface;
     IAVIStream_AddRef(*avis);
 
     return AVIERR_OK;
@@ -376,7 +347,7 @@ static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile *iface, IAVIStream **avis
   AVIFILE_UpdateInfo(This);
 
   /* return it */
-  *avis = (PAVISTREAM)This->ppStreams[n];
+  *avis = &This->ppStreams[n]->IAVIStream_iface;
   IAVIStream_AddRef(*avis);
 
   return AVIERR_OK;
@@ -679,31 +650,35 @@ HRESULT AVIFILE_CreateAVIFile(IUnknown *pUnkOuter, REFIID riid, void **ppv)
 }
 
 
-static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream *iface,
-                                                 REFIID refiid, LPVOID *obj)
+static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream *iface, REFIID riid, void **ppv)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
 
-  TRACE("(%p,%s,%p)\n", iface, debugstr_guid(refiid), obj);
+  TRACE("(%p,%s,%p)\n", This, debugstr_guid(riid), ppv);
 
-  if (IsEqualGUID(&IID_IUnknown, refiid) ||
-      IsEqualGUID(&IID_IAVIStream, refiid)) {
-    *obj = This;
+  if (!ppv) {
+    WARN("invalid parameter\n");
+    return E_INVALIDARG;
+  }
+  *ppv = NULL;
+
+  if (IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IAVIStream, riid)) {
+    *ppv = iface;
     IAVIStream_AddRef(iface);
 
     return S_OK;
   }
   /* FIXME: IAVIStreaming interface */
 
-  return OLE_E_ENUM_NOMORE;
+  return E_NOINTERFACE;
 }
 
 static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream *iface)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
   ULONG ref = InterlockedIncrement(&This->ref);
 
-  TRACE("(%p) -> %d\n", iface, ref);
+  TRACE("(%p) ref=%d\n", This, ref);
 
   /* also add ref to parent, so that it doesn't kill us */
   if (This->paf != NULL)
@@ -712,12 +687,12 @@ static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream *iface)
   return ref;
 }
 
-static ULONG WINAPI IAVIStream_fnRelease(IAVIStreamiface)
+static ULONG WINAPI IAVIStream_fnRelease(IAVIStream *iface)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
   ULONG ref = InterlockedDecrement(&This->ref);
 
-  TRACE("(%p) -> %d\n", iface, ref);
+  TRACE("(%p) ref=%d\n", This, ref);
 
   if (This->paf != NULL)
     IAVIFile_Release(&This->paf->IAVIFile_iface);
@@ -725,8 +700,7 @@ static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface)
   return ref;
 }
 
-static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream *iface, LPARAM lParam1,
-                                         LPARAM lParam2)
+static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream *iface, LPARAM lParam1, LPARAM lParam2)
 {
   TRACE("(%p,0x%08lX,0x%08lX)\n", iface, lParam1, lParam2);
 
@@ -734,10 +708,9 @@ static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream *iface, LPARAM lParam1,
   return AVIERR_UNSUPPORTED;
 }
 
-static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream *iface,LPAVISTREAMINFOW psi,
-                                       LONG size)
+static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream *iface, AVISTREAMINFOW *psi, LONG size)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%p,%d)\n", iface, psi, size);
 
@@ -753,11 +726,9 @@ static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream *iface,LPAVISTREAMINFOW psi,
   return AVIERR_OK;
 }
 
-static LONG WINAPI IAVIStream_fnFindSample(IAVIStream *iface, LONG pos,
-                                          LONG flags)
+static LONG WINAPI IAVIStream_fnFindSample(IAVIStream *iface, LONG pos, LONG flags)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
-
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
   LONG offset = 0;
 
   TRACE("(%p,%d,0x%08X)\n",iface,pos,flags);
@@ -853,10 +824,10 @@ static LONG WINAPI IAVIStream_fnFindSample(IAVIStream *iface, LONG pos,
   return pos;
 }
 
-static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream *iface, LONG pos,
-                                             LPVOID format, LONG *formatsize)
+static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream *iface, LONG pos, void *format,
+    LONG *formatsize)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%d,%p,%p)\n", iface, pos, format, formatsize);
 
@@ -892,12 +863,11 @@ static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream *iface, LONG pos,
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream *iface, LONG pos,
-                                            LPVOID format, LONG formatsize)
+static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream *iface, LONG pos, void *format,
+    LONG formatsize)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
-
-  LPBITMAPINFOHEADER lpbiNew = format;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
+  BITMAPINFOHEADER *lpbiNew = format;
 
   TRACE("(%p,%d,%p,%d)\n", iface, pos, format, formatsize);
 
@@ -1001,15 +971,12 @@ static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream *iface, LONG pos,
   }
 }
 
-static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start,
-                                       LONG samples, LPVOID buffer,
-                                       LONG buffersize, LPLONG bytesread,
-                                       LPLONG samplesread)
+static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start, LONG samples, void *buffer,
+    LONG buffersize, LONG *bytesread, LONG *samplesread)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
-
-  DWORD    size;
-  HRESULT  hr;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
+  DWORD size;
+  HRESULT hr;
 
   TRACE("(%p,%d,%d,%p,%d,%p,%p)\n", iface, start, samples, buffer,
        buffersize, bytesread, samplesread);
@@ -1123,15 +1090,11 @@ static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start,
   }
 }
 
-static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream *iface, LONG start,
-                                        LONG samples, LPVOID buffer,
-                                        LONG buffersize, DWORD flags,
-                                        LPLONG sampwritten,
-                                        LPLONG byteswritten)
+static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream *iface, LONG start, LONG samples, void *buffer,
+    LONG buffersize, DWORD flags, LONG *sampwritten, LONG *byteswritten)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
-
-  FOURCC  ckid;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
+  FOURCC ckid;
   HRESULT hr;
 
   TRACE("(%p,%d,%d,%p,%d,0x%08X,%p,%p)\n", iface, start, samples,
@@ -1217,10 +1180,9 @@ static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream *iface, LONG start,
   return hr;
 }
 
-static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream *iface, LONG start,
-                                         LONG samples)
+static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream *iface, LONG start, LONG samples)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
 
   FIXME("(%p,%d,%d): stub\n", iface, start, samples);
 
@@ -1256,10 +1218,9 @@ static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream *iface, LONG start,
   return AVIERR_UNSUPPORTED;
 }
 
-static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream *iface, DWORD fcc,
-                                           LPVOID lp, LPLONG lpread)
+static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream *iface, DWORD fcc, void *lp, LONG *lpread)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,0x%08X,%p,%p)\n", iface, fcc, lp, lpread);
 
@@ -1280,10 +1241,9 @@ static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream *iface, DWORD fcc,
     return ReadExtraChunk(&This->extra, fcc, lp, lpread);
 }
 
-static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream *iface, DWORD fcc,
-                                            LPVOID lp, LONG size)
+static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream *iface, DWORD fcc, void *lp, LONG size)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIStreamImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,0x%08x,%p,%d)\n", iface, fcc, lp, size);
 
@@ -1313,7 +1273,7 @@ static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream *iface, DWORD fcc,
 
   if (fcc == ckidSTREAMHANDLERDATA) {
     if (This->lpHandlerData != NULL) {
-      FIXME(": handler data already set -- overwirte?\n");
+      FIXME(": handler data already set -- overwrite?\n");
       return AVIERR_UNSUPPORTED;
     }
 
@@ -1328,15 +1288,30 @@ static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream *iface, DWORD fcc,
     return WriteExtraChunk(&This->extra, fcc, lp, size);
 }
 
-static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream *iface,
-                                          LPAVISTREAMINFOW info, LONG infolen)
+static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream *iface, AVISTREAMINFOW *info, LONG infolen)
 {
   FIXME("(%p,%p,%d): stub\n", iface, info, infolen);
 
   return E_FAIL;
 }
 
-/***********************************************************************/
+static const struct IAVIStreamVtbl avist_vt = {
+  IAVIStream_fnQueryInterface,
+  IAVIStream_fnAddRef,
+  IAVIStream_fnRelease,
+  IAVIStream_fnCreate,
+  IAVIStream_fnInfo,
+  IAVIStream_fnFindSample,
+  IAVIStream_fnReadFormat,
+  IAVIStream_fnSetFormat,
+  IAVIStream_fnRead,
+  IAVIStream_fnWrite,
+  IAVIStream_fnDelete,
+  IAVIStream_fnReadData,
+  IAVIStream_fnWriteData,
+  IAVIStream_fnSetInfo
+};
+
 
 static HRESULT AVIFILE_AddFrame(IAVIStreamImpl *This, DWORD ckid, DWORD size, DWORD offset, DWORD flags)
 {
@@ -1495,7 +1470,7 @@ static void AVIFILE_ConstructAVIStream(IAVIFileImpl *paf, DWORD nr, const AVISTR
 
   pstream = paf->ppStreams[nr];
 
-  pstream->lpVtbl         = &iavist;
+  pstream->IAVIStream_iface.lpVtbl = &avist_vt;
   pstream->ref            = 0;
   pstream->paf            = paf;
   pstream->nStream        = nr;
@@ -2102,7 +2077,7 @@ static HRESULT AVIFILE_SaveFile(IAVIFileImpl *This)
   if (This->dwMoviChunkPos == 0)
     AVIFILE_ComputeMoviStart(This);
 
-  /* written one record to much? */
+  /* written one record too much? */
   if (This->ckLastRecord.dwFlags & MMIO_DIRTY) {
     This->dwNextFramePos -= 3 * sizeof(DWORD);
     if (This->nIdxRecords > 0)
@@ -2334,7 +2309,7 @@ static HRESULT AVIFILE_SaveIndex(const IAVIFileImpl *This)
     if (This->ppStreams[0]->sInfo.dwSampleSize == 0)
       stepsize = 1;
     else
-      stepsize = AVIStreamTimeToSample((PAVISTREAM)This->ppStreams[0], 1000000);
+      stepsize = AVIStreamTimeToSample(&This->ppStreams[0]->IAVIStream_iface, 1000000);
 
     assert(stepsize > 0);
 
@@ -2504,8 +2479,8 @@ static void    AVIFILE_UpdateInfo(IAVIFileImpl *This)
       This->fInfo.dwRate   = psi->dwRate;
       This->fInfo.dwLength = psi->dwLength;
     } else {
-      n = AVIStreamSampleToSample((PAVISTREAM)This->ppStreams[0],
-                                 (PAVISTREAM)This->ppStreams[i],psi->dwLength);
+      n = AVIStreamSampleToSample(&This->ppStreams[0]->IAVIStream_iface,
+                                  &This->ppStreams[i]->IAVIStream_iface, psi->dwLength);
       if (This->fInfo.dwLength < n)
        This->fInfo.dwLength = n;
     }
index 605866e..45fe468 100644 (file)
@@ -62,7 +62,7 @@ DEFINE_AVIGUID(CLSID_ACMStream, 0x0002000F, 0, 0);
 extern HMODULE AVIFILE_hModule DECLSPEC_HIDDEN;
 
 extern HRESULT AVIFILE_CreateAVIFile(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN;
-extern HRESULT AVIFILE_CreateWAVFile(REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN;
+extern HRESULT AVIFILE_CreateWAVFile(IUnknown *outer_unk, REFIID riid, void **ret_iface) DECLSPEC_HIDDEN;
 extern HRESULT AVIFILE_CreateACMStream(REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN;
 extern HRESULT AVIFILE_CreateICMStream(REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN;
 extern PAVIEDITSTREAM AVIFILE_CreateEditStream(PAVISTREAM pstream) DECLSPEC_HIDDEN;
index e993598..d0eb1ef 100644 (file)
@@ -133,14 +133,14 @@ static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,
 
   if (IsEqualGUID(&CLSID_AVIFile, &This->clsid))
     return AVIFILE_CreateAVIFile(pOuter, riid, ppobj);
+  if (IsEqualGUID(&CLSID_WAVFile, &This->clsid))
+    return AVIFILE_CreateWAVFile(pOuter, riid, ppobj);
 
   if (pOuter)
     return CLASS_E_NOAGGREGATION;
 
   if (IsEqualGUID(&CLSID_ICMStream, &This->clsid))
     return AVIFILE_CreateICMStream(riid,ppobj);
-  if (IsEqualGUID(&CLSID_WAVFile, &This->clsid))
-    return AVIFILE_CreateWAVFile(riid,ppobj);
   if (IsEqualGUID(&CLSID_ACMStream, &This->clsid))
     return AVIFILE_CreateACMStream(riid,ppobj);
 
index bb4155b..94df1d9 100644 (file)
@@ -299,7 +299,7 @@ static LONG WINAPI ICMStream_fnFindSample(IAVIStream *iface, LONG pos,
       return This->lLastKey;
     }
   } else if (flags & FIND_ANY) {
-    return pos; /* We really don't know, reread is to expensive, so guess. */
+    return pos; /* We really don't know, reread is too expensive, so guess. */
   } else if (flags & FIND_FORMAT) {
     if (flags & FIND_PREV)
       return 0;
index 42637e3..4376ffb 100644 (file)
@@ -67,111 +67,14 @@ typedef struct {
 
 /***********************************************************************/
 
-static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj);
-static ULONG   WINAPI IAVIFile_fnAddRef(IAVIFile* iface);
-static ULONG   WINAPI IAVIFile_fnRelease(IAVIFile* iface);
-static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size);
-static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam);
-static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi);
-static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size);
-static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size);
-static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile*iface);
-static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam);
-
-static const struct IAVIFileVtbl iwavft = {
-  IAVIFile_fnQueryInterface,
-  IAVIFile_fnAddRef,
-  IAVIFile_fnRelease,
-  IAVIFile_fnInfo,
-  IAVIFile_fnGetStream,
-  IAVIFile_fnCreateStream,
-  IAVIFile_fnWriteData,
-  IAVIFile_fnReadData,
-  IAVIFile_fnEndRecord,
-  IAVIFile_fnDeleteStream
-};
-
-static HRESULT WINAPI IPersistFile_fnQueryInterface(IPersistFile*iface,REFIID refiid,LPVOID*obj);
-static ULONG   WINAPI IPersistFile_fnAddRef(IPersistFile*iface);
-static ULONG   WINAPI IPersistFile_fnRelease(IPersistFile*iface);
-static HRESULT WINAPI IPersistFile_fnGetClassID(IPersistFile*iface,CLSID*pClassID);
-static HRESULT WINAPI IPersistFile_fnIsDirty(IPersistFile*iface);
-static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile*iface,LPCOLESTR pszFileName,DWORD dwMode);
-static HRESULT WINAPI IPersistFile_fnSave(IPersistFile*iface,LPCOLESTR pszFileName,BOOL fRemember);
-static HRESULT WINAPI IPersistFile_fnSaveCompleted(IPersistFile*iface,LPCOLESTR pszFileName);
-static HRESULT WINAPI IPersistFile_fnGetCurFile(IPersistFile*iface,LPOLESTR*ppszFileName);
-
-static const struct IPersistFileVtbl iwavpft = {
-  IPersistFile_fnQueryInterface,
-  IPersistFile_fnAddRef,
-  IPersistFile_fnRelease,
-  IPersistFile_fnGetClassID,
-  IPersistFile_fnIsDirty,
-  IPersistFile_fnLoad,
-  IPersistFile_fnSave,
-  IPersistFile_fnSaveCompleted,
-  IPersistFile_fnGetCurFile
-};
-
-static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj);
-static ULONG   WINAPI IAVIStream_fnAddRef(IAVIStream*iface);
-static ULONG   WINAPI IAVIStream_fnRelease(IAVIStream* iface);
-static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2);
-static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size);
-static LONG    WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags);
-static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize);
-static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize);
-static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread);
-static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten);
-static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples);
-static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread);
-static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size);
-static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen);
-
-static const struct IAVIStreamVtbl iwavst = {
-  IAVIStream_fnQueryInterface,
-  IAVIStream_fnAddRef,
-  IAVIStream_fnRelease,
-  IAVIStream_fnCreate,
-  IAVIStream_fnInfo,
-  IAVIStream_fnFindSample,
-  IAVIStream_fnReadFormat,
-  IAVIStream_fnSetFormat,
-  IAVIStream_fnRead,
-  IAVIStream_fnWrite,
-  IAVIStream_fnDelete,
-  IAVIStream_fnReadData,
-  IAVIStream_fnWriteData,
-  IAVIStream_fnSetInfo
-};
-
-typedef struct _IAVIFileImpl IAVIFileImpl;
-
-typedef struct _IPersistFileImpl {
-  /* IUnknown stuff */
-  const IPersistFileVtbl *lpVtbl;
-
-  /* IPersistFile stuff */
-  IAVIFileImpl     *paf;
-} IPersistFileImpl;
-
-typedef struct _IAVIStreamImpl {
-  /* IUnknown stuff */
-  const IAVIStreamVtbl *lpVtbl;
-
-  /* IAVIStream stuff */
-  IAVIFileImpl     *paf;
-} IAVIStreamImpl;
-
-struct _IAVIFileImpl {
-  /* IUnknown stuff */
-  const IAVIFileVtbl *lpVtbl;
-  LONG             ref;
-
+typedef struct _IAVIFileImpl {
+  IUnknown          IUnknown_inner;
+  IAVIFile          IAVIFile_iface;
+  IPersistFile      IPersistFile_iface;
+  IAVIStream        IAVIStream_iface;
+  IUnknown          *outer_unk;
+  LONG              ref;
   /* IAVIFile, IAVIStream stuff... */
-  IPersistFileImpl  iPersistFile;
-  IAVIStreamImpl    iAVIStream;
-
   AVIFILEINFOW      fInfo;
   AVISTREAMINFOW    sInfo;
 
@@ -187,7 +90,7 @@ struct _IAVIFileImpl {
   LPWSTR            szFileName;
   UINT              uMode;
   BOOL              fDirty;
-};
+} IAVIFileImpl;
 
 /***********************************************************************/
 
@@ -195,108 +98,112 @@ static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This);
 static HRESULT AVIFILE_LoadSunFile(IAVIFileImpl *This);
 static HRESULT AVIFILE_SaveFile(const IAVIFileImpl *This);
 
-HRESULT AVIFILE_CreateWAVFile(REFIID riid, LPVOID *ppv)
+static inline IAVIFileImpl *impl_from_IUnknown(IUnknown *iface)
 {
-  IAVIFileImpl *pfile;
-  HRESULT       hr;
+    return CONTAINING_RECORD(iface, IAVIFileImpl, IUnknown_inner);
+}
 
-  assert(riid != NULL && ppv != NULL);
+static HRESULT WINAPI IUnknown_fnQueryInterface(IUnknown *iface, REFIID riid, void **ret_iface)
+{
+    IAVIFileImpl *This = impl_from_IUnknown(iface);
+
+    TRACE("(%p,%s,%p)\n", This, debugstr_guid(riid), ret_iface);
+
+    if (IsEqualGUID(&IID_IUnknown, riid))
+        *ret_iface = &This->IUnknown_inner;
+    else if (IsEqualGUID(&IID_IAVIFile, riid))
+        *ret_iface = &This->IAVIFile_iface;
+    else if (IsEqualGUID(&IID_IAVIStream, riid))
+        *ret_iface = &This->IAVIStream_iface;
+    else if (IsEqualGUID(&IID_IPersistFile, riid))
+        *ret_iface = &This->IPersistFile_iface;
+    else {
+        WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ret_iface);
+        *ret_iface = NULL;
+        return E_NOINTERFACE;
+    }
+
+    /* Violation of the COM aggregation ref counting rule */
+    IUnknown_AddRef(&This->IUnknown_inner);
+    return S_OK;
+}
 
-  *ppv = NULL;
+static ULONG WINAPI IUnknown_fnAddRef(IUnknown *iface)
+{
+    IAVIFileImpl *This = impl_from_IUnknown(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
 
-  pfile = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAVIFileImpl));
-  if (pfile == NULL)
-    return AVIERR_MEMORY;
+    TRACE("(%p) ref=%d\n", This, ref);
 
-  pfile->lpVtbl                = &iwavft;
-  pfile->iPersistFile.lpVtbl   = &iwavpft;
-  pfile->iAVIStream.lpVtbl     = &iwavst;
-  pfile->ref = 0;
-  pfile->iPersistFile.paf = pfile;
-  pfile->iAVIStream.paf   = pfile;
+    return ref;
+}
 
-  hr = IAVIFile_QueryInterface((IAVIFile*)pfile, riid, ppv);
-  if (FAILED(hr))
-    HeapFree(GetProcessHeap(), 0, pfile);
+static ULONG WINAPI IUnknown_fnRelease(IUnknown *iface)
+{
+    IAVIFileImpl *This = impl_from_IUnknown(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if (!ref) {
+        /* need to write headers to file */
+        if (This->fDirty)
+            AVIFILE_SaveFile(This);
+
+        HeapFree(GetProcessHeap(), 0, This->lpFormat);
+        This->lpFormat = NULL;
+        This->cbFormat = 0;
+        HeapFree(GetProcessHeap(), 0, This->extra.lp);
+        This->extra.lp = NULL;
+        This->extra.cb = 0;
+        HeapFree(GetProcessHeap(), 0, This->szFileName);
+        This->szFileName = NULL;
+        if (This->hmmio) {
+            mmioClose(This->hmmio, 0);
+            This->hmmio = NULL;
+        }
+        HeapFree(GetProcessHeap(), 0, This);
+    }
 
-  return hr;
+    return ref;
 }
 
-static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile *iface, REFIID refiid,
-                                               LPVOID *obj)
+static const IUnknownVtbl unk_vtbl =
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
+    IUnknown_fnQueryInterface,
+    IUnknown_fnAddRef,
+    IUnknown_fnRelease
+};
 
-  TRACE("(%p,%s,%p)\n", This, debugstr_guid(refiid), obj);
+static inline IAVIFileImpl *impl_from_IAVIFile(IAVIFile *iface)
+{
+    return CONTAINING_RECORD(iface, IAVIFileImpl, IAVIFile_iface);
+}
 
-  if (IsEqualGUID(&IID_IUnknown, refiid) ||
-      IsEqualGUID(&IID_IAVIFile, refiid)) {
-    *obj = iface;
-    IAVIFile_AddRef(iface);
-    return S_OK;
-  } else if (This->fInfo.dwStreams == 1 &&
-            IsEqualGUID(&IID_IAVIStream, refiid)) {
-    *obj = &This->iAVIStream;
-    IAVIFile_AddRef(iface);
-    return S_OK;
-  } else if (IsEqualGUID(&IID_IPersistFile, refiid)) {
-    *obj = &This->iPersistFile;
-    IAVIFile_AddRef(iface);
-    return S_OK;
-  }
+static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile *iface, REFIID riid, void **ret_iface)
+{
+    IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
-  return OLE_E_ENUM_NOMORE;
+    return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface);
 }
 
 static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile *iface)
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
+    IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
-  TRACE("(%p)\n",iface);
-
-  return InterlockedIncrement(&This->ref);
+    return IUnknown_AddRef(This->outer_unk);
 }
 
 static ULONG WINAPI IAVIFile_fnRelease(IAVIFile *iface)
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
-  ULONG ref = InterlockedDecrement(&This->ref);
-
-  TRACE("(%p)\n",iface);
-
-  if (!ref) {
-    if (This->fDirty) {
-      /* need to write headers to file */
-      AVIFILE_SaveFile(This);
-    }
+    IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
-    if (This->lpFormat != NULL) {
-      HeapFree(GetProcessHeap(), 0, This->lpFormat);
-      This->lpFormat = NULL;
-      This->cbFormat = 0;
-    }
-    if (This->extra.lp != NULL) {
-      HeapFree(GetProcessHeap(), 0, This->extra.lp);
-      This->extra.lp = NULL;
-      This->extra.cb = 0;
-    }
-    HeapFree(GetProcessHeap(), 0, This->szFileName);
-    This->szFileName = NULL;
-    if (This->hmmio != NULL) {
-      mmioClose(This->hmmio, 0);
-      This->hmmio = NULL;
-    }
-
-    HeapFree(GetProcessHeap(), 0, This);
-    return 0;
-  }
-  return ref;
+    return IUnknown_Release(This->outer_unk);
 }
 
-static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile *iface, LPAVIFILEINFOW afi,
-                                     LONG size)
+static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile *iface, AVIFILEINFOW *afi, LONG size)
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
   TRACE("(%p,%p,%d)\n",iface,afi,size);
 
@@ -327,10 +234,10 @@ static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile *iface, LPAVIFILEINFOW afi,
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile *iface, PAVISTREAM *avis,
-                                          DWORD fccType, LONG lParam)
+static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile *iface, IAVIStream **avis, DWORD fccType,
+        LONG lParam)
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
   TRACE("(%p,%p,0x%08X,%d)\n", iface, avis, fccType, lParam);
 
@@ -346,16 +253,16 @@ static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile *iface, PAVISTREAM *avis,
   if (fccType != 0 && fccType != streamtypeAUDIO)
     return AVIERR_NODATA;
 
-  *avis = (PAVISTREAM)&This->iAVIStream;
-  IAVIFile_AddRef(iface);
+  *avis = &This->IAVIStream_iface;
+  IAVIStream_AddRef(*avis);
 
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile *iface,PAVISTREAM *avis,
-                                             LPAVISTREAMINFOW asi)
+static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile *iface, IAVIStream **avis,
+        AVISTREAMINFOW *asi)
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
   TRACE("(%p,%p,%p)\n", iface, avis, asi);
 
@@ -397,16 +304,15 @@ static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile *iface,PAVISTREAM *avis,
   This->ckData.dwDataOffset = 0;
   This->ckData.cksize       = 0;
 
-  *avis = (PAVISTREAM)&This->iAVIStream;
-  IAVIFile_AddRef(iface);
+  *avis = &This->IAVIStream_iface;
+  IAVIStream_AddRef(*avis);
 
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile *iface, DWORD ckid,
-                                          LPVOID lpData, LONG size)
+static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile *iface, DWORD ckid, void *lpData, LONG size)
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
   TRACE("(%p,0x%08X,%p,%d)\n", iface, ckid, lpData, size);
 
@@ -425,10 +331,9 @@ static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile *iface, DWORD ckid,
   return WriteExtraChunk(&This->extra, ckid, lpData, size);
 }
 
-static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile *iface, DWORD ckid,
-                                         LPVOID lpData, LONG *size)
+static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile *iface, DWORD ckid, void *lpData, LONG *size)
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
   TRACE("(%p,0x%08X,%p,%p)\n", iface, ckid, lpData, size);
 
@@ -445,10 +350,9 @@ static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile *iface)
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile *iface, DWORD fccType,
-                                             LONG lParam)
+static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile *iface, DWORD fccType, LONG lParam)
 {
-  IAVIFileImpl *This = (IAVIFileImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIFile(iface);
 
   TRACE("(%p,0x%08X,%d)\n", iface, fccType, lParam);
 
@@ -486,34 +390,46 @@ static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile *iface, DWORD fccType,
   return AVIERR_OK;
 }
 
+static const struct IAVIFileVtbl iwavft = {
+    IAVIFile_fnQueryInterface,
+    IAVIFile_fnAddRef,
+    IAVIFile_fnRelease,
+    IAVIFile_fnInfo,
+    IAVIFile_fnGetStream,
+    IAVIFile_fnCreateStream,
+    IAVIFile_fnWriteData,
+    IAVIFile_fnReadData,
+    IAVIFile_fnEndRecord,
+    IAVIFile_fnDeleteStream
+};
+
 /***********************************************************************/
 
-static HRESULT WINAPI IPersistFile_fnQueryInterface(IPersistFile *iface,
-                                                   REFIID refiid, LPVOID *obj)
+static inline IAVIFileImpl *impl_from_IPersistFile(IPersistFile *iface)
 {
-  IPersistFileImpl *This = (IPersistFileImpl *)iface;
+    return CONTAINING_RECORD(iface, IAVIFileImpl, IPersistFile_iface);
+}
 
-  assert(This->paf != NULL);
+static HRESULT WINAPI IPersistFile_fnQueryInterface(IPersistFile *iface, REFIID riid,
+        void **ret_iface)
+{
+    IAVIFileImpl *This = impl_from_IPersistFile(iface);
 
-  return IAVIFile_QueryInterface((PAVIFILE)This->paf, refiid, obj);
+    return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface);
 }
 
 static ULONG   WINAPI IPersistFile_fnAddRef(IPersistFile *iface)
 {
-  IPersistFileImpl *This = (IPersistFileImpl *)iface;
+    IAVIFileImpl *This = impl_from_IPersistFile(iface);
 
-  assert(This->paf != NULL);
-
-  return IAVIFile_AddRef((PAVIFILE)This->paf);
+    return IUnknown_AddRef(This->outer_unk);
 }
 
 static ULONG   WINAPI IPersistFile_fnRelease(IPersistFile *iface)
 {
-  IPersistFileImpl *This = (IPersistFileImpl *)iface;
-
-  assert(This->paf != NULL);
+    IAVIFileImpl *This = impl_from_IPersistFile(iface);
 
-  return IAVIFile_Release((PAVIFILE)This->paf);
+    return IUnknown_Release(This->outer_unk);
 }
 
 static HRESULT WINAPI IPersistFile_fnGetClassID(IPersistFile *iface,
@@ -531,20 +447,16 @@ static HRESULT WINAPI IPersistFile_fnGetClassID(IPersistFile *iface,
 
 static HRESULT WINAPI IPersistFile_fnIsDirty(IPersistFile *iface)
 {
-  IPersistFileImpl *This = (IPersistFileImpl *)iface;
-
-  TRACE("(%p)\n", iface);
+    IAVIFileImpl *This = impl_from_IPersistFile(iface);
 
-  assert(This->paf != NULL);
+    TRACE("(%p)\n", iface);
 
-  return (This->paf->fDirty ? S_OK : S_FALSE);
+    return (This->fDirty ? S_OK : S_FALSE);
 }
 
-static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile *iface,
-                                         LPCOLESTR pszFileName, DWORD dwMode)
+static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile *iface, LPCOLESTR pszFileName, DWORD dwMode)
 {
-  IAVIFileImpl *This = ((IPersistFileImpl*)iface)->paf;
-
+  IAVIFileImpl *This = impl_from_IPersistFile(iface);
   WCHAR wszStreamFmt[50];
   INT   len;
 
@@ -554,7 +466,6 @@ static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile *iface,
   if (pszFileName == NULL)
     return AVIERR_BADPARAM;
 
-  assert(This != NULL);
   if (This->hmmio != NULL)
     return AVIERR_ERROR; /* No reuse of this object for another file! */
 
@@ -626,10 +537,9 @@ static HRESULT WINAPI IPersistFile_fnSaveCompleted(IPersistFile *iface,
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IPersistFile_fnGetCurFile(IPersistFile *iface,
-                                               LPOLESTR *ppszFileName)
+static HRESULT WINAPI IPersistFile_fnGetCurFile(IPersistFile *iface, LPOLESTR *ppszFileName)
 {
-  IPersistFileImpl *This = (IPersistFileImpl *)iface;
+  IAVIFileImpl *This = impl_from_IPersistFile(iface);
 
   TRACE("(%p,%p)\n", iface, ppszFileName);
 
@@ -638,49 +548,57 @@ static HRESULT WINAPI IPersistFile_fnGetCurFile(IPersistFile *iface,
 
   *ppszFileName = NULL;
 
-  assert(This->paf != NULL);
-
-  if (This->paf->szFileName != NULL) {
-    int len = lstrlenW(This->paf->szFileName) + 1;
+  if (This->szFileName) {
+    int len = lstrlenW(This->szFileName) + 1;
 
     *ppszFileName = CoTaskMemAlloc(len * sizeof(WCHAR));
     if (*ppszFileName == NULL)
       return AVIERR_MEMORY;
 
-    strcpyW(*ppszFileName, This->paf->szFileName);
+    strcpyW(*ppszFileName, This->szFileName);
   }
 
   return AVIERR_OK;
 }
 
+static const struct IPersistFileVtbl iwavpft = {
+    IPersistFile_fnQueryInterface,
+    IPersistFile_fnAddRef,
+    IPersistFile_fnRelease,
+    IPersistFile_fnGetClassID,
+    IPersistFile_fnIsDirty,
+    IPersistFile_fnLoad,
+    IPersistFile_fnSave,
+    IPersistFile_fnSaveCompleted,
+    IPersistFile_fnGetCurFile
+};
+
 /***********************************************************************/
 
-static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream *iface,
-                                                 REFIID refiid, LPVOID *obj)
+static inline IAVIFileImpl *impl_from_IAVIStream(IAVIStream *iface)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+    return CONTAINING_RECORD(iface, IAVIFileImpl, IAVIStream_iface);
+}
 
-  assert(This->paf != NULL);
+static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream *iface, REFIID riid, void **ret_iface)
+{
+    IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
-  return IAVIFile_QueryInterface((PAVIFILE)This->paf, refiid, obj);
+    return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface);
 }
 
 static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream *iface)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+    IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
-  assert(This->paf != NULL);
-
-  return IAVIFile_AddRef((PAVIFILE)This->paf);
+    return IUnknown_AddRef(This->outer_unk);
 }
 
 static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
-
-  assert(This->paf != NULL);
+    IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
-  return IAVIFile_Release((PAVIFILE)This->paf);
+    return IUnknown_Release(This->outer_unk);
 }
 
 static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream *iface, LPARAM lParam1,
@@ -692,10 +610,9 @@ static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream *iface, LPARAM lParam1,
   return AVIERR_UNSUPPORTED;
 }
 
-static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream *iface,LPAVISTREAMINFOW psi,
-                                       LONG size)
+static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream *iface, AVISTREAMINFOW *psi, LONG size)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%p,%d)\n", iface, psi, size);
 
@@ -704,17 +621,16 @@ static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream *iface,LPAVISTREAMINFOW psi,
   if (size < 0)
     return AVIERR_BADSIZE;
 
-  memcpy(psi, &This->paf->sInfo, min((DWORD)size, sizeof(This->paf->sInfo)));
+  memcpy(psi, &This->sInfo, min((DWORD)size, sizeof(This->sInfo)));
 
-  if ((DWORD)size < sizeof(This->paf->sInfo))
+  if ((DWORD)size < sizeof(This->sInfo))
     return AVIERR_BUFFERTOOSMALL;
   return AVIERR_OK;
 }
 
-static LONG WINAPI IAVIStream_fnFindSample(IAVIStream *iface, LONG pos,
-                                          LONG flags)
+static LONG WINAPI IAVIStream_fnFindSample(IAVIStream *iface, LONG pos, LONG flags)
 {
-  IAVIFileImpl *This = ((IAVIStreamImpl*)iface)->paf;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%d,0x%08X)\n",iface,pos,flags);
 
@@ -748,10 +664,10 @@ static LONG WINAPI IAVIStream_fnFindSample(IAVIStream *iface, LONG pos,
   return pos;
 }
 
-static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream *iface, LONG pos,
-                                             LPVOID format, LONG *formatsize)
+static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream *iface, LONG pos, void *format,
+        LONG *formatsize)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%d,%p,%p)\n", iface, pos, format, formatsize);
 
@@ -760,26 +676,26 @@ static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream *iface, LONG pos,
 
   /* only interested in needed buffersize? */
   if (format == NULL || *formatsize <= 0) {
-    *formatsize = This->paf->cbFormat;
+    *formatsize = This->cbFormat;
 
     return AVIERR_OK;
   }
 
   /* copy initial format (only as much as will fit) */
-  memcpy(format, This->paf->lpFormat, min(*formatsize, This->paf->cbFormat));
-  if (*formatsize < This->paf->cbFormat) {
-    *formatsize = This->paf->cbFormat;
+  memcpy(format, This->lpFormat, min(*formatsize, This->cbFormat));
+  if (*formatsize < This->cbFormat) {
+    *formatsize = This->cbFormat;
     return AVIERR_BUFFERTOOSMALL;
   }
 
-  *formatsize = This->paf->cbFormat;
+  *formatsize = This->cbFormat;
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream *iface, LONG pos,
-                                            LPVOID format, LONG formatsize)
+static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream *iface, LONG pos, void *format,
+        LONG formatsize)
 {
-  IAVIFileImpl *This = ((IAVIStreamImpl*)iface)->paf;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%d,%p,%d)\n", iface, pos, format, formatsize);
 
@@ -831,12 +747,10 @@ static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream *iface, LONG pos,
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start,
-                                       LONG samples, LPVOID buffer,
-                                       LONG buffersize, LPLONG bytesread,
-                                       LPLONG samplesread)
+static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start, LONG samples, void *buffer,
+        LONG buffersize, LONG *bytesread, LONG *samplesread)
 {
-  IAVIFileImpl *This = ((IAVIStreamImpl*)iface)->paf;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%d,%d,%p,%d,%p,%p)\n", iface, start, samples, buffer,
        buffersize, bytesread, samplesread);
@@ -904,13 +818,10 @@ static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start,
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream *iface, LONG start,
-                                        LONG samples, LPVOID buffer,
-                                        LONG buffersize, DWORD flags,
-                                        LPLONG sampwritten,
-                                        LPLONG byteswritten)
+static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream *iface, LONG start, LONG samples, void *buffer,
+        LONG buffersize, DWORD flags, LONG *sampwritten, LONG *byteswritten)
 {
-  IAVIFileImpl *This = ((IAVIStreamImpl*)iface)->paf;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%d,%d,%p,%d,0x%08X,%p,%p)\n", iface, start, samples,
        buffer, buffersize, flags, sampwritten, byteswritten);
@@ -939,7 +850,7 @@ static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream *iface, LONG start,
 
   /* do we have anything to write? */
   if (buffer != NULL && buffersize > 0) {
-    This->fDirty = 1;
+    This->fDirty = TRUE;
 
     if (mmioSeek(This->hmmio, This->ckData.dwDataOffset +
                 start * This->sInfo.dwSampleSize, SEEK_SET) == -1)
@@ -961,10 +872,9 @@ static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream *iface, LONG start,
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream *iface, LONG start,
-                                         LONG samples)
+static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream *iface, LONG start, LONG samples)
 {
-  IAVIFileImpl *This = ((IAVIStreamImpl*)iface)->paf;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
   TRACE("(%p,%d,%d)\n", iface, start, samples);
 
@@ -1002,27 +912,23 @@ static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream *iface, LONG start,
     return AVIERR_UNSUPPORTED;
   }
 
-  This->fDirty = 1;
+  This->fDirty = TRUE;
 
   return AVIERR_OK;
 }
 
-static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream *iface, DWORD fcc,
-                                           LPVOID lp, LPLONG lpread)
+static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream *iface, DWORD fcc, void *lp, LONG *lpread)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
-  assert(This->paf != NULL);
-
-  return IAVIFile_ReadData((PAVIFILE)This->paf, fcc, lp, lpread);
+  return IAVIFile_ReadData(&This->IAVIFile_iface, fcc, lp, lpread);
 }
 
-static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream *iface, DWORD fcc,
-                                            LPVOID lp, LONG size)
+static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream *iface, DWORD fcc, void *lp, LONG size)
 {
-  IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+  IAVIFileImpl *This = impl_from_IAVIStream(iface);
 
-  return IAVIFile_WriteData((PAVIFILE)This->paf, fcc, lp, size);
+  return IAVIFile_WriteData(&This->IAVIFile_iface, fcc, lp, size);
 }
 
 static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream *iface,
@@ -1033,6 +939,50 @@ static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream *iface,
   return E_FAIL;
 }
 
+static const struct IAVIStreamVtbl iwavst = {
+    IAVIStream_fnQueryInterface,
+    IAVIStream_fnAddRef,
+    IAVIStream_fnRelease,
+    IAVIStream_fnCreate,
+    IAVIStream_fnInfo,
+    IAVIStream_fnFindSample,
+    IAVIStream_fnReadFormat,
+    IAVIStream_fnSetFormat,
+    IAVIStream_fnRead,
+    IAVIStream_fnWrite,
+    IAVIStream_fnDelete,
+    IAVIStream_fnReadData,
+    IAVIStream_fnWriteData,
+    IAVIStream_fnSetInfo
+};
+
+HRESULT AVIFILE_CreateWAVFile(IUnknown *outer_unk, REFIID riid, void **ret_iface)
+{
+    IAVIFileImpl *pfile;
+    HRESULT hr;
+
+    *ret_iface = NULL;
+
+    pfile = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*pfile));
+    if (!pfile)
+        return AVIERR_MEMORY;
+
+    pfile->IUnknown_inner.lpVtbl = &unk_vtbl;
+    pfile->IAVIFile_iface.lpVtbl = &iwavft;
+    pfile->IPersistFile_iface.lpVtbl = &iwavpft;
+    pfile->IAVIStream_iface.lpVtbl = &iwavst;
+    pfile->ref = 1;
+    if (outer_unk)
+        pfile->outer_unk = outer_unk;
+    else
+        pfile->outer_unk = &pfile->IUnknown_inner;
+
+    hr = IUnknown_QueryInterface(&pfile->IUnknown_inner, riid, ret_iface);
+    IUnknown_Release(&pfile->IUnknown_inner);
+
+    return hr;
+}
+
 /***********************************************************************/
 
 static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This)
@@ -1206,7 +1156,7 @@ static HRESULT AVIFILE_LoadSunFile(IAVIFileImpl *This)
   This->lpFormat->nAvgBytesPerSec =
     This->lpFormat->nBlockAlign * This->lpFormat->nSamplesPerSec;
 
-  This->fDirty = 0;
+  This->fDirty = FALSE;
 
   This->sInfo.fccType               = streamtypeAUDIO;
   This->sInfo.fccHandler            = 0;
index 1ce8eb8..6b46056 100644 (file)
@@ -54,7 +54,7 @@ reactos/dll/win32/advpack          # Synced to Wine-1.7.1
 reactos/dll/win32/atl              # Synced to Wine-1.7.1
 reactos/dll/win32/atl100           # Synced to Wine-1.7.1
 reactos/dll/win32/atl80            # Synced to Wine-1.7.1
-reactos/dll/win32/avifil32         # Synced to Wine-1.7.1
+reactos/dll/win32/avifil32         # Synced to Wine-1.7.17
 reactos/dll/win32/bcrypt           # Synced to Wine-1.7.1
 reactos/dll/win32/browseui         # Out of sync
 reactos/dll/win32/cabinet          # Synced to Wine-1.7.1