Commit cd8adbe7 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] vivid: add new colorspaces

Add AdobeRGB and BT.2020 support.

The colorspace control now orders the colorspaces according to how often
they are used. So rarely used colorspaces are moved to the end. This makes
it more logical when testing colorspace support.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 481b97a1
...@@ -116,6 +116,17 @@ enum vivid_signal_mode { ...@@ -116,6 +116,17 @@ enum vivid_signal_mode {
CUSTOM_DV_TIMINGS, CUSTOM_DV_TIMINGS,
}; };
enum vivid_colorspace {
VIVID_CS_170M,
VIVID_CS_709,
VIVID_CS_SRGB,
VIVID_CS_ADOBERGB,
VIVID_CS_2020,
VIVID_CS_240M,
VIVID_CS_SYS_M,
VIVID_CS_SYS_BG,
};
#define VIVID_INVALID_SIGNAL(mode) \ #define VIVID_INVALID_SIGNAL(mode) \
((mode) == NO_SIGNAL || (mode) == NO_LOCK || (mode) == OUT_OF_RANGE) ((mode) == NO_SIGNAL || (mode) == NO_LOCK || (mode) == OUT_OF_RANGE)
......
...@@ -333,6 +333,16 @@ static const struct v4l2_ctrl_ops vivid_user_vid_ctrl_ops = { ...@@ -333,6 +333,16 @@ static const struct v4l2_ctrl_ops vivid_user_vid_ctrl_ops = {
static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl) static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
{ {
static const u32 colorspaces[] = {
V4L2_COLORSPACE_SMPTE170M,
V4L2_COLORSPACE_REC709,
V4L2_COLORSPACE_SRGB,
V4L2_COLORSPACE_ADOBERGB,
V4L2_COLORSPACE_BT2020,
V4L2_COLORSPACE_SMPTE240M,
V4L2_COLORSPACE_470_SYSTEM_M,
V4L2_COLORSPACE_470_SYSTEM_BG,
};
struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_vid_cap); struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_vid_cap);
unsigned i; unsigned i;
...@@ -342,7 +352,7 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl) ...@@ -342,7 +352,7 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
tpg_s_pattern(&dev->tpg, ctrl->val); tpg_s_pattern(&dev->tpg, ctrl->val);
break; break;
case VIVID_CID_COLORSPACE: case VIVID_CID_COLORSPACE:
tpg_s_colorspace(&dev->tpg, ctrl->val); tpg_s_colorspace(&dev->tpg, colorspaces[ctrl->val]);
vivid_send_source_change(dev, TV); vivid_send_source_change(dev, TV);
vivid_send_source_change(dev, SVID); vivid_send_source_change(dev, SVID);
vivid_send_source_change(dev, HDMI); vivid_send_source_change(dev, HDMI);
...@@ -662,15 +672,14 @@ static const struct v4l2_ctrl_config vivid_ctrl_max_edid_blocks = { ...@@ -662,15 +672,14 @@ static const struct v4l2_ctrl_config vivid_ctrl_max_edid_blocks = {
}; };
static const char * const vivid_ctrl_colorspace_strings[] = { static const char * const vivid_ctrl_colorspace_strings[] = {
"",
"SMPTE 170M", "SMPTE 170M",
"SMPTE 240M",
"REC 709", "REC 709",
"", /* Skip Bt878 entry */ "sRGB",
"AdobeRGB",
"BT.2020",
"SMPTE 240M",
"470 System M", "470 System M",
"470 System BG", "470 System BG",
"", /* Skip JPEG entry */
"sRGB",
NULL, NULL,
}; };
...@@ -679,10 +688,8 @@ static const struct v4l2_ctrl_config vivid_ctrl_colorspace = { ...@@ -679,10 +688,8 @@ static const struct v4l2_ctrl_config vivid_ctrl_colorspace = {
.id = VIVID_CID_COLORSPACE, .id = VIVID_CID_COLORSPACE,
.name = "Colorspace", .name = "Colorspace",
.type = V4L2_CTRL_TYPE_MENU, .type = V4L2_CTRL_TYPE_MENU,
.min = 1, .max = 7,
.max = 8, .def = 2,
.menu_skip_mask = (1 << 4) | (1 << 7),
.def = 8,
.qmenu = vivid_ctrl_colorspace_strings, .qmenu = vivid_ctrl_colorspace_strings,
}; };
......
...@@ -443,12 +443,12 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls) ...@@ -443,12 +443,12 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls)
break; break;
if (bt->standards & V4L2_DV_BT_STD_CEA861) { if (bt->standards & V4L2_DV_BT_STD_CEA861) {
if (bt->width == 720 && bt->height <= 576) if (bt->width == 720 && bt->height <= 576)
v4l2_ctrl_s_ctrl(dev->colorspace, V4L2_COLORSPACE_SMPTE170M); v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M);
else else
v4l2_ctrl_s_ctrl(dev->colorspace, V4L2_COLORSPACE_REC709); v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_709);
v4l2_ctrl_s_ctrl(dev->real_rgb_range_cap, 1); v4l2_ctrl_s_ctrl(dev->real_rgb_range_cap, 1);
} else { } else {
v4l2_ctrl_s_ctrl(dev->colorspace, V4L2_COLORSPACE_SRGB); v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB);
v4l2_ctrl_s_ctrl(dev->real_rgb_range_cap, 0); v4l2_ctrl_s_ctrl(dev->real_rgb_range_cap, 0);
} }
tpg_s_rgb_range(&dev->tpg, v4l2_ctrl_g_ctrl(dev->rgb_range_cap)); tpg_s_rgb_range(&dev->tpg, v4l2_ctrl_g_ctrl(dev->rgb_range_cap));
...@@ -1307,20 +1307,20 @@ int vidioc_s_input(struct file *file, void *priv, unsigned i) ...@@ -1307,20 +1307,20 @@ int vidioc_s_input(struct file *file, void *priv, unsigned i)
if (dev->colorspace) { if (dev->colorspace) {
switch (dev->input_type[i]) { switch (dev->input_type[i]) {
case WEBCAM: case WEBCAM:
v4l2_ctrl_s_ctrl(dev->colorspace, V4L2_COLORSPACE_SRGB); v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB);
break; break;
case TV: case TV:
case SVID: case SVID:
v4l2_ctrl_s_ctrl(dev->colorspace, V4L2_COLORSPACE_SMPTE170M); v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M);
break; break;
case HDMI: case HDMI:
if (bt->standards & V4L2_DV_BT_STD_CEA861) { if (bt->standards & V4L2_DV_BT_STD_CEA861) {
if (dev->src_rect.width == 720 && dev->src_rect.height <= 576) if (dev->src_rect.width == 720 && dev->src_rect.height <= 576)
v4l2_ctrl_s_ctrl(dev->colorspace, V4L2_COLORSPACE_SMPTE170M); v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M);
else else
v4l2_ctrl_s_ctrl(dev->colorspace, V4L2_COLORSPACE_REC709); v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_709);
} else { } else {
v4l2_ctrl_s_ctrl(dev->colorspace, V4L2_COLORSPACE_SRGB); v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB);
} }
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment