summaryrefslogtreecommitdiff
path: root/libavresample/utils.c
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2012-11-01 10:13:51 -0400
committerJustin Ruggles <justin.ruggles@gmail.com>2012-11-17 20:09:40 -0500
commit02738792c5cd18cff8b94deb838db57dbfb4be0a (patch)
tree2a8b06052dc4a1bed392935b9cf13442f118c76a /libavresample/utils.c
parent5af530f5a95e6e1a8c82dd86bf625aea75fce670 (diff)
lavr: fix the decision for writing directly to the output buffer
If there are any samples remaining in the output fifo from previous conversion calls, we have to output those samples first instead of doing direct output of the current samples.
Diffstat (limited to 'libavresample/utils.c')
-rw-r--r--libavresample/utils.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/libavresample/utils.c b/libavresample/utils.c
index 378dd483db..2d15e37c4b 100644
--- a/libavresample/utils.c
+++ b/libavresample/utils.c
@@ -254,7 +254,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr,
AudioData input_buffer;
AudioData output_buffer;
AudioData *current_buffer;
- int ret;
+ int ret, direct_output;
/* reset internal buffers */
if (avr->in_buffer) {
@@ -276,6 +276,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr,
av_dlog(avr, "[start conversion]\n");
/* initialize output_buffer with output data */
+ direct_output = output && av_audio_fifo_size(avr->out_fifo) == 0;
if (output) {
ret = ff_audio_data_init(&output_buffer, output, out_plane_size,
avr->out_channels, out_samples,
@@ -295,7 +296,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr,
current_buffer = &input_buffer;
if (avr->upmix_needed && !avr->in_convert_needed && !avr->resample_needed &&
- !avr->out_convert_needed && output && out_samples >= in_samples) {
+ !avr->out_convert_needed && direct_output && out_samples >= in_samples) {
/* in some rare cases we can copy input to output and upmix
directly in the output buffer */
av_dlog(avr, "[copy] %s to output\n", current_buffer->name);
@@ -343,7 +344,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr,
AudioData *resample_out;
int consumed = 0;
- if (!avr->out_convert_needed && output && out_samples > 0)
+ if (!avr->out_convert_needed && direct_output && out_samples > 0)
resample_out = &output_buffer;
else
resample_out = avr->resample_out_buffer;
@@ -377,7 +378,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr,
}
if (avr->out_convert_needed) {
- if (output && out_samples >= current_buffer->nb_samples) {
+ if (direct_output && out_samples >= current_buffer->nb_samples) {
/* convert directly to output */
av_dlog(avr, "[convert] %s to output\n", current_buffer->name);
ret = ff_audio_convert(avr->ac_out, &output_buffer, current_buffer,