From dfe59b8a4f27f89fefb51ead56a77641e9b16daa Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Sat, 27 Sep 2025 15:11:06 -0500 Subject: [PATCH] LibMedia+LibWeb: Prefer MatroskaDemuxer for media playback MatroskaDemuxer supports multiple streams already, and gives us a bit more control over seeking. --- Libraries/LibMedia/PlaybackManager.cpp | 10 ++++++++-- Libraries/LibMedia/PlaybackManager.h | 2 +- Libraries/LibWeb/HTML/HTMLMediaElement.cpp | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Libraries/LibMedia/PlaybackManager.cpp b/Libraries/LibMedia/PlaybackManager.cpp index 643d0e42614..eae5e09204d 100644 --- a/Libraries/LibMedia/PlaybackManager.cpp +++ b/Libraries/LibMedia/PlaybackManager.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -16,9 +17,14 @@ namespace Media { -DecoderErrorOr> PlaybackManager::try_create(NonnullOwnPtr&& stream) +DecoderErrorOr> PlaybackManager::try_create(ReadonlyBytes data) { - auto inner_demuxer = DECODER_TRY_ALLOC(FFmpeg::FFmpegDemuxer::create(move(stream))); + auto inner_demuxer = TRY([&] -> DecoderErrorOr> { + auto matroska_result = Matroska::MatroskaDemuxer::from_data(data); + if (!matroska_result.is_error()) + return matroska_result.release_value(); + return DECODER_TRY_ALLOC(FFmpeg::FFmpegDemuxer::create(make(data))); + }()); auto demuxer = DECODER_TRY_ALLOC(try_make_ref_counted(inner_demuxer)); // Create the weak wrapper. diff --git a/Libraries/LibMedia/PlaybackManager.h b/Libraries/LibMedia/PlaybackManager.h index 341ccdf3367..2194f36c8b4 100644 --- a/Libraries/LibMedia/PlaybackManager.h +++ b/Libraries/LibMedia/PlaybackManager.h @@ -36,7 +36,7 @@ public: using AudioTracks = Vector; - static DecoderErrorOr> try_create(NonnullOwnPtr&& stream); + static DecoderErrorOr> try_create(ReadonlyBytes data); ~PlaybackManager(); AK::Duration current_time() const; diff --git a/Libraries/LibWeb/HTML/HTMLMediaElement.cpp b/Libraries/LibWeb/HTML/HTMLMediaElement.cpp index 075d6f51481..96c104b88c9 100644 --- a/Libraries/LibWeb/HTML/HTMLMediaElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLMediaElement.cpp @@ -1173,7 +1173,7 @@ WebIDL::ExceptionOr HTMLMediaElement::process_media_data(Functionrealm(); - auto playback_manager_result = Media::PlaybackManager::try_create(make(m_media_data.bytes())); + auto playback_manager_result = Media::PlaybackManager::try_create(m_media_data.bytes()); // -> If the media data cannot be fetched at all, due to network errors, causing the user agent to give up trying to fetch the resource // -> If the media data can be fetched but is found by inspection to be in an unsupported format, or can otherwise not be rendered at all