diff mbox

[FFmpeg-devel] lavfi/avfiltergraph: only return EOF in avfilter_graph_request_oldest if all sinks EOFed

Message ID 20170505233404.16279-1-cus@passwd.hu
State Accepted
Commit c0443c1af1a772daf33731da7262f3aa6b28dc8e
Headers show

Commit Message

Marton Balint May 5, 2017, 11:34 p.m. UTC
Fixes a regression introduced in 32c59a115d3cc757676b5384a5ea44b5a7a7b872,
becoming effective in 912969a33e313c57c906e87a7e2367b78a2160f4.

Fixes trimmed output of
ffmpeg -f lavfi -i "sine=d=0.01" -f lavfi -i "sine=d=1" -filter_complex "[0:a]anull[a1];[1:a]anull[a2]" -map "[a1]" -f null none -map "[a2]" -f framecrc -
---
 libavfilter/avfiltergraph.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

Comments

Nicolas George May 7, 2017, 1:15 p.m. UTC | #1
Le septidi 17 floréal, an CCXXV, Marton Balint a écrit :
> Fixes a regression introduced in 32c59a115d3cc757676b5384a5ea44b5a7a7b872,
> becoming effective in 912969a33e313c57c906e87a7e2367b78a2160f4.
> 
> Fixes trimmed output of
> ffmpeg -f lavfi -i "sine=d=0.01" -f lavfi -i "sine=d=1" -filter_complex "[0:a]anull[a1];[1:a]anull[a2]" -map "[a1]" -f null none -map "[a2]" -f framecrc -
> ---
>  libavfilter/avfiltergraph.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)

LGTM, thanks for finding that.

Out of curiosity, how did you arrive to a graph with buffersc and
buffersink connected directly?

Regards,
Marton Balint May 7, 2017, 1:47 p.m. UTC | #2
On Sun, 7 May 2017, Nicolas George wrote:

> Le septidi 17 floréal, an CCXXV, Marton Balint a écrit :
>> Fixes a regression introduced in 32c59a115d3cc757676b5384a5ea44b5a7a7b872,
>> becoming effective in 912969a33e313c57c906e87a7e2367b78a2160f4.
>>
>> Fixes trimmed output of
>> ffmpeg -f lavfi -i "sine=d=0.01" -f lavfi -i "sine=d=1" -filter_complex "[0:a]anull[a1];[1:a]anull[a2]" -map "[a1]" -f null none -map "[a2]" -f framecrc -
>> ---
>>  libavfilter/avfiltergraph.c | 9 ++++++---
>>  1 file changed, 6 insertions(+), 3 deletions(-)
>
> LGTM, thanks for finding that.
>
> Out of curiosity, how did you arrive to a graph with buffersc and
> buffersink connected directly?

The original command and filter graph which I used when I hit this bug was 
quite complex and was operating on a real file, I had to come up with a 
simplified version to make debugging easier.

Obviously you can replace anull with any audio filter and still experience 
the trimmed output.

Thanks,
Marton
Marton Balint May 7, 2017, 6:01 p.m. UTC | #3
On Sun, 7 May 2017, Marton Balint wrote:

>
>
> On Sun, 7 May 2017, Nicolas George wrote:
>
>> Le septidi 17 floréal, an CCXXV, Marton Balint a écrit :
>>> Fixes a regression introduced in 32c59a115d3cc757676b5384a5ea44b5a7a7b872,
>>> becoming effective in 912969a33e313c57c906e87a7e2367b78a2160f4.
>>>
>>> Fixes trimmed output of
>>> ffmpeg -f lavfi -i "sine=d=0.01" -f lavfi -i "sine=d=1" -filter_complex 
> "[0:a]anull[a1];[1:a]anull[a2]" -map "[a1]" -f null none -map "[a2]" -f 
> framecrc -
>>> ---
>>>  libavfilter/avfiltergraph.c | 9 ++++++---
>>>  1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> LGTM, thanks for finding that.
>>
>> Out of curiosity, how did you arrive to a graph with buffersc and
>> buffersink connected directly?
>
> The original command and filter graph which I used when I hit this bug was 
> quite complex and was operating on a real file, I had to come up with a 
> simplified version to make debugging easier.
>
> Obviously you can replace anull with any audio filter and still experience 
> the trimmed output.

Pushed and backported to 3.3.

Thanks,
Marton
diff mbox

Patch

diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index f7fbf119eb..598e50a077 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -1399,10 +1399,13 @@  int avfilter_graph_request_oldest(AVFilterGraph *graph)
         oldest = graph->sink_links[0];
         if (oldest->dst->filter->activate) {
             /* For now, buffersink is the only filter implementing activate. */
-            return av_buffersink_get_frame_flags(oldest->dst, NULL,
-                                                 AV_BUFFERSINK_FLAG_PEEK);
+            r = av_buffersink_get_frame_flags(oldest->dst, NULL,
+                                              AV_BUFFERSINK_FLAG_PEEK);
+            if (r != AVERROR_EOF)
+                return r;
+        } else {
+            r = ff_request_frame(oldest);
         }
-        r = ff_request_frame(oldest);
         if (r != AVERROR_EOF)
             break;
         av_log(oldest->dst, AV_LOG_DEBUG, "EOF on sink link %s:%s.\n",