diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in index e4fd59b7e43..b4cf71c9744 100644 --- a/dlls/quartz/Makefile.in +++ b/dlls/quartz/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = quartz.dll -EXTRALIBS = $(LIBUUID) +EXTRALIBS = $(LIBUUID) @JPEGLIB@ LDDLLFLAGS = @LDDLLFLAGS@ SYMBOLFILE = $(MODULE).tmp.o @@ -36,11 +36,15 @@ C_SRCS = \ 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 44de309e38f..a7eccf030a3 100644 --- a/dlls/quartz/README +++ b/dlls/quartz/README @@ -8,7 +8,6 @@ TODO - 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 d3ef8238e3d..dbc4cb4291c 100644 --- a/dlls/quartz/acmwrap.c +++ b/dlls/quartz/acmwrap.c @@ -266,7 +266,7 @@ static HRESULT ACMWrapper_CheckMediaType( CTransformBaseImpl* pImpl, const AM_ME 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 bb3246b8f1d..6fd644d533f 100644 --- a/dlls/quartz/asyncsrc.c +++ b/dlls/quartz/asyncsrc.c @@ -435,7 +435,7 @@ CAsyncReaderImpl_fnWaitForNext(IAsyncReader* iface,DWORD dwTimeout,IMediaSample* 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 @@ CAsyncReaderImpl_fnSyncReadAligned(IAsyncReader* iface,IMediaSample* pSample) 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 8213bb66154..9a80d633726 100644 --- a/dlls/quartz/audren.c +++ b/dlls/quartz/audren.c @@ -396,7 +396,7 @@ static HRESULT CAudioRendererImpl_OnActive( CBaseFilterImpl* pImpl ) 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 @@ static HRESULT CAudioRendererImpl_OnInactive( CBaseFilterImpl* pImpl ) WAVEFORMATEX* pwfx; HRESULT hr; - FIXME( "(%p)\n", This ); + TRACE( "(%p)\n", This ); if ( This->pPin->pin.pmtConn == NULL ) return NOERROR; @@ -442,7 +442,7 @@ static HRESULT CAudioRendererImpl_OnStop( CBaseFilterImpl* pImpl ) { CAudioRendererImpl_THIS(pImpl,basefilter); - FIXME( "(%p)\n", This ); + TRACE( "(%p)\n", This ); This->m_fInFlush = TRUE; @@ -602,7 +602,7 @@ static HRESULT CAudioRendererPinImpl_BeginFlush( CPinBaseImpl* pImpl ) { 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 @@ static HRESULT CAudioRendererPinImpl_EndFlush( CPinBaseImpl* pImpl ) { CAudioRendererPinImpl_THIS(pImpl,pin); - FIXME( "(%p)\n", This ); + TRACE( "(%p)\n", This ); This->pRender->m_fInFlush = FALSE; @@ -946,7 +946,7 @@ IBasicAudio_fnput_Volume(IBasicAudio* iface,long lVol) 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 @@ IBasicAudio_fnget_Volume(IBasicAudio* iface,long* plVol) { 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 @@ IBasicAudio_fnput_Balance(IBasicAudio* iface,long lBalance) 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 @@ IBasicAudio_fnget_Balance(IBasicAudio* iface,long* plBalance) { 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 4bb95ff7bbf..4a113acf817 100644 --- a/dlls/quartz/fmap.c +++ b/dlls/quartz/fmap.c @@ -882,7 +882,13 @@ IFilterMapper2_fnEnumMatchingFilters(IFilterMapper2* iface, 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 9122368d1d0..e713c215fa1 100644 --- a/dlls/quartz/ifgraph.c +++ b/dlls/quartz/ifgraph.c @@ -612,7 +612,7 @@ IFilterGraph2_fnRemoveFilter(IFilterGraph2* iface,IBaseFilter* pFilter) 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 @@ IFilterGraph2_fnConnect(IFilterGraph2* iface,IPin* pOut,IPin* pIn) 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 @@ IFilterGraph2_fnAddSourceFilter(IFilterGraph2* iface,LPCWSTR lpFileName,LPCWSTR 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 @@ IFilterGraph2_fnRenderEx(IFilterGraph2* iface,IPin* pOut,DWORD dwFlags,DWORD* pd 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 9b07e7a5df2..3e593d37788 100644 --- a/dlls/quartz/iunk.c +++ b/dlls/quartz/iunk.c @@ -79,7 +79,7 @@ IUnknown_fnQueryInterface(IUnknown* iface,REFIID riid,LPVOID *ppobj) 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 0a85ef26405..04a494fb198 100644 --- a/dlls/quartz/main.c +++ b/dlls/quartz/main.c @@ -112,6 +112,10 @@ static const QUARTZ_CLASSENTRY QUARTZ_ClassList[] = { &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 e1cc88d1489..ea5cf1f5471 100644 --- a/dlls/quartz/memalloc.c +++ b/dlls/quartz/memalloc.c @@ -217,8 +217,8 @@ IMemAllocator_fnSetProperties(IMemAllocator* iface,ALLOCATOR_PROPERTIES* pPropRe 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 00000000000..37f77156cb2 --- /dev/null +++ b/dlls/quartz/midparse.c @@ -0,0 +1,191 @@ +/* + * Implements MIDI Parser. + * + * FIXME - stub + * FIXME - no seeking + * + * Copyright (C) Hidenori TAKESHIMA + * + * 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 00000000000..71e4093d19b --- /dev/null +++ b/dlls/quartz/mjpgdec.c @@ -0,0 +1,235 @@ +/* + * Implements AVI MJPG Decompressor. + * + * FIXME - stub + * + * Copyright (C) Hidenori TAKESHIMA + * + * 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 a2a1604354a..25a6e935d9c 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 @@ static const WCHAR CMPEGAudioDecoderImpl_FilterName[] = 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 @@ static HRESULT CMPEGAudioDecoderImpl_Init( CTransformBaseImpl* pImpl ) 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 @@ static HRESULT CMPEGAudioDecoderImpl_Cleanup( CTransformBaseImpl* pImpl ) return S_OK; /* destruct */ + Codec_OnCleanup(This); + CMPEGAudioDecoderImpl_CleanupOutTypes(This); QUARTZ_FreeMem( This ); pImpl->m_pUserData = NULL; @@ -97,70 +161,189 @@ static HRESULT CMPEGAudioDecoderImpl_Cleanup( CTransformBaseImpl* pImpl ) 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 @@ HRESULT QUARTZ_CreateCMpegAudioCodec(IUnknown* punkOuter,void** ppobj) &transhandlers ); } - diff --git a/dlls/quartz/mpgparse.c b/dlls/quartz/mpgparse.c index ed5b30a36ef..98f1e4e9639 100644 --- a/dlls/quartz/mpgparse.c +++ b/dlls/quartz/mpgparse.c @@ -100,6 +100,7 @@ struct CMPGParsePayload 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 @@ static HRESULT CMPGParseImpl_InitParser( CParserImpl* pImpl, ULONG* pcStreams ) { CMPGParseImpl* This = NULL; HRESULT hr; + DWORD n; + AM_MEDIA_TYPE mt; BYTE hdrbuf[8]; TRACE("(%p,%p)\n",pImpl,pcStreams); @@ -190,6 +193,14 @@ static HRESULT CMPGParseImpl_InitParser( CParserImpl* pImpl, ULONG* pcStreams ) 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 @@ static HRESULT CMPGParseImpl_GetStreamType( CParserImpl* pImpl, ULONG nStreamInd 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 @@ static HRESULT CMPGParseImpl_GetAllocProp( CParserImpl* pImpl, ALLOCATOR_PROPERT 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 5784096daf2..f005a343e85 100644 --- a/dlls/quartz/mpvdec.c +++ b/dlls/quartz/mpvdec.c @@ -48,16 +48,70 @@ static const WCHAR CMPEGVideoDecoderImpl_FilterName[] = 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 @@ static HRESULT CMPEGVideoDecoderImpl_Init( CTransformBaseImpl* pImpl ) pImpl->m_pUserData = This; /* construct */ + This->pmt = NULL; + This->cmt = 0; + Codec_OnConstruct(This); return S_OK; } @@ -88,6 +145,8 @@ static HRESULT CMPEGVideoDecoderImpl_Cleanup( CTransformBaseImpl* pImpl ) return S_OK; /* destruct */ + Codec_OnCleanup(This); + CMPEGVideoDecoderImpl_CleanupOutTypes(This); QUARTZ_FreeMem( This ); pImpl->m_pUserData = NULL; @@ -99,44 +158,68 @@ static HRESULT CMPEGVideoDecoderImpl_CheckMediaType( CTransformBaseImpl* pImpl, { 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 @@ static HRESULT CMPEGVideoDecoderImpl_ProcessReceive( CTransformBaseImpl* pImpl, 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 80a9d63424b..de3052ce24e 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -749,7 +749,7 @@ static HRESULT CParserImpl_OnStop( CBaseFilterImpl* pImpl ) { 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 6f1619f9648..4ce9aaf4fd4 100644 --- a/dlls/quartz/parser.h +++ b/dlls/quartz/parser.h @@ -29,9 +29,20 @@ typedef struct CParserInPinImpl CParserInPinImpl; 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_CreateParserOutPin( 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 00000000000..33d7897cabe --- /dev/null +++ b/dlls/quartz/qtdec.c @@ -0,0 +1,234 @@ +/* + * Implements QuickTime Video Decompressor. + * + * FIXME - stub + * + * Copyright (C) Hidenori TAKESHIMA + * + * 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 00000000000..424bddb4540 --- /dev/null +++ b/dlls/quartz/qtparse.c @@ -0,0 +1,211 @@ +/* + * Implements QuickTime Parser(Splitter). + * + * FIXME - stub + * FIXME - no seeking + * + * Copyright (C) Hidenori TAKESHIMA + * + * 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 2dd58d3a05c..ce30b267e68 100644 --- a/dlls/quartz/seekpass.c +++ b/dlls/quartz/seekpass.c @@ -79,10 +79,14 @@ ISeekingPassThru_fnInit(ISeekingPassThru* iface,BOOL bRendering,IPin* pPin) { 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 0e818f7f257..98268848dae 100644 --- a/dlls/quartz/vidren.c +++ b/dlls/quartz/vidren.c @@ -321,7 +321,7 @@ static HRESULT CVideoRendererImpl_OnActive( CBaseFilterImpl* pImpl ) { CVideoRendererImpl_THIS(pImpl,basefilter); - FIXME( "(%p)\n", This ); + TRACE( "(%p)\n", This ); This->m_bSampleIsValid = FALSE; @@ -332,7 +332,7 @@ static HRESULT CVideoRendererImpl_OnInactive( CBaseFilterImpl* pImpl ) { CVideoRendererImpl_THIS(pImpl,basefilter); - FIXME( "(%p)\n", This ); + TRACE( "(%p)\n", This ); EnterCriticalSection( &This->m_csReceive ); This->m_bSampleIsValid = FALSE; @@ -534,7 +534,7 @@ static HRESULT CVideoRendererPinImpl_BeginFlush( CPinBaseImpl* pImpl ) { 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 @@ static HRESULT CVideoRendererPinImpl_EndFlush( CPinBaseImpl* pImpl ) { 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 9a914233efa..f4272c5fcaa 100644 --- a/dlls/quartz/xform.c +++ b/dlls/quartz/xform.c @@ -448,7 +448,7 @@ static HRESULT CTransformBaseOutPinImpl_OnDisconnect( CPinBaseImpl* pImpl ) { 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 02b970dba4a..2bbc3373a0c 100644 --- a/dlls/quartz/xform.h +++ b/dlls/quartz/xform.h @@ -31,6 +31,14 @@ typedef struct CTransformBaseInPinImpl CTransformBaseInPinImpl; 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_CreateColour(IUnknown* punkOuter,void** ppobj); 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 4a3cf4e3e8d..7b1cfb92195 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 + + + #