On Sun, 6 Apr 2014 00:06:12 +0200
Harald Schlangmann <[email protected]> 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.
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user