Tag Parser 12.4.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::unique_ptr< Mpeg4Descriptor > m_nextSibling
std::unique_ptr< Mpeg4Descriptor > m_firstChild
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 ...
Contains all classes and functions of the TagInfo library.
Definition aaccodebook.h:10