mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 20:25:25 +00:00
v4l2: fix gray format, use filter in getcaps
This commit is contained in:
parent
7a296af37f
commit
3b4afcb8df
2 changed files with 34 additions and 30 deletions
|
@ -1149,10 +1149,6 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc)
|
||||||
case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */
|
case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */
|
||||||
structure = gst_structure_new ("image/jpeg", NULL);
|
structure = gst_structure_new ("image/jpeg", NULL);
|
||||||
break;
|
break;
|
||||||
case V4L2_PIX_FMT_GREY: /* 8 Greyscale */
|
|
||||||
structure = gst_structure_new ("video/x-raw-gray",
|
|
||||||
"bpp", G_TYPE_INT, 8, NULL);
|
|
||||||
break;
|
|
||||||
case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */
|
case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */
|
||||||
case V4L2_PIX_FMT_HI240: /* 8 8-bit color */
|
case V4L2_PIX_FMT_HI240: /* 8 8-bit color */
|
||||||
/* FIXME: get correct fourccs here */
|
/* FIXME: get correct fourccs here */
|
||||||
|
@ -1162,6 +1158,7 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc)
|
||||||
case V4L2_PIX_FMT_RGB565X:
|
case V4L2_PIX_FMT_RGB565X:
|
||||||
/* FIXME: get correct fourccs here */
|
/* FIXME: get correct fourccs here */
|
||||||
break;
|
break;
|
||||||
|
case V4L2_PIX_FMT_GREY: /* 8 Greyscale */
|
||||||
case V4L2_PIX_FMT_RGB555:
|
case V4L2_PIX_FMT_RGB555:
|
||||||
case V4L2_PIX_FMT_RGB565:
|
case V4L2_PIX_FMT_RGB565:
|
||||||
case V4L2_PIX_FMT_RGB24:
|
case V4L2_PIX_FMT_RGB24:
|
||||||
|
@ -1187,6 +1184,9 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc)
|
||||||
GstVideoFormat format;
|
GstVideoFormat format;
|
||||||
|
|
||||||
switch (fourcc) {
|
switch (fourcc) {
|
||||||
|
case V4L2_PIX_FMT_GREY: /* 8 Greyscale */
|
||||||
|
format = GST_VIDEO_FORMAT_GRAY8;
|
||||||
|
break;
|
||||||
case V4L2_PIX_FMT_RGB555:
|
case V4L2_PIX_FMT_RGB555:
|
||||||
format = GST_VIDEO_FORMAT_RGB15;
|
format = GST_VIDEO_FORMAT_RGB15;
|
||||||
break;
|
break;
|
||||||
|
@ -1450,6 +1450,8 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps,
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
fourcc = V4L2_PIX_FMT_BGR32;
|
fourcc = V4L2_PIX_FMT_BGR32;
|
||||||
break;
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_GRAY8:
|
||||||
|
fourcc = V4L2_PIX_FMT_GREY;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1472,10 +1474,8 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps,
|
||||||
#ifdef V4L2_PIX_FMT_PWC2
|
#ifdef V4L2_PIX_FMT_PWC2
|
||||||
} else if (strcmp (mimetype, "video/x-pwc2") == 0) {
|
} else if (strcmp (mimetype, "video/x-pwc2") == 0) {
|
||||||
fourcc = V4L2_PIX_FMT_PWC2;
|
fourcc = V4L2_PIX_FMT_PWC2;
|
||||||
#endif
|
|
||||||
} else if (strcmp (mimetype, "video/x-raw-gray") == 0) {
|
|
||||||
fourcc = V4L2_PIX_FMT_GREY;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (fourcc == 0)
|
if (fourcc == 0)
|
||||||
goto unhandled_format;
|
goto unhandled_format;
|
||||||
|
|
|
@ -568,40 +568,44 @@ gst_v4l2sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
|
||||||
(v4l2sink)));
|
(v4l2sink)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v4l2sink->probed_caps) {
|
if (v4l2sink->probed_caps == NULL) {
|
||||||
LOG_CAPS (v4l2sink, v4l2sink->probed_caps);
|
formats = gst_v4l2_object_get_format_list (v4l2sink->v4l2object);
|
||||||
return gst_caps_ref (v4l2sink->probed_caps);
|
|
||||||
}
|
|
||||||
|
|
||||||
formats = gst_v4l2_object_get_format_list (v4l2sink->v4l2object);
|
ret = gst_caps_new_empty ();
|
||||||
|
|
||||||
ret = gst_caps_new_empty ();
|
for (walk = formats; walk; walk = walk->next) {
|
||||||
|
struct v4l2_fmtdesc *format;
|
||||||
|
|
||||||
for (walk = formats; walk; walk = walk->next) {
|
GstStructure *template;
|
||||||
struct v4l2_fmtdesc *format;
|
|
||||||
|
|
||||||
GstStructure *template;
|
format = (struct v4l2_fmtdesc *) walk->data;
|
||||||
|
|
||||||
format = (struct v4l2_fmtdesc *) walk->data;
|
template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat);
|
||||||
|
|
||||||
template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat);
|
if (template) {
|
||||||
|
GstCaps *tmp;
|
||||||
|
|
||||||
if (template) {
|
tmp =
|
||||||
GstCaps *tmp;
|
gst_v4l2_object_probe_caps_for_format (v4l2sink->v4l2object,
|
||||||
|
format->pixelformat, template);
|
||||||
|
if (tmp)
|
||||||
|
gst_caps_append (ret, tmp);
|
||||||
|
|
||||||
tmp =
|
gst_structure_free (template);
|
||||||
gst_v4l2_object_probe_caps_for_format (v4l2sink->v4l2object,
|
} else {
|
||||||
format->pixelformat, template);
|
GST_DEBUG_OBJECT (v4l2sink, "unknown format %u", format->pixelformat);
|
||||||
if (tmp)
|
}
|
||||||
gst_caps_append (ret, tmp);
|
|
||||||
|
|
||||||
gst_structure_free (template);
|
|
||||||
} else {
|
|
||||||
GST_DEBUG_OBJECT (v4l2sink, "unknown format %u", format->pixelformat);
|
|
||||||
}
|
}
|
||||||
|
v4l2sink->probed_caps = ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
v4l2sink->probed_caps = gst_caps_ref (ret);
|
if (filter) {
|
||||||
|
ret =
|
||||||
|
gst_caps_intersect_full (filter, v4l2sink->probed_caps,
|
||||||
|
GST_CAPS_INTERSECT_FIRST);
|
||||||
|
} else {
|
||||||
|
ret = gst_caps_ref (v4l2sink->probed_caps);
|
||||||
|
}
|
||||||
|
|
||||||
GST_INFO_OBJECT (v4l2sink, "probed caps: %p", ret);
|
GST_INFO_OBJECT (v4l2sink, "probed caps: %p", ret);
|
||||||
LOG_CAPS (v4l2sink, ret);
|
LOG_CAPS (v4l2sink, ret);
|
||||||
|
|
Loading…
Reference in a new issue