Message ID | 1711536691-15749-1-git-send-email-t.rapp@noa-archive.com |
---|---|
State | Accepted |
Commit | 55ce66606265013115ec309b3d1a4d26ef7c6046 |
Headers | show |
Series | [FFmpeg-devel,1/2] examples/decode_filter_audio: Add loop for draining the filtergraph | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
On date Wednesday 2024-03-27 11:51:30 +0100, Tobias Rapp wrote: > Depending on the filters used the filtergraph can produce trailing data > after feeding it the last input frame. Update the example to include the > necessary loop for draining the filtergrap. > > Signed-off-by: Tobias Rapp <t.rapp@noa-archive.com> > --- > doc/examples/decode_filter_audio.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/doc/examples/decode_filter_audio.c b/doc/examples/decode_filter_audio.c > index 2046419..196f080 100644 > --- a/doc/examples/decode_filter_audio.c > +++ b/doc/examples/decode_filter_audio.c > @@ -279,6 +279,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; > + print_frame(filt_frame); > + av_frame_unref(filt_frame); > + } > + } > + > end: > avfilter_graph_free(&filter_graph); > avcodec_free_context(&dec_ctx); Should be fine, thanks.
diff --git a/doc/examples/decode_filter_audio.c b/doc/examples/decode_filter_audio.c index 2046419..196f080 100644 --- a/doc/examples/decode_filter_audio.c +++ b/doc/examples/decode_filter_audio.c @@ -279,6 +279,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; + print_frame(filt_frame); + av_frame_unref(filt_frame); + } + } + end: avfilter_graph_free(&filter_graph); avcodec_free_context(&dec_ctx);
Depending on the filters used the filtergraph can produce trailing data after feeding it the last input frame. Update the example to include the necessary loop for draining the filtergrap. Signed-off-by: Tobias Rapp <t.rapp@noa-archive.com> --- doc/examples/decode_filter_audio.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)