import avifil32 from WINE 0.9.1 Modified: trunk/reactos/baseaddress.xml Modified: trunk/reactos/bootdata/packages/reactos.dff Added: trunk/reactos/lib/avifil32/ Added: trunk/reactos/lib/avifil32/Makefile.in Added: trunk/reactos/lib/avifil32/acmstream.c Added: trunk/reactos/lib/avifil32/api.c Added: trunk/reactos/lib/avifil32/avifil32.spec Added: trunk/reactos/lib/avifil32/avifil32.xml Added: trunk/reactos/lib/avifil32/avifile.c Added: trunk/reactos/lib/avifil32/avifile.spec Added: trunk/reactos/lib/avifil32/avifile_Cs.rc Added: trunk/reactos/lib/avifil32/avifile_De.rc Added: trunk/reactos/lib/avifil32/avifile_En.rc Added: trunk/reactos/lib/avifil32/avifile_Es.rc Added: trunk/reactos/lib/avifil32/avifile_Fr.rc Added: trunk/reactos/lib/avifil32/avifile_It.rc Added: trunk/reactos/lib/avifil32/avifile_Ja.rc Added: trunk/reactos/lib/avifil32/avifile_Nl.rc Added: trunk/reactos/lib/avifil32/avifile_No.rc Added: trunk/reactos/lib/avifil32/avifile_Pl.rc Added: trunk/reactos/lib/avifil32/avifile_Pt.rc Added: trunk/reactos/lib/avifil32/avifile_Ru.rc Added: trunk/reactos/lib/avifil32/avifile_Si.rc Added: trunk/reactos/lib/avifil32/avifile_private.h Added: trunk/reactos/lib/avifil32/editstream.c Added: trunk/reactos/lib/avifil32/extrachunk.c Added: trunk/reactos/lib/avifil32/extrachunk.h Added: trunk/reactos/lib/avifil32/factory.c Added: trunk/reactos/lib/avifil32/getframe.c Added: trunk/reactos/lib/avifil32/icmstream.c Added: trunk/reactos/lib/avifil32/regsvr.c Added: trunk/reactos/lib/avifil32/rsrc.rc Added: trunk/reactos/lib/avifil32/tmpfile.c Added: trunk/reactos/lib/avifil32/wavfile.c Modified: trunk/reactos/lib/directory.xml Modified: trunk/reactos/w32api/include/vfw.h _____
Modified: trunk/reactos/baseaddress.xml --- trunk/reactos/baseaddress.xml 2005-11-21 09:38:25 UTC (rev 19402) +++ trunk/reactos/baseaddress.xml 2005-11-21 09:51:12 UTC (rev 19403) @@ -51,6 +51,7 @@
<property name="BASEADDRESS_WINFAX" value="0x722C0000" /> <property name="BASEADDRESS_WINSCARD" value="0x723D0000" /> <property name="BASEADDRESS_DEVMGR" value="0x72a90000" /> +<property name="BASEADDRESS_AVIFIL32" value="0x73ac0000" /> <property name="BASEADDRESS_LZ32" value="0x73d80000" /> <property name="BASEADDRESS_COREDLL" value="0x73d80000" /> <property name="BASEADDRESS_USERENV" value="0x74850000" /> _____
Modified: trunk/reactos/bootdata/packages/reactos.dff --- trunk/reactos/bootdata/packages/reactos.dff 2005-11-21 09:38:25 UTC (rev 19402) +++ trunk/reactos/bootdata/packages/reactos.dff 2005-11-21 09:51:12 UTC (rev 19403) @@ -61,6 +61,7 @@
lib\advapi32\advapi32.dll 1 lib\advpack\advpack.dll 1 lib\aclui\aclui.dll 1 +lib\avifil32\avifil32.dll 1 lib\cabinet\cabinet.dll 1 lib\cards\cards.dll 1 lib\cpl\access\access.cpl 1 _____
Added: trunk/reactos/lib/avifil32/Makefile.in --- trunk/reactos/lib/avifil32/Makefile.in 2005-11-21 09:38:25 UTC (rev 19402) +++ trunk/reactos/lib/avifil32/Makefile.in 2005-11-21 09:51:12 UTC (rev 19403) @@ -0,0 +1,30 @@
+TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = avifil32.dll +IMPORTLIB = libavifil32.$(IMPLIBEXT) +IMPORTS = msacm32 msvfw32 winmm ole32 user32 advapi32 kernel32 ntdll +EXTRALIBS = -luuid + +C_SRCS = \ + acmstream.c \ + api.c \ + avifile.c \ + editstream.c \ + extrachunk.c \ + factory.c \ + getframe.c \ + icmstream.c \ + regsvr.c \ + tmpfile.c \ + wavfile.c + +SPEC_SRCS16 = avifile.spec + +RC_SRCS = \ + rsrc.rc + +@MAKE_DLL_RULES@ + +### Dependencies: Property changes on: trunk/reactos/lib/avifil32/Makefile.in ___________________________________________________________________ Name: svn:eol-style + native _____
Added: trunk/reactos/lib/avifil32/acmstream.c --- trunk/reactos/lib/avifil32/acmstream.c 2005-11-21 09:38:25 UTC (rev 19402) +++ trunk/reactos/lib/avifil32/acmstream.c 2005-11-21 09:51:12 UTC (rev 19403) @@ -0,0 +1,747 @@
+/* + * Copyright 2002 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 <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "winerror.h" +#include "windowsx.h" +#include "mmsystem.h" +#include "vfw.h" +#include "msacm.h" + +#include "avifile_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(avifile); + +/********************************************************************** */ + +static HRESULT WINAPI ACMStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj); +static ULONG WINAPI ACMStream_fnAddRef(IAVIStream*iface); +static ULONG WINAPI ACMStream_fnRelease(IAVIStream* iface); +static HRESULT WINAPI ACMStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2); +static HRESULT WINAPI ACMStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size); +static LONG WINAPI ACMStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags); +static HRESULT WINAPI ACMStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize); +static HRESULT WINAPI ACMStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize); +static HRESULT WINAPI ACMStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread); +static HRESULT WINAPI ACMStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten); +static HRESULT WINAPI ACMStream_fnDelete(IAVIStream*iface,LONG start,LONG samples); +static HRESULT WINAPI ACMStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread); +static HRESULT WINAPI ACMStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size); +static HRESULT WINAPI ACMStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen); + +static const struct IAVIStreamVtbl iacmst = { + ACMStream_fnQueryInterface, + ACMStream_fnAddRef, + ACMStream_fnRelease, + ACMStream_fnCreate, + ACMStream_fnInfo, + ACMStream_fnFindSample, + ACMStream_fnReadFormat, + ACMStream_fnSetFormat, + ACMStream_fnRead, + ACMStream_fnWrite, + ACMStream_fnDelete, + ACMStream_fnReadData, + ACMStream_fnWriteData, + ACMStream_fnSetInfo +}; + +typedef struct _IAVIStreamImpl { + /* IUnknown stuff */ + const IAVIStreamVtbl *lpVtbl; + LONG ref; + + /* IAVIStream stuff */ + PAVISTREAM pStream; + AVISTREAMINFOW sInfo; + + HACMSTREAM has; + + LPWAVEFORMATEX lpInFormat; + LONG cbInFormat; + + LPWAVEFORMATEX lpOutFormat; + LONG cbOutFormat; + + ACMSTREAMHEADER acmStreamHdr; +} IAVIStreamImpl; + +/********************************************************************** */ + +#define CONVERT_STREAM_to_THIS(a) do { \ + DWORD __bytes; \ + acmStreamSize(This->has,*(a) * This->lpInFormat->nBlockAlign,\ + &__bytes, ACM_STREAMSIZEF_SOURCE); \ + *(a) = __bytes / This->lpOutFormat->nBlockAlign; } while(0) + +#define CONVERT_THIS_to_STREAM(a) do { \ + DWORD __bytes; \ + acmStreamSize(This->has,*(a) * This->lpOutFormat->nBlockAlign,\ + &__bytes, ACM_STREAMSIZEF_DESTINATION); \ + *(a) = __bytes / This->lpInFormat->nBlockAlign; } while(0) + +static HRESULT AVIFILE_OpenCompressor(IAVIStreamImpl *This); + +HRESULT AVIFILE_CreateACMStream(REFIID riid, LPVOID *ppv) +{ + IAVIStreamImpl *pstream; + HRESULT hr; + + assert(riid != NULL && ppv != NULL); + + *ppv = NULL; + + pstream = (IAVIStreamImpl*)LocalAlloc(LPTR, sizeof(IAVIStreamImpl)); + if (pstream == NULL) + return AVIERR_MEMORY; + + pstream->lpVtbl = &iacmst; + + hr = IAVIStream_QueryInterface((IAVIStream*)pstream, riid, ppv); + if (FAILED(hr)) + LocalFree((HLOCAL)pstream); + + return hr; +} + +static HRESULT WINAPI ACMStream_fnQueryInterface(IAVIStream *iface, + REFIID refiid, LPVOID *obj) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(refiid), obj); + + if (IsEqualGUID(&IID_IUnknown, refiid) || + IsEqualGUID(&IID_IAVIStream, refiid)) { + *obj = This; + IAVIStream_AddRef(iface); + + return S_OK; + } + + return OLE_E_ENUM_NOMORE; +} + +static ULONG WINAPI ACMStream_fnAddRef(IAVIStream *iface) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) -> %ld\n", iface, ref); + + /* also add reference to the nested stream */ + if (This->pStream != NULL) + IAVIStream_AddRef(This->pStream); + + return ref; +} + +static ULONG WINAPI ACMStream_fnRelease(IAVIStream* iface) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) -> %ld\n", iface, ref); + + if (ref == 0) { + /* destruct */ + if (This->has != NULL) { + if (This->acmStreamHdr.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED) + acmStreamUnprepareHeader(This->has, &This->acmStreamHdr, 0); + acmStreamClose(This->has, 0); + This->has = NULL; + } + if (This->acmStreamHdr.pbSrc != NULL) { + GlobalFreePtr(This->acmStreamHdr.pbSrc); + This->acmStreamHdr.pbSrc = NULL; + } + if (This->acmStreamHdr.pbDst != NULL) { + GlobalFreePtr(This->acmStreamHdr.pbDst); + This->acmStreamHdr.pbDst = NULL; + } + if (This->lpInFormat != NULL) { + GlobalFreePtr(This->lpInFormat); + This->lpInFormat = NULL; + This->cbInFormat = 0; + } + if (This->lpOutFormat != NULL) { + GlobalFreePtr(This->lpOutFormat); + This->lpOutFormat = NULL; + This->cbOutFormat = 0; + } + if (This->pStream != NULL) { + IAVIStream_Release(This->pStream); + This->pStream = NULL; + } + LocalFree((HLOCAL)This); + + return 0; + } + + /* also release reference to the nested stream */ + if (This->pStream != NULL) + IAVIStream_Release(This->pStream); + + return ref; +} + +/* lParam1: PAVISTREAM + * lParam2: LPAVICOMPRESSOPTIONS -- even if doc's say LPWAVEFORMAT + */ +static HRESULT WINAPI ACMStream_fnCreate(IAVIStream *iface, LPARAM lParam1, + LPARAM lParam2) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + TRACE("(%p,0x%08lX,0x%08lX)\n", iface, lParam1, lParam2); + + /* check for swapped parameters */ + if ((LPVOID)lParam1 != NULL && + ((LPAVICOMPRESSOPTIONS)lParam1)->fccType == streamtypeAUDIO) { + register LPARAM tmp = lParam1; + + lParam1 = lParam2; + lParam2 = tmp; + } + + if ((LPVOID)lParam1 == NULL) + return AVIERR_BADPARAM; + + IAVIStream_Info((PAVISTREAM)lParam1, &This->sInfo, sizeof(This->sInfo)); + if (This->sInfo.fccType != streamtypeAUDIO) + return AVIERR_ERROR; /* error in registry or AVIMakeCompressedStream */ + + This->sInfo.fccHandler = 0; /* be paranoid */ + + /* FIXME: check ACM version? Which version does we need? */ + + if ((LPVOID)lParam2 != NULL) { + /* We only need the format from the compress-options */ + if (((LPAVICOMPRESSOPTIONS)lParam2)->fccType == streamtypeAUDIO) + lParam2 = (LPARAM)((LPAVICOMPRESSOPTIONS)lParam2)->lpFormat; + + if (((LPWAVEFORMATEX)lParam2)->wFormatTag != WAVE_FORMAT_PCM) + This->cbOutFormat = sizeof(WAVEFORMATEX) + ((LPWAVEFORMATEX)lParam2)->cbSize; + else + This->cbOutFormat = sizeof(PCMWAVEFORMAT); + + This->lpOutFormat = (LPWAVEFORMATEX)GlobalAllocPtr(GHND, This->cbOutFormat); + if (This->lpOutFormat == NULL) + return AVIERR_MEMORY; + + memcpy(This->lpOutFormat, (LPVOID)lParam2, This->cbOutFormat); + } else { + This->lpOutFormat = NULL; + This->cbOutFormat = 0; + } + + This->pStream = (PAVISTREAM)lParam1; + IAVIStream_AddRef(This->pStream); + + return AVIERR_OK; +} + +static HRESULT WINAPI ACMStream_fnInfo(IAVIStream *iface,LPAVISTREAMINFOW psi, + LONG size) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + TRACE("(%p,%p,%ld)\n", iface, psi, size); + + if (psi == NULL) + return AVIERR_BADPARAM; + if (size < 0) + return AVIERR_BADSIZE; + + /* Need codec to correct some values in structure */ + if (This->has == NULL) { + HRESULT hr = AVIFILE_OpenCompressor(This); + + if (FAILED(hr)) + return hr; + } + + memcpy(psi, &This->sInfo, min(size, (LONG)sizeof(This->sInfo))); + + if (size < (LONG)sizeof(This->sInfo)) + return AVIERR_BUFFERTOOSMALL; + return AVIERR_OK; +} + +static LONG WINAPI ACMStream_fnFindSample(IAVIStream *iface, LONG pos, + LONG flags) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + TRACE("(%p,%ld,0x%08lX)\n",iface,pos,flags); + + if (flags & FIND_FROM_START) { + pos = This->sInfo.dwStart; + flags &= ~(FIND_FROM_START|FIND_PREV); + flags |= FIND_NEXT; + } + + /* convert pos from our 'space' to This->pStream's one */ + CONVERT_THIS_to_STREAM(&pos); + + /* ask stream */ + pos = IAVIStream_FindSample(This->pStream, pos, flags); + + if (pos != -1) { + /* convert pos back to our 'space' if it's no size or physical pos */ + if ((flags & FIND_RET) == 0) + CONVERT_STREAM_to_THIS(&pos); + } + + return pos; +} + +static HRESULT WINAPI ACMStream_fnReadFormat(IAVIStream *iface, LONG pos, + LPVOID format, LONG *formatsize) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + TRACE("(%p,%ld,%p,%p)\n", iface, pos, format, formatsize); + + if (formatsize == NULL) + return AVIERR_BADPARAM; + + if (This->has == NULL) { + HRESULT hr = AVIFILE_OpenCompressor(This); + + if (FAILED(hr)) + return hr; + } + + /* only interested in needed buffersize? */ + if (format == NULL || *formatsize <= 0) { + *formatsize = This->cbOutFormat; + + return AVIERR_OK; + } + + /* copy initial format (only as much as will fit) */ + memcpy(format, This->lpOutFormat, min(*formatsize, This->cbOutFormat)); + if (*formatsize < This->cbOutFormat) { + *formatsize = This->cbOutFormat; + return AVIERR_BUFFERTOOSMALL; + } + + *formatsize = This->cbOutFormat; + return AVIERR_OK; +} + +static HRESULT WINAPI ACMStream_fnSetFormat(IAVIStream *iface, LONG pos, + LPVOID format, LONG formatsize) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + HRESULT hr; + + TRACE("(%p,%ld,%p,%ld)\n", iface, pos, format, formatsize); + + /* check parameters */ + if (format == NULL || formatsize <= 0) + return AVIERR_BADPARAM; + + /* Input format already known? + * Changing is unsupported, but be quiet if it's the same */ + if (This->lpInFormat != NULL) { + if (This->cbInFormat != formatsize || + memcmp(format, This->lpInFormat, formatsize) != 0) + return AVIERR_UNSUPPORTED; + + return AVIERR_OK; + } + + /* Does the nested stream support writing? */ + if ((This->sInfo.dwCaps & AVIFILECAPS_CANWRITE) == 0) + return AVIERR_READONLY; + + This->lpInFormat = (LPWAVEFORMATEX)GlobalAllocPtr(GMEM_MOVEABLE, formatsize); + if (This->lpInFormat == NULL) + return AVIERR_MEMORY; + This->cbInFormat = formatsize; + memcpy(This->lpInFormat, format, formatsize); + + /* initialize formats and get compressor */ + hr = AVIFILE_OpenCompressor(This); + if (FAILED(hr)) + return hr; + + CONVERT_THIS_to_STREAM(&pos); + + /* tell the nested stream the new format */ + return IAVIStream_SetFormat(This->pStream, pos, This->lpOutFormat, + This->cbOutFormat); +} + +static HRESULT WINAPI ACMStream_fnRead(IAVIStream *iface, LONG start, + LONG samples, LPVOID buffer, + LONG buffersize, LPLONG bytesread, + LPLONG samplesread) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + HRESULT hr; + DWORD size; + + TRACE("(%p,%ld,%ld,%p,%ld,%p,%p)\n", iface, start, samples, buffer, + buffersize, bytesread, samplesread); + + /* clear return parameters if given */ + if (bytesread != NULL) + *bytesread = 0; + if (samplesread != NULL) + *samplesread = 0; + + /* Do we have our compressor? */ + if (This->has == NULL) { + hr = AVIFILE_OpenCompressor(This); + + if (FAILED(hr)) + return hr; + } + + /* only need to pass through? */ + if (This->cbInFormat == This->cbOutFormat && + memcmp(This->lpInFormat, This->lpOutFormat, This->cbInFormat) == 0) { + return IAVIStream_Read(This->pStream, start, samples, buffer, buffersize, + bytesread, samplesread); + } + + /* read as much as fit? */ + if (samples == -1) + samples = buffersize / This->lpOutFormat->nBlockAlign; + /* limit to buffersize */ + if (samples * This->lpOutFormat->nBlockAlign > buffersize) + samples = buffersize / This->lpOutFormat->nBlockAlign; + + /* only return needed size? */ + if (buffer == NULL || buffersize <= 0 || samples == 0) { + if (bytesread == NULL && samplesread == NULL) + return AVIERR_BADPARAM; + + if (bytesread != NULL) + *bytesread = samples * This->lpOutFormat->nBlockAlign; + if (samplesread != NULL) + *samplesread = samples; + + return AVIERR_OK; + } + + /* map our positions to pStream positions */ + CONVERT_THIS_to_STREAM(&start); + + /* our needed internal buffersize */ + size = samples * This->lpInFormat->nBlockAlign; + + /* Need to free destination buffer used for writing? */ + if (This->acmStreamHdr.pbDst != NULL) { + GlobalFreePtr(This->acmStreamHdr.pbDst); + This->acmStreamHdr.pbDst = NULL; + This->acmStreamHdr.dwDstUser = 0; + } + + /* need bigger source buffer? */ + if (This->acmStreamHdr.pbSrc == NULL || + This->acmStreamHdr.dwSrcUser < size) { + if (This->acmStreamHdr.pbSrc == NULL) + This->acmStreamHdr.pbSrc = GlobalAllocPtr(GMEM_MOVEABLE, size); + else + This->acmStreamHdr.pbSrc = GlobalReAllocPtr(This->acmStreamHdr.pbSrc, + size, GMEM_MOVEABLE); + if (This->acmStreamHdr.pbSrc == NULL) + return AVIERR_MEMORY; + This->acmStreamHdr.dwSrcUser = size; + } + + This->acmStreamHdr.cbStruct = sizeof(This->acmStreamHdr); + This->acmStreamHdr.cbSrcLengthUsed = 0; + This->acmStreamHdr.cbDstLengthUsed = 0; + This->acmStreamHdr.cbSrcLength = size; + + /* read source data */ + hr = IAVIStream_Read(This->pStream, start, -1, This->acmStreamHdr.pbSrc, + This->acmStreamHdr.cbSrcLength, + (LONG *)&This->acmStreamHdr.cbSrcLength, NULL); + if (FAILED(hr) || This->acmStreamHdr.cbSrcLength == 0) + return hr; + + /* need to prepare stream? */ + This->acmStreamHdr.pbDst = buffer; + This->acmStreamHdr.cbDstLength = buffersize; + if ((This->acmStreamHdr.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED) == 0) { + if (acmStreamPrepareHeader(This->has, &This->acmStreamHdr, 0) != S_OK) { + This->acmStreamHdr.pbDst = NULL; + This->acmStreamHdr.cbDstLength = 0; + return AVIERR_COMPRESSOR; + } + } + + /* now do the conversion */ + /* FIXME: use ACM_CONVERTF_* flags */ + if (acmStreamConvert(This->has, &This->acmStreamHdr, 0) != S_OK) + hr = AVIERR_COMPRESSOR; + + This->acmStreamHdr.pbDst = NULL; + This->acmStreamHdr.cbDstLength = 0; + + /* fill out return parameters if given */ + if (bytesread != NULL) + *bytesread = This->acmStreamHdr.cbDstLengthUsed; + if (samplesread != NULL) + *samplesread = + This->acmStreamHdr.cbDstLengthUsed / This->lpOutFormat->nBlockAlign; + + return hr; +} + +static HRESULT WINAPI ACMStream_fnWrite(IAVIStream *iface, LONG start, + LONG samples, LPVOID buffer, + LONG buffersize, DWORD flags, + LPLONG sampwritten, + LPLONG byteswritten) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + HRESULT hr; + ULONG size; + + TRACE("(%p,%ld,%ld,%p,%ld,0x%08lX,%p,%p)\n", iface, start, samples, + buffer, buffersize, flags, sampwritten, byteswritten); + + /* clear return parameters if given */ + if (sampwritten != NULL) + *sampwritten = 0; + if (byteswritten != NULL) + *byteswritten = 0; + + /* check parameters */ + if (buffer == NULL && (buffersize > 0 || samples > 0)) + return AVIERR_BADPARAM; + + /* Have we write capability? */ + if ((This->sInfo.dwCaps & AVIFILECAPS_CANWRITE) == 0) + return AVIERR_READONLY; + + /* also need a compressor */ + if (This->has == NULL) + return AVIERR_NOCOMPRESSOR; + + /* map our sizes to pStream sizes */ + size = buffersize; + CONVERT_THIS_to_STREAM(&size); + CONVERT_THIS_to_STREAM(&start); + + /* no bytes to write? -- short circuit */ + if (size == 0) { + return IAVIStream_Write(This->pStream, -1, samples, buffer, size, + flags, sampwritten, byteswritten); + } + + /* Need to free source buffer used for reading? */ + if (This->acmStreamHdr.pbSrc != NULL) { + GlobalFreePtr(This->acmStreamHdr.pbSrc); + This->acmStreamHdr.pbSrc = NULL; + This->acmStreamHdr.dwSrcUser = 0; + } + + /* Need bigger destination buffer? */ + if (This->acmStreamHdr.pbDst == NULL || + This->acmStreamHdr.dwDstUser < size) { + if (This->acmStreamHdr.pbDst == NULL) + This->acmStreamHdr.pbDst = GlobalAllocPtr(GMEM_MOVEABLE, size); + else + This->acmStreamHdr.pbDst = GlobalReAllocPtr(This->acmStreamHdr.pbDst, + size, GMEM_MOVEABLE); + if (This->acmStreamHdr.pbDst == NULL) + return AVIERR_MEMORY; + This->acmStreamHdr.dwDstUser = size; + } + This->acmStreamHdr.cbStruct = sizeof(This->acmStreamHdr); + This->acmStreamHdr.cbSrcLengthUsed = 0; + This->acmStreamHdr.cbDstLengthUsed = 0; + This->acmStreamHdr.cbDstLength = This->acmStreamHdr.dwDstUser; + + /* need to prepare stream? */ + This->acmStreamHdr.pbSrc = buffer; + This->acmStreamHdr.cbSrcLength = buffersize; + if ((This->acmStreamHdr.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED) == 0) { + if (acmStreamPrepareHeader(This->has, &This->acmStreamHdr, 0) != S_OK) { + This->acmStreamHdr.pbSrc = NULL; + This->acmStreamHdr.cbSrcLength = 0; + return AVIERR_COMPRESSOR; + } + } + + /* now do the conversion */ + /* FIXME: use ACM_CONVERTF_* flags */ + if (acmStreamConvert(This->has, &This->acmStreamHdr, 0) != S_OK) + hr = AVIERR_COMPRESSOR; + else + hr = AVIERR_OK; + + This->acmStreamHdr.pbSrc = NULL; + This->acmStreamHdr.cbSrcLength = 0; + + if (FAILED(hr)) + return hr; + + return IAVIStream_Write(This->pStream,-1,This->acmStreamHdr.cbDstLengthUsed / + This->lpOutFormat->nBlockAlign,This->acmStreamHdr.pbDst, + This->acmStreamHdr.cbDstLengthUsed,flags,sampwritten, + byteswritten); +} + +static HRESULT WINAPI ACMStream_fnDelete(IAVIStream *iface, LONG start, + LONG samples) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + TRACE("(%p,%ld,%ld)\n", iface, start, samples); + + /* check parameters */ + if (start < 0 || samples < 0) + return AVIERR_BADPARAM; + + /* Delete before start of stream? */ + if ((DWORD)(start + samples) < This->sInfo.dwStart) + return AVIERR_OK; + + /* Delete after end of stream? */ + if ((DWORD)start > This->sInfo.dwLength) + return AVIERR_OK; + + /* For the rest we need write capability */ + if ((This->sInfo.dwCaps & AVIFILECAPS_CANWRITE) == 0) + return AVIERR_READONLY; + + /* A compressor is also necessary */ + if (This->has == NULL) + return AVIERR_NOCOMPRESSOR; + + /* map our positions to pStream positions */ + CONVERT_THIS_to_STREAM(&start); + CONVERT_THIS_to_STREAM(&samples); + + return IAVIStream_Delete(This->pStream, start, samples); +} + +static HRESULT WINAPI ACMStream_fnReadData(IAVIStream *iface, DWORD fcc, + LPVOID lp, LPLONG lpread) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + TRACE("(%p,0x%08lX,%p,%p)\n", iface, fcc, lp, lpread); + + assert(This->pStream != NULL); + + return IAVIStream_ReadData(This->pStream, fcc, lp, lpread); +} + +static HRESULT WINAPI ACMStream_fnWriteData(IAVIStream *iface, DWORD fcc, + LPVOID lp, LONG size) +{ + IAVIStreamImpl *This = (IAVIStreamImpl *)iface; + + TRACE("(%p,0x%08lx,%p,%ld)\n", iface, fcc, lp, size); + + assert(This->pStream != NULL); + + return IAVIStream_WriteData(This->pStream, fcc, lp, size); +} + +static HRESULT WINAPI ACMStream_fnSetInfo(IAVIStream *iface, + LPAVISTREAMINFOW info, LONG infolen) +{ + FIXME("(%p,%p,%ld): stub\n", iface, info, infolen); + + return E_FAIL; +} + +/********************************************************************** */ + +static HRESULT AVIFILE_OpenCompressor(IAVIStreamImpl *This) +{ + HRESULT hr; + + /* pre-conditions */ + assert(This != NULL); + assert(This->pStream != NULL); + + if (This->has != NULL) + return AVIERR_OK; + + if (This->lpInFormat == NULL) { + /* decode or encode the data from pStream */ + hr = AVIStreamFormatSize(This->pStream, This->sInfo.dwStart, &This->cbInFormat); + if (FAILED(hr)) + return hr; + This->lpInFormat = (LPWAVEFORMATEX)GlobalAllocPtr(GMEM_MOVEABLE, This->cbInFormat); + if (This->lpInFormat == NULL) + return AVIERR_MEMORY; + + hr = IAVIStream_ReadFormat(This->pStream, This->sInfo.dwStart, + This->lpInFormat, &This->cbInFormat); + if (FAILED(hr)) + return hr; + + if (This->lpOutFormat == NULL) { + /* we must decode to default format */ + This->cbOutFormat = sizeof(PCMWAVEFORMAT); + This->lpOutFormat = (LPWAVEFORMATEX)GlobalAllocPtr(GHND, This->cbOutFormat); + if (This->lpOutFormat == NULL) + return AVIERR_MEMORY; + + This->lpOutFormat->wFormatTag = WAVE_FORMAT_PCM; + if (acmFormatSuggest(NULL, This->lpInFormat, This->lpOutFormat, + This->cbOutFormat, ACM_FORMATSUGGESTF_WFORMATTAG) != S_OK) + return AVIERR_NOCOMPRESSOR; + } + } else if (This->lpOutFormat == NULL) + return AVIERR_ERROR; /* To what should I encode? */ + + if (acmStreamOpen(&This->has, NULL, This->lpInFormat, This->lpOutFormat, + NULL, 0, 0, ACM_STREAMOPENF_NONREALTIME) != S_OK) + return AVIERR_NOCOMPRESSOR; + + /* update AVISTREAMINFO structure */ + This->sInfo.dwSampleSize = This->lpOutFormat->nBlockAlign; + This->sInfo.dwScale = This->lpOutFormat->nBlockAlign; + This->sInfo.dwRate = This->lpOutFormat->nAvgBytesPerSec; + This->sInfo.dwQuality = (DWORD)ICQUALITY_DEFAULT; + SetRectEmpty(&This->sInfo.rcFrame); + + /* convert positions ansd sizes to output format */ + CONVERT_STREAM_to_THIS(&This->sInfo.dwStart); + CONVERT_STREAM_to_THIS(&This->sInfo.dwLength); + CONVERT_STREAM_to_THIS(&This->sInfo.dwSuggestedBufferSize); + + return AVIERR_OK; +} Property changes on: trunk/reactos/lib/avifil32/acmstream.c ___________________________________________________________________ Name: svn:eol-style + native _____
Added: trunk/reactos/lib/avifil32/api.c --- trunk/reactos/lib/avifil32/api.c 2005-11-21 09:38:25 UTC (rev 19402) +++ trunk/reactos/lib/avifil32/api.c 2005-11-21 09:51:12 UTC (rev 19403) @@ -0,0 +1,2338 @@
+/* + * Copyright 1999 Marcus Meissner + * Copyright 2002-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 + */ + +#include <assert.h> +#include <stdarg.h> + +#define COBJMACROS +#define COM_NO_WINDOWS_H + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "wingdi.h" +#include "winuser.h" +#include "winreg.h" +#include "winerror.h" +#include "windowsx.h" + +#include "ole2.h" +#include "shellapi.h" +#include "shlobj.h" +#include "vfw.h" +#include "msacm.h" + +#include "avifile_private.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(avifile); + + +/********************************************************************** * + * for AVIBuildFilterW -- uses fixed size table + */ +#define MAX_FILTERS 30 /* 30 => 7kB */ + +typedef struct _AVIFilter { + WCHAR szClsid[40]; + WCHAR szExtensions[MAX_FILTERS * 7]; +} AVIFilter; + +/********************************************************************** * + * for AVISaveOptions + */ +static struct { + UINT uFlags; + INT nStreams; + PAVISTREAM *ppavis; + LPAVICOMPRESSOPTIONS *ppOptions; + INT nCurrent; +} SaveOpts; + +/********************************************************************** * + * copied from dlls/ole32/compobj.c + */ +static HRESULT AVIFILE_CLSIDFromString(LPCSTR idstr, LPCLSID id) +{ + BYTE const *s; + BYTE *p; + INT i; + BYTE table[256]; + + if (!idstr) { + memset(id, 0, sizeof(CLSID)); + return S_OK; + } + + /* validate the CLSID string */ + if (lstrlenA(idstr) != 38) + return CO_E_CLASSSTRING; + + s = (BYTE const*)idstr; + if ((s[0]!='{') || (s[9]!='-') || (s[14]!='-') || (s[19]!='-') || + (s[24]!='-') || (s[37]!='}')) + return CO_E_CLASSSTRING; + + for (i = 1; i < 37; i++) { + if ((i == 9) || (i == 14) || (i == 19) || (i == 24)) + continue; + if (!(((s[i] >= '0') && (s[i] <= '9')) || + ((s[i] >= 'a') && (s[i] <= 'f')) || + ((s[i] >= 'A') && (s[i] <= 'F'))) + ) + return CO_E_CLASSSTRING; + } + + TRACE("%s -> %p\n", s, id); + + /* quick lookup table */ + memset(table, 0, 256); + + for (i = 0; i < 10; i++) + table['0' + i] = i; + + for (i = 0; i < 6; i++) { + table['A' + i] = i+10; + table['a' + i] = i+10; + } + + /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */ + p = (BYTE *) id; + + s++; /* skip leading brace */ + for (i = 0; i < 4; i++) { + p[3 - i] = table[*s]<<4 | table[*(s+1)]; + s += 2; + } + p += 4; + s++; /* skip - */ + + for (i = 0; i < 2; i++) { + p[1-i] = table[*s]<<4 | table[*(s+1)]; + s += 2; + } + p += 2; + s++; /* skip - */ + + for (i = 0; i < 2; i++) { + p[1-i] = table[*s]<<4 | table[*(s+1)]; + s += 2; + } + p += 2; + s++; /* skip - */ + + /* these are just sequential bytes */ + for (i = 0; i < 2; i++) { + *p++ = table[*s]<<4 | table[*(s+1)]; + s += 2; + } + s++; /* skip - */ + + for (i = 0; i < 6; i++) { + *p++ = table[*s]<<4 | table[*(s+1)]; + s += 2; + } + + return S_OK; +} + +static BOOL AVIFILE_GetFileHandlerByExtension(LPCWSTR szFile, LPCLSID lpclsid) +{ + CHAR szRegKey[25]; + CHAR szValue[100]; + LPWSTR szExt = strrchrW(szFile, '.'); + LONG len = sizeof(szValue) / sizeof(szValue[0]); + + if (szExt == NULL) + return FALSE; + + szExt++; + + wsprintfA(szRegKey, "AVIFile\Extensions\%.3ls", szExt); + if (RegQueryValueA(HKEY_CLASSES_ROOT, szRegKey, szValue, &len) != ERROR_SUCCESS) + return FALSE; + + return (AVIFILE_CLSIDFromString(szValue, lpclsid) == S_OK); +} + +/********************************************************************** * [truncated at 1000 lines; 11539 more skipped]