6 #include "../mediafileinfo.h" 7 #include "../exceptions.h" 9 #include <c++utilities/conversion/types.h> 10 #include <c++utilities/conversion/binaryconversion.h> 11 #include <c++utilities/io/binaryreader.h> 12 #include <c++utilities/io/binarywriter.h> 34 uint64 EbmlElement::bytesToBeSkipped = 0x4000;
60 string EbmlElement::parsingContext()
const 71 static const string context(
"parsing EBML element header");
82 byte beg =
static_cast<byte
>(
stream().peek()), mask = 0x80;
101 m_id = BE::toUInt32(buf);
104 beg =
static_cast<byte
>(
stream().peek()), mask = 0x80;
131 m_dataSize = ConversionUtilities::BE::toUInt64(buf);
148 if(firstChildOffset && firstChildOffset <
totalSize()) {
195 char buff[
sizeof(uint64)] = {0};
196 int i =
static_cast<int>(
sizeof(buff)) -
dataSize();
201 stream().read(buff + i,
sizeof(buff) - i);
202 return BE::toUInt64(buff);
213 case sizeof(float32):
214 return reader().readFloat32BE();
215 case sizeof(float64):
216 return reader().readFloat64BE();
230 }
else if(
id <= 0x7FFF) {
232 }
else if(
id <= 0x3FFFFF) {
234 }
else if(
id <= 0x1FFFFFFF) {
249 }
else if(size <= 16382ul) {
251 }
else if(size <= 2097150ul) {
253 }
else if(size <= 268435454ul) {
255 }
else if(size <= 34359738366ul) {
257 }
else if(size <= 4398046511102ul) {
259 }
else if(size <= 562949953421310ul) {
261 }
else if(size <= 72057594037927934ul) {
277 *buff =
static_cast<byte
>(
id);
279 }
else if(
id <= 0x7FFF) {
280 BE::getBytes(static_cast<uint16>(
id), buff);
282 }
else if(
id <= 0x3FFFFF) {
283 BE::getBytes(static_cast<uint32>(
id << 0x8), buff);
285 }
else if(
id <= 0x1FFFFFFF) {
286 BE::getBytes(static_cast<uint32>(
id), buff);
303 *buff =
static_cast<byte
>(size | 0x80);
305 }
else if(size <= 16382ul) {
306 BE::getBytes(static_cast<uint16>(size | 0x4000), buff);
308 }
else if(size <= 2097150ul) {
309 BE::getBytes(static_cast<uint32>((size | 0x200000) << 0x08), buff);
311 }
else if(size <= 268435454ul) {
312 BE::getBytes(static_cast<uint32>(size | 0x10000000), buff);
314 }
else if(size <= 34359738366ul) {
315 BE::getBytes(static_cast<uint64>((size | 0x800000000) << 0x18), buff);
317 }
else if(size <= 4398046511102ul) {
318 BE::getBytes(static_cast<uint64>((size | 0x40000000000) << 0x10), buff);
320 }
else if(size <= 562949953421310ul) {
321 BE::getBytes(static_cast<uint64>((size | 0x2000000000000) << 0x08), buff);
323 }
else if(size <= 72057594037927934ul) {
324 BE::getBytes(static_cast<uint64>(size | 0x100000000000000), buff);
340 if(minBytes <= 1 && size < 126) {
341 *buff =
static_cast<byte
>(size | 0x80);
343 }
else if(minBytes <= 2 && size <= 16382ul) {
344 BE::getBytes(static_cast<uint16>(size | 0x4000), buff);
346 }
else if(minBytes <= 3 && size <= 2097150ul) {
347 BE::getBytes(static_cast<uint32>((size | 0x200000) << 0x08), buff);
349 }
else if(minBytes <= 4 && size <= 268435454ul) {
350 BE::getBytes(static_cast<uint32>(size | 0x10000000), buff);
352 }
else if(minBytes <= 5 && size <= 34359738366ul) {
353 BE::getBytes(static_cast<uint64>((size | 0x800000000) << 0x18), buff);
355 }
else if(minBytes <= 6 && size <= 4398046511102ul) {
356 BE::getBytes(static_cast<uint64>((size | 0x40000000000) << 0x10), buff);
358 }
else if(minBytes <= 7 && size <= 562949953421310ul) {
359 BE::getBytes(static_cast<uint64>((size | 0x2000000000000) << 0x08), buff);
361 }
else if(minBytes <= 8 && size <= 72057594037927934ul) {
362 BE::getBytes(static_cast<uint64>(size | 0x100000000000000), buff);
374 if(integer <= 0xFFul) {
376 }
else if(integer <= 0xFFFFul) {
378 }
else if(integer <= 0xFFFFFFul) {
380 }
else if(integer <= 0xFFFFFFFFul) {
382 }
else if(integer <= 0xFFFFFFFFFFul) {
384 }
else if(integer <= 0xFFFFFFFFFFFFul) {
386 }
else if(integer <= 0xFFFFFFFFFFFFFFul) {
399 if(value <= 0xFFul) {
400 *buff =
static_cast<char>(value);
402 }
else if(value <= 0xFFFFul) {
403 BE::getBytes(static_cast<uint16>(value), buff);
405 }
else if(value <= 0xFFFFFFul) {
406 BE::getBytes(static_cast<uint32>(value << 0x08), buff);
408 }
else if(value <= 0xFFFFFFFFul) {
409 BE::getBytes(static_cast<uint32>(value), buff);
411 }
else if(value <= 0xFFFFFFFFFFul) {
412 BE::getBytes(static_cast<uint64>(value << 0x18), buff);
414 }
else if(value <= 0xFFFFFFFFFFFFul) {
415 BE::getBytes(static_cast<uint64>(value << 0x10), buff);
417 }
else if(value <= 0xFFFFFFFFFFFFFFul) {
418 BE::getBytes(static_cast<uint64>(value << 0x08), buff);
421 BE::getBytes(static_cast<uint64>(value), buff);
435 if(minBytes <= 1 && value <= 0xFFul) {
436 *buff =
static_cast<char>(value);
438 }
else if(minBytes <= 2 && value <= 0xFFFFul) {
439 BE::getBytes(static_cast<uint16>(value), buff);
441 }
else if(minBytes <= 3 && value <= 0xFFFFFFul) {
442 BE::getBytes(static_cast<uint32>(value << 0x08), buff);
444 }
else if(minBytes <= 4 && value <= 0xFFFFFFFFul) {
445 BE::getBytes(static_cast<uint32>(value), buff);
447 }
else if(minBytes <= 5 && value <= 0xFFFFFFFFFFul) {
448 BE::getBytes(static_cast<uint64>(value << 0x18), buff);
450 }
else if(minBytes <= 6 && value <= 0xFFFFFFFFFFFFul) {
451 BE::getBytes(static_cast<uint64>(value << 0x10), buff);
453 }
else if(minBytes <= 7 && value <= 0xFFFFFFFFFFFFFFul) {
454 BE::getBytes(static_cast<uint64>(value << 0x08), buff);
457 BE::getBytes(static_cast<uint64>(value), buff);
473 stream.write(buff1, sizeLength);
476 stream.write(buff1, sizeLength);
477 stream.write(buff2, elementSize);
490 stream.write(buff1, sizeLength);
492 stream.write(buff1, sizeLength);
493 stream.write(content.c_str(), content.size());
507 stream.write(buff1, sizeLength);
509 stream.write(buff1, sizeLength);
510 stream.write(data, dataSize);
Contains utility classes helping to read and write streams.