streaming

Media streaming and broadcast systems in Go
Log | Files | Refs | README | LICENSE

commit 6fdf3f5dfcf476c83866ac084b8609cd5c9db62f
parent f0e60574d2b92126423a85c15191f584bfb1b2e4
Author: Oliver Lowe <o@olowe.co>
Date:   Mon, 10 Jun 2024 13:51:13 +1000

mpegts: correctly pack PCR with reserved bits

The reserved bits needed to be toggled. We've also added our test
which does a byte-for-byte check on packets and reports which bytes
differ after encoding.

Diffstat:
Mmpegts/codec.go | 3++-
Mmpegts/codec_test.go | 30+++++++++++++++++++++++++++---
2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/mpegts/codec.go b/mpegts/codec.go @@ -251,7 +251,8 @@ func putPCR(b []byte, pcr *PCR) error { b[2] = byte(pcr.Base >> 16) b[3] = byte(pcr.Base >> 24) b[4] = byte(pcr.Base >> 32) - // next 6 bits are reserved + + b[4] |= 0x7e // toggle 6 reserved bits var emax uint16 = 512 - 1 // max 9-bit int if pcr.Extension > emax { diff --git a/mpegts/codec_test.go b/mpegts/codec_test.go @@ -1,6 +1,7 @@ package mpegts import ( + "bytes" "errors" "io" "os" @@ -13,15 +14,38 @@ func TestDecode(t *testing.T) { t.Fatal(err) } defer f.Close() + var i int for { - p, err := Decode(f) + i++ + var in [188]byte + n, err := f.Read(in[:]) if errors.Is(err, io.EOF) { break + } else if n != PacketSize { + t.Fatalf("short read: read %d bytes", n) } else if err != nil { + t.Fatalf("read packet: %v", err) + } + p, err := Decode(bytes.NewReader(in[:])) + if err != nil { t.Fatalf("decode packet: %v", err) } - if err := Encode(io.Discard, p); err != nil { - t.Fatalf("encode packet: %v", err) + + buf := &bytes.Buffer{} + if err := Encode(buf, p); err != nil { + t.Fatalf("encode packet %d: %v", i, err) + } + var out [188]byte + copy(out[:], buf.Bytes()) + + if in != out { + t.Errorf("packet %d: encoded and source bytes differ", i) + t.Logf("%+v", p) + for i := range in { + if in[i] != out[i] { + t.Errorf("byte %d: source %v, encoded %v", i, in[i], out[i]) + } + } } } }