Tag Parser 12.1.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
Loading...
Searching...
No Matches
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
9using namespace std;
10using namespace CppUtilities;
11
12namespace TagParser {
13
23Mpeg4Descriptor::Mpeg4Descriptor(ContainerType &container, std::uint64_t startOffset, std::uint64_t maxSize)
24 : GenericFileElement<Mpeg4Descriptor>(container, startOffset, maxSize)
25{
26}
27
31Mpeg4Descriptor::Mpeg4Descriptor(Mpeg4Descriptor &parent, std::uint64_t startOffset)
32 : GenericFileElement<Mpeg4Descriptor>(parent, startOffset)
33{
34}
35
39string Mpeg4Descriptor::parsingContext() const
40{
41 return "parsing " % idToString() % " descriptor at " + startOffset();
42}
43
47std::string Mpeg4Descriptor::idToString() const
48{
49 return "0x" + numberToString(id(), static_cast<std::uint8_t>(16));
50}
51
57{
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");
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);
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
The Diagnostics class is a container for DiagMessage.
The GenericFileElement class helps to parse binary files which consist of an arboreal element structu...
std::uint64_t startOffset() const
Returns the start offset in the related stream.
std::iostream & stream()
Returns the related stream.
std::unique_ptr< Mpeg4Descriptor > m_nextSibling
Mpeg4Descriptor * parent()
Returns the parent of the element.
static constexpr std::uint8_t minimumElementSize()
Returns the minimum element size.
std::unique_ptr< Mpeg4Descriptor > m_firstChild
std::uint64_t totalSize() const
Returns the total size of the element.
ContainerType & container()
Returns the related container.
CppUtilities::BinaryReader & reader()
Returns the related BinaryReader.
std::uint64_t maxTotalSize() const
Returns maximum total size.
The Mpeg4Descriptor class helps to parse MPEG-4 descriptors.
std::string idToString() const
Converts the specified atom ID to a printable string.
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...
void internalParse(Diagnostics &diag)
Parses the MPEG-4 descriptor.
The exception that is thrown when the data to be parsed is truncated and therefore can not be parsed ...
Definition exceptions.h:39
Contains all classes and functions of the TagInfo library.
Definition aaccodebook.h:10