Tag Parser  8.0.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 #include <c++utilities/conversion/types.h>
10 
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 = uint32;
27  using DataSizeType = uint64;
28 
32  static constexpr byte 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, uint64 startOffset);
43 
44  std::string idToString() const;
45  bool isParent() const;
46  bool isPadding() const;
47  uint64 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(uint64 &dataSize);
52  static void makeHeader(uint64 size, uint32 id, IoUtilities::BinaryWriter &writer);
53 
54 protected:
55  Mp4Atom(ContainerType &container, uint64 startOffset, uint64 maxSize);
56  Mp4Atom(Mp4Atom &parent, uint64 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 = ConversionUtilities::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(uint64 &dataSize)
82 {
83  dataSize += (dataSize < 0xFFFFFFF7 ? 8 : 16);
84 }
85 
86 } // namespace TagParser
87 
88 #endif // TAG_PARSER_MP4ATOM_H
Defines traits for the specified ImplementationType.
static constexpr void addHeaderSize(uint64 &dataSize)
Adds the header size to the specified data size.
Definition: mp4atom.h:81
DataSizeType dataSize() const
Returns the data size of the element in byte.
Implementation of GenericContainer<MediaFileInfo, Mp4Tag, Mp4Track, Mp4Atom>.
Definition: mp4container.h:19
The Mp4Atom class helps to parse MP4 files.
Definition: mp4atom.h:38
static constexpr byte minimumElementSize()
Returns the minimal atom size which is 8 byte.
Definition: mp4atom.h:32
The GenericFileElement class helps to parse binary files which consist of an arboreal element strucut...
typename FileElementTraits< ImplementationType >::ContainerType ContainerType
Specifies the type of the corresponding container.
const IdentifierType & id() const
Returns the element ID.
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:9
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
std::string idToString() const
Converts the specified atom ID to a printable string.
Definition: mp4atom.h:67
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156