From 02eb2fc577e926e9f927829f1d8c8cdb8f31cbbd Mon Sep 17 00:00:00 2001 From: Tobias Rapp Date: Wed, 27 Mar 2024 11:44:45 +0100 Subject: [PATCH] examples/decode_filter_video: Add loop for draining the filtergraph Depending on the filters used, the filtergraph may produce trailing data after feeding it the last input frame. Update the example to include the necessary loop for draining the filtergraph. Reviewed-by: Stefano Sabatini Signed-off-by: Tobias Rapp --- doc/examples/decode_filter_video.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/examples/decode_filter_video.c b/doc/examples/decode_filter_video.c index 454c19222f..a57e6dfd20 100644 --- a/doc/examples/decode_filter_video.c +++ b/doc/examples/decode_filter_video.c @@ -276,6 +276,25 @@ int main(int argc, char **argv) } av_packet_unref(packet); } + if (ret == AVERROR_EOF) { + /* signal EOF to the filtergraph */ + if (av_buffersrc_add_frame_flags(buffersrc_ctx, NULL, 0) < 0) { + av_log(NULL, AV_LOG_ERROR, "Error while closing the filtergraph\n"); + goto end; + } + + /* pull remaining frames from the filtergraph */ + while (1) { + ret = av_buffersink_get_frame(buffersink_ctx, filt_frame); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + break; + if (ret < 0) + goto end; + display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base); + av_frame_unref(filt_frame); + } + } + end: avfilter_graph_free(&filter_graph); avcodec_free_context(&dec_ctx);