finish WriteTSHeader

This commit is contained in:
nareix 2015-12-05 22:05:25 +08:00
parent 264d172b2b
commit 5680c3b102
4 changed files with 150 additions and 7 deletions

View File

@ -16,9 +16,25 @@ type Stream struct {
Title string
Data bytes.Buffer
Type uint
PTS uint
PCR uint
}
func main() {
type Sample struct {
Type uint
PCR uint64
PTS uint64
DTS uint64
Data []byte
}
func readSamples(ch chan Sample) {
defer func() {
close(ch)
}()
debug := false
var file *os.File
var err error
if file, err = os.Open("/tmp/out.ts"); err != nil {
@ -66,9 +82,15 @@ func main() {
return
}
if stream.Data.Len() == int(stream.Header.DataLength) {
if debug {
fmt.Println(stream.Type, stream.Title, stream.Data.Len(), "total")
fmt.Println(hex.Dump(stream.Data.Bytes()))
}
ch <- Sample{
Type: stream.Type,
Data: stream.Data.Bytes(),
}
}
return
}
@ -76,7 +98,9 @@ func main() {
if header, n, err = ts.ReadTSPacket(file, data[:]); err != nil {
return
}
if debug {
fmt.Println(header, n)
}
payload = data[:n]
pr := bytes.NewReader(payload)
@ -94,7 +118,7 @@ func main() {
return
}
//fmt.Println("pmt", pmt)
if true {
if debug {
fmt.Println(hex.Dump(payload))
}
}
@ -109,3 +133,18 @@ func main() {
}
}
func main() {
ch := make(chan Sample)
go readSamples(ch)
for {
var sample Sample
var ok bool
if sample, ok = <-ch; !ok {
break
}
if sample.Type == ts.ElementaryStreamTypeH264 {
}
}
}

View File

@ -56,7 +56,7 @@ func ReadTSHeader(r io.Reader) (self TSHeader, err error) {
}
if debug {
fmt.Printf("ts: %s\n", FieldsDumper{
fmt.Printf("ts: flags %s\n", FieldsDumper{
Fields: []struct{
Length int
Desc string
@ -100,7 +100,7 @@ func ReadTSHeader(r io.Reader) (self TSHeader, err error) {
}
if debug {
fmt.Printf("ts: %s\n", FieldsDumper{
fmt.Printf("ts: ext_flags %s\n", FieldsDumper{
Fields: []struct{
Length int
Desc string

7
ts.go
View File

@ -18,6 +18,7 @@ type TSHeader struct {
OPCR uint64
ContinuityCounter uint
PayloadUnitStart bool
RandomAccessIndicator bool
}
type PATEntry struct {
@ -74,6 +75,12 @@ func UIntToPCR(v uint64) uint64 {
return base*300+ext
}
func PCRToUInt(pcr uint64) uint64 {
base := pcr/300
ext := pcr%300
return base<<15|0x3f<<9|ext
}
type FieldsDumper struct {
Fields []struct {
Length int

View File

@ -8,6 +8,103 @@ import (
type TSWriter struct {
W io.Writer
ContinuityCounter uint
PayloadUnitStart bool
}
func WriteUInt64(w io.Writer, val uint64, n int) (err error) {
var b [8]byte
for i := n-1; i >= 0; i-- {
b[i] = byte(val)
val >>= 8
}
if _, err = w.Write(b[:]); err != nil {
return
}
return
}
func WriteUInt(w io.Writer, val uint, n int) (err error) {
return WriteUInt64(w, uint64(val), n)
}
func WriteTSHeader(w io.Writer, self TSHeader) (err error) {
var flags, extFlags uint
// sync(8)
// transport_error_indicator(1)
// payload_unit_start_indicator(1)
// transport_priority(1)
// pid(13)
// Scrambling control(2)
// Adaptation field flag(1) 0x20
// Payload flag(1) 0x10
// Continuity counter(4)
flags = 0x47<<24
flags |= 0x10
if self.PayloadUnitStart {
flags |= 0x400000
}
flags |= (self.PID&0x1fff00)<<8
flags |= self.ContinuityCounter&0xf
if self.PCR != 0 {
extFlags |= 0x20
}
if self.OPCR != 0 {
extFlags |= 0x08
}
if self.RandomAccessIndicator {
extFlags |= 0x40
}
if extFlags != 0 {
flags |= 0x20
}
if err = WriteUInt(w, flags, 4); err != nil {
return
}
if flags & 0x20 != 0 {
var length uint
// Discontinuity indicator 1 0x80
// Random Access indicator 1 0x40
// Elementary stream priority indicator 1 0x20
// PCR flag 1 0x10
// OPCR flag 1 0x08
length = 1
if extFlags & 0x10 != 0 {
length += 6
}
if extFlags & 0x08 != 0 {
length += 6
}
if err = WriteUInt(w, length, 1); err != nil {
return
}
if err = WriteUInt(w, extFlags, 1); err != nil {
return
}
if extFlags & 0x10 != 0 {
if err = WriteUInt64(w, PCRToUInt(self.PCR), 6); err != nil {
return
}
}
if extFlags & 0x08 != 0 {
if err = WriteUInt64(w, PCRToUInt(self.OPCR), 6); err != nil {
return
}
}
}
return
}
type PSIWriter struct {