diff --git a/mp4/mp4tag.cpp b/mp4/mp4tag.cpp index cd59068..a1d574f 100644 --- a/mp4/mp4tag.cpp +++ b/mp4/mp4tag.cpp @@ -92,8 +92,12 @@ std::vector Mp4Tag::values(KnownField field) const if (extendedId) { auto range = fields().equal_range(Mp4TagAtomIds::Extended); for (auto i = range.first; i != range.second; ++i) { - if (extendedId.matches(i->second)) { - values.emplace_back(&i->second.value()); + const auto &field = i->second; + if (extendedId.matches(field)) { + values.emplace_back(&field.value()); + for (const auto &additionalData : field.additionalData()) { + values.emplace_back(&additionalData.value); + } } } } @@ -218,6 +222,21 @@ KnownField Mp4Tag::internallyGetKnownField(const IdentifierType &id) const // do not forget to extend Mp4Tag::internallyGetFieldId() and Mp4TagField::appropriateRawDataType() as well } +/*! + * \brief Adds values from additional data atoms as well. + */ +void Mp4Tag::internallyGetValuesFromField(const Mp4Tag::FieldType &field, std::vector &values) const +{ + if (!field.value().isEmpty()) { + values.emplace_back(&field.value()); + } + for (const auto &value : field.additionalData()) { + if (!value.value.isEmpty()) { + values.emplace_back(&value.value); + } + } +} + bool Mp4Tag::setValue(KnownField field, const TagValue &value) { switch (field) { @@ -250,8 +269,13 @@ bool Mp4Tag::setValues(KnownField field, const std::vector &values) auto range = fields().equal_range(Mp4TagAtomIds::Extended); for (; valuesIterator != values.cend() && range.first != range.second;) { if (!valuesIterator->isEmpty()) { - if (extendedId.matches(range.first->second) && (!extendedId.updateOnly || !range.first->second.value().isEmpty())) { - range.first->second.setValue(*valuesIterator); + auto &field = range.first->second; + if (extendedId.matches(field) && (!extendedId.updateOnly || !field.value().isEmpty())) { + field.clearValue(); + field.setValue(*valuesIterator); + // note: Not sure which extended tag fields support multiple data atoms and which don't. Let's simply use + // only one data atom per extended field here and get rid of any possibly assigned additional data + // atoms. ++valuesIterator; } ++range.first; diff --git a/mp4/mp4tag.h b/mp4/mp4tag.h index 4469ee2..bbbb9b8 100644 --- a/mp4/mp4tag.h +++ b/mp4/mp4tag.h @@ -129,6 +129,7 @@ public: protected: IdentifierType internallyGetFieldId(KnownField field) const; KnownField internallyGetKnownField(const IdentifierType &id) const; + void internallyGetValuesFromField(const FieldType &field, std::vector &values) const; }; /*!