[FFmpeg-devel] [PATCHv6 4/4] libavcodec: v4l2: add support for v4l2 mem2mem codecs

wm4 nfxjfg at googlemail.com
Mon Aug 28 13:47:54 EEST 2017


On Mon, 28 Aug 2017 12:33:38 +0200
Jorge Ramirez <jorge.ramirez-ortiz at linaro.org> wrote:

> On 08/28/2017 12:04 PM, wm4 wrote:
> >> yes in response to your previous comment on the subject, I am trying to
> >> address that in v7 not releasing the context while there are buffers on
> >> the fly....
> >> This is what I came up with (if you can suggest something better - ie, a
> >> way to  block until the AVBufferRefs are unref- please let me know)
> >>
> >> void avpriv_v4l2_context_release(V4L2Context* ctx)
> >> {
> >>       int i, ret;
> >>
> >>       if (!ctx->buffers)
> >>           return;
> >>
> >>       /* wait until all buffers are no longer in use */
> >>       for (i = 0; i < ctx->num_buffers; i++) {
> >>
> >>           if (ctx->buffers[i].status & (V4L2BUF_IN_DRIVER |
> >> V4L2BUF_AVAILABLE))
> >>               continue;
> >>
> >>           while (ctx->buffers[i].status & V4L2BUF_RET_USER)
> >>               usleep(100);
> >>       }
> >>
> >>       ret = ctx->ops.release_buffers(ctx);
> >>       if (ret)
> >>           av_log(ctx->log_ctx, AV_LOG_WARNING, "V4L2 failed to unmap the
> >> %s buffers\n", ctx->name);
> >>       else
> >>           av_log(ctx->log_ctx, AV_LOG_DEBUG, "%s buffers unmapped\n",
> >> ctx->name);
> >>
> >>       av_free(ctx->buffers);
> >>       ctx->buffers = NULL;
> >>       ctx->num_queued = 0;
> >> }
> >>  
> > No, this is not possible.  
> ok
> 
> >   You must make the V4L state reference
> > counted, and AVBufferRefs must implicitly reference this context.  
> that is what we tried to do: the AVBufferRefs "free" callback changes 
> the state to AVAILABLE thus implicitly referencing the context.
> maybe I am misunderstanding what you are trying to say?
> 
> >
> > AVHWFramesContext does this in a more elegant way - it's a frame pool
> > specifically made for hw decoders. I suspect the V4L code should be
> > ported to that. I hope Mark Thompson has some helpful remarks on this.  
> 
> I guess that instead of polling for the AVBufferRef to be unreferenced, 
> I can associate a sync (ie a sempahore) to each buffer, take it on 
> release and post the semaphore on the AVBufferRefs being unreferenced.
> that is actually pretty clean in terms of cpu usage.

That would just freeze an API user calling avcodec_close(), when it
keeps around decoded AVFrames for later use.


More information about the ffmpeg-devel mailing list