]> git.0d.be Git - empathy.git/commitdiff
Add colorspace and videoscale elements before the videosink
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Sat, 28 Mar 2009 08:17:42 +0000 (08:17 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Sat, 28 Mar 2009 08:17:42 +0000 (08:17 +0000)
Farsight only adds colorspace and videoscale automatically on the input side of
things, not on the output side. This causes things to break when the videosink
isn't xvimagesink which can do scaling and colorspace conversion in hardware.

Fixes gbz #576386

From: Sjoerd Simons <sjoerd.simons@collabora.co.uk>

svn path=/trunk/; revision=2746

libempathy-gtk/empathy-video-widget.c

index 5b76257f41a3ba6460980463df4a2446a687281b..4c7bee9db4664586974a29afdde668d9af7b6f1f 100644 (file)
@@ -103,13 +103,47 @@ static void
 empathy_video_widget_constructed (GObject *object)
 {
   EmpathyVideoWidgetPriv *priv = GET_PRIV (object);
+  GstElement *colorspace, *videoscale, *sink;
+  GstPad *pad;
+
+  priv->videosink = gst_bin_new (NULL);
 
-  priv->videosink = gst_element_factory_make ("gconfvideosink", NULL);
   gst_object_ref (priv->videosink);
   gst_object_sink (priv->videosink);
 
   priv->sink_pad = gst_element_get_static_pad (priv->videosink, "sink");
 
+  sink = gst_element_factory_make ("gconfvideosink", NULL);
+  g_assert (sink != NULL);
+
+  videoscale = gst_element_factory_make ("videoscale", NULL);
+  g_assert (videoscale != NULL);
+
+  g_object_set (videoscale, "qos", FALSE, NULL);
+
+  colorspace = gst_element_factory_make ("ffmpegcolorspace", NULL);
+  g_assert (colorspace != NULL);
+
+  g_object_set (colorspace, "qos", FALSE, NULL);
+
+  gst_bin_add_many (GST_BIN (priv->videosink), colorspace, videoscale,
+    sink, NULL);
+
+  if (!gst_element_link (colorspace, videoscale))
+    g_error ("Failed to link ffmpegcolorspace and videoscale");
+
+  if (!gst_element_link (videoscale, sink))
+    g_error ("Failed to link videoscale and gconfvideosink");
+
+  pad = gst_element_get_static_pad (colorspace, "sink");
+  g_assert (pad != NULL);
+
+  priv->sink_pad = gst_ghost_pad_new ("sink", pad);
+  if (!gst_element_add_pad  (priv->videosink, priv->sink_pad))
+    g_error ("Couldn't add sink ghostpad to the bin");
+
+  gst_object_unref (pad);
+
   fs_element_added_notifier_add (priv->notifier, GST_BIN (priv->videosink));
   gst_bus_enable_sync_message_emission (priv->bus);