avifile: bugfixes, stubs for editing and saving, ...

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



ChangeLog:
  - Fixed some signed/unsigned mismatches.
  - Fixed bugs in AVISaveOptions dialog handling.
  - Fixed bug in AVIFILE_LoadFile -- now check for more than
    MAX_AVISTREAMS streams in file.
  - Implemented AVIMakeFileFromStreams and AVISaveVA method.
  - Added IAVIEditStream interface.
  - Implemented EditStream* methods.
  - Added stubs for AVISaveVW, CreateEditableStream.
  - Added stubs for clipboard handling.


  Michael Günnewig

Index: dlls/avifil32/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/Makefile.in,v
retrieving revision 1.25
diff -d -u -r1.25 Makefile.in
--- dlls/avifil32/Makefile.in	23 Mar 2003 20:00:04 -0000	1.25
+++ dlls/avifil32/Makefile.in	21 Jun 2003 14:34:29 -0000
@@ -20,6 +20,7 @@
 	factory.c \
 	getframe.c \
 	icmstream.c \
+	tmpfile.c \
 	wavfile.c
 
 RC_SRCS = \
Index: dlls/avifil32/acmstream.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/acmstream.c,v
retrieving revision 1.5
diff -d -u -r1.5 acmstream.c
--- dlls/avifil32/acmstream.c	13 May 2003 00:41:58 -0000	1.5
+++ dlls/avifil32/acmstream.c	21 Jun 2003 14:34:32 -0000
@@ -279,9 +279,9 @@
       return hr;
   }
 
-  memcpy(psi, &This->sInfo, min(size, sizeof(This->sInfo)));
+  memcpy(psi, &This->sInfo, min(size, (LONG)sizeof(This->sInfo)));
 
-  if (size < sizeof(This->sInfo))
+  if (size < (LONG)sizeof(This->sInfo))
     return AVIERR_BUFFERTOOSMALL;
   return AVIERR_OK;
 }
@@ -402,7 +402,7 @@
   ICOM_THIS(IAVIStreamImpl,iface);
 
   HRESULT hr;
-  LONG    size;
+  DWORD   size;
 
   TRACE("(%p,%ld,%ld,%p,%ld,%p,%p)\n", iface, start, samples, buffer,
  	buffersize, bytesread, samplesread);
@@ -618,11 +618,11 @@
     return AVIERR_BADPARAM;
 
   /* Delete before start of stream? */
-  if (start + samples < This->sInfo.dwStart)
+  if ((DWORD)(start + samples) < This->sInfo.dwStart)
     return AVIERR_OK;
 
   /* Delete after end of stream? */
-  if (start > This->sInfo.dwLength)
+  if ((DWORD)start > This->sInfo.dwLength)
     return AVIERR_OK;
 
   /* For the rest we need write capability */
@@ -722,7 +722,7 @@
   This->sInfo.dwSampleSize = This->lpOutFormat->nBlockAlign;
   This->sInfo.dwScale      = This->lpOutFormat->nBlockAlign;
   This->sInfo.dwRate       = This->lpOutFormat->nAvgBytesPerSec;
-  This->sInfo.dwQuality    = ICQUALITY_DEFAULT;
+  This->sInfo.dwQuality    = (DWORD)ICQUALITY_DEFAULT;
   SetRectEmpty(&This->sInfo.rcFrame);
 
   /* convert positions ansd sizes to output format */
Index: dlls/avifil32/api.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/api.c,v
retrieving revision 1.15
diff -d -u -r1.15 api.c
--- dlls/avifil32/api.c	13 May 2003 00:41:58 -0000	1.15
+++ dlls/avifil32/api.c	21 Jun 2003 14:34:42 -0000
@@ -71,13 +71,13 @@
  */
 static HRESULT AVIFILE_CLSIDFromString(LPCSTR idstr, LPCLSID id)
 {
-  BYTE *s = (BYTE*)idstr;
+  BYTE const *s = (BYTE const*)idstr;
   BYTE *p;
   INT   i;
   BYTE table[256];
 
   if (!s) {
-    memset(s, 0, sizeof(CLSID));
+    memset(id, 0, sizeof(CLSID));
     return S_OK;
   } else {  /* validate the CLSID string */
     if (lstrlenA(s) != 38)
@@ -321,7 +321,7 @@
 
   if (pfile == NULL)
     return AVIERR_BADHANDLE;
-  if (size < sizeof(AVIFILEINFOA))
+  if ((DWORD)size < sizeof(AVIFILEINFOA))
     return AVIERR_BADSIZE;
 
   hres = IAVIFile_Info(pfile, &afiw, sizeof(afiw));
@@ -364,6 +364,7 @@
 
 /***********************************************************************
  *		AVIFileCreateStreamA	(AVIFIL32.@)
+ *              AVIFileCreateStream	(AVIFILE.144)
  */
 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE pfile, PAVISTREAM *ppavi,
 				    LPAVISTREAMINFOA psi)
@@ -396,6 +397,7 @@
 
 /***********************************************************************
  *		AVIFileWriteData	(AVIFIL32.@)
+ *		AVIFileWriteData	(AVIFILE.146)
  */
 HRESULT WINAPI AVIFileWriteData(PAVIFILE pfile,DWORD fcc,LPVOID lp,LONG size)
 {
@@ -409,6 +411,7 @@
 
 /***********************************************************************
  *		AVIFileReadData		(AVIFIL32.@)
+ *		AVIFileReadData		(AVIFILE.147)
  */
 HRESULT WINAPI AVIFileReadData(PAVIFILE pfile,DWORD fcc,LPVOID lp,LPLONG size)
 {
@@ -501,6 +504,7 @@
 
 /***********************************************************************
  *		AVIStreamInfoA		(AVIFIL32.@)
+ *		AVIStreamInfo		(AVIFILE.162)
  */
 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM pstream, LPAVISTREAMINFOA asi,
 			      LONG size)
@@ -512,7 +516,7 @@
 
   if (pstream == NULL)
     return AVIERR_BADHANDLE;
-  if (size < sizeof(AVISTREAMINFOA))
+  if ((DWORD)size < sizeof(AVISTREAMINFOA))
     return AVIERR_BADSIZE;
 
   hres = IAVIStream_Info(pstream, &asiw, sizeof(asiw));
@@ -541,6 +545,7 @@
 
 /***********************************************************************
  *		AVIStreamFindSample	(AVIFIL32.@)
+ *		AVIStreamFindSample	(AVIFILE.163)
  */
 HRESULT WINAPI AVIStreamFindSample(PAVISTREAM pstream, LONG pos, DWORD flags)
 {
@@ -554,6 +559,7 @@
 
 /***********************************************************************
  *		AVIStreamReadFormat	(AVIFIL32.@)
+ *		AVIStreamReadFormat	(AVIFILE.164)
  */
 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM pstream, LONG pos,
 				   LPVOID format, LPLONG formatsize)
@@ -568,6 +574,7 @@
 
 /***********************************************************************
  *		AVIStreamSetFormat	(AVIFIL32.@)
+ *		AVIStreamSetFormat	(AVIFILE.169)
  */
 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM pstream, LONG pos,
 				  LPVOID format, LONG formatsize)
@@ -582,6 +589,7 @@
 
 /***********************************************************************
  *		AVIStreamRead		(AVIFIL32.@)
+ *		AVIStreamRead		(AVIFILE.167)
  */
 HRESULT WINAPI AVIStreamRead(PAVISTREAM pstream, LONG start, LONG samples,
 			     LPVOID buffer, LONG buffersize,
@@ -599,6 +607,7 @@
 
 /***********************************************************************
  *		AVIStreamWrite		(AVIFIL32.@)
+ *		AVIStreamWrite		(AVIFILE.168)
  */
 HRESULT WINAPI AVIStreamWrite(PAVISTREAM pstream, LONG start, LONG samples,
 			      LPVOID buffer, LONG buffersize, DWORD flags,
@@ -616,6 +625,7 @@
 
 /***********************************************************************
  *		AVIStreamReadData	(AVIFIL32.@)
+ *		AVIStreamReadData	(AVIFILE.165)
  */
 HRESULT WINAPI AVIStreamReadData(PAVISTREAM pstream, DWORD fcc, LPVOID lp,
 				 LPLONG lpread)
@@ -630,6 +640,7 @@
 
 /***********************************************************************
  *		AVIStreamWriteData	(AVIFIL32.@)
+ *		AVIStreamWriteData	(AVIFILE.166)
  */
 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM pstream, DWORD fcc, LPVOID lp,
 				  LONG size)
@@ -644,6 +655,7 @@
 
 /***********************************************************************
  *		AVIStreamGetFrameOpen	(AVIFIL32.@)
+ *		AVIStreamGetFrameOpen	(AVIFILE.112)
  */
 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM pstream,
 				       LPBITMAPINFOHEADER lpbiWanted)
@@ -669,6 +681,7 @@
 
 /***********************************************************************
  *		AVIStreamGetFrame	(AVIFIL32.@)
+ *		AVIStreamGetFrame	(AVIFILE.110)
  */
 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pg, LONG pos)
 {
@@ -681,7 +694,8 @@
 }
 
 /***********************************************************************
- *		AVIStreamGetFrameClose (AVIFIL32.@)
+ *		AVIStreamGetFrameClose	(AVIFIL32.@)
+ *		AVIStreamGetFrameClose	(AVIFILE.111)
  */
 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pg)
 {
@@ -746,6 +760,24 @@
 }
 
 /***********************************************************************
+ *		AVIMakeFileFromStreams	(AVIFIL32.@)
+ */
+HRESULT WINAPI AVIMakeFileFromStreams(PAVIFILE *ppfile, int nStreams,
+				      PAVISTREAM *ppStreams)
+{
+  TRACE("(%p,%d,%p)\n", ppfile, nStreams, ppStreams);
+
+  if (nStreams < 0 || ppfile == NULL || ppStreams == NULL)
+    return AVIERR_BADPARAM;
+
+  *ppfile = AVIFILE_CreateAVITempFile(nStreams, ppStreams);
+  if (*ppfile == NULL)
+    return AVIERR_MEMORY;
+
+  return AVIERR_OK;
+}
+
+/***********************************************************************
  *		AVIStreamOpenFromFile   (AVIFILE.103)
  *		AVIStreamOpenFromFileA	(AVIFIL32.@)
  */
@@ -884,6 +916,7 @@
 
 /***********************************************************************
  *		AVIBuildFilterA		(AVIFIL32.@)
+ *		AVIBuildFilter		(AVIFILE.123)
  */
 HRESULT WINAPI AVIBuildFilterA(LPSTR szFilter, LONG cbFilter, BOOL fSaving)
 {
@@ -931,9 +964,9 @@
   WCHAR      szFileExt[10];
   WCHAR      szValue[128];
   HKEY       hKey;
-  LONG       n, i;
+  DWORD      n, i;
   LONG       size;
-  LONG       count = 0;
+  DWORD      count = 0;
 
   TRACE("(%p,%ld,%d)\n", szFilter, cbFilter, fSaving);
 
@@ -972,7 +1005,7 @@
 	break; /* a new one */
     }
 
-    if (count - i == -1) {
+    if (count - i == -1U) {
       /* it's a new CLSID */
 
       /* FIXME: How do we get info's about read/write capabilities? */
@@ -1094,7 +1127,7 @@
       memset(pOptions, 0, sizeof(AVICOMPRESSOPTIONS));
       pOptions->fccType    = streamtypeVIDEO;
       pOptions->fccHandler = comptypeDIB;
-      pOptions->dwQuality  = ICQUALITY_DEFAULT;
+      pOptions->dwQuality  = (DWORD)ICQUALITY_DEFAULT;
     }
 
     cv.cbSize     = sizeof(cv);
@@ -1117,6 +1150,7 @@
 			     SaveOpts.ppavis[SaveOpts.nCurrent], &cv, NULL);
 
     if (ret) {
+      pOptions->fccHandler = cv.fccHandler;
       pOptions->lpParms   = cv.lpState;
       pOptions->cbParms   = cv.cbState;
       pOptions->dwQuality = cv.lQ;
@@ -1151,7 +1185,7 @@
     if ((pOptions->cbFormat == 0 || pOptions->lpFormat == NULL) && size != 0) {
       pOptions->lpFormat = GlobalAllocPtr(GMEM_MOVEABLE, size);
       pOptions->cbFormat = size;
-    } else if (pOptions->cbFormat < size) {
+    } else if (pOptions->cbFormat < (DWORD)size) {
       pOptions->lpFormat = GlobalReAllocPtr(pOptions->lpFormat, size, GMEM_MOVEABLE);
       pOptions->cbFormat = size;
     }
@@ -1163,7 +1197,7 @@
     size = 0;
     AVIStreamFormatSize(SaveOpts.ppavis[SaveOpts.nCurrent],
 			sInfo.dwStart, &size);
-    if (size < sizeof(PCMWAVEFORMAT))
+    if (size < (LONG)sizeof(PCMWAVEFORMAT))
       size = sizeof(PCMWAVEFORMAT);
     afmtc.pwfxEnum = GlobalAllocPtr(GHND, size);
     if (afmtc.pwfxEnum != NULL) {
@@ -1287,7 +1321,7 @@
     SaveOpts.nCurrent = 0;
     if (SaveOpts.nStreams == 1) {
       EndDialog(hWnd, AVISaveOptionsFmtChoose(hWnd));
-      return FALSE;
+      return TRUE;
     }
 
     /* add streams */
@@ -1318,7 +1352,7 @@
     EnableWindow(GetDlgItem(hWnd, IDC_INTERLEAVEEVERY), bIsInterleaved);
     break;
   case WM_COMMAND:
-    switch (GET_WM_COMMAND_CMD(wParam, lParam)) {
+    switch (GET_WM_COMMAND_ID(wParam, lParam)) {
     case IDOK:
       /* get data from controls and save them */
       dwInterleave   = GetDlgItemInt(hWnd, IDC_INTERLEAVEEVERY, NULL, 0);
@@ -1350,10 +1384,10 @@
       AVISaveOptionsFmtChoose(hWnd);
       break;
     };
-    return FALSE;
+    return TRUE;
   };
 
-  return TRUE;
+  return FALSE;
 }
 
 /***********************************************************************
@@ -1409,6 +1443,7 @@
 
 /***********************************************************************
  *		AVISaveOptionsFree	(AVIFIL32.@)
+ *		AVISaveOptionsFree	(AVIFILE.124)
  */
 HRESULT WINAPI AVISaveOptionsFree(INT nStreams,LPAVICOMPRESSOPTIONS*ppOptions)
 {
@@ -1435,4 +1470,317 @@
   }
 
   return AVIERR_OK;
+}
+
+/***********************************************************************
+ *		AVISaveVA		(AVIFIL32.@)
+ */
+HRESULT WINAPI AVISaveVA(LPCSTR szFile, CLSID *pclsidHandler,
+			 AVISAVECALLBACK lpfnCallback, int nStream,
+			 PAVISTREAM *ppavi, LPAVICOMPRESSOPTIONS *plpOptions)
+{
+  LPWSTR  wszFile = NULL;
+  HRESULT hr;
+  int     len;
+
+  TRACE("%s,%p,%p,%d,%p,%p)\n", debugstr_a(szFile), pclsidHandler,
+	lpfnCallback, nStream, ppavi, plpOptions);
+
+  if (szFile == NULL || ppavi == NULL || plpOptions == NULL)
+    return AVIERR_BADPARAM;
+
+  /* convert ASCII string to Unicode and call Unicode function */
+  len = lstrlenA(szFile);
+  if (len <= 0)
+    return AVIERR_BADPARAM;
+
+  wszFile = (LPWSTR)LocalAlloc(LPTR, (len + 1) * sizeof(WCHAR));
+  if (wszFile == NULL)
+    return AVIERR_MEMORY;
+
+  MultiByteToWideChar(CP_ACP, 0, szFile, -1, wszFile, len + 1);
+  wszFile[len + 1] = 0;
+
+  hr = AVISaveVW(wszFile, pclsidHandler, lpfnCallback,
+		 nStream, ppavi, plpOptions);
+
+  LocalFree((HLOCAL)wszFile);
+
+  return hr;
+}
+
+/***********************************************************************
+ *		AVISaveVW		(AVIFIL32.@)
+ */
+HRESULT WINAPI AVISaveVW(LPCWSTR szFile, CLSID *pclsidHandler,
+			 AVISAVECALLBACK lpfnCallback, int nStream,
+			 PAVISTREAM *ppavi, LPAVICOMPRESSOPTIONS *plpOptions)
+{
+  FIXME("(%s,%p,%p,%d,%p,%p), stub!\n", debugstr_w(szFile), pclsidHandler,
+	lpfnCallback, nStream, ppavi, plpOptions);
+
+  if (szFile == NULL || ppavi == NULL || plpOptions == NULL)
+    return AVIERR_BADPARAM;
+
+  return AVIERR_UNSUPPORTED;
+}
+
+/***********************************************************************
+ *		CreateEditableStream	(AVIFIL32.@)
+ */
+HRESULT WINAPI CreateEditableStream(PAVISTREAM *ppEditable, PAVISTREAM pSource)
+{
+  FIXME("(%p,%p), stub!\n", ppEditable, pSource);
+
+  if (pSource == NULL)
+    return AVIERR_BADHANDLE;
+  if (ppEditable == NULL)
+    return AVIERR_BADPARAM;
+
+  *ppEditable = NULL;
+
+  return AVIERR_UNSUPPORTED;
+}
+
+/***********************************************************************
+ *		EditStreamClone		(AVIFIL32.@)
+ */
+HRESULT WINAPI EditStreamClone(PAVISTREAM pStream, PAVISTREAM *ppResult)
+{
+  PAVIEDITSTREAM pEdit = NULL;
+  HRESULT        hr;
+
+  TRACE("(%p,%p)\n", pStream, ppResult);
+
+  if (pStream == NULL)
+    return AVIERR_BADHANDLE;
+  if (ppResult == NULL)
+    return AVIERR_BADPARAM;
+
+  *ppResult = NULL;
+
+  hr = IAVIStream_QueryInterface(pStream, &IID_IAVIEditStream,(LPVOID*)&pEdit);
+  if (SUCCEEDED(hr) && pEdit != NULL) {
+    hr = IAVIEditStream_Clone(pEdit, ppResult);
+
+    IAVIEditStream_Release(pEdit);
+  } else
+    hr = AVIERR_UNSUPPORTED;
+
+  return hr;
+}
+
+/***********************************************************************
+ *		EditStreamCopy		(AVIFIL32.@)
+ */
+HRESULT WINAPI EditStreamCopy(PAVISTREAM pStream, LONG *plStart,
+			      LONG *plLength, PAVISTREAM *ppResult)
+{
+  PAVIEDITSTREAM pEdit = NULL;
+  HRESULT        hr;
+
+  TRACE("(%p,%p,%p,%p)\n", pStream, plStart, plLength, ppResult);
+
+  if (pStream == NULL)
+    return AVIERR_BADHANDLE;
+  if (plStart == NULL || plLength == NULL || ppResult == NULL)
+    return AVIERR_BADPARAM;
+
+  *ppResult = NULL;
+
+  hr = IAVIStream_QueryInterface(pStream, &IID_IAVIEditStream,(LPVOID*)&pEdit);
+  if (SUCCEEDED(hr) && pEdit != NULL) {
+    hr = IAVIEditStream_Copy(pEdit, plStart, plLength, ppResult);
+
+    IAVIEditStream_Release(pEdit);
+  } else
+    hr = AVIERR_UNSUPPORTED;
+
+  return hr;
+}
+
+/***********************************************************************
+ *		EditStreamCut		(AVIFIL32.@)
+ */
+HRESULT WINAPI EditStreamCut(PAVISTREAM pStream, LONG *plStart,
+			     LONG *plLength, PAVISTREAM *ppResult)
+{
+  PAVIEDITSTREAM pEdit = NULL;
+  HRESULT        hr;
+
+  TRACE("(%p,%p,%p,%p)\n", pStream, plStart, plLength, ppResult);
+
+  if (pStream == NULL)
+    return AVIERR_BADHANDLE;
+  if (plStart == NULL || plLength == NULL || ppResult == NULL)
+    return AVIERR_BADPARAM;
+
+  *ppResult = NULL;
+
+  hr = IAVIStream_QueryInterface(pStream, &IID_IAVIEditStream,(LPVOID*)&pEdit);
+  if (SUCCEEDED(hr) && pEdit != NULL) {
+    hr = IAVIEditStream_Cut(pEdit, plStart, plLength, ppResult);
+
+    IAVIEditStream_Release(pEdit);
+  } else
+    hr = AVIERR_UNSUPPORTED;
+
+  return hr;
+}
+
+/***********************************************************************
+ *		EditStreamPaste		(AVIFIL32.@)
+ */
+HRESULT WINAPI EditStreamPaste(PAVISTREAM pDest, LONG *plStart, LONG *plLength,
+			       PAVISTREAM pSource, LONG lStart, LONG lEnd)
+{
+  PAVIEDITSTREAM pEdit = NULL;
+  HRESULT        hr;
+
+  TRACE("(%p,%p,%p,%p,%ld,%ld)\n", pDest, plStart, plLength,
+	pSource, lStart, lEnd);
+
+  if (pDest == NULL || pSource == NULL)
+    return AVIERR_BADHANDLE;
+  if (plStart == NULL || plLength == NULL || lStart < 0)
+    return AVIERR_BADPARAM;
+
+  hr = IAVIStream_QueryInterface(pDest, &IID_IAVIEditStream,(LPVOID*)&pEdit);
+  if (SUCCEEDED(hr) && pEdit != NULL) {
+    hr = IAVIEditStream_Paste(pEdit, plStart, plLength, pSource, lStart, lEnd);
+
+    IAVIEditStream_Release(pEdit);
+  } else
+    hr = AVIERR_UNSUPPORTED;
+
+  return hr;
+}
+
+/***********************************************************************
+ *		EditStreamSetInfoA	(AVIFIL32.@)
+ */
+HRESULT WINAPI EditStreamSetInfoA(PAVISTREAM pstream, LPAVISTREAMINFOA asi,
+				  LONG size)
+{
+  AVISTREAMINFOW asiw;
+
+  TRACE("(%p,%p,%ld)\n", pstream, asi, size);
+
+  if (pstream == NULL)
+    return AVIERR_BADHANDLE;
+  if ((DWORD)size < sizeof(AVISTREAMINFOA))
+    return AVIERR_BADSIZE;
+
+  memcpy(&asiw, asi, sizeof(asi) - sizeof(asi->szName));
+  MultiByteToWideChar(CP_ACP, 0, asi->szName, -1,
+		      asiw.szName, sizeof(asiw.szName));
+
+  return EditStreamSetInfoW(pstream, &asiw, sizeof(asiw));
+}
+
+/***********************************************************************
+ *		EditStreamSetInfoW	(AVIFIL32.@)
+ */
+HRESULT WINAPI EditStreamSetInfoW(PAVISTREAM pstream, LPAVISTREAMINFOW asi,
+				  LONG size)
+{
+  PAVIEDITSTREAM pEdit = NULL;
+  HRESULT        hr;
+
+  TRACE("(%p,%p,%ld)\n", pstream, asi, size);
+
+  hr = IAVIStream_QueryInterface(pstream, &IID_IAVIEditStream,(LPVOID*)&pEdit);
+  if (SUCCEEDED(hr) && pEdit != NULL) {
+    hr = IAVIEditStream_SetInfo(pEdit, asi, size);
+
+    IAVIEditStream_Release(pEdit);
+  } else
+    hr = AVIERR_UNSUPPORTED;
+
+  return hr;
+}
+
+/***********************************************************************
+ *		EditStreamSetNameA	(AVIFIL32.@)
+ */
+HRESULT WINAPI EditStreamSetNameA(PAVISTREAM pstream, LPCSTR szName)
+{
+  AVISTREAMINFOA asia;
+  HRESULT        hres;
+
+  TRACE("(%p,%s)\n", pstream, debugstr_a(szName));
+
+  if (pstream == NULL)
+    return AVIERR_BADHANDLE;
+  if (szName == NULL)
+    return AVIERR_BADPARAM;
+
+  hres = AVIStreamInfoA(pstream, &asia, sizeof(asia));
+  if (FAILED(hres))
+    return hres;
+
+  memset(asia.szName, 0, sizeof(asia.szName));
+  lstrcpynA(asia.szName, szName, sizeof(asia.szName)/sizeof(asia.szName[0]));
+
+  return EditStreamSetInfoA(pstream, &asia, sizeof(asia));
+}
+
+/***********************************************************************
+ *		EditStreamSetNameW	(AVIFIL32.@)
+ */
+HRESULT WINAPI EditStreamSetNameW(PAVISTREAM pstream, LPCWSTR szName)
+{
+  AVISTREAMINFOW asiw;
+  HRESULT        hres;
+
+  TRACE("(%p,%s)\n", pstream, debugstr_w(szName));
+
+  if (pstream == NULL)
+    return AVIERR_BADHANDLE;
+  if (szName == NULL)
+    return AVIERR_BADPARAM;
+
+  hres = IAVIStream_Info(pstream, &asiw, sizeof(asiw));
+  if (FAILED(hres))
+    return hres;
+
+  memset(asiw.szName, 0, sizeof(asiw.szName));
+  lstrcpynW(asiw.szName, szName, sizeof(asiw.szName)/sizeof(asiw.szName[0]));
+
+  return EditStreamSetInfoW(pstream, &asiw, sizeof(asiw));
+}
+
+/***********************************************************************
+ *		AVIClearClipboard	(AVIFIL32.@)
+ */
+HRESULT WINAPI AVIClearClipboard(void)
+{
+  TRACE("()\n");
+
+  return AVIERR_UNSUPPORTED; /* OleSetClipboard(NULL); */
+}
+
+/***********************************************************************
+ *		AVIGetFromClipboard	(AVIFIL32.@)
+ */
+HRESULT WINAPI AVIGetFromClipboard(PAVIFILE *ppfile)
+{
+  FIXME("(%p), stub!\n", ppfile);
+
+  *ppfile = NULL;
+
+  return AVIERR_UNSUPPORTED;
+}
+
+/***********************************************************************
+ *		AVIPutFileOnClipboard	(AVIFIL32.@)
+ */
+HRESULT WINAPI AVIPutFileOnClipboard(PAVIFILE pfile)
+{
+  FIXME("(%p), stub!\n", pfile);
+
+  if (pfile == NULL)
+    return AVIERR_BADHANDLE;
+
+  return AVIERR_UNSUPPORTED;
 }
Index: dlls/avifil32/avifil32.spec
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/avifil32.spec,v
retrieving revision 1.16
diff -d -u -r1.16 avifil32.spec
--- dlls/avifil32/avifil32.spec	20 Mar 2003 03:53:16 -0000	1.16
+++ dlls/avifil32/avifil32.spec	21 Jun 2003 14:34:43 -0000
@@ -1,7 +1,7 @@
 @ stub    AVIBuildFilter
 @ stdcall AVIBuildFilterA(str long long)
 @ stdcall AVIBuildFilterW(wstr long long)
-@ stub    AVIClearClipboard
+@ stdcall AVIClearClipboard()
 @ stdcall AVIFileAddRef(ptr)
 @ stub    AVIFileCreateStream
 @ stdcall AVIFileCreateStreamA(ptr ptr ptr)
@@ -19,18 +19,18 @@
 @ stdcall AVIFileReadData(ptr long ptr ptr)
 @ stdcall AVIFileRelease(ptr)
 @ stdcall AVIFileWriteData(ptr long ptr long)
-@ stub    AVIGetFromClipboard
+@ stdcall AVIGetFromClipboard(ptr)
 @ stdcall AVIMakeCompressedStream(ptr ptr ptr ptr)
-@ stub    AVIMakeFileFromStreams
+@ stdcall AVIMakeFileFromStreams(ptr long ptr)
 @ stub    AVIMakeStreamFromClipboard
-@ stub    AVIPutFileOnClipboard
+@ stdcall AVIPutFileOnClipboard(ptr)
 @ stub    AVISave
 @ stub    AVISaveA
 @ stdcall AVISaveOptions(long long long ptr ptr)
 @ stdcall AVISaveOptionsFree(long ptr)
 @ stub    AVISaveV
-@ stub    AVISaveVA
-@ stub    AVISaveVW
+@ stdcall AVISaveVA(str ptr ptr long ptr ptr)
+@ stdcall AVISaveVW(wstr ptr ptr long ptr ptr)
 @ stub    AVISaveW
 @ stdcall AVIStreamAddRef(ptr)
 @ stub    AVIStreamBeginStreaming
@@ -58,19 +58,19 @@
 @ stdcall AVIStreamWrite(ptr long long ptr long long ptr ptr)
 @ stdcall AVIStreamWriteData(ptr long ptr long)
 @ stub    CLSID_AVISimpleUnMarshal
-@ stub    CreateEditableStream
+@ stdcall CreateEditableStream(ptr ptr)
 @ stdcall DllCanUnloadNow() AVIFILE_DllCanUnloadNow
 @ stdcall DllGetClassObject(ptr ptr ptr) AVIFILE_DllGetClassObject
-@ stub    EditStreamClone
-@ stub    EditStreamCopy
-@ stub    EditStreamCut
-@ stub    EditStreamPaste
+@ stdcall EditStreamClone(ptr ptr)
+@ stdcall EditStreamCopy(ptr ptr ptr ptr)
+@ stdcall EditStreamCut(ptr ptr ptr ptr)
+@ stdcall EditStreamPaste(ptr ptr ptr ptr long long)
 @ stub    EditStreamSetInfo
-@ stub    EditStreamSetInfoA
-@ stub    EditStreamSetInfoW
+@ stdcall EditStreamSetInfoA(ptr ptr long)
+@ stdcall EditStreamSetInfoW(ptr ptr long)
 @ stub    EditStreamSetName
-@ stub    EditStreamSetNameA
-@ stub    EditStreamSetNameW
+@ stdcall EditStreamSetNameA(ptr str)
+@ stdcall EditStreamSetNameW(ptr wstr)
 @ extern  IID_IAVIEditStream
 @ extern  IID_IAVIFile
 @ extern  IID_IAVIStream
Index: dlls/avifil32/avifile.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/avifile.c,v
retrieving revision 1.33
diff -d -u -r1.33 avifile.c
--- dlls/avifil32/avifile.c	13 May 2003 00:41:58 -0000	1.33
+++ dlls/avifil32/avifile.c	21 Jun 2003 14:35:00 -0000
@@ -344,9 +344,9 @@
 
   AVIFILE_UpdateInfo(This);
 
-  memcpy(afi, &This->fInfo, min(size, sizeof(This->fInfo)));
+  memcpy(afi, &This->fInfo, min((DWORD)size, sizeof(This->fInfo)));
 
-  if (size < sizeof(This->fInfo))
+  if ((DWORD)size < sizeof(This->fInfo))
     return AVIERR_BUFFERTOOSMALL;
   return AVIERR_OK;
 }
@@ -735,9 +735,9 @@
   if (size < 0)
     return AVIERR_BADSIZE;
 
-  memcpy(psi, &This->sInfo, min(size, sizeof(This->sInfo)));
+  memcpy(psi, &This->sInfo, min((DWORD)size, sizeof(This->sInfo)));
 
-  if (size < sizeof(This->sInfo))
+  if ((DWORD)size < sizeof(This->sInfo))
     return AVIERR_BUFFERTOOSMALL;
   return AVIERR_OK;
 }
@@ -786,19 +786,21 @@
       };
     } else if ((flags & FIND_FORMAT) && This->idxFmtChanges != NULL &&
 	       This->sInfo.fccType == streamtypeVIDEO) {
-      UINT n;
-
       if (flags & FIND_NEXT) {
+	ULONG n;
+
 	for (n = 0; n < This->sInfo.dwFormatChangeCount; n++)
 	  if (This->idxFmtChanges[n].ckid >= pos)
 	    goto RETURN_FOUND;
       } else {
-	for (n = This->sInfo.dwFormatChangeCount; n >= 0; n--) {
+	LONG n;
+
+	for (n = (LONG)This->sInfo.dwFormatChangeCount; n >= 0; n--) {
 	  if (This->idxFmtChanges[n].ckid <= pos)
 	    goto RETURN_FOUND;
 	}
 
-	if (pos > This->sInfo.dwStart)
+	if (pos > (LONG)This->sInfo.dwStart)
 	  return 0; /* format changes always for first frame */
       }
     }
@@ -850,8 +852,8 @@
   }
 
   /* copy initial format (only as much as will fit) */
-  memcpy(format, This->lpFormat, min(*formatsize, This->cbFormat));
-  if (*formatsize < This->cbFormat) {
+  memcpy(format, This->lpFormat, min(*(DWORD*)formatsize, This->cbFormat));
+  if (*(DWORD*)formatsize < This->cbFormat) {
     *formatsize = This->cbFormat;
     return AVIERR_BUFFERTOOSMALL;
   }
@@ -999,9 +1001,9 @@
     *samplesread = 0;
 
   /* check parameters */
-  if (This->sInfo.dwStart > start)
+  if ((LONG)This->sInfo.dwStart > start)
     return AVIERR_NODATA; /* couldn't read before start of stream */
-  if (This->sInfo.dwStart + This->sInfo.dwLength < start)
+  if (This->sInfo.dwStart + This->sInfo.dwLength < (DWORD)start)
     return AVIERR_NODATA; /* start is past end of stream */
 
   /* should we read as much as possible? */
@@ -1017,7 +1019,7 @@
   }
 
   /* limit to end of stream */
-  if (This->sInfo.dwLength < samples)
+  if ((LONG)This->sInfo.dwLength < samples)
     samples = This->sInfo.dwLength;
   if ((start - This->sInfo.dwStart) > (This->sInfo.dwLength - samples))
     samples = This->sInfo.dwLength - (start - This->sInfo.dwStart);
@@ -1392,11 +1394,11 @@
 
     /* strl,strh,strf => (3 + 2 * 2) * sizeof(DWORD) = 7 * sizeof(DWORD) */
     dwPos += 7 * sizeof(DWORD) + sizeof(AVIStreamHeader);
-    dwPos += ((pStream->cbFormat + 1) & ~1);
+    dwPos += ((pStream->cbFormat + 1) & ~1U);
     if (pStream->lpHandlerData != NULL && pStream->cbHandlerData > 0)
-      dwPos += 2 * sizeof(DWORD) + ((pStream->cbHandlerData + 1) & ~1);
+      dwPos += 2 * sizeof(DWORD) + ((pStream->cbHandlerData + 1) & ~1U);
     if (lstrlenW(pStream->sInfo.szName) > 0)
-      dwPos += 2 * sizeof(DWORD) + ((lstrlenW(pStream->sInfo.szName) + 1) & ~1);
+      dwPos += 2 * sizeof(DWORD) + ((lstrlenW(pStream->sInfo.szName) + 1) & ~1U);
   }
 
   if (This->dwMoviChunkPos == 0) {
@@ -1427,7 +1429,7 @@
   pstream->ref            = 0;
   pstream->paf            = paf;
   pstream->nStream        = nr;
-  pstream->dwCurrentFrame = -1;
+  pstream->dwCurrentFrame = (DWORD)-1;
   pstream->lLastFrame    = -1;
 
   if (asi != NULL) {
@@ -1465,7 +1467,7 @@
   /* pre-conditions */
   assert(This != NULL);
 
-  This->dwCurrentFrame = -1;
+  This->dwCurrentFrame = (DWORD)-1;
   This->lLastFrame    = -1;
   This->paf = NULL;
   if (This->idxFrames != NULL) {
@@ -1541,6 +1543,12 @@
   }
   if (mmioRead(This->hmmio, (HPSTR)&MainAVIHdr, ck.cksize) != ck.cksize)
     return AVIERR_FILEREAD;
+
+  /* check for MAX_AVISTREAMS limit */
+  if (MainAVIHdr.dwStreams > MAX_AVISTREAMS) {
+    WARN("file contains %lu streams, but only supports %d -- change MAX_AVISTREAMS!\n", MainAVIHdr.dwStreams, MAX_AVISTREAMS);
+    return AVIERR_UNSUPPORTED;
+  }
 
   /* adjust permissions if copyrighted material in file */
   if (MainAVIHdr.dwFlags & AVIFILEINFO_COPYRIGHTED) {
Index: dlls/avifil32/avifile.spec
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/avifile.spec,v
retrieving revision 1.6
diff -d -u -r1.6 avifile.spec
--- dlls/avifil32/avifile.spec	29 Oct 2002 21:31:26 -0000	1.6
+++ dlls/avifil32/avifile.spec	21 Jun 2003 14:35:00 -0000
@@ -20,14 +20,14 @@
 105 stub     AVIMAKECOMPRESSEDSTREAM
 106 stub     AVIMAKEFILEFROMSTREAMS
 107 stub     AVIMAKESTREAMFROMCLIPBOARD
-110 stub     AVISTREAMGETFRAME
-111 stub     AVISTREAMGETFRAMECLOSE
-112 stub     AVISTREAMGETFRAMEOPEN
+110 pascal   AVIStreamGetFrame(long long) AVIStreamGetFrame
+111 pascal   AVIStreamGetFrameClose(long) AVIStreamGetFrameClose
+112 pascal   AVIStreamGetFrameOpen(long ptr) AVIStreamGetFrameOpen
 120 stub     _AVISAVE
 121 stub     AVISAVEV
 122 stub     AVISAVEOPTIONS
-123 stub     AVIBUILDFILTER
-124 stub     AVISAVEOPTIONSFREE
+123 pascal   AVIBuildFilter(str long word) AVIBuildFilterA
+124 pascal   AVISaveOptionsFree(word ptr) AVISaveOptionsFree
 130 pascal   AVIStreamStart(long) AVIStreamStart
 131 pascal   AVIStreamLength(long) AVIStreamLength
 132 pascal   AVIStreamTimeToSample(long long) AVIStreamTimeToSample
@@ -36,20 +36,20 @@
 141 pascal   AVIFileRelease(long) AVIFileRelease
 142 pascal   AVIFileInfo(long ptr long) AVIFileInfoA
 143 pascal   AVIFileGetStream(long ptr long long) AVIFileGetStream
-144 stub     AVIFILECREATESTREAM
-146 stub     AVIFILEWRITEDATA
-147 stub     AVIFILEREADDATA
+144 pascal   AVIFileCreateStream(long ptr ptr) AVIFileCreateStreamA
+146 pascal   AVIFileWriteData(long long ptr long) AVIFileWriteData
+147 pascal   AVIFileReadData(long long ptr ptr) AVIFileReadData
 148 pascal   AVIFileEndRecord(long) AVIFileEndRecord
 160 pascal   AVIStreamAddRef(long) AVIStreamAddRef
 161 pascal   AVIStreamRelease(long) AVIStreamRelease
-162 stub     AVISTREAMINFO
-163 stub     AVISTREAMFINDSAMPLE
-164 stub     AVISTREAMREADFORMAT
-165 stub     AVISTREAMREADDATA
-166 stub     AVISTREAMWRITEDATA
-167 stub     AVISTREAMREAD
-168 stub     AVISTREAMWRITE
-169 stub     AVISTREAMSETFORMAT
+162 pascal   AVIStreamInfo(long ptr long) AVIStreamInfoA
+163 pascal   AVIStreamFindSample(long long long) AVIStreamFindSample
+164 pascal   AVIStreamReadFormat(long long ptr ptr) AVIStreamReadFormat
+165 pascal   AVIStreamReadData(long long ptr ptr) AVIStreamReadData
+166 pascal   AVIStreamWriteData(long long ptr long) AVIStreamWriteData
+167 pascal   AVIStreamRead(long long long ptr long ptr ptr) AVIStreamRead
+168 pascal   AVIStreamWrite(long long long ptr long long ptr ptr) AVIStreamWrite
+169 pascal   AVIStreamSetFormat(long long ptr long) AVIStreamSetFormat
 180 stub     EDITSTREAMCOPY
 181 stub     EDITSTREAMCUT
 182 stub     EDITSTREAMPASTE
Index: dlls/avifil32/avifile_private.h
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/avifile_private.h,v
retrieving revision 1.7
diff -d -u -r1.7 avifile_private.h
--- dlls/avifil32/avifile_private.h	23 Oct 2002 18:47:51 -0000	1.7
+++ dlls/avifil32/avifile_private.h	21 Jun 2003 14:35:01 -0000
@@ -20,7 +20,7 @@
 #define __AVIFILE_PRIVATE_H
 
 #ifndef MAX_AVISTREAMS
-#define MAX_AVISTREAMS 4
+#define MAX_AVISTREAMS 8
 #endif
 
 #ifndef comptypeDIB
@@ -65,6 +65,7 @@
 extern HRESULT AVIFILE_CreateACMStream(REFIID riid, LPVOID *ppobj);
 extern HRESULT AVIFILE_CreateICMStream(REFIID riid, LPVOID *ppobj);
 extern PGETFRAME AVIFILE_CreateGetFrame(PAVISTREAM pstream);
+extern PAVIFILE  AVIFILE_CreateAVITempFile(int nStreams,PAVISTREAM *ppStreams);
 
 extern LPCWSTR  AVIFILE_BasenameW(LPCWSTR szFileName);
 
Index: dlls/avifil32/extrachunk.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/extrachunk.c,v
retrieving revision 1.4
diff -d -u -r1.4 extrachunk.c
--- dlls/avifil32/extrachunk.c	3 Jan 2003 19:12:56 -0000	1.4
+++ dlls/avifil32/extrachunk.c	21 Jun 2003 14:35:02 -0000
@@ -33,7 +33,7 @@
 		       LPLONG size)
 {
   LPBYTE lp;
-  LONG   cb;
+  DWORD  cb;
 
   /* pre-conditions */
   assert(extra != NULL);
@@ -47,9 +47,10 @@
       if (((FOURCC*)lp)[0] == ckid) {
 	/* found correct chunk */
 	if (lpData != NULL && *size > 0)
-	  memcpy(lpData, lp + 2 * sizeof(DWORD), min(((LPDWORD)lp)[1],*size));
+	  memcpy(lpData, lp + 2 * sizeof(DWORD),
+		 min(((LPDWORD)lp)[1], *(LPDWORD)size));
 
-	*size = ((LPDWORD)lp)[1];
+	*(LPDWORD)size = ((LPDWORD)lp)[1];
 
 	return AVIERR_OK;
       } else {
@@ -103,7 +104,7 @@
 HRESULT ReadChunkIntoExtra(LPEXTRACHUNKS extra,HMMIO hmmio,MMCKINFO *lpck)
 {
   LPDWORD lp;
-  LONG    cb;
+  DWORD   cb;
 
   /* pre-conditions */
   assert(extra != NULL);
@@ -132,7 +133,7 @@
   if (lpck->cksize > 0) {
     if (mmioSeek(hmmio, lpck->dwDataOffset, SEEK_SET) == -1)
       return AVIERR_FILEREAD;
-    if (mmioRead(hmmio, (HPSTR)&lp[2], lpck->cksize) != lpck->cksize)
+    if (mmioRead(hmmio, (HPSTR)&lp[2], lpck->cksize) != (LONG)lpck->cksize)
       return AVIERR_FILEREAD;
   }
 
Index: dlls/avifil32/getframe.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/getframe.c,v
retrieving revision 1.5
diff -d -u -r1.5 getframe.c
--- dlls/avifil32/getframe.c	10 Apr 2003 18:17:36 -0000	1.5
+++ dlls/avifil32/getframe.c	21 Jun 2003 14:35:06 -0000
@@ -71,9 +71,9 @@
   PAVISTREAM         pStream;
 
   LPVOID             lpInBuffer;
-  DWORD              cbInBuffer;
+  LONG               cbInBuffer;
   LPBITMAPINFOHEADER lpInFormat;
-  DWORD              cbInFormat;
+  LONG               cbInFormat;
 
   LONG               lCurrentFrame;
   LPBITMAPINFOHEADER lpOutFormat;
@@ -341,7 +341,7 @@
   if (This->lpInFormat == NULL) {
     HRESULT hr;
 
-    This->cbInBuffer = sInfo.dwSuggestedBufferSize;
+    This->cbInBuffer = (LONG)sInfo.dwSuggestedBufferSize;
     if (This->cbInBuffer == 0)
       This->cbInBuffer = 1024;
 
Index: dlls/avifil32/icmstream.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/icmstream.c,v
retrieving revision 1.4
diff -d -u -r1.4 icmstream.c
--- dlls/avifil32/icmstream.c	10 Apr 2003 18:17:36 -0000	1.4
+++ dlls/avifil32/icmstream.c	21 Jun 2003 14:35:11 -0000
@@ -329,9 +329,9 @@
   if (size < 0)
     return AVIERR_BADSIZE;
 
-  memcpy(psi, &This->sInfo, min(size, sizeof(This->sInfo)));
+  memcpy(psi, &This->sInfo, min((DWORD)size, sizeof(This->sInfo)));
 
-  if (size < sizeof(This->sInfo))
+  if ((DWORD)size < sizeof(This->sInfo))
     return AVIERR_BUFFERTOOSMALL;
   return AVIERR_OK;
 }
@@ -885,7 +885,7 @@
 static HRESULT AVIFILE_OpenGetFrame(IAVIStreamImpl *This)
 {
   LPBITMAPINFOHEADER lpbi;
-  LONG               size;
+  DWORD              size;
 
   /* pre-conditions */
   assert(This != NULL);
@@ -910,7 +910,7 @@
 
   /* get memory for output format */
   size = ICCompressGetFormatSize(This->hic, lpbi);
-  if (size < sizeof(BITMAPINFOHEADER))
+  if ((LONG)size < (LONG)sizeof(BITMAPINFOHEADER))
     return AVIERR_COMPRESSOR;
   This->lpbiOutput = (LPBITMAPINFOHEADER)GlobalAllocPtr(GHND, size);
   if (This->lpbiOutput == NULL)
Index: dlls/avifil32/wavfile.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/wavfile.c,v
retrieving revision 1.5
diff -d -u -r1.5 wavfile.c
--- dlls/avifil32/wavfile.c	10 Apr 2003 18:17:36 -0000	1.5
+++ dlls/avifil32/wavfile.c	21 Jun 2003 14:35:17 -0000
@@ -298,9 +298,9 @@
       MulDiv(This->sInfo.dwSampleSize,This->sInfo.dwRate,This->sInfo.dwScale);
   }
 
-  memcpy(afi, &This->fInfo, min(size, sizeof(This->fInfo)));
+  memcpy(afi, &This->fInfo, min((DWORD)size, sizeof(This->fInfo)));
 
-  if (size < sizeof(This->fInfo))
+  if ((DWORD)size < sizeof(This->fInfo))
     return AVIERR_BUFFERTOOSMALL;
   return AVIERR_OK;
 }
@@ -667,9 +667,9 @@
   if (size < 0)
     return AVIERR_BADSIZE;
 
-  memcpy(psi, &This->paf->sInfo, min(size, sizeof(This->paf->sInfo)));
+  memcpy(psi, &This->paf->sInfo, min((DWORD)size, sizeof(This->paf->sInfo)));
 
-  if (size < sizeof(This->paf->sInfo))
+  if ((DWORD)size < sizeof(This->paf->sInfo))
     return AVIERR_BUFFERTOOSMALL;
   return AVIERR_OK;
 }
@@ -810,7 +810,7 @@
     *samplesread = 0;
 
   /* positions without data */
-  if (start < 0 || start > This->sInfo.dwLength)
+  if (start < 0 || (DWORD)start > This->sInfo.dwLength)
     return AVIERR_OK;
 
   /* check samples */
@@ -818,13 +818,13 @@
     samples = 0;
   if (buffersize > 0) {
     if (samples > 0)
-      samples = min(samples, buffersize / This->sInfo.dwSampleSize);
+      samples = min((DWORD)samples, buffersize / This->sInfo.dwSampleSize);
     else
       samples = buffersize / This->sInfo.dwSampleSize;
   }
 
   /* limit to end of stream */
-  if (start + samples > This->sInfo.dwLength)
+  if ((DWORD)(start + samples) > This->sInfo.dwLength)
     samples = This->sInfo.dwLength - start;
 
   /* request only the sizes? */
@@ -846,7 +846,7 @@
     return AVIERR_OK;
 
   /* Can I atleast read one sample? */
-  if (buffersize < This->sInfo.dwSampleSize)
+  if ((DWORD)buffersize < This->sInfo.dwSampleSize)
     return AVIERR_BUFFERTOOSMALL;
 
   buffersize = samples * This->sInfo.dwSampleSize;
@@ -909,7 +909,7 @@
     if (mmioWrite(This->hmmio, (HPSTR)buffer, buffersize) != buffersize)
       return AVIERR_FILEWRITE;
 
-    This->sInfo.dwLength = max(This->sInfo.dwLength, start + samples);
+    This->sInfo.dwLength = max(This->sInfo.dwLength, (DWORD)start + samples);
     This->ckData.cksize  = max(This->ckData.cksize,
 			       start * This->sInfo.dwSampleSize + buffersize);
 
@@ -935,23 +935,23 @@
     return AVIERR_BADPARAM;
 
   /* Delete before start of stream? */
-  if (start + samples < This->sInfo.dwStart)
+  if ((DWORD)(start + samples) < This->sInfo.dwStart)
     return AVIERR_OK;
 
   /* Delete after end of stream? */
-  if (start > This->sInfo.dwLength)
+  if ((DWORD)start > This->sInfo.dwLength)
     return AVIERR_OK;
 
   /* For the rest we need write permissions */
   if ((This->uMode & MMIO_RWMODE) == 0)
     return AVIERR_READONLY;
 
-  if (start + samples >= This->sInfo.dwLength) {
+  if ((DWORD)(start + samples) >= This->sInfo.dwLength) {
     /* deletion at end */
     samples = This->sInfo.dwLength - start;
     This->sInfo.dwLength -= samples;
     This->ckData.cksize  -= samples * This->sInfo.dwSampleSize;
-  } else if (start <= This->sInfo.dwStart) {
+  } else if ((DWORD)start <= This->sInfo.dwStart) {
     /* deletion at start */
     samples = This->sInfo.dwStart - start;
     start   = This->sInfo.dwStart;
Index: include/vfw.h
===================================================================
RCS file: /home/wine/wine/include/vfw.h,v
retrieving revision 1.34
diff -d -u -r1.34 vfw.h
--- include/vfw.h	11 Apr 2003 00:31:03 -0000	1.34
+++ include/vfw.h	21 Jun 2003 14:35:55 -0000
@@ -42,6 +42,7 @@
 typedef struct IAVIStream IAVIStream,*PAVISTREAM;
 typedef struct IAVIFile IAVIFile,*PAVIFILE;
 typedef struct IGetFrame IGetFrame,*PGETFRAME;
+typedef struct IAVIEditStream IAVIEditStream, *PAVIEDITSTREAM;
 
 /* Installable Compressor Manager */
 
@@ -743,6 +744,7 @@
 
 #define ckidAVINEWINDEX         mmioFOURCC('i', 'd', 'x', '1')
 
+#define streamtypeANY           0UL
 #define streamtypeVIDEO         mmioFOURCC('v', 'i', 'd', 's')
 #define streamtypeAUDIO         mmioFOURCC('a', 'u', 'd', 's')
 #define streamtypeMIDI          mmioFOURCC('m', 'i', 'd', 's')
@@ -1042,6 +1044,7 @@
 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pg);
 
 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM*ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *lpOptions,CLSID*pclsidHandler);
+HRESULT WINAPI AVIMakeFileFromStreams(PAVIFILE *ppfile, int nStreams, PAVISTREAM *ppStreams);
 
 HRESULT WINAPI AVIStreamOpenFromFileA(PAVISTREAM *ppavi, LPCSTR szFile,
 				      DWORD fccType, LONG lParam,
@@ -1059,6 +1062,14 @@
 			   PAVISTREAM *ppavi,LPAVICOMPRESSOPTIONS *ppOptions);
 HRESULT WINAPI AVISaveOptionsFree(INT nStreams,LPAVICOMPRESSOPTIONS*ppOptions);
 
+HRESULT WINAPI AVISaveVA(LPCSTR szFile, CLSID *pclsidHandler,
+			 AVISAVECALLBACK lpfnCallback, int nStream,
+			 PAVISTREAM *ppavi, LPAVICOMPRESSOPTIONS *plpOptions);
+HRESULT WINAPI AVISaveVW(LPCWSTR szFile, CLSID *pclsidHandler,
+			 AVISAVECALLBACK lpfnCallback, int nStream,
+			 PAVISTREAM *ppavi, LPAVICOMPRESSOPTIONS *plpOptions);
+#define AVISaveV WINELIB_NAME_AW(AVISaveV)
+
 LONG WINAPI AVIStreamStart(PAVISTREAM iface);
 LONG WINAPI AVIStreamLength(PAVISTREAM iface);
 LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pstream, LONG lSample);
@@ -1084,6 +1095,52 @@
     AVIStreamSampleToTime(pavi, AVIStreamStart(pavi))
 
 /*****************************************************************************
+ * IAVIEditStream interface
+ */
+#define INTERFACE IAVIEditStream
+#define IAVIEditStream_METHODS \
+    IUnknown_METHODS \
+    STDMETHOD(Cut)(IAVIEditStream*iface,LONG*plStart,LONG*plLength,PAVISTREAM*ppResult) PURE; \
+    STDMETHOD(Copy)(IAVIEditStream*iface,LONG*plStart,LONG*plLength,PAVISTREAM*ppResult) PURE; \
+    STDMETHOD(Paste)(IAVIEditStream*iface,LONG*plStart,LONG*plLength,PAVISTREAM pSource,LONG lStart,LONG lEnd) PURE; \
+    STDMETHOD(Clone)(IAVIEditStream*iface,PAVISTREAM*ppResult) PURE; \
+    STDMETHOD(SetInfo)(IAVIEditStream*iface,LPAVISTREAMINFOW asi, LONG size) PURE;
+ICOM_DEFINE(IAVIEditStream,IUnknown)
+#undef INTERFACE
+
+#ifdef COBJMACROS
+/*** IUnknown methods ***/
+#define IAVIEditStream_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IAVIEditStream_AddRef(p)             (p)->lpVtbl->AddRef(p)
+#define IAVIEditStream_Release(p)            (p)->lpVtbl->Release(p)
+/*** IAVIEditStream methods ***/
+#define IAVIEditStream_Cut(p,a,b,c)	     (p)->lpVtbl->Cut(p,a,b,c)
+#define IAVIEditStream_Copy(p,a,b,c)	     (p)->lpVtbl->Copy(p,a,b,c)
+#define IAVIEditStream_Paste(p,a,b,c,d,e)    (p)->lpVtbl->Paste(p,a,b,c,d,e)
+#define IAVIEditStream_Clone(p,a)	     (p)->lpVtbl->Clone(p,a)
+#define IAVIEditStream_SetInfo(p,a,b)	     (p)->lpVtbl->SetInfo(p,a,b)
+#endif
+
+HRESULT WINAPI CreateEditableStream(PAVISTREAM *ppEditable,PAVISTREAM pSource);
+HRESULT WINAPI EditStreamClone(PAVISTREAM pStream, PAVISTREAM *ppResult);
+HRESULT WINAPI EditStreamCopy(PAVISTREAM pStream, LONG *plStart,
+			      LONG *plLength, PAVISTREAM *ppResult);
+HRESULT WINAPI EditStreamCut(PAVISTREAM pStream, LONG *plStart,
+			     LONG *plLength, PAVISTREAM *ppResult);
+HRESULT WINAPI EditStreamPaste(PAVISTREAM pDest, LONG *plStart, LONG *plLength,
+			       PAVISTREAM pSource, LONG lStart, LONG lEnd);
+
+HRESULT WINAPI EditStreamSetInfoA(PAVISTREAM pstream, LPAVISTREAMINFOA asi,
+				  LONG size);
+HRESULT WINAPI EditStreamSetInfoW(PAVISTREAM pstream, LPAVISTREAMINFOW asi,
+				  LONG size);
+#define EditStreamSetInfo WINELIB_NAME_AW(EditStreamSetInfo)
+
+HRESULT WINAPI EditStreamSetNameA(PAVISTREAM pstream, LPCSTR szName);
+HRESULT WINAPI EditStreamSetNameW(PAVISTREAM pstream, LPCWSTR szName);
+#define EditStreamSetName WINELIB_NAME_AW(EditStreamSetName)
+
+/*****************************************************************************
  * IAVIFile interface
  */
 /* In Win32 this interface uses UNICODE only */
@@ -1158,6 +1215,23 @@
 #define IGetFrame_Begin(p,a,b,c)           (p)->lpVtbl->Begin(p,a,b,c)
 #define IGetFrame_End(p)                   (p)->lpVtbl->End(p)
 #define IGetFrame_SetFormat(p,a,b,c,d,e,f) (p)->lpVtbl->SetFormat(p,a,b,c,d,e,f)
+#endif
+
+HRESULT WINAPI AVIClearClipboard(void);
+HRESULT WINAPI AVIGetFromClipboard(PAVIFILE *ppfile);
+HRESULT WINAPI AVIPutFileOnClipboard(PAVIFILE pfile);
+
+#ifdef _WIN32
+#ifdef OFN_READONLY
+BOOL WINAPI GetOpenFileNamePreviewA(LPOPENFILENAMEA lpofn);
+BOOL WINAPI GetOpenFileNamePreviewW(LPOPENFILENAMEW lpofn);
+#define GetOpenFileNamePreview WINELIB_NAME_AW(GetOpenFileNamePreview)
+
+BOOL WINAPI GetSaveFileNamePreviewA(LPOPENFILENAMEA lpofn);
+BOOL WINAPI GetSaveFileNamePreviewW(LPOPENFILENAMEW lpofn);
+#define GetSaveFileNamePreview WINELIB_NAME_AW(GetSaveFileNamePreview)
+
+#endif
 #endif
 
 #define AVIERR_OK		0
--- /dev/null	2002-09-09 22:24:09.000000000 +0200
+++ dlls/avifil32/tmpfile.c	2003-06-21 14:43:04.000000000 +0200
@@ -0,0 +1,285 @@
+/*
+ * Copyright 2003 Michael Günnewig
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define COM_NO_WINDOWS_H
+#include <assert.h>
+
+#include "winbase.h"
+#include "winuser.h"
+#include "winnls.h"
+#include "winerror.h"
+#include "windowsx.h"
+#include "mmsystem.h"
+#include "vfw.h"
+
+#include "avifile_private.h"
+#include "extrachunk.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(avifile);
+
+/***********************************************************************/
+
+static HRESULT WINAPI ITmpFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj);
+static ULONG   WINAPI ITmpFile_fnAddRef(IAVIFile* iface);
+static ULONG   WINAPI ITmpFile_fnRelease(IAVIFile* iface);
+static HRESULT WINAPI ITmpFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size);
+static HRESULT WINAPI ITmpFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam);
+static HRESULT WINAPI ITmpFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi);
+static HRESULT WINAPI ITmpFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size);
+static HRESULT WINAPI ITmpFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size);
+static HRESULT WINAPI ITmpFile_fnEndRecord(IAVIFile*iface);
+static HRESULT WINAPI ITmpFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam);
+
+struct ICOM_VTABLE(IAVIFile) itmpft = {
+  ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+  ITmpFile_fnQueryInterface,
+  ITmpFile_fnAddRef,
+  ITmpFile_fnRelease,
+  ITmpFile_fnInfo,
+  ITmpFile_fnGetStream,
+  ITmpFile_fnCreateStream,
+  ITmpFile_fnWriteData,
+  ITmpFile_fnReadData,
+  ITmpFile_fnEndRecord,
+  ITmpFile_fnDeleteStream
+};
+
+typedef struct _ITmpFileImpl {
+  /* IUnknown stuff */
+  ICOM_VFIELD(IAVIFile);
+  DWORD         ref;
+
+  /* IAVIFile stuff */
+  AVIFILEINFOW  fInfo;
+  PAVISTREAM   *ppStreams;
+} ITmpFileImpl;
+
+PAVIFILE AVIFILE_CreateAVITempFile(int nStreams, PAVISTREAM *ppStreams) {
+  ITmpFileImpl *tmpFile;
+  int           i;
+
+  tmpFile = LocalAlloc(LPTR, sizeof(ITmpFileImpl));
+  if (tmpFile == NULL)
+    return NULL;
+
+  tmpFile->lpVtbl = &itmpft;
+  tmpFile->ref    = 1;
+  memset(&tmpFile->fInfo, 0, sizeof(tmpFile->fInfo));
+
+  tmpFile->fInfo.dwStreams = nStreams;
+  tmpFile->ppStreams = LocalAlloc(LPTR, nStreams * sizeof(PAVISTREAM));
+  if (tmpFile->ppStreams == NULL) {
+    LocalFree((HLOCAL)tmpFile);
+    return NULL;
+  }
+
+  for (i = 0; i < nStreams; i++) {
+    AVISTREAMINFOW sInfo;
+
+    tmpFile->ppStreams[i] = ppStreams[i];
+
+    AVIStreamAddRef(ppStreams[i]);
+    AVIStreamInfoW(ppStreams[i], &sInfo, sizeof(sInfo));
+    if (i == 0) {
+      tmpFile->fInfo.dwScale = sInfo.dwScale;
+      tmpFile->fInfo.dwRate  = sInfo.dwRate;
+      if (!sInfo.dwScale || !sInfo.dwRate) {
+	tmpFile->fInfo.dwScale = 1;
+	tmpFile->fInfo.dwRate  = 100;
+      }
+    }
+
+    if (tmpFile->fInfo.dwSuggestedBufferSize < sInfo.dwSuggestedBufferSize)
+      tmpFile->fInfo.dwSuggestedBufferSize = sInfo.dwSuggestedBufferSize;
+
+    {
+      register DWORD tmp;
+
+      tmp = MulDiv(AVIStreamSampleToTime(ppStreams[i], sInfo.dwLength), \
+		   tmpFile->fInfo.dwScale, tmpFile->fInfo.dwRate * 1000);
+      if (tmpFile->fInfo.dwLength < tmp)
+	tmpFile->fInfo.dwLength = tmp;
+
+      tmp = sInfo.rcFrame.right - sInfo.rcFrame.left;
+      if (tmpFile->fInfo.dwWidth < tmp)
+	tmpFile->fInfo.dwWidth = tmp;
+      tmp = sInfo.rcFrame.bottom - sInfo.rcFrame.top;
+      if (tmpFile->fInfo.dwHeight < tmp)
+	tmpFile->fInfo.dwHeight = tmp;
+    }
+  }
+
+  return (PAVIFILE)tmpFile;
+}
+
+static HRESULT WINAPI ITmpFile_fnQueryInterface(IAVIFile *iface, REFIID refiid,
+						LPVOID *obj)
+{
+  ICOM_THIS(ITmpFileImpl,iface);
+
+  TRACE("(%p,%s,%p)\n", This, debugstr_guid(refiid), obj);
+
+  if (IsEqualGUID(&IID_IUnknown, refiid) ||
+      IsEqualGUID(&IID_IAVIFile, refiid)) {
+    *obj = iface;
+    IAVIFile_AddRef(iface);
+
+    return S_OK;
+  }
+
+  return OLE_E_ENUM_NOMORE;
+}
+
+static ULONG   WINAPI ITmpFile_fnAddRef(IAVIFile *iface)
+{
+  ICOM_THIS(ITmpFileImpl,iface);
+
+  TRACE("(%p) -> %ld\n", iface, This->ref + 1);
+  return ++(This->ref);
+}
+
+static ULONG   WINAPI ITmpFile_fnRelease(IAVIFile *iface)
+{
+  ICOM_THIS(ITmpFileImpl,iface);
+
+  TRACE("(%p) -> %ld\n", iface, This->ref - 1);
+
+  if (!--(This->ref)) {
+    int i;
+
+    for (i = 0; i < This->fInfo.dwStreams; i++) {
+      if (This->ppStreams[i] != NULL) {
+	AVIStreamRelease(This->ppStreams[i]);
+
+	This->ppStreams[i] = NULL;
+      }
+    }
+
+    LocalFree((HLOCAL)This);
+    return 0;
+  }
+
+  return This->ref;
+}
+
+static HRESULT WINAPI ITmpFile_fnInfo(IAVIFile *iface,
+				      AVIFILEINFOW *afi, LONG size)
+{
+  ICOM_THIS(ITmpFileImpl,iface);
+
+  TRACE("(%p,%p,%ld)\n",iface,afi,size);
+
+  if (afi == NULL)
+    return AVIERR_BADPARAM;
+  if (size < 0)
+    return AVIERR_BADSIZE;
+
+  memcpy(afi, &This->fInfo, min((DWORD)size, sizeof(This->fInfo)));
+
+  if ((DWORD)size < sizeof(This->fInfo))
+    return AVIERR_BUFFERTOOSMALL;
+  return AVIERR_OK;
+}
+
+static HRESULT WINAPI ITmpFile_fnGetStream(IAVIFile *iface, PAVISTREAM *avis,
+					   DWORD fccType, LONG lParam)
+{
+  ICOM_THIS(ITmpFileImpl,iface);
+
+  ULONG nStream = (ULONG)-1;
+
+  TRACE("(%p,%p,0x%08lX,%ld)\n", iface, avis, fccType, lParam);
+
+  if (avis == NULL || lParam < 0)
+    return AVIERR_BADPARAM;
+
+  if (fccType != streamtypeANY) {
+    /* search the number of the specified stream */
+    ULONG i;
+
+    for (i = 0; i < This->fInfo.dwStreams; i++) {
+      AVISTREAMINFOW sInfo;
+      HRESULT        hr;
+
+      hr = AVIStreamInfoW(This->ppStreams[i], &sInfo, sizeof(sInfo));
+      if (FAILED(hr))
+	return hr;
+
+      if (sInfo.fccType == fccType) {
+	if (lParam == 0) {
+	  nStream = i;
+	  break;
+	} else
+	  lParam--;
+      }
+    }
+  } else
+    nStream = lParam;
+
+  /* Does the requested stream exist ? */
+  if (nStream < This->fInfo.dwStreams && This->ppStreams[nStream] != NULL) {
+    *avis = This->ppStreams[nStream];
+    AVIStreamAddRef(*avis);
+
+    return AVIERR_OK;
+  }
+
+  /* Sorry, but the specified stream doesn't exist */
+  return AVIERR_NODATA;
+}
+
+static HRESULT WINAPI ITmpFile_fnCreateStream(IAVIFile *iface,PAVISTREAM *avis,
+					      AVISTREAMINFOW *asi)
+{
+  TRACE("(%p,%p,%p)\n",iface,avis,asi);
+
+  return AVIERR_UNSUPPORTED;
+}
+
+static HRESULT WINAPI ITmpFile_fnWriteData(IAVIFile *iface, DWORD ckid,
+					   LPVOID lpData, LONG size)
+{
+  TRACE("(%p,0x%08lX,%p,%ld)\n", iface, ckid, lpData, size);
+
+  return AVIERR_UNSUPPORTED;
+}
+
+static HRESULT WINAPI ITmpFile_fnReadData(IAVIFile *iface, DWORD ckid,
+					  LPVOID lpData, LONG *size)
+{
+  TRACE("(%p,0x%08lX,%p,%p)\n", iface, ckid, lpData, size);
+
+  return AVIERR_UNSUPPORTED;
+}
+
+static HRESULT WINAPI ITmpFile_fnEndRecord(IAVIFile *iface)
+{
+  TRACE("(%p)\n",iface);
+
+  return AVIERR_OK;
+}
+
+static HRESULT WINAPI ITmpFile_fnDeleteStream(IAVIFile *iface, DWORD fccType,
+					      LONG lParam)
+{
+  TRACE("(%p,0x%08lX,%ld)\n", iface, fccType, lParam);
+
+  return AVIERR_UNSUPPORTED;
+}

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux