Tag Parser 12.1.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
Loading...
Searching...
No Matches
mp4tag.h
Go to the documentation of this file.
1#ifndef TAG_PARSER_MP4TAG_H
2#define TAG_PARSER_MP4TAG_H
3
4#include "./mp4tagfield.h"
5
6#include "../fieldbasedtag.h"
7
8namespace TagParser {
9
10class Mp4Atom;
11class Mp4Tag;
12
14 Mp4ExtendedFieldId(std::string_view mean, std::string_view name, bool updateOnly = false);
16
17 operator bool() const;
18 bool matches(const Mp4TagField &field) const;
19
21 std::string_view mean;
23 std::string_view name;
25 bool updateOnly = false;
26};
27
31inline Mp4ExtendedFieldId::Mp4ExtendedFieldId(std::string_view mean, std::string_view name, bool updateOnly)
32 : mean(mean)
33 , name(name)
34 , updateOnly(updateOnly)
35{
36}
37
41inline Mp4ExtendedFieldId::operator bool() const
42{
43 return !mean.empty() && !name.empty();
44}
45
49inline bool Mp4ExtendedFieldId::matches(const Mp4TagField &field) const
50{
51 return field.mean() == mean && field.name() == name;
52}
53
55 friend class Mp4Tag;
56
57public:
58 void make(std::ostream &stream, Diagnostics &diag);
59 const Mp4Tag &tag() const;
60 std::uint64_t requiredSize() const;
61
62private:
63 Mp4TagMaker(Mp4Tag &tag, Diagnostics &diag);
64
65 Mp4Tag &m_tag;
66 std::vector<Mp4TagFieldMaker> m_maker;
67 std::uint64_t m_metaSize;
68 std::uint64_t m_ilstSize;
69 bool m_omitPreDefinedGenre;
70};
71
75inline const Mp4Tag &Mp4TagMaker::tag() const
76{
77 return m_tag;
78}
79
83inline std::uint64_t Mp4TagMaker::requiredSize() const
84{
85 return m_metaSize;
86}
87
92public:
94 using Compare = std::less<typename FieldType::IdentifierType>;
95};
96
97class TAG_PARSER_EXPORT Mp4Tag final : public FieldMapBasedTag<Mp4Tag> {
98 friend class FieldMapBasedTag<Mp4Tag>;
99
100public:
101 Mp4Tag();
102
103 static constexpr TagType tagType = TagType::Mp4Tag;
104 static constexpr std::string_view tagName = "MP4/iTunes tag";
105 static constexpr TagTextEncoding defaultTextEncoding = TagTextEncoding::Utf8;
106 bool canEncodingBeUsed(TagTextEncoding encoding) const override;
107
108 bool supportsField(KnownField field) const override;
109 using FieldMapBasedTag<Mp4Tag>::value;
110 const TagValue &value(KnownField value) const override;
111 using FieldMapBasedTag<Mp4Tag>::values;
112 std::vector<const TagValue *> values(KnownField field) const override;
113 const TagValue &value(std::string_view mean, std::string_view name) const;
114 using FieldMapBasedTag<Mp4Tag>::setValue;
115 bool setValue(KnownField field, const TagValue &value) override;
116 using FieldMapBasedTag<Mp4Tag>::setValues;
117 bool setValues(KnownField field, const std::vector<TagValue> &values) override;
118 bool setValue(std::string_view mean, std::string_view name, const TagValue &value);
119 using FieldMapBasedTag<Mp4Tag>::hasField;
120 bool hasField(KnownField value) const override;
121 bool supportsMultipleValues(KnownField) const override;
122
123 void parse(Mp4Atom &metaAtom, Diagnostics &diag);
124 Mp4TagMaker prepareMaking(Diagnostics &diag);
125 void make(std::ostream &stream, Diagnostics &diag);
126
127protected:
128 IdentifierType internallyGetFieldId(KnownField field) const;
129 KnownField internallyGetKnownField(const IdentifierType &id) const;
130 void internallyGetValuesFromField(const FieldType &field, std::vector<const TagValue *> &values) const;
131};
132
137{
138}
139
140inline bool Mp4Tag::supportsField(KnownField field) const
141{
142 switch (field) {
144 return true;
145 default:
147 }
148}
149
156{
157 return false;
158}
159
160} // namespace TagParser
161
162#endif // TAG_PARSER_MP4TAG_H
The Diagnostics class is a container for DiagMessage.
std::less< typename FieldType::IdentifierType > Compare
Definition mp4tag.h:94
Defines traits for the specified ImplementationType.
The FieldMapBasedTag provides a generic implementation of Tag which stores the tag fields using std::...
bool supportsField(KnownField field) const
Returns an indication whether the specified field is supported by the tag.
The Mp4Atom class helps to parse MP4 files.
Definition mp4atom.h:38
The Mp4TagField class is used by Mp4Tag to store the fields.
const std::string & name() const
Returns the "name" for "extended" fields.
const std::string & mean() const
Returns the "mean" for "extended" fields.
The Mp4TagMaker class helps writing MP4 tags.
Definition mp4tag.h:54
const Mp4Tag & tag() const
Returns the associated tag.
Definition mp4tag.h:75
std::uint64_t requiredSize() const
Returns the number of bytes which will be written when making the tag.
Definition mp4tag.h:83
Implementation of TagParser::Tag for the MP4 container.
Definition mp4tag.h:97
bool supportsMultipleValues(KnownField) const override
Returns false for all fields (for now).
Definition mp4tag.h:155
bool supportsField(KnownField field) const override
Returns an indication whether the specified field is supported by the tag.
Definition mp4tag.h:140
Mp4Tag()
Constructs a new tag.
Definition mp4tag.h:136
The TagValue class wraps values of different types.
Definition tagvalue.h:147
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
Definition global.h:13
Contains all classes and functions of the TagInfo library.
Definition aaccodebook.h:10
KnownField
Specifies the field.
Definition tag.h:29
TagTextEncoding
Specifies the text encoding.
Definition tagvalue.h:29
TagType
Specifies the tag type.
Definition tagtype.h:11
The Mp4ExtendedFieldId specifies parameter for an extended field denoted via Mp4TagAtomIds::Extended.
Definition mp4tag.h:13
bool matches(const Mp4TagField &field) const
Returns whether the current parameter match the specified field.
Definition mp4tag.h:49
std::string_view mean
mean parameter, usually Mp4TagExtendedMeanIds::iTunes
Definition mp4tag.h:21
Mp4ExtendedFieldId(std::string_view mean, std::string_view name, bool updateOnly=false)
Constructs a new instance with the specified parameter.
Definition mp4tag.h:31
std::string_view name
name parameter
Definition mp4tag.h:23