Example #1
0
func (r *Reader) parseClusters(elmts *ebml.Element) {
	var err error
	for err == nil {
		var c Cluster
		var e *ebml.Element
		e, err = elmts.Next()
		if err == nil {
			err = e.Unmarshal(&c)
		}
		if err != nil && err.Error() == "Reached payload" {
			r.index.append(seekEntry{time.Millisecond * time.Duration(c.Timecode), e.Offset})
			r.sendCluster(err.(ebml.ReachedPayloadError).Element,
				time.Millisecond*time.Duration(c.Timecode))
			err = nil
		}
		seek := BadTC
		for len(r.seek) != 0 {
			seek = <-r.seek
		}
		if err == io.EOF {
			var eofpkt Packet
			eofpkt.Timecode = BadTC
			r.send(&eofpkt)
			seek = <-r.seek
			if seek != BadTC {
				err = nil
			}
		}
		if seek != BadTC {
			entry := r.index.search(seek)
			elmts.Seek(entry.offset, 0)
			var seekpkt Packet
			seekpkt.Timecode = seek
			r.send(&seekpkt)
		}
		if seek == shutdown {
			err = io.EOF
		}
	}
	close(r.Chan)
}