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

Jorge Ramirez jorge.ramirez-ortiz at linaro.org
Mon Aug 28 13:33:38 EEST 2017

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 |
>>               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.

>   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.

More information about the ffmpeg-devel mailing list