6 #include "../exceptions.h"
7 #include "../mediafileinfo.h"
9 #include <c++utilities/conversion/binaryconversion.h>
10 #include <c++utilities/io/binaryreader.h>
11 #include <c++utilities/io/binarywriter.h>
32 std::uint64_t EbmlElement::bytesToBeSkipped = 0x4000;
61 string EbmlElement::parsingContext()
const
71 static const string context(
"parsing EBML element header");
83 std::uint8_t beg =
static_cast<std::uint8_t
>(
stream().peek()), mask = 0x80;
103 m_id = BE::toUInt32(buf);
111 const std::uint8_t actualLevel =
level();
112 if (actualLevel > supposedLevel) {
114 if (
EbmlElement *betterParent =
m_parent->parent(actualLevel -
static_cast<std::uint8_t
>(supposedLevel))) {
119 if (
m_parent->firstChild() ==
this) {
125 for (
EbmlElement *sibling =
m_parent->firstChild(); sibling; sibling = sibling->nextSibling()) {
126 if (sibling->nextSibling() ==
this) {
127 sibling->m_nextSibling.release();
135 previousSibling->m_nextSibling.reset(
this);
137 betterParent->m_firstChild.reset(
this);
146 beg =
static_cast<std::uint8_t
>(
stream().peek());
160 diag.emplace_back(
DiagLevel::Critical,
"EBML size length is not supported.", parsingContext());
180 diag.emplace_back(
DiagLevel::Critical,
"EBML header seems to be truncated.", parsingContext());
184 diag.emplace_back(
DiagLevel::Warning,
"Data of EBML element seems to be truncated; unable to parse siblings of that element.",
213 diag.emplace_back(
DiagLevel::Warning, argsToString(skipped,
" bytes have been skipped"), parsingContext());
241 char buff[maxBytesToRead] = { 0 };
242 const auto bytesToSkip = maxBytesToRead - min(
dataSize(), maxBytesToRead);
244 stream().read(buff + bytesToSkip,
static_cast<streamoff
>(
sizeof(buff) - bytesToSkip));
245 return BE::toUInt64(buff);
257 return static_cast<double>(
reader().readFloat32BE());
259 return reader().readFloat64BE();
273 }
else if (
id <= 0x7FFF) {
275 }
else if (
id <= 0x3FFFFF) {
277 }
else if (
id <= 0x1FFFFFFF) {
292 }
else if (size <= 16382ul) {
294 }
else if (size <= 2097150ul) {
296 }
else if (size <= 268435454ul) {
298 }
else if (size <= 34359738366ul) {
300 }
else if (size <= 4398046511102ul) {
302 }
else if (size <= 562949953421310ul) {
304 }
else if (size <= 72057594037927934ul) {
320 *buff =
static_cast<char>(
id);
322 }
else if (
id <= 0x7FFF) {
323 BE::getBytes(
static_cast<std::uint16_t
>(
id), buff);
325 }
else if (
id <= 0x3FFFFF) {
326 BE::getBytes(
static_cast<std::uint32_t
>(
id << 0x8), buff);
328 }
else if (
id <= 0x1FFFFFFF) {
329 BE::getBytes(
static_cast<std::uint32_t
>(
id), buff);
346 *buff =
static_cast<char>(size | 0x80);
348 }
else if (size <= 16382ul) {
349 BE::getBytes(
static_cast<std::uint16_t
>(size | 0x4000), buff);
351 }
else if (size <= 2097150ul) {
352 BE::getBytes(
static_cast<std::uint32_t
>((size | 0x200000) << 0x08), buff);
354 }
else if (size <= 268435454ul) {
355 BE::getBytes(
static_cast<std::uint32_t
>(size | 0x10000000), buff);
357 }
else if (size <= 34359738366ul) {
358 BE::getBytes(
static_cast<std::uint64_t
>((size | 0x800000000) << 0x18), buff);
360 }
else if (size <= 4398046511102ul) {
361 BE::getBytes(
static_cast<std::uint64_t
>((size | 0x40000000000) << 0x10), buff);
363 }
else if (size <= 562949953421310ul) {
364 BE::getBytes(
static_cast<std::uint64_t
>((size | 0x2000000000000) << 0x08), buff);
366 }
else if (size <= 72057594037927934ul) {
367 BE::getBytes(
static_cast<std::uint64_t
>(size | 0x100000000000000), buff);
383 if (minBytes <= 1 && size < 126) {
384 *buff =
static_cast<char>(size | 0x80);
386 }
else if (minBytes <= 2 && size <= 16382ul) {
387 BE::getBytes(
static_cast<std::uint16_t
>(size | 0x4000), buff);
389 }
else if (minBytes <= 3 && size <= 2097150ul) {
390 BE::getBytes(
static_cast<std::uint32_t
>((size | 0x200000) << 0x08), buff);
392 }
else if (minBytes <= 4 && size <= 268435454ul) {
393 BE::getBytes(
static_cast<std::uint32_t
>(size | 0x10000000), buff);
395 }
else if (minBytes <= 5 && size <= 34359738366ul) {
396 BE::getBytes(
static_cast<std::uint64_t
>((size | 0x800000000) << 0x18), buff);
398 }
else if (minBytes <= 6 && size <= 4398046511102ul) {
399 BE::getBytes(
static_cast<std::uint64_t
>((size | 0x40000000000) << 0x10), buff);
401 }
else if (minBytes <= 7 && size <= 562949953421310ul) {
402 BE::getBytes(
static_cast<std::uint64_t
>((size | 0x2000000000000) << 0x08), buff);
404 }
else if (minBytes <= 8 && size <= 72057594037927934ul) {
405 BE::getBytes(
static_cast<std::uint64_t
>(size | 0x100000000000000), buff);
417 if (integer <= 0xFFul) {
419 }
else if (integer <= 0xFFFFul) {
421 }
else if (integer <= 0xFFFFFFul) {
423 }
else if (integer <= 0xFFFFFFFFul) {
425 }
else if (integer <= 0xFFFFFFFFFFul) {
427 }
else if (integer <= 0xFFFFFFFFFFFFul) {
429 }
else if (integer <= 0xFFFFFFFFFFFFFFul) {
442 if (value <= 0xFFul) {
443 *buff =
static_cast<char>(value);
445 }
else if (value <= 0xFFFFul) {
446 BE::getBytes(
static_cast<std::uint16_t
>(value), buff);
448 }
else if (value <= 0xFFFFFFul) {
449 BE::getBytes(
static_cast<std::uint32_t
>(value << 0x08), buff);
451 }
else if (value <= 0xFFFFFFFFul) {
452 BE::getBytes(
static_cast<std::uint32_t
>(value), buff);
454 }
else if (value <= 0xFFFFFFFFFFul) {
455 BE::getBytes(
static_cast<std::uint64_t
>(value << 0x18), buff);
457 }
else if (value <= 0xFFFFFFFFFFFFul) {
458 BE::getBytes(
static_cast<std::uint64_t
>(value << 0x10), buff);
460 }
else if (value <= 0xFFFFFFFFFFFFFFul) {
461 BE::getBytes(
static_cast<std::uint64_t
>(value << 0x08), buff);
464 BE::getBytes(
static_cast<std::uint64_t
>(value), buff);
480 if (minBytes <= 1 && value <= 0xFFul) {
481 *buff =
static_cast<char>(value);
483 }
else if (minBytes <= 2 && value <= 0xFFFFul) {
484 BE::getBytes(
static_cast<std::uint16_t
>(value), buff);
486 }
else if (minBytes <= 3 && value <= 0xFFFFFFul) {
487 BE::getBytes(
static_cast<std::uint32_t
>(value << 0x08), buff);
489 }
else if (minBytes <= 4 && value <= 0xFFFFFFFFul) {
490 BE::getBytes(
static_cast<std::uint32_t
>(value), buff);
492 }
else if (minBytes <= 5 && value <= 0xFFFFFFFFFFul) {
493 BE::getBytes(
static_cast<std::uint64_t
>(value << 0x18), buff);
495 }
else if (minBytes <= 6 && value <= 0xFFFFFFFFFFFFul) {
496 BE::getBytes(
static_cast<std::uint64_t
>(value << 0x10), buff);
498 }
else if (minBytes <= 7 && value <= 0xFFFFFFFFFFFFFFul) {
499 BE::getBytes(
static_cast<std::uint64_t
>(value << 0x08), buff);
502 BE::getBytes(
static_cast<std::uint64_t
>(value), buff);
522 stream.write(buff2, elementSize);
538 stream.write(content.c_str(), content.size());