/**
* Read samples from the input FIFOs, mix, and write to the output link.
*/
-static int output_frame(AVFilterLink *outlink)
+static int output_frame(AVFilterLink *outlink, int need_request)
{
AVFilterContext *ctx = outlink->src;
MixContext *s = ctx->priv;
if (ns < nb_samples) {
if (!(s->input_state[i] & INPUT_EOF))
/* unclosed input with not enough samples */
- return 0;
+ return need_request ? ff_request_frame(ctx->inputs[i]) : 0;
/* closed input to drain */
nb_samples = ns;
}
} else if (ret < 0)
return ret;
}
- return output_frame(ctx->outputs[0]);
+ return output_frame(ctx->outputs[0], 1);
}
/**
s->input_state[0] = 0;
if (s->nb_inputs == 1)
return AVERROR_EOF;
- return output_frame(ctx->outputs[0]);
+ return output_frame(ctx->outputs[0], 1);
}
return ret;
}
ret = av_audio_fifo_write(s->fifos[i], (void **)buf->extended_data,
buf->nb_samples);
+ if (ret < 0)
+ goto fail;
av_frame_free(&buf);
- return output_frame(outlink);
+ return output_frame(outlink, 0);
fail:
av_frame_free(&buf);