On 23.01.2018 09:12, Corey Taylor wrote:
On Tue, Jan 23, 2018 at 2:04 AM, Tobias Rapp <[email protected]> wrote:
Hi,
in my application I have problems getting the last frame out of a filter
graph when the filter chain includes the yadif filter. The application is
based on the filtering_video.c example and I can reproduce it when adding
the yadif filter there (see attached file).
How can I make sure to always get all the frames out of a filter graph?
You can call av_buffersrc_add_frame_flags with NULL for the frame
which will signal the end of stream.
Then you can loop through av_buffersink_get_frame until it returns
AVERROR_EOF (or any error).
The loop would typically be:
1. Call av_buffersink_get_frame
2. If no error, process frame
3. if AVERROR_EOF, end your stream
I added a loop to drain the filtergraph (see attached diff) and indeed
it worked. Maybe I will post a patch to update the upstream example.
avcodec_send_frame will do the same with a NULL for the frame to
trigger flushing the codec the same as the filter graph.
Good to know. Thanks a lot for the help!
Regards,
Tobias
diff --git a/doc/examples/filtering_video.c b/doc/examples/filtering_video.c
index 3fd6d5b..4f43ecd 100644
--- a/doc/examples/filtering_video.c
+++ b/doc/examples/filtering_video.c
@@ -278,6 +278,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,
AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error while feeding 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);
+ frame_count++;
+ av_frame_unref(filt_frame);
+ }
+ }
av_log(NULL, AV_LOG_INFO, "Processed %d frames\n", frame_count);
end:
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user