Commit graph

253 commits

Author SHA1 Message Date
Jean-Marc Valin
0b9f7f9944 Minor refactoring of the SILK PLC code to save more stack 2014-01-07 21:25:09 -05:00
Jean-Marc Valin
81af25950f Another aliasing hack in the SILK PLC with SMALL_FOOTPRINT 2014-01-07 16:26:27 -05:00
Jean-Marc Valin
e17ca25617 Don't allocate pulses on the stack when calling the SILK PLC.
Also minor C89 fix for the previous commit
2014-01-07 15:27:02 -05:00
Jean-Marc Valin
c25836205d Delaying allocation of the SILK temporary output buffer to reduce peak stack 2014-01-07 13:46:06 -05:00
Jean-Marc Valin
dce69d2b9b Store decoded SILK pulses as 16-bit vector
This saves 640 bytes on the peak stack usage.
2014-01-06 21:59:48 -05:00
Jean-Marc Valin
3039c9bde5 Makes silk_inner_prod_aligned() use celt_inner_prod() in fixed-point.
Should make it easier when writing assembly.
2013-12-09 16:31:07 -05:00
Jean-Marc Valin
9864c51592 Makes pitch gain control less aggressive 2013-11-20 17:14:01 -05:00
Jean-Marc Valin
854e9bd499 Using the maximum frequency response of pitch taps instead of maxabs 2013-11-20 13:39:23 -05:00
Koen Vos
c63fb978be Constrains accumulated pitch gain to avoid potential instability.
Signed-off-by: Jean-Marc Valin <jmvalin@jmvalin.ca>
2013-11-20 08:32:32 -05:00
Timothy B. Terriberry
39386e0b85 Adds Neon assembly for correlation/convolution
Optimizing celt_pitch_xcorr()/xcorr_kernel() which also speeds up
FIRs, IIRs and auto-correlations

Signed-off-by: Jean-Marc Valin <jmvalin@jmvalin.ca>
2013-11-18 13:41:17 -05:00
Jean-Marc Valin
cbe93e23be Adds OPUS_SET_PREDICTION_DISABLED() ctl to force "independent" frames
Works by turning off pitch and energy prediction in CELT, while
setting first_frame_after_reset in SILK to disable pitch and LSF interpolation
and reduce LPC gain.
2013-11-15 13:50:38 -05:00
Jean-Marc Valin
db5b19455f Fixes an initialization issue in SILK prefill found by Coverity 2013-11-12 14:20:00 -05:00
Jean-Marc Valin
f6066df2b9 More size-zero VLA fixes and making opus_decode* return BAD_ARG on framesize<0 2013-11-11 13:06:54 -05:00
Jean-Marc Valin
ca6fac041b Fixes some minor issues found by scan build 2013-11-09 18:28:40 -05:00
Jean-Marc Valin
9ffce06c77 This should be less confusing for static analyzers
Code behaviour is unchanged
2013-11-04 21:16:00 -05:00
Gregory Maxwell
7830cf1bd2 Replace "inline" with OPUS_INLINE.
Newer versions of MSVC are unhappy with the strategy of the build
 environment redefining "inline" (even though they don't support the
 actual keyword). Instead we define OPUS_INLINE to the right thing
 in opus_defines.h.

This is the same approach we use for restrict.
2013-10-28 10:18:54 -07:00
Stefan Beller
2891d852a3 Remove dead code
The compiler warned:
silk/float/pitch_analysis_core_FLP.c: In function 'silk_P_Ana_calc_corr_st3':
silk/float/pitch_analysis_core_FLP.c:499:36: warning: variable 'basis_ptr' set but not used [-Wunused-but-set-variable]
     const silk_float *target_ptr, *basis_ptr;

This means we can safely remove it.

Signed-off-by: Stefan Beller <stefanbeller@googlemail.com>
Signed-off-by: Jean-Marc Valin <jmvalin@jmvalin.ca>
2013-10-23 16:18:32 -04:00
Ralph Giles
f2446c25c6 Remove trailing whitespace from the license headers. 2013-09-16 14:40:04 -07:00
Jean-Marc Valin
02fed471a4 Implements fixed-point silk_LPC_analysis_filter() in terms of celt_fir()
Saves 2.5% on ARM without any asm. The float build still uses the old
code because celt_fir() then becomes a float function.
2013-08-29 15:29:02 -04:00
Jean-Marc Valin
00a1b3e0da Converts the fixed-point silk_burg_modified() to use celt_pitch_xcorr()
bit-exact with original version
2013-08-28 21:38:52 -04:00
Jean-Marc Valin
6a7ee7fb55 Share auto-correlation code between SILK and CELT 2013-08-28 17:55:34 -04:00
Jean-Marc Valin
a156c5ece7 Makes the SILK pitch search use celt_pitch_xcorr()
Should gives us ARM/SSE optimizations for free.
2013-08-26 19:27:46 -04:00
Ralph Giles
ecc81ee629 Disable MSVC posix security warnings in the project file.
By default Visual Studio warns about various C stdlib calls,
recommending non-portable replacements instead. We disable
this warning in a number of places in the source.

Since they're specific to the Visual Studio build, it's better
to disable them just in the project files where they always
apply to the correct toolchain.

I have only added the disable setting to project files which
need it currently: opus, test_opus_encode, and test_opus_decode.
2013-07-15 16:30:45 -07:00
Ralph Giles
25eca1c33e Conditionalize #pragma warn for MSVC.
This warning disable was conditional on _WIN32, which mingw
also defines, resulting in a warning about the unknown pragma
on gcc. Instead make it depend on something only the Visual
Studio compiler defines.
2013-07-15 16:05:31 -07:00
Gregory Maxwell
5280c71883 Revert "Fixes a number of double promotions and missing casts."
This reverts commit 43279728cd.
2013-07-15 15:51:24 -07:00
Gregory Maxwell
43279728cd Fixes a number of double promotions and missing casts.
At a minimum MSVC warns on some of this stuff.
2013-07-15 15:23:03 -07:00
Jean-Marc Valin
1975eeadd2 Big squashed commit of Garf's MSVC reorg:
commit 77880655f652c54415e4b5f03b5984b951f5267b
Author: Timothy B. Terriberry <tterribe@xiph.org>
Date:   Wed Jun 26 12:23:53 2013 +0200

    Fix version.mk parsing in genversion.bat.

    This was broken by the changes in 0482c82f to make it work with spaces.

    CMD interprets the quotes to mean the argument to FOR is a string,
    not a file name. Instead, we expand the path to a short file name.

    Signed-off-by: Gian-Carlo Pascutto <gcp@sjeng.org>

commit 8e97847ecac3a04956747b117fefef14939cbcbe
Merge: 0482c82 3c0aa8f
Author: Gian-Carlo Pascutto <gcp@sjeng.org>
Date:   Wed Jun 26 12:19:41 2013 +0200

    Merge branch 'master' into msvc_reorg

commit 0482c82fea6dd397a7d2ab50dc6cda4965278fc2
Author: Gian-Carlo Pascutto <gcp@sjeng.org>
Date:   Tue May 21 17:59:30 2013 +0200

    Make genversion.bat work in paths with spaces.

commit 3648ec55b7511119735280fc49bc57c7a3b55d6a
Author: Gian-Carlo Pascutto <gcp@sjeng.org>
Date:   Tue May 21 17:42:14 2013 +0200

    Rework output & intermediate dirs for parallel build support.

commit c367a0fcfcbf5551fb65d61365d9b832d7af2b38
Merge: bafb1dd b518b56
Author: Gian-Carlo Pascutto <gcp@sjeng.org>
Date:   Tue May 21 14:17:11 2013 +0200

    Merge branch 'master' into msvc_reorg

    Conflicts:
    	win32/VS2010/celt.vcxproj
    	win32/VS2010/opus.vcxproj
    	win32/VS2010/silk_common.vcxproj
    	win32/VS2010/silk_float.vcxproj

commit bafb1dda3fcf6785decdfb42a1f934c7fab0c567
Author: Gian-Carlo Pascutto <gcp@sjeng.org>
Date:   Mon Mar 11 21:25:28 2013 +0100

    Fix two more files to not have the Platform Toolset explicitly set.

commit c69c870201fec7461862fe79731a37866a1810f1
Author: Gian-Carlo Pascutto <gcp@sjeng.org>
Date:   Mon Mar 11 21:08:00 2013 +0100

    Add missing SILK MSVC project files.

commit a0d41fb7f97558c8f812d500b9027c77907c37c0
Author: Gian-Carlo Pascutto <gcp@sjeng.org>
Date:   Fri Mar 8 15:00:51 2013 +0100

    Use the default toolset in the MSVC project files.

commit 34aac5b2637ed38c5620f0d876e08db232849933
Author: Gian-Carlo Pascutto <gcp@sjeng.org>
Date:   Fri Mar 8 14:54:41 2013 +0100

    Move the MSVC project files outside the source tree.

    Bring the project structure more in line with the one in libogg.
2013-06-27 03:12:38 -04:00
Timothy B. Terriberry
e3ad4ea1cd Move misplaced RESTORE_STACK.
Introduced in c152d602.

Thanks to Pedro Becerra for the report.
2013-05-23 19:33:34 -07:00
Timothy B. Terriberry
7e783b141b Move misplaced RESTORE_STACK.
Introduced in c152d602.

Thanks to Pedro Becerra for the report.
2013-05-23 15:54:55 -07:00
Timothy B. Terriberry
e095c3eb7f Move ARM asm into its own directories. 2013-05-21 12:53:33 -07:00
Timothy B. Terriberry
b518b56fe1 Clean up register constraints.
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHBJEHG.html
 says that "Rd cannot be the same as Rm."
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHBJEHG.html
 says that "RdLo, RdHi, and Rm must all be different registers."
This means that some of the early clobbers I removed really should
 have been there (to prevent aliasing Rd, RdLo, or RdHi with Rm).
It also means that we should reverse some of the operands in the
 FFT's complex multiplies.
This should only affect the ARMv4 optimizations.

Thanks to Nils Wallménius for the report.

While we're here, audit the commutative pair flags again, since I
 screwed up at least one of them, and eliminate some dead code.
2013-05-20 23:15:15 -07:00
Timothy B. Terriberry
9880c4cdeb Fix bustage in a16cef62. 2013-05-19 20:52:55 -07:00
Timothy B. Terriberry
a16cef6225 Replace silk_CLZ functions with EC_ILOG().
In most cases these will use __builtin_clz().
In a follow-up, we should audit usage of silk_CLZ32() and convert
 the places where its argument must be non-zero to use EC_ILOG()
 directly to avoid the test for zero (which is necessary on x86).
2013-05-19 19:16:15 -07:00
Timothy B. Terriberry
80ad38370c Convert quotes in license headers to ASCII.
Since the last patch originally had them mangled (presumably by
 mailer, http server, or something else), let's just get rid of
 them.
2013-05-19 19:16:11 -07:00
Timothy B. Terriberry
972a34ec2c Add ARMv4/ARMv5E macros.
Original patch by Aurélien Zanelli <aurelien.zanelli@parrot.com>:
 http://lists.xiph.org/pipermail/opus/2013-May/002078.html

Revised version:
- Add autconf detection (ported from libtheora).
- Rename ARM5E to ARMv5E (an ARM5 is not the same thing as ARMv5!).
- Use actual macros so they can still be selectively overridden.
- Split out ARMv4 parts and add a few more ARMv4 macros.
- Label blocks to make them easy to find in generated assembly.
- Fix MULT16_32_Q15() so we can pass make check.
  The MDCT test passes in values larger than 2**30 for b.
  The new version should be just as fast (or faster, since it's
   easier to merge the shift with following instructions), and
   there's no appreciable impact on accuracy (FFT/MDCT SNR actually
   goes up in most cases).
- Fix register constraints.
  We were using early-clobber flags in a bunch of places that
   didn't need them, and commutative-pair flags in a bunch of
   places that weren't actually commutative.
  This was Jean-Marc's fault (the original code came from Speex).
- Simplify silk_CLZ16().
- Port over iFFT C_MULC asm by Andree Buschmann
   <AndreeBuschmann@t-online.de> from Rockbox.
- Speed up the C_MULC asm by using LDRD, allowing more flexible
   addressing, re-ordering instructions to avoid some stalls,
   allowing more flexible register allocation, and getting things
   out of the inline asm block so the compiler can schedule them
   better.
- Add C_MUL and C_MUL4 asm for the FFT to the encoder based, on the
   new C_MULC.

In total, this patch gives a 22.3% speed-up on test_opus_encoder on
 a 600 MHz Cortex A8 using gcc 4.2.1,
When restricted to ARMv4 optimizations, it gives a 9.6% speed-up
 on the same processor/compiler.
On the conformance test vectors:
 Average mono quality is 97.0583 %
 Average stereo quality is 97.775 %
2013-05-19 19:12:51 -07:00
Jean-Marc Valin
74de3a580c Saturates the last RC to 0.99 when Schur blows up
This is a follow-up on ac76b15. When Schur blows up, we set the last RC to
+/- 0.99 instead of eliminating it.
2013-05-16 23:14:46 -04:00
Ralph Giles
b7d5531ffe Change Visual Studio files to use PACKAGE_VERSION.
This replaces the OPUS_VERSION removed by ron's auto-updater.
2013-05-10 11:27:13 -07:00
Jean-Marc Valin
ac76b1503f Fixes an assertion failure in SILK
We stop the schur recursion before any reflection coefficient
goes outside of ]-1,1[ and we force reporting a residual energy
of at least 1.
Assertion was:
Fatal (internal) error in ../silk/fixed/noise_shape_analysis_FIX.c, line 290: assertion failed: nrg >= 0
triggered by:
opus_demo voip 16000 1 12500 -bandwidth WB -complexity 10 pl04f087.stp-crash out.pcm
2013-05-09 16:17:13 -04:00
Timothy B. Terriberry
c9f857ef60 Fix bustage from c152d602.
silk_setup_resamples() was using x_bufFIX for two purposes, and I
 only allocated enough space for one of them.
This patch also switches to slightly more descriptive variable
 names than nSamples_temp and computes the resampler input/ouput
 sizes in a way that a little more obviously doesn't have issues
 with fractional samples (and replaces a divide with a variable
 divisor by one with a constant divisor).
2013-05-08 14:08:42 -07:00
Timothy B. Terriberry
c152d602aa Use dynamic stack allocation in the SILK encoder.
This makes all remaining large stack allocations use the vararray
 macros.
This continues the work of 6f2d9f50 to allow compiling with
 NONTHREADSAFE_PSEUDOSTACK to move the memory for large buffers
 off the stack for devices where it is very limited.

It also does this for some additional large buffers used by the
 PLC in the decoder.
2013-05-08 10:37:17 -07:00
Timothy B. Terriberry
dc58579c2c Fix several memory errors in the SILK resampler.
1) The memcpy's were using sizeof(opus_int32), but the type of the
    local buffer was opus_int16.
2) Because the size was wrong, this potentially allowed the source
    and destination regions of the memcpy overlap.
   I _believe_ that nSamplesIn is at least fs_in_khZ, which is at
    least 8.
   Since RESAMPLER_ORDER_FIR_12 is only 8, I don't think that's a
    problem once you fix the type size.
3) The size of the buffer used RESAMPLER_MAX_BATCH_SIZE_IN, but the
    data stored in it was actually _twice_ the input batch size
    (nSamplesIn<<1).

Because this never blew up in testing, I suspect that in practice
 the batch sizes are reasonable enough that none of these things
 was ever a problem, but proving that seems non-obvious.

This patch just converts the whole thing to use CELT's vararrays.
This fixes the buffer size problems (since we allocate a buffer
 with the actual size we use) and gets these large buffers off the
 stack on devices using the pseudo-stack.
It also fixes the memcpy problems by changing the sizeof to
 opus_int16.
It turns out sFIR, which saved state between calls, was being used
 elsewhere as opus_int32, so this converts it to a union to make
 this sharing explicit.
2013-05-08 10:37:10 -07:00
Timothy B. Terriberry
c41a81680c Remove trailing whitespace. 2013-05-07 20:05:56 -07:00
Timothy B. Terriberry
bfe52ceb74 Fix some warnings.
You can't use /* within a comment.
2013-05-07 20:05:53 -07:00
Jean-Marc Valin
3ecd9c20cb Fixes two bandwidth decision issues
1) In cases where the SILK desired bandwidth went down, then quickly up, we
count get stuck in a mode with the LP variation going the wrong way.
2) Bandwidth detection can no longer force SILK to go below wideband to
avoid switches that require redundancy.
2013-02-19 00:42:15 -05:00
Jean-Marc Valin
6044907c82 Fixes a SILK fixed-point encoder issue reported by Cliff Parris <cliff@espico.com> 2013-02-07 15:31:30 -05:00
Jean-Marc Valin
e51a3f33cf Fixes a minor CELT->SILK switching glitch in the decoder
By not reinitializing the stereo state during a switch, the old stereo
memory would create a false impulse (i.e. single sample) in the decoded audio.
This change affects the normative part of the decoder. Fortunately,
the modified decoder is still compliant with the specification because
it still easily passes the testvectors. For example, for the float decoder
at 48 kHz, the opus_compare (arbitrary) "quality score" changes from
from 99.9333% to 99.925%.
2013-02-06 23:48:09 -05:00
Joshua Bowman
f77e86a235 Fix MSVC linker warnings
Specify the correct debug runtime libraries for the test
and demo executables to prevent mismatch warnings with
the default runtime.

Signed-off-by: Ralph Giles <giles@mozilla.com>
2012-10-23 13:12:25 -07:00
Philip Jägenstedt
b7b5872c9d Fix minor issues reported by scan-build 2012-10-11 09:21:44 -04:00
Jean-Marc Valin
e9b36c1e38 Fixes comment-in-comment warning 2012-10-10 13:53:59 -04:00
Jean-Marc Valin
b56c278b0e Fixes a fixed-point overflow in the new pitch code 2012-10-10 13:32:16 -04:00