writePMT() bugfix
This commit is contained in:
parent
57a7d68cf3
commit
848a9b2a39
@ -161,7 +161,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
pat := ts.PAT{
|
pat := ts.PAT{
|
||||||
Entries: []ts.PATEntry{
|
Entries: []ts.PATEntry{
|
||||||
{ProgramNumber: 1, ProgramMapPID: 4096},
|
{ProgramNumber: 1, ProgramMapPID: 0x1000},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
bw := &bytes.Buffer{}
|
bw := &bytes.Buffer{}
|
||||||
@ -174,8 +174,30 @@ func main() {
|
|||||||
return
|
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 {
|
if file != nil {
|
||||||
writePAT()
|
writePAT()
|
||||||
|
writePMT()
|
||||||
file.Close()
|
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) {
|
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 lr *io.LimitedReader
|
||||||
var cr *Crc32Reader
|
var cr *Crc32Reader
|
||||||
//var psi PSI
|
//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)
|
// Program info length(10)
|
||||||
if flags, err = ReadUInt(lr, 2); err != nil {
|
if flags, err = ReadUInt(lr, 2); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
length = flags & 0x3ff
|
length = flags & 0x3ff
|
||||||
|
|
||||||
readDescs := func(lr *io.LimitedReader) (res []Descriptor, err error) {
|
if DebugReader {
|
||||||
var desc Descriptor
|
fmt.Printf("pmt: ProgramDescriptorsLen=%d\n", length)
|
||||||
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 length > 0 {
|
if length > 0 {
|
||||||
|
26
writer.go
26
writer.go
@ -367,7 +367,19 @@ func WritePMT(w io.Writer, self PMT) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
writeBody := func(w io.Writer) (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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,22 +413,10 @@ func WritePMT(w io.Writer, self PMT) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
writeAll := func(w io.Writer) (err error) {
|
|
||||||
if err = WriteUInt(w, self.PCRPID|7<<13, 2); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
bw := &bytes.Buffer{}
|
bw := &bytes.Buffer{}
|
||||||
if err = writeBody(bw); err != nil {
|
if err = writeBody(bw); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
bw := &bytes.Buffer{}
|
|
||||||
if err = writeAll(bw); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
psi := PSI {
|
psi := PSI {
|
||||||
TableId: 2,
|
TableId: 2,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user