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

Jorge Ramirez jorge.ramirez-ortiz at linaro.org
Mon Aug 28 11:21:54 EEST 2017


On 08/25/2017 05:35 PM, wm4 wrote:
>> +int avpriv_v4l2m2m_reinit(V4L2Context* ctx)
>> +{
>> +    V4L2m2mContext *s = container_of(ctx, V4L2m2mContext, capture);
>> +    int ret;
>> +
>> +    av_log(ctx->log_ctx, AV_LOG_DEBUG, "%s reinit context\n", ctx->name);
>> +
>> +    /* 1. streamoff */
>> +    ret = avpriv_v4l2_context_set_status(ctx, VIDIOC_STREAMOFF);
>> +    if (ret)
>> +        av_log(ctx->log_ctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", ctx->name);
>> +
>> +    /* 2. unmap the buffers (v4l2 and ffmpeg) */
>> +    avpriv_v4l2_context_release(ctx);
> What happens to AVFrames or AVPackets that are still referenced?
>

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;
}



More information about the ffmpeg-devel mailing list