Also make this the default value.tags/n1.0
| @@ -1948,8 +1948,6 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr) | |||||
| av_opt_set_int(is->avr, "out_channel_layout", is->sdl_channel_layout, 0); | av_opt_set_int(is->avr, "out_channel_layout", is->sdl_channel_layout, 0); | ||||
| av_opt_set_int(is->avr, "out_sample_fmt", is->sdl_sample_fmt, 0); | av_opt_set_int(is->avr, "out_sample_fmt", is->sdl_sample_fmt, 0); | ||||
| av_opt_set_int(is->avr, "out_sample_rate", dec->sample_rate, 0); | av_opt_set_int(is->avr, "out_sample_rate", dec->sample_rate, 0); | ||||
| if (av_get_bytes_per_sample(dec->sample_fmt) <= 2) | |||||
| av_opt_set_int(is->avr, "internal_sample_fmt", AV_SAMPLE_FMT_S16P, 0); | |||||
| if ((ret = avresample_open(is->avr)) < 0) { | if ((ret = avresample_open(is->avr)) < 0) { | ||||
| fprintf(stderr, "error initializing libavresample\n"); | fprintf(stderr, "error initializing libavresample\n"); | ||||
| @@ -102,12 +102,6 @@ static int config_output(AVFilterLink *outlink) | |||||
| av_opt_set_int(s->avr, "in_sample_rate", inlink ->sample_rate, 0); | av_opt_set_int(s->avr, "in_sample_rate", inlink ->sample_rate, 0); | ||||
| av_opt_set_int(s->avr, "out_sample_rate", outlink->sample_rate, 0); | av_opt_set_int(s->avr, "out_sample_rate", outlink->sample_rate, 0); | ||||
| /* if both the input and output formats are s16 or u8, use s16 as | |||||
| the internal sample format */ | |||||
| if (av_get_bytes_per_sample(inlink->format) <= 2 && | |||||
| av_get_bytes_per_sample(outlink->format) <= 2) | |||||
| av_opt_set_int(s->avr, "internal_sample_fmt", AV_SAMPLE_FMT_S16P, 0); | |||||
| if ((ret = avresample_open(s->avr)) < 0) | if ((ret = avresample_open(s->avr)) < 0) | ||||
| return ret; | return ret; | ||||
| @@ -39,7 +39,7 @@ static const AVOption options[] = { | |||||
| { "out_channel_layout", "Output Channel Layout", OFFSET(out_channel_layout), AV_OPT_TYPE_INT64, { 0 }, INT64_MIN, INT64_MAX, PARAM }, | { "out_channel_layout", "Output Channel Layout", OFFSET(out_channel_layout), AV_OPT_TYPE_INT64, { 0 }, INT64_MIN, INT64_MAX, PARAM }, | ||||
| { "out_sample_fmt", "Output Sample Format", OFFSET(out_sample_fmt), AV_OPT_TYPE_INT, { AV_SAMPLE_FMT_S16 }, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_NB-1, PARAM }, | { "out_sample_fmt", "Output Sample Format", OFFSET(out_sample_fmt), AV_OPT_TYPE_INT, { AV_SAMPLE_FMT_S16 }, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_NB-1, PARAM }, | ||||
| { "out_sample_rate", "Output Sample Rate", OFFSET(out_sample_rate), AV_OPT_TYPE_INT, { 48000 }, 1, INT_MAX, PARAM }, | { "out_sample_rate", "Output Sample Rate", OFFSET(out_sample_rate), AV_OPT_TYPE_INT, { 48000 }, 1, INT_MAX, PARAM }, | ||||
| { "internal_sample_fmt", "Internal Sample Format", OFFSET(internal_sample_fmt), AV_OPT_TYPE_INT, { AV_SAMPLE_FMT_FLTP }, AV_SAMPLE_FMT_NONE, AV_SAMPLE_FMT_NB-1, PARAM }, | |||||
| { "internal_sample_fmt", "Internal Sample Format", OFFSET(internal_sample_fmt), AV_OPT_TYPE_INT, { AV_SAMPLE_FMT_NONE }, AV_SAMPLE_FMT_NONE, AV_SAMPLE_FMT_NB-1, PARAM }, | |||||
| { "mix_coeff_type", "Mixing Coefficient Type", OFFSET(mix_coeff_type), AV_OPT_TYPE_INT, { AV_MIX_COEFF_TYPE_FLT }, AV_MIX_COEFF_TYPE_Q8, AV_MIX_COEFF_TYPE_NB-1, PARAM, "mix_coeff_type" }, | { "mix_coeff_type", "Mixing Coefficient Type", OFFSET(mix_coeff_type), AV_OPT_TYPE_INT, { AV_MIX_COEFF_TYPE_FLT }, AV_MIX_COEFF_TYPE_Q8, AV_MIX_COEFF_TYPE_NB-1, PARAM, "mix_coeff_type" }, | ||||
| { "q8", "16-bit 8.8 Fixed-Point", 0, AV_OPT_TYPE_CONST, { AV_MIX_COEFF_TYPE_Q8 }, INT_MIN, INT_MAX, PARAM, "mix_coeff_type" }, | { "q8", "16-bit 8.8 Fixed-Point", 0, AV_OPT_TYPE_CONST, { AV_MIX_COEFF_TYPE_Q8 }, INT_MIN, INT_MAX, PARAM, "mix_coeff_type" }, | ||||
| { "q15", "32-bit 17.15 Fixed-Point", 0, AV_OPT_TYPE_CONST, { AV_MIX_COEFF_TYPE_Q15 }, INT_MIN, INT_MAX, PARAM, "mix_coeff_type" }, | { "q15", "32-bit 17.15 Fixed-Point", 0, AV_OPT_TYPE_CONST, { AV_MIX_COEFF_TYPE_Q15 }, INT_MIN, INT_MAX, PARAM, "mix_coeff_type" }, | ||||
| @@ -57,18 +57,23 @@ int avresample_open(AVAudioResampleContext *avr) | |||||
| avr->resample_needed = avr->in_sample_rate != avr->out_sample_rate || | avr->resample_needed = avr->in_sample_rate != avr->out_sample_rate || | ||||
| avr->force_resampling; | 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 (avr->resample_needed || max_bps <= 2) { | |||||
| avr->internal_sample_fmt = AV_SAMPLE_FMT_S16P; | |||||
| } else if (avr->mixing_needed) { | |||||
| avr->internal_sample_fmt = AV_SAMPLE_FMT_FLTP; | |||||
| } | |||||
| 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) | if (avr->in_channels == 1) | ||||
| avr->in_sample_fmt = av_get_planar_sample_fmt(avr->in_sample_fmt); | avr->in_sample_fmt = av_get_planar_sample_fmt(avr->in_sample_fmt); | ||||
| if (avr->out_channels == 1) | if (avr->out_channels == 1) | ||||