timeline: handle overlap
This commit is contained in:
parent
e38521bc67
commit
0b14c8403c
@ -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]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user