3 #include "../exceptions.h" 5 #include <c++utilities/conversion/binaryconversion.h> 6 #include <c++utilities/io/binaryreader.h> 10 using namespace ConversionUtilities;
25 void OggPage::parseHeader(istream &stream, uint64 startOffset, int32 maxSize)
28 stream.seekg(static_cast<streamoff>(startOffset));
29 BinaryReader reader(&stream);
36 if (reader.readUInt32LE() != 0x5367674f) {
39 m_startOffset = startOffset;
40 m_streamStructureVersion = reader.readByte();
41 m_headerTypeFlag = reader.readByte();
42 m_absoluteGranulePosition = reader.readUInt64LE();
43 m_streamSerialNumber = reader.readUInt32LE();
44 m_sequenceNumber = reader.readUInt32LE();
45 m_checksum = reader.readUInt32LE();
46 m_segmentCount = reader.readByte();
47 m_segmentSizes.clear();
48 if (m_segmentCount > 0) {
49 if (maxSize < m_segmentCount) {
52 maxSize -= m_segmentCount;
55 m_segmentSizes.push_back(0);
56 for (
byte i = 0; i < m_segmentCount;) {
57 byte entry = reader.readByte();
59 m_segmentSizes.back() += entry;
60 if (++i < m_segmentCount && entry < 0xff) {
61 m_segmentSizes.push_back(0);
75 uint32 OggPage::computeChecksum(istream &stream, uint64 startOffset)
77 stream.seekg(static_cast<streamoff>(startOffset));
79 byte value, segmentTableSize = 0, segmentTableIndex = 0;
80 for (uint32 i = 0, segmentLength = 27; i != segmentLength; ++i) {
84 stream.seekg(4, ios_base::cur);
93 segmentLength += (segmentTableSize = (value = static_cast<byte>(stream.get())));
96 value = static_cast<byte>(stream.get());
97 if (i > 26 && segmentTableIndex < segmentTableSize) {
99 segmentLength += value;
103 crc = (crc << 8) ^ BinaryReader::crc32Table[((crc >> 24) & 0xFF) ^ value];
112 void OggPage::updateChecksum(iostream &stream, uint64 startOffset)
115 LE::getBytes(computeChecksum(stream, startOffset), buff);
116 stream.seekp(static_cast<streamoff>(startOffset + 22));
117 stream.write(buff,
sizeof(buff));
124 uint32 OggPage::makeSegmentSizeDenotation(ostream &stream, uint32 size)
126 uint32 bytesWritten = 1;
127 while (size >= 0xff) {
128 stream.put(static_cast<char>(0xff));
132 stream.put(static_cast<char>(size));
The exception that is thrown when the data to be parsed is truncated and therefore can not be parsed ...
Contains utility classes helping to read and write streams.
The exception that is thrown when the data to be parsed or to be made seems invalid and therefore can...
Contains all classes and functions of the TagInfo library.