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