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:
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])
+ }
+ }
}
}
}