add TSMuxer.WriteTo func
This commit is contained in:
parent
d067b228ec
commit
6164f70ade
34
muxer.go
34
muxer.go
@ -17,6 +17,7 @@ type Track struct {
|
|||||||
spsHasWritten bool
|
spsHasWritten bool
|
||||||
pcrHasWritten bool
|
pcrHasWritten bool
|
||||||
|
|
||||||
|
mux *Muxer
|
||||||
streamId uint
|
streamId uint
|
||||||
tsw *TSWriter
|
tsw *TSWriter
|
||||||
dataBuf *iovec
|
dataBuf *iovec
|
||||||
@ -74,7 +75,7 @@ func (self *Track) WriteH264NALU(sync bool, duration int, nalu []byte) (err erro
|
|||||||
data.Prepend(self.getPesHeader(0))
|
data.Prepend(self.getPesHeader(0))
|
||||||
self.tsw.RandomAccessIndicator = sync
|
self.tsw.RandomAccessIndicator = sync
|
||||||
self.setPCR()
|
self.setPCR()
|
||||||
if err = self.tsw.WriteIovec(data); err != nil {
|
if err = self.tsw.WriteIovecTo(self.mux.W, data); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +88,7 @@ func (self *Track) WriteADTSAACFrame(duration int, frame []byte) (err error) {
|
|||||||
self.dataBuf.Prepend(self.getPesHeader(self.dataBuf.Len))
|
self.dataBuf.Prepend(self.getPesHeader(self.dataBuf.Len))
|
||||||
self.tsw.RandomAccessIndicator = true
|
self.tsw.RandomAccessIndicator = true
|
||||||
self.setPCR()
|
self.setPCR()
|
||||||
if err = self.tsw.WriteIovec(self.dataBuf); err != nil {
|
if err = self.tsw.WriteIovecTo(self.mux.W, self.dataBuf); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.dataBuf = nil
|
self.dataBuf = nil
|
||||||
@ -100,10 +101,10 @@ func (self *Track) WriteADTSAACFrame(duration int, frame []byte) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTrack(w io.Writer, pid uint, streamId uint) (track *Track) {
|
func newTrack(mux *Muxer, pid uint, streamId uint) (track *Track) {
|
||||||
track = &Track{
|
track = &Track{
|
||||||
|
mux: mux,
|
||||||
tsw: &TSWriter{
|
tsw: &TSWriter{
|
||||||
W: w,
|
|
||||||
PID: pid,
|
PID: pid,
|
||||||
DiscontinuityIndicator: true,
|
DiscontinuityIndicator: true,
|
||||||
},
|
},
|
||||||
@ -118,6 +119,8 @@ type Muxer struct {
|
|||||||
tswPAT *TSWriter
|
tswPAT *TSWriter
|
||||||
tswPMT *TSWriter
|
tswPMT *TSWriter
|
||||||
elemStreams []ElementaryStreamInfo
|
elemStreams []ElementaryStreamInfo
|
||||||
|
TrackH264 *Track
|
||||||
|
Tracks []*Track
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Muxer) AddAACTrack() (track *Track) {
|
func (self *Muxer) AddAACTrack() (track *Track) {
|
||||||
@ -125,9 +128,10 @@ func (self *Muxer) AddAACTrack() (track *Track) {
|
|||||||
self.elemStreams,
|
self.elemStreams,
|
||||||
ElementaryStreamInfo{StreamType: ElementaryStreamTypeAdtsAAC, ElementaryPID: 0x101},
|
ElementaryStreamInfo{StreamType: ElementaryStreamTypeAdtsAAC, ElementaryPID: 0x101},
|
||||||
)
|
)
|
||||||
track = newTrack(self.W, 0x101, StreamIdAAC)
|
track = newTrack(self, 0x101, StreamIdAAC)
|
||||||
track.pcrHasWritten = true
|
track.pcrHasWritten = true
|
||||||
track.cacheSize = 3000
|
track.cacheSize = 3000
|
||||||
|
self.Tracks = append(self.Tracks, track)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,7 +140,9 @@ func (self *Muxer) AddH264Track() (track *Track) {
|
|||||||
self.elemStreams,
|
self.elemStreams,
|
||||||
ElementaryStreamInfo{StreamType: ElementaryStreamTypeH264, ElementaryPID: 0x100},
|
ElementaryStreamInfo{StreamType: ElementaryStreamTypeH264, ElementaryPID: 0x100},
|
||||||
)
|
)
|
||||||
track = newTrack(self.W, 0x100, StreamIdH264)
|
track = newTrack(self, 0x100, StreamIdH264)
|
||||||
|
self.TrackH264 = track
|
||||||
|
self.Tracks = append(self.Tracks, track)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,21 +163,25 @@ func (self *Muxer) WriteHeader() (err error) {
|
|||||||
WritePMT(bufPMT, pmt)
|
WritePMT(bufPMT, pmt)
|
||||||
|
|
||||||
tswPMT := &TSWriter{
|
tswPMT := &TSWriter{
|
||||||
W: self.W,
|
|
||||||
PID: 0x1000,
|
PID: 0x1000,
|
||||||
DiscontinuityIndicator: true,
|
DiscontinuityIndicator: true,
|
||||||
}
|
}
|
||||||
tswPAT := &TSWriter{
|
tswPAT := &TSWriter{
|
||||||
W: self.W,
|
|
||||||
PID: 0,
|
PID: 0,
|
||||||
DiscontinuityIndicator: true,
|
DiscontinuityIndicator: true,
|
||||||
}
|
}
|
||||||
if err = tswPAT.Write(bufPAT.Bytes()); err != nil {
|
if err = tswPAT.WriteTo(self.W, bufPAT.Bytes()); err != nil {
|
||||||
return
|
|
||||||
}
|
|
||||||
if err = tswPMT.Write(bufPMT.Bytes()); err != nil {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if err = tswPMT.WriteTo(self.W, bufPMT.Bytes()); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, track := range(self.Tracks) {
|
||||||
|
track.spsHasWritten = false
|
||||||
|
track.pcrHasWritten = false
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
24
writer.go
24
writer.go
@ -174,11 +174,22 @@ func (self *TSWriter) EnableVecWriter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *TSWriter) WriteIovec(data *iovec) (err error) {
|
func (self *TSWriter) WriteIovec(data *iovec) (err error) {
|
||||||
w := self.W
|
|
||||||
if self.vecw != nil {
|
if self.vecw != nil {
|
||||||
w = self.vecw
|
if err = self.WriteIovecTo(self.vecw, data); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = self.vecw.Flush(); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err = self.WriteIovecTo(self.W, data); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *TSWriter) WriteIovecTo(w io.Writer, data *iovec) (err error) {
|
||||||
for i := 0; data.Len > 0; i++ {
|
for i := 0; data.Len > 0; i++ {
|
||||||
header := TSHeader{
|
header := TSHeader{
|
||||||
PID: self.PID,
|
PID: self.PID,
|
||||||
@ -216,14 +227,13 @@ func (self *TSWriter) WriteIovec(data *iovec) (err error) {
|
|||||||
|
|
||||||
self.ContinuityCounter++
|
self.ContinuityCounter++
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.vecw != nil {
|
|
||||||
if err = self.vecw.Flush(); err != nil {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return
|
func (self *TSWriter) WriteTo(w io.Writer, data []byte) (err error) {
|
||||||
|
iov := &iovec{}
|
||||||
|
iov.Append(data)
|
||||||
|
return self.WriteIovecTo(w, iov)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *TSWriter) Write(data []byte) (err error) {
|
func (self *TSWriter) Write(data []byte) (err error) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user