The fixmuldiv functions don't need inline assembly to be fast
in this architecture; the compiler (both clang and GCC) figure
out to use the optimal instructions for this (which is 2 instruction
sequence), and when letting the compiler emit the instructions
instead of using inline assembly, the compiler is able to
interleave those instructions with other instructions,
improving scheduling, making it even faster than when using
inline assembly.
Overall, this gives about 50% speedup.
GCC 6 defaults to C++14 (or more precisely, gnu++14) instead of C++98
(or gnu++98).
The fdk-aac source doesn't support being built in this mode at the
moment, since it relies on narrowing conversion from unsigned 32 bit
integers to FIXP_DBL (which is a signed data type of the same size).
The same approach is used upstream in Android as well, since
d52f3747683.
This fixes buliding with GCC 6.
Replace the assembler code by the equivalent in C. This way it will work
for every MIPS ISA. Now the check for __mips_isa_rev < 6 is no longer
necessary, so remove it.
Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
Only enable code using mips32/mips64 instructions if the compiler is targetting
this ISA. (integer madd and msub instructions aren't available in the
``canonical'' mips ISAs)
The AAC_PCM_OUTPUT_CHANNELS option no longer exists under the
same name nor enum value any longer, and the AUDIO_CHANNEL_TYPE
enum has been changed in a way which may break users.
This is a bug fix patch from Fraunhofer, amending/replacing/extending
the previous commit which only extended the table to 55 elements.
(In my previous fix, 55 seemed to be enough for the issue at hand at
least. A few of the coefficients had slightly different rounding than
what Fraunhofer had used though).
This will show up in AOSP in the next code drop as well.
For sample rates >= 64 kHz with short blocks, the largest sfb
width is 36, which after grouping can be multiplied with 3,
ending up as 108. GetInvInt needs to be able to support
the largest grouped sfb width, divided by two (3 * 36 / 2 = 54).
This fixes VBR encoding with sample rates >= 64 kHz.
fseek(SEEK_CUR) doesn't work for nonseekable streams (such
as pipes).
Only do this for skipping past small chunks; don't use it for
skipping past the actual data for non-streamed input.
Fix AIX build failure with IBM xlC compiler due to conflicting
definition of M_PI. The libSYS/include/genericStds.h definition is
guarded with #ifndef M_PI, but was included before <math.h> which
defines M_PI with more significant digits.
The enum only contains the constant values 0, 1 and 2. This produces
the warning "comparison of constant 6 with expression of type
'PS_RESOLUTION' is always false" in clang for the first check
in the getNoBands function (but apparently not for the second one
even though mode>=3 shouldn't ever happen for a valid PS_RESOLUTION
value either). This could allow the compiler to completely remove
the conditions that shouldn't be able to occur even though they
actually are used and are necessary.
By passing the value as UINT instead, it is clear to the compiler
that all the checks are necessary.
This reverts commit 226601a8d9bce81455e161a0e26051d2f22c5d7a.
This change doesn't seem to be necessary any longer, a proper
fix seems to be included upstream now in
60a27b7fe5bf2c3b07ae7f679ca67c0c5cba3b00.
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.
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.
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.
This reverts commit e036dbc8eb7d5fdd02dc70faff20e9ac3e2989ca.
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.
This reverts commit 839ae290c1f5a263613bea1a5fde863e757a8849.
This change is no longer necessary on top of the new upstream,
I cannot reproduce the crash that this fixed with the new upstream.
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.
This reverts commit 923f3e95f3e332d26f03cf6782f0ab61596ceef2.
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.
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.
By default automake thinks the project is part of GNU and enforces the
presence of some files. By declaring the project foreign, we can
remove the 0-sized files.
While the source is C++, it doesn't use anything from the C++
runtime, so by building with -fno-exceptions -fno-rtti, the
dynamic library doesn't have to be linked to libstdc++. This
also simplifies things for users of the static library.
Change-Id: I42a702487e6db4953dca0027710ea4fe266052fd
Also:
- Removed dead code in several source files.
- Minor changes in comments.
- No functional changes. No changes in executed code.
- Added documentation PDFs.
Fixes:
- Don't throw error for invalid bitrate but limit to functional value
- More robust ASC parsing
- More robust handling of corrupt bitstreams
- Handle multiple raw access units
Change-Id: Ib49fe2545ff4185fe924126da702fe84ac5c2d87