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
+
+
+
 
 
 #