Anton Baskanov : amstream: Implement adding existing streams in AMMultiMediaStream::AddMediaStream.
Alexandre Julliard
julliard at winehq.org
Fri Mar 27 16:14:39 CDT 2020
Module: wine
Branch: master
Commit: 7ff63efa015f6d8f08c7b3e6697437601c76077c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7ff63efa015f6d8f08c7b3e6697437601c76077c
Author: Anton Baskanov <baskanov at gmail.com>
Date: Fri Mar 27 11:54:29 2020 -0500
amstream: Implement adding existing streams in AMMultiMediaStream::AddMediaStream.
Signed-off-by: Anton Baskanov <baskanov at gmail.com>
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/amstream/multimedia.c | 51 +++++++++++++++++++++++++++++++++---------
dlls/amstream/tests/amstream.c | 12 +++++-----
2 files changed, 47 insertions(+), 16 deletions(-)
diff --git a/dlls/amstream/multimedia.c b/dlls/amstream/multimedia.c
index 07c037505e..be8fd4ecbf 100644
--- a/dlls/amstream/multimedia.c
+++ b/dlls/amstream/multimedia.c
@@ -298,6 +298,16 @@ static HRESULT WINAPI multimedia_stream_GetFilter(IAMMultiMediaStream *iface,
return S_OK;
}
+static void add_stream(struct multimedia_stream *mmstream, IAMMediaStream *stream, IMediaStream **ret_stream)
+{
+ IMediaStreamFilter_AddMediaStream(mmstream->filter, stream);
+ if (ret_stream)
+ {
+ *ret_stream = (IMediaStream *)stream;
+ IMediaStream_AddRef(*ret_stream);
+ }
+}
+
static HRESULT WINAPI multimedia_stream_AddMediaStream(IAMMultiMediaStream *iface,
IUnknown *stream_object, const MSPID *PurposeId, DWORD dwFlags, IMediaStream **ret_stream)
{
@@ -309,9 +319,6 @@ static HRESULT WINAPI multimedia_stream_AddMediaStream(IAMMultiMediaStream *ifac
TRACE("mmstream %p, stream_object %p, id %s, flags %#x, ret_stream %p.\n",
This, stream_object, debugstr_guid(PurposeId), dwFlags, ret_stream);
- if (!IsEqualGUID(PurposeId, &MSPID_PrimaryVideo) && !IsEqualGUID(PurposeId, &MSPID_PrimaryAudio))
- return MS_E_PURPOSEID;
-
if (IMediaStreamFilter_GetMediaStream(This->filter, PurposeId, &stream) == S_OK)
{
IMediaStream_Release(stream);
@@ -343,19 +350,43 @@ static HRESULT WINAPI multimedia_stream_AddMediaStream(IAMMultiMediaStream *ifac
return hr;
}
+ if (stream_object)
+ {
+ hr = IUnknown_QueryInterface(stream_object, &IID_IAMMediaStream, (void **)&pStream);
+ if (SUCCEEDED(hr))
+ {
+ MSPID stream_id;
+ hr = IAMMediaStream_GetInformation(pStream, &stream_id, NULL);
+ if (SUCCEEDED(hr))
+ {
+ if (IsEqualGUID(PurposeId, &stream_id))
+ {
+ add_stream(This, pStream, ret_stream);
+ hr = S_OK;
+ }
+ else
+ {
+ hr = MS_E_PURPOSEID;
+ }
+ }
+
+ IAMMediaStream_Release(pStream);
+
+ return hr;
+ }
+ }
+
if (IsEqualGUID(PurposeId, &MSPID_PrimaryVideo))
hr = ddraw_stream_create((IMultiMediaStream*)iface, PurposeId, stream_object, This->type, &pStream);
- else
+ else if (IsEqualGUID(PurposeId, &MSPID_PrimaryAudio))
hr = audio_stream_create((IMultiMediaStream*)iface, PurposeId, stream_object, This->type, &pStream);
+ else
+ return MS_E_PURPOSEID;
if (SUCCEEDED(hr))
{
- /* Add stream to the media stream filter */
- IMediaStreamFilter_AddMediaStream(This->filter, pStream);
- if (ret_stream)
- *ret_stream = (IMediaStream *)pStream;
- else
- IAMMediaStream_Release(pStream);
+ add_stream(This, pStream, ret_stream);
+ IAMMediaStream_Release(pStream);
}
return hr;
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index a55884d8ab..09686cfcf4 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -684,21 +684,21 @@ static void test_add_stream(void)
ok(hr == MS_E_PURPOSEID, "Got hr %#x.\n", hr);
hr = IAMMultiMediaStream_AddMediaStream(mmstream, (IUnknown *)&teststream, &test_mspid, 0, &stream);
- todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
- todo_wine ok(stream == (IMediaStream *)&teststream, "Streams didn't match.\n");
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(stream == (IMediaStream *)&teststream, "Streams didn't match.\n");
if (hr == S_OK) IMediaStream_Release(stream);
todo_wine ok(teststream_mmstream == mmstream, "IAMMultiMediaStream objects didn't match.\n");
- todo_wine ok(teststream_filter == stream_filter, "IMediaStreamFilter objects didn't match.\n");
+ ok(teststream_filter == stream_filter, "IMediaStreamFilter objects didn't match.\n");
todo_wine ok(!!teststream_graph, "Expected a non-NULL graph.\n");
check_enum_stream(mmstream, stream_filter, 0, video_stream);
check_enum_stream(mmstream, stream_filter, 1, audio_stream);
- todo_wine check_enum_stream(mmstream, stream_filter, 2, (IMediaStream *)&teststream);
+ check_enum_stream(mmstream, stream_filter, 2, (IMediaStream *)&teststream);
check_enum_stream(mmstream, stream_filter, 3, NULL);
check_get_stream(mmstream, stream_filter, &MSPID_PrimaryVideo, video_stream);
check_get_stream(mmstream, stream_filter, &MSPID_PrimaryAudio, audio_stream);
- todo_wine check_get_stream(mmstream, stream_filter, &test_mspid, (IMediaStream *)&teststream);
+ check_get_stream(mmstream, stream_filter, &test_mspid, (IMediaStream *)&teststream);
hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, &stream);
ok(hr == MS_E_PURPOSEID, "Got hr %#x.\n", hr);
@@ -839,7 +839,7 @@ static void test_add_stream(void)
ok(hr == MS_E_PURPOSEID, "Got hr %#x.\n", hr);
hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &test_mspid,
AMMSF_ADDDEFAULTRENDERER, &audio_stream);
- todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
IMediaStreamFilter_Release(stream_filter);
ref = IAMMultiMediaStream_Release(mmstream);
More information about the wine-cvs
mailing list