summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosep Torra <n770galaxy@gmail.com>2016-03-04 15:09:45 +0100
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2016-04-07 11:41:45 -0400
commit1a4b620175883db867cfe83a4953e4f0b72d0865 (patch)
treeafccb89c85a543cfc6d2499e1eb8a431f4c00533
parent1fb9330f35f169d6aec2dcd86c0dd47247fd04b4 (diff)
downloadgstreamer-plugins-good-1a4b620175883db867cfe83a4953e4f0b72d0865.tar.gz
v4l2: fix colorimetry for NV12
Replicate V4L2_MAP_QUANTIZATION_DEFAULT macro behavior. At #v4l it was described that documentation might be wrong and that we should trust this macro instead. https://bugzilla.gnome.org/show_bug.cgi?id=762529
-rw-r--r--sys/v4l2/gstv4l2object.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c
index b3586802b..fc3b408d3 100644
--- a/sys/v4l2/gstv4l2object.c
+++ b/sys/v4l2/gstv4l2object.c
@@ -1715,7 +1715,7 @@ gst_v4l2_object_get_interlace_mode (enum v4l2_field field,
static gboolean
gst_v4l2_object_get_colorspace (enum v4l2_colorspace colorspace,
enum v4l2_quantization range, enum v4l2_ycbcr_encoding matrix,
- enum v4l2_xfer_func transfer, GstVideoColorimetry * cinfo)
+ enum v4l2_xfer_func transfer, gboolean is_rgb, GstVideoColorimetry * cinfo)
{
gboolean ret = TRUE;
@@ -1786,7 +1786,15 @@ gst_v4l2_object_get_colorspace (enum v4l2_colorspace colorspace,
cinfo->range = GST_VIDEO_COLOR_RANGE_16_235;
break;
case V4L2_QUANTIZATION_DEFAULT:
- /* nothing, just use defaults for colorspace */
+ /* replicated V4L2_MAP_QUANTIZATION_DEFAULT macro behavior */
+ if (is_rgb && colorspace == V4L2_COLORSPACE_BT2020)
+ cinfo->range = GST_VIDEO_COLOR_RANGE_16_235;
+ else if (is_rgb || matrix == V4L2_YCBCR_ENC_XV601
+ || matrix == V4L2_YCBCR_ENC_XV709
+ || colorspace == V4L2_COLORSPACE_JPEG)
+ cinfo->range = GST_VIDEO_COLOR_RANGE_0_255;
+ else
+ cinfo->range = GST_VIDEO_COLOR_RANGE_16_235;
break;
default:
GST_WARNING ("Unknown enum v4l2_quantization value %d", range);
@@ -1967,6 +1975,7 @@ gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
enum v4l2_quantization range;
enum v4l2_ycbcr_encoding matrix;
enum v4l2_xfer_func transfer;
+ gboolean is_rgb = gst_v4l2_object_v4l2fourcc_is_rgb (pixelformat);
if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
colorspace = fmt.fmt.pix_mp.colorspace;
@@ -1981,11 +1990,11 @@ gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
}
if (gst_v4l2_object_get_colorspace (colorspace, range, matrix, transfer,
- &cinfo)) {
+ is_rgb, &cinfo)) {
/* Set identity matrix for R'G'B' formats to avoid creating
* confusion. This though is cosmetic as it's now properly ignored by
* the video info API and videoconvert. */
- if (gst_v4l2_object_v4l2fourcc_is_rgb (pixelformat))
+ if (is_rgb)
cinfo.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
g_value_init (&colorimetry, G_TYPE_STRING);