From 975080658c7d2fd62e8589da210bb5b8238602c0 Mon Sep 17 00:00:00 2001 From: nareix Date: Wed, 13 Jul 2016 15:59:11 +0800 Subject: [PATCH] mp4: bugfix write lastpkt --- format/mp4/muxer.go | 25 ++++++++++++++++--------- format/mp4/stream.go | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/format/mp4/muxer.go b/format/mp4/muxer.go index 0dbfa2c..17e8ff3 100644 --- a/format/mp4/muxer.go +++ b/format/mp4/muxer.go @@ -169,22 +169,20 @@ func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) { func (self *Muxer) WritePacket(pkt av.Packet) (err error) { stream := self.streams[pkt.Idx] - if err = stream.writePacket(pkt); err != nil { - return + if stream.lastpkt != nil { + if err = stream.writePacket(*stream.lastpkt, pkt.Time-stream.lastpkt.Time); err != nil { + return + } } + stream.lastpkt = &pkt return } -func (self *Stream) writePacket(pkt av.Packet) (err error) { - if self.lasttime == 0 { - self.lasttime = pkt.Time - } - rawdur := pkt.Time - self.lasttime +func (self *Stream) writePacket(pkt av.Packet, rawdur time.Duration) (err error) { if rawdur < 0 { - err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lasttime) + err = fmt.Errorf("mp4: stream#%d time=%v < lasttime=%v", pkt.Idx, pkt.Time, self.lastpkt.Time) return } - self.lasttime = pkt.Time var filePos int64 var sampleSize int @@ -235,6 +233,15 @@ func (self *Stream) writePacket(pkt av.Packet) (err error) { } func (self *Muxer) WriteTrailer() (err error) { + for _, stream := range self.streams { + if stream.lastpkt != nil { + if err = stream.writePacket(*stream.lastpkt, 0); err != nil { + return + } + stream.lastpkt = nil + } + } + moov := &atom.Movie{} moov.Header = &atom.MovieHeader{ PreferredRate: atom.IntToFixed(1), diff --git a/format/mp4/stream.go b/format/mp4/stream.go index c0c5d97..8d6fe05 100644 --- a/format/mp4/stream.go +++ b/format/mp4/stream.go @@ -14,7 +14,7 @@ type Stream struct { r io.ReadSeeker idx int - lasttime time.Duration + lastpkt *av.Packet timeScale int64 duration int64