int64_t pts;
int (*compand)(AVFilterContext *ctx, AVFrame *frame);
+ /* set by filter_frame() to signal an output frame to request_frame() */
+ int got_output;
} CompandContext;
#define OFFSET(x) offsetof(CompandContext, x)
s->delay_index = dindex;
av_frame_free(&frame);
- return out_frame ? ff_filter_frame(ctx->outputs[0], out_frame) : 0;
+
+ if (out_frame) {
+ err = ff_filter_frame(ctx->outputs[0], out_frame);
+ if (err >= 0)
+ s->got_output = 1;
+ return err;
+ }
+
+ return 0;
}
static int compand_drain(AVFilterLink *outlink)
{
AVFilterContext *ctx = outlink->src;
CompandContext *s = ctx->priv;
- int ret;
+ int ret = 0;
- ret = ff_request_frame(ctx->inputs[0]);
+ s->got_output = 0;
+ while (ret >= 0 && !s->got_output)
+ ret = ff_request_frame(ctx->inputs[0]);
if (ret == AVERROR_EOF && s->delay_count)
ret = compand_drain(outlink);