diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index 51b0a1c29a..9e3212b78c 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -2482,6 +2482,21 @@ pool_failed: } } +gboolean +gst_v4l2_object_caps_equal (GstV4l2Object * v4l2object, GstCaps * caps) +{ + GstStructure *s; + GstCaps *oldcaps; + + if (!v4l2object->pool) + return FALSE; + + s = gst_buffer_pool_get_config (GST_BUFFER_POOL_CAST (v4l2object->pool)); + gst_buffer_pool_config_get_params (s, &oldcaps, NULL, NULL, NULL); + + return oldcaps && gst_caps_is_equal (caps, oldcaps); +} + gboolean gst_v4l2_object_unlock (GstV4l2Object * v4l2object) { diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h index 54703e95c6..af58b610ae 100644 --- a/sys/v4l2/gstv4l2object.h +++ b/sys/v4l2/gstv4l2object.h @@ -227,6 +227,8 @@ GstStructure* gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc); gboolean gst_v4l2_object_set_format (GstV4l2Object *v4l2object, GstCaps * caps); +gboolean gst_v4l2_object_caps_equal (GstV4l2Object * v4l2object, GstCaps * caps); + gboolean gst_v4l2_object_unlock (GstV4l2Object *v4l2object); gboolean gst_v4l2_object_unlock_stop (GstV4l2Object *v4l2object); diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c index dc36ff78b6..b291aa8895 100644 --- a/sys/v4l2/gstv4l2sink.c +++ b/sys/v4l2/gstv4l2sink.c @@ -574,6 +574,10 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) return FALSE; } + /* make sure the caps changed before doing anything */ + if (gst_v4l2_object_caps_equal (obj, caps)) + return TRUE; + if (!gst_v4l2_object_stop (obj)) goto stop_failed; diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c index 28ab86aad8..9f5c92e23c 100644 --- a/sys/v4l2/gstv4l2src.c +++ b/sys/v4l2/gstv4l2src.c @@ -494,6 +494,10 @@ gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps) v4l2src = GST_V4L2SRC (src); obj = v4l2src->v4l2object; + /* make sure the caps changed before doing anything */ + if (gst_v4l2_object_caps_equal (obj, caps)) + return TRUE; + /* make sure we stop capturing and dealloc buffers */ if (!gst_v4l2_object_stop (obj)) return FALSE;