mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
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
This commit is contained in:
parent
49be64e571
commit
c65b66432e
1 changed files with 13 additions and 4 deletions
|
@ -1878,7 +1878,7 @@ 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 (enum v4l2_colorspace colorspace,
|
||||||
enum v4l2_quantization range, enum v4l2_ycbcr_encoding matrix,
|
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;
|
gboolean ret = TRUE;
|
||||||
|
|
||||||
|
@ -1958,7 +1958,15 @@ gst_v4l2_object_get_colorspace (enum v4l2_colorspace colorspace,
|
||||||
cinfo->range = GST_VIDEO_COLOR_RANGE_16_235;
|
cinfo->range = GST_VIDEO_COLOR_RANGE_16_235;
|
||||||
break;
|
break;
|
||||||
case V4L2_QUANTIZATION_DEFAULT:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
GST_WARNING ("Unknown enum v4l2_quantization value %d", range);
|
GST_WARNING ("Unknown enum v4l2_quantization value %d", range);
|
||||||
|
@ -2138,6 +2146,7 @@ gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
|
||||||
enum v4l2_quantization range;
|
enum v4l2_quantization range;
|
||||||
enum v4l2_ycbcr_encoding matrix;
|
enum v4l2_ycbcr_encoding matrix;
|
||||||
enum v4l2_xfer_func transfer;
|
enum v4l2_xfer_func transfer;
|
||||||
|
gboolean is_rgb = gst_v4l2_object_v4l2fourcc_is_rgb (pixelformat);
|
||||||
|
|
||||||
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;
|
||||||
|
@ -2152,11 +2161,11 @@ gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gst_v4l2_object_get_colorspace (colorspace, range, matrix, transfer,
|
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
|
/* Set identity matrix for R'G'B' formats to avoid creating
|
||||||
* confusion. This though is cosmetic as it's now properly ignored by
|
* confusion. This though is cosmetic as it's now properly ignored by
|
||||||
* the video info API and videoconvert. */
|
* the video info API and videoconvert. */
|
||||||
if (gst_v4l2_object_v4l2fourcc_is_rgb (pixelformat))
|
if (is_rgb)
|
||||||
cinfo.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
|
cinfo.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
|
||||||
|
|
||||||
g_value_init (&colorimetry, G_TYPE_STRING);
|
g_value_init (&colorimetry, G_TYPE_STRING);
|
||||||
|
|
Loading…
Reference in a new issue