rockbox/lib/rbcodec/codecs/libopus
Michael Giacomelli 15eec82d8f opus: ARMv4 SILK resampler interpolation
On ARMv4 the fixed-phase FIR cycles at 8, 12 and 16 kHz run as adds of
shifted samples rather than multiplies: every coefficient is a constant,
and a shifted add is one cycle where mla plus loading the coefficient is
five or six.  Each sample is loaded once per cycle and added into the
two or three outputs it feeds, sharing partial products such as 31x
between them, about 27 adds per output.  The kernels are generated by
silk/arm/gen_resampler_armv4.py.  Bit-exact; OPUS_ARM_NO_SILK_ASM
disables them.

Measured on the e200v1, silk_5.opus (WB SILK), with the previous commit:
36.31 -> 28.85 MHz, -20.5%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Change-Id: Ic1fd5777e91d182248f43954e4b6ae977309dc5d
2026-09-30 08:21:46 -04:00
..
celt opus: name the ARM inline-asm gates after the cores they cover 2026-09-28 12:10:57 -04:00
ogg [BugFix] Fix some Shif related UB -- ASAN 2023-01-04 22:00:25 -05:00
silk opus: ARMv4 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: name the ARM inline-asm gates after the cores they cover 2026-09-28 12:10:57 -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: ARMv4 SILK resampler interpolation 2026-09-30 08:21:46 -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: ARMv4 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

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 an ARMv4 kernel for those three steps,
  silk/arm/resampler_armv4_asm.S, generated by gen_resampler_armv4.py beside
  it (disable with OPUS_ARM_NO_SILK_ASM)

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