telegabber/calls/audio/fmtp_test.go
2026-05-27 08:37:47 -07:00

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)
}
})
}
}