diff --git a/example/test.go b/example/test.go index 24203a8..0b11c3f 100644 --- a/example/test.go +++ b/example/test.go @@ -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 } diff --git a/reader.go b/reader.go index 96cc43b..9012cf5 100644 --- a/reader.go +++ b/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 diff --git a/ts.go b/ts.go index 06c9c75..4cf1ff4 100644 --- a/ts.go +++ b/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 diff --git a/writer.go b/writer.go index 9b7bfd3..6b5405c 100644 --- a/writer.go +++ b/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 +} +