Commit Graph

45 Commits

Author SHA1 Message Date
Tim Walker
c8cf461c19 dcadec: Do not decode the XCh extension when downmixing to stereo
This is neither necessary nor currently supported.

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2014-04-12 23:05:07 +02:00
Christophe Gisquet
4cb6964244 dcadec: simplify decoding of VQ high frequencies
The vector dequantization has a test in a loop preventing effective SIMD
implementation. By moving it out of the loop, this loop can be DSPized.

Therefore, modify the current DSP implementation. In particular, the
DSP implementation no longer has to handle null loop sizes.

The decode_hf implementations have following timings:

For x86 Arrandale:
        C  SSE SSE2 SSE4
win32: 260 162  119  104
win64: 242 N/A   89   72

The arm NEON optimizations follow in a later patch as external asm. The
now unused check for the y modifier in arm inline asm is removed from
configure.
2014-02-28 13:03:22 +01:00
Janne Grunau
7686afd049 dca: factorize scaling in inverse ADPCM
Based on a patch from Christophe Gisquet.

Unrolling of the m == 0 case avoids a possible use of the uninitilized
value sum when s->predictor_history is not set. I failed to find a
sample for it. It also reduced the cycle count from 220 to 150 on
sandy bridge, x86_64 linux, gcc 4.8.2 compared to his patch.
2014-02-28 13:00:48 +01:00
Christophe Gisquet
87ec849fe9 dcadec: remove scaling in lfe_interpolation_fir
The scaling factor is constant so it is faster to scale the
FIR coefficients in the tables during compilation.

Signed-off-by: Janne Grunau <janne-libav@jannau.net>
2014-02-28 13:00:47 +01:00
Christophe Gisquet
ef010f08ae dca: replace some memcpy by AV_COPY128
Signed-off-by: Janne Grunau <janne-libav@jannau.net>
2014-02-20 14:16:43 +01:00
Christophe Gisquet
5fdbfcb5b7 dcadsp: split lfe_dir cases
The x86 runs short on registers because numerous elements are not static.
In addition, splitting them allows more optimized code, at least for x86.

Arm asm changes by Janne Grunau.

Signed-off-by: Janne Grunau <janne-libav@jannau.net>
2014-02-07 22:54:18 +01:00
Christophe Gisquet
5b59a9fc61 x86: dcadsp: implement int8x8_fmul_int32
For the callable function (as opposed to the inline one):
         C  SSE  SSE2  SSE4
Win32:  47   42   29    26
Win64:  30   33   25    23
The SSE version is neither compiled nor set for ARCH_X86_64, as the
inlinable function takes over.

Signed-off-by: Janne Grunau <janne-libav@jannau.net>
2014-02-07 22:52:40 +01:00
Christophe Gisquet
2bd44cb705 dcadsp: add int8x8_fmul_int32 to dsp context
It is currently declared as a macro who is set to inlinable functions,
among which a Neon and a default C implementations.

Add a DSP parameter to each inline function, unused except by the
default C implementation which calls a function from the DSP context.

On an Arrandale CPU, gain for an inlined SSE2 function vs. a call:
- Win32: 29 to 26 cycles
- Win64: 25 to 23 cycles

Signed-off-by: Janne Grunau <janne-libav@jannau.net>
2014-02-07 22:51:59 +01:00
Tim Walker
30d70e79a6 dcadec: set AV_FRAME_DATA_MATRIXENCODING side data. 2014-01-05 16:41:56 +01:00
Tim Walker
6bfdb2de88 dcadec: set the output channel mode more accurately.
When downmixing 2.1 to 2-channel, if the 2.0 portion is Lt/Rt, sum-difference or dual mono, the actual output will be the same (with the LFE either mixed-in or discarded).

Also, when downmixing an arbitrary layout to 2-channel, if the bitstream contains custom downmix coefficients targeting Lt/Rt, then the output will be Lt/Rt rather than regular Stereo.
2014-01-05 16:41:56 +01:00
Michael Niedermayer
b6a9719941 dcadec: Decode LFE to avoid adding random data when downmixing with LFE
Signed-off-by: Tim Walker <tdskywalker@gmail.com>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2013-12-06 23:37:05 +01:00
Tim Walker
7dc827b709 dcadec: Add some logging before returning on error
Based on a patch by Michael Niedermayer.

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2013-11-30 13:01:35 +01:00
Tim Walker
3c8507a845 dcadec: add disable_xch private option.
This supplements the deprecated request_channels-based control of XCh decoding.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2013-11-28 22:02:53 +01:00
Tim Walker
220494ad0b dcadec: treat all 2-channel modes as Stereo in dca_downmix.
The check for (prim_channels > 2) before calling dca_downmix made these
cases unreachable, but now 2.1 layouts will go through the downmix code.
Having dual mono, Lt/Rt and sum-difference layouts print errors when
regular Stereo doesn't seems pointless.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2013-11-28 22:02:53 +01:00
Tim Walker
aaa44d0299 dca: support mixing LFE in dca_downmix.
Embedded downmix coefficients can use this.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2013-11-28 22:02:53 +01:00
Tim Walker
44b17d794a dca: extract core substream's embedded downmix coeffcient codes, if present.
As per ETSI TS 102 114 V1.4.1 specification.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2013-11-28 22:02:53 +01:00
Tim Walker
27245b4e1b dca: remove embedded downmix coefficient extraction.
It was based on an old, seemingly incorrect specification, so default
coefficients were always used anyway.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2013-11-28 22:02:50 +01:00
Tim Walker
b6d5e6aa10 dca: convert dca_default_coeffs to float.
Easier to read, modify, and avoids relying on an outdated table.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2013-11-28 21:38:22 +01:00
Tim Walker
25609b63d2 dcadec: store the stereo downmix coefficients as float in the DCAContext.
The 7-bit codes previously used are absent from the ETSI 102 114 V1.4.1 spec.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2013-11-28 21:35:22 +01:00
Tim Walker
89de5157b1 dcadec: implement request_channel_layout.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
2013-11-28 21:10:29 +01:00
Tim Walker
37a3cac78c dcadec: simplify an expression
Signed-off-by: Diego Biurrun <diego@biurrun.de>
2013-11-19 02:02:49 +01:00
Diego Biurrun
b2bed9325d cosmetics: Group .name and .long_name together in codec/format declarations 2013-10-03 23:32:01 +02:00
Martin Storsjö
a9d50bb578 dcadec: Validate the lfe parameter
Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
2013-09-20 14:14:45 +03:00
Ben Avison
800ffab48a dcadsp: Add a new method, qmf_32_subbands
This does most of the work formerly carried out by
the static function qmf_32_subbands() in dcadec.c.

Signed-off-by: Martin Storsjö <martin@martin.st>
2013-07-22 10:15:42 +03:00
Ben Avison
26ffcc7de1 dcadec: Use int32_to_float_fmul_array8
Signed-off-by: Martin Storsjö <martin@martin.st>
2013-07-22 10:15:35 +03:00
Christophe Gisquet
b6293e2798 fmtconvert: Explicitly use int32_t instead of int
Signed-off-by: Martin Storsjö <martin@martin.st>
2013-07-17 11:02:47 +03:00
Luca Barbato
3802833bc1 dca: Respect the current limits in the downmixing capabilities
Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org
2013-07-12 04:34:49 +02:00
Luca Barbato
f261e50845 dca: Error out on missing DSYNC
Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org
2013-07-12 04:34:49 +02:00
Diego Biurrun
1db6a080bd dca: Move ff_dca_convert_bitstream() to the DCA common code
This makes the DCA parser and decoder independent.
2013-03-27 14:21:45 +01:00
Diego Biurrun
6d97484d72 avcodec: av_log_ask_for_sample() ---> avpriv_request_sample() 2013-03-13 21:20:12 +01:00
Anton Khirnov
759001c534 lavc decoders: work with refcounted frames. 2013-03-08 07:38:30 +01:00
Diego Biurrun
76b19a3984 Fix a number of incorrect intmath.h #includes. 2013-02-26 00:51:34 +01:00
Justin Ruggles
182821cff4 dca: decode directly to the user-provided AVFrame 2013-02-12 12:21:22 -05:00
Diego Biurrun
218aefce44 dsputil: Move LOCAL_ALIGNED macros to libavutil 2013-02-08 23:13:37 +01:00
Anton Khirnov
594d4d5df3 lavc: add a wrapper for AVCodecContext.get_buffer().
It will be useful in the upcoming transition to refcounted AVFrames.
2012-12-04 21:41:59 +01:00
Michael Niedermayer
5d47850bbd dcadec: skip QMF on unused channels
When the extra rear channel is present but unused, the
s->channel_order_tab[] value for that channel is -1. The QMF can be
skipped for the extra channel, and doing so avoids an out-of-array read
on s->samples_chanptr[].

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Signed-off-by: Justin Ruggles <justin.ruggles@gmail.com>
2012-11-26 22:50:37 -05:00
Justin Ruggles
a903f8f087 Include libavutil/channel_layout.h instead of libavutil/audioconvert.h
Also reorder some other #include when applicable.
2012-11-11 13:35:12 -05:00
Justin Ruggles
8ac0f6767b dcadec: allow the decoder to change the channel layout mid-stream 2012-11-01 11:29:16 -04:00
Justin Ruggles
61d5313d94 dca: allocate a secondary buffer for extra channels when downmixing
The output AVFrame buffer only has data for the downmix channels.
Fixes a segfault when decoding dca with request_channels == 2.
2012-10-13 00:07:10 -04:00
Justin Ruggles
64c312aa29 dcadec: use float planar sample format 2012-10-01 13:42:43 -04:00
Diego Biurrun
1218777ffd avcodec: Convert some commented-out printf/av_log instances to av_dlog 2012-10-01 10:24:28 +02:00
Anton Khirnov
36ef5369ee Replace all CODEC_ID_* with AV_CODEC_ID_* 2012-08-07 16:00:24 +02:00
Diego Biurrun
19cf7163c1 dca: Switch dca_sample_rates to avpriv_ prefix; it is used across libs 2012-08-01 11:43:31 +02:00
Diego Biurrun
9e4bca16f8 dca: Move tables used outside of dcadec.c to a separate file. 2012-08-01 00:17:17 +02:00
Diego Biurrun
13a79cf84e dca: Rename dca.c ---> dcadec.c
This will allow adding dca.c with tables used from other files.
2012-08-01 00:17:16 +02:00