diff options
author | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2011-06-23 23:46:00 +0800 |
---|---|---|
committer | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2011-07-12 16:46:23 +0800 |
commit | 6e1547e28b0139bd87a216790db1d067a88d387e (patch) | |
tree | c39732daf09f99adcaec6435a4815b390a0a047a | |
parent | 2303f45817ba0960bbf4c3458781414c31561a91 (diff) | |
download | gsoc2013-empathy-6e1547e28b0139bd87a216790db1d067a88d387e.tar gsoc2013-empathy-6e1547e28b0139bd87a216790db1d067a88d387e.tar.gz gsoc2013-empathy-6e1547e28b0139bd87a216790db1d067a88d387e.tar.bz2 gsoc2013-empathy-6e1547e28b0139bd87a216790db1d067a88d387e.tar.lz gsoc2013-empathy-6e1547e28b0139bd87a216790db1d067a88d387e.tar.xz gsoc2013-empathy-6e1547e28b0139bd87a216790db1d067a88d387e.tar.zst gsoc2013-empathy-6e1547e28b0139bd87a216790db1d067a88d387e.zip |
CallWindow: use clutter to draw the remote video
-rw-r--r-- | src/empathy-call-window.c | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 4764965a4..ee1ccc5f7 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -135,9 +135,8 @@ struct _EmpathyCallWindowPriv GtkWidget *tool_button_camera_preview; GtkWidget *tool_button_camera_on; - /* The frames and boxes that contain self and remote avatar and video + /* The boxes that contain self and remote avatar and video input/output. When we redial, we destroy and re-create the boxes */ - GtkWidget *remote_user_output_frame; GtkWidget *remote_user_output_hbox; GtkWidget *self_user_output_hbox; @@ -178,6 +177,7 @@ struct _EmpathyCallWindowPriv GstElement *video_input; GstElement *video_preview_sink; + GstElement *video_output_sink; GstElement *audio_input; GstElement *audio_output; GstElement *pipeline; @@ -616,13 +616,27 @@ static void create_video_output_widget (EmpathyCallWindow *self) { EmpathyCallWindowPriv *priv = GET_PRIV (self); - GstBus *bus; + ClutterActor *video_output_texture; g_assert (priv->video_output == NULL); g_assert (priv->pipeline != NULL); - bus = gst_pipeline_get_bus (GST_PIPELINE (priv->pipeline)); - priv->video_output = empathy_video_widget_new (bus); + priv->video_output = gtk_clutter_embed_new (); + video_output_texture = clutter_texture_new (); + clutter_actor_set_size (video_output_texture, + EMPATHY_VIDEO_WIDGET_DEFAULT_WIDTH, EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT); + + priv->video_output_sink = clutter_gst_video_sink_new ( + CLUTTER_TEXTURE (video_output_texture)); + + clutter_container_add ( + CLUTTER_CONTAINER (gtk_clutter_embed_get_stage ( + GTK_CLUTTER_EMBED (priv->video_output))), + video_output_texture, + NULL); + + gtk_widget_set_size_request (priv->video_output, + EMPATHY_VIDEO_WIDGET_DEFAULT_WIDTH, EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT); gtk_box_pack_start (GTK_BOX (priv->remote_user_output_hbox), priv->video_output, TRUE, TRUE, 0); @@ -631,8 +645,6 @@ create_video_output_widget (EmpathyCallWindow *self) GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK); g_signal_connect (G_OBJECT (priv->video_output), "button-press-event", G_CALLBACK (empathy_call_window_video_button_press_cb), self); - - g_object_unref (bus); } static void @@ -1093,14 +1105,7 @@ empathy_call_window_init (EmpathyCallWindow *self) CONTENT_HBOX_BORDER_WIDTH); gtk_paned_pack1 (GTK_PANED (priv->pane), priv->content_hbox, TRUE, FALSE); - /* remote user output frame */ - priv->remote_user_output_frame = gtk_frame_new (NULL); - gtk_widget_set_size_request (priv->remote_user_output_frame, - EMPATHY_VIDEO_WIDGET_DEFAULT_WIDTH, EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT); - gtk_box_pack_start (GTK_BOX (priv->content_hbox), - priv->remote_user_output_frame, TRUE, TRUE, - CONTENT_HBOX_CHILDREN_PACKING_PADDING); - + /* remote user output */ priv->remote_user_output_hbox = gtk_hbox_new (FALSE, 0); priv->remote_user_avatar_widget = gtk_image_new (); @@ -1108,8 +1113,9 @@ empathy_call_window_init (EmpathyCallWindow *self) gtk_box_pack_start (GTK_BOX (priv->remote_user_output_hbox), priv->remote_user_avatar_widget, TRUE, TRUE, 0); - gtk_container_add (GTK_CONTAINER (priv->remote_user_output_frame), - priv->remote_user_output_hbox); + gtk_box_pack_start (GTK_BOX (priv->content_hbox), + priv->remote_user_output_hbox, TRUE, TRUE, + CONTENT_HBOX_CHILDREN_PACKING_PADDING); /* self user output */ priv->self_user_output_hbox = gtk_hbox_new (FALSE, 0); @@ -1960,8 +1966,7 @@ empathy_call_window_sink_removed_cb (EmpathyCallHandler *handler, { GstElement *output; - output = empathy_video_widget_get_element (EMPATHY_VIDEO_WIDGET - (priv->video_output)); + output = priv->video_output_sink; gst_element_set_state (output, GST_STATE_NULL); gst_element_set_state (priv->funnel, GST_STATE_NULL); @@ -1997,8 +2002,7 @@ empathy_call_window_get_video_sink_pad (EmpathyCallWindow *self) if (priv->funnel == NULL) { - output = empathy_video_widget_get_element (EMPATHY_VIDEO_WIDGET - (priv->video_output)); + output = priv->video_output_sink; priv->funnel = gst_element_factory_make ("fsfunnel", NULL); |