Tag Parser  9.4.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
mp4atom.h
Go to the documentation of this file.
1 #ifndef TAG_PARSER_MP4ATOM_H
2 #define TAG_PARSER_MP4ATOM_H
3 
4 #include "./mp4ids.h"
5 
6 #include "../genericfileelement.h"
7 
8 #include <c++utilities/conversion/stringconversion.h>
9 
10 #include <cstdint>
11 #include <iostream>
12 #include <list>
13 #include <memory>
14 
15 namespace TagParser {
16 
17 class Mp4Atom;
18 class Mp4Container;
19 
24 public:
26  using IdentifierType = std::uint32_t;
27  using DataSizeType = std::uint64_t;
28 
32  static constexpr std::uint8_t minimumElementSize()
33  {
34  return 8;
35  }
36 };
37 
38 class TAG_PARSER_EXPORT Mp4Atom : public GenericFileElement<Mp4Atom> {
39  friend class GenericFileElement<Mp4Atom>;
40 
41 public:
42  Mp4Atom(ContainerType &container, std::uint64_t startOffset);
43 
44  std::string idToString() const;
45  bool isParent() const;
46  bool isPadding() const;
47  std::uint64_t firstChildOffset() const;
48 
49  static void seekBackAndWriteAtomSize(std::ostream &stream, const std::ostream::pos_type &startOffset, Diagnostics &diag);
50  static void seekBackAndWriteAtomSize64(std::ostream &stream, const std::ostream::pos_type &startOffset);
51  static constexpr void addHeaderSize(std::uint64_t &dataSize);
52  static void makeHeader(std::uint64_t size, std::uint32_t id, CppUtilities::BinaryWriter &writer);
53 
54 protected:
55  Mp4Atom(ContainerType &container, std::uint64_t startOffset, std::uint64_t maxSize);
56  Mp4Atom(Mp4Atom &parent, std::uint64_t startOffset);
57 
58  void internalParse(Diagnostics &diag);
59 
60 private:
61  std::string parsingContext() const;
62 };
63 
67 inline std::string Mp4Atom::idToString() const
68 {
69  auto idString = CppUtilities::interpretIntegerAsString<IdentifierType>(id());
70  for (char &c : idString) {
71  if (c < ' ') {
72  c = '?';
73  }
74  }
75  return idString;
76 }
77 
81 constexpr void Mp4Atom::addHeaderSize(std::uint64_t &dataSize)
82 {
83  dataSize += (dataSize < 0xFFFFFFF7 ? 8 : 16);
84 }
85 
86 } // namespace TagParser
87 
88 #endif // TAG_PARSER_MP4ATOM_H
TagParser::Mp4Container
Implementation of GenericContainer<MediaFileInfo, Mp4Tag, Mp4Track, Mp4Atom>.
Definition: mp4container.h:18
mp4ids.h
TagParser::FileElementTraits< Mp4Atom >::minimumElementSize
static constexpr std::uint8_t minimumElementSize()
Returns the minimal atom size which is 8 byte.
Definition: mp4atom.h:32
TagParser::FileElementTraits
Defines traits for the specified ImplementationType.
Definition: genericfileelement.h:34
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::Mp4Atom::idToString
std::string idToString() const
Converts the specified atom ID to a printable string.
Definition: mp4atom.h:67
TagParser::GenericFileElement::dataSize
DataSizeType dataSize() const
Returns the data size of the element in byte.
Definition: genericfileelement.h:315
TagParser::GenericFileElement
The GenericFileElement class helps to parse binary files which consist of an arboreal element strucut...
Definition: genericfileelement.h:45
TagParser::FileElementTraits< Mp4Atom >::DataSizeType
std::uint64_t DataSizeType
Definition: mp4atom.h:27
TagParser::Mp4Atom::addHeaderSize
static constexpr void addHeaderSize(std::uint64_t &dataSize)
Adds the header size to the specified data size.
Definition: mp4atom.h:81
TagParser::FileElementTraits< Mp4Atom >::IdentifierType
std::uint32_t IdentifierType
Definition: mp4atom.h:26
TagParser::GenericFileElement::ContainerType
typename FileElementTraits< ImplementationType >::ContainerType ContainerType
Specifies the type of the corresponding container.
Definition: genericfileelement.h:52
TAG_PARSER_EXPORT
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
TagParser::Mp4Atom
The Mp4Atom class helps to parse MP4 files.
Definition: mp4atom.h:38