summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libswresample/resample.c127
-rw-r--r--libswresample/resample_template.c67
2 files changed, 82 insertions, 112 deletions
diff --git a/libswresample/resample.c b/libswresample/resample.c
index bf412dd268..1b1bd5f22a 100644
--- a/libswresample/resample.c
+++ b/libswresample/resample.c
@@ -289,132 +289,35 @@ int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensatio
return 0;
}
-#define RENAME(N) N ## _int16
-#define FILTER_SHIFT 15
-#define DELEM int16_t
-#define FELEM int16_t
-#define FELEM2 int32_t
-#define FELEML int64_t
-#define FELEM_MAX INT16_MAX
-#define FELEM_MIN INT16_MIN
-#define OUT(d, v) v = (v + (1<<(FILTER_SHIFT-1)))>>FILTER_SHIFT;\
- d = (unsigned)(v + 32768) > 65535 ? (v>>31) ^ 32767 : v
+#define TEMPLATE_RESAMPLE_S16
#include "resample_template.c"
+#undef TEMPLATE_RESAMPLE_S16
-#undef RENAME
-#undef FELEM
-#undef FELEM2
-#undef DELEM
-#undef FELEML
-#undef OUT
-#undef FELEM_MIN
-#undef FELEM_MAX
-#undef FILTER_SHIFT
-
-
-#define RENAME(N) N ## _int32
-#define FILTER_SHIFT 30
-#define DELEM int32_t
-#define FELEM int32_t
-#define FELEM2 int64_t
-#define FELEML int64_t
-#define FELEM_MAX INT32_MAX
-#define FELEM_MIN INT32_MIN
-#define OUT(d, v) v = (v + (1<<(FILTER_SHIFT-1)))>>FILTER_SHIFT;\
- d = (uint64_t)(v + 0x80000000) > 0xFFFFFFFF ? (v>>63) ^ 0x7FFFFFFF : v
+#define TEMPLATE_RESAMPLE_S32
#include "resample_template.c"
+#undef TEMPLATE_RESAMPLE_S32
-#undef RENAME
-#undef FELEM
-#undef FELEM2
-#undef DELEM
-#undef FELEML
-#undef OUT
-#undef FELEM_MIN
-#undef FELEM_MAX
-#undef FILTER_SHIFT
-
-
-#define RENAME(N) N ## _float
-#define FILTER_SHIFT 0
-#define DELEM float
-#define FELEM float
-#define FELEM2 float
-#define FELEML float
-#define OUT(d, v) d = v
+#define TEMPLATE_RESAMPLE_FLT
#include "resample_template.c"
+#undef TEMPLATE_RESAMPLE_FLT
-#undef RENAME
-#undef FELEM
-#undef FELEM2
-#undef DELEM
-#undef FELEML
-#undef OUT
-#undef FELEM_MIN
-#undef FELEM_MAX
-#undef FILTER_SHIFT
-
-
-#define RENAME(N) N ## _double
-#define FILTER_SHIFT 0
-#define DELEM double
-#define FELEM double
-#define FELEM2 double
-#define FELEML double
-#define OUT(d, v) d = v
+#define TEMPLATE_RESAMPLE_DBL
#include "resample_template.c"
-
-#undef RENAME
-#undef FELEM
-#undef FELEM2
-#undef DELEM
-#undef FELEML
-#undef OUT
-#undef FELEM_MIN
-#undef FELEM_MAX
-#undef FILTER_SHIFT
+#undef TEMPLATE_RESAMPLE_DBL
// XXX FIXME the whole C loop should be written in asm so this x86 specific code here isnt needed
#if HAVE_MMXEXT_INLINE
+
#include "x86/resample_mmx.h"
-#define COMMON_CORE COMMON_CORE_INT16_MMX2
-#define RENAME(N) N ## _int16_mmx2
-#define FILTER_SHIFT 15
-#define DELEM int16_t
-#define FELEM int16_t
-#define FELEM2 int32_t
-#define FELEML int64_t
-#define FELEM_MAX INT16_MAX
-#define FELEM_MIN INT16_MIN
-#define OUT(d, v) v = (v + (1<<(FILTER_SHIFT-1)))>>FILTER_SHIFT;\
- d = (unsigned)(v + 32768) > 65535 ? (v>>31) ^ 32767 : v
-#include "resample_template.c"
-#undef COMMON_CORE
-#undef RENAME
-#undef FELEM
-#undef FELEM2
-#undef DELEM
-#undef FELEML
-#undef OUT
-#undef FELEM_MIN
-#undef FELEM_MAX
-#undef FILTER_SHIFT
+#define TEMPLATE_RESAMPLE_S16_MMX2
+#include "resample_template.c"
+#undef TEMPLATE_RESAMPLE_S16_MMX2
-#if HAVE_SSSE3_INLINE
-#define COMMON_CORE COMMON_CORE_INT16_SSSE3
-#define RENAME(N) N ## _int16_ssse3
-#define FILTER_SHIFT 15
-#define DELEM int16_t
-#define FELEM int16_t
-#define FELEM2 int32_t
-#define FELEML int64_t
-#define FELEM_MAX INT16_MAX
-#define FELEM_MIN INT16_MIN
-#define OUT(d, v) v = (v + (1<<(FILTER_SHIFT-1)))>>FILTER_SHIFT;\
- d = (unsigned)(v + 32768) > 65535 ? (v>>31) ^ 32767 : v
+#define TEMPLATE_RESAMPLE_S16_SSSE3
#include "resample_template.c"
-#endif
+#undef TEMPLATE_RESAMPLE_S16_SSSE3
+
#endif // HAVE_MMXEXT_INLINE
int swri_multiple_resample(ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed){
diff --git a/libswresample/resample_template.c b/libswresample/resample_template.c
index 2ce97fa6ec..855296f243 100644
--- a/libswresample/resample_template.c
+++ b/libswresample/resample_template.c
@@ -25,6 +25,62 @@
* @author Michael Niedermayer <michaelni@gmx.at>
*/
+#if defined(TEMPLATE_RESAMPLE_DBL)
+# define RENAME(N) N ## _double
+# define FILTER_SHIFT 0
+# define DELEM double
+# define FELEM double
+# define FELEM2 double
+# define FELEML double
+# define OUT(d, v) d = v
+
+#elif defined(TEMPLATE_RESAMPLE_FLT)
+# define RENAME(N) N ## _float
+# define FILTER_SHIFT 0
+# define DELEM float
+# define FELEM float
+# define FELEM2 float
+# define FELEML float
+# define OUT(d, v) d = v
+
+#elif defined(TEMPLATE_RESAMPLE_S32)
+# define RENAME(N) N ## _int32
+# define FILTER_SHIFT 30
+# define DELEM int32_t
+# define FELEM int32_t
+# define FELEM2 int64_t
+# define FELEML int64_t
+# define FELEM_MAX INT32_MAX
+# define FELEM_MIN INT32_MIN
+# define OUT(d, v) v = (v + (1<<(FILTER_SHIFT-1)))>>FILTER_SHIFT;\
+ d = (uint64_t)(v + 0x80000000) > 0xFFFFFFFF ? (v>>63) ^ 0x7FFFFFFF : v
+
+#elif defined(TEMPLATE_RESAMPLE_S16) \
+ || defined(TEMPLATE_RESAMPLE_S16_MMX2) \
+ || defined(TEMPLATE_RESAMPLE_S16_SSSE3)
+
+# define FILTER_SHIFT 15
+# define DELEM int16_t
+# define FELEM int16_t
+# define FELEM2 int32_t
+# define FELEML int64_t
+# define FELEM_MAX INT16_MAX
+# define FELEM_MIN INT16_MIN
+# define OUT(d, v) v = (v + (1<<(FILTER_SHIFT-1)))>>FILTER_SHIFT;\
+ d = (unsigned)(v + 32768) > 65535 ? (v>>31) ^ 32767 : v
+
+# if defined(TEMPLATE_RESAMPLE_S16)
+# define RENAME(N) N ## _int16
+# elif defined(TEMPLATE_RESAMPLE_S16_MMX2)
+# define COMMON_CORE COMMON_CORE_INT16_MMX2
+# define RENAME(N) N ## _int16_mmx2
+# elif defined(TEMPLATE_RESAMPLE_S16_SSSE3)
+# define COMMON_CORE COMMON_CORE_INT16_SSSE3
+# define RENAME(N) N ## _int16_ssse3
+# endif
+
+#endif
+
int RENAME(swri_resample)(ResampleContext *c, DELEM *dst, const DELEM *src, int *consumed, int src_size, int dst_size, int update_ctx){
int dst_index, i;
int index= c->index;
@@ -149,3 +205,14 @@ av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", c->dst_incr, c->ideal_dst_incr, c->comp
return dst_index;
}
+
+#undef COMMON_CORE
+#undef RENAME
+#undef FILTER_SHIFT
+#undef DELEM
+#undef FELEM
+#undef FELEM2
+#undef FELEML
+#undef FELEM_MAX
+#undef FELEM_MIN
+#undef OUT