Fixes: a7c515fe01c4902a3e7c6b60608a54b77e252b47 Signed-off-by: Gijs Vermeulen gijsvrm@gmail.com --- dlls/amstream/ddrawstream.c | 26 +++++----- dlls/amstream/tests/amstream.c | 93 ++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 12 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..8a6dc26f96 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, };
@@ -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();
On 7/24/20 10:50 AM, Gijs Vermeulen wrote:
Fixes: a7c515fe01c4902a3e7c6b60608a54b77e252b47 Signed-off-by: Gijs Vermeulen gijsvrm@gmail.com
dlls/amstream/ddrawstream.c | 26 +++++----- dlls/amstream/tests/amstream.c | 93 ++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 12 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))
{ LeaveCriticalSection(&stream->cs); return VFW_E_TYPE_NOT_ACCEPTED;|| !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
@@ -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..8a6dc26f96 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,
@@ -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);
Slight error here: comparison operators bind tighter than the ternary operator, so the right side needs to be parenthesized.
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();