rewrite Track to Stream
This commit is contained in:
parent
a4e262dd22
commit
e01abfd2a6
20
demuxer.go
20
demuxer.go
@ -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))}
|
||||||
|
|
||||||
|
38
muxer.go
38
muxer.go
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user