3 #include "../exceptions.h" 5 #include <c++utilities/io/binaryreader.h> 6 #include <c++utilities/conversion/binaryconversion.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);
85 case 23:
case 24:
case 25:
90 segmentLength += (segmentTableSize = (value = stream.get()));
94 if(i > 26 && segmentTableIndex < segmentTableSize) {
96 segmentLength += value;
100 crc = (crc << 8) ^ BinaryReader::crc32Table[((crc >> 24) & 0xFF) ^ value];
109 void OggPage::updateChecksum(iostream &stream, uint64 startOffset)
112 LE::getBytes(computeChecksum(stream, startOffset), buff);
113 stream.seekp(startOffset + 22);
114 stream.write(buff,
sizeof(buff));
121 uint32 OggPage::makeSegmentSizeDenotation(ostream &stream, uint32 size)
123 uint32 bytesWritten = 1;
124 while(size >= 0xff) {
Contains utility classes helping to read and write streams.