summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatricia Santana Cruz <patriciasantanacruz@gmail.com>2012-03-08 13:16:54 +0000
committerOleksij Rempel <bug-track@fisher-privat.net>2012-03-24 09:34:42 +0100
commit543833f0cb59cf76d8bb031ec1e16ecd3f69d91b (patch)
treef97eb3aed40ff5e19db699d240ab831c5f62c466
parentd5814b22cd48b79ac572450c09817e50ee0eb395 (diff)
downloadcheese-543833f0cb59cf76d8bb031ec1e16ecd3f69d91b.tar.gz
Show a timer when recording a video
Fixes bug 599729.
-rw-r--r--data/cheese-viewport.json11
-rw-r--r--libcheese/cheese-camera.c52
-rw-r--r--libcheese/cheese-camera.h1
-rw-r--r--src/cheese-window.vala38
-rw-r--r--src/vapi/cheese-common.vapi1
5 files changed, 102 insertions, 1 deletions
diff --git a/data/cheese-viewport.json b/data/cheese-viewport.json
index da75cf2c..f714b146 100644
--- a/data/cheese-viewport.json
+++ b/data/cheese-viewport.json
@@ -33,6 +33,17 @@
"visible": false
},
{
+ "id": "timeout_layer",
+ "type": "ClutterText",
+ "color": "White",
+ "font-name": "Sans bold 15px",
+ "x": 0,
+ "y": 0,
+ "width":100,
+ "height":20,
+ "visible": false
+},
+{
"id": "viewport_layout",
"type": "ClutterBox",
"children":
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
index 0488813b..aae86240 100644
--- a/libcheese/cheese-camera.c
+++ b/libcheese/cheese-camera.c
@@ -1742,3 +1742,55 @@ cheese_camera_set_balance_property (CheeseCamera *camera, const gchar *property,
g_object_set (G_OBJECT (priv->video_balance), property, value, NULL);
}
+
+/**
+ * cheese_camera_get_recorded_time:
+ * @camera: A #CheeseCamera
+ *
+ * Get a string representation of the playing time
+ * of the current video recording
+ *
+ * Returns: A string with the time representation.
+ */
+gchar *
+cheese_camera_get_recorded_time (CheeseCamera *camera)
+{
+ g_return_val_if_fail (CHEESE_IS_CAMERA (camera), NULL);
+
+ CheeseCameraPrivate *priv = camera->priv;
+ const gint TUNIT_60 = 60;
+ GstClock *clock;
+ GstClockTime base_time;
+ GstClockTime clock_time;
+ GstClockTimeDiff time_diff;
+ gint total_time;
+ gint hours;
+ gint minutes;
+ gint seconds;
+
+ base_time = gst_element_get_base_time (priv->camerabin);
+ clock = gst_element_get_clock (priv->camerabin);
+ clock_time = gst_clock_get_time (clock);
+ gst_object_unref (clock);
+ /* In order to calculate the running time of the stream,
+ * it is necessary to substract the base_time from the
+ * clock_time. The result is expressed in nanoseconds.
+ * */
+ time_diff = GST_CLOCK_DIFF (base_time, clock_time);
+
+ // Substract seconds, minutes and hours.
+ total_time = GST_TIME_AS_SECONDS (time_diff);
+ seconds = total_time % TUNIT_60;
+ total_time = total_time - seconds;
+ minutes = (total_time % (TUNIT_60 * TUNIT_60)) / TUNIT_60;
+ total_time = total_time - (minutes * TUNIT_60);
+ hours = total_time / (TUNIT_60 * TUNIT_60);
+
+ /* Translators: This is a time format, like "09:05:02" for 9
+ * hours, 5 minutes, and 2 seconds. You may change ":" to
+ * the separator that your locale uses or use "%Id" instead
+ * of "%d" if your locale uses localized digits.
+ */
+ return g_strdup_printf (C_("time format", "%02i:%02i:%02i"),
+ hours, minutes, seconds);
+}
diff --git a/libcheese/cheese-camera.h b/libcheese/cheese-camera.h
index bfc95250..2969a4c4 100644
--- a/libcheese/cheese-camera.h
+++ b/libcheese/cheese-camera.h
@@ -125,6 +125,7 @@ gboolean cheese_camera_get_balance_property_range (CheeseCamera *camera,
gdouble *min, gdouble *max, gdouble *def);
void cheese_camera_set_balance_property (CheeseCamera *camera, const gchar *property, gdouble value);
void cheese_camera_toggle_effects_pipeline (CheeseCamera *camera, gboolean active);
+gchar *cheese_camera_get_recorded_time (CheeseCamera *camera);
G_END_DECLS
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
index 12ef2e04..919d7544 100644
--- a/src/cheese-window.vala
+++ b/src/cheese-window.vala
@@ -74,6 +74,7 @@ public class Cheese.MainWindow : Gtk.Window
private Clutter.Text countdown_layer;
private Clutter.Rectangle background_layer;
private Clutter.Text error_layer;
+ private Clutter.Text timeout_layer;
private Clutter.Box current_effects_grid;
private int current_effects_page = 0;
@@ -680,7 +681,9 @@ public class Cheese.MainWindow : Gtk.Window
if (preferences_dialog != null)
preferences_dialog.set_current_mode (current_mode);
-
+
+ timeout_layer.hide ();
+
switch (this.current_mode)
{
case MediaMode.PHOTO:
@@ -695,6 +698,8 @@ public class Cheese.MainWindow : Gtk.Window
take_video_action.sensitive = true;
take_burst_action.sensitive = false;
take_action_button.related_action = take_video_action;
+ timeout_layer.text = "00:00:00";
+ timeout_layer.show ();
break;
case MediaMode.BURST:
@@ -886,6 +891,8 @@ public class Cheese.MainWindow : Gtk.Window
{
this.viewport_layout.set_size (viewport.width, viewport.height);
this.background_layer.set_size (viewport.width, viewport.height);
+ this.timeout_layer.set_position (video_preview.width/3 + viewport.width/2,
+ viewport.height-20);
}
/**
@@ -1024,6 +1031,10 @@ public class Cheese.MainWindow : Gtk.Window
if (is_start)
{
camera.start_video_recording (fileutil.get_new_media_filename (this.current_mode));
+ /* Will be called every 1 second while
+ * update_timeout_layer returns true.
+ */
+ Timeout.add_seconds (1, update_timeout_layer);
take_action_button_label.label = "<b>" + _("Stop _Recording") + "</b>";
take_action_button.tooltip_text = _("Stop recording");
take_action_button_image.set_from_stock (Gtk.Stock.MEDIA_STOP, Gtk.IconSize.BUTTON);
@@ -1033,6 +1044,13 @@ public class Cheese.MainWindow : Gtk.Window
else
{
camera.stop_video_recording ();
+ /* The timeout_layer always shows the "00:00:00"
+ * string when not recording, in order to notify
+ * the user about two things:
+ * + The user is making use of the recording mode.
+ * + The user is currently not recording.
+ */
+ timeout_layer.text = "00:00:00";
take_action_button_label.label = "<b>" + take_action_button.related_action.label + "</b>";
take_action_button.tooltip_text = take_action_button.related_action.tooltip;
take_action_button_image.set_from_stock (Gtk.Stock.MEDIA_RECORD, Gtk.IconSize.BUTTON);
@@ -1042,6 +1060,22 @@ public class Cheese.MainWindow : Gtk.Window
}
/**
+ * Update the timeout layer displayed timer.
+ *
+ * @return false, if the source, Timeout.add_seconds (used
+ * in the toogle_video_recording method), should be removed.
+ */
+ private bool update_timeout_layer ()
+ {
+ if (is_recording) {
+ timeout_layer.text = camera.get_recorded_time ();
+ return true;
+ }
+ else
+ return false;
+ }
+
+ /**
* Toggle whether photo bursting is active.
*
* @param is_start whether to start capturing a photo burst
@@ -1522,6 +1556,7 @@ public class Cheese.MainWindow : Gtk.Window
countdown_layer = clutter_builder.get_object ("countdown_layer") as Clutter.Text;
background_layer = clutter_builder.get_object ("background") as Clutter.Rectangle;
error_layer = clutter_builder.get_object ("error_layer") as Clutter.Text;
+ timeout_layer = clutter_builder.get_object ("timeout_layer") as Clutter.Text;
video_preview.keep_aspect_ratio = true;
video_preview.request_mode = Clutter.RequestMode.HEIGHT_FOR_WIDTH;
@@ -1529,6 +1564,7 @@ public class Cheese.MainWindow : Gtk.Window
viewport_layout.set_layout_manager (viewport_layout_manager);
viewport.add_actor (viewport_layout);
+ viewport.add_actor (timeout_layer);
viewport.allocation_changed.connect (on_stage_resize);
diff --git a/src/vapi/cheese-common.vapi b/src/vapi/cheese-common.vapi
index 5b59b0db..075b5943 100644
--- a/src/vapi/cheese-common.vapi
+++ b/src/vapi/cheese-common.vapi
@@ -56,6 +56,7 @@ namespace Cheese
public bool switch_camera_device ();
public bool take_photo (string filename);
public bool take_photo_pixbuf ();
+ public string get_recorded_time ();
[NoAccessorMethod]
public string device_node {owned get; set;}
[NoAccessorMethod]