3 #include "../exceptions.h" 5 #include <c++utilities/conversion/binaryconversion.h> 6 #include <c++utilities/io/binaryreader.h> 25 void OggPage::parseHeader(istream &stream, uint64 startOffset, int32 maxSize)
28 stream.seekg(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(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);
92 segmentLength += (segmentTableSize = (value = stream.get()));
96 if (i > 26 && segmentTableIndex < segmentTableSize) {
98 segmentLength += value;
102 crc = (crc << 8) ^ BinaryReader::crc32Table[((crc >> 24) & 0xFF) ^ value];
111 void OggPage::updateChecksum(iostream &stream, uint64 startOffset)
114 LE::getBytes(computeChecksum(stream, startOffset), buff);
115 stream.seekp(startOffset + 22);
116 stream.write(buff,
sizeof(buff));
123 uint32 OggPage::makeSegmentSizeDenotation(ostream &stream, uint32 size)
125 uint32 bytesWritten = 1;
126 while (size >= 0xff) {
Contains utility classes helping to read and write streams.