summaryrefslogtreecommitdiff
path: root/libavresample/utils.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-07-09 22:10:38 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-07-09 22:40:12 +0200
commitf8911b987de4a84ff8ae92f41ff492ece4acadb9 (patch)
tree0ebda51a6ba23d790da30a7168870928954da395 /libavresample/utils.c
parentbf5386385dc504a076453ad58f61f808677be747 (diff)
parent5467742232c312b7d61dca7ac57447f728d8d6c9 (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.c47
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)