[PATCH 0/3] MR5529: winegstreamer: Implement input media type enumeration in MPEG splitter.
Split from !5430. Patch 2/3 should fix amstream test failures, spotted at https://gitlab.winehq.org/wine/wine/-/merge_requests/5430#note_67851 . -- https://gitlab.winehq.org/wine/wine/-/merge_requests/5529
From: Akihiro Sagawa <sagawa.aki(a)gmail.com> --- dlls/quartz/tests/mpegsplit.c | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index 73d021b6297..c44eeb0dff5 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -2120,6 +2120,49 @@ static void test_video_file(void) ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); } +static void test_no_acceptable_type(void) +{ + const WCHAR *filename = load_resource(L"test.wav"); + IBaseFilter *splitter = create_mpeg_splitter(); + IFileSourceFilter *filesource; + IFilterGraph2 *graph; + IBaseFilter *reader; + IPin *source, *sink; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, + &IID_IBaseFilter, (void **)&reader); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IBaseFilter_QueryInterface(reader, &IID_IFileSourceFilter, (void **)&filesource); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IFileSourceFilter_Load(filesource, filename, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, + &IID_IFilterGraph2, (void **)&graph); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IFilterGraph2_AddFilter(graph, reader, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IFilterGraph2_AddFilter(graph, splitter, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IBaseFilter_FindPin(splitter, L"Input", &sink); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IBaseFilter_FindPin(reader, L"Output", &source); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IFilterGraph2_ConnectDirect(graph, source, sink, NULL); + todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + + IPin_Release(source); + IPin_Release(sink); + IBaseFilter_Release(reader); + IBaseFilter_Release(splitter); + IFileSourceFilter_Release(filesource); + IFilterGraph2_Release(graph); + DeleteFileW(filename); +} + START_TEST(mpegsplit) { IBaseFilter *filter; @@ -2147,6 +2190,7 @@ START_TEST(mpegsplit) test_streaming(); test_large_file(); test_video_file(); + test_no_acceptable_type(); CoUninitialize(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/5529
From: Akihiro Sagawa <sagawa.aki(a)gmail.com> --- dlls/quartz/tests/mpegsplit.c | 2 +- dlls/winegstreamer/quartz_parser.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index c44eeb0dff5..9e29dc1a54e 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -2152,7 +2152,7 @@ static void test_no_acceptable_type(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, sink, NULL); - todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); IPin_Release(source); IPin_Release(sink); diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 9b17b0afddd..24322083f18 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -2385,7 +2385,11 @@ static BOOL mpeg_splitter_filter_init_gst(struct parser *filter) if (!create_pin(filter, wg_parser_get_stream(parser, i), L"Audio")) return FALSE; } - else FIXME("unexpected format %u\n", fmt.major_type); + else + { + TRACE("unexpected format %u\n", fmt.major_type); + return FALSE; + } } return TRUE; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/5529
From: Akihiro Sagawa <sagawa.aki(a)gmail.com> --- 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 24322083f18..fd435639620 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -2356,9 +2356,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, }; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/5529
This merge request was approved by Elizabeth Figura. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/5529
participants (3)
-
Akihiro Sagawa -
Akihiro Sagawa (@sgwaki) -
Elizabeth Figura (@zfigura)