зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1239078 - Update libopus to 1.1.2 release. r=kinetik
This release fixes two bugs: - Resetting the encoder or decoder state with OPUS_RESET_STATE would disable some run-time selected architecture-specific optimizations. - In hybrid mode discontinuous transmission (DTX) operation, the comfort noise above 8 kHz was incorrectly estimated and could oscillate in time.
This commit is contained in:
Родитель
7095f1cc1d
Коммит
cb77a8b5fe
|
@ -8,4 +8,4 @@ files after the copy step.
|
|||
|
||||
The upstream repository is https://git.xiph.org/opus.git
|
||||
|
||||
The git tag/revision used was v1.1.1.
|
||||
The git tag/revision used was v1.1.2.
|
||||
|
|
|
@ -457,10 +457,9 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
|
|||
VARDECL(celt_norm, X);
|
||||
#endif
|
||||
opus_uint32 seed;
|
||||
opus_val16 *plcLogE;
|
||||
int end;
|
||||
int effEnd;
|
||||
|
||||
opus_val16 decay;
|
||||
end = st->end;
|
||||
effEnd = IMAX(start, IMIN(end, mode->effEBands));
|
||||
|
||||
|
@ -472,19 +471,13 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
|
|||
ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */
|
||||
#endif
|
||||
|
||||
if (loss_count >= 5)
|
||||
plcLogE = backgroundLogE;
|
||||
else {
|
||||
/* Energy decay */
|
||||
opus_val16 decay = loss_count==0 ?
|
||||
QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT);
|
||||
c=0; do
|
||||
{
|
||||
for (i=start;i<end;i++)
|
||||
oldBandE[c*nbEBands+i] -= decay;
|
||||
} while (++c<C);
|
||||
plcLogE = oldBandE;
|
||||
}
|
||||
/* Energy decay */
|
||||
decay = loss_count==0 ? QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT);
|
||||
c=0; do
|
||||
{
|
||||
for (i=start;i<end;i++)
|
||||
oldBandE[c*nbEBands+i] = MAX16(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay);
|
||||
} while (++c<C);
|
||||
seed = st->rng;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
|
@ -510,7 +503,7 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
|
|||
DECODE_BUFFER_SIZE-N+(overlap>>1));
|
||||
} while (++c<C);
|
||||
|
||||
celt_synthesis(mode, X, out_syn, plcLogE, start, effEnd, C, C, 0, LM, st->downsample, 0, st->arch);
|
||||
celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, C, C, 0, LM, st->downsample, 0, st->arch);
|
||||
} else {
|
||||
/* Pitch-based PLC */
|
||||
const opus_val16 *window;
|
||||
|
@ -1037,10 +1030,18 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
|
|||
/* In case start or end were to change */
|
||||
if (!isTransient)
|
||||
{
|
||||
opus_val16 max_background_increase;
|
||||
OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands);
|
||||
OPUS_COPY(oldLogE, oldBandE, 2*nbEBands);
|
||||
/* In normal circumstances, we only allow the noise floor to increase by
|
||||
up to 2.4 dB/second, but when we're in DTX, we allow up to 6 dB
|
||||
increase for each update.*/
|
||||
if (st->loss_count < 10)
|
||||
max_background_increase = M*QCONST16(0.001f,DB_SHIFT);
|
||||
else
|
||||
max_background_increase = QCONST16(1.f,DB_SHIFT);
|
||||
for (i=0;i<2*nbEBands;i++)
|
||||
backgroundLogE[i] = MIN16(backgroundLogE[i] + M*QCONST16(0.001f,DB_SHIFT), oldBandE[i]);
|
||||
backgroundLogE[i] = MIN16(backgroundLogE[i] + max_background_increase, oldBandE[i]);
|
||||
} else {
|
||||
for (i=0;i<2*nbEBands;i++)
|
||||
oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]);
|
||||
|
|
|
@ -343,9 +343,9 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
|
|||
{
|
||||
int id;
|
||||
#ifdef FIXED_POINT
|
||||
id = IMAX(0,IMIN(127,MULT16_32_Q15(tmp[i],norm))); /* Do not round to nearest */
|
||||
id = MAX32(0,MIN32(127,MULT16_32_Q15(tmp[i]+EPSILON,norm))); /* Do not round to nearest */
|
||||
#else
|
||||
id = IMAX(0,IMIN(127,(int)floor(64*norm*tmp[i]))); /* Do not round to nearest */
|
||||
id = (int)MAX32(0,MIN32(127,floor(64*norm*(tmp[i]+EPSILON)))); /* Do not round to nearest */
|
||||
#endif
|
||||
unmask += inv_table[id];
|
||||
}
|
||||
|
@ -375,8 +375,8 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
|
|||
|
||||
/* Looks for sudden increases of energy to decide whether we need to patch
|
||||
the transient decision */
|
||||
int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands,
|
||||
int end, int C)
|
||||
static int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands,
|
||||
int start, int end, int C)
|
||||
{
|
||||
int i, c;
|
||||
opus_val32 mean_diff=0;
|
||||
|
@ -385,28 +385,28 @@ int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands,
|
|||
avoid false detection caused by irrelevant bands */
|
||||
if (C==1)
|
||||
{
|
||||
spread_old[0] = oldE[0];
|
||||
for (i=1;i<end;i++)
|
||||
spread_old[start] = oldE[start];
|
||||
for (i=start+1;i<end;i++)
|
||||
spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT), oldE[i]);
|
||||
} else {
|
||||
spread_old[0] = MAX16(oldE[0],oldE[nbEBands]);
|
||||
for (i=1;i<end;i++)
|
||||
spread_old[start] = MAX16(oldE[start],oldE[start+nbEBands]);
|
||||
for (i=start+1;i<end;i++)
|
||||
spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT),
|
||||
MAX16(oldE[i],oldE[i+nbEBands]));
|
||||
}
|
||||
for (i=end-2;i>=0;i--)
|
||||
for (i=end-2;i>=start;i--)
|
||||
spread_old[i] = MAX16(spread_old[i], spread_old[i+1]-QCONST16(1.0f, DB_SHIFT));
|
||||
/* Compute mean increase */
|
||||
c=0; do {
|
||||
for (i=2;i<end-1;i++)
|
||||
for (i=IMAX(2,start);i<end-1;i++)
|
||||
{
|
||||
opus_val16 x1, x2;
|
||||
x1 = MAX16(0, newE[i]);
|
||||
x1 = MAX16(0, newE[i + c*nbEBands]);
|
||||
x2 = MAX16(0, spread_old[i]);
|
||||
mean_diff = ADD32(mean_diff, EXTEND32(MAX16(0, SUB16(x1, x2))));
|
||||
}
|
||||
} while (++c<C);
|
||||
mean_diff = DIV32(mean_diff, C*(end-3));
|
||||
mean_diff = DIV32(mean_diff, C*(end-1-IMAX(2,start)));
|
||||
/*printf("%f %f %d\n", mean_diff, max_diff, count);*/
|
||||
return mean_diff > QCONST16(1.f, DB_SHIFT);
|
||||
}
|
||||
|
@ -1735,7 +1735,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
|
|||
time-domain analysis */
|
||||
if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe)
|
||||
{
|
||||
if (patch_transient_decision(bandLogE, oldBandE, nbEBands, end, C))
|
||||
if (patch_transient_decision(bandLogE, oldBandE, nbEBands, start, end, C))
|
||||
{
|
||||
isTransient = 1;
|
||||
shortBlocks = M;
|
||||
|
|
|
@ -45,16 +45,18 @@
|
|||
|
||||
#elif (defined(OPUS_X86_MAY_HAVE_SSE) && !defined(OPUS_X86_PRESUME_SSE)) || \
|
||||
(defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(OPUS_X86_PRESUME_SSE2)) || \
|
||||
(defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1))
|
||||
(defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1)) || \
|
||||
(defined(OPUS_X86_MAY_HAVE_AVX) && !defined(OPUS_X86_PRESUME_AVX))
|
||||
|
||||
#include "x86/x86cpu.h"
|
||||
/* We currently support 4 x86 variants:
|
||||
/* We currently support 5 x86 variants:
|
||||
* arch[0] -> non-sse
|
||||
* arch[1] -> sse
|
||||
* arch[2] -> sse2
|
||||
* arch[3] -> sse4.1
|
||||
* arch[4] -> avx
|
||||
*/
|
||||
#define OPUS_ARCHMASK 3
|
||||
#define OPUS_ARCHMASK 7
|
||||
int opus_select_arch(void);
|
||||
|
||||
#else
|
||||
|
|
|
@ -292,7 +292,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
|
|||
#endif
|
||||
}
|
||||
if (lfe)
|
||||
max_decay=3;
|
||||
max_decay = QCONST16(3.f,DB_SHIFT);
|
||||
enc_start_state = *enc;
|
||||
|
||||
ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16);
|
||||
|
|
|
@ -131,7 +131,7 @@ void compute_pulse_cache(CELTMode *m, int LM)
|
|||
for (i=0;i<nbEntries;i++)
|
||||
{
|
||||
unsigned char *ptr = bits+entryI[i];
|
||||
opus_int16 tmp[MAX_PULSES+1];
|
||||
opus_int16 tmp[CELT_MAX_PULSES+1];
|
||||
get_required_bits(tmp, entryN[i], get_pulses(entryK[i]), BITRES);
|
||||
for (j=1;j<=entryK[i];j++)
|
||||
ptr[j] = tmp[get_pulses(j)]-1;
|
||||
|
|
|
@ -131,7 +131,7 @@ void compute_pulse_cache(CELTMode *m, int LM)
|
|||
for (i=0;i<nbEntries;i++)
|
||||
{
|
||||
unsigned char *ptr = bits+entryI[i];
|
||||
opus_int16 tmp[MAX_PULSES+1];
|
||||
opus_int16 tmp[CELT_MAX_PULSES+1];
|
||||
get_required_bits(tmp, entryN[i], get_pulses(entryK[i]), BITRES);
|
||||
for (j=1;j<=entryK[i];j++)
|
||||
ptr[j] = tmp[get_pulses(j)]-1;
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#define MAX_PSEUDO 40
|
||||
#define LOG_MAX_PSEUDO 6
|
||||
|
||||
#define MAX_PULSES 128
|
||||
#define CELT_MAX_PULSES 128
|
||||
|
||||
#define MAX_FINE_BITS 8
|
||||
|
||||
|
|
|
@ -0,0 +1,132 @@
|
|||
/* Copyright (c) 2014, Cisco Systems, INC
|
||||
Written by XiangMingZhu WeiZhou MinPeng YanWang
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
- Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <xmmintrin.h>
|
||||
#include <emmintrin.h>
|
||||
#include <smmintrin.h>
|
||||
#include "celt_lpc.h"
|
||||
#include "stack_alloc.h"
|
||||
#include "mathops.h"
|
||||
#include "pitch.h"
|
||||
#include "x86cpu.h"
|
||||
|
||||
#if defined(FIXED_POINT)
|
||||
|
||||
void celt_fir_sse4_1(const opus_val16 *_x,
|
||||
const opus_val16 *num,
|
||||
opus_val16 *_y,
|
||||
int N,
|
||||
int ord,
|
||||
opus_val16 *mem,
|
||||
int arch)
|
||||
{
|
||||
int i,j;
|
||||
VARDECL(opus_val16, rnum);
|
||||
VARDECL(opus_val16, x);
|
||||
|
||||
__m128i vecNoA;
|
||||
opus_int32 noA ;
|
||||
SAVE_STACK;
|
||||
|
||||
ALLOC(rnum, ord, opus_val16);
|
||||
ALLOC(x, N+ord, opus_val16);
|
||||
for(i=0;i<ord;i++)
|
||||
rnum[i] = num[ord-i-1];
|
||||
for(i=0;i<ord;i++)
|
||||
x[i] = mem[ord-i-1];
|
||||
|
||||
for (i=0;i<N-7;i+=8)
|
||||
{
|
||||
x[i+ord ]=_x[i ];
|
||||
x[i+ord+1]=_x[i+1];
|
||||
x[i+ord+2]=_x[i+2];
|
||||
x[i+ord+3]=_x[i+3];
|
||||
x[i+ord+4]=_x[i+4];
|
||||
x[i+ord+5]=_x[i+5];
|
||||
x[i+ord+6]=_x[i+6];
|
||||
x[i+ord+7]=_x[i+7];
|
||||
}
|
||||
|
||||
for (;i<N-3;i+=4)
|
||||
{
|
||||
x[i+ord ]=_x[i ];
|
||||
x[i+ord+1]=_x[i+1];
|
||||
x[i+ord+2]=_x[i+2];
|
||||
x[i+ord+3]=_x[i+3];
|
||||
}
|
||||
|
||||
for (;i<N;i++)
|
||||
x[i+ord]=_x[i];
|
||||
|
||||
for(i=0;i<ord;i++)
|
||||
mem[i] = _x[N-i-1];
|
||||
#ifdef SMALL_FOOTPRINT
|
||||
for (i=0;i<N;i++)
|
||||
{
|
||||
opus_val32 sum = SHL32(EXTEND32(_x[i]), SIG_SHIFT);
|
||||
for (j=0;j<ord;j++)
|
||||
{
|
||||
sum = MAC16_16(sum,rnum[j],x[i+j]);
|
||||
}
|
||||
_y[i] = SATURATE16(PSHR32(sum, SIG_SHIFT));
|
||||
}
|
||||
#else
|
||||
noA = EXTEND32(1) << SIG_SHIFT >> 1;
|
||||
vecNoA = _mm_set_epi32(noA, noA, noA, noA);
|
||||
|
||||
for (i=0;i<N-3;i+=4)
|
||||
{
|
||||
opus_val32 sums[4] = {0};
|
||||
__m128i vecSum, vecX;
|
||||
|
||||
xcorr_kernel(rnum, x+i, sums, ord, arch);
|
||||
|
||||
vecSum = _mm_loadu_si128((__m128i *)sums);
|
||||
vecSum = _mm_add_epi32(vecSum, vecNoA);
|
||||
vecSum = _mm_srai_epi32(vecSum, SIG_SHIFT);
|
||||
vecX = OP_CVTEPI16_EPI32_M64(_x + i);
|
||||
vecSum = _mm_add_epi32(vecSum, vecX);
|
||||
vecSum = _mm_packs_epi32(vecSum, vecSum);
|
||||
_mm_storel_epi64((__m128i *)(_y + i), vecSum);
|
||||
}
|
||||
for (;i<N;i++)
|
||||
{
|
||||
opus_val32 sum = 0;
|
||||
for (j=0;j<ord;j++)
|
||||
sum = MAC16_16(sum, rnum[j], x[i + j]);
|
||||
_y[i] = SATURATE16(ADD32(EXTEND32(_x[i]), PSHR32(sum, SIG_SHIFT)));
|
||||
}
|
||||
|
||||
#endif
|
||||
RESTORE_STACK;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,95 @@
|
|||
/* Copyright (c) 2014, Cisco Systems, INC
|
||||
Written by XiangMingZhu WeiZhou MinPeng YanWang
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
- Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <xmmintrin.h>
|
||||
#include <emmintrin.h>
|
||||
|
||||
#include "macros.h"
|
||||
#include "celt_lpc.h"
|
||||
#include "stack_alloc.h"
|
||||
#include "mathops.h"
|
||||
#include "pitch.h"
|
||||
|
||||
#if defined(OPUS_X86_MAY_HAVE_SSE2) && defined(FIXED_POINT)
|
||||
opus_val32 celt_inner_prod_sse2(const opus_val16 *x, const opus_val16 *y,
|
||||
int N)
|
||||
{
|
||||
opus_int i, dataSize16;
|
||||
opus_int32 sum;
|
||||
|
||||
__m128i inVec1_76543210, inVec1_FEDCBA98, acc1;
|
||||
__m128i inVec2_76543210, inVec2_FEDCBA98, acc2;
|
||||
|
||||
sum = 0;
|
||||
dataSize16 = N & ~15;
|
||||
|
||||
acc1 = _mm_setzero_si128();
|
||||
acc2 = _mm_setzero_si128();
|
||||
|
||||
for (i=0;i<dataSize16;i+=16)
|
||||
{
|
||||
inVec1_76543210 = _mm_loadu_si128((__m128i *)(&x[i + 0]));
|
||||
inVec2_76543210 = _mm_loadu_si128((__m128i *)(&y[i + 0]));
|
||||
|
||||
inVec1_FEDCBA98 = _mm_loadu_si128((__m128i *)(&x[i + 8]));
|
||||
inVec2_FEDCBA98 = _mm_loadu_si128((__m128i *)(&y[i + 8]));
|
||||
|
||||
inVec1_76543210 = _mm_madd_epi16(inVec1_76543210, inVec2_76543210);
|
||||
inVec1_FEDCBA98 = _mm_madd_epi16(inVec1_FEDCBA98, inVec2_FEDCBA98);
|
||||
|
||||
acc1 = _mm_add_epi32(acc1, inVec1_76543210);
|
||||
acc2 = _mm_add_epi32(acc2, inVec1_FEDCBA98);
|
||||
}
|
||||
|
||||
acc1 = _mm_add_epi32( acc1, acc2 );
|
||||
|
||||
if (N - i >= 8)
|
||||
{
|
||||
inVec1_76543210 = _mm_loadu_si128((__m128i *)(&x[i + 0]));
|
||||
inVec2_76543210 = _mm_loadu_si128((__m128i *)(&y[i + 0]));
|
||||
|
||||
inVec1_76543210 = _mm_madd_epi16(inVec1_76543210, inVec2_76543210);
|
||||
|
||||
acc1 = _mm_add_epi32(acc1, inVec1_76543210);
|
||||
i += 8;
|
||||
}
|
||||
|
||||
acc1 = _mm_add_epi32(acc1, _mm_unpackhi_epi64( acc1, acc1));
|
||||
acc1 = _mm_add_epi32(acc1, _mm_shufflelo_epi16( acc1, 0x0E));
|
||||
sum += _mm_cvtsi128_si32(acc1);
|
||||
|
||||
for (;i<N;i++) {
|
||||
sum = silk_SMLABB(sum, x[i], y[i]);
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
#endif
|
|
@ -53,6 +53,7 @@ void (*const CELT_FIR_IMPL[OPUS_ARCHMASK + 1])(
|
|||
celt_fir_c,
|
||||
celt_fir_c,
|
||||
MAY_HAVE_SSE4_1(celt_fir), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1(celt_fir) /* avx */
|
||||
};
|
||||
|
||||
void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
|
||||
|
@ -65,6 +66,7 @@ void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
|
|||
xcorr_kernel_c,
|
||||
xcorr_kernel_c,
|
||||
MAY_HAVE_SSE4_1(xcorr_kernel), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1(xcorr_kernel) /* avx */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -81,6 +83,7 @@ opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
|||
celt_inner_prod_c,
|
||||
MAY_HAVE_SSE2(celt_inner_prod),
|
||||
MAY_HAVE_SSE4_1(celt_inner_prod), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1(celt_inner_prod) /* avx */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -99,6 +102,7 @@ void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
|
|||
MAY_HAVE_SSE(xcorr_kernel),
|
||||
MAY_HAVE_SSE(xcorr_kernel),
|
||||
MAY_HAVE_SSE(xcorr_kernel),
|
||||
MAY_HAVE_SSE(xcorr_kernel)
|
||||
};
|
||||
|
||||
opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
||||
|
@ -110,6 +114,7 @@ opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
|||
MAY_HAVE_SSE(celt_inner_prod),
|
||||
MAY_HAVE_SSE(celt_inner_prod),
|
||||
MAY_HAVE_SSE(celt_inner_prod),
|
||||
MAY_HAVE_SSE(celt_inner_prod)
|
||||
};
|
||||
|
||||
void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
||||
|
@ -124,6 +129,7 @@ void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
|||
MAY_HAVE_SSE(dual_inner_prod),
|
||||
MAY_HAVE_SSE(dual_inner_prod),
|
||||
MAY_HAVE_SSE(dual_inner_prod),
|
||||
MAY_HAVE_SSE(dual_inner_prod)
|
||||
};
|
||||
|
||||
void (*const COMB_FILTER_CONST_IMPL[OPUS_ARCHMASK + 1])(
|
||||
|
@ -139,6 +145,7 @@ void (*const COMB_FILTER_CONST_IMPL[OPUS_ARCHMASK + 1])(
|
|||
MAY_HAVE_SSE(comb_filter_const),
|
||||
MAY_HAVE_SSE(comb_filter_const),
|
||||
MAY_HAVE_SSE(comb_filter_const),
|
||||
MAY_HAVE_SSE(comb_filter_const)
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -37,7 +37,8 @@
|
|||
|
||||
#if (defined(OPUS_X86_MAY_HAVE_SSE) && !defined(OPUS_X86_PRESUME_SSE)) || \
|
||||
(defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(OPUS_X86_PRESUME_SSE2)) || \
|
||||
(defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1))
|
||||
(defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1)) || \
|
||||
(defined(OPUS_X86_MAY_HAVE_AVX) && !defined(OPUS_X86_PRESUME_AVX))
|
||||
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
|
@ -91,6 +92,8 @@ typedef struct CPU_Feature{
|
|||
int HW_SSE;
|
||||
int HW_SSE2;
|
||||
int HW_SSE41;
|
||||
/* SIMD: 256-bit */
|
||||
int HW_AVX;
|
||||
} CPU_Feature;
|
||||
|
||||
static void opus_cpu_feature_check(CPU_Feature *cpu_feature)
|
||||
|
@ -106,11 +109,13 @@ static void opus_cpu_feature_check(CPU_Feature *cpu_feature)
|
|||
cpu_feature->HW_SSE = (info[3] & (1 << 25)) != 0;
|
||||
cpu_feature->HW_SSE2 = (info[3] & (1 << 26)) != 0;
|
||||
cpu_feature->HW_SSE41 = (info[2] & (1 << 19)) != 0;
|
||||
cpu_feature->HW_AVX = (info[2] & (1 << 28)) != 0;
|
||||
}
|
||||
else {
|
||||
cpu_feature->HW_SSE = 0;
|
||||
cpu_feature->HW_SSE2 = 0;
|
||||
cpu_feature->HW_SSE41 = 0;
|
||||
cpu_feature->HW_AVX = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,6 +145,12 @@ int opus_select_arch(void)
|
|||
}
|
||||
arch++;
|
||||
|
||||
if (!cpu_feature.HW_AVX)
|
||||
{
|
||||
return arch;
|
||||
}
|
||||
arch++;
|
||||
|
||||
return arch;
|
||||
}
|
||||
|
||||
|
|
|
@ -46,6 +46,12 @@
|
|||
# define MAY_HAVE_SSE4_1(name) name ## _c
|
||||
# endif
|
||||
|
||||
# if defined(OPUS_X86_MAY_HAVE_AVX)
|
||||
# define MAY_HAVE_AVX(name) name ## _avx
|
||||
# else
|
||||
# define MAY_HAVE_AVX(name) name ## _c
|
||||
# endif
|
||||
|
||||
# if defined(OPUS_HAVE_RTCD)
|
||||
int opus_select_arch(void);
|
||||
# endif
|
||||
|
|
|
@ -523,10 +523,19 @@ extern "C" {
|
|||
* @hideinitializer */
|
||||
#define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x)
|
||||
/** Configures the depth of signal being encoded.
|
||||
*
|
||||
* This is a hint which helps the encoder identify silence and near-silence.
|
||||
* It represents the number of significant bits of linear intensity below
|
||||
* which the signal contains ignorable quantization or other noise.
|
||||
*
|
||||
* For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting
|
||||
* for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate
|
||||
* for 16-bit linear pcm input with opus_encode_float().
|
||||
*
|
||||
* When using opus_encode() instead of opus_encode_float(), or when libopus
|
||||
* is compiled for fixed-point, the encoder uses the minimum of the value
|
||||
* set here and the value 16.
|
||||
*
|
||||
* @see OPUS_GET_LSB_DEPTH
|
||||
* @param[in] x <tt>opus_int32</tt>: Input precision in bits, between 8 and 24
|
||||
* (default: 24).
|
||||
|
|
|
@ -20,7 +20,7 @@ ALLOW_COMPILER_WARNINGS = True
|
|||
FINAL_LIBRARY = 'gkmedias'
|
||||
|
||||
DEFINES['OPUS_BUILD'] = True
|
||||
DEFINES['OPUS_VERSION'] = '"v1.1.1-mozilla"'
|
||||
DEFINES['OPUS_VERSION'] = '"v1.1.2-mozilla"'
|
||||
DEFINES['USE_ALLOCA'] = True
|
||||
|
||||
# Don't export symbols
|
||||
|
|
|
@ -69,9 +69,9 @@ void silk_decode_pulses(
|
|||
sum_pulses[ i ] = ec_dec_icdf( psRangeDec, cdf_ptr, 8 );
|
||||
|
||||
/* LSB indication */
|
||||
while( sum_pulses[ i ] == MAX_PULSES + 1 ) {
|
||||
while( sum_pulses[ i ] == SILK_MAX_PULSES + 1 ) {
|
||||
nLshifts[ i ]++;
|
||||
/* When we've already got 10 LSBs, we shift the table to not allow (MAX_PULSES + 1) */
|
||||
/* When we've already got 10 LSBs, we shift the table to not allow (SILK_MAX_PULSES + 1) */
|
||||
sum_pulses[ i ] = ec_dec_icdf( psRangeDec,
|
||||
silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1] + ( nLshifts[ i ] == 10 ), 8 );
|
||||
}
|
||||
|
|
|
@ -169,7 +169,7 @@ extern "C"
|
|||
#define N_RATE_LEVELS 10
|
||||
|
||||
/* Maximum sum of pulses per shell coding frame */
|
||||
#define MAX_PULSES 16
|
||||
#define SILK_MAX_PULSES 16
|
||||
|
||||
#define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */
|
||||
|
||||
|
|
|
@ -142,7 +142,7 @@ void silk_encode_pulses(
|
|||
sumBits_Q5 = silk_rate_levels_BITS_Q5[ signalType >> 1 ][ k ];
|
||||
for( i = 0; i < iter; i++ ) {
|
||||
if( nRshifts[ i ] > 0 ) {
|
||||
sumBits_Q5 += nBits_ptr[ MAX_PULSES + 1 ];
|
||||
sumBits_Q5 += nBits_ptr[ SILK_MAX_PULSES + 1 ];
|
||||
} else {
|
||||
sumBits_Q5 += nBits_ptr[ sum_pulses[ i ] ];
|
||||
}
|
||||
|
@ -162,9 +162,9 @@ void silk_encode_pulses(
|
|||
if( nRshifts[ i ] == 0 ) {
|
||||
ec_enc_icdf( psRangeEnc, sum_pulses[ i ], cdf_ptr, 8 );
|
||||
} else {
|
||||
ec_enc_icdf( psRangeEnc, MAX_PULSES + 1, cdf_ptr, 8 );
|
||||
ec_enc_icdf( psRangeEnc, SILK_MAX_PULSES + 1, cdf_ptr, 8 );
|
||||
for( k = 0; k < nRshifts[ i ] - 1; k++ ) {
|
||||
ec_enc_icdf( psRangeEnc, MAX_PULSES + 1, silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 );
|
||||
ec_enc_icdf( psRangeEnc, SILK_MAX_PULSES + 1, silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 );
|
||||
}
|
||||
ec_enc_icdf( psRangeEnc, sum_pulses[ i ], silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 );
|
||||
}
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
/* Copyright (c) 2014, Cisco Systems, INC
|
||||
Written by XiangMingZhu WeiZhou MinPeng YanWang
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
- Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <xmmintrin.h>
|
||||
#include <emmintrin.h>
|
||||
#include <smmintrin.h>
|
||||
#include "main.h"
|
||||
|
||||
#include "SigProc_FIX.h"
|
||||
#include "pitch.h"
|
||||
|
||||
opus_int64 silk_inner_prod16_aligned_64_sse4_1(
|
||||
const opus_int16 *inVec1, /* I input vector 1 */
|
||||
const opus_int16 *inVec2, /* I input vector 2 */
|
||||
const opus_int len /* I vector lengths */
|
||||
)
|
||||
{
|
||||
opus_int i, dataSize8;
|
||||
opus_int64 sum;
|
||||
|
||||
__m128i xmm_tempa;
|
||||
__m128i inVec1_76543210, acc1;
|
||||
__m128i inVec2_76543210, acc2;
|
||||
|
||||
sum = 0;
|
||||
dataSize8 = len & ~7;
|
||||
|
||||
acc1 = _mm_setzero_si128();
|
||||
acc2 = _mm_setzero_si128();
|
||||
|
||||
for( i = 0; i < dataSize8; i += 8 ) {
|
||||
inVec1_76543210 = _mm_loadu_si128( (__m128i *)(&inVec1[i + 0] ) );
|
||||
inVec2_76543210 = _mm_loadu_si128( (__m128i *)(&inVec2[i + 0] ) );
|
||||
|
||||
/* only when all 4 operands are -32768 (0x8000), this results in wrap around */
|
||||
inVec1_76543210 = _mm_madd_epi16( inVec1_76543210, inVec2_76543210 );
|
||||
|
||||
xmm_tempa = _mm_cvtepi32_epi64( inVec1_76543210 );
|
||||
/* equal shift right 8 bytes */
|
||||
inVec1_76543210 = _mm_shuffle_epi32( inVec1_76543210, _MM_SHUFFLE( 0, 0, 3, 2 ) );
|
||||
inVec1_76543210 = _mm_cvtepi32_epi64( inVec1_76543210 );
|
||||
|
||||
acc1 = _mm_add_epi64( acc1, xmm_tempa );
|
||||
acc2 = _mm_add_epi64( acc2, inVec1_76543210 );
|
||||
}
|
||||
|
||||
acc1 = _mm_add_epi64( acc1, acc2 );
|
||||
|
||||
/* equal shift right 8 bytes */
|
||||
acc2 = _mm_shuffle_epi32( acc1, _MM_SHUFFLE( 0, 0, 3, 2 ) );
|
||||
acc1 = _mm_add_epi64( acc1, acc2 );
|
||||
|
||||
_mm_storel_epi64( (__m128i *)&sum, acc1 );
|
||||
|
||||
for( ; i < len; i++ ) {
|
||||
sum = silk_SMLABB( sum, inVec1[ i ], inVec2[ i ] );
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
|
@ -47,8 +47,8 @@ extern const opus_uint8 silk_pitch_contour_NB_iCDF[ 11 ];
|
|||
extern const opus_uint8 silk_pitch_contour_10_ms_iCDF[ 12 ]; /* 12 */
|
||||
extern const opus_uint8 silk_pitch_contour_10_ms_NB_iCDF[ 3 ]; /* 3 */
|
||||
|
||||
extern const opus_uint8 silk_pulses_per_block_iCDF[ N_RATE_LEVELS ][ MAX_PULSES + 2 ]; /* 180 */
|
||||
extern const opus_uint8 silk_pulses_per_block_BITS_Q5[ N_RATE_LEVELS - 1 ][ MAX_PULSES + 2 ]; /* 162 */
|
||||
extern const opus_uint8 silk_pulses_per_block_iCDF[ N_RATE_LEVELS ][ SILK_MAX_PULSES + 2 ]; /* 180 */
|
||||
extern const opus_uint8 silk_pulses_per_block_BITS_Q5[ N_RATE_LEVELS - 1 ][ SILK_MAX_PULSES + 2 ]; /* 162 */
|
||||
|
||||
extern const opus_uint8 silk_rate_levels_iCDF[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */
|
||||
extern const opus_uint8 silk_rate_levels_BITS_Q5[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */
|
||||
|
@ -59,7 +59,7 @@ extern const opus_uint8 silk_shell_code_table0[ 152 ];
|
|||
extern const opus_uint8 silk_shell_code_table1[ 152 ]; /* 152 */
|
||||
extern const opus_uint8 silk_shell_code_table2[ 152 ]; /* 152 */
|
||||
extern const opus_uint8 silk_shell_code_table3[ 152 ]; /* 152 */
|
||||
extern const opus_uint8 silk_shell_code_table_offsets[ MAX_PULSES + 1 ]; /* 17 */
|
||||
extern const opus_uint8 silk_shell_code_table_offsets[ SILK_MAX_PULSES + 1 ]; /* 17 */
|
||||
|
||||
extern const opus_uint8 silk_lsb_iCDF[ 2 ]; /* 2 */
|
||||
|
||||
|
|
|
@ -0,0 +1,720 @@
|
|||
/* Copyright (c) 2014, Cisco Systems, INC
|
||||
Written by XiangMingZhu WeiZhou MinPeng YanWang
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
- Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <xmmintrin.h>
|
||||
#include <emmintrin.h>
|
||||
#include <smmintrin.h>
|
||||
#include "main.h"
|
||||
#include "celt/x86/x86cpu.h"
|
||||
#include "stack_alloc.h"
|
||||
|
||||
static OPUS_INLINE void silk_nsq_scale_states_sse4_1(
|
||||
const silk_encoder_state *psEncC, /* I Encoder State */
|
||||
silk_nsq_state *NSQ, /* I/O NSQ state */
|
||||
const opus_int32 x_Q3[], /* I input in Q3 */
|
||||
opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */
|
||||
const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */
|
||||
opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */
|
||||
opus_int subfr, /* I subframe number */
|
||||
const opus_int LTP_scale_Q14, /* I */
|
||||
const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
|
||||
const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */
|
||||
const opus_int signal_type /* I Signal type */
|
||||
);
|
||||
|
||||
static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1(
|
||||
silk_nsq_state *NSQ, /* I/O NSQ state */
|
||||
opus_int signalType, /* I Signal type */
|
||||
const opus_int32 x_sc_Q10[], /* I */
|
||||
opus_int8 pulses[], /* O */
|
||||
opus_int16 xq[], /* O */
|
||||
opus_int32 sLTP_Q15[], /* I/O LTP state */
|
||||
const opus_int16 a_Q12[], /* I Short term prediction coefs */
|
||||
const opus_int16 b_Q14[], /* I Long term prediction coefs */
|
||||
const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */
|
||||
opus_int lag, /* I Pitch lag */
|
||||
opus_int32 HarmShapeFIRPacked_Q14, /* I */
|
||||
opus_int Tilt_Q14, /* I Spectral tilt */
|
||||
opus_int32 LF_shp_Q14, /* I */
|
||||
opus_int32 Gain_Q16, /* I */
|
||||
opus_int offset_Q10, /* I */
|
||||
opus_int length, /* I Input length */
|
||||
opus_int32 table[][4] /* I */
|
||||
);
|
||||
|
||||
void silk_NSQ_sse4_1(
|
||||
const silk_encoder_state *psEncC, /* I/O Encoder State */
|
||||
silk_nsq_state *NSQ, /* I/O NSQ state */
|
||||
SideInfoIndices *psIndices, /* I/O Quantization Indices */
|
||||
const opus_int32 x_Q3[], /* I Prefiltered input signal */
|
||||
opus_int8 pulses[], /* O Quantized pulse signal */
|
||||
const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */
|
||||
const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */
|
||||
const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */
|
||||
const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */
|
||||
const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */
|
||||
const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */
|
||||
const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */
|
||||
const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */
|
||||
const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */
|
||||
const opus_int LTP_scale_Q14 /* I LTP state scaling */
|
||||
)
|
||||
{
|
||||
opus_int k, lag, start_idx, LSF_interpolation_flag;
|
||||
const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
|
||||
opus_int16 *pxq;
|
||||
VARDECL( opus_int32, sLTP_Q15 );
|
||||
VARDECL( opus_int16, sLTP );
|
||||
opus_int32 HarmShapeFIRPacked_Q14;
|
||||
opus_int offset_Q10;
|
||||
VARDECL( opus_int32, x_sc_Q10 );
|
||||
|
||||
opus_int32 table[ 64 ][ 4 ];
|
||||
opus_int32 tmp1;
|
||||
opus_int32 q1_Q10, q2_Q10, rd1_Q20, rd2_Q20;
|
||||
|
||||
SAVE_STACK;
|
||||
|
||||
NSQ->rand_seed = psIndices->Seed;
|
||||
|
||||
/* Set unvoiced lag to the previous one, overwrite later for voiced */
|
||||
lag = NSQ->lagPrev;
|
||||
|
||||
silk_assert( NSQ->prev_gain_Q16 != 0 );
|
||||
|
||||
offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ];
|
||||
|
||||
/* 0 */
|
||||
q1_Q10 = offset_Q10;
|
||||
q2_Q10 = offset_Q10 + ( 1024 - QUANT_LEVEL_ADJUST_Q10 );
|
||||
rd1_Q20 = q1_Q10 * Lambda_Q10;
|
||||
rd2_Q20 = q2_Q10 * Lambda_Q10;
|
||||
|
||||
table[ 32 ][ 0 ] = q1_Q10;
|
||||
table[ 32 ][ 1 ] = q2_Q10;
|
||||
table[ 32 ][ 2 ] = 2 * (q1_Q10 - q2_Q10);
|
||||
table[ 32 ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10);
|
||||
|
||||
/* -1 */
|
||||
q1_Q10 = offset_Q10 - ( 1024 - QUANT_LEVEL_ADJUST_Q10 );
|
||||
q2_Q10 = offset_Q10;
|
||||
rd1_Q20 = - q1_Q10 * Lambda_Q10;
|
||||
rd2_Q20 = q2_Q10 * Lambda_Q10;
|
||||
|
||||
table[ 31 ][ 0 ] = q1_Q10;
|
||||
table[ 31 ][ 1 ] = q2_Q10;
|
||||
table[ 31 ][ 2 ] = 2 * (q1_Q10 - q2_Q10);
|
||||
table[ 31 ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10);
|
||||
|
||||
/* > 0 */
|
||||
for (k = 1; k <= 31; k++)
|
||||
{
|
||||
tmp1 = offset_Q10 + silk_LSHIFT( k, 10 );
|
||||
|
||||
q1_Q10 = tmp1 - QUANT_LEVEL_ADJUST_Q10;
|
||||
q2_Q10 = tmp1 - QUANT_LEVEL_ADJUST_Q10 + 1024;
|
||||
rd1_Q20 = q1_Q10 * Lambda_Q10;
|
||||
rd2_Q20 = q2_Q10 * Lambda_Q10;
|
||||
|
||||
table[ 32 + k ][ 0 ] = q1_Q10;
|
||||
table[ 32 + k ][ 1 ] = q2_Q10;
|
||||
table[ 32 + k ][ 2 ] = 2 * (q1_Q10 - q2_Q10);
|
||||
table[ 32 + k ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10);
|
||||
}
|
||||
|
||||
/* < -1 */
|
||||
for (k = -32; k <= -2; k++)
|
||||
{
|
||||
tmp1 = offset_Q10 + silk_LSHIFT( k, 10 );
|
||||
|
||||
q1_Q10 = tmp1 + QUANT_LEVEL_ADJUST_Q10;
|
||||
q2_Q10 = tmp1 + QUANT_LEVEL_ADJUST_Q10 + 1024;
|
||||
rd1_Q20 = - q1_Q10 * Lambda_Q10;
|
||||
rd2_Q20 = - q2_Q10 * Lambda_Q10;
|
||||
|
||||
table[ 32 + k ][ 0 ] = q1_Q10;
|
||||
table[ 32 + k ][ 1 ] = q2_Q10;
|
||||
table[ 32 + k ][ 2 ] = 2 * (q1_Q10 - q2_Q10);
|
||||
table[ 32 + k ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10);
|
||||
}
|
||||
|
||||
if( psIndices->NLSFInterpCoef_Q2 == 4 ) {
|
||||
LSF_interpolation_flag = 0;
|
||||
} else {
|
||||
LSF_interpolation_flag = 1;
|
||||
}
|
||||
|
||||
ALLOC( sLTP_Q15,
|
||||
psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 );
|
||||
ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 );
|
||||
ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 );
|
||||
/* Set up pointers to start of sub frame */
|
||||
NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
|
||||
NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
|
||||
pxq = &NSQ->xq[ psEncC->ltp_mem_length ];
|
||||
for( k = 0; k < psEncC->nb_subfr; k++ ) {
|
||||
A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ];
|
||||
B_Q14 = <PCoef_Q14[ k * LTP_ORDER ];
|
||||
AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ];
|
||||
|
||||
/* Noise shape parameters */
|
||||
silk_assert( HarmShapeGain_Q14[ k ] >= 0 );
|
||||
HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
|
||||
HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
|
||||
|
||||
NSQ->rewhite_flag = 0;
|
||||
if( psIndices->signalType == TYPE_VOICED ) {
|
||||
/* Voiced */
|
||||
lag = pitchL[ k ];
|
||||
|
||||
/* Re-whitening */
|
||||
if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
|
||||
/* Rewhiten with new A coefs */
|
||||
start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
|
||||
silk_assert( start_idx > 0 );
|
||||
|
||||
silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
|
||||
A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch );
|
||||
|
||||
NSQ->rewhite_flag = 1;
|
||||
NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
|
||||
}
|
||||
}
|
||||
|
||||
silk_nsq_scale_states_sse4_1( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType );
|
||||
|
||||
if ( opus_likely( ( 10 == psEncC->shapingLPCOrder ) && ( 16 == psEncC->predictLPCOrder) ) )
|
||||
{
|
||||
silk_noise_shape_quantizer_10_16_sse4_1( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14,
|
||||
AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ],
|
||||
offset_Q10, psEncC->subfr_length, &(table[32]) );
|
||||
}
|
||||
else
|
||||
{
|
||||
silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14,
|
||||
AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10,
|
||||
offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder );
|
||||
}
|
||||
|
||||
x_Q3 += psEncC->subfr_length;
|
||||
pulses += psEncC->subfr_length;
|
||||
pxq += psEncC->subfr_length;
|
||||
}
|
||||
|
||||
/* Update lagPrev for next frame */
|
||||
NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ];
|
||||
|
||||
/* Save quantized speech and noise shaping signals */
|
||||
/* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[ psEncC->ltp_mem_length ], psEncC->frame_length * sizeof( opus_int16 ) ) */
|
||||
silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) );
|
||||
silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) );
|
||||
RESTORE_STACK;
|
||||
}
|
||||
|
||||
/***********************************/
|
||||
/* silk_noise_shape_quantizer_10_16 */
|
||||
/***********************************/
|
||||
static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1(
|
||||
silk_nsq_state *NSQ, /* I/O NSQ state */
|
||||
opus_int signalType, /* I Signal type */
|
||||
const opus_int32 x_sc_Q10[], /* I */
|
||||
opus_int8 pulses[], /* O */
|
||||
opus_int16 xq[], /* O */
|
||||
opus_int32 sLTP_Q15[], /* I/O LTP state */
|
||||
const opus_int16 a_Q12[], /* I Short term prediction coefs */
|
||||
const opus_int16 b_Q14[], /* I Long term prediction coefs */
|
||||
const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */
|
||||
opus_int lag, /* I Pitch lag */
|
||||
opus_int32 HarmShapeFIRPacked_Q14, /* I */
|
||||
opus_int Tilt_Q14, /* I Spectral tilt */
|
||||
opus_int32 LF_shp_Q14, /* I */
|
||||
opus_int32 Gain_Q16, /* I */
|
||||
opus_int offset_Q10, /* I */
|
||||
opus_int length, /* I Input length */
|
||||
opus_int32 table[][4] /* I */
|
||||
)
|
||||
{
|
||||
opus_int i;
|
||||
opus_int32 LTP_pred_Q13, LPC_pred_Q10, n_AR_Q12, n_LTP_Q13;
|
||||
opus_int32 n_LF_Q12, r_Q10, q1_Q0, q1_Q10, q2_Q10;
|
||||
opus_int32 exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10;
|
||||
opus_int32 tmp1, tmp2, sLF_AR_shp_Q14;
|
||||
opus_int32 *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr;
|
||||
|
||||
__m128i xmm_tempa, xmm_tempb;
|
||||
|
||||
__m128i xmm_one;
|
||||
|
||||
__m128i psLPC_Q14_hi_01234567, psLPC_Q14_hi_89ABCDEF;
|
||||
__m128i psLPC_Q14_lo_01234567, psLPC_Q14_lo_89ABCDEF;
|
||||
__m128i a_Q12_01234567, a_Q12_89ABCDEF;
|
||||
|
||||
__m128i sAR2_Q14_hi_76543210, sAR2_Q14_lo_76543210;
|
||||
__m128i AR_shp_Q13_76543210;
|
||||
|
||||
shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
|
||||
pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
|
||||
Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 );
|
||||
|
||||
/* Set up short term AR state */
|
||||
psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 ];
|
||||
|
||||
sLF_AR_shp_Q14 = NSQ->sLF_AR_shp_Q14;
|
||||
xq_Q14 = psLPC_Q14[ 0 ];
|
||||
LTP_pred_Q13 = 0;
|
||||
|
||||
/* load a_Q12 */
|
||||
xmm_one = _mm_set_epi8( 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 );
|
||||
|
||||
/* load a_Q12[0] - a_Q12[7] */
|
||||
a_Q12_01234567 = _mm_loadu_si128( (__m128i *)(&a_Q12[ 0 ] ) );
|
||||
/* load a_Q12[ 8 ] - a_Q12[ 15 ] */
|
||||
a_Q12_89ABCDEF = _mm_loadu_si128( (__m128i *)(&a_Q12[ 8 ] ) );
|
||||
|
||||
a_Q12_01234567 = _mm_shuffle_epi8( a_Q12_01234567, xmm_one );
|
||||
a_Q12_89ABCDEF = _mm_shuffle_epi8( a_Q12_89ABCDEF, xmm_one );
|
||||
|
||||
/* load AR_shp_Q13 */
|
||||
AR_shp_Q13_76543210 = _mm_loadu_si128( (__m128i *)(&AR_shp_Q13[0] ) );
|
||||
|
||||
/* load psLPC_Q14 */
|
||||
xmm_one = _mm_set_epi8(15, 14, 11, 10, 7, 6, 3, 2, 13, 12, 9, 8, 5, 4, 1, 0 );
|
||||
|
||||
xmm_tempa = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[-16]) );
|
||||
xmm_tempb = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[-12]) );
|
||||
|
||||
xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one );
|
||||
xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one );
|
||||
|
||||
psLPC_Q14_hi_89ABCDEF = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb );
|
||||
psLPC_Q14_lo_89ABCDEF = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb );
|
||||
|
||||
xmm_tempa = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -8 ]) );
|
||||
xmm_tempb = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -4 ]) );
|
||||
|
||||
xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one );
|
||||
xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one );
|
||||
|
||||
psLPC_Q14_hi_01234567 = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb );
|
||||
psLPC_Q14_lo_01234567 = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb );
|
||||
|
||||
/* load sAR2_Q14 */
|
||||
xmm_tempa = _mm_loadu_si128( (__m128i *)(&(NSQ->sAR2_Q14[ 0 ]) ) );
|
||||
xmm_tempb = _mm_loadu_si128( (__m128i *)(&(NSQ->sAR2_Q14[ 4 ]) ) );
|
||||
|
||||
xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one );
|
||||
xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one );
|
||||
|
||||
sAR2_Q14_hi_76543210 = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb );
|
||||
sAR2_Q14_lo_76543210 = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb );
|
||||
|
||||
/* prepare 1 in 8 * 16bit */
|
||||
xmm_one = _mm_set1_epi16(1);
|
||||
|
||||
for( i = 0; i < length; i++ )
|
||||
{
|
||||
/* Short-term prediction */
|
||||
__m128i xmm_hi_07, xmm_hi_8F, xmm_lo_07, xmm_lo_8F;
|
||||
|
||||
/* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
|
||||
LPC_pred_Q10 = 8; /* silk_RSHIFT( predictLPCOrder, 1 ); */
|
||||
|
||||
/* shift psLPC_Q14 */
|
||||
psLPC_Q14_hi_89ABCDEF = _mm_alignr_epi8( psLPC_Q14_hi_01234567, psLPC_Q14_hi_89ABCDEF, 2 );
|
||||
psLPC_Q14_lo_89ABCDEF = _mm_alignr_epi8( psLPC_Q14_lo_01234567, psLPC_Q14_lo_89ABCDEF, 2 );
|
||||
|
||||
psLPC_Q14_hi_01234567 = _mm_srli_si128( psLPC_Q14_hi_01234567, 2 );
|
||||
psLPC_Q14_lo_01234567 = _mm_srli_si128( psLPC_Q14_lo_01234567, 2 );
|
||||
|
||||
psLPC_Q14_hi_01234567 = _mm_insert_epi16( psLPC_Q14_hi_01234567, (xq_Q14 >> 16), 7 );
|
||||
psLPC_Q14_lo_01234567 = _mm_insert_epi16( psLPC_Q14_lo_01234567, (xq_Q14), 7 );
|
||||
|
||||
/* high part, use pmaddwd, results in 4 32-bit */
|
||||
xmm_hi_07 = _mm_madd_epi16( psLPC_Q14_hi_01234567, a_Q12_01234567 );
|
||||
xmm_hi_8F = _mm_madd_epi16( psLPC_Q14_hi_89ABCDEF, a_Q12_89ABCDEF );
|
||||
|
||||
/* low part, use pmulhw, results in 8 16-bit, note we need simulate unsigned * signed, _mm_srai_epi16(psLPC_Q14_lo_01234567, 15) */
|
||||
xmm_tempa = _mm_cmpgt_epi16( _mm_setzero_si128(), psLPC_Q14_lo_01234567 );
|
||||
xmm_tempb = _mm_cmpgt_epi16( _mm_setzero_si128(), psLPC_Q14_lo_89ABCDEF );
|
||||
|
||||
xmm_tempa = _mm_and_si128( xmm_tempa, a_Q12_01234567 );
|
||||
xmm_tempb = _mm_and_si128( xmm_tempb, a_Q12_89ABCDEF );
|
||||
|
||||
xmm_lo_07 = _mm_mulhi_epi16( psLPC_Q14_lo_01234567, a_Q12_01234567 );
|
||||
xmm_lo_8F = _mm_mulhi_epi16( psLPC_Q14_lo_89ABCDEF, a_Q12_89ABCDEF );
|
||||
|
||||
xmm_lo_07 = _mm_add_epi16( xmm_lo_07, xmm_tempa );
|
||||
xmm_lo_8F = _mm_add_epi16( xmm_lo_8F, xmm_tempb );
|
||||
|
||||
xmm_lo_07 = _mm_madd_epi16( xmm_lo_07, xmm_one );
|
||||
xmm_lo_8F = _mm_madd_epi16( xmm_lo_8F, xmm_one );
|
||||
|
||||
/* accumulate */
|
||||
xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_hi_8F );
|
||||
xmm_lo_07 = _mm_add_epi32( xmm_lo_07, xmm_lo_8F );
|
||||
|
||||
xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_lo_07 );
|
||||
|
||||
xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_unpackhi_epi64(xmm_hi_07, xmm_hi_07 ) );
|
||||
xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_shufflelo_epi16(xmm_hi_07, 0x0E ) );
|
||||
|
||||
LPC_pred_Q10 += _mm_cvtsi128_si32( xmm_hi_07 );
|
||||
|
||||
/* Long-term prediction */
|
||||
if ( opus_likely( signalType == TYPE_VOICED ) ) {
|
||||
/* Unrolled loop */
|
||||
/* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
|
||||
LTP_pred_Q13 = 2;
|
||||
{
|
||||
__m128i b_Q14_3210, b_Q14_0123, pred_lag_ptr_0123;
|
||||
|
||||
b_Q14_3210 = OP_CVTEPI16_EPI32_M64( b_Q14 );
|
||||
b_Q14_0123 = _mm_shuffle_epi32( b_Q14_3210, 0x1B );
|
||||
|
||||
/* loaded: [0] [-1] [-2] [-3] */
|
||||
pred_lag_ptr_0123 = _mm_loadu_si128( (__m128i *)(&pred_lag_ptr[ -3 ] ) );
|
||||
/* shuffle to [-3] [-2] [-1] [0] and to new xmm */
|
||||
xmm_tempa = _mm_shuffle_epi32( pred_lag_ptr_0123, 0x1B );
|
||||
/*64-bit multiply, a[2] * b[-2], a[0] * b[0] */
|
||||
xmm_tempa = _mm_mul_epi32( xmm_tempa, b_Q14_3210 );
|
||||
/* right shift 2 bytes (16 bits), zero extended */
|
||||
xmm_tempa = _mm_srli_si128( xmm_tempa, 2 );
|
||||
|
||||
/* a[1] * b[-1], a[3] * b[-3] */
|
||||
pred_lag_ptr_0123 = _mm_mul_epi32( pred_lag_ptr_0123, b_Q14_0123 );
|
||||
pred_lag_ptr_0123 = _mm_srli_si128( pred_lag_ptr_0123, 2 );
|
||||
|
||||
pred_lag_ptr_0123 = _mm_add_epi32( pred_lag_ptr_0123, xmm_tempa );
|
||||
/* equal shift right 8 bytes*/
|
||||
xmm_tempa = _mm_shuffle_epi32( pred_lag_ptr_0123, _MM_SHUFFLE( 0, 0, 3, 2 ) );
|
||||
xmm_tempa = _mm_add_epi32( xmm_tempa, pred_lag_ptr_0123 );
|
||||
|
||||
LTP_pred_Q13 += _mm_cvtsi128_si32( xmm_tempa );
|
||||
|
||||
LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
|
||||
pred_lag_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Noise shape feedback */
|
||||
NSQ->sAR2_Q14[ 9 ] = NSQ->sAR2_Q14[ 8 ];
|
||||
NSQ->sAR2_Q14[ 8 ] = _mm_cvtsi128_si32( _mm_srli_si128(_mm_unpackhi_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 ), 12 ) );
|
||||
|
||||
sAR2_Q14_hi_76543210 = _mm_slli_si128( sAR2_Q14_hi_76543210, 2 );
|
||||
sAR2_Q14_lo_76543210 = _mm_slli_si128( sAR2_Q14_lo_76543210, 2 );
|
||||
|
||||
sAR2_Q14_hi_76543210 = _mm_insert_epi16( sAR2_Q14_hi_76543210, (xq_Q14 >> 16), 0 );
|
||||
sAR2_Q14_lo_76543210 = _mm_insert_epi16( sAR2_Q14_lo_76543210, (xq_Q14), 0 );
|
||||
|
||||
/* high part, use pmaddwd, results in 4 32-bit */
|
||||
xmm_hi_07 = _mm_madd_epi16( sAR2_Q14_hi_76543210, AR_shp_Q13_76543210 );
|
||||
|
||||
/* low part, use pmulhw, results in 8 16-bit, note we need simulate unsigned * signed,_mm_srai_epi16(sAR2_Q14_lo_76543210, 15) */
|
||||
xmm_tempa = _mm_cmpgt_epi16( _mm_setzero_si128(), sAR2_Q14_lo_76543210 );
|
||||
xmm_tempa = _mm_and_si128( xmm_tempa, AR_shp_Q13_76543210 );
|
||||
|
||||
xmm_lo_07 = _mm_mulhi_epi16( sAR2_Q14_lo_76543210, AR_shp_Q13_76543210 );
|
||||
xmm_lo_07 = _mm_add_epi16( xmm_lo_07, xmm_tempa );
|
||||
|
||||
xmm_lo_07 = _mm_madd_epi16( xmm_lo_07, xmm_one );
|
||||
|
||||
/* accumulate */
|
||||
xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_lo_07 );
|
||||
|
||||
xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_unpackhi_epi64(xmm_hi_07, xmm_hi_07 ) );
|
||||
xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_shufflelo_epi16(xmm_hi_07, 0x0E ) );
|
||||
|
||||
n_AR_Q12 = 5 + _mm_cvtsi128_si32( xmm_hi_07 );
|
||||
|
||||
n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sAR2_Q14[ 8 ], AR_shp_Q13[ 8 ] );
|
||||
n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sAR2_Q14[ 9 ], AR_shp_Q13[ 9 ] );
|
||||
|
||||
n_AR_Q12 = silk_LSHIFT32( n_AR_Q12, 1 ); /* Q11 -> Q12 */
|
||||
n_AR_Q12 = silk_SMLAWB( n_AR_Q12, sLF_AR_shp_Q14, Tilt_Q14 );
|
||||
|
||||
n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 );
|
||||
n_LF_Q12 = silk_SMLAWT( n_LF_Q12, sLF_AR_shp_Q14, LF_shp_Q14 );
|
||||
|
||||
silk_assert( lag > 0 || signalType != TYPE_VOICED );
|
||||
|
||||
/* Combine prediction and noise shaping signals */
|
||||
tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 ); /* Q12 */
|
||||
tmp1 = silk_SUB32( tmp1, n_LF_Q12 ); /* Q12 */
|
||||
if( lag > 0 ) {
|
||||
/* Symmetric, packed FIR coefficients */
|
||||
n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
|
||||
n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
|
||||
n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 );
|
||||
shp_lag_ptr++;
|
||||
|
||||
tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 ); /* Q13 */
|
||||
tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 ); /* Q13 */
|
||||
tmp1 = silk_RSHIFT_ROUND( tmp1, 3 ); /* Q10 */
|
||||
} else {
|
||||
tmp1 = silk_RSHIFT_ROUND( tmp1, 2 ); /* Q10 */
|
||||
}
|
||||
|
||||
r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 ); /* residual error Q10 */
|
||||
|
||||
/* Generate dither */
|
||||
NSQ->rand_seed = silk_RAND( NSQ->rand_seed );
|
||||
|
||||
/* Flip sign depending on dither */
|
||||
tmp2 = -r_Q10;
|
||||
if ( NSQ->rand_seed < 0 ) r_Q10 = tmp2;
|
||||
|
||||
r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 );
|
||||
|
||||
/* Find two quantization level candidates and measure their rate-distortion */
|
||||
q1_Q10 = silk_SUB32( r_Q10, offset_Q10 );
|
||||
q1_Q0 = silk_RSHIFT( q1_Q10, 10 );
|
||||
|
||||
q1_Q10 = table[q1_Q0][0];
|
||||
q2_Q10 = table[q1_Q0][1];
|
||||
|
||||
if (r_Q10 * table[q1_Q0][2] - table[q1_Q0][3] < 0)
|
||||
{
|
||||
q1_Q10 = q2_Q10;
|
||||
}
|
||||
|
||||
pulses[ i ] = (opus_int8)silk_RSHIFT_ROUND( q1_Q10, 10 );
|
||||
|
||||
/* Excitation */
|
||||
exc_Q14 = silk_LSHIFT( q1_Q10, 4 );
|
||||
|
||||
tmp2 = -exc_Q14;
|
||||
if ( NSQ->rand_seed < 0 ) exc_Q14 = tmp2;
|
||||
|
||||
/* Add predictions */
|
||||
LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 );
|
||||
xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 );
|
||||
|
||||
/* Update states */
|
||||
psLPC_Q14++;
|
||||
*psLPC_Q14 = xq_Q14;
|
||||
sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 );
|
||||
|
||||
NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_shp_Q14, n_LF_Q12, 2 );
|
||||
sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 );
|
||||
NSQ->sLTP_shp_buf_idx++;
|
||||
NSQ->sLTP_buf_idx++;
|
||||
|
||||
/* Make dither dependent on quantized signal */
|
||||
NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] );
|
||||
}
|
||||
|
||||
NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14;
|
||||
|
||||
/* Scale XQ back to normal level before saving */
|
||||
psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH ];
|
||||
|
||||
/* write back sAR2_Q14 */
|
||||
xmm_tempa = _mm_unpackhi_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 );
|
||||
xmm_tempb = _mm_unpacklo_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 );
|
||||
_mm_storeu_si128( (__m128i *)(&NSQ->sAR2_Q14[ 4 ]), xmm_tempa );
|
||||
_mm_storeu_si128( (__m128i *)(&NSQ->sAR2_Q14[ 0 ]), xmm_tempb );
|
||||
|
||||
/* xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psLPC_Q14[ i ], Gain_Q10 ), 8 ) ); */
|
||||
{
|
||||
__m128i xmm_Gain_Q10;
|
||||
__m128i xmm_xq_Q14_3210, xmm_xq_Q14_x3x1, xmm_xq_Q14_7654, xmm_xq_Q14_x7x5;
|
||||
|
||||
/* prepare (1 << 7) in packed 4 32-bits */
|
||||
xmm_tempa = _mm_set1_epi32( (1 << 7) );
|
||||
|
||||
/* prepare Gain_Q10 in packed 4 32-bits */
|
||||
xmm_Gain_Q10 = _mm_set1_epi32( Gain_Q10 );
|
||||
|
||||
/* process xq */
|
||||
for (i = 0; i < length - 7; i += 8)
|
||||
{
|
||||
xmm_xq_Q14_3210 = _mm_loadu_si128( (__m128i *)(&(psLPC_Q14[ i + 0 ] ) ) );
|
||||
xmm_xq_Q14_7654 = _mm_loadu_si128( (__m128i *)(&(psLPC_Q14[ i + 4 ] ) ) );
|
||||
|
||||
/* equal shift right 4 bytes*/
|
||||
xmm_xq_Q14_x3x1 = _mm_shuffle_epi32( xmm_xq_Q14_3210, _MM_SHUFFLE( 0, 3, 2, 1 ) );
|
||||
/* equal shift right 4 bytes*/
|
||||
xmm_xq_Q14_x7x5 = _mm_shuffle_epi32( xmm_xq_Q14_7654, _MM_SHUFFLE( 0, 3, 2, 1 ) );
|
||||
|
||||
xmm_xq_Q14_3210 = _mm_mul_epi32( xmm_xq_Q14_3210, xmm_Gain_Q10 );
|
||||
xmm_xq_Q14_x3x1 = _mm_mul_epi32( xmm_xq_Q14_x3x1, xmm_Gain_Q10 );
|
||||
xmm_xq_Q14_7654 = _mm_mul_epi32( xmm_xq_Q14_7654, xmm_Gain_Q10 );
|
||||
xmm_xq_Q14_x7x5 = _mm_mul_epi32( xmm_xq_Q14_x7x5, xmm_Gain_Q10 );
|
||||
|
||||
xmm_xq_Q14_3210 = _mm_srli_epi64( xmm_xq_Q14_3210, 16 );
|
||||
xmm_xq_Q14_x3x1 = _mm_slli_epi64( xmm_xq_Q14_x3x1, 16 );
|
||||
xmm_xq_Q14_7654 = _mm_srli_epi64( xmm_xq_Q14_7654, 16 );
|
||||
xmm_xq_Q14_x7x5 = _mm_slli_epi64( xmm_xq_Q14_x7x5, 16 );
|
||||
|
||||
xmm_xq_Q14_3210 = _mm_blend_epi16( xmm_xq_Q14_3210, xmm_xq_Q14_x3x1, 0xCC );
|
||||
xmm_xq_Q14_7654 = _mm_blend_epi16( xmm_xq_Q14_7654, xmm_xq_Q14_x7x5, 0xCC );
|
||||
|
||||
/* silk_RSHIFT_ROUND(xq, 8) */
|
||||
xmm_xq_Q14_3210 = _mm_add_epi32( xmm_xq_Q14_3210, xmm_tempa );
|
||||
xmm_xq_Q14_7654 = _mm_add_epi32( xmm_xq_Q14_7654, xmm_tempa );
|
||||
|
||||
xmm_xq_Q14_3210 = _mm_srai_epi32( xmm_xq_Q14_3210, 8 );
|
||||
xmm_xq_Q14_7654 = _mm_srai_epi32( xmm_xq_Q14_7654, 8 );
|
||||
|
||||
/* silk_SAT16 */
|
||||
xmm_xq_Q14_3210 = _mm_packs_epi32( xmm_xq_Q14_3210, xmm_xq_Q14_7654 );
|
||||
|
||||
/* save to xq */
|
||||
_mm_storeu_si128( (__m128i *)(&xq[ i ] ), xmm_xq_Q14_3210 );
|
||||
}
|
||||
}
|
||||
for ( ; i < length; i++)
|
||||
{
|
||||
xq[i] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psLPC_Q14[ i ], Gain_Q10 ), 8 ) );
|
||||
}
|
||||
|
||||
/* Update LPC synth buffer */
|
||||
silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
|
||||
}
|
||||
|
||||
static OPUS_INLINE void silk_nsq_scale_states_sse4_1(
|
||||
const silk_encoder_state *psEncC, /* I Encoder State */
|
||||
silk_nsq_state *NSQ, /* I/O NSQ state */
|
||||
const opus_int32 x_Q3[], /* I input in Q3 */
|
||||
opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */
|
||||
const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */
|
||||
opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */
|
||||
opus_int subfr, /* I subframe number */
|
||||
const opus_int LTP_scale_Q14, /* I */
|
||||
const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
|
||||
const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */
|
||||
const opus_int signal_type /* I Signal type */
|
||||
)
|
||||
{
|
||||
opus_int i, lag;
|
||||
opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23;
|
||||
__m128i xmm_inv_gain_Q23, xmm_x_Q3_x2x0, xmm_x_Q3_x3x1;
|
||||
|
||||
lag = pitchL[ subfr ];
|
||||
inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 );
|
||||
silk_assert( inv_gain_Q31 != 0 );
|
||||
|
||||
/* Calculate gain adjustment factor */
|
||||
if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) {
|
||||
gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 );
|
||||
} else {
|
||||
gain_adj_Q16 = (opus_int32)1 << 16;
|
||||
}
|
||||
|
||||
/* Scale input */
|
||||
inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 );
|
||||
|
||||
/* prepare inv_gain_Q23 in packed 4 32-bits */
|
||||
xmm_inv_gain_Q23 = _mm_set1_epi32(inv_gain_Q23);
|
||||
|
||||
for( i = 0; i < psEncC->subfr_length - 3; i += 4 ) {
|
||||
xmm_x_Q3_x2x0 = _mm_loadu_si128( (__m128i *)(&(x_Q3[ i ] ) ) );
|
||||
|
||||
/* equal shift right 4 bytes*/
|
||||
xmm_x_Q3_x3x1 = _mm_shuffle_epi32( xmm_x_Q3_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) );
|
||||
|
||||
xmm_x_Q3_x2x0 = _mm_mul_epi32( xmm_x_Q3_x2x0, xmm_inv_gain_Q23 );
|
||||
xmm_x_Q3_x3x1 = _mm_mul_epi32( xmm_x_Q3_x3x1, xmm_inv_gain_Q23 );
|
||||
|
||||
xmm_x_Q3_x2x0 = _mm_srli_epi64( xmm_x_Q3_x2x0, 16 );
|
||||
xmm_x_Q3_x3x1 = _mm_slli_epi64( xmm_x_Q3_x3x1, 16 );
|
||||
|
||||
xmm_x_Q3_x2x0 = _mm_blend_epi16( xmm_x_Q3_x2x0, xmm_x_Q3_x3x1, 0xCC );
|
||||
|
||||
_mm_storeu_si128( (__m128i *)(&(x_sc_Q10[ i ] ) ), xmm_x_Q3_x2x0 );
|
||||
}
|
||||
|
||||
for( ; i < psEncC->subfr_length; i++ ) {
|
||||
x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 );
|
||||
}
|
||||
|
||||
/* Save inverse gain */
|
||||
NSQ->prev_gain_Q16 = Gains_Q16[ subfr ];
|
||||
|
||||
/* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */
|
||||
if( NSQ->rewhite_flag ) {
|
||||
if( subfr == 0 ) {
|
||||
/* Do LTP downscaling */
|
||||
inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 );
|
||||
}
|
||||
for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
|
||||
silk_assert( i < MAX_FRAME_LENGTH );
|
||||
sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] );
|
||||
}
|
||||
}
|
||||
|
||||
/* Adjust for changing gain */
|
||||
if( gain_adj_Q16 != (opus_int32)1 << 16 ) {
|
||||
/* Scale long-term shaping state */
|
||||
__m128i xmm_gain_adj_Q16, xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1;
|
||||
|
||||
/* prepare gain_adj_Q16 in packed 4 32-bits */
|
||||
xmm_gain_adj_Q16 = _mm_set1_epi32(gain_adj_Q16);
|
||||
|
||||
for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 3; i += 4 )
|
||||
{
|
||||
xmm_sLTP_shp_Q14_x2x0 = _mm_loadu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ) );
|
||||
/* equal shift right 4 bytes*/
|
||||
xmm_sLTP_shp_Q14_x3x1 = _mm_shuffle_epi32( xmm_sLTP_shp_Q14_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) );
|
||||
|
||||
xmm_sLTP_shp_Q14_x2x0 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x2x0, xmm_gain_adj_Q16 );
|
||||
xmm_sLTP_shp_Q14_x3x1 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x3x1, xmm_gain_adj_Q16 );
|
||||
|
||||
xmm_sLTP_shp_Q14_x2x0 = _mm_srli_epi64( xmm_sLTP_shp_Q14_x2x0, 16 );
|
||||
xmm_sLTP_shp_Q14_x3x1 = _mm_slli_epi64( xmm_sLTP_shp_Q14_x3x1, 16 );
|
||||
|
||||
xmm_sLTP_shp_Q14_x2x0 = _mm_blend_epi16( xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1, 0xCC );
|
||||
|
||||
_mm_storeu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ), xmm_sLTP_shp_Q14_x2x0 );
|
||||
}
|
||||
|
||||
for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) {
|
||||
NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] );
|
||||
}
|
||||
|
||||
/* Scale long-term prediction state */
|
||||
if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) {
|
||||
for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
|
||||
sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] );
|
||||
}
|
||||
}
|
||||
|
||||
NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 );
|
||||
|
||||
/* Scale short-term prediction and shaping states */
|
||||
for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) {
|
||||
NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] );
|
||||
}
|
||||
for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) {
|
||||
NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -50,6 +50,7 @@ opus_int64 (*const SILK_INNER_PROD16_ALIGNED_64_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
|||
silk_inner_prod16_aligned_64_c,
|
||||
silk_inner_prod16_aligned_64_c,
|
||||
MAY_HAVE_SSE4_1( silk_inner_prod16_aligned_64 ), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1( silk_inner_prod16_aligned_64 ) /* avx */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -62,6 +63,7 @@ opus_int (*const SILK_VAD_GETSA_Q8_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
|||
silk_VAD_GetSA_Q8_c,
|
||||
silk_VAD_GetSA_Q8_c,
|
||||
MAY_HAVE_SSE4_1( silk_VAD_GetSA_Q8 ), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1( silk_VAD_GetSA_Q8 ) /* avx */
|
||||
};
|
||||
|
||||
void (*const SILK_NSQ_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
||||
|
@ -85,6 +87,7 @@ void (*const SILK_NSQ_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
|||
silk_NSQ_c,
|
||||
silk_NSQ_c,
|
||||
MAY_HAVE_SSE4_1( silk_NSQ ), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1( silk_NSQ ) /* avx */
|
||||
};
|
||||
|
||||
void (*const SILK_VQ_WMAT_EC_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
||||
|
@ -104,6 +107,7 @@ void (*const SILK_VQ_WMAT_EC_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
|||
silk_VQ_WMat_EC_c,
|
||||
silk_VQ_WMat_EC_c,
|
||||
MAY_HAVE_SSE4_1( silk_VQ_WMat_EC ), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1( silk_VQ_WMat_EC ) /* avx */
|
||||
};
|
||||
|
||||
void (*const SILK_NSQ_DEL_DEC_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
||||
|
@ -127,6 +131,7 @@ void (*const SILK_NSQ_DEL_DEC_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
|||
silk_NSQ_del_dec_c,
|
||||
silk_NSQ_del_dec_c,
|
||||
MAY_HAVE_SSE4_1( silk_NSQ_del_dec ), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1( silk_NSQ_del_dec ) /* avx */
|
||||
};
|
||||
|
||||
#if defined(FIXED_POINT)
|
||||
|
@ -144,6 +149,7 @@ void (*const SILK_WARPED_LPC_ANALYSIS_FILTER_FIX_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
|||
silk_warped_LPC_analysis_filter_FIX_c,
|
||||
silk_warped_LPC_analysis_filter_FIX_c,
|
||||
MAY_HAVE_SSE4_1( silk_warped_LPC_analysis_filter_FIX ), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1( silk_warped_LPC_analysis_filter_FIX ) /* avx */
|
||||
};
|
||||
|
||||
void (*const SILK_BURG_MODIFIED_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
||||
|
@ -161,6 +167,7 @@ void (*const SILK_BURG_MODIFIED_IMPL[ OPUS_ARCHMASK + 1 ] )(
|
|||
silk_burg_modified_c,
|
||||
silk_burg_modified_c,
|
||||
MAY_HAVE_SSE4_1( silk_burg_modified ), /* sse4.1 */
|
||||
MAY_HAVE_SSE4_1( silk_burg_modified ) /* avx */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -19,8 +19,10 @@ celt_sources = [
|
|||
]
|
||||
|
||||
opus_nonunified_sources = [
|
||||
# Disabled because of name clash of opus_custom_encoder_get_size.
|
||||
'celt/celt_decoder.c',
|
||||
'celt/celt_encoder.c',
|
||||
# Disabled for (safe) warning about QA redefinition.
|
||||
'silk/LPC_inv_pred_gain.c',
|
||||
'silk/NLSF2A.c',
|
||||
]
|
||||
|
|
|
@ -59,6 +59,7 @@ struct OpusDecoder {
|
|||
opus_int32 Fs; /** Sampling rate (at the API level) */
|
||||
silk_DecControlStruct DecControl;
|
||||
int decode_gain;
|
||||
int arch;
|
||||
|
||||
/* Everything beyond this point gets cleared on a reset */
|
||||
#define OPUS_DECODER_RESET_START stream_channels
|
||||
|
@ -75,7 +76,6 @@ struct OpusDecoder {
|
|||
#endif
|
||||
|
||||
opus_uint32 rangeFinal;
|
||||
int arch;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -81,6 +81,7 @@ struct OpusEncoder {
|
|||
int lsb_depth;
|
||||
int encoder_buffer;
|
||||
int lfe;
|
||||
int arch;
|
||||
#ifndef DISABLE_FLOAT_API
|
||||
TonalityAnalysisState analysis;
|
||||
#endif
|
||||
|
@ -104,10 +105,8 @@ struct OpusEncoder {
|
|||
opus_val16 delay_buffer[MAX_ENCODER_BUFFER*2];
|
||||
#ifndef DISABLE_FLOAT_API
|
||||
int detected_bandwidth;
|
||||
int analysis_offset;
|
||||
#endif
|
||||
opus_uint32 rangeFinal;
|
||||
int arch;
|
||||
};
|
||||
|
||||
/* Transition tables for the voice and music. First column is the
|
||||
|
@ -2455,12 +2454,13 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
|
|||
{
|
||||
void *silk_enc;
|
||||
silk_EncControlStruct dummy;
|
||||
char *start;
|
||||
silk_enc = (char*)st+st->silk_enc_offset;
|
||||
#ifndef DISABLE_FLOAT_API
|
||||
tonality_analysis_reset(&st->analysis);
|
||||
#endif
|
||||
|
||||
char *start = (char*)&st->OPUS_ENCODER_RESET_START;
|
||||
start = (char*)&st->OPUS_ENCODER_RESET_START;
|
||||
OPUS_CLEAR(start, sizeof(OpusEncoder) - (start - (char*)st));
|
||||
|
||||
celt_encoder_ctl(celt_enc, OPUS_RESET_STATE);
|
||||
|
|
Загрузка…
Ссылка в новой задаче