mirror of https://github.com/FFmpeg/FFmpeg.git
DSP bits of swri_resample go into their own mini-DSP functions; DSP init goes from a per-call branch in multiple_resample to a proper DSP init routine; x86 bits go into x86/; swri_resample() moves out of resample_template.c into resample.c because it's independent of DSP code or sample type; multiple_resample() is simplified. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>pull/76/merge
parent
9236f7b5a2
commit
7128a35f8c
7 changed files with 325 additions and 148 deletions
@ -0,0 +1,66 @@ |
||||
/*
|
||||
* audio resampling |
||||
* Copyright (c) 2004-2012 Michael Niedermayer <michaelni@gmx.at> |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
#ifndef SWRESAMPLE_RESAMPLE_H |
||||
#define SWRESAMPLE_RESAMPLE_H |
||||
|
||||
#include "libavutil/log.h" |
||||
#include "libavutil/samplefmt.h" |
||||
|
||||
#include "swresample_internal.h" |
||||
|
||||
typedef void (*resample_one_fn)(uint8_t *dst, const uint8_t *src, |
||||
int n, int64_t index, int64_t incr); |
||||
typedef int (*resample_fn)(struct ResampleContext *c, uint8_t *dst, |
||||
const uint8_t *src, int n, int update_ctx); |
||||
|
||||
typedef struct ResampleContext { |
||||
const AVClass *av_class; |
||||
uint8_t *filter_bank; |
||||
int filter_length; |
||||
int filter_alloc; |
||||
int ideal_dst_incr; |
||||
int dst_incr; |
||||
int index; |
||||
int frac; |
||||
int src_incr; |
||||
int compensation_distance; |
||||
int phase_shift; |
||||
int phase_mask; |
||||
int linear; |
||||
enum SwrFilterType filter_type; |
||||
int kaiser_beta; |
||||
double factor; |
||||
enum AVSampleFormat format; |
||||
int felem_size; |
||||
int filter_shift; |
||||
|
||||
struct { |
||||
resample_one_fn resample_one[AV_SAMPLE_FMT_NB - AV_SAMPLE_FMT_S16P]; |
||||
resample_fn resample_common[AV_SAMPLE_FMT_NB - AV_SAMPLE_FMT_S16P]; |
||||
resample_fn resample_linear[AV_SAMPLE_FMT_NB - AV_SAMPLE_FMT_S16P]; |
||||
} dsp; |
||||
} ResampleContext; |
||||
|
||||
void swresample_dsp_init(ResampleContext *c); |
||||
void swresample_dsp_x86_init(ResampleContext *c); |
||||
|
||||
#endif /* SWRESAMPLE_RESAMPLE_H */ |
@ -0,0 +1,69 @@ |
||||
/*
|
||||
* audio resampling |
||||
* Copyright (c) 2004-2012 Michael Niedermayer <michaelni@gmx.at> |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* audio resampling |
||||
* @author Michael Niedermayer <michaelni@gmx.at> |
||||
*/ |
||||
|
||||
#include "resample.h" |
||||
|
||||
#define DO_RESAMPLE_ONE 1 |
||||
|
||||
#define TEMPLATE_RESAMPLE_S16 |
||||
#include "resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_S16 |
||||
|
||||
#define TEMPLATE_RESAMPLE_S32 |
||||
#include "resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_S32 |
||||
|
||||
#define TEMPLATE_RESAMPLE_FLT |
||||
#include "resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_FLT |
||||
|
||||
#define TEMPLATE_RESAMPLE_DBL |
||||
#include "resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_DBL |
||||
|
||||
#undef DO_RESAMPLE_ONE |
||||
|
||||
void swresample_dsp_init(ResampleContext *c) |
||||
{ |
||||
#define FNIDX(fmt) (AV_SAMPLE_FMT_##fmt - AV_SAMPLE_FMT_S16P) |
||||
c->dsp.resample_one[FNIDX(S16P)] = (resample_one_fn) resample_one_int16; |
||||
c->dsp.resample_one[FNIDX(S32P)] = (resample_one_fn) resample_one_int32; |
||||
c->dsp.resample_one[FNIDX(FLTP)] = (resample_one_fn) resample_one_float; |
||||
c->dsp.resample_one[FNIDX(DBLP)] = (resample_one_fn) resample_one_double; |
||||
|
||||
c->dsp.resample_common[FNIDX(S16P)] = (resample_fn) resample_common_int16; |
||||
c->dsp.resample_common[FNIDX(S32P)] = (resample_fn) resample_common_int32; |
||||
c->dsp.resample_common[FNIDX(FLTP)] = (resample_fn) resample_common_float; |
||||
c->dsp.resample_common[FNIDX(DBLP)] = (resample_fn) resample_common_double; |
||||
|
||||
c->dsp.resample_linear[FNIDX(S16P)] = (resample_fn) resample_linear_int16; |
||||
c->dsp.resample_linear[FNIDX(S32P)] = (resample_fn) resample_linear_int32; |
||||
c->dsp.resample_linear[FNIDX(FLTP)] = (resample_fn) resample_linear_float; |
||||
c->dsp.resample_linear[FNIDX(DBLP)] = (resample_fn) resample_linear_double; |
||||
|
||||
if (ARCH_X86) swresample_dsp_x86_init(c); |
||||
} |
@ -0,0 +1,89 @@ |
||||
/*
|
||||
* audio resampling |
||||
* Copyright (c) 2004-2012 Michael Niedermayer <michaelni@gmx.at> |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* audio resampling |
||||
* @author Michael Niedermayer <michaelni@gmx.at> |
||||
*/ |
||||
|
||||
#include "libswresample/resample.h" |
||||
|
||||
#if HAVE_MMXEXT_INLINE |
||||
|
||||
#define DO_RESAMPLE_ONE 0 |
||||
|
||||
#include "resample_mmx.h" |
||||
|
||||
#define TEMPLATE_RESAMPLE_S16_MMX2 |
||||
#include "libswresample/resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_S16_MMX2 |
||||
|
||||
#if HAVE_SSE_INLINE |
||||
#define TEMPLATE_RESAMPLE_FLT_SSE |
||||
#include "libswresample/resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_FLT_SSE |
||||
#endif |
||||
|
||||
#if HAVE_SSE2_INLINE |
||||
#define TEMPLATE_RESAMPLE_S16_SSE2 |
||||
#include "libswresample/resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_S16_SSE2 |
||||
|
||||
#define TEMPLATE_RESAMPLE_DBL_SSE2 |
||||
#include "libswresample/resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_DBL_SSE2 |
||||
#endif |
||||
|
||||
#if HAVE_AVX_INLINE |
||||
#define TEMPLATE_RESAMPLE_FLT_AVX |
||||
#include "libswresample/resample_template.c" |
||||
#undef TEMPLATE_RESAMPLE_FLT_AVX |
||||
#endif |
||||
|
||||
#undef DO_RESAMPLE_ONE |
||||
|
||||
#endif // HAVE_MMXEXT_INLINE
|
||||
|
||||
void swresample_dsp_x86_init(ResampleContext *c) |
||||
{ |
||||
int av_unused mm_flags = av_get_cpu_flags(); |
||||
|
||||
#define FNIDX(fmt) (AV_SAMPLE_FMT_##fmt - AV_SAMPLE_FMT_S16P) |
||||
if (ARCH_X86_32 && HAVE_MMXEXT_INLINE && mm_flags & AV_CPU_FLAG_MMX2) { |
||||
c->dsp.resample_common[FNIDX(S16P)] = (resample_fn) resample_common_int16_mmx2; |
||||
c->dsp.resample_linear[FNIDX(S16P)] = (resample_fn) resample_linear_int16_mmx2; |
||||
} |
||||
if (HAVE_SSE_INLINE && mm_flags & AV_CPU_FLAG_SSE) { |
||||
c->dsp.resample_common[FNIDX(FLTP)] = (resample_fn) resample_common_float_sse; |
||||
c->dsp.resample_linear[FNIDX(FLTP)] = (resample_fn) resample_linear_float_sse; |
||||
} |
||||
if (HAVE_SSE2_INLINE && mm_flags & AV_CPU_FLAG_SSE2) { |
||||
c->dsp.resample_common[FNIDX(S16P)] = (resample_fn) resample_common_int16_sse2; |
||||
c->dsp.resample_linear[FNIDX(S16P)] = (resample_fn) resample_linear_int16_sse2; |
||||
c->dsp.resample_common[FNIDX(DBLP)] = (resample_fn) resample_common_double_sse2; |
||||
c->dsp.resample_linear[FNIDX(DBLP)] = (resample_fn) resample_linear_double_sse2; |
||||
} |
||||
if (HAVE_AVX_INLINE && mm_flags & AV_CPU_FLAG_AVX) { |
||||
c->dsp.resample_common[FNIDX(FLTP)] = (resample_fn) resample_common_float_avx; |
||||
c->dsp.resample_linear[FNIDX(FLTP)] = (resample_fn) resample_linear_float_avx; |
||||
} |
||||
} |
Loading…
Reference in new issue