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.
AudioData input_buffer;
AudioData output_buffer;
AudioData *current_buffer;
AudioData input_buffer;
AudioData output_buffer;
AudioData *current_buffer;
+ int ret, direct_output;
/* reset internal buffers */
if (avr->in_buffer) {
/* reset internal buffers */
if (avr->in_buffer) {
av_dlog(avr, "[start conversion]\n");
/* initialize output_buffer with output data */
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,
if (output) {
ret = ff_audio_data_init(&output_buffer, output, out_plane_size,
avr->out_channels, out_samples,
current_buffer = &input_buffer;
if (avr->upmix_needed && !avr->in_convert_needed && !avr->resample_needed &&
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);
/* 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);
AudioData *resample_out;
int consumed = 0;
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;
resample_out = &output_buffer;
else
resample_out = avr->resample_out_buffer;
}
if (avr->out_convert_needed) {
}
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,
/* 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,