diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-10 00:10:38 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-07-10 00:40:12 +0400 |
commit | f8911b987de4a84ff8ae92f41ff492ece4acadb9 (patch) | |
tree | 0ebda51a6ba23d790da30a7168870928954da395 /libavresample/utils.c | |
parent | bf5386385dc504a076453ad58f61f808677be747 (diff) | |
parent | 5467742232c312b7d61dca7ac57447f728d8d6c9 (diff) |
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/utils.c')
-rw-r--r-- | libavresample/utils.c | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/libavresample/utils.c b/libavresample/utils.c index 21bb9309b3..caf9081e5d 100644 --- a/libavresample/utils.c +++ b/libavresample/utils.c @@ -57,18 +57,43 @@ int avresample_open(AVAudioResampleContext *avr) avr->resample_needed = avr->in_sample_rate != avr->out_sample_rate || avr->force_resampling; - /* set sample format conversion parameters */ - /* override user-requested internal format to avoid unexpected failures - TODO: support more internal formats */ - if (avr->resample_needed && avr->internal_sample_fmt != AV_SAMPLE_FMT_S16P) { - av_log(avr, AV_LOG_WARNING, "Using s16p as internal sample format\n"); - avr->internal_sample_fmt = AV_SAMPLE_FMT_S16P; - } else if (avr->mixing_needed && - avr->internal_sample_fmt != AV_SAMPLE_FMT_S16P && - avr->internal_sample_fmt != AV_SAMPLE_FMT_FLTP) { - av_log(avr, AV_LOG_WARNING, "Using fltp as internal sample format\n"); - avr->internal_sample_fmt = AV_SAMPLE_FMT_FLTP; + /* select internal sample format if not specified by the user */ + if (avr->internal_sample_fmt == AV_SAMPLE_FMT_NONE && + (avr->mixing_needed || avr->resample_needed)) { + enum AVSampleFormat in_fmt = av_get_planar_sample_fmt(avr->in_sample_fmt); + enum AVSampleFormat out_fmt = av_get_planar_sample_fmt(avr->out_sample_fmt); + int max_bps = FFMAX(av_get_bytes_per_sample(in_fmt), + av_get_bytes_per_sample(out_fmt)); + if (max_bps <= 2) { + avr->internal_sample_fmt = AV_SAMPLE_FMT_S16P; + } else if (avr->mixing_needed) { + avr->internal_sample_fmt = AV_SAMPLE_FMT_FLTP; + } else { + if (max_bps <= 4) { + if (in_fmt == AV_SAMPLE_FMT_S32P || + out_fmt == AV_SAMPLE_FMT_S32P) { + if (in_fmt == AV_SAMPLE_FMT_FLTP || + out_fmt == AV_SAMPLE_FMT_FLTP) { + /* if one is s32 and the other is flt, use dbl */ + avr->internal_sample_fmt = AV_SAMPLE_FMT_DBLP; + } else { + /* if one is s32 and the other is s32, s16, or u8, use s32 */ + avr->internal_sample_fmt = AV_SAMPLE_FMT_S32P; + } + } else { + /* if one is flt and the other is flt, s16 or u8, use flt */ + avr->internal_sample_fmt = AV_SAMPLE_FMT_FLTP; + } + } else { + /* if either is dbl, use dbl */ + avr->internal_sample_fmt = AV_SAMPLE_FMT_DBLP; + } + } + av_log(avr, AV_LOG_DEBUG, "Using %s as internal sample format\n", + av_get_sample_fmt_name(avr->internal_sample_fmt)); } + + /* set sample format conversion parameters */ if (avr->in_channels == 1) avr->in_sample_fmt = av_get_planar_sample_fmt(avr->in_sample_fmt); if (avr->out_channels == 1) |