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.




_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to