[FFmpeg-cvslog] vsrc_buffer: remove dependency on AVFrame
Etienne Buira
etienne.buira.lists at free.fr
Fri Jun 3 00:39:11 CEST 2011
On Thu, Jun 02, 2011 at 04:00:57PM +0200, Stefano Sabatini wrote:
> On date Thursday 2011-06-02 01:27:01 +0200, Etienne Buira wrote:
> > On Thu, Jun 02, 2011 at 01:07:18AM +0200, Stefano Sabatini wrote:
> > > On date Wednesday 2011-06-01 19:53:48 +0200, Etienne Buira wrote:
> > > > On Thu, May 19, 2011 at 11:33:08PM +0200, Stefano Sabatini wrote:
> > > > > ffmpeg | branch: master | Stefano Sabatini <stefano.sabatini-lala at poste.it> | Sat May 7 21:35:08 2011 +0200| [6070b7e1c520e9ca389403bae20a2ad04c7d54c7] | committer: Stefano Sabatini
> > > > >
> > > > > vsrc_buffer: remove dependency on AVFrame
> > > > >
> > > > > Rename av_vsrc_buffer_add_frame to
> > > > > av_vsrc_buffer_add_video_buffer_ref(), and change its inteface to make
> > > > > it accept in input an AVFilterBufferRef rather than an AVFrame.
> > > > >
> > > > > This way the interface can be used without requiring the
> > > > > inclusion/installation of libavcodec headers.
> > > > >
> > > > > > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6070b7e1c520e9ca389403bae20a2ad04c7d54c7
> > > >
> > > > Hi all.
> > > >
> > > > This commit seems to introduce/exhibit a serious memory leak that still
> > > > shows up in current master. Seems that frames that are decoded, but not
> > > > encoded (-ss) are not freed.
> > >
> > > Have you evidence that there is currently a leak (I mean e.g. by using
> >
> > Hit C-c before OOM killer got into the place. Usually my system only
> > swaps very old pages, here it saturated io.
> >
> > > valgrind)? Also can you confirm that the leak if any was introduced by
> > > this commit and was not already present before?
> >
> > git bisect, and checked that 6070b7e1c520e9ca389403bae20a2ad04c7d54c7^
> > does not show this behaviour.
> > Did you try my command (with -ss placed like I did holding a big enough
> > offset, eventually same filters too)?
>
> I confirm there is a leak.
>
> The leak is occurring in av_vsrc_buffer_add_video_buffer_ref(), the
> buffer is already filled but the new picref is added to the cache
> overwriting the old picref (which is never released).
>
> Options:
>
> 1) make av_vsrc_buffer_add_video_buffer_ref() abort if the buffer is
> already filled.
> This has a problem though, since we *want* to store the last added
> frame.
>
> 2) Extend the API of vsrc_buffer. In particular we may add this:
>
> // it is already filled, reset it
> if (avfilter_poll_frame(vsrc_buffer->inputs[0] > 0)
> av_vsrc_buffer_reset(vsrc_buffer); // clean the buffer
> av_vsrc_buffer_add_frame(vsrc_buffer, &picture);
>
> Alternatively we may add a mode for *always* overwriting the last
> frame (during initialization or with a flag in
> av_vsrc_buffer_add_frame()), like in:
>
> av_vsrc_buffer_add_frame(vsrc_buffer, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
>
> Comments are welcome.
Hi Stefano.
I don't know how data is flowing in avfilter, so please forgive me if I
tell stupid things.
Wasn't 2, the previous way to handle added frames? If so, is there a
reason that it could not be the way again?
The attached patch works for me.
-------------- next part --------------
diff --git a/libavfilter/vsrc_buffer.c b/libavfilter/vsrc_buffer.c
index d1e6ffd..095e368 100644
--- a/libavfilter/vsrc_buffer.c
+++ b/libavfilter/vsrc_buffer.c
@@ -48,6 +48,7 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, AVFilter
"Buffering several frames is not supported. "
"Please consume all available frames before adding a new one.\n"
);
+ avfilter_unref_buffer(c->picref);
//return -1;
}
More information about the ffmpeg-cvslog
mailing list