Tag Parser 12.5.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
mp4tagfield.h
Go to the documentation of this file.
1#ifndef TAG_PARSER_MP4TAGATOM_H
2#define TAG_PARSER_MP4TAGATOM_H
3
5
6#include <c++utilities/conversion/stringconversion.h>
7#include <c++utilities/io/binarywriter.h>
8
9#include <cstdint>
10#include <sstream>
11#include <vector>
12
13namespace TagParser {
14
18namespace RawDataType {
19enum KnownValue : std::uint32_t {
21 Utf8 = 1,
22 Utf16 = 2,
23 Sjis = 3,
26 Html = 6,
27 Xml = 7,
28 Uuid = 8,
29 Isrc = 9,
30 Mi3p = 10,
31 Gif = 12,
32 Jpeg = 13,
33 Png = 14,
34 Url = 15,
35 Duration = 16,
36 DateTime = 17,
37 Genred = 18,
40 BeFloat32 = 23,
41 BeFloat64 = 24,
42 Upc = 25,
43 Bmp = 27,
45 Undefined = 255
46};
47}
48
49class Mp4TagField;
50class Diagnostics;
51
56public:
57 using IdentifierType = std::uint32_t;
58 using TypeInfoType = std::uint32_t;
59};
60
61class Mp4Atom;
62
64 friend class Mp4TagField;
65
66public:
68 void make(std::ostream &stream);
69 const Mp4TagField &field() const;
70 std::uint64_t requiredSize() const;
71
72private:
74 struct Data {
75 Data();
76 Data(Data &&) = default;
77 std::string_view rawData;
78 std::stringstream convertedData;
79 std::uint64_t size = 0;
80 std::uint32_t rawType = 0;
81 std::uint16_t countryIndicator = 0;
82 std::uint16_t languageIndicator = 0;
83 };
85
87 std::uint64_t prepareDataAtom(
88 const TagValue &value, std::uint16_t countryIndicator, std::uint16_t languageIndicator, const std::string &context, Diagnostics &diag);
89
90 Mp4TagField &m_field;
91 CppUtilities::BinaryWriter m_writer;
92 std::vector<Data> m_data;
93 std::uint64_t m_totalSize;
94};
95
100{
101 return m_field;
102}
103
107inline std::uint64_t Mp4TagFieldMaker::requiredSize() const
108{
109 return m_totalSize;
110}
111
112class TAG_PARSER_EXPORT Mp4TagField : public TagField<Mp4TagField> {
113 friend class TagField<Mp4TagField>;
114
115public:
118 std::uint32_t rawDataType = 0;
119 std::uint16_t countryIndicator = 0;
120 std::uint16_t languageIndicator = 0;
121 };
122
123 Mp4TagField();
125 Mp4TagField(std::string_view mean, std::string_view name, const TagValue &value);
126
127 void reparse(Mp4Atom &ilstChild, Diagnostics &diag);
129 void make(std::ostream &stream, Diagnostics &diag);
130
131 const std::vector<AdditionalData> &additionalData() const;
132 std::vector<AdditionalData> &additionalData();
133 bool isAdditionalTypeInfoUsed() const;
134 const std::string &name() const;
135 void setName(const std::string &name);
136 const std::string &mean() const;
137 void setMean(const std::string &mean);
138 std::uint32_t parsedRawDataType() const;
139 std::uint16_t countryIndicator() const;
140 std::uint16_t languageIndicator() const;
141 bool supportsNestedFields() const;
142 std::vector<std::uint32_t> expectedRawDataTypes() const;
143 std::uint32_t appropriateRawDataType() const;
144 std::uint32_t appropriateRawDataTypeForValue(const TagValue &value) const;
145
146 static IdentifierType fieldIdFromString(std::string_view idString);
147 static std::string fieldIdToString(IdentifierType id);
148
149private:
150 void internallyClearValue();
151 void internallyClearFurtherData();
152 std::string m_name;
153 std::string m_mean;
154 std::vector<AdditionalData> m_additionalData;
155 std::uint32_t m_parsedRawDataType;
156 std::uint16_t m_countryIndicator;
157 std::uint16_t m_langIndicator;
158};
159
164inline const std::vector<Mp4TagField::AdditionalData> &Mp4TagField::additionalData() const
165{
166 return m_additionalData;
167}
168
173inline std::vector<Mp4TagField::AdditionalData> &Mp4TagField::additionalData()
174{
175 return m_additionalData;
176}
177
182{
183 return false;
184}
185
189inline const std::string &Mp4TagField::name() const
190{
191 return m_name;
192}
193
197inline void Mp4TagField::setName(const std::string &name)
198{
199 m_name = name;
200}
201
205inline const std::string &Mp4TagField::mean() const
206{
207 return m_mean;
208}
209
213inline void Mp4TagField::setMean(const std::string &mean)
214{
215 m_mean = mean;
216}
217
221inline std::uint32_t Mp4TagField::parsedRawDataType() const
222{
223 return m_parsedRawDataType;
224}
225
229inline std::uint16_t Mp4TagField::countryIndicator() const
230{
231 return m_countryIndicator;
232}
233
237inline std::uint16_t Mp4TagField::languageIndicator() const
238{
239 return m_langIndicator;
240}
241
246{
247 return false;
248}
249
256{
257 const auto latin1 = CppUtilities::convertUtf8ToLatin1(idString.data(), idString.size());
258 switch (latin1.second) {
259 case 4:
260 return CppUtilities::BE::toInt<std::uint32_t>(latin1.first.get());
261 default:
262 throw CppUtilities::ConversionException("MP4 ID must be exactly 4 chars");
263 }
264}
265
272{
273 const auto utf8 = CppUtilities::convertLatin1ToUtf8(CppUtilities::interpretIntegerAsString<std::uint32_t>(id).data(), 4);
274 return std::string(utf8.first.get(), utf8.second);
275}
276
277} // namespace TagParser
278
279#endif // TAG_PARSER_MP4TAGATOM_H
The Diagnostics class is a container for DiagMessage.
The Mp4Atom class helps to parse MP4 files.
Definition mp4atom.h:38
The Mp4TagFieldMaker class helps making tag fields.
Definition mp4tagfield.h:63
void make(std::ostream &stream)
Saves the field (specified when constructing the object) to the specified stream.
Mp4TagFieldMaker(Mp4TagFieldMaker &&)=default
std::uint64_t requiredSize() const
Returns number of bytes which will be written when making the field.
const Mp4TagField & field() const
Returns the associated field.
Definition mp4tagfield.h:99
The Mp4TagField class is used by Mp4Tag to store the fields.
Mp4TagFieldMaker prepareMaking(Diagnostics &diag)
Prepares making.
bool supportsNestedFields() const
Returns whether nested fields are supported.
const std::vector< AdditionalData > & additionalData() const
Returns additional data (and the corresponding raw data type, country and language).
void reparse(Mp4Atom &ilstChild, Diagnostics &diag)
Parses field information from the specified Mp4Atom.
const std::string & name() const
Returns the "name" for "extended" fields.
void setName(const std::string &name)
Sets the "name" for the "extended" field.
Mp4TagField()
Constructs a new Mp4TagField.
bool isAdditionalTypeInfoUsed() const
Returns whether the additional type info is used.
std::uint32_t appropriateRawDataTypeForValue(const TagValue &value) const
Returns an appropriate raw data type.
const std::string & mean() const
Returns the "mean" for "extended" fields.
std::uint32_t appropriateRawDataType() const
Returns an appropriate raw data type.
static IdentifierType fieldIdFromString(std::string_view idString)
Converts the specified ID string representation to an actual ID.
std::uint32_t parsedRawDataType() const
Returns the raw data type which has been determined when parsing.
void setMean(const std::string &mean)
Sets the "mean" for the "extended" field.
std::uint16_t languageIndicator() const
Returns the language indicator.
std::vector< std::uint32_t > expectedRawDataTypes() const
Returns the expected raw data types for the ID of the field.
std::uint16_t countryIndicator() const
Returns the country indicator.
void make(std::ostream &stream, Diagnostics &diag)
Saves the field to the specified stream.
static std::string fieldIdToString(IdentifierType id)
Returns the string representation for the specified id.
Defines traits for the specified ImplementationType.
typename TagFieldTraits< Mp4TagField >::IdentifierType IdentifierType
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:14
Encapsulates the most common data type IDs of MP4 tag fields.
Definition mp4tagfield.h:18
Contains all classes and functions of the TagInfo library.
Definition aaccodebook.h:10