writePMT() bugfix

This commit is contained in:
nareix 2015-12-06 19:50:46 +08:00
parent 57a7d68cf3
commit 848a9b2a39
3 changed files with 61 additions and 34 deletions

View File

@ -159,9 +159,9 @@ func main() {
W: file,
PID: 0,
}
pat := ts.PAT {
pat := ts.PAT{
Entries: []ts.PATEntry{
{ProgramNumber: 1, ProgramMapPID: 4096},
{ProgramNumber: 1, ProgramMapPID: 0x1000},
},
}
bw := &bytes.Buffer{}
@ -174,8 +174,30 @@ func main() {
return
}
writePMT := func() (err error) {
w := &ts.TSWriter{
W: file,
PID: 0x1000,
}
pmt := ts.PMT{
PCRPID: 0x100,
ElementaryStreamInfos: []ts.ElementaryStreamInfo{
{StreamType: ts.ElementaryStreamTypeH264, ElementaryPID: 0x100},
},
}
bw := &bytes.Buffer{}
if err = ts.WritePMT(bw, pmt); err != nil {
return
}
if err = w.Write(bw.Bytes(), false); err != nil {
return
}
return
}
if file != nil {
writePAT()
writePMT()
file.Close()
}

View File

@ -275,6 +275,25 @@ func ReadPSI(r io.Reader) (self PSI, lr *io.LimitedReader, cr *Crc32Reader, err
}
func ReadPMT(r io.Reader) (self PMT, err error) {
readDescs := func(lr *io.LimitedReader) (res []Descriptor, err error) {
var desc Descriptor
for lr.N > 0 {
if desc.Tag, err = ReadUInt(lr, 1); err != nil {
return
}
var length uint
if length, err = ReadUInt(lr, 1); err != nil {
return
}
desc.Data = make([]byte, length)
if _, err = lr.Read(desc.Data); err != nil {
return
}
res = append(res, desc)
}
return
}
var lr *io.LimitedReader
var cr *Crc32Reader
//var psi PSI
@ -306,30 +325,16 @@ func ReadPMT(r io.Reader) (self PMT, err error) {
})
}
// Reserved(6)
// Reserved(4)=0xf
// Reserved(2)=0x0
// Program info length(10)
if flags, err = ReadUInt(lr, 2); err != nil {
return
}
length = flags & 0x3ff
readDescs := func(lr *io.LimitedReader) (res []Descriptor, err error) {
var desc Descriptor
for lr.N > 0 {
if desc.Tag, err = ReadUInt(lr, 1); err != nil {
return
}
var length uint
if length, err = ReadUInt(lr, 1); err != nil {
return
}
desc.Data = make([]byte, length)
if _, err = lr.Read(desc.Data); err != nil {
return
}
res = append(res, desc)
}
return
if DebugReader {
fmt.Printf("pmt: ProgramDescriptorsLen=%d\n", length)
}
if length > 0 {

View File

@ -367,7 +367,19 @@ func WritePMT(w io.Writer, self PMT) (err error) {
}
writeBody := func(w io.Writer) (err error) {
if err = writeDescs(w, self.ProgramDescriptors); err != nil {
if err = WriteUInt(w, self.PCRPID|7<<13, 2); err != nil {
return
}
bw := &bytes.Buffer{}
if err = writeDescs(bw, self.ProgramDescriptors); err != nil {
return
}
if err = WriteUInt(w, 0xf<<12|uint(bw.Len()), 2); err != nil {
return
}
if _, err = w.Write(bw.Bytes()); err != nil {
return
}
@ -401,20 +413,8 @@ func WritePMT(w io.Writer, self PMT) (err error) {
return
}
writeAll := func(w io.Writer) (err error) {
if err = WriteUInt(w, self.PCRPID|7<<13, 2); err != nil {
return
}
bw := &bytes.Buffer{}
if err = writeBody(bw); err != nil {
return
}
return
}
bw := &bytes.Buffer{}
if err = writeAll(bw); err != nil {
if err = writeBody(bw); err != nil {
return
}