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);
param_spec = g_param_spec_int ("min-width",
"min-width",
"Minimal width of the widget",
- 0, G_MAXINT, 320,
+ 0, G_MAXINT, EMPATHY_VIDEO_WIDGET_DEFAULT_WIDTH,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_MIN_WIDTH, param_spec);
param_spec = g_param_spec_int ("min-height",
"min-height",
"Minimal height of the widget",
- 0, G_MAXINT, 240,
+ 0, G_MAXINT, EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_MIN_HEIGHT, param_spec);
priv->dispose_has_run = TRUE;
+ g_signal_handlers_disconnect_by_func (priv->bus,
+ empathy_video_widget_sync_message_cb, object);
+
if (priv->bus != NULL)
g_object_unref (priv->bus);
{
g_assert (GTK_WIDGET_REALIZED (GTK_WIDGET (self)));
gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (priv->overlay),
- GDK_WINDOW_XID (GTK_WIDGET (self)->window));
+ GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (self))));
}
}
return TRUE;
if (priv->overlay == NULL)
- return TRUE;
+ {
+ gdk_window_clear_area (gtk_widget_get_window (widget), 0, 0,
+ widget->allocation.width, widget->allocation.height);
+ return TRUE;
+ }
gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (priv->overlay),
- GDK_WINDOW_XID (widget->window));
+ GDK_WINDOW_XID (gtk_widget_get_window (widget)));
gst_x_overlay_expose (GST_X_OVERLAY (priv->overlay));