Fixed some bugs.
Added stubs.
Remove harmless FIXMEs.
diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in
index e4fd59b..b4cf71c 100644
--- a/dlls/quartz/Makefile.in
+++ b/dlls/quartz/Makefile.in
@@ -3,7 +3,7 @@
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = quartz.dll
-EXTRALIBS = $(LIBUUID)
+EXTRALIBS = $(LIBUUID) @JPEGLIB@
LDDLLFLAGS = @LDDLLFLAGS@
SYMBOLFILE = $(MODULE).tmp.o
@@ -36,11 +36,15 @@
iunk.c \
main.c \
memalloc.c \
+ midparse.c \
+ mjpgdec.c \
mpadec.c \
mpgparse.c \
mpvdec.c \
mtype.c \
parser.c \
+ qtdec.c \
+ qtparse.c \
regsvr.c \
sample.c \
seekpass.c \
diff --git a/dlls/quartz/README b/dlls/quartz/README
index 44de309..a7eccf0 100644
--- a/dlls/quartz/README
+++ b/dlls/quartz/README
@@ -8,7 +8,6 @@
- implement filters
- restruct color-space converter
- sort active filters in filter graph
- - sort regfilters in Merit order
- fix deadlocks in Receive/EndOfStream
- handle plug-in distributor
- handle seeking
diff --git a/dlls/quartz/acmwrap.c b/dlls/quartz/acmwrap.c
index d3ef823..dbc4cb4 100644
--- a/dlls/quartz/acmwrap.c
+++ b/dlls/quartz/acmwrap.c
@@ -266,7 +266,7 @@
const WAVEFORMATEX* pwfxOut;
WAVEFORMATEX wfx;
- FIXME("(%p)\n",This);
+ TRACE("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
diff --git a/dlls/quartz/asyncsrc.c b/dlls/quartz/asyncsrc.c
index bb3246b..6fd644d 100644
--- a/dlls/quartz/asyncsrc.c
+++ b/dlls/quartz/asyncsrc.c
@@ -435,7 +435,7 @@
REFERENCE_TIME rtStart;
REFERENCE_TIME rtEnd;
- TRACE("(%p)->(%lu,%p,%p)\n",This,dwTimeout,ppSample,pdwContext);
+ /*TRACE("(%p)->(%lu,%p,%p)\n",This,dwTimeout,ppSample,pdwContext);*/
EnterCriticalSection( &This->m_csRequest );
if ( This->m_bInFlushing )
@@ -498,6 +498,11 @@
llStart = rtStart / QUARTZ_TIMEUNITS;
lLength = (LONG)(rtEnd / QUARTZ_TIMEUNITS - rtStart / QUARTZ_TIMEUNITS);
lActual = 0;
+ if ( lLength > IMediaSample_GetSize(pSample) )
+ {
+ FIXME("invalid length\n");
+ return E_FAIL;
+ }
EnterCriticalSection( &This->m_csReader );
hr = This->pSource->m_pHandler->pRead( This->pSource, llStart, lLength, pData, &lActual, (HANDLE)NULL );
diff --git a/dlls/quartz/audren.c b/dlls/quartz/audren.c
index 8213bb6..9a80d63 100644
--- a/dlls/quartz/audren.c
+++ b/dlls/quartz/audren.c
@@ -396,7 +396,7 @@
CAudioRendererImpl_THIS(pImpl,basefilter);
HRESULT hr;
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
if ( This->pPin->pin.pmtConn == NULL )
return NOERROR;
@@ -416,7 +416,7 @@
WAVEFORMATEX* pwfx;
HRESULT hr;
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
if ( This->pPin->pin.pmtConn == NULL )
return NOERROR;
@@ -442,7 +442,7 @@
{
CAudioRendererImpl_THIS(pImpl,basefilter);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
This->m_fInFlush = TRUE;
@@ -602,7 +602,7 @@
{
CAudioRendererPinImpl_THIS(pImpl,pin);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
This->pRender->m_fInFlush = TRUE;
CAudioRendererImpl_waveOutReset(This->pRender);
@@ -614,7 +614,7 @@
{
CAudioRendererPinImpl_THIS(pImpl,pin);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
This->pRender->m_fInFlush = FALSE;
@@ -946,7 +946,7 @@
CAudioRendererImpl_THIS(iface,basaud);
HRESULT hr;
- FIXME("(%p)->(%ld)\n",This,lVol);
+ TRACE("(%p)->(%ld)\n",This,lVol);
if ( lVol > 0 || lVol < -10000 )
return E_INVALIDARG;
@@ -964,7 +964,7 @@
{
CAudioRendererImpl_THIS(iface,basaud);
- FIXME("(%p)->(%p)\n",This,plVol);
+ TRACE("(%p)->(%p)\n",This,plVol);
if ( plVol == NULL )
return E_POINTER;
@@ -982,7 +982,7 @@
CAudioRendererImpl_THIS(iface,basaud);
HRESULT hr;
- FIXME("(%p)->(%ld)\n",This,lBalance);
+ TRACE("(%p)->(%ld)\n",This,lBalance);
if ( lBalance > 0 || lBalance < -10000 )
return E_INVALIDARG;
@@ -1000,7 +1000,7 @@
{
CAudioRendererImpl_THIS(iface,basaud);
- FIXME("(%p)->(%p)\n",This,plBalance);
+ TRACE("(%p)->(%p)\n",This,plBalance);
if ( plBalance == NULL )
return E_POINTER;
diff --git a/dlls/quartz/fmap.c b/dlls/quartz/fmap.c
index 4bb95ff..4a113ac 100644
--- a/dlls/quartz/fmap.c
+++ b/dlls/quartz/fmap.c
@@ -882,7 +882,13 @@
BOOL bMatch;
HRESULT hr;
- FIXME("(%p)->(%p,%08lx,%d,%08lx,%d,%lu,%p,%p,%p,%d,%d,%lu,%p,%p,%p)\n",This,ppEnumMoniker,dwFlags,bExactMatch,dwMerit,bInputNeeded,cInputTypes,pguidInputTypes,pPinMediumIn,pPinCategoryIn,bRender,bOutputNeeded,cOutputTypes,pguidOutputTypes,pPinMediumOut,pPinCategoryOut);
+ WARN("(%p)->(%p,%08lx,%d,%08lx,%d,%lu,%p,%p,%p,%d,%d,%lu,%p,%p,%p) some features are not implemented\n",
+ This,ppEnumMoniker,dwFlags,bExactMatch,dwMerit,
+ bInputNeeded,cInputTypes,pguidInputTypes,
+ pPinMediumIn,pPinCategoryIn,
+ bRender,
+ bOutputNeeded,cOutputTypes,pguidOutputTypes,
+ pPinMediumOut,pPinCategoryOut);
if ( ppEnumMoniker == NULL )
return E_POINTER;
diff --git a/dlls/quartz/ifgraph.c b/dlls/quartz/ifgraph.c
index 9122368..e713c21 100644
--- a/dlls/quartz/ifgraph.c
+++ b/dlls/quartz/ifgraph.c
@@ -612,7 +612,7 @@
pFilter, NULL, This->m_pActiveFilters[n].pwszName );
if ( This->m_pActiveFilters[n].pFilter != NULL )
- IMediaPosition_Release(This->m_pActiveFilters[n].pFilter);
+ IBaseFilter_Release(This->m_pActiveFilters[n].pFilter);
if ( This->m_pActiveFilters[n].pPosition != NULL )
IMediaPosition_Release(This->m_pActiveFilters[n].pPosition);
if ( This->m_pActiveFilters[n].pSeeking != NULL )
@@ -907,7 +907,7 @@
return NOERROR;
/* FIXME - try to connect indirectly. */
- FIXME( "(%p)->(%p,%p) stub!\n",This,pOut,pIn );
+ FIXME( "(%p)->(%p,%p) not fully implemented\n",This,pOut,pIn );
info.pFilter = NULL;
hr = IPin_QueryPinInfo(pOut,&info);
@@ -1142,7 +1142,7 @@
CLSID clsidSource;
IFileSourceFilter* pSource;
- FIXME( "(%p)->(%s,%s,%p)\n",This,
+ TRACE( "(%p)->(%s,%s,%p)\n",This,
debugstr_w(lpFileName),debugstr_w(lpFilterName),ppBaseFilter );
if ( lpFileName == NULL || ppBaseFilter == NULL )
@@ -1271,14 +1271,14 @@
BOOL bRendered = FALSE;
ULONG cReturned;
- FIXME( "(%p)->(%p,%08lx,%p) stub!\n",This,pPin,dwFlags,pdwReserved);
+ TRACE( "(%p)->(%p,%08lx,%p)\n",This,pPin,dwFlags,pdwReserved);
if ( pdwReserved != NULL )
return E_INVALIDARG;
if ( dwFlags != 0 )
{
- FIXME( "dwFlags != 0...\n" );
+ FIXME( "dwFlags != 0 (0x%08lx)\n", dwFlags );
return E_INVALIDARG;
}
diff --git a/dlls/quartz/iunk.c b/dlls/quartz/iunk.c
index 9b07e7a..3e593d3 100644
--- a/dlls/quartz/iunk.c
+++ b/dlls/quartz/iunk.c
@@ -79,7 +79,7 @@
if ( hr == E_NOINTERFACE )
{
- FIXME("(%p) unknown interface: %s\n",This,debugstr_guid(riid));
+ WARN("(%p) unknown interface: %s\n",This,debugstr_guid(riid));
}
return hr;
diff --git a/dlls/quartz/main.c b/dlls/quartz/main.c
index 0a85ef2..04a494f 100644
--- a/dlls/quartz/main.c
+++ b/dlls/quartz/main.c
@@ -112,6 +112,10 @@
{ &CLSID_FileWriter, &QUARTZ_CreateFileWriter },
{ &CLSID_CMpegAudioCodec, &QUARTZ_CreateCMpegAudioCodec },
{ &CLSID_CMpegVideoCodec, &QUARTZ_CreateCMpegVideoCodec },
+ { &CLSID_quartzQuickTimeMovieParser, &QUARTZ_CreateQuickTimeMovieParser },
+ { &CLSID_quartzMIDIParser, &QUARTZ_CreateMIDIParser },
+ { &CLSID_quartzMJPGDecompressor, QUARTZ_CreateMJPGDecompressor },
+ { &CLSID_quartzQuickTimeDecompressor, QUARTZ_CreateQuickTimeDecompressor },
{ NULL, NULL },
};
diff --git a/dlls/quartz/memalloc.c b/dlls/quartz/memalloc.c
index e1cc88d..ea5cf1f 100644
--- a/dlls/quartz/memalloc.c
+++ b/dlls/quartz/memalloc.c
@@ -217,8 +217,8 @@
if ( pPropReq == NULL || pPropActual == NULL )
return E_POINTER;
- if ( pPropReq->cBuffers < 0 ||
- pPropReq->cbBuffer < 0 ||
+ if ( pPropReq->cBuffers <= 0 ||
+ pPropReq->cbBuffer <= 0 ||
pPropReq->cbAlign < 0 ||
pPropReq->cbPrefix < 0 )
{
diff --git a/dlls/quartz/midparse.c b/dlls/quartz/midparse.c
new file mode 100644
index 0000000..37f7715
--- /dev/null
+++ b/dlls/quartz/midparse.c
@@ -0,0 +1,191 @@
+/*
+ * Implements MIDI Parser.
+ *
+ * FIXME - stub
+ * FIXME - no seeking
+ *
+ * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
+ *
+ * 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 "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "mmsystem.h"
+#include "vfw.h"
+#include "winerror.h"
+#include "strmif.h"
+#include "control.h"
+#include "vfwmsgs.h"
+#include "amvideo.h"
+#include "uuids.h"
+
+
+#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(quartz);
+
+#include "quartz_private.h"
+#include "parser.h"
+#include "mtype.h"
+
+
+
+static const WCHAR QUARTZ_MIDIParser_Name[] =
+{ 'Q','u','i','c','k','T','i','m','e',' ','M','o','v','i','e',' ','P','a','r','s','e','r',0 };
+static const WCHAR QUARTZ_MIDIParserInPin_Name[] =
+{ 'I','n',0 };
+static const WCHAR QUARTZ_MIDIParserOutPin_Name[] =
+{ 'O','u','t',0 };
+
+
+/****************************************************************************
+ *
+ * CMIDIParseImpl
+ */
+
+
+typedef struct CMIDIParseImpl CMIDIParseImpl;
+
+struct CMIDIParseImpl
+{
+};
+
+
+static HRESULT CMIDIParseImpl_InitParser( CParserImpl* pImpl, ULONG* pcStreams )
+{
+ WARN("(%p,%p) stub\n",pImpl,pcStreams);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CMIDIParseImpl_UninitParser( CParserImpl* pImpl )
+{
+ CMIDIParseImpl* This = (CMIDIParseImpl*)pImpl->m_pUserData;
+
+ TRACE("(%p)\n",This);
+
+ if ( This == NULL )
+ return NOERROR;
+
+ /* destruct */
+
+ QUARTZ_FreeMem( This );
+ pImpl->m_pUserData = NULL;
+
+ return NOERROR;
+}
+
+static LPCWSTR CMIDIParseImpl_GetOutPinName( CParserImpl* pImpl, ULONG nStreamIndex )
+{
+ CMIDIParseImpl* This = (CMIDIParseImpl*)pImpl->m_pUserData;
+
+ TRACE("(%p,%lu)\n",This,nStreamIndex);
+
+ return QUARTZ_MIDIParserOutPin_Name;
+}
+
+static HRESULT CMIDIParseImpl_GetStreamType( CParserImpl* pImpl, ULONG nStreamIndex, AM_MEDIA_TYPE* pmt )
+{
+ CMIDIParseImpl* This = (CMIDIParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p) stub\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CMIDIParseImpl_CheckStreamType( CParserImpl* pImpl, ULONG nStreamIndex, const AM_MEDIA_TYPE* pmt )
+{
+ CMIDIParseImpl* This = (CMIDIParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p) stub\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CMIDIParseImpl_GetAllocProp( CParserImpl* pImpl, ALLOCATOR_PROPERTIES* pReqProp )
+{
+ CMIDIParseImpl* This = (CMIDIParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p,%p) stub\n",This,pReqProp);
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CMIDIParseImpl_GetNextRequest( CParserImpl* pImpl, ULONG* pnStreamIndex, LONGLONG* pllStart, LONG* plLength, REFERENCE_TIME* prtStart, REFERENCE_TIME* prtStop, DWORD* pdwSampleFlags )
+{
+ CMIDIParseImpl* This = (CMIDIParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p) stub\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CMIDIParseImpl_ProcessSample( CParserImpl* pImpl, ULONG nStreamIndex, LONGLONG llStart, LONG lLength, IMediaSample* pSample )
+{
+ CMIDIParseImpl* This = (CMIDIParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p,%lu,%ld,%ld,%p)\n",This,nStreamIndex,(long)llStart,lLength,pSample);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+static const struct ParserHandlers CMIDIParseImpl_Handlers =
+{
+ CMIDIParseImpl_InitParser,
+ CMIDIParseImpl_UninitParser,
+ CMIDIParseImpl_GetOutPinName,
+ CMIDIParseImpl_GetStreamType,
+ CMIDIParseImpl_CheckStreamType,
+ CMIDIParseImpl_GetAllocProp,
+ CMIDIParseImpl_GetNextRequest,
+ CMIDIParseImpl_ProcessSample,
+
+ /* for IQualityControl */
+ NULL, /* pQualityNotify */
+
+ /* for seeking */
+ NULL, /* pGetSeekingCaps */
+ NULL, /* pIsTimeFormatSupported */
+ NULL, /* pGetCurPos */
+ NULL, /* pSetCurPos */
+ NULL, /* pGetDuration */
+ NULL, /* pGetStopPos */
+ NULL, /* pSetStopPos */
+ NULL, /* pGetPreroll */
+};
+
+HRESULT QUARTZ_CreateMIDIParser(IUnknown* punkOuter,void** ppobj)
+{
+ return QUARTZ_CreateParser(
+ punkOuter,ppobj,
+ &CLSID_quartzMIDIParser,
+ QUARTZ_MIDIParser_Name,
+ QUARTZ_MIDIParserInPin_Name,
+ &CMIDIParseImpl_Handlers );
+}
+
+
diff --git a/dlls/quartz/mjpgdec.c b/dlls/quartz/mjpgdec.c
new file mode 100644
index 0000000..71e4093
--- /dev/null
+++ b/dlls/quartz/mjpgdec.c
@@ -0,0 +1,235 @@
+/*
+ * Implements AVI MJPG Decompressor.
+ *
+ * FIXME - stub
+ *
+ * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
+ *
+ * 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 "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winerror.h"
+#include "vfw.h"
+#include "strmif.h"
+#include "control.h"
+#include "amvideo.h"
+#include "vfwmsgs.h"
+#include "uuids.h"
+
+#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(quartz);
+
+#include "quartz_private.h"
+#include "xform.h"
+
+static const WCHAR MJPGDec_FilterName[] =
+{'M','J','P','G',' ','D','e','c','o','m','p','r','e','s','s','o','r',0};
+
+typedef struct CMJPGDecImpl
+{
+ AM_MEDIA_TYPE* m_pmtConv;
+ DWORD m_cConv;
+} CMJPGDecImpl;
+
+/***************************************************************************
+ *
+ * CMJPGDecImpl methods
+ *
+ */
+
+static void MJPGDec_FreeOutTypes(CMJPGDecImpl* This)
+{
+ DWORD i;
+
+ if ( This->m_pmtConv == NULL )
+ return;
+
+ TRACE("cConv = %lu\n",This->m_cConv);
+ for ( i = 0; i < This->m_cConv; i++ )
+ {
+ QUARTZ_MediaType_Free(&This->m_pmtConv[i]);
+ }
+ QUARTZ_FreeMem(This->m_pmtConv);
+ This->m_pmtConv = NULL;
+ This->m_cConv = 0;
+}
+
+
+static HRESULT MJPGDec_Init( CTransformBaseImpl* pImpl )
+{
+ CMJPGDecImpl* This = pImpl->m_pUserData;
+
+ if ( This != NULL )
+ return NOERROR;
+
+ This = (CMJPGDecImpl*)QUARTZ_AllocMem( sizeof(CMJPGDecImpl) );
+ if ( This == NULL )
+ return E_OUTOFMEMORY;
+ ZeroMemory( This, sizeof(CMJPGDecImpl) );
+ pImpl->m_pUserData = This;
+ /* construct */
+ This->m_pmtConv = NULL;
+ This->m_cConv = 0;
+
+ return NOERROR;
+}
+
+static HRESULT MJPGDec_Cleanup( CTransformBaseImpl* pImpl )
+{
+ CMJPGDecImpl* This = pImpl->m_pUserData;
+
+ if ( This == NULL )
+ return NOERROR;
+ /* destruct */
+ MJPGDec_FreeOutTypes(This);
+
+ QUARTZ_FreeMem( This );
+ pImpl->m_pUserData = NULL;
+
+ return NOERROR;
+}
+
+static HRESULT MJPGDec_CheckMediaType( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut )
+{
+ CMJPGDecImpl* This = pImpl->m_pUserData;
+
+ WARN("(%p) stub\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT MJPGDec_GetOutputTypes( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE** ppmtAcceptTypes, ULONG* pcAcceptTypes )
+{
+ CMJPGDecImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
+
+ FIXME("(%p)\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ hr = MJPGDec_CheckMediaType( pImpl, pmtIn, NULL );
+ if ( FAILED(hr) )
+ return hr;
+
+ MJPGDec_FreeOutTypes(This);
+
+ *ppmtAcceptTypes = This->m_pmtConv;
+ *pcAcceptTypes = This->m_cConv;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT MJPGDec_GetAllocProp( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, ALLOCATOR_PROPERTIES* pProp, BOOL* pbTransInPlace, BOOL* pbTryToReuseSample )
+{
+ CMJPGDecImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
+
+ FIXME("(%p)\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ hr = MJPGDec_CheckMediaType( pImpl, pmtIn, NULL );
+ if ( FAILED(hr) )
+ return hr;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT MJPGDec_BeginTransform( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, BOOL bReuseSample )
+{
+ CMJPGDecImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
+
+ FIXME("(%p)\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ hr = MJPGDec_CheckMediaType( pImpl, pmtIn, NULL );
+ if ( FAILED(hr) )
+ return hr;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT MJPGDec_Transform( CTransformBaseImpl* pImpl, IMediaSample* pSampIn, IMediaSample* pSampOut )
+{
+ CMJPGDecImpl* This = pImpl->m_pUserData;
+ BYTE* pDataIn = NULL;
+ BYTE* pDataOut = NULL;
+ HRESULT hr;
+
+ FIXME("(%p)\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ hr = IMediaSample_GetPointer( pSampIn, &pDataIn );
+ if ( FAILED(hr) )
+ return hr;
+ hr = IMediaSample_GetPointer( pSampOut, &pDataOut );
+ if ( FAILED(hr) )
+ return hr;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT MJPGDec_EndTransform( CTransformBaseImpl* pImpl )
+{
+ CMJPGDecImpl* This = pImpl->m_pUserData;
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+
+static const TransformBaseHandlers transhandlers =
+{
+ MJPGDec_Init,
+ MJPGDec_Cleanup,
+ MJPGDec_CheckMediaType,
+ MJPGDec_GetOutputTypes,
+ MJPGDec_GetAllocProp,
+ MJPGDec_BeginTransform,
+ NULL,
+ MJPGDec_Transform,
+ MJPGDec_EndTransform,
+};
+
+HRESULT QUARTZ_CreateMJPGDecompressor(IUnknown* punkOuter,void** ppobj)
+{
+ return QUARTZ_CreateTransformBase(
+ punkOuter,ppobj,
+ &CLSID_quartzMJPGDecompressor,
+ MJPGDec_FilterName,
+ NULL, NULL,
+ &transhandlers );
+}
+
+
diff --git a/dlls/quartz/mpadec.c b/dlls/quartz/mpadec.c
index a2a1604..25a6e93 100644
--- a/dlls/quartz/mpadec.c
+++ b/dlls/quartz/mpadec.c
@@ -29,6 +29,8 @@
#include "wingdi.h"
#include "winuser.h"
#include "winerror.h"
+#include "mmsystem.h"
+#include "mmreg.h"
#include "strmif.h"
#include "control.h"
#include "amvideo.h"
@@ -48,19 +50,76 @@
typedef struct CMPEGAudioDecoderImpl
{
- int dummy;
+ AM_MEDIA_TYPE* pmt;
+ DWORD cmt;
+ WAVEFORMATEX wfxOut;
+
+ /* codec stuffs */
+
} CMPEGAudioDecoderImpl;
+/*****************************************************************************
+ *
+ * codec-dependent stuffs - no codec
+ *
+ */
+
+#define NO_CODEC_IMPL
+
+static void Codec_OnConstruct(CMPEGAudioDecoderImpl* This)
+{
+}
+
+static void Codec_OnCleanup(CMPEGAudioDecoderImpl* This)
+{
+}
+
+static HRESULT Codec_BeginTransform(CTransformBaseImpl* pImpl,CMPEGAudioDecoderImpl* This)
+{
+ FIXME("no codec\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT Codec_ProcessReceive(CTransformBaseImpl* pImpl,CMPEGAudioDecoderImpl* This,IMediaSample* pSampIn)
+{
+ FIXME("no codec\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT Codec_EndTransform(CTransformBaseImpl* pImpl,CMPEGAudioDecoderImpl* This)
+{
+ FIXME("no codec\n");
+ return E_NOTIMPL;
+}
+
+
+
/***************************************************************************
*
* CMPEGAudioDecoderImpl methods
*
*/
+static void CMPEGAudioDecoderImpl_CleanupOutTypes(CMPEGAudioDecoderImpl* This)
+{
+ DWORD i;
+
+ if ( This->pmt != NULL )
+ {
+ for ( i = 0; i < This->cmt; i++ )
+ {
+ QUARTZ_MediaType_Free(&This->pmt[i]);
+ }
+ QUARTZ_FreeMem(This->pmt);
+ This->pmt = NULL;
+ }
+ This->cmt = 0;
+}
+
static HRESULT CMPEGAudioDecoderImpl_Init( CTransformBaseImpl* pImpl )
{
- CMPEGAudioDecoderImpl* This = pImpl->m_pUserData;
+ CMPEGAudioDecoderImpl* This = (CMPEGAudioDecoderImpl*)pImpl->m_pUserData;
TRACE("(%p)\n",This);
@@ -74,13 +133,16 @@
pImpl->m_pUserData = This;
/* construct */
+ This->pmt = NULL;
+ This->cmt = 0;
+ Codec_OnConstruct(This);
return S_OK;
}
static HRESULT CMPEGAudioDecoderImpl_Cleanup( CTransformBaseImpl* pImpl )
{
- CMPEGAudioDecoderImpl* This = pImpl->m_pUserData;
+ CMPEGAudioDecoderImpl* This = (CMPEGAudioDecoderImpl*)pImpl->m_pUserData;
TRACE("(%p)\n",This);
@@ -88,6 +150,8 @@
return S_OK;
/* destruct */
+ Codec_OnCleanup(This);
+ CMPEGAudioDecoderImpl_CleanupOutTypes(This);
QUARTZ_FreeMem( This );
pImpl->m_pUserData = NULL;
@@ -97,70 +161,189 @@
static HRESULT CMPEGAudioDecoderImpl_CheckMediaType( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut )
{
- CMPEGAudioDecoderImpl* This = pImpl->m_pUserData;
+ CMPEGAudioDecoderImpl* This = (CMPEGAudioDecoderImpl*)pImpl->m_pUserData;
+ const WAVEFORMATEX* pwfxIn;
+ const WAVEFORMATEX* pwfxOut;
- FIXME("(%p)\n",This);
+ TRACE("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
+ if ( !IsEqualGUID( &pmtIn->majortype, &MEDIATYPE_Audio ) )
+ return E_FAIL;
+ if ( !IsEqualGUID( &pmtIn->formattype, &FORMAT_WaveFormatEx ) )
+ return E_FAIL;
+
+ if ( pmtIn->pbFormat == NULL ||
+ pmtIn->cbFormat < sizeof(WAVEFORMATEX) )
+ return E_FAIL;
+ pwfxIn = (const WAVEFORMATEX*)pmtIn->pbFormat;
+ if ( pwfxIn->wFormatTag != WAVE_FORMAT_MPEG &&
+ pwfxIn->wFormatTag != WAVE_FORMAT_MPEGLAYER3 )
+ return E_FAIL;
+ if ( pwfxIn->nChannels != 1 && pwfxIn->nChannels != 2 )
+ return E_FAIL;
+ if ( pwfxIn->nBlockAlign < 1 )
+ return E_FAIL;
+
+ if ( pmtOut != NULL )
+ {
+ if ( !IsEqualGUID( &pmtOut->majortype, &MEDIATYPE_Audio ) )
+ return E_FAIL;
+ if ( !IsEqualGUID( &pmtOut->formattype, &FORMAT_WaveFormatEx ) )
+ return E_FAIL;
+
+ if ( pmtOut->pbFormat == NULL ||
+ pmtOut->cbFormat < sizeof(WAVEFORMATEX) )
+ return E_FAIL;
+ pwfxOut = (const WAVEFORMATEX*)pmtOut->pbFormat;
+
+ if ( pwfxOut->wFormatTag != WAVE_FORMAT_PCM )
+ return E_FAIL;
+ if ( pwfxOut->nChannels != pwfxIn->nChannels ||
+ pwfxOut->nSamplesPerSec != pwfxIn->nSamplesPerSec )
+ return E_FAIL;
+ if ( pwfxOut->wBitsPerSample != 16 )
+ return E_FAIL;
+ if ( pwfxOut->nBlockAlign != (pwfxOut->nChannels * pwfxOut->wBitsPerSample >> 3 ) )
+ return E_FAIL;
+ }
+
+#ifdef NO_CODEC_IMPL
+ WARN("no codec implementation\n");
return E_NOTIMPL;
+#else
+ return S_OK;
+#endif
}
static HRESULT CMPEGAudioDecoderImpl_GetOutputTypes( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE** ppmtAcceptTypes, ULONG* pcAcceptTypes )
{
- CMPEGAudioDecoderImpl* This = pImpl->m_pUserData;
+ CMPEGAudioDecoderImpl* This = (CMPEGAudioDecoderImpl*)pImpl->m_pUserData;
+ HRESULT hr;
+ const WAVEFORMATEX* pwfxIn;
+ AM_MEDIA_TYPE* pmtOut;
+ WAVEFORMATEX* pwfxOut;
- FIXME("(%p)\n",This);
+ TRACE("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
- return E_NOTIMPL;
+ hr = CMPEGAudioDecoderImpl_CheckMediaType( pImpl, pmtIn, NULL );
+ if ( FAILED(hr) )
+ return hr;
+ pwfxIn = (const WAVEFORMATEX*)pmtIn->pbFormat;
+
+ CMPEGAudioDecoderImpl_CleanupOutTypes(This);
+
+ This->cmt = 1;
+ This->pmt = (AM_MEDIA_TYPE*)QUARTZ_AllocMem(
+ sizeof(AM_MEDIA_TYPE) * This->cmt );
+ if ( This->pmt == NULL )
+ return E_OUTOFMEMORY;
+ ZeroMemory( This->pmt, sizeof(AM_MEDIA_TYPE) * This->cmt );
+
+ pmtOut = &This->pmt[0];
+
+ memcpy( &pmtOut->majortype, &MEDIATYPE_Audio, sizeof(GUID) );
+ memcpy( &pmtOut->subtype, &MEDIASUBTYPE_PCM, sizeof(GUID) );
+ memcpy( &pmtOut->formattype, &FORMAT_WaveFormatEx, sizeof(GUID) );
+ pmtOut->bFixedSizeSamples = 1;
+ pmtOut->bTemporalCompression = 0;
+ pmtOut->lSampleSize = pwfxIn->nChannels * 16 >> 3;
+ pmtOut->pbFormat = (BYTE*)CoTaskMemAlloc( sizeof(WAVEFORMATEX) );
+ if ( pmtOut->pbFormat == NULL )
+ return E_OUTOFMEMORY;
+ pwfxOut = (WAVEFORMATEX*)pmtOut->pbFormat;
+ pmtOut->cbFormat = sizeof(WAVEFORMATEX);
+ pwfxOut->wFormatTag = WAVE_FORMAT_PCM;
+ pwfxOut->nChannels = pwfxIn->nChannels;
+ pwfxOut->nSamplesPerSec = pwfxIn->nSamplesPerSec;
+ pwfxOut->nAvgBytesPerSec = pwfxOut->nSamplesPerSec * pmtOut->lSampleSize;
+ pwfxOut->nBlockAlign = pmtOut->lSampleSize;
+ pwfxOut->wBitsPerSample = 16;
+ pwfxOut->cbSize = 0;
+
+ *ppmtAcceptTypes = This->pmt;
+ *pcAcceptTypes = This->cmt;
+
+ return S_OK;
}
static HRESULT CMPEGAudioDecoderImpl_GetAllocProp( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, ALLOCATOR_PROPERTIES* pProp, BOOL* pbTransInPlace, BOOL* pbTryToReuseSample )
{
- CMPEGAudioDecoderImpl* This = pImpl->m_pUserData;
+ CMPEGAudioDecoderImpl* This = (CMPEGAudioDecoderImpl*)pImpl->m_pUserData;
+ const WAVEFORMATEX* pwfxIn;
+ const WAVEFORMATEX* pwfxOut;
+ HRESULT hr;
- FIXME("(%p)\n",This);
+ TRACE("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
- return E_NOTIMPL;
+ hr = CMPEGAudioDecoderImpl_CheckMediaType( pImpl, pmtIn, pmtOut );
+ if ( FAILED(hr) )
+ return hr;
+ pwfxIn = (const WAVEFORMATEX*)pmtIn->pbFormat;
+ pwfxOut = (const WAVEFORMATEX*)pmtOut->pbFormat;
+
+ pProp->cBuffers = 1;
+ pProp->cbBuffer = pwfxOut->nAvgBytesPerSec;
+
+ TRACE("cbBuffer %ld\n",pProp->cbBuffer);
+
+ *pbTransInPlace = FALSE;
+ *pbTryToReuseSample = FALSE;
+
+ return S_OK;
}
static HRESULT CMPEGAudioDecoderImpl_BeginTransform( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, BOOL bReuseSample )
{
- CMPEGAudioDecoderImpl* This = pImpl->m_pUserData;
+ CMPEGAudioDecoderImpl* This = (CMPEGAudioDecoderImpl*)pImpl->m_pUserData;
+ HRESULT hr;
- FIXME("(%p,%p,%p,%d)\n",This,pmtIn,pmtOut,bReuseSample);
+ TRACE("(%p,%p,%p,%d)\n",This,pmtIn,pmtOut,bReuseSample);
if ( This == NULL )
return E_UNEXPECTED;
- return E_NOTIMPL;
+ hr = CMPEGAudioDecoderImpl_CheckMediaType( pImpl, pmtIn, pmtOut );
+ if ( FAILED(hr) )
+ return hr;
+ memcpy( &This->wfxOut, (const WAVEFORMATEX*)pmtOut->pbFormat, sizeof(WAVEFORMATEX) );
+
+ return Codec_BeginTransform(pImpl,This);
}
static HRESULT CMPEGAudioDecoderImpl_ProcessReceive( CTransformBaseImpl* pImpl, IMediaSample* pSampIn )
{
- CMPEGAudioDecoderImpl* This = pImpl->m_pUserData;
+ CMPEGAudioDecoderImpl* This = (CMPEGAudioDecoderImpl*)pImpl->m_pUserData;
- FIXME("(%p)\n",This);
+ TRACE("(%p,%p)\n",This,pSampIn);
if ( This == NULL )
return E_UNEXPECTED;
- return E_NOTIMPL;
+ return Codec_ProcessReceive(pImpl,This,pSampIn);
}
static HRESULT CMPEGAudioDecoderImpl_EndTransform( CTransformBaseImpl* pImpl )
{
- CMPEGAudioDecoderImpl* This = pImpl->m_pUserData;
+ CMPEGAudioDecoderImpl* This = (CMPEGAudioDecoderImpl*)pImpl->m_pUserData;
+ HRESULT hr;
- FIXME("(%p)\n",This);
+ TRACE("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
- return E_NOTIMPL;
+ hr = Codec_EndTransform(pImpl,This);
+ if ( FAILED(hr) )
+ return hr;
+ ZeroMemory( &This->wfxOut, sizeof(WAVEFORMATEX) );
+
+ return S_OK;
}
+
static const TransformBaseHandlers transhandlers =
{
CMPEGAudioDecoderImpl_Init,
@@ -184,4 +367,3 @@
&transhandlers );
}
-
diff --git a/dlls/quartz/mpgparse.c b/dlls/quartz/mpgparse.c
index ed5b30a..98f1e4e 100644
--- a/dlls/quartz/mpgparse.c
+++ b/dlls/quartz/mpgparse.c
@@ -100,6 +100,7 @@
BOOL bDataDiscontinuity;
};
+static HRESULT CMPGParseImpl_GetStreamType( CParserImpl* pImpl, ULONG nStreamIndex, AM_MEDIA_TYPE* pmt );
static HRESULT CMPGParseImpl_SyncReadPayload(
CParserImpl* pImpl, CMPGParseImpl* This,
@@ -129,6 +130,8 @@
{
CMPGParseImpl* This = NULL;
HRESULT hr;
+ DWORD n;
+ AM_MEDIA_TYPE mt;
BYTE hdrbuf[8];
TRACE("(%p,%p)\n",pImpl,pcStreams);
@@ -190,6 +193,14 @@
return E_FAIL;
}
+ /* To determine block size, scan all payloads. */
+ ZeroMemory( &mt, sizeof(mt) );
+ for ( n = 0; n < This->cPayloads; n++ )
+ {
+ CMPGParseImpl_GetStreamType(pImpl,n,&mt);
+ QUARTZ_MediaType_Free(&mt);
+ }
+
return S_OK;
}
@@ -494,6 +505,7 @@
dwPayloadBlockSize = (pmpg1wav->wfx.nAvgBytesPerSec + pmpg1wav->wfx.nBlockAlign - 1) / pmpg1wav->wfx.nBlockAlign;
if ( dwPayloadBlockSize > This->dwPayloadBlockSizeMax )
This->dwPayloadBlockSizeMax = dwPayloadBlockSize;
+ TRACE("payload block size = %lu\n",dwPayloadBlockSize);
}
return S_OK;
@@ -638,6 +650,10 @@
pReqProp->cBuffers = This->cPayloads;
pReqProp->cbBuffer = This->dwPayloadBlockSizeMax;
+ TRACE("buf %d size %d\n",
+ (int)This->cPayloads,
+ (int)This->dwPayloadBlockSizeMax);
+
return S_OK;
}
diff --git a/dlls/quartz/mpvdec.c b/dlls/quartz/mpvdec.c
index 5784096..f005a34 100644
--- a/dlls/quartz/mpvdec.c
+++ b/dlls/quartz/mpvdec.c
@@ -48,16 +48,70 @@
typedef struct CMPEGVideoDecoderImpl
{
- int dummy;
+ AM_MEDIA_TYPE* pmt;
+ DWORD cmt;
+
} CMPEGVideoDecoderImpl;
+/*****************************************************************************
+ *
+ * codec-dependent stuffs - no codec
+ *
+ */
+
+#define NO_CODEC_IMPL
+
+static void Codec_OnConstruct(CMPEGVideoDecoderImpl* This)
+{
+}
+
+static void Codec_OnCleanup(CMPEGVideoDecoderImpl* This)
+{
+}
+
+static HRESULT Codec_BeginTransform(CTransformBaseImpl* pImpl,CMPEGVideoDecoderImpl* This)
+{
+ FIXME("no codec\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT Codec_ProcessReceive(CTransformBaseImpl* pImpl,CMPEGVideoDecoderImpl* This,IMediaSample* pSampIn)
+{
+ FIXME("no codec\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT Codec_EndTransform(CTransformBaseImpl* pImpl,CMPEGVideoDecoderImpl* This)
+{
+ FIXME("no codec\n");
+ return E_NOTIMPL;
+}
+
+
+
/***************************************************************************
*
* CMPEGVideoDecoderImpl methods
*
*/
+static void CMPEGVideoDecoderImpl_CleanupOutTypes(CMPEGVideoDecoderImpl* This)
+{
+ DWORD i;
+
+ if ( This->pmt != NULL )
+ {
+ for ( i = 0; i < This->cmt; i++ )
+ {
+ QUARTZ_MediaType_Free(&This->pmt[i]);
+ }
+ QUARTZ_FreeMem(This->pmt);
+ This->pmt = NULL;
+ }
+ This->cmt = 0;
+}
+
static HRESULT CMPEGVideoDecoderImpl_Init( CTransformBaseImpl* pImpl )
{
CMPEGVideoDecoderImpl* This = pImpl->m_pUserData;
@@ -74,6 +128,9 @@
pImpl->m_pUserData = This;
/* construct */
+ This->pmt = NULL;
+ This->cmt = 0;
+ Codec_OnConstruct(This);
return S_OK;
}
@@ -88,6 +145,8 @@
return S_OK;
/* destruct */
+ Codec_OnCleanup(This);
+ CMPEGVideoDecoderImpl_CleanupOutTypes(This);
QUARTZ_FreeMem( This );
pImpl->m_pUserData = NULL;
@@ -99,44 +158,68 @@
{
CMPEGVideoDecoderImpl* This = pImpl->m_pUserData;
- FIXME("(%p)\n",This);
+ TRACE("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
+
+
+#ifdef NO_CODEC_IMPL
+ WARN("no codec implementation\n");
return E_NOTIMPL;
+#else
+ return S_OK;
+#endif
}
static HRESULT CMPEGVideoDecoderImpl_GetOutputTypes( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE** ppmtAcceptTypes, ULONG* pcAcceptTypes )
{
CMPEGVideoDecoderImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
FIXME("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
+ hr = CMPEGVideoDecoderImpl_CheckMediaType( pImpl, pmtIn, NULL );
+ if ( FAILED(hr) )
+ return hr;
+
+ CMPEGVideoDecoderImpl_CleanupOutTypes(This);
+
return E_NOTIMPL;
}
static HRESULT CMPEGVideoDecoderImpl_GetAllocProp( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, ALLOCATOR_PROPERTIES* pProp, BOOL* pbTransInPlace, BOOL* pbTryToReuseSample )
{
CMPEGVideoDecoderImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
FIXME("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
+ hr = CMPEGVideoDecoderImpl_CheckMediaType( pImpl, pmtIn, pmtOut );
+ if ( FAILED(hr) )
+ return hr;
+
return E_NOTIMPL;
}
static HRESULT CMPEGVideoDecoderImpl_BeginTransform( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, BOOL bReuseSample )
{
CMPEGVideoDecoderImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
FIXME("(%p,%p,%p,%d)\n",This,pmtIn,pmtOut,bReuseSample);
if ( This == NULL )
return E_UNEXPECTED;
- return E_NOTIMPL;
+ hr = CMPEGVideoDecoderImpl_CheckMediaType( pImpl, pmtIn, pmtOut );
+ if ( FAILED(hr) )
+ return hr;
+
+ return Codec_BeginTransform(pImpl,This);
}
static HRESULT CMPEGVideoDecoderImpl_ProcessReceive( CTransformBaseImpl* pImpl, IMediaSample* pSampIn )
@@ -147,18 +230,23 @@
if ( This == NULL )
return E_UNEXPECTED;
- return E_NOTIMPL;
+ return Codec_ProcessReceive(pImpl,This,pSampIn);
}
static HRESULT CMPEGVideoDecoderImpl_EndTransform( CTransformBaseImpl* pImpl )
{
CMPEGVideoDecoderImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
FIXME("(%p)\n",This);
if ( This == NULL )
return E_UNEXPECTED;
- return E_NOTIMPL;
+ hr = Codec_EndTransform(pImpl,This);
+ if ( FAILED(hr) )
+ return hr;
+
+ return S_OK;
}
static const TransformBaseHandlers transhandlers =
diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c
index 80a9d63..de3052c 100644
--- a/dlls/quartz/parser.c
+++ b/dlls/quartz/parser.c
@@ -749,7 +749,7 @@
{
CParserImpl_THIS(pImpl,basefilter);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
This->basefilter.bIntermediateState = TRUE;
if ( !CParserImpl_EndThread(This,TRUE) )
diff --git a/dlls/quartz/parser.h b/dlls/quartz/parser.h
index 6f1619f..4ce9aaf 100644
--- a/dlls/quartz/parser.h
+++ b/dlls/quartz/parser.h
@@ -29,9 +29,20 @@
typedef struct CParserOutPinImpl CParserOutPinImpl;
typedef struct ParserHandlers ParserHandlers;
+/* {D51BD5A0-7548-11CF-A520-0080C77EF58A} */
+DEFINE_GUID(CLSID_quartzQuickTimeMovieParser,
+0xD51BD5A0,0x7548,0x11CF,0xA5,0x20,0x00,0x80,0xC7,0x7E,0xF5,0x8A);
/* {D51BD5A1-7548-11CF-A520-0080C77EF58A} */
DEFINE_GUID(CLSID_quartzWaveParser,
0xD51BD5A1,0x7548,0x11CF,0xA5,0x20,0x00,0x80,0xC7,0x7E,0xF5,0x8A);
+/* {D51BD5A2-7548-11CF-A520-0080C77EF58A} */
+DEFINE_GUID(CLSID_quartzMIDIParser,
+0xD51BD5A2,0x7548,0x11CF,0xA5,0x20,0x00,0x80,0xC7,0x7E,0xF5,0x8A);
+/* {D51BD5A3-7548-11CF-A520-0080C77EF58A} */
+DEFINE_GUID(CLSID_quartzMultifileParser,
+0xD51BD5A3,0x7548,0x11CF,0xA5,0x20,0x00,0x80,0xC7,0x7E,0xF5,0x8A);
+
+
struct CParserImpl
{
@@ -182,6 +193,8 @@
HRESULT QUARTZ_CreateWaveParser(IUnknown* punkOuter,void** ppobj);
HRESULT QUARTZ_CreateAVISplitter(IUnknown* punkOuter,void** ppobj);
HRESULT QUARTZ_CreateMPEG1Splitter(IUnknown* punkOuter,void** ppobj);
+HRESULT QUARTZ_CreateQuickTimeMovieParser(IUnknown* punkOuter,void** ppobj);
+HRESULT QUARTZ_CreateMIDIParser(IUnknown* punkOuter,void** ppobj);
HRESULT RIFF_GetNext(
diff --git a/dlls/quartz/qtdec.c b/dlls/quartz/qtdec.c
new file mode 100644
index 0000000..33d7897
--- /dev/null
+++ b/dlls/quartz/qtdec.c
@@ -0,0 +1,234 @@
+/*
+ * Implements QuickTime Video Decompressor.
+ *
+ * FIXME - stub
+ *
+ * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
+ *
+ * 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 "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winerror.h"
+#include "vfw.h"
+#include "strmif.h"
+#include "control.h"
+#include "amvideo.h"
+#include "vfwmsgs.h"
+#include "uuids.h"
+
+#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(quartz);
+
+#include "quartz_private.h"
+#include "xform.h"
+
+static const WCHAR QTDec_FilterName[] =
+{'Q','u','i','c','k','T','i','m','e',' ','D','e','c','o','m','p','r','e','s','s','o','r',0};
+
+typedef struct CQTDecImpl
+{
+ AM_MEDIA_TYPE* m_pmtConv;
+ DWORD m_cConv;
+} CQTDecImpl;
+
+/***************************************************************************
+ *
+ * CQTDecImpl methods
+ *
+ */
+
+static void QTDec_FreeOutTypes(CQTDecImpl* This)
+{
+ DWORD i;
+
+ if ( This->m_pmtConv == NULL )
+ return;
+
+ TRACE("cConv = %lu\n",This->m_cConv);
+ for ( i = 0; i < This->m_cConv; i++ )
+ {
+ QUARTZ_MediaType_Free(&This->m_pmtConv[i]);
+ }
+ QUARTZ_FreeMem(This->m_pmtConv);
+ This->m_pmtConv = NULL;
+ This->m_cConv = 0;
+}
+
+
+static HRESULT QTDec_Init( CTransformBaseImpl* pImpl )
+{
+ CQTDecImpl* This = pImpl->m_pUserData;
+
+ if ( This != NULL )
+ return NOERROR;
+
+ This = (CQTDecImpl*)QUARTZ_AllocMem( sizeof(CQTDecImpl) );
+ if ( This == NULL )
+ return E_OUTOFMEMORY;
+ ZeroMemory( This, sizeof(CQTDecImpl) );
+ pImpl->m_pUserData = This;
+ /* construct */
+ This->m_pmtConv = NULL;
+ This->m_cConv = 0;
+
+ return NOERROR;
+}
+
+static HRESULT QTDec_Cleanup( CTransformBaseImpl* pImpl )
+{
+ CQTDecImpl* This = pImpl->m_pUserData;
+
+ if ( This == NULL )
+ return NOERROR;
+ /* destruct */
+ QTDec_FreeOutTypes(This);
+
+ QUARTZ_FreeMem( This );
+ pImpl->m_pUserData = NULL;
+
+ return NOERROR;
+}
+
+static HRESULT QTDec_CheckMediaType( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut )
+{
+ CQTDecImpl* This = pImpl->m_pUserData;
+
+ WARN("(%p) stub\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT QTDec_GetOutputTypes( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE** ppmtAcceptTypes, ULONG* pcAcceptTypes )
+{
+ CQTDecImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
+
+ FIXME("(%p)\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ hr = QTDec_CheckMediaType( pImpl, pmtIn, NULL );
+ if ( FAILED(hr) )
+ return hr;
+
+ QTDec_FreeOutTypes(This);
+
+ *ppmtAcceptTypes = This->m_pmtConv;
+ *pcAcceptTypes = This->m_cConv;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT QTDec_GetAllocProp( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, ALLOCATOR_PROPERTIES* pProp, BOOL* pbTransInPlace, BOOL* pbTryToReuseSample )
+{
+ CQTDecImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
+
+ FIXME("(%p)\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ hr = QTDec_CheckMediaType( pImpl, pmtIn, NULL );
+ if ( FAILED(hr) )
+ return hr;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT QTDec_BeginTransform( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, BOOL bReuseSample )
+{
+ CQTDecImpl* This = pImpl->m_pUserData;
+ HRESULT hr;
+
+ FIXME("(%p)\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ hr = QTDec_CheckMediaType( pImpl, pmtIn, NULL );
+ if ( FAILED(hr) )
+ return hr;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT QTDec_Transform( CTransformBaseImpl* pImpl, IMediaSample* pSampIn, IMediaSample* pSampOut )
+{
+ CQTDecImpl* This = pImpl->m_pUserData;
+ BYTE* pDataIn = NULL;
+ BYTE* pDataOut = NULL;
+ HRESULT hr;
+
+ FIXME("(%p)\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ hr = IMediaSample_GetPointer( pSampIn, &pDataIn );
+ if ( FAILED(hr) )
+ return hr;
+ hr = IMediaSample_GetPointer( pSampOut, &pDataOut );
+ if ( FAILED(hr) )
+ return hr;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT QTDec_EndTransform( CTransformBaseImpl* pImpl )
+{
+ CQTDecImpl* This = pImpl->m_pUserData;
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+
+static const TransformBaseHandlers transhandlers =
+{
+ QTDec_Init,
+ QTDec_Cleanup,
+ QTDec_CheckMediaType,
+ QTDec_GetOutputTypes,
+ QTDec_GetAllocProp,
+ QTDec_BeginTransform,
+ NULL,
+ QTDec_Transform,
+ QTDec_EndTransform,
+};
+
+HRESULT QUARTZ_CreateQuickTimeDecompressor(IUnknown* punkOuter,void** ppobj)
+{
+ return QUARTZ_CreateTransformBase(
+ punkOuter,ppobj,
+ &CLSID_quartzQuickTimeDecompressor,
+ QTDec_FilterName,
+ NULL, NULL,
+ &transhandlers );
+}
+
diff --git a/dlls/quartz/qtparse.c b/dlls/quartz/qtparse.c
new file mode 100644
index 0000000..424bddb
--- /dev/null
+++ b/dlls/quartz/qtparse.c
@@ -0,0 +1,211 @@
+/*
+ * Implements QuickTime Parser(Splitter).
+ *
+ * FIXME - stub
+ * FIXME - no seeking
+ *
+ * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
+ *
+ * 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 "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "mmsystem.h"
+#include "vfw.h"
+#include "winerror.h"
+#include "strmif.h"
+#include "control.h"
+#include "vfwmsgs.h"
+#include "amvideo.h"
+#include "uuids.h"
+
+
+#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(quartz);
+
+#include "quartz_private.h"
+#include "parser.h"
+#include "mtype.h"
+
+
+
+static const WCHAR QUARTZ_QTParser_Name[] =
+{ 'Q','u','i','c','k','T','i','m','e',' ','M','o','v','i','e',' ','P','a','r','s','e','r',0 };
+static const WCHAR QUARTZ_QTParserInPin_Name[] =
+{ 'I','n',0 };
+static const WCHAR QUARTZ_QTParserOutPin_Basename[] =
+{ 'S','t','r','e','a','m',0 };
+
+#define WINE_QUARTZ_QTPINNAME_MAX 64
+
+/****************************************************************************
+ *
+ * CQTParseImpl
+ */
+
+
+typedef struct CQTParseImpl CQTParseImpl;
+typedef struct CQTParseStream CQTParseStream;
+
+struct CQTParseImpl
+{
+ CQTParseStream* pStreamsBuf;
+ DWORD cIndexEntries;
+ WCHAR wchWork[ WINE_QUARTZ_QTPINNAME_MAX ];
+};
+
+struct CQTParseStream
+{
+ int dummy;
+};
+
+
+static HRESULT CQTParseImpl_InitParser( CParserImpl* pImpl, ULONG* pcStreams )
+{
+ WARN("(%p,%p) stub\n",pImpl,pcStreams);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CQTParseImpl_UninitParser( CParserImpl* pImpl )
+{
+ CQTParseImpl* This = (CQTParseImpl*)pImpl->m_pUserData;
+
+ TRACE("(%p)\n",This);
+
+ if ( This == NULL )
+ return NOERROR;
+
+ /* destruct */
+
+ QUARTZ_FreeMem( This );
+ pImpl->m_pUserData = NULL;
+
+ return NOERROR;
+}
+
+static LPCWSTR CQTParseImpl_GetOutPinName( CParserImpl* pImpl, ULONG nStreamIndex )
+{
+ CQTParseImpl* This = (CQTParseImpl*)pImpl->m_pUserData;
+ int wlen;
+
+ TRACE("(%p,%lu)\n",This,nStreamIndex);
+
+ if ( This == NULL /*|| nStreamIndex >= This->avih.dwStreams*/ )
+ return NULL;
+
+ wlen = lstrlenW(QUARTZ_QTParserOutPin_Basename);
+ memcpy( This->wchWork, QUARTZ_QTParserOutPin_Basename, sizeof(WCHAR)*wlen );
+ This->wchWork[ wlen ] = (nStreamIndex/10) + '0';
+ This->wchWork[ wlen+1 ] = (nStreamIndex%10) + '0';
+ This->wchWork[ wlen+2 ] = 0;
+
+ return This->wchWork;
+}
+
+static HRESULT CQTParseImpl_GetStreamType( CParserImpl* pImpl, ULONG nStreamIndex, AM_MEDIA_TYPE* pmt )
+{
+ CQTParseImpl* This = (CQTParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p) stub\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CQTParseImpl_CheckStreamType( CParserImpl* pImpl, ULONG nStreamIndex, const AM_MEDIA_TYPE* pmt )
+{
+ CQTParseImpl* This = (CQTParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p) stub\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CQTParseImpl_GetAllocProp( CParserImpl* pImpl, ALLOCATOR_PROPERTIES* pReqProp )
+{
+ CQTParseImpl* This = (CQTParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p,%p) stub\n",This,pReqProp);
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CQTParseImpl_GetNextRequest( CParserImpl* pImpl, ULONG* pnStreamIndex, LONGLONG* pllStart, LONG* plLength, REFERENCE_TIME* prtStart, REFERENCE_TIME* prtStop, DWORD* pdwSampleFlags )
+{
+ CQTParseImpl* This = (CQTParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p) stub\n",This);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT CQTParseImpl_ProcessSample( CParserImpl* pImpl, ULONG nStreamIndex, LONGLONG llStart, LONG lLength, IMediaSample* pSample )
+{
+ CQTParseImpl* This = (CQTParseImpl*)pImpl->m_pUserData;
+
+ FIXME("(%p,%lu,%ld,%ld,%p)\n",This,nStreamIndex,(long)llStart,lLength,pSample);
+
+ if ( This == NULL )
+ return E_UNEXPECTED;
+
+ return E_NOTIMPL;
+}
+
+static const struct ParserHandlers CQTParseImpl_Handlers =
+{
+ CQTParseImpl_InitParser,
+ CQTParseImpl_UninitParser,
+ CQTParseImpl_GetOutPinName,
+ CQTParseImpl_GetStreamType,
+ CQTParseImpl_CheckStreamType,
+ CQTParseImpl_GetAllocProp,
+ CQTParseImpl_GetNextRequest,
+ CQTParseImpl_ProcessSample,
+
+ /* for IQualityControl */
+ NULL, /* pQualityNotify */
+
+ /* for seeking */
+ NULL, /* pGetSeekingCaps */
+ NULL, /* pIsTimeFormatSupported */
+ NULL, /* pGetCurPos */
+ NULL, /* pSetCurPos */
+ NULL, /* pGetDuration */
+ NULL, /* pGetStopPos */
+ NULL, /* pSetStopPos */
+ NULL, /* pGetPreroll */
+};
+
+HRESULT QUARTZ_CreateQuickTimeMovieParser(IUnknown* punkOuter,void** ppobj)
+{
+ return QUARTZ_CreateParser(
+ punkOuter,ppobj,
+ &CLSID_quartzQuickTimeMovieParser,
+ QUARTZ_QTParser_Name,
+ QUARTZ_QTParserInPin_Name,
+ &CQTParseImpl_Handlers );
+}
+
+
diff --git a/dlls/quartz/seekpass.c b/dlls/quartz/seekpass.c
index 2dd58d3..ce30b26 100644
--- a/dlls/quartz/seekpass.c
+++ b/dlls/quartz/seekpass.c
@@ -79,10 +79,14 @@
{
CSeekingPassThru_THIS(iface,seekpass);
- FIXME("(%p)->(%d,%p) not tested!\n",This,bRendering,pPin);
+ TRACE("(%p)->(%d,%p)\n",This,bRendering,pPin);
if ( pPin == NULL )
return E_POINTER;
+ if ( bRendering )
+ {
+ WARN("bRendering != FALSE\n");
+ }
/* Why is 'bRendering' given as an argument?? */
EnterCriticalSection( &This->cs );
diff --git a/dlls/quartz/vidren.c b/dlls/quartz/vidren.c
index 0e818f7..9826884 100644
--- a/dlls/quartz/vidren.c
+++ b/dlls/quartz/vidren.c
@@ -321,7 +321,7 @@
{
CVideoRendererImpl_THIS(pImpl,basefilter);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
This->m_bSampleIsValid = FALSE;
@@ -332,7 +332,7 @@
{
CVideoRendererImpl_THIS(pImpl,basefilter);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
EnterCriticalSection( &This->m_csReceive );
This->m_bSampleIsValid = FALSE;
@@ -534,7 +534,7 @@
{
CVideoRendererPinImpl_THIS(pImpl,pin);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
This->pRender->m_fInFlush = TRUE;
EnterCriticalSection( &This->pRender->m_csReceive );
@@ -548,7 +548,7 @@
{
CVideoRendererPinImpl_THIS(pImpl,pin);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
This->pRender->m_fInFlush = FALSE;
diff --git a/dlls/quartz/xform.c b/dlls/quartz/xform.c
index 9a91423..f4272c5 100644
--- a/dlls/quartz/xform.c
+++ b/dlls/quartz/xform.c
@@ -448,7 +448,7 @@
{
CTransformBaseOutPinImpl_THIS(pImpl,pin);
- FIXME( "(%p)\n", This );
+ TRACE( "(%p)\n", This );
if ( This->pFilter->m_pOutPinAllocator != NULL )
{
diff --git a/dlls/quartz/xform.h b/dlls/quartz/xform.h
index 02b970d..2bbc337 100644
--- a/dlls/quartz/xform.h
+++ b/dlls/quartz/xform.h
@@ -31,6 +31,14 @@
typedef struct CTransformBaseOutPinImpl CTransformBaseOutPinImpl;
typedef struct TransformBaseHandlers TransformBaseHandlers;
+/* {301056D0-6DFF-11D2-9EEB-006008039E37} */
+DEFINE_GUID(CLSID_quartzMJPGDecompressor,
+0x301056D0,0x6DFF,0x11D2,0x9E,0xEB,0x00,0x60,0x08,0x03,0x9E,0x37);
+/* {FDFE9681-74A3-11D0-AFA7-00AA00B67A42} */
+DEFINE_GUID(CLSID_quartzQuickTimeDecompressor,
+0xFDFE9681,0x74A3,0x11D0,0xAF,0xA7,0x00,0xAA,0x00,0xB6,0x7A,0x42);
+
+
struct CTransformBaseImpl
{
QUARTZ_IUnkImpl unk;
@@ -124,5 +132,8 @@
HRESULT QUARTZ_CreateACMWrapper(IUnknown* punkOuter,void** ppobj);
HRESULT QUARTZ_CreateCMpegAudioCodec(IUnknown* punkOuter,void** ppobj);
HRESULT QUARTZ_CreateCMpegVideoCodec(IUnknown* punkOuter,void** ppobj);
+HRESULT QUARTZ_CreateMJPGDecompressor(IUnknown* punkOuter,void** ppobj);
+HRESULT QUARTZ_CreateQuickTimeDecompressor(IUnknown* punkOuter,void** ppobj);
+
#endif /* WINE_DSHOW_XFORM_H */
diff --git a/winedefault.reg b/winedefault.reg
index 4a3cf4e..7b1cfb9 100644
--- a/winedefault.reg
+++ b/winedefault.reg
@@ -307,6 +307,11 @@
@="quartz.dll"
"ThreadingModel"="Both"
+# CLSID_FilterGraphNoThread
+[HKEY_CLASSES_ROOT\CLSID\{E436EBB8-524F-11CE-9F53-0020AF0BA770}\InprocServer32]
+@="quartz.dll"
+"ThreadingModel"="Both"
+
# CLSID_SystemClock
[HKEY_CLASSES_ROOT\CLSID\{E436EBB1-524F-11CE-9F53-0020AF0BA770}\InprocServer32]
@="quartz.dll"
@@ -337,6 +342,13 @@
@="quartz.dll"
"ThreadingModel"="Both"
+# CLSID_CaptureGraphBuilder
+[HKEY_CLASSES_ROOT\CLSID\{BF87B6E0-8C27-11D0-B3F0-00AA003761C5}\InprocServer32]
+@="quartz.dll"
+"ThreadingModel"="Both"
+
+
+
# DirectShow filter categories
[HKEY_CLASSES_ROOT\CLSID\{DA4E3DA0-D07D-11D0-BD50-00A0C911CE86}]
@@ -418,6 +430,24 @@
30,74,79,33,00,00,00,00,38,00,00,00,38,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+# CLSID_FileWriter
+
+[HKEY_CLASSES_ROOT\CLSID\{8596e5f0-0da5-11d0-bd21-00a0c911ce86}]
+@="File Writer"
+[HKEY_CLASSES_ROOT\CLSID\{8596e5f0-0da5-11d0-bd21-00a0c911ce86}\InprocServer32]
+@="quartz.dll"
+"ThreadingModel"="Both"
+
+[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{8596e5f0-0da5-11d0-bd21-00a0c911ce86}]
+"CLSID"="{8596e5f0-0da5-11d0-bd21-00a0c911ce86}"
+"FriendlyName"="File Writer"
+# FilterData of generic renderer.
+"FilterData"=hex:02,00,00,00,00,00,20,00,01,00,00,00,00,00,00,00,\
+ 30,70,69,33,02,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,38,00,00,00,38,00,00,00,\
+ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+
# Wave Parser
[HKEY_CLASSES_ROOT\CLSID\{D51BD5A1-7548-11CF-A520-0080C77EF58A}]
@@ -517,7 +547,7 @@
30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
-# CLSID_QuickTimeParser (not implemented yet)
+# QuickTime Parser
[HKEY_CLASSES_ROOT\CLSID\{D51BD5A0-7548-11CF-A520-0080C77EF58A}]
@="QuickTime Movie Parser"
@@ -538,6 +568,30 @@
30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+# MIDI Parser
+
+[HKEY_CLASSES_ROOT\CLSID\{D51BD5A2-7548-11CF-A520-0080C77EF58A}]
+@="MIDI Parser"
+[HKEY_CLASSES_ROOT\CLSID\{D51BD5A2-7548-11CF-A520-0080C77EF58A}\InprocServer32]
+@="quartz.dll"
+"ThreadingModel"="Both"
+
+[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{D51BD5A2-7548-11CF-A520-0080C77EF58A}]
+"CLSID"="{D51BD5A2-7548-11CF-A520-0080C77EF58A}"
+"FriendlyName"="MIDI Parser"
+# FilterData of generic transform filter.
+"FilterData"=hex:02,00,00,00,00,00,60,00,02,00,00,00,00,00,00,00,\
+ 30,70,69,33,00,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 31,70,69,33,08,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+
+
+
+
# CLSID_Colour(Color space converter)
[HKEY_CLASSES_ROOT\CLSID\{1643E180-90F5-11CE-97D5-00AA0055595A}]
@@ -599,6 +653,88 @@
30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+# CLSID_CMpegVideoCodec
+[HKEY_CLASSES_ROOT\CLSID\{feb50740-7bef-11ce-9bd9-0000e202599c}]
+@="MPEG Video Decoder"
+[HKEY_CLASSES_ROOT\CLSID\{feb50740-7bef-11ce-9bd9-0000e202599c}\InprocServer32]
+@="quartz.dll"
+"ThreadingModel"="Both"
+
+[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{feb50740-7bef-11ce-9bd9-0000e202599c}]
+"CLSID"="{feb50740-7bef-11ce-9bd9-0000e202599c}"
+"FriendlyName"="MPEG Video Decoder"
+# FilterData of generic transform filter.
+"FilterData"=hex:02,00,00,00,00,00,60,00,02,00,00,00,00,00,00,00,\
+ 30,70,69,33,00,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 31,70,69,33,08,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+
+# CLSID_CMpegAudioCodec
+[HKEY_CLASSES_ROOT\CLSID\{4a2286e0-7bef-11ce-9bd9-0000e202599c}]
+@="MPEG Audio Decoder"
+[HKEY_CLASSES_ROOT\CLSID\{4a2286e0-7bef-11ce-9bd9-0000e202599c}\InprocServer32]
+@="quartz.dll"
+"ThreadingModel"="Both"
+
+[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{4a2286e0-7bef-11ce-9bd9-0000e202599c}]
+"CLSID"="{4a2286e0-7bef-11ce-9bd9-0000e202599c}"
+"FriendlyName"="MPEG Audio Decoder"
+# FilterData of generic transform filter.
+"FilterData"=hex:02,00,00,00,00,00,60,00,02,00,00,00,00,00,00,00,\
+ 30,70,69,33,00,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 31,70,69,33,08,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+
+# MJPG Decompressor
+[HKEY_CLASSES_ROOT\CLSID\{301056D0-6DFF-11D2-9EEB-006008039E37}]
+@="MJPG Decompressor"
+[HKEY_CLASSES_ROOT\CLSID\{301056D0-6DFF-11D2-9EEB-006008039E37}\InprocServer32]
+@="quartz.dll"
+"ThreadingModel"="Both"
+
+[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{301056D0-6DFF-11D2-9EEB-006008039E37}]
+"CLSID"="{301056D0-6DFF-11D2-9EEB-006008039E37}"
+"FriendlyName"="MJPG Decompressor"
+# FilterData of generic transform filter.
+"FilterData"=hex:02,00,00,00,00,00,60,00,02,00,00,00,00,00,00,00,\
+ 30,70,69,33,00,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 31,70,69,33,08,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+
+# QuickTime Decompressor
+[HKEY_CLASSES_ROOT\CLSID\{FDFE9681-74A3-11D0-AFA7-00AA00B67A42}]
+@="QuickTime Decompressor"
+[HKEY_CLASSES_ROOT\CLSID\{FDFE9681-74A3-11D0-AFA7-00AA00B67A42}\InprocServer32]
+@="quartz.dll"
+"ThreadingModel"="Both"
+
+[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{FDFE9681-74A3-11D0-AFA7-00AA00B67A42}]
+"CLSID"="{FDFE9681-74A3-11D0-AFA7-00AA00B67A42}"
+"FriendlyName"="QuickTime Decompressor"
+# FilterData of generic transform filter.
+"FilterData"=hex:02,00,00,00,00,00,60,00,02,00,00,00,00,00,00,00,\
+ 30,70,69,33,00,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 31,70,69,33,08,00,00,00,00,00,00,00,\
+ 01,00,00,00,00,00,00,00,00,00,00,00,\
+ 30,74,79,33,00,00,00,00,60,00,00,00,60,00,00,00,\
+ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
+
+
+
#