Tag Parser  9.4.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
mp4tagfield.h
Go to the documentation of this file.
1 #ifndef TAG_PARSER_MP4TAGATOM_H
2 #define TAG_PARSER_MP4TAGATOM_H
3 
4 #include "../generictagfield.h"
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 
13 namespace TagParser {
14 
18 namespace RawDataType {
19 enum KnownValue : std::uint32_t {
20  Reserved = 0,
21  Utf8 = 1,
22  Utf16 = 2,
23  Sjis = 3,
24  Utf8Sort = 4,
25  Utf16Sort = 5,
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,
38  BeSignedInt = 21,
40  BeFloat32 = 23,
41  BeFloat64 = 24,
42  Upc = 25,
43  Bmp = 27,
45  Undefined = 255
46 };
47 }
48 
49 class Mp4TagField;
50 class Diagnostics;
51 
56 public:
57  using IdentifierType = std::uint32_t;
58  using TypeInfoType = std::uint32_t;
59 };
60 
61 class Mp4Atom;
62 
64  friend class Mp4TagField;
65 
66 public:
67  void make(std::ostream &stream);
68  const Mp4TagField &field() const;
69  std::uint64_t requiredSize() const;
70 
71 private:
73 
74  Mp4TagField &m_field;
75  std::stringstream m_convertedData;
76  CppUtilities::BinaryWriter m_writer;
77  std::uint32_t m_rawDataType;
78  std::uint64_t m_dataSize;
79  std::uint64_t m_totalSize;
80 };
81 
85 inline const Mp4TagField &Mp4TagFieldMaker::field() const
86 {
87  return m_field;
88 }
89 
93 inline std::uint64_t Mp4TagFieldMaker::requiredSize() const
94 {
95  return m_totalSize;
96 }
97 
98 class TAG_PARSER_EXPORT Mp4TagField : public TagField<Mp4TagField> {
99  friend class TagField<Mp4TagField>;
100 
101 public:
102  Mp4TagField();
103  Mp4TagField(IdentifierType id, const TagValue &value);
104  Mp4TagField(const std::string &mean, const std::string &name, const TagValue &value);
105 
106  void reparse(Mp4Atom &ilstChild, Diagnostics &diag);
107  Mp4TagFieldMaker prepareMaking(Diagnostics &diag);
108  void make(std::ostream &stream, Diagnostics &diag);
109 
110  bool isAdditionalTypeInfoUsed() const;
111  const std::string &name() const;
112  void setName(const std::string &name);
113  const std::string &mean() const;
114  void setMean(const std::string &mean);
115  std::uint32_t parsedRawDataType() const;
116  std::uint16_t countryIndicator() const;
117  std::uint16_t languageIndicator() const;
118  bool supportsNestedFields() const;
119  std::vector<std::uint32_t> expectedRawDataTypes() const;
120  std::uint32_t appropriateRawDataType() const;
121 
122  static IdentifierType fieldIdFromString(const char *idString, std::size_t idStringSize = std::string::npos);
123  static std::string fieldIdToString(IdentifierType id);
124 
125 private:
126  void reset();
127  std::string m_name;
128  std::string m_mean;
129  std::uint32_t m_parsedRawDataType;
130  std::uint16_t m_countryIndicator;
131  std::uint16_t m_langIndicator;
132 };
133 
138 {
139  return false;
140 }
141 
145 inline const std::string &Mp4TagField::name() const
146 {
147  return m_name;
148 }
149 
153 inline void Mp4TagField::setName(const std::string &name)
154 {
155  m_name = name;
156 }
157 
161 inline const std::string &Mp4TagField::mean() const
162 {
163  return m_mean;
164 }
165 
169 inline void Mp4TagField::setMean(const std::string &mean)
170 {
171  m_mean = mean;
172 }
173 
177 inline std::uint32_t Mp4TagField::parsedRawDataType() const
178 {
179  return m_parsedRawDataType;
180 }
181 
185 inline std::uint16_t Mp4TagField::countryIndicator() const
186 {
187  return m_countryIndicator;
188 }
189 
193 inline std::uint16_t Mp4TagField::languageIndicator() const
194 {
195  return m_langIndicator;
196 }
197 
202 {
203  return false;
204 }
205 
211 inline Mp4TagField::IdentifierType Mp4TagField::fieldIdFromString(const char *idString, std::size_t idStringSize)
212 {
213  const auto latin1 = CppUtilities::convertUtf8ToLatin1(idString, idStringSize != std::string::npos ? idStringSize : std::strlen(idString));
214  switch (latin1.second) {
215  case 4:
216  return CppUtilities::BE::toUInt32(latin1.first.get());
217  default:
218  throw CppUtilities::ConversionException("MP4 ID must be exactly 4 chars");
219  }
220 }
221 
228 {
229  const auto utf8 = CppUtilities::convertLatin1ToUtf8(CppUtilities::interpretIntegerAsString<std::uint32_t>(id).data(), 4);
230  return std::string(utf8.first.get(), utf8.second);
231 }
232 
233 } // namespace TagParser
234 
235 #endif // TAG_PARSER_MP4TAGATOM_H
TagParser::Mp4TagField::fieldIdToString
static std::string fieldIdToString(IdentifierType id)
Returns the string representation for the specified id.
Definition: mp4tagfield.h:227
TagParser::Mp4TagField::fieldIdFromString
static IdentifierType fieldIdFromString(const char *idString, std::size_t idStringSize=std::string::npos)
Converts the specified ID string representation to an actual ID.
Definition: mp4tagfield.h:211
TagParser::Mp4TagField::countryIndicator
std::uint16_t countryIndicator() const
Returns the country indicator.
Definition: mp4tagfield.h:185
TagParser::RawDataType::Png
@ Png
Definition: mp4tagfield.h:33
TagParser::RawDataType::Upc
@ Upc
Definition: mp4tagfield.h:42
TagParser::RawDataType::Utf16
@ Utf16
Definition: mp4tagfield.h:22
TagParser::RawDataType::Url
@ Url
Definition: mp4tagfield.h:34
TagParser::RawDataType::Isrc
@ Isrc
Definition: mp4tagfield.h:29
TagParser::RawDataType::Utf8
@ Utf8
Definition: mp4tagfield.h:21
TagParser::Mp4TagFieldMaker::field
const Mp4TagField & field() const
Returns the associated field.
Definition: mp4tagfield.h:85
TagParser::RawDataType::BeFloat32
@ BeFloat32
Definition: mp4tagfield.h:40
TagParser::TagFieldTraits
Defines traits for the specified ImplementationType.
Definition: generictagfield.h:16
TagParser::Mp4TagFieldMaker
The Mp4TagFieldMaker class helps making tag fields.
Definition: mp4tagfield.h:63
TagParser::RawDataType::Gif
@ Gif
Definition: mp4tagfield.h:31
TagParser::RawDataType::Xml
@ Xml
Definition: mp4tagfield.h:27
TagParser::Diagnostics
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
TagParser
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TagParser::RawDataType::KnownValue
KnownValue
Definition: mp4tagfield.h:19
TagParser::Mp4TagField::supportsNestedFields
bool supportsNestedFields() const
Returns whether nested fields are supported.
Definition: mp4tagfield.h:201
TagParser::Mp4TagField::languageIndicator
std::uint16_t languageIndicator() const
Returns the language indicator.
Definition: mp4tagfield.h:193
TagParser::RawDataType::Duration
@ Duration
Definition: mp4tagfield.h:35
TagParser::RawDataType::Mi3p
@ Mi3p
Definition: mp4tagfield.h:30
TagParser::TagFieldTraits< Mp4TagField >::TypeInfoType
std::uint32_t TypeInfoType
Definition: mp4tagfield.h:58
TagParser::TagField
The TagField class is used by FieldMapBasedTag to store the fields.
Definition: generictagfield.h:30
TagParser::RawDataType::BeFloat64
@ BeFloat64
Definition: mp4tagfield.h:41
TagParser::RawDataType::Utf16Sort
@ Utf16Sort
Definition: mp4tagfield.h:25
TagParser::RawDataType::QuickTimeMetadataAtom
@ QuickTimeMetadataAtom
Definition: mp4tagfield.h:44
TagParser::Mp4TagField::setName
void setName(const std::string &name)
Sets the "name" for the "extended" field.
Definition: mp4tagfield.h:153
TagParser::Mp4TagField::isAdditionalTypeInfoUsed
bool isAdditionalTypeInfoUsed() const
Returns whether the additional type info is used.
Definition: mp4tagfield.h:137
TagParser::RawDataType::Uuid
@ Uuid
Definition: mp4tagfield.h:28
TagParser::Mp4TagFieldMaker::requiredSize
std::uint64_t requiredSize() const
Returns number of bytes which will be written when making the field.
Definition: mp4tagfield.h:93
TagParser::Mp4TagField::parsedRawDataType
std::uint32_t parsedRawDataType() const
Returns the raw data type which has been determined when parsing.
Definition: mp4tagfield.h:177
TagParser::RawDataType::Bmp
@ Bmp
Definition: mp4tagfield.h:43
TagParser::RawDataType::DateTime
@ DateTime
Definition: mp4tagfield.h:36
TagParser::RawDataType::Reserved
@ Reserved
Definition: mp4tagfield.h:20
TagParser::TagValue
The TagValue class wraps values of different types.
Definition: tagvalue.h:75
TagParser::RawDataType::Genred
@ Genred
Definition: mp4tagfield.h:37
TagParser::Mp4TagField::setMean
void setMean(const std::string &mean)
Sets the "mean" for the "extended" field.
Definition: mp4tagfield.h:169
TAG_PARSER_EXPORT
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
TagParser::RawDataType::Sjis
@ Sjis
Definition: mp4tagfield.h:23
TagParser::RawDataType::BeUnsignedInt
@ BeUnsignedInt
Definition: mp4tagfield.h:39
TagParser::RawDataType::Utf8Sort
@ Utf8Sort
Definition: mp4tagfield.h:24
TagParser::RawDataType::BeSignedInt
@ BeSignedInt
Definition: mp4tagfield.h:38
TagParser::Mp4TagField::mean
const std::string & mean() const
Returns the "mean" for "extended" fields.
Definition: mp4tagfield.h:161
TagParser::Mp4Atom
The Mp4Atom class helps to parse MP4 files.
Definition: mp4atom.h:38
TagParser::RawDataType::Undefined
@ Undefined
Definition: mp4tagfield.h:45
TagParser::RawDataType::Html
@ Html
Definition: mp4tagfield.h:26
TagParser::TagFieldTraits< Mp4TagField >::IdentifierType
std::uint32_t IdentifierType
Definition: mp4tagfield.h:57
TagParser::Mp4TagField
The Mp4TagField class is used by Mp4Tag to store the fields.
Definition: mp4tagfield.h:98
TagParser::RawDataType::Jpeg
@ Jpeg
Definition: mp4tagfield.h:32
TagParser::TagField< Mp4TagField >::IdentifierType
typename TagFieldTraits< Mp4TagField >::IdentifierType IdentifierType
Definition: generictagfield.h:34
TagParser::Mp4TagField::name
const std::string & name() const
Returns the "name" for "extended" fields.
Definition: mp4tagfield.h:145