fix ReadUInt64 bug due to PCR incorrect
This commit is contained in:
parent
e335094c99
commit
841ebf6b90
@ -20,7 +20,7 @@ type Stream struct {
|
||||
func main() {
|
||||
var file *os.File
|
||||
var err error
|
||||
if file, err = os.Open("tiny2.ts"); err != nil {
|
||||
if file, err = os.Open("/tmp/out.ts"); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
|
19
reader.go
19
reader.go
@ -30,7 +30,7 @@ func ReadUInt64(r io.Reader, n int) (res uint64, err error) {
|
||||
if res32, err = ReadUInt(r, n-4); err != nil {
|
||||
return
|
||||
}
|
||||
res |= uint64(res32)<<(uint(n-4)*8)
|
||||
res |= uint64(res32)<<32
|
||||
n = 4
|
||||
}
|
||||
if res32, err = ReadUInt(r, n); err != nil {
|
||||
@ -119,16 +119,24 @@ func ReadTSHeader(r io.Reader) (self TSHeader, err error) {
|
||||
|
||||
// PCR
|
||||
if flags & 0x10 != 0 {
|
||||
if self.PCR, err = ReadUInt64(lr, 6); err != nil {
|
||||
var v uint64
|
||||
if v, err = ReadUInt64(lr, 6); err != nil {
|
||||
return
|
||||
}
|
||||
// clock is 27MHz
|
||||
self.PCR = UIntToPCR(v)
|
||||
if debug {
|
||||
fmt.Printf("ts: PCR %d %f\n", self.PCR, float64(self.PCR)/27000000)
|
||||
}
|
||||
}
|
||||
|
||||
// OPCR
|
||||
if flags & 0x08 != 0 {
|
||||
if self.OPCR, err = ReadUInt64(lr, 6); err != nil {
|
||||
var v uint64
|
||||
if v, err = ReadUInt64(lr, 6); err != nil {
|
||||
return
|
||||
}
|
||||
self.OPCR = UIntToPCR(v)
|
||||
}
|
||||
|
||||
// Splice countdown
|
||||
@ -506,6 +514,10 @@ func ReadPESHeader(r io.Reader) (res *PESHeader, err error) {
|
||||
return
|
||||
}
|
||||
self.PTS = PESUIntToTs(v)
|
||||
|
||||
if debug {
|
||||
fmt.Printf("pes: pts %d %f\n", self.PTS, float64(self.PTS)/90000)
|
||||
}
|
||||
}
|
||||
|
||||
if flags & 0x40 != 0 && flags & 0x80 != 0 {
|
||||
@ -514,6 +526,7 @@ func ReadPESHeader(r io.Reader) (res *PESHeader, err error) {
|
||||
return
|
||||
}
|
||||
self.DTS = PESUIntToTs(v)
|
||||
fmt.Printf("pes: dts %d\n", self.PTS)
|
||||
}
|
||||
|
||||
// ESCR flag
|
||||
|
17
ts.go
17
ts.go
@ -7,6 +7,11 @@ import (
|
||||
|
||||
const debug = true
|
||||
|
||||
const (
|
||||
ElementaryStreamTypeH264 = 0x1B
|
||||
ElementaryStreamTypeAdtsAAC = 0x0F
|
||||
)
|
||||
|
||||
type TSHeader struct {
|
||||
PID uint
|
||||
PCR uint64
|
||||
@ -15,11 +20,6 @@ type TSHeader struct {
|
||||
PayloadUnitStart bool
|
||||
}
|
||||
|
||||
const (
|
||||
ElementaryStreamTypeH264 = 0x1B
|
||||
ElementaryStreamTypeAdtsAAC = 0x0F
|
||||
)
|
||||
|
||||
type PATEntry struct {
|
||||
ProgramNumber uint
|
||||
NetworkPID uint
|
||||
@ -67,6 +67,13 @@ func PESUIntToTs(v uint64) (ts uint64) {
|
||||
return (((v>>33)&0x7)<<30) | (((v>>17)&0xef)<<15) | ((v>>1)&0xef)
|
||||
}
|
||||
|
||||
func UIntToPCR(v uint64) uint64 {
|
||||
// base(33)+resverd(6)+ext(9)
|
||||
base := v>>15
|
||||
ext := v&0x1ff
|
||||
return base*300+ext
|
||||
}
|
||||
|
||||
type FieldsDumper struct {
|
||||
Fields []struct {
|
||||
Length int
|
||||
|
35
writer.go
35
writer.go
@ -6,7 +6,40 @@ import (
|
||||
"io"
|
||||
)
|
||||
|
||||
type SimpleH264Writer struct {
|
||||
type TSWriter struct {
|
||||
W io.Writer
|
||||
}
|
||||
|
||||
type PSIWriter struct {
|
||||
W *TSWriter
|
||||
}
|
||||
|
||||
func (self PSIWriter) Write(b []byte) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (self PSIWriter) Finish() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
type PESWriter struct {
|
||||
W io.Writer
|
||||
}
|
||||
|
||||
type SimpleH264Writer struct {
|
||||
W io.Writer
|
||||
headerHasWritten bool
|
||||
}
|
||||
|
||||
func WritePAT(w io.Writer, self PAT) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (self *SimpleH264Writer) WriteSample(data []byte) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (self *SimpleH264Writer) WriteNALU(data []byte) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user