parent
4b807a1fc2
commit
912f899c96
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 },
|
||||
};
|
||||
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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) )
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
138
winedefault.reg
138
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue