From c978beb18b3e045d2240dec74c939907fa5dde76 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 4 Apr 2023 13:18:35 -0400 Subject: [PATCH] LibVideo: Extract video metadata for public-facing video track data This copies the video data from the Matroska document into the Track structure that outside users have access to. Because Track can actually represent other media types, this is set up such that the Track can hold metadata for those other types when they are needed. This is needed for LibWeb's HTMLMediaElement implementation. --- .../Containers/Matroska/MatroskaDemuxer.cpp | 14 ++++++++- Userland/Libraries/LibVideo/Track.h | 31 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp b/Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp index 674a6428ac..bac8f7d65d 100644 --- a/Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp +++ b/Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp @@ -38,9 +38,21 @@ DecoderErrorOr> MatroskaDemuxer::get_tracks_for_type(TrackType typ Vector tracks; TRY(m_reader.for_each_track_of_type(matroska_track_type, [&](TrackEntry const& track_entry) -> DecoderErrorOr { VERIFY(track_entry.track_type() == matroska_track_type); - DECODER_TRY_ALLOC(tracks.try_append(Track(type, track_entry.track_number()))); + Track track(type, track_entry.track_number()); + + switch (type) { + case TrackType::Video: + if (auto video_track = track_entry.video_track(); video_track.has_value()) + track.set_video_data({ TRY(duration()), video_track->pixel_width, video_track->pixel_height }); + break; + default: + break; + } + + DECODER_TRY_ALLOC(tracks.try_append(track)); return IterationDecision::Continue; })); + return tracks; } diff --git a/Userland/Libraries/LibVideo/Track.h b/Userland/Libraries/LibVideo/Track.h index 395db8b384..476ff51314 100644 --- a/Userland/Libraries/LibVideo/Track.h +++ b/Userland/Libraries/LibVideo/Track.h @@ -7,8 +7,10 @@ #pragma once #include +#include #include #include +#include namespace Video { @@ -19,20 +21,47 @@ enum class TrackType : u32 { }; struct Track { + struct VideoData { + Time duration {}; + u64 pixel_width { 0 }; + u64 pixel_height { 0 }; + }; + public: Track(TrackType type, size_t identifier) : m_type(type) , m_identifier(identifier) { + switch (m_type) { + case TrackType::Video: + m_track_data = VideoData {}; + break; + default: + m_track_data = Empty {}; + break; + } } TrackType type() { return m_type; } size_t identifier() const { return m_identifier; } + void set_video_data(VideoData data) + { + VERIFY(m_type == TrackType::Video); + m_track_data = data; + } + + VideoData const& video_data() const + { + VERIFY(m_type == TrackType::Video); + return m_track_data.get(); + } + bool operator==(Track const& other) const { return m_type == other.m_type && m_identifier == other.m_identifier; } + unsigned hash() const { return pair_int_hash(to_underlying(m_type), m_identifier); @@ -41,6 +70,8 @@ public: private: TrackType m_type; size_t m_identifier; + + Variant m_track_data; }; }