]> git.0d.be Git - empathy.git/commitdiff
Use videorate max-rate property
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Fri, 4 Nov 2011 18:58:50 +0000 (18:58 +0000)
committerSjoerd Simons <sjoerd.simons@collabora.co.uk>
Mon, 7 Nov 2011 20:07:19 +0000 (20:07 +0000)
Using the max-rate property is simpler and less racy, so do that
instead. Does require (currently unreleased) gst-plugins-base 0.10.36

src/empathy-video-src.c

index 23b4dca52c9e5da76ffd09c2acddf516fc47ce5f..cd7a3af19bb6757d90241ac35c4d0c03de3ec080 100644 (file)
@@ -54,12 +54,12 @@ struct _EmpathyGstVideoSrcPrivate
   GstElement *src;
   /* Element implementing a ColorBalance interface */
   GstElement *balance;
-  /* Element for resolution and framerate adjustment */
+  /* Elements for resolution and framerate adjustment */
   GstElement *capsfilter;
+  GstElement *videorate;
   guint width;
   guint height;
   guint framerate;
-  gboolean has_videomaxrate;
 };
 
 #define EMPATHY_GST_VIDEO_SRC_GET_PRIVATE(o) \
@@ -146,19 +146,27 @@ empathy_video_src_init (EmpathyGstVideoSrc *obj)
   gst_pad_add_event_probe (src, G_CALLBACK (empathy_video_src_drop_eos), NULL);
   gst_object_unref (src);
 
-  /* videomaxrate is optional as it's part of gst-plugins-bad. So don't
-   * fail if it doesn't exist. */
+  /* videorate with the required properties optional as it needs a currently
+   * unreleased gst-plugins-base 0.10.36 */
   element_back = element;
-  if ((element = empathy_gst_add_to_bin (GST_BIN (obj),
-      element, "videomaxrate")) == NULL)
+  element = empathy_gst_add_to_bin (GST_BIN (obj), element, "videorate");
+
+  if (element != NULL && g_object_class_find_property (
+      G_OBJECT_GET_CLASS (element), "max-rate") != NULL)
     {
-      g_message ("Couldn't add \"videomaxrate\" (gst-plugins-bad missing?)");
-      element = element_back;
-      priv->has_videomaxrate = TRUE;
+      priv->videorate = element;
+      g_object_set (G_OBJECT (element),
+        "drop-only", TRUE,
+        "average-period", GST_SECOND/2,
+        NULL);
     }
   else
     {
-      priv->has_videomaxrate = TRUE;
+      g_message ("videorate missing or doesn't have max-rate property, not"
+        "doing dynamic framerate changes (Needs gst-plugins-base >= 0.10.36)");
+      /* Refcount owned by the bin */
+      gst_bin_remove (GST_BIN (obj), element);
+      element = element_back;
     }
 
   gst_caps_set_simple (caps,
@@ -420,20 +428,10 @@ empathy_video_src_set_framerate (GstElement *src,
     guint framerate)
 {
   EmpathyGstVideoSrcPrivate *priv = EMPATHY_GST_VIDEO_SRC_GET_PRIVATE (src);
-  GstCaps *caps;
 
-  if (priv->has_videomaxrate)
+  if (priv->videorate)
     {
-      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);
+      g_object_set (G_OBJECT (priv->videorate), "max-rate", framerate, NULL);
     }
 }