bugfix: WriteTSHeader() missing PCR flag
This commit is contained in:
parent
c1b42164ff
commit
460813a749
@ -195,23 +195,48 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var w *ts.TSWriter
|
||||||
|
var sample Sample
|
||||||
|
writePES := func() (err error) {
|
||||||
|
pes := ts.PESHeader{
|
||||||
|
StreamId: ts.StreamIdH264,
|
||||||
|
PTS: sample.PTS,
|
||||||
|
DTS: sample.DTS,
|
||||||
|
}
|
||||||
|
w.PCR = sample.PCR
|
||||||
|
bw := &bytes.Buffer{}
|
||||||
|
if err = ts.WritePES(bw, pes, sample.Data); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = w.Write(bw.Bytes(), false); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if file != nil {
|
if file != nil {
|
||||||
writePAT()
|
writePAT()
|
||||||
writePMT()
|
writePMT()
|
||||||
file.Close()
|
w = &ts.TSWriter{
|
||||||
|
W: file,
|
||||||
|
PID: 0x100,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
var sample Sample
|
|
||||||
var ok bool
|
var ok bool
|
||||||
if sample, ok = <-ch; !ok {
|
if sample, ok = <-ch; !ok {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if sample.Type == ts.ElementaryStreamTypeH264 {
|
if sample.Type == ts.ElementaryStreamTypeH264 {
|
||||||
if false {
|
if true {
|
||||||
fmt.Println("sample: ", len(sample.Data), "PCR", sample.PCR)
|
fmt.Println("sample: ", len(sample.Data), "PCR", sample.PCR)
|
||||||
//fmt.Print(hex.Dump(sample.Data))
|
//fmt.Print(hex.Dump(sample.Data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if file != nil {
|
||||||
|
writePES()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -449,6 +449,10 @@ func ReadPESHeader(r io.Reader) (res *PESHeader, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if DebugReader {
|
||||||
|
fmt.Printf("pes: StreamId=%x\n", self.StreamId)
|
||||||
|
}
|
||||||
|
|
||||||
if length, err = ReadUInt(r, 2); err != nil {
|
if length, err = ReadUInt(r, 2); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
5
ts.go
5
ts.go
@ -53,6 +53,11 @@ type PSI struct {
|
|||||||
LastSecNum uint
|
LastSecNum uint
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
StreamIdH264 = 0xe0
|
||||||
|
StreamIdAAC = 0xc0
|
||||||
|
)
|
||||||
|
|
||||||
type PESHeader struct {
|
type PESHeader struct {
|
||||||
StreamId uint // H264=0xe0 AAC=0xc0
|
StreamId uint // H264=0xe0 AAC=0xc0
|
||||||
DataLength uint
|
DataLength uint
|
||||||
|
20
writer.go
20
writer.go
@ -46,25 +46,29 @@ func WriteTSHeader(w io.Writer, self TSHeader) (err error) {
|
|||||||
flags |= (self.PID&0x1fff00)<<8
|
flags |= (self.PID&0x1fff00)<<8
|
||||||
flags |= self.ContinuityCounter&0xf
|
flags |= self.ContinuityCounter&0xf
|
||||||
|
|
||||||
|
const PCR = 0x10
|
||||||
|
const OPCR = 0x08
|
||||||
|
const EXT = 0x20
|
||||||
|
|
||||||
if self.PCR != 0 {
|
if self.PCR != 0 {
|
||||||
extFlags |= 0x20
|
extFlags |= PCR
|
||||||
}
|
}
|
||||||
if self.OPCR != 0 {
|
if self.OPCR != 0 {
|
||||||
extFlags |= 0x08
|
extFlags |= OPCR
|
||||||
}
|
}
|
||||||
if self.RandomAccessIndicator {
|
if self.RandomAccessIndicator {
|
||||||
extFlags |= 0x40
|
extFlags |= 0x40
|
||||||
}
|
}
|
||||||
|
|
||||||
if extFlags != 0 {
|
if extFlags != 0 {
|
||||||
flags |= 0x20
|
flags |= EXT
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = WriteUInt(w, flags, 4); err != nil {
|
if err = WriteUInt(w, flags, 4); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if flags & 0x20 != 0 {
|
if flags & EXT != 0 {
|
||||||
var length uint
|
var length uint
|
||||||
|
|
||||||
// Discontinuity indicator 1 0x80
|
// Discontinuity indicator 1 0x80
|
||||||
@ -74,10 +78,10 @@ func WriteTSHeader(w io.Writer, self TSHeader) (err error) {
|
|||||||
// OPCR flag 1 0x08
|
// OPCR flag 1 0x08
|
||||||
|
|
||||||
length = 1
|
length = 1
|
||||||
if extFlags & 0x10 != 0 {
|
if extFlags & PCR != 0 {
|
||||||
length += 6
|
length += 6
|
||||||
}
|
}
|
||||||
if extFlags & 0x08 != 0 {
|
if extFlags & OPCR != 0 {
|
||||||
length += 6
|
length += 6
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,13 +92,13 @@ func WriteTSHeader(w io.Writer, self TSHeader) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if extFlags & 0x10 != 0 {
|
if extFlags & PCR != 0 {
|
||||||
if err = WriteUInt64(w, PCRToUInt(self.PCR), 6); err != nil {
|
if err = WriteUInt64(w, PCRToUInt(self.PCR), 6); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if extFlags & 0x08 != 0 {
|
if extFlags & OPCR != 0 {
|
||||||
if err = WriteUInt64(w, PCRToUInt(self.OPCR), 6); err != nil {
|
if err = WriteUInt64(w, PCRToUInt(self.OPCR), 6); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user