Tag Parser 12.5.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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
18
27
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.
GenericFileElement(ContainerType &container, std::uint64_t startOffset)
typename FileElementTraits< Mpeg4Descriptor >::ContainerType ContainerType
std::unique_ptr< Mpeg4Descriptor > m_nextSibling
std::unique_ptr< Mpeg4Descriptor > m_firstChild
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