blob: f1bb7ad8dbbf889b0a6926aa07e359164b95f7e4 [file] [log] [blame]
/*
* Copyright (c) 2019 Linaro Limited.
* Copyright (c) 2024 tinyVision.ai Inc.
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_VIDEO_CONTROLS_H_
#define ZEPHYR_INCLUDE_VIDEO_CONTROLS_H_
/**
* @file
* @ingroup video_controls
* @brief Main header file for video controls driver API.
*/
/**
* @brief Video controls
* @defgroup video_controls Video Controls
* @ingroup video_interface
*
* The Video control IDs (CIDs) are introduced with the same name as
* Linux V4L2 subsystem and under the same class. This facilitates
* inter-operability and debugging devices end-to-end across Linux and
* Zephyr.
*
* This list is maintained compatible to the Linux kernel definitions in
* @c linux/include/uapi/linux/v4l2-controls.h
*
* @{
*/
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name Base class control IDs
* @{
*/
#define VIDEO_CID_BASE 0x00980900
/** Picture brightness, or more precisely, the black level. */
#define VIDEO_CID_BRIGHTNESS (VIDEO_CID_BASE + 0)
/** Picture contrast or luma gain. */
#define VIDEO_CID_CONTRAST (VIDEO_CID_BASE + 1)
/** Picture color saturation or chroma gain. */
#define VIDEO_CID_SATURATION (VIDEO_CID_BASE + 2)
/** Hue or color balance. */
#define VIDEO_CID_HUE (VIDEO_CID_BASE + 3)
/** Automatic white balance (cameras). */
#define VIDEO_CID_AUTO_WHITE_BALANCE (VIDEO_CID_BASE + 12)
/** Red chroma balance, as a ratio to the green channel. */
#define VIDEO_CID_RED_BALANCE (VIDEO_CID_BASE + 14)
/** Blue chroma balance, as a ratio to the green channel. */
#define VIDEO_CID_BLUE_BALANCE (VIDEO_CID_BASE + 15)
/** Gamma adjust. */
#define VIDEO_CID_GAMMA (VIDEO_CID_BASE + 16)
/** Image sensor exposure time. */
#define VIDEO_CID_EXPOSURE (VIDEO_CID_BASE + 17)
/** Automatic gain control */
#define VIDEO_CID_AUTOGAIN (VIDEO_CID_BASE + 18)
/** Gain control. Most devices control only digital gain with this control.
* Devices that recognise the difference between digital and analogue gain use
* VIDEO_CID_DIGITAL_GAIN and VIDEO_CID_ANALOGUE_GAIN.
*/
#define VIDEO_CID_GAIN (VIDEO_CID_BASE + 19)
/** Flip the image horizontally: the left side becomes the right side */
#define VIDEO_CID_HFLIP (VIDEO_CID_BASE + 20)
/** Flip the image vertically: the top side becomes the bottom side */
#define VIDEO_CID_VFLIP (VIDEO_CID_BASE + 21)
/** Frequency of the power line to compensate for.
* Avoids flicker due to artificial lighting.
*/
#define VIDEO_CID_POWER_LINE_FREQUENCY (VIDEO_CID_BASE + 24)
/**
* @brief Video power line frequency
*/
enum video_power_line_frequency {
VIDEO_CID_POWER_LINE_FREQUENCY_DISABLED = 0, /**< Power line frequency disabled. */
VIDEO_CID_POWER_LINE_FREQUENCY_50HZ = 1, /**< 50 Hz power line frequency. */
VIDEO_CID_POWER_LINE_FREQUENCY_60HZ = 2, /**< 60 Hz power line frequency. */
VIDEO_CID_POWER_LINE_FREQUENCY_AUTO = 3, /**< Automatic power line frequency. */
};
/** Enables automatic hue control by the device.
* Setting @ref VIDEO_CID_HUE while automatic hue control is enabled is undefined.
* Drivers should ignore such request.
*/
#define VIDEO_CID_HUE_AUTO (VIDEO_CID_BASE + 25)
/** White balance settings as a color temperature in Kelvin.
* A driver should have a minimum range of 2800 (incandescent) to 6500 (daylight).
*/
#define VIDEO_CID_WHITE_BALANCE_TEMPERATURE (VIDEO_CID_BASE + 26)
/** Adjusts the sharpness filters in a camera.
* The minimum value disables the filters, higher values give a sharper picture.
*/
#define VIDEO_CID_SHARPNESS (VIDEO_CID_BASE + 27)
/** Adjusts the backlight compensation in a camera.
* The minimum value disables backlight compensation.
*/
#define VIDEO_CID_BACKLIGHT_COMPENSATION (VIDEO_CID_BASE + 28)
/** Selects a color effect. */
#define VIDEO_CID_COLORFX (VIDEO_CID_BASE + 31)
/**
* @brief Video color effects
*/
enum video_colorfx {
VIDEO_COLORFX_NONE = 0, /**< No color effect. */
VIDEO_COLORFX_BW = 1, /**< Black and white effect. */
VIDEO_COLORFX_SEPIA = 2, /**< Sepia tone effect. */
VIDEO_COLORFX_NEGATIVE = 3, /**< Negative image effect. */
VIDEO_COLORFX_EMBOSS = 4, /**< Emboss effect. */
VIDEO_COLORFX_SKETCH = 5, /**< Sketch/drawing effect. */
VIDEO_COLORFX_SKY_BLUE = 6, /**< Sky blue tint effect. */
VIDEO_COLORFX_GRASS_GREEN = 7, /**< Grass green tint effect. */
VIDEO_COLORFX_SKIN_WHITEN = 8, /**< Skin whitening effect. */
VIDEO_COLORFX_VIVID = 9, /**< Vivid/bright color effect. */
VIDEO_COLORFX_AQUA = 10, /**< Aqua (blue-green) effect. */
VIDEO_COLORFX_ART_FREEZE = 11, /**< Art freeze/stylized effect. */
VIDEO_COLORFX_SILHOUETTE = 12, /**< Silhouette effect. */
VIDEO_COLORFX_SOLARIZATION = 13, /**< Solarization effect. */
VIDEO_COLORFX_ANTIQUE = 14, /**< Antique/vintage effect. */
};
/** Enables automatic brightness. */
#define VIDEO_CID_AUTOBRIGHTNESS (VIDEO_CID_BASE + 32)
/** Switch the band-stop filter of a camera sensor on or off, or specify its strength.
* Such band-stop filters can be used, for example, to filter out the fluorescent light component.
*/
#define VIDEO_CID_BAND_STOP_FILTER (VIDEO_CID_BASE + 33)
/** Sets the alpha color component.
* Some devices produce data with a user-controllable alpha component. Set the value applied to
* the alpha channel of every pixel produced.
*/
#define VIDEO_CID_ALPHA_COMPONENT (VIDEO_CID_BASE + 41)
/** Last base CID + 1 */
#define VIDEO_CID_LASTP1 (VIDEO_CID_BASE + 44)
/**
* @}
*/
/**
* @name Stateful codec controls IDs
* @{
*/
#define VIDEO_CID_CODEC_CLASS_BASE 0x00990900
/**
* @}
*/
/**
* @name Camera class controls IDs
* @{
*/
#define VIDEO_CID_CAMERA_CLASS_BASE 0x009a0900
/** Enables automatic adjustments of the exposure time and/or iris aperture.
* Manual exposure or iris changes when it is not @ref VIDEO_EXPOSURE_MANUAL is undefined.
* Drivers should ignore such requests.
*/
#define VIDEO_CID_EXPOSURE_AUTO (VIDEO_CID_CAMERA_CLASS_BASE + 1)
/**
* @brief Video exposure type
*/
enum video_exposure_type {
VIDEO_EXPOSURE_AUTO = 0, /**< Automatic exposure. */
VIDEO_EXPOSURE_MANUAL = 1, /**< Manual exposure. */
VIDEO_EXPOSURE_SHUTTER_PRIORITY = 2, /**< Shutter priority. */
VIDEO_EXPOSURE_APERTURE_PRIORITY = 3 /**< Aperture priority. */
};
/** Determines the exposure time of the camera sensor.
* The exposure time is limited by the frame in terval. Drivers should interpret the values as
* 100 µs units, where the value 1 stands for 1/10000th of a second, 10000 for 1 second and 100000
* for 10 seconds.
*/
#define VIDEO_CID_EXPOSURE_ABSOLUTE (VIDEO_CID_CAMERA_CLASS_BASE + 2)
/** Whether the device may dynamically vary the frame rate under the effect of auto-exposure
* Applicable when @ref VIDEO_CID_EXPOSURE_AUTO is set to @ref VIDEO_EXPOSURE_AUTO or
* @ref VIDEO_EXPOSURE_APERTURE_PRIORITY. Disabled by default: the frame rate must remain constant.
*/
#define VIDEO_CID_EXPOSURE_AUTO_PRIORITY (VIDEO_CID_CAMERA_CLASS_BASE + 3)
/** This write-only control turns the camera horizontally by the specified amount.
* The unit is undefined. A positive value moves the camera to the right (clockwise when viewed
* from above), a negative value to the left. A value of zero does not cause motion.
*/
#define VIDEO_CID_PAN_RELATIVE (VIDEO_CID_CAMERA_CLASS_BASE + 4)
/** This write-only control turns the camera vertically by the specified amount.
* The unit is undefined. A positive value moves the camera up, a negative value down.
* A value of zero does not cause motion.
*/
#define VIDEO_CID_TILT_RELATIVE (VIDEO_CID_CAMERA_CLASS_BASE + 5)
/** This control turns the camera horizontally to the specified position.
* Positive values move the camera to the right (clockwise when viewed from above), negative
* values to the left. Drivers should interpret the values as arc seconds, with valid values
* between -180 * 3600 and +180 * 3600 inclusive.
*/
#define VIDEO_CID_PAN_ABSOLUTE (VIDEO_CID_CAMERA_CLASS_BASE + 8)
/** This control turns the camera vertically to the specified position.
* Positive values move the camera up, negative values down. Drivers should interpret the values as
* arc seconds, with valid values between -180 * 3600 and +180 * 3600 inclusive.
*/
#define VIDEO_CID_TILT_ABSOLUTE (VIDEO_CID_CAMERA_CLASS_BASE + 9)
/** This control sets the focal point of the camera to the specified position.
* The unit is undefined. Positive values set the focus closer to the camera, negative values
* towards infinity.
*/
#define VIDEO_CID_FOCUS_ABSOLUTE (VIDEO_CID_CAMERA_CLASS_BASE + 10)
/** This write-only control moves the focal point of the camera by the specified amount.
* The unit is undefined. Positive values move the focus closer to the camera, negative values
* towards infinity.
*/
#define VIDEO_CID_FOCUS_RELATIVE (VIDEO_CID_CAMERA_CLASS_BASE + 11)
/** Enables continuous automatic focus adjustments.
* Manual focus adjustments while this control is on (set to 1) is undefined.
* Drivers should ignore such requests.
*/
#define VIDEO_CID_FOCUS_AUTO (VIDEO_CID_CAMERA_CLASS_BASE + 12)
/** Specify the objective lens focal length as an absolute value.
* The zoom unit is driver-specific and its value should be a positive integer.
*/
#define VIDEO_CID_ZOOM_ABSOLUTE (VIDEO_CID_CAMERA_CLASS_BASE + 13)
/** This write-only control sets the objective lens focal length relatively to the current value.
* Positive values move the zoom lens group towards the telephoto direction, negative values
* towards the wide-angle direction. The zoom unit is driver-specific.
*/
#define VIDEO_CID_ZOOM_RELATIVE (VIDEO_CID_CAMERA_CLASS_BASE + 14)
/** Start a continuous zoom movement.
* Move the objective lens group at the specified speed until it reaches physical device limits or
* until an explicit request to stop the movement. A positive value moves the zoom lens group
* towards the telephoto direction. A value of zero stops the zoom lens group movement.
* A negative value moves the zoom lens group towards the wide-angle direction.
* The zoom speed unit is driver-specific.
*/
#define VIDEO_CID_ZOOM_CONTINUOUS (VIDEO_CID_CAMERA_CLASS_BASE + 15)
/** This control sets the camera's aperture to the specified value.
* The unit is undefined. Larger values open the iris wider, smaller values close it.
*/
#define VIDEO_CID_IRIS_ABSOLUTE (VIDEO_CID_CAMERA_CLASS_BASE + 17)
/** This write-only control modifies the camera's aperture by the specified amount.
* The unit is undefined. Positive values open the iris one step further, negative values close
* it one step further.
*/
#define VIDEO_CID_IRIS_RELATIVE (VIDEO_CID_CAMERA_CLASS_BASE + 18)
/** Enables or disables the camera's wide dynamic range feature.
* This feature allows to obtain clear images in situations where intensity of the illumination
* varies significantly throughout the scene, i.e. there are simultaneously very dark and very
* bright areas. It is most commonly realized in cameras by combining two subsequent frames with
* different exposure times.
*/
#define VIDEO_CID_WIDE_DYNAMIC_RANGE (VIDEO_CID_CAMERA_CLASS_BASE + 21)
/**This control turns the camera horizontally at the specific speed.
* The unit is undefined. A positive value moves the camera to the right (clockwise when viewed
* from above), a negative value to the left. A value of zero stops the motion if one is in
* progress and has no effect otherwise.
*/
#define VIDEO_CID_PAN_SPEED (VIDEO_CID_CAMERA_CLASS_BASE + 32)
/** This control turns the camera vertically at the specified speed.
* The unit is undefined. A positive value moves the camera up, a negative value down.
* A value of zero stops the motion if one is in progress and has no effect otherwise.
*/
#define VIDEO_CID_TILT_SPEED (VIDEO_CID_CAMERA_CLASS_BASE + 33)
/** This read-only control describes the camera position on the device
* It by reports where the camera camera is installed, its mounting position on the device.
* This control is particularly meaningful for devices which have a well defined orientation,
* such as phones, laptops and portable devices since the control is expressed as a position
* relative to the device's intended usage orientation.
* , or , are said to have the
* @ref VIDEO_CAMERA_ORIENTATION_EXTERNAL orientation.
*/
#define VIDEO_CID_CAMERA_ORIENTATION (VIDEO_CID_CAMERA_CLASS_BASE + 34)
/**
* @brief Video camera orientation
*/
enum video_camera_orientation {
/** Camera installed on the user-facing side of a phone/tablet/laptop device */
VIDEO_CAMERA_ORIENTATION_FRONT = 0,
/** Camera installed on the opposite side of the user */
VIDEO_CAMERA_ORIENTATION_BACK = 1,
/** Camera sensors not directly attached to the device or that can move freely */
VIDEO_CAMERA_ORIENTATION_EXTERNAL = 2,
};
/** This read-only control describes the orientation of the sensor in the device.
* The value is the rotation correction in degrees in the counter-clockwise direction to be
* applied to the captured images once captured to memory to compensate for the camera sensor
* mounting rotation.
*/
#define VIDEO_CID_CAMERA_SENSOR_ROTATION (VIDEO_CID_CAMERA_CLASS_BASE + 35)
/**
* @}
*/
/**
* @name Camera Flash class control IDs
* @{
*/
#define VIDEO_CID_FLASH_CLASS_BASE 0x009c0900
/**
* @}
*/
/**
* @name JPEG class control IDs
* @{
*/
#define VIDEO_CID_JPEG_CLASS_BASE 0x009d0900
/** Quality (Q) factor of the JPEG algorithm, also increasing the data size */
#define VIDEO_CID_JPEG_COMPRESSION_QUALITY (VIDEO_CID_JPEG_CLASS_BASE + 3)
/**
* @}
*/
/**
* @name Image Source class control IDs
* @{
*/
#define VIDEO_CID_IMAGE_SOURCE_CLASS_BASE 0x009e0900
/** Analogue gain control. */
#define VIDEO_CID_ANALOGUE_GAIN (VIDEO_CID_IMAGE_SOURCE_CLASS_BASE + 3)
/**
* @}
*/
/**
* @name Image Processing class control IDs
* @{
*/
#define VIDEO_CID_IMAGE_PROC_CLASS_BASE 0x009f0900
/** Link frequency, applicable for the CSI2 based devices */
#define VIDEO_CID_LINK_FREQ (VIDEO_CID_IMAGE_PROC_CLASS_BASE + 1)
/** Pixel rate (pixels/second) in the device's pixel array. This control is read-only. */
#define VIDEO_CID_PIXEL_RATE (VIDEO_CID_IMAGE_PROC_CLASS_BASE + 2)
/** Selection of the type of test pattern to represent */
#define VIDEO_CID_TEST_PATTERN (VIDEO_CID_IMAGE_PROC_CLASS_BASE + 3)
/**
* @}
*/
/**
* @name Vendor-specific class control IDs
* @{
*/
#define VIDEO_CID_PRIVATE_BASE 0x08000000
/**
* @}
*/
/**
* @name Query flags, to be ORed with the control ID
* @{
*/
#define VIDEO_CTRL_FLAG_NEXT_CTRL 0x80000000
/**
* @}
*/
/**
* @name Public video control structures
* @{
*/
/**
* @struct video_control
* @brief Video control structure
*
* Used to get/set a video control.
* @see video_ctrl for the struct used in the driver implementation
*/
struct video_control {
/** control id */
uint32_t id;
/** control value */
union {
int32_t val;
int64_t val64;
};
};
/**
* @struct video_control_range
* @brief Video control range structure
*
* Describe range of a control including min, max, step and default values
*/
struct video_ctrl_range {
/** control minimum value, inclusive */
union {
int32_t min;
int64_t min64;
};
/** control maximum value, inclusive */
union {
int32_t max;
int64_t max64;
};
/** control value step */
union {
int32_t step;
int64_t step64;
};
/** control default value for VIDEO_CTRL_TYPE_INTEGER, _BOOLEAN, _MENU or
* _INTEGER_MENU, not valid for other types
*/
union {
int32_t def;
int64_t def64;
};
};
/**
* @struct video_control_query
* @brief Video control query structure
*
* Used to query information about a control.
*/
struct video_ctrl_query {
/** device being queried, application needs to set this field */
const struct device *dev;
/** control id, application needs to set this field */
uint32_t id;
/** control type */
uint32_t type;
/** control name */
const char *name;
/** control flags */
uint32_t flags;
/** control range */
struct video_ctrl_range range;
/** menu if control is of menu type */
union {
const char *const *menu;
const int64_t *int_menu;
};
};
/**
* @}
*/
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#endif /* ZEPHYR_INCLUDE_VIDEO_H_ */