Tag Parser  9.1.2
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
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 
9 namespace TagParser {
10 
12 public:
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  const OggPage &currentPage() const;
27  std::uint64_t currentPageOffset() const;
28  std::vector<OggPage>::size_type currentPageIndex() const;
29  void setPageIndex(std::vector<OggPage>::size_type index);
30  void setSegmentIndex(std::vector<std::uint32_t>::size_type index);
31  std::vector<std::uint32_t>::size_type currentSegmentIndex() const;
32  std::uint64_t currentSegmentOffset() const;
33  std::uint64_t currentCharacterOffset() const;
34  std::uint64_t tellg() const;
35  std::uint32_t currentSegmentSize() const;
36  void setFilter(std::uint32_t streamSerialId);
37  void removeFilter();
38  bool isLastPageFetched() const;
39  void read(char *buffer, std::size_t count);
40  size_t readAll(char *buffer, std::size_t max);
41  void ignore(std::size_t count = 1);
42  bool bytesRemaining(std::size_t atLeast) const;
43  bool resyncAt(std::uint64_t offset);
44 
45  operator bool() const;
46  OggIterator &operator++();
47  OggIterator operator++(int);
48  OggIterator &operator--();
49  OggIterator operator--(int);
50 
51 private:
52  bool fetchNextPage();
53  bool matchesFilter(const OggPage &page);
54 
55  std::istream *m_stream;
56  std::uint64_t m_startOffset;
57  std::uint64_t m_streamSize;
58  std::vector<OggPage> m_pages;
59  std::vector<OggPage>::size_type m_page;
60  std::vector<std::uint32_t>::size_type m_segment;
61  std::uint64_t m_offset;
62  std::uint32_t m_bytesRead;
63  bool m_hasIdFilter;
64  std::uint32_t m_idFilter;
65 };
66 
70 inline OggIterator::OggIterator(std::istream &stream, std::uint64_t startOffset, std::uint64_t streamSize)
71  : m_stream(&stream)
72  , m_startOffset(startOffset)
73  , m_streamSize(streamSize)
74  , m_page(0)
75  , m_segment(0)
76  , m_offset(0)
77  , m_bytesRead(0)
78  , m_hasIdFilter(false)
79  , m_idFilter(0)
80 {
81 }
82 
88 inline std::istream &OggIterator::stream()
89 {
90  return *m_stream;
91 }
92 
98 inline void OggIterator::setStream(std::istream &stream)
99 {
100  m_stream = &stream;
101 }
102 
106 inline std::uint64_t OggIterator::startOffset() const
107 {
108  return m_startOffset;
109 }
110 
114 inline std::uint64_t OggIterator::streamSize() const
115 {
116  return m_streamSize;
117 }
118 
122 inline const std::vector<OggPage> &OggIterator::pages() const
123 {
124  return m_pages;
125 }
126 
131 inline const OggPage &OggIterator::currentPage() const
132 {
133  return m_pages[m_page];
134 }
135 
140 inline std::uint64_t OggIterator::currentPageOffset() const
141 {
142  return m_pages[m_page].startOffset();
143 }
144 
155 inline OggIterator::operator bool() const
156 {
157  return m_page < m_pages.size() && m_segment < m_pages[m_page].segmentSizes().size();
158 }
159 
163 inline std::vector<OggPage>::size_type OggIterator::currentPageIndex() const
164 {
165  return m_page;
166 }
167 
172 inline void OggIterator::setPageIndex(std::vector<OggPage>::size_type index)
173 {
174  const OggPage &page = m_pages[m_page = index];
175  m_segment = 0;
176  m_offset = page.startOffset() + page.headerSize();
177 }
178 
184 inline void OggIterator::setSegmentIndex(std::vector<std::uint32_t>::size_type index)
185 {
186  const OggPage &page = m_pages[m_page];
187  m_offset = page.dataOffset(m_segment = index);
188 }
189 
193 inline std::vector<std::uint32_t>::size_type OggIterator::currentSegmentIndex() const
194 {
195  return m_segment;
196 }
197 
202 inline std::uint64_t OggIterator::currentSegmentOffset() const
203 {
204  return m_offset;
205 }
206 
211 inline std::uint64_t OggIterator::currentCharacterOffset() const
212 {
213  return m_offset + m_bytesRead;
214 }
215 
219 inline std::uint64_t OggIterator::tellg() const
220 {
221  return currentCharacterOffset();
222 }
223 
229 inline std::uint32_t OggIterator::currentSegmentSize() const
230 {
231  return m_pages[m_page].segmentSizes()[m_segment];
232 }
233 
242 inline void OggIterator::setFilter(std::uint32_t streamSerialId)
243 {
244  m_hasIdFilter = true;
245  m_idFilter = streamSerialId;
246 }
247 
253 {
254  m_hasIdFilter = false;
255 }
256 
261 {
262  return (m_pages.empty() ? m_startOffset : m_pages.back().startOffset() + m_pages.back().totalSize()) >= m_streamSize;
263 }
264 
268 inline bool OggIterator::bytesRemaining(size_t atLeast) const
269 {
270  return *this && currentCharacterOffset() + atLeast <= streamSize();
271 }
272 
277 {
278  nextSegment();
279  return *this;
280 }
281 
286 {
287  OggIterator tmp = *this;
288  nextSegment();
289  return tmp;
290 }
291 
296 {
297  previousSegment();
298  return *this;
299 }
300 
305 {
306  OggIterator tmp = *this;
307  previousSegment();
308  return tmp;
309 }
310 
314 inline bool OggIterator::matchesFilter(const OggPage &page)
315 {
316  return !m_hasIdFilter || m_idFilter == page.streamSerialNumber();
317 }
318 
319 } // namespace TagParser
320 
321 #endif // TAG_PARSER_OGGITERATOR_H
TagParser::OggIterator::setPageIndex
void setPageIndex(std::vector< OggPage >::size_type index)
Sets the current page index.
Definition: oggiterator.h:172
TagParser::OggPage::streamSerialNumber
std::uint32_t streamSerialNumber() const
Returns the stream serial number.
Definition: oggpage.h:155
TagParser::OggIterator
The OggIterator class helps iterating through all segments of an OGG bitstream.
Definition: oggiterator.h:11
TagParser::OggIterator::currentSegmentOffset
std::uint64_t currentSegmentOffset() const
Returns the start offset of the current segment in the input stream if the iterator is valid; otherwi...
Definition: oggiterator.h:202
TagParser::OggIterator::operator++
OggIterator & operator++()
Increments the current position by one segment if the iterator is valid; otherwise nothing happens.
Definition: oggiterator.h:276
TagParser::OggIterator::streamSize
std::uint64_t streamSize() const
Returns the stream size (which has been specified when constructing the iterator).
Definition: oggiterator.h:114
TagParser::OggIterator::isLastPageFetched
bool isLastPageFetched() const
Returns whether the last page has already been fetched.
Definition: oggiterator.h:260
TagParser
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TagParser::OggIterator::currentPageIndex
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...
Definition: oggiterator.h:163
TagParser::OggIterator::operator--
OggIterator & operator--()
Decrements the current position by one segment if the iterator is valid; otherwise nothing happens.
Definition: oggiterator.h:295
TagParser::OggIterator::removeFilter
void removeFilter()
Removes a previously set filter.
Definition: oggiterator.h:252
TagParser::OggIterator::setFilter
void setFilter(std::uint32_t streamSerialId)
Allows to filter pages by the specified streamSerialId.
Definition: oggiterator.h:242
TagParser::OggPage::startOffset
std::uint64_t startOffset() const
Returns the start offset of the page.
Definition: oggpage.h:83
TagParser::OggPage::headerSize
std::uint32_t headerSize() const
Returns the header size in byte.
Definition: oggpage.h:219
TagParser::OggPage::dataOffset
std::uint64_t dataOffset(std::uint8_t segmentIndex=0) const
Returns the data offset of the segment with the specified segmentIndex.
Definition: oggpage.h:248
TagParser::OggPage
The OggPage class is used to parse OGG pages.
Definition: oggpage.h:13
TagParser::OggIterator::currentPageOffset
std::uint64_t currentPageOffset() const
Returns the start offset of the current OGG page.
Definition: oggiterator.h:140
TagParser::OggIterator::stream
std::istream & stream()
Returns the stream.
Definition: oggiterator.h:88
oggpage.h
TagParser::OggIterator::previousSegment
void previousSegment()
Decreases the current position by one segment.
Definition: oggiterator.cpp:113
TagParser::OggIterator::bytesRemaining
bool bytesRemaining(std::size_t atLeast) const
Returns whether there are atLeast bytes remaining.
Definition: oggiterator.h:268
TagParser::OggIterator::currentCharacterOffset
std::uint64_t currentCharacterOffset() const
Returns the offset of the current character in the input stream if the iterator is valid; otherwise a...
Definition: oggiterator.h:211
TagParser::OggIterator::setSegmentIndex
void setSegmentIndex(std::vector< std::uint32_t >::size_type index)
Sets the current segment index.
Definition: oggiterator.h:184
TagParser::OggIterator::setStream
void setStream(std::istream &stream)
Sets the stream.
Definition: oggiterator.h:98
TagParser::OggIterator::currentPage
const OggPage & currentPage() const
Returns the current OGG page.
Definition: oggiterator.h:131
TAG_PARSER_EXPORT
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
TagParser::OggIterator::currentSegmentIndex
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...
Definition: oggiterator.h:193
TagParser::OggIterator::pages
const std::vector< OggPage > & pages() const
Returns a vector of containing the OGG pages that have been fetched yet.
Definition: oggiterator.h:122
TagParser::OggIterator::startOffset
std::uint64_t startOffset() const
Returns the start offset (which has been specified when constructing the iterator).
Definition: oggiterator.h:106
TagParser::OggIterator::currentSegmentSize
std::uint32_t currentSegmentSize() const
Returns the size of the current segment.
Definition: oggiterator.h:229
TagParser::OggIterator::nextSegment
void nextSegment()
Increases the current position by one segment.
Definition: oggiterator.cpp:81
TagParser::OggIterator::tellg
std::uint64_t tellg() const
Same as currentCharacterOffset(); only provided for compliance with std::istream.
Definition: oggiterator.h:219
TagParser::OggIterator::OggIterator
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:70