Skip to content

Commit 6342f00

Browse files
complexlogicufleisch
authored andcommitted
Support tag language
1 parent b4e79a4 commit 6342f00

7 files changed

Lines changed: 64 additions & 13 deletions

File tree

examples/matroskareader.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ int main(int argc, char *argv[])
4444
PRINT_PRETTY("Target Type Value",
4545
targetTypeValue == 0 ? "None" : TagLib::Utils::formatString("%i", targetTypeValue).toCString(false)
4646
);
47+
const TagLib::String &language = t->language();
48+
PRINT_PRETTY("Language", !language.isEmpty() ? language.toCString(false) : "Not set");
4749

4850
printf("\n");
4951
}

examples/matroskawriter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ int main(int argc, char *argv[])
2323
simpleTag->setName("Test Name 1");
2424
simpleTag->setTargetTypeValue(TagLib::Matroska::SimpleTag::TargetTypeValue::Track);
2525
simpleTag->setValue("Test Value 1");
26+
simpleTag->setLanguage("en");
2627
tag->addSimpleTag(simpleTag);
2728

2829
simpleTag = new TagLib::Matroska::SimpleTagString();

taglib/matroska/ebml/ebmlelement.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,18 @@ namespace TagLib {
5959
};
6060

6161
namespace ElementIDs {
62-
inline constexpr Element::Id EBMLHeader = 0x1A45DFA3;
63-
inline constexpr Element::Id MkSegment = 0x18538067;
64-
inline constexpr Element::Id MkTags = 0x1254C367;
65-
inline constexpr Element::Id MkTag = 0x7373;
66-
inline constexpr Element::Id MkTagTargets = 0x63C0;
67-
inline constexpr Element::Id MkTagTargetTypeValue = 0x68CA;
68-
inline constexpr Element::Id MkSimpleTag = 0x67C8;
69-
inline constexpr Element::Id MkTagName = 0x45A3;
70-
inline constexpr Element::Id MkTagLanguage = 0x447A;
71-
inline constexpr Element::Id MkTagString = 0x4487;
62+
inline constexpr Element::Id EBMLHeader = 0x1A45DFA3;
63+
inline constexpr Element::Id MkSegment = 0x18538067;
64+
inline constexpr Element::Id MkTags = 0x1254C367;
65+
inline constexpr Element::Id MkTag = 0x7373;
66+
inline constexpr Element::Id MkTagTargets = 0x63C0;
67+
inline constexpr Element::Id MkTagTargetTypeValue = 0x68CA;
68+
inline constexpr Element::Id MkSimpleTag = 0x67C8;
69+
inline constexpr Element::Id MkTagName = 0x45A3;
70+
inline constexpr Element::Id MkTagLanguage = 0x447A;
71+
inline constexpr Element::Id MkTagString = 0x4487;
72+
inline constexpr Element::Id MkTagsTagLanguage = 0x447A;
73+
inline constexpr Element::Id MkTagsLanguageDefault = 0x4484;
7274
}
7375
}
7476
}

taglib/matroska/ebml/ebmlmktags.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,19 @@ Matroska::Tag* EBML::MkTags::parse()
7171
const String *tagName = nullptr;
7272
const String *tagValueString = nullptr;
7373
const ByteVector *tagValueBinary = nullptr;
74+
const String *language = nullptr;
75+
bool defaultLanguageFlag = true;
7476

7577
for (auto simpleTagChild : *simpleTag) {
7678
Id id = simpleTagChild->getId();
7779
if (id == ElementIDs::MkTagName && !tagName)
7880
tagName = &(static_cast<UTF8StringElement*>(simpleTagChild)->getValue());
7981
else if (id == ElementIDs::MkTagString && !tagValueString)
8082
tagValueString = &(static_cast<UTF8StringElement*>(simpleTagChild)->getValue());
83+
else if (id == ElementIDs::MkTagsTagLanguage && !language)
84+
language = &(static_cast<Latin1StringElement*>(simpleTagChild)->getValue());
85+
else if (id == ElementIDs::MkTagsLanguageDefault)
86+
defaultLanguageFlag = static_cast<UIntElement*>(simpleTagChild)->getValue() ? true : false;
8187
}
8288
if (!tagName || (tagValueString && tagValueBinary) || (!tagValueString && !tagValueBinary))
8389
continue;
@@ -97,6 +103,9 @@ Matroska::Tag* EBML::MkTags::parse()
97103
sTag = sTagBinary;
98104
}
99105
sTag->setName(*tagName);
106+
if (language)
107+
sTag->setLanguage(*language);
108+
sTag->setDefaultLanguageFlag(defaultLanguageFlag);
100109
mTag->addSimpleTag(sTag);
101110
}
102111
}

taglib/matroska/matroskasimpletag.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class Matroska::SimpleTag::SimpleTagPrivate
3131
SimpleTagPrivate() = default;
3232
SimpleTag::TargetTypeValue targetTypeValue = TargetTypeValue::None;
3333
String name;
34+
String language;
35+
bool defaultLanguageFlag = true;
3436

3537
};
3638

@@ -73,6 +75,26 @@ const String& Matroska::SimpleTag::name() const
7375
return d->name;
7476
}
7577

78+
const String& Matroska::SimpleTag::language() const
79+
{
80+
return d->language;
81+
}
82+
83+
void Matroska::SimpleTag::setLanguage(const String &language)
84+
{
85+
d->language = language;
86+
}
87+
88+
bool Matroska::SimpleTag::defaultLanguageFlag() const
89+
{
90+
return d->defaultLanguageFlag;
91+
}
92+
93+
void Matroska::SimpleTag::setDefaultLanguageFlag(bool flag)
94+
{
95+
d->defaultLanguageFlag = flag;
96+
}
97+
7698
void Matroska::SimpleTag::setName(const String &name)
7799
{
78100
d->name = name;

taglib/matroska/matroskasimpletag.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,12 @@ namespace TagLib {
4444
};
4545
const String& name() const;
4646
TargetTypeValue targetTypeValue() const;
47-
void setTargetTypeValue(TargetTypeValue targetTypeValue);
47+
const String& language() const;
48+
bool defaultLanguageFlag() const;
4849
void setName(const String &name);
50+
void setTargetTypeValue(TargetTypeValue targetTypeValue);
51+
void setLanguage(const String &language);
52+
void setDefaultLanguageFlag(bool flag);
4953
virtual ~SimpleTag();
5054

5155
private:

taglib/matroska/matroskatag.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ ByteVector Matroska::Tag::render()
210210
auto targetTypeValue = frontTag->targetTypeValue();
211211
auto tag = new EBML::MasterElement(EBML::ElementIDs::MkTag);
212212

213-
// Build <Tag Targets element>
213+
// Build <Tag Targets> element
214214
auto targets = new EBML::MasterElement(EBML::ElementIDs::MkTagTargets);
215215
if (targetTypeValue != Matroska::SimpleTag::TargetTypeValue::None) {
216216
auto element = new EBML::UIntElement(EBML::ElementIDs::MkTagTargetTypeValue);
@@ -226,6 +226,7 @@ ByteVector Matroska::Tag::render()
226226
tagName->setValue(simpleTag->name());
227227
t->appendElement(tagName);
228228

229+
// Tag Value
229230
Matroska::SimpleTagString *tStr = nullptr;
230231
Matroska::SimpleTagBinary *tBin = nullptr;
231232
if((tStr = dynamic_cast<Matroska::SimpleTagString*>(simpleTag))) {
@@ -237,7 +238,17 @@ ByteVector Matroska::Tag::render()
237238
// Todo
238239
}
239240

240-
// Todo: language
241+
// Language
242+
auto language = new EBML::Latin1StringElement(EBML::ElementIDs::MkTagsTagLanguage);
243+
const String &lang = simpleTag->language();
244+
language->setValue(!lang.isEmpty() ? lang : "und");
245+
t->appendElement(language);
246+
247+
// Default language flag
248+
auto dlf = new EBML::UIntElement(EBML::ElementIDs::MkTagsLanguageDefault);
249+
dlf->setValue(simpleTag->defaultLanguageFlag() ? 1 : 0);
250+
t->appendElement(dlf);
251+
241252
tag->appendElement(t);
242253
}
243254
tags.appendElement(tag);

0 commit comments

Comments
 (0)