]> git.0d.be Git - empathy.git/commitdiff
Add resultion and framerate changing to video src
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 6 Jul 2011 22:12:40 +0000 (18:12 -0400)
committerSjoerd Simons <sjoerd.simons@collabora.co.uk>
Mon, 7 Nov 2011 20:07:19 +0000 (20:07 +0000)
src/empathy-video-src.c
src/empathy-video-src.h

index ca8370d82b66ce45592529ec95c0665043f5813a..bfff30d18ffe8c8044de93b399da6969f34c8ead 100644 (file)
@@ -54,6 +54,11 @@ struct _EmpathyGstVideoSrcPrivate
   GstElement *src;
   /* Element implementing a ColorBalance interface */
   GstElement *balance;
+  /* Element for resolution and framerate adjustment */
+  GstElement *capsfilter;
+  guint width;
+  guint height;
+  guint framerate;
 };
 
 #define EMPATHY_GST_VIDEO_SRC_GET_PRIVATE(o) \
@@ -162,6 +167,7 @@ empathy_video_src_init (EmpathyGstVideoSrc *obj)
     g_error (
       "Failed to add \"capsfilter\" (gstreamer core elements missing?)");
 
+  priv->capsfilter = element;
   g_object_set (G_OBJECT (element), "caps", caps, NULL);
 
 
@@ -393,3 +399,49 @@ empathy_video_src_dup_device (EmpathyGstVideoSrc *self)
 
   return device;
 }
+
+void
+empathy_video_src_set_framerate (GstElement *src,
+    guint framerate)
+{
+  EmpathyGstVideoSrcPrivate *priv = EMPATHY_GST_VIDEO_SRC_GET_PRIVATE (src);
+  GstCaps *caps;
+
+  g_return_if_fail (priv->capsfilter != NULL);
+
+  g_object_get (priv->capsfilter, "caps", &caps, NULL);
+  caps = gst_caps_make_writable (caps);
+
+  gst_caps_set_simple (caps,
+      "framerate", GST_TYPE_FRACTION, framerate, 1,
+      NULL);
+
+  g_object_set (priv->capsfilter, "caps", caps, NULL);
+}
+
+void
+empathy_video_src_set_resolution (GstElement *src,
+    guint width,
+    guint height)
+{
+  EmpathyGstVideoSrcPrivate *priv = EMPATHY_GST_VIDEO_SRC_GET_PRIVATE (src);
+  GstCaps *caps;
+
+  g_return_if_fail (priv->capsfilter != NULL);
+
+  gst_element_set_locked_state (priv->src, TRUE);
+  gst_element_set_state (priv->src, GST_STATE_NULL);
+
+  g_object_get (priv->capsfilter, "caps", &caps, NULL);
+  caps = gst_caps_make_writable (caps);
+
+  gst_caps_set_simple (caps,
+      "width", G_TYPE_INT, width,
+      "height", G_TYPE_INT, height,
+      NULL);
+
+  g_object_set (priv->capsfilter, "caps", caps, NULL);
+
+  gst_element_set_locked_state (priv->src, FALSE);
+  gst_element_sync_state_with_parent (priv->src);
+}
index 6a88b79ebff929a14bef80159672d9c613d9ba12..e49c79a00ba41006d54242ec26fa3751a0e822e1 100644 (file)
@@ -85,6 +85,12 @@ void empathy_video_src_change_device (EmpathyGstVideoSrc *self,
   const gchar *device);
 gchar * empathy_video_src_dup_device (EmpathyGstVideoSrc *self);
 
+void empathy_video_src_set_framerate (GstElement *src,
+    guint framerate);
+
+void empathy_video_src_set_resolution (GstElement *src,
+    guint width, guint height);
+
 G_END_DECLS
 
 #endif /* #ifndef __EMPATHY_GST_VIDEO_SRC_H__*/