diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-09 22:10:38 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-07-09 22:40:12 +0200 |
commit | f8911b987de4a84ff8ae92f41ff492ece4acadb9 (patch) | |
tree | 0ebda51a6ba23d790da30a7168870928954da395 /libavresample/resample_template.c | |
parent | bf5386385dc504a076453ad58f61f808677be747 (diff) | |
parent | 5467742232c312b7d61dca7ac57447f728d8d6c9 (diff) | |
download | ffmpeg-f8911b987de4a84ff8ae92f41ff492ece4acadb9.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
mss3: use standard zigzag table
mss3: split DSP functions that are used in MTS2(MSS4) into separate file
motion-test: do not use getopt()
tcp: add initial timeout limit for incoming connections
configure: Change the rdtsc check to a linker check
avconv: propagate fatal errors from lavfi.
lavfi: add error handling to filter_samples().
fate-run: make avconv() properly deal with multiple inputs.
asplit: don't leak the input buffer.
af_resample: fix request_frame() behavior.
af_asyncts: fix request_frame() behavior.
libx264: support aspect ratio switching
matroskadec: honor error_recognition when encountering unknown elements.
lavr: resampling: add support for s32p, fltp, and dblp internal sample formats
lavr: resampling: add filter type and Kaiser window beta to AVOptions
lavr: Use AV_SAMPLE_FMT_NONE to auto-select the internal sample format
lavr: mix: validate internal sample format in ff_audio_mix_init()
Conflicts:
ffmpeg.c
ffplay.c
libavcodec/libx264.c
libavfilter/audio.c
libavfilter/split.c
libavformat/tcp.c
tests/fate-run.sh
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavresample/resample_template.c')
-rw-r--r-- | libavresample/resample_template.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/libavresample/resample_template.c b/libavresample/resample_template.c new file mode 100644 index 0000000000..06da90fe9f --- /dev/null +++ b/libavresample/resample_template.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2004 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 + */ + +#if defined(CONFIG_RESAMPLE_DBL) +#define SET_TYPE(func) func ## _dbl +#define FELEM double +#define FELEM2 double +#define FELEML double +#define OUT(d, v) d = v +#define DBL_TO_FELEM(d, v) d = v +#elif defined(CONFIG_RESAMPLE_FLT) +#define SET_TYPE(func) func ## _flt +#define FELEM float +#define FELEM2 float +#define FELEML float +#define OUT(d, v) d = v +#define DBL_TO_FELEM(d, v) d = v +#elif defined(CONFIG_RESAMPLE_S32) +#define SET_TYPE(func) func ## _s32 +#define FELEM int32_t +#define FELEM2 int64_t +#define FELEML int64_t +#define OUT(d, v) d = av_clipl_int32((v + (1 << 29)) >> 30) +#define DBL_TO_FELEM(d, v) d = av_clipl_int32(llrint(v * (1 << 30))); +#else +#define SET_TYPE(func) func ## _s16 +#define FELEM int16_t +#define FELEM2 int32_t +#define FELEML int64_t +#define OUT(d, v) d = av_clip_int16((v + (1 << 14)) >> 15) +#define DBL_TO_FELEM(d, v) d = av_clip_int16(lrint(v * (1 << 15))) +#endif + +static void SET_TYPE(resample_one)(ResampleContext *c, int no_filter, + void *dst0, int dst_index, const void *src0, + int src_size, int index, int frac) +{ + FELEM *dst = dst0; + const FELEM *src = src0; + + if (no_filter) { + dst[dst_index] = src[index]; + } else { + int i; + int sample_index = index >> c->phase_shift; + FELEM2 val = 0; + FELEM *filter = ((FELEM *)c->filter_bank) + + c->filter_length * (index & c->phase_mask); + + if (sample_index < 0) { + for (i = 0; i < c->filter_length; i++) + val += src[FFABS(sample_index + i) % src_size] * + (FELEM2)filter[i]; + } else if (c->linear) { + FELEM2 v2 = 0; + for (i = 0; i < c->filter_length; i++) { + val += src[abs(sample_index + i)] * (FELEM2)filter[i]; + v2 += src[abs(sample_index + i)] * (FELEM2)filter[i + c->filter_length]; + } + val += (v2 - val) * (FELEML)frac / c->src_incr; + } else { + for (i = 0; i < c->filter_length; i++) + val += src[sample_index + i] * (FELEM2)filter[i]; + } + + OUT(dst[dst_index], val); + } +} + +static void SET_TYPE(set_filter)(void *filter0, double *tab, int phase, + int tap_count) +{ + int i; + FELEM *filter = ((FELEM *)filter0) + phase * tap_count; + for (i = 0; i < tap_count; i++) { + DBL_TO_FELEM(filter[i], tab[i]); + } +} + +#undef SET_TYPE +#undef FELEM +#undef FELEM2 +#undef FELEML +#undef OUT +#undef DBL_TO_FELEM |