Hi Bhupesh,

Thanks for the patch. We're almost there :-)

On Thursday 28 March 2013 10:39:13 Bhupesh Sharma wrote:
> This patch reworks the videobuffer management logic present in the UVC
> webcam gadget and ports it to use the "more apt" videobuf2 framework for
> video buffer management.
> 
> To support routing video data captured from a real V4L2 video capture
> device with a "zero copy" operation on videobuffers (as they pass from
> the V4L2 domain to UVC domain via a user-space application), we need to
> support USER_PTR IO method at the UVC gadget side.
> 
> So the V4L2 capture device driver can still continue to use MMAP IO
> method and now the user-space application can just pass a pointer to the
> video buffers being dequeued from the V4L2 device side while queueing
> them at the UVC gadget end. This ensures that we have a "zero-copy"
> design as the videobuffers pass from the V4L2 capture device to the UVC
> gadget.
> 
> Note that there will still be a need to apply UVC specific payload
> headers on top of each UVC payload data, which will still require a copy
> operation to be performed in the 'encode' routines of the UVC gadget.
> 
> This patch also addresses one issue found out while porting the UVC
> gadget to videobuf2 framework:
>       - In case the usb requests queued by the gadget get completed
>         with a status of -ESHUTDOWN (disconnected from host),
>         the queue of videobuf2 should be cancelled to ensure that the
>         application space daemon is not left in a state waiting for
>         a vb2 to be successfully absorbed at the USB side.
> 
> Signed-off-by: Bhupesh Sharma <[email protected]>

[snip]

> diff --git a/drivers/usb/gadget/uvc_queue.c b/drivers/usb/gadget/uvc_queue.c
> index 104ae9c..0d30171 100644
> --- a/drivers/usb/gadget/uvc_queue.c
> +++ b/drivers/usb/gadget/uvc_queue.c

[snip]


> +static int uvc_queue_buffer(struct uvc_video_queue *queue,
> +                         struct v4l2_buffer *buf)
> +{
> +     unsigned long flags;
> +     int ret;
> 
> +     mutex_lock(&queue->mutex);
>       spin_lock_irqsave(&queue->irqlock, flags);
> +     ret = vb2_qbuf(&queue->queue, buf);

vb2_qbuf() must be called before spin_lock_irqsave(), as the 
uvc_buffer_queue() operation takes the same lock. The spin lock must thus 
protect the two lines below only.

>       ret = (queue->flags & UVC_QUEUE_PAUSED) != 0;
>       queue->flags &= ~UVC_QUEUE_PAUSED;
>       spin_unlock_irqrestore(&queue->irqlock, flags);
>       mutex_unlock(&queue->mutex);
>
> +     return ret;
>  }

-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to