diff --git a/Libraries/LibMedia/CodecID.h b/Libraries/LibMedia/CodecID.h index 8397aed515..31ccffabe9 100644 --- a/Libraries/LibMedia/CodecID.h +++ b/Libraries/LibMedia/CodecID.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Media { @@ -33,6 +34,32 @@ enum class CodecID : u32 { FLAC, }; +inline TrackType track_type_from_codec_id(CodecID codec) +{ + switch (codec) { + case CodecID::VP8: + case CodecID::VP9: + case CodecID::H261: + case CodecID::MPEG1: + case CodecID::H262: + case CodecID::H263: + case CodecID::H264: + case CodecID::H265: + case CodecID::AV1: + return TrackType::Video; + case CodecID::MP3: + case CodecID::AAC: + case CodecID::Theora: + case CodecID::Vorbis: + case CodecID::Opus: + case CodecID::FLAC: + return TrackType::Audio; + case CodecID::Unknown: + break; + } + return TrackType::Unknown; +} + } namespace AK { diff --git a/Libraries/LibMedia/Containers/Matroska/Reader.cpp b/Libraries/LibMedia/Containers/Matroska/Reader.cpp index 560a4b849e..dc023ae124 100644 --- a/Libraries/LibMedia/Containers/Matroska/Reader.cpp +++ b/Libraries/LibMedia/Containers/Matroska/Reader.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include "Reader.h" @@ -538,6 +539,24 @@ static DecoderErrorOr> parse_track_entry(Streamer& str return IterationDecision::Continue; })); + if (track_entry->track_type() == TrackEntry::TrackType::Complex) { + // A mix of different other TrackType. The codec needs to define how the Matroska Player + // should interpret such data. + auto codec_track_type = track_type_from_codec_id(codec_id_from_matroska_id_string(track_entry->codec_id())); + switch (codec_track_type) { + case TrackType::Video: + track_entry->set_track_type(TrackEntry::TrackType::Video); + break; + case TrackType::Audio: + track_entry->set_track_type(TrackEntry::TrackType::Audio); + break; + case TrackType::Subtitles: + track_entry->set_track_type(TrackEntry::TrackType::Subtitle); + break; + case TrackType::Unknown: + break; + } + } return track_entry; } diff --git a/Libraries/LibMedia/Track.h b/Libraries/LibMedia/Track.h index 1f41c04258..ce37e72557 100644 --- a/Libraries/LibMedia/Track.h +++ b/Libraries/LibMedia/Track.h @@ -13,16 +13,10 @@ #include #include #include +#include namespace Media { -enum class TrackType : u32 { - Video, - Audio, - Subtitles, - Unknown, -}; - class Track { struct VideoData { u64 pixel_width { 0 }; diff --git a/Libraries/LibMedia/TrackType.h b/Libraries/LibMedia/TrackType.h new file mode 100644 index 0000000000..136b89c85f --- /dev/null +++ b/Libraries/LibMedia/TrackType.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025, Gregory Bertilson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Media { + +enum class TrackType : u8 { + Video, + Audio, + Subtitles, + Unknown, +}; + +}