use unmarshaled RTP/RTCP packets in tests

This commit is contained in:
aler9
2022-03-18 16:54:09 +01:00
parent 9b4de46a08
commit df2a0742ad
2 changed files with 743 additions and 402 deletions

View File

@@ -29,7 +29,7 @@ var cases = []struct {
name string name string
aus [][]byte aus [][]byte
pts time.Duration pts time.Duration
enc [][]byte pkts []*rtp.Packet
}{ }{
{ {
"single", "single",
@@ -82,10 +82,18 @@ var cases = []struct {
}, },
}, },
20 * time.Millisecond, 20 * time.Millisecond,
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x0a, 0xd8, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: []byte{
0x00, 0x10, 0x0a, 0xd8,
0x21, 0x1a, 0xd4, 0xf5, 0x9e, 0x20, 0xc5, 0x42, 0x21, 0x1a, 0xd4, 0xf5, 0x9e, 0x20, 0xc5, 0x42,
0x89, 0x40, 0xa2, 0x9b, 0x3c, 0x94, 0xdd, 0x28, 0x89, 0x40, 0xa2, 0x9b, 0x3c, 0x94, 0xdd, 0x28,
0x94, 0x48, 0xd5, 0x8b, 0xb0, 0x02, 0xdb, 0x1b, 0x94, 0x48, 0xd5, 0x8b, 0xb0, 0x02, 0xdb, 0x1b,
@@ -133,6 +141,7 @@ var cases = []struct {
}, },
}, },
}, },
},
{ {
"aggregated", "aggregated",
[][]byte{ [][]byte{
@@ -141,45 +150,75 @@ var cases = []struct {
{0x08, 0x09, 0x0A, 0x0B}, {0x08, 0x09, 0x0A, 0x0B},
}, },
0, 0,
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x0, 0x30, 0x0, 0x20, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: []byte{
0x0, 0x30, 0x0, 0x20,
0x0, 0x20, 0x0, 0x20, 0x0, 0x1, 0x2, 0x3, 0x0, 0x20, 0x0, 0x20, 0x0, 0x1, 0x2, 0x3,
0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb,
}, },
}, },
}, },
},
{ {
"fragmented", "fragmented",
[][]byte{ [][]byte{
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 512), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 512),
}, },
0, 0,
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x0, 0x10, 0x5, 0xb0, Marker: false,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x0, 0x10, 0x5, 0xb0},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
), ),
mergeBytes(
[]byte{
0x80, 0x60, 0x44, 0xee, 0x88, 0x77, 0x66, 0x55,
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x05, 0xb0,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x00, 0x10, 0x05, 0xb0},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
), ),
mergeBytes(
[]byte{
0x80, 0xe0, 0x44, 0xef, 0x88, 0x77, 0x66, 0x55,
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x04, 0xa0,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17647,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x00, 0x10, 0x04, 0xa0},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 148), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 148),
), ),
}, },
}, },
},
{ {
"aggregated followed by fragmented", "aggregated followed by fragmented",
[][]byte{ [][]byte{
@@ -189,29 +228,52 @@ var cases = []struct {
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 256), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 256),
}, },
0, 0,
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x0, 0x30, 0x0, 0x20, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: []byte{
0x0, 0x30, 0x0, 0x20,
0x0, 0x20, 0x0, 0x20, 0x0, 0x1, 0x2, 0x3, 0x0, 0x20, 0x0, 0x20, 0x0, 0x1, 0x2, 0x3,
0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb,
}, },
mergeBytes(
[]byte{
0x80, 0x60, 0x44, 0xee, 0x88, 0x77, 0x72, 0x0d,
0x9d, 0xbb, 0x78, 0x12, 0x0, 0x10, 0x5, 0xb0,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289529357,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x0, 0x10, 0x5, 0xb0},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
), ),
mergeBytes(
[]byte{
0x80, 0xe0, 0x44, 0xef, 0x88, 0x77, 0x72, 0x0d,
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x02, 0x50,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17647,
Timestamp: 2289529357,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x00, 0x10, 0x02, 0x50},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 74), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 74),
), ),
}, },
}, },
},
} }
func TestDecode(t *testing.T) { func TestDecode(t *testing.T) {
@@ -222,26 +284,27 @@ func TestDecode(t *testing.T) {
// send an initial packet downstream // send an initial packet downstream
// in order to compute the right timestamp, // in order to compute the right timestamp,
// that is relative to the initial packet // that is relative to the initial packet
var pkt rtp.Packet pkt := rtp.Packet{
err := pkt.Unmarshal([]byte{ Header: rtp.Header{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x00, 0x08, 0x0, Marker: true,
}) PayloadType: 96,
require.NoError(t, err) SequenceNumber: 17645,
_, _, err = d.Decode(&pkt) Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x10, 0x00, 0x08, 0x0},
}
_, _, err := d.Decode(&pkt)
require.NoError(t, err) require.NoError(t, err)
var aus [][]byte var aus [][]byte
expPTS := ca.pts expPTS := ca.pts
for _, byts := range ca.enc { for _, pkt := range ca.pkts {
var pkt rtp.Packet
err := pkt.Unmarshal(byts)
require.NoError(t, err)
clone := pkt.Clone() clone := pkt.Clone()
addAUs, pts, err := d.Decode(&pkt) addAUs, pts, err := d.Decode(pkt)
if err == ErrMorePacketsNeeded { if err == ErrMorePacketsNeeded {
continue continue
} }
@@ -251,8 +314,8 @@ func TestDecode(t *testing.T) {
aus = append(aus, addAUs...) aus = append(aus, addAUs...)
expPTS += time.Duration(len(aus)) * 1000 * time.Second / 48000 expPTS += time.Duration(len(aus)) * 1000 * time.Second / 48000
// test packet integrity // test input integrity
require.Equal(t, clone, &pkt) require.Equal(t, clone, pkt)
} }
require.Equal(t, ca.aus, aus) require.Equal(t, ca.aus, aus)
@@ -263,143 +326,237 @@ func TestDecode(t *testing.T) {
func TestDecodeErrors(t *testing.T) { func TestDecodeErrors(t *testing.T) {
for _, ca := range []struct { for _, ca := range []struct {
name string name string
pkts [][]byte pkts []*rtp.Packet
err string err string
}{ }{
{ {
"missing payload", "missing payload",
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
}, },
}, },
"payload is too short", "payload is too short",
}, },
{ {
"missing au header", "missing au header",
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x10},
}, },
}, },
"payload is too short", "payload is too short",
}, },
{ {
"missing au", "missing au",
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x0a, 0xd8, Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x10, 0x0a, 0xd8},
}, },
}, },
"payload is too short", "payload is too short",
}, },
{ {
"invalid au headers length", "invalid au headers length",
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x09, Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x09},
}, },
}, },
"invalid AU-headers-length (9)", "invalid AU-headers-length (9)",
}, },
{ {
"au index not zero", "au index not zero",
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x0a, 0xd8 | 0x01, Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x10, 0x0a, 0xd9},
}, },
}, },
"AU-index field is not zero", "AU-index field is not zero",
}, },
{ {
"fragmented with multiple AUs", "fragmented with multiple AUs",
[][]byte{ []*rtp.Packet{
{ {
0x80, 0x60, 0x0e, 0xa2, 0x0e, 0x01, 0x9b, 0xb7, Header: rtp.Header{
0x35, 0x6e, 0xcb, 0x3b, 0x00, 0x20, Version: 2,
Marker: false,
PayloadType: 0x60,
SequenceNumber: 0xea2,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x20},
}, },
}, },
"a fragmented packet can only contain one AU", "a fragmented packet can only contain one AU",
}, },
{ {
"fragmented with AU index not zero", "fragmented with AU index not zero",
[][]byte{ []*rtp.Packet{
{ {
0x80, 0x60, 0x0e, 0xa2, 0x0e, 0x01, 0x9b, 0xb7, Header: rtp.Header{
0x35, 0x6e, 0xcb, 0x3b, 0x00, 0x10, 0x0a, 0xd8 | 0x01, Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x10, 0x0a, 0xd9},
}, },
}, },
"AU-index field is not zero", "AU-index field is not zero",
}, },
{ {
"fragmented with missing au", "fragmented with missing au",
[][]byte{ []*rtp.Packet{
{ {
0x80, 0x60, 0x0e, 0xa2, 0x0e, 0x01, 0x9b, 0xb7, Header: rtp.Header{
0x35, 0x6e, 0xcb, 0x3b, 0x00, 0x10, 0x0a, 0xd8, Version: 2,
Marker: false,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x10, 0x0a, 0xd8},
}, },
}, },
"payload is too short", "payload is too short",
}, },
{ {
"fragmented with multiple AUs in 2nd packet", "fragmented with multiple AUs in 2nd packet",
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x0, 0x10, 0x5, 0xb0, Marker: false,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x0, 0x10, 0x5, 0xb0},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
), ),
mergeBytes( },
[]byte{ {
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ee,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{
0x80, 0xe0, 0x44, 0xee, 0x88, 0x77, 0x66, 0x55, 0x80, 0xe0, 0x44, 0xee, 0x88, 0x77, 0x66, 0x55,
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x20, 0x9d, 0xbb, 0x78, 0x12, 0x00, 0x20,
}, },
), },
}, },
"a fragmented packet can only contain one AU", "a fragmented packet can only contain one AU",
}, },
{ {
"fragmented with au index not zero in 2nd packet", "fragmented with au index not zero in 2nd packet",
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x0, 0x10, 0x5, 0xb0, Marker: false,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x0, 0x10, 0x5, 0xb0},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
), ),
mergeBytes(
[]byte{
0x80, 0xe0, 0x44, 0xee, 0x88, 0x77, 0x66, 0x55,
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x0a, 0xd8 | 0x01,
}, },
), {
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ee,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x10, 0x0a, 0xd8 | 0x01},
},
}, },
"AU-index field is not zero", "AU-index field is not zero",
}, },
{ {
"fragmented without payload in 2nd packet", "fragmented without payload in 2nd packet",
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x0, 0x10, 0x5, 0xb0, Marker: false,
PayloadType: 0x60,
SequenceNumber: 0x44ed,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x0, 0x10, 0x5, 0xb0},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
), ),
mergeBytes(
[]byte{
0x80, 0xe0, 0x44, 0xee, 0x88, 0x77, 0x66, 0x55,
0x9d, 0xbb, 0x78, 0x12, 0x00, 0x10, 0x0a, 0xd8,
}, },
), {
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 0x60,
SequenceNumber: 0x44ee,
Timestamp: 0x88776a15,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x00, 0x10, 0x0a, 0xd8},
},
}, },
"payload is too short", "payload is too short",
}, },
@@ -407,11 +564,8 @@ func TestDecodeErrors(t *testing.T) {
t.Run(ca.name, func(t *testing.T) { t.Run(ca.name, func(t *testing.T) {
d := NewDecoder(48000) d := NewDecoder(48000)
var lastErr error var lastErr error
for _, byts := range ca.pkts { for _, pkt := range ca.pkts {
var pkt rtp.Packet _, _, lastErr = d.Decode(pkt)
err := pkt.Unmarshal(byts)
require.NoError(t, err)
_, _, lastErr = d.Decode(&pkt)
} }
require.EqualError(t, lastErr, ca.err) require.EqualError(t, lastErr, ca.err)
}) })
@@ -426,17 +580,9 @@ func TestEncode(t *testing.T) {
initialTs := uint32(0x88776655) initialTs := uint32(0x88776655)
e := NewEncoder(96, 48000, &sequenceNumber, &ssrc, &initialTs) e := NewEncoder(96, 48000, &sequenceNumber, &ssrc, &initialTs)
enc, err := e.Encode(ca.aus, ca.pts) pkts, err := e.Encode(ca.aus, ca.pts)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, ca.pkts, pkts)
var bytss [][]byte
for _, pkt := range enc {
byts, err := pkt.Marshal()
require.NoError(t, err)
bytss = append(bytss, byts)
}
require.Equal(t, ca.enc, bytss)
}) })
} }
} }

View File

@@ -30,7 +30,7 @@ var cases = []struct {
name string name string
nalus [][]byte nalus [][]byte
pts time.Duration pts time.Duration
enc [][]byte pkts []*rtp.Packet
}{ }{
{ {
"single", "single",
@@ -41,16 +41,23 @@ var cases = []struct {
), ),
}, },
25 * time.Millisecond, 25 * time.Millisecond,
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6f, 0x1f, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x05, Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289528607,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x05},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8),
), ),
}, },
}, },
},
{ {
"negative timestamp", "negative timestamp",
[][]byte{ [][]byte{
@@ -60,16 +67,23 @@ var cases = []struct {
), ),
}, },
-20 * time.Millisecond, -20 * time.Millisecond,
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x5f, 0x4d, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x05, Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289524557,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x05},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8),
), ),
}, },
}, },
},
{ {
"fragmented", "fragmented",
[][]byte{ [][]byte{
@@ -79,34 +93,55 @@ var cases = []struct {
), ),
}, },
55 * time.Millisecond, 55 * time.Millisecond,
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x79, 0xab, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x85, Marker: false,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289531307,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x1c, 0x85},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
[]byte{0x00, 0x01}, []byte{0x00, 0x01},
), ),
mergeBytes(
[]byte{
0x80, 0x60, 0x44, 0xee, 0x88, 0x77, 0x79, 0xab,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x05,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289531307,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x1c, 0x05},
[]byte{0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, []byte{0x02, 0x03, 0x04, 0x05, 0x06, 0x07},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 181), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 181),
[]byte{0x00, 0x01, 0x02, 0x03}, []byte{0x00, 0x01, 0x02, 0x03},
), ),
mergeBytes(
[]byte{
0x80, 0xe0, 0x44, 0xef, 0x88, 0x77, 0x79, 0xab,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x45,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17647,
Timestamp: 2289531307,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x1c, 0x45},
[]byte{0x04, 0x05, 0x06, 0x07}, []byte{0x04, 0x05, 0x06, 0x07},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 147), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 147),
), ),
}, },
}, },
},
{ {
"aggregated", "aggregated",
[][]byte{ [][]byte{
@@ -124,10 +159,18 @@ var cases = []struct {
}, },
}, },
0, 0,
[][]byte{ []*rtp.Packet{
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x18, 0x00, 0x02, 0x09, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: []byte{
0x18, 0x00, 0x02, 0x09,
0xf0, 0x00, 0x44, 0x41, 0x9a, 0x24, 0x6c, 0x41, 0xf0, 0x00, 0x44, 0x41, 0x9a, 0x24, 0x6c, 0x41,
0x4f, 0xfe, 0xd6, 0x8c, 0xb0, 0x00, 0x00, 0x03, 0x4f, 0xfe, 0xd6, 0x8c, 0xb0, 0x00, 0x00, 0x03,
0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
@@ -140,6 +183,7 @@ var cases = []struct {
}, },
}, },
}, },
},
{ {
"aggregated followed by single", "aggregated followed by single",
[][]byte{ [][]byte{
@@ -161,10 +205,18 @@ var cases = []struct {
), ),
}, },
0, 0,
[][]byte{ []*rtp.Packet{
{ {
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x18, 0x00, 0x02, 0x09, Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: []byte{
0x18, 0x00, 0x02, 0x09,
0xf0, 0x00, 0x44, 0x41, 0x9a, 0x24, 0x6c, 0x41, 0xf0, 0x00, 0x44, 0x41, 0x9a, 0x24, 0x6c, 0x41,
0x4f, 0xfe, 0xd6, 0x8c, 0xb0, 0x00, 0x00, 0x03, 0x4f, 0xfe, 0xd6, 0x8c, 0xb0, 0x00, 0x00, 0x03,
0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00,
@@ -175,15 +227,23 @@ var cases = []struct {
0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
0x00, 0x00, 0x03, 0x00, 0x00, 0x6d, 0x40, 0x00, 0x00, 0x03, 0x00, 0x00, 0x6d, 0x40,
}, },
mergeBytes(
[]byte{
0x80, 0xe0, 0x44, 0xee, 0x88, 0x77, 0x66, 0x55,
0x9d, 0xbb, 0x78, 0x12, 0x08,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x08},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 175), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 175),
), ),
}, },
}, },
},
{ {
"fragmented followed by aggregated", "fragmented followed by aggregated",
[][]byte{ [][]byte{
@@ -195,30 +255,53 @@ var cases = []struct {
{0x09, 0xF0}, {0x09, 0xF0},
}, },
0, 0,
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x85, Marker: false,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x1c, 0x85},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
[]byte{0x00, 0x01}, []byte{0x00, 0x01},
), ),
mergeBytes(
[]byte{
0x80, 0x60, 0x44, 0xee, 0x88, 0x77, 0x66, 0x55,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x45,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x1c, 0x45},
[]byte{0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, []byte{0x02, 0x03, 0x04, 0x05, 0x06, 0x07},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 73), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 73),
), ),
},
{ {
0x80, 0xe0, 0x44, 0xef, 0x88, 0x77, 0x66, 0x55, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, 0x18, 0x00, 0x02, 0x09, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17647,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: []byte{
0x18, 0x00, 0x02, 0x09,
0xf0, 0x00, 0x02, 0x09, 0xf0, 0xf0, 0x00, 0x02, 0x09, 0xf0,
}, },
}, },
}, },
},
} }
func TestDecode(t *testing.T) { func TestDecode(t *testing.T) {
@@ -229,24 +312,26 @@ func TestDecode(t *testing.T) {
// send an initial packet downstream // send an initial packet downstream
// in order to compute the right timestamp, // in order to compute the right timestamp,
// that is relative to the initial packet // that is relative to the initial packet
var pkt rtp.Packet pkt := rtp.Packet{
err := pkt.Unmarshal([]byte{ Header: rtp.Header{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x06, 0x00, Marker: true,
}) PayloadType: 96,
require.NoError(t, err) SequenceNumber: 17645,
_, _, err = d.Decode(&pkt) Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x06, 0x00},
}
_, _, err := d.Decode(&pkt)
require.NoError(t, err) require.NoError(t, err)
var nalus [][]byte var nalus [][]byte
for _, byts := range ca.enc { for _, pkt := range ca.pkts {
err := pkt.Unmarshal(byts)
require.NoError(t, err)
clone := pkt.Clone() clone := pkt.Clone()
addNALUs, pts, err := d.Decode(&pkt) addNALUs, pts, err := d.Decode(pkt)
if err == ErrMorePacketsNeeded { if err == ErrMorePacketsNeeded {
continue continue
} }
@@ -255,8 +340,8 @@ func TestDecode(t *testing.T) {
require.Equal(t, ca.pts, pts) require.Equal(t, ca.pts, pts)
nalus = append(nalus, addNALUs...) nalus = append(nalus, addNALUs...)
// test packet integrity // test input integrity
require.Equal(t, clone, &pkt) require.Equal(t, clone, pkt)
} }
require.Equal(t, ca.nalus, nalus) require.Equal(t, ca.nalus, nalus)
@@ -267,45 +352,60 @@ func TestDecode(t *testing.T) {
func TestDecodePartOfFragmentedBeforeSingle(t *testing.T) { func TestDecodePartOfFragmentedBeforeSingle(t *testing.T) {
d := NewDecoder() d := NewDecoder()
var pkt rtp.Packet pkt := rtp.Packet{
err := pkt.Unmarshal(mergeBytes( Header: rtp.Header{
[]byte{ Version: 2,
0x80, 0xe0, 0x44, 0xef, 0x88, 0x77, 0x79, 0xab, Marker: true,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x45, PayloadType: 96,
SequenceNumber: 17647,
Timestamp: 2289531307,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x1c, 0x45},
[]byte{0x04, 0x05, 0x06, 0x07}, []byte{0x04, 0x05, 0x06, 0x07},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 147), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 147),
)) ),
require.NoError(t, err) }
_, _, err = d.Decode(&pkt) _, _, err := d.Decode(&pkt)
require.Equal(t, ErrNonStartingPacketAndNoPrevious, err) require.Equal(t, ErrNonStartingPacketAndNoPrevious, err)
err = pkt.Unmarshal(mergeBytes( pkt = rtp.Packet{
[]byte{ Header: rtp.Header{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6f, 0x1f, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x05, Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289528607,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x05},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8),
)) ),
require.NoError(t, err) }
_, _, err = d.Decode(&pkt) _, _, err = d.Decode(&pkt)
require.NoError(t, err) require.NoError(t, err)
} }
func TestDecodeSTAPAWithPadding(t *testing.T) { func TestDecodeSTAPAWithPadding(t *testing.T) {
d := NewDecoder() pkt := rtp.Packet{
Header: rtp.Header{
var pkt rtp.Packet Version: 2,
err := pkt.Unmarshal([]byte{ Marker: true,
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x66, 0x55, PayloadType: 96,
0x9d, 0xbb, 0x78, 0x12, 0x18, 0x00, 0x02, 0xaa, SequenceNumber: 17645,
Timestamp: 2289526357,
SSRC: 0x9dbb7812,
},
Payload: []byte{
0x18, 0x00, 0x02, 0xaa,
0xbb, 0x00, 0x02, 0xcc, 0xdd, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x02, 0xcc, 0xdd, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
}) },
require.NoError(t, err) }
nalus, _, err := NewDecoder().Decode(&pkt)
nalus, _, err := d.Decode(&pkt)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, [][]byte{ require.Equal(t, [][]byte{
{0xaa, 0xbb}, {0xaa, 0xbb},
@@ -316,145 +416,248 @@ func TestDecodeSTAPAWithPadding(t *testing.T) {
func TestDecodeErrors(t *testing.T) { func TestDecodeErrors(t *testing.T) {
for _, ca := range []struct { for _, ca := range []struct {
name string name string
pkts [][]byte pkts []*rtp.Packet
err string err string
}{ }{
{ {
"missing payload", "missing payload",
[][]byte{{ []*rtp.Packet{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, {
0x9d, 0xbb, 0x78, 0x12, Header: rtp.Header{
}}, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
},
},
"payload is too short", "payload is too short",
}, },
{ {
"STAP-A without NALUs", "STAP-A without NALUs",
[][]byte{{ []*rtp.Packet{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, {
0x9d, 0xbb, 0x78, 0x12, byte(naluTypeSTAPA), Header: rtp.Header{
}}, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x18},
},
},
"STAP-A packet doesn't contain any NALU", "STAP-A packet doesn't contain any NALU",
}, },
{ {
"STAP-A without size", "STAP-A without size",
[][]byte{{ []*rtp.Packet{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, {
0x9d, 0xbb, 0x78, 0x12, byte(naluTypeSTAPA), 0x01, Header: rtp.Header{
}}, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x18, 0x01},
},
},
"invalid STAP-A packet (invalid size)", "invalid STAP-A packet (invalid size)",
}, },
{ {
"STAP-A with invalid size", "STAP-A with invalid size",
[][]byte{{ []*rtp.Packet{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, {
0x9d, 0xbb, 0x78, 0x12, byte(naluTypeSTAPA), 0x00, 0x15, Header: rtp.Header{
}}, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x18, 0x00, 0x15},
},
},
"invalid STAP-A packet (invalid size)", "invalid STAP-A packet (invalid size)",
}, },
{ {
"FU-A without payload", "FU-A without payload",
[][]byte{{ []*rtp.Packet{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, {
0x9d, 0xbb, 0x78, 0x12, byte(naluTypeFUA), Header: rtp.Header{
}}, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x1c},
},
},
"invalid FU-A packet (invalid size)", "invalid FU-A packet (invalid size)",
}, },
{ {
"FU-A without start bit", "FU-A without start bit",
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6f, 0x1f, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x05, Marker: true,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x05},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8),
), ),
},
{ {
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, Header: rtp.Header{
0x9d, 0xbb, 0x78, 0x12, byte(naluTypeFUA), 0x00, Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x1c, 0x00},
}, },
}, },
"invalid FU-A packet (non-starting)", "invalid FU-A packet (non-starting)",
}, },
{ {
"FU-A with 2nd packet empty", "FU-A with 2nd packet empty",
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x79, 0xab, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x85, Marker: false,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x1c, 0x85},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
[]byte{0x00, 0x01}, []byte{0x00, 0x01},
), ),
mergeBytes(
[]byte{
0x80, 0xe0, 0x44, 0xee, 0x88, 0x77, 0x79, 0xab,
0x9d, 0xbb, 0x78, 0x12,
}, },
), {
Header: rtp.Header{
Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
},
}, },
"invalid FU-A packet (invalid size)", "invalid FU-A packet (invalid size)",
}, },
{ {
"FU-A with 2nd packet invalid", "FU-A with 2nd packet invalid",
[][]byte{ []*rtp.Packet{
mergeBytes( {
Header: rtp.Header{
Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{ []byte{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x79, 0xab, 0x1c, 0x85,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x85,
}, },
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
[]byte{0x00, 0x01}, []byte{0x00, 0x01},
), ),
mergeBytes(
[]byte{
0x80, 0xe0, 0x44, 0xee, 0x88, 0x77, 0x79, 0xab,
0x9d, 0xbb, 0x78, 0x12, 0x01, 0x00,
}, },
), {
Header: rtp.Header{
Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x01, 0x00},
},
}, },
"expected FU-A packet, got another type", "expected FU-A packet, got another type",
}, },
{ {
"FU-A with two starting packets", "FU-A with two starting packets",
[][]byte{ []*rtp.Packet{
mergeBytes( {
[]byte{ Header: rtp.Header{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x79, 0xab, Version: 2,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x85, Marker: false,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
}, },
Payload: mergeBytes(
[]byte{0x1c, 0x85},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
[]byte{0x00, 0x01}, []byte{0x00, 0x01},
), ),
mergeBytes(
[]byte{
0x80, 0x60, 0x44, 0xed, 0x88, 0x77, 0x79, 0xab,
0x9d, 0xbb, 0x78, 0x12, 0x1c, 0x85,
}, },
{
Header: rtp.Header{
Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17646,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: mergeBytes(
[]byte{0x1c, 0x85},
bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182), bytes.Repeat([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 182),
[]byte{0x00, 0x01}, []byte{0x00, 0x01},
), ),
}, },
},
"invalid FU-A packet (decoded two starting packets in a row)", "invalid FU-A packet (decoded two starting packets in a row)",
}, },
{ {
"MTAP", "MTAP",
[][]byte{{ []*rtp.Packet{
0x80, 0xe0, 0x44, 0xed, 0x88, 0x77, 0x6a, 0x15, {
0x9d, 0xbb, 0x78, 0x12, byte(naluTypeMTAP16), Header: rtp.Header{
}}, Version: 2,
Marker: false,
PayloadType: 96,
SequenceNumber: 17645,
Timestamp: 2289527317,
SSRC: 0x9dbb7812,
},
Payload: []byte{0x1a},
},
},
"packet type not supported (MTAP-16)", "packet type not supported (MTAP-16)",
}, },
} { } {
t.Run(ca.name, func(t *testing.T) { t.Run(ca.name, func(t *testing.T) {
d := NewDecoder() d := NewDecoder()
var lastErr error var lastErr error
for _, byts := range ca.pkts { for _, pkt := range ca.pkts {
var pkt rtp.Packet _, _, lastErr = d.Decode(pkt)
err := pkt.Unmarshal(byts)
require.NoError(t, err)
_, _, lastErr = d.Decode(&pkt)
} }
require.EqualError(t, lastErr, ca.err) require.EqualError(t, lastErr, ca.err)
}) })
@@ -469,17 +672,9 @@ func TestEncode(t *testing.T) {
initialTs := uint32(0x88776655) initialTs := uint32(0x88776655)
e := NewEncoder(96, &sequenceNumber, &ssrc, &initialTs) e := NewEncoder(96, &sequenceNumber, &ssrc, &initialTs)
enc, err := e.Encode(ca.nalus, ca.pts) pkts, err := e.Encode(ca.nalus, ca.pts)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, ca.pkts, pkts)
var bytss [][]byte
for _, pkt := range enc {
byts, err := pkt.Marshal()
require.NoError(t, err)
bytss = append(bytss, byts)
}
require.Equal(t, ca.enc, bytss)
}) })
} }
} }