Skip to content

Synthesize RFC 6716 CELT PCM output#108

Merged
zshang-oai merged 1 commit intomainfrom
codex/celt-synthesis
Apr 30, 2026
Merged

Synthesize RFC 6716 CELT PCM output#108
zshang-oai merged 1 commit intomainfrom
codex/celt-synthesis

Conversation

@zshang-oai
Copy link
Copy Markdown
Contributor

Summary

  • Adds CELT PCM synthesis after PVQ band decode, including per-channel synthesis state, overlap handling, and bit-depth conversion into decoder output.
  • Implements the RFC 6716 CELT synthesis path around Section 4.3 decode output, including inverse MDCT/window overlap behavior and postfilter handling where applicable.
  • Extends CELT frame tests for the synthesized output path.

Validation

  • go test ./...
  • GOCACHE=/tmp/go-build-opus GOLANGCI_LINT_CACHE=/tmp/golangci-lint-cache-opus golangci-lint run --new-from-rev origin/main ./...

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 28, 2026

Codecov Report

❌ Patch coverage is 86.17284% with 56 lines in your changes missing coverage. Please review.
✅ Project coverage is 83.45%. Comparing base (0012a32) to head (6a41b34).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
internal/celt/decoder.go 65.30% 24 Missing and 10 partials ⚠️
internal/celt/synthesis.go 93.17% 13 Missing and 7 partials ⚠️
internal/celt/frame.go 85.71% 1 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #108      +/-   ##
==========================================
+ Coverage   82.32%   83.45%   +1.13%     
==========================================
  Files          20       21       +1     
  Lines        3502     3899     +397     
==========================================
+ Hits         2883     3254     +371     
- Misses        492      508      +16     
- Partials      127      137      +10     
Flag Coverage Δ
go 83.45% <86.17%> (+1.13%) ⬆️

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 28, 2026

RFC 6716 / 8251 conformation

Status: fail (informational)

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

This check is informational while CELT support is incomplete; the workflow still reports success.

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

rfc6716

rate ch 01 02 03 04 05 06 07 08 09 10 11 12
8000 1 FAIL 59.4 66.5 75.2 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
8000 2 FAIL 57.6 66.1 75.3 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
12000 1 FAIL 83.4 71.9 79.0 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
12000 2 FAIL 83.3 71.3 79.2 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
16000 1 FAIL 88.3 87.9 81.5 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
16000 2 FAIL 90.7 88.1 80.6 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
24000 1 FAIL 87.9 83.1 85.5 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
24000 2 FAIL 90.6 82.8 86.1 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
48000 1 FAIL 88.0 87.5 85.6 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
48000 2 FAIL 90.6 87.8 86.1 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL

rfc8251

rate ch 01 02 03 04 05 06 07 08 09 10 11 12
8000 1 FAIL 59.4 66.5 75.2 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
8000 2 FAIL 57.6 66.1 75.3 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
12000 1 FAIL 83.4 71.9 79.0 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
12000 2 FAIL 83.3 71.3 79.2 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
16000 1 FAIL 88.3 87.9 81.5 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
16000 2 FAIL 90.7 88.1 80.6 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
24000 1 FAIL 87.9 83.1 85.5 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
24000 2 FAIL 90.6 82.8 86.1 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
48000 1 FAIL 88.0 87.5 85.6 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
48000 2 FAIL 90.6 87.8 86.1 FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
Run output
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_1/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2 (7.56s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector02 (2.58s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector03 (2.20s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector04 (2.77s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_16000/channels_2/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1 (4.48s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector02 (1.52s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector03 (1.30s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector04 (1.65s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_1/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2 (8.68s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector02 (2.97s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector03 (2.51s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector04 (3.19s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_24000/channels_2/testvector12 (0.01s)
        --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1 (6.85s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector02 (2.33s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector03 (2.00s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector04 (2.50s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_1/testvector12 (0.01s)
        --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2 (13.34s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector02 (4.57s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector03 (3.87s)
            --- PASS: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector04 (4.89s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc6716/rate_48000/channels_2/testvector12 (0.01s)
    --- FAIL: TestRFC6716Conformance/rfc8251 (66.06s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1 (3.56s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector02 (1.20s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector03 (1.04s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector04 (1.31s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_1/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2 (6.88s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector02 (2.35s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector03 (2.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector04 (2.53s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_8000/channels_2/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1 (3.70s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector02 (1.26s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector03 (1.06s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector04 (1.37s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_1/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2 (7.14s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector02 (2.44s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector03 (2.07s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector04 (2.63s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_12000/channels_2/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1 (3.89s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector02 (1.32s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector03 (1.13s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector04 (1.42s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_1/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2 (7.55s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector02 (2.58s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector03 (2.20s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector04 (2.76s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_16000/channels_2/testvector12 (0.00s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1 (4.48s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector02 (1.53s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector03 (1.29s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector04 (1.65s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_1/testvector12 (0.01s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2 (8.67s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector02 (2.97s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector03 (2.51s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector04 (3.18s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_24000/channels_2/testvector12 (0.01s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1 (6.84s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector02 (2.33s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector03 (2.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector04 (2.50s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_1/testvector12 (0.01s)
        --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2 (13.34s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector01 (0.00s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector02 (4.57s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector03 (3.87s)
            --- PASS: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector04 (4.89s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector05 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector06 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector07 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector08 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector09 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector10 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector11 (0.00s)
            --- FAIL: TestRFC6716Conformance/rfc8251/rate_48000/channels_2/testvector12 (0.01s)
FAIL
FAIL	github.com/pion/opus	144.747s
FAIL

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 implements the RFC 6716 CELT synthesis stage (time-domain PCM generation) after PVQ decoding, including overlap handling, postfilter application, and output interleaving, and expands tests to cover the new output path.

Changes:

  • Add CELT synthesis pipeline: band denormalisation → inverse transform (MDCT) → postfilter → deemphasis/interleave.
  • Extend CELT decoder state for synthesis/postfilter and add range-decoder sharing support for hybrid decode.
  • Add new unit tests covering synthesis helpers and end-to-end decode output behavior.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
internal/celt/synthesis.go New CELT synthesis implementation (inverse transform, overlap, postfilter, deemphasis).
internal/celt/synthesis_test.go New tests for synthesis helpers and state transitions.
internal/celt/decoder.go Adds CELT frame decode entrypoints, PLC path, synthesis invocation, and state management.
internal/celt/frame.go Extends frame config with output channel count and supports external/shared range decoder.
internal/celt/frame_test.go Updates existing tests for new side-info signature and adds decode/synthesis tests.
internal/bitdepth/bitdepth.go Changes float→int16 quantization rounding behavior.

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

Comment thread internal/celt/decoder.go
Comment thread internal/celt/synthesis.go
Comment thread internal/celt/synthesis.go
Comment thread internal/bitdepth/bitdepth.go Outdated
// Float32ToSigned16 quantizes a float32 PCM sample to signed 16-bit PCM.
func Float32ToSigned16(sample float32) int16 {
sample64 := math.Round(float64(sample * 32768))
sample64 := math.Floor(0.5 + float64(sample*32768))
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

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

Float32ToSigned16 now uses floor(0.5 + x) which rounds negative half-way values toward zero (e.g., -0.5 -> 0) instead of symmetric rounding. That introduces a DC bias vs the prior math.Round behavior and typical PCM quantization expectations. Consider restoring math.Round or implementing symmetric rounding (e.g., for negatives use -floor(0.5+abs(x))) and add a unit test that covers half-way negative values.

Suggested change
sample64 := math.Floor(0.5 + float64(sample*32768))
sample64 := math.Round(float64(sample * 32768))

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The intention was to be on-par with C reference implementation; we can revert it here now

@zshang-oai zshang-oai force-pushed the codex/celt-synthesis branch from 748783a to 6a41b34 Compare April 29, 2026 06:24
@zshang-oai zshang-oai requested review from JoTurk and Sean-Der April 29, 2026 06:28
@zshang-oai
Copy link
Copy Markdown
Contributor Author

@JoTurk @Sean-Der can you stamp this

@zshang-oai zshang-oai merged commit d6de3ed into main Apr 30, 2026
20 checks passed
@zshang-oai zshang-oai deleted the codex/celt-synthesis branch April 30, 2026 16:34
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