[ekiga/ds-clutter] Call Window: Use the new GmVideoWidget.
- From: Damien Sandras <dsandras src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ekiga/ds-clutter] Call Window: Use the new GmVideoWidget.
- Date: Sun, 5 Jan 2014 17:13:09 +0000 (UTC)
commit 117a02d81b39ebe9bfd9381a41233f20ddd99e90
Author: Damien Sandras <dsandras beip be>
Date: Sun Jan 5 17:11:46 2014 +0100
Call Window: Use the new GmVideoWidget.
lib/engine/gui/gtk-frontend/call-window.cpp | 315 ++++-----------------------
1 files changed, 38 insertions(+), 277 deletions(-)
---
diff --git a/lib/engine/gui/gtk-frontend/call-window.cpp b/lib/engine/gui/gtk-frontend/call-window.cpp
index 927d2b4..3748246 100644
--- a/lib/engine/gui/gtk-frontend/call-window.cpp
+++ b/lib/engine/gui/gtk-frontend/call-window.cpp
@@ -38,8 +38,6 @@
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
-#include <clutter-gtk/clutter-gtk.h>
-
#include "config.h"
#include "ekiga-settings.h"
@@ -48,6 +46,7 @@
#include "dialpad.h"
+#include "gmvideowidget.h"
#include "gmdialog.h"
#include "gmentrydialog.h"
#include "gmstatusbar.h"
@@ -83,10 +82,6 @@
#define STAGE_WIDTH 640
#define STAGE_HEIGHT 480
-#define LOCAL_VIDEO_MARGIN 12
-#define LOCAL_VIDEO_RATIO 0.25
-#define EMBLEM_MARGIN 12
-#define EMBLEM_RATIO 0.15
enum CallingState {Standby, Calling, Ringing, Connected, Called};
@@ -117,13 +112,7 @@ struct _EkigaCallWindowPrivate
GtkWidget *spinner;
GtkWidget *info_text;
- ClutterActor *stage;
-
- ClutterActor *video_stream[3];
- unsigned video_stream_natural_width[3];
- unsigned video_stream_natural_height[3];
- gfloat local_video_ratio;
-
+ GtkWidget *video_widget;
bool fullscreen;
GtkWidget *call_frame;
@@ -196,10 +185,6 @@ static void stay_on_top_changed_cb (GSettings *settings,
gchar *key,
gpointer self);
-static void pip_mode_changed_cb (GSettings *settings,
- gchar *key,
- gpointer self);
-
static void pick_up_call_cb (GtkWidget * /*widget*/,
gpointer data);
@@ -365,22 +350,7 @@ static gboolean ekiga_call_window_fullscreen_event_cb (GtkWidget *widget,
static void window_closed_from_menu_cb (G_GNUC_UNUSED GtkWidget *,
gpointer);
-static void animate_logo_cb (ClutterActor *actor,
- gpointer logo);
-
-static void ekiga_call_window_resize_video_stream_cb (ClutterActor *actor,
- ClutterActorBox *box,
- ClutterAllocationFlags flags,
- gpointer data);
-
/**/
-static void ekiga_call_window_resize_video_stream (ClutterActor *texture,
- unsigned natural_width,
- unsigned natural_height,
- unsigned available_height);
-
-static void ekiga_call_window_resize_video_streams (EkigaCallWindow *cw);
-
static void ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
unsigned calling_state);
@@ -425,9 +395,6 @@ static GtkWidget * gm_cw_audio_settings_window_new (EkigaCallWindow *cw);
static GtkWidget *gm_cw_video_settings_window_new (EkigaCallWindow *cw);
-static void ekiga_call_window_set_pip (EkigaCallWindow *cw,
- gboolean pip);
-
static void ekiga_call_window_toggle_fullscreen (EkigaCallWindow *cw);
static void ekiga_call_window_channels_menu_update_sensitivity (EkigaCallWindow *cw,
@@ -473,26 +440,6 @@ stay_on_top_changed_cb (GSettings *settings,
}
static void
-pip_mode_changed_cb (GSettings *settings,
- gchar *key,
- gpointer self)
-
-{
- g_return_if_fail (EKIGA_IS_CALL_WINDOW (self));
-
- EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
- bool val = false;
-
- val = g_settings_get_boolean (settings, key);
- if (cw->priv->video_stream_natural_width[Ekiga::VideoOutputManager::LOCAL] > 0
- && cw->priv->video_stream_natural_height[Ekiga::VideoOutputManager::LOCAL] > 0
- && cw->priv->video_stream_natural_width[Ekiga::VideoOutputManager::REMOTE] > 0
- && cw->priv->video_stream_natural_height[Ekiga::VideoOutputManager::REMOTE] > 0)
- clutter_actor_set_opacity (cw->priv->video_stream[Ekiga::VideoOutputManager::LOCAL],
- val ? 255 : 0);
-}
-
-static void
fullscreen_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
gpointer data)
{
@@ -630,34 +577,17 @@ on_videooutput_device_opened_cb (Ekiga::VideoOutputManager & /* manager */,
bool ext_stream,
gpointer self)
{
- bool show_local = true;
-
g_return_if_fail (EKIGA_IS_CALL_WINDOW (self));
EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
+ GM_STREAM_TYPE t =
+ (type == Ekiga::VideoOutputManager::REMOTE) ? PRIMARY_STREAM : SECONDARY_STREAM;
gtk_widget_show (GTK_WIDGET (cw));
-
- cw->priv->video_stream_natural_width[type] = width;
- cw->priv->video_stream_natural_height[type] = height;
-
- /* As soon as both streams are available, enable PIP for the local
- * video stream.
- */
- ekiga_call_window_set_pip (cw, both_streams);
-
- show_local =
- (!both_streams || cw->priv->video_display_settings->get_bool ("enable-pip"));
-
- if (both_streams) {
- clutter_actor_set_opacity (cw->priv->video_stream[Ekiga::VideoOutputManager::LOCAL],
- show_local ? 255 : 0);
- clutter_actor_set_opacity (cw->priv->video_stream[Ekiga::VideoOutputManager::REMOTE],
- 255);
- }
- else
- clutter_actor_set_opacity (cw->priv->video_stream[type],
- 255);
+ gm_video_widget_set_stream_natural_size (GM_VIDEO_WIDGET (cw->priv->video_widget),
+ t, width, height);
+ gm_video_widget_set_stream_state (GM_VIDEO_WIDGET (cw->priv->video_widget),
+ t, STREAM_STATE_PLAYING);
gtk_menu_section_set_sensitive (cw->priv->main_menu, "pip", both_streams);
}
@@ -668,21 +598,10 @@ on_videooutput_device_closed_cb (Ekiga::VideoOutputManager & /* manager */, gpoi
g_return_if_fail (self);
EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
+ //gm_video_widget_set_stream_state (GM_VIDEO_WIDGET (cw->priv->video_widget),
+ // t, STREAM_STATE_PLAYING);
- cw->priv->local_video_ratio = 1;
- for (int i = 0 ; i < 2 ; i++) {
- Ekiga::VideoOutputManager::VideoView type = (Ekiga::VideoOutputManager::VideoView) i;
- cw->priv->video_stream_natural_width[type] = 0;
- cw->priv->video_stream_natural_height[type] = 0;
- cw->priv->video_stream_natural_width[type] = 0;
- cw->priv->video_stream_natural_height[type] = 0;
- clutter_actor_set_opacity (CLUTTER_ACTOR (cw->priv->video_stream[type]), 0);
- ekiga_call_window_resize_video_stream (CLUTTER_ACTOR (cw->priv->video_stream[type]),
- cw->priv->video_stream_natural_width[type],
- cw->priv->video_stream_natural_height[type],
- clutter_actor_get_height (CLUTTER_ACTOR (cw->priv->stage)));
- gtk_menu_section_set_sensitive (cw->priv->main_menu, "pip", FALSE);
- }
+ // FIXME
}
static void
@@ -713,22 +632,11 @@ on_size_changed_cb (Ekiga::VideoOutputManager & /* manager */,
gpointer self)
{
EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
+ GM_STREAM_TYPE t =
+ (type == Ekiga::VideoOutputManager::REMOTE) ? PRIMARY_STREAM : SECONDARY_STREAM;
- gfloat ratio = (type == Ekiga::VideoOutputManager::LOCAL ? cw->priv->local_video_ratio : 1);
-
- /* Resize the clutter texture when we know the natural video size.
- * The real size will depend on the stage available space.
- */
- clutter_actor_save_easing_state (CLUTTER_ACTOR (cw->priv->video_stream[type]));
- clutter_actor_set_easing_duration (CLUTTER_ACTOR (cw->priv->video_stream[type]), 2000);
-
- cw->priv->video_stream_natural_width[type] = width;
- cw->priv->video_stream_natural_height[type] = height;
- ekiga_call_window_resize_video_stream (CLUTTER_ACTOR
(cw->priv->video_stream[Ekiga::VideoOutputManager::LOCAL]),
- width,
- height,
- clutter_actor_get_height (CLUTTER_ACTOR (cw->priv->stage)) * ratio);
- clutter_actor_restore_easing_state (CLUTTER_ACTOR (cw->priv->video_stream[type]));
+ gm_video_widget_set_stream_natural_size (GM_VIDEO_WIDGET (cw->priv->video_widget),
+ t, width, height);
}
static void
@@ -1192,6 +1100,10 @@ static gboolean
on_stats_refresh_cb (gpointer self)
{
EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
+ unsigned local_width = 0;
+ unsigned local_height = 0;
+ unsigned remote_width = 0;
+ unsigned remote_height = 0;
if (cw->priv->calling_state == Connected && cw->priv->current_call) {
@@ -1208,12 +1120,13 @@ on_stats_refresh_cb (gpointer self)
double lost = cw->priv->current_call->get_lost_packets ();
double late = cw->priv->current_call->get_late_packets ();
double out_of_order = cw->priv->current_call->get_out_of_order_packets ();
+ gm_video_widget_get_stream_natural_size (GM_VIDEO_WIDGET (cw->priv->video_widget),
+ PRIMARY_STREAM, &remote_width, &remote_height);
+ gm_video_widget_get_stream_natural_size (GM_VIDEO_WIDGET (cw->priv->video_widget),
+ SECONDARY_STREAM, &local_width, &local_height);
ekiga_call_window_update_stats (cw, lost, late, out_of_order, jitter,
- cw->priv->video_stream_natural_width[Ekiga::VideoOutputManager::LOCAL],
- cw->priv->video_stream_natural_height[Ekiga::VideoOutputManager::LOCAL],
- cw->priv->video_stream_natural_width[Ekiga::VideoOutputManager::REMOTE],
- cw->priv->video_stream_natural_height[Ekiga::VideoOutputManager::REMOTE],
+ local_width, local_height, remote_width, remote_height,
cw->priv->transmitted_audio_codec.c_str (),
cw->priv->transmitted_video_codec.c_str ());
}
@@ -1273,60 +1186,6 @@ window_closed_from_menu_cb (G_GNUC_UNUSED GtkWidget *w,
}
static void
-animate_logo_cb (G_GNUC_UNUSED ClutterActor *actor,
- gpointer logo)
-{
- clutter_actor_save_easing_state (CLUTTER_ACTOR (logo));
- clutter_actor_set_easing_duration (CLUTTER_ACTOR (logo), 8000);
- clutter_actor_set_opacity (CLUTTER_ACTOR (logo), 255);
- clutter_actor_restore_easing_state (CLUTTER_ACTOR (logo));
-}
-
-static void
-ekiga_call_window_resize_video_stream_cb (G_GNUC_UNUSED ClutterActor *actor,
- G_GNUC_UNUSED ClutterActorBox *box,
- G_GNUC_UNUSED ClutterAllocationFlags flags,
- gpointer data)
-{
- EkigaCallWindow *cw = NULL;
-
- cw = EKIGA_CALL_WINDOW (data);
- g_return_if_fail (EKIGA_IS_CALL_WINDOW (cw));
-
- ekiga_call_window_resize_video_streams (cw);
-}
-
-static void
-ekiga_call_window_resize_video_stream (ClutterActor *texture,
- unsigned natural_width,
- unsigned natural_height,
- unsigned available_height)
-{
- gfloat zoom = (gfloat) available_height / natural_height;
-
- clutter_actor_set_height (texture, natural_height * zoom);
- clutter_actor_set_width (texture, natural_width * zoom);
-}
-
-static void
-ekiga_call_window_resize_video_streams (EkigaCallWindow *cw)
-{
- for (int i = 0 ; i < 2 ; i++) {
- Ekiga::VideoOutputManager::VideoView type = (Ekiga::VideoOutputManager::VideoView) i;
- gfloat ratio = (type == Ekiga::VideoOutputManager::LOCAL ? cw->priv->local_video_ratio : 1);
- clutter_actor_save_easing_state (CLUTTER_ACTOR (cw->priv->video_stream[type]));
- clutter_actor_set_easing_duration (CLUTTER_ACTOR (cw->priv->video_stream[type]), 2000);
- if (cw->priv->video_stream_natural_height[type] > 0
- && cw->priv->video_stream_natural_width[type] > 0)
- ekiga_call_window_resize_video_stream (CLUTTER_ACTOR (cw->priv->video_stream[type]),
- cw->priv->video_stream_natural_width[type],
- cw->priv->video_stream_natural_height[type],
- clutter_actor_get_height (CLUTTER_ACTOR (cw->priv->stage)) *
ratio);
- clutter_actor_restore_easing_state (CLUTTER_ACTOR (cw->priv->video_stream[type]));
- }
-}
-
-static void
ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
unsigned calling_state)
{
@@ -1981,117 +1840,16 @@ ekiga_call_window_init_clutter (EkigaCallWindow *cw)
{
gchar *filename = NULL;
- GtkWidget *clutter_widget = NULL;
- GdkPixbuf *pixbuf = NULL;
-
- ClutterActor *emblem = NULL;
- ClutterContent *image = NULL;
+ cw->priv->video_widget = gm_video_widget_new ();
+ gtk_widget_set_size_request (GTK_WIDGET (cw->priv->video_widget), STAGE_WIDTH, STAGE_HEIGHT);
+ gtk_container_add (GTK_CONTAINER (cw->priv->event_box), cw->priv->video_widget);
- clutter_widget = gtk_clutter_embed_new ();
- gtk_widget_set_size_request (GTK_WIDGET (clutter_widget), STAGE_WIDTH, STAGE_HEIGHT);
- gtk_container_add (GTK_CONTAINER (cw->priv->event_box), clutter_widget);
-
- cw->priv->stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (clutter_widget));
- clutter_actor_set_background_color (CLUTTER_ACTOR (cw->priv->stage), CLUTTER_COLOR_Black);
- clutter_stage_set_user_resizable (CLUTTER_STAGE (cw->priv->stage), TRUE);
-
- cw->priv->video_stream[Ekiga::VideoOutputManager::REMOTE] =
- CLUTTER_ACTOR (g_object_new (CLUTTER_TYPE_TEXTURE, "disable-slicing", TRUE, NULL));
- clutter_actor_add_child (CLUTTER_ACTOR (cw->priv->stage), CLUTTER_ACTOR
(cw->priv->video_stream[Ekiga::VideoOutputManager::REMOTE]));
- clutter_actor_set_opacity (CLUTTER_ACTOR (cw->priv->video_stream[Ekiga::VideoOutputManager::REMOTE]), 0);
- clutter_actor_add_constraint (cw->priv->video_stream[Ekiga::VideoOutputManager::REMOTE],
- clutter_align_constraint_new (cw->priv->stage,
- CLUTTER_ALIGN_BOTH,
- 0.5));
-
- /* Preview Video */
- cw->priv->video_stream[Ekiga::VideoOutputManager::LOCAL] =
- CLUTTER_ACTOR (g_object_new (CLUTTER_TYPE_TEXTURE, "disable-slicing", TRUE, NULL));
- clutter_actor_add_child (CLUTTER_ACTOR (cw->priv->stage),
cw->priv->video_stream[Ekiga::VideoOutputManager::LOCAL]);
- clutter_actor_set_opacity (CLUTTER_ACTOR (cw->priv->video_stream[Ekiga::VideoOutputManager::LOCAL]), 0);
-
-
- /* Ekiga Logo */
filename = g_build_filename (DATA_DIR, "pixmaps", PACKAGE_NAME,
PACKAGE_NAME "-full-icon.png", NULL);
- pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
+ gm_video_widget_set_logo (GM_VIDEO_WIDGET (cw->priv->video_widget), filename);
g_free (filename);
- emblem = clutter_actor_new ();
- image = clutter_image_new ();
- clutter_image_set_data (CLUTTER_IMAGE (image),
- gdk_pixbuf_get_pixels (pixbuf),
- gdk_pixbuf_get_has_alpha (pixbuf)?
- COGL_PIXEL_FORMAT_RGBA_8888:COGL_PIXEL_FORMAT_RGB_888,
- gdk_pixbuf_get_width (pixbuf),
- gdk_pixbuf_get_height (pixbuf),
- gdk_pixbuf_get_rowstride (pixbuf),
- NULL);
- clutter_actor_set_content (emblem, image);
- g_object_unref (image);
- ekiga_call_window_resize_video_stream (CLUTTER_ACTOR (emblem),
- gdk_pixbuf_get_width (pixbuf),
- gdk_pixbuf_get_height (pixbuf),
- STAGE_HEIGHT * EMBLEM_RATIO);
- clutter_actor_set_margin_top (CLUTTER_ACTOR (emblem), EMBLEM_MARGIN);
- clutter_actor_set_margin_right (CLUTTER_ACTOR (emblem), EMBLEM_MARGIN);
- clutter_actor_add_constraint (emblem,
- clutter_align_constraint_new (cw->priv->stage,
- CLUTTER_ALIGN_X_AXIS,
- 1.0));
- clutter_actor_add_constraint (emblem,
- clutter_align_constraint_new (cw->priv->stage,
- CLUTTER_ALIGN_Y_AXIS,
- 0.0));
- clutter_actor_add_child (cw->priv->stage, emblem);
- clutter_actor_set_opacity (CLUTTER_ACTOR (emblem), 0);
- g_object_unref (pixbuf);
-
- g_signal_connect (cw->priv->stage, "allocation-changed",
- G_CALLBACK (ekiga_call_window_resize_video_stream_cb), cw);
- g_signal_connect (cw->priv->stage, "show", G_CALLBACK (animate_logo_cb), emblem);
-
- cw->priv->videooutput_core->set_display_info (cw->priv->video_stream[Ekiga::VideoOutputManager::LOCAL],
- cw->priv->video_stream[Ekiga::VideoOutputManager::REMOTE]);
-}
-
-static void
-ekiga_call_window_set_pip (EkigaCallWindow *cw,
- gboolean pip)
-{
- g_return_if_fail (EKIGA_IS_CALL_WINDOW (cw));
-
- Ekiga::VideoOutputManager::VideoView type = Ekiga::VideoOutputManager::LOCAL;
-
- if (pip) {
-
- cw->priv->local_video_ratio = LOCAL_VIDEO_RATIO;
- clutter_actor_clear_constraints (cw->priv->video_stream[type]);
- clutter_actor_add_constraint (cw->priv->video_stream[type],
- clutter_align_constraint_new (cw->priv->stage,
- CLUTTER_ALIGN_X_AXIS,
- 0.0));
- clutter_actor_add_constraint (cw->priv->video_stream[type],
- clutter_align_constraint_new (cw->priv->stage,
- CLUTTER_ALIGN_Y_AXIS,
- 1.0));
- clutter_actor_set_margin_bottom (CLUTTER_ACTOR (cw->priv->video_stream[type]), LOCAL_VIDEO_MARGIN);
- clutter_actor_set_margin_left (CLUTTER_ACTOR (cw->priv->video_stream[type]), LOCAL_VIDEO_MARGIN);
- }
- else {
-
- cw->priv->local_video_ratio = 1;
- clutter_actor_clear_constraints (cw->priv->video_stream[type]);
- clutter_actor_add_constraint (cw->priv->video_stream[type],
- clutter_align_constraint_new (cw->priv->stage,
- CLUTTER_ALIGN_BOTH,
- 0.5));
- clutter_actor_set_margin_bottom (CLUTTER_ACTOR (cw->priv->video_stream[type]), 0);
- clutter_actor_set_margin_left (CLUTTER_ACTOR (cw->priv->video_stream[type]), 0);
- }
-
- /* Resize both streams accordingly */
- ekiga_call_window_resize_video_streams (cw);
+ cw->priv->videooutput_core->set_display_info (gm_video_widget_get_stream (GM_VIDEO_WIDGET
(cw->priv->video_widget), SECONDARY_STREAM), gm_video_widget_get_stream (GM_VIDEO_WIDGET
(cw->priv->video_widget), PRIMARY_STREAM));
}
static void
@@ -2300,7 +2058,10 @@ ekiga_call_window_init_gui (EkigaCallWindow *cw)
cw->priv->video_settings_window = gm_cw_video_settings_window_new (cw);
/* The extended video stream window */
- cw->priv->ext_video_win = ext_window_new (cw->priv->videooutput_core);
+// cw->priv->ext_video_win = ext_window_new (cw->priv->videooutput_core);
+ // cw->priv->video_stream[Ekiga::VideoOutputManager::EXTENDED] =
+ // ekiga_ext_window_get_video_stream (EKIGA_EXT_WINDOW (cw->priv->ext_video_win));
+// gtk_widget_show_all (cw->priv->ext_video_win);
/* The main table */
event_box = gtk_event_box_new ();
@@ -2511,7 +2272,6 @@ ekiga_call_window_init (EkigaCallWindow *cw)
cw->priv->levelmeter_timeout_id = -1;
cw->priv->calling_state = Standby;
cw->priv->fullscreen = false;
- cw->priv->local_video_ratio = 1;
#ifndef WIN32
cw->priv->gc = NULL;
#endif
@@ -2594,10 +2354,11 @@ call_window_new (Ekiga::ServiceCore & core)
g_signal_connect (cw->priv->video_display_settings->get_g_settings (),
"changed::stay-on-top",
G_CALLBACK (stay_on_top_changed_cb), cw);
-
- g_signal_connect (cw->priv->video_display_settings->get_g_settings (),
- "changed::enable-pip",
- G_CALLBACK (pip_mode_changed_cb), cw);
+ g_settings_bind (cw->priv->video_display_settings->get_g_settings (),
+ "enable-pip",
+ cw->priv->video_widget,
+ "secondary_stream_display",
+ G_SETTINGS_BIND_DEFAULT);
gtk_window_set_title (GTK_WINDOW (cw), _("Call Window"));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]