Skip to content

Implement automatic and explicit bandwidth selection#152

Merged
thomas-vilte merged 1 commit into
mainfrom
feat/opus-bandwidth-control
Jul 16, 2026
Merged

Implement automatic and explicit bandwidth selection#152
thomas-vilte merged 1 commit into
mainfrom
feat/opus-bandwidth-control

Conversation

@thomas-vilte

Copy link
Copy Markdown
Member

Description

Adds WithBandwidth/SetBandwidth (explicit NB/WB/SWB/FB — mediumband gets rejected, CELT-only doesn't have a mediumband TOC config) and WithMaxBandwidth/SetMaxBandwidth (caps auto-selection without forcing a fixed bandwidth). Default stays BandwidthAuto.

Auto-select picks a bandwidth from the target bitrate using the same thresholds as libopus's voice profile (9000/13500/14000 bps, opus_encoder.c). First pass compared those against the raw configured bitrate, which is wrong — libopus compares against equiv_rate, not bitrate, which docks ~8% for CBR and scales by complexity. Ported compute_equiv_rate (skipped the frame-rate-overhead term, doesn't apply since we're fixed at 20ms/50fps, and skipped the "CELT complexity<5 has no pitch filter" penalty since our pre-filter always runs regardless of complexity now). TOC config numbers for CELT-only 20ms are 19/23/27/31 per bandwidth, matches the existing frameDuration() table in this same file.

Also fixed a default that got lost somewhere in #150: opus.NewEncoder() was defaulting complexity to 0 and stomping celt.NewEncoder()'s own correct default of 5 via SetComplexity(0). Rolling it in here since I'm already touching that same struct literal for the new bandwidth fields — meant every encoder built without an explicit WithComplexity was silently getting SPREAD_NONE instead of the real spreading analysis.

Reference issue

Fixes #...

@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown

Encoder Quality Report

Status: pass

Tier 1 — SNR regression (96 kbps, pion encode → pion decode)

Delta = baseline − current SNR; positive = regression. Fail threshold: 1.5 dB.

Signal SNR (dB) Baseline (dB) Delta Status
chirp 3.5 3.5 +0.0 OK
harmonics -0.7 -0.6 +0.1 OK
burst -2.5 -2.5 -0.0 OK
shaped_noise 0.6 0.6 -0.0 OK
onset -2.4 -2.4 +0.0 OK

Tier 2 — opus_compare vs libopus (96 kbps CBR)

Weighted error: lower is better. The gap reflects pion lacking constrained VBR; libopus ships with it enabled by default.

Signal pion weighted error ↓ libopus weighted error ↓
chirp 468.229863 0.109468
harmonics 10.999708 0.012980
burst 90.532116 2.192852
shaped_noise 2.106220 0.234622
onset 90.788442 0.524139
Run output
=== RUN   TestEncoderQuality
    encoder_quality_test.go:137: loaded baseline: version=1 bitrate=96000 signals=5
=== RUN   TestEncoderQuality/chirp
=== PAUSE TestEncoderQuality/chirp
=== RUN   TestEncoderQuality/harmonics
=== PAUSE TestEncoderQuality/harmonics
=== RUN   TestEncoderQuality/burst
=== PAUSE TestEncoderQuality/burst
=== RUN   TestEncoderQuality/shaped_noise
=== PAUSE TestEncoderQuality/shaped_noise
=== RUN   TestEncoderQuality/onset
=== PAUSE TestEncoderQuality/onset
=== CONT  TestEncoderQuality/chirp
=== CONT  TestEncoderQuality/shaped_noise
=== CONT  TestEncoderQuality/onset
=== CONT  TestEncoderQuality/burst
=== NAME  TestEncoderQuality/onset
    encoder_quality_test.go:159: signal=onset SNR=-2.4 dB
    encoder_quality_test.go:166: baseline=-2.4 dB delta=0.0 dB threshold=1.5 dB
=== CONT  TestEncoderQuality/harmonics
=== NAME  TestEncoderQuality/burst
    encoder_quality_test.go:159: signal=burst SNR=-2.5 dB
    encoder_quality_test.go:166: baseline=-2.5 dB delta=-0.0 dB threshold=1.5 dB
=== NAME  TestEncoderQuality/chirp
    encoder_quality_test.go:159: signal=chirp SNR=3.5 dB
    encoder_quality_test.go:166: baseline=3.5 dB delta=0.0 dB threshold=1.5 dB
=== NAME  TestEncoderQuality/shaped_noise
    encoder_quality_test.go:159: signal=shaped_noise SNR=0.6 dB
    encoder_quality_test.go:166: baseline=0.6 dB delta=-0.0 dB threshold=1.5 dB
=== NAME  TestEncoderQuality/harmonics
    encoder_quality_test.go:159: signal=harmonics SNR=-0.7 dB
    encoder_quality_test.go:166: baseline=-0.6 dB delta=0.1 dB threshold=1.5 dB
--- PASS: TestEncoderQuality (0.00s)
    --- PASS: TestEncoderQuality/onset (0.12s)
    --- PASS: TestEncoderQuality/burst (0.12s)
    --- PASS: TestEncoderQuality/chirp (0.16s)
    --- PASS: TestEncoderQuality/shaped_noise (0.16s)
    --- PASS: TestEncoderQuality/harmonics (0.12s)
PASS
ok  	github.com/pion/opus	0.247s
=== RUN   TestEncoderQualityVsReference
    encoder_conformance_test.go:410: loaded baseline: version=1 bitrate=96000 signals=5
=== RUN   TestEncoderQualityVsReference/chirp
=== PAUSE TestEncoderQualityVsReference/chirp
=== RUN   TestEncoderQualityVsReference/harmonics
=== PAUSE TestEncoderQualityVsReference/harmonics
=== RUN   TestEncoderQualityVsReference/burst
=== PAUSE TestEncoderQualityVsReference/burst
=== RUN   TestEncoderQualityVsReference/shaped_noise
=== PAUSE TestEncoderQualityVsReference/shaped_noise
=== RUN   TestEncoderQualityVsReference/onset
=== PAUSE TestEncoderQualityVsReference/onset
=== CONT  TestEncoderQualityVsReference/chirp
=== CONT  TestEncoderQualityVsReference/shaped_noise
=== CONT  TestEncoderQualityVsReference/onset
=== CONT  TestEncoderQualityVsReference/burst
    encoder_conformance_test.go:448: pion quality= weighted_error=90.532116
=== NAME  TestEncoderQualityVsReference/onset
    encoder_conformance_test.go:448: pion quality= weighted_error=90.788442
=== NAME  TestEncoderQualityVsReference/shaped_noise
    encoder_conformance_test.go:448: pion quality= weighted_error=2.106220
=== NAME  TestEncoderQualityVsReference/chirp
    encoder_conformance_test.go:448: pion quality= weighted_error=468.229863
=== NAME  TestEncoderQualityVsReference/burst
    encoder_conformance_test.go:473: libopus quality= weighted_error=2.192852
=== CONT  TestEncoderQualityVsReference/harmonics
=== NAME  TestEncoderQualityVsReference/onset
    encoder_conformance_test.go:473: libopus quality= weighted_error=0.524139
=== NAME  TestEncoderQualityVsReference/shaped_noise
    encoder_conformance_test.go:473: libopus quality=13.8 weighted_error=0.234622
=== NAME  TestEncoderQualityVsReference/chirp
    encoder_conformance_test.go:473: libopus quality=57.5 weighted_error=0.109468
=== NAME  TestEncoderQualityVsReference/harmonics
    encoder_conformance_test.go:448: pion quality= weighted_error=10.999708
    encoder_conformance_test.go:473: libopus quality=94.7 weighted_error=0.012980
--- PASS: TestEncoderQualityVsReference (12.75s)
    --- PASS: TestEncoderQualityVsReference/burst (1.87s)
    --- PASS: TestEncoderQualityVsReference/onset (1.88s)
    --- PASS: TestEncoderQualityVsReference/shaped_noise (1.90s)
    --- PASS: TestEncoderQualityVsReference/chirp (1.91s)
    --- PASS: TestEncoderQualityVsReference/harmonics (1.18s)
PASS
ok  	github.com/pion/opus	15.809s

Baseline: testdata/encoder-quality-baseline.json

@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.66667% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.04%. Comparing base (824ab85) to head (e812e31).

Files with missing lines Patch % Lines
decoder.go 0.00% 2 Missing ⚠️
encoder.go 97.05% 1 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #152      +/-   ##
==========================================
+ Coverage   87.96%   88.04%   +0.08%     
==========================================
  Files          32       32              
  Lines        7692     7762      +70     
==========================================
+ Hits         6766     6834      +68     
- Misses        700      702       +2     
  Partials      226      226              
Flag Coverage Δ
go 88.04% <94.66%> (+0.08%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown

RFC 6716 / 8251 conformation

Status: pass

The action extracts the RFC 6716 reference implementation, applies the RFC 8251 decoder update patch, and then builds the patched reference tools.

Legend: numeric cells are opus_compare quality percentages; FAIL means the vector did not pass.

Inputs use the shared RFC 6716 / RFC 8251 bitstream corpus; accepted references follow RFC 8251 Section 11.

rate ch 01 02 03 04 05 06 07 08 09 10 11 12
8000 1 91.4 59.7 66.3 75.1 75.0 67.8 76.0 70.0 75.5 85.9 91.0 43.4
8000 2 93.3 57.6 66.1 75.3 75.2 67.9 76.0 70.4 76.2 86.0 93.0 43.7
12000 1 95.6 83.4 71.8 79.1 77.0 69.0 85.1 81.6 84.8 88.1 94.9 66.0
12000 2 96.0 83.3 71.3 79.2 77.3 69.1 85.1 81.8 85.2 87.0 95.8 66.1
16000 1 95.3 91.4 88.1 81.6 77.2 68.9 89.9 86.2 78.8 89.5 96.3 56.5
16000 2 94.7 90.7 88.1 80.6 77.6 69.1 89.8 87.6 78.9 87.5 96.4 56.7
24000 1 96.7 92.0 83.2 85.9 77.5 68.4 93.9 92.4 89.2 95.4 97.9 68.5
24000 2 96.8 90.6 82.8 86.1 77.8 68.8 93.9 93.5 92.1 87.7 98.1 68.6
48000 1 98.4 92.1 87.7 85.9 77.4 68.3 98.1 96.2 95.9 96.0 98.4 88.8
48000 2 99.8 90.6 87.8 86.1 77.7 68.6 99.6 93.7 94.4 87.7 99.7 88.9
Run output
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09: Opus quality metric: 76.2 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08: Opus quality metric: 70.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07: Opus quality metric: 76.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06: Opus quality metric: 67.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05: Opus quality metric: 75.2 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03: Opus quality metric: 66.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04: Opus quality metric: 75.3 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12: Opus quality metric: 43.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02: Opus quality metric: 57.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11: Opus quality metric: 91.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01: Opus quality metric: 93.3 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10: Opus quality metric: 85.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09: Opus quality metric: 75.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08: Opus quality metric: 70.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07: Opus quality metric: 76.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06: Opus quality metric: 67.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05: Opus quality metric: 75.0 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04: Opus quality metric: 75.1 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03: Opus quality metric: 66.3 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02: Opus quality metric: 59.7 %
Opus conformance matrix
Legend: numeric cells are opus_compare quality percentages; FAIL means the vector did not pass.
Inputs use the shared RFC 6716 / RFC 8251 bitstream corpus; accepted references follow RFC 8251 Section 11.
+----------+----+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| rate     | ch | 01    | 02    | 03    | 04    | 05    | 06    | 07    | 08    | 09    | 10    | 11    | 12    |
+----------+----+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| 8000     | 1  | 91.4  | 59.7  | 66.3  | 75.1  | 75.0  | 67.8  | 76.0  | 70.0  | 75.5  | 85.9  | 91.0  | 43.4  |
| 8000     | 2  | 93.3  | 57.6  | 66.1  | 75.3  | 75.2  | 67.9  | 76.0  | 70.4  | 76.2  | 86.0  | 93.0  | 43.7  |
| 12000    | 1  | 95.6  | 83.4  | 71.8  | 79.1  | 77.0  | 69.0  | 85.1  | 81.6  | 84.8  | 88.1  | 94.9  | 66.0  |
| 12000    | 2  | 96.0  | 83.3  | 71.3  | 79.2  | 77.3  | 69.1  | 85.1  | 81.8  | 85.2  | 87.0  | 95.8  | 66.1  |
| 16000    | 1  | 95.3  | 91.4  | 88.1  | 81.6  | 77.2  | 68.9  | 89.9  | 86.2  | 78.8  | 89.5  | 96.3  | 56.5  |
| 16000    | 2  | 94.7  | 90.7  | 88.1  | 80.6  | 77.6  | 69.1  | 89.8  | 87.6  | 78.9  | 87.5  | 96.4  | 56.7  |
| 24000    | 1  | 96.7  | 92.0  | 83.2  | 85.9  | 77.5  | 68.4  | 93.9  | 92.4  | 89.2  | 95.4  | 97.9  | 68.5  |
| 24000    | 2  | 96.8  | 90.6  | 82.8  | 86.1  | 77.8  | 68.8  | 93.9  | 93.5  | 92.1  | 87.7  | 98.1  | 68.6  |
| 48000    | 1  | 98.4  | 92.1  | 87.7  | 85.9  | 77.4  | 68.3  | 98.1  | 96.2  | 95.9  | 96.0  | 98.4  | 88.8  |
| 48000    | 2  | 99.8  | 90.6  | 87.8  | 86.1  | 77.7  | 68.6  | 99.6  | 93.7  | 94.4  | 87.7  | 99.7  | 88.9  |
+----------+----+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
--- PASS: TestRFC6716Conformance (121.21s)
    --- PASS: TestRFC6716Conformance/vectors (0.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector01 (2.24s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector03 (5.63s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector06 (6.83s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector08 (7.44s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector02 (6.67s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector05 (7.37s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector07 (6.15s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector04 (7.14s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector12 (7.13s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector11 (8.04s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector09 (7.43s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector10 (8.68s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector01 (7.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector12 (3.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector11 (4.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector10 (4.50s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector09 (3.84s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector08 (3.69s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector07 (3.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector06 (3.48s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector03 (2.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector05 (3.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector04 (3.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector02 (3.36s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector01 (4.11s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector12 (4.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector11 (5.31s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector10 (5.75s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector09 (4.95s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector08 (4.80s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector07 (4.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector06 (4.48s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector03 (3.68s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector05 (4.85s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector04 (4.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector12 (2.39s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector02 (4.36s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector11 (2.72s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector01 (5.30s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector09 (2.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector10 (2.98s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector08 (2.45s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector07 (2.07s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector06 (2.34s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector04 (2.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector05 (2.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector03 (1.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector02 (2.20s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector01 (2.78s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector12 (4.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector11 (4.63s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector10 (5.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector09 (4.32s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector08 (4.19s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector07 (3.50s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector06 (3.90s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector05 (4.22s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03 (3.20s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04 (4.02s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector12 (2.05s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02 (3.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector11 (2.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector01 (4.62s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector08 (2.16s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector10 (2.62s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector09 (2.25s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector07 (1.81s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector06 (2.02s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector04 (2.06s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector05 (2.18s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector03 (1.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector02 (1.91s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector01 (2.43s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector12 (3.80s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector11 (4.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector09 (4.07s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector10 (4.75s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector08 (3.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector07 (3.31s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector06 (3.71s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector05 (4.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector03 (3.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector04 (3.82s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector12 (1.94s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector02 (3.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector11 (2.27s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector01 (4.36s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector10 (2.49s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector09 (2.13s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector08 (2.03s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector07 (1.72s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector06 (1.93s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector04 (1.97s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector05 (2.09s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector03 (1.54s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector02 (1.80s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector01 (2.31s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector12 (3.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector11 (4.23s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector10 (4.59s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09 (3.94s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08 (3.84s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07 (3.18s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06 (3.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05 (3.91s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03 (2.90s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04 (3.68s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12 (1.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02 (3.43s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11 (2.19s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01 (4.21s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10 (2.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09 (2.06s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08 (1.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07 (1.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06 (1.89s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05 (2.05s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04 (1.81s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03 (1.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02 (1.35s)
=== RUN   TestRFC6716ConformanceEncoder
=== RUN   TestRFC6716ConformanceEncoder/mono_sine
TestRFC6716ConformanceEncoder/mono_sine: Opus quality metric: 99.8 %
TestRFC6716ConformanceEncoder/mono_sine: Go encoder vs original: below quality threshold, weighted error 42.373575 (delay 447 samples)
TestRFC6716ConformanceEncoder/mono_sine: reference encoder vs original: below quality threshold, weighted error 0.300608 (delay 312 samples)
=== RUN   TestRFC6716ConformanceEncoder/stereo_tones
TestRFC6716ConformanceEncoder/stereo_tones: Opus quality metric: 99.9 %
TestRFC6716ConformanceEncoder/stereo_tones: Go encoder vs original: below quality threshold, weighted error 34.084201 (delay 337 samples)
TestRFC6716ConformanceEncoder/stereo_tones: reference encoder vs original: below quality threshold, weighted error 0.383133 (delay 312 samples)
=== RUN   TestRFC6716ConformanceEncoder/stereo_wide
TestRFC6716ConformanceEncoder/stereo_wide: Opus quality metric: 99.8 %
TestRFC6716ConformanceEncoder/stereo_wide: Go encoder vs original: below quality threshold, weighted error 68.755115 (delay 231 samples)
TestRFC6716ConformanceEncoder/stereo_wide: reference encoder vs original: below quality threshold, weighted error 0.611077 (delay 312 samples)
=== RUN   TestRFC6716ConformanceEncoder/stereo_broadband_low_bitrate
TestRFC6716ConformanceEncoder/stereo_broadband_low_bitrate: Opus quality metric: 100.0 %
TestRFC6716ConformanceEncoder/stereo_broadband_low_bitrate: Go encoder vs original: below quality threshold, weighted error 2.183648 (delay 120 samples)
TestRFC6716ConformanceEncoder/stereo_broadband_low_bitrate: reference encoder vs original: below quality threshold, weighted error 0.910593 (delay 1712 samples)
--- PASS: TestRFC6716ConformanceEncoder (18.54s)
    --- PASS: TestRFC6716ConformanceEncoder/mono_sine (1.55s)
    --- PASS: TestRFC6716ConformanceEncoder/stereo_tones (1.57s)
    --- PASS: TestRFC6716ConformanceEncoder/stereo_wide (1.57s)
    --- PASS: TestRFC6716ConformanceEncoder/stereo_broadband_low_bitrate (1.55s)
PASS
ok  	github.com/pion/opus	139.754s

@thomas-vilte
thomas-vilte force-pushed the feat/opus-bandwidth-control branch from f96e9f1 to e812e31 Compare July 16, 2026 17:51
@thomas-vilte
thomas-vilte requested a review from FrantaBOT July 16, 2026 17:58
@thomas-vilte
thomas-vilte merged commit 44da8bb into main Jul 16, 2026
21 checks passed
@thomas-vilte
thomas-vilte deleted the feat/opus-bandwidth-control branch July 16, 2026 18:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants