6 #include "../exceptions.h" 8 #include <c++utilities/conversion/types.h> 9 #include <c++utilities/conversion/binaryconversion.h> 10 #include <c++utilities/io/binaryreader.h> 11 #include <c++utilities/io/binarywriter.h> 33 uint64 EbmlElement::bytesToBeSkipped = 0x4000;
59 string EbmlElement::parsingContext()
const 70 static const string context(
"parsing EBML element header");
81 byte beg =
stream().peek(), mask = 0x80;
100 m_id = BE::toUInt32(buf);
103 beg =
stream().peek(), mask = 0x80;
130 m_dataSize = ConversionUtilities::BE::toUInt64(buf);
147 if(firstChildOffset && firstChildOffset <
totalSize()) {
194 char buff[
sizeof(uint64)] = {0};
195 int i =
static_cast<int>(
sizeof(buff)) -
dataSize();
200 stream().read(buff + i,
sizeof(buff) - i);
201 return BE::toUInt64(buff);
212 case sizeof(float32):
213 return reader().readFloat32BE();
214 case sizeof(float64):
215 return reader().readFloat64BE();
229 }
else if(
id <= 0x7FFF) {
231 }
else if(
id <= 0x3FFFFF) {
233 }
else if(
id <= 0x1FFFFFFF) {
248 }
else if(size <= 16382ul) {
250 }
else if(size <= 2097150ul) {
252 }
else if(size <= 268435454ul) {
254 }
else if(size <= 34359738366ul) {
256 }
else if(size <= 4398046511102ul) {
258 }
else if(size <= 562949953421310ul) {
260 }
else if(size <= 72057594037927934ul) {
276 *buff =
static_cast<byte
>(
id);
278 }
else if(
id <= 0x7FFF) {
279 BE::getBytes(static_cast<uint16>(
id), buff);
281 }
else if(
id <= 0x3FFFFF) {
282 BE::getBytes(static_cast<uint32>(
id << 0x8), buff);
284 }
else if(
id <= 0x1FFFFFFF) {
285 BE::getBytes(static_cast<uint32>(
id), buff);
302 *buff =
static_cast<byte
>(size | 0x80);
304 }
else if(size <= 16382ul) {
305 BE::getBytes(static_cast<uint16>(size | 0x4000), buff);
307 }
else if(size <= 2097150ul) {
308 BE::getBytes(static_cast<uint32>((size | 0x200000) << 0x08), buff);
310 }
else if(size <= 268435454ul) {
311 BE::getBytes(static_cast<uint32>(size | 0x10000000), buff);
313 }
else if(size <= 34359738366ul) {
314 BE::getBytes(static_cast<uint64>((size | 0x800000000) << 0x18), buff);
316 }
else if(size <= 4398046511102ul) {
317 BE::getBytes(static_cast<uint64>((size | 0x40000000000) << 0x10), buff);
319 }
else if(size <= 562949953421310ul) {
320 BE::getBytes(static_cast<uint64>((size | 0x2000000000000) << 0x08), buff);
322 }
else if(size <= 72057594037927934ul) {
323 BE::getBytes(static_cast<uint64>(size | 0x100000000000000), buff);
339 if(minBytes <= 1 && size < 126) {
340 *buff =
static_cast<byte
>(size | 0x80);
342 }
else if(minBytes <= 2 && size <= 16382ul) {
343 BE::getBytes(static_cast<uint16>(size | 0x4000), buff);
345 }
else if(minBytes <= 3 && size <= 2097150ul) {
346 BE::getBytes(static_cast<uint32>((size | 0x200000) << 0x08), buff);
348 }
else if(minBytes <= 4 && size <= 268435454ul) {
349 BE::getBytes(static_cast<uint32>(size | 0x10000000), buff);
351 }
else if(minBytes <= 5 && size <= 34359738366ul) {
352 BE::getBytes(static_cast<uint64>((size | 0x800000000) << 0x18), buff);
354 }
else if(minBytes <= 6 && size <= 4398046511102ul) {
355 BE::getBytes(static_cast<uint64>((size | 0x40000000000) << 0x10), buff);
357 }
else if(minBytes <= 7 && size <= 562949953421310ul) {
358 BE::getBytes(static_cast<uint64>((size | 0x2000000000000) << 0x08), buff);
360 }
else if(minBytes <= 8 && size <= 72057594037927934ul) {
361 BE::getBytes(static_cast<uint64>(size | 0x100000000000000), buff);
373 if(integer <= 0xFFul) {
375 }
else if(integer <= 0xFFFFul) {
377 }
else if(integer <= 0xFFFFFFul) {
379 }
else if(integer <= 0xFFFFFFFFul) {
381 }
else if(integer <= 0xFFFFFFFFFFul) {
383 }
else if(integer <= 0xFFFFFFFFFFFFul) {
385 }
else if(integer <= 0xFFFFFFFFFFFFFFul) {
398 if(value <= 0xFFul) {
399 *buff =
static_cast<char>(value);
401 }
else if(value <= 0xFFFFul) {
402 BE::getBytes(static_cast<uint16>(value), buff);
404 }
else if(value <= 0xFFFFFFul) {
405 BE::getBytes(static_cast<uint32>(value << 0x08), buff);
407 }
else if(value <= 0xFFFFFFFFul) {
408 BE::getBytes(static_cast<uint32>(value), buff);
410 }
else if(value <= 0xFFFFFFFFFFul) {
411 BE::getBytes(static_cast<uint64>(value << 0x18), buff);
413 }
else if(value <= 0xFFFFFFFFFFFFul) {
414 BE::getBytes(static_cast<uint64>(value << 0x10), buff);
416 }
else if(value <= 0xFFFFFFFFFFFFFFul) {
417 BE::getBytes(static_cast<uint64>(value << 0x08), buff);
420 BE::getBytes(static_cast<uint64>(value), buff);
434 if(minBytes <= 1 && value <= 0xFFul) {
435 *buff =
static_cast<char>(value);
437 }
else if(minBytes <= 2 && value <= 0xFFFFul) {
438 BE::getBytes(static_cast<uint16>(value), buff);
440 }
else if(minBytes <= 3 && value <= 0xFFFFFFul) {
441 BE::getBytes(static_cast<uint32>(value << 0x08), buff);
443 }
else if(minBytes <= 4 && value <= 0xFFFFFFFFul) {
444 BE::getBytes(static_cast<uint32>(value), buff);
446 }
else if(minBytes <= 5 && value <= 0xFFFFFFFFFFul) {
447 BE::getBytes(static_cast<uint64>(value << 0x18), buff);
449 }
else if(minBytes <= 6 && value <= 0xFFFFFFFFFFFFul) {
450 BE::getBytes(static_cast<uint64>(value << 0x10), buff);
452 }
else if(minBytes <= 7 && value <= 0xFFFFFFFFFFFFFFul) {
453 BE::getBytes(static_cast<uint64>(value << 0x08), buff);
456 BE::getBytes(static_cast<uint64>(value), buff);
472 stream.write(buff1, sizeLength);
475 stream.write(buff1, sizeLength);
476 stream.write(buff2, elementSize);
489 stream.write(buff1, sizeLength);
491 stream.write(buff1, sizeLength);
492 stream.write(content.c_str(), content.size());
506 stream.write(buff1, sizeLength);
508 stream.write(buff1, sizeLength);
509 stream.write(data, dataSize);
Contains utility classes helping to read and write streams.