In F-19 we had a long list of bugfix patches, most of these have been merged
into gnome-3.10 but not all have been merged yet, re-add the non merged ones - Fix video recording not working - Allow changing effects while recording - Disallow changing camera settings while recording - Fix cheese misbehavior when going from 0 -> 1 or 1 -> 0 camera devices
This commit is contained in:
parent
8961056e8d
commit
9b94ca029c
108
0001-cheese-Don-t-allow-changing-the-camera-and-or-its-re.patch
Normal file
108
0001-cheese-Don-t-allow-changing-the-camera-and-or-its-re.patch
Normal file
@ -0,0 +1,108 @@
|
||||
From d4288cd182064bca3bc3cd3d62c794737c9db426 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 7 Aug 2013 15:13:57 +0200
|
||||
Subject: [PATCH 01/13] cheese: Don't allow changing the camera and/or its
|
||||
resolution while recording
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-application.vala | 1 +
|
||||
src/cheese-preferences.vala | 16 +++++++++++++++-
|
||||
src/cheese-window.vala | 7 +++++++
|
||||
3 files changed, 23 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/cheese-application.vala b/src/cheese-application.vala
|
||||
index 4cbfa49..0f9f33d 100644
|
||||
--- a/src/cheese-application.vala
|
||||
+++ b/src/cheese-application.vala
|
||||
@@ -160,6 +160,7 @@ public class Cheese.Application : Gtk.Application
|
||||
main_window.show ();
|
||||
setup_camera ();
|
||||
preferences_dialog = new PreferencesDialog (camera);
|
||||
+ main_window.mode_change_changed.connect (preferences_dialog.enable_camera_controls);
|
||||
this.add_window (main_window);
|
||||
}
|
||||
}
|
||||
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
|
||||
index e078cbb..bad3c71 100644
|
||||
--- a/src/cheese-preferences.vala
|
||||
+++ b/src/cheese-preferences.vala
|
||||
@@ -24,6 +24,7 @@ using Gtk;
|
||||
public class Cheese.PreferencesDialog : GLib.Object
|
||||
{
|
||||
private Cheese.Camera camera;
|
||||
+ private bool camera_controls_sensitive;
|
||||
|
||||
private GLib.Settings settings;
|
||||
|
||||
@@ -56,6 +57,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
public PreferencesDialog (Cheese.Camera camera)
|
||||
{
|
||||
this.camera = camera;
|
||||
+ this.camera_controls_sensitive = true;
|
||||
|
||||
settings = new GLib.Settings ("org.gnome.Cheese");
|
||||
|
||||
@@ -499,7 +501,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
if (camera.get_selected_device ().get_device_node () == dev.get_device_node ())
|
||||
source_combo.set_active_iter (iter);
|
||||
|
||||
- if (camera_model.iter_n_children (null) > 1)
|
||||
+ if (camera_model.iter_n_children (null) > 1 && camera_controls_sensitive)
|
||||
source_combo.sensitive = true;
|
||||
}
|
||||
|
||||
@@ -548,6 +550,18 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Set camera controls sensitivity
|
||||
+ */
|
||||
+ public void enable_camera_controls (bool sensitive)
|
||||
+ {
|
||||
+ camera_controls_sensitive = sensitive;
|
||||
+ photo_resolution_combo.sensitive = sensitive;
|
||||
+ video_resolution_combo.sensitive = sensitive;
|
||||
+ if (camera_model.iter_n_children (null) > 1)
|
||||
+ source_combo.sensitive = sensitive;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
* Show the dialog.
|
||||
*/
|
||||
public void show ()
|
||||
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
|
||||
index a406288..bc53b4e 100644
|
||||
--- a/src/cheese-window.vala
|
||||
+++ b/src/cheese-window.vala
|
||||
@@ -373,6 +373,11 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Signal raised when mode_change changes
|
||||
+ */
|
||||
+ public signal void mode_change_changed (bool enabled);
|
||||
+
|
||||
+ /**
|
||||
* Make the media capture mode actions sensitive.
|
||||
*/
|
||||
private void enable_mode_change ()
|
||||
@@ -381,6 +386,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
mode.set_enabled (true);
|
||||
var effects = this.application.lookup_action ("effects") as SimpleAction;
|
||||
effects.set_enabled (true);
|
||||
+ mode_change_changed (true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -392,6 +398,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
mode.set_enabled (false);
|
||||
var effects = this.application.lookup_action ("effects") as SimpleAction;
|
||||
effects.set_enabled (false);
|
||||
+ mode_change_changed (false);
|
||||
}
|
||||
|
||||
/**
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,126 +0,0 @@
|
||||
From 486bfc9c76ec05d469ec124407cbaa026544c620 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Sun, 10 Jun 2012 14:50:54 +0200
|
||||
Subject: [PATCH 1/4] cheese-thumb-view: Don't set columns to 5000 in
|
||||
horizontal mode
|
||||
|
||||
Rather then assuming 5000 will be enough, just set the number of columns to
|
||||
the number of thumbnails we have.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-window.vala | 4 ++--
|
||||
src/thumbview/cheese-thumb-view.c | 21 ++++++++++++++++++++-
|
||||
src/thumbview/cheese-thumb-view.h | 1 +
|
||||
src/vapi/cheese-thumbview.vapi | 1 +
|
||||
4 files changed, 24 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
|
||||
index 26f5524..cb4eeb4 100644
|
||||
--- a/src/cheese-window.vala
|
||||
+++ b/src/cheese-window.vala
|
||||
@@ -724,7 +724,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
|
||||
if (is_wide_mode)
|
||||
{
|
||||
- thumb_view.set_columns (1);
|
||||
+ thumb_view.set_vertical (true);
|
||||
thumb_nav.set_vertical (true);
|
||||
if (thumbnails_bottom.get_child () != null)
|
||||
{
|
||||
@@ -737,7 +737,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
}
|
||||
else
|
||||
{
|
||||
- thumb_view.set_columns (5000);
|
||||
+ thumb_view.set_vertical (false);
|
||||
thumb_nav.set_vertical (false);
|
||||
if (thumbnails_right.get_child () != null)
|
||||
{
|
||||
diff --git a/src/thumbview/cheese-thumb-view.c b/src/thumbview/cheese-thumb-view.c
|
||||
index f4694f5..4ce8f56 100644
|
||||
--- a/src/thumbview/cheese-thumb-view.c
|
||||
+++ b/src/thumbview/cheese-thumb-view.c
|
||||
@@ -51,6 +51,7 @@ typedef struct
|
||||
GFileMonitor *video_file_monitor;
|
||||
GnomeDesktopThumbnailFactory *factory;
|
||||
gboolean multiplex_thumbnail_generator;
|
||||
+ gboolean vertical;
|
||||
guint n_items;
|
||||
guint idle_id;
|
||||
GQueue *thumbnails;
|
||||
@@ -602,7 +603,10 @@ cheese_thumb_view_row_inserted_cb (GtkTreeModel *tree_model,
|
||||
CheeseThumbViewPrivate *priv = CHEESE_THUMB_VIEW_GET_PRIVATE (thumb_view);
|
||||
|
||||
priv->n_items++;
|
||||
- gtk_widget_set_size_request (GTK_WIDGET (thumb_view), -1, -1);
|
||||
+ if (!priv->vertical)
|
||||
+ gtk_icon_view_set_columns(GTK_ICON_VIEW (thumb_view), priv->n_items);
|
||||
+ else
|
||||
+ gtk_widget_set_size_request (GTK_WIDGET (thumb_view), -1, -1);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -617,6 +621,8 @@ cheese_thumb_view_row_deleted_cb (GtkTreeModel *tree_model,
|
||||
gtk_widget_set_size_request (GTK_WIDGET (thumb_view),
|
||||
THUMB_VIEW_MINIMUM_WIDTH,
|
||||
THUMB_VIEW_MINIMUM_HEIGHT);
|
||||
+ else if (!priv->vertical)
|
||||
+ gtk_icon_view_set_columns(GTK_ICON_VIEW (thumb_view), priv->n_items);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -685,6 +691,7 @@ cheese_thumb_view_constructed (GObject *object)
|
||||
THUMBNAIL_BASENAME_URL_COLUMN, GTK_SORT_ASCENDING);
|
||||
|
||||
cheese_thumb_view_fill (thumb_view);
|
||||
+ cheese_thumb_view_set_vertical (thumb_view, FALSE);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
@@ -697,6 +704,18 @@ cheese_thumb_view_new ()
|
||||
}
|
||||
|
||||
void
|
||||
+cheese_thumb_view_set_vertical (CheeseThumbView *thumb_view, gboolean vertical)
|
||||
+{
|
||||
+ CheeseThumbViewPrivate *priv = CHEESE_THUMB_VIEW_GET_PRIVATE (thumb_view);
|
||||
+
|
||||
+ priv->vertical = vertical;
|
||||
+ if (!priv->vertical && priv->n_items)
|
||||
+ gtk_icon_view_set_columns(GTK_ICON_VIEW (thumb_view), priv->n_items);
|
||||
+ else
|
||||
+ gtk_icon_view_set_columns(GTK_ICON_VIEW (thumb_view), 1);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
cheese_thumb_view_start_monitoring_photo_path (CheeseThumbView *thumb_view, const char *path_photos)
|
||||
{
|
||||
CheeseThumbViewPrivate *priv = CHEESE_THUMB_VIEW_GET_PRIVATE (thumb_view);
|
||||
diff --git a/src/thumbview/cheese-thumb-view.h b/src/thumbview/cheese-thumb-view.h
|
||||
index 140a283..b2ca2b3 100644
|
||||
--- a/src/thumbview/cheese-thumb-view.h
|
||||
+++ b/src/thumbview/cheese-thumb-view.h
|
||||
@@ -54,6 +54,7 @@ GList *cheese_thumb_view_get_selected_images_list (CheeseThumbView *thumb_view);
|
||||
char * cheese_thumb_view_get_selected_image (CheeseThumbView *thumb_view);
|
||||
guint cheese_thumb_view_get_n_selected (CheeseThumbView *thumbview);
|
||||
void cheese_thumb_view_remove_item (CheeseThumbView *thumb_view, GFile *file);
|
||||
+void cheese_thumb_view_set_vertical (CheeseThumbView *thumb_view, gboolean vertical);
|
||||
void cheese_thumb_view_start_monitoring_photo_path (CheeseThumbView *thumbview, const char *path_photos);
|
||||
void cheese_thumb_view_start_monitoring_video_path (CheeseThumbView *thumbview, const char *path_videos);
|
||||
|
||||
diff --git a/src/vapi/cheese-thumbview.vapi b/src/vapi/cheese-thumbview.vapi
|
||||
index 669b724..61b323e 100644
|
||||
--- a/src/vapi/cheese-thumbview.vapi
|
||||
+++ b/src/vapi/cheese-thumbview.vapi
|
||||
@@ -9,6 +9,7 @@ namespace Cheese
|
||||
public List<GLib.File> get_selected_images_list ();
|
||||
public int get_n_selected ();
|
||||
public void remove_item (GLib.File file);
|
||||
+ public void set_vertical (bool vertical);
|
||||
public void start_monitoring_photo_path (string path_photos);
|
||||
public void start_monitoring_video_path (string path_videos);
|
||||
}
|
||||
--
|
||||
1.7.11.4
|
||||
|
89
0002-cheese-window-Add-cancel_running_action-method.patch
Normal file
89
0002-cheese-window-Add-cancel_running_action-method.patch
Normal file
@ -0,0 +1,89 @@
|
||||
From 8c401d7fe5c85e60e84d08f1562fd721bef01be0 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 18 Jun 2013 09:05:19 +0200
|
||||
Subject: [PATCH 02/13] cheese-window: Add cancel_running_action () method
|
||||
|
||||
And use it to stop recording / the photo countdown when we get an error
|
||||
while either one is active.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-window.vala | 47 +++++++++++++++++++++++++++++++----------------
|
||||
1 file changed, 31 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
|
||||
index bc53b4e..675a92e 100644
|
||||
--- a/src/cheese-window.vala
|
||||
+++ b/src/cheese-window.vala
|
||||
@@ -724,6 +724,34 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Cancel the current action (if any)
|
||||
+ */
|
||||
+ private bool cancel_running_action ()
|
||||
+ {
|
||||
+ if ((current_countdown != null && current_countdown.running) ||
|
||||
+ is_bursting || is_recording)
|
||||
+ {
|
||||
+ action_cancelled = true;
|
||||
+ switch (current_mode)
|
||||
+ {
|
||||
+ case MediaMode.PHOTO:
|
||||
+ current_countdown.stop ();
|
||||
+ finish_countdown_callback ();
|
||||
+ break;
|
||||
+ case MediaMode.BURST:
|
||||
+ toggle_photo_bursting (false);
|
||||
+ break;
|
||||
+ case MediaMode.VIDEO:
|
||||
+ toggle_video_recording (false);
|
||||
+ break;
|
||||
+ }
|
||||
+ action_cancelled = false;
|
||||
+ return true;
|
||||
+ }
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
* Cancel the current activity if the escape key is pressed.
|
||||
*
|
||||
* @param event the key event, to check which key was pressed
|
||||
@@ -736,23 +764,9 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
key = Gdk.keyval_name (event.keyval);
|
||||
if (strcmp (key, "Escape") == 0)
|
||||
{
|
||||
- if ((current_countdown != null && current_countdown.running) || is_bursting || is_recording)
|
||||
+ if (cancel_running_action())
|
||||
{
|
||||
- action_cancelled = true;
|
||||
- switch (current_mode)
|
||||
- {
|
||||
- case MediaMode.PHOTO:
|
||||
- current_countdown.stop ();
|
||||
- finish_countdown_callback ();
|
||||
- break;
|
||||
- case MediaMode.BURST:
|
||||
- toggle_photo_bursting (false);
|
||||
- break;
|
||||
- case MediaMode.VIDEO:
|
||||
- toggle_video_recording (false);
|
||||
- break;
|
||||
- }
|
||||
- action_cancelled = false;
|
||||
+ return false;
|
||||
}
|
||||
else if (is_effects_selector_active)
|
||||
{
|
||||
@@ -1154,6 +1168,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
*/
|
||||
public void camera_state_change_null ()
|
||||
{
|
||||
+ cancel_running_action();
|
||||
if (!error_layer.visible)
|
||||
{
|
||||
show_error (_("There was an error playing video from the webcam"));
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,45 +0,0 @@
|
||||
From 9c2b429ec0b027657c0767103fbbfebbc8a992ed Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 22 Aug 2012 10:02:08 +0200
|
||||
Subject: [PATCH 3/4] Fix cheese_camera_device_update_format_table() going
|
||||
into an infinite loop
|
||||
|
||||
Some devices report a very small min_width / height down to reporting
|
||||
0x0 as minimum resolution, which causes an infinte loop in
|
||||
cheese_camera_device_update_format_table().
|
||||
|
||||
This patch limits the minimum resultion to 160x120, both to fix the
|
||||
infinite loop issue, and to remove ridiculous resolutions such as
|
||||
2x2, 5x3, 11x7, 22x15 etc. which are seen in the resolution drop down on
|
||||
some devices.
|
||||
|
||||
For more details on the infinite loop issue, see:
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=850505
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
libcheese/cheese-camera-device.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/libcheese/cheese-camera-device.c b/libcheese/cheese-camera-device.c
|
||||
index 9b977a4..653cba9 100644
|
||||
--- a/libcheese/cheese-camera-device.c
|
||||
+++ b/libcheese/cheese-camera-device.c
|
||||
@@ -296,6 +296,14 @@ cheese_camera_device_update_format_table (CheeseCameraDevice *device)
|
||||
min_height = gst_value_get_int_range_min (height);
|
||||
max_height = gst_value_get_int_range_max (height);
|
||||
|
||||
+ /* Some devices report a very small min_width / height down to reporting
|
||||
+ * 0x0 as minimum resolution, which causes an infinte loop below, limit
|
||||
+ * these to something reasonable. */
|
||||
+ if (min_width < 160)
|
||||
+ min_width = 160;
|
||||
+ if (min_height < 120)
|
||||
+ min_height = 120;
|
||||
+
|
||||
cur_width = min_width;
|
||||
cur_height = min_height;
|
||||
|
||||
--
|
||||
1.7.11.4
|
||||
|
@ -0,0 +1,87 @@
|
||||
From 1537ad2673843e033035edfe144ffc78bdab5a43 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 6 Aug 2013 14:50:00 +0200
|
||||
Subject: [PATCH 03/13] cheese-window: Allow changing effects while shooting /
|
||||
recording a video
|
||||
|
||||
There is no technical reason to disable the effect selector while shooting
|
||||
a video. Likewise there is no technical reason to disallow start / stop
|
||||
recording / shooting, or changing mode when the effect selector is change.
|
||||
|
||||
Removing these unnecessary limitations simplifies the code, and allows users
|
||||
to change effects while recording a video.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-application.vala | 25 +++----------------------
|
||||
src/cheese-window.vala | 4 ----
|
||||
2 files changed, 3 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-application.vala b/src/cheese-application.vala
|
||||
index 0f9f33d..9cb5ac5 100644
|
||||
--- a/src/cheese-application.vala
|
||||
+++ b/src/cheese-application.vala
|
||||
@@ -368,17 +368,8 @@ public class Cheese.Application : Gtk.Application
|
||||
switch (new_state)
|
||||
{
|
||||
case Gst.State.PLAYING:
|
||||
- if (effects.state.get_boolean ())
|
||||
- {
|
||||
- mode.set_enabled (false);
|
||||
- shoot.set_enabled (false);
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- mode.set_enabled (true);
|
||||
- shoot.set_enabled (true);
|
||||
- }
|
||||
-
|
||||
+ mode.set_enabled (true);
|
||||
+ shoot.set_enabled (true);
|
||||
effects.set_enabled (true);
|
||||
|
||||
main_window.camera_state_change_playing ();
|
||||
@@ -491,17 +482,7 @@ public class Cheese.Application : Gtk.Application
|
||||
{
|
||||
return_if_fail (value != null);
|
||||
|
||||
- var state = value.get_boolean ();
|
||||
-
|
||||
- var shoot = this.lookup_action ("shoot") as SimpleAction;
|
||||
- var mode = this.lookup_action ("mode") as SimpleAction;
|
||||
-
|
||||
- // Effects selection and shooting/mode changes are mutually exclusive.
|
||||
- shoot.set_enabled (!state);
|
||||
- mode.set_enabled (!state);
|
||||
-
|
||||
- main_window.set_effects (state);
|
||||
-
|
||||
+ main_window.set_effects (value.get_boolean ());
|
||||
action.set_state (value);
|
||||
}
|
||||
|
||||
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
|
||||
index 675a92e..07cf0f4 100644
|
||||
--- a/src/cheese-window.vala
|
||||
+++ b/src/cheese-window.vala
|
||||
@@ -384,8 +384,6 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
{
|
||||
var mode = this.application.lookup_action ("mode") as SimpleAction;
|
||||
mode.set_enabled (true);
|
||||
- var effects = this.application.lookup_action ("effects") as SimpleAction;
|
||||
- effects.set_enabled (true);
|
||||
mode_change_changed (true);
|
||||
}
|
||||
|
||||
@@ -396,8 +394,6 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
{
|
||||
var mode = this.application.lookup_action ("mode") as SimpleAction;
|
||||
mode.set_enabled (false);
|
||||
- var effects = this.application.lookup_action ("effects") as SimpleAction;
|
||||
- effects.set_enabled (false);
|
||||
mode_change_changed (false);
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,73 +0,0 @@
|
||||
From 121fd6f5355b5e56fa21004f030fe02eb1de7ae7 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 22 Aug 2012 10:58:57 +0200
|
||||
Subject: [PATCH 4/4] Ensure width is a multiple of 8, and height a multiple
|
||||
of 2
|
||||
|
||||
We ask Gstreamer to us an YUV format in the pipeline, by setting the
|
||||
camera-bins "filter-caps" to "video/x-raw-yuv", and gstreamer demands
|
||||
of yuv format frames that their width is a multiple of 8, and their height
|
||||
a multiple of 2.
|
||||
|
||||
Previous to this patch my bttv tvcard lists the following resolutions in
|
||||
cheese:
|
||||
924x576 (*)
|
||||
920x576
|
||||
640x480
|
||||
462x288 (*)
|
||||
460x288 (*)
|
||||
320x240
|
||||
231x144 (*)
|
||||
230x144 (*)
|
||||
160x120
|
||||
|
||||
Where all the ones marked with an asterisk don't work.
|
||||
|
||||
After this patch the list is:
|
||||
920x576
|
||||
640x480
|
||||
456x288
|
||||
320x240
|
||||
224x144
|
||||
160x120
|
||||
|
||||
And all work.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
libcheese/cheese-camera-device.c | 12 ++++++++----
|
||||
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libcheese/cheese-camera-device.c b/libcheese/cheese-camera-device.c
|
||||
index 653cba9..370abff 100644
|
||||
--- a/libcheese/cheese-camera-device.c
|
||||
+++ b/libcheese/cheese-camera-device.c
|
||||
@@ -313,8 +313,10 @@ cheese_camera_device_update_format_table (CheeseCameraDevice *device)
|
||||
{
|
||||
CheeseVideoFormat *format = g_slice_new0 (CheeseVideoFormat);
|
||||
|
||||
- format->width = cur_width;
|
||||
- format->height = cur_height;
|
||||
+ /* Gstreamer wants resolutions for YUV formats where the width is
|
||||
+ * a multiple of 8, and the height is a multiple of 2 */
|
||||
+ format->width = cur_width & ~7;
|
||||
+ format->height = cur_height & ~1;
|
||||
|
||||
cheese_camera_device_add_format (device, format);
|
||||
|
||||
@@ -328,8 +330,10 @@ cheese_camera_device_update_format_table (CheeseCameraDevice *device)
|
||||
{
|
||||
CheeseVideoFormat *format = g_slice_new0 (CheeseVideoFormat);
|
||||
|
||||
- format->width = cur_width;
|
||||
- format->height = cur_height;
|
||||
+ /* Gstreamer wants resolutions for YUV formats where the width is
|
||||
+ * a multiple of 8, and the height is a multiple of 2 */
|
||||
+ format->width = cur_width & ~7;
|
||||
+ format->height = cur_height & ~1;
|
||||
|
||||
cheese_camera_device_add_format (device, format);
|
||||
|
||||
--
|
||||
1.7.11.4
|
||||
|
@ -0,0 +1,55 @@
|
||||
From dcccb73f44970d7f8ed8e7d70986f9ffecfc6491 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 3 Sep 2013 15:56:25 +0200
|
||||
Subject: [PATCH 04/13] cheese-camera: Fix video recording with gstreamer >=
|
||||
1.1.4
|
||||
|
||||
gstreamer >= 1.1.4 requires us to fully specify the video-capture-source caps,
|
||||
otherwise cheese prints this:
|
||||
|
||||
(cheese:22606): cheese-WARNING **: Filter caps do not completely specify the output format: gstcapsfilter.c(348): gst_capsfilter_prepare_buf (): /GstCameraBin:camerabin/GstCapsFilter:videobin-capsfilter:
|
||||
Output caps are unfixed: video/x-raw, framerate=(fraction)30/1, width=(int)640, height=(int)480, format=(string){ YUY2, YV12, BGR, RGB, I420 }, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
|
||||
|
||||
And video-recording is broken.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
libcheese/cheese-camera.c | 15 ++++++++++++---
|
||||
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
|
||||
index a625359..fdeb973 100644
|
||||
--- a/libcheese/cheese-camera.c
|
||||
+++ b/libcheese/cheese-camera.c
|
||||
@@ -743,7 +743,7 @@ cheese_camera_set_new_caps (CheeseCamera *camera)
|
||||
{
|
||||
CheeseCameraPrivate *priv;
|
||||
CheeseCameraDevice *device;
|
||||
- GstCaps *caps;
|
||||
+ GstCaps *caps, *i420_caps, *video_caps;
|
||||
gchar *caps_desc;
|
||||
int width, height;
|
||||
|
||||
@@ -768,8 +768,17 @@ cheese_camera_set_new_caps (CheeseCamera *camera)
|
||||
g_object_set (gst_bin_get_by_name (GST_BIN (priv->video_source),
|
||||
"video_source_filter"), "caps", caps, NULL);
|
||||
g_object_set (priv->camerabin, "viewfinder-caps", caps,
|
||||
- "image-capture-caps", caps, "video-capture-caps", caps,
|
||||
- NULL);
|
||||
+ "image-capture-caps", caps, NULL);
|
||||
+
|
||||
+ /* We must pick a format for the video-source, otherwise gstreamer
|
||||
+ becomes unhappy */
|
||||
+ i420_caps = gst_caps_new_simple ("video/x-raw",
|
||||
+ "format", G_TYPE_STRING, "I420", NULL);
|
||||
+ video_caps = gst_caps_intersect (caps, i420_caps);
|
||||
+ g_object_set (priv->camerabin, "video-capture-caps", video_caps, NULL);
|
||||
+
|
||||
+ gst_caps_unref (i420_caps);
|
||||
+ gst_caps_unref (video_caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
width = priv->current_format->width;
|
||||
--
|
||||
1.8.3.1
|
||||
|
90
0005-cheese-preferences-Add-camera_changed-method.patch
Normal file
90
0005-cheese-preferences-Add-camera_changed-method.patch
Normal file
@ -0,0 +1,90 @@
|
||||
From ce2689370cc4cfd8e2fb3f2fba154a979792d934 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 18 Jun 2013 11:14:16 +0200
|
||||
Subject: [PATCH 05/13] cheese-preferences: Add camera_changed () method
|
||||
|
||||
This centralizes camera-change handling, and adds a check for their being
|
||||
no camera removing a whole bunch of glib Critical messages being printed
|
||||
when cheese is started without a camera.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-preferences.vala | 34 +++++++++++++++++++++++++---------
|
||||
1 file changed, 25 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
|
||||
index bad3c71..2f2d679 100644
|
||||
--- a/src/cheese-preferences.vala
|
||||
+++ b/src/cheese-preferences.vala
|
||||
@@ -130,6 +130,28 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Update resolution list and save the current camera to settings.
|
||||
+ */
|
||||
+ private void camera_changed ()
|
||||
+ {
|
||||
+ Cheese.CameraDevice device, iter_device;
|
||||
+ TreeIter iter;
|
||||
+
|
||||
+ device = camera.get_selected_device ();
|
||||
+ if (device == null)
|
||||
+ return;
|
||||
+ settings.set_string ("camera", device.get_device_node ());
|
||||
+ setup_resolutions_for_device (device);
|
||||
+
|
||||
+ for (bool next = camera_model.get_iter_first (out iter); next;
|
||||
+ next = camera_model.iter_next (ref iter)) {
|
||||
+ camera_model.get (iter, 1, out iter_device, -1);
|
||||
+ if (iter_device == device)
|
||||
+ source_combo.set_active_iter (iter);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
* Initialize and populate the camera device combo box model.
|
||||
*/
|
||||
private void initialize_camera_devices ()
|
||||
@@ -142,8 +164,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
|
||||
devices.foreach(add_camera_device);
|
||||
|
||||
- settings.set_string ("camera", camera.get_selected_device ().get_device_node ());
|
||||
- setup_resolutions_for_device (camera.get_selected_device ());
|
||||
+ camera_changed ();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -229,8 +250,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
combo.model.get (iter, 1, out dev);
|
||||
camera.set_device_by_device_node (dev.get_device_node ());
|
||||
camera.switch_camera_device ();
|
||||
- setup_resolutions_for_device (camera.get_selected_device ());
|
||||
- settings.set_string ("camera", dev.get_device_node ());
|
||||
+ camera_changed ();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -476,8 +496,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
}
|
||||
}
|
||||
|
||||
- settings.set_string ("camera", camera.get_selected_device ().get_device_node ());
|
||||
- setup_resolutions_for_device (camera.get_selected_device ());
|
||||
+ camera_changed ();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -498,9 +517,6 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
0, dev.get_name () + " (" + dev.get_device_node () + ")",
|
||||
1, dev);
|
||||
|
||||
- if (camera.get_selected_device ().get_device_node () == dev.get_device_node ())
|
||||
- source_combo.set_active_iter (iter);
|
||||
-
|
||||
if (camera_model.iter_n_children (null) > 1 && camera_controls_sensitive)
|
||||
source_combo.sensitive = true;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,44 @@
|
||||
From 0d94fa92ab66b43f08b2b9d906fe0f4c963424af Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 18 Jun 2013 11:38:05 +0200
|
||||
Subject: [PATCH 06/13] cheese_camera_get_camera_devices: Allow calling before
|
||||
cheese_camera_setup()
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
libcheese/cheese-camera.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
|
||||
index fdeb973..332780a 100644
|
||||
--- a/libcheese/cheese-camera.c
|
||||
+++ b/libcheese/cheese-camera.c
|
||||
@@ -363,6 +363,9 @@ cheese_camera_detect_camera_devices (CheeseCamera *camera)
|
||||
{
|
||||
CheeseCameraPrivate *priv = camera->priv;
|
||||
|
||||
+ if (priv->monitor)
|
||||
+ return; /* Camera devices already detected */
|
||||
+
|
||||
priv->num_camera_devices = 0;
|
||||
priv->camera_devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||
|
||||
@@ -1650,13 +1653,11 @@ cheese_camera_setup (CheeseCamera *camera, const gchar *uuid, GError **error)
|
||||
GPtrArray *
|
||||
cheese_camera_get_camera_devices (CheeseCamera *camera)
|
||||
{
|
||||
- CheeseCameraPrivate *priv;
|
||||
-
|
||||
g_return_val_if_fail (CHEESE_IS_CAMERA (camera), NULL);
|
||||
|
||||
- priv = camera->priv;
|
||||
+ cheese_camera_detect_camera_devices (camera);
|
||||
|
||||
- return g_ptr_array_ref (priv->camera_devices);
|
||||
+ return g_ptr_array_ref (camera->priv->camera_devices);
|
||||
}
|
||||
|
||||
/**
|
||||
--
|
||||
1.8.3.1
|
||||
|
131
0007-cheese-Move-camera_setup-to-cheese-preferences.patch
Normal file
131
0007-cheese-Move-camera_setup-to-cheese-preferences.patch
Normal file
@ -0,0 +1,131 @@
|
||||
From de2a756fd016ecf41963d46bb6c9389ee931611d Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 18 Jun 2013 11:40:41 +0200
|
||||
Subject: [PATCH 07/13] cheese: Move camera_setup to cheese-preferences
|
||||
|
||||
cheese-preferences already keeps track of which cameras there are and is in
|
||||
control of selecting camera resolution and the source-device. This patch also
|
||||
makes it control of start / stop, thereby logical grouping all camera-control
|
||||
code in a single place.
|
||||
|
||||
Having all camera control code in a single place makes dealing with various
|
||||
hotplug issues a lot easier.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-application.vala | 20 ++++----------------
|
||||
src/cheese-preferences.vala | 24 ++++++++++++++++++++++--
|
||||
src/vapi/cheese-common.vapi | 2 +-
|
||||
3 files changed, 27 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-application.vala b/src/cheese-application.vala
|
||||
index 9cb5ac5..b0d0dbe 100644
|
||||
--- a/src/cheese-application.vala
|
||||
+++ b/src/cheese-application.vala
|
||||
@@ -158,8 +158,10 @@ public class Cheese.Application : Gtk.Application
|
||||
main_window.key_press_event.connect (on_webcam_key_pressed);
|
||||
|
||||
main_window.show ();
|
||||
- setup_camera ();
|
||||
+ create_camera ();
|
||||
preferences_dialog = new PreferencesDialog (camera);
|
||||
+ preferences_dialog.camera_error.connect (main_window.show_error);
|
||||
+ preferences_dialog.camera_play ();
|
||||
main_window.mode_change_changed.connect (preferences_dialog.enable_camera_controls);
|
||||
this.add_window (main_window);
|
||||
}
|
||||
@@ -266,7 +268,7 @@ public class Cheese.Application : Gtk.Application
|
||||
/**
|
||||
* Setup the camera listed in GSettings.
|
||||
*/
|
||||
- public void setup_camera ()
|
||||
+ public void create_camera ()
|
||||
{
|
||||
var effects = this.lookup_action ("effects") as SimpleAction;
|
||||
var mode = this.lookup_action ("mode") as SimpleAction;
|
||||
@@ -280,19 +282,6 @@ public class Cheese.Application : Gtk.Application
|
||||
settings.get_int ("photo-x-resolution"),
|
||||
settings.get_int ("photo-y-resolution"));
|
||||
|
||||
- try
|
||||
- {
|
||||
- camera.setup (device);
|
||||
- }
|
||||
- catch (Error err)
|
||||
- {
|
||||
- video_preview.hide ();
|
||||
- message ("Error during camera setup: %s\n", err.message);
|
||||
- main_window.show_error (err.message);
|
||||
-
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
double value;
|
||||
|
||||
value = settings.get_double ("brightness");
|
||||
@@ -321,7 +310,6 @@ public class Cheese.Application : Gtk.Application
|
||||
|
||||
camera.state_flags_changed.connect (on_camera_state_flags_changed);
|
||||
main_window.set_camera (camera);
|
||||
- camera.play ();
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
|
||||
index 2f2d679..5bd2ced 100644
|
||||
--- a/src/cheese-preferences.vala
|
||||
+++ b/src/cheese-preferences.vala
|
||||
@@ -113,6 +113,28 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Signal raised when there is an error with the camera device
|
||||
+ */
|
||||
+ public signal void camera_error (string? error);
|
||||
+
|
||||
+ /**
|
||||
+ * Start playing video from the camera
|
||||
+ */
|
||||
+ public void camera_play ()
|
||||
+ {
|
||||
+ try
|
||||
+ {
|
||||
+ camera.setup (null);
|
||||
+ camera.play ();
|
||||
+ camera_changed ();
|
||||
+ }
|
||||
+ catch (Error err)
|
||||
+ {
|
||||
+ camera_error (err.message);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
* Set up combo box cell renderers.
|
||||
*/
|
||||
private void setup_combo_box_models ()
|
||||
@@ -163,8 +185,6 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
source_combo.sensitive = false;
|
||||
|
||||
devices.foreach(add_camera_device);
|
||||
-
|
||||
- camera_changed ();
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/src/vapi/cheese-common.vapi b/src/vapi/cheese-common.vapi
|
||||
index 26e12a2..cd8a71c 100644
|
||||
--- a/src/vapi/cheese-common.vapi
|
||||
+++ b/src/vapi/cheese-common.vapi
|
||||
@@ -49,7 +49,7 @@ namespace Cheese
|
||||
public void toggle_effects_pipeline (bool active);
|
||||
public void connect_effect_texture (Cheese.Effect effect, Clutter.Texture texture);
|
||||
public void set_video_format (Cheese.VideoFormat format);
|
||||
- public void setup (string udi) throws GLib.Error;
|
||||
+ public void setup (string? udi) throws GLib.Error;
|
||||
public void start_video_recording (string filename);
|
||||
public void stop ();
|
||||
public void stop_video_recording ();
|
||||
--
|
||||
1.8.3.1
|
||||
|
108
0008-cheese-Properly-deal-with-going-from-0-1-devices.patch
Normal file
108
0008-cheese-Properly-deal-with-going-from-0-1-devices.patch
Normal file
@ -0,0 +1,108 @@
|
||||
From 55491c023d2d08795c156beb0a43ae8292d74a49 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 18 Jun 2013 11:59:55 +0200
|
||||
Subject: [PATCH 08/13] cheese: Properly deal with going from 0 -> 1 devices
|
||||
|
||||
Before this patch cheese showed a "No device found" message when started
|
||||
without any devices connected, and would keep showing this after the user
|
||||
plugged in a webcam. The new cam also could not be selected from the
|
||||
preferences dialog.
|
||||
|
||||
After this patch cheese will automatically switch to showing video from a
|
||||
newly plugged in webcam (when it had no devices before).
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-application.vala | 1 +
|
||||
src/cheese-preferences.vala | 28 +++++++++++++++++++++++++---
|
||||
2 files changed, 26 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-application.vala b/src/cheese-application.vala
|
||||
index b0d0dbe..be4837e 100644
|
||||
--- a/src/cheese-application.vala
|
||||
+++ b/src/cheese-application.vala
|
||||
@@ -367,6 +367,7 @@ public class Cheese.Application : Gtk.Application
|
||||
mode.set_enabled (false);
|
||||
shoot.set_enabled (false);
|
||||
|
||||
+ preferences_dialog.camera_stop ();
|
||||
main_window.camera_state_change_null ();
|
||||
break;
|
||||
default:
|
||||
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
|
||||
index 5bd2ced..04a77ac 100644
|
||||
--- a/src/cheese-preferences.vala
|
||||
+++ b/src/cheese-preferences.vala
|
||||
@@ -25,6 +25,8 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
{
|
||||
private Cheese.Camera camera;
|
||||
private bool camera_controls_sensitive;
|
||||
+ private bool camera_is_setup;
|
||||
+ private bool camera_is_playing;
|
||||
|
||||
private GLib.Settings settings;
|
||||
|
||||
@@ -124,8 +126,16 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
{
|
||||
try
|
||||
{
|
||||
- camera.setup (null);
|
||||
- camera.play ();
|
||||
+ if (!camera_is_setup)
|
||||
+ {
|
||||
+ camera.setup (null);
|
||||
+ camera_is_setup = true;
|
||||
+ }
|
||||
+ if (!camera_is_playing)
|
||||
+ {
|
||||
+ camera.play ();
|
||||
+ camera_is_playing = true;
|
||||
+ }
|
||||
camera_changed ();
|
||||
}
|
||||
catch (Error err)
|
||||
@@ -135,6 +145,14 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Call this when the gstreamer pipe transitions to NULL
|
||||
+ */
|
||||
+ public void camera_stop ()
|
||||
+ {
|
||||
+ camera_is_playing = false;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
* Set up combo box cell renderers.
|
||||
*/
|
||||
private void setup_combo_box_models ()
|
||||
@@ -270,7 +288,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
combo.model.get (iter, 1, out dev);
|
||||
camera.set_device_by_device_node (dev.get_device_node ());
|
||||
camera.switch_camera_device ();
|
||||
- camera_changed ();
|
||||
+ camera_play ();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -531,6 +549,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
{
|
||||
TreeIter iter;
|
||||
Cheese.CameraDevice dev = (Cheese.CameraDevice) device;
|
||||
+ bool was_empty = camera_model.iter_n_children (null) == 0;
|
||||
|
||||
camera_model.append (out iter);
|
||||
camera_model.set (iter,
|
||||
@@ -539,6 +558,9 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
|
||||
if (camera_model.iter_n_children (null) > 1 && camera_controls_sensitive)
|
||||
source_combo.sensitive = true;
|
||||
+
|
||||
+ if (was_empty)
|
||||
+ source_combo.set_active_iter (iter);
|
||||
}
|
||||
|
||||
/**
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,56 @@
|
||||
From 632e0253bf899a40c5f90a0584fad936189be821 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 18 Jun 2013 13:45:38 +0200
|
||||
Subject: [PATCH 09/13] cheese: Avoid unnecessary calls to
|
||||
switch_camera_device()
|
||||
|
||||
And thus avoid stopping and restarting the stream for no reason.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-preferences.vala | 12 ++++++++++--
|
||||
1 file changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
|
||||
index 04a77ac..e962062 100644
|
||||
--- a/src/cheese-preferences.vala
|
||||
+++ b/src/cheese-preferences.vala
|
||||
@@ -27,6 +27,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
private bool camera_controls_sensitive;
|
||||
private bool camera_is_setup;
|
||||
private bool camera_is_playing;
|
||||
+ private string camera_device_node;
|
||||
|
||||
private GLib.Settings settings;
|
||||
|
||||
@@ -180,7 +181,8 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
device = camera.get_selected_device ();
|
||||
if (device == null)
|
||||
return;
|
||||
- settings.set_string ("camera", device.get_device_node ());
|
||||
+ camera_device_node = device.get_device_node ();
|
||||
+ settings.set_string ("camera", camera_device_node);
|
||||
setup_resolutions_for_device (device);
|
||||
|
||||
for (bool next = camera_model.get_iter_first (out iter); next;
|
||||
@@ -283,10 +285,16 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
|
||||
TreeIter iter;
|
||||
Cheese.CameraDevice dev;
|
||||
+ string dev_node;
|
||||
|
||||
combo.get_active_iter (out iter);
|
||||
combo.model.get (iter, 1, out dev);
|
||||
- camera.set_device_by_device_node (dev.get_device_node ());
|
||||
+ dev_node = dev.get_device_node ();
|
||||
+
|
||||
+ if (dev_node == camera_device_node)
|
||||
+ return;
|
||||
+
|
||||
+ camera.set_device_by_device_node (dev_node);
|
||||
camera.switch_camera_device ();
|
||||
camera_play ();
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,30 @@
|
||||
From ec54a4dcbe7b814ab7b8ee60a44faefc091a3f96 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 18 Jun 2013 14:01:45 +0200
|
||||
Subject: [PATCH 10/13] on_camera_update_num_camera_devices: Remove unnecessary
|
||||
camera_changed() call
|
||||
|
||||
If the camera is actually changed then camera_changed already gets called
|
||||
from either camera_play() or on_source_change().
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-preferences.vala | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
|
||||
index e962062..2120432 100644
|
||||
--- a/src/cheese-preferences.vala
|
||||
+++ b/src/cheese-preferences.vala
|
||||
@@ -541,8 +541,6 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
remove_camera_device (iter, old_device, active_device);
|
||||
}
|
||||
}
|
||||
-
|
||||
- camera_changed ();
|
||||
}
|
||||
|
||||
/**
|
||||
--
|
||||
1.8.3.1
|
||||
|
72
0011-cheese-preferences-Simplify-remove_camera_device.patch
Normal file
72
0011-cheese-preferences-Simplify-remove_camera_device.patch
Normal file
@ -0,0 +1,72 @@
|
||||
From 7be2bcd05f80ffa8ee5ec7847a527ac07b6f8b87 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 19 Jun 2013 16:47:41 +0200
|
||||
Subject: [PATCH 11/13] cheese-preferences: Simplify remove_camera_device
|
||||
|
||||
Now that we cache the device-node for the active camera, remove_camera_device
|
||||
and its callers can be simplified.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-preferences.vala | 19 ++++++-------------
|
||||
1 file changed, 6 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
|
||||
index 2120432..faf6877 100644
|
||||
--- a/src/cheese-preferences.vala
|
||||
+++ b/src/cheese-preferences.vala
|
||||
@@ -508,12 +508,6 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
TreeIter iter;
|
||||
camera_model.get_iter_first (out iter);
|
||||
|
||||
- // Combobox active element.
|
||||
- TreeIter active_iter;
|
||||
- Cheese.CameraDevice active_device;
|
||||
- source_combo.get_active_iter (out active_iter);
|
||||
- camera_model.get (active_iter, 1, out active_device, -1);
|
||||
-
|
||||
// Find which device was removed.
|
||||
bool device_removed = false;
|
||||
devices.foreach ((device) =>
|
||||
@@ -525,7 +519,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
// Found the device that was removed.
|
||||
if (strcmp (old_device.device_node, new_device.device_node) != 0)
|
||||
{
|
||||
- remove_camera_device (iter, new_device, active_device);
|
||||
+ remove_camera_device (iter, new_device);
|
||||
device_removed = true;
|
||||
// Remember, this is from the anonymous function!
|
||||
return;
|
||||
@@ -538,7 +532,7 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
{
|
||||
Cheese.CameraDevice old_device;
|
||||
camera_model.get (iter, 1, out old_device, -1);
|
||||
- remove_camera_device (iter, old_device, active_device);
|
||||
+ remove_camera_device (iter, old_device);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -573,16 +567,15 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
* Remove the supplied camera device from the device combo box model.
|
||||
*
|
||||
* @param iter the iterator of the device to remove
|
||||
- * @param device_node the device to remove from the combo box model
|
||||
- * @param active_device_node the currently-active camera device
|
||||
+ * @param device the device to remove from the combo box model
|
||||
*/
|
||||
- private void remove_camera_device (TreeIter iter, Cheese.CameraDevice device_node,
|
||||
- Cheese.CameraDevice active_device_node)
|
||||
+ private void remove_camera_device (TreeIter iter,
|
||||
+ Cheese.CameraDevice device)
|
||||
{
|
||||
unowned GLib.PtrArray devices = camera.get_camera_devices ();
|
||||
|
||||
// Check if the camera that we want to remove, is the active one
|
||||
- if (strcmp (device_node.device_node, active_device_node.device_node) == 0)
|
||||
+ if (device.device_node == camera_device_node)
|
||||
{
|
||||
if (devices.len > 0)
|
||||
set_new_available_camera_device (iter);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,66 @@
|
||||
From 51ff0d863bc0e160094ec684018ee0068b7b612a Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 19 Jun 2013 17:29:28 +0200
|
||||
Subject: [PATCH 12/13] cheese-preferences: Cleanly handle going from 1 -> 0
|
||||
devices
|
||||
|
||||
Cleanly handle going from 1 -> 0 devices and going from 1 -> 0 -> 1 devices.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-preferences.vala | 26 +++++++++++++++-----------
|
||||
1 file changed, 15 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
|
||||
index faf6877..cad7eba 100644
|
||||
--- a/src/cheese-preferences.vala
|
||||
+++ b/src/cheese-preferences.vala
|
||||
@@ -280,13 +280,13 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
[CCode (instance_pos = -1)]
|
||||
public void on_source_change (Gtk.ComboBox combo)
|
||||
{
|
||||
- // TODO: Handle going from 1 to 0 devices, cleanly!
|
||||
- return_if_fail (camera.num_camera_devices > 0);
|
||||
-
|
||||
TreeIter iter;
|
||||
Cheese.CameraDevice dev;
|
||||
string dev_node;
|
||||
|
||||
+ if (combo.get_active () == -1)
|
||||
+ return;
|
||||
+
|
||||
combo.get_active_iter (out iter);
|
||||
combo.model.get (iter, 1, out dev);
|
||||
dev_node = dev.get_device_node ();
|
||||
@@ -572,16 +572,20 @@ public class Cheese.PreferencesDialog : GLib.Object
|
||||
private void remove_camera_device (TreeIter iter,
|
||||
Cheese.CameraDevice device)
|
||||
{
|
||||
- unowned GLib.PtrArray devices = camera.get_camera_devices ();
|
||||
-
|
||||
- // Check if the camera that we want to remove, is the active one
|
||||
- if (device.device_node == camera_device_node)
|
||||
+ if (camera.num_camera_devices == 0) /* Last camera gone? */
|
||||
{
|
||||
- if (devices.len > 0)
|
||||
- set_new_available_camera_device (iter);
|
||||
- else
|
||||
- this.dialog.hide();
|
||||
+ ListStore resolution_model = new ListStore (2, typeof (string),
|
||||
+ typeof (Cheese.VideoFormat));
|
||||
+ photo_resolution_combo.model = resolution_model;
|
||||
+ video_resolution_combo.model = resolution_model;
|
||||
+ camera_device_node = "";
|
||||
+ camera_error(_("No device found"));
|
||||
}
|
||||
+ else if (device.device_node == camera_device_node)
|
||||
+ {
|
||||
+ set_new_available_camera_device (iter);
|
||||
+ }
|
||||
+
|
||||
camera_model.remove (iter);
|
||||
|
||||
if (camera_model.iter_n_children (null) <= 1)
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,48 @@
|
||||
From 462287f28f87c5dd9f30f734132b5c6193a1daa1 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 3 Sep 2013 15:39:49 +0200
|
||||
Subject: [PATCH 13/13] cheese-window: Disable effect switching buttons on
|
||||
webcam error
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/cheese-window.vala | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
|
||||
index 07cf0f4..bc2d3b7 100644
|
||||
--- a/src/cheese-window.vala
|
||||
+++ b/src/cheese-window.vala
|
||||
@@ -1030,9 +1030,11 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
var effects_next = this.lookup_action ("effects-next") as SimpleAction;
|
||||
var effects_previous = this.lookup_action ("effects-previous") as SimpleAction;
|
||||
|
||||
- effects_next.set_enabled (is_effects_selector_active
|
||||
+ effects_next.set_enabled (!error_layer.visible
|
||||
+ && is_effects_selector_active
|
||||
&& current_effects_page != effects_manager.effects.length () / EFFECTS_PER_PAGE);
|
||||
- effects_previous.set_enabled (is_effects_selector_active
|
||||
+ effects_previous.set_enabled (!error_layer.visible
|
||||
+ && is_effects_selector_active
|
||||
&& current_effects_page != 0);
|
||||
}
|
||||
|
||||
@@ -1151,6 +1153,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
public void camera_state_change_playing ()
|
||||
{
|
||||
show_error (null);
|
||||
+ setup_effects_page_switch_sensitivity ();
|
||||
|
||||
Effect effect = effects_manager.get_effect (settings.get_string ("selected-effect"));
|
||||
if (effect != null)
|
||||
@@ -1169,6 +1172,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
|
||||
{
|
||||
show_error (_("There was an error playing video from the webcam"));
|
||||
}
|
||||
+ setup_effects_page_switch_sensitivity ();
|
||||
}
|
||||
|
||||
/**
|
||||
--
|
||||
1.8.3.1
|
||||
|
46
cheese.spec
46
cheese.spec
@ -1,7 +1,7 @@
|
||||
Name: cheese
|
||||
Epoch: 2
|
||||
Version: 3.9.91
|
||||
Release: 2%{?dist}
|
||||
Release: 3%{?dist}
|
||||
Summary: Application for taking pictures and movies from a webcam
|
||||
|
||||
Group: Amusements/Graphics
|
||||
@ -12,6 +12,24 @@ Source0: http://download.gnome.org/sources/cheese/3.9/%{name}-%{version}.
|
||||
# https://bugzilla.gnome.org/show_bug.cgi?id=678447
|
||||
# Patch2: 0002-Setup-vp8enc-in-a-way-suitable-for-realtime-encoding.patch
|
||||
|
||||
# https://bugzilla.gnome.org/show_bug.cgi?id=707386
|
||||
Patch1: 0001-cheese-Don-t-allow-changing-the-camera-and-or-its-re.patch
|
||||
Patch2: 0002-cheese-window-Add-cancel_running_action-method.patch
|
||||
# https://bugzilla.gnome.org/show_bug.cgi?id=707387
|
||||
Patch3: 0003-cheese-window-Allow-changing-effects-while-shooting-.patch
|
||||
# https://bugzilla.gnome.org/show_bug.cgi?id=707391
|
||||
Patch4: 0004-cheese-camera-Fix-video-recording-with-gstreamer-1.1.patch
|
||||
# https://bugzilla.gnome.org/show_bug.cgi?id=603612
|
||||
Patch5: 0005-cheese-preferences-Add-camera_changed-method.patch
|
||||
Patch6: 0006-cheese_camera_get_camera_devices-Allow-calling-befor.patch
|
||||
Patch7: 0007-cheese-Move-camera_setup-to-cheese-preferences.patch
|
||||
Patch8: 0008-cheese-Properly-deal-with-going-from-0-1-devices.patch
|
||||
Patch9: 0009-cheese-Avoid-unnecessary-calls-to-switch_camera_devi.patch
|
||||
Patch10: 0010-on_camera_update_num_camera_devices-Remove-unnecessa.patch
|
||||
Patch11: 0011-cheese-preferences-Simplify-remove_camera_device.patch
|
||||
Patch12: 0012-cheese-preferences-Cleanly-handle-going-from-1-0-dev.patch
|
||||
Patch13: 0013-cheese-window-Disable-effect-switching-buttons-on-we.patch
|
||||
|
||||
BuildRequires: gtk3-devel >= 3.0.0
|
||||
BuildRequires: gstreamer1-devel
|
||||
BuildRequires: gstreamer1-plugins-bad-free-devel
|
||||
@ -67,7 +85,19 @@ for writing applications that require a webcam display widget.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
# %patch2 -p1
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
%patch6 -p1
|
||||
%patch7 -p1
|
||||
%patch8 -p1
|
||||
%patch9 -p1
|
||||
%patch10 -p1
|
||||
%patch11 -p1
|
||||
%patch12 -p1
|
||||
%patch13 -p1
|
||||
|
||||
|
||||
%build
|
||||
@ -141,6 +171,14 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
|
||||
%{_datadir}/gir-1.0/Cheese-3.0.gir
|
||||
|
||||
%changelog
|
||||
* Thu Sep 12 2013 Hans de Goede <hdegoede@redhat.com> - 2:3.9.91-3
|
||||
- In F-19 we had a long list of bugfix patches, most of these have been merged
|
||||
into gnome-3.10 but not all have been merged yet, re-add the non merged ones
|
||||
- Fix video recording not working
|
||||
- Allow changing effects while recording
|
||||
- Disallow changing camera settings while recording
|
||||
- Fix cheese misbehavior when going from 0 -> 1 or 1 -> 0 camera devices
|
||||
|
||||
* Tue Sep 03 2013 Kalev Lember <kalevlember@gmail.com> - 2:3.9.91-2
|
||||
- Rebuilt for libgnome-desktop soname bump
|
||||
|
||||
@ -373,7 +411,7 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
|
||||
* Thu Aug 19 2010 Matthias Clasen <mclasen@redhat.com> 1:2.31.90-1
|
||||
- Update to 2.31.90
|
||||
|
||||
* Fri Aug 11 2010 Matthias Clasen <mclasen@redhat.com> 1:2.31.1-2
|
||||
* Wed Aug 11 2010 Matthias Clasen <mclasen@redhat.com> 1:2.31.1-2
|
||||
- Add an epoch to stay ahead of F14
|
||||
|
||||
* Fri Aug 6 2010 Matthias Clasen <mclasen@redhat.com> 2.31.1-1
|
||||
@ -473,7 +511,7 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
|
||||
* Wed Dec 3 2008 Matthias Clasen <mclasen@redhat.com> 2.25.2-1
|
||||
- Update to 2.25.2
|
||||
|
||||
* Thu Nov 21 2008 Matthias Clasen <mclasen@redhat.com> 2.25.1-4
|
||||
* Fri Nov 21 2008 Matthias Clasen <mclasen@redhat.com> 2.25.1-4
|
||||
- Better URL
|
||||
|
||||
* Thu Nov 13 2008 Matthias Clasen <mclasen@redhat.com> 2.25.1-3
|
||||
|
Loading…
Reference in New Issue
Block a user