rewrite Track to Stream

This commit is contained in:
nareix 2016-04-21 19:21:52 +08:00
parent a4e262dd22
commit e01abfd2a6
3 changed files with 30 additions and 30 deletions

View File

@ -12,9 +12,9 @@ type Demuxer struct {
pat PAT pat PAT
pmt *PMT pmt *PMT
Tracks []*Track Tracks []*Stream
TrackH264 *Track TrackH264 *Stream
TrackAAC *Track TrackAAC *Stream
} }
// ParsePacket() (pid uint, counter int, isStart bool, pts, dst int64, isKeyFrame bool) // ParsePacket() (pid uint, counter int, isStart bool, pts, dst int64, isKeyFrame bool)
@ -25,7 +25,7 @@ func (self *Demuxer) TimeScale() int64 {
} }
func (self *Demuxer) ReadHeader() (err error) { func (self *Demuxer) ReadHeader() (err error) {
self.Tracks = []*Track{} self.Tracks = []*Stream{}
self.TrackH264 = nil self.TrackH264 = nil
self.TrackAAC = nil self.TrackAAC = nil
@ -50,7 +50,7 @@ func (self *Demuxer) ReadHeader() (err error) {
return return
} }
func (self *Demuxer) ReadSample() (stream *Track, err error) { func (self *Demuxer) ReadSample() (stream *Stream, err error) {
if len(self.Tracks) == 0 { if len(self.Tracks) == 0 {
err = fmt.Errorf("no track") err = fmt.Errorf("no track")
return return
@ -93,7 +93,7 @@ func (self *Demuxer) readPacket() (err error) {
return return
} }
for _, info := range self.pmt.ElementaryStreamInfos { for _, info := range self.pmt.ElementaryStreamInfos {
stream := &Track{} stream := &Stream{}
stream.demuxer = self stream.demuxer = self
stream.pid = info.ElementaryPID stream.pid = info.ElementaryPID
@ -125,11 +125,11 @@ func (self *Demuxer) readPacket() (err error) {
return return
} }
func (self *Track) GetMPEG4AudioConfig() aacparser.MPEG4AudioConfig { func (self *Stream) GetMPEG4AudioConfig() aacparser.MPEG4AudioConfig {
return self.mpeg4AudioConfig return self.mpeg4AudioConfig
} }
func (self *Track) ReadSample() (pts int64, dts int64, isKeyFrame bool, data []byte, err error) { func (self *Stream) ReadSample() (pts int64, dts int64, isKeyFrame bool, data []byte, err error) {
for !self.payloadReady { for !self.payloadReady {
if err = self.demuxer.readPacket(); err != nil { if err = self.demuxer.readPacket(); err != nil {
return return
@ -148,7 +148,7 @@ func (self *Track) ReadSample() (pts int64, dts int64, isKeyFrame bool, data []b
return return
} }
func (self *Track) appendPayload() (err error) { func (self *Stream) appendPayload() (err error) {
self.payload = self.buf.Bytes() self.payload = self.buf.Bytes()
if self.Type == AAC { if self.Type == AAC {
@ -168,7 +168,7 @@ func (self *Track) appendPayload() (err error) {
return return
} }
func (self *Track) appendPacket(header TSHeader, payload []byte) (err error) { func (self *Stream) appendPacket(header TSHeader, payload []byte) (err error) {
r := bytes.NewReader(payload) r := bytes.NewReader(payload)
lr := &io.LimitedReader{R: r, N: int64(len(payload))} lr := &io.LimitedReader{R: r, N: int64(len(payload))}

View File

@ -13,12 +13,12 @@ type Muxer struct {
tswPAT *TSWriter tswPAT *TSWriter
tswPMT *TSWriter tswPMT *TSWriter
elemStreams []ElementaryStreamInfo elemStreams []ElementaryStreamInfo
TrackH264 *Track TrackH264 *Stream
Tracks []*Track Tracks []*Stream
} }
func (self *Muxer) newTrack(pid uint, streamId uint) (stream *Track) { func (self *Muxer) newTrack(pid uint, streamId uint) (stream *Stream) {
stream = &Track{ stream = &Stream{
mux: self, mux: self,
tsw: &TSWriter{ tsw: &TSWriter{
PID: pid, PID: pid,
@ -30,7 +30,7 @@ func (self *Muxer) newTrack(pid uint, streamId uint) (stream *Track) {
return return
} }
func (self *Muxer) AddAACTrack() (stream *Track) { func (self *Muxer) AddAACTrack() (stream *Stream) {
self.elemStreams = append( self.elemStreams = append(
self.elemStreams, self.elemStreams,
ElementaryStreamInfo{StreamType: ElementaryStreamTypeAdtsAAC, ElementaryPID: 0x101}, ElementaryStreamInfo{StreamType: ElementaryStreamTypeAdtsAAC, ElementaryPID: 0x101},
@ -42,7 +42,7 @@ func (self *Muxer) AddAACTrack() (stream *Track) {
return return
} }
func (self *Muxer) AddH264Track() (stream *Track) { func (self *Muxer) AddH264Track() (stream *Stream) {
self.elemStreams = append( self.elemStreams = append(
self.elemStreams, self.elemStreams,
ElementaryStreamInfo{StreamType: ElementaryStreamTypeH264, ElementaryPID: 0x100}, ElementaryStreamInfo{StreamType: ElementaryStreamTypeH264, ElementaryPID: 0x100},
@ -93,35 +93,35 @@ func (self *Muxer) WriteHeader() (err error) {
return return
} }
func (self *Track) SetH264PPSAndSPS(pps []byte, sps []byte) { func (self *Stream) SetH264PPSAndSPS(pps []byte, sps []byte) {
self.PPS, self.SPS = pps, sps self.PPS, self.SPS = pps, sps
} }
func (self *Track) SetTimeScale(timeScale int64) { func (self *Stream) SetTimeScale(timeScale int64) {
self.timeScale = timeScale self.timeScale = timeScale
} }
func (self *Track) TimeScale() int64 { func (self *Stream) TimeScale() int64 {
return self.timeScale return self.timeScale
} }
func (self *Track) SetMPEG4AudioConfig(config aacparser.MPEG4AudioConfig) { func (self *Stream) SetMPEG4AudioConfig(config aacparser.MPEG4AudioConfig) {
self.mpeg4AudioConfig = config self.mpeg4AudioConfig = config
} }
func (self *Track) tsToPesTs(ts int64) uint64 { func (self *Stream) tsToPesTs(ts int64) uint64 {
return uint64(ts)*PTS_HZ/uint64(self.timeScale) + PTS_HZ return uint64(ts)*PTS_HZ/uint64(self.timeScale) + PTS_HZ
} }
func (self *Track) tsToPCR(ts int64) uint64 { func (self *Stream) tsToPCR(ts int64) uint64 {
return uint64(ts)*PCR_HZ/uint64(self.timeScale) + PCR_HZ return uint64(ts)*PCR_HZ/uint64(self.timeScale) + PCR_HZ
} }
func (self *Track) tsToTime(ts int64) float64 { func (self *Stream) tsToTime(ts int64) float64 {
return float64(ts) / float64(self.timeScale) return float64(ts) / float64(self.timeScale)
} }
func (self *Track) WriteSample(pts int64, dts int64, isKeyFrame bool, data []byte) (err error) { func (self *Stream) WriteSample(pts int64, dts int64, isKeyFrame bool, data []byte) (err error) {
if false { if false {
fmt.Println("WriteSample", self.Type, self.tsToTime(dts)) fmt.Println("WriteSample", self.Type, self.tsToTime(dts))
} }
@ -180,11 +180,11 @@ func (self *Track) WriteSample(pts int64, dts int64, isKeyFrame bool, data []byt
/* about to remove */ /* about to remove */
func (self *Track) setPCR() { func (self *Stream) setPCR() {
self.tsw.PCR = uint64(self.PTS) * PCR_HZ / uint64(self.timeScale) self.tsw.PCR = uint64(self.PTS) * PCR_HZ / uint64(self.timeScale)
} }
func (self *Track) getPesHeader(dataLength int) (data []byte) { func (self *Stream) getPesHeader(dataLength int) (data []byte) {
if self.PTS == 0 { if self.PTS == 0 {
self.PTS = self.timeScale self.PTS = self.timeScale
} }
@ -197,11 +197,11 @@ func (self *Track) getPesHeader(dataLength int) (data []byte) {
return buf.Bytes() return buf.Bytes()
} }
func (self *Track) incPTS(delta int) { func (self *Stream) incPTS(delta int) {
self.PTS += int64(delta) self.PTS += int64(delta)
} }
func (self *Track) WriteH264NALU(sync bool, duration int, nalu []byte) (err error) { func (self *Stream) WriteH264NALU(sync bool, duration int, nalu []byte) (err error) {
nalus := [][]byte{} nalus := [][]byte{}
if !self.spsHasWritten { if !self.spsHasWritten {
@ -234,7 +234,7 @@ func (self *Track) WriteH264NALU(sync bool, duration int, nalu []byte) (err erro
return return
} }
func (self *Track) WriteADTSAACFrame(duration int, frame []byte) (err error) { func (self *Stream) WriteADTSAACFrame(duration int, frame []byte) (err error) {
if self.dataBuf != nil && self.dataBuf.Len > self.cacheSize { if self.dataBuf != nil && self.dataBuf.Len > self.cacheSize {
self.dataBuf.Prepend(self.getPesHeader(self.dataBuf.Len)) self.dataBuf.Prepend(self.getPesHeader(self.dataBuf.Len))
self.tsw.RandomAccessIndicator = true self.tsw.RandomAccessIndicator = true

View File

@ -5,7 +5,7 @@ import (
"github.com/nareix/codec/aacparser" "github.com/nareix/codec/aacparser"
) )
type Track struct { type Stream struct {
SPS []byte SPS []byte
PPS []byte PPS []byte