From 659be05a1fcce45d3e1af616cca764acd97f38a9 Mon Sep 17 00:00:00 2001 From: Saxon Date: Thu, 2 May 2019 00:15:24 +0930 Subject: [PATCH] codec/h264: using table based testing, and now also testing for when DON is being used. --- codec/h265/lex_test.go | 304 +++++++++++++++++++++++++---------------- 1 file changed, 184 insertions(+), 120 deletions(-) diff --git a/codec/h265/lex_test.go b/codec/h265/lex_test.go index d78eddb4..a7c49b7b 100644 --- a/codec/h265/lex_test.go +++ b/codec/h265/lex_test.go @@ -30,21 +30,19 @@ package h265 import ( "io" "testing" - - "bitbucket.org/ausocean/av/protocol/rtp" ) type rtpReader struct { - pkts []rtp.Pkt - idx int + packets [][]byte + idx int } func (r *rtpReader) Read(p []byte) (int, error) { - if r.idx == len(r.pkts) { + if r.idx == len(r.packets) { return 0, io.EOF } - b := r.pkts[r.idx].Bytes(nil) - copy(p, r.pkts[r.idx].Bytes(nil)) + b := r.packets[r.idx] + copy(p, b) r.idx++ return len(b), nil } @@ -58,130 +56,196 @@ func (d *destination) Write(p []byte) (int, error) { return len(p), nil } -func TestLexNo(t *testing.T) { +func TestLex(t *testing.T) { const rtpVer = 2 - packets := []rtp.Pkt{ - // Singla NAL - rtp.Pkt{ - V: rtpVer, - Payload: []byte{ - 0x40, 0x00, // NAL header (type=32 VPS). - 0x01, 0x02, 0x03, 0x04, // NAL Data. - }, - }, - // Fragmentation (start packet). - rtp.Pkt{ - V: rtpVer, - Payload: []byte{ - 0x62, 0x00, // NAL header (type49). - 0x80, // FU header. - 0x01, 0x02, 0x03, // FU payload. - }, - }, - - // Fragmentation (middle packet) - rtp.Pkt{ - V: rtpVer, - Payload: []byte{ - 0x62, 0x00, // NAL header (type 49). - 0x00, // FU header. - 0x04, 0x05, 0x06, // FU payload. - }, - }, - - // Fragmentation (end packet) - rtp.Pkt{ - V: rtpVer, - Payload: []byte{ - 0x62, 0x00, // NAL header (type 49). - 0x40, // FU header. - 0x07, 0x08, 0x09, // FU payload - }, - }, - - // Aggregation. - // Consider last packet of access unit - M true - rtp.Pkt{ - V: rtpVer, - M: true, - Payload: []byte{ - 0x60, 0x00, // NAL header (type 49). - 0x00, 0x04, // NAL 1 size. - 0x01, 0x02, 0x03, 0x04, // NAL 1 data. - 0x00, 0x04, // NAL 2 size. - 0x01, 0x02, 0x03, 0x04, // NAL 2 data. - }, - }, - - // Singla NAL - rtp.Pkt{ - V: rtpVer, - Payload: []byte{ - 0x40, 0x00, // NAL header (type=32 VPS). - 0x01, 0x02, 0x03, 0x04, // NAL data. - }, - }, - - // Singla NAL - rtp.Pkt{ - V: rtpVer, - M: true, - Payload: []byte{ - 0x40, 0x00, // NAL header (type=32 VPS). - 0x01, 0x02, 0x03, 0x04, // NAL data. - }, - }, - } - - expect := [][]byte{ - // First access unit. + tests := []struct { + don bool + packets [][]byte + expect [][]byte + }{ { - // NAL 1 - 0x00, 0x00, 0x00, 0x01, // Start code. - 0x40, 0x00, // NAL header (type=32 VPS). - 0x01, 0x02, 0x03, 0x04, // NAL data. + don: false, + packets: [][]byte{ + { // Single NAL unit. + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x01, 0x02, 0x03, 0x04, // NAL Data. + }, + { // Fragmentation (start packet). + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x62, 0x00, // NAL header (type49). + 0x80, // FU header. + 0x01, 0x02, 0x03, // FU payload. + }, + { // Fragmentation (middle packet) + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x62, 0x00, // NAL header (type 49). + 0x00, // FU header. + 0x04, 0x05, 0x06, // FU payload. + }, + { // Fragmentation (end packet) + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x62, 0x00, // NAL header (type 49). + 0x40, // FU header. + 0x07, 0x08, 0x09, // FU payload + }, - // NAL 2 - 0x00, 0x00, 0x00, 0x01, // Start code. - 0x01, 0x02, 0x03, // FU payload. - 0x04, 0x05, 0x06, // FU payload. - 0x07, 0x08, 0x09, // FU payload. - - // NAL 3 - 0x00, 0x00, 0x00, 0x01, // Start code. - 0x01, 0x02, 0x03, 0x04, // NAL data. - - // NAL 4 - 0x00, 0x00, 0x00, 0x01, // Start code. - 0x01, 0x02, 0x03, 0x04, // NAL 2 data + { // Aggregation. Make last packet of access unit => marker bit true. + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x60, 0x00, // NAL header (type 49). + 0x00, 0x04, // NAL 1 size. + 0x01, 0x02, 0x03, 0x04, // NAL 1 data. + 0x00, 0x04, // NAL 2 size. + 0x01, 0x02, 0x03, 0x04, // NAL 2 data. + }, + { // Singla NAL + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x01, 0x02, 0x03, 0x04, // NAL data. + }, + { // Singla NAL. Make last packet of access unit => marker bit true. + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x01, 0x02, 0x03, 0x04, // NAL data. + }, + }, + expect: [][]byte{ + // First access unit. + { + // NAL 1 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x01, 0x02, 0x03, 0x04, // NAL data. + // NAL 2 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x01, 0x02, 0x03, // FU payload. + 0x04, 0x05, 0x06, // FU payload. + 0x07, 0x08, 0x09, // FU payload. + // NAL 3 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x01, 0x02, 0x03, 0x04, // NAL data. + // NAL 4 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x01, 0x02, 0x03, 0x04, // NAL 2 data + }, + // Second access unit. + { + // NAL 1 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x01, 0x02, 0x03, 0x04, // Data. + // NAL 2 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x01, 0x02, 0x03, 0x04, // Data. + }, + }, }, - // Second access unit. { - // NAL 1 - 0x00, 0x00, 0x00, 0x01, // Start code. - 0x40, 0x00, // NAL header (type=32 VPS). - 0x01, 0x02, 0x03, 0x04, // Data. + don: true, + packets: [][]byte{ + { // Single NAL unit. + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x00, 0x00, // DONL + 0x01, 0x02, 0x03, 0x04, // NAL Data. + }, + { // Fragmentation (start packet). + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x62, 0x00, // NAL header (type49). + 0x80, // FU header. + 0x00, 0x00, // DONL + 0x01, 0x02, 0x03, // FU payload. + }, + { // Fragmentation (middle packet) + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x62, 0x00, // NAL header (type 49). + 0x00, // FU header. + 0x00, 0x00, // DONL + 0x04, 0x05, 0x06, // FU payload. + }, + { // Fragmentation (end packet) + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x62, 0x00, // NAL header (type 49). + 0x40, // FU header. + 0x00, 0x00, // DONL + 0x07, 0x08, 0x09, // FU payload + }, - // NAL 2 - 0x00, 0x00, 0x00, 0x01, // Start code. - 0x40, 0x00, // NAL header (type=32 VPS). - 0x01, 0x02, 0x03, 0x04, // Data. + { // Aggregation. Make last packet of access unit => marker bit true. + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x60, 0x00, // NAL header (type 49). + 0x00, 0x00, // DONL + 0x00, 0x04, // NAL 1 size. + 0x01, 0x02, 0x03, 0x04, // NAL 1 data. + 0x00, // DOND + 0x00, 0x04, // NAL 2 size. + 0x01, 0x02, 0x03, 0x04, // NAL 2 data. + }, + { // Singla NAL + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x40, 0x00, // NAL header (type=32 VPS) + 0x00, 0x00, // DONL. + 0x01, 0x02, 0x03, 0x04, // NAL data. + }, + { // Singla NAL. Make last packet of access unit => marker bit true. + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RTP header. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x00, 0x00, // DONL + 0x01, 0x02, 0x03, 0x04, // NAL data. + }, + }, + expect: [][]byte{ + // First access unit. + { + // NAL 1 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x00, 0x00, // DONL + 0x01, 0x02, 0x03, 0x04, // NAL data. + // NAL 2 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x01, 0x02, 0x03, // FU payload. + 0x04, 0x05, 0x06, // FU payload. + 0x07, 0x08, 0x09, // FU payload. + // NAL 3 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x01, 0x02, 0x03, 0x04, // NAL data. + // NAL 4 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x01, 0x02, 0x03, 0x04, // NAL 2 data + }, + // Second access unit. + { + // NAL 1 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x00, 0x00, // DONL + 0x01, 0x02, 0x03, 0x04, // Data. + // NAL 2 + 0x00, 0x00, 0x00, 0x01, // Start code. + 0x40, 0x00, // NAL header (type=32 VPS). + 0x00, 0x00, // DONL + 0x01, 0x02, 0x03, 0x04, // Data. + }, + }, }, } - r := &rtpReader{pkts: packets} - d := &destination{} - l := Lexer{UsingDON: false} - err := l.Lex(d, r, 0) - if err != nil { - t.Fatalf("error lexing: %v\n", err) - } + for testNum, test := range tests { + r := &rtpReader{packets: test.packets} + d := &destination{} + err := (&Lexer{UsingDON: test.don}).Lex(d, r, 0) + if err != nil { + t.Fatalf("error lexing: %v\n", err) + } - for i, au := range expect { - for j, b := range au { - if b != [][]byte(*d)[i][j] { - t.Fatalf("did not get expected data.\nGot: %v\nWant: %v\n", d, expect) + for i, accessUnit := range test.expect { + for j, part := range accessUnit { + if part != [][]byte(*d)[i][j] { + t.Fatalf("did not get expected data for test: %v.\nGot: %v\nWant: %v\n", testNum, d, test.expect) + } } } }