mirror of
https://dev.narayana.im/narayana/telegabber.git
synced 2026-08-05 12:17:06 +00:00
131 lines
2.8 KiB
Go
131 lines
2.8 KiB
Go
package audio
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestApplyFmtpConfiguresEncoder(t *testing.T) {
|
|
// Verify the encoder's libopus state actually reflects the requested
|
|
// settings, not just that ApplyTo returned nil.
|
|
cases := []struct {
|
|
name string
|
|
in string
|
|
// checks accept the encoder and report any mismatches.
|
|
check func(t *testing.T, e *Encoder)
|
|
}{
|
|
{
|
|
"default bitrate when missing",
|
|
"",
|
|
func(t *testing.T, e *Encoder) {
|
|
br, err := e.Bitrate()
|
|
if err != nil {
|
|
t.Fatalf("Bitrate: %v", err)
|
|
}
|
|
if br != DefaultBitrate {
|
|
t.Errorf("Bitrate=%d, want %d", br, DefaultBitrate)
|
|
}
|
|
},
|
|
},
|
|
{
|
|
"useinbandfec sets FEC and loss perc",
|
|
"useinbandfec=1",
|
|
func(t *testing.T, e *Encoder) {
|
|
fec, err := e.InBandFEC()
|
|
if err != nil {
|
|
t.Fatalf("InBandFEC: %v", err)
|
|
}
|
|
if !fec {
|
|
t.Error("InBandFEC=false, want true")
|
|
}
|
|
lp, err := e.PacketLossPerc()
|
|
if err != nil {
|
|
t.Fatalf("PacketLossPerc: %v", err)
|
|
}
|
|
if lp != 5 {
|
|
t.Errorf("PacketLossPerc=%d, want 5", lp)
|
|
}
|
|
},
|
|
},
|
|
{
|
|
"usedtx sets DTX",
|
|
"usedtx=1",
|
|
func(t *testing.T, e *Encoder) {
|
|
dtx, err := e.DTX()
|
|
if err != nil {
|
|
t.Fatalf("DTX: %v", err)
|
|
}
|
|
if !dtx {
|
|
t.Error("DTX=false, want true")
|
|
}
|
|
},
|
|
},
|
|
{
|
|
"maxaveragebitrate sets bitrate",
|
|
"maxaveragebitrate=20000",
|
|
func(t *testing.T, e *Encoder) {
|
|
br, err := e.Bitrate()
|
|
if err != nil {
|
|
t.Fatalf("Bitrate: %v", err)
|
|
}
|
|
if br != 20000 {
|
|
t.Errorf("Bitrate=%d, want 20000", br)
|
|
}
|
|
},
|
|
},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
enc, err := NewEncoder()
|
|
if err != nil {
|
|
t.Fatalf("NewEncoder: %v", err)
|
|
}
|
|
if err := ParseFmtp(tc.in).ApplyTo(enc); err != nil {
|
|
t.Fatalf("Apply(%q): %v", tc.in, err)
|
|
}
|
|
tc.check(t, enc)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestExtractOpusFmtp(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
sdp string
|
|
want string
|
|
}{
|
|
{
|
|
"matched opus pt",
|
|
"v=0\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\n",
|
|
"minptime=10;useinbandfec=1",
|
|
},
|
|
{
|
|
"rtpmap after fmtp",
|
|
"a=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:111 opus/48000/2\r\n",
|
|
"minptime=10;useinbandfec=1",
|
|
},
|
|
{
|
|
"multiple codecs, opus matched",
|
|
"a=rtpmap:0 PCMU/8000\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 stereo=1;sprop-stereo=1\r\na=fmtp:0 unrelated=1\r\n",
|
|
"stereo=1;sprop-stereo=1",
|
|
},
|
|
{
|
|
"no opus -> empty",
|
|
"a=rtpmap:0 PCMU/8000\r\na=fmtp:0 unrelated=1\r\n",
|
|
"",
|
|
},
|
|
{
|
|
"opus without fmtp -> empty",
|
|
"a=rtpmap:111 opus/48000/2\r\n",
|
|
"",
|
|
},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
got := ExtractOpusFmtp(tc.sdp)
|
|
if got != tc.want {
|
|
t.Errorf("ExtractOpusFmtp:\n got %q\nwant %q", got, tc.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|