mirror of
https://github.com/xiph/opus.git
synced 2025-06-02 08:37:43 +00:00
Replace call of celt_inner_prod_c() (step 2)
Should call celt_inner_prod(). This requires the API change of celt_pitch_xcorr() by passing in "arch". We tested on x86 and arm, and got bit exact results as original. Change-Id: I606915da6a196f327ce81f4a5ae32811f4c1fabb Signed-off-by: Jean-Marc Valin <jmvalin@jmvalin.ca>
This commit is contained in:
parent
a1ae821c96
commit
85fb8a1d17
6 changed files with 20 additions and 41 deletions
|
@ -40,7 +40,7 @@
|
||||||
(defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \
|
(defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \
|
||||||
(defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP)))
|
(defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP)))
|
||||||
opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
||||||
const opus_val16 *, opus_val32 *, int , int) = {
|
const opus_val16 *, opus_val32 *, int, int, int) = {
|
||||||
celt_pitch_xcorr_c, /* ARMv4 */
|
celt_pitch_xcorr_c, /* ARMv4 */
|
||||||
MAY_HAVE_EDSP(celt_pitch_xcorr), /* EDSP */
|
MAY_HAVE_EDSP(celt_pitch_xcorr), /* EDSP */
|
||||||
MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */
|
MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */
|
||||||
|
@ -51,7 +51,7 @@ opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
||||||
# else /* !FIXED_POINT */
|
# else /* !FIXED_POINT */
|
||||||
# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)
|
# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)
|
||||||
void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
||||||
const opus_val16 *, opus_val32 *, int, int) = {
|
const opus_val16 *, opus_val32 *, int, int, int) = {
|
||||||
celt_pitch_xcorr_c, /* ARMv4 */
|
celt_pitch_xcorr_c, /* ARMv4 */
|
||||||
celt_pitch_xcorr_c, /* EDSP */
|
celt_pitch_xcorr_c, /* EDSP */
|
||||||
celt_pitch_xcorr_c, /* Media */
|
celt_pitch_xcorr_c, /* Media */
|
||||||
|
|
|
@ -290,8 +290,9 @@ static void xcorr_kernel_neon_float_process1(const float32_t *x,
|
||||||
}
|
}
|
||||||
|
|
||||||
void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y,
|
void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
opus_val32 *xcorr, int len, int max_pitch) {
|
opus_val32 *xcorr, int len, int max_pitch, int arch) {
|
||||||
int i;
|
int i;
|
||||||
|
(void)arch;
|
||||||
celt_assert(max_pitch > 0);
|
celt_assert(max_pitch > 0);
|
||||||
celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0);
|
celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0);
|
||||||
|
|
||||||
|
|
|
@ -153,7 +153,7 @@ xcorr_kernel_neon_process1
|
||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
; opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y,
|
; opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y,
|
||||||
; opus_val32 *xcorr, int len, int max_pitch)
|
; opus_val32 *xcorr, int len, int max_pitch, int arch)
|
||||||
celt_pitch_xcorr_neon PROC
|
celt_pitch_xcorr_neon PROC
|
||||||
; input:
|
; input:
|
||||||
; r0 = opus_val16 *_x
|
; r0 = opus_val16 *_x
|
||||||
|
@ -168,6 +168,8 @@ celt_pitch_xcorr_neon PROC
|
||||||
; r6 = int max_pitch
|
; r6 = int max_pitch
|
||||||
; r12 = int j
|
; r12 = int j
|
||||||
; q15 = int maxcorr[4] (q15 is not used by xcorr_kernel_neon())
|
; q15 = int maxcorr[4] (q15 is not used by xcorr_kernel_neon())
|
||||||
|
; ignored:
|
||||||
|
; int arch
|
||||||
STMFD sp!, {r4-r6, lr}
|
STMFD sp!, {r4-r6, lr}
|
||||||
LDR r6, [sp, #16]
|
LDR r6, [sp, #16]
|
||||||
VMOV.S32 q15, #1
|
VMOV.S32 q15, #1
|
||||||
|
@ -358,6 +360,8 @@ celt_pitch_xcorr_edsp PROC
|
||||||
; r9 = opus_val32 sum3
|
; r9 = opus_val32 sum3
|
||||||
; r1 = int max_pitch
|
; r1 = int max_pitch
|
||||||
; r12 = int j
|
; r12 = int j
|
||||||
|
; ignored:
|
||||||
|
; int arch
|
||||||
STMFD sp!, {r4-r11, lr}
|
STMFD sp!, {r4-r11, lr}
|
||||||
MOV r5, r1
|
MOV r5, r1
|
||||||
LDR r1, [sp, #36]
|
LDR r1, [sp, #36]
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
# if defined(OPUS_ARM_MAY_HAVE_NEON)
|
# if defined(OPUS_ARM_MAY_HAVE_NEON)
|
||||||
opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y,
|
opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
opus_val32 *xcorr, int len, int max_pitch);
|
opus_val32 *xcorr, int len, int max_pitch, int arch);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined(OPUS_ARM_MAY_HAVE_MEDIA)
|
# if defined(OPUS_ARM_MAY_HAVE_MEDIA)
|
||||||
|
@ -43,7 +43,7 @@ opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
|
|
||||||
# if defined(OPUS_ARM_MAY_HAVE_EDSP)
|
# if defined(OPUS_ARM_MAY_HAVE_EDSP)
|
||||||
opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y,
|
opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
opus_val32 *xcorr, int len, int max_pitch);
|
opus_val32 *xcorr, int len, int max_pitch, int arch);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined(OPUS_HAVE_RTCD) && \
|
# if defined(OPUS_HAVE_RTCD) && \
|
||||||
|
@ -52,18 +52,15 @@ opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
(defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP)))
|
(defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP)))
|
||||||
extern opus_val32
|
extern opus_val32
|
||||||
(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
||||||
const opus_val16 *, opus_val32 *, int, int);
|
const opus_val16 *, opus_val32 *, int, int, int);
|
||||||
# define OVERRIDE_PITCH_XCORR (1)
|
# define OVERRIDE_PITCH_XCORR (1)
|
||||||
# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
|
# define celt_pitch_xcorr (*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])
|
||||||
((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \
|
|
||||||
xcorr, len, max_pitch))
|
|
||||||
|
|
||||||
# elif defined(OPUS_ARM_PRESUME_EDSP) || \
|
# elif defined(OPUS_ARM_PRESUME_EDSP) || \
|
||||||
defined(OPUS_ARM_PRESUME_MEDIA) || \
|
defined(OPUS_ARM_PRESUME_MEDIA) || \
|
||||||
defined(OPUS_ARM_PRESUME_NEON)
|
defined(OPUS_ARM_PRESUME_NEON)
|
||||||
# define OVERRIDE_PITCH_XCORR (1)
|
# define OVERRIDE_PITCH_XCORR (1)
|
||||||
# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
|
# define celt_pitch_xcorr (PRESUME_NEON(celt_pitch_xcorr))
|
||||||
((void)(arch),PRESUME_NEON(celt_pitch_xcorr)(_x, _y, xcorr, len, max_pitch))
|
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
@ -99,25 +96,22 @@ extern void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
|
||||||
/* Float case */
|
/* Float case */
|
||||||
#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
|
#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
|
||||||
void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y,
|
void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
opus_val32 *xcorr, int len, int max_pitch);
|
opus_val32 *xcorr, int len, int max_pitch, int arch);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# if defined(OPUS_HAVE_RTCD) && \
|
# if defined(OPUS_HAVE_RTCD) && \
|
||||||
(defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR))
|
(defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR))
|
||||||
extern void
|
extern void
|
||||||
(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
|
||||||
const opus_val16 *, opus_val32 *, int, int);
|
const opus_val16 *, opus_val32 *, int, int, int);
|
||||||
|
|
||||||
# define OVERRIDE_PITCH_XCORR (1)
|
# define OVERRIDE_PITCH_XCORR (1)
|
||||||
# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
|
# define celt_pitch_xcorr (*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])
|
||||||
((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \
|
|
||||||
xcorr, len, max_pitch))
|
|
||||||
|
|
||||||
# elif defined(OPUS_ARM_PRESUME_NEON_INTR)
|
# elif defined(OPUS_ARM_PRESUME_NEON_INTR)
|
||||||
|
|
||||||
# define OVERRIDE_PITCH_XCORR (1)
|
# define OVERRIDE_PITCH_XCORR (1)
|
||||||
# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
|
# define celt_pitch_xcorr celt_pitch_xcorr_float_neon
|
||||||
((void)(arch),celt_pitch_xcorr_float_neon(_x, _y, xcorr, len, max_pitch))
|
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
|
13
celt/pitch.c
13
celt/pitch.c
|
@ -220,13 +220,8 @@ opus_val32
|
||||||
#else
|
#else
|
||||||
void
|
void
|
||||||
#endif
|
#endif
|
||||||
#if defined(OVERRIDE_PITCH_XCORR)
|
|
||||||
celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y,
|
celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
opus_val32 *xcorr, int len, int max_pitch)
|
|
||||||
#else
|
|
||||||
celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y,
|
|
||||||
opus_val32 *xcorr, int len, int max_pitch, int arch)
|
opus_val32 *xcorr, int len, int max_pitch, int arch)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
|
|
||||||
#if 0 /* This is a simple version of the pitch correlation that should work
|
#if 0 /* This is a simple version of the pitch correlation that should work
|
||||||
|
@ -265,11 +260,7 @@ celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
for (i=0;i<max_pitch-3;i+=4)
|
for (i=0;i<max_pitch-3;i+=4)
|
||||||
{
|
{
|
||||||
opus_val32 sum[4]={0,0,0,0};
|
opus_val32 sum[4]={0,0,0,0};
|
||||||
#if defined(OVERRIDE_PITCH_XCORR)
|
|
||||||
xcorr_kernel_c(_x, _y+i, sum, len);
|
|
||||||
#else
|
|
||||||
xcorr_kernel(_x, _y+i, sum, len, arch);
|
xcorr_kernel(_x, _y+i, sum, len, arch);
|
||||||
#endif
|
|
||||||
xcorr[i]=sum[0];
|
xcorr[i]=sum[0];
|
||||||
xcorr[i+1]=sum[1];
|
xcorr[i+1]=sum[1];
|
||||||
xcorr[i+2]=sum[2];
|
xcorr[i+2]=sum[2];
|
||||||
|
@ -285,11 +276,7 @@ celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
for (;i<max_pitch;i++)
|
for (;i<max_pitch;i++)
|
||||||
{
|
{
|
||||||
opus_val32 sum;
|
opus_val32 sum;
|
||||||
#if defined(OVERRIDE_PITCH_XCORR)
|
|
||||||
sum = celt_inner_prod_c(_x, _y+i, len);
|
|
||||||
#else
|
|
||||||
sum = celt_inner_prod(_x, _y+i, len, arch);
|
sum = celt_inner_prod(_x, _y+i, len, arch);
|
||||||
#endif
|
|
||||||
xcorr[i] = sum;
|
xcorr[i] = sum;
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
maxcorr = MAX32(maxcorr, sum);
|
maxcorr = MAX32(maxcorr, sum);
|
||||||
|
|
11
celt/pitch.h
11
celt/pitch.h
|
@ -184,17 +184,10 @@ opus_val32
|
||||||
void
|
void
|
||||||
#endif
|
#endif
|
||||||
celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y,
|
celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y,
|
||||||
opus_val32 *xcorr, int len, int max_pitch);
|
|
||||||
|
|
||||||
#if !defined(OVERRIDE_PITCH_XCORR)
|
|
||||||
#ifdef FIXED_POINT
|
|
||||||
opus_val32
|
|
||||||
#else
|
|
||||||
void
|
|
||||||
#endif
|
|
||||||
celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y,
|
|
||||||
opus_val32 *xcorr, int len, int max_pitch, int arch);
|
opus_val32 *xcorr, int len, int max_pitch, int arch);
|
||||||
|
|
||||||
|
#ifndef OVERRIDE_PITCH_XCORR
|
||||||
|
# define celt_pitch_xcorr celt_pitch_xcorr_c
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue