From b5530a19a7b53064466b5487cc4e28547038c0e3 Mon Sep 17 00:00:00 2001
From: Philipp Zabel
Date: Wed, 18 May 2016 10:17:12 +0200
Subject: [PATCH] v4l2object: refactor gst_v4l2_object_get_colorspace to take a
v4l2_format parameter
Move the extraction of colorimetry parameters from struct v4l2_format and the
setting of the identity matrix for RGB formats into the function to avoid code
duplication.
https://bugzilla.gnome.org/show_bug.cgi?id=766383
---
sys/v4l2/gstv4l2object.c | 80 +++++++++++++++-------------------------
1 file changed, 29 insertions(+), 51 deletions(-)
diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c
index 0d145fb608..e0999b2df1 100644
--- a/sys/v4l2/gstv4l2object.c
+++ b/sys/v4l2/gstv4l2object.c
@@ -1887,12 +1887,28 @@ 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, gboolean is_rgb, GstVideoColorimetry * cinfo)
+gst_v4l2_object_get_colorspace(struct v4l2_format * fmt,
+ GstVideoColorimetry * cinfo)
{
+ gboolean is_rgb = gst_v4l2_object_v4l2fourcc_is_rgb (fmt->fmt.pix.pixelformat);
+ enum v4l2_colorspace colorspace;
+ enum v4l2_quantization range;
+ enum v4l2_ycbcr_encoding matrix;
+ enum v4l2_xfer_func transfer;
gboolean ret = TRUE;
+ if (V4L2_TYPE_IS_MULTIPLANAR (fmt->type)) {
+ colorspace = fmt->fmt.pix_mp.colorspace;
+ range = fmt->fmt.pix_mp.quantization;
+ matrix = fmt->fmt.pix_mp.ycbcr_enc;
+ transfer = fmt->fmt.pix_mp.xfer_func;
+ } else {
+ colorspace = fmt->fmt.pix.colorspace;
+ range = fmt->fmt.pix.quantization;
+ matrix = fmt->fmt.pix.ycbcr_enc;
+ transfer = fmt->fmt.pix.xfer_func;
+ }
+
/* First step, set the defaults for each primaries */
switch (colorspace) {
case V4L2_COLORSPACE_SMPTE170M:
@@ -2017,6 +2033,12 @@ gst_v4l2_object_get_colorspace (enum v4l2_colorspace colorspace,
break;
}
+ /* 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 (is_rgb)
+ cinfo->matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+
switch (transfer) {
case V4L2_XFER_FUNC_709:
cinfo->transfer = GST_VIDEO_TRANSFER_BT709;
@@ -2176,7 +2198,6 @@ gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
GValue list = G_VALUE_INIT;
GstVideoColorimetry cinfo;
enum v4l2_colorspace req_cspace;
- gboolean is_rgb = gst_v4l2_object_v4l2fourcc_is_rgb (pixelformat);
memset (&fmt, 0, sizeof (fmt));
fmt.type = v4l2object->type;
@@ -2189,33 +2210,8 @@ gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
/* step 1: get device default colorspace and insert it first as
* it should be the preferred one */
if (gst_v4l2_object_try_fmt (v4l2object, &fmt) == 0) {
- enum v4l2_colorspace colorspace;
- enum v4l2_quantization range;
- enum v4l2_ycbcr_encoding matrix;
- enum v4l2_xfer_func transfer;
-
- if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
- colorspace = fmt.fmt.pix_mp.colorspace;
- range = fmt.fmt.pix_mp.quantization;
- matrix = fmt.fmt.pix_mp.ycbcr_enc;
- transfer = fmt.fmt.pix_mp.xfer_func;
- } else {
- colorspace = fmt.fmt.pix.colorspace;
- range = fmt.fmt.pix.quantization;
- matrix = fmt.fmt.pix.ycbcr_enc;
- transfer = fmt.fmt.pix.xfer_func;
- }
-
- if (gst_v4l2_object_get_colorspace (colorspace, range, matrix, transfer,
- 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 (is_rgb)
- cinfo.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
-
+ if (gst_v4l2_object_get_colorspace(&fmt, &cinfo))
gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
- }
}
/* step 2: probe all colorspace other than default
@@ -2235,33 +2231,15 @@ gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
if (gst_v4l2_object_try_fmt (v4l2object, &fmt) == 0) {
enum v4l2_colorspace colorspace;
- enum v4l2_quantization range;
- enum v4l2_ycbcr_encoding matrix;
- enum v4l2_xfer_func transfer;
- if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
+ if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type))
colorspace = fmt.fmt.pix_mp.colorspace;
- range = fmt.fmt.pix_mp.quantization;
- matrix = fmt.fmt.pix_mp.ycbcr_enc;
- transfer = fmt.fmt.pix_mp.xfer_func;
- } else {
+ else
colorspace = fmt.fmt.pix.colorspace;
- range = fmt.fmt.pix.quantization;
- matrix = fmt.fmt.pix.ycbcr_enc;
- transfer = fmt.fmt.pix.xfer_func;
- }
if (colorspace == req_cspace) {
- if (gst_v4l2_object_get_colorspace (colorspace, range, matrix, transfer,
- 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 (is_rgb)
- cinfo.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
-
+ if (gst_v4l2_object_get_colorspace(&fmt, &cinfo))
gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
- }
}
}
}