From: Akihiro Sagawa Subject: [RFC PATCH 2/5] winegstreamer: Implement listing of sink media types. Message-Id: <20200621154025.8725.375B48EC@gmail.com> Date: Sun, 21 Jun 2020 15:40:58 +0900 Though, some of media types aren't supported. They are rejected by mpeg_splitter_sink_query_accept(). Signed-off-by: Akihiro Sagawa --- dlls/quartz/tests/mpegsplit.c | 75 ++++++++++++++--------------------- dlls/winegstreamer/gstdemux.c | 26 ++++++++++++ 2 files changed, 56 insertions(+), 45 deletions(-) diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index e9cb779de2..0932351bc7 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -552,40 +552,28 @@ static void test_sink_media_types(void) expect_mt.lSampleSize = 1; hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1System; - if (hr == S_OK) - { - ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); - CoTaskMemFree(pmt); - } + ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); + DeleteMediaType(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1VideoCD; - if (hr == S_OK) - { - ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); - CoTaskMemFree(pmt); - } + ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); + DeleteMediaType(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1Video; - if (hr == S_OK) - { - ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); - CoTaskMemFree(pmt); - } + ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); + DeleteMediaType(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1Audio; - if (hr == S_OK) - { - ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); - CoTaskMemFree(pmt); - } + ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); + DeleteMediaType(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); ok(hr == S_FALSE, "Got hr %#x.\n", hr); @@ -687,12 +675,9 @@ static void test_audio_media_types(void) ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - if (hr == S_OK) - { - ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); - CoTaskMemFree(pmt); - } + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!memcmp(pmt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); + DeleteMediaType(pmt); IEnumMediaTypes_Release(enummt); IPin_Release(pin); @@ -897,8 +882,8 @@ static void test_enum_media_types(const WCHAR *resource) for (i = 0; i < 4; ++i) { hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - if (hr == S_OK) CoTaskMemFree(mts[0]); + ok(hr == S_OK, "Got hr %#x.\n", hr); + DeleteMediaType(mts[0]); } hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); @@ -910,9 +895,9 @@ static void test_enum_media_types(const WCHAR *resource) for (i = 0; i < 4; ++i) { hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(count == 1, "Got count %u.\n", count); - if (hr == S_OK) CoTaskMemFree(mts[0]); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); + DeleteMediaType(mts[0]); } hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); @@ -923,16 +908,16 @@ static void test_enum_media_types(const WCHAR *resource) ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(count == 2, "Got count %u.\n", count); - if (count > 0) CoTaskMemFree(mts[0]); - if (count > 1) CoTaskMemFree(mts[1]); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); + for (i = 0; i < count; ++i) + DeleteMediaType(mts[i]); hr = IEnumMediaTypes_Next(enum1, 3, mts, &count); ok(hr == S_FALSE, "Got hr %#x.\n", hr); - todo_wine ok(count == 2, "Got count %u.\n", count); - if (count > 0) CoTaskMemFree(mts[0]); - if (count > 1) CoTaskMemFree(mts[1]); + ok(count == 2, "Got count %u.\n", count); + for (i = 0; i < count; ++i) + DeleteMediaType(mts[i]); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); ok(hr == S_FALSE, "Got hr %#x.\n", hr); @@ -954,7 +939,7 @@ static void test_enum_media_types(const WCHAR *resource) ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 4); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); ok(hr == S_FALSE, "Got hr %#x.\n", hr); @@ -963,8 +948,8 @@ static void test_enum_media_types(const WCHAR *resource) ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - if (hr == S_OK) CoTaskMemFree(mts[0]); + ok(hr == S_OK, "Got hr %#x.\n", hr); + DeleteMediaType(mts[0]); IEnumMediaTypes_Release(enum1); IEnumMediaTypes_Release(enum2); diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 75ddb3082e..0b79c2ca13 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -2553,9 +2553,35 @@ static HRESULT mpeg_splitter_sink_query_accept(struct strmbase_pin *iface, const return S_FALSE; } +static HRESULT mpeg_splitter_sink_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt) +{ + const GUID *subtype_list[] = { + &MEDIASUBTYPE_MPEG1System, + &MEDIASUBTYPE_MPEG1VideoCD, + &MEDIASUBTYPE_MPEG1Video, + &MEDIASUBTYPE_MPEG1Audio, + }; + const AM_MEDIA_TYPE template = { + .majortype = MEDIATYPE_Stream, + .formattype = GUID_NULL, + .bFixedSizeSamples = TRUE, + .bTemporalCompression = TRUE, + .lSampleSize = 1, + }; + + if (index >= ARRAY_SIZE(subtype_list)) + return VFW_S_NO_MORE_ITEMS; + + CopyMediaType(mt, &template); + mt->subtype = *subtype_list[index]; + + return S_OK; +} + static const struct strmbase_sink_ops mpeg_splitter_sink_ops = { .base.pin_query_accept = mpeg_splitter_sink_query_accept, + .base.pin_get_media_type = mpeg_splitter_sink_get_media_type, .sink_connect = gstdemux_sink_connect, .sink_disconnect = gstdemux_sink_disconnect, };