fix ts
This commit is contained in:
parent
6e8b028435
commit
c1b9e4b19c
@ -15,6 +15,7 @@ func RegisterAll() {
|
|||||||
avutil.DefaultHandlers.Add(ts.Handler)
|
avutil.DefaultHandlers.Add(ts.Handler)
|
||||||
avutil.DefaultHandlers.Add(rtmp.Handler)
|
avutil.DefaultHandlers.Add(rtmp.Handler)
|
||||||
avutil.DefaultHandlers.Add(rtsp.Handler)
|
avutil.DefaultHandlers.Add(rtsp.Handler)
|
||||||
|
avutil.DefaultHandlers.Add(rtspv2.Handler)
|
||||||
avutil.DefaultHandlers.Add(flv.Handler)
|
avutil.DefaultHandlers.Add(flv.Handler)
|
||||||
avutil.DefaultHandlers.Add(aac.Handler)
|
avutil.DefaultHandlers.Add(aac.Handler)
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ func (self *Muxer) newStream(idx int, codec av.CodecData) (err error) {
|
|||||||
|
|
||||||
func (self *Muxer) writePaddingTSPackets(tsw *tsio.TSWriter) (err error) {
|
func (self *Muxer) writePaddingTSPackets(tsw *tsio.TSWriter) (err error) {
|
||||||
for tsw.ContinuityCounter&0xf != 0x0 {
|
for tsw.ContinuityCounter&0xf != 0x0 {
|
||||||
if err = tsw.WritePackets(self.w, self.datav[:0], 0, false, true); err != nil {
|
if err = tsw.WritePackets(self.w, self.datav[:1], 0, false, true); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,9 @@ package tsio
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/deepch/vdk/utils/bits/pio"
|
||||||
"io"
|
"io"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/deepch/vdk/utils/bits/pio"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -514,17 +513,116 @@ func NewTSWriter(pid uint16) *TSWriter {
|
|||||||
}
|
}
|
||||||
return w
|
return w
|
||||||
}
|
}
|
||||||
|
//TSHeader func
|
||||||
|
type TSHeader struct {
|
||||||
|
PID uint
|
||||||
|
PCR uint64
|
||||||
|
OPCR uint64
|
||||||
|
ContinuityCounter uint
|
||||||
|
PayloadUnitStart bool
|
||||||
|
DiscontinuityIndicator bool
|
||||||
|
RandomAccessIndicator bool
|
||||||
|
HeaderLength uint
|
||||||
|
}
|
||||||
|
//WriteTSHeader func
|
||||||
|
func WriteTSHeader(w io.Writer, element TSHeader, dataLength int) (written int, err error) {
|
||||||
|
var flags, extFlags uint
|
||||||
|
|
||||||
|
flags = 0x47 << 24
|
||||||
|
flags |= 0x10
|
||||||
|
if element.PayloadUnitStart {
|
||||||
|
flags |= 0x400000
|
||||||
|
}
|
||||||
|
|
||||||
|
flags |= (element.PID & 0x1fff) << 8
|
||||||
|
flags |= element.ContinuityCounter & 0xf
|
||||||
|
|
||||||
|
const PCR = 0x10
|
||||||
|
const OPCR = 0x08
|
||||||
|
const EXT = 0x20
|
||||||
|
|
||||||
|
if element.PCR != 0 {
|
||||||
|
extFlags |= PCR
|
||||||
|
}
|
||||||
|
if element.OPCR != 0 {
|
||||||
|
extFlags |= OPCR
|
||||||
|
}
|
||||||
|
if element.RandomAccessIndicator {
|
||||||
|
extFlags |= 0x40
|
||||||
|
}
|
||||||
|
if element.DiscontinuityIndicator {
|
||||||
|
extFlags |= 0x80
|
||||||
|
}
|
||||||
|
if extFlags != 0 {
|
||||||
|
flags |= EXT
|
||||||
|
}
|
||||||
|
if dataLength < 184 {
|
||||||
|
flags |= EXT
|
||||||
|
}
|
||||||
|
if err = WriteUInt(w, flags, 4); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
written += 4
|
||||||
|
|
||||||
|
if flags&EXT != 0 {
|
||||||
|
var length uint
|
||||||
|
length = 1
|
||||||
|
if extFlags&PCR != 0 {
|
||||||
|
length += 6
|
||||||
|
}
|
||||||
|
if extFlags&OPCR != 0 {
|
||||||
|
length += 6
|
||||||
|
}
|
||||||
|
paddingLength := 0
|
||||||
|
if int(length)+5+dataLength < 188 {
|
||||||
|
paddingLength = 188 - dataLength - 5 - int(length)
|
||||||
|
length = 188 - uint(dataLength) - 5
|
||||||
|
}
|
||||||
|
if err = WriteUInt(w, length, 1); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteUInt(w, extFlags, 1); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if extFlags&PCR != 0 {
|
||||||
|
if err = WriteUInt64(w, PCRToUInt(element.PCR), 6); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if extFlags&OPCR != 0 {
|
||||||
|
if err = WriteUInt64(w, PCRToUInt(element.OPCR), 6); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if paddingLength > 0 {
|
||||||
|
if err = WriteRepeatVal(w, 0xff, paddingLength); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
written += int(length) + 1
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
func (self *TSWriter) WritePackets(w io.Writer, datav [][]byte, pcr time.Duration, sync bool, paddata bool) (err error) {
|
func (self *TSWriter) WritePackets(w io.Writer, datav [][]byte, pcr time.Duration, sync bool, paddata bool) (err error) {
|
||||||
datavlen := pio.VecLen(datav)
|
datavlen := pio.VecLen(datav)
|
||||||
writev := make([][]byte, len(datav))
|
writev := make([][]byte, len(datav))
|
||||||
writepos := 0
|
writepos := 0
|
||||||
|
|
||||||
for writepos < datavlen {
|
for writepos < datavlen {
|
||||||
|
|
||||||
self.tshdr[1] = self.tshdr[1] & 0x1f
|
self.tshdr[1] = self.tshdr[1] & 0x1f
|
||||||
self.tshdr[3] = byte(self.ContinuityCounter)&0xf | 0x30
|
self.tshdr[3] = byte(self.ContinuityCounter)&0xf | 0x30
|
||||||
self.tshdr[5] = 0 // flags
|
self.tshdr[5] = 0 // flags
|
||||||
hdrlen := 6
|
hdrlen := 6
|
||||||
|
//pid := uint16((self.tshdr[1]&0x1f))<<8 | uint16(self.tshdr[2])
|
||||||
|
//if pid != 256 {
|
||||||
|
//self.tshdr[3] = 0x01
|
||||||
|
|
||||||
|
//self.tshdr[3] = 0x47
|
||||||
|
//self.tshdr[4]
|
||||||
|
// log.Println(self.tshdr[:5])
|
||||||
|
// log.Println("pid", pid,self.tshdr[3] )
|
||||||
|
//}
|
||||||
self.ContinuityCounter++
|
self.ContinuityCounter++
|
||||||
|
|
||||||
if writepos == 0 {
|
if writepos == 0 {
|
||||||
@ -587,3 +685,40 @@ func ParseTSHeader(tshdr []byte) (pid uint16, start bool, iskeyframe bool, hdrle
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
func makeRepeatValBytes(val byte, n int) []byte {
|
||||||
|
b := make([]byte, n)
|
||||||
|
for i := range b {
|
||||||
|
b[i] = val
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
//WriteRepeatVal func
|
||||||
|
func WriteRepeatVal(w io.Writer, val byte, n int) (err error) {
|
||||||
|
_, err = w.Write(makeRepeatValBytes(val, n))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//WriteUInt64 func
|
||||||
|
func WriteUInt64(w io.Writer, val uint64, n int) (err error) {
|
||||||
|
var b [8]byte
|
||||||
|
for i := n - 1; i >= 0; i-- {
|
||||||
|
b[i] = byte(val)
|
||||||
|
val >>= 8
|
||||||
|
}
|
||||||
|
if _, err = w.Write(b[:n]); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//WriteUInt func
|
||||||
|
func WriteUInt(w io.Writer, val uint, n int) (err error) {
|
||||||
|
return WriteUInt64(w, uint64(val), n)
|
||||||
|
}
|
||||||
|
//PCRToUInt func
|
||||||
|
func PCRToUInt(pcr uint64) uint64 {
|
||||||
|
base := pcr / 300
|
||||||
|
ext := pcr % 300
|
||||||
|
return base<<15 | 0x3f<<9 | ext
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user