writePMT() bugfix
This commit is contained in:
parent
57a7d68cf3
commit
848a9b2a39
@ -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()
|
||||
}
|
||||
|
||||
|
41
reader.go
41
reader.go
@ -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 {
|
||||
|
28
writer.go
28
writer.go
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user