This patch adds a README file describing the UVC gadget test application, it's possible use-case scenarios and IO method support in detail. Signed-off-by: Bhupesh Sharma <bhupesh.sharma@xxxxxx> --- README | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 209 insertions(+), 0 deletions(-) create mode 100644 README diff --git a/README b/README new file mode 100644 index 0000000..088c4b8 --- /dev/null +++ b/README @@ -0,0 +1,209 @@ +UVC gadget test application Readme + +Copyright (C) 2010 Ideas on board SPRL +Copyright (C) 2013 ST Microelectronics Ltd. + +Contacts: +Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> +Bhupesh Sharma <bhupesh.sharma@xxxxxx> + +Introduction +============ + +This README file documents the UVC gadget test application available +here git://git.ideasonboard.org/uvc-gadget.git, which can be used to +test the UVC webcam gadget driver located under drivers/usb/gadget +directory. + +Possible Use-Case scenarios +=========================== + +There can be a number of scenarios under which the UVC webcam gadget can +be used and each use-case can vary in the following ways: + +- Video streaming endpoint choice: + -------------------------------- + + As per UVC specifications (Revision 1.1), either Bulk or Isochronous + USB endpoints can be used are for implementing UVC Video streaming + interface. Both have there unique challenges as: + + Isochronous video streaming interface will have two + alt-settings: + - Alt-setting 0 for zero-bandwidth mode, and + - Alt-setting 1 for full-bandwidth mode. + + This requires us to ACK status stage of SET_ALT(alt-setting = + 1), only when we have video frames available which can be queued + to UVC domain. + + Bulk video streaming interface, on the other hand will have only + one alt-setting. + + This requires us to prepare UVC gadget for streaming when we + receive a a UVC_VS_COMMIT_CONTROL command from USB host and + actually start streaming as soon as we have video frames + available which can be queued to UVC domain. + +- Availability of a video capture device: + --------------------------------------- + + To emulate a real UVC webcam gadget (capturing live video from a video + capture source and sending it over USB bus), it is possible to + integrate a V4L2 based video-capture device driver with the UVC gadget + test application acting as an interface between the UVC based + video-output device and V4L2 based video-capture device. + + Accordingly, there can be the following scenarios possible: + + - No video capture device available: + + In this case, there is no video capture device available + and the UVC webcam gadget is working in an standalone + environment. + + It is possible in this case to stream a dummy test + pattern from the UVC webcam gadget and view the same on + the Linux/Windows USB Host machine using standard video + capture utilities like CHEESE. + + - VIVI (Virtual Video driver) acting as a video capture source: + + In case we don't have a real video capture hardware + (e.g. sensor) available, it is still possible to + exercise the complete path from the V4L2 based + video-capture domain to UVC based video-output domain, + using the Virtual Video driver (VIVI) available here: + drivers/media/platform/vivi.c + + It is possible in this case to stream changing vertical + color bar pattern pattern from the VIVI capture device + and send it to UVC webcam gadget, which will eventually + send these frames over USB bus. + + Similar to the case above, it is possible to view the + frames on the Linux/Windows USB Host machine using + standard video capture utilities like CHEESE. + + - Real video capture hardware and corresponding V4L2 driver + available: + + In this case, we have a real video capture hardware + (e.g. CCD / CMOS sensor) available. + + Here, it is possible to exercise the complete path from + the V4L2 based video-capture driver domain to UVC based + video-output domain, using the UVC gadget test + application. + + It is possible in this case to stream real video/still + images from capture source and send it to UVC webcam + gadget, which will eventually send these frames over USB + bus. + +- IO methods supported: + -------------------- + + V4L2 framework supports a number of IO methods and to achieve + zero-memcpy of video frames as they pass from V4L2 video-capture + domain to UVC video-output domain, it is important to select + appropriate IO methods for working on videobuffers. + + Accordingly we can have the following scenarios possible: + + - UVC webcam standalone, supporting IO_METHOD_MMAP method: + + In this case, there is no video capture device available + and the UVC webcam gadget is working in an standalone + environment. + + It is supporting IO_MMAP method, which implies that the + videobuffers are allocated by the UVC webcam gadget + itself and they are filled with dummy test pattern by + UVC gadget test application. + + - UVC webcam standalone, supporting IO_METHOD_USERPTR method: + + In this case, there is no video capture device available + and the UVC webcam gadget is working in an standalone + environment. + + It is supporting IO_METHOD_USERPTR method, which implies + that the videobuffers are allocated and filled with + dummy test pattern by the UVC gadget test application + and UVC webcam gadget operates on a USERPTR of these + videobuffers. + + - UVC webcam integrated with V4L2 video-capture driver, with + V4L2 video-capture driver supporting IO_METHOD_MMAP method and + UVC webcam supporting IO_METHOD_USERPTR: + + In this case, either VIVI or another V4L2 based driver + (working on real HW) is available as a video capture + device and is integrated with the UVC webcam gadget via + UVC gadget test application, with V4L2 video-capture + driver supporting IO_METHOD_MMAP method and UVC webcam + supporting IO_METHOD_USERPTR. + + Here, the videobuffers are allocated in the V4L2 + video-capture domain and UVC gadget test application + acts as a means to pass a USERPTR of these videobuffers + to the UVC webcam gadget domain, without requiring any + memcpy from the CPU. + + - UVC webcam integrated with V4L2 video-capture driver, with + V4L2 video-capture driver supporting IO_METHOD_USERPTR method + and UVC webcam supporting IO_METHOD_MMAP: + + In this case, either VIVI or another V4L2 based driver + (working on real HW) is available as a video capture + device and is integrated with the UVC webcam gadget via + UVC gadget test application, with V4L2 video-capture + driver supporting IO_METHOD_USERPTR method and UVC + webcam supporting IO_METHOD_MMAP. + + Here, the videobuffers are allocated in the UVC webcam + gadget domain and UVC gadget test application acts as a + means to pass a USERPTR of these videobuffers to the + V4L2 video-capture domain, without requiring any memcpy + from the CPU. + +Modifying UVC gadget test application +===================================== + +The UVC webcam gadget kernel driver located under drivers/usb/gadget +directory and compilable as g_webcam.ko kernel module, supports 360p and +720p frame resolutions and YUV4:2:2 and MJPEG frame formats by default. + +So, the video capture device must be aligned to support similar frame +format and resolutions. + +In case the video capture device supports other resolutions and frame +formats, we need to replace the default values used in the UVC gadget +test application with the same and also update the UVC webcam gadget +kernel driver. + +Keeping USBCV's UVC test-suite happy +==================================== + +The UVC webcam gadget kernel driver located under drivers/usb/gadget +directory and compilable as g_webcam.ko kernel module, supports changing +the Brightness attribute of the Processing Unit (PU) by default. + +If the underlying video capture device supports changing the Brightness +attribute of the image being acquired (like the Virtual Video, VIVI +driver does), then we should route this UVC request to the respective +video capture device. + +Incase, there is no actual video capture device associated with the UVC +gadget and we wish to use this application as the final destination of +the UVC specific requests then we should return pre-cooked (static) +responses to GET_CUR(BRIGHTNESS) and SET_CUR(BRIGHTNESS) commands to +keep command verifier test tools like UVC class specific test suite of +USBCV, happy. + +Note that the values used in UVC gadget test application are in sync +with the VIVI driver and must be changed for your specific video capture +device. These values also work well in case there in no actual video +capture device. + -- 1.7.2.2 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html