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

View File

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

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

View File

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