Skip to content

drivers: video: sw_pipeline: glue lib/pixel and drivers/video #88839

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ supported:
- gpio
- spi
- i2c
- usbd
vendor: arduino
2 changes: 2 additions & 0 deletions doc/build/dts/api/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,8 @@ device.
- Sets UART device used for the Bluetooth monitor logging
* - zephyr,bt-hci
- Selects the HCI device used by the Bluetooth host stack
* - zephyr,camera
- Video input device, typically a camera.
* - zephyr,canbus
- Sets the default CAN controller
* - zephyr,ccm
Expand Down
2 changes: 2 additions & 0 deletions doc/connectivity/usb/device/usb_device.rst
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,8 @@ The following Product IDs are currently used:
+----------------------------------------------------+--------+
| :zephyr:code-sample:`uac2-implicit-feedback` | 0x000F |
+----------------------------------------------------+--------+
| :zephyr:code-sample:`uvc` | 0x0011 |
+----------------------------------------------------+--------+
| :zephyr:code-sample:`usb-dfu` (DFU Mode) | 0xFFFF |
+----------------------------------------------------+--------+

Expand Down
4 changes: 4 additions & 0 deletions doc/connectivity/usb/device_next/usb_device.rst
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ Samples

* :zephyr:code-sample:`uac2-implicit-feedback`

* :zephyr:code-sample:`uvc`

Samples ported to new USB device support
----------------------------------------

Expand Down Expand Up @@ -223,6 +225,8 @@ instance (``n``) and is used as an argument to the :c:func:`usbd_register_class`
+-----------------------------------+-------------------------+-------------------------+
| Bluetooth HCI USB transport layer | :ref:`bt_hci_raw` | :samp:`bt_hci_{n}` |
+-----------------------------------+-------------------------+-------------------------+
| USB Video Class (UVC) | Video device | :samp:`uvc_{n}` |
+-----------------------------------+-------------------------+-------------------------+

CDC ACM UART
============
Expand Down
1 change: 1 addition & 0 deletions drivers/video/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ zephyr_library_sources(video_device.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_MCUX_CSI video_mcux_csi.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_MCUX_MIPI_CSI2RX video_mcux_mipi_csi2rx.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_SW_GENERATOR video_sw_generator.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_SW_PIPELINE video_sw_pipeline.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_MT9M114 mt9m114.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_OV7725 ov7725.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_OV2640 ov2640.c)
Expand Down
2 changes: 2 additions & 0 deletions drivers/video/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ source "drivers/video/Kconfig.mcux_mipi_csi2rx"

source "drivers/video/Kconfig.sw_generator"

source "drivers/video/Kconfig.sw_pipeline"

source "drivers/video/Kconfig.mt9m114"

source "drivers/video/Kconfig.ov7725"
Expand Down
7 changes: 2 additions & 5 deletions drivers/video/Kconfig.sw_generator
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
# MT9m114

# Copyright (c) 2016 Linaro Limited
# SPDX-License-Identifier: Apache-2.0

DT_CHOSEN_ZEPHYR_CAMERA := zephyr,camera

config VIDEO_SW_GENERATOR
bool "Video Software Generator"
depends on !$(dt_chosen_enabled,$(DT_CHOSEN_ZEPHYR_CAMERA))
depends on DT_HAS_ZEPHYR_VIDEO_SW_GENERATOR_ENABLED
default y
help
Enable video pattern generator (for testing purposes).
18 changes: 18 additions & 0 deletions drivers/video/Kconfig.sw_pipeline
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Copyright (c) 2025 tinyVision.ai
# SPDX-License-Identifier: Apache-2.0

config VIDEO_SW_PIPELINE
bool "Video Software Pipeline"
depends on DT_HAS_ZEPHYR_VIDEO_SW_PIPELINE_ENABLED
default y
help
Enable the video stream processing based on the lib/pixel.

config VIDEO_SW_PIPELINE_THREAD_PRIORITY
int "Video Software Pipeline thread priority"
default 2
depends on VIDEO_SW_PIPELINE
help
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

depends on VIDEO_SW_PIPELINE

The Video Software Pipeline has a thread in which video frames are processed.
This options sets the priority of that thread.
The default is some arbitrary value above 0.
188 changes: 180 additions & 8 deletions drivers/video/video_ctrls.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,52 @@ LOG_MODULE_REGISTER(video_ctrls, CONFIG_VIDEO_LOG_LEVEL);

static inline const char *const *video_get_std_menu_ctrl(uint32_t id)
{
static const char *const camera_power_line_frequency[] = {"Disabled", "50 Hz", "60 Hz",
"Auto", NULL};
static const char *const camera_exposure_auto[] = {"Auto Mode", "Manual Mode",
"Shutter Priority Mode",
"Aperture Priority Mode", NULL};

switch (id) {
/* User control menus */
case VIDEO_CID_POWER_LINE_FREQUENCY:
return camera_power_line_frequency;
return (char const *const []){
"Disabled", "50 Hz", "60 Hz", "Auto", NULL
};

/* Camera control menus */
case VIDEO_CID_EXPOSURE_AUTO:
return camera_exposure_auto;
return (char const *const []){
"Auto Mode", "Manual Mode", "Shutter Priority Mode",
"Aperture Priority Mode", NULL
};
case VIDEO_CID_AUTO_FOCUS_RANGE:
return (char const *const []){
"Auto", "Normal", "Macro", "Infinity", NULL
};
case VIDEO_CID_COLORFX:
return (char const *const []){
"None", "Black & White", "Sepia", "Negative", "Emboss", "Sketch",
"Sky Blue", "Grass Green", "Skin Whiten", "Vivid", "Aqua", "Art Freeze",
"Silhouette", "Solarization", "Antique", "Set Cb/Cr", NULL
};
case VIDEO_CID_AUTO_N_PRESET_WHITE_BALANCE:
return (char const *const []){
"Manual", "Auto", "Incandescent", "Fluorescent", "Fluorescent H", "Horizon",
"Daylight", "Flash", "Cloudy", "Shade", "Greyworld", NULL
};
case VIDEO_CID_ISO_SENSITIVITY_AUTO:
return (char const *const []){
"Manual", "Auto", NULL
};
case VIDEO_CID_EXPOSURE_METERING:
return (char const *const []){
"Average", "Center Weighted", "Spot", "Matrix", NULL
};
case VIDEO_CID_SCENE_MODE:
return (char const *const []){
"None", "Backlight", "Beach/Snow", "Candle Light", "Dusk/Dawn",
"Fall Colors", "Fireworks", "Landscape", "Night", "Party/Indoor",
"Portrait", "Sports", "Sunset", "Text", NULL
};
case VIDEO_CID_CAMERA_ORIENTATION:
return (char const *const []){
"Front", "Back", "External", NULL
};
default:
return NULL;
}
Expand Down Expand Up @@ -69,12 +104,35 @@ static inline void set_type_flag(uint32_t id, enum video_ctrl_type *type, uint32
*flags = 0;

switch (id) {
case VIDEO_CID_AUTO_WHITE_BALANCE:
case VIDEO_CID_AUTOGAIN:
case VIDEO_CID_HFLIP:
case VIDEO_CID_VFLIP:
case VIDEO_CID_HUE_AUTO:
case VIDEO_CID_CHROMA_AGC:
case VIDEO_CID_COLOR_KILLER:
case VIDEO_CID_AUTOBRIGHTNESS:
case VIDEO_CID_ILLUMINATORS_1:
case VIDEO_CID_ILLUMINATORS_2:
case VIDEO_CID_EXPOSURE_AUTO_PRIORITY:
case VIDEO_CID_FOCUS_AUTO:
case VIDEO_CID_PRIVACY:
case VIDEO_CID_WIDE_DYNAMIC_RANGE:
case VIDEO_CID_IMAGE_STABILIZATION:
*type = VIDEO_CTRL_TYPE_BOOLEAN;
break;

case VIDEO_CID_POWER_LINE_FREQUENCY:
case VIDEO_CID_EXPOSURE_AUTO:
case VIDEO_CID_AUTO_FOCUS_RANGE:
case VIDEO_CID_COLORFX:
case VIDEO_CID_AUTO_N_PRESET_WHITE_BALANCE:
case VIDEO_CID_ISO_SENSITIVITY_AUTO:
case VIDEO_CID_EXPOSURE_METERING:
case VIDEO_CID_SCENE_MODE:
case VIDEO_CID_TEST_PATTERN:
case VIDEO_CID_CAMERA_ORIENTATION:
case VIDEO_CID_HDR_SENSOR_MODE:
*type = VIDEO_CTRL_TYPE_MENU;
break;
case VIDEO_CID_PIXEL_RATE:
Expand Down Expand Up @@ -388,6 +446,16 @@ static inline const char *video_get_ctrl_name(uint32_t id)
return "Saturation";
case VIDEO_CID_HUE:
return "Hue";
case VIDEO_CID_AUTO_WHITE_BALANCE:
return "White Balance, Automatic";
case VIDEO_CID_DO_WHITE_BALANCE:
return "Do White Balance";
case VIDEO_CID_RED_BALANCE:
return "Red Balance";
case VIDEO_CID_BLUE_BALANCE:
return "Blue Balance";
case VIDEO_CID_GAMMA:
return "Gamma";
case VIDEO_CID_EXPOSURE:
return "Exposure";
case VIDEO_CID_AUTOGAIN:
Expand All @@ -402,10 +470,114 @@ static inline const char *video_get_ctrl_name(uint32_t id)
return "Vertical Flip";
case VIDEO_CID_POWER_LINE_FREQUENCY:
return "Power Line Frequency";
case VIDEO_CID_HUE_AUTO:
return "Hue, Automatic";
case VIDEO_CID_WHITE_BALANCE_TEMPERATURE:
return "White Balance Temperature";
case VIDEO_CID_SHARPNESS:
return "Sharpness";
case VIDEO_CID_BACKLIGHT_COMPENSATION:
return "Backlight Compensation";
case VIDEO_CID_CHROMA_AGC:
return "Chroma AGC";
case VIDEO_CID_COLOR_KILLER:
return "Color Killer";
case VIDEO_CID_COLORFX:
return "Color Effects";
case VIDEO_CID_AUTOBRIGHTNESS:
return "Brightness, Automatic";
case VIDEO_CID_BAND_STOP_FILTER:
return "Band-Stop Filter";
case VIDEO_CID_ROTATE:
return "Rotate";
case VIDEO_CID_BG_COLOR:
return "Background Color";
case VIDEO_CID_CHROMA_GAIN:
return "Chroma Gain";
case VIDEO_CID_ILLUMINATORS_1:
return "Illuminator 1";
case VIDEO_CID_ILLUMINATORS_2:
return "Illuminator 2";
case VIDEO_CID_ALPHA_COMPONENT:
return "Alpha Component";
case VIDEO_CID_COLORFX_CBCR:
return "Color Effects, CbCr";
case VIDEO_CID_COLORFX_RGB:
return "Color Effects, RGB";

/* Camera controls */
case VIDEO_CID_EXPOSURE_AUTO:
return "Auto Exposure";
case VIDEO_CID_EXPOSURE_ABSOLUTE:
return "Exposure Time, Absolute";
case VIDEO_CID_EXPOSURE_AUTO_PRIORITY:
return "Exposure, Dynamic Framerate";
case VIDEO_CID_PAN_RELATIVE:
return "Pan, Relative";
case VIDEO_CID_TILT_RELATIVE:
return "Tilt, Relative";
case VIDEO_CID_PAN_RESET:
return "Pan, Reset";
case VIDEO_CID_TILT_RESET:
return "Tilt, Reset";
case VIDEO_CID_PAN_ABSOLUTE:
return "Pan, Absolute";
case VIDEO_CID_TILT_ABSOLUTE:
return "Tilt, Absolute";
case VIDEO_CID_FOCUS_ABSOLUTE:
return "Focus, Absolute";
case VIDEO_CID_FOCUS_RELATIVE:
return "Focus, Relative";
case VIDEO_CID_FOCUS_AUTO:
return "Focus, Automatic Continuous";
case VIDEO_CID_ZOOM_ABSOLUTE:
return "Zoom, Absolute";
case VIDEO_CID_ZOOM_RELATIVE:
return "Zoom, Relative";
case VIDEO_CID_ZOOM_CONTINUOUS:
return "Zoom, Continuous";
case VIDEO_CID_PRIVACY:
return "Privacy";
case VIDEO_CID_IRIS_ABSOLUTE:
return "Iris, Absolute";
case VIDEO_CID_IRIS_RELATIVE:
return "Iris, Relative";
case VIDEO_CID_AUTO_EXPOSURE_BIAS:
return "Auto Exposure, Bias";
case VIDEO_CID_AUTO_N_PRESET_WHITE_BALANCE:
return "White Balance, Auto & Preset";
case VIDEO_CID_WIDE_DYNAMIC_RANGE:
return "Wide Dynamic Range";
case VIDEO_CID_IMAGE_STABILIZATION:
return "Image Stabilization";
case VIDEO_CID_ISO_SENSITIVITY:
return "ISO Sensitivity";
case VIDEO_CID_ISO_SENSITIVITY_AUTO:
return "ISO Sensitivity, Auto";
case VIDEO_CID_EXPOSURE_METERING:
return "Exposure, Metering Mode";
case VIDEO_CID_SCENE_MODE:
return "Scene Mode";
case VIDEO_CID_3A_LOCK:
return "3A Lock";
case VIDEO_CID_AUTO_FOCUS_START:
return "Auto Focus, Start";
case VIDEO_CID_AUTO_FOCUS_STOP:
return "Auto Focus, Stop";
case VIDEO_CID_AUTO_FOCUS_STATUS:
return "Auto Focus, Status";
case VIDEO_CID_AUTO_FOCUS_RANGE:
return "Auto Focus, Range";
case VIDEO_CID_PAN_SPEED:
return "Pan, Speed";
case VIDEO_CID_TILT_SPEED:
return "Tilt, Speed";
case VIDEO_CID_CAMERA_ORIENTATION:
return "Camera Orientation";
case VIDEO_CID_CAMERA_SENSOR_ROTATION:
return "Camera Sensor Rotation";
case VIDEO_CID_HDR_SENSOR_MODE:
return "HDR Sensor Mode";

/* JPEG encoder controls */
case VIDEO_CID_JPEG_COMPRESSION_QUALITY:
Expand Down
31 changes: 17 additions & 14 deletions drivers/video/video_sw_generator.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* SPDX-License-Identifier: Apache-2.0
*/

#define DT_DRV_COMPAT zephyr_sw_generator
#define DT_DRV_COMPAT zephyr_video_sw_generator

#include <zephyr/kernel.h>
#include <zephyr/drivers/video.h>
Expand Down Expand Up @@ -338,14 +338,6 @@ static DEVICE_API(video, video_sw_generator_driver_api) = {
#endif
};

static struct video_sw_generator_data video_sw_generator_data_0 = {
.fmt.width = 320,
.fmt.height = 160,
.fmt.pitch = 320 * 2,
.fmt.pixelformat = VIDEO_PIX_FMT_RGB565,
.frame_rate = DEFAULT_FRAME_RATE,
};

static int video_sw_generator_init_controls(const struct device *dev)
{
struct video_sw_generator_data *data = dev->data;
Expand All @@ -366,8 +358,19 @@ static int video_sw_generator_init(const struct device *dev)
return video_sw_generator_init_controls(dev);
}

DEVICE_DEFINE(video_sw_generator, "VIDEO_SW_GENERATOR", &video_sw_generator_init, NULL,
&video_sw_generator_data_0, NULL, POST_KERNEL, CONFIG_VIDEO_INIT_PRIORITY,
&video_sw_generator_driver_api);

VIDEO_DEVICE_DEFINE(video_sw_generator, DEVICE_GET(video_sw_generator), NULL);
#define VIDEO_SW_GENERATOR_DEFINE(n) \
static struct video_sw_generator_data video_sw_generator_data_##n = { \
.fmt.width = 320, \
.fmt.height = 160, \
.fmt.pitch = 320 * 2, \
.fmt.pixelformat = VIDEO_PIX_FMT_RGB565, \
.frame_rate = DEFAULT_FRAME_RATE, \
}; \
\
DEVICE_DT_INST_DEFINE(n, &video_sw_generator_init, NULL, &video_sw_generator_data_##n, \
NULL, POST_KERNEL, CONFIG_VIDEO_INIT_PRIORITY, \
&video_sw_generator_driver_api); \
\
VIDEO_DEVICE_DEFINE(video_sw_generator_##n, DEVICE_DT_INST_GET(n), NULL);

DT_INST_FOREACH_STATUS_OKAY(VIDEO_SW_GENERATOR_DEFINE)
Loading