Rockbox

This is the bug/patch tracker for Rockbox. Click here for more information.

Quick links: Bugs · Patches · Rockbox frontpage

Tasklist

FS#12077 - No mallocs in libfaad

Attached to Project: Rockbox
Opened by Andree Buschmann (Buschel) - Friday, 22 April 2011, 04:10 GMT+2
Last edited by Andree Buschmann (Buschel) - Sunday, 24 April 2011, 22:29 GMT+2
Task Type Patches
Category Codecs
Status Closed
Assigned To No-one
Player Type All players
Severity Low
Priority Normal
Reported Version Release 3.8.1
Due in Version Undecided
Due Date Undecided
Percent Complete 100%
Private No

Details

The attached patch removes malloc from the libfaad codec. The patch works fine on simulation with several AAC and AAC-HE files. It compiles and links for iPod Video and LogikDax (lowmemory target). No test runs on targets o far.

What has been done:
- Replace malloc() with static buffers.
- Remove free().
- Set several defines (MAX_CHANNELS, MAX_SYNTAX_ELEMENTS) to reasonable values to limit the memory consumption

What needs to be done:
- Cleanup (I think one or two arrays might not be needed anymore).
- Test and maybe some performance tweaking on targets

   faad_no_malloc_v04.patch (36.6 KiB)
 apps/codecs/libfaad/bits.c    |    4 
 apps/codecs/libfaad/decoder.c |  141 +++++++++-----------------------
 apps/codecs/libfaad/drc.c     |    8 +
 apps/codecs/libfaad/decoder.h |    5 -
 apps/codecs/libfaad/drm_dec.c |   10 +-
 apps/codecs/libfaad/sbr_qmf.c |   43 +++------
 apps/codecs/libfaad/sbr_qmf.h |    4 
 apps/codecs/libfaad/structs.h |    8 -
 apps/codecs/libfaad/sbr_dec.c |   52 +++---------
 apps/codecs/libfaad/sbr_dec.h |   12 +-
 apps/codecs/libfaad/specrec.c |  181 +++---------------------------------------
 apps/codecs/libfaad/syntax.c  |   16 ++-
 apps/codecs/libfaad/common.c  |   19 ----
 apps/codecs/libfaad/ps_dec.c  |   78 +++++-------------
 apps/codecs/libfaad/common.h  |    7 +
 apps/codecs/lib/codeclib.c    |    2 
 16 files changed, 142 insertions(+), 448 deletions(-)

This task depends upon

Closed by  Andree Buschmann (Buschel)
Sunday, 24 April 2011, 22:29 GMT+2
Reason for closing:  Accepted
Additional comments about closing:  Submitted with r29778.
Comment by Andree Buschmann (Buschel) - Friday, 22 April 2011, 10:51 GMT+2
Could remove a 8 KB array (s_fb_intermed) as this was not used anyway, the pointer was overwritten in the codec.

Interesting option after rework: In apps/aac.c and raac.c there are 2 large IRAM arrays defined which are used set to time_out[] and fb_intermed[] in the decoder. The array used for fb_intermed[] can be moved to the decoder library itself and removed in the codec. The array used for time_out[] is problematic: AAC-decoding needs an array size of [2][1024], AAC-HE needs [2][2048]. This array is significant for speed and should therefor be located in IRAM, but there is only enough IRAM for [2][1024] even on targets with larger amount of IRAM. Current solution: A [2][1024] array (gb_time_buffer) is located in IRAM, an additional [2][2048] array (s_time_buffer) is located in RAM. The codec decides if IRAM or RAM can be used. As a result the decoder has [2][1024] = 8 KB of unused IRAM when decoding AAC-HE.
Possible solution: Define generic buffer in IRAM (similar to what malloc did) and decide how to use it depending on AAC/AAC-HE.
   faad_no_malloc_v05.patch (37 KiB)
 apps/codecs/libfaad/bits.c     |    4 
 apps/codecs/libfaad/decoder.c  |  142 +++++++++-----------------------
 apps/codecs/libfaad/drc.c      |    8 +
 apps/codecs/libfaad/decoder.h  |    5 -
 apps/codecs/libfaad/filtbank.c |    2 
 apps/codecs/libfaad/drm_dec.c  |   10 +-
 apps/codecs/libfaad/sbr_qmf.c  |   43 +++------
 apps/codecs/libfaad/sbr_qmf.h  |    4 
 apps/codecs/libfaad/structs.h  |    8 -
 apps/codecs/libfaad/sbr_dec.c  |   52 ++---------
 apps/codecs/libfaad/sbr_dec.h  |   12 +-
 apps/codecs/libfaad/specrec.c  |  181 ++---------------------------------------
 apps/codecs/libfaad/syntax.c   |   16 ++-
 apps/codecs/libfaad/common.c   |   19 ----
 apps/codecs/libfaad/ps_dec.c   |   78 ++++-------------
 apps/codecs/libfaad/common.h   |    7 +
 apps/codecs/lib/codeclib.c     |    2 
 17 files changed, 146 insertions(+), 447 deletions(-)

Comment by Andree Buschmann (Buschel) - Friday, 22 April 2011, 14:32 GMT+2
Moved allocation of time_out[] and fb_intermed[] from apps/codecs to libfaad. Now we have an decodeer-internal solution.
   faad_no_malloc_v07.patch (43.6 KiB)
 apps/codecs/libfaad/bits.c     |    4 
 apps/codecs/libfaad/decoder.c  |  184 +++++++++++++++++--------------------
 apps/codecs/libfaad/drc.c      |    8 +
 apps/codecs/libfaad/decoder.h  |    5 -
 apps/codecs/libfaad/filtbank.c |    2 
 apps/codecs/libfaad/drm_dec.c  |   10 +-
 apps/codecs/libfaad/sbr_qmf.c  |   43 ++------
 apps/codecs/libfaad/sbr_qmf.h  |    4 
 apps/codecs/libfaad/structs.h  |    8 -
 apps/codecs/libfaad/sbr_dec.c  |   52 ++--------
 apps/codecs/libfaad/sbr_dec.h  |   12 +-
 apps/codecs/libfaad/specrec.c  |  200 +++--------------------------------------
 apps/codecs/libfaad/syntax.c   |   16 +--
 apps/codecs/libfaad/common.c   |   19 ---
 apps/codecs/libfaad/ps_dec.c   |   78 ++++-----------
 apps/codecs/libfaad/common.h   |    7 +
 apps/codecs/raac.c             |   36 -------
 apps/codecs/aac.c              |   35 -------
 apps/codecs/lib/codeclib.c     |    2 
 19 files changed, 190 insertions(+), 535 deletions(-)

Comment by Andree Buschmann (Buschel) - Friday, 22 April 2011, 18:35 GMT+2
Three changes:
- Declare qmfs/qmfa direclty in sbr-type, do not use static declarations for those arrays anymore.
- Remove all unneeded _init() and _free() functions.
- Add formerly unused NeAACDecPostSeekReset() to apps/codecs/aac.c
   faad_no_malloc_v11.patch (49.3 KiB)
 apps/codecs/libfaad/bits.c     |    4 
 apps/codecs/libfaad/ps_dec.h   |    1 
 apps/codecs/libfaad/decoder.c  |  208 ++++++++++++++++-------------------------
 apps/codecs/libfaad/drc.c      |   10 -
 apps/codecs/libfaad/decoder.h  |    9 -
 apps/codecs/libfaad/drc.h      |    1 
 apps/codecs/libfaad/filtbank.c |    2 
 apps/codecs/libfaad/drm_dec.c  |   12 --
 apps/codecs/libfaad/drm_dec.h  |    1 
 apps/codecs/libfaad/sbr_qmf.c  |   48 ---------
 apps/codecs/libfaad/sbr_qmf.h  |    4 
 apps/codecs/libfaad/structs.h  |    8 -
 apps/codecs/libfaad/sbr_dec.c  |  120 +++++------------------
 apps/codecs/libfaad/sbr_dec.h  |   19 +--
 apps/codecs/libfaad/specrec.c  |  200 ++-------------------------------------
 apps/codecs/libfaad/syntax.c   |   16 +--
 apps/codecs/libfaad/common.c   |   19 ---
 apps/codecs/libfaad/ps_dec.c   |   80 +++------------
 apps/codecs/libfaad/common.h   |    7 -
 apps/codecs/raac.c             |   36 -------
 apps/codecs/aac.c              |   37 -------
 21 files changed, 188 insertions(+), 654 deletions(-)

Comment by Andree Buschmann (Buschel) - Saturday, 23 April 2011, 18:49 GMT+2
Same as v11, but I introduced the define FAAD_STATIC_ALLOC (libfaad/common.h) to be able to switch from static to dynamic allocation for AAC-HE related data arrays. Those sum up to ~123 KB for SBR + PS.

Reason for this is that static allocation of those arrays will use this memory always. For AAC-LC files this memory is wasted and will reduce the amount of memory available for m4a tables. This might impact the maximum length of files to be able to play.
   faad_no_malloc_v12.patch (50.1 KiB)
 apps/codecs/libfaad/bits.c     |    4 
 apps/codecs/libfaad/ps_dec.h   |    1 
 apps/codecs/libfaad/decoder.c  |  218 +++++++++++++++++------------------------
 apps/codecs/libfaad/drc.c      |   10 -
 apps/codecs/libfaad/decoder.h  |    9 -
 apps/codecs/libfaad/drc.h      |    1 
 apps/codecs/libfaad/filtbank.c |    2 
 apps/codecs/libfaad/drm_dec.c  |   12 --
 apps/codecs/libfaad/drm_dec.h  |    1 
 apps/codecs/libfaad/sbr_qmf.c  |   48 ---------
 apps/codecs/libfaad/sbr_qmf.h  |    4 
 apps/codecs/libfaad/structs.h  |    8 -
 apps/codecs/libfaad/sbr_dec.c  |  127 ++++++-----------------
 apps/codecs/libfaad/sbr_dec.h  |   19 +--
 apps/codecs/libfaad/specrec.c  |  200 ++-----------------------------------
 apps/codecs/libfaad/syntax.c   |   16 +--
 apps/codecs/libfaad/common.c   |   19 ---
 apps/codecs/libfaad/ps_dec.c   |   85 +++++----------
 apps/codecs/libfaad/common.h   |   10 +
 apps/codecs/raac.c             |   36 ------
 apps/codecs/aac.c              |   37 ------
 21 files changed, 215 insertions(+), 652 deletions(-)

Comment by Andree Buschmann (Buschel) - Sunday, 24 April 2011, 00:29 GMT+2
static police...
   faad_no_malloc_v13.patch (53.6 KiB)
 apps/codecs/libfaad/bits.c     |   10 +
 apps/codecs/libfaad/ps_dec.h   |    1 
 apps/codecs/libfaad/decoder.c  |  218 +++++++++++++++++------------------------
 apps/codecs/libfaad/bits.h     |    2 
 apps/codecs/libfaad/drc.c      |   10 -
 apps/codecs/libfaad/decoder.h  |    9 -
 apps/codecs/libfaad/drc.h      |    1 
 apps/codecs/libfaad/filtbank.c |   11 +-
 apps/codecs/libfaad/drm_dec.c  |   12 --
 apps/codecs/libfaad/drm_dec.h  |    1 
 apps/codecs/libfaad/sbr_qmf.c  |   48 ---------
 apps/codecs/libfaad/sbr_qmf.h  |    4 
 apps/codecs/libfaad/structs.h  |    8 -
 apps/codecs/libfaad/sbr_e_nf.c |    4 
 apps/codecs/libfaad/sbr_dec.c  |  126 ++++++-----------------
 apps/codecs/libfaad/sbr_dec.h  |   19 +--
 apps/codecs/libfaad/sbr_dct.c  |    2 
 apps/codecs/libfaad/specrec.c  |  200 ++-----------------------------------
 apps/codecs/libfaad/syntax.c   |   16 +--
 apps/codecs/libfaad/common.c   |   19 ---
 apps/codecs/libfaad/ps_dec.c   |   85 +++++----------
 apps/codecs/libfaad/common.h   |   10 +
 apps/codecs/raac.c             |   36 ------
 apps/codecs/aac.c              |   37 ------
 24 files changed, 227 insertions(+), 662 deletions(-)

Comment by Andree Buschmann (Buschel) - Sunday, 24 April 2011, 12:47 GMT+2
Allocate the buffer variables X_left/X_right (now part of the struct XLR) via malloc(), if FAAD_STATIC_ALLOC is not set. This lets the decoder save ~40 KB when decoding AAC-LC files and gives more headroom for the m4a tables of long files.
Only exception: XLR fits into IRAM, in this case always allocate statically. The advantage in speed is ~10 MHz on a nano 2G.
   faad_no_malloc_v14.patch (56.9 KiB)
 apps/codecs/libfaad/bits.c     |   10 +
 apps/codecs/libfaad/ps_dec.h   |    1 
 apps/codecs/libfaad/decoder.c  |  218 +++++++++++++++++------------------------
 apps/codecs/libfaad/bits.h     |    2 
 apps/codecs/libfaad/drc.c      |   10 -
 apps/codecs/libfaad/decoder.h  |    9 -
 apps/codecs/libfaad/drc.h      |    1 
 apps/codecs/libfaad/filtbank.c |   11 +-
 apps/codecs/libfaad/drm_dec.c  |   12 --
 apps/codecs/libfaad/drm_dec.h  |    1 
 apps/codecs/libfaad/sbr_qmf.c  |   48 ---------
 apps/codecs/libfaad/sbr_qmf.h  |    4 
 apps/codecs/libfaad/structs.h  |    8 -
 apps/codecs/libfaad/sbr_e_nf.c |    4 
 apps/codecs/libfaad/sbr_dec.c  |  167 +++++++++++--------------------
 apps/codecs/libfaad/sbr_dec.h  |   19 +--
 apps/codecs/libfaad/sbr_dct.c  |    2 
 apps/codecs/libfaad/specrec.c  |  200 ++-----------------------------------
 apps/codecs/libfaad/syntax.c   |   16 +--
 apps/codecs/libfaad/common.c   |   19 ---
 apps/codecs/libfaad/ps_dec.c   |   85 +++++----------
 apps/codecs/libfaad/common.h   |   15 +-
 apps/codecs/raac.c             |   36 ------
 apps/codecs/aac.c              |   37 ------
 24 files changed, 257 insertions(+), 678 deletions(-)

Comment by Andree Buschmann (Buschel) - Sunday, 24 April 2011, 16:08 GMT+2
Resync against r29773.
   faad_no_malloc_v15.patch (58.6 KiB)
 apps/codecs/libfaad/bits.c      |   10 +
 apps/codecs/libfaad/ps_dec.h    |    1 
 apps/codecs/libfaad/decoder.c   |  218 +++++++++++++++++-----------------------
 apps/codecs/libfaad/bits.h      |    2 
 apps/codecs/libfaad/drc.c       |   10 -
 apps/codecs/libfaad/decoder.h   |    9 -
 apps/codecs/libfaad/drc.h       |    1 
 apps/codecs/libfaad/filtbank.c  |   11 +-
 apps/codecs/libfaad/drm_dec.c   |   12 --
 apps/codecs/libfaad/drm_dec.h   |    1 
 apps/codecs/libfaad/sbr_qmf.c   |   48 --------
 apps/codecs/libfaad/sbr_hfgen.c |    3 
 apps/codecs/libfaad/sbr_qmf.h   |    4 
 apps/codecs/libfaad/sbr_hfgen.h |    3 
 apps/codecs/libfaad/structs.h   |    8 -
 apps/codecs/libfaad/sbr_e_nf.c  |    4 
 apps/codecs/libfaad/sbr_dec.c   |  177 ++++++++++++--------------------
 apps/codecs/libfaad/sbr_dec.h   |   19 +--
 apps/codecs/libfaad/sbr_dct.c   |    2 
 apps/codecs/libfaad/specrec.c   |  200 ++----------------------------------
 apps/codecs/libfaad/syntax.c    |   16 +-
 apps/codecs/libfaad/common.c    |   19 ---
 apps/codecs/libfaad/ps_dec.c    |   85 ++++-----------
 apps/codecs/libfaad/common.h    |   15 +-
 apps/codecs/raac.c              |   36 ------
 apps/codecs/aac.c               |   37 ------
 26 files changed, 266 insertions(+), 685 deletions(-)

Loading...