---
Needs to be tested on PPC and ARM.
libavcodec/ac3enc_fixed.c | 4 +-
libavcodec/ac3enc_float.c | 4 +-
libavcodec/ac3enc_template.c | 6 ++--
libavcodec/arm/dsputil_init_neon.c | 3 --
libavcodec/arm/dsputil_neon.S | 26 ---------------
libavcodec/cook.c | 9 +++--
libavcodec/dsputil.c | 46 ---------------------------
libavcodec/dsputil.h | 2 -
libavcodec/x86/dsputil_mmx.c | 36 ---------------------
libavutil/arm/float_dsp_init_neon.c | 4 ++
libavutil/arm/float_dsp_neon.S | 26 +++++++++++++++
libavutil/float_dsp.c | 59 +++++++++++++++++++++++++++++++++++
libavutil/float_dsp.h | 16 +++++++++
libavutil/x86/float_dsp_init.c | 39 +++++++++++++++++++++++
14 files changed, 156 insertions(+), 124 deletions(-)
diff --git a/libavcodec/ac3enc_fixed.c b/libavcodec/ac3enc_fixed.c
index e471edf..ce306cb 100644
--- a/libavcodec/ac3enc_fixed.c
+++ b/libavcodec/ac3enc_fixed.c
@@ -111,9 +111,9 @@ static void scale_coefficients(AC3EncodeContext *s)
/*
* Clip MDCT coefficients to allowable range.
*/
-static void clip_coefficients(DSPContext *dsp, int32_t *coef, unsigned int len)
+static void clip_coefficients(AC3EncodeContext *s, int32_t *coef, unsigned int
len)
{
- dsp->vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
+ s->dsp.vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
}
diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c
index a225d9b..1ef635f 100644
--- a/libavcodec/ac3enc_float.c
+++ b/libavcodec/ac3enc_float.c
@@ -121,9 +121,9 @@ static void scale_coefficients(AC3EncodeContext *s)
/*
* Clip MDCT coefficients to allowable range.
*/
-static void clip_coefficients(DSPContext *dsp, float *coef, unsigned int len)
+static void clip_coefficients(AC3EncodeContext *s, float *coef, unsigned int
len)
{
- dsp->vector_clipf(coef, coef, COEF_MIN, COEF_MAX, len);
+ s->fdsp.vector_clipf(coef, coef, COEF_MIN, COEF_MAX, len);
}
diff --git a/libavcodec/ac3enc_template.c b/libavcodec/ac3enc_template.c
index 388d753..b445f01 100644
--- a/libavcodec/ac3enc_template.c
+++ b/libavcodec/ac3enc_template.c
@@ -39,7 +39,7 @@ static void apply_window(void *dsp, SampleType *output,
static int normalize_samples(AC3EncodeContext *s);
-static void clip_coefficients(DSPContext *dsp, CoefType *coef, unsigned int
len);
+static void clip_coefficients(AC3EncodeContext *s, CoefType *coef, unsigned
int len);
static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl);
@@ -160,7 +160,7 @@ static void apply_channel_coupling(AC3EncodeContext *s)
}
/* coefficients must be clipped in order to be encoded */
- clip_coefficients(&s->dsp, cpl_coef, num_cpl_coefs);
+ clip_coefficients(s, cpl_coef, num_cpl_coefs);
}
/* calculate energy in each band in coupling channel and each fbw channel
*/
@@ -411,7 +411,7 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket
*avpkt,
if (s->fixed_point)
scale_coefficients(s);
- clip_coefficients(&s->dsp, s->blocks[0].mdct_coef[1],
+ clip_coefficients(s, s->blocks[0].mdct_coef[1],
AC3_MAX_COEFS * s->num_blocks * s->channels);
s->cpl_on = s->cpl_enabled;
diff --git a/libavcodec/arm/dsputil_init_neon.c
b/libavcodec/arm/dsputil_init_neon.c
index 34bb619..c8eb56b 100644
--- a/libavcodec/arm/dsputil_init_neon.c
+++ b/libavcodec/arm/dsputil_init_neon.c
@@ -149,8 +149,6 @@ void ff_vector_fmul_reverse_neon(float *dst, const float
*src0,
void ff_vector_fmul_add_neon(float *dst, const float *src0, const float *src1,
const float *src2, int len);
-void ff_vector_clipf_neon(float *dst, const float *src, float min, float max,
- int len);
void ff_vector_clip_int32_neon(int32_t *dst, const int32_t *src, int32_t min,
int32_t max, unsigned int len);
@@ -304,7 +302,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext
*avctx)
c->scalarproduct_float = ff_scalarproduct_float_neon;
c->vector_fmul_reverse = ff_vector_fmul_reverse_neon;
c->vector_fmul_add = ff_vector_fmul_add_neon;
- c->vector_clipf = ff_vector_clipf_neon;
c->vector_clip_int32 = ff_vector_clip_int32_neon;
if (CONFIG_VORBIS_DECODER)
diff --git a/libavcodec/arm/dsputil_neon.S b/libavcodec/arm/dsputil_neon.S
index a0d201c..5d588b0 100644
--- a/libavcodec/arm/dsputil_neon.S
+++ b/libavcodec/arm/dsputil_neon.S
@@ -671,32 +671,6 @@ function ff_vector_fmul_add_neon, export=1
bx lr
endfunc
-function ff_vector_clipf_neon, export=1
-VFP vdup.32 q1, d0[1]
-VFP vdup.32 q0, d0[0]
-NOVFP vdup.32 q0, r2
-NOVFP vdup.32 q1, r3
-NOVFP ldr r2, [sp]
- vld1.f32 {q2},[r1,:128]!
- vmin.f32 q10, q2, q1
- vld1.f32 {q3},[r1,:128]!
- vmin.f32 q11, q3, q1
-1: vmax.f32 q8, q10, q0
- vmax.f32 q9, q11, q0
- subs r2, r2, #8
- beq 2f
- vld1.f32 {q2},[r1,:128]!
- vmin.f32 q10, q2, q1
- vld1.f32 {q3},[r1,:128]!
- vmin.f32 q11, q3, q1
- vst1.f32 {q8},[r0,:128]!
- vst1.f32 {q9},[r0,:128]!
- b 1b
-2: vst1.f32 {q8},[r0,:128]!
- vst1.f32 {q9},[r0,:128]!
- bx lr
-endfunc
-
function ff_apply_window_int16_neon, export=1
push {r4,lr}
add r4, r1, r3, lsl #1
diff --git a/libavcodec/cook.c b/libavcodec/cook.c
index 0bc3f37..2bc33f9 100644
--- a/libavcodec/cook.c
+++ b/libavcodec/cook.c
@@ -43,6 +43,7 @@
*/
#include "libavutil/channel_layout.h"
+#include "libavutil/float_dsp.h"
#include "libavutil/lfg.h"
#include "avcodec.h"
#include "get_bits.h"
@@ -122,7 +123,7 @@ typedef struct cook {
void (*saturate_output)(struct cook *q, float *out);
AVCodecContext* avctx;
- DSPContext dsp;
+ AVFloatDSPContext fdsp;
AVFrame frame;
GetBitContext gb;
/* stream data */
@@ -866,8 +867,8 @@ static inline void decode_bytes_and_gain(COOKContext *q,
COOKSubpacket *p,
*/
static void saturate_output_float(COOKContext *q, float *out)
{
- q->dsp.vector_clipf(out, q->mono_mdct_output + q->samples_per_channel,
- -1.0f, 1.0f, FFALIGN(q->samples_per_channel, 16));
+ q->fdsp.vector_clipf(out, q->mono_mdct_output + q->samples_per_channel,
+ -1.0f, 1.0f, FFALIGN(q->samples_per_channel, 16));
}
@@ -1066,7 +1067,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
/* Initialize RNG. */
av_lfg_init(&q->random_state, 0);
- ff_dsputil_init(&q->dsp, avctx);
+ avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
while (edata_ptr < edata_ptr_end) {
/* 8 for mono, 16 for stereo, ? for multichannel
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index 91a4da5..659a197 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -2401,51 +2401,6 @@ float ff_scalarproduct_float_c(const float *v1, const
float *v2, int len)
return p;
}
-static inline uint32_t clipf_c_one(uint32_t a, uint32_t mini,
- uint32_t maxi, uint32_t maxisign)
-{
-
- if(a > mini) return mini;
- else if((a^(1U<<31)) > maxisign) return maxi;
- else return a;
-}
-
-static void vector_clipf_c_opposite_sign(float *dst, const float *src, float
*min, float *max, int len){
- int i;
- uint32_t mini = *(uint32_t*)min;
- uint32_t maxi = *(uint32_t*)max;
- uint32_t maxisign = maxi ^ (1U<<31);
- uint32_t *dsti = (uint32_t*)dst;
- const uint32_t *srci = (const uint32_t*)src;
- for(i=0; i<len; i+=8) {
- dsti[i + 0] = clipf_c_one(srci[i + 0], mini, maxi, maxisign);
- dsti[i + 1] = clipf_c_one(srci[i + 1], mini, maxi, maxisign);
- dsti[i + 2] = clipf_c_one(srci[i + 2], mini, maxi, maxisign);
- dsti[i + 3] = clipf_c_one(srci[i + 3], mini, maxi, maxisign);
- dsti[i + 4] = clipf_c_one(srci[i + 4], mini, maxi, maxisign);
- dsti[i + 5] = clipf_c_one(srci[i + 5], mini, maxi, maxisign);
- dsti[i + 6] = clipf_c_one(srci[i + 6], mini, maxi, maxisign);
- dsti[i + 7] = clipf_c_one(srci[i + 7], mini, maxi, maxisign);
- }
-}
-static void vector_clipf_c(float *dst, const float *src, float min, float max,
int len){
- int i;
- if(min < 0 && max > 0) {
- vector_clipf_c_opposite_sign(dst, src, &min, &max, len);
- } else {
- for(i=0; i < len; i+=8) {
- dst[i ] = av_clipf(src[i ], min, max);
- dst[i + 1] = av_clipf(src[i + 1], min, max);
- dst[i + 2] = av_clipf(src[i + 2], min, max);
- dst[i + 3] = av_clipf(src[i + 3], min, max);
- dst[i + 4] = av_clipf(src[i + 4], min, max);
- dst[i + 5] = av_clipf(src[i + 5], min, max);
- dst[i + 6] = av_clipf(src[i + 6], min, max);
- dst[i + 7] = av_clipf(src[i + 7], min, max);
- }
- }
-}
-
static int32_t scalarproduct_int16_c(const int16_t * v1, const int16_t * v2,
int order)
{
int res = 0;
@@ -2822,7 +2777,6 @@ av_cold void ff_dsputil_init(DSPContext* c,
AVCodecContext *avctx)
#endif
c->vector_fmul_reverse = vector_fmul_reverse_c;
c->vector_fmul_add = vector_fmul_add_c;
- c->vector_clipf = vector_clipf_c;
c->scalarproduct_int16 = scalarproduct_int16_c;
c->scalarproduct_and_madd_int16 = scalarproduct_and_madd_int16_c;
c->apply_window_int16 = apply_window_int16_c;
diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h
index 22d6a17..39f71f8 100644
--- a/libavcodec/dsputil.h
+++ b/libavcodec/dsputil.h
@@ -352,8 +352,6 @@ typedef struct DSPContext {
void (*vector_fmul_reverse)(float *dst, const float *src0, const float
*src1, int len);
/* assume len is a multiple of 8, and src arrays are 16-byte aligned */
void (*vector_fmul_add)(float *dst, const float *src0, const float *src1,
const float *src2, int len);
- /* assume len is a multiple of 16, and arrays are 16-byte aligned */
- void (*vector_clipf)(float *dst /* align 16 */, const float *src /* align
16 */, float min, float max, int len /* align 16 */);
/**
* Calculate the scalar product of two vectors of floats.
* @param v1 first vector, 16-byte aligned
diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c
index 7ac6ecb..43dc37b 100644
--- a/libavcodec/x86/dsputil_mmx.c
+++ b/libavcodec/x86/dsputil_mmx.c
@@ -1892,40 +1892,6 @@ static void vorbis_inverse_coupling_sse(float *mag,
float *ang, int blocksize)
}
}
-static void vector_clipf_sse(float *dst, const float *src,
- float min, float max, int len)
-{
- x86_reg i = (len - 16) * 4;
- __asm__ volatile (
- "movss %3, %%xmm4 \n\t"
- "movss %4, %%xmm5 \n\t"
- "shufps $0, %%xmm4, %%xmm4 \n\t"
- "shufps $0, %%xmm5, %%xmm5 \n\t"
- "1: \n\t"
- "movaps (%2, %0), %%xmm0 \n\t" // 3/1 on intel
- "movaps 16(%2, %0), %%xmm1 \n\t"
- "movaps 32(%2, %0), %%xmm2 \n\t"
- "movaps 48(%2, %0), %%xmm3 \n\t"
- "maxps %%xmm4, %%xmm0 \n\t"
- "maxps %%xmm4, %%xmm1 \n\t"
- "maxps %%xmm4, %%xmm2 \n\t"
- "maxps %%xmm4, %%xmm3 \n\t"
- "minps %%xmm5, %%xmm0 \n\t"
- "minps %%xmm5, %%xmm1 \n\t"
- "minps %%xmm5, %%xmm2 \n\t"
- "minps %%xmm5, %%xmm3 \n\t"
- "movaps %%xmm0, (%1, %0) \n\t"
- "movaps %%xmm1, 16(%1, %0) \n\t"
- "movaps %%xmm2, 32(%1, %0) \n\t"
- "movaps %%xmm3, 48(%1, %0) \n\t"
- "sub $64, %0 \n\t"
- "jge 1b \n\t"
- : "+&r"(i)
- : "r"(dst), "r"(src), "m"(min), "m"(max)
- : "memory"
- );
-}
-
#endif /* HAVE_INLINE_ASM */
int32_t ff_scalarproduct_int16_mmxext(const int16_t *v1, const int16_t *v2,
@@ -2268,8 +2234,6 @@ static void dsputil_init_sse(DSPContext *c,
AVCodecContext *avctx, int mm_flags)
}
c->vorbis_inverse_coupling = vorbis_inverse_coupling_sse;
-
- c->vector_clipf = vector_clipf_sse;
#endif /* HAVE_INLINE_ASM */
#if HAVE_YASM
diff --git a/libavutil/arm/float_dsp_init_neon.c
b/libavutil/arm/float_dsp_init_neon.c
index 16ea471..473bf45 100644
--- a/libavutil/arm/float_dsp_init_neon.c
+++ b/libavutil/arm/float_dsp_init_neon.c
@@ -35,10 +35,14 @@ void ff_vector_fmul_scalar_neon(float *dst, const float
*src, float mul,
void ff_vector_fmul_window_neon(float *dst, const float *src0,
const float *src1, const float *win, int len);
+void ff_vector_clipf_neon(float *dst, const float *src, float min, float max,
+ int len);
+
void ff_float_dsp_init_neon(AVFloatDSPContext *fdsp)
{
fdsp->vector_fmul = ff_vector_fmul_neon;
fdsp->vector_fmac_scalar = ff_vector_fmac_scalar_neon;
fdsp->vector_fmul_scalar = ff_vector_fmul_scalar_neon;
fdsp->vector_fmul_window = ff_vector_fmul_window_neon;
+ fdsp->vector_clipf = ff_vector_clipf_neon;
}
diff --git a/libavutil/arm/float_dsp_neon.S b/libavutil/arm/float_dsp_neon.S
index 540cfc6..75504a8 100644
--- a/libavutil/arm/float_dsp_neon.S
+++ b/libavutil/arm/float_dsp_neon.S
@@ -193,3 +193,29 @@ function ff_vector_fmul_window_neon, export=1
vst1.32 {d22,d23},[ip,:128], r5
pop {r4,r5,pc}
endfunc
+
+function ff_vector_clipf_neon, export=1
+VFP vdup.32 q1, d0[1]
+VFP vdup.32 q0, d0[0]
+NOVFP vdup.32 q0, r2
+NOVFP vdup.32 q1, r3
+NOVFP ldr r2, [sp]
+ vld1.f32 {q2},[r1,:128]!
+ vmin.f32 q10, q2, q1
+ vld1.f32 {q3},[r1,:128]!
+ vmin.f32 q11, q3, q1
+1: vmax.f32 q8, q10, q0
+ vmax.f32 q9, q11, q0
+ subs r2, r2, #8
+ beq 2f
+ vld1.f32 {q2},[r1,:128]!
+ vmin.f32 q10, q2, q1
+ vld1.f32 {q3},[r1,:128]!
+ vmin.f32 q11, q3, q1
+ vst1.f32 {q8},[r0,:128]!
+ vst1.f32 {q9},[r0,:128]!
+ b 1b
+2: vst1.f32 {q8},[r0,:128]!
+ vst1.f32 {q9},[r0,:128]!
+ bx lr
+endfunc
diff --git a/libavutil/float_dsp.c b/libavutil/float_dsp.c
index cf33df3..9105a0e 100644
--- a/libavutil/float_dsp.c
+++ b/libavutil/float_dsp.c
@@ -16,8 +16,11 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <stdint.h>
+
#include "config.h"
+#include "common.h"
#include "float_dsp.h"
static void vector_fmul_c(float *dst, const float *src0, const float *src1,
@@ -71,6 +74,61 @@ static void vector_fmul_window_c(float *dst, const float
*src0,
}
}
+static inline uint32_t clipf_c_one(uint32_t a, uint32_t mini, uint32_t maxi,
+ uint32_t maxisign)
+{
+
+ if (a > mini)
+ return mini;
+ else if ((a ^ (1U << 31)) > maxisign)
+ return maxi;
+ else
+ return a;
+}
+
+static void vector_clipf_c_opposite_sign(float *dst, const float *src,
+ float *min, float *max, int len)
+{
+ int i;
+ uint32_t mini = *(uint32_t *)min;
+ uint32_t maxi = *(uint32_t *)max;
+ uint32_t maxisign = maxi ^ (1U << 31);
+ uint32_t *dsti = (uint32_t *)dst;
+ const uint32_t *srci = (const uint32_t *)src;
+
+ for (i = 0; i < len; i += 8) {
+ dsti[i + 0] = clipf_c_one(srci[i + 0], mini, maxi, maxisign);
+ dsti[i + 1] = clipf_c_one(srci[i + 1], mini, maxi, maxisign);
+ dsti[i + 2] = clipf_c_one(srci[i + 2], mini, maxi, maxisign);
+ dsti[i + 3] = clipf_c_one(srci[i + 3], mini, maxi, maxisign);
+ dsti[i + 4] = clipf_c_one(srci[i + 4], mini, maxi, maxisign);
+ dsti[i + 5] = clipf_c_one(srci[i + 5], mini, maxi, maxisign);
+ dsti[i + 6] = clipf_c_one(srci[i + 6], mini, maxi, maxisign);
+ dsti[i + 7] = clipf_c_one(srci[i + 7], mini, maxi, maxisign);
+ }
+}
+
+static void vector_clipf_c(float *dst, const float *src, float min, float max,
+ int len)
+{
+ int i;
+
+ if (min < 0 && max > 0) {
+ vector_clipf_c_opposite_sign(dst, src, &min, &max, len);
+ } else {
+ for (i = 0; i < len; i += 8) {
+ dst[i ] = av_clipf(src[i ], min, max);
+ dst[i + 1] = av_clipf(src[i + 1], min, max);
+ dst[i + 2] = av_clipf(src[i + 2], min, max);
+ dst[i + 3] = av_clipf(src[i + 3], min, max);
+ dst[i + 4] = av_clipf(src[i + 4], min, max);
+ dst[i + 5] = av_clipf(src[i + 5], min, max);
+ dst[i + 6] = av_clipf(src[i + 6], min, max);
+ dst[i + 7] = av_clipf(src[i + 7], min, max);
+ }
+ }
+}
+
void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int bit_exact)
{
fdsp->vector_fmul = vector_fmul_c;
@@ -78,6 +136,7 @@ void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int
bit_exact)
fdsp->vector_fmul_scalar = vector_fmul_scalar_c;
fdsp->vector_dmul_scalar = vector_dmul_scalar_c;
fdsp->vector_fmul_window = vector_fmul_window_c;
+ fdsp->vector_clipf = vector_clipf_c;
#if ARCH_ARM
ff_float_dsp_init_arm(fdsp);
diff --git a/libavutil/float_dsp.h b/libavutil/float_dsp.h
index 1cc70cc..07e8fc1 100644
--- a/libavutil/float_dsp.h
+++ b/libavutil/float_dsp.h
@@ -100,6 +100,22 @@ typedef struct AVFloatDSPContext {
*/
void (*vector_fmul_window)(float *dst, const float *src0,
const float *src1, const float *win, int len);
+
+ /**
+ * Clip a vector of floats to a given range.
+ * Source and destination vectors must overlap exactly or not at all.
+ *
+ * @param dst result vector
+ * constraints: 16-byte aligned
+ * @param src source vector
+ * constraints: 16-byte aligned
+ * @param min minimum value
+ * @param max maximum value
+ * @param len length of vector
+ * constraints: multiple of 16
+ */
+ void (*vector_clipf)(float *dst, const float *src, float min, float max,
+ int len);
} AVFloatDSPContext;
/**
diff --git a/libavutil/x86/float_dsp_init.c b/libavutil/x86/float_dsp_init.c
index 5078af3..7b0711e 100644
--- a/libavutil/x86/float_dsp_init.c
+++ b/libavutil/x86/float_dsp_init.c
@@ -48,6 +48,42 @@ extern void ff_vector_fmul_window_avx(float *dst, const
float *src0,
const float *src1, const float *win,
int len);
+#if HAVE_INLINE_ASM
+static void vector_clipf_sse(float *dst, const float *src, float min,
+ float max, int len)
+{
+ x86_reg i = (len - 16) * 4;
+ __asm__ volatile (
+ "movss %3, %%xmm4 \n\t"
+ "movss %4, %%xmm5 \n\t"
+ "shufps $0, %%xmm4, %%xmm4 \n\t"
+ "shufps $0, %%xmm5, %%xmm5 \n\t"
+ "1: \n\t"
+ "movaps (%2, %0), %%xmm0 \n\t" // 3/1 on intel
+ "movaps 16(%2, %0), %%xmm1 \n\t"
+ "movaps 32(%2, %0), %%xmm2 \n\t"
+ "movaps 48(%2, %0), %%xmm3 \n\t"
+ "maxps %%xmm4, %%xmm0 \n\t"
+ "maxps %%xmm4, %%xmm1 \n\t"
+ "maxps %%xmm4, %%xmm2 \n\t"
+ "maxps %%xmm4, %%xmm3 \n\t"
+ "minps %%xmm5, %%xmm0 \n\t"
+ "minps %%xmm5, %%xmm1 \n\t"
+ "minps %%xmm5, %%xmm2 \n\t"
+ "minps %%xmm5, %%xmm3 \n\t"
+ "movaps %%xmm0, (%1, %0) \n\t"
+ "movaps %%xmm1, 16(%1, %0) \n\t"
+ "movaps %%xmm2, 32(%1, %0) \n\t"
+ "movaps %%xmm3, 48(%1, %0) \n\t"
+ "sub $64, %0 \n\t"
+ "jge 1b \n\t"
+ : "+&r"(i)
+ : "r"(dst), "r"(src), "m"(min), "m"(max)
+ : "memory"
+ );
+}
+#endif /* HAVE_INLINE_ASM */
+
void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp)
{
int mm_flags = av_get_cpu_flags();
@@ -56,6 +92,9 @@ void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp)
fdsp->vector_fmul = ff_vector_fmul_sse;
fdsp->vector_fmac_scalar = ff_vector_fmac_scalar_sse;
fdsp->vector_fmul_scalar = ff_vector_fmul_scalar_sse;
+#if HAVE_INLINE_ASM
+ fdsp->vector_clipf = vector_clipf_sse;
+#endif
}
if (EXTERNAL_SSE2(mm_flags)) {
fdsp->vector_dmul_scalar = ff_vector_dmul_scalar_sse2;
--
1.7.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel