bugfix: WriteTSHeader() missing PCR flag

This commit is contained in:
nareix 2015-12-07 13:11:40 +08:00
parent c1b42164ff
commit 460813a749
4 changed files with 49 additions and 11 deletions

View File

@ -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()
}
}
}
}

View File

@ -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
View File

@ -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

View File

@ -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
}