Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 67cfbc02c2c..5e44c92e31c 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -1683,18 +1683,6 @@ static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void ** return E_NOINTERFACE; }
-static ULONG WINAPI GSTOutPin_AddRef(IPin *iface) -{ - GSTOutPin *pin = impl_source_from_IPin(iface); - return IBaseFilter_AddRef(pin->pin.pin.pinInfo.pFilter); -} - -static ULONG WINAPI GSTOutPin_Release(IPin *iface) -{ - GSTOutPin *pin = impl_source_from_IPin(iface); - return IBaseFilter_Release(pin->pin.pin.pinInfo.pFilter); -} - static HRESULT WINAPI GSTOutPin_CheckMediaType(BasePin *base, const AM_MEDIA_TYPE *amt) { FIXME("(%p) stub\n", base); @@ -1790,8 +1778,8 @@ static void free_source_pin(GSTOutPin *pin)
static const IPinVtbl GST_OutputPin_Vtbl = { GSTOutPin_QueryInterface, - GSTOutPin_AddRef, - GSTOutPin_Release, + BasePinImpl_AddRef, + BasePinImpl_Release, BaseOutputPinImpl_Connect, BaseOutputPinImpl_ReceiveConnection, BaseOutputPinImpl_Disconnect, @@ -1875,18 +1863,6 @@ static inline GSTInPin *impl_sink_from_IPin(IPin *iface) return CONTAINING_RECORD(iface, GSTInPin, pin.IPin_iface); }
-static ULONG WINAPI GSTInPin_AddRef(IPin *iface) -{ - GSTInPin *pin = impl_sink_from_IPin(iface); - return IBaseFilter_AddRef(pin->pin.pinInfo.pFilter); -} - -static ULONG WINAPI GSTInPin_Release(IPin *iface) -{ - GSTInPin *pin = impl_sink_from_IPin(iface); - return IBaseFilter_Release(pin->pin.pinInfo.pFilter); -} - static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) { GSTInPin *This = impl_sink_from_IPin(iface); @@ -2069,8 +2045,8 @@ static HRESULT WINAPI GSTInPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppE
static const IPinVtbl GST_InputPin_Vtbl = { GSTInPin_QueryInterface, - GSTInPin_AddRef, - GSTInPin_Release, + BasePinImpl_AddRef, + BasePinImpl_Release, BaseInputPinImpl_Connect, GSTInPin_ReceiveConnection, GSTInPin_Disconnect,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wineqtdecoder/qtsplitter.c | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-)
diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c index 8b271d2c8c7..c5d3efa6b08 100644 --- a/dlls/wineqtdecoder/qtsplitter.c +++ b/dlls/wineqtdecoder/qtsplitter.c @@ -823,18 +823,6 @@ static inline QTInPin *impl_from_IPin( IPin *iface ) return CONTAINING_RECORD(iface, QTInPin, pin.IPin_iface); }
-static ULONG WINAPI QTInPin_AddRef(IPin *iface) -{ - QTInPin *pin = impl_from_IPin(iface); - return IBaseFilter_AddRef(pin->pin.pinInfo.pFilter); -} - -static ULONG WINAPI QTInPin_Release(IPin *iface) -{ - QTInPin *pin = impl_from_IPin(iface); - return IBaseFilter_Release(pin->pin.pinInfo.pFilter); -} - static HRESULT QT_Process_Video_Track(QTSplitter* filter, Track trk) { AM_MEDIA_TYPE amt; @@ -1268,8 +1256,8 @@ static HRESULT WINAPI QTInPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppEn
static const IPinVtbl QT_InputPin_Vtbl = { QTInPin_QueryInterface, - QTInPin_AddRef, - QTInPin_Release, + BasePinImpl_AddRef, + BasePinImpl_Release, BaseInputPinImpl_Connect, QTInPin_ReceiveConnection, QTInPin_Disconnect, @@ -1331,18 +1319,6 @@ static HRESULT WINAPI QTOutPin_QueryInterface(IPin *iface, REFIID riid, void **p return E_NOINTERFACE; }
-static ULONG WINAPI QTOutPin_AddRef(IPin *iface) -{ - QTOutPin *pin = impl_QTOutPin_from_IPin(iface); - return IBaseFilter_AddRef(pin->pin.pin.pinInfo.pFilter); -} - -static ULONG WINAPI QTOutPin_Release(IPin *iface) -{ - QTOutPin *pin = impl_QTOutPin_from_IPin(iface); - return IBaseFilter_Release(pin->pin.pin.pinInfo.pFilter); -} - static HRESULT WINAPI QTOutPin_CheckMediaType(BasePin *base, const AM_MEDIA_TYPE *amt) { FIXME("(%p) stub\n", base); @@ -1391,8 +1367,8 @@ static HRESULT WINAPI QTOutPin_DecideAllocator(BaseOutputPin *iface, IMemInputPi
static const IPinVtbl QT_OutputPin_Vtbl = { QTOutPin_QueryInterface, - QTOutPin_AddRef, - QTOutPin_Release, + BasePinImpl_AddRef, + BasePinImpl_Release, BaseOutputPinImpl_Connect, BaseOutputPinImpl_ReceiveConnection, BaseOutputPinImpl_Disconnect,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filesource.c | 339 ++++++++++++++++----------------------- 1 file changed, 138 insertions(+), 201 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index afac6f7d319..2a6188a5fc7 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -57,40 +57,31 @@ typedef struct DATAREQUEST OVERLAPPED ovl; } DATAREQUEST;
-typedef struct FileAsyncReader +typedef struct AsyncReader { - BaseOutputPin pin; + BaseFilter filter; + IFileSourceFilter IFileSourceFilter_iface; + + BaseOutputPin source; IAsyncReader IAsyncReader_iface;
+ LPOLESTR pszFileName; + AM_MEDIA_TYPE *pmt; ALLOCATOR_PROPERTIES allocProps; - HANDLE hFile; - BOOL bFlushing; - /* Why would you need more? Every sample has its own handle */ - LONG queued_number; - LONG samples; - LONG oldest_sample; - CRITICAL_SECTION csList; + HANDLE file; + BOOL flushing; + unsigned int queued_number; + unsigned int samples; + unsigned int oldest_sample; + CRITICAL_SECTION sample_cs; DATAREQUEST *sample_list; - /* Have a handle for every sample, and then one more as flushing handle */ HANDLE *handle_list; -} FileAsyncReader; - -static inline FileAsyncReader *impl_from_IPin(IPin *iface) -{ - return CONTAINING_RECORD(iface, FileAsyncReader, pin.pin.IPin_iface); -} - -typedef struct AsyncReader -{ - BaseFilter filter; - IFileSourceFilter IFileSourceFilter_iface; - - IPin * pOutputPin; - LPOLESTR pszFileName; - AM_MEDIA_TYPE * pmt; } AsyncReader;
+static const IPinVtbl FileAsyncReaderPin_Vtbl; +static const BaseOutputPinFuncTable output_BaseOutputFuncTable; + static inline AsyncReader *impl_from_BaseFilter(BaseFilter *iface) { return CONTAINING_RECORD(iface, AsyncReader, filter); @@ -110,8 +101,6 @@ static const IBaseFilterVtbl AsyncReader_Vtbl; static const IFileSourceFilterVtbl FileSource_Vtbl; static const IAsyncReaderVtbl FileAsyncReader_Vtbl;
-static HRESULT FileAsyncReader_Construct(HANDLE hFile, IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, IPin ** ppPin); - static const WCHAR mediatype_name[] = { 'M', 'e', 'd', 'i', 'a', ' ', 'T', 'y', 'p', 'e', 0 }; static const WCHAR subtype_name[] = { @@ -427,8 +416,8 @@ static IPin *async_reader_get_pin(BaseFilter *iface, unsigned int index) { AsyncReader *filter = impl_from_BaseFilter(iface);
- if (!index && filter->pOutputPin) - return filter->pOutputPin; + if (!index && filter->pszFileName) + return &filter->source.pin.IPin_iface; return NULL; }
@@ -436,30 +425,26 @@ static void async_reader_destroy(BaseFilter *iface) { AsyncReader *filter = impl_from_BaseFilter(iface);
- if (filter->pOutputPin) + if (filter->pszFileName) { - FileAsyncReader *pin = impl_from_IPin(filter->pOutputPin); unsigned int i; - IPin *peer;
- if (SUCCEEDED(IPin_ConnectedTo(filter->pOutputPin, &peer))) - { - IPin_Disconnect(peer); - IPin_Release(peer); - } - IPin_Disconnect(filter->pOutputPin); + if (filter->source.pin.pConnectedTo) + IPin_Disconnect(filter->source.pin.pConnectedTo); + + IPin_Disconnect(&filter->source.pin.IPin_iface);
- CoTaskMemFree(pin->sample_list); - if (pin->handle_list) + CoTaskMemFree(filter->sample_list); + if (filter->handle_list) { - for (i = 0; i <= pin->samples; ++i) - CloseHandle(pin->handle_list[i]); - CoTaskMemFree(pin->handle_list); + for (i = 0; i <= filter->samples; ++i) + CloseHandle(filter->handle_list[i]); + CoTaskMemFree(filter->handle_list); } - CloseHandle(pin->hFile); - pin->csList.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&pin->csList); - BaseOutputPin_Destroy(&pin->pin); + CloseHandle(filter->file); + filter->sample_cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&filter->sample_cs); + strmbase_source_cleanup(&filter->source); } CoTaskMemFree(filter->pszFileName); if (filter->pmt) @@ -502,7 +487,8 @@ HRESULT AsyncReader_create(IUnknown *outer, void **out) (DWORD_PTR)(__FILE__ ": AsyncReader.csFilter"), &BaseFuncTable);
pAsyncRead->IFileSourceFilter_iface.lpVtbl = &FileSource_Vtbl; - pAsyncRead->pOutputPin = NULL; + + pAsyncRead->IAsyncReader_iface.lpVtbl = &FileAsyncReader_Vtbl;
pAsyncRead->pszFileName = NULL; pAsyncRead->pmt = NULL; @@ -591,10 +577,9 @@ static ULONG WINAPI FileSource_Release(IFileSourceFilter * iface)
static HRESULT WINAPI FileSource_Load(IFileSourceFilter * iface, LPCOLESTR pszFileName, const AM_MEDIA_TYPE * pmt) { - HRESULT hr; HANDLE hFile; - IAsyncReader * pReader = NULL; AsyncReader *This = impl_from_IFileSourceFilter(iface); + PIN_INFO pin_info;
TRACE("%p->(%s, %p)\n", This, debugstr_w(pszFileName), pmt);
@@ -611,58 +596,42 @@ static HRESULT WINAPI FileSource_Load(IFileSourceFilter * iface, LPCOLESTR pszFi }
/* create pin */ - hr = FileAsyncReader_Construct(hFile, &This->filter.IBaseFilter_iface, &This->filter.csFilter, &This->pOutputPin); + pin_info.dir = PINDIR_OUTPUT; + pin_info.pFilter = &This->filter.IBaseFilter_iface; + strcpyW(pin_info.achName, wszOutputPinName); + strmbase_source_init(&This->source, &FileAsyncReaderPin_Vtbl, &pin_info, + &output_BaseOutputFuncTable, &This->filter.csFilter); BaseFilterImpl_IncrementPinVersion(&This->filter);
- if (SUCCEEDED(hr)) - hr = IPin_QueryInterface(This->pOutputPin, &IID_IAsyncReader, (LPVOID *)&pReader); - - /* store file name & media type */ - if (SUCCEEDED(hr)) - { - CoTaskMemFree(This->pszFileName); - if (This->pmt) - DeleteMediaType(This->pmt); - - This->pszFileName = CoTaskMemAlloc((strlenW(pszFileName) + 1) * sizeof(WCHAR)); - strcpyW(This->pszFileName, pszFileName); + This->file = hFile; + This->flushing = FALSE; + This->sample_list = NULL; + This->handle_list = NULL; + This->queued_number = 0; + InitializeCriticalSection(&This->sample_cs); + This->sample_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FileAsyncReader.sample_cs");
- This->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); - if (!pmt) - { - CopyMediaType(This->pmt, &default_mt); - if (FAILED(GetClassMediaFile(pReader, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL))) - { - This->pmt->majortype = MEDIATYPE_Stream; - This->pmt->subtype = MEDIASUBTYPE_NULL; - } - } - else - CopyMediaType(This->pmt, pmt); - } + CoTaskMemFree(This->pszFileName); + if (This->pmt) + DeleteMediaType(This->pmt);
- if (pReader) - IAsyncReader_Release(pReader); + This->pszFileName = CoTaskMemAlloc((strlenW(pszFileName) + 1) * sizeof(WCHAR)); + strcpyW(This->pszFileName, pszFileName);
- if (FAILED(hr)) + This->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + if (!pmt) { - if (This->pOutputPin) + CopyMediaType(This->pmt, &default_mt); + if (FAILED(GetClassMediaFile(&This->IAsyncReader_iface, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL))) { - IPin_Release(This->pOutputPin); - This->pOutputPin = NULL; + This->pmt->majortype = MEDIATYPE_Stream; + This->pmt->subtype = MEDIASUBTYPE_NULL; } - - CoTaskMemFree(This->pszFileName); - if (This->pmt) - DeleteMediaType(This->pmt); - This->pszFileName = NULL; - This->pmt = NULL; - - CloseHandle(hFile); } + else + CopyMediaType(This->pmt, pmt);
- /* FIXME: check return codes */ - return hr; + return S_OK; }
static HRESULT WINAPI FileSource_GetCurFile(IFileSourceFilter * iface, LPOLESTR * ppszFileName, AM_MEDIA_TYPE * pmt) @@ -703,14 +672,19 @@ static const IFileSourceFilterVtbl FileSource_Vtbl = FileSource_GetCurFile };
-static inline FileAsyncReader *impl_from_BasePin(BasePin *iface) +static inline AsyncReader *impl_from_IPin(IPin *iface) +{ + return CONTAINING_RECORD(iface, AsyncReader, source.pin.IPin_iface); +} + +static inline AsyncReader *impl_from_BasePin(BasePin *iface) { - return CONTAINING_RECORD(iface, FileAsyncReader, pin.pin); + return CONTAINING_RECORD(iface, AsyncReader, source.pin); }
-static inline FileAsyncReader *impl_from_BaseOutputPin(BaseOutputPin *iface) +static inline AsyncReader *impl_from_BaseOutputPin(BaseOutputPin *iface) { - return CONTAINING_RECORD(iface, FileAsyncReader, pin); + return CONTAINING_RECORD(iface, AsyncReader, source); }
static inline BaseOutputPin *impl_BaseOutputPin_from_BasePin(BasePin *iface) @@ -718,9 +692,9 @@ static inline BaseOutputPin *impl_BaseOutputPin_from_BasePin(BasePin *iface) return CONTAINING_RECORD(iface, BaseOutputPin, pin); }
-static inline FileAsyncReader *impl_from_IAsyncReader(IAsyncReader *iface) +static inline AsyncReader *impl_from_IAsyncReader(IAsyncReader *iface) { - return CONTAINING_RECORD(iface, FileAsyncReader, IAsyncReader_iface); + return CONTAINING_RECORD(iface, AsyncReader, IAsyncReader_iface); }
static HRESULT WINAPI FileAsyncReaderPin_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE *pmt) @@ -736,8 +710,7 @@ static HRESULT WINAPI FileAsyncReaderPin_CheckMediaType(BasePin *pin, const AM_M
static HRESULT WINAPI FileAsyncReaderPin_GetMediaType(BasePin *iface, int index, AM_MEDIA_TYPE *mt) { - FileAsyncReader *This = impl_from_BasePin(iface); - AsyncReader *filter = impl_from_IBaseFilter(This->pin.pin.pinInfo.pFilter); + AsyncReader *filter = impl_from_BasePin(iface);
if (index < 0) return E_INVALIDARG; @@ -753,28 +726,25 @@ static HRESULT WINAPI FileAsyncReaderPin_GetMediaType(BasePin *iface, int index,
/* overridden pin functions */
-static HRESULT WINAPI FileAsyncReaderPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv) +static HRESULT WINAPI FileAsyncReaderPin_QueryInterface(IPin *iface, REFIID iid, void **out) { - FileAsyncReader *This = impl_from_IPin(iface); - TRACE("(%s, %p)\n", qzdebugstr_guid(riid), ppv); + AsyncReader *filter = impl_from_IPin(iface);
- *ppv = NULL; + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
- if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IPin)) - *ppv = &This->pin.pin.IPin_iface; - else if (IsEqualIID(riid, &IID_IAsyncReader)) - *ppv = &This->IAsyncReader_iface; - - if (*ppv) + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IPin)) + *out = &filter->source.pin.IPin_iface; + else if (IsEqualIID(iid, &IID_IAsyncReader)) + *out = &filter->IAsyncReader_iface; + else { - IUnknown_AddRef((IUnknown *)*ppv); - return S_OK; + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + *out = NULL; + return E_NOINTERFACE; }
- if (!IsEqualIID(riid, &IID_IMediaSeeking)) - FIXME("No interface for %s!\n", qzdebugstr_guid(riid)); - - return E_NOINTERFACE; + IUnknown_AddRef((IUnknown *)*out); + return S_OK; }
static const IPinVtbl FileAsyncReaderPin_Vtbl = @@ -832,7 +802,7 @@ static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(BaseOutputPin *This,
static HRESULT WINAPI FileAsyncReaderPin_DecideBufferSize(BaseOutputPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest) { - FileAsyncReader *This = impl_from_BaseOutputPin(iface); + AsyncReader *This = impl_from_BaseOutputPin(iface); ALLOCATOR_PROPERTIES actual;
if (ppropInputRequest->cbAlign && ppropInputRequest->cbAlign != This->allocProps.cbAlign) @@ -857,61 +827,29 @@ static const BaseOutputPinFuncTable output_BaseOutputFuncTable = { BaseOutputPinImpl_DecideAllocator, };
-static HRESULT FileAsyncReader_Construct(HANDLE hFile, IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, IPin ** ppPin) -{ - PIN_INFO piOutput; - HRESULT hr; - - *ppPin = NULL; - piOutput.dir = PINDIR_OUTPUT; - piOutput.pFilter = pBaseFilter; - strcpyW(piOutput.achName, wszOutputPinName); - hr = BaseOutputPin_Construct(&FileAsyncReaderPin_Vtbl, sizeof(FileAsyncReader), &piOutput, &output_BaseOutputFuncTable, pCritSec, ppPin); - - if (SUCCEEDED(hr)) - { - FileAsyncReader *pPinImpl = (FileAsyncReader *)*ppPin; - pPinImpl->IAsyncReader_iface.lpVtbl = &FileAsyncReader_Vtbl; - pPinImpl->hFile = hFile; - pPinImpl->bFlushing = FALSE; - pPinImpl->sample_list = NULL; - pPinImpl->handle_list = NULL; - pPinImpl->queued_number = 0; - InitializeCriticalSection(&pPinImpl->csList); - pPinImpl->csList.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FileAsyncReader.csList"); - } - return hr; -} - -/* IAsyncReader */ - -static HRESULT WINAPI FileAsyncReader_QueryInterface(IAsyncReader * iface, REFIID riid, LPVOID * ppv) +static HRESULT WINAPI FileAsyncReader_QueryInterface(IAsyncReader *iface, REFIID iid, void **out) { - FileAsyncReader *This = impl_from_IAsyncReader(iface); - - return IPin_QueryInterface(&This->pin.pin.IPin_iface, riid, ppv); + AsyncReader *filter = impl_from_IAsyncReader(iface); + return IPin_QueryInterface(&filter->source.pin.IPin_iface, iid, out); }
static ULONG WINAPI FileAsyncReader_AddRef(IAsyncReader * iface) { - FileAsyncReader *This = impl_from_IAsyncReader(iface); - - return IPin_AddRef(&This->pin.pin.IPin_iface); + AsyncReader *filter = impl_from_IAsyncReader(iface); + return IPin_AddRef(&filter->source.pin.IPin_iface); }
static ULONG WINAPI FileAsyncReader_Release(IAsyncReader * iface) { - FileAsyncReader *This = impl_from_IAsyncReader(iface); - - return IPin_Release(&This->pin.pin.IPin_iface); + AsyncReader *filter = impl_from_IAsyncReader(iface); + return IPin_Release(&filter->source.pin.IPin_iface); }
#define DEF_ALIGNMENT 1
static HRESULT WINAPI FileAsyncReader_RequestAllocator(IAsyncReader * iface, IMemAllocator * pPreferred, ALLOCATOR_PROPERTIES * pProps, IMemAllocator ** ppActual) { - FileAsyncReader *This = impl_from_IAsyncReader(iface); - + AsyncReader *This = impl_from_IAsyncReader(iface); HRESULT hr = S_OK;
TRACE("%p->(%p, %p, %p)\n", This, pPreferred, pProps, ppActual); @@ -1004,10 +942,10 @@ done: * however, this would be quite complicated to do and may be a bit error prone */ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample * pSample, DWORD_PTR dwUser) { + AsyncReader *This = impl_from_IAsyncReader(iface); HRESULT hr = S_OK; REFERENCE_TIME Start; REFERENCE_TIME Stop; - FileAsyncReader *This = impl_from_IAsyncReader(iface); LPBYTE pBuffer = NULL;
TRACE("%p->(%p, %lx)\n", This, pSample, dwUser); @@ -1022,10 +960,10 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample if (SUCCEEDED(hr)) hr = IMediaSample_GetPointer(pSample, &pBuffer);
- EnterCriticalSection(&This->csList); - if (This->bFlushing) + EnterCriticalSection(&This->sample_cs); + if (This->flushing) { - LeaveCriticalSection(&This->csList); + LeaveCriticalSection(&This->sample_cs); return VFW_E_WRONG_STATE; }
@@ -1068,7 +1006,7 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample * as they do not support async reads on files, but it is * sooo much easier to use this than messing around with threads! */ - if (!ReadFile(This->hFile, pBuffer, dwLength, NULL, &pDataRq->ovl)) + if (!ReadFile(This->file, pBuffer, dwLength, NULL, &pDataRq->ovl)) hr = HRESULT_FROM_WIN32(GetLastError());
/* ERROR_IO_PENDING is not actually an error since this is what we want! */ @@ -1076,7 +1014,7 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample hr = S_OK; }
- LeaveCriticalSection(&This->csList); + LeaveCriticalSection(&This->sample_cs);
TRACE("-- %x\n", hr); return hr; @@ -1084,8 +1022,8 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample
static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dwTimeout, IMediaSample ** ppSample, DWORD_PTR * pdwUser) { + AsyncReader *This = impl_from_IAsyncReader(iface); HRESULT hr = S_OK; - FileAsyncReader *This = impl_from_IAsyncReader(iface); DWORD buffer = ~0;
TRACE("%p->(%u, %p, %p)\n", This, dwTimeout, ppSample, pdwUser); @@ -1093,8 +1031,8 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw *ppSample = NULL; *pdwUser = 0;
- EnterCriticalSection(&This->csList); - if (!This->bFlushing) + EnterCriticalSection(&This->sample_cs); + if (!This->flushing) { LONG oldest = This->oldest_sample;
@@ -1103,12 +1041,12 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw /* It could be that nothing is queued right now, but that can be fixed */ WARN("Called without samples in queue and not flushing!!\n"); } - LeaveCriticalSection(&This->csList); + LeaveCriticalSection(&This->sample_cs);
/* wait for an object to read, or time out */ buffer = WaitForMultipleObjectsEx(This->samples+1, This->handle_list + oldest, FALSE, dwTimeout, TRUE);
- EnterCriticalSection(&This->csList); + EnterCriticalSection(&This->sample_cs); if (buffer <= This->samples) { /* Re-scale the buffer back to normal */ @@ -1135,7 +1073,7 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw --This->queued_number; }
- if (This->bFlushing && buffer == ~0) + if (This->flushing && buffer == ~0) { for (buffer = 0; buffer < This->samples; ++buffer) { @@ -1164,14 +1102,14 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw DWORD dwBytes = 0;
/* get any errors */ - if (!This->bFlushing && !GetOverlappedResult(This->hFile, &pDataRq->ovl, &dwBytes, FALSE)) + if (!This->flushing && !GetOverlappedResult(This->file, &pDataRq->ovl, &dwBytes, FALSE)) hr = HRESULT_FROM_WIN32(GetLastError());
/* Return the sample no matter what so it can be destroyed */ *ppSample = pDataRq->pSample; *pdwUser = pDataRq->dwUserData;
- if (This->bFlushing) + if (This->flushing) hr = VFW_E_WRONG_STATE;
if (FAILED(hr)) @@ -1205,7 +1143,7 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw This->oldest_sample = x; } } - LeaveCriticalSection(&This->csList); + LeaveCriticalSection(&This->sample_cs);
TRACE("-- %x\n", hr); return hr; @@ -1234,7 +1172,7 @@ static BOOL sync_read(HANDLE file, LONGLONG offset, LONG length, BYTE *buffer, D
static HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMediaSample *sample) { - FileAsyncReader *filter = impl_from_IAsyncReader(iface); + AsyncReader *filter = impl_from_IAsyncReader(iface); REFERENCE_TIME start_time, end_time; DWORD read_len; BYTE *buffer; @@ -1252,7 +1190,7 @@ static HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMedi if (SUCCEEDED(hr)) { length = BYTES_FROM_MEDIATIME(end_time - start_time); - ret = sync_read(filter->hFile, BYTES_FROM_MEDIATIME(start_time), length, buffer, &read_len); + ret = sync_read(filter->file, BYTES_FROM_MEDIATIME(start_time), length, buffer, &read_len); if (ret) hr = (read_len == length) ? S_OK : S_FALSE; else if (GetLastError() == ERROR_HANDLE_EOF) @@ -1270,7 +1208,7 @@ static HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMedi static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface, LONGLONG offset, LONG length, BYTE *buffer) { - FileAsyncReader *filter = impl_from_IAsyncReader(iface); + AsyncReader *filter = impl_from_IAsyncReader(iface); DWORD read_len; HRESULT hr; BOOL ret; @@ -1278,7 +1216,7 @@ static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface, TRACE("filter %p, offset %s, length %d, buffer %p.\n", filter, wine_dbgstr_longlong(offset), length, buffer);
- ret = sync_read(filter->hFile, offset, length, buffer, &read_len); + ret = sync_read(filter->file, offset, length, buffer, &read_len); if (ret) hr = (read_len == length) ? S_OK : S_FALSE; else if (GetLastError() == ERROR_HANDLE_EOF) @@ -1289,54 +1227,53 @@ static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface, return hr; }
-static HRESULT WINAPI FileAsyncReader_Length(IAsyncReader * iface, LONGLONG * pTotal, LONGLONG * pAvailable) +static HRESULT WINAPI FileAsyncReader_Length(IAsyncReader *iface, LONGLONG *total, LONGLONG *available) { - DWORD dwSizeLow; - DWORD dwSizeHigh; - FileAsyncReader *This = impl_from_IAsyncReader(iface); + AsyncReader *filter = impl_from_IAsyncReader(iface); + DWORD low, high;
- TRACE("%p->(%p, %p)\n", This, pTotal, pAvailable); + TRACE("iface %p, total %p, available %p.\n", iface, total, available);
- if (((dwSizeLow = GetFileSize(This->hFile, &dwSizeHigh)) == -1) && - (GetLastError() != NO_ERROR)) + if ((low = GetFileSize(filter->file, &high)) == -1 && GetLastError() != NO_ERROR) return HRESULT_FROM_WIN32(GetLastError());
- *pTotal = (LONGLONG)dwSizeLow | (LONGLONG)dwSizeHigh << (sizeof(DWORD) * 8); - - *pAvailable = *pTotal; + *available = *total = (LONGLONG)low | (LONGLONG)high << (sizeof(DWORD) * 8);
return S_OK; }
static HRESULT WINAPI FileAsyncReader_BeginFlush(IAsyncReader * iface) { - FileAsyncReader *This = impl_from_IAsyncReader(iface); + AsyncReader *filter = impl_from_IAsyncReader(iface);
- TRACE("%p->()\n", This); + TRACE("iface %p.\n", iface);
- EnterCriticalSection(&This->csList); - This->bFlushing = TRUE; - CancelIo(This->hFile); - SetEvent(This->handle_list[This->samples]); - LeaveCriticalSection(&This->csList); + EnterCriticalSection(&filter->sample_cs); + + filter->flushing = TRUE; + CancelIo(filter->file); + SetEvent(filter->handle_list[filter->samples]); + + LeaveCriticalSection(&filter->sample_cs);
return S_OK; }
static HRESULT WINAPI FileAsyncReader_EndFlush(IAsyncReader * iface) { - FileAsyncReader *This = impl_from_IAsyncReader(iface); + AsyncReader *filter = impl_from_IAsyncReader(iface); int x;
- TRACE("%p->()\n", This); + TRACE("iface %p.\n", iface); + + EnterCriticalSection(&filter->sample_cs);
- EnterCriticalSection(&This->csList); - ResetEvent(This->handle_list[This->samples]); - This->bFlushing = FALSE; - for (x = 0; x < This->samples; ++x) - assert(!This->sample_list[x].pSample); + ResetEvent(filter->handle_list[filter->samples]); + filter->flushing = FALSE; + for (x = 0; x < filter->samples; ++x) + assert(!filter->sample_list[x].pSample);
- LeaveCriticalSection(&This->csList); + LeaveCriticalSection(&filter->sample_cs);
return S_OK; }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filesource.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index 2a6188a5fc7..2d4265d5f03 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -1251,7 +1251,7 @@ static HRESULT WINAPI FileAsyncReader_BeginFlush(IAsyncReader * iface) EnterCriticalSection(&filter->sample_cs);
filter->flushing = TRUE; - CancelIo(filter->file); + CancelIoEx(filter->file, NULL); SetEvent(filter->handle_list[filter->samples]);
LeaveCriticalSection(&filter->sample_cs);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/filesource.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/dlls/quartz/tests/filesource.c b/dlls/quartz/tests/filesource.c index b1a8399d6e9..c38811aeba0 100644 --- a/dlls/quartz/tests/filesource.c +++ b/dlls/quartz/tests/filesource.c @@ -808,12 +808,28 @@ static void test_sync_read_aligned(IAsyncReader *reader, IMemAllocator *allocato IMediaSample_Release(sample); }
+struct request_thread_params +{ + IAsyncReader *reader; + IMediaSample *sample; +}; + +static DWORD CALLBACK request_thread(void *arg) +{ + struct request_thread_params *params = arg; + HRESULT hr = IAsyncReader_Request(params->reader, params->sample, 123); + ok(hr == S_OK, "Got hr %#x.\n", hr); + return 0; +} + static void test_request(IAsyncReader *reader, IMemAllocator *allocator) { IMediaSample *sample, *sample2, *ret_sample; + struct request_thread_params params; REFERENCE_TIME start_time, end_time; BYTE *data, *data2; DWORD_PTR cookie; + HANDLE thread; HRESULT hr; LONG len; int i; @@ -897,6 +913,17 @@ static void test_request(IAsyncReader *reader, IMemAllocator *allocator) for (i = 0; i < 88; i++) ok(data2[i] == (512 + i) % 111, "Got wrong byte %02x at %u.\n", data2[i], i);
+ params.reader = reader; + params.sample = sample; + thread = CreateThread(NULL, 0, request_thread, ¶ms, 0, NULL); + ok(!WaitForSingleObject(thread, 1000), "Wait timed out.\n"); + CloseHandle(thread); + + hr = IAsyncReader_WaitForNext(reader, 1000, &ret_sample, &cookie); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(ret_sample == sample, "Samples didn't match.\n"); + ok(cookie == 123, "Got cookie %lu.\n", cookie); + IMediaSample_Release(sample); IMediaSample_Release(sample2); }