3 #include "../exceptions.h" 28 void OggIterator::clear(istream &stream, uint64 startOffset, uint64 streamSize)
31 m_startOffset = startOffset;
32 m_streamSize = streamSize;
42 void OggIterator::reset()
44 for(m_page = m_segment = m_offset = 0; m_page < m_pages.size() || fetchNextPage(); ++m_page) {
45 const OggPage &page = m_pages[m_page];
46 if(!page.
segmentSizes().empty() && matchesFilter(page)) {
59 void OggIterator::nextPage()
61 while(++m_page < m_pages.size() || fetchNextPage()) {
62 const OggPage &page = m_pages[m_page];
63 if(!page.
segmentSizes().empty() && matchesFilter(page)) {
65 m_segment = m_bytesRead = 0;
77 void OggIterator::nextSegment()
79 const OggPage &page = m_pages[m_page];
80 if(matchesFilter(page) && ++m_segment < page.
segmentSizes().size()) {
94 void OggIterator::previousPage()
97 const OggPage &page = m_pages[--m_page];
98 if(matchesFilter(page)) {
109 void OggIterator::previousSegment()
111 const OggPage &page = m_pages[m_page];
112 if(m_segment && matchesFilter(page)) {
130 void OggIterator::read(
char *buffer,
size_t count)
132 size_t bytesRead = 0;
133 while(*
this && count) {
134 const uint32 available = currentSegmentSize() - m_bytesRead;
135 stream().seekg(currentCharacterOffset());
136 if(count <= available) {
137 stream().read(buffer + bytesRead, count);
138 m_bytesRead += count;
141 stream().read(buffer + bytesRead, available);
143 bytesRead += available;
163 size_t OggIterator::readAll(
char *buffer,
size_t max)
165 size_t bytesRead = 0;
166 while(*
this && max) {
167 const uint32 available = currentSegmentSize() - m_bytesRead;
168 stream().seekg(currentCharacterOffset());
169 if(max <= available) {
170 stream().read(buffer + bytesRead, max);
172 return bytesRead + max;
174 stream().read(buffer + bytesRead, available);
176 bytesRead += available;
193 void OggIterator::ignore(
size_t count)
195 uint32 available = currentSegmentSize() - m_bytesRead;
197 available = currentSegmentSize() - m_bytesRead;
198 if(count <= available) {
199 m_bytesRead += count;
219 bool OggIterator::fetchNextPage()
221 if(m_page == m_pages.size()) {
222 m_offset = m_pages.empty() ? m_startOffset : m_pages.back().startOffset() + m_pages.back().totalSize();
223 if(m_offset < m_streamSize) {
224 m_pages.emplace_back(*m_stream, m_offset, static_cast<int32>(m_streamSize - m_offset));
uint64 dataOffset(byte segmentIndex=0) const
Returns the data offset of the segment with the specified segmentIndex.
uint32 headerSize() const
Returns the header size in byte.
The OggPage class is used to parse OGG pages.
uint64 startOffset() const
Returns the start offset of the page.
const std::vector< uint32 > & segmentSizes() const
Returns the sizes of the segments of the page in byte.