Module: wine Branch: master Commit: 545b1c67b58d08d2e4bab40049cb20dd5ecfe8ad URL: https://gitlab.winehq.org/wine/wine/-/commit/545b1c67b58d08d2e4bab40049cb20d...
Author: Akihiro Sagawa sagawa.aki@gmail.com Date: Sun Mar 31 21:02:37 2024 +0900
winegstreamer: Implement input media type enumeration in MPEG splitter.
---
dlls/quartz/tests/mpegsplit.c | 75 +++++++++++++++----------------------- dlls/winegstreamer/quartz_parser.c | 23 ++++++++++++ 2 files changed, 53 insertions(+), 45 deletions(-)
diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index 9e29dc1a54e..8fd0202c58e 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -556,40 +556,28 @@ static void test_media_types(void) expect_mt.lSampleSize = 1;
hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\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"); + CoTaskMemFree(pmt);
hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\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"); + CoTaskMemFree(pmt);
hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\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"); + CoTaskMemFree(pmt);
hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\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"); + CoTaskMemFree(pmt);
hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); ok(hr == S_FALSE, "Got hr %#lx.\n", hr); @@ -655,13 +643,10 @@ static void test_media_types(void) ok(hr == S_OK, "Got hr %#lx.\n", hr);
hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\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"); + CoTaskMemFree(pmt);
IEnumMediaTypes_Release(enummt); IPin_Release(pin); @@ -866,8 +851,8 @@ static void test_enum_media_types(void) for (i = 0; i < 4; ++i) { hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - if (hr == S_OK) CoTaskMemFree(mts[0]); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + CoTaskMemFree(mts[0]); }
hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); @@ -879,9 +864,9 @@ static void test_enum_media_types(void) for (i = 0; i < 4; ++i) { hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(count == 1, "Got count %lu.\n", count); - if (hr == S_OK) CoTaskMemFree(mts[0]); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(count == 1, "Got count %lu.\n", count); + CoTaskMemFree(mts[0]); }
hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); @@ -892,16 +877,16 @@ static void test_enum_media_types(void) ok(hr == S_OK, "Got hr %#lx.\n", hr);
hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(count == 2, "Got count %lu.\n", count); - if (count > 0) CoTaskMemFree(mts[0]); - if (count > 1) CoTaskMemFree(mts[1]); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(count == 2, "Got count %lu.\n", count); + CoTaskMemFree(mts[0]); + CoTaskMemFree(mts[1]);
hr = IEnumMediaTypes_Next(enum1, 3, mts, &count); ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - todo_wine ok(count == 2, "Got count %lu.\n", count); - if (count > 0) CoTaskMemFree(mts[0]); - if (count > 1) CoTaskMemFree(mts[1]); + ok(count == 2, "Got count %lu.\n", count); + CoTaskMemFree(mts[0]); + CoTaskMemFree(mts[1]);
hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); ok(hr == S_FALSE, "Got hr %#lx.\n", hr); @@ -923,7 +908,7 @@ static void test_enum_media_types(void) ok(hr == S_OK, "Got hr %#lx.\n", hr);
hr = IEnumMediaTypes_Skip(enum1, 4); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\n", hr);
hr = IEnumMediaTypes_Skip(enum1, 1); ok(hr == S_FALSE, "Got hr %#lx.\n", hr); @@ -932,8 +917,8 @@ static void test_enum_media_types(void) ok(hr == S_FALSE, "Got hr %#lx.\n", hr);
hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - if (hr == S_OK) CoTaskMemFree(mts[0]); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + CoTaskMemFree(mts[0]);
IEnumMediaTypes_Release(enum1); IEnumMediaTypes_Release(enum2); diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index c8f72a42c73..32eb6e1a4a0 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -2358,9 +2358,32 @@ 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 *pin, + unsigned int index, AM_MEDIA_TYPE *mt) +{ + static const GUID* const subtypes[] = { + &MEDIASUBTYPE_MPEG1System, + &MEDIASUBTYPE_MPEG1VideoCD, + &MEDIASUBTYPE_MPEG1Video, + &MEDIASUBTYPE_MPEG1Audio, + }; + if (index >= ARRAY_SIZE(subtypes)) + return S_FALSE; + + memset(mt, 0, sizeof(*mt)); + mt->majortype = MEDIATYPE_Stream; + mt->subtype = *subtypes[index]; + mt->bFixedSizeSamples = TRUE; + mt->bTemporalCompression = TRUE; + mt->lSampleSize = 1; + + 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 = parser_sink_connect, .sink_disconnect = parser_sink_disconnect, };