Skip to content

Wire SetComplexity to the spreading decision#150

Merged
thomas-vilte merged 2 commits into
mainfrom
feat/opus-complexity-levels
Jul 16, 2026
Merged

Wire SetComplexity to the spreading decision#150
thomas-vilte merged 2 commits into
mainfrom
feat/opus-complexity-levels

Conversation

@thomas-vilte

Copy link
Copy Markdown
Member

Description

``SetComplexity/WithComplexity` existed since #117 but were pure no-ops — the CELT encoder never looked at the value. This makes complexity actually do something, and bumps the default from 0 to 5 to match libopus's own default (`st->complexity = 5` in `celt_encoder.c`).

First pass I gated the pitch pre-filter, dynalloc analysis, allocation trim, and dual stereo decision all behind complexity > 0, figuring "low complexity = skip the expensive analysis". Ran the quality harness signals through it and complexity=0 came back better than complexity=5 by 5-10 dB SNR on most of them, which made no sense for a "cheaper/lower quality" setting. Isolated it by forcing each of the four back on one at a time — turns out it's entirely the pre-filter. libopus doesn't gate any of those four on complexity at all (they always run); the only thing complexity actually gates is the spreading decision, and even that isn't a simple on/off — below complexity 3 it falls back to a flat SPREAD_NORMAL instead of running spreading_decision(), and only complexity exactly 0 gets SPREAD_NONE (celt_encoder.c ~line 2317). Fixed it to match that.

So today complexity is fairly subtle: 0-2 skip the spreading estimator, 3-10 all behave identically (pion doesn't have the higher-complexity-only stuff libopus has — transient re-detection at ≥5, second MDCT pass at ≥8, etc. — those aren't ported). Still useful groundwork for wiring those in later without touching the public API again.

Reference issue

Fixes #...

@github-actions

github-actions Bot commented Jul 14, 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 5.2 3.5 -1.7 OK
harmonics -0.7 -0.6 +0.1 OK
burst -2.4 -2.5 -0.1 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 538.211780 0.109468
harmonics 9.840540 0.012980
burst 89.570659 2.192852
shaped_noise 2.653386 0.234622
onset 91.198017 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/burst
=== CONT  TestEncoderQuality/onset
=== NAME  TestEncoderQuality/burst
    encoder_quality_test.go:159: signal=burst SNR=-2.4 dB
=== NAME  TestEncoderQuality/onset
    encoder_quality_test.go:159: signal=onset SNR=-2.4 dB
=== NAME  TestEncoderQuality/burst
    encoder_quality_test.go:166: baseline=-2.5 dB delta=-0.1 dB threshold=1.5 dB
=== NAME  TestEncoderQuality/onset
    encoder_quality_test.go:166: baseline=-2.4 dB delta=-0.0 dB threshold=1.5 dB
=== CONT  TestEncoderQuality/harmonics
=== 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/chirp
    encoder_quality_test.go:159: signal=chirp SNR=5.2 dB
    encoder_quality_test.go:166: baseline=3.5 dB delta=-1.7 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/burst (0.12s)
    --- PASS: TestEncoderQuality/onset (0.12s)
    --- PASS: TestEncoderQuality/shaped_noise (0.15s)
    --- PASS: TestEncoderQuality/chirp (0.16s)
    --- PASS: TestEncoderQuality/harmonics (0.12s)
PASS
ok  	github.com/pion/opus	0.254s
=== 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/burst
=== CONT  TestEncoderQualityVsReference/onset
=== NAME  TestEncoderQualityVsReference/burst
    encoder_conformance_test.go:448: pion quality= weighted_error=89.570659
=== NAME  TestEncoderQualityVsReference/onset
    encoder_conformance_test.go:448: pion quality= weighted_error=91.198017
=== NAME  TestEncoderQualityVsReference/shaped_noise
    encoder_conformance_test.go:448: pion quality= weighted_error=2.653386
=== NAME  TestEncoderQualityVsReference/chirp
    encoder_conformance_test.go:448: pion quality= weighted_error=538.211780
=== NAME  TestEncoderQualityVsReference/onset
    encoder_conformance_test.go:473: libopus quality= weighted_error=0.524139
=== CONT  TestEncoderQualityVsReference/harmonics
=== NAME  TestEncoderQualityVsReference/burst
    encoder_conformance_test.go:473: libopus quality= weighted_error=2.192852
=== 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=9.840540
    encoder_conformance_test.go:473: libopus quality=94.7 weighted_error=0.012980
--- PASS: TestEncoderQualityVsReference (21.40s)
    --- PASS: TestEncoderQualityVsReference/onset (1.86s)
    --- PASS: TestEncoderQualityVsReference/burst (1.88s)
    --- PASS: TestEncoderQualityVsReference/shaped_noise (1.93s)
    --- PASS: TestEncoderQualityVsReference/chirp (1.93s)
    --- PASS: TestEncoderQualityVsReference/harmonics (1.19s)
PASS
ok  	github.com/pion/opus	24.453s

Baseline: testdata/encoder-quality-baseline.json

@github-actions

github-actions Bot commented Jul 14, 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_16000/channels_2/testvector03
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector08: Opus quality metric: 87.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector07: Opus quality metric: 89.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector06: Opus quality metric: 69.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03: Opus quality metric: 88.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04: Opus quality metric: 80.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02: Opus quality metric: 90.7 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09: Opus quality metric: 75.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03: Opus quality metric: 66.1 %
=== 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/testvector05
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/testvector05: Opus quality metric: 75.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07: Opus quality metric: 76.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08: Opus quality metric: 70.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06: Opus quality metric: 67.8 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03: Opus quality metric: 66.3 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02: Opus quality metric: 59.7 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04: Opus quality metric: 75.1 %
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 (120.51s)
    --- PASS: TestRFC6716Conformance/vectors (0.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector07 (1.75s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector01 (2.24s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector07 (4.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector01 (4.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector12 (7.09s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector11 (8.05s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector09 (7.44s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector10 (8.70s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector08 (7.34s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector07 (6.05s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector06 (6.80s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector05 (7.37s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector03 (5.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector04 (7.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector02 (6.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector12 (3.59s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector11 (4.11s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector01 (7.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector09 (3.81s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector10 (4.46s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector08 (3.71s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector07 (3.10s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector06 (3.51s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector05 (3.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector03 (2.90s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector04 (3.62s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector02 (3.37s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector01 (4.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector12 (4.60s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector11 (5.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector10 (5.73s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector12 (2.05s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector09 (4.90s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector08 (4.78s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector11 (2.42s)
        --- 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/testvector08 (2.15s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector07 (1.82s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector06 (2.02s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector05 (2.19s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector04 (2.05s)
        --- 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.42s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector12 (3.83s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector11 (4.39s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector10 (4.74s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector09 (4.07s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector08 (3.95s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector07 (3.31s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector06 (3.70s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector05 (4.02s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector03 (3.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector04 (3.80s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector12 (1.95s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector02 (3.55s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector11 (2.26s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector01 (4.38s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector09 (2.13s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector10 (2.49s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector08 (2.03s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector04 (2.37s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector06 (4.47s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector05 (4.84s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector04 (4.63s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector03 (3.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector12 (2.36s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector11 (2.74s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector02 (4.31s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector01 (5.28s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector09 (2.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector10 (2.99s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector08 (2.45s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector07 (2.06s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector06 (2.32s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector05 (2.52s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector03 (1.86s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector02 (2.21s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector09 (4.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector01 (2.75s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector12 (4.03s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04 (3.68s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector11 (4.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector06 (1.92s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector10 (5.02s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector05 (2.08s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector03 (1.54s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector04 (1.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector02 (1.82s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector01 (2.30s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector12 (3.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector11 (4.24s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector10 (4.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09 (3.94s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08 (3.82s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07 (3.21s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06 (3.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05 (3.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector05 (4.22s)
        --- 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.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03 (3.23s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04 (4.03s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02 (3.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09 (2.06s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03 (2.90s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12 (1.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02 (3.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11 (2.19s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01 (4.22s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10 (2.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05 (2.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07 (1.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08 (1.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06 (1.85s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03 (1.49s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02 (1.24s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04 (1.54s)
=== RUN   TestRFC6716ConformanceEncoder
=== RUN   TestRFC6716ConformanceEncoder/mono_sine
TestRFC6716ConformanceEncoder/mono_sine: Opus quality metric: 99.7 %
TestRFC6716ConformanceEncoder/mono_sine: Go encoder vs original: below quality threshold, weighted error 41.763523 (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.8 %
TestRFC6716ConformanceEncoder/stereo_tones: Go encoder vs original: below quality threshold, weighted error 34.065826 (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.9 %
TestRFC6716ConformanceEncoder/stereo_wide: Go encoder vs original: below quality threshold, weighted error 70.017129 (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.206176 (delay 120 samples)
TestRFC6716ConformanceEncoder/stereo_broadband_low_bitrate: reference encoder vs original: below quality threshold, weighted error 0.910593 (delay 1712 samples)
--- PASS: TestRFC6716ConformanceEncoder (17.98s)
    --- PASS: TestRFC6716ConformanceEncoder/mono_sine (1.54s)
    --- PASS: TestRFC6716ConformanceEncoder/stereo_tones (1.57s)
    --- PASS: TestRFC6716ConformanceEncoder/stereo_wide (1.56s)
    --- PASS: TestRFC6716ConformanceEncoder/stereo_broadband_low_bitrate (1.54s)
PASS
ok  	github.com/pion/opus	138.492s

@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 93.22034% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 87.96%. Comparing base (8399d67) to head (3aff005).

Files with missing lines Patch % Lines
internal/celt/encoder.go 92.45% 2 Missing and 2 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #150      +/-   ##
==========================================
+ Coverage   87.89%   87.96%   +0.06%     
==========================================
  Files          32       32              
  Lines        7676     7692      +16     
==========================================
+ Hits         6747     6766      +19     
+ Misses        702      700       -2     
+ Partials      227      226       -1     
Flag Coverage Δ
go 87.96% <93.22%> (+0.06%) ⬆️

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.

@thomas-vilte
thomas-vilte merged commit 824ab85 into main Jul 16, 2026
21 checks passed
@thomas-vilte
thomas-vilte deleted the feat/opus-complexity-levels branch July 16, 2026 15:33
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