tagparser/mp4/mp4tag.h

180 lines
5.0 KiB
C
Raw Normal View History

#ifndef TAG_PARSER_MP4TAG_H
#define TAG_PARSER_MP4TAG_H
2015-04-22 19:22:01 +02:00
2015-09-06 19:57:33 +02:00
#include "./mp4tagfield.h"
2015-04-22 19:22:01 +02:00
2015-09-06 19:57:33 +02:00
#include "../fieldbasedtag.h"
2015-04-22 19:22:01 +02:00
2018-03-07 01:17:50 +01:00
namespace TagParser {
2015-04-22 19:22:01 +02:00
class Mp4Atom;
2015-12-10 13:50:46 +01:00
class Mp4Tag;
2018-03-07 01:17:50 +01:00
struct TAG_PARSER_EXPORT Mp4ExtendedFieldId {
Mp4ExtendedFieldId(const char *mean = nullptr, const char *name = nullptr, bool updateOnly = false);
Mp4ExtendedFieldId(KnownField field);
operator bool() const;
bool matches(const Mp4TagField &field) const;
/// \brief mean parameter, usually Mp4TagExtendedMeanIds::iTunes
const char *mean;
/// \brief name parameter
const char *name;
/// \brief Whether only existing fields should be updated but *no* new extended field should be created
bool updateOnly;
};
/*!
* \brief Constructs a new instance with the specified parameter.
*/
2018-03-07 01:17:50 +01:00
inline Mp4ExtendedFieldId::Mp4ExtendedFieldId(const char *mean, const char *name, bool updateOnly)
: mean(mean)
, name(name)
, updateOnly(updateOnly)
{
}
/*!
* \brief Returns whether valid parameter are assigned.
*/
inline Mp4ExtendedFieldId::operator bool() const
{
return mean && name;
}
/*!
* \brief Returns whether the current parameter match the specified \a field.
*/
inline bool Mp4ExtendedFieldId::matches(const Mp4TagField &field) const
{
return field.mean() == mean && field.name() == name;
}
2018-03-07 01:17:50 +01:00
class TAG_PARSER_EXPORT Mp4TagMaker {
2015-12-10 13:50:46 +01:00
friend class Mp4Tag;
public:
void make(std::ostream &stream, Diagnostics &diag);
2015-12-10 13:50:46 +01:00
const Mp4Tag &tag() const;
uint64 requiredSize() const;
private:
Mp4TagMaker(Mp4Tag &tag, Diagnostics &diag);
2015-12-10 13:50:46 +01:00
Mp4Tag &m_tag;
std::vector<Mp4TagFieldMaker> m_maker;
2015-12-10 13:50:46 +01:00
uint64 m_metaSize;
uint64 m_ilstSize;
bool m_omitPreDefinedGenre;
};
/*!
* \brief Returns the associated tag.
*/
inline const Mp4Tag &Mp4TagMaker::tag() const
{
return m_tag;
}
/*!
* \brief Returns the number of bytes which will be written when making the tag.
*/
inline uint64 Mp4TagMaker::requiredSize() const
{
return m_metaSize;
}
2015-04-22 19:22:01 +02:00
/*!
* \brief Defines traits for the TagField implementation of the Mp4Tag class.
*/
2018-03-07 01:17:50 +01:00
template <> class TAG_PARSER_EXPORT FieldMapBasedTagTraits<Mp4Tag> {
public:
2018-07-11 13:19:43 +02:00
using FieldType = Mp4TagField;
using Compare = std::less<typename FieldType::IdentifierType>;
};
2018-03-07 01:17:50 +01:00
class TAG_PARSER_EXPORT Mp4Tag : public FieldMapBasedTag<Mp4Tag> {
friend class FieldMapBasedTag<Mp4Tag>;
2015-04-22 19:22:01 +02:00
public:
Mp4Tag();
static constexpr TagType tagType = TagType::Mp4Tag;
static constexpr const char *tagName = "MP4/iTunes tag";
static constexpr TagTextEncoding defaultTextEncoding = TagTextEncoding::Utf8;
2018-03-07 01:11:42 +01:00
bool canEncodingBeUsed(TagTextEncoding encoding) const override;
2015-04-22 19:22:01 +02:00
2018-03-07 01:11:42 +01:00
bool supportsField(KnownField field) const override;
using FieldMapBasedTag<Mp4Tag>::value;
2018-03-07 01:11:42 +01:00
const TagValue &value(KnownField value) const override;
using FieldMapBasedTag<Mp4Tag>::values;
2018-03-07 01:11:42 +01:00
std::vector<const TagValue *> values(KnownField field) const override;
const TagValue &value(const std::string &mean, const std::string &name) const;
const TagValue &value(const char *mean, const char *name) const;
using FieldMapBasedTag<Mp4Tag>::setValue;
2018-03-07 01:11:42 +01:00
bool setValue(KnownField field, const TagValue &value) override;
using FieldMapBasedTag<Mp4Tag>::setValues;
2018-03-07 01:11:42 +01:00
bool setValues(KnownField field, const std::vector<TagValue> &values) override;
bool setValue(const std::string &mean, const std::string &name, const TagValue &value);
bool setValue(const char *mean, const char *name, const TagValue &value);
using FieldMapBasedTag<Mp4Tag>::hasField;
2018-03-07 01:11:42 +01:00
bool hasField(KnownField value) const override;
2018-07-13 12:25:00 +02:00
bool supportsMultipleValues(KnownField) const override;
2015-04-22 19:22:01 +02:00
void parse(Mp4Atom &metaAtom, Diagnostics &diag);
Mp4TagMaker prepareMaking(Diagnostics &diag);
void make(std::ostream &stream, Diagnostics &diag);
protected:
IdentifierType internallyGetFieldId(KnownField field) const;
KnownField internallyGetKnownField(const IdentifierType &id) const;
2015-04-22 19:22:01 +02:00
};
/*!
* \brief Constructs a new tag.
*/
inline Mp4Tag::Mp4Tag()
2018-03-07 01:17:50 +01:00
{
}
2015-04-22 19:22:01 +02:00
inline bool Mp4Tag::supportsField(KnownField field) const
{
2018-03-07 01:17:50 +01:00
switch (field) {
case KnownField::EncoderSettings:
return true;
default:
return FieldMapBasedTag<Mp4Tag>::supportsField(field);
}
}
/*!
* \brief Returns the value of the field with the specified \a mean and \a name attributes.
*/
inline const TagValue &Mp4Tag::value(const std::string &mean, const std::string &name) const
{
return value(mean.data(), name.data());
}
/*!
* \brief Assigns the given \a value to the field with the specified \a mean and \a name attributes.
*/
inline bool Mp4Tag::setValue(const std::string &mean, const std::string &name, const TagValue &value)
{
return setValue(mean.data(), name.data(), value);
}
2018-07-13 12:25:00 +02:00
/*!
* \brief Returns false for all fields (for now).
* \remarks Not sure whether iTunes-style MP4 tags allow this. Let's return false for now.
* \todo Do some research whether it is supported or not.
*/
inline bool Mp4Tag::supportsMultipleValues(KnownField) const
{
return false;
}
2018-03-07 01:17:50 +01:00
} // namespace TagParser
2015-04-22 19:22:01 +02:00
#endif // TAG_PARSER_MP4TAG_H