mirror of
https://github.com/zebrajr/ladybird.git
synced 2025-12-06 00:19:53 +01:00
LibMedia: Let the Matroska LanguageBCP47 element override Language
The Matroska spec indicates that this field should always override the Language element when it is present.
This commit is contained in:
parent
e11da1f85f
commit
29ab9c5fd5
|
|
@ -120,6 +120,8 @@ public:
|
||||||
void set_name(String const& name) { m_name = name; }
|
void set_name(String const& name) { m_name = name; }
|
||||||
String language() const { return m_language; }
|
String language() const { return m_language; }
|
||||||
void set_language(String const& language) { m_language = language; }
|
void set_language(String const& language) { m_language = language; }
|
||||||
|
Optional<String> const& language_bcp_47() const { return m_language_bcp_47; }
|
||||||
|
void set_language_bcp_47(String const& language_bcp_47) { m_language_bcp_47 = language_bcp_47; }
|
||||||
String codec_id() const { return m_codec_id; }
|
String codec_id() const { return m_codec_id; }
|
||||||
void set_codec_id(String const& codec_id) { m_codec_id = codec_id; }
|
void set_codec_id(String const& codec_id) { m_codec_id = codec_id; }
|
||||||
ReadonlyBytes codec_private_data() const LIFETIME_BOUND { return m_codec_private_data.span(); }
|
ReadonlyBytes codec_private_data() const LIFETIME_BOUND { return m_codec_private_data.span(); }
|
||||||
|
|
@ -155,6 +157,7 @@ private:
|
||||||
TrackType m_track_type { Invalid };
|
TrackType m_track_type { Invalid };
|
||||||
String m_name;
|
String m_name;
|
||||||
String m_language = "eng"_string;
|
String m_language = "eng"_string;
|
||||||
|
Optional<String> m_language_bcp_47;
|
||||||
String m_codec_id;
|
String m_codec_id;
|
||||||
FixedArray<u8> m_codec_private_data;
|
FixedArray<u8> m_codec_private_data;
|
||||||
double m_timestamp_scale { 1 };
|
double m_timestamp_scale { 1 };
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,13 @@ static TrackType track_type_from_matroska_track_type(TrackEntry::TrackType type)
|
||||||
static Track track_from_track_entry(TrackEntry const& track_entry)
|
static Track track_from_track_entry(TrackEntry const& track_entry)
|
||||||
{
|
{
|
||||||
auto name = Utf16String::from_utf8(track_entry.name());
|
auto name = Utf16String::from_utf8(track_entry.name());
|
||||||
auto language = Utf16String::from_utf8(track_entry.language());
|
auto language = [&] {
|
||||||
|
// LanguageBCP47 - The language of the track, in the BCP47 form; see basics on language codes. If this Element is used,
|
||||||
|
// then any Language Elements used in the same TrackEntry MUST be ignored.
|
||||||
|
if (track_entry.language_bcp_47().has_value())
|
||||||
|
return Utf16String::from_utf8(track_entry.language_bcp_47().value());
|
||||||
|
return Utf16String::from_utf8(track_entry.language());
|
||||||
|
}();
|
||||||
Track track(track_type_from_matroska_track_type(track_entry.track_type()), track_entry.track_number(), name, language);
|
Track track(track_type_from_matroska_track_type(track_entry.track_type()), track_entry.track_number(), name, language);
|
||||||
|
|
||||||
if (track.type() == TrackType::Video) {
|
if (track.type() == TrackType::Video) {
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ constexpr u32 TRACK_UID_ID = 0x73C5;
|
||||||
constexpr u32 TRACK_TYPE_ID = 0x83;
|
constexpr u32 TRACK_TYPE_ID = 0x83;
|
||||||
constexpr u32 TRACK_NAME_ID = 0x536E;
|
constexpr u32 TRACK_NAME_ID = 0x536E;
|
||||||
constexpr u32 TRACK_LANGUAGE_ID = 0x22B59C;
|
constexpr u32 TRACK_LANGUAGE_ID = 0x22B59C;
|
||||||
|
constexpr u32 TRACK_LANGUAGE_BCP_47_ID = 0x22B59D;
|
||||||
constexpr u32 TRACK_CODEC_ID = 0x86;
|
constexpr u32 TRACK_CODEC_ID = 0x86;
|
||||||
constexpr u32 TRACK_CODEC_PRIVATE_ID = 0x63A2;
|
constexpr u32 TRACK_CODEC_PRIVATE_ID = 0x63A2;
|
||||||
constexpr u32 TRACK_CODEC_DELAY_ID = 0x56AA;
|
constexpr u32 TRACK_CODEC_DELAY_ID = 0x56AA;
|
||||||
|
|
@ -485,6 +486,10 @@ static DecoderErrorOr<NonnullRefPtr<TrackEntry>> parse_track_entry(Streamer& str
|
||||||
track_entry->set_language(DECODER_TRY_ALLOC(String::from_byte_string(TRY_READ(streamer.read_string()))));
|
track_entry->set_language(DECODER_TRY_ALLOC(String::from_byte_string(TRY_READ(streamer.read_string()))));
|
||||||
dbgln_if(MATROSKA_TRACE_DEBUG, "Read Track's Language attribute: {}", track_entry->language());
|
dbgln_if(MATROSKA_TRACE_DEBUG, "Read Track's Language attribute: {}", track_entry->language());
|
||||||
break;
|
break;
|
||||||
|
case TRACK_LANGUAGE_BCP_47_ID:
|
||||||
|
track_entry->set_language_bcp_47(DECODER_TRY_ALLOC(String::from_byte_string(TRY_READ(streamer.read_string()))));
|
||||||
|
dbgln_if(MATROSKA_TRACE_DEBUG, "Read Track's LanguageBCP47 attribute: {}", track_entry->language());
|
||||||
|
break;
|
||||||
case TRACK_CODEC_ID:
|
case TRACK_CODEC_ID:
|
||||||
track_entry->set_codec_id(DECODER_TRY_ALLOC(String::from_byte_string(TRY_READ(streamer.read_string()))));
|
track_entry->set_codec_id(DECODER_TRY_ALLOC(String::from_byte_string(TRY_READ(streamer.read_string()))));
|
||||||
dbgln_if(MATROSKA_TRACE_DEBUG, "Read Track's CodecID attribute: {}", track_entry->codec_id());
|
dbgln_if(MATROSKA_TRACE_DEBUG, "Read Track's CodecID attribute: {}", track_entry->codec_id());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user