Skip to content

Commit e11da1f

Browse files
Zaggy1024gmta
authored andcommitted
LibMedia: Store a name and language in Media::Track
1 parent e8238b4 commit e11da1f

File tree

5 files changed

+30
-4
lines changed

5 files changed

+30
-4
lines changed

Libraries/LibMedia/Containers/Matroska/Document.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ class TrackEntry : public RefCounted<TrackEntry> {
116116
void set_track_uid(u64 track_uid) { m_track_uid = track_uid; }
117117
TrackType track_type() const { return m_track_type; }
118118
void set_track_type(TrackType track_type) { m_track_type = track_type; }
119+
String name() const { return m_name; }
120+
void set_name(String const& name) { m_name = name; }
119121
String language() const { return m_language; }
120122
void set_language(String const& language) { m_language = language; }
121123
String codec_id() const { return m_codec_id; }
@@ -151,6 +153,7 @@ class TrackEntry : public RefCounted<TrackEntry> {
151153
u64 m_track_number { 0 };
152154
u64 m_track_uid { 0 };
153155
TrackType m_track_type { Invalid };
156+
String m_name;
154157
String m_language = "eng"_string;
155158
String m_codec_id;
156159
FixedArray<u8> m_codec_private_data;

Libraries/LibMedia/Containers/Matroska/MatroskaDemuxer.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <AK/Assertions.h>
88
#include <AK/Debug.h>
9+
#include <AK/Utf16String.h>
910
#include <LibMedia/CodedFrame.h>
1011
#include <LibMedia/DecoderError.h>
1112

@@ -66,7 +67,9 @@ static TrackType track_type_from_matroska_track_type(TrackEntry::TrackType type)
6667

6768
static Track track_from_track_entry(TrackEntry const& track_entry)
6869
{
69-
Track track(track_type_from_matroska_track_type(track_entry.track_type()), track_entry.track_number());
70+
auto name = Utf16String::from_utf8(track_entry.name());
71+
auto language = Utf16String::from_utf8(track_entry.language());
72+
Track track(track_type_from_matroska_track_type(track_entry.track_type()), track_entry.track_number(), name, language);
7073

7174
if (track.type() == TrackType::Video) {
7275
auto video_track = track_entry.video_track();

Libraries/LibMedia/Containers/Matroska/Reader.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright (c) 2021, Hunter Salyer <thefalsehonesty@gmail.com>
3-
* Copyright (c) 2022-2023, Gregory Bertilson <Zaggy1024@gmail.com>
3+
* Copyright (c) 2022-2025, Gregory Bertilson <gregory@ladybird.org>
44
*
55
* SPDX-License-Identifier: BSD-2-Clause
66
*/
@@ -50,6 +50,7 @@ constexpr u32 TRACK_ENTRY_ID = 0xAE;
5050
constexpr u32 TRACK_NUMBER_ID = 0xD7;
5151
constexpr u32 TRACK_UID_ID = 0x73C5;
5252
constexpr u32 TRACK_TYPE_ID = 0x83;
53+
constexpr u32 TRACK_NAME_ID = 0x536E;
5354
constexpr u32 TRACK_LANGUAGE_ID = 0x22B59C;
5455
constexpr u32 TRACK_CODEC_ID = 0x86;
5556
constexpr u32 TRACK_CODEC_PRIVATE_ID = 0x63A2;
@@ -476,6 +477,10 @@ static DecoderErrorOr<NonnullRefPtr<TrackEntry>> parse_track_entry(Streamer& str
476477
track_entry->set_track_type(static_cast<TrackEntry::TrackType>(TRY_READ(streamer.read_u64())));
477478
dbgln_if(MATROSKA_TRACE_DEBUG, "Read TrackType attribute: {}", to_underlying(track_entry->track_type()));
478479
break;
480+
case TRACK_NAME_ID:
481+
track_entry->set_name(DECODER_TRY_ALLOC(String::from_byte_string(TRY_READ(streamer.read_string()))));
482+
dbgln_if(MATROSKA_TRACE_DEBUG, "Read Track's Name attribute: {}", track_entry->name());
483+
break;
479484
case TRACK_LANGUAGE_ID:
480485
track_entry->set_language(DECODER_TRY_ALLOC(String::from_byte_string(TRY_READ(streamer.read_string()))));
481486
dbgln_if(MATROSKA_TRACE_DEBUG, "Read Track's Language attribute: {}", track_entry->language());

Libraries/LibMedia/FFmpeg/FFmpegDemuxer.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,15 @@ DecoderErrorOr<Track> FFmpegDemuxer::get_track_for_stream_index(u32 stream_index
9696

9797
auto& stream = *m_format_context->streams[stream_index];
9898
auto type = track_type_from_ffmpeg_media_type(stream.codecpar->codec_type);
99-
Track track(type, stream_index);
99+
auto get_string_metadata = [&](char const* key) {
100+
auto* name_entry = av_dict_get(stream.metadata, key, nullptr, 0);
101+
if (name_entry == nullptr)
102+
return Utf16String();
103+
return Utf16String::from_utf8(StringView(name_entry->value, strlen(name_entry->value)));
104+
};
105+
auto name = get_string_metadata("title");
106+
auto language = get_string_metadata("language");
107+
Track track(type, stream_index, name, language);
100108

101109
if (type == TrackType::Video) {
102110
track.set_video_data({

Libraries/LibMedia/Track.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <AK/Time.h>
1111
#include <AK/Traits.h>
1212
#include <AK/Types.h>
13+
#include <AK/Utf16String.h>
1314
#include <AK/Variant.h>
1415

1516
namespace Media {
@@ -28,9 +29,11 @@ class Track {
2829
};
2930

3031
public:
31-
Track(TrackType type, size_t identifier)
32+
Track(TrackType type, size_t identifier, Utf16String const& name, Utf16String const& language)
3233
: m_type(type)
3334
, m_identifier(identifier)
35+
, m_name(name)
36+
, m_language(language)
3437
{
3538
switch (m_type) {
3639
case TrackType::Video:
@@ -44,6 +47,8 @@ class Track {
4447

4548
TrackType type() const { return m_type; }
4649
size_t identifier() const { return m_identifier; }
50+
Utf16String const& name() const { return m_name; }
51+
Utf16String const& language() const { return m_language; }
4752

4853
void set_video_data(VideoData data)
4954
{
@@ -70,6 +75,8 @@ class Track {
7075
private:
7176
TrackType m_type { 0 };
7277
size_t m_identifier { 0 };
78+
Utf16String m_name;
79+
Utf16String m_language;
7380

7481
Variant<Empty, VideoData> m_track_data;
7582
};

0 commit comments

Comments
 (0)