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
This commit is contained in:
parent
1f31715c98
commit
b5530a19a7
@ -1887,12 +1887,28 @@ gst_v4l2_object_get_interlace_mode (enum v4l2_field field,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_v4l2_object_get_colorspace (enum v4l2_colorspace colorspace,
|
gst_v4l2_object_get_colorspace(struct v4l2_format * fmt,
|
||||||
enum v4l2_quantization range, enum v4l2_ycbcr_encoding matrix,
|
GstVideoColorimetry * cinfo)
|
||||||
enum v4l2_xfer_func transfer, gboolean is_rgb, 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;
|
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 */
|
/* First step, set the defaults for each primaries */
|
||||||
switch (colorspace) {
|
switch (colorspace) {
|
||||||
case V4L2_COLORSPACE_SMPTE170M:
|
case V4L2_COLORSPACE_SMPTE170M:
|
||||||
@ -2017,6 +2033,12 @@ gst_v4l2_object_get_colorspace (enum v4l2_colorspace colorspace,
|
|||||||
break;
|
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) {
|
switch (transfer) {
|
||||||
case V4L2_XFER_FUNC_709:
|
case V4L2_XFER_FUNC_709:
|
||||||
cinfo->transfer = GST_VIDEO_TRANSFER_BT709;
|
cinfo->transfer = GST_VIDEO_TRANSFER_BT709;
|
||||||
@ -2176,7 +2198,6 @@ gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
|
|||||||
GValue list = G_VALUE_INIT;
|
GValue list = G_VALUE_INIT;
|
||||||
GstVideoColorimetry cinfo;
|
GstVideoColorimetry cinfo;
|
||||||
enum v4l2_colorspace req_cspace;
|
enum v4l2_colorspace req_cspace;
|
||||||
gboolean is_rgb = gst_v4l2_object_v4l2fourcc_is_rgb (pixelformat);
|
|
||||||
|
|
||||||
memset (&fmt, 0, sizeof (fmt));
|
memset (&fmt, 0, sizeof (fmt));
|
||||||
fmt.type = v4l2object->type;
|
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
|
/* step 1: get device default colorspace and insert it first as
|
||||||
* it should be the preferred one */
|
* it should be the preferred one */
|
||||||
if (gst_v4l2_object_try_fmt (v4l2object, &fmt) == 0) {
|
if (gst_v4l2_object_try_fmt (v4l2object, &fmt) == 0) {
|
||||||
enum v4l2_colorspace colorspace;
|
if (gst_v4l2_object_get_colorspace(&fmt, &cinfo))
|
||||||
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;
|
|
||||||
|
|
||||||
gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
|
gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* step 2: probe all colorspace other than default
|
/* 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) {
|
if (gst_v4l2_object_try_fmt (v4l2object, &fmt) == 0) {
|
||||||
enum v4l2_colorspace colorspace;
|
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;
|
colorspace = fmt.fmt.pix_mp.colorspace;
|
||||||
range = fmt.fmt.pix_mp.quantization;
|
else
|
||||||
matrix = fmt.fmt.pix_mp.ycbcr_enc;
|
|
||||||
transfer = fmt.fmt.pix_mp.xfer_func;
|
|
||||||
} else {
|
|
||||||
colorspace = fmt.fmt.pix.colorspace;
|
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 (colorspace == req_cspace) {
|
||||||
if (gst_v4l2_object_get_colorspace (colorspace, range, matrix, transfer,
|
if (gst_v4l2_object_get_colorspace(&fmt, &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 (is_rgb)
|
|
||||||
cinfo.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
|
|
||||||
|
|
||||||
gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
|
gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user