@@ -32,7 +32,7 @@ type Scanner struct {
3232
3333 offset int64
3434 cluster Cluster
35- firstCluster * ebml. Element
35+ firstCluster * Cluster
3636 err error
3737}
3838
@@ -108,35 +108,37 @@ func (s *Scanner) Next() bool {
108108 if s .err != nil {
109109 return false
110110 }
111+ if s .firstCluster != nil {
112+ s .cluster = * s .firstCluster
113+ s .firstCluster = nil
114+ return true
115+ }
116+ return s .next ()
117+ }
118+
119+ func (s * Scanner ) next () bool {
111120 d := s .decoder
112121 segmentEl := s .segmentEl
113122 var offset int64 = 0
114123 for {
115- var el ebml.Element
116- if s .firstCluster != nil {
117- el = * s .firstCluster
118- s .firstCluster = nil
119- } else {
120- nel , n , err := d .NextOf (segmentEl , offset )
121- if segmentEl .DataSize != - 1 {
122- offset += int64 (n )
123- }
124- if errors .Is (err , ebml .ErrInvalidVINTLength ) {
125- _ = d .SkipByte ()
126- offset += 1
127- continue
128- } else if errors .Is (err , ebml .ErrElementOverflow ) {
129- // detect element overflow early to pretend the element is smaller
130- if segmentEl .DataSize < offset + nel .DataSize {
131- nel .DataSize = segmentEl .DataSize - offset
132- }
133- } else if err == io .EOF {
134- return false
135- } else if err != nil {
136- s .err = err
137- return false
124+ el , n , err := d .NextOf (segmentEl , offset )
125+ if segmentEl .DataSize != - 1 {
126+ offset += int64 (n )
127+ }
128+ if errors .Is (err , ebml .ErrInvalidVINTLength ) {
129+ _ = d .SkipByte ()
130+ offset += 1
131+ continue
132+ } else if errors .Is (err , ebml .ErrElementOverflow ) {
133+ // detect element overflow early to pretend the element is smaller
134+ if segmentEl .DataSize < offset + el .DataSize {
135+ el .DataSize = segmentEl .DataSize - offset
138136 }
139- el = nel
137+ } else if err == io .EOF {
138+ return false
139+ } else if err != nil {
140+ s .err = err
141+ return false
140142 }
141143 if segmentEl .DataSize != - 1 {
142144 offset += el .DataSize
@@ -147,6 +149,47 @@ func (s *Scanner) Next() bool {
147149 s .err = fmt .Errorf ("matroska: could not skip %v: %w" , el .ID , err )
148150 return false
149151 }
152+ case IDChapters : // TODO: populate chapters
153+ if err := s .updateFSeek (el ); err != nil && ! errors .Is (err , errors .ErrUnsupported ) {
154+ s .err = err
155+ return false
156+ }
157+ var chapters Chapters
158+ if err := s .decoder .Decode (el , & chapters ); err != nil {
159+ s .err = fmt .Errorf ("matroska: could not decode %v: %w" , el .ID , err )
160+ return false
161+ }
162+ case IDCues : // TODO: populate cues
163+ if err := s .updateFSeek (el ); err != nil && ! errors .Is (err , errors .ErrUnsupported ) {
164+ s .err = err
165+ return false
166+ }
167+ var cues Cues
168+ if err := s .decoder .Decode (el , & cues ); err != nil {
169+ s .err = fmt .Errorf ("matroska: could not decode %v: %w" , el .ID , err )
170+ return false
171+ }
172+ case IDAttachments : // TODO: populate attachments
173+ if err := s .updateFSeek (el ); err != nil && ! errors .Is (err , errors .ErrUnsupported ) {
174+ s .err = err
175+ return false
176+ }
177+ var attachments Attachments
178+ if err := s .decoder .Decode (el , & attachments ); err != nil {
179+ s .err = fmt .Errorf ("matroska: could not decode %v: %w" , el .ID , err )
180+ return false
181+ }
182+ case IDTags : // TODO: populate tags
183+ if err := s .updateFSeek (el ); err != nil && ! errors .Is (err , errors .ErrUnsupported ) {
184+ s .err = err
185+ return false
186+ }
187+ var tags Tags
188+ if err := s .decoder .Decode (el , & tags ); err != nil {
189+ s .err = fmt .Errorf ("matroska: could not decode %v: %w" , el .ID , err )
190+ return false
191+ }
192+
150193 case IDCluster :
151194 var cl Cluster
152195 if err := d .Decode (el , & cl ); err != nil {
@@ -278,60 +321,12 @@ segment:
278321 }
279322 }
280323
281- // find cluster element
282- cluster:
283- for {
284- el , n , err := s .decoder .NextOf (s .segmentEl , offset )
285- if s .segmentEl .DataSize != - 1 {
286- offset += int64 (n )
287- }
288- if errors .Is (err , ebml .ErrElementOverflow ) {
289- // detect element overflow early to pretend the element is smaller
290- if s .segmentEl .DataSize < s .offset + el .DataSize {
291- el .DataSize = s .segmentEl .DataSize - s .offset
292- }
293- } else if err != nil {
294- return fmt .Errorf ("matroska: %w" , err )
295- }
296- if err := s .updateFSeek (el ); err != nil && ! errors .Is (err , errors .ErrUnsupported ) {
297- return err
298- }
299- if s .segmentEl .DataSize != - 1 {
300- offset += el .DataSize
301- }
302- switch el .ID {
303- default :
304- if err := s .decoder .Skip (el ); err != nil {
305- return fmt .Errorf ("matroska: could not skip %v: %w" , el .ID , err )
306- }
307- case IDChapters :
308- var chapters Chapters
309- if err := s .decoder .Decode (el , & chapters ); err != nil {
310- return fmt .Errorf ("matroska: could not decode %v: %w" , el .ID , err )
311- }
312- case IDCues :
313- var cues Cues
314- if err := s .decoder .Decode (el , & cues ); err != nil {
315- return fmt .Errorf ("matroska: could not decode %v: %w" , el .ID , err )
316- }
317- case IDAttachments :
318- var attachments Attachments
319- if err := s .decoder .Decode (el , & attachments ); err != nil {
320- return fmt .Errorf ("matroska: could not decode %v: %w" , el .ID , err )
321- }
322- case IDTags :
323- var tags Tags
324- if err := s .decoder .Decode (el , & tags ); err != nil {
325- return fmt .Errorf ("matroska: could not decode %v: %w" , el .ID , err )
326- }
327-
328- case IDCluster :
329- s .firstCluster = & el
330- break cluster // Done here
331- }
332- }
333324 s .offset = offset
334- return nil
325+ // find cluster element
326+ _ = s .next ()
327+ cluster := s .Cluster ()
328+ s .firstCluster = & cluster
329+ return s .err
335330}
336331
337332func (s * Scanner ) seekTo (seekID schema.ElementID , n int ) (int64 , bool ) {
0 commit comments