timeline: handle overlap

This commit is contained in:
nareix 2016-06-23 19:01:32 +08:00
parent e38521bc67
commit 0b14c8403c

View File

@ -20,21 +20,26 @@ type tlSeg struct {
type Timeline struct { type Timeline struct {
segs []tlSeg segs []tlSeg
lasttm time.Duration headtm time.Duration
} }
func (self *Timeline) Push(tm time.Duration, dur time.Duration) { func (self *Timeline) Push(tm time.Duration, dur time.Duration) {
if len(self.segs) > 0 {
tail := self.segs[len(self.segs)-1]
diff := tm-(tail.tm+tail.dur)
if diff < 0 {
tm -= diff
}
}
self.segs = append(self.segs, tlSeg{tm, dur}) self.segs = append(self.segs, tlSeg{tm, dur})
} }
func (self *Timeline) Pop(dur time.Duration) (tm time.Duration) { func (self *Timeline) Pop(dur time.Duration) (tm time.Duration) {
if len(self.segs) == 0 { if len(self.segs) == 0 {
return self.lasttm return self.headtm
} }
tm = self.segs[0].tm tm = self.segs[0].tm
self.lasttm = tm+dur
for dur > 0 && len(self.segs) > 0 { for dur > 0 && len(self.segs) > 0 {
seg := &self.segs[0] seg := &self.segs[0]
sub := dur sub := dur
@ -44,6 +49,7 @@ func (self *Timeline) Pop(dur time.Duration) (tm time.Duration) {
seg.dur -= sub seg.dur -= sub
dur -= sub dur -= sub
seg.tm += sub seg.tm += sub
self.headtm += sub
if seg.dur == 0 { if seg.dur == 0 {
copy(self.segs[0:], self.segs[1:]) copy(self.segs[0:], self.segs[1:])
self.segs = self.segs[:len(self.segs)-1] self.segs = self.segs[:len(self.segs)-1]