From bd28efb4c702f3119043d8d365fdc7ba98cd8b7d Mon Sep 17 00:00:00 2001 From: Akihiro Sagawa Date: Sat, 13 Jun 2020 10:34:22 -0500 Subject: [PATCH] winegstreamer: Also wait for EOS events when retrieving duration. The mpegaudioparse element will not send a duration-changed message if no Xing or VBRI headers are present. Signed-off-by: Akihiro Sagawa Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/quartz/tests/mpegsplit.c | 8 ++++---- dlls/quartz/tests/rsrc.rc | 2 +- dlls/quartz/tests/test.mp3 | Bin 2349 -> 2157 bytes dlls/winegstreamer/gstdemux.c | 13 ++++++++++--- 4 files changed, 15 insertions(+), 8 deletions(-) rewrite dlls/quartz/tests/test.mp3 (100%) diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index 9bfd7e3bb19..e407fe44eeb 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -523,13 +523,13 @@ static void test_media_types(void) { MPEG1WAVEFORMAT expect_wfx = { - {WAVE_FORMAT_MPEG, 1, 48000, 8000, 192, 0, sizeof(MPEG1WAVEFORMAT) - sizeof(WAVEFORMATEX)}, - ACM_MPEG_LAYER3, 64000, ACM_MPEG_SINGLECHANNEL, 0, 1, ACM_MPEG_PROTECTIONBIT | ACM_MPEG_ID_MPEG1, 0, 0 + {WAVE_FORMAT_MPEG, 1, 48000, 4000, 96, 0, sizeof(MPEG1WAVEFORMAT) - sizeof(WAVEFORMATEX)}, + ACM_MPEG_LAYER3, 32000, ACM_MPEG_SINGLECHANNEL, 4096, 1, ACM_MPEG_ORIGINALHOME | ACM_MPEG_PROTECTIONBIT | ACM_MPEG_ID_MPEG1, 0, 0 }; static const MPEGLAYER3WAVEFORMAT expect_mp3_wfx = { - {WAVE_FORMAT_MPEGLAYER3, 1, 48000, 8000, 1, 0, sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX)}, - MPEGLAYER3_ID_MPEG, 0, 192, 1, 0 + {WAVE_FORMAT_MPEGLAYER3, 1, 48000, 4000, 1, 0, sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX)}, + MPEGLAYER3_ID_MPEG, 0, 96, 1, 0 }; const WCHAR *filename = load_resource(L"test.mp3"); diff --git a/dlls/quartz/tests/rsrc.rc b/dlls/quartz/tests/rsrc.rc index 753415cf8de..d28c2bd6edc 100644 --- a/dlls/quartz/tests/rsrc.rc +++ b/dlls/quartz/tests/rsrc.rc @@ -28,7 +28,7 @@ test.avi RCDATA "test.avi" /* @makedep: test.mpg */ test.mpg RCDATA "test.mpg" -/* ffmpeg -f lavfi -i "sine=frequency=500" -t 0.5 -ar 48000 -b:a 32k -f mp3 -acodec mp3 test.mp3 */ +/* 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/test.mp3 b/dlls/quartz/tests/test.mp3 dissimilarity index 100% index 78d8dd2af62027147a3f169a8306b601ab37c3b6..b35e6b77d1315fa5b742085226ecd0cefbdf4896 100644 GIT binary patch literal 2157 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 diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index e7d8a0b98c6..b9c91245f82 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -79,7 +79,7 @@ struct gstdemux_source GstPad *their_src, *post_sink, *post_src, *my_sink; GstElement *flip; AM_MEDIA_TYPE mt; - HANDLE caps_event; + HANDLE caps_event, eos_event; GstSegment *segment; SourceSeeking seek; }; @@ -699,6 +699,8 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event) case GST_EVENT_EOS: if (pin->pin.pin.peer) IPin_EndOfStream(pin->pin.pin.peer); + else + SetEvent(pin->eos_event); return TRUE; case GST_EVENT_FLUSH_START: if (impl_from_strmbase_filter(pin->pin.pin.filter)->ignore_flush) { @@ -2129,6 +2131,7 @@ static void free_source_pin(struct gstdemux_source *pin) } gst_object_unref(pin->my_sink); CloseHandle(pin->caps_event); + CloseHandle(pin->eos_event); FreeMediaType(&pin->mt); gst_segment_free(pin->segment); @@ -2161,6 +2164,7 @@ static struct gstdemux_source *create_pin(struct gstdemux *filter, const WCHAR * strmbase_source_init(&pin->pin, &filter->filter, name, &source_ops); pin->caps_event = CreateEventW(NULL, FALSE, FALSE, NULL); + pin->eos_event = CreateEventW(NULL, FALSE, FALSE, NULL); pin->segment = gst_segment_new(); gst_segment_init(pin->segment, GST_FORMAT_TIME); pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl; @@ -2561,7 +2565,8 @@ static BOOL mpeg_splitter_init_gst(struct gstdemux *filter) static const WCHAR source_name[] = {'A','u','d','i','o',0}; struct gstdemux_source *pin; GstElement *element; - HANDLE events[2]; + HANDLE events[3]; + DWORD res; int ret; if (!(element = gst_element_factory_make("mpegaudioparse", NULL))) @@ -2600,7 +2605,9 @@ static BOOL mpeg_splitter_init_gst(struct gstdemux *filter) events[0] = filter->duration_event; events[1] = filter->error_event; - if (WaitForMultipleObjects(2, events, FALSE, INFINITE)) + events[2] = pin->eos_event; + res = WaitForMultipleObjects(3, events, FALSE, INFINITE); + if (res == 1) return FALSE; pin->seek.llDuration = pin->seek.llStop = query_duration(pin->their_src); -- 2.11.4.GIT