From f371efe6423983b164dc8245eaa98957cc13ee05 Mon Sep 17 00:00:00 2001 From: Martchus Date: Thu, 26 Nov 2020 23:18:14 +0100 Subject: [PATCH] Don't support IETF language elements explicitely For now let's just ignore these elements explicitely until they are actually supported. This way the warnings are at least more specific and there will be no inconsistency when updating the track language. --- matroska/matroskachapter.cpp | 5 +++++ matroska/matroskatagfield.cpp | 20 +++++++++++++++++--- matroska/matroskatrack.cpp | 4 ++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/matroska/matroskachapter.cpp b/matroska/matroskachapter.cpp index 80f6d21..8e8145c 100644 --- a/matroska/matroskachapter.cpp +++ b/matroska/matroskachapter.cpp @@ -101,6 +101,11 @@ void MatroskaChapter::internalParse(Diagnostics &diag) case MatroskaIds::ChapLanguage: m_names.back().languages().emplace_back(chapterDisplayElement->readString()); break; + case MatroskaIds::ChapLanguageIETF: + diag.emplace_back(DiagLevel::Warning, + "\"ChapterDisplay\"-element contains a \"ChapLanguageIETF\"-element which is not supported yet. It will be ignored.", + context); + break; case MatroskaIds::ChapCountry: m_names.back().countries().emplace_back(chapterDisplayElement->readString()); break; diff --git a/matroska/matroskatagfield.cpp b/matroska/matroskatagfield.cpp index 80176ee..ef8f90b 100644 --- a/matroska/matroskatagfield.cpp +++ b/matroska/matroskatagfield.cpp @@ -47,7 +47,7 @@ void MatroskaTagField::reparse(EbmlElement &simpleTagElement, Diagnostics &diag, { string context("parsing Matroska tag field"); simpleTagElement.parse(diag); - bool tagDefaultFound = false; + bool tagDefaultFound = false, tagLanguageFound = false, tagLanguageIETFFound = false; for (EbmlElement *child = simpleTagElement.firstChild(); child; child = child->nextSibling()) { try { child->parse(diag); @@ -87,16 +87,30 @@ void MatroskaTagField::reparse(EbmlElement &simpleTagElement, Diagnostics &diag, } break; case MatroskaIds::TagLanguage: - if (value().language().empty() || value().language() == "und") { + if (!tagLanguageFound && !tagLanguageIETFFound) { + tagLanguageFound = true; string lng = child->readString(); if (lng != "und") { value().setLanguage(lng); } - } else { + } else if (tagLanguageFound) { diag.emplace_back(DiagLevel::Warning, "\"SimpleTag\"-element contains multiple \"TagLanguage\"-elements. Surplus \"TagLanguage\"-elements will be ignored.", context); } break; + case MatroskaIds::TagLanguageIETF: + if (!tagLanguageIETFFound) { + tagLanguageIETFFound = true; + diag.emplace_back(DiagLevel::Warning, + "\"SimpleTag\"-element contains a \"TagLanguageIETF\"-element. That's not supported at this point. The element will be dropped " + "when applying changes.", + context); + } else { + diag.emplace_back(DiagLevel::Warning, + "\"SimpleTag\"-element contains multiple \"TagLanguageIETF\"-elements. Surplus \"TagLanguageIETF\"-elements will be ignored.", + context); + } + break; case MatroskaIds::TagDefault: if (!tagDefaultFound) { setDefault(child->readUInteger() > 0); diff --git a/matroska/matroskatrack.cpp b/matroska/matroskatrack.cpp index 787c23f..50bbc07 100644 --- a/matroska/matroskatrack.cpp +++ b/matroska/matroskatrack.cpp @@ -411,6 +411,10 @@ void MatroskaTrack::internalParseHeader(Diagnostics &diag) case MatroskaIds::TrackLanguage: m_language = trackInfoElement->readString(); break; + case MatroskaIds::TrackLanguageIETF: + diag.emplace_back(DiagLevel::Warning, + "\"TrackEntry\"-element contains a \"LanguageIETF\"-element which is not supported yet. It will be ignored.", context); + break; case MatroskaIds::CodecID: m_format = codecIdToMediaFormat(m_formatId = trackInfoElement->readString()); break;