quartz: COM cleanup for AsyncReader and FileAsyncReader.
This commit is contained in:
parent
350449fc43
commit
e7d4d9e4f6
|
@ -40,14 +40,34 @@ static const WCHAR wszOutputPinName[] = { 'O','u','t','p','u','t',0 };
|
|||
typedef struct AsyncReader
|
||||
{
|
||||
BaseFilter filter;
|
||||
const IFileSourceFilterVtbl * lpVtblFSF;
|
||||
const IAMFilterMiscFlagsVtbl * IAMFilterMiscFlags_vtbl;
|
||||
IFileSourceFilter IFileSourceFilter_iface;
|
||||
IAMFilterMiscFlags IAMFilterMiscFlags_iface;
|
||||
|
||||
IPin * pOutputPin;
|
||||
LPOLESTR pszFileName;
|
||||
AM_MEDIA_TYPE * pmt;
|
||||
} AsyncReader;
|
||||
|
||||
static inline AsyncReader *impl_from_BaseFilter(BaseFilter *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, AsyncReader, filter);
|
||||
}
|
||||
|
||||
static inline AsyncReader *impl_from_IBaseFilter(IBaseFilter *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, AsyncReader, filter.IBaseFilter_iface);
|
||||
}
|
||||
|
||||
static inline AsyncReader *impl_from_IFileSourceFilter(IFileSourceFilter *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, AsyncReader, IFileSourceFilter_iface);
|
||||
}
|
||||
|
||||
static inline AsyncReader *impl_from_IAMFilterMiscFlags(IAMFilterMiscFlags *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, AsyncReader, IAMFilterMiscFlags_iface);
|
||||
}
|
||||
|
||||
static const IBaseFilterVtbl AsyncReader_Vtbl;
|
||||
static const IFileSourceFilterVtbl FileSource_Vtbl;
|
||||
static const IAsyncReaderVtbl FileAsyncReader_Vtbl;
|
||||
|
@ -55,11 +75,6 @@ static const IAMFilterMiscFlagsVtbl IAMFilterMiscFlags_Vtbl;
|
|||
|
||||
static HRESULT FileAsyncReader_Construct(HANDLE hFile, IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
|
||||
|
||||
static inline AsyncReader *impl_from_IFileSourceFilter( IFileSourceFilter *iface )
|
||||
{
|
||||
return (AsyncReader *)((char*)iface - FIELD_OFFSET(AsyncReader, lpVtblFSF));
|
||||
}
|
||||
|
||||
static const WCHAR mediatype_name[] = {
|
||||
'M', 'e', 'd', 'i', 'a', ' ', 'T', 'y', 'p', 'e', 0 };
|
||||
static const WCHAR subtype_name[] = {
|
||||
|
@ -332,7 +347,7 @@ static HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName,
|
|||
|
||||
static IPin* WINAPI AsyncReader_GetPin(BaseFilter *iface, int pos)
|
||||
{
|
||||
AsyncReader *This = (AsyncReader *)iface;
|
||||
AsyncReader *This = impl_from_BaseFilter(iface);
|
||||
|
||||
if (pos >= 1 || !This->pOutputPin)
|
||||
return NULL;
|
||||
|
@ -343,7 +358,7 @@ static IPin* WINAPI AsyncReader_GetPin(BaseFilter *iface, int pos)
|
|||
|
||||
static LONG WINAPI AsyncReader_GetPinCount(BaseFilter *iface)
|
||||
{
|
||||
AsyncReader *This = (AsyncReader *)iface;
|
||||
AsyncReader *This = impl_from_BaseFilter(iface);
|
||||
|
||||
if (!This->pOutputPin)
|
||||
return 0;
|
||||
|
@ -370,8 +385,8 @@ HRESULT AsyncReader_create(IUnknown * pUnkOuter, LPVOID * ppv)
|
|||
|
||||
BaseFilter_Init(&pAsyncRead->filter, &AsyncReader_Vtbl, &CLSID_AsyncReader, (DWORD_PTR)(__FILE__ ": AsyncReader.csFilter"), &BaseFuncTable);
|
||||
|
||||
pAsyncRead->lpVtblFSF = &FileSource_Vtbl;
|
||||
pAsyncRead->IAMFilterMiscFlags_vtbl = &IAMFilterMiscFlags_Vtbl;
|
||||
pAsyncRead->IFileSourceFilter_iface.lpVtbl = &FileSource_Vtbl;
|
||||
pAsyncRead->IAMFilterMiscFlags_iface.lpVtbl = &IAMFilterMiscFlags_Vtbl;
|
||||
pAsyncRead->pOutputPin = NULL;
|
||||
|
||||
pAsyncRead->pszFileName = NULL;
|
||||
|
@ -388,7 +403,7 @@ HRESULT AsyncReader_create(IUnknown * pUnkOuter, LPVOID * ppv)
|
|||
|
||||
static HRESULT WINAPI AsyncReader_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
|
||||
{
|
||||
AsyncReader *This = (AsyncReader *)iface;
|
||||
AsyncReader *This = impl_from_IBaseFilter(iface);
|
||||
|
||||
TRACE("(%s, %p)\n", qzdebugstr_guid(riid), ppv);
|
||||
|
||||
|
@ -403,9 +418,9 @@ static HRESULT WINAPI AsyncReader_QueryInterface(IBaseFilter * iface, REFIID rii
|
|||
else if (IsEqualIID(riid, &IID_IBaseFilter))
|
||||
*ppv = This;
|
||||
else if (IsEqualIID(riid, &IID_IFileSourceFilter))
|
||||
*ppv = &This->lpVtblFSF;
|
||||
*ppv = &This->IFileSourceFilter_iface;
|
||||
else if (IsEqualIID(riid, &IID_IAMFilterMiscFlags))
|
||||
*ppv = &This->IAMFilterMiscFlags_vtbl;
|
||||
*ppv = &This->IAMFilterMiscFlags_iface;
|
||||
|
||||
if (*ppv)
|
||||
{
|
||||
|
@ -422,7 +437,7 @@ static HRESULT WINAPI AsyncReader_QueryInterface(IBaseFilter * iface, REFIID rii
|
|||
|
||||
static ULONG WINAPI AsyncReader_Release(IBaseFilter * iface)
|
||||
{
|
||||
AsyncReader *This = (AsyncReader *)iface;
|
||||
AsyncReader *This = impl_from_IBaseFilter(iface);
|
||||
ULONG refCount = BaseFilterImpl_Release(iface);
|
||||
|
||||
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
|
||||
|
@ -454,7 +469,7 @@ static ULONG WINAPI AsyncReader_Release(IBaseFilter * iface)
|
|||
|
||||
static HRESULT WINAPI AsyncReader_Stop(IBaseFilter * iface)
|
||||
{
|
||||
AsyncReader *This = (AsyncReader *)iface;
|
||||
AsyncReader *This = impl_from_IBaseFilter(iface);
|
||||
|
||||
TRACE("()\n");
|
||||
|
||||
|
@ -465,7 +480,7 @@ static HRESULT WINAPI AsyncReader_Stop(IBaseFilter * iface)
|
|||
|
||||
static HRESULT WINAPI AsyncReader_Pause(IBaseFilter * iface)
|
||||
{
|
||||
AsyncReader *This = (AsyncReader *)iface;
|
||||
AsyncReader *This = impl_from_IBaseFilter(iface);
|
||||
|
||||
TRACE("()\n");
|
||||
|
||||
|
@ -476,7 +491,7 @@ static HRESULT WINAPI AsyncReader_Pause(IBaseFilter * iface)
|
|||
|
||||
static HRESULT WINAPI AsyncReader_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
|
||||
{
|
||||
AsyncReader *This = (AsyncReader *)iface;
|
||||
AsyncReader *This = impl_from_IBaseFilter(iface);
|
||||
|
||||
TRACE("(%x%08x)\n", (ULONG)(tStart >> 32), (ULONG)tStart);
|
||||
|
||||
|
@ -489,7 +504,7 @@ static HRESULT WINAPI AsyncReader_Run(IBaseFilter * iface, REFERENCE_TIME tStart
|
|||
|
||||
static HRESULT WINAPI AsyncReader_FindPin(IBaseFilter * iface, LPCWSTR Id, IPin **ppPin)
|
||||
{
|
||||
AsyncReader *This = (AsyncReader *)iface;
|
||||
AsyncReader *This = impl_from_IBaseFilter(iface);
|
||||
TRACE("(%s, %p)\n", debugstr_w(Id), ppPin);
|
||||
|
||||
if (!Id || !ppPin)
|
||||
|
@ -501,7 +516,7 @@ static HRESULT WINAPI AsyncReader_FindPin(IBaseFilter * iface, LPCWSTR Id, IPin
|
|||
return VFW_E_NOT_FOUND;
|
||||
}
|
||||
|
||||
*ppPin = (IPin*)This->pOutputPin;
|
||||
*ppPin = This->pOutputPin;
|
||||
IUnknown_AddRef(*ppPin);
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -676,7 +691,7 @@ typedef struct DATAREQUEST
|
|||
typedef struct FileAsyncReader
|
||||
{
|
||||
BaseOutputPin pin;
|
||||
const struct IAsyncReaderVtbl * lpVtblAR;
|
||||
IAsyncReader IAsyncReader_iface;
|
||||
|
||||
ALLOCATOR_PROPERTIES allocProps;
|
||||
HANDLE hFile;
|
||||
|
@ -692,15 +707,35 @@ typedef struct FileAsyncReader
|
|||
HANDLE *handle_list;
|
||||
} FileAsyncReader;
|
||||
|
||||
static inline FileAsyncReader *impl_from_IAsyncReader( IAsyncReader *iface )
|
||||
static inline FileAsyncReader *impl_from_IPin(IPin *iface)
|
||||
{
|
||||
return (FileAsyncReader *)((char*)iface - FIELD_OFFSET(FileAsyncReader, lpVtblAR));
|
||||
return CONTAINING_RECORD(iface, FileAsyncReader, pin.pin.IPin_iface);
|
||||
}
|
||||
|
||||
static inline FileAsyncReader *impl_from_BasePin(BasePin *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, FileAsyncReader, pin.pin);
|
||||
}
|
||||
|
||||
static inline FileAsyncReader *impl_from_BaseOutputPin(BaseOutputPin *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, FileAsyncReader, pin);
|
||||
}
|
||||
|
||||
static inline BaseOutputPin *impl_BaseOututPin_from_BasePin(BasePin *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, BaseOutputPin, pin);
|
||||
}
|
||||
|
||||
static inline FileAsyncReader *impl_from_IAsyncReader(IAsyncReader *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, FileAsyncReader, IAsyncReader_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI FileAsyncReaderPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt)
|
||||
{
|
||||
FileAsyncReader *This = (FileAsyncReader *)iface;
|
||||
AM_MEDIA_TYPE *pmt_filter = ((AsyncReader *)This->pin.pin.pinInfo.pFilter)->pmt;
|
||||
FileAsyncReader *This = impl_from_IPin(iface);
|
||||
AM_MEDIA_TYPE *pmt_filter = impl_from_IBaseFilter(This->pin.pin.pinInfo.pFilter)->pmt;
|
||||
|
||||
FIXME("(%p, %p)\n", iface, pmt);
|
||||
|
||||
|
@ -714,12 +749,12 @@ static HRESULT WINAPI FileAsyncReaderPin_QueryAccept(IPin *iface, const AM_MEDIA
|
|||
|
||||
static HRESULT WINAPI FileAsyncReaderPin_GetMediaType(BasePin *iface, int iPosition, AM_MEDIA_TYPE *pmt)
|
||||
{
|
||||
FileAsyncReader *This = (FileAsyncReader *)iface;
|
||||
FileAsyncReader *This = impl_from_BasePin(iface);
|
||||
if (iPosition < 0)
|
||||
return E_INVALIDARG;
|
||||
if (iPosition > 0)
|
||||
return VFW_S_NO_MORE_ITEMS;
|
||||
CopyMediaType(pmt, ((AsyncReader *)This->pin.pin.pinInfo.pFilter)->pmt);
|
||||
CopyMediaType(pmt, impl_from_IBaseFilter(This->pin.pin.pinInfo.pFilter)->pmt);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -727,7 +762,7 @@ static HRESULT WINAPI FileAsyncReaderPin_GetMediaType(BasePin *iface, int iPosit
|
|||
|
||||
static HRESULT WINAPI FileAsyncReaderPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
|
||||
{
|
||||
FileAsyncReader *This = (FileAsyncReader *)iface;
|
||||
FileAsyncReader *This = impl_from_IPin(iface);
|
||||
TRACE("(%s, %p)\n", qzdebugstr_guid(riid), ppv);
|
||||
|
||||
*ppv = NULL;
|
||||
|
@ -737,7 +772,7 @@ static HRESULT WINAPI FileAsyncReaderPin_QueryInterface(IPin * iface, REFIID rii
|
|||
else if (IsEqualIID(riid, &IID_IPin))
|
||||
*ppv = This;
|
||||
else if (IsEqualIID(riid, &IID_IAsyncReader))
|
||||
*ppv = &This->lpVtblAR;
|
||||
*ppv = &This->IAsyncReader_iface;
|
||||
|
||||
if (*ppv)
|
||||
{
|
||||
|
@ -753,7 +788,7 @@ static HRESULT WINAPI FileAsyncReaderPin_QueryInterface(IPin * iface, REFIID rii
|
|||
|
||||
static ULONG WINAPI FileAsyncReaderPin_Release(IPin * iface)
|
||||
{
|
||||
FileAsyncReader *This = (FileAsyncReader *)iface;
|
||||
FileAsyncReader *This = impl_from_IPin(iface);
|
||||
ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
|
||||
int x;
|
||||
|
||||
|
@ -805,7 +840,7 @@ static const IPinVtbl FileAsyncReaderPin_Vtbl =
|
|||
* doesn't need the IMemInputPin interface on the receiving pin */
|
||||
static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(BasePin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
|
||||
{
|
||||
BaseOutputPin *This = (BaseOutputPin *)iface;
|
||||
BaseOutputPin *This = impl_BaseOututPin_from_BasePin(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("(%p, %p)\n", pReceivePin, pmt);
|
||||
|
@ -817,7 +852,7 @@ static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(BasePin * iface, IPin
|
|||
IPin_AddRef(pReceivePin);
|
||||
CopyMediaType(&This->pin.mtCurrent, pmt);
|
||||
|
||||
hr = IPin_ReceiveConnection(pReceivePin, (IPin*)iface, pmt);
|
||||
hr = IPin_ReceiveConnection(pReceivePin, &iface->IPin_iface, pmt);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
|
@ -832,7 +867,7 @@ static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(BasePin * iface, IPin
|
|||
|
||||
static HRESULT WINAPI FileAsyncReaderPin_DecideBufferSize(BaseOutputPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
|
||||
{
|
||||
FileAsyncReader *This = (FileAsyncReader *)iface;
|
||||
FileAsyncReader *This = impl_from_BaseOutputPin(iface);
|
||||
ALLOCATOR_PROPERTIES actual;
|
||||
|
||||
if (ppropInputRequest->cbAlign && ppropInputRequest->cbAlign != This->allocProps.cbAlign)
|
||||
|
@ -874,7 +909,7 @@ static HRESULT FileAsyncReader_Construct(HANDLE hFile, IBaseFilter * pBaseFilter
|
|||
if (SUCCEEDED(hr))
|
||||
{
|
||||
FileAsyncReader *pPinImpl = (FileAsyncReader *)*ppPin;
|
||||
pPinImpl->lpVtblAR = &FileAsyncReader_Vtbl;
|
||||
pPinImpl->IAsyncReader_iface.lpVtbl = &FileAsyncReader_Vtbl;
|
||||
pPinImpl->hFile = hFile;
|
||||
pPinImpl->bFlushing = FALSE;
|
||||
pPinImpl->sample_list = NULL;
|
||||
|
@ -892,21 +927,21 @@ static HRESULT WINAPI FileAsyncReader_QueryInterface(IAsyncReader * iface, REFII
|
|||
{
|
||||
FileAsyncReader *This = impl_from_IAsyncReader(iface);
|
||||
|
||||
return IPin_QueryInterface((IPin *)This, riid, ppv);
|
||||
return IPin_QueryInterface(&This->pin.pin.IPin_iface, riid, ppv);
|
||||
}
|
||||
|
||||
static ULONG WINAPI FileAsyncReader_AddRef(IAsyncReader * iface)
|
||||
{
|
||||
FileAsyncReader *This = impl_from_IAsyncReader(iface);
|
||||
|
||||
return IPin_AddRef((IPin *)This);
|
||||
return IPin_AddRef(&This->pin.pin.IPin_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI FileAsyncReader_Release(IAsyncReader * iface)
|
||||
{
|
||||
FileAsyncReader *This = impl_from_IAsyncReader(iface);
|
||||
|
||||
return IPin_Release((IPin *)This);
|
||||
return IPin_Release(&This->pin.pin.IPin_iface);
|
||||
}
|
||||
|
||||
#define DEF_ALIGNMENT 1
|
||||
|
@ -1353,22 +1388,18 @@ static const IAsyncReaderVtbl FileAsyncReader_Vtbl =
|
|||
};
|
||||
|
||||
|
||||
static AsyncReader *from_IAMFilterMiscFlags(IAMFilterMiscFlags *iface) {
|
||||
return (AsyncReader*)((char*)iface - offsetof(AsyncReader, IAMFilterMiscFlags_vtbl));
|
||||
}
|
||||
|
||||
static HRESULT WINAPI AMFilterMiscFlags_QueryInterface(IAMFilterMiscFlags *iface, REFIID riid, void **ppv) {
|
||||
AsyncReader *This = from_IAMFilterMiscFlags(iface);
|
||||
AsyncReader *This = impl_from_IAMFilterMiscFlags(iface);
|
||||
return IUnknown_QueryInterface((IUnknown*)This, riid, ppv);
|
||||
}
|
||||
|
||||
static ULONG WINAPI AMFilterMiscFlags_AddRef(IAMFilterMiscFlags *iface) {
|
||||
AsyncReader *This = from_IAMFilterMiscFlags(iface);
|
||||
AsyncReader *This = impl_from_IAMFilterMiscFlags(iface);
|
||||
return IUnknown_AddRef((IUnknown*)This);
|
||||
}
|
||||
|
||||
static ULONG WINAPI AMFilterMiscFlags_Release(IAMFilterMiscFlags *iface) {
|
||||
AsyncReader *This = from_IAMFilterMiscFlags(iface);
|
||||
AsyncReader *This = impl_from_IAMFilterMiscFlags(iface);
|
||||
return IUnknown_Release((IUnknown*)This);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue