Tag Parser  9.1.3
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
mpeg4descriptor.cpp
Go to the documentation of this file.
1 #include "./mpeg4descriptor.h"
2 #include "./mp4container.h"
3 #include "./mp4ids.h"
4 
5 #include <c++utilities/conversion/stringbuilder.h>
6 #include <c++utilities/conversion/stringconversion.h>
7 #include <c++utilities/io/binaryreader.h>
8 
9 using namespace std;
10 using namespace CppUtilities;
11 
12 namespace TagParser {
13 
23 Mpeg4Descriptor::Mpeg4Descriptor(ContainerType &container, std::uint64_t startOffset, std::uint64_t maxSize)
24  : GenericFileElement<Mpeg4Descriptor>(container, startOffset, maxSize)
25 {
26 }
27 
31 Mpeg4Descriptor::Mpeg4Descriptor(Mpeg4Descriptor &parent, std::uint64_t startOffset)
32  : GenericFileElement<Mpeg4Descriptor>(parent, startOffset)
33 {
34 }
35 
39 string Mpeg4Descriptor::parsingContext() const
40 {
41  return "parsing " % idToString() % " descriptor at " + startOffset();
42 }
43 
47 std::string Mpeg4Descriptor::idToString() const
48 {
49  return "0x" + numberToString(id(), 16);
50 }
51 
57 {
58  if (maxTotalSize() < minimumElementSize()) {
59  diag.emplace_back(DiagLevel::Critical,
60  "Descriptor is smaller than 2 byte and hence invalid. The maximum size within the encloding element is " % numberToString(maxTotalSize())
61  + '.',
62  "parsing MPEG-4 descriptor");
63  throw TruncatedDataException();
64  }
65  stream().seekg(static_cast<streamoff>(startOffset()));
66  // read ID
68  m_id = reader().readByte();
69  // read data size
70  std::uint8_t tmp = reader().readByte();
71  m_dataSize = tmp & 0x7F;
72  while (tmp & 0x80) {
73  m_dataSize = (m_dataSize << 7) | ((tmp = reader().readByte()) & 0x7F);
74  ++m_sizeLength;
75  }
76  // check whether the denoted data size exceeds the available data size
77  if (maxTotalSize() < totalSize()) {
78  diag.emplace_back(DiagLevel::Warning, "The descriptor seems to be truncated; unable to parse siblings of that ", parsingContext());
79  m_dataSize = static_cast<std::uint32_t>(maxTotalSize()); // using max size instead
80  }
81  m_firstChild.reset();
82 
83  // check for siblings
84  if (totalSize() >= maxTotalSize()) {
85  m_nextSibling.reset();
86  return;
87  }
88  if (parent()) {
90  } else {
92  }
93 }
94 
95 } // namespace TagParser
mp4ids.h
TagParser::Mpeg4Descriptor::internalParse
void internalParse(Diagnostics &diag)
Parses the MPEG-4 descriptor.
Definition: mpeg4descriptor.cpp:56
TagParser::GenericFileElement::m_nextSibling
std::unique_ptr< ImplementationType > m_nextSibling
Definition: genericfileelement.h:138
TagParser::GenericFileElement::reader
CppUtilities::BinaryReader & reader()
Returns the related BinaryReader.
Definition: genericfileelement.h:245
TagParser::GenericFileElement::m_sizeLength
std::uint32_t m_sizeLength
Definition: genericfileelement.h:136
TagParser::GenericFileElement::m_idLength
std::uint32_t m_idLength
Definition: genericfileelement.h:135
TagParser::GenericFileElement::stream
std::iostream & stream()
Returns the related stream.
Definition: genericfileelement.h:237
TagParser::DiagLevel::Warning
@ Warning
TagParser::GenericFileElement::container
ContainerType & container()
Returns the related container.
Definition: genericfileelement.h:220
TagParser::GenericFileElement::startOffset
std::uint64_t startOffset() const
Returns the start offset in the related stream.
Definition: genericfileelement.h:261
TagParser::Diagnostics
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
mpeg4descriptor.h
TagParser
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TagParser::Mpeg4Descriptor::Mpeg4Descriptor
Mpeg4Descriptor(ContainerType &container, std::uint64_t startOffset, std::uint64_t maxSize)
Constructs a new top level descriptor with the specified container at the specified startOffset and w...
Definition: mpeg4descriptor.cpp:23
TagParser::GenericFileElement::minimumElementSize
static constexpr std::uint8_t minimumElementSize()
Returns the mimimum element size.
Definition: genericfileelement.h:977
TagParser::Mpeg4Descriptor
The Mpeg4Descriptor class helps to parse MPEG-4 descriptors.
Definition: mpeg4descriptor.h:31
TagParser::GenericFileElement::m_dataSize
DataSizeType m_dataSize
Definition: genericfileelement.h:134
TagParser::GenericFileElement
The GenericFileElement class helps to parse binary files which consist of an arboreal element strucut...
Definition: genericfileelement.h:45
TagParser::GenericFileElement::parent
ImplementationType * parent()
Returns the parent of the element.
Definition: genericfileelement.h:385
TagParser::DiagLevel::Critical
@ Critical
CppUtilities
Definition: abstractcontainer.h:15
TagParser::Mpeg4Descriptor::idToString
std::string idToString() const
Converts the specified atom ID to a printable string.
Definition: mpeg4descriptor.cpp:47
TagParser::GenericFileElement::m_id
IdentifierType m_id
Definition: genericfileelement.h:131
TagParser::TruncatedDataException
The exception that is thrown when the data to be parsed is truncated and therefore can not be parsed ...
Definition: exceptions.h:39
TagParser::GenericFileElement::ContainerType
typename FileElementTraits< ImplementationType >::ContainerType ContainerType
Specifies the type of the corresponding container.
Definition: genericfileelement.h:52
TagParser::GenericFileElement::m_firstChild
std::unique_ptr< ImplementationType > m_firstChild
Definition: genericfileelement.h:139
mp4container.h
TagParser::GenericFileElement::maxTotalSize
std::uint64_t maxTotalSize() const
Returns maximum total size.
Definition: genericfileelement.h:362
TagParser::GenericFileElement::totalSize
std::uint64_t totalSize() const
Returns the total size of the element.
Definition: genericfileelement.h:343