[PATCH v5 5/5] winegstreamer: Implement IMFMediaSource::Shutdown.
Derek Lesho
dlesho at codeweavers.com
Wed Sep 2 14:26:02 CDT 2020
Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
v5:
- Allow the event queue to handle the shutdown state.
- Shutdown the media source on release.
---
dlls/mfplat/tests/mfplat.c | 4 ++--
dlls/winegstreamer/media_source.c | 36 +++++++++++++++++++++++++++++--
2 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 94fdf9e6f39..309f7b669a4 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -673,14 +673,14 @@ todo_wine
IMFMediaTypeHandler_Release(handler);
IMFPresentationDescriptor_Release(descriptor);
+skip_source_tests:
+
hr = IMFMediaSource_Shutdown(mediasource);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, NULL);
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
-skip_source_tests:
-
IMFMediaSource_Release(mediasource);
IMFByteStream_Release(stream);
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index b98949459ce..d8536bba00a 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -20,6 +20,12 @@ struct media_source
IMFMediaSource IMFMediaSource_iface;
LONG ref;
IMFMediaEventQueue *event_queue;
+ enum
+ {
+ SOURCE_OPENING,
+ SOURCE_STOPPED,
+ SOURCE_SHUTDOWN,
+ } state;
};
static inline struct media_source *impl_from_IMFMediaSource(IMFMediaSource *iface)
@@ -69,6 +75,7 @@ static ULONG WINAPI media_source_Release(IMFMediaSource *iface)
if (!ref)
{
+ IMFMediaSource_Shutdown(&source->IMFMediaSource_iface);
IMFMediaEventQueue_Release(source->event_queue);
heap_free(source);
}
@@ -119,6 +126,9 @@ static HRESULT WINAPI media_source_GetCharacteristics(IMFMediaSource *iface, DWO
FIXME("(%p)->(%p): stub\n", source, characteristics);
+ if (source->state == SOURCE_SHUTDOWN)
+ return MF_E_SHUTDOWN;
+
return E_NOTIMPL;
}
@@ -128,6 +138,9 @@ static HRESULT WINAPI media_source_CreatePresentationDescriptor(IMFMediaSource *
FIXME("(%p)->(%p): stub\n", source, descriptor);
+ if (source->state == SOURCE_SHUTDOWN)
+ return MF_E_SHUTDOWN;
+
return E_NOTIMPL;
}
@@ -138,6 +151,9 @@ static HRESULT WINAPI media_source_Start(IMFMediaSource *iface, IMFPresentationD
FIXME("(%p)->(%p, %p, %p): stub\n", source, descriptor, time_format, start_position);
+ if (source->state == SOURCE_SHUTDOWN)
+ return MF_E_SHUTDOWN;
+
return E_NOTIMPL;
}
@@ -147,6 +163,9 @@ static HRESULT WINAPI media_source_Stop(IMFMediaSource *iface)
FIXME("(%p): stub\n", source);
+ if (source->state == SOURCE_SHUTDOWN)
+ return MF_E_SHUTDOWN;
+
return E_NOTIMPL;
}
@@ -156,6 +175,9 @@ static HRESULT WINAPI media_source_Pause(IMFMediaSource *iface)
FIXME("(%p): stub\n", source);
+ if (source->state == SOURCE_SHUTDOWN)
+ return MF_E_SHUTDOWN;
+
return E_NOTIMPL;
}
@@ -163,9 +185,17 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
{
struct media_source *source = impl_from_IMFMediaSource(iface);
- FIXME("(%p): stub\n", source);
+ TRACE("(%p)\n", source);
- return E_NOTIMPL;
+ if (source->state == SOURCE_SHUTDOWN)
+ return MF_E_SHUTDOWN;
+
+ source->state = SOURCE_SHUTDOWN;
+
+ if (source->event_queue)
+ IMFMediaEventQueue_Shutdown(source->event_queue);
+
+ return S_OK;
}
static const IMFMediaSourceVtbl IMFMediaSource_vtbl =
@@ -196,6 +226,8 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
goto fail;
+ object->state = SOURCE_STOPPED;
+
object->IMFMediaSource_iface.lpVtbl = &IMFMediaSource_vtbl;
object->ref = 1;
--
2.28.0
More information about the wine-devel
mailing list