[FFmpeg-devel] ffmpeg_filter: initialize sub2video.end_pts together with last_pts

Submitted by Jan Ekström on Feb. 22, 2019, 7:43 p.m.

Details

Message ID CAEu79SaFjaFPEWxO5a=Lyqv6buhKCnW3XZXykjuWYAh7M3OqjA@mail.gmail.com
State New
Headers show

Commit Message

Jan Ekström Feb. 22, 2019, 7:43 p.m.
On Fri, Feb 22, 2019 at 3:11 PM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Thu, Feb 21, 2019 at 01:16:00PM +0200, Jan Ekström wrote:
> > This fixes buffering of samples which causes sudden ballooning of
> > memory usage in case of no subtitle samples coming in for a while if
> > the filter chain had been re-initialized.
> >
> > You can also see messages a la:
> > "Error while add the frame to buffer source(Invalid argument)."
> > disappearing after filter chain re-initializations.
> >
> > Passes fate-sub2video.
> >
> > Example (memory usage before patch around 700+ MiB, after around 150MiB) :
> > /usr/bin/time -v ffmpeg -v verbose \
> >   -i "https://megumin.fushizen.eu/samples/2019-01-18-audio_reconfig_causes_buffer_growth.ts"
> > \
> >   -filter_complex
> > '[0:v:0]yadif=deint=interlaced[yadif_out];[yadif_out][0:s:0]overlay=eof_action=pass:repeatlast=0[overlay_out];[overlay_out]scale=1024:-2[video_out];[0:a:0]aresample=48000:async=1,aformat=channel_layouts=stereo[filtered_audio]'
> > \
> >   -map "[video_out]" \
> >     -c:v mpeg4 \
> >     -b:v 750k \
> >   -map "[filtered_audio]" \
> >     -c:a aac \
> >     -b:a 192k \
> >   "test.mp4"
> >
> > Best regards,
> > Jan
>
> >  ffmpeg_filter.c |    1 +
> >  1 file changed, 1 insertion(+)
> > 5f88558fef759023173b4c8efe157aa30fc9e337  0001-ffmpeg_filter-initialize-sub2video.end_pts-together-.patch
> > From 9c824c36c972aca19f2747437c8edc71b6c0886c Mon Sep 17 00:00:00 2001
> > From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= <jeebjp@gmail.com>
> > Date: Thu, 20 Feb 2019 20:54:11 +0200
> > Subject: [PATCH] ffmpeg_filter: initialize sub2video.end_pts together with
> >  last_pts
>
> Breaks: (video stream is empty after this) when a duration is used
> ./ffmpeg -i in.mkv  -filter_complex '[0:s:1]scale=800:600' -t 15 -qscale 2 test.avi
>
> both video and subtitles appear in the first 5 seconds
>
> input is a pgs in mkv file.
> If you cannot reproduce with a random file then say so and ill try to
> turn the file i have into a small testcase i can share
>
> thanks
>

I can replicate this.

Old behavior is kept if end_pts is initialized to its previous
implicit initialization value of zero.

I initialized this originally as INT64_MIN because that way it was
matching, and there were some comments about negative PTS values in
the commit that added the other value's initialization.

In my testing earlier I did find both values working for the use cases
I tested with, so I will send out a patch to switch around to zero
initialization for now, as the main part for not causing possibly
infinite buffering in lavfi is that when sub2video_heartbeat gets
called after a filter chain (re-)initialization sub2video.end_pts is
less than INT64_MAX.

This might be an issue with something expecting timestamps that start
from zero for some sort of "vsync", though, as the heartbeats are
nicely sent out and we are getting actual AVFrames pushed into the
filter chain. The major difference seems to be that after X frames
failed requests start appearing in the filter chain, and the current
sub2video AVFrame gets fed into the filter chain again. Additionally,
the ffmpeg.c vsync logic seems to not duplicate or drop frames when
starting from INT64_MIN.

My debugging av_log code for sub2video can be found at
https://github.com/jeeb/ffmpeg/commit/f1750f489be345f74525f7a2ad89e40c4d7e0493
.

Jan

Excerpt by git diff --no-index --word-diff:

Patch hide | download patch | download mbox

diff --git a/pushing_log_before.log b/pushing_log_int64_min.log
index c163c36c37..c521380b37 100644
--- a/pushing_log_before.log
+++ b/pushing_log_int64_min.log
@@ -1,86 +1,74 @@ 
[mpegts @ [-0x2fe5b00]-]{+0x263eb00]+} sub2video: using 1920x1080 canvas
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS -1
(last_pts: -9223372036854775808, end_pts:
[-0).-]{+-9223372036854775808).+}
sub2video: Update for stream 2, (pts: [-0,-]{+-9223372036854775808,+}
end_pts: 9223372036854775807, num_rects: 0)
sub2video: Pushing a 1920x1080 frame to 'graph 0 input from stream
0:2' with PTS [-0-]{+-9223372036854775808+}
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
449 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
899 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
1349 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
1799 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
2249 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
2699 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
3149 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
3599 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
4049 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
4499 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
4949 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
5399 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
5849 (last_pts: [-0,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat[-found 1 failed requests. Feeding filter chain again-]
[-sub2video: Pushing a 1920x1080 frame to 'graph 0 input from stream
0:2' with PTS 5849-]
[-sub2video: Heartbeat-] from stream 1 (audio, PID: 4352) stream at
PTS 6299 (last_pts: [-5849,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
6749 (last_pts: [-5849,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
7199 (last_pts: [-5849,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
7649 (last_pts: [-5849,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
sub2video: Heartbeat from stream 1 (audio, PID: 4352) stream at PTS
8099 (last_pts: [-5849,-]{+-9223372036854775808,+} end_pts:
9223372036854775807).
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel