Skip to content

Commit 74ab994

Browse files
committed
chore: remove code duplication
1 parent 7af2f42 commit 74ab994

1 file changed

Lines changed: 73 additions & 78 deletions

File tree

scanner.go

Lines changed: 73 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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

337332
func (s *Scanner) seekTo(seekID schema.ElementID, n int) (int64, bool) {

0 commit comments

Comments
 (0)