* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include <assert.h>
-#include <stdarg.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "wingdi.h"
-#include "winuser.h"
-#include "winerror.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;
+ IAVIStream IAVIStream_iface;
LONG ref;
/* IAVIStream stuff */
&__bytes, ACM_STREAMSIZEF_DESTINATION); \
*(a) = __bytes / This->lpInFormat->nBlockAlign; } while(0)
-static HRESULT AVIFILE_OpenCompressor(IAVIStreamImpl *This);
-
-HRESULT AVIFILE_CreateACMStream(REFIID riid, LPVOID *ppv)
+static HRESULT AVIFILE_OpenCompressor(IAVIStreamImpl *This)
{
- IAVIStreamImpl *pstream;
- HRESULT hr;
+ HRESULT hr;
- assert(riid != NULL && ppv != NULL);
+ /* pre-conditions */
+ assert(This != NULL);
+ assert(This->pStream != NULL);
- *ppv = NULL;
+ if (This->has != NULL)
+ return AVIERR_OK;
- pstream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAVIStreamImpl));
- if (pstream == NULL)
- return AVIERR_MEMORY;
+ 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 = HeapAlloc(GetProcessHeap(), 0, This->cbInFormat);
+ if (This->lpInFormat == NULL)
+ return AVIERR_MEMORY;
- pstream->lpVtbl = &iacmst;
+ hr = IAVIStream_ReadFormat(This->pStream, This->sInfo.dwStart,
+ This->lpInFormat, &This->cbInFormat);
+ if (FAILED(hr))
+ return hr;
- hr = IAVIStream_QueryInterface((IAVIStream*)pstream, riid, ppv);
- if (FAILED(hr))
- HeapFree(GetProcessHeap(), 0, pstream);
+ if (This->lpOutFormat == NULL) {
+ /* we must decode to default format */
+ This->cbOutFormat = sizeof(PCMWAVEFORMAT);
+ This->lpOutFormat = HeapAlloc(GetProcessHeap(), 0, This->cbOutFormat);
+ if (This->lpOutFormat == NULL)
+ return AVIERR_MEMORY;
- return hr;
+ 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 and 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;
+}
+
+static inline IAVIStreamImpl *impl_from_IAVIStream(IAVIStream *iface)
+{
+ return CONTAINING_RECORD(iface, IAVIStreamImpl, IAVIStream_iface);
}
static HRESULT WINAPI ACMStream_fnQueryInterface(IAVIStream *iface,
REFIID refiid, LPVOID *obj)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
TRACE("(%p,%s,%p)\n", iface, debugstr_guid(refiid), obj);
static ULONG WINAPI ACMStream_fnAddRef(IAVIStream *iface)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) -> %d\n", iface, ref);
static ULONG WINAPI ACMStream_fnRelease(IAVIStream* iface)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) -> %d\n", iface, ref);
static HRESULT WINAPI ACMStream_fnCreate(IAVIStream *iface, LPARAM lParam1,
LPARAM lParam2)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(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;
+ LPARAM tmp = lParam1;
lParam1 = lParam2;
lParam2 = tmp;
static HRESULT WINAPI ACMStream_fnInfo(IAVIStream *iface,LPAVISTREAMINFOW psi,
LONG size)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
TRACE("(%p,%p,%d)\n", iface, psi, size);
static LONG WINAPI ACMStream_fnFindSample(IAVIStream *iface, LONG pos,
LONG flags)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
TRACE("(%p,%d,0x%08X)\n",iface,pos,flags);
static HRESULT WINAPI ACMStream_fnReadFormat(IAVIStream *iface, LONG pos,
LPVOID format, LONG *formatsize)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
TRACE("(%p,%d,%p,%p)\n", iface, pos, format, formatsize);
static HRESULT WINAPI ACMStream_fnSetFormat(IAVIStream *iface, LONG pos,
LPVOID format, LONG formatsize)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
HRESULT hr;
LONG buffersize, LPLONG bytesread,
LPLONG samplesread)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
HRESULT hr;
DWORD size;
LPLONG sampwritten,
LPLONG byteswritten)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
HRESULT hr;
ULONG size;
static HRESULT WINAPI ACMStream_fnDelete(IAVIStream *iface, LONG start,
LONG samples)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
TRACE("(%p,%d,%d)\n", iface, start, samples);
static HRESULT WINAPI ACMStream_fnReadData(IAVIStream *iface, DWORD fcc,
LPVOID lp, LPLONG lpread)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
TRACE("(%p,0x%08X,%p,%p)\n", iface, fcc, lp, lpread);
static HRESULT WINAPI ACMStream_fnWriteData(IAVIStream *iface, DWORD fcc,
LPVOID lp, LONG size)
{
- IAVIStreamImpl *This = (IAVIStreamImpl *)iface;
+ IAVIStreamImpl *This = impl_from_IAVIStream(iface);
TRACE("(%p,0x%08x,%p,%d)\n", iface, fcc, lp, size);
return E_FAIL;
}
-/***********************************************************************/
+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
+};
-static HRESULT AVIFILE_OpenCompressor(IAVIStreamImpl *This)
+HRESULT AVIFILE_CreateACMStream(REFIID riid, LPVOID *ppv)
{
- 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 = HeapAlloc(GetProcessHeap(), 0, 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;
+ IAVIStreamImpl *pstream;
+ HRESULT hr;
- if (This->lpOutFormat == NULL) {
- /* we must decode to default format */
- This->cbOutFormat = sizeof(PCMWAVEFORMAT);
- This->lpOutFormat = HeapAlloc(GetProcessHeap(), 0, This->cbOutFormat);
- if (This->lpOutFormat == NULL)
- return AVIERR_MEMORY;
+ assert(riid != NULL && ppv != NULL);
- 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? */
+ *ppv = NULL;
- if (acmStreamOpen(&This->has, NULL, This->lpInFormat, This->lpOutFormat,
- NULL, 0, 0, ACM_STREAMOPENF_NONREALTIME) != S_OK)
- return AVIERR_NOCOMPRESSOR;
+ pstream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAVIStreamImpl));
+ if (pstream == NULL)
+ return AVIERR_MEMORY;
- /* 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);
+ pstream->IAVIStream_iface.lpVtbl = &iacmst;
- /* convert positions and 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);
+ hr = IAVIStream_QueryInterface(&pstream->IAVIStream_iface, riid, ppv);
+ if (FAILED(hr))
+ HeapFree(GetProcessHeap(), 0, pstream);
- return AVIERR_OK;
+ return hr;
}