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() {
|
func main() {
|
||||||
var file *os.File
|
var file *os.File
|
||||||
var err error
|
var err error
|
||||||
if file, err = os.Open("tiny2.ts"); err != nil {
|
if file, err = os.Open("/tmp/out.ts"); err != nil {
|
||||||
return
|
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 {
|
if res32, err = ReadUInt(r, n-4); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
res |= uint64(res32)<<(uint(n-4)*8)
|
res |= uint64(res32)<<32
|
||||||
n = 4
|
n = 4
|
||||||
}
|
}
|
||||||
if res32, err = ReadUInt(r, n); err != nil {
|
if res32, err = ReadUInt(r, n); err != nil {
|
||||||
@ -119,16 +119,24 @@ func ReadTSHeader(r io.Reader) (self TSHeader, err error) {
|
|||||||
|
|
||||||
// PCR
|
// PCR
|
||||||
if flags & 0x10 != 0 {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
// clock is 27MHz
|
||||||
|
self.PCR = UIntToPCR(v)
|
||||||
|
if debug {
|
||||||
|
fmt.Printf("ts: PCR %d %f\n", self.PCR, float64(self.PCR)/27000000)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// OPCR
|
// OPCR
|
||||||
if flags & 0x08 != 0 {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
self.OPCR = UIntToPCR(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Splice countdown
|
// Splice countdown
|
||||||
@ -506,6 +514,10 @@ func ReadPESHeader(r io.Reader) (res *PESHeader, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.PTS = PESUIntToTs(v)
|
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 {
|
if flags & 0x40 != 0 && flags & 0x80 != 0 {
|
||||||
@ -514,6 +526,7 @@ func ReadPESHeader(r io.Reader) (res *PESHeader, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.DTS = PESUIntToTs(v)
|
self.DTS = PESUIntToTs(v)
|
||||||
|
fmt.Printf("pes: dts %d\n", self.PTS)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ESCR flag
|
// ESCR flag
|
||||||
|
17
ts.go
17
ts.go
@ -7,6 +7,11 @@ import (
|
|||||||
|
|
||||||
const debug = true
|
const debug = true
|
||||||
|
|
||||||
|
const (
|
||||||
|
ElementaryStreamTypeH264 = 0x1B
|
||||||
|
ElementaryStreamTypeAdtsAAC = 0x0F
|
||||||
|
)
|
||||||
|
|
||||||
type TSHeader struct {
|
type TSHeader struct {
|
||||||
PID uint
|
PID uint
|
||||||
PCR uint64
|
PCR uint64
|
||||||
@ -15,11 +20,6 @@ type TSHeader struct {
|
|||||||
PayloadUnitStart bool
|
PayloadUnitStart bool
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
ElementaryStreamTypeH264 = 0x1B
|
|
||||||
ElementaryStreamTypeAdtsAAC = 0x0F
|
|
||||||
)
|
|
||||||
|
|
||||||
type PATEntry struct {
|
type PATEntry struct {
|
||||||
ProgramNumber uint
|
ProgramNumber uint
|
||||||
NetworkPID 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)
|
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 {
|
type FieldsDumper struct {
|
||||||
Fields []struct {
|
Fields []struct {
|
||||||
Length int
|
Length int
|
||||||
|
35
writer.go
35
writer.go
@ -6,7 +6,40 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SimpleH264Writer struct {
|
type TSWriter struct {
|
||||||
W io.Writer
|
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