Fixes: a7c515fe01c4902a3e7c6b60608a54b77e252b47
Signed-off-by: Gijs Vermeulen <gijsvrm(a)gmail.com>
---
dlls/amstream/ddrawstream.c | 26 +++++-----
dlls/amstream/tests/amstream.c | 95 +++++++++++++++++++++++++++++++++-
2 files changed, 108 insertions(+), 13 deletions(-)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c
index 9f74eaf91a..4c94bacf52 100644
--- a/dlls/amstream/ddrawstream.c
+++ b/dlls/amstream/ddrawstream.c
@@ -632,16 +632,6 @@ static HRESULT WINAPI ddraw_sink_Connect(IPin *iface, IPin *peer, const AM_MEDIA
return E_UNEXPECTED;
}
-static BOOL check_media_type(const AM_MEDIA_TYPE *mt)
-{
- if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Video)
- && IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB8)
- && IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
- return TRUE;
-
- return FALSE;
-}
-
static HRESULT WINAPI ddraw_sink_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
{
struct ddraw_stream *stream = impl_from_IPin(iface);
@@ -657,7 +647,13 @@ static HRESULT WINAPI ddraw_sink_ReceiveConnection(IPin *iface, IPin *peer, cons
return VFW_E_ALREADY_CONNECTED;
}
- if (!check_media_type(mt))
+ if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Video)
+ || (!IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB8)
+ && !IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB24)
+ && !IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB32)
+ && !IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB555)
+ && !IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB565))
+ || !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
{
LeaveCriticalSection(&stream->cs);
return VFW_E_TYPE_NOT_ACCEPTED;
@@ -788,7 +784,13 @@ static HRESULT WINAPI ddraw_sink_QueryId(IPin *iface, WCHAR **id)
static HRESULT WINAPI ddraw_sink_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *mt)
{
TRACE("iface %p, mt %p.\n", iface, mt);
- return check_media_type(mt) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED;
+
+ if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Video)
+ && IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB8)
+ && IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
+ return S_OK;
+
+ return VFW_E_TYPE_NOT_ACCEPTED;
}
static HRESULT WINAPI ddraw_sink_EnumMediaTypes(IPin *iface, IEnumMediaTypes **enum_media_types)
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index 8adf9db934..68d2b9c18f 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -28,6 +28,7 @@
#include "initguid.h"
#include "ksmedia.h"
#include "dvdmedia.h"
+#include "wmcodecdsp.h"
#include "wine/strmbase.h"
static const WAVEFORMATEX audio_format =
@@ -2330,6 +2331,14 @@ static void test_media_types(void)
&MEDIASUBTYPE_ARGB32,
&MEDIASUBTYPE_ARGB1555,
&MEDIASUBTYPE_ARGB4444,
+ &MEDIASUBTYPE_Avi,
+ &MEDIASUBTYPE_I420,
+ &MEDIASUBTYPE_AYUV,
+ &MEDIASUBTYPE_YV12,
+ &MEDIASUBTYPE_YUY2,
+ &MEDIASUBTYPE_UYVY,
+ &MEDIASUBTYPE_YVYU,
+ &MEDIASUBTYPE_NV12,
&GUID_NULL,
};
@@ -2364,7 +2373,7 @@ static void test_media_types(void)
pmt->cbFormat = tests[i].size;
pmt->pbFormat = tests[i].format;
hr = IPin_QueryAccept(pin, pmt);
- ok(hr == (i == 6) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr);
+ ok(hr == (i == 6 ? S_OK : VFW_E_TYPE_NOT_ACCEPTED), "Got hr %#x.\n", hr);
}
pmt->bFixedSizeSamples = FALSE;
@@ -3243,6 +3252,89 @@ static void test_audiostream_receive_connection(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_ddrawstream_receive_connection(void)
+{
+ static const VIDEOINFOHEADER req_vih;
+ IDirectDrawMediaStream *ddraw_stream;
+ IAMMultiMediaStream *mmstream;
+ struct testfilter source;
+ IMediaStream *stream;
+ AM_MEDIA_TYPE mt;
+ HRESULT hr;
+ ULONG ref;
+ IPin *pin;
+ int i;
+
+ const AM_MEDIA_TYPE video_mt =
+ {
+ .majortype = MEDIATYPE_Video,
+ .subtype = MEDIASUBTYPE_RGB8,
+ .formattype = FORMAT_VideoInfo,
+ .cbFormat = sizeof(VIDEOINFOHEADER),
+ .pbFormat = (BYTE *)&req_vih,
+ };
+
+ static const GUID *subtypes[] =
+ {
+ &MEDIASUBTYPE_RGB24,
+ &MEDIASUBTYPE_RGB32,
+ &MEDIASUBTYPE_RGB555,
+ &MEDIASUBTYPE_RGB565,
+ &MEDIASUBTYPE_RGB1,
+ &MEDIASUBTYPE_RGB4,
+ &MEDIASUBTYPE_ARGB32,
+ &MEDIASUBTYPE_ARGB1555,
+ &MEDIASUBTYPE_ARGB4444,
+ &MEDIASUBTYPE_Avi,
+ &MEDIASUBTYPE_I420,
+ &MEDIASUBTYPE_AYUV,
+ &MEDIASUBTYPE_YV12,
+ &MEDIASUBTYPE_YUY2,
+ &MEDIASUBTYPE_UYVY,
+ &MEDIASUBTYPE_YVYU,
+ &MEDIASUBTYPE_NV12,
+ &GUID_NULL,
+ };
+
+ mmstream = create_ammultimediastream();
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, &stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IMediaStream_QueryInterface(stream, &IID_IDirectDrawMediaStream, (void **)&ddraw_stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IMediaStream_QueryInterface(stream, &IID_IPin, (void **)&pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ testfilter_init(&source);
+
+ mt = video_mt;
+ hr = IPin_ReceiveConnection(pin, &source.source.pin.IPin_iface, &mt);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IPin_Disconnect(pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(subtypes); ++i)
+ {
+ mt = video_mt;
+ mt.subtype = *subtypes[i];
+ hr = IPin_ReceiveConnection(pin, &source.source.pin.IPin_iface, &mt);
+ ok(hr == (i < 4 ? S_OK : VFW_E_TYPE_NOT_ACCEPTED), "Got hr %#x.\n", hr);
+ if (hr == S_OK)
+ {
+ hr = IPin_Disconnect(pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ }
+ }
+
+ ref = IAMMultiMediaStream_Release(mmstream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ IPin_Release(pin);
+ IDirectDrawMediaStream_Release(ddraw_stream);
+ ref = IMediaStream_Release(stream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
static void test_audiostream_set_state(void)
{
IAMMultiMediaStream *mmstream = create_ammultimediastream();
@@ -5238,6 +5330,7 @@ START_TEST(amstream)
test_ddrawstream_initialize();
test_ddrawstream_getsetdirectdraw();
+ test_ddrawstream_receive_connection();
test_ammediastream_join_am_multi_media_stream();
test_ammediastream_join_filter();
--
2.27.0