[FFmpeg-cvslog] examples/decode_filter_video: Add loop for draining the filtergraph

Tobias Rapp git at videolan.org
Thu Mar 28 13:05:53 EET 2024


ffmpeg | branch: master | Tobias Rapp <t.rapp at noa-archive.com> | Wed Mar 27 11:44:45 2024 +0100| [02eb2fc577e926e9f927829f1d8c8cdb8f31cbbd] | committer: Tobias Rapp

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 <stefasab at gmail.com>
Signed-off-by: Tobias Rapp <t.rapp at noa-archive.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=02eb2fc577e926e9f927829f1d8c8cdb8f31cbbd
---

 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);



More information about the ffmpeg-cvslog mailing list