3 #include "../exceptions.h"
5 #include <c++utilities/conversion/binaryconversion.h>
6 #include <c++utilities/io/binaryreader.h>
27 void OggPage::parseHeader(istream &stream, std::uint64_t startOffset, std::int32_t maxSize)
30 stream.seekg(
static_cast<streamoff
>(startOffset));
31 BinaryReader reader(&stream);
38 if (reader.readUInt32LE() != 0x5367674f) {
41 m_startOffset = startOffset;
42 m_streamStructureVersion = reader.readByte();
43 m_headerTypeFlag = reader.readByte();
44 m_absoluteGranulePosition = reader.readUInt64LE();
45 m_streamSerialNumber = reader.readUInt32LE();
46 m_sequenceNumber = reader.readUInt32LE();
47 m_checksum = reader.readUInt32LE();
48 m_segmentCount = reader.readByte();
49 m_segmentSizes.clear();
50 if (m_segmentCount > 0) {
51 if (maxSize < m_segmentCount) {
54 maxSize -= m_segmentCount;
57 m_segmentSizes.emplace_back(0);
58 for (std::uint8_t i = 0; i < m_segmentCount;) {
59 std::uint8_t entry = reader.readByte();
61 m_segmentSizes.back() += entry;
62 if (++i < m_segmentCount && entry < 0xFF) {
63 m_segmentSizes.emplace_back(0);
64 }
else if (i == m_segmentCount && entry == 0xFF) {
65 m_headerTypeFlag |= 0x80;
79 std::uint32_t OggPage::computeChecksum(istream &stream, std::uint64_t startOffset)
81 stream.seekg(
static_cast<streamoff
>(startOffset));
82 std::uint32_t crc = 0x0;
83 std::uint8_t value, segmentTableSize = 0, segmentTableIndex = 0;
84 for (std::uint32_t i = 0, segmentLength = 27; i != segmentLength; ++i) {
88 stream.seekg(4, ios_base::cur);
97 segmentLength += (segmentTableSize = (value =
static_cast<std::uint8_t
>(stream.get())));
100 value =
static_cast<std::uint8_t
>(stream.get());
101 if (i > 26 && segmentTableIndex < segmentTableSize) {
103 segmentLength += value;
107 crc = (crc << 8) ^ BinaryReader::crc32Table[((crc >> 24) & 0xFF) ^ value];
116 void OggPage::updateChecksum(iostream &stream, std::uint64_t startOffset)
119 LE::getBytes(computeChecksum(stream, startOffset), buff);
120 stream.seekp(
static_cast<streamoff
>(startOffset + 22));
121 stream.write(buff,
sizeof(buff));
129 std::uint32_t OggPage::makeSegmentSizeDenotation(ostream &stream, std::uint32_t size)
131 std::uint32_t bytesWritten = 1;
132 while (size >= 0xff) {
133 stream.put(
static_cast<char>(0xff));
137 stream.put(
static_cast<char>(size));
The exception that is thrown when the data to be parsed or to be made seems invalid and therefore can...
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.