Skip to content

Support CELT and hybrid API-rate output#110

Merged
zshang-oai merged 1 commit intomainfrom
codex/celt-api-rate-output
May 4, 2026
Merged

Support CELT and hybrid API-rate output#110
zshang-oai merged 1 commit intomainfrom
codex/celt-api-rate-output

Conversation

@zshang-oai
Copy link
Copy Markdown
Contributor

Summary

  • support CELT and hybrid decoding at the caller-requested API sample rate while keeping the decoder's internal CELT synthesis path at 48 kHz
  • update conformance coverage and output-bandwidth limiting for API-rate output
  • address follow-up review findings by consuming SILK LBRR syntax without rejecting valid packets and by mirroring the RFC 8251 §4 padding-length hardening model during packet parsing

Details

  • The CELT/hybrid output path now distinguishes stream bandwidth from API output rate, so decoded audio is emitted at the requested rate without reporting an incorrect packet bandwidth.
  • SILK LBRR packets are accepted per RFC 6716 §§4.2.4-4.2.5 by decoding the LBRR flags and consuming redundant frames into throwaway state. This keeps valid packets decodable without adding FEC recovery support in this PR.
  • Code-3 packet padding now decrements the remaining payload while reading continuation bytes, matching the RFC 8251 §4 parser hardening change instead of accumulating padding separately.

Validation

  • go test ./...
  • .github/scripts/run-rfc6716-conformance.sh
    • passed the full RFC 6716 and RFC 8251 vector matrices locally

Notes

  • Full PLC behavior and exposed LBRR/FEC recovery remain out of scope for this PR.

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 30, 2026

Codecov Report

❌ Patch coverage is 78.57143% with 75 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.73%. Comparing base (81a9c5d) to head (1e4c68b).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
decoder.go 69.49% 28 Missing and 8 partials ⚠️
internal/silk/decoder.go 81.20% 19 Missing and 6 partials ⚠️
internal/celt/frame.go 82.85% 3 Missing and 3 partials ⚠️
internal/celt/synthesis.go 84.37% 4 Missing and 1 partial ⚠️
internal/celt/decoder.go 90.62% 1 Missing and 2 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #110      +/-   ##
==========================================
- Coverage   82.74%   82.73%   -0.02%     
==========================================
  Files          21       21              
  Lines        4289     4518     +229     
==========================================
+ Hits         3549     3738     +189     
- Misses        566      598      +32     
- Partials      174      182       +8     
Flag Coverage Δ
go 82.73% <78.57%> (-0.02%) ⬇️

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

☔ View full report in Codecov by Sentry.
📢 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
Copy link
Copy Markdown

github-actions Bot commented Apr 30, 2026

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.1 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.4 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_24000/channels_2/testvector08
TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector10: Opus quality metric: 87.7 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector04
TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector04: Opus quality metric: 86.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector03
TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector09: Opus quality metric: 92.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector02
TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector03: Opus quality metric: 82.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector01
TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector08: Opus quality metric: 93.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector12
TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector02: Opus quality metric: 90.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector11
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector12: Opus quality metric: 68.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector10
TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector11: Opus quality metric: 98.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector09
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector10: Opus quality metric: 95.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector08
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector09: Opus quality metric: 89.2 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector07
TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector01: Opus quality metric: 96.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector06
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector11: Opus quality metric: 97.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector05
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector08: Opus quality metric: 92.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector04
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector07: Opus quality metric: 93.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector03
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector03: Opus quality metric: 83.2 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector02
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector04: Opus quality metric: 85.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector01
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector06: Opus quality metric: 68.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector12
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector02: Opus quality metric: 92.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector11
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector05: Opus quality metric: 77.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector10
TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector01: Opus quality metric: 96.7 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector09
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector12: Opus quality metric: 56.7 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector08
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector10: Opus quality metric: 87.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector07
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector09: Opus quality metric: 78.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector06
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector08: Opus quality metric: 87.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector05
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector07: Opus quality metric: 89.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector11: Opus quality metric: 96.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04: Opus quality metric: 80.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03: Opus quality metric: 88.1 %
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02: Opus quality metric: 90.7 %
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector06: Opus quality metric: 69.1 %
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector05: Opus quality metric: 77.6 %
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.1  | 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.4  | 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 (350.34s)
    --- PASS: TestRFC6716Conformance/vectors (0.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector07 (6.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector01 (8.83s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector07 (12.77s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector01 (17.71s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector06 (9.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector04 (2.02s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector06 (18.78s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector03 (1.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector02 (1.84s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector05 (9.93s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector05 (20.45s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector12 (7.42s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector01 (8.84s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector10 (15.45s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09 (16.95s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08 (17.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07 (11.75s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector11 (32.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04 (3.62s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03 (2.85s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02 (3.33s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12 (3.78s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06 (17.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05 (19.10s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10 (7.93s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09 (8.79s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01 (17.15s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11 (15.94s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08 (8.77s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07 (5.99s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03 (1.46s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04 (1.85s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06 (9.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02 (1.78s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector12 (3.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05 (9.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector10 (8.15s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector09 (8.89s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector08 (9.03s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector07 (6.08s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector11 (16.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector04 (2.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector03 (1.62s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector02 (1.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector06 (9.18s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector05 (9.92s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector12 (7.58s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector01 (8.97s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector10 (15.54s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector09 (17.17s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector08 (17.51s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector07 (11.85s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector11 (32.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector04 (3.74s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector03 (2.95s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector02 (3.50s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector06 (17.74s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector12 (3.90s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector05 (19.26s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector10 (8.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector09 (8.79s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector01 (17.31s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector11 (16.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector08 (8.86s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector12 (10.78s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector10 (19.55s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector09 (20.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector08 (20.81s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector11 (35.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector07 (14.62s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector04 (7.10s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector03 (5.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector06 (20.97s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector02 (6.67s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector12 (5.52s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector05 (22.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector10 (10.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector09 (10.63s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector01 (20.84s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector11 (17.83s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector07 (7.35s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector08 (10.50s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector06 (10.68s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector04 (3.61s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector03 (2.92s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector05 (11.50s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector02 (3.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector12 (8.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector01 (10.58s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector10 (16.55s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector04 (4.51s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector09 (17.99s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector03 (3.60s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector08 (18.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector02 (4.27s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector12 (4.30s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector11 (32.68s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector10 (8.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector09 (9.22s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector01 (18.14s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector11 (16.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector08 (9.37s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector07 (6.44s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector03 (1.86s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector04 (2.39s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector06 (9.48s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector02 (2.21s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector05 (10.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector01 (9.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector12 (7.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector10 (15.81s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector09 (17.30s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector08 (17.69s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector07 (12.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector11 (32.21s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04 (4.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03 (3.16s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02 (3.43s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector06 (16.35s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector05 (16.90s)
PASS
ok  	github.com/pion/opus	350.345s

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the Opus decoder to support CELT-only and hybrid decoding at the caller-requested API output sample rate (while keeping CELT’s internal synthesis path at 48 kHz), and improves bitstream conformance handling (SILK LBRR acceptance + RFC 8251-style padding parsing hardening).

Changes:

  • Emit CELT-only and hybrid PCM at the decoder’s configured output sample rate, including bandwidth limiting and transition fading at API rate.
  • Accept SILK packets carrying LBRR syntax by consuming/discarding redundant frames instead of rejecting valid packets.
  • Update conformance plumbing (alternate reference outputs + final range selection) and add a conformance timeout in the helper script.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
decoder.go Core changes to decode CELT/hybrid at API rate, adjust padding parsing, resampling decisions, and transition fade logic for non-48k output.
decoder_test.go Updates for new decode return signature and adds tests ensuring CELT/hybrid-at-bandwidth-rate skips SILK resampler init.
packet_test.go Adds a malformed padding test for RFC 8251-style “remaining length decrement” parsing; updates for decode signature.
internal/celt/decoder.go Adds DecodeToSampleRate / DecodeWithRangeToSampleRate and adjusts buffer sizing for output-rate PCM.
internal/celt/frame.go Adds outputSampleRate to frame config/side-info and validates frame sizing against output rate.
internal/celt/synthesis.go Implements output-rate fade indexing, output-bandwidth limiting before synthesis, and downsampled deemphasis/interleave.
internal/celt/synthesis_test.go Updates helper invocation to include output sample rate.
internal/silk/decoder.go Decodes/consumes SILK LBRR flags + redundant frame payloads to keep valid packets decodable.
internal/silk/icdf.go Adds ICDF tables for per-frame LBRR flags.
internal/silk/errors.go Removes the “unsupported LBRR” error since LBRR is now consumed instead of rejected.
conformance_test.go Allows multiple alternate reference PCM oracles (incl. RFC 8251 output for RFC 6716 vectors) and selects final range by decoded mode.
.github/scripts/run-rfc6716-conformance.sh Adds a longer go test timeout for conformance runs.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread conformance_test.go Outdated
Comment thread decoder.go
Comment thread decoder.go Outdated
@zshang-oai zshang-oai marked this pull request as ready for review May 4, 2026 03:40
@zshang-oai zshang-oai requested review from JoTurk and Sean-Der May 4, 2026 03:41
@zshang-oai zshang-oai force-pushed the codex/celt-api-rate-output branch 2 times, most recently from 94dc81f to 95bfc2c Compare May 4, 2026 05:12
@zshang-oai zshang-oai force-pushed the codex/celt-api-rate-output branch from 95bfc2c to 1e4c68b Compare May 4, 2026 05:23
@zshang-oai zshang-oai merged commit 67f6be3 into main May 4, 2026
20 checks passed
@zshang-oai zshang-oai deleted the codex/celt-api-rate-output branch May 4, 2026 16:00
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.

3 participants