Fixes in-game video playback in Earth 2150.
From: Anton Baskanov baskanov@gmail.com
--- dlls/quartz/tests/mpegsplit.c | 82 ++++++++++++++++++++++++++++++++++ dlls/quartz/tests/rsrc.rc | 4 ++ dlls/quartz/tests/test2.mpg | Bin 0 -> 12288 bytes 3 files changed, 86 insertions(+) create mode 100644 dlls/quartz/tests/test2.mpg
diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index 73d021b6297..ea9eb7e87c6 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -447,6 +447,88 @@ static void test_find_pin(void) ok(!ref, "Got outstanding refcount %ld.\n", ref); ret = DeleteFileW(filename); ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + + filename = load_resource(L"test.mpg"); + filter = create_mpeg_splitter(); + graph = connect_input(filter, filename); + + hr = IBaseFilter_EnumPins(filter, &enum_pins); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IBaseFilter_FindPin(filter, L"Input", &pin); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + IPin_Release(pin); + IPin_Release(pin2); + + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IBaseFilter_FindPin(filter, L"Video", &pin); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + IPin_Release(pin); + IPin_Release(pin2); + + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IBaseFilter_FindPin(filter, L"Audio", &pin); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + IPin_Release(pin); + IPin_Release(pin2); + + IEnumPins_Release(enum_pins); + IFilterGraph2_Release(graph); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %ld.\n", ref); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + + filename = load_resource(L"test2.mpg"); + filter = create_mpeg_splitter(); + graph = connect_input(filter, filename); + + hr = IBaseFilter_EnumPins(filter, &enum_pins); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IBaseFilter_FindPin(filter, L"Input", &pin); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + IPin_Release(pin); + IPin_Release(pin2); + + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IBaseFilter_FindPin(filter, L"Audio", &pin); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + IPin_Release(pin); + IPin_Release(pin2); + + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IBaseFilter_FindPin(filter, L"Video", &pin); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + IPin_Release(pin); + IPin_Release(pin2); + + IEnumPins_Release(enum_pins); + IFilterGraph2_Release(graph); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %ld.\n", ref); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); }
static void test_pin_info(void) diff --git a/dlls/quartz/tests/rsrc.rc b/dlls/quartz/tests/rsrc.rc index 2cc0d789ff0..02c9939bc7b 100644 --- a/dlls/quartz/tests/rsrc.rc +++ b/dlls/quartz/tests/rsrc.rc @@ -28,6 +28,10 @@ test.avi RCDATA "test.avi" /* @makedep: test.mpg */ test.mpg RCDATA "test.mpg"
+/* ffmpeg -f lavfi -i smptebars -f lavfi -i "sine=frequency=1000" -t 0.16 -r 25 -f mpeg -vcodec mpeg1video -vf scale=32x24 -acodec mp2 test2.mpg && ffmpeg -f lavfi -i smptebars -f lavfi -i "sine=frequency=1000" -t 0.16 -r 25 -f mpeg -vcodec mpeg1video -vf scale=32x24 -acodec mp2 -map 1 -map 0 - | dd conv=notrunc of=test2.mpg bs=1 count=30 */ +/* @makedep: test2.mpg */ +test2.mpg RCDATA "test2.mpg" + /* ffmpeg -f lavfi -i "sine=frequency=500" -t 0.5 -ar 48000 -b:a 32k -f mp3 -acodec mp3 -write_xing 0 test.mp3 */ /* @makedep: test.mp3 */ test.mp3 RCDATA "test.mp3" diff --git a/dlls/quartz/tests/test2.mpg b/dlls/quartz/tests/test2.mpg new file mode 100644 index 0000000000000000000000000000000000000000..b91c27d4991ea5156d292e32f19b9aa08f5431c9 GIT binary patch literal 12288 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
literal 0 HcmV?d00001
From: Anton Baskanov baskanov@gmail.com
Fixes in-game video playback in Earth 2150. --- dlls/quartz/tests/mpegsplit.c | 4 +- dlls/winegstreamer/quartz_parser.c | 77 ++++++++++++++++++++++++++---- 2 files changed, 69 insertions(+), 12 deletions(-)
diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index ea9eb7e87c6..dca22f73a63 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -510,7 +510,7 @@ static void test_find_pin(void)
hr = IBaseFilter_FindPin(filter, L"Audio", &pin); ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2);
@@ -519,7 +519,7 @@ static void test_find_pin(void)
hr = IBaseFilter_FindPin(filter, L"Video", &pin); ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2);
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index c41b0dca0f6..63322bec324 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -73,7 +73,7 @@ struct parser
HANDLE read_thread;
- BOOL (*init_gst)(struct parser *filter); + BOOL (*init_gst)(struct parser *filter, const AM_MEDIA_TYPE *mt); HRESULT (*source_query_accept)(struct parser_source *pin, const AM_MEDIA_TYPE *mt); HRESULT (*source_get_media_type)(struct parser_source *pin, unsigned int index, AM_MEDIA_TYPE *mt); }; @@ -1517,7 +1517,7 @@ static HRESULT parser_sink_connect(struct strmbase_sink *iface, IPin *peer, cons if (FAILED(hr = wg_parser_connect(filter->wg_parser, file_size))) goto err;
- if (!filter->init_gst(filter)) + if (!filter->init_gst(filter, pmt)) { hr = E_FAIL; goto err; @@ -1556,7 +1556,7 @@ static const struct strmbase_sink_ops sink_ops = .sink_disconnect = parser_sink_disconnect, };
-static BOOL decodebin_parser_filter_init_gst(struct parser *filter) +static BOOL decodebin_parser_filter_init_gst(struct parser *filter, const AM_MEDIA_TYPE *mt) { wg_parser_t parser = filter->wg_parser; unsigned int i, stream_count; @@ -2198,7 +2198,7 @@ static const struct strmbase_sink_ops wave_parser_sink_ops = .sink_disconnect = parser_sink_disconnect, };
-static BOOL wave_parser_filter_init_gst(struct parser *filter) +static BOOL wave_parser_filter_init_gst(struct parser *filter, const AM_MEDIA_TYPE *mt) { if (!create_pin(filter, wg_parser_get_stream(filter->wg_parser, 0), L"output")) return FALSE; @@ -2267,7 +2267,7 @@ static const struct strmbase_sink_ops avi_splitter_sink_ops = .sink_disconnect = parser_sink_disconnect, };
-static BOOL avi_splitter_filter_init_gst(struct parser *filter) +static BOOL avi_splitter_filter_init_gst(struct parser *filter, const AM_MEDIA_TYPE *mt) { wg_parser_t parser = filter->wg_parser; uint32_t i, stream_count; @@ -2350,9 +2350,51 @@ static const struct strmbase_sink_ops mpeg_splitter_sink_ops = .sink_disconnect = parser_sink_disconnect, };
-static BOOL mpeg_splitter_filter_init_gst(struct parser *filter) +static BOOL mpeg_splitter_is_audio_stream_first(struct parser *filter, const AM_MEDIA_TYPE *mt) +{ + DWORD max_stream_count; + DWORD header_length; + BYTE buffer[2]; + DWORD i; + + if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Stream) + || !IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MPEG1System)) + return FALSE; + + if (FAILED(IAsyncReader_SyncRead(filter->reader, 16, 2, buffer))) + return FALSE; + + header_length = MAKEWORD(buffer[1], buffer[0]); + if (header_length < 6) + return FALSE; + max_stream_count = (header_length - 6) / 3; + + for (i = 0; i < max_stream_count; ++i) + { + BYTE stream_id; + + if (FAILED(IAsyncReader_SyncRead(filter->reader, 24 + i * 3, 1, &stream_id))) + return FALSE; + + if (!(stream_id & 0x80)) + break; + + if (0xe0 <= stream_id && stream_id <= 0xef) + return FALSE; + if (0xc0 <= stream_id && stream_id <= 0xdf) + return TRUE; + + WARN("Unknown stream type 0x%02x.\n", stream_id); + } + + return FALSE; +} + +static BOOL mpeg_splitter_filter_init_gst(struct parser *filter, const AM_MEDIA_TYPE *mt) { wg_parser_t parser = filter->wg_parser; + wg_parser_stream_t video_stream = 0; + wg_parser_stream_t audio_stream = 0; unsigned int i, stream_count; wg_parser_stream_t stream; struct wg_format fmt; @@ -2364,17 +2406,32 @@ static BOOL mpeg_splitter_filter_init_gst(struct parser *filter) wg_parser_stream_get_preferred_format(stream, &fmt); if (fmt.major_type == WG_MAJOR_TYPE_VIDEO_MPEG1) { - if (!create_pin(filter, wg_parser_get_stream(parser, i), L"Video")) - return FALSE; + if (!video_stream) + video_stream = stream; } else if (fmt.major_type == WG_MAJOR_TYPE_AUDIO_MPEG1) { - if (!create_pin(filter, wg_parser_get_stream(parser, i), L"Audio")) - return FALSE; + if (!audio_stream) + audio_stream = stream; } else FIXME("unexpected format %u\n", fmt.major_type); }
+ if (mpeg_splitter_is_audio_stream_first(filter, mt)) + { + if (audio_stream && !create_pin(filter, audio_stream, L"Audio")) + return FALSE; + if (video_stream && !create_pin(filter, video_stream, L"Video")) + return FALSE; + } + else + { + if (video_stream && !create_pin(filter, video_stream, L"Video")) + return FALSE; + if (audio_stream && !create_pin(filter, audio_stream, L"Audio")) + return FALSE; + } + return TRUE; }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=140758
Your paranoid android.
=== w10pro64 (64 bit report) ===
quartz: videorenderer.c:1196: Test failed: Wait failed. videorenderer.c:1197: Test failed: Got hr 0x103.
=== w10pro64_zh_CN (64 bit report) ===
quartz: videorenderer.c:1078: Test failed: Thread should block in Receive().
Rémi Bernon (@rbernon) commented about dlls/winegstreamer/quartz_parser.c:
- {
BYTE stream_id;
if (FAILED(IAsyncReader_SyncRead(filter->reader, 24 + i * 3, 1, &stream_id)))
return FALSE;
if (!(stream_id & 0x80))
break;
if (0xe0 <= stream_id && stream_id <= 0xef)
return FALSE;
if (0xc0 <= stream_id && stream_id <= 0xdf)
return TRUE;
WARN("Unknown stream type 0x%02x.\n", stream_id);
- }
I'm sorry to say that but I see several issues with this:
1) this is a workaround, trying to mitigate our use of decodebin which doesn't provide the deterministic behavior we need, it isn't IMO the right way to fix it (*)
2) it only supports a very small use-case, reordering a single audio stream first, we should instead support any scenario, including with more than two streams or with non-audio non-video streams first.
3) it also looks like the beginning of proprietary format demuxing code, I think it opens a big can of worms we probably don't want to get involved with.
(*) I've been advocating for, and trying to upstream some work to fix this properly (in https://gitlab.winehq.org/wine/wine/-/merge_requests/3606), using deterministic demuxer elements. I have only been working on the MF side so far but clearly we have that issue everywhere and I would really like this to move forward now that it's getting even more obvious (we now have a MR on the quartz side, and it's also known for a long while that the WM reader suffers from it too).
On Tue Dec 5 09:58:52 2023 +0000, Rémi Bernon wrote:
I'm sorry to say that but I see several issues with this:
- this is a workaround, trying to mitigate our use of decodebin which
doesn't provide the deterministic behavior we need, it isn't IMO the right way to fix it (*) 2) it only supports a very small use-case, reordering a single audio stream first, we should instead support any scenario, including with more than two streams or with non-audio non-video streams first. 3) it also looks like the beginning of proprietary format demuxing code, I think it opens a big can of worms we probably don't want to get involved with. (*) I've been advocating for, and trying to upstream some work to fix this properly (in https://gitlab.winehq.org/wine/wine/-/merge_requests/3606), using deterministic demuxer elements. I have only been working on the MF side so far but clearly we have that issue everywhere and I would really like this to move forward now that it's getting even more obvious (we now have a MR on the quartz side, and it's also known for a long while that the WM reader suffers from it too).
1. Directly using mpegpsdemux won't help in this case as it ignores the stream table in the system header and creates its pads in the order it sees the corresponding packets in the file.
2. Supporting more than two streams would require full IAMStreamSelect implementation, as native only creates one output pin per stream type. This can be done in theory by matching mpegpsdemux pads by name to the corresponding stream in the header.
3. I don't see any other option, as GStreamer doesn't currently expose the required information.
- Directly using mpegpsdemux won't help in this case as it ignores the stream table in the system header and creates its pads in the order it sees the corresponding packets in the file.
Well then maybe this specific feature should be implemented in mpegpsdemux.
Getting support for this in GStreamer would be ideal. I asked the maintainers about it at the GStreamer conference a couple months back and they seemed quite receptive to it, but I haven't had the chance to put together a patch yet.
On Thu Dec 7 03:21:47 2023 +0000, Zebediah Figura wrote:
Getting support for this in GStreamer would be ideal. I asked the maintainers about it at the GStreamer conference a couple months back and they seemed quite receptive to it, but I haven't had the chance to put together a patch yet.
Do you mean fixing the pad creation order or something fancier, like adding an API to get stream IDs?
Do you mean fixing the pad creation order or something fancier, like adding an API to get stream IDs?
The latter. Pad creation order isn't a part of public API, but GStreamer already exposes some stream properties through events or queries, and the maintainers seemed warm about adding more, even weird ones like "what order were these specified in the original file".
This merge request was closed by Anton Baskanov.