fix ReadUInt64 bug due to PCR incorrect

This commit is contained in:
nareix 2015-12-05 01:30:10 +08:00
parent e335094c99
commit 841ebf6b90
4 changed files with 63 additions and 10 deletions

View File

@ -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
}

View File

@ -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
View File

@ -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

View File

@ -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
}