mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-14 15:37:10 +03:00
128 lines
5.5 KiB
Plaintext
128 lines
5.5 KiB
Plaintext
Fixed-point HE-AAC decoder
|
||
Developed by RealNetworks, 2005
|
||
===============================
|
||
|
||
Overview
|
||
--------
|
||
This module contains a high-performance HE-AAC decoder for 32-bit fixed-point
|
||
processors. The following is a summary of what is and is not supported:
|
||
|
||
Supported:
|
||
- MPEG2, MPEG4 low complexity decoding (intensity stereo, M-S, TNS, PNS)
|
||
- spectral band replication (SBR), high-quality mode
|
||
- mono, stereo, and multichannel modes
|
||
- ADTS, ADIF, and raw data block file formats
|
||
|
||
Not currently supported:
|
||
- main or SSR profile, LTP
|
||
- coupling channel elements (CCE)
|
||
- 960/1920-sample frame size
|
||
- low-power mode SBR
|
||
- downsampled (single-rate) SBR
|
||
- parametric stereo
|
||
|
||
Highlights
|
||
----------
|
||
- highly optimized for ARM processors (details in docs/ subdirectory)
|
||
- reference x86 implementation
|
||
- C and assembly code only (C++ not required for codec library)
|
||
- reentrant, statically linkable
|
||
- low memory (details in docs/ subdirectory)
|
||
- option to use Intel Integrated Performance Primitives (details below)
|
||
|
||
Supported platforms and toolchains
|
||
----------------------------------
|
||
This codec should run on any 32-bit fixed-point processor which can perform a full 32x32-bit
|
||
multiply (providing a 64-bit result). The following processors and toolchains are supported:
|
||
- x86, Microsoft Visual C++
|
||
- x86, GNU toolchain (gcc)
|
||
- ARM, ARM Developer Suite (ADS)
|
||
- ARM, Microsoft Embedded Visual C++
|
||
- ARM, GNU toolchain (gcc)
|
||
|
||
ARM refers to any processor supporting ARM architecture v.4 or above. Thumb is not required.
|
||
|
||
Generally ADS produces the fastest code. EVC 3 does not support inline assembly code for
|
||
ARM targets, so calls to MULSHIFT32 (smull on ARM) are left as function calls. This incurs
|
||
a significant performance penalty. For the fastest code on targets which do not normally use
|
||
ADS consider compiling with ADS, using the -S option to output assembly code, and
|
||
feeding this assembly code to the assembler of your choice. This might require some
|
||
syntax changes in the .S file.
|
||
|
||
Adding support for a new processor is fairly simple. Simply add a new block to the file
|
||
real/assembly.h which implements the required inline assembly functions for your processor.
|
||
Something like
|
||
|
||
...
|
||
#elif defined NEW_PROCESSOR
|
||
|
||
/* you implement MULSHIFT32() and so forth */
|
||
|
||
#else
|
||
#error Unsupported platform in assembly.h
|
||
#endif
|
||
|
||
Optionally you can rewrite or add assembly language files optimized for your platform. Note
|
||
that many of the algorithms are designed for an ARM-type processor, so performance of the
|
||
unmodified C code might be noticeably worse on other architectures.
|
||
|
||
Adding support for a new toolchain is straightforward. Use the sample projects or the
|
||
Helix makefiles as a template for which source files to include.
|
||
|
||
Multichannel
|
||
------------
|
||
For multichannel, just set AAC_MAX_NCHANS in pub/aacdec.h to the desired max number
|
||
of channels (default = 2) and recompile. This increases RAM usage since more memory
|
||
is required to save state for multiple channels. See docs/memory.xls for details.
|
||
|
||
Directory structure
|
||
-------------------
|
||
fixpt/ platform-independent code and tables, public API
|
||
fixpt/docs memory and CPU usage figures, callgraphs
|
||
fixpt/hxwrap Helix wrapper code and makefiles
|
||
fixpt/ipp source code which uses IPP for decoding (see the "IPP" section below)
|
||
fixpt/pub public header files
|
||
fixpt/real source code for RealNetworks' AAC decoder
|
||
fixpt/testwrap sample code to build a command-line test application
|
||
|
||
Code organization
|
||
-----------------
|
||
fixpt/
|
||
aacdec.c main decode functions, exports C-only API
|
||
aactabs.c common tables used by all implementations
|
||
fixpt/pub/
|
||
aaccommon.h low-level codec API which aacdec.c calls
|
||
aacdec.h high-level codec API which applications call
|
||
statname.h symbols which get name-mangled by C preprocessor to allow static linking
|
||
fixpt/ipp source code for wrapper files which link in IPP libraries
|
||
fixpt/real full source code for RealNetworks AAC decoder, including SBR
|
||
fixpt/real/asm optimized assembly code files for certain platforms
|
||
|
||
To build an AAC decoder library, you'll need to compile the top-level files and EITHER
|
||
real/*.c OR ipp/*.c and the appropriate IPP library.
|
||
|
||
Decoder using Real code: aacdec.c + aactabs.c + real/*.c + real/asm/[platform]/*.s (if necessary)
|
||
Decoder using IPP code: aacdec.c + aactabs.c + ipp/*.c + ippac*.lib
|
||
|
||
IPP
|
||
---
|
||
For certain platforms Intel<65> has created highly-optimized object code libraries of DSP
|
||
routines. These are called the Intel<65> Integrated Performance Primitives (IPP). If IPP
|
||
libraries are available for a platform, this AAC decoder can link them in and use them
|
||
instead of the RealNetworks source code. To use IPP, you still need to build the top-level
|
||
files (aacdec.c, aactabs.c). You also build the files in ipp/*.c. These are just thin
|
||
wrappers which provide the glue logic between the top-level decode functions in
|
||
aacdec.c and the optimized DSP primitives in the IPP libraries. IPP libraries are not
|
||
included in this module. You must obtain them WITH A LICENSE directly from Intel.
|
||
Further info on the latest versions of IPP (as of the date of this readme) is available
|
||
from the URL below:
|
||
|
||
http://www.intel.com/software/products/ipp/
|
||
|
||
This site explains how to obtain IPP and the terms under which IPP libraries may be used.
|
||
The code in this module is merely wrapper code which calls IPP functions. You are fully
|
||
responsible for adhering to the license agreement under which you obtain the IPP
|
||
libraries from Intel.
|
||
|
||
readme.txt last updated 02/25/05
|