[PATCH 5/6] strmbase: Introduce filter state callbacks.
Zebediah Figura
z.figura12 at gmail.com
Wed Oct 23 20:04:26 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/strmbase/filter.c | 64 +++++++++++++++++++++++++++++------------
include/wine/strmbase.h | 6 ++++
2 files changed, 52 insertions(+), 18 deletions(-)
diff --git a/dlls/strmbase/filter.c b/dlls/strmbase/filter.c
index e1885cd935..ffe506d517 100644
--- a/dlls/strmbase/filter.c
+++ b/dlls/strmbase/filter.c
@@ -126,54 +126,82 @@ HRESULT WINAPI BaseFilterImpl_GetClassID(IBaseFilter * iface, CLSID * pClsid)
HRESULT WINAPI BaseFilterImpl_Stop(IBaseFilter *iface)
{
struct strmbase_filter *filter = impl_from_IBaseFilter(iface);
+ HRESULT hr = S_OK;
- TRACE("iface %p.\n", iface);
+ TRACE("filter %p.\n", filter);
EnterCriticalSection(&filter->csFilter);
- filter->state = State_Stopped;
+
+ if (filter->state == State_Running && filter->ops->filter_stop_stream)
+ hr = filter->ops->filter_stop_stream(filter);
+ if (SUCCEEDED(hr) && filter->ops->filter_cleanup_stream)
+ hr = filter->ops->filter_cleanup_stream(filter);
+ if (SUCCEEDED(hr))
+ filter->state = State_Stopped;
+
LeaveCriticalSection(&filter->csFilter);
- return S_OK;
+ return hr;
}
HRESULT WINAPI BaseFilterImpl_Pause(IBaseFilter *iface)
{
struct strmbase_filter *filter = impl_from_IBaseFilter(iface);
+ HRESULT hr = S_OK;
- TRACE("iface %p.\n", iface);
+ TRACE("filter %p.\n", filter);
EnterCriticalSection(&filter->csFilter);
- filter->state = State_Paused;
+
+ if (filter->state == State_Stopped && filter->ops->filter_init_stream)
+ hr = filter->ops->filter_init_stream(filter);
+ else if (filter->state == State_Running && filter->ops->filter_stop_stream)
+ hr = filter->ops->filter_stop_stream(filter);
+ if (SUCCEEDED(hr))
+ filter->state = State_Paused;
+
LeaveCriticalSection(&filter->csFilter);
- return S_OK;
+ return hr;
}
HRESULT WINAPI BaseFilterImpl_Run(IBaseFilter *iface, REFERENCE_TIME start)
{
struct strmbase_filter *filter = impl_from_IBaseFilter(iface);
+ HRESULT hr = S_OK;
- TRACE("iface %p, start %s.\n", iface, debugstr_time(start));
+ TRACE("filter %p, start %s.\n", filter, debugstr_time(start));
EnterCriticalSection(&filter->csFilter);
- filter->state = State_Running;
+
+ if (filter->state == State_Stopped && filter->ops->filter_init_stream)
+ hr = filter->ops->filter_init_stream(filter);
+ if (SUCCEEDED(hr) && filter->ops->filter_start_stream)
+ hr = filter->ops->filter_start_stream(filter, start);
+ if (SUCCEEDED(hr))
+ filter->state = State_Running;
+
LeaveCriticalSection(&filter->csFilter);
- return S_OK;
+ return hr;
}
-HRESULT WINAPI BaseFilterImpl_GetState(IBaseFilter * iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState )
+HRESULT WINAPI BaseFilterImpl_GetState(IBaseFilter *iface, DWORD timeout, FILTER_STATE *state)
{
- struct strmbase_filter *This = impl_from_IBaseFilter(iface);
- TRACE("(%p)->(%d, %p)\n", This, dwMilliSecsTimeout, pState);
+ struct strmbase_filter *filter = impl_from_IBaseFilter(iface);
+ HRESULT hr = S_OK;
- EnterCriticalSection(&This->csFilter);
- {
- *pState = This->state;
- }
- LeaveCriticalSection(&This->csFilter);
+ TRACE("filter %p, timeout %u, state %p.\n", filter, timeout, state);
- return S_OK;
+ EnterCriticalSection(&filter->csFilter);
+
+ if (filter->ops->filter_wait_state)
+ hr = filter->ops->filter_wait_state(filter, timeout);
+ *state = filter->state;
+
+ LeaveCriticalSection(&filter->csFilter);
+
+ return hr;
}
HRESULT WINAPI BaseFilterImpl_SetSyncSource(IBaseFilter * iface, IReferenceClock *pClock)
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 3f0883fcb6..a4920054e6 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -170,6 +170,12 @@ struct strmbase_filter_ops
IPin *(*filter_get_pin)(struct strmbase_filter *iface, unsigned int index);
void (*filter_destroy)(struct strmbase_filter *iface);
HRESULT (*filter_query_interface)(struct strmbase_filter *iface, REFIID iid, void **out);
+
+ HRESULT (*filter_init_stream)(struct strmbase_filter *iface);
+ HRESULT (*filter_start_stream)(struct strmbase_filter *iface, REFERENCE_TIME time);
+ HRESULT (*filter_stop_stream)(struct strmbase_filter *iface);
+ HRESULT (*filter_cleanup_stream)(struct strmbase_filter *iface);
+ HRESULT (*filter_wait_state)(struct strmbase_filter *iface, DWORD timeout);
};
HRESULT WINAPI BaseFilterImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv);
--
2.20.1
More information about the wine-devel
mailing list