Tag Parser 12.3.1
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
Loading...
Searching...
No Matches
oggiterator.h
Go to the documentation of this file.
1#ifndef TAG_PARSER_OGGITERATOR_H
2#define TAG_PARSER_OGGITERATOR_H
3
4#include "./oggpage.h"
5
6#include <iosfwd>
7#include <vector>
8
9namespace TagParser {
10
11class TAG_PARSER_EXPORT OggIterator {
12public:
13 OggIterator(std::istream &stream, std::uint64_t startOffset, std::uint64_t streamSize);
14
15 void clear(std::istream &stream, std::uint64_t startOffset, std::uint64_t streamSize);
16 std::istream &stream();
17 void setStream(std::istream &stream);
18 std::uint64_t startOffset() const;
19 std::uint64_t streamSize() const;
20 void reset();
21 void nextPage();
22 void nextSegment();
23 void previousPage();
24 void previousSegment();
25 const std::vector<OggPage> &pages() const;
26 std::vector<OggPage> &pages();
27 const OggPage &currentPage() const;
28 std::uint64_t currentPageOffset() const;
29 std::vector<OggPage>::size_type currentPageIndex() const;
30 void setPageIndex(std::vector<OggPage>::size_type index);
31 void setSegmentIndex(std::vector<std::uint32_t>::size_type index);
32 std::vector<std::uint32_t>::size_type currentSegmentIndex() const;
33 std::uint64_t currentSegmentOffset() const;
34 std::uint64_t currentCharacterOffset() const;
35 std::uint64_t tellg() const;
36 std::uint32_t currentSegmentSize() const;
37 std::uint64_t remainingBytesInCurrentSegment() const;
38 std::uint64_t bytesReadFromCurrentSegment() const;
39 void setFilter(std::uint32_t streamSerialId);
40 void removeFilter();
41 bool isLastPageFetched() const;
42 void read(char *buffer, std::size_t count);
43 std::size_t readAll(char *buffer, std::size_t max);
44 void ignore(std::size_t count = 1);
45 bool bytesRemaining(std::size_t atLeast) const;
46 bool resyncAt(std::uint64_t offset);
47
48 operator bool() const;
49 OggIterator &operator++();
50 OggIterator operator++(int);
51 OggIterator &operator--();
52 OggIterator operator--(int);
53
54private:
55 bool fetchNextPage();
56 bool matchesFilter(const OggPage &page);
57
58 std::istream *m_stream;
59 std::uint64_t m_startOffset;
60 std::uint64_t m_streamSize;
61 std::vector<OggPage> m_pages;
62 std::vector<OggPage>::size_type m_page;
63 std::vector<std::uint32_t>::size_type m_segment;
64 std::uint64_t m_offset;
65 std::uint64_t m_bytesRead;
66 bool m_hasIdFilter;
67 std::uint32_t m_idFilter;
68};
69
73inline OggIterator::OggIterator(std::istream &stream, std::uint64_t startOffset, std::uint64_t streamSize)
74 : m_stream(&stream)
75 , m_startOffset(startOffset)
76 , m_streamSize(streamSize)
77 , m_page(0)
78 , m_segment(0)
79 , m_offset(0)
80 , m_bytesRead(0)
81 , m_hasIdFilter(false)
82 , m_idFilter(0)
83{
84}
85
91inline std::istream &OggIterator::stream()
92{
93 return *m_stream;
94}
95
101inline void OggIterator::setStream(std::istream &stream)
102{
103 m_stream = &stream;
104}
105
109inline std::uint64_t OggIterator::startOffset() const
110{
111 return m_startOffset;
112}
113
117inline std::uint64_t OggIterator::streamSize() const
118{
119 return m_streamSize;
120}
121
125inline const std::vector<OggPage> &OggIterator::pages() const
126{
127 return m_pages;
128}
129
133inline std::vector<OggPage> &OggIterator::pages()
134{
135 return m_pages;
136}
137
143{
144 return m_pages[m_page];
145}
146
151inline std::uint64_t OggIterator::currentPageOffset() const
152{
153 return m_pages[m_page].startOffset();
154}
155
166inline OggIterator::operator bool() const
167{
168 return m_page < m_pages.size() && m_segment < m_pages[m_page].segmentSizes().size();
169}
170
174inline std::vector<OggPage>::size_type OggIterator::currentPageIndex() const
175{
176 return m_page;
177}
178
183inline void OggIterator::setPageIndex(std::vector<OggPage>::size_type index)
184{
185 const OggPage &page = m_pages[m_page = index];
186 m_segment = 0;
187 m_offset = page.startOffset() + page.headerSize();
188}
189
195inline void OggIterator::setSegmentIndex(std::vector<std::uint32_t>::size_type index)
196{
197 const OggPage &page = m_pages[m_page];
198 m_offset = page.dataOffset(m_segment = index);
199}
200
204inline std::vector<std::uint32_t>::size_type OggIterator::currentSegmentIndex() const
205{
206 return m_segment;
207}
208
213inline std::uint64_t OggIterator::currentSegmentOffset() const
214{
215 return m_offset;
216}
217
222inline std::uint64_t OggIterator::currentCharacterOffset() const
223{
224 return m_offset + m_bytesRead;
225}
226
230inline std::uint64_t OggIterator::tellg() const
231{
232 return currentCharacterOffset();
233}
234
240inline std::uint32_t OggIterator::currentSegmentSize() const
241{
242 return m_pages[m_page].segmentSizes()[m_segment];
243}
244
249{
250 return currentSegmentSize() - m_bytesRead;
251}
252
257{
258 return m_bytesRead;
259}
260
269inline void OggIterator::setFilter(std::uint32_t streamSerialId)
270{
271 m_hasIdFilter = true;
272 m_idFilter = streamSerialId;
273}
274
280{
281 m_hasIdFilter = false;
282}
283
288{
289 return (m_pages.empty() ? m_startOffset : m_pages.back().startOffset() + m_pages.back().totalSize()) >= m_streamSize;
290}
291
296inline bool OggIterator::bytesRemaining(size_t atLeast) const
297{
298 return *this && currentCharacterOffset() + atLeast <= streamSize();
299}
300
305{
306 nextSegment();
307 return *this;
308}
309
314{
315 OggIterator tmp = *this;
316 nextSegment();
317 return tmp;
318}
319
324{
326 return *this;
327}
328
333{
334 OggIterator tmp = *this;
336 return tmp;
337}
338
342inline bool OggIterator::matchesFilter(const OggPage &page)
343{
344 return !m_hasIdFilter || m_idFilter == page.streamSerialNumber();
345}
346
347} // namespace TagParser
348
349#endif // TAG_PARSER_OGGITERATOR_H
The OggIterator class helps iterating through all segments of an Ogg bitstream.
void setSegmentIndex(std::vector< std::uint32_t >::size_type index)
Sets the current segment index.
std::uint64_t currentCharacterOffset() const
Returns the offset of the current character in the input stream if the iterator is valid; otherwise a...
bool bytesRemaining(std::size_t atLeast) const
Returns whether there are atLeast bytes remaining.
std::uint64_t remainingBytesInCurrentSegment() const
Returns the number of bytes left to read in the current segment.
void removeFilter()
Removes a previously set filter.
std::uint64_t tellg() const
Same as currentCharacterOffset(); only provided for compliance with std::istream.
OggIterator(std::istream &stream, std::uint64_t startOffset, std::uint64_t streamSize)
Constructs a new iterator for the specified stream of streamSize bytes at the specified startOffset.
Definition oggiterator.h:73
void setStream(std::istream &stream)
Sets the stream.
OggIterator & operator++()
Increments the current position by one segment if the iterator is valid; otherwise nothing happens.
std::vector< std::uint32_t >::size_type currentSegmentIndex() const
Returns the index of the current segment (in the current page) if the iterator is valid; otherwise an...
OggIterator & operator--()
Decrements the current position by one segment if the iterator is valid; otherwise nothing happens.
std::uint64_t currentSegmentOffset() const
Returns the start offset of the current segment in the input stream if the iterator is valid; otherwi...
std::uint64_t currentPageOffset() const
Returns the start offset of the current Ogg page.
const OggPage & currentPage() const
Returns the current Ogg page.
const std::vector< OggPage > & pages() const
Returns a vector of containing the Ogg pages that have been fetched yet.
std::istream & stream()
Returns the stream.
Definition oggiterator.h:91
std::uint64_t startOffset() const
Returns the start offset (which has been specified when constructing the iterator).
std::uint64_t bytesReadFromCurrentSegment() const
Returns the number of bytes read from the current segment.
void setPageIndex(std::vector< OggPage >::size_type index)
Sets the current page index.
std::vector< OggPage >::size_type currentPageIndex() const
Returns the index of the current page if the iterator is valid; otherwise an undefined index is retur...
std::uint32_t currentSegmentSize() const
Returns the size of the current segment.
void nextSegment()
Increases the current position by one segment.
void setFilter(std::uint32_t streamSerialId)
Allows to filter pages by the specified streamSerialId.
void previousSegment()
Decreases the current position by one segment.
bool isLastPageFetched() const
Returns whether the last page has already been fetched.
std::uint64_t streamSize() const
Returns the stream size (which has been specified when constructing the iterator).
The OggPage class is used to parse Ogg pages.
std::uint64_t dataOffset(std::vector< std::uint32_t >::size_type segmentIndex=0) const
Returns the data offset of the segment with the specified segmentIndex.
Definition oggpage.h:259
std::uint32_t streamSerialNumber() const
Returns the stream serial number.
Definition oggpage.h:166
std::uint64_t startOffset() const
Returns the start offset of the page.
Definition oggpage.h:86
std::uint32_t headerSize() const
Returns the header size in byte.
Definition oggpage.h:230
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
Definition global.h:14
Contains all classes and functions of the TagInfo library.
Definition aaccodebook.h:10