summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>2009-03-28 08:18:52 +0000
committerXavier Claessens <xclaesse@src.gnome.org>2009-03-28 08:18:52 +0000
commit586cea17140fa4072faf9dcaddc9d9a2dcd693f9 (patch)
treea5bfb0b56a899dde57e862eef2c6171c206c3305
parent038373cd45e8fbdccb9429261d430ec127a19ffb (diff)
downloadempathy-586cea17140fa4072faf9dcaddc9d9a2dcd693f9.tar.gz
Add colorspace and videoscale elements before the videosink
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=/branches/gnome-2-26/; revision=2747
-rw-r--r--libempathy-gtk/empathy-video-widget.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/libempathy-gtk/empathy-video-widget.c b/libempathy-gtk/empathy-video-widget.c
index 5b76257f4..4c7bee9db 100644
--- a/libempathy-gtk/empathy-video-widget.c
+++ b/libempathy-gtk/empathy-video-widget.c
@@ -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);