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