diff --git a/Userland/Libraries/LibVideo/PlaybackManager.cpp b/Userland/Libraries/LibVideo/PlaybackManager.cpp index 21aa997fbc..4db877e1f2 100644 --- a/Userland/Libraries/LibVideo/PlaybackManager.cpp +++ b/Userland/Libraries/LibVideo/PlaybackManager.cpp @@ -47,7 +47,18 @@ private: DecoderErrorOr> PlaybackManager::from_file(StringView filename, PlaybackTimerCreator playback_timer_creator) { - NonnullOwnPtr demuxer = TRY(Matroska::MatroskaDemuxer::from_file(filename)); + auto demuxer = TRY(Matroska::MatroskaDemuxer::from_file(filename)); + return create_with_demuxer(move(demuxer), move(playback_timer_creator)); +} + +DecoderErrorOr> PlaybackManager::from_data(ReadonlyBytes data, PlaybackTimerCreator playback_timer_creator) +{ + auto demuxer = TRY(Matroska::MatroskaDemuxer::from_data(data)); + return create_with_demuxer(move(demuxer), move(playback_timer_creator)); +} + +DecoderErrorOr> PlaybackManager::create_with_demuxer(NonnullOwnPtr demuxer, PlaybackTimerCreator playback_timer_creator) +{ auto video_tracks = TRY(demuxer->get_tracks_for_type(TrackType::Video)); if (video_tracks.is_empty()) return DecoderError::with_description(DecoderErrorCategory::Invalid, "No video track is present"sv); diff --git a/Userland/Libraries/LibVideo/PlaybackManager.h b/Userland/Libraries/LibVideo/PlaybackManager.h index 43657e193f..29fae14f2b 100644 --- a/Userland/Libraries/LibVideo/PlaybackManager.h +++ b/Userland/Libraries/LibVideo/PlaybackManager.h @@ -102,6 +102,7 @@ public: using PlaybackTimerCreator = Function>(int, Function)>; static DecoderErrorOr> from_file(StringView file, PlaybackTimerCreator = nullptr); + static DecoderErrorOr> from_data(ReadonlyBytes data, PlaybackTimerCreator = nullptr); PlaybackManager(NonnullOwnPtr& demuxer, Track video_track, NonnullOwnPtr&& decoder, PlaybackTimerCreator); @@ -135,6 +136,8 @@ private: class SeekingStateHandler; class StoppedStateHandler; + static DecoderErrorOr> create_with_demuxer(NonnullOwnPtr demuxer, PlaybackTimerCreator playback_timer_creator); + void start_timer(int milliseconds); void timer_callback(); Optional