From 3b4afcb8df250228513f9b8fc4ee1f2596f20c78 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 8 Jul 2011 16:37:11 +0200 Subject: [PATCH] v4l2: fix gray format, use filter in getcaps --- sys/v4l2/gstv4l2object.c | 14 +++++------ sys/v4l2/gstv4l2sink.c | 50 ++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index b87fbbdba8..a29798a8ea 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -1149,10 +1149,6 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */ structure = gst_structure_new ("image/jpeg", NULL); 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_HI240: /* 8 8-bit color */ /* FIXME: get correct fourccs here */ @@ -1162,6 +1158,7 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) case V4L2_PIX_FMT_RGB565X: /* FIXME: get correct fourccs here */ break; + case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB24: @@ -1187,6 +1184,9 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) GstVideoFormat format; switch (fourcc) { + case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ + format = GST_VIDEO_FORMAT_GRAY8; + break; case V4L2_PIX_FMT_RGB555: format = GST_VIDEO_FORMAT_RGB15; break; @@ -1450,6 +1450,8 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, case GST_VIDEO_FORMAT_BGRA: fourcc = V4L2_PIX_FMT_BGR32; break; + case GST_VIDEO_FORMAT_GRAY8: + fourcc = V4L2_PIX_FMT_GREY; default: break; } @@ -1472,10 +1474,8 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, #ifdef V4L2_PIX_FMT_PWC2 } else if (strcmp (mimetype, "video/x-pwc2") == 0) { fourcc = V4L2_PIX_FMT_PWC2; -#endif - } else if (strcmp (mimetype, "video/x-raw-gray") == 0) { - fourcc = V4L2_PIX_FMT_GREY; } +#endif if (fourcc == 0) goto unhandled_format; diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c index a61186a180..9e5776281a 100644 --- a/sys/v4l2/gstv4l2sink.c +++ b/sys/v4l2/gstv4l2sink.c @@ -568,40 +568,44 @@ gst_v4l2sink_get_caps (GstBaseSink * bsink, GstCaps * filter) (v4l2sink))); } - if (v4l2sink->probed_caps) { - LOG_CAPS (v4l2sink, v4l2sink->probed_caps); - return gst_caps_ref (v4l2sink->probed_caps); - } + if (v4l2sink->probed_caps == NULL) { + formats = gst_v4l2_object_get_format_list (v4l2sink->v4l2object); - 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) { - struct v4l2_fmtdesc *format; + GstStructure *template; - 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) { - GstCaps *tmp; + tmp = + gst_v4l2_object_probe_caps_for_format (v4l2sink->v4l2object, + format->pixelformat, template); + if (tmp) + gst_caps_append (ret, tmp); - tmp = - gst_v4l2_object_probe_caps_for_format (v4l2sink->v4l2object, - format->pixelformat, template); - if (tmp) - gst_caps_append (ret, tmp); - - gst_structure_free (template); - } else { - GST_DEBUG_OBJECT (v4l2sink, "unknown format %u", format->pixelformat); + 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); LOG_CAPS (v4l2sink, ret);