[Libav-user] Memory Leaks?
wm4
nfxjfg at googlemail.com
Sun Apr 6 00:44:44 CEST 2014
On Sun, 6 Apr 2014 00:06:12 +0200
Harald Schlangmann <harry at gps-laptimer.de> wrote:
> I’m unreferencing it when a frame has been completely read:
>
> >> int frameFinished;
> >>
> >> ret = avcodec_decode_video2 (videoSource->pVideoCodecCtx, videoSource->pVideoFrameRaw, &frameFinished, &packet);
> >>
> >> if (ret>=0)
> >> {
> >> if (frameFinished)
> >> {
> >> …
> >>
> >> av_frame_unref (videoSource->pVideoFrameRaw);
>
> Unreferencing it before the avcodec_decode_video2 is most probably wrong (at least in the theoretical case the frame comes in more than 1 package)?
No, the decoder will keep its own references to frames it needs. But at
least in some versions of ffmpeg, you had to pass a "blank"
(unreferenced) frame to the decoder.
Also, calling av_frame_unref() is probably wrong if you haven't enabled
reference counting.
IMO the safe way to do this is:
- require at least ffmpeg 2.1.x
- set AVCodecContext.refcounted_frames=1 before avcodec_open2()
- create a single AVFrame with av_frame_alloc()
- call av_frame_unref() before passing it to the decoder
(you can reuse the AVFrame, as long as you unref it)
- on program termination call av_frame_free()
Everything else is slightly or completely broken or works only on older
FFmpeg versions. It's possible that you don't need to unref the
frame on very new FFmpeg, but I haven't checked.
More information about the Libav-user
mailing list