Fixed some bugs.

Implemented IPropertyBag.
Implemented some FilterMapper2 methods.
Implemented AddSourceFilter.
Implemented Render partially.
Implemented Connect partially.
This commit is contained in:
Hidenori Takeshima 2001-10-28 21:16:00 +00:00 committed by Alexandre Julliard
parent dbb618a8ca
commit d359812d6b
22 changed files with 3234 additions and 1237 deletions

View File

@ -20,7 +20,6 @@ C_SRCS = \
complist.c \
csconv.c \
devenum.c \
devmon.c \
enumunk.c \
fgevent.c \
fgpass.c \

View File

@ -1,15 +1,28 @@
quartz.dll is the basic library of ActiveMovie/DirectShow.
TODO
- merge some C sources.
- implements all filters.
- handles plug-in distributor.
- implements some interfaces as plug-ins(???)
- implements ICM
- implements mciqtz(mci driver for quartz)
- avoid deadlock
- merge some C sources
- implement filters
- restruct color-space converter
- add FilterData to winedefault.reg for Connect() and Render()
- sort active filters in filter graph
- sort regfilters in Merit order
- fix deadlocks in Receive/EndOfStream
- handle plug-in distributor
- handle seeking
- implement some interfaces as plug-ins(???)
- implement ICM drivers (yuv converter)
- implement ACM drivers (g711)
- implement ACM wrapper (improve xform)
- implement mciqtz(mci driver for quartz)
- implement renderer
- handle notification correctly
known BUGS
- all FIXMEs.
- some filters crash at CoCreateInstance. (ole???)
- some filters crash at CoCreateInstance. (???)

View File

@ -1217,7 +1217,8 @@ static HRESULT AsyncSourceFileImpl_Read( CAsyncSourceImpl* pImpl, LONGLONG llOfs
while ( lLength > 0 )
{
if ( WaitForSingleObject( hEventCancel, 0 ) == WAIT_OBJECT_0 )
if ( hEventCancel != (HANDLE)NULL &&
WaitForSingleObject( hEventCancel, 0 ) == WAIT_OBJECT_0 )
{
hr = S_FALSE;
break;

View File

@ -1,8 +1,6 @@
/*
* Implements AVI Decompressor(CLSID_AVIDec).
*
* FIXME - insufficient buffer for ICDecompress!!!!
*
* hidenori@a2.ctktv.ne.jp
*/
@ -219,7 +217,7 @@ static HRESULT AVIDec_GetOutputTypes( CTransformBaseImpl* pImpl, const AM_MEDIA_
memcpy( &This->m_mtOut.majortype, &MEDIATYPE_Video, sizeof(GUID) );
memcpy( &This->m_mtOut.formattype, &FORMAT_VideoInfo, sizeof(GUID) );
This->m_mtOut.cbFormat = sizeof(VIDEOINFOHEADER) + cbFmt;
This->m_mtOut.cbFormat = sizeof(VIDEOINFOHEADER) + cbFmt + sizeof(RGBQUAD)*256;
This->m_mtOut.pbFormat = (BYTE*)CoTaskMemAlloc(This->m_mtOut.cbFormat);
if ( This->m_mtOut.pbFormat == NULL )
return E_OUTOFMEMORY;
@ -240,6 +238,31 @@ static HRESULT AVIDec_GetOutputTypes( CTransformBaseImpl* pImpl, const AM_MEDIA_
This->m_mtOut.bFixedSizeSamples = (pbiOut->bmiHeader.biCompression == 0) ? 1 : 0;
This->m_mtOut.lSampleSize = (pbiOut->bmiHeader.biCompression == 0) ? DIBSIZE(pbiOut->bmiHeader) : pbiOut->bmiHeader.biSizeImage;
/* get palette */
if ( pbiOut->bmiHeader.biBitCount <= 8 )
{
TRACE("(%p) - get palette\n",This);
if ( ICDecompressGetPalette( This->hicCached, pbiIn, pbiOut ) != ICERR_OK )
{
TRACE("(%p) - use the input palette\n",This);
if ( pbiIn->bmiHeader.biBitCount != pbiOut->bmiHeader.biBitCount )
{
FIXME( "no palette...fixme?\n" );
return E_FAIL;
}
if ( pbiOut->bmiHeader.biClrUsed == 0 )
pbiOut->bmiHeader.biClrUsed = 1<<pbiOut->bmiHeader.biBitCount;
if ( pbiOut->bmiHeader.biClrUsed > (1<<pbiOut->bmiHeader.biBitCount) )
{
ERR( "biClrUsed=%ld\n", pbiOut->bmiHeader.biClrUsed );
return E_FAIL;
}
memcpy( pbiOut->bmiColors, pbiIn->bmiColors,
sizeof(RGBQUAD) * pbiOut->bmiHeader.biClrUsed );
}
}
TRACE("(%p) - return format\n",This);
*ppmtAcceptTypes = &This->m_mtOut;
*pcAcceptTypes = 1;
@ -301,7 +324,7 @@ static HRESULT AVIDec_BeginTransform( CTransformBaseImpl* pImpl, const AM_MEDIA_
This->m_pbiOut = AVIDec_DuplicateBitmapInfo(pbiOut);
if ( This->m_pbiIn == NULL || This->m_pbiOut == NULL )
return E_OUTOFMEMORY;
if ( This->m_pbiOut->bmiHeader.biCompression == 0 )
if ( This->m_pbiOut->bmiHeader.biCompression == 0 || This->m_pbiOut->bmiHeader.biCompression == 3 )
This->m_pbiOut->bmiHeader.biSizeImage = DIBSIZE(This->m_pbiOut->bmiHeader);
if ( !bReuseSample )

View File

@ -353,7 +353,7 @@ CPinBaseImpl_fnConnectionMediaType(IPin* iface,AM_MEDIA_TYPE* pmt)
ZeroMemory( pmt, sizeof(AM_MEDIA_TYPE) );
pmt->bFixedSizeSamples = TRUE;
pmt->lSampleSize = 1;
hr = NOERROR;
hr = VFW_E_NOT_CONNECTED;
}
LeaveCriticalSection( This->pcsPin );

File diff suppressed because it is too large Load Diff

View File

@ -2,12 +2,12 @@
#define WINE_DSHOW_DEVENUM_H
/*
implements CLSID_SystemDeviceEnum.
- At least, the following interfaces should be implemented:
IUnknown
+ ICreateDevEnum
* implements CLSID_SystemDeviceEnum.
*
* - At least, the following interfaces should be implemented:
*
* IUnknown
* + ICreateDevEnum
*/
#include "iunk.h"
@ -27,10 +27,100 @@ typedef struct CSysDevEnum
HRESULT QUARTZ_CreateSystemDeviceEnum(IUnknown* punkOuter,void** ppobj);
HRESULT CSysDevEnum_InitICreateDevEnum( CSysDevEnum* psde );
void CSysDevEnum_UninitICreateDevEnum( CSysDevEnum* psde );
#endif /* WINE_DSHOW_DEVENUM_H */
/*
* implements CLSID_CDeviceMoniker.
*
* - At least, the following interfaces should be implemented:
*
* IUnknown
* + IPersist - IPersistStream - IMoniker
*/
typedef struct DMON_IMonikerImpl
{
ICOM_VFIELD(IMoniker);
} DMON_IMonikerImpl;
typedef struct CDeviceMoniker
{
QUARTZ_IUnkImpl unk;
DMON_IMonikerImpl moniker;
/* IMoniker fields */
HKEY m_hkRoot;
WCHAR* m_pwszPath;
} CDeviceMoniker;
#define CDeviceMoniker_THIS(iface,member) CDeviceMoniker* This = (CDeviceMoniker*)(((char*)iface)-offsetof(CDeviceMoniker,member))
HRESULT QUARTZ_CreateDeviceMoniker(
HKEY hkRoot, LPCWSTR lpKeyPath,
IMoniker** ppMoniker );
/*
* implements IPropertyBag for accessing registry.
*
* - At least, the following interfaces should be implemented:
*
* IUnknown
* + IPropertyBag
*/
typedef struct DMON_IPropertyBagImpl
{
ICOM_VFIELD(IPropertyBag);
} DMON_IPropertyBagImpl;
typedef struct CRegPropertyBag
{
QUARTZ_IUnkImpl unk;
DMON_IPropertyBagImpl propbag;
/* IPropertyBag fields */
HKEY m_hKey;
} CRegPropertyBag;
#define CRegPropertyBag_THIS(iface,member) CRegPropertyBag* This = (CRegPropertyBag*)(((char*)iface)-offsetof(CRegPropertyBag,member))
HRESULT QUARTZ_CreateRegPropertyBag(
HKEY hkRoot, LPCWSTR lpKeyPath,
IPropertyBag** ppPropBag );
/***************************************************************************
*
* related functions (internal).
*
*/
HRESULT QUARTZ_GetFilterRegPath(
WCHAR** ppwszPath, /* [OUT] path from HKEY_CLASSES_ROOT */
const CLSID* pguidFilterCategory, /* [IN] Category */
const CLSID* pclsid, /* [IN] CLSID of this filter */
LPCWSTR lpInstance ); /* [IN] instance */
HRESULT QUARTZ_RegisterFilterToMoniker(
IMoniker* pMoniker, /* [IN] Moniker */
const CLSID* pclsid, /* [IN] CLSID of this filter */
LPCWSTR lpFriendlyName, /* [IN] friendly name */
const BYTE* pbFilterData, /* [IN] filter data */
DWORD cbFilterData ); /* [IN] size of the filter data */
HRESULT QUARTZ_RegDeleteKey( HKEY hkRoot, LPCWSTR lpKeyPath );
HRESULT QUARTZ_GetCLSIDFromMoniker(
IMoniker* pMoniker, /* [IN] Moniker */
CLSID* pclsid ); /* [OUT] */
HRESULT QUARTZ_GetMeritFromMoniker(
IMoniker* pMoniker, /* [IN] Moniker */
DWORD* pdwMerit ); /* [OUT] */
HRESULT QUARTZ_GetFilterDataFromMoniker(
IMoniker* pMoniker, /* [IN] Moniker */
BYTE** ppbFilterData, /* [OUT] */
DWORD* pcbFilterData ); /* [OUT] */
#endif /* WINE_DSHOW_DEVENUM_H */

View File

@ -1,636 +0,0 @@
/*
* Implements IMoniker for CLSID_CDeviceMoniker.
* Implements IPropertyBag. (internal)
*
* hidenori@a2.ctktv.ne.jp
*/
#include "config.h"
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "winreg.h"
#include "winerror.h"
#include "objidl.h"
#include "oleidl.h"
#include "ocidl.h"
#include "oleauto.h"
#include "strmif.h"
#include "uuids.h"
#include "debugtools.h"
DEFAULT_DEBUG_CHANNEL(quartz);
#include "quartz_private.h"
#include "devmon.h"
#include "regsvr.h"
/***************************************************************************
*
* CDeviceMoniker::IMoniker
*
*/
static HRESULT WINAPI
IMoniker_fnQueryInterface(IMoniker* iface,REFIID riid,void** ppobj)
{
CDeviceMoniker_THIS(iface,moniker);
TRACE("(%p)->()\n",This);
return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
}
static ULONG WINAPI
IMoniker_fnAddRef(IMoniker* iface)
{
CDeviceMoniker_THIS(iface,moniker);
TRACE("(%p)->()\n",This);
return IUnknown_AddRef(This->unk.punkControl);
}
static ULONG WINAPI
IMoniker_fnRelease(IMoniker* iface)
{
CDeviceMoniker_THIS(iface,moniker);
TRACE("(%p)->()\n",This);
return IUnknown_Release(This->unk.punkControl);
}
static HRESULT WINAPI IMoniker_fnGetClassID(IMoniker* iface, CLSID *pClassID)
{
CDeviceMoniker_THIS(iface,moniker);
TRACE("(%p)->()\n",This);
if ( pClassID == NULL )
return E_POINTER;
memcpy( pClassID, &CLSID_CDeviceMoniker, sizeof(CLSID) );
return NOERROR;
}
static HRESULT WINAPI IMoniker_fnIsDirty(IMoniker* iface)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnLoad(IMoniker* iface, IStream* pStm)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnSave(IMoniker* iface, IStream* pStm, BOOL fClearDirty)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnGetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnBindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
{
CDeviceMoniker_THIS(iface,moniker);
HRESULT hr;
IPropertyBag* pPropBag;
VARIANT vClsid;
CLSID clsid;
TRACE("(%p)->(%p,%p,%s,%p)\n",This,
pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
if ( pbc != NULL )
{
FIXME("IBindCtx* pbc != NULL not implemented.\n");
return E_FAIL;
}
if ( pmkToLeft != NULL )
{
FIXME("IMoniker* pmkToLeft != NULL not implemented.\n");
return E_FAIL;
}
if ( ppvResult == NULL )
return E_POINTER;
hr = QUARTZ_CreateRegPropertyBag(
This->m_hkRoot, This->m_pwszPath, &pPropBag );
if ( FAILED(hr) )
return hr;
vClsid.n1.n2.vt = VT_BSTR;
hr = IPropertyBag_Read(
pPropBag, QUARTZ_wszCLSID, &vClsid, NULL );
IPropertyBag_Release( pPropBag );
if ( FAILED(hr) )
return hr;
hr = CLSIDFromString( vClsid.n1.n2.n3.bstrVal, &clsid );
SysFreeString(vClsid.n1.n2.n3.bstrVal);
if ( FAILED(hr) )
return hr;
hr = CoCreateInstance(
&clsid, NULL, CLSCTX_INPROC_SERVER, riid, ppvResult );
TRACE( "hr = %08lx\n", hr );
return hr;
}
static HRESULT WINAPI IMoniker_fnBindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
{
CDeviceMoniker_THIS(iface,moniker);
HRESULT hr;
TRACE("(%p)->(%p,%p,%s,%p)\n",This,
pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
if ( pbc != NULL )
{
FIXME("IBindCtx* pbc != NULL not implemented.\n");
return E_FAIL;
}
if ( pmkToLeft != NULL )
{
FIXME("IMoniker* pmkToLeft != NULL not implemented.\n");
return E_FAIL;
}
if ( ppvResult == NULL )
return E_POINTER;
hr = E_NOINTERFACE;
if ( IsEqualGUID(riid,&IID_IUnknown) ||
IsEqualGUID(riid,&IID_IPropertyBag) )
{
hr = QUARTZ_CreateRegPropertyBag(
This->m_hkRoot, This->m_pwszPath,
(IPropertyBag**)ppvResult );
}
return hr;
}
static HRESULT WINAPI IMoniker_fnReduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
{
CDeviceMoniker_THIS(iface,moniker);
TRACE("(%p)->()\n",This);
if ( ppmkReduced == NULL )
return E_POINTER;
*ppmkReduced = iface; IMoniker_AddRef(iface);
return MK_S_REDUCED_TO_SELF;
}
static HRESULT WINAPI IMoniker_fnComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnEnum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker)
{
CDeviceMoniker_THIS(iface,moniker);
TRACE("(%p)->()\n",This);
if ( ppenumMoniker == NULL )
return E_POINTER;
*ppenumMoniker = NULL;
return NOERROR;
}
static HRESULT WINAPI IMoniker_fnIsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnHash(IMoniker* iface,DWORD* pdwHash)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnIsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnGetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pCompositeTime)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnInverse(IMoniker* iface,IMoniker** ppmk)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnCommonPrefixWith(IMoniker* iface,IMoniker* pmkOther, IMoniker** ppmkPrefix)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnRelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnGetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut)
{
CDeviceMoniker_THIS(iface,moniker);
FIXME("(%p)->() stub!\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IMoniker_fnIsSystemMoniker(IMoniker* iface,DWORD* pdwMksys)
{
CDeviceMoniker_THIS(iface,moniker);
TRACE("(%p)->()\n",This);
if ( pdwMksys == NULL )
return E_POINTER;
*pdwMksys = MKSYS_NONE;
return S_FALSE;
}
static ICOM_VTABLE(IMoniker) imoniker =
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
/* IUnknown fields */
IMoniker_fnQueryInterface,
IMoniker_fnAddRef,
IMoniker_fnRelease,
/* IPersist fields */
IMoniker_fnGetClassID,
/* IPersistStream fields */
IMoniker_fnIsDirty,
IMoniker_fnLoad,
IMoniker_fnSave,
IMoniker_fnGetSizeMax,
/* IMoniker fields */
IMoniker_fnBindToObject,
IMoniker_fnBindToStorage,
IMoniker_fnReduce,
IMoniker_fnComposeWith,
IMoniker_fnEnum,
IMoniker_fnIsEqual,
IMoniker_fnHash,
IMoniker_fnIsRunning,
IMoniker_fnGetTimeOfLastChange,
IMoniker_fnInverse,
IMoniker_fnCommonPrefixWith,
IMoniker_fnRelativePathTo,
IMoniker_fnGetDisplayName,
IMoniker_fnParseDisplayName,
IMoniker_fnIsSystemMoniker,
};
static HRESULT CDeviceMoniker_InitIMoniker(
CDeviceMoniker* pdm, HKEY hkRoot, LPCWSTR lpKeyPath )
{
DWORD dwLen;
ICOM_VTBL(&pdm->moniker) = &imoniker;
pdm->m_hkRoot = hkRoot;
pdm->m_pwszPath = NULL;
dwLen = sizeof(WCHAR)*(lstrlenW(lpKeyPath)+1);
pdm->m_pwszPath = (WCHAR*)QUARTZ_AllocMem( dwLen );
if ( pdm->m_pwszPath == NULL )
return E_OUTOFMEMORY;
memcpy( pdm->m_pwszPath, lpKeyPath, dwLen );
return NOERROR;
}
static void CDeviceMoniker_UninitIMoniker(
CDeviceMoniker* pdm )
{
if ( pdm->m_pwszPath != NULL )
QUARTZ_FreeMem( pdm->m_pwszPath );
}
/***************************************************************************
*
* new/delete for CDeviceMoniker
*
*/
static void QUARTZ_DestroyDeviceMoniker(IUnknown* punk)
{
CDeviceMoniker_THIS(punk,unk);
CDeviceMoniker_UninitIMoniker( This );
}
/* can I use offsetof safely? - FIXME? */
static QUARTZ_IFEntry CDeviceMoniker_IFEntries[] =
{
{ &IID_IPersist, offsetof(CDeviceMoniker,moniker)-offsetof(CDeviceMoniker,unk) },
{ &IID_IPersistStream, offsetof(CDeviceMoniker,moniker)-offsetof(CDeviceMoniker,unk) },
{ &IID_IMoniker, offsetof(CDeviceMoniker,moniker)-offsetof(CDeviceMoniker,unk) },
};
HRESULT QUARTZ_CreateDeviceMoniker(
HKEY hkRoot, LPCWSTR lpKeyPath,
IMoniker** ppMoniker )
{
CDeviceMoniker* pdm;
HRESULT hr;
TRACE("(%08x,%s,%p)\n",hkRoot,debugstr_w(lpKeyPath),ppMoniker );
pdm = (CDeviceMoniker*)QUARTZ_AllocObj( sizeof(CDeviceMoniker) );
if ( pdm == NULL )
return E_OUTOFMEMORY;
QUARTZ_IUnkInit( &pdm->unk, NULL );
hr = CDeviceMoniker_InitIMoniker( pdm, hkRoot, lpKeyPath );
if ( FAILED(hr) )
{
QUARTZ_FreeObj( pdm );
return hr;
}
pdm->unk.pEntries = CDeviceMoniker_IFEntries;
pdm->unk.dwEntries = sizeof(CDeviceMoniker_IFEntries)/sizeof(CDeviceMoniker_IFEntries[0]);
pdm->unk.pOnFinalRelease = &QUARTZ_DestroyDeviceMoniker;
*ppMoniker = (IMoniker*)(&pdm->moniker);
return S_OK;
}
/***************************************************************************
*
* CRegPropertyBag::IPropertyBag
*
*/
static HRESULT WINAPI
IPropertyBag_fnQueryInterface(IPropertyBag* iface,REFIID riid,void** ppobj)
{
CRegPropertyBag_THIS(iface,propbag);
TRACE("(%p)->()\n",This);
return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
}
static ULONG WINAPI
IPropertyBag_fnAddRef(IPropertyBag* iface)
{
CRegPropertyBag_THIS(iface,propbag);
TRACE("(%p)->()\n",This);
return IUnknown_AddRef(This->unk.punkControl);
}
static ULONG WINAPI
IPropertyBag_fnRelease(IPropertyBag* iface)
{
CRegPropertyBag_THIS(iface,propbag);
TRACE("(%p)->()\n",This);
return IUnknown_Release(This->unk.punkControl);
}
static HRESULT WINAPI
IPropertyBag_fnRead(IPropertyBag* iface,LPCOLESTR lpszPropName,VARIANT* pVar,IErrorLog* pLog)
{
CRegPropertyBag_THIS(iface,propbag);
LONG lr;
DWORD dwSize;
DWORD dwValueType;
TRACE("(%p)->(%s,%p,%p)\n",This,
debugstr_w(lpszPropName),pVar,pLog);
if ( lpszPropName == NULL || pVar == NULL )
return E_POINTER;
dwSize = 0;
lr = RegQueryValueExW(
This->m_hKey, lpszPropName, NULL,
&dwValueType, NULL, &dwSize );
if ( lr != ERROR_SUCCESS )
{
TRACE( "RegQueryValueExW failed.\n" );
return E_INVALIDARG;
}
switch ( dwValueType )
{
case REG_SZ:
TRACE( "REG_SZ / length = %lu\n", dwSize );
if ( pVar->n1.n2.vt == VT_EMPTY )
pVar->n1.n2.vt = VT_BSTR;
if ( pVar->n1.n2.vt != VT_BSTR )
{
TRACE( "type of VARIANT is not BSTR\n" );
return E_FAIL;
}
pVar->n1.n2.n3.bstrVal = SysAllocStringByteLen(
NULL, dwSize );
if ( pVar->n1.n2.n3.bstrVal == NULL )
{
TRACE( "out of memory.\n" );
return E_OUTOFMEMORY;
}
lr = RegQueryValueExW(
This->m_hKey, lpszPropName, NULL,
&dwValueType,
(BYTE*)pVar->n1.n2.n3.bstrVal, &dwSize );
if ( lr != ERROR_SUCCESS )
{
TRACE( "failed to query value\n" );
SysFreeString(pVar->n1.n2.n3.bstrVal);
return E_FAIL;
}
TRACE( "value is BSTR; %s\n", debugstr_w(pVar->n1.n2.n3.bstrVal) );
break;
default:
FIXME("(%p)->(%s,%p,%p) - unsupported value type.\n",This,
debugstr_w(lpszPropName),pVar,pLog);
return E_FAIL;
}
TRACE( "returned successfully.\n" );
return NOERROR;
}
static HRESULT WINAPI
IPropertyBag_fnWrite(IPropertyBag* iface,LPCOLESTR lpszPropName,VARIANT* pVar)
{
CRegPropertyBag_THIS(iface,propbag);
FIXME("(%p)->(%s,%p) stub!\n",This,
debugstr_w(lpszPropName),pVar);
if ( lpszPropName == NULL || pVar == NULL )
return E_POINTER;
return E_NOTIMPL;
}
static ICOM_VTABLE(IPropertyBag) ipropbag =
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
/* IUnknown fields */
IPropertyBag_fnQueryInterface,
IPropertyBag_fnAddRef,
IPropertyBag_fnRelease,
/* IPropertyBag fields */
IPropertyBag_fnRead,
IPropertyBag_fnWrite,
};
static HRESULT CRegPropertyBag_InitIPropertyBag(
CRegPropertyBag* prpb, HKEY hkRoot, LPCWSTR lpKeyPath )
{
ICOM_VTBL(&prpb->propbag) = &ipropbag;
if ( RegOpenKeyExW(
hkRoot, lpKeyPath, 0,
KEY_ALL_ACCESS, &prpb->m_hKey ) != ERROR_SUCCESS )
return E_FAIL;
return NOERROR;
}
static void CRegPropertyBag_UninitIPropertyBag(
CRegPropertyBag* prpb )
{
RegCloseKey( prpb->m_hKey );
}
/***************************************************************************
*
* new/delete for CRegPropertyBag
*
*/
static void QUARTZ_DestroyRegPropertyBag(IUnknown* punk)
{
CRegPropertyBag_THIS(punk,unk);
CRegPropertyBag_UninitIPropertyBag(This);
}
/* can I use offsetof safely? - FIXME? */
static QUARTZ_IFEntry CRegPropertyBag_IFEntries[] =
{
{ &IID_IPropertyBag, offsetof(CRegPropertyBag,propbag)-offsetof(CRegPropertyBag,unk) },
};
HRESULT QUARTZ_CreateRegPropertyBag(
HKEY hkRoot, LPCWSTR lpKeyPath,
IPropertyBag** ppPropBag )
{
CRegPropertyBag* prpb;
HRESULT hr;
TRACE("(%08x,%s,%p)\n",hkRoot,debugstr_w(lpKeyPath),ppPropBag );
prpb = (CRegPropertyBag*)QUARTZ_AllocObj( sizeof(CRegPropertyBag) );
if ( prpb == NULL )
return E_OUTOFMEMORY;
QUARTZ_IUnkInit( &prpb->unk, NULL );
hr = CRegPropertyBag_InitIPropertyBag( prpb, hkRoot, lpKeyPath );
if ( FAILED(hr) )
{
QUARTZ_FreeObj( prpb );
return hr;
}
prpb->unk.pEntries = CRegPropertyBag_IFEntries;
prpb->unk.dwEntries = sizeof(CRegPropertyBag_IFEntries)/sizeof(CRegPropertyBag_IFEntries[0]);
prpb->unk.pOnFinalRelease = &QUARTZ_DestroyRegPropertyBag;
*ppPropBag = (IPropertyBag*)(&prpb->propbag);
return S_OK;
}

View File

@ -1,66 +0,0 @@
#ifndef WINE_DSHOW_DEVMON_H
#define WINE_DSHOW_DEVMON_H
/*
implements CLSID_CDeviceMoniker.
- At least, the following interfaces should be implemented:
IUnknown
+ IPersist - IPersistStream - IMoniker
*/
#include "iunk.h"
typedef struct DMON_IMonikerImpl
{
ICOM_VFIELD(IMoniker);
} DMON_IMonikerImpl;
typedef struct CDeviceMoniker
{
QUARTZ_IUnkImpl unk;
DMON_IMonikerImpl moniker;
/* IMoniker fields */
HKEY m_hkRoot;
WCHAR* m_pwszPath;
} CDeviceMoniker;
#define CDeviceMoniker_THIS(iface,member) CDeviceMoniker* This = (CDeviceMoniker*)(((char*)iface)-offsetof(CDeviceMoniker,member))
HRESULT QUARTZ_CreateDeviceMoniker(
HKEY hkRoot, LPCWSTR lpKeyPath,
IMoniker** ppMoniker );
/*
implements IPropertyBag for accessing registry.
- At least, the following interfaces should be implemented:
IUnknown
+ IPropertyBag
*/
#include "iunk.h"
typedef struct DMON_IPropertyBagImpl
{
ICOM_VFIELD(IPropertyBag);
} DMON_IPropertyBagImpl;
typedef struct CRegPropertyBag
{
QUARTZ_IUnkImpl unk;
DMON_IPropertyBagImpl propbag;
/* IPropertyBag fields */
HKEY m_hKey;
} CRegPropertyBag;
#define CRegPropertyBag_THIS(iface,member) CRegPropertyBag* This = (CRegPropertyBag*)(((char*)iface)-offsetof(CRegPropertyBag,member))
HRESULT QUARTZ_CreateRegPropertyBag(
HKEY hkRoot, LPCWSTR lpKeyPath,
IPropertyBag** ppPropBag );
#endif /* WINE_DSHOW_DEVMON_H */

View File

@ -165,7 +165,9 @@ IBasicAudio_fnput_Volume(IBasicAudio* iface,long lVol)
TRACE("(%p)->()\n",This);
return IBasicAudio_put_Volume(pAudio,lVol);
hr = IBasicAudio_put_Volume(pAudio,lVol);
IBasicAudio_Release(pAudio);
return hr;
}
static HRESULT WINAPI
@ -176,7 +178,9 @@ IBasicAudio_fnget_Volume(IBasicAudio* iface,long* plVol)
TRACE("(%p)->()\n",This);
return IBasicAudio_get_Volume(pAudio,plVol);
hr = IBasicAudio_get_Volume(pAudio,plVol);
IBasicAudio_Release(pAudio);
return hr;
}
static HRESULT WINAPI
@ -187,7 +191,9 @@ IBasicAudio_fnput_Balance(IBasicAudio* iface,long lBalance)
TRACE("(%p)->()\n",This);
return IBasicAudio_put_Balance(pAudio,lBalance);
hr = IBasicAudio_put_Balance(pAudio,lBalance);
IBasicAudio_Release(pAudio);
return hr;
}
static HRESULT WINAPI
@ -198,7 +204,9 @@ IBasicAudio_fnget_Balance(IBasicAudio* iface,long* plBalance)
TRACE("(%p)->()\n",This);
return IBasicAudio_get_Balance(pAudio,plBalance);
hr = IBasicAudio_get_Balance(pAudio,plBalance);
IBasicAudio_Release(pAudio);
return hr;
}
@ -337,7 +345,9 @@ IBasicVideo2_fnget_AvgTimePerFrame(IBasicVideo2* iface,REFTIME* prefTime)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_AvgTimePerFrame(pVideo,prefTime);
hr = IBasicVideo_get_AvgTimePerFrame(pVideo,prefTime);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -348,7 +358,9 @@ IBasicVideo2_fnget_BitRate(IBasicVideo2* iface,long* plRate)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_BitRate(pVideo,plRate);
hr = IBasicVideo_get_BitRate(pVideo,plRate);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -359,7 +371,9 @@ IBasicVideo2_fnget_BitErrorRate(IBasicVideo2* iface,long* plRate)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_BitErrorRate(pVideo,plRate);
hr = IBasicVideo_get_BitErrorRate(pVideo,plRate);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -370,7 +384,9 @@ IBasicVideo2_fnget_VideoWidth(IBasicVideo2* iface,long* plWidth)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_VideoWidth(pVideo,plWidth);
hr = IBasicVideo_get_VideoWidth(pVideo,plWidth);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -381,7 +397,9 @@ IBasicVideo2_fnget_VideoHeight(IBasicVideo2* iface,long* plHeight)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_VideoHeight(pVideo,plHeight);
hr = IBasicVideo_get_VideoHeight(pVideo,plHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -392,7 +410,9 @@ IBasicVideo2_fnput_SourceLeft(IBasicVideo2* iface,long lLeft)
TRACE("(%p)->()\n",This);
return IBasicVideo_put_SourceLeft(pVideo,lLeft);
hr = IBasicVideo_put_SourceLeft(pVideo,lLeft);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -403,7 +423,9 @@ IBasicVideo2_fnget_SourceLeft(IBasicVideo2* iface,long* plLeft)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_SourceLeft(pVideo,plLeft);
hr = IBasicVideo_get_SourceLeft(pVideo,plLeft);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -414,7 +436,9 @@ IBasicVideo2_fnput_SourceWidth(IBasicVideo2* iface,long lWidth)
TRACE("(%p)->()\n",This);
return IBasicVideo_put_SourceWidth(pVideo,lWidth);
hr = IBasicVideo_put_SourceWidth(pVideo,lWidth);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -425,7 +449,9 @@ IBasicVideo2_fnget_SourceWidth(IBasicVideo2* iface,long* plWidth)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_SourceWidth(pVideo,plWidth);
hr = IBasicVideo_get_SourceWidth(pVideo,plWidth);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -436,7 +462,9 @@ IBasicVideo2_fnput_SourceTop(IBasicVideo2* iface,long lTop)
TRACE("(%p)->()\n",This);
return IBasicVideo_put_SourceTop(pVideo,lTop);
hr = IBasicVideo_put_SourceTop(pVideo,lTop);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -447,7 +475,9 @@ IBasicVideo2_fnget_SourceTop(IBasicVideo2* iface,long* plTop)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_SourceTop(pVideo,plTop);
hr = IBasicVideo_get_SourceTop(pVideo,plTop);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -458,7 +488,9 @@ IBasicVideo2_fnput_SourceHeight(IBasicVideo2* iface,long lHeight)
TRACE("(%p)->()\n",This);
return IBasicVideo_put_SourceHeight(pVideo,lHeight);
hr = IBasicVideo_put_SourceHeight(pVideo,lHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -469,7 +501,9 @@ IBasicVideo2_fnget_SourceHeight(IBasicVideo2* iface,long* plHeight)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_SourceHeight(pVideo,plHeight);
hr = IBasicVideo_get_SourceHeight(pVideo,plHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -480,7 +514,9 @@ IBasicVideo2_fnput_DestinationLeft(IBasicVideo2* iface,long lLeft)
TRACE("(%p)->()\n",This);
return IBasicVideo_put_DestinationLeft(pVideo,lLeft);
hr = IBasicVideo_put_DestinationLeft(pVideo,lLeft);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -491,7 +527,9 @@ IBasicVideo2_fnget_DestinationLeft(IBasicVideo2* iface,long* plLeft)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_DestinationLeft(pVideo,plLeft);
hr = IBasicVideo_get_DestinationLeft(pVideo,plLeft);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -502,7 +540,9 @@ IBasicVideo2_fnput_DestinationWidth(IBasicVideo2* iface,long lWidth)
TRACE("(%p)->()\n",This);
return IBasicVideo_put_DestinationWidth(pVideo,lWidth);
hr = IBasicVideo_put_DestinationWidth(pVideo,lWidth);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -513,7 +553,9 @@ IBasicVideo2_fnget_DestinationWidth(IBasicVideo2* iface,long* plWidth)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_DestinationWidth(pVideo,plWidth);
hr = IBasicVideo_get_DestinationWidth(pVideo,plWidth);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -524,7 +566,9 @@ IBasicVideo2_fnput_DestinationTop(IBasicVideo2* iface,long lTop)
TRACE("(%p)->()\n",This);
return IBasicVideo_put_DestinationTop(pVideo,lTop);
hr = IBasicVideo_put_DestinationTop(pVideo,lTop);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -535,7 +579,9 @@ IBasicVideo2_fnget_DestinationTop(IBasicVideo2* iface,long* plTop)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_DestinationTop(pVideo,plTop);
hr = IBasicVideo_get_DestinationTop(pVideo,plTop);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -546,7 +592,9 @@ IBasicVideo2_fnput_DestinationHeight(IBasicVideo2* iface,long lHeight)
TRACE("(%p)->()\n",This);
return IBasicVideo_put_DestinationHeight(pVideo,lHeight);
hr = IBasicVideo_put_DestinationHeight(pVideo,lHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -557,7 +605,9 @@ IBasicVideo2_fnget_DestinationHeight(IBasicVideo2* iface,long* plHeight)
TRACE("(%p)->()\n",This);
return IBasicVideo_get_DestinationHeight(pVideo,plHeight);
hr = IBasicVideo_get_DestinationHeight(pVideo,plHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -568,7 +618,9 @@ IBasicVideo2_fnSetSourcePosition(IBasicVideo2* iface,long lLeft,long lTop,long l
TRACE("(%p)->()\n",This);
return IBasicVideo_SetSourcePosition(pVideo,lLeft,lTop,lWidth,lHeight);
hr = IBasicVideo_SetSourcePosition(pVideo,lLeft,lTop,lWidth,lHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -579,7 +631,9 @@ IBasicVideo2_fnGetSourcePosition(IBasicVideo2* iface,long* plLeft,long* plTop,lo
TRACE("(%p)->()\n",This);
return IBasicVideo_GetSourcePosition(pVideo,plLeft,plTop,plWidth,plHeight);
hr = IBasicVideo_GetSourcePosition(pVideo,plLeft,plTop,plWidth,plHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -590,7 +644,9 @@ IBasicVideo2_fnSetDefaultSourcePosition(IBasicVideo2* iface)
TRACE("(%p)->()\n",This);
return IBasicVideo_SetDefaultSourcePosition(pVideo);
hr = IBasicVideo_SetDefaultSourcePosition(pVideo);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -601,7 +657,9 @@ IBasicVideo2_fnSetDestinationPosition(IBasicVideo2* iface,long lLeft,long lTop,l
TRACE("(%p)->()\n",This);
return IBasicVideo_SetDestinationPosition(pVideo,lLeft,lTop,lWidth,lHeight);
hr = IBasicVideo_SetDestinationPosition(pVideo,lLeft,lTop,lWidth,lHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -612,7 +670,9 @@ IBasicVideo2_fnGetDestinationPosition(IBasicVideo2* iface,long* plLeft,long* plT
TRACE("(%p)->()\n",This);
return IBasicVideo_GetDestinationPosition(pVideo,plLeft,plTop,plWidth,plHeight);
hr = IBasicVideo_GetDestinationPosition(pVideo,plLeft,plTop,plWidth,plHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -623,7 +683,9 @@ IBasicVideo2_fnSetDefaultDestinationPosition(IBasicVideo2* iface)
TRACE("(%p)->()\n",This);
return IBasicVideo_SetDefaultDestinationPosition(pVideo);
hr = IBasicVideo_SetDefaultDestinationPosition(pVideo);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -634,7 +696,9 @@ IBasicVideo2_fnGetVideoSize(IBasicVideo2* iface,long* plWidth,long* plHeight)
TRACE("(%p)->()\n",This);
return IBasicVideo_GetVideoSize(pVideo,plWidth,plHeight);
hr = IBasicVideo_GetVideoSize(pVideo,plWidth,plHeight);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -645,7 +709,9 @@ IBasicVideo2_fnGetVideoPaletteEntries(IBasicVideo2* iface,long lStart,long lCoun
TRACE("(%p)->()\n",This);
return IBasicVideo_GetVideoPaletteEntries(pVideo,lStart,lCount,plRet,plPaletteEntry);
hr = IBasicVideo_GetVideoPaletteEntries(pVideo,lStart,lCount,plRet,plPaletteEntry);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -656,7 +722,9 @@ IBasicVideo2_fnGetCurrentImage(IBasicVideo2* iface,long* plBufferSize,long* plDI
TRACE("(%p)->()\n",This);
return IBasicVideo_GetCurrentImage(pVideo,plBufferSize,plDIBBuffer);
hr = IBasicVideo_GetCurrentImage(pVideo,plBufferSize,plDIBBuffer);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -667,7 +735,9 @@ IBasicVideo2_fnIsUsingDefaultSource(IBasicVideo2* iface)
TRACE("(%p)->()\n",This);
return IBasicVideo_IsUsingDefaultSource(pVideo);
hr = IBasicVideo_IsUsingDefaultSource(pVideo);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -678,7 +748,9 @@ IBasicVideo2_fnIsUsingDefaultDestination(IBasicVideo2* iface)
TRACE("(%p)->()\n",This);
return IBasicVideo_IsUsingDefaultDestination(pVideo);
hr = IBasicVideo_IsUsingDefaultDestination(pVideo);
IBasicVideo_Release(pVideo);
return hr;
}
static HRESULT WINAPI
@ -689,7 +761,9 @@ IBasicVideo2_fnGetPreferredAspectRatio(IBasicVideo2* iface,long* plRateX,long* p
TRACE("(%p)->()\n",This);
return IBasicVideo2_GetPreferredAspectRatio(pVideo,plRateX,plRateY);
hr = IBasicVideo2_GetPreferredAspectRatio(pVideo,plRateX,plRateY);
IBasicVideo2_Release(pVideo);
return hr;
}
@ -854,7 +928,9 @@ IVideoWindow_fnput_Caption(IVideoWindow* iface,BSTR strCaption)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_Caption(pVidWin,strCaption);
hr = IVideoWindow_put_Caption(pVidWin,strCaption);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -865,7 +941,9 @@ IVideoWindow_fnget_Caption(IVideoWindow* iface,BSTR* pstrCaption)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_Caption(pVidWin,pstrCaption);
hr = IVideoWindow_get_Caption(pVidWin,pstrCaption);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -876,7 +954,9 @@ IVideoWindow_fnput_WindowStyle(IVideoWindow* iface,long lStyle)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_WindowStyle(pVidWin,lStyle);
hr = IVideoWindow_put_WindowStyle(pVidWin,lStyle);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -887,7 +967,9 @@ IVideoWindow_fnget_WindowStyle(IVideoWindow* iface,long* plStyle)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_WindowStyle(pVidWin,plStyle);
hr = IVideoWindow_get_WindowStyle(pVidWin,plStyle);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -898,7 +980,9 @@ IVideoWindow_fnput_WindowStyleEx(IVideoWindow* iface,long lExStyle)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_WindowStyleEx(pVidWin,lExStyle);
hr = IVideoWindow_put_WindowStyleEx(pVidWin,lExStyle);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -909,7 +993,9 @@ IVideoWindow_fnget_WindowStyleEx(IVideoWindow* iface,long* plExStyle)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_WindowStyleEx(pVidWin,plExStyle);
hr = IVideoWindow_get_WindowStyleEx(pVidWin,plExStyle);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -920,7 +1006,9 @@ IVideoWindow_fnput_AutoShow(IVideoWindow* iface,long lAutoShow)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_AutoShow(pVidWin,lAutoShow);
hr = IVideoWindow_put_AutoShow(pVidWin,lAutoShow);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -931,7 +1019,9 @@ IVideoWindow_fnget_AutoShow(IVideoWindow* iface,long* plAutoShow)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_AutoShow(pVidWin,plAutoShow);
hr = IVideoWindow_get_AutoShow(pVidWin,plAutoShow);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -942,7 +1032,9 @@ IVideoWindow_fnput_WindowState(IVideoWindow* iface,long lState)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_WindowState(pVidWin,lState);
hr = IVideoWindow_put_WindowState(pVidWin,lState);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -953,7 +1045,9 @@ IVideoWindow_fnget_WindowState(IVideoWindow* iface,long* plState)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_WindowState(pVidWin,plState);
hr = IVideoWindow_get_WindowState(pVidWin,plState);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -964,7 +1058,9 @@ IVideoWindow_fnput_BackgroundPalette(IVideoWindow* iface,long lBackPal)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_BackgroundPalette(pVidWin,lBackPal);
hr = IVideoWindow_put_BackgroundPalette(pVidWin,lBackPal);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -975,7 +1071,9 @@ IVideoWindow_fnget_BackgroundPalette(IVideoWindow* iface,long* plBackPal)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_BackgroundPalette(pVidWin,plBackPal);
hr = IVideoWindow_get_BackgroundPalette(pVidWin,plBackPal);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -986,7 +1084,9 @@ IVideoWindow_fnput_Visible(IVideoWindow* iface,long lVisible)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_Visible(pVidWin,lVisible);
hr = IVideoWindow_put_Visible(pVidWin,lVisible);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -997,7 +1097,9 @@ IVideoWindow_fnget_Visible(IVideoWindow* iface,long* plVisible)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_Visible(pVidWin,plVisible);
hr = IVideoWindow_get_Visible(pVidWin,plVisible);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1008,7 +1110,9 @@ IVideoWindow_fnput_Left(IVideoWindow* iface,long lLeft)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_Left(pVidWin,lLeft);
hr = IVideoWindow_put_Left(pVidWin,lLeft);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1019,7 +1123,9 @@ IVideoWindow_fnget_Left(IVideoWindow* iface,long* plLeft)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_Left(pVidWin,plLeft);
hr = IVideoWindow_get_Left(pVidWin,plLeft);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1030,7 +1136,9 @@ IVideoWindow_fnput_Width(IVideoWindow* iface,long lWidth)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_Width(pVidWin,lWidth);
hr = IVideoWindow_put_Width(pVidWin,lWidth);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1041,7 +1149,9 @@ IVideoWindow_fnget_Width(IVideoWindow* iface,long* plWidth)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_Width(pVidWin,plWidth);
hr =IVideoWindow_get_Width(pVidWin,plWidth);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1052,7 +1162,9 @@ IVideoWindow_fnput_Top(IVideoWindow* iface,long lTop)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_Top(pVidWin,lTop);
hr = IVideoWindow_put_Top(pVidWin,lTop);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1063,7 +1175,9 @@ IVideoWindow_fnget_Top(IVideoWindow* iface,long* plTop)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_Top(pVidWin,plTop);
hr = IVideoWindow_get_Top(pVidWin,plTop);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1074,7 +1188,9 @@ IVideoWindow_fnput_Height(IVideoWindow* iface,long lHeight)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_Height(pVidWin,lHeight);
hr = IVideoWindow_put_Height(pVidWin,lHeight);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1085,7 +1201,9 @@ IVideoWindow_fnget_Height(IVideoWindow* iface,long* plHeight)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_Height(pVidWin,plHeight);
hr = IVideoWindow_get_Height(pVidWin,plHeight);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1096,7 +1214,9 @@ IVideoWindow_fnput_Owner(IVideoWindow* iface,OAHWND hwnd)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_Owner(pVidWin,hwnd);
hr = IVideoWindow_put_Owner(pVidWin,hwnd);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1107,7 +1227,9 @@ IVideoWindow_fnget_Owner(IVideoWindow* iface,OAHWND* phwnd)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_Owner(pVidWin,phwnd);
hr = IVideoWindow_get_Owner(pVidWin,phwnd);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1118,7 +1240,9 @@ IVideoWindow_fnput_MessageDrain(IVideoWindow* iface,OAHWND hwnd)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_MessageDrain(pVidWin,hwnd);
hr = IVideoWindow_put_MessageDrain(pVidWin,hwnd);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1129,7 +1253,9 @@ IVideoWindow_fnget_MessageDrain(IVideoWindow* iface,OAHWND* phwnd)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_MessageDrain(pVidWin,phwnd);
hr = IVideoWindow_get_MessageDrain(pVidWin,phwnd);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1140,7 +1266,9 @@ IVideoWindow_fnget_BorderColor(IVideoWindow* iface,long* plColor)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_BorderColor(pVidWin,plColor);
hr = IVideoWindow_get_BorderColor(pVidWin,plColor);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1151,7 +1279,9 @@ IVideoWindow_fnput_BorderColor(IVideoWindow* iface,long lColor)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_BorderColor(pVidWin,lColor);
hr = IVideoWindow_put_BorderColor(pVidWin,lColor);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1162,7 +1292,9 @@ IVideoWindow_fnget_FullScreenMode(IVideoWindow* iface,long* plMode)
TRACE("(%p)->()\n",This);
return IVideoWindow_get_FullScreenMode(pVidWin,plMode);
hr = IVideoWindow_get_FullScreenMode(pVidWin,plMode);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1173,7 +1305,9 @@ IVideoWindow_fnput_FullScreenMode(IVideoWindow* iface,long lMode)
TRACE("(%p)->()\n",This);
return IVideoWindow_put_FullScreenMode(pVidWin,lMode);
hr = IVideoWindow_put_FullScreenMode(pVidWin,lMode);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1184,7 +1318,9 @@ IVideoWindow_fnSetWindowForeground(IVideoWindow* iface,long lFocus)
TRACE("(%p)->()\n",This);
return IVideoWindow_SetWindowForeground(pVidWin,lFocus);
hr = IVideoWindow_SetWindowForeground(pVidWin,lFocus);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1195,7 +1331,9 @@ IVideoWindow_fnNotifyOwnerMessage(IVideoWindow* iface,OAHWND hwnd,long message,L
TRACE("(%p)->()\n",This);
return IVideoWindow_NotifyOwnerMessage(pVidWin,hwnd,message,wParam,lParam);
hr = IVideoWindow_NotifyOwnerMessage(pVidWin,hwnd,message,wParam,lParam);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1206,7 +1344,9 @@ IVideoWindow_fnSetWindowPosition(IVideoWindow* iface,long lLeft,long lTop,long l
TRACE("(%p)->()\n",This);
return IVideoWindow_SetWindowPosition(pVidWin,lLeft,lTop,lWidth,lHeight);
hr = IVideoWindow_SetWindowPosition(pVidWin,lLeft,lTop,lWidth,lHeight);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1217,7 +1357,9 @@ IVideoWindow_fnGetWindowPosition(IVideoWindow* iface,long* plLeft,long* plTop,lo
TRACE("(%p)->()\n",This);
return IVideoWindow_GetWindowPosition(pVidWin,plLeft,plTop,plWidth,plHeight);
hr = IVideoWindow_GetWindowPosition(pVidWin,plLeft,plTop,plWidth,plHeight);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1228,7 +1370,9 @@ IVideoWindow_fnGetMinIdealImageSize(IVideoWindow* iface,long* plWidth,long* plHe
TRACE("(%p)->()\n",This);
return IVideoWindow_GetMinIdealImageSize(pVidWin,plWidth,plHeight);
hr = IVideoWindow_GetMinIdealImageSize(pVidWin,plWidth,plHeight);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1239,7 +1383,9 @@ IVideoWindow_fnGetMaxIdealImageSize(IVideoWindow* iface,long* plWidth,long* plHe
TRACE("(%p)->()\n",This);
return IVideoWindow_GetMaxIdealImageSize(pVidWin,plWidth,plHeight);
hr = IVideoWindow_GetMaxIdealImageSize(pVidWin,plWidth,plHeight);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1250,7 +1396,9 @@ IVideoWindow_fnGetRestorePosition(IVideoWindow* iface,long* plLeft,long* plTop,l
TRACE("(%p)->()\n",This);
return IVideoWindow_GetRestorePosition(pVidWin,plLeft,plTop,plWidth,plHeight);
hr = IVideoWindow_GetRestorePosition(pVidWin,plLeft,plTop,plWidth,plHeight);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1261,7 +1409,9 @@ IVideoWindow_fnHideCursor(IVideoWindow* iface,long lHide)
TRACE("(%p)->()\n",This);
return IVideoWindow_HideCursor(pVidWin,lHide);
hr = IVideoWindow_HideCursor(pVidWin,lHide);
IVideoWindow_Release(pVidWin);
return hr;
}
static HRESULT WINAPI
@ -1272,7 +1422,9 @@ IVideoWindow_fnIsCursorHidden(IVideoWindow* iface,long* plHide)
TRACE("(%p)->()\n",This);
return IVideoWindow_IsCursorHidden(pVidWin,plHide);
hr = IVideoWindow_IsCursorHidden(pVidWin,plHide);
IVideoWindow_Release(pVidWin);
return hr;
}

View File

@ -23,6 +23,383 @@ DEFAULT_DEBUG_CHANNEL(quartz);
#include "quartz_private.h"
#include "fmap.h"
#include "regsvr.h"
#include "devenum.h"
#include "complist.h"
#include "enumunk.h"
/***************************************************************************/
typedef struct QUARTZ_REGFILTERDATA
{
DWORD dwVersion; /* =2 */
DWORD dwMerit;
DWORD cPins; /* count of pins */
DWORD dwZero; /* padding??? */
} QUARTZ_REGFILTERDATA;
typedef struct QUARTZ_REGPINDATA
{
CHAR id[4]; /* '0pi3', '1pi3', ... */
DWORD dwFlags; /* flags */
UINT cInstances; /* FIXME - is this correct? */
UINT nMediaTypes; /* count of media types('0ty3') */
UINT nMediums; /* FIXME - is this correct? */
UINT nOfsClsPinCategory; /* FIXME - is this correct? */
} QUARTZ_REGPINDATA;
typedef struct QUARTZ_REGMEDIATYPE
{
CHAR id[4]; /* '0ty3', '1ty3', ... */
DWORD nZero; /* padding??? */
UINT nOfsMajorType;
UINT nOfsMinorType;
} QUARTZ_REGMEDIATYPE;
/***************************************************************************/
static
REGFILTER2* QUARTZ_RegFilterV2FromFilterData(
const BYTE* pData, DWORD cbData )
{
REGFILTER2* pFilter;
REGFILTERPINS2* pPin;
REGPINTYPES* pTypes;
BYTE* pDst;
const QUARTZ_REGFILTERDATA* pRegFilter;
const QUARTZ_REGPINDATA* pRegPin;
const QUARTZ_REGMEDIATYPE* pRegMediaType;
DWORD cPins;
DWORD cbBufSize;
UINT n;
TRACE("(%p,%lu)\n",pData,cbData);
if ( cbData < sizeof(QUARTZ_REGFILTERDATA) )
return NULL;
pRegFilter = (QUARTZ_REGFILTERDATA*)pData;
if ( pRegFilter->dwVersion != 2 ) return NULL; /* FIXME */
if ( cbData < (sizeof(QUARTZ_REGFILTERDATA)+sizeof(QUARTZ_REGPINDATA)*pRegFilter->cPins) )
return NULL;
cbBufSize = sizeof(REGFILTER2);
cPins = pRegFilter->cPins;
pRegPin = (const QUARTZ_REGPINDATA*)(pRegFilter+1);
while ( cPins-- > 0 )
{
if ( pRegPin->nMediums != 0 ||
pRegPin->nOfsClsPinCategory != 0 )
return NULL; /* FIXME */
cbBufSize += sizeof(REGFILTERPINS2) +
pRegPin->nMediaTypes * (sizeof(REGPINTYPES) + sizeof(GUID)*2) +
pRegPin->nMediums * sizeof(REGPINMEDIUM) +
sizeof(CLSID);
pRegPin = (const QUARTZ_REGPINDATA*)( ((const BYTE*)pRegPin) +
sizeof(QUARTZ_REGPINDATA) +
sizeof(QUARTZ_REGMEDIATYPE) * pRegPin->nMediaTypes );
}
pFilter = (REGFILTER2*)QUARTZ_AllocMem( cbBufSize );
if ( pFilter == NULL ) return NULL;
ZeroMemory( pFilter, cbBufSize );
pPin = (REGFILTERPINS2*)(pFilter+1);
pDst = (BYTE*)(pPin + pRegFilter->cPins);
pFilter->dwVersion = 2;
pFilter->dwMerit = pRegFilter->dwMerit;
pFilter->u.s2.cPins2 = pRegFilter->cPins;
pFilter->u.s2.rgPins2 = pPin;
cPins = pRegFilter->cPins;
TRACE("cPins = %lu\n",cPins);
pRegPin = (const QUARTZ_REGPINDATA*)(pRegFilter+1);
while ( cPins-- > 0 )
{
pPin->dwFlags = pRegPin->dwFlags;
pPin->cInstances = pRegPin->cInstances;
pPin->nMediaTypes = pRegPin->nMediaTypes;
pPin->lpMediaType = NULL;
pPin->nMediums = pRegPin->nMediums;
pPin->lpMedium = NULL;
pPin->clsPinCategory = NULL;
pTypes = (REGPINTYPES*)pDst;
pPin->lpMediaType = pTypes;
pDst += sizeof(REGPINTYPES) * pRegPin->nMediaTypes;
pRegPin = (const QUARTZ_REGPINDATA*)( ((const BYTE*)pRegPin) +
sizeof(QUARTZ_REGPINDATA) );
for ( n = 0; n < pPin->nMediaTypes; n++ )
{
pRegMediaType = ((const QUARTZ_REGMEDIATYPE*)pRegPin);
TRACE("ofsMajor = %u, ofsMinor = %u\n", pRegMediaType->nOfsMajorType, pRegMediaType->nOfsMinorType);
memcpy( pDst, pData+pRegMediaType->nOfsMajorType, sizeof(GUID) );
pTypes->clsMajorType = (const GUID*)pDst; pDst += sizeof(GUID);
memcpy( pDst, pData+pRegMediaType->nOfsMinorType, sizeof(GUID) );
pTypes->clsMinorType = (const GUID*)pDst; pDst += sizeof(GUID);
pRegPin = (const QUARTZ_REGPINDATA*)( ((const BYTE*)pRegPin) +
sizeof(QUARTZ_REGMEDIATYPE) );
pTypes ++;
}
/* FIXME - pPin->lpMedium */
/* FIXME - pPin->clsPinCategory */
pPin ++;
}
return pFilter;
}
static
BYTE* QUARTZ_RegFilterV2ToFilterData(
const REGFILTER2* pFilter, DWORD* pcbData )
{
DWORD cbData;
DWORD cbPinData;
DWORD cPins;
const REGFILTERPINS2* pPin;
const REGPINTYPES* pTypes;
BYTE* pRet = NULL;
BYTE* pDst;
QUARTZ_REGFILTERDATA* pRegFilter;
QUARTZ_REGPINDATA* pRegPin;
QUARTZ_REGMEDIATYPE* pRegMediaType;
UINT n;
if ( pFilter->dwVersion != 2 ) return NULL; /* FIXME */
cbData = sizeof(QUARTZ_REGFILTERDATA);
cPins = pFilter->u.s2.cPins2;
pPin = pFilter->u.s2.rgPins2;
if ( cPins > 10 ) return NULL; /* FIXME */
cbPinData = 0;
while ( cPins-- > 0 )
{
if ( pPin->cInstances != 0 ||
pPin->nMediaTypes > 10 ||
pPin->nMediums != 0 ||
pPin->clsPinCategory != 0 )
{
FIXME( "not implemented.\n" );
return NULL; /* FIXME */
}
cbPinData += sizeof(QUARTZ_REGPINDATA) +
pPin->nMediaTypes * sizeof(QUARTZ_REGMEDIATYPE);
cbData += pPin->nMediaTypes * (sizeof(GUID)*2);
pPin ++;
}
cbData += cbPinData;
TRACE("cbData %lu, cbPinData %lu\n",cbData,cbPinData);
pRet = (BYTE*)QUARTZ_AllocMem( cbData );
if ( pRet == NULL ) return NULL;
ZeroMemory( pRet, cbData );
pDst = pRet;
pRegFilter = (QUARTZ_REGFILTERDATA*)pDst;
pDst += sizeof(QUARTZ_REGFILTERDATA);
pRegFilter->dwVersion = 2;
pRegFilter->dwMerit = pFilter->dwMerit;
pRegFilter->cPins = pFilter->u.s2.cPins2;
pRegPin = (QUARTZ_REGPINDATA*)pDst;
pDst += cbPinData;
pPin = pFilter->u.s2.rgPins2;
for ( cPins = 0; cPins < pFilter->u.s2.cPins2; cPins++ )
{
pRegPin->id[0] = '0'+cPins;
pRegPin->id[1] = 'p';
pRegPin->id[2] = 'i';
pRegPin->id[3] = '3';
pRegPin->dwFlags = pPin->dwFlags; /* flags */
pRegPin->cInstances = pPin->cInstances;
pRegPin->nMediaTypes = pPin->nMediaTypes;
pRegPin->nMediums = pPin->nMediums;
pRegPin->nOfsClsPinCategory = 0; /* FIXME */
pTypes = pPin->lpMediaType;
pRegPin = (QUARTZ_REGPINDATA*)( ((const BYTE*)pRegPin) +
sizeof(QUARTZ_REGPINDATA) );
for ( n = 0; n < pPin->nMediaTypes; n++ )
{
pRegMediaType = ((QUARTZ_REGMEDIATYPE*)pRegPin);
pRegMediaType->id[0] = '0'+n;
pRegMediaType->id[1] = 't';
pRegMediaType->id[2] = 'y';
pRegMediaType->id[3] = '3';
/* FIXME - CLSID should be shared. */
pRegMediaType->nOfsMajorType = pDst - pRet;
memcpy( pDst, pTypes->clsMajorType, sizeof(GUID) );
pDst += sizeof(GUID);
pRegMediaType->nOfsMinorType = pDst - pRet;
memcpy( pDst, pTypes->clsMinorType, sizeof(GUID) );
pDst += sizeof(GUID);
pRegPin = (QUARTZ_REGPINDATA*)( ((const BYTE*)pRegPin) +
sizeof(QUARTZ_REGMEDIATYPE) );
pTypes ++;
}
pPin ++;
}
*pcbData = pDst - pRet;
TRACE("cbData %lu/%lu\n",*pcbData,cbData);
return pRet;
}
static
REGFILTER2* QUARTZ_RegFilterV1ToV2( const REGFILTER2* prfV1 )
{
REGFILTER2* prfV2;
const REGFILTERPINS* pPinV1;
REGFILTERPINS2* pPinV2;
DWORD cPins;
if ( prfV1->dwVersion != 1 ) return NULL;
prfV2 = (REGFILTER2*)QUARTZ_AllocMem(
sizeof(REGFILTER2) + sizeof(REGFILTERPINS2) * prfV1->u.s1.cPins );
if ( prfV2 == NULL ) return NULL;
ZeroMemory( prfV2, sizeof(REGFILTER2) + sizeof(REGFILTERPINS2) * prfV1->u.s1.cPins );
pPinV1 = prfV1->u.s1.rgPins;
pPinV2 = (REGFILTERPINS2*)(prfV2+1);
prfV2->dwVersion = 2;
prfV2->dwMerit = prfV1->dwMerit;
prfV2->u.s2.cPins2 = prfV1->u.s1.cPins;
prfV2->u.s2.rgPins2 = pPinV2;
cPins = prfV1->u.s1.cPins;
while ( cPins-- > 0 )
{
pPinV2->dwFlags = 0;
pPinV2->cInstances = 0;
pPinV2->nMediaTypes = pPinV1->nMediaTypes;
pPinV2->lpMediaType = pPinV1->lpMediaType;
pPinV2->nMediums = 0;
pPinV2->lpMedium = NULL;
pPinV2->clsPinCategory = NULL;
if ( pPinV1->bRendered )
pPinV2->dwFlags |= REG_PINFLAG_B_RENDERER;
if ( pPinV1->bOutput )
pPinV2->dwFlags |= REG_PINFLAG_B_OUTPUT;
if ( pPinV1->bZero )
pPinV2->dwFlags |= REG_PINFLAG_B_ZERO;
if ( pPinV1->bMany )
pPinV2->dwFlags |= REG_PINFLAG_B_MANY;
pPinV1 ++;
pPinV2 ++;
}
return prfV2;
}
static
BYTE* QUARTZ_RegFilterToFilterData(
const REGFILTER2* pFilter, DWORD* pcbData )
{
REGFILTER2* prfV2;
BYTE* pRet = NULL;
*pcbData = 0;
switch ( pFilter->dwVersion )
{
case 1:
prfV2 = QUARTZ_RegFilterV1ToV2( pFilter );
if ( prfV2 != NULL )
{
pRet = QUARTZ_RegFilterV2ToFilterData( prfV2, pcbData );
QUARTZ_FreeMem( prfV2 );
}
break;
case 2:
pRet = QUARTZ_RegFilterV2ToFilterData( pFilter, pcbData );
break;
default:
FIXME( "unknown REGFILTER2 version - %08lu\n", pFilter->dwVersion );
break;
}
return pRet;
}
/***************************************************************************/
static
BOOL QUARTZ_CheckPinType( BOOL bExactMatch, const REGFILTERPINS2* pPin, DWORD cTypes, const GUID* pTypes, const REGPINMEDIUM* pMedium, const CLSID* pCategory, BOOL bRender )
{
DWORD n1, n2;
BOOL bMatch;
if ( cTypes > 0 && pTypes != NULL )
{
bMatch = FALSE;
for ( n1 = 0; n1 < pPin->nMediaTypes; n1++ )
{
for ( n2 = 0; n2 < cTypes; n2++ )
{
if ( IsEqualGUID(pPin->lpMediaType[n1].clsMajorType,&GUID_NULL) || IsEqualGUID(pPin->lpMediaType[n1].clsMajorType, &pTypes[n2*2+0]) || (!bExactMatch && IsEqualGUID(pPin->lpMediaType[n1].clsMajorType,&GUID_NULL)) )
{
if ( IsEqualGUID(pPin->lpMediaType[n1].clsMinorType,&GUID_NULL) || IsEqualGUID(pPin->lpMediaType[n1].clsMinorType, &pTypes[n2*2+1]) || (!bExactMatch && IsEqualGUID(pPin->lpMediaType[n1].clsMinorType,&GUID_NULL)) )
{
bMatch = TRUE;
break;
}
}
}
}
if ( !bMatch )
return FALSE;
}
if ( pMedium != NULL )
{
bMatch = FALSE;
for ( n1 = 0; n1 < pPin->nMediums; n1++ )
{
if ( IsEqualGUID( &pPin->lpMedium[n1].clsMedium, &pMedium->clsMedium ) && pPin->lpMedium[n1].dw1 == pMedium->dw1 && pPin->lpMedium[n1].dw2 == pMedium->dw2 )
{
bMatch = TRUE;
break;
}
}
if ( !bMatch )
return FALSE;
}
if ( pCategory != NULL )
{
if ( pPin->clsPinCategory == NULL )
return FALSE;
if ( (!bExactMatch && IsEqualGUID(pCategory,&GUID_NULL)) || IsEqualGUID(pCategory,pPin->clsPinCategory) )
return TRUE;
return FALSE;
}
if ( bRender && (!(pPin->dwFlags & REG_PINFLAG_B_RENDERER)) )
return FALSE;
return TRUE;
}
/***************************************************************************
@ -356,8 +733,10 @@ static HRESULT WINAPI
IFilterMapper3_fnUnregisterFilter(IFilterMapper3* iface,const CLSID* pclsidCategory,const OLECHAR* lpwszInst,REFCLSID rclsidFilter)
{
CFilterMapper2_THIS(iface,fmap3);
WCHAR* pwszPath = NULL;
HRESULT hr;
FIXME("(%p)->(%s,%s,%s) stub!\n",This,
TRACE("(%p)->(%s,%s,%s)\n",This,
debugstr_guid(pclsidCategory),
debugstr_w(lpwszInst),
debugstr_guid(rclsidFilter));
@ -365,12 +744,15 @@ IFilterMapper3_fnUnregisterFilter(IFilterMapper3* iface,const CLSID* pclsidCateg
if ( pclsidCategory == NULL )
pclsidCategory = &CLSID_LegacyAmFilterCategory;
/* FIXME */
return QUARTZ_RegisterAMovieFilter(
pclsidCategory,
rclsidFilter,
NULL, 0,
NULL, lpwszInst, FALSE );
hr = QUARTZ_GetFilterRegPath(
&pwszPath, pclsidCategory, rclsidFilter, lpwszInst );
if ( FAILED(hr) )
return hr;
hr = QUARTZ_RegDeleteKey(HKEY_CLASSES_ROOT,pwszPath);
QUARTZ_FreeMem(pwszPath);
return hr;
}
@ -378,8 +760,13 @@ static HRESULT WINAPI
IFilterMapper3_fnRegisterFilter(IFilterMapper3* iface,REFCLSID rclsidFilter,LPCWSTR lpName,IMoniker** ppMoniker,const CLSID* pclsidCategory,const OLECHAR* lpwszInst,const REGFILTER2* pRF2)
{
CFilterMapper2_THIS(iface,fmap3);
WCHAR* pwszPath = NULL;
IMoniker* pMoniker = NULL;
BYTE* pFilterData = NULL;
DWORD cbFilterData = 0;
HRESULT hr;
FIXME( "(%p)->(%s,%s,%p,%s,%s,%p) stub!\n",This,
TRACE( "(%p)->(%s,%s,%p,%s,%s,%p) stub!\n",This,
debugstr_guid(rclsidFilter),debugstr_w(lpName),
ppMoniker,debugstr_guid(pclsidCategory),
debugstr_w(lpwszInst),pRF2 );
@ -387,33 +774,245 @@ IFilterMapper3_fnRegisterFilter(IFilterMapper3* iface,REFCLSID rclsidFilter,LPCW
if ( lpName == NULL || pRF2 == NULL )
return E_POINTER;
if ( ppMoniker != NULL )
if ( ppMoniker != NULL && *ppMoniker != NULL )
{
FIXME( "ppMoniker != NULL - not implemented!\n" );
FIXME( "ppMoniker != NULL - not implemented! *ppMoniker = %p\n",*ppMoniker );
return E_NOTIMPL;
}
if ( pclsidCategory == NULL )
pclsidCategory = &CLSID_LegacyAmFilterCategory;
/* FIXME!! - all members in REGFILTER2 are ignored ! */
if ( pMoniker == NULL )
{
hr = QUARTZ_GetFilterRegPath(
&pwszPath, pclsidCategory, rclsidFilter, lpwszInst );
if ( FAILED(hr) )
return hr;
hr = QUARTZ_CreateDeviceMoniker(
HKEY_CLASSES_ROOT,pwszPath,&pMoniker);
QUARTZ_FreeMem(pwszPath);
if ( FAILED(hr) )
return hr;
}
return QUARTZ_RegisterAMovieFilter(
pclsidCategory,
rclsidFilter,
NULL, 0,
lpName, lpwszInst, TRUE );
pFilterData = QUARTZ_RegFilterToFilterData( pRF2, &cbFilterData );
if ( pFilterData == NULL || cbFilterData == 0 )
{
hr = E_FAIL;
goto err;
}
hr = QUARTZ_RegisterFilterToMoniker(
pMoniker, rclsidFilter, lpName, pFilterData, cbFilterData );
if ( FAILED(hr) )
goto err;
if ( ppMoniker != NULL )
{
*ppMoniker = pMoniker;
pMoniker = NULL;
}
err:
if ( pFilterData != NULL )
QUARTZ_FreeMem(pFilterData);
if ( pMoniker != NULL )
IMoniker_Release(pMoniker);
return hr;
}
static HRESULT WINAPI
IFilterMapper3_fnEnumMatchingFilters(IFilterMapper3* iface,IEnumMoniker** ppMoniker,DWORD dwFlags,BOOL bExactMatch,DWORD dwMerit,BOOL bInputNeeded,DWORD cInputTypes,const GUID* pguidInputTypes,const REGPINMEDIUM* pPinMediumIn,const CLSID* pPinCategoryIn,BOOL bRender,BOOL bOutputNeeded,DWORD cOutputTypes,const GUID* pguidOutputTypes,const REGPINMEDIUM* pPinMediumOut,const CLSID* pPinCategoryOut)
IFilterMapper3_fnEnumMatchingFilters(IFilterMapper3* iface,
IEnumMoniker** ppEnumMoniker,DWORD dwFlags,BOOL bExactMatch,DWORD dwMerit,
BOOL bInputNeeded,DWORD cInputTypes,const GUID* pguidInputTypes,const REGPINMEDIUM* pPinMediumIn,const CLSID* pPinCategoryIn,BOOL bRender,
BOOL bOutputNeeded,DWORD cOutputTypes,const GUID* pguidOutputTypes,const REGPINMEDIUM* pPinMediumOut,const CLSID* pPinCategoryOut)
{
CFilterMapper2_THIS(iface,fmap3);
ICreateDevEnum* pEnum = NULL;
IEnumMoniker* pCategories = NULL;
IMoniker* pCat = NULL;
DWORD dwCatMerit;
IEnumMoniker* pCatFilters = NULL;
IMoniker* pFilter = NULL;
CLSID clsid;
ULONG cReturned;
BYTE* pbFilterData = NULL;
DWORD cbFilterData = 0;
REGFILTER2* prf2 = NULL;
QUARTZ_CompList* pList = NULL;
const REGFILTERPINS2* pRegFilterPin;
DWORD n;
BOOL bMatch;
HRESULT hr;
FIXME("(%p)->() stub!\n",This);
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);
return E_NOTIMPL;
if ( ppEnumMoniker == NULL )
return E_POINTER;
*ppEnumMoniker = NULL;
if ( dwFlags != 0 )
return E_INVALIDARG;
hr = CoCreateInstance(
&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
&IID_ICreateDevEnum, (void**)&pEnum );
if ( FAILED(hr) )
goto err;
hr = ICreateDevEnum_CreateClassEnumerator(pEnum,&CLSID_ActiveMovieCategories,&pCategories,0);
if ( hr != S_OK )
goto err;
while ( 1 )
{
if ( pCat != NULL )
{
IMoniker_Release(pCat);
pCat = NULL;
}
hr = IEnumMoniker_Next(pCategories,1,&pCat,&cReturned);
if ( FAILED(hr) )
goto err;
if ( hr != S_OK )
break;
hr = QUARTZ_GetMeritFromMoniker(pCat,&dwCatMerit);
if ( hr != S_OK || dwMerit > dwCatMerit )
continue;
hr = QUARTZ_GetCLSIDFromMoniker(pCat,&clsid);
if ( hr != S_OK )
continue;
if ( pCatFilters != NULL )
{
IEnumMoniker_Release(pCatFilters);
pCatFilters = NULL;
}
hr = ICreateDevEnum_CreateClassEnumerator(pEnum,&clsid,&pCatFilters,0);
if ( FAILED(hr) )
goto err;
if ( hr != S_OK )
continue;
while ( 1 )
{
if ( pFilter != NULL )
{
IMoniker_Release(pFilter);
pFilter = NULL;
}
hr = IEnumMoniker_Next(pCatFilters,1,&pFilter,&cReturned);
if ( FAILED(hr) )
goto err;
if ( hr != S_OK )
break;
if ( pbFilterData != NULL )
{
QUARTZ_FreeMem(pbFilterData);
pbFilterData = NULL;
}
hr = QUARTZ_GetFilterDataFromMoniker(pFilter,&pbFilterData,&cbFilterData);
if ( hr != S_OK )
continue;
if ( prf2 != NULL )
{
QUARTZ_FreeMem(prf2);
prf2 = NULL;
}
prf2 = QUARTZ_RegFilterV2FromFilterData(pbFilterData,cbFilterData);
if ( prf2 == NULL )
continue;
TRACE("prf2 %p, Merit %lu\n",prf2,prf2->dwMerit);
if ( prf2->dwMerit < dwMerit || prf2->dwVersion != 2 )
continue;
/* check input pins. */
if ( bInputNeeded )
{
bMatch = FALSE;
for ( n = 0; n < prf2->u.s2.cPins2; n++ )
{
pRegFilterPin = &prf2->u.s2.rgPins2[n];
if ( pRegFilterPin->dwFlags & REG_PINFLAG_B_OUTPUT )
continue;
bMatch = QUARTZ_CheckPinType( bExactMatch, pRegFilterPin, cInputTypes, pguidInputTypes, pPinMediumIn, pPinCategoryIn, bRender );
if ( bMatch )
break;
}
if ( !bMatch )
continue;
}
/* check output pins. */
if ( bOutputNeeded )
{
bMatch = FALSE;
for ( n = 0; n < prf2->u.s2.cPins2; n++ )
{
pRegFilterPin = &prf2->u.s2.rgPins2[n];
if ( !(pRegFilterPin->dwFlags & REG_PINFLAG_B_OUTPUT) )
continue;
bMatch = QUARTZ_CheckPinType( bExactMatch, pRegFilterPin, cOutputTypes, pguidOutputTypes, pPinMediumOut, pPinCategoryOut, FALSE );
if ( bMatch )
break;
}
if ( !bMatch )
continue;
}
/* matched - add pFilter to the list. */
if ( pList == NULL )
{
pList = QUARTZ_CompList_Alloc();
if ( pList == NULL )
{
hr = E_OUTOFMEMORY;
goto err;
}
}
hr = QUARTZ_CompList_AddComp(
pList, (IUnknown*)pFilter, NULL, 0 );
if ( FAILED(hr) )
goto err;
}
}
if ( pList == NULL )
{
hr = S_FALSE;
goto err;
}
FIXME("create IEnumMoniker - not sorted\n");
/* FIXME - should be sorted?(in Merit order) */
hr = QUARTZ_CreateEnumUnknown( &IID_IEnumMoniker, (void**)ppEnumMoniker, pList );
if ( FAILED(hr) )
goto err;
hr = S_OK;
err:
if ( pEnum != NULL )
ICreateDevEnum_Release(pEnum);
if ( pCategories != NULL )
IEnumMoniker_Release(pCategories);
if ( pCat != NULL )
IMoniker_Release(pCat);
if ( pCatFilters != NULL )
IEnumMoniker_Release(pCatFilters);
if ( pFilter != NULL )
IMoniker_Release(pFilter);
if ( pbFilterData != NULL )
QUARTZ_FreeMem(pbFilterData);
if ( prf2 != NULL )
QUARTZ_FreeMem(prf2);
if ( pList != NULL )
QUARTZ_CompList_Free( pList );
TRACE("returns %08lx\n",hr);
return hr;
}
static HRESULT WINAPI

View File

@ -18,6 +18,7 @@
#include "wingdi.h"
#include "winuser.h"
#include "winerror.h"
#include "winreg.h"
#include "strmif.h"
#include "control.h"
#include "uuids.h"
@ -31,8 +32,13 @@ DEFAULT_DEBUG_CHANNEL(quartz);
#include "fgraph.h"
#include "enumunk.h"
#include "sysclock.h"
#include "regsvr.h"
#ifndef NUMELEMS
#define NUMELEMS(elem) (sizeof(elem)/sizeof(elem[0]))
#endif /* NUMELEMS */
static HRESULT CFilterGraph_DisconnectAllPins( IBaseFilter* pFilter )
{
IEnumPins* pEnum = NULL;
@ -89,6 +95,289 @@ static HRESULT CFilterGraph_GraphChanged( CFilterGraph* This )
return NOERROR;
}
/***************************************************************************
*
* CFilterGraph internal methods for IFilterGraph2::AddSourceFilter().
*
*/
static HRESULT QUARTZ_PeekFile(
const WCHAR* pwszFileName,
BYTE* pData, DWORD cbData, DWORD* pcbRead )
{
HANDLE hFile;
HRESULT hr = E_FAIL;
*pcbRead = 0;
hFile = CreateFileW( pwszFileName,
GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL );
if ( hFile == INVALID_HANDLE_VALUE )
return E_FAIL;
if ( ReadFile( hFile, pData, cbData, pcbRead, NULL ) )
hr = NOERROR;
CloseHandle( hFile );
return hr;
}
static const WCHAR* skip_space(const WCHAR* pwsz)
{
if ( pwsz == NULL ) return NULL;
while ( *pwsz == (WCHAR)' ' ) pwsz++;
return pwsz;
}
static const WCHAR* get_dword(const WCHAR* pwsz,DWORD* pdw)
{
DWORD dw = 0;
*pdw = 0;
if ( pwsz == NULL ) return NULL;
while ( *pwsz >= (WCHAR)'0' && *pwsz <= (WCHAR)'9' )
{
dw = dw * 10 + (DWORD)(*pwsz-(WCHAR)'0');
pwsz ++;
}
*pdw = dw;
return pwsz;
}
static int wchar_to_hex(WCHAR wch)
{
if ( wch >= (WCHAR)'0' && wch <= (WCHAR)'9' )
return (int)(wch - (WCHAR)'0');
if ( wch >= (WCHAR)'A' && wch <= (WCHAR)'F' )
return (int)(wch - (WCHAR)'A' + 10);
if ( wch >= (WCHAR)'a' && wch <= (WCHAR)'f' )
return (int)(wch - (WCHAR)'a' + 10);
return -1;
}
static const WCHAR* get_hex(const WCHAR* pwsz,BYTE* pb)
{
int hi,lo;
*pb = 0;
if ( pwsz == NULL ) return NULL;
hi = wchar_to_hex(*pwsz); if ( hi < 0 ) return NULL; pwsz++;
lo = wchar_to_hex(*pwsz); if ( lo < 0 ) return NULL; pwsz++;
*pb = (BYTE)( (hi << 4) | lo );
return pwsz;
}
static const WCHAR* skip_hex(const WCHAR* pwsz)
{
if ( pwsz == NULL ) return NULL;
while ( 1 )
{
if ( wchar_to_hex(*pwsz) < 0 )
break;
pwsz++;
}
return pwsz;
}
static const WCHAR* next_token(const WCHAR* pwsz)
{
if ( pwsz == NULL ) return NULL;
pwsz = skip_space(pwsz);
if ( *pwsz != (WCHAR)',' ) return NULL; pwsz++;
return skip_space(pwsz);
}
static HRESULT QUARTZ_SourceTypeIsMatch(
const BYTE* pData, DWORD cbData,
const WCHAR* pwszTempl, DWORD cchTempl )
{
DWORD dwOfs;
DWORD n;
DWORD cbLen;
const WCHAR* pwszMask;
const WCHAR* pwszValue;
BYTE bMask;
BYTE bValue;
TRACE("(%p,%lu,%s,%lu)\n",pData,cbData,debugstr_w(pwszTempl),cchTempl);
pwszTempl = skip_space(pwszTempl);
while ( 1 )
{
pwszTempl = get_dword(pwszTempl,&dwOfs);
pwszTempl = next_token(pwszTempl);
pwszTempl = get_dword(pwszTempl,&cbLen);
pwszMask = pwszTempl = next_token(pwszTempl);
pwszTempl = skip_hex(pwszTempl);
pwszValue = pwszTempl = next_token(pwszTempl);
pwszTempl = skip_hex(pwszValue);
pwszTempl = skip_space(pwszTempl);
if ( pwszValue == NULL )
{
WARN( "parse error\n" );
return S_FALSE;
}
if ( dwOfs >= cbData || ( (dwOfs+cbLen) >= cbData ) )
{
WARN( "length of given data is too short\n" );
return S_FALSE;
}
for ( n = 0; n < cbLen; n++ )
{
pwszMask = get_hex(pwszMask,&bMask);
if ( pwszMask == NULL ) bMask = 0xff;
pwszValue = get_hex(pwszValue,&bValue);
if ( pwszValue == NULL )
{
WARN( "parse error - invalid hex data\n" );
return S_FALSE;
}
if ( (pData[dwOfs+n]&bMask) != (bValue&bMask) )
{
TRACE( "not matched\n" );
return S_FALSE;
}
}
if ( *pwszTempl == 0 )
break;
pwszTempl = next_token(pwszTempl);
if ( pwszTempl == NULL )
{
WARN( "parse error\n" );
return S_FALSE;
}
}
TRACE( "matched\n" );
return NOERROR;
}
static HRESULT QUARTZ_GetSourceTypeFromData(
const BYTE* pData, DWORD cbData,
GUID* pidMajor, GUID* pidSub, CLSID* pidSource )
{
HRESULT hr = S_FALSE;
LONG lr;
WCHAR wszMajor[128];
WCHAR wszSub[128];
WCHAR wszSource[128];
WCHAR wszSourceFilter[128];
WCHAR* pwszLocalBuf = NULL;
WCHAR* pwszTemp;
DWORD cbLocalBuf = 0;
DWORD cbPath;
DWORD dwIndexMajor;
HKEY hkMajor;
DWORD dwIndexSub;
HKEY hkSub;
DWORD dwIndexSource;
HKEY hkSource;
DWORD dwRegType;
DWORD cbRegData;
FILETIME ftLastWrite;
static const WCHAR wszFmt[] = {'%','l','u',0};
if ( RegOpenKeyExW( HKEY_CLASSES_ROOT, QUARTZ_wszMediaType, 0, KEY_READ, &hkMajor ) == ERROR_SUCCESS )
{
dwIndexMajor = 0;
while ( hr == S_FALSE )
{
cbPath = NUMELEMS(wszMajor)-1;
lr = RegEnumKeyExW(
hkMajor, dwIndexMajor ++, wszMajor, &cbPath,
NULL, NULL, NULL, &ftLastWrite );
if ( lr != ERROR_SUCCESS )
break;
if ( RegOpenKeyExW( hkMajor, wszMajor, 0, KEY_READ, &hkSub ) == ERROR_SUCCESS )
{
dwIndexSub = 0;
while ( hr == S_FALSE )
{
cbPath = NUMELEMS(wszSub)-1;
lr = RegEnumKeyExW(
hkSub, dwIndexSub ++, wszSub, &cbPath,
NULL, NULL, NULL, &ftLastWrite );
if ( lr != ERROR_SUCCESS )
break;
if ( RegOpenKeyExW( hkSub, wszSub, 0, KEY_READ, &hkSource ) == ERROR_SUCCESS )
{
dwIndexSource = 0;
while ( hr == S_FALSE )
{
wsprintfW(wszSource,wszFmt,dwIndexSource++);
lr = RegQueryValueExW(
hkSource, wszSource, NULL,
&dwRegType, NULL, &cbRegData );
if ( lr != ERROR_SUCCESS )
break;
if ( cbLocalBuf < cbRegData )
{
pwszTemp = (WCHAR*)QUARTZ_ReallocMem( pwszLocalBuf, cbRegData+sizeof(WCHAR) );
if ( pwszTemp == NULL )
{
hr = E_OUTOFMEMORY;
break;
}
pwszLocalBuf = pwszTemp;
cbLocalBuf = cbRegData+sizeof(WCHAR);
}
cbRegData = cbLocalBuf;
lr = RegQueryValueExW(
hkSource, wszSource, NULL,
&dwRegType, (BYTE*)pwszLocalBuf, &cbRegData );
if ( lr != ERROR_SUCCESS )
break;
hr = QUARTZ_SourceTypeIsMatch(
pData, cbData,
pwszLocalBuf, cbRegData / sizeof(WCHAR) );
if ( hr == S_OK )
{
hr = CLSIDFromString(wszMajor,pidMajor);
if ( hr == NOERROR )
hr = CLSIDFromString(wszSub,pidSub);
if ( hr == NOERROR )
{
lstrcpyW(wszSource,QUARTZ_wszSourceFilter);
cbRegData = NUMELEMS(wszSourceFilter)-sizeof(WCHAR);
lr = RegQueryValueExW(
hkSource, wszSource, NULL,
&dwRegType,
(BYTE*)wszSourceFilter, &cbRegData );
if ( lr == ERROR_SUCCESS )
{
hr = CLSIDFromString(wszSourceFilter,pidSource);
}
else
hr = E_FAIL;
}
if ( hr != NOERROR && SUCCEEDED(hr) )
hr = E_FAIL;
}
if ( hr != S_FALSE )
break;
}
RegCloseKey( hkSource );
}
}
RegCloseKey( hkSub );
}
}
RegCloseKey( hkMajor );
}
if ( pwszLocalBuf != NULL )
QUARTZ_FreeMem(pwszLocalBuf);
return hr;
}
/***************************************************************************
*
@ -178,7 +467,7 @@ IFilterGraph2_fnAddFilter(IFilterGraph2* iface,IBaseFilter* pFilter, LPCWSTR pNa
pItem = QUARTZ_CompList_SearchData(
This->m_pFilterList,
info.achName, sizeof(WCHAR)*(iLen+1) );
if ( pItem == NULL )
if ( iLen > 0 && pItem == NULL )
{
pName = info.achName;
goto name_ok;
@ -210,7 +499,7 @@ IFilterGraph2_fnAddFilter(IFilterGraph2* iface,IBaseFilter* pFilter, LPCWSTR pNa
goto end;
name_ok:
TRACE( "(%p) add this filter.\n",This );
TRACE( "(%p) add this filter - %s.\n",This,debugstr_w(pName) );
/* register this filter. */
hr = QUARTZ_CompList_AddComp(
@ -511,6 +800,20 @@ static HRESULT WINAPI
IFilterGraph2_fnConnect(IFilterGraph2* iface,IPin* pOut,IPin* pIn)
{
CFilterGraph_THIS(iface,fgraph);
IFilterMapper2* pMap2 = NULL;
IEnumMoniker* pEnumMon = NULL;
IMoniker* pMon = NULL;
IBaseFilter* pFilter = NULL;
IEnumPins* pEnumPin = NULL;
IPin* pPinTry = NULL;
PIN_INFO info;
PIN_DIRECTION pindir;
ULONG cReturned;
BOOL bTryConnect;
BOOL bConnected = FALSE;
CLSID clsidOutFilter;
CLSID clsidInFilter;
CLSID clsid;
HRESULT hr;
TRACE( "(%p)->(%p,%p)\n",This,pOut,pIn );
@ -523,17 +826,232 @@ IFilterGraph2_fnConnect(IFilterGraph2* iface,IPin* pOut,IPin* pIn)
/* FIXME - try to connect indirectly. */
FIXME( "(%p)->(%p,%p) stub!\n",This,pOut,pIn );
info.pFilter = NULL;
hr = IPin_QueryPinInfo(pOut,&info);
if ( FAILED(hr) )
return hr;
if ( info.pFilter == NULL )
return E_FAIL;
hr = IBaseFilter_GetClassID(info.pFilter,&clsidOutFilter);
IBaseFilter_Release(info.pFilter);
if ( FAILED(hr) )
return hr;
return E_NOTIMPL;
info.pFilter = NULL;
hr = IPin_QueryPinInfo(pIn,&info);
if ( FAILED(hr) )
return hr;
if ( info.pFilter == NULL )
return E_FAIL;
hr = IBaseFilter_GetClassID(info.pFilter,&clsidInFilter);
IBaseFilter_Release(info.pFilter);
if ( FAILED(hr) )
return hr;
/* FIXME - try to connect with unused filters. */
/* FIXME - try to connect with cached filters. */
/* FIXME - enumerate transform filters and try to connect */
hr = CoCreateInstance(
&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
&IID_IFilterMapper2, (void**)&pMap2 );
if ( FAILED(hr) )
return hr;
hr = IFilterMapper2_EnumMatchingFilters(
pMap2,&pEnumMon,0,FALSE,MERIT_DO_NOT_USE+1,
TRUE,0,NULL,NULL,NULL,FALSE,
TRUE,0,NULL,NULL,NULL);
IFilterMapper2_Release(pMap2);
if ( FAILED(hr) )
return hr;
TRACE("try to connect indirectly\n");
if ( hr == S_OK )
{
while ( !bConnected && hr == S_OK )
{
hr = IEnumMoniker_Next(pEnumMon,1,&pMon,&cReturned);
if ( hr != S_OK )
break;
hr = IMoniker_BindToObject(pMon,NULL,NULL,&IID_IBaseFilter,(void**)&pFilter );
if ( hr == S_OK )
{
hr = IBaseFilter_GetClassID(pFilter,&clsid);
if ( hr == S_OK &&
( IsEqualGUID(&clsidOutFilter,&clsid) || IsEqualGUID(&clsidInFilter,&clsid) ) )
hr = S_FALSE;
else
hr = IFilterGraph2_AddFilter(iface,pFilter,NULL);
if ( hr == S_OK )
{
bTryConnect = FALSE;
hr = IBaseFilter_EnumPins(pFilter,&pEnumPin);
if ( hr == S_OK )
{
{
while ( !bTryConnect )
{
hr = IEnumPins_Next(pEnumPin,1,&pPinTry,&cReturned);
if ( hr != S_OK )
break;
hr = IPin_QueryDirection(pPinTry,&pindir);
if ( hr == S_OK && pindir == PINDIR_INPUT )
{
/* try to connect directly. */
hr = IFilterGraph2_ConnectDirect(iface,pOut,pPinTry,NULL);
if ( hr == S_OK )
bTryConnect = TRUE;
hr = S_OK;
}
IPin_Release(pPinTry); pPinTry = NULL;
}
}
IEnumPins_Release(pEnumPin); pEnumPin = NULL;
}
TRACE("TryConnect %d\n",bTryConnect);
if ( bTryConnect )
{
hr = IBaseFilter_EnumPins(pFilter,&pEnumPin);
if ( hr == S_OK )
{
while ( !bConnected )
{
hr = IEnumPins_Next(pEnumPin,1,&pPinTry,&cReturned);
if ( hr != S_OK )
break;
hr = IPin_QueryDirection(pPinTry,&pindir);
if ( hr == S_OK && pindir == PINDIR_OUTPUT )
{
/* try to connect indirectly. */
hr = IFilterGraph2_Connect(iface,pPinTry,pIn);
if ( hr == S_OK )
bConnected = TRUE;
hr = S_OK;
}
IPin_Release(pPinTry); pPinTry = NULL;
}
IEnumPins_Release(pEnumPin); pEnumPin = NULL;
}
}
if ( !bConnected )
hr = IFilterGraph2_RemoveFilter(iface,pFilter);
}
IBaseFilter_Release(pFilter); pFilter = NULL;
if ( SUCCEEDED(hr) )
hr = S_OK;
}
IMoniker_Release(pMon); pMon = NULL;
}
IEnumMoniker_Release(pEnumMon); pEnumMon = NULL;
}
if ( SUCCEEDED(hr) && !bConnected )
hr = VFW_E_CANNOT_CONNECT;
return hr;
}
static HRESULT WINAPI
IFilterGraph2_fnRender(IFilterGraph2* iface,IPin* pOut)
{
CFilterGraph_THIS(iface,fgraph);
HRESULT hr;
IFilterMapper2* pMap2 = NULL;
IEnumMoniker* pEnumMon = NULL;
IMoniker* pMon = NULL;
IBaseFilter* pFilter = NULL;
IEnumPins* pEnumPin = NULL;
IPin* pPin = NULL;
PIN_DIRECTION pindir;
BOOL bRendered = FALSE;
ULONG cReturned;
FIXME( "(%p)->(%p) stub!\n",This,pOut );
return E_NOTIMPL;
FIXME( "(%p)->(%p)\n",This,pOut );
/* FIXME - must be locked */
/*QUARTZ_CompList_Lock( This->m_pFilterList );*/
if ( pOut == NULL )
return E_POINTER;
hr = CoCreateInstance(
&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
&IID_IFilterMapper2, (void**)&pMap2 );
if ( FAILED(hr) )
return hr;
hr = IFilterMapper2_EnumMatchingFilters(
pMap2,&pEnumMon,0,FALSE,MERIT_DO_NOT_USE+1,
TRUE,0,NULL,NULL,NULL,TRUE,
FALSE,0,NULL,NULL,NULL);
IFilterMapper2_Release(pMap2);
if ( FAILED(hr) )
return hr;
TRACE("try to render pin\n");
if ( hr == S_OK )
{
/* try to render pin. */
while ( !bRendered && hr == S_OK )
{
hr = IEnumMoniker_Next(pEnumMon,1,&pMon,&cReturned);
if ( hr != S_OK )
break;
hr = IMoniker_BindToObject(pMon,NULL,NULL,&IID_IBaseFilter,(void**)&pFilter );
if ( hr == S_OK )
{
hr = IFilterGraph2_AddFilter(iface,pFilter,NULL);
if ( hr == S_OK )
{
hr = IBaseFilter_EnumPins(pFilter,&pEnumPin);
if ( hr == S_OK )
{
while ( !bRendered )
{
hr = IEnumPins_Next(pEnumPin,1,&pPin,&cReturned);
if ( hr != S_OK )
break;
hr = IPin_QueryDirection(pPin,&pindir);
if ( hr == S_OK && pindir == PINDIR_INPUT )
{
/* try to connect. */
hr = IFilterGraph2_Connect(iface,pOut,pPin);
if ( hr == S_OK )
bRendered = TRUE;
hr = S_OK;
}
IPin_Release(pPin); pPin = NULL;
}
IEnumPins_Release(pEnumPin); pEnumPin = NULL;
}
if ( !bRendered )
hr = IFilterGraph2_RemoveFilter(iface,pFilter);
}
IBaseFilter_Release(pFilter); pFilter = NULL;
if ( SUCCEEDED(hr) )
hr = S_OK;
}
IMoniker_Release(pMon); pMon = NULL;
}
IEnumMoniker_Release(pEnumMon); pEnumMon = NULL;
}
if ( bRendered )
{
/* successfully rendered(but may be partial now) */
hr = S_OK;
/* FIXME - try to render all inserted filters. */
/* hr = VFW_S_PARTIAL_RENDER; */
}
else
{
if ( SUCCEEDED(hr) )
hr = VFW_E_CANNOT_RENDER;
}
/*QUARTZ_CompList_Unlock( This->m_pFilterList );*/
return hr;
}
static HRESULT WINAPI
@ -564,6 +1082,8 @@ IFilterGraph2_fnRenderFile(IFilterGraph2* iface,LPCWSTR lpFileName,LPCWSTR lpPla
hr = E_FAIL;
goto end;
}
TRACE("(%p) source filter %p\n",This,pFilter);
pEnum = NULL;
hr = IBaseFilter_EnumPins( pFilter, &pEnum );
if ( FAILED(hr) )
@ -621,10 +1141,67 @@ static HRESULT WINAPI
IFilterGraph2_fnAddSourceFilter(IFilterGraph2* iface,LPCWSTR lpFileName,LPCWSTR lpFilterName,IBaseFilter** ppBaseFilter)
{
CFilterGraph_THIS(iface,fgraph);
HRESULT hr;
BYTE bStartData[512];
DWORD cbStartData;
AM_MEDIA_TYPE mt;
CLSID clsidSource;
IFileSourceFilter* pSource;
FIXME( "(%p)->(%s,%s,%p) stub!\n",This,
FIXME( "(%p)->(%s,%s,%p)\n",This,
debugstr_w(lpFileName),debugstr_w(lpFilterName),ppBaseFilter );
return E_NOTIMPL;
if ( lpFileName == NULL || ppBaseFilter == NULL )
return E_POINTER;
*ppBaseFilter = NULL;
hr = QUARTZ_PeekFile( lpFileName, bStartData, 512, &cbStartData );
if ( FAILED(hr) )
{
FIXME("cannot open %s (NOTE: URL is not implemented)\n", debugstr_w(lpFileName));
return hr;
}
ZeroMemory( &mt, sizeof(AM_MEDIA_TYPE) );
mt.bFixedSizeSamples = 1;
mt.lSampleSize = 1;
memcpy( &mt.majortype, &MEDIATYPE_Stream, sizeof(GUID) );
memcpy( &mt.subtype, &MEDIASUBTYPE_NULL, sizeof(GUID) );
memcpy( &mt.formattype, &FORMAT_None, sizeof(GUID) );
hr = QUARTZ_GetSourceTypeFromData(
bStartData, cbStartData,
&mt.majortype, &mt.subtype, &clsidSource );
if ( FAILED(hr) )
{
ERR("QUARTZ_GetSourceTypeFromData() failed - return %08lx\n",hr);
return hr;
}
if ( hr != S_OK )
{
FIXME( "file %s - unknown format\n", debugstr_w(lpFileName) );
return VFW_E_INVALID_FILE_FORMAT;
}
hr = CoCreateInstance(
&clsidSource, NULL, CLSCTX_INPROC_SERVER,
&IID_IBaseFilter, (void**)ppBaseFilter );
if ( FAILED(hr) )
return hr;
hr = IBaseFilter_QueryInterface(*ppBaseFilter,&IID_IFileSourceFilter,(void**)&pSource);
if ( SUCCEEDED(hr) )
{
hr = IFileSourceFilter_Load(pSource,lpFileName,&mt);
IFileSourceFilter_Release(pSource);
}
if ( SUCCEEDED(hr) )
hr = IFilterGraph2_AddFilter(iface,*ppBaseFilter,lpFilterName);
if ( FAILED(hr) )
{
IBaseFilter_Release(*ppBaseFilter);
*ppBaseFilter = NULL;
return hr;
}
return S_OK;
}
static HRESULT WINAPI

View File

@ -99,8 +99,10 @@ IUnknown_fnRelease(IUnknown* iface)
if ( ref > 0 )
return (ULONG)ref;
This->ref ++;
if ( This->pOnFinalRelease != NULL )
(*(This->pOnFinalRelease))(iface);
This->ref --;
QUARTZ_FreeObj(This);

View File

@ -105,6 +105,11 @@ void QUARTZ_MediaType_Destroy(
void QUARTZ_MediaSubType_FromFourCC(
GUID* psubtype, DWORD dwFourCC )
{
TRACE( "FourCC %c%c%c%c\n",
(int)(dwFourCC>> 0)&0xff,
(int)(dwFourCC>> 8)&0xff,
(int)(dwFourCC>>16)&0xff,
(int)(dwFourCC>>24)&0xff );
memcpy( psubtype, &MEDIASUBTYPE_PCM, sizeof(GUID) );
psubtype->Data1 = dwFourCC;
}
@ -125,7 +130,7 @@ HRESULT QUARTZ_MediaSubType_FromBitmap(
HRESULT hr;
DWORD* pdwBitf;
if ( (pbi->biCompression & 0xffff) != 0 )
if ( (pbi->biCompression & 0xffff0000) != 0 )
return S_FALSE;
if ( pbi->biWidth <= 0 || pbi->biHeight == 0 )
@ -219,6 +224,25 @@ HRESULT QUARTZ_MediaSubType_FromBitmap(
return hr;
}
void QUARTZ_PatchBitmapInfoHeader( BITMAPINFOHEADER* pbi )
{
switch ( pbi->biCompression )
{
case mmioFOURCC('R','G','B',' '):
pbi->biCompression = 0;
break;
case mmioFOURCC('R','L','E',' '):
case mmioFOURCC('M','R','L','E'):
case mmioFOURCC('R','L','E','8'):
case mmioFOURCC('R','L','E','4'):
if ( pbi->biBitCount == 4 )
pbi->biCompression = 2;
else
pbi->biCompression = 1;
break;
}
}
BOOL QUARTZ_BitmapHasFixedSample( const BITMAPINFOHEADER* pbi )
{
switch ( pbi->biCompression )

View File

@ -25,6 +25,7 @@ BOOL QUARTZ_MediaSubType_IsFourCC(
HRESULT QUARTZ_MediaSubType_FromBitmap(
GUID* psubtype, const BITMAPINFOHEADER* pbi );
void QUARTZ_PatchBitmapInfoHeader( BITMAPINFOHEADER* pbi );
BOOL QUARTZ_BitmapHasFixedSample( const BITMAPINFOHEADER* pbi );

View File

@ -18,6 +18,7 @@
#include "strmif.h"
#include "control.h"
#include "vfwmsgs.h"
#include "evcode.h"
#include "uuids.h"
#include "debugtools.h"
@ -28,7 +29,6 @@ DEFAULT_DEBUG_CHANNEL(quartz);
#include "mtype.h"
#include "memalloc.h"
#define QUARTZ_MSG_FLUSH (WM_APP+1)
#define QUARTZ_MSG_EXITTHREAD (WM_APP+2)
#define QUARTZ_MSG_SEEK (WM_APP+3)
@ -37,6 +37,372 @@ void CParserOutPinImpl_UninitIMediaSeeking( CParserOutPinImpl* This );
HRESULT CParserOutPinImpl_InitIMediaPosition( CParserOutPinImpl* This );
void CParserOutPinImpl_UninitIMediaPosition( CParserOutPinImpl* This );
/***************************************************************************
*
* CParserImpl internal thread
*
*/
static
void CParserImplThread_ClearAllRequests( CParserImpl* This )
{
ULONG nIndex;
TRACE("(%p)\n",This);
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
This->m_ppOutPins[nIndex]->m_bReqUsed = FALSE;
This->m_ppOutPins[nIndex]->m_pReqSample = NULL;
}
}
static
void CParserImplThread_ReleaseAllRequests( CParserImpl* This )
{
ULONG nIndex;
TRACE("(%p)\n",This);
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
if ( This->m_ppOutPins[nIndex]->m_bReqUsed )
{
if ( This->m_ppOutPins[nIndex]->m_pReqSample != NULL )
{
IMediaSample_Release(This->m_ppOutPins[nIndex]->m_pReqSample);
This->m_ppOutPins[nIndex]->m_pReqSample = NULL;
}
This->m_ppOutPins[nIndex]->m_bReqUsed = FALSE;
}
}
}
static
BOOL CParserImplThread_HasPendingSamples( CParserImpl* This )
{
ULONG nIndex;
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
if ( This->m_ppOutPins[nIndex]->m_bReqUsed &&
This->m_ppOutPins[nIndex]->m_pReqSample != NULL )
return TRUE;
}
return FALSE;
}
static
HRESULT CParserImplThread_FlushAllPendingSamples( CParserImpl* This )
{
HRESULT hr;
IMediaSample* pSample;
DWORD_PTR dwContext;
TRACE("(%p)\n",This);
/* remove all samples from queue. */
hr = IAsyncReader_BeginFlush(This->m_pReader);
if ( FAILED(hr) )
return hr;
IAsyncReader_EndFlush(This->m_pReader);
/* remove all processed samples from queue. */
while ( 1 )
{
hr = IAsyncReader_WaitForNext(This->m_pReader,0,&pSample,&dwContext);
if ( hr != S_OK )
break;
}
CParserImplThread_ReleaseAllRequests(This);
return NOERROR;
}
static HRESULT CParserImplThread_SendEndOfStream( CParserImpl* This )
{
ULONG nIndex;
HRESULT hr;
HRESULT hrRet;
CParserOutPinImpl* pOutPin;
TRACE("(%p)\n",This);
if ( This->m_bSendEOS )
return NOERROR;
This->m_bSendEOS = TRUE;
hrRet = S_OK;
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
pOutPin = This->m_ppOutPins[nIndex];
hr = CPinBaseImpl_SendEndOfStream(&pOutPin->pin);
if ( FAILED(hr) )
{
if ( SUCCEEDED(hrRet) )
hrRet = hr;
}
else
{
if ( hr != S_OK && hrRet == S_OK )
hrRet = hr;
}
}
return hrRet;
}
static HRESULT CParserImplThread_SendFlush( CParserImpl* This )
{
ULONG nIndex;
HRESULT hr;
HRESULT hrRet;
CParserOutPinImpl* pOutPin;
TRACE("(%p)\n",This);
hrRet = S_OK;
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
pOutPin = This->m_ppOutPins[nIndex];
hr = CPinBaseImpl_SendBeginFlush(&pOutPin->pin);
if ( FAILED(hr) )
{
if ( SUCCEEDED(hrRet) )
hrRet = hr;
}
else
{
if ( hr != S_OK && hrRet == S_OK )
hrRet = hr;
hr = CPinBaseImpl_SendEndFlush(&pOutPin->pin);
if ( FAILED(hr) )
hrRet = hr;
}
}
return hrRet;
}
static void CParserImplThread_ErrorAbort( CParserImpl* This, HRESULT hr )
{
CBaseFilterImpl_MediaEventNotify(
&This->basefilter,EC_ERRORABORT,(LONG_PTR)hr,(LONG_PTR)0);
CParserImplThread_SendEndOfStream(This);
}
static
HRESULT CParserImplThread_ProcessNextSample( CParserImpl* This )
{
IMediaSample* pSample;
DWORD_PTR dwContext;
ULONG nIndex;
HRESULT hr;
CParserOutPinImpl* pOutPin;
MSG msg;
while ( 1 )
{
if ( PeekMessageA( &msg, (HWND)NULL, 0, 0, PM_REMOVE ) )
{
hr = NOERROR;
switch ( msg.message )
{
case QUARTZ_MSG_EXITTHREAD:
TRACE("(%p) EndThread\n",This);
CParserImplThread_FlushAllPendingSamples(This);
CParserImplThread_ClearAllRequests(This);
CParserImplThread_SendFlush(This);
CParserImplThread_SendEndOfStream(This);
TRACE("(%p) exit thread\n",This);
return S_FALSE;
case QUARTZ_MSG_SEEK:
FIXME("(%p) Seek\n",This);
CParserImplThread_FlushAllPendingSamples(This);
hr = CParserImplThread_SendFlush(This);
CParserImplThread_SendEndOfStream(This);
/* FIXME - process seeking. */
/* FIXME - Send NewSegment. */
break;
default:
FIXME( "invalid message %04u\n", (unsigned)msg.message );
hr = E_FAIL;
CParserImplThread_ErrorAbort(This,hr);
}
return hr;
}
hr = IAsyncReader_WaitForNext(This->m_pReader,PARSER_POLL_INTERVAL,&pSample,&dwContext);
nIndex = (ULONG)dwContext;
if ( hr != VFW_E_TIMEOUT )
break;
}
if ( FAILED(hr) )
{
CParserImplThread_ErrorAbort(This,hr);
return hr;
}
pOutPin = This->m_ppOutPins[nIndex];
if ( pOutPin != NULL && pOutPin->m_bReqUsed )
{
if ( This->m_pHandler->pProcessSample != NULL )
hr = This->m_pHandler->pProcessSample(This,nIndex,pOutPin->m_llReqStart,pOutPin->m_lReqLength,pOutPin->m_pReqSample);
if ( SUCCEEDED(hr) )
{
if ( pOutPin->m_pOutPinAllocator != NULL &&
pOutPin->m_pOutPinAllocator != This->m_pAllocator )
{
/* if pin has its own allocator, sample must be copied */
hr = IMemAllocator_GetBuffer( This->m_pAllocator, &pSample, NULL, NULL, 0 );
if ( SUCCEEDED(hr) )
{
hr = QUARTZ_IMediaSample_Copy(
pSample, pOutPin->m_pReqSample, TRUE );
if ( SUCCEEDED(hr) )
hr = CPinBaseImpl_SendSample(&pOutPin->pin,pSample);
IMediaSample_Release(pSample);
}
}
else
{
hr = CPinBaseImpl_SendSample(&pOutPin->pin,pOutPin->m_pReqSample);
}
}
if ( FAILED(hr) )
CParserImplThread_ErrorAbort(This,hr);
IMediaSample_Release(pOutPin->m_pReqSample);
pOutPin->m_pReqSample = NULL;
pOutPin->m_bReqUsed = FALSE;
}
if ( SUCCEEDED(hr) )
hr = NOERROR;
TRACE("return %08lx\n",hr);
return hr;
}
static
DWORD WINAPI CParserImplThread_Entry( LPVOID pv )
{
CParserImpl* This = (CParserImpl*)pv;
BOOL bReqNext;
ULONG nIndex = 0;
HRESULT hr;
REFERENCE_TIME rtSampleTimeStart, rtSampleTimeEnd;
LONGLONG llReqStart;
LONG lReqLength;
REFERENCE_TIME rtReqStart, rtReqStop;
IMediaSample* pSample;
MSG msg;
/* initialize the message queue. */
PeekMessageA( &msg, (HWND)NULL, 0, 0, PM_NOREMOVE );
CParserImplThread_ClearAllRequests(This);
/* resume the owner thread. */
SetEvent( This->m_hEventInit );
TRACE( "Enter message loop.\n" );
bReqNext = TRUE;
while ( 1 )
{
if ( bReqNext )
{
/* Get the next request. */
hr = This->m_pHandler->pGetNextRequest( This, &nIndex, &llReqStart, &lReqLength, &rtReqStart, &rtReqStop );
if ( FAILED(hr) )
{
CParserImplThread_ErrorAbort(This,hr);
break;
}
if ( hr != S_OK )
{
/* Flush pending samples. */
hr = S_OK;
while ( CParserImplThread_HasPendingSamples(This) )
{
hr = CParserImplThread_ProcessNextSample(This);
if ( hr != S_OK )
break;
}
if ( hr != S_OK )
{
/* notification is already sent */
break;
}
/* Send End Of Stream. */
hr = CParserImplThread_SendEndOfStream(This);
if ( hr != S_OK )
{
/* notification is already sent */
break;
}
/* Blocking... */
hr = CParserImplThread_ProcessNextSample(This);
if ( hr != S_OK )
{
/* notification is already sent */
break;
}
continue;
}
if ( This->m_ppOutPins[nIndex]->pin.pPinConnectedTo == NULL )
continue;
rtSampleTimeStart = This->basefilter.rtStart + llReqStart * QUARTZ_TIMEUNITS;
rtSampleTimeEnd = (llReqStart + lReqLength) * QUARTZ_TIMEUNITS;
bReqNext = FALSE;
}
if ( !This->m_ppOutPins[nIndex]->m_bReqUsed )
{
hr = IMemAllocator_GetBuffer( This->m_pAllocator, &pSample, NULL, NULL, 0 );
if ( FAILED(hr) )
{
CParserImplThread_ErrorAbort(This,hr);
break;
}
hr = IMediaSample_SetTime(pSample,&rtSampleTimeStart,&rtSampleTimeEnd);
if ( SUCCEEDED(hr) )
hr = IAsyncReader_Request(This->m_pReader,pSample,nIndex);
if ( FAILED(hr) )
{
CParserImplThread_ErrorAbort(This,hr);
break;
}
This->m_ppOutPins[nIndex]->m_bReqUsed = TRUE;
This->m_ppOutPins[nIndex]->m_pReqSample = pSample;
This->m_ppOutPins[nIndex]->m_llReqStart = llReqStart;
This->m_ppOutPins[nIndex]->m_lReqLength = lReqLength;
This->m_ppOutPins[nIndex]->m_rtReqStart = rtSampleTimeStart;
This->m_ppOutPins[nIndex]->m_rtReqStop = rtSampleTimeEnd;
bReqNext = TRUE;
continue;
}
hr = CParserImplThread_ProcessNextSample(This);
if ( hr != S_OK )
{
/* notification is already sent */
break;
}
}
return 0;
}
/***************************************************************************
*
* CParserImpl internal methods
@ -126,358 +492,6 @@ void CParserImpl_ReleaseListOfOutPins( CParserImpl* This )
QUARTZ_CompList_Unlock( This->basefilter.pOutPins );
}
static
void CParserImpl_ClearAllRequests( CParserImpl* This )
{
ULONG nIndex;
TRACE("(%p)\n",This);
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
This->m_ppOutPins[nIndex]->m_bReqUsed = FALSE;
This->m_ppOutPins[nIndex]->m_pReqSample = NULL;
}
}
static
void CParserImpl_ReleaseAllRequests( CParserImpl* This )
{
ULONG nIndex;
TRACE("(%p)\n",This);
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
if ( This->m_ppOutPins[nIndex]->m_bReqUsed )
{
if ( This->m_ppOutPins[nIndex]->m_pReqSample != NULL )
{
IMediaSample_Release(This->m_ppOutPins[nIndex]->m_pReqSample);
This->m_ppOutPins[nIndex]->m_pReqSample = NULL;
}
This->m_ppOutPins[nIndex]->m_bReqUsed = FALSE;
}
}
}
static
BOOL CParserImpl_HasPendingSamples( CParserImpl* This )
{
ULONG nIndex;
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
if ( This->m_ppOutPins[nIndex]->m_bReqUsed &&
This->m_ppOutPins[nIndex]->m_pReqSample != NULL )
return TRUE;
}
return FALSE;
}
static
HRESULT CParserImpl_FlushAllPendingSamples( CParserImpl* This )
{
HRESULT hr;
IMediaSample* pSample;
DWORD_PTR dwContext;
TRACE("(%p)\n",This);
/* remove all samples from queue */
hr = IAsyncReader_BeginFlush(This->m_pReader);
if ( FAILED(hr) )
return hr;
IAsyncReader_EndFlush(This->m_pReader);
while ( 1 )
{
hr = IAsyncReader_WaitForNext(This->m_pReader,0,&pSample,&dwContext);
if ( hr != S_OK )
break;
}
CParserImpl_ReleaseAllRequests(This);
return NOERROR;
}
static HRESULT CParserImpl_SendEndOfStream( CParserImpl* This )
{
ULONG nIndex;
HRESULT hr;
HRESULT hrRet;
CParserOutPinImpl* pOutPin;
TRACE("(%p)\n",This);
if ( This->m_bSendEOS )
return NOERROR;
This->m_bSendEOS = TRUE;
hrRet = S_OK;
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
pOutPin = This->m_ppOutPins[nIndex];
hr = CPinBaseImpl_SendEndOfStream(&pOutPin->pin);
if ( FAILED(hr) )
{
if ( SUCCEEDED(hrRet) )
hrRet = hr;
}
else
{
if ( hr != S_OK && hrRet == S_OK )
hrRet = hr;
}
}
return hrRet;
}
static HRESULT CParserImpl_SendFlush( CParserImpl* This )
{
ULONG nIndex;
HRESULT hr;
HRESULT hrRet;
CParserOutPinImpl* pOutPin;
TRACE("(%p)\n",This);
hrRet = S_OK;
for ( nIndex = 0; nIndex < This->m_cOutStreams; nIndex++ )
{
pOutPin = This->m_ppOutPins[nIndex];
hr = CPinBaseImpl_SendBeginFlush(&pOutPin->pin);
if ( FAILED(hr) )
{
if ( SUCCEEDED(hrRet) )
hrRet = hr;
}
else
{
if ( hr != S_OK && hrRet == S_OK )
hrRet = hr;
hr = CPinBaseImpl_SendEndFlush(&pOutPin->pin);
if ( FAILED(hr) )
hrRet = hr;
}
}
return hrRet;
}
static
HRESULT CParserImpl_ProcessNextSample( CParserImpl* This )
{
IMediaSample* pSample;
DWORD_PTR dwContext;
ULONG nIndex;
HRESULT hr;
CParserOutPinImpl* pOutPin;
MSG msg;
while ( 1 )
{
if ( PeekMessageA( &msg, (HWND)NULL, 0, 0, PM_REMOVE ) )
{
hr = NOERROR;
switch ( msg.message )
{
case QUARTZ_MSG_FLUSH:
TRACE("Flush\n");
CParserImpl_FlushAllPendingSamples(This);
hr = CParserImpl_SendFlush(This);
break;
case QUARTZ_MSG_EXITTHREAD:
TRACE("(%p) EndThread\n",This);
CParserImpl_FlushAllPendingSamples(This);
CParserImpl_ClearAllRequests(This);
CParserImpl_SendFlush(This);
CParserImpl_SendEndOfStream(This);
TRACE("(%p) exit thread\n",This);
return S_FALSE;
case QUARTZ_MSG_SEEK:
FIXME("Seek\n");
CParserImpl_FlushAllPendingSamples(This);
break;
default:
FIXME( "invalid message %04u\n", (unsigned)msg.message );
/* Notify (ABORT) */
hr = E_FAIL;
}
return hr;
}
hr = IAsyncReader_WaitForNext(This->m_pReader,PARSER_POLL_INTERVAL,&pSample,&dwContext);
nIndex = (ULONG)dwContext;
if ( hr != VFW_E_TIMEOUT )
break;
}
if ( FAILED(hr) )
{
return hr;
}
pOutPin = This->m_ppOutPins[nIndex];
if ( pOutPin != NULL && pOutPin->m_bReqUsed )
{
if ( This->m_pHandler->pProcessSample != NULL )
hr = This->m_pHandler->pProcessSample(This,nIndex,pOutPin->m_llReqStart,pOutPin->m_lReqLength,pOutPin->m_pReqSample);
if ( SUCCEEDED(hr) )
{
if ( pOutPin->m_pOutPinAllocator != NULL &&
pOutPin->m_pOutPinAllocator != This->m_pAllocator )
{
/* if pin has its own allocator, sample must be copied */
hr = IMemAllocator_GetBuffer( This->m_pAllocator, &pSample, NULL, NULL, 0 );
if ( SUCCEEDED(hr) )
{
hr = QUARTZ_IMediaSample_Copy(
pSample, pOutPin->m_pReqSample, TRUE );
if ( SUCCEEDED(hr) )
hr = CPinBaseImpl_SendSample(&pOutPin->pin,pSample);
IMediaSample_Release(pSample);
}
}
else
{
hr = CPinBaseImpl_SendSample(&pOutPin->pin,pOutPin->m_pReqSample);
}
}
if ( FAILED(hr) )
{
/* Notify (ABORT) */
}
IMediaSample_Release(pOutPin->m_pReqSample);
pOutPin->m_pReqSample = NULL;
pOutPin->m_bReqUsed = FALSE;
}
if ( SUCCEEDED(hr) )
hr = NOERROR;
TRACE("return %08lx\n",hr);
return hr;
}
static
DWORD WINAPI CParserImpl_ThreadEntry( LPVOID pv )
{
CParserImpl* This = (CParserImpl*)pv;
BOOL bReqNext;
ULONG nIndex = 0;
HRESULT hr;
REFERENCE_TIME rtSampleTimeStart, rtSampleTimeEnd;
LONGLONG llReqStart;
LONG lReqLength;
REFERENCE_TIME rtReqStart, rtReqStop;
IMediaSample* pSample;
MSG msg;
/* initialize the message queue. */
PeekMessageA( &msg, (HWND)NULL, 0, 0, PM_NOREMOVE );
CParserImpl_ClearAllRequests(This);
/* resume the owner thread. */
SetEvent( This->m_hEventInit );
TRACE( "Enter message loop.\n" );
bReqNext = TRUE;
while ( 1 )
{
if ( bReqNext )
{
/* Get the next request. */
hr = This->m_pHandler->pGetNextRequest( This, &nIndex, &llReqStart, &lReqLength, &rtReqStart, &rtReqStop );
if ( FAILED(hr) )
{
/* Notify (ABORT) */
break;
}
if ( hr != S_OK )
{
/* Flush pending samples. */
hr = S_OK;
while ( CParserImpl_HasPendingSamples(This) )
{
hr = CParserImpl_ProcessNextSample(This);
if ( hr != S_OK )
break;
}
if ( hr != S_OK )
{
/* notification is already sent */
break;
}
/* Send End Of Stream. */
hr = CParserImpl_SendEndOfStream(This);
if ( hr != S_OK )
{
/* notification is already sent */
break;
}
/* Blocking... */
hr = CParserImpl_ProcessNextSample(This);
if ( hr != S_OK )
{
/* notification is already sent */
break;
}
continue;
}
if ( This->m_ppOutPins[nIndex]->pin.pPinConnectedTo == NULL )
continue;
rtSampleTimeStart = This->basefilter.rtStart + llReqStart * QUARTZ_TIMEUNITS;
rtSampleTimeEnd = (llReqStart + lReqLength) * QUARTZ_TIMEUNITS;
bReqNext = FALSE;
}
if ( !This->m_ppOutPins[nIndex]->m_bReqUsed )
{
hr = IMemAllocator_GetBuffer( This->m_pAllocator, &pSample, NULL, NULL, 0 );
if ( FAILED(hr) )
{
/* Notify (ABORT) */
break;
}
hr = IMediaSample_SetTime(pSample,&rtSampleTimeStart,&rtSampleTimeEnd);
if ( SUCCEEDED(hr) )
hr = IAsyncReader_Request(This->m_pReader,pSample,nIndex);
if ( FAILED(hr) )
{
/* Notify (ABORT) */
break;
}
This->m_ppOutPins[nIndex]->m_bReqUsed = TRUE;
This->m_ppOutPins[nIndex]->m_pReqSample = pSample;
This->m_ppOutPins[nIndex]->m_llReqStart = llReqStart;
This->m_ppOutPins[nIndex]->m_lReqLength = lReqLength;
This->m_ppOutPins[nIndex]->m_rtReqStart = rtSampleTimeStart;
This->m_ppOutPins[nIndex]->m_rtReqStop = rtSampleTimeEnd;
bReqNext = TRUE;
continue;
}
hr = CParserImpl_ProcessNextSample(This);
if ( hr != S_OK )
{
/* notification is already sent */
break;
}
}
return 0;
}
static
HRESULT CParserImpl_BeginThread( CParserImpl* This )
@ -496,7 +510,7 @@ HRESULT CParserImpl_BeginThread( CParserImpl* This )
/* create the processing thread. */
This->m_hThread = CreateThread(
NULL, 0,
CParserImpl_ThreadEntry,
CParserImplThread_Entry,
(LPVOID)This,
0, &This->m_dwThreadId );
if ( This->m_hThread == (HANDLE)NULL )

View File

@ -23,7 +23,7 @@ DEFAULT_DEBUG_CHANNEL(quartz);
#define NUMELEMS(elem) (sizeof(elem)/sizeof((elem)[0]))
#endif /* NUMELEMS */
const WCHAR QUARTZ_wszREG_SZ[] =
const WCHAR QUARTZ_wszREG_SZ[7] =
{'R','E','G','_','S','Z',0};
const WCHAR QUARTZ_wszInprocServer32[] =
{'I','n','p','r','o','c','S','e','r','v','e','r','3','2',0};
@ -34,15 +34,22 @@ const WCHAR QUARTZ_wszBoth[] =
const WCHAR QUARTZ_wszCLSID[] =
{'C','L','S','I','D',0};
const WCHAR QUARTZ_wszFilterData[] =
{'F','i','l','t','e','r',' ','D','a','t','a',0};
{'F','i','l','t','e','r','D','a','t','a',0};
const WCHAR QUARTZ_wszFriendlyName[] =
{'F','r','i','e','n','d','l','y','N','a','m','e',0};
const WCHAR QUARTZ_wszInstance[] =
{'I','n','s','t','a','n','c','e',0};
const WCHAR QUARTZ_wszMerit[] =
{'M','e','r','i','t',0};
const WCHAR QUARTZ_wszMediaType[] =
{'M','e','d','i','a',' ','T','y','p','e',0};
const WCHAR QUARTZ_wszSubType[] =
{'S','u','b','T','y','p','e',0};
const WCHAR QUARTZ_wszExtensions[] =
{'E','x','t','e','n','s','i','o','n','s',0};
const WCHAR QUARTZ_wszSourceFilter[] =
{'S','o','u','r','c','e',' ','F','i','l','t','e','r',0};
static
void QUARTZ_CatPathSepW( WCHAR* pBuf )
{
int len = lstrlenW(pBuf);
@ -50,7 +57,6 @@ void QUARTZ_CatPathSepW( WCHAR* pBuf )
pBuf[len+1] = 0;
}
static
void QUARTZ_GUIDtoString( WCHAR* pBuf, const GUID* pguid )
{
/* W"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}" */
@ -367,4 +373,3 @@ HRESULT QUARTZ_RegisterAMovieFilter(
}

View File

@ -7,7 +7,7 @@
#ifndef QUARTZ_REGSVR_H
#define QUARTZ_REGSVR_H
extern const WCHAR QUARTZ_wszREG_SZ[];
extern const WCHAR QUARTZ_wszREG_SZ[7];
extern const WCHAR QUARTZ_wszInprocServer32[];
extern const WCHAR QUARTZ_wszThreadingModel[];
extern const WCHAR QUARTZ_wszBoth[];
@ -16,8 +16,15 @@ extern const WCHAR QUARTZ_wszFilterData[];
extern const WCHAR QUARTZ_wszFriendlyName[];
extern const WCHAR QUARTZ_wszInstance[];
extern const WCHAR QUARTZ_wszMerit[];
extern const WCHAR QUARTZ_wszMediaType[];
extern const WCHAR QUARTZ_wszSubType[];
extern const WCHAR QUARTZ_wszExtensions[];
extern const WCHAR QUARTZ_wszSourceFilter[];
void QUARTZ_CatPathSepW( WCHAR* pBuf );
void QUARTZ_GUIDtoString( WCHAR* pBuf, const GUID* pguid );
HRESULT QUARTZ_CreateCLSIDPath(
WCHAR* pwszBuf, DWORD dwBufLen,
const CLSID* pclsid,

View File

@ -352,7 +352,9 @@ IMediaPosition_fnget_Duration(IMediaPosition* iface,REFTIME* prefTime)
TRACE("(%p)->()\n",This);
return IMediaPosition_get_Duration(pPos,prefTime);
hr = IMediaPosition_get_Duration(pPos,prefTime);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -363,7 +365,9 @@ IMediaPosition_fnput_CurrentPosition(IMediaPosition* iface,REFTIME refTime)
TRACE("(%p)->()\n",This);
return IMediaPosition_put_CurrentPosition(pPos,refTime);
hr = IMediaPosition_put_CurrentPosition(pPos,refTime);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -374,7 +378,9 @@ IMediaPosition_fnget_CurrentPosition(IMediaPosition* iface,REFTIME* prefTime)
TRACE("(%p)->()\n",This);
return IMediaPosition_get_CurrentPosition(pPos,prefTime);
hr = IMediaPosition_get_CurrentPosition(pPos,prefTime);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -385,7 +391,9 @@ IMediaPosition_fnget_StopTime(IMediaPosition* iface,REFTIME* prefTime)
TRACE("(%p)->()\n",This);
return IMediaPosition_get_StopTime(pPos,prefTime);
hr = IMediaPosition_get_StopTime(pPos,prefTime);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -396,7 +404,9 @@ IMediaPosition_fnput_StopTime(IMediaPosition* iface,REFTIME refTime)
TRACE("(%p)->()\n",This);
return IMediaPosition_put_StopTime(pPos,refTime);
hr = IMediaPosition_put_StopTime(pPos,refTime);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -407,7 +417,9 @@ IMediaPosition_fnget_PrerollTime(IMediaPosition* iface,REFTIME* prefTime)
TRACE("(%p)->()\n",This);
return IMediaPosition_get_PrerollTime(pPos,prefTime);
hr = IMediaPosition_get_PrerollTime(pPos,prefTime);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -418,7 +430,9 @@ IMediaPosition_fnput_PrerollTime(IMediaPosition* iface,REFTIME refTime)
TRACE("(%p)->()\n",This);
return IMediaPosition_put_PrerollTime(pPos,refTime);
hr = IMediaPosition_put_PrerollTime(pPos,refTime);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -429,7 +443,9 @@ IMediaPosition_fnput_Rate(IMediaPosition* iface,double dblRate)
TRACE("(%p)->()\n",This);
return IMediaPosition_put_Rate(pPos,dblRate);
hr = IMediaPosition_put_Rate(pPos,dblRate);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -440,7 +456,9 @@ IMediaPosition_fnget_Rate(IMediaPosition* iface,double* pdblRate)
TRACE("(%p)->()\n",This);
return IMediaPosition_get_Rate(pPos,pdblRate);
hr = IMediaPosition_get_Rate(pPos,pdblRate);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -451,7 +469,9 @@ IMediaPosition_fnCanSeekForward(IMediaPosition* iface,LONG* pCanSeek)
TRACE("(%p)->()\n",This);
return IMediaPosition_CanSeekForward(pPos,pCanSeek);
hr = IMediaPosition_CanSeekForward(pPos,pCanSeek);
IMediaPosition_Release(pPos);
return hr;
}
static HRESULT WINAPI
@ -462,7 +482,9 @@ IMediaPosition_fnCanSeekBackward(IMediaPosition* iface,LONG* pCanSeek)
TRACE("(%p)->()\n",This);
return IMediaPosition_CanSeekBackward(pPos,pCanSeek);
hr = IMediaPosition_CanSeekBackward(pPos,pCanSeek);
IMediaPosition_Release(pPos);
return hr;
}
@ -561,7 +583,9 @@ IMediaSeeking_fnGetCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetCapabilities(pSeek,pdwCaps);
hr = IMediaSeeking_GetCapabilities(pSeek,pdwCaps);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -572,7 +596,9 @@ IMediaSeeking_fnCheckCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
TRACE("(%p)->()\n",This);
return IMediaSeeking_CheckCapabilities(pSeek,pdwCaps);
hr = IMediaSeeking_CheckCapabilities(pSeek,pdwCaps);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -583,7 +609,9 @@ IMediaSeeking_fnIsFormatSupported(IMediaSeeking* iface,const GUID* pidFormat)
TRACE("(%p)->()\n",This);
return IMediaSeeking_IsFormatSupported(pSeek,pidFormat);
hr = IMediaSeeking_IsFormatSupported(pSeek,pidFormat);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -594,7 +622,9 @@ IMediaSeeking_fnQueryPreferredFormat(IMediaSeeking* iface,GUID* pidFormat)
TRACE("(%p)->()\n",This);
return IMediaSeeking_QueryPreferredFormat(pSeek,pidFormat);
hr = IMediaSeeking_QueryPreferredFormat(pSeek,pidFormat);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -605,7 +635,9 @@ IMediaSeeking_fnGetTimeFormat(IMediaSeeking* iface,GUID* pidFormat)
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetTimeFormat(pSeek,pidFormat);
hr = IMediaSeeking_GetTimeFormat(pSeek,pidFormat);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -616,7 +648,9 @@ IMediaSeeking_fnIsUsingTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
TRACE("(%p)->()\n",This);
return IMediaSeeking_IsUsingTimeFormat(pSeek,pidFormat);
hr = IMediaSeeking_IsUsingTimeFormat(pSeek,pidFormat);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -627,7 +661,9 @@ IMediaSeeking_fnSetTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
TRACE("(%p)->()\n",This);
return IMediaSeeking_SetTimeFormat(pSeek,pidFormat);
hr = IMediaSeeking_SetTimeFormat(pSeek,pidFormat);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -638,7 +674,9 @@ IMediaSeeking_fnGetDuration(IMediaSeeking* iface,LONGLONG* pllDuration)
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetDuration(pSeek,pllDuration);
hr = IMediaSeeking_GetDuration(pSeek,pllDuration);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -649,7 +687,9 @@ IMediaSeeking_fnGetStopPosition(IMediaSeeking* iface,LONGLONG* pllPos)
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetStopPosition(pSeek,pllPos);
hr = IMediaSeeking_GetStopPosition(pSeek,pllPos);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -660,7 +700,9 @@ IMediaSeeking_fnGetCurrentPosition(IMediaSeeking* iface,LONGLONG* pllPos)
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetCurrentPosition(pSeek,pllPos);
hr = IMediaSeeking_GetCurrentPosition(pSeek,pllPos);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -671,7 +713,9 @@ IMediaSeeking_fnConvertTimeFormat(IMediaSeeking* iface,LONGLONG* pllOut,const GU
TRACE("(%p)->()\n",This);
return IMediaSeeking_ConvertTimeFormat(pSeek,pllOut,pidFmtOut,llIn,pidFmtIn);
hr = IMediaSeeking_ConvertTimeFormat(pSeek,pllOut,pidFmtOut,llIn,pidFmtIn);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -682,7 +726,9 @@ IMediaSeeking_fnSetPositions(IMediaSeeking* iface,LONGLONG* pllCur,DWORD dwCurFl
TRACE("(%p)->()\n",This);
return IMediaSeeking_SetPositions(pSeek,pllCur,dwCurFlags,pllStop,dwStopFlags);
hr = IMediaSeeking_SetPositions(pSeek,pllCur,dwCurFlags,pllStop,dwStopFlags);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -693,7 +739,9 @@ IMediaSeeking_fnGetPositions(IMediaSeeking* iface,LONGLONG* pllCur,LONGLONG* pll
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetPositions(pSeek,pllCur,pllStop);
hr = IMediaSeeking_GetPositions(pSeek,pllCur,pllStop);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -704,7 +752,9 @@ IMediaSeeking_fnGetAvailable(IMediaSeeking* iface,LONGLONG* pllFirst,LONGLONG* p
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetAvailable(pSeek,pllFirst,pllLast);
hr = IMediaSeeking_GetAvailable(pSeek,pllFirst,pllLast);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -715,7 +765,9 @@ IMediaSeeking_fnSetRate(IMediaSeeking* iface,double dblRate)
TRACE("(%p)->()\n",This);
return IMediaSeeking_SetRate(pSeek,dblRate);
hr = IMediaSeeking_SetRate(pSeek,dblRate);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -726,7 +778,9 @@ IMediaSeeking_fnGetRate(IMediaSeeking* iface,double* pdblRate)
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetRate(pSeek,pdblRate);
hr = IMediaSeeking_GetRate(pSeek,pdblRate);
IMediaSeeking_Release(pSeek);
return hr;
}
static HRESULT WINAPI
@ -737,7 +791,9 @@ IMediaSeeking_fnGetPreroll(IMediaSeeking* iface,LONGLONG* pllPreroll)
TRACE("(%p)->()\n",This);
return IMediaSeeking_GetPreroll(pSeek,pllPreroll);
hr = IMediaSeeking_GetPreroll(pSeek,pllPreroll);
IMediaSeeking_Release(pSeek);
return hr;
}

View File

@ -187,8 +187,9 @@ static HWND VIDREN_Create( HWND hwndOwner, CVideoRendererImpl* This )
HINSTANCE hInst = (HINSTANCE)GetModuleHandleA(NULL);
const VIDEOINFOHEADER* pinfo;
DWORD dwExStyle = 0;
DWORD dwStyle = WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
DWORD dwStyle = WS_POPUP|WS_CAPTION|WS_CLIPCHILDREN;
RECT rcWnd;
HWND hwnd;
if ( !VIDREN_Register( hInst ) )
return (HWND)NULL;
@ -206,14 +207,18 @@ static HWND VIDREN_Create( HWND hwndOwner, CVideoRendererImpl* This )
TRACE("window width %d,height %d\n",
rcWnd.right-rcWnd.left,rcWnd.bottom-rcWnd.top);
return CreateWindowExA(
hwnd = CreateWindowExA(
dwExStyle,
VIDREN_szWndClass, VIDREN_szWndName,
dwStyle | WS_VISIBLE,
dwStyle,
100,100, /* FIXME */
rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top,
hwndOwner, (HMENU)NULL,
hInst, (LPVOID)This );
if ( hwnd != (HWND)NULL )
ShowWindow(hwnd,SW_SHOW);
return hwnd;
}
static DWORD WINAPI VIDREN_ThreadEntry( LPVOID pv )

View File

@ -284,6 +284,8 @@ static HRESULT CWavParseImpl_InitAU( CParserImpl* pImpl, CWavParseImpl* This )
This->llDataStart = dataofs;
This->llBytesTotal = datalen;
TRACE("offset %lu, length %lu\n",dataofs,datalen);
return NOERROR;
}
@ -460,7 +462,7 @@ static HRESULT CWavParseImpl_GetNextRequest( CParserImpl* pImpl, ULONG* pnStream
llAvail = This->llBytesTotal - This->llBytesProcessed;
if ( llAvail > (LONGLONG)This->dwBlockSize )
llAvail = (LONGLONG)This->dwBlockSize;
llStart = This->llBytesProcessed;
llStart = This->llDataStart + This->llBytesProcessed;
llEnd = llStart + llAvail;
This->llBytesProcessed = llEnd;

View File

@ -306,6 +306,7 @@
[HKEY_CLASSES_ROOT\CLSID\{DA4E3DA0-D07D-11D0-BD50-00A0C911CE86}\Instance\{083863F1-70DE-11D0-BD40-00A0C911CE86}]
"CLSID"="{083863F1-70DE-11D0-BD40-00A0C911CE86}"
"FriendlyName"="DirectShow Filters"
"Merit"=dword:00600000
[HKEY_CLASSES_ROOT\CLSID\{DA4E3DA0-D07D-11D0-BD50-00A0C911CE86}\Instance\{33D9A760-90C8-11D0-BD43-00A0C911CE86}]
"CLSID"="{33D9A760-90C8-11D0-BD43-00A0C911CE86}"
@ -322,6 +323,7 @@
[HKEY_CLASSES_ROOT\CLSID\{DA4E3DA0-D07D-11D0-BD50-00A0C911CE86}\Instance\{4EFE2452-168A-11D1-BC76-00C04FB9453B}]
"CLSID"="{4EFE2452-168A-11D1-BC76-00C04FB9453B}"
"FriendlyName"="Midi Renderers"
"Merit"=dword:00600000
[HKEY_CLASSES_ROOT\CLSID\{DA4E3DA0-D07D-11D0-BD50-00A0C911CE86}\Instance\{860BB310-5D01-11D0-BD3B-00A0C911CE86}]
"CLSID"="{860BB310-5D01-11D0-BD3B-00A0C911CE86}"
@ -338,20 +340,25 @@
[HKEY_CLASSES_ROOT\CLSID\{DA4E3DA0-D07D-11D0-BD50-00A0C911CE86}\Instance\{E0F158E1-CB04-11D0-BD4E-00A0C911CE86}]
"CLSID"="{E0F158E1-CB04-11D0-BD4E-00A0C911CE86}"
"FriendlyName"="Audio Renderers"
"Merit"=dword:00600000
# CLSID_AudioRender
[HKEY_CLASSES_ROOT\CLSID\{e30629d1-27e5-11ce-875d-00608cb78066}]
@="Audio Renderer"
[HKEY_CLASSES_ROOT\CLSID\{e30629d1-27e5-11ce-875d-00608cb78066}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
[HKEY_CLASSES_ROOT\CLSID\{E0F158E1-CB04-11D0-BD4E-00A0C911CE86}\Instance\{e30629d1-27e5-11ce-875d-00608cb78066}]
"CLSID"="{e30629d1-27e5-11ce-875d-00608cb78066}"
# FriendlyName seems to be the driver name and to be generated dynamically.
"FriendlyName"="Waveout audio renderer"
# CLSID_VideoRenderer
[HKEY_CLASSES_ROOT\CLSID\{70e102b0-5556-11ce-97c0-00aa0055595a}]
@="Video Renderer"
[HKEY_CLASSES_ROOT\CLSID\{70e102b0-5556-11ce-97c0-00aa0055595a}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
@ -362,6 +369,8 @@
# Wave Parser
[HKEY_CLASSES_ROOT\CLSID\{D51BD5A1-7548-11CF-A520-0080C77EF58A}]
@="Wave Parser"
[HKEY_CLASSES_ROOT\CLSID\{D51BD5A1-7548-11CF-A520-0080C77EF58A}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
@ -370,8 +379,10 @@
"CLSID"="{D51BD5A1-7548-11CF-A520-0080C77EF58A}"
"FriendlyName"="Wave Parser"
# CLSID_AVIDec(AVI Decompressor) (not implemented yet)
# CLSID_AVIDec(AVI Decompressor)
[HKEY_CLASSES_ROOT\CLSID\{CF49D4E0-1115-11CE-B03A-0020AF0BA770}]
@="AVI Decompressor"
[HKEY_CLASSES_ROOT\CLSID\{CF49D4E0-1115-11CE-B03A-0020AF0BA770}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
@ -380,28 +391,34 @@
"CLSID"="{CF49D4E0-1115-11CE-B03A-0020AF0BA770}"
"FriendlyName"="AVI Decompressor"
# CLSID_AsyncReader (not implemented yet)
# CLSID_AsyncReader
[HKEY_CLASSES_ROOT\CLSID\{E436EBB5-524F-11CE-9F53-0020AF0BA770}]
@="File Source (Async.)"
[HKEY_CLASSES_ROOT\CLSID\{E436EBB5-524F-11CE-9F53-0020AF0BA770}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{E436EBB5-524F-11CE-9F53-0020AF0BA770}]
"CLSID"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
"FriendlyName"="Async Reader"
"FriendlyName"="File Source (Async.)"
# CLSID_URLReader (not implemented yet)
[HKEY_CLASSES_ROOT\CLSID\{E436EBB6-524F-11CE-9F53-0020AF0BA770}]
@="File Source (URL)"
[HKEY_CLASSES_ROOT\CLSID\{E436EBB6-524F-11CE-9F53-0020AF0BA770}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{E436EBB6-524F-11CE-9F53-0020AF0BA770}]
"CLSID"="{E436EBB6-524F-11CE-9F53-0020AF0BA770}"
"FriendlyName"="URL Reader"
"FriendlyName"="File Source (URL)"
# CLSID_AviSplitter (not implemented yet)
# CLSID_AviSplitter
[HKEY_CLASSES_ROOT\CLSID\{1B544C20-FD0B-11CE-8C63-00AA0044B51E}]
@="AVI Splitter"
[HKEY_CLASSES_ROOT\CLSID\{1B544C20-FD0B-11CE-8C63-00AA0044B51E}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
@ -412,6 +429,8 @@
# CLSID_QuickTimeParser (not implemented yet)
[HKEY_CLASSES_ROOT\CLSID\{D51BD5A0-7548-11CF-A520-0080C77EF58A}]
@="QuickTime Movie Parser"
[HKEY_CLASSES_ROOT\CLSID\{D51BD5A0-7548-11CF-A520-0080C77EF58A}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
@ -420,15 +439,72 @@
"CLSID"="{D51BD5A0-7548-11CF-A520-0080C77EF58A}"
"FriendlyName"="QuickTime Movie Parser"
# CLSID_Colour(Color space converter) (not implemented yet)
# CLSID_Colour(Color space converter)
[HKEY_CLASSES_ROOT\CLSID\{1643E180-90F5-11CE-97D5-00AA0055595A}]
@="Color Space Converter"
[HKEY_CLASSES_ROOT\CLSID\{1643E180-90F5-11CE-97D5-00AA0055595A}\InprocServer32]
@="quartz.dll"
"ThreadingModel"="Both"
[HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{1643E180-90F5-11CE-97D5-00AA0055595A}]
"CLSID"="{1643E180-90F5-11CE-97D5-00AA0055595A}"
"FriendlyName"="Color space converter"
"FriendlyName"="Color Space Converter"
#
# quartz Media Types.
#
# audio/wav
# RIFF****WAVE
[HKEY_CLASSES_ROOT\Media Type\{E436EB83-524F-11CE-9F53-0020AF0BA770}\{E436EB8B-524F-11CE-9F53-0020AF0BA770}]
"0"="0,4,,52494646, 8,4,,57415645"
"Source Filter"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
# audio/basic
# .snd
[HKEY_CLASSES_ROOT\Media Type\{E436EB83-524F-11CE-9F53-0020AF0BA770}\{E436EB8C-524F-11CE-9F53-0020AF0BA770}]
"0"="0,4,,2E736E64"
"Source Filter"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
# audio/aiff
# FORM****AIFF
[HKEY_CLASSES_ROOT\Media Type\{E436EB83-524F-11CE-9F53-0020AF0BA770}\{E436EB8D-524F-11CE-9F53-0020AF0BA770}]
"0"="0,4,,464F524D, 8,4,,41494646"
"Source Filter"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
# video/x-msvideo
# RIFF****AVI
[HKEY_CLASSES_ROOT\Media Type\{E436EB83-524F-11CE-9F53-0020AF0BA770}\{E436EB88-524F-11CE-9F53-0020AF0BA770}]
"0"="0,4,,52494646, 8,4,,41564920"
"Source Filter"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
# video/quicktime
# ****mdat / ****moov
[HKEY_CLASSES_ROOT\Media Type\{E436EB83-524F-11CE-9F53-0020AF0BA770}\{E436EB89-524F-11CE-9F53-0020AF0BA770}]
"0"="4,4,,6D646174"
"1"="4,4,,6D6F6F76"
"Source Filter"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
# video/mpeg (MPEG-1/System)
# 0x00 0x00 0x01 0xba
[HKEY_CLASSES_ROOT\Media Type\{E436EB83-524F-11CE-9F53-0020AF0BA770}\{E436EB84-524F-11CE-9F53-0020AF0BA770}]
"0"="0,4,,000001BA"
"Source Filter"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
# video/mpeg (MPEG-1/Video)
# 0x00 0x00 0x01 0xb3
[HKEY_CLASSES_ROOT\Media Type\{E436EB83-524F-11CE-9F53-0020AF0BA770}\{E436EB86-524F-11CE-9F53-0020AF0BA770}]
"0"="0,4,,000001B3"
"Source Filter"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
# audio/mpeg
# 12bit 0xFFF + 1bit 0 + 2bit Layer(non-zero) + 1bit flag
[HKEY_CLASSES_ROOT\Media Type\{E436EB83-524F-11CE-9F53-0020AF0BA770}\{E436EB87-524F-11CE-9F53-0020AF0BA770}]
"0"="0,2,FFF8,FFF8"
"Source Filter"="{E436EBB5-524F-11CE-9F53-0020AF0BA770}"