Commit Graph

224 Commits

Author SHA1 Message Date
Jean-Michel Trivi ed247dfa54 Encoder quantizer fix
AAC Encoder: Saturate quantizer shift value to prevent
  undefined behaviour.

In very rare cases the shift value 'totalShift = (16-4)-(3*(totalShift>>2))'
 can be greater than accu data width. If you apply a shift with more then
 31 bit the result depends on the architecture and is not defined in C.
For certain platforms zeros are shifted in. That would be our desired behaviour.
On other platforms the shift will be applied as modulo. For example >>34
 would be applied as >>2. To prevent this discrepancy the shift value
 is limited/saturated to DFRACT_BITS-1. 'accu >>= fixMin(totalShift,DFRACT_BITS-1)'.

Bug 9428126

Change-Id: I27177654c4dc22cf899bc35dad9cdd040dccb02d
2013-08-20 15:01:21 -07:00
Jean-Michel Trivi 577fcbb570 Decode and SYS lib cleanup
* AAC-Encoder

   - Remove source snippets related to unsupported frame length of 960.
   - Adjust minBits initialization for disabled VBR configuration.
     Modified file(s):
        libAACenc/src/aacenc.h
        libAACenc/src/aacenc_lib.cpp
        libAACenc/src/aacenc_tns.cpp
        libAACenc/src/bandwidth.cpp
        libAACenc/src/psy_const.h
        libAACenc/src/transform.h

   - Revise encoder parameter restrictions: "Error Resilient(ER) AAC Low Complexity"
     is not supported. Where the AAC part of the FDK encoder threw an
     initialization error, now the aacEncoder_SetParam() returns an error
     before initialization if the application tries to configure this
     audio object type.
     Modified file(s):
        libAACenc/src/aacenc_lib.cpp

* SYS-Library

   - Portability fix for Mingw32.
     Modified file(s):
        libSYS/include/machine_type.h

   - Minor changes.
     Modified file(s):
        libSYS/include/wav_file.h
        libSYS/src/wav_file.cpp
        libSYS/src/cmdl_parser.cpp
        libSYS/src/genericStds.cpp

Bug 9428126

Change-Id: I9fa44923d34f033d0dc607f2b85abacb8a85eb61
2013-08-20 14:51:53 -07:00
Jean-Michel Trivi 4f0d97057c Disclaimer update, lib version increment
- Update disclaimer in all source files.
- Increment library version in each FDK sub-module.

Bug 9428126

Change-Id: I490b96d4ee472246b01483202b0bb4f1e9c2a5d7
2013-08-20 14:38:55 -07:00
Jean-Michel Trivi 8bd0baee9e Fix HE-AAC SBR ignored high-freq data
Change-Id: I12d284477f07349368e714ba52cbb2a47b024554
(cherry picked from commit a889574e60a02bbc647d3b078d2727cb48d82e5a)
2013-08-05 19:23:49 +00:00
Martin Storsjo f6aebfd487 Bump the version number, add a changelog entry 2013-07-27 18:54:00 +03:00
Martin Storsjo 59ff381ee4 Include dependency libs (-lm) in the pkg-config file 2013-07-27 02:01:33 +03:00
Martin Storsjo a63897ce4e Check the right element in isBook
This makes sure we read the right array element, corresponding
to all other array accesses in the same function, and all other
use of the isBook array elsewhere in the library.

This makes the fix in the previous commit ("Avoid too big changes
in isScale") work as intended, fixing other samples that triggered
assertions.
2013-07-10 17:21:42 +03:00
Martin Storsjo 226601a8d9 Avoid too big changes in isScale
These values are delta encoded, but only steps [-60,60] are
possible to encode. If the difference between two values are
bigger than that, we end up with a sequence we are unable to
encode.

This fixes crashes on certain stereo samples at higher
bitrates.
2013-03-18 16:28:50 +02:00
Martin Storsjo bae4553d42 Merge remote-tracking branch 'aosp/master' 2013-02-27 22:06:16 +02:00
Martin Storsjo 8f9f42c104 Don't try to shift more bits than the variable length
Shifting by more than (or equal to) the variable length is
undefined in C.

This caused the quantized spectrum values to remain unshifted,
causing loud beeps in some samples.

The exact same change was originally applied in
657456949 (for AOSP) and in 24021f190 (in the separate fdk-aac
repo), but was overwritten and silently reverted by the new
upstream code drop for Android 4.2 in 381d69840a. After the code
drop, I chose not to reapply this change since the crashes that
it fixed had been fixed in other ways upstream and I was unable to
reproduce them after the new code drop.
2013-02-17 02:21:26 +02:00
Elliott Hughes dd68dcdb75 am 0d439d3d: Merge "Remove a bionic workaround."
* commit '0d439d3d744f5ac8b0b0c16dcc9d1d3814ad002e':
  Remove a bionic workaround.
2012-11-29 20:29:44 -08:00
Elliott Hughes 03a143bcb4 Remove a bionic workaround.
(Requires corresponding bionic patch 3975cec694a0c9b42e3f7e671fcd678da92836c3.)

(cherry-pick of 1d24ddc612489f57c23e78a5deaaad91f1bf6ce5.)

Change-Id: I7105b17c285ff24fb48be23cf2067aef37f36d45
2012-11-29 19:51:22 -08:00
Elliott Hughes 0d439d3d74 Merge "Remove a bionic workaround." 2012-11-29 19:32:14 -08:00
Elliott Hughes 1d24ddc612 Remove a bionic workaround.
(Requires corresponding bionic patch 3975cec694a0c9b42e3f7e671fcd678da92836c3.)

Change-Id: Ief968db33e2f9e1957510bbd59f25faa6828d678
2012-11-29 17:30:23 -08:00
Martin Storsjo b966edf7fc Add a changelog entry for 0.1.1, bump the version numbers 2012-11-13 23:47:12 +02:00
Martin Storsjo ec5d922893 Rename sbr_rom/ram files back to the original names
This minimizes the differences to upstream.
2012-11-02 13:30:45 +02:00
Martin Storsjo 53b442d8af build: Build object files in subdirectories
This allows producing more than one object file with the same name.
2012-11-02 12:47:43 +02:00
Martin Storsjo dc409c50e6 build: Don't use make variables in the declaration of source files
This is required for working dependency generation with
the subdir-objects option enabled.
2012-11-02 12:45:29 +02:00
Martin Storsjo 9285c096fe Revert "Use __builtin_clz instead of default implementation of fixnormz on GCC"
This reverts commit e036dbc8eb.

Upstream took __builtin_clz in use (in the new header
libFDK/include/x86/clz_x86.h, together with an alternative
implementation for MSVC), so this change can be dropped to
minimize the differences.
2012-11-01 11:30:58 +02:00
Martin Storsjo 48cfc02cbf Revert parts of "Use saturating adds to avoid overflow"
This reverts commit 839ae290c1.

This change is no longer necessary on top of the new upstream,
I cannot reproduce the crash that this fixed with the new upstream.
2012-11-01 11:30:40 +02:00
Martin Storsjo dc0de33e86 Only use __int64 on MSVC, not on all win32 compilers
Mingw32 doesn't define the __int64 types.

This was implicitly reverted in AOSP (where this change was
already merged before) by the new code drop from Fraunhofer.
2012-11-01 11:30:40 +02:00
Martin Storsjo 961d5598d3 Update Makefile.am to account for a removed file in the latest upstream 2012-11-01 11:17:22 +02:00
Martin Storsjo 54dfe1ec69 Merge remote-tracking branch 'aosp/jb-mr1-release' into master
Conflicts:
	libAACenc/src/band_nrg.cpp
	libAACenc/src/grp_data.cpp
	libSBRenc/src/env_est.cpp
2012-11-01 11:08:03 +02:00
Jeffrey Knockel fea3c1d0ff Make sure AACdynamic_RAM gets allocated aligned to 8 bytes
This fixes assert failures on platforms where malloc doesn't provide
8 byte alignment, such as Win9x.
2012-10-25 12:14:05 +03:00
Sergio Ammirata 790bf9f088 Add support for Workgroup 4 (WG4) channel mapping
This is the channel ordering used in DVD Audio, and is the standard
used internally in the VLC media player.
2012-10-05 12:17:37 +03:00
Jean-Michel Trivi 6ab36997af Bug 7170947 Update AAC codec
From Fraunhofer:
* AAC Decoder

   - Stick to the written MPEG standard instead of the MPEG reference software
     in terms of reference level normalization. Always set the program reference
     level equal to the target level. This disables level normalization using a
     default level for streams without embedded metadata.
     Modified file(s):
        libAACdec\src\aacdec_drc.cpp

   - Fix downmix channel assignment when using a WAV output channel ordering.
     Modified file(s):
        libPCMutils\src\pcmutils_lib.cpp

   - Retain signal accuracy and prevent LSB alteration when no level correction
     needs to be done.
     Modified file(s):
        libAACdec\src\aacdec_drc.h
        libAACdec\src\aacdec_drc.cpp
        libSBRdec\src\sbrdecoder.cpp
        libSBRdec\src\sbr_dec.cpp
        libSBRdec\src\sbrdec_drc.cpp

   - Align metadata processing with reference implementation.
     Modified file(s):
        libAACdec\src\aacdec_drc.h
        libAACdec\src\aacdecoder.cpp

* AAC-Encoder

   - Prevent potential overflow in energy calculation after TNS processing.
     Modified file(s):
       libAACenc\src\band_nrg.cpp

   - Added saturation for number of relevant lines which are used in pe
     calculation.
     Modified file(s):
       libAACenc\src\line_pe.cpp

   - Removed obsolete files.
     Deleded file(s):
       libAACenc\src\tns_param.h
       libAACenc\src\tns_param.cpp

* FDK-Library

   - Added x86 Count Leading Zeros intrinsic.
     Modified file(s):
        libFDK\include\clz.h
     Added file(s):
        libFDK\include\x86\clz_x86.h

   - Fixed compilation for MIPS GCC-4.4 and higher.
     Modified file(s):
        libFDK\include\mips\cplx_mul.h
        libFDK\include\mips\fixmul_mips.h

Change-Id: I4be65f07f88d412224c7fddc3f054e8f451176cc
2012-10-02 10:46:47 -07:00
Martin Storsjo e79b172ba6 Revert "Do schur_div with a direct 64 bit division instead of a loop on x86"
This reverts commit 923f3e95f3.

The optimized version differed from the original in a few cases
(in some cases where the return value turned out to be negative
while the original implementation returned a positive value),
so revert it for now until it has been analyzed completely.
2012-09-14 11:10:29 +03:00
Martin Storsjo bf0d9ddc43 Add an encoder example 2012-09-13 23:27:27 +03:00
John Grossman ed8b5a747e Merge "Don't zero out spec coeffs before doing the final IMDCT." into jb-mr1-dev 2012-09-12 15:11:17 -07:00
John Grossman 34ce250e90 Don't zero out spec coeffs before doing the final IMDCT.
Addresses bug 7140347.

When flushing the decoder, you need to make sure to zero out any
lingering spectral coefficients as well as zero out the overlap buffer
state after decoding the final access unit.  Zeroing out the spec
coefficients *before* you decode the last block, however, seems like a
mistake.  If the final block contains any useful information for the
stream, then you end up outputting the overlap portion of the second
to last decoded block combined with zeros.  Because of the shape of
the second to last block's windows, this results in what appears to be
a fade out, but actually is a zero'ed out final block.

Signed-off-by: John Grossman <johngro@google.com>
Change-Id: I0fab9ee1a5899811d5519a91dc05631e9bf4963c
2012-09-12 14:20:05 -07:00
Keun young Park 1043598349 fix mips build by reverting files back
- MIPS still needs the work-around

Change-Id: If68b2028bd2779ada79020bb333ec8817abe9429
2012-09-11 17:28:46 -07:00
Jakub Stachowski 923f3e95f3 Do schur_div with a direct 64 bit division instead of a loop on x86
This speeds up HE-AACv2 encoding from 3.85 s to 3.42 s on a Core i7.
2012-09-09 22:18:09 +03:00
Jean-Michel Trivi 381d69840a Bug fixes in AAC decoder, AAC encoder, FDK library
Latest code drop from Fraunhofer:

* AAC-Decoder

   - Expanded AAC-LD/ELD decoder TNS max band tables to avoid wrong data
     access for sampling rates <22kHz and >48kHz.
     Modified file(s):
        libAACdec\src\aacdec_tns.cpp
        libAACdec\src\aac_rom.h
        libAACdec\src\aac_rom.cpp

  - Fixed ELD synthesis QMF filterbank scaling for downsampled SBR.
    Modified file(s):
        libFDK\src\qmf.cpp

* AAC-Encoder

  - Fixed bit rate limiting for lower limit as introduced in the Delivery 2012-05-11.
    Modified file(s):
        libAACenc\include\aacenc_lib.h
        libAACenc\src\aacenc.h
        libAACenc\src\aacenc.cpp
        libSBRenc\src\sbr_rom.h
        libSBRenc\src\sbr_rom.cpp

  - Allow negative prediction gain as meaning that there is no coding gain.
    Make use of scaleValueSaturate in gauss window calculation.
    Modified file(s):
        libAACenc\src\aacenc_tns.cpp

  - Added energy saturation to prevent overflow in short blocks.
    Modified file(s):
        libAACenc\src\grp_data.cpp

  - Perform scalefactor adaption in case quantized lines are out of valid range.
    Modified file(s):
        libAACenc\src\quantize.cpp

  - Interrupt quantization loop when no spectral data is available.
    Adjustments in bitreservoir adaption.
    Modified file(s):
        libAACenc\src\qc_main.cpp

  - Indroduced dynamic scaling in none missing harmonic energy lowering compensation.
    Modified file(s):
        libSBRenc\src\env_est.cpp

* FDK-Library

  - Fixed saturation for negative values in scaleValueSaturate.
    Modified file(s):
        libFDK\include\scale.h

Change-Id: If830ea65caef6b5554281e4b7a77a8b2e08825ce
2012-09-09 11:52:09 -07:00
Martin Storsjo 50b1de17ac Merge remote-tracking branch 'aosp/master' 2012-09-05 11:32:25 +03:00
Jean-Baptiste Queru fef220869b Merge "Remove workaround in aac for broken toolchain" 2012-09-04 13:13:44 -07:00
Irina Tirdea ad749575b4 Remove workaround in aac for broken toolchain
aac project forces the system not to include sys/types.h by defining
_SYS_TYPES_H_. This is a workaround for broken android toolchain.

This is no longer needed in latest android version and can be safely
removed. This will also lead to more errors if changes in bionic
headers are needed.

Change-Id: Icb76c207d6b47e811eacff9f9403177629bfb451
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
2012-09-03 02:48:01 +03:00
Martin Storsjo 8e4d5d9d2f Use a saturating shift to avoid overflow
When the shift overflowed, asserts were triggered later, where
the values were assumed to be non-negative.
2012-09-02 22:27:52 +02:00
Jean-Baptiste Queru ee36153b8c Merge "GCC 4.4 and later cannot handle h constructs. Fix to replace the assembly constructs." 2012-08-15 13:47:14 -07:00
Jakub Stachowski e036dbc8eb Use __builtin_clz instead of default implementation of fixnormz on GCC
The library contains architecture specific versions of the clz functions
for arm and mips, but the fallback C version for other architectures is
pretty slow.

By using __builtin_clz on GCC (available since GCC 3.4), we get a
significant (20-40 %) speedup of the total running time on x86.

Speed difference: 5.1 s instead of 8.6 s for AAC-LC 128 kbit/s and
3.8 s instead of 4.9 s for HE-AACv2 32 kbit/s, on an i7.
2012-08-14 23:48:55 +03:00
Jean-Baptiste Queru a00bd4cf64 Merge "Don't try to shift more bits than the variable length" 2012-08-13 10:03:01 -07:00
Martin Storsjo 6999980d67 Use saturating adds to avoid overflow
When the addition overflowed, asserts were triggered later, where
the values were assumed to be non-negative.
2012-08-11 22:28:54 +03:00
Martin Storsjo 010c75901e Use saturating adds in all other similar loops in groupShortData as well 2012-08-10 11:21:10 +03:00
Martin Storsjo 6574569496 Don't try to shift more bits than the variable length
Shifting by more than (or equal to) the variable length is
undefined in C.

This caused the quantized spectrum values to go out of range,
triggering asserts later.

Change-Id: If81b6c8caa7b9c75941ad9d280b686d2069c968c
2012-08-10 11:05:56 +03:00
Martin Storsjo 24021f1909 Don't try to shift more bits than the variable length
Shifting by more than (or equal to) the variable length is
undefined in C.
2012-08-10 11:01:37 +03:00
Martin Storsjo 839ae290c1 Use saturating adds to avoid overflow
These additions can overflow, triggering assertions later.
2012-08-10 11:01:36 +03:00
Raghu Gandham 50d9a4cb1e GCC 4.4 and later cannot handle h constructs. Fix to replace the assembly constructs.
Change-Id: I47509c20ee32f04ce42105563d2d4013910da531
2012-08-09 18:57:46 -07:00
Martin Storsjo d8e8f1ac46 Merge remote-tracking branch 'aosp/master' 2012-08-08 22:19:49 +03:00
Jean-Baptiste Queru d2854e2ac7 Merge "Only use __int64 on MSVC, not on all win32 compilers" 2012-08-08 12:07:04 -07:00
Martin Storsjo c44084453d Check whether we need to link to -lm for math functions 2012-07-14 01:58:51 +03:00
Martin Storsjo 52396724f8 Only use __int64 on MSVC, not on all win32 compilers
Mingw32 doesn't define the __int64 types.

Change-Id: Ia45add37be1bf85abde664fd6e382334a6bb4498
2012-07-12 17:06:45 +03:00