diff mbox series

[FFmpeg-devel,1/2] examples/decode_filter_audio: Add loop for draining the filtergraph

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

Checks

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

Commit Message

Tobias Rapp March 27, 2024, 10:51 a.m. UTC
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(+)

Comments

Stefano Sabatini March 27, 2024, 12:04 p.m. UTC | #1
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 mbox series

Patch

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