[Libav-user] Queuing of AVFrame

wm4 nfxjfg at googlemail.com
Thu Jul 24 15:21:06 CEST 2014


On Thu, 24 Jul 2014 09:23:46 +0300
volich at ukr.net wrote:

> Sorry for formating, it was first message.
> 
> Hi
> 
> I want to realise AVFrames handling with queue.
> My code is
> 
> int decode(AVCodecContext *codec_ctx, AVPacket *packet)
> {
>   AVFrame *frame = av_frame_alloc();
>   if (!frame)
>     return -1;
> 
>   int got_frame;
>   int ret = avcodec_decode_video2(codec_ctx, frame, &got_frame, packet);
>   if (ret >= 0 && got_frame) {
>     /* Allocate buffer references */
>     for (int i = 0; i < 3; i++) {
>       uint8_t *data = frame->data[i];
>       int size = frame->linesize[i] * frame->height;
>       frame->buf[i] = av_buffer_create(data, size, av_buffer_default_free, NULL, 0);
>     }
> 
>     enqueue(frame);
>     return 0;
>   }
> 
>   av_frame_free(&frame);
>     return -1;
> }
> 
> void someFunc()
> {
>   AVFrame *frame = dequeue();
> 
>   ...
> 
>   if (frame)
>     av_frame_free(&frame);
> }
> 
> Is it right?

No, the newly created buffers references data of another buffer, but
since the other buffer is not referenced and doesn't know anything
about the new buffer, you will get use-after-free problems.

Use av_frame_ref() if you want to create new frame references.


More information about the Libav-user mailing list