***** Video ***** Role: device only. The USB Video Class (UVC) driver streams application-owned video frames and handles the standard probe/commit negotiation used by host camera software. Start from an example ===================== UVC descriptors contain a linked control topology plus one or more formats, frames, intervals, and streaming alternate settings. Start from :doc:`../../examples/device/video_capture` and change the format or dimensions incrementally. Use :doc:`../../examples/device/video_capture_2ch` for multiple control/streaming functions. Configuration ============= ``CFG_TUD_VIDEO`` counts VideoControl interfaces and ``CFG_TUD_VIDEO_STREAMING`` counts VideoStreaming interfaces. Set ``CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE`` to at least the payload size used by the stream. The examples use ``CFG_TUD_VIDEO_STREAMING_BULK`` to choose bulk or isochronous descriptors; the endpoint type in those descriptors is what the driver follows. .. list-table:: :header-rows: 1 :widths: 43 16 41 * - Option - Default - What it controls * - ``CFG_TUD_VIDEO`` - ``0`` - Number of VideoControl functions retained by the driver. * - ``CFG_TUD_VIDEO_STREAMING`` - ``0`` - Total VideoStreaming interfaces across all control functions. * - ``CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE`` - Required - Per-stream USB payload buffer, including the UVC payload header. If it is smaller than the negotiated payload, TinyUSB caps each transfer to this size. * - ``CFG_TUD_VIDEO_STREAMING_BULK`` - Example-defined - Chooses between the example's bulk and isochronous descriptor layouts; it is not interpreted by the class driver itself. The helpers in ``src/class/video/video.h`` build individual UVC descriptor blocks; unlike simpler classes, there is no single descriptor macro for every camera topology. Verify entity IDs, terminal links, class-specific total lengths, format/frame counts, endpoint addresses, and alternate settings as a unit. Frame flow ========== .. list-table:: :header-rows: 1 :widths: 43 57 * - API or callback - What it does * - ``tud_video_n_connected()`` - Tests whether a VideoControl function is mounted. * - ``tud_video_n_streaming()`` - Tests whether the host selected an active streaming alternate setting for a control/stream pair. * - ``tud_video_n_frame_xfer()`` - Queues one non-empty frame. ``false`` means no active endpoint, probe is in progress, or another frame is still owned by the driver. * - ``tud_video_frame_xfer_complete_cb()`` - Releases the queued frame after all of its UVC payloads complete. * - ``tud_video_commit_cb()`` - Validates and applies the host's committed format, frame index, and interval; return a ``video_error_code_t`` value. * - ``tud_video_power_mode_cb()`` - Applies a host power-mode control request or returns an appropriate UVC error. * - ``tud_video_prepare_payload_cb()`` - Fills payload bytes on demand when the frame was queued with a null data pointer; honor the requested offset and maximum length. Wait for ``tud_video_n_streaming(ctl_idx, stm_idx)`` before submitting a frame. Queue it with ``tud_video_n_frame_xfer()`` and do not modify or reuse the buffer until ``tud_video_frame_xfer_complete_cb()``. Implement ``tud_video_commit_cb()`` to inspect and adopt the format, frame, and interval committed by the host. Generate frames at the negotiated interval; continuing at a hard-coded rate can overflow or starve the stream. For data generated directly into USB payloads, submit a null frame buffer with the intended frame size and fill each request in ``tud_video_prepare_payload_cb()``. Respect the supplied length and offset and avoid lengthy work in the callback. Isochronous endpoints reserve periodic bandwidth and tolerate a missed packet; bulk endpoints retry errors but provide no bandwidth guarantee. Check that the advertised maximum packet size is feasible for the controller and bus speed. Specification used: *USB Device Class Definition for Video Devices*, Revision 1.5.