rockbox/lib/rbcodec/codecs/libopus
Michael Giacomelli e45936397e opus: filter the PLC excitation in place
At a CELT to hybrid mode switch, opus_decode_frame() runs CELT's pitch
PLC nested in the new frame, and celt_decode_lost() held a copy of up to
2 KB of excitation for celt_fir().  On stackOverflow.opus that overran
the 9 KB codec stack on native targets such as the e200v2.  Filtering in
place from the last sample down needs no copy; output is bit-identical.

Worst case over all 242 mode switches of stackOverflow.opus, measured
under qemu: 9140 -> 7676 bytes below opus_decode(), against 8912 left
for it on the e200v2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Change-Id: Iaa9f57182ad86ab76c81c55bea72aa517cc18230
2026-09-30 11:25:30 -04:00
..
celt opus: filter the PLC excitation in place 2026-09-30 11:25:30 -04:00
ogg [BugFix] Fix some Shif related UB -- ASAN 2023-01-04 22:00:25 -05:00
silk opus: ARMv5E SILK resampler interpolation 2026-09-30 08:21:46 -04:00
analysis.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
analysis.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
config.h opus: ARMv5E SILK resampler interpolation 2026-09-30 08:21:46 -04:00
libopus.make chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
mapping_matrix.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
mapping_matrix.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
mlp.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
mlp.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
mlp_data.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_compare.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_custom.h Sync libopus to upstream release 1.1 2013-12-16 21:13:23 +01:00
opus_decoder.c libopus: Re-add another optimization that was accidently dropped pre-3.15 2025-02-12 08:51:37 -05:00
opus_defines.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_demo.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_encoder.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_header.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_header.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_multistream.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_multistream.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_multistream_decoder.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_multistream_encoder.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_private.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_projection.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_projection_decoder.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_projection_encoder.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
opus_types.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
README.rockbox opus: filter the PLC excitation in place 2026-09-30 11:25:30 -04:00
repacketizer.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
repacketizer_demo.c Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00
SOURCES opus: ARMv5E SILK resampler interpolation 2026-09-30 08:21:46 -04:00
tansig_table.h Sync opus codec to upstream git 2021-04-23 14:23:04 +00:00

Libraries:  Opus (snapshot) / Opus-tools (snapshot) / libogg 1.3
Imported:   January 1st, 2019

Steps taken to adapt original opus/opus-tool/ogg source files to rockbox
(useful when for example syncing a new snapshot)

Opus:
* copied .c/.h files from opus/src lib/rbcodec/codecs/libopus
* copied .h files from opus/include to lib/rbcodec/codecs/libopus
* copied .c/.h files from opus/celt to lib/rbcodec/codecs/libopus/celt
* copied .c/.h files from opus/silk to lib/rbcodec/codecs/libopus/silk

Celt:
* changed #if FIXED_POINT to #ifdef FIXED_POINT in bands.c
* changed #elif OPUS_ARM_INLINE_EDSP to #elif defined (OPUS_ARM_INLINE_EDSP)
* renamed OPUS_ARM_INLINE_ASM to OPUS_ARM_ASM_ARMV4_ONLY and
  OPUS_ARM_INLINE_EDSP to OPUS_ARM_ASM_ARMV5E_AND_LATER throughout celt and
  silk, since config.h defines exactly one of them per core
* add #define ABS(a)(((a) < 0) ? - (a) :(a)) to mathops.h
* celt_decode_lost() in celt_decoder.c filters the PLC excitation in place
  (celt_fir_inplace) instead of through a copy, to fit the codec stack

Silk:
* added fixed-phase interpolation paths for the 8, 12 and 16 kHz to 48 kHz
  steps in resampler_private_IIR_FIR.c (disable with OPUS_NO_SILK_FIXED_PHASE)
* resampler_private_IIR_FIR.c calls ARM kernels for those three steps:
  silk/arm/resampler_armv4_asm.S and resampler_armv5e_asm.S, generated by
  gen_resampler_armv4.py and gen_resampler_armv5e.py beside them (disable with
  OPUS_ARM_NO_SILK_ASM); on ARMv5E and later the FIR buffer is word aligned

Opus-tools:
* copied src/opus_header.h and src/opus_header.c to lib/rbcodec/codecs/libopus
* changed #include <ogg/ogg.h> to #include "ogg/ogg.h" in opus_header.h

Ogg:
* copied libogg/src/framing.c to lib/rbcodec/codecs/libopus/ogg
* copied libogg/include/ogg.h to lib/rbcodec/codecs/libopus/ogg
* copied libogg/include/crctable.h to lib/rbcodec/codecs/libopus/ogg
* changed #include "ogg/ogg.h" to #include "ogg.h" in framing.c
* -- added os_config.h to lib/rbcodec/codecs/libopus/ogg
* added our own os_types.h
* changed #include <ogg/os_types.h> to #include "os_types.h" in ogg.h
* changed #include <ogg/os_types.h> to #include "os_types.h" in crctable.h