package pktque import ( "time" ) /* pop push seg seg seg |--------| |---------| |---| 20ms 40ms 5ms ----------------- time --------------------> headtm tailtm */ type tlSeg struct { tm, dur time.Duration } type Timeline struct { segs []tlSeg lasttm time.Duration } func (self *Timeline) Push(tm time.Duration, dur time.Duration) { self.segs = append(self.segs, tlSeg{tm, dur}) } func (self *Timeline) Pop(dur time.Duration) (tm time.Duration) { if len(self.segs) == 0 { return self.lasttm } tm = self.segs[0].tm self.lasttm = tm+dur for dur > 0 && len(self.segs) > 0 { seg := &self.segs[0] sub := dur if seg.dur < sub { sub = seg.dur } seg.dur -= sub dur -= sub seg.tm += sub if seg.dur == 0 { copy(self.segs[0:], self.segs[1:]) self.segs = self.segs[:len(self.segs)-1] } } return }