[cheese] move cheese-webcam to libcheese



commit 25e9e367bfce76904205c1c6b5e88217e719fe7b
Author: daniel g. siegel <siegel in tum de>
Date:   Tue Dec 1 00:53:36 2009 +0100

    move cheese-webcam to libcheese
    
    moved the camera specific code to libcheese, which will be
    the heart of cheese for the future. we also change the term
    webcam in favor of camera, as it is easier to understand

 .gitignore                                         |    3 +
 Makefile.am                                        |    2 +-
 configure.ac                                       |    1 +
 data/cheese.schemas.in                             |   16 +-
 libcheese/Makefile.am                              |   23 +
 src/cheese-webcam.c => libcheese/cheese-camera.c   |  552 ++++++++++----------
 libcheese/cheese-camera.h                          |  128 +++++
 src/Makefile.am                                    |   35 +-
 src/cheese-effect-chooser.c                        |   34 +-
 src/cheese-effect-chooser.h                        |    6 +-
 src/cheese-flash.c                                 |    3 +-
 src/cheese-gconf.c                                 |   14 +-
 src/cheese-gconf.h                                 |    4 +-
 src/cheese-prefs-balance-scale.c                   |   34 +-
 src/cheese-prefs-balance-scale.h                   |    4 +-
 src/cheese-prefs-burst-spinbox.h                   |    2 +-
 ...-webcam-combo.c => cheese-prefs-camera-combo.c} |  164 +++---
 src/cheese-prefs-camera-combo.h                    |   60 +++
 src/cheese-prefs-dialog.c                          |   58 +-
 src/cheese-prefs-dialog.h                          |    6 +-
 src/cheese-prefs-resolution-combo.c                |   34 +-
 src/cheese-prefs-resolution-combo.h                |    4 +-
 src/cheese-prefs-webcam-combo.h                    |   60 ---
 src/cheese-webcam.h                                |  128 -----
 src/cheese-window.c                                |   92 ++--
 25 files changed, 749 insertions(+), 718 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 33a6323..acdf6da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
 *.o
+*.la
+*.lo
 *.desktop
 *.desktop.in
 *.gmo
@@ -11,6 +13,7 @@ cheese-dbus-infos.h
 xmldocs.make
 src/cheese
 .deps
+.libs
 install-sh
 libtool
 omf-make
diff --git a/Makefile.am b/Makefile.am
index 3a3f9ee..b5b9889 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = src po data help
+SUBDIRS = libcheese src po data help
 
 EXTRA_DIST =			\
 	$(cheesedoc_DATA)	\
diff --git a/configure.ac b/configure.ac
index c065569..1ee7ff9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -150,6 +150,7 @@ data/icons/48x48/actions/Makefile
 data/icons/scalable/actions/Makefile
 data/pixmaps/Makefile
 help/Makefile
+libcheese/Makefile
 src/Makefile
 po/Makefile.in
 ])
diff --git a/data/cheese.schemas.in b/data/cheese.schemas.in
index 4b26be3..0d1a754 100644
--- a/data/cheese.schemas.in
+++ b/data/cheese.schemas.in
@@ -13,14 +13,14 @@
     </schema>
 
     <schema>
-      <key>/schemas/apps/cheese/webcam</key>
-      <applyto>/apps/cheese/webcam</applyto>
+      <key>/schemas/apps/cheese/camera</key>
+      <applyto>/apps/cheese/camera</applyto>
       <owner>cheese</owner>
       <type>string</type>
       <default></default>
       <locale name="C">
-        <short>Webcam device string indicator</short>
-        <long>The device which points to the webcam (e.g. /dev/video0)</long>
+        <short>Camera device string indicator</short>
+        <long>The device which points to the camera (e.g. /dev/video0)</long>
       </locale>
     </schema>
 
@@ -73,7 +73,7 @@
       <default>0</default>
       <locale name="C">
         <short>Picture brightness</short>
-        <long>Adjusts brightness level of the picture coming from the webcam</long>
+        <long>Adjusts brightness level of the picture coming from the camera</long>
       </locale>
     </schema>
 
@@ -85,7 +85,7 @@
       <default>1</default>
       <locale name="C">
         <short>Picture contrast</short>
-        <long>Adjusts contrast level of the picture coming from the webcam</long>
+        <long>Adjusts contrast level of the picture coming from the camera</long>
       </locale>
     </schema>
 
@@ -97,7 +97,7 @@
       <default>1</default>
       <locale name="C">
         <short>Picture saturation</short>
-        <long>Adjusts saturation level of the picture coming from the webcam</long>
+        <long>Adjusts saturation level of the picture coming from the camera</long>
       </locale>
     </schema>
 
@@ -109,7 +109,7 @@
       <default>0</default>
       <locale name="C">
         <short>Picture hue</short>
-        <long>Adjusts hue level of the picture coming from the webcam</long>
+        <long>Adjusts hue level of the picture coming from the camera</long>
       </locale>
     </schema>
 
diff --git a/libcheese/Makefile.am b/libcheese/Makefile.am
new file mode 100644
index 0000000..f906ef6
--- /dev/null
+++ b/libcheese/Makefile.am
@@ -0,0 +1,23 @@
+libcheese_la_CFLAGS = \
+	-DDATADIR=\"$(datadir)\" \
+	-DPREFIX=\""$(prefix)"\" \
+	-DSYSCONFDIR=\""$(sysconfdir)"\" \
+	-DLIBDIR=\""$(libdir)"\" \
+	-DPACKAGE_DATADIR=\""$(datadir)/cheese"\" \
+	-DPACKAGE_LOCALEDIR=\""$(datadir)/locale"\" \
+	-DAPPNAME_DATA_DIR=\"$(pkgdatadir)\" \
+	-DGNOME_DESKTOP_USE_UNSTABLE_API=1 \
+	$(CHEESE_CFLAGS)
+
+lib_LTLIBRARIES = libcheese.la
+
+libcheese_la_CFLAGS = $(CHEESE_CFLAGS)
+
+libcheese_la_SOURCES = \
+	cheese-camera.c \
+	$(NULL)
+
+include_HEADERS = cheese-camera.h
+
+libcheese_la_LIBADD = \
+	$(CHEESE_LIBS)
diff --git a/src/cheese-webcam.c b/libcheese/cheese-camera.c
similarity index 73%
rename from src/cheese-webcam.c
rename to libcheese/cheese-camera.c
index 00046cd..a45c1db 100644
--- a/src/cheese-webcam.c
+++ b/libcheese/cheese-camera.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2007,2008 Jaap Haitsma <jaap haitsma org>
- * Copyright © 2007,2008 daniel g. siegel <dgsiegel gnome org>
+ * Copyright © 2007-2009 daniel g. siegel <dgsiegel gnome org>
  * Copyright © 2008 Ryan Zeigler <zeiglerr gmail com>
  *
  * Licensed under the GNU General Public License Version 2
@@ -39,22 +39,22 @@
 #include <sys/ioctl.h>
 #include <linux/videodev.h>
 
-#include "cheese-webcam.h"
+#include "cheese-camera.h"
 
-G_DEFINE_TYPE (CheeseWebcam, cheese_webcam, G_TYPE_OBJECT)
+G_DEFINE_TYPE (CheeseCamera, cheese_camera, G_TYPE_OBJECT)
 
-#define CHEESE_WEBCAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CHEESE_TYPE_WEBCAM, CheeseWebcamPrivate))
+#define CHEESE_CAMERA_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CHEESE_TYPE_CAMERA, CheeseCameraPrivate))
 
-#define CHEESE_WEBCAM_ERROR cheese_webcam_error_quark ()
+#define CHEESE_CAMERA_ERROR cheese_camera_error_quark ()
 
 #define MIN_DEFAULT_RATE 15.0
 
 static void find_highest_framerate (CheeseVideoFormat *format);
 
-enum CheeseWebcamError
+enum CheeseCameraError
 {
-  CHEESE_WEBCAM_ERROR_UNKNOWN,
-  CHEESE_WEBCAM_ERROR_ELEMENT_NOT_FOUND
+  CHEESE_CAMERA_ERROR_UNKNOWN,
+  CHEESE_CAMERA_ERROR_ELEMENT_NOT_FOUND
 };
 
 typedef struct
@@ -65,7 +65,7 @@ typedef struct
   GstBus *bus;
 
   /* We build the active pipeline by linking the appropriate pipelines listed below*/
-  GstElement *webcam_source_bin;
+  GstElement *camera_source_bin;
   GstElement *video_display_bin;
   GstElement *photo_save_bin;
   GstElement *video_save_bin;
@@ -87,16 +87,16 @@ typedef struct
   gboolean pipeline_is_playing;
   char *photo_filename;
 
-  int num_webcam_devices;
+  int num_camera_devices;
   char *device_name;
-  CheeseWebcamDevice *webcam_devices;
+  CheeseCameraDevice *camera_devices;
   int x_resolution;
   int y_resolution;
   int selected_device;
   CheeseVideoFormat *current_format;
 
   guint eos_timeout_id;
-} CheeseWebcamPrivate;
+} CheeseCameraPrivate;
 
 enum
 {
@@ -114,7 +114,7 @@ enum
   LAST_SIGNAL
 };
 
-static guint webcam_signals[LAST_SIGNAL];
+static guint camera_signals[LAST_SIGNAL];
 
 typedef enum
 {
@@ -124,39 +124,39 @@ typedef enum
 
 typedef struct
 {
-  CheeseWebcamEffect effect;
+  CheeseCameraEffect effect;
   const char *pipeline_desc;
   VideoColorSpace colorspace; /* The color space the effect works in */
 } EffectToPipelineDesc;
 
 
 static const EffectToPipelineDesc EFFECT_TO_PIPELINE_DESC[] = {
-  {CHEESE_WEBCAM_EFFECT_NO_EFFECT,       "identity",                             RGB},
-  {CHEESE_WEBCAM_EFFECT_MAUVE,           "videobalance saturation=1.5 hue=+0.5", YUV},
-  {CHEESE_WEBCAM_EFFECT_NOIR_BLANC,      "videobalance saturation=0",            YUV},
-  {CHEESE_WEBCAM_EFFECT_SATURATION,      "videobalance saturation=2",            YUV},
-  {CHEESE_WEBCAM_EFFECT_HULK,            "videobalance saturation=1.5 hue=-0.5", YUV},
-  {CHEESE_WEBCAM_EFFECT_VERTICAL_FLIP,   "videoflip method=5",                   YUV},
-  {CHEESE_WEBCAM_EFFECT_HORIZONTAL_FLIP, "videoflip method=4",                   YUV},
-  {CHEESE_WEBCAM_EFFECT_SHAGADELIC,      "shagadelictv",                         RGB},
-  {CHEESE_WEBCAM_EFFECT_VERTIGO,         "vertigotv",                            RGB},
-  {CHEESE_WEBCAM_EFFECT_EDGE,            "edgetv",                               RGB},
-  {CHEESE_WEBCAM_EFFECT_DICE,            "dicetv",                               RGB},
-  {CHEESE_WEBCAM_EFFECT_WARP,            "warptv",                               RGB}
+  {CHEESE_CAMERA_EFFECT_NO_EFFECT,       "identity",                             RGB},
+  {CHEESE_CAMERA_EFFECT_MAUVE,           "videobalance saturation=1.5 hue=+0.5", YUV},
+  {CHEESE_CAMERA_EFFECT_NOIR_BLANC,      "videobalance saturation=0",            YUV},
+  {CHEESE_CAMERA_EFFECT_SATURATION,      "videobalance saturation=2",            YUV},
+  {CHEESE_CAMERA_EFFECT_HULK,            "videobalance saturation=1.5 hue=-0.5", YUV},
+  {CHEESE_CAMERA_EFFECT_VERTICAL_FLIP,   "videoflip method=5",                   YUV},
+  {CHEESE_CAMERA_EFFECT_HORIZONTAL_FLIP, "videoflip method=4",                   YUV},
+  {CHEESE_CAMERA_EFFECT_SHAGADELIC,      "shagadelictv",                         RGB},
+  {CHEESE_CAMERA_EFFECT_VERTIGO,         "vertigotv",                            RGB},
+  {CHEESE_CAMERA_EFFECT_EDGE,            "edgetv",                               RGB},
+  {CHEESE_CAMERA_EFFECT_DICE,            "dicetv",                               RGB},
+  {CHEESE_CAMERA_EFFECT_WARP,            "warptv",                               RGB}
 };
 
 static const int NUM_EFFECTS = G_N_ELEMENTS (EFFECT_TO_PIPELINE_DESC);
 
 GQuark
-cheese_webcam_error_quark (void)
+cheese_camera_error_quark (void)
 {
-  return g_quark_from_static_string ("cheese-webcam-error-quark");
+  return g_quark_from_static_string ("cheese-camera-error-quark");
 }
 
 static GstBusSyncReply
-cheese_webcam_bus_sync_handler (GstBus *bus, GstMessage *message, CheeseWebcam *webcam)
+cheese_camera_bus_sync_handler (GstBus *bus, GstMessage *message, CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
   GstXOverlay         *overlay;
 
   if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
@@ -180,13 +180,13 @@ cheese_webcam_bus_sync_handler (GstBus *bus, GstMessage *message, CheeseWebcam *
 }
 
 static void
-cheese_webcam_change_sink (CheeseWebcam *webcam, GstElement *src,
+cheese_camera_change_sink (CheeseCamera *camera, GstElement *src,
                            GstElement *new_sink, GstElement *old_sink)
 {
-  CheeseWebcamPrivate *priv       = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv       = CHEESE_CAMERA_GET_PRIVATE (camera);
   gboolean             is_playing = priv->pipeline_is_playing;
 
-  cheese_webcam_stop (webcam);
+  cheese_camera_stop (camera);
 
   gst_element_unlink (src, old_sink);
   gst_object_ref (old_sink);
@@ -196,13 +196,13 @@ cheese_webcam_change_sink (CheeseWebcam *webcam, GstElement *src,
   gst_element_link (src, new_sink);
 
   if (is_playing)
-    cheese_webcam_play (webcam);
+    cheese_camera_play (camera);
 }
 
 static gboolean
-cheese_webcam_expose_cb (GtkWidget *widget, GdkEventExpose *event, CheeseWebcam *webcam)
+cheese_camera_expose_cb (GtkWidget *widget, GdkEventExpose *event, CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
   GstState             state;
   GstXOverlay         *overlay = GST_X_OVERLAY (gst_bin_get_by_interface (GST_BIN (priv->pipeline),
                                                                           GST_TYPE_X_OVERLAY));
@@ -223,10 +223,10 @@ cheese_webcam_expose_cb (GtkWidget *widget, GdkEventExpose *event, CheeseWebcam
 }
 
 static void
-cheese_webcam_photo_data_cb (GstElement *element, GstBuffer *buffer,
-                             GstPad *pad, CheeseWebcam *webcam)
+cheese_camera_photo_data_cb (GstElement *element, GstBuffer *buffer,
+                             GstPad *pad, CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   GstCaps            *caps;
   const GstStructure *structure;
@@ -251,13 +251,13 @@ cheese_webcam_photo_data_cb (GstElement *element, GstBuffer *buffer,
                                priv->photo_handler_signal_id);
   priv->photo_handler_signal_id = 0;
 
-  g_signal_emit (webcam, webcam_signals[PHOTO_SAVED], 0);
+  g_signal_emit (camera, camera_signals[PHOTO_SAVED], 0);
 }
 
 static void
-cheese_webcam_bus_message_cb (GstBus *bus, GstMessage *message, CheeseWebcam *webcam)
+cheese_camera_bus_message_cb (GstBus *bus, GstMessage *message, CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_EOS)
   {
@@ -267,9 +267,9 @@ cheese_webcam_bus_message_cb (GstBus *bus, GstMessage *message, CheeseWebcam *we
 
       g_source_remove (priv->eos_timeout_id);
 
-      g_signal_emit (webcam, webcam_signals[VIDEO_SAVED], 0);
+      g_signal_emit (camera, camera_signals[VIDEO_SAVED], 0);
 
-      cheese_webcam_change_sink (webcam, priv->video_display_bin,
+      cheese_camera_change_sink (camera, priv->video_display_bin,
                                  priv->photo_save_bin, priv->video_save_bin);
       priv->is_recording = FALSE;
     }
@@ -277,9 +277,9 @@ cheese_webcam_bus_message_cb (GstBus *bus, GstMessage *message, CheeseWebcam *we
 }
 
 static void
-cheese_webcam_get_video_devices_from_hal (CheeseWebcam *webcam)
+cheese_camera_get_video_devices_from_hal (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   int            i, fd, ok;
   int            num_udis = 0;
@@ -287,7 +287,7 @@ cheese_webcam_get_video_devices_from_hal (CheeseWebcam *webcam)
   DBusError      error;
   LibHalContext *hal_ctx;
 
-  priv->num_webcam_devices = 0;
+  priv->num_camera_devices = 0;
 
   g_print ("Probing devices with HAL...\n");
 
@@ -328,8 +328,8 @@ cheese_webcam_get_video_devices_from_hal (CheeseWebcam *webcam)
     goto fallback;
   }
 
-  /* Initialize webcam structures */
-  priv->webcam_devices = g_new0 (CheeseWebcamDevice, num_udis);
+  /* Initialize camera structures */
+  priv->camera_devices = g_new0 (CheeseCameraDevice, num_udis);
 
   for (i = 0; i < num_udis; i++)
   {
@@ -439,40 +439,40 @@ cheese_webcam_get_video_devices_from_hal (CheeseWebcam *webcam)
 
     g_print ("\n");
 
-    priv->webcam_devices[priv->num_webcam_devices].hal_udi           = g_strdup (udis[i]);
-    priv->webcam_devices[priv->num_webcam_devices].video_device      = g_strdup (device);
-    priv->webcam_devices[priv->num_webcam_devices].gstreamer_src     = g_strdup (gstreamer_src);
-    priv->webcam_devices[priv->num_webcam_devices].product_name      = g_strdup (product_name);
-    priv->webcam_devices[priv->num_webcam_devices].num_video_formats = 0;
-    priv->webcam_devices[priv->num_webcam_devices].video_formats     =
+    priv->camera_devices[priv->num_camera_devices].hal_udi           = g_strdup (udis[i]);
+    priv->camera_devices[priv->num_camera_devices].video_device      = g_strdup (device);
+    priv->camera_devices[priv->num_camera_devices].gstreamer_src     = g_strdup (gstreamer_src);
+    priv->camera_devices[priv->num_camera_devices].product_name      = g_strdup (product_name);
+    priv->camera_devices[priv->num_camera_devices].num_video_formats = 0;
+    priv->camera_devices[priv->num_camera_devices].video_formats     =
       g_array_new (FALSE, FALSE, sizeof (CheeseVideoFormat));
-    priv->webcam_devices[priv->num_webcam_devices].supported_resolutions =
+    priv->camera_devices[priv->num_camera_devices].supported_resolutions =
       g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
-    priv->num_webcam_devices++;
+    priv->num_camera_devices++;
 
     libhal_free_string (device);
     close (fd);
   }
   libhal_free_string_array (udis);
 
-  if (priv->num_webcam_devices == 0)
+  if (priv->num_camera_devices == 0)
   {
     /* Create a fake device so that resolution changing stil works even if the
-     * computer doesn't have a webcam. */
+     * computer doesn't have a camera. */
 fallback:
     if (num_udis == 0)
     {
-      priv->webcam_devices = g_new0 (CheeseWebcamDevice, 1);
+      priv->camera_devices = g_new0 (CheeseCameraDevice, 1);
     }
-    priv->webcam_devices[0].num_video_formats = 0;
-    priv->webcam_devices[0].video_formats     =
+    priv->camera_devices[0].num_video_formats = 0;
+    priv->camera_devices[0].video_formats     =
       g_array_new (FALSE, FALSE, sizeof (CheeseVideoFormat));
-    priv->webcam_devices[0].hal_udi = g_strdup ("cheese_fake_videodevice");
+    priv->camera_devices[0].hal_udi = g_strdup ("cheese_fake_videodevice");
   }
 }
 
 static void
-cheese_webcam_get_supported_framerates (CheeseVideoFormat *video_format, GstStructure *structure)
+cheese_camera_get_supported_framerates (CheeseVideoFormat *video_format, GstStructure *structure)
 {
   const GValue *framerates;
   int           i, j;
@@ -532,13 +532,13 @@ cheese_webcam_get_supported_framerates (CheeseVideoFormat *video_format, GstStru
 }
 
 static void
-cheese_webcam_add_video_format (CheeseWebcamDevice *webcam_device,
+cheese_camera_add_video_format (CheeseCameraDevice *camera_device,
                                 CheeseVideoFormat *video_format, GstStructure *format_structure)
 {
   int    i;
   gchar *resolution;
 
-  cheese_webcam_get_supported_framerates (video_format, format_structure);
+  cheese_camera_get_supported_framerates (video_format, format_structure);
   find_highest_framerate (video_format);
 
   g_print ("%s %d x %d num_framerates %d\n", video_format->mimetype, video_format->width,
@@ -552,12 +552,12 @@ cheese_webcam_add_video_format (CheeseWebcamDevice *webcam_device,
   resolution = g_strdup_printf ("%ix%i", video_format->width,
                                 video_format->height);
   i = GPOINTER_TO_INT (g_hash_table_lookup (
-                         webcam_device->supported_resolutions,
+                         camera_device->supported_resolutions,
                          resolution));
   if (i)   /* Resolution already added ? */
   {
     CheeseVideoFormat *curr_format = &g_array_index (
-      webcam_device->video_formats,
+      camera_device->video_formats,
       CheeseVideoFormat, i - 1);
     float new_framerate = (float) video_format->highest_framerate.numerator /
                           video_format->highest_framerate.denominator;
@@ -575,11 +575,11 @@ cheese_webcam_add_video_format (CheeseWebcamDevice *webcam_device,
     return;
   }
 
-  g_array_append_val (webcam_device->video_formats, *video_format);
-  g_hash_table_insert (webcam_device->supported_resolutions, resolution,
-                       GINT_TO_POINTER (webcam_device->num_video_formats + 1));
+  g_array_append_val (camera_device->video_formats, *video_format);
+  g_hash_table_insert (camera_device->supported_resolutions, resolution,
+                       GINT_TO_POINTER (camera_device->num_video_formats + 1));
 
-  webcam_device->num_video_formats++;
+  camera_device->num_video_formats++;
 }
 
 static gint
@@ -595,7 +595,7 @@ cheese_resolution_compare (gconstpointer _a, gconstpointer _b)
 }
 
 static void
-cheese_webcam_get_supported_video_formats (CheeseWebcamDevice *webcam_device, GstCaps *caps)
+cheese_camera_get_supported_video_formats (CheeseCameraDevice *camera_device, GstCaps *caps)
 {
   int i;
   int num_structures;
@@ -627,7 +627,7 @@ cheese_webcam_get_supported_video_formats (CheeseWebcamDevice *webcam_device, Gs
       video_format.mimetype = g_strdup (gst_structure_get_name (structure));
       gst_structure_get_int (structure, "width", &(video_format.width));
       gst_structure_get_int (structure, "height", &(video_format.height));
-      cheese_webcam_add_video_format (webcam_device, &video_format, structure);
+      cheese_camera_add_video_format (camera_device, &video_format, structure);
     }
     else if (GST_VALUE_HOLDS_INT_RANGE (width))
     {
@@ -651,7 +651,7 @@ cheese_webcam_get_supported_video_formats (CheeseWebcamDevice *webcam_device, Gs
         video_format.mimetype = g_strdup (gst_structure_get_name (structure));
         video_format.width    = cur_width;
         video_format.height   = cur_height;
-        cheese_webcam_add_video_format (webcam_device, &video_format, structure);
+        cheese_camera_add_video_format (camera_device, &video_format, structure);
         cur_width  *= 2;
         cur_height *= 2;
       }
@@ -665,7 +665,7 @@ cheese_webcam_get_supported_video_formats (CheeseWebcamDevice *webcam_device, Gs
         video_format.mimetype = g_strdup (gst_structure_get_name (structure));
         video_format.width    = cur_width;
         video_format.height   = cur_height;
-        cheese_webcam_add_video_format (webcam_device, &video_format, structure);
+        cheese_camera_add_video_format (camera_device, &video_format, structure);
         cur_width  /= 2;
         cur_height /= 2;
       }
@@ -679,13 +679,13 @@ cheese_webcam_get_supported_video_formats (CheeseWebcamDevice *webcam_device, Gs
   /* Sort the format array (so that it will show sorted in the resolution
    * selection GUI), and rebuild the hashtable (as that will be invalid after
    * the sorting) */
-  g_array_sort (webcam_device->video_formats, cheese_resolution_compare);
-  g_hash_table_remove_all (webcam_device->supported_resolutions);
-  for (i = 0; i < webcam_device->num_video_formats; i++)
+  g_array_sort (camera_device->video_formats, cheese_resolution_compare);
+  g_hash_table_remove_all (camera_device->supported_resolutions);
+  for (i = 0; i < camera_device->num_video_formats; i++)
   {
-    CheeseVideoFormat *format = &g_array_index (webcam_device->video_formats,
+    CheeseVideoFormat *format = &g_array_index (camera_device->video_formats,
                                                 CheeseVideoFormat, i);
-    g_hash_table_insert (webcam_device->supported_resolutions,
+    g_hash_table_insert (camera_device->supported_resolutions,
                          g_strdup_printf ("%ix%i", format->width,
                                           format->height),
                          GINT_TO_POINTER (i + 1));
@@ -693,8 +693,8 @@ cheese_webcam_get_supported_video_formats (CheeseWebcamDevice *webcam_device, Gs
 }
 
 static void
-cheese_webcam_get_webcam_device_data (CheeseWebcam       *webcam,
-                                      CheeseWebcamDevice *webcam_device)
+cheese_camera_get_camera_device_data (CheeseCamera       *camera,
+                                      CheeseCameraDevice *camera_device)
 {
   char                *pipeline_desc;
   GstElement          *pipeline;
@@ -705,8 +705,8 @@ cheese_webcam_get_webcam_device_data (CheeseWebcam       *webcam,
 
   {
     pipeline_desc = g_strdup_printf ("%s name=source device=%s ! fakesink",
-                                     webcam_device->gstreamer_src,
-                                     webcam_device->video_device);
+                                     camera_device->gstreamer_src,
+                                     camera_device->video_device);
     err      = NULL;
     pipeline = gst_parse_launch (pipeline_desc, &err);
     if ((pipeline != NULL) && (err == NULL))
@@ -735,11 +735,11 @@ cheese_webcam_get_webcam_device_data (CheeseWebcam       *webcam,
         if (name == NULL)
           name = "Unknown";
 
-        g_print ("Device: %s (%s)\n", name, webcam_device->video_device);
+        g_print ("Device: %s (%s)\n", name, camera_device->video_device);
         pad  = gst_element_get_pad (src, "src");
         caps = gst_pad_get_caps (pad);
         gst_object_unref (pad);
-        cheese_webcam_get_supported_video_formats (webcam_device, caps);
+        cheese_camera_get_supported_video_formats (camera_device, caps);
         gst_caps_unref (caps);
       }
       gst_element_set_state (pipeline, GST_STATE_NULL);
@@ -753,9 +753,9 @@ cheese_webcam_get_webcam_device_data (CheeseWebcam       *webcam,
 }
 
 static void
-cheese_webcam_create_fake_format (CheeseWebcam *webcam)
+cheese_camera_create_fake_format (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   CheeseVideoFormat format;
 
@@ -769,28 +769,28 @@ cheese_webcam_create_fake_format (CheeseWebcam *webcam)
   format.framerates[0].numerator   = 30;
   format.framerates[0].denominator = 1;
 
-  g_array_append_val (priv->webcam_devices[0].video_formats, format);
+  g_array_append_val (priv->camera_devices[0].video_formats, format);
   priv->current_format = &format;
 }
 
 static void
-cheese_webcam_detect_webcam_devices (CheeseWebcam *webcam)
+cheese_camera_detect_camera_devices (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   int i;
 
-  cheese_webcam_get_video_devices_from_hal (webcam);
+  cheese_camera_get_video_devices_from_hal (camera);
 
   g_print ("Probing supported video formats...\n");
-  for (i = 0; i < priv->num_webcam_devices; i++)
+  for (i = 0; i < priv->num_camera_devices; i++)
   {
-    cheese_webcam_get_webcam_device_data (webcam, &(priv->webcam_devices[i]));
+    cheese_camera_get_camera_device_data (camera, &(priv->camera_devices[i]));
     g_print ("\n");
   }
 
-  if (priv->num_webcam_devices == 0)
-    cheese_webcam_create_fake_format (webcam);
+  if (priv->num_camera_devices == 0)
+    cheese_camera_create_fake_format (camera);
 }
 
 static void
@@ -819,16 +819,16 @@ find_highest_framerate (CheeseVideoFormat *format)
 }
 
 static gboolean
-cheese_webcam_create_webcam_source_bin (CheeseWebcam *webcam)
+cheese_camera_create_camera_source_bin (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   GError *err = NULL;
-  char   *webcam_input;
+  char   *camera_input;
 
-  if (priv->num_webcam_devices == 0)
+  if (priv->num_camera_devices == 0)
   {
-    priv->webcam_source_bin = gst_parse_bin_from_description (
+    priv->camera_source_bin = gst_parse_bin_from_description (
       "videotestsrc name=video_source ! capsfilter name=capsfilter ! identity",
       TRUE,
       &err);
@@ -842,12 +842,12 @@ cheese_webcam_create_webcam_source_bin (CheeseWebcam *webcam)
     /* If we have a matching video device use that one, otherwise use the first */
     priv->selected_device = 0;
     format                = NULL;
-    for (i = 1; i < priv->num_webcam_devices; i++)
+    for (i = 1; i < priv->num_camera_devices; i++)
     {
-      if (g_strcmp0 (priv->webcam_devices[i].video_device, priv->device_name) == 0)
+      if (g_strcmp0 (priv->camera_devices[i].video_device, priv->device_name) == 0)
         priv->selected_device = i;
     }
-    CheeseWebcamDevice *selected_webcam = &(priv->webcam_devices[priv->selected_device]);
+    CheeseCameraDevice *selected_camera = &(priv->camera_devices[priv->selected_device]);
 
     resolution = g_strdup_printf ("%ix%i", priv->x_resolution,
                                   priv->y_resolution);
@@ -856,20 +856,20 @@ cheese_webcam_create_webcam_source_bin (CheeseWebcam *webcam)
      * camera supports it. */
     if (priv->x_resolution != 0 && priv->y_resolution != 0)
     {
-      i = GPOINTER_TO_INT (g_hash_table_lookup (selected_webcam->supported_resolutions, resolution));
+      i = GPOINTER_TO_INT (g_hash_table_lookup (selected_camera->supported_resolutions, resolution));
       if (i)
-        format = &g_array_index (selected_webcam->video_formats,
+        format = &g_array_index (selected_camera->video_formats,
                                  CheeseVideoFormat, i - 1);
     }
 
     if (!format)
     {
       /* Select the highest resolution */
-      format = &(g_array_index (selected_webcam->video_formats,
+      format = &(g_array_index (selected_camera->video_formats,
                                 CheeseVideoFormat, 0));
-      for (i = 1; i < selected_webcam->num_video_formats; i++)
+      for (i = 1; i < selected_camera->num_video_formats; i++)
       {
-        CheeseVideoFormat *new = &g_array_index (selected_webcam->video_formats,
+        CheeseVideoFormat *new = &g_array_index (selected_camera->video_formats,
                                                  CheeseVideoFormat, i);
         gfloat newrate = new->highest_framerate.numerator /
                          new->highest_framerate.denominator;
@@ -887,10 +887,10 @@ cheese_webcam_create_webcam_source_bin (CheeseWebcam *webcam)
     if (format == NULL)
       goto fallback;
 
-    webcam_input = g_strdup_printf (
+    camera_input = g_strdup_printf (
       "%s name=video_source device=%s ! capsfilter name=capsfilter caps=video/x-raw-rgb,width=%d,height=%d,framerate=%d/%d;video/x-raw-yuv,width=%d,height=%d,framerate=%d/%d ! identity",
-      selected_webcam->gstreamer_src,
-      selected_webcam->video_device,
+      selected_camera->gstreamer_src,
+      selected_camera->video_device,
       format->width,
       format->height,
       format->highest_framerate.numerator,
@@ -899,18 +899,18 @@ cheese_webcam_create_webcam_source_bin (CheeseWebcam *webcam)
       format->height,
       format->highest_framerate.numerator,
       format->highest_framerate.denominator);
-    g_print ("%s\n", webcam_input);
+    g_print ("%s\n", camera_input);
 
-    priv->webcam_source_bin = gst_parse_bin_from_description (webcam_input,
+    priv->camera_source_bin = gst_parse_bin_from_description (camera_input,
                                                               TRUE, &err);
-    g_free (webcam_input);
+    g_free (camera_input);
 
-    if (priv->webcam_source_bin == NULL)
+    if (priv->camera_source_bin == NULL)
       goto fallback;
   }
 
-  priv->video_source = gst_bin_get_by_name (GST_BIN (priv->webcam_source_bin), "video_source");
-  priv->capsfilter   = gst_bin_get_by_name (GST_BIN (priv->webcam_source_bin), "capsfilter");
+  priv->video_source = gst_bin_get_by_name (GST_BIN (priv->camera_source_bin), "video_source");
+  priv->capsfilter   = gst_bin_get_by_name (GST_BIN (priv->camera_source_bin), "capsfilter");
   return TRUE;
 
 fallback:
@@ -920,28 +920,28 @@ fallback:
     err = NULL;
   }
 
-  priv->webcam_source_bin = gst_parse_bin_from_description ("videotestsrc name=video_source",
+  priv->camera_source_bin = gst_parse_bin_from_description ("videotestsrc name=video_source",
                                                             TRUE, &err);
-  priv->video_source = gst_bin_get_by_name (GST_BIN (priv->webcam_source_bin), "video_source");
+  priv->video_source = gst_bin_get_by_name (GST_BIN (priv->camera_source_bin), "video_source");
   if (err != NULL)
   {
     g_error_free (err);
     return FALSE;
   }
-  priv->capsfilter = gst_bin_get_by_name (GST_BIN (priv->webcam_source_bin),
+  priv->capsfilter = gst_bin_get_by_name (GST_BIN (priv->camera_source_bin),
                                           "capsfilter");
   return TRUE;
 }
 
 static void
-cheese_webcam_set_error_element_not_found (GError **error, const char *factoryname)
+cheese_camera_set_error_element_not_found (GError **error, const char *factoryname)
 {
   if (error == NULL)
     return;
 
   if (*error == NULL)
   {
-    g_set_error (error, CHEESE_WEBCAM_ERROR, CHEESE_WEBCAM_ERROR_ELEMENT_NOT_FOUND, "%s.", factoryname);
+    g_set_error (error, CHEESE_CAMERA_ERROR, CHEESE_CAMERA_ERROR_ELEMENT_NOT_FOUND, "%s.", factoryname);
   }
   else
   {
@@ -967,9 +967,9 @@ cheese_webcam_set_error_element_not_found (GError **error, const char *factoryna
 }
 
 static gboolean
-cheese_webcam_create_video_display_bin (CheeseWebcam *webcam, GError **error)
+cheese_camera_create_video_display_bin (CheeseCamera *camera, GError **error)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   GstElement *tee, *video_display_queue, *video_scale, *video_sink, *save_queue;
 
@@ -978,45 +978,45 @@ cheese_webcam_create_video_display_bin (CheeseWebcam *webcam, GError **error)
 
   priv->video_display_bin = gst_bin_new ("video_display_bin");
 
-  cheese_webcam_create_webcam_source_bin (webcam);
+  cheese_camera_create_camera_source_bin (camera);
 
   if ((priv->effect_filter = gst_element_factory_make ("identity", "effect")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "identity");
+    cheese_camera_set_error_element_not_found (error, "identity");
   }
   if ((priv->csp_post_effect = gst_element_factory_make ("ffmpegcolorspace", "csp_post_effect")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "ffmpegcolorspace");
+    cheese_camera_set_error_element_not_found (error, "ffmpegcolorspace");
   }
   if ((priv->video_balance = gst_element_factory_make ("videobalance", "video_balance")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "videobalance");
+    cheese_camera_set_error_element_not_found (error, "videobalance");
     return FALSE;
   }
   if ((priv->csp_post_balance = gst_element_factory_make ("ffmpegcolorspace", "csp_post_balance")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "ffmpegcolorspace");
+    cheese_camera_set_error_element_not_found (error, "ffmpegcolorspace");
     return FALSE;
   }
 
   if ((tee = gst_element_factory_make ("tee", "tee")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "tee");
+    cheese_camera_set_error_element_not_found (error, "tee");
   }
 
   if ((save_queue = gst_element_factory_make ("queue", "save_queue")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "queue");
+    cheese_camera_set_error_element_not_found (error, "queue");
   }
 
   if ((video_display_queue = gst_element_factory_make ("queue", "video_display_queue")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "queue");
+    cheese_camera_set_error_element_not_found (error, "queue");
   }
 
   if ((video_scale = gst_element_factory_make ("videoscale", "video_scale")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "videoscale");
+    cheese_camera_set_error_element_not_found (error, "videoscale");
   }
   else
   {
@@ -1026,19 +1026,19 @@ cheese_webcam_create_video_display_bin (CheeseWebcam *webcam, GError **error)
 
   if ((video_sink = gst_element_factory_make ("gconfvideosink", "video_sink")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "gconfvideosink");
+    cheese_camera_set_error_element_not_found (error, "gconfvideosink");
   }
 
   if (error != NULL && *error != NULL)
     return FALSE;
 
-  gst_bin_add_many (GST_BIN (priv->video_display_bin), priv->webcam_source_bin,
+  gst_bin_add_many (GST_BIN (priv->video_display_bin), priv->camera_source_bin,
                     priv->effect_filter, priv->csp_post_effect,
                     priv->video_balance, priv->csp_post_balance,
                     tee, save_queue,
                     video_display_queue, video_scale, video_sink, NULL);
 
-  ok = gst_element_link_many (priv->webcam_source_bin, priv->effect_filter,
+  ok = gst_element_link_many (priv->camera_source_bin, priv->effect_filter,
                               priv->csp_post_effect,
                               priv->video_balance, priv->csp_post_balance,
                               tee, NULL);
@@ -1059,9 +1059,9 @@ cheese_webcam_create_video_display_bin (CheeseWebcam *webcam, GError **error)
 }
 
 static gboolean
-cheese_webcam_create_photo_save_bin (CheeseWebcam *webcam, GError **error)
+cheese_camera_create_photo_save_bin (CheeseCamera *camera, GError **error)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   GstElement *csp_photo_save_bin;
 
@@ -1073,11 +1073,11 @@ cheese_webcam_create_photo_save_bin (CheeseWebcam *webcam, GError **error)
 
   if ((csp_photo_save_bin = gst_element_factory_make ("ffmpegcolorspace", "csp_photo_save_bin")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "ffmpegcolorspace");
+    cheese_camera_set_error_element_not_found (error, "ffmpegcolorspace");
   }
   if ((priv->photo_sink = gst_element_factory_make ("fakesink", "photo_sink")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "fakesink");
+    cheese_camera_set_error_element_not_found (error, "fakesink");
   }
 
   if (error != NULL && *error != NULL)
@@ -1107,9 +1107,9 @@ cheese_webcam_create_photo_save_bin (CheeseWebcam *webcam, GError **error)
 }
 
 static gboolean
-cheese_webcam_create_video_save_bin (CheeseWebcam *webcam, GError **error)
+cheese_camera_create_video_save_bin (CheeseCamera *camera, GError **error)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   GstElement *audio_queue, *audio_convert, *audio_enc;
   GstElement *video_save_csp, *video_save_rate, *video_save_scale, *video_enc;
@@ -1121,28 +1121,28 @@ cheese_webcam_create_video_save_bin (CheeseWebcam *webcam, GError **error)
 
   if ((priv->audio_source = gst_element_factory_make ("gconfaudiosrc", "audio_source")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "gconfaudiosrc");
+    cheese_camera_set_error_element_not_found (error, "gconfaudiosrc");
   }
   if ((audio_queue = gst_element_factory_make ("queue", "audio_queue")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "queue");
+    cheese_camera_set_error_element_not_found (error, "queue");
   }
   if ((audio_convert = gst_element_factory_make ("audioconvert", "audio_convert")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "audioconvert");
+    cheese_camera_set_error_element_not_found (error, "audioconvert");
   }
   if ((audio_enc = gst_element_factory_make ("vorbisenc", "audio_enc")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "vorbisenc");
+    cheese_camera_set_error_element_not_found (error, "vorbisenc");
   }
 
   if ((video_save_csp = gst_element_factory_make ("ffmpegcolorspace", "video_save_csp")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "ffmpegcolorspace");
+    cheese_camera_set_error_element_not_found (error, "ffmpegcolorspace");
   }
   if ((video_enc = gst_element_factory_make ("theoraenc", "video_enc")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "theoraenc");
+    cheese_camera_set_error_element_not_found (error, "theoraenc");
   }
   else
   {
@@ -1151,11 +1151,11 @@ cheese_webcam_create_video_save_bin (CheeseWebcam *webcam, GError **error)
 
   if ((video_save_rate = gst_element_factory_make ("videorate", "video_save_rate")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "videorate");
+    cheese_camera_set_error_element_not_found (error, "videorate");
   }
   if ((video_save_scale = gst_element_factory_make ("videoscale", "video_save_scale")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "videoscale");
+    cheese_camera_set_error_element_not_found (error, "videoscale");
   }
   else
   {
@@ -1165,7 +1165,7 @@ cheese_webcam_create_video_save_bin (CheeseWebcam *webcam, GError **error)
 
   if ((mux = gst_element_factory_make ("oggmux", "mux")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "oggmux");
+    cheese_camera_set_error_element_not_found (error, "oggmux");
   }
   else
   {
@@ -1176,7 +1176,7 @@ cheese_webcam_create_video_save_bin (CheeseWebcam *webcam, GError **error)
 
   if ((priv->video_file_sink = gst_element_factory_make ("filesink", "video_file_sink")) == NULL)
   {
-    cheese_webcam_set_error_element_not_found (error, "filesink");
+    cheese_camera_set_error_element_not_found (error, "filesink");
   }
 
   if (error != NULL && *error != NULL)
@@ -1206,17 +1206,17 @@ cheese_webcam_create_video_save_bin (CheeseWebcam *webcam, GError **error)
 }
 
 int
-cheese_webcam_get_num_webcam_devices (CheeseWebcam *webcam)
+cheese_camera_get_num_camera_devices (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
-  return priv->num_webcam_devices;
+  return priv->num_camera_devices;
 }
 
 gboolean
-cheese_webcam_switch_webcam_device (CheeseWebcam *webcam)
+cheese_camera_switch_camera_device (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   gboolean was_recording        = FALSE;
   gboolean pipeline_was_playing = FALSE;
@@ -1227,19 +1227,19 @@ cheese_webcam_switch_webcam_device (CheeseWebcam *webcam)
 
   if (priv->is_recording)
   {
-    cheese_webcam_stop_video_recording (webcam);
+    cheese_camera_stop_video_recording (camera);
     was_recording = TRUE;
   }
 
   if (priv->pipeline_is_playing)
   {
-    cheese_webcam_stop (webcam);
+    cheese_camera_stop (camera);
     pipeline_was_playing = TRUE;
   }
 
   gst_bin_remove (GST_BIN (priv->pipeline), priv->video_display_bin);
 
-  disp_bin_created = cheese_webcam_create_video_display_bin (webcam, &error);
+  disp_bin_created = cheese_camera_create_video_display_bin (camera, &error);
   if (!disp_bin_created)
   {
     return FALSE;
@@ -1260,7 +1260,7 @@ cheese_webcam_switch_webcam_device (CheeseWebcam *webcam)
 
   if (pipeline_was_playing)
   {
-    cheese_webcam_play (webcam);
+    cheese_camera_play (camera);
   }
 
   /* if (was_recording)
@@ -1272,18 +1272,18 @@ cheese_webcam_switch_webcam_device (CheeseWebcam *webcam)
 }
 
 void
-cheese_webcam_play (CheeseWebcam *webcam)
+cheese_camera_play (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   gst_element_set_state (priv->pipeline, GST_STATE_PLAYING);
   priv->pipeline_is_playing = TRUE;
 }
 
 void
-cheese_webcam_stop (CheeseWebcam *webcam)
+cheese_camera_stop (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   if (priv->pipeline != NULL)
     gst_element_set_state (priv->pipeline, GST_STATE_NULL);
@@ -1291,33 +1291,33 @@ cheese_webcam_stop (CheeseWebcam *webcam)
 }
 
 static void
-cheese_webcam_change_effect_filter (CheeseWebcam *webcam, GstElement *new_filter)
+cheese_camera_change_effect_filter (CheeseCamera *camera, GstElement *new_filter)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   gboolean is_playing = priv->pipeline_is_playing;
   gboolean ok;
 
-  cheese_webcam_stop (webcam);
+  cheese_camera_stop (camera);
 
-  gst_element_unlink_many (priv->webcam_source_bin, priv->effect_filter,
+  gst_element_unlink_many (priv->camera_source_bin, priv->effect_filter,
                            priv->csp_post_effect, NULL);
 
   gst_bin_remove (GST_BIN (priv->video_display_bin), priv->effect_filter);
 
   gst_bin_add (GST_BIN (priv->video_display_bin), new_filter);
-  ok = gst_element_link_many (priv->webcam_source_bin, new_filter,
+  ok = gst_element_link_many (priv->camera_source_bin, new_filter,
                               priv->csp_post_effect, NULL);
   g_return_if_fail (ok);
 
   if (is_playing)
-    cheese_webcam_play (webcam);
+    cheese_camera_play (camera);
 
   priv->effect_filter = new_filter;
 }
 
 void
-cheese_webcam_set_effect (CheeseWebcam *webcam, CheeseWebcamEffect effect)
+cheese_camera_set_effect (CheeseCamera *camera, CheeseCameraEffect effect)
 {
   GString    *rgb_effects_str = g_string_new ("");
   GString    *yuv_effects_str = g_string_new ("");
@@ -1354,7 +1354,7 @@ cheese_webcam_set_effect (CheeseWebcam *webcam, CheeseWebcamEffect effect)
     g_error_free (err);
     g_error ("ERROR effect_filter\n");
   }
-  cheese_webcam_change_effect_filter (webcam, effect_filter);
+  cheese_camera_change_effect_filter (camera, effect_filter);
 
   g_free (effects_pipeline_desc);
   g_string_free (rgb_effects_str, TRUE);
@@ -1362,28 +1362,28 @@ cheese_webcam_set_effect (CheeseWebcam *webcam, CheeseWebcamEffect effect)
 }
 
 void
-cheese_webcam_start_video_recording (CheeseWebcam *webcam, char *filename)
+cheese_camera_start_video_recording (CheeseCamera *camera, char *filename)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
-  g_object_set (CHEESE_WEBCAM_GET_PRIVATE (webcam)->video_file_sink, "location", filename, NULL);
-  cheese_webcam_change_sink (webcam, priv->video_display_bin,
+  g_object_set (CHEESE_CAMERA_GET_PRIVATE (camera)->video_file_sink, "location", filename, NULL);
+  cheese_camera_change_sink (camera, priv->video_display_bin,
                              priv->video_save_bin, priv->photo_save_bin);
   priv->is_recording = TRUE;
 }
 
 static gboolean
-cheese_webcam_force_stop_video_recording (gpointer data)
+cheese_camera_force_stop_video_recording (gpointer data)
 {
-  CheeseWebcam        *webcam = CHEESE_WEBCAM (data);
-  CheeseWebcamPrivate *priv   = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCamera        *camera = CHEESE_CAMERA (data);
+  CheeseCameraPrivate *priv   = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   if (priv->is_recording)
   {
     g_print ("Cannot cleanly shutdown recording pipeline, forcing\n");
-    g_signal_emit (webcam, webcam_signals[VIDEO_SAVED], 0);
+    g_signal_emit (camera, camera_signals[VIDEO_SAVED], 0);
 
-    cheese_webcam_change_sink (webcam, priv->video_display_bin,
+    cheese_camera_change_sink (camera, priv->video_display_bin,
                                priv->photo_save_bin, priv->video_save_bin);
     priv->is_recording = FALSE;
   }
@@ -1392,9 +1392,9 @@ cheese_webcam_force_stop_video_recording (gpointer data)
 }
 
 void
-cheese_webcam_stop_video_recording (CheeseWebcam *webcam)
+cheese_camera_stop_video_recording (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
   GstState             state;
 
   gst_element_get_state (priv->pipeline, &state, NULL, 0);
@@ -1405,18 +1405,18 @@ cheese_webcam_stop_video_recording (CheeseWebcam *webcam)
     g_print ("Sending EOS event down the recording pipeline\n");
     gst_element_send_event (priv->video_source, gst_event_new_eos ());
     gst_element_send_event (priv->audio_source, gst_event_new_eos ());
-    priv->eos_timeout_id = g_timeout_add (3000, cheese_webcam_force_stop_video_recording, webcam);
+    priv->eos_timeout_id = g_timeout_add (3000, cheese_camera_force_stop_video_recording, camera);
   }
   else
   {
-    cheese_webcam_force_stop_video_recording (webcam);
+    cheese_camera_force_stop_video_recording (camera);
   }
 }
 
 gboolean
-cheese_webcam_take_photo (CheeseWebcam *webcam, char *filename)
+cheese_camera_take_photo (CheeseCamera *camera, char *filename)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   if (priv->photo_handler_signal_id != 0)
   {
@@ -1430,21 +1430,21 @@ cheese_webcam_take_photo (CheeseWebcam *webcam, char *filename)
   /* Take the photo by connecting the handoff signal */
   priv->photo_handler_signal_id = g_signal_connect (G_OBJECT (priv->photo_sink),
                                                     "handoff",
-                                                    G_CALLBACK (cheese_webcam_photo_data_cb),
-                                                    webcam);
+                                                    G_CALLBACK (cheese_camera_photo_data_cb),
+                                                    camera);
   return TRUE;
 }
 
 static void
-cheese_webcam_finalize (GObject *object)
+cheese_camera_finalize (GObject *object)
 {
-  CheeseWebcam *webcam;
+  CheeseCamera *camera;
   int           i, j;
 
-  webcam = CHEESE_WEBCAM (object);
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  camera = CHEESE_CAMERA (object);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
-  cheese_webcam_stop (webcam);
+  cheese_camera_stop (camera);
   if (priv->pipeline != NULL)
     gst_object_unref (priv->pipeline);
 
@@ -1456,34 +1456,34 @@ cheese_webcam_finalize (GObject *object)
   g_free (priv->photo_filename);
   g_free (priv->device_name);
 
-  /* Free CheeseWebcamDevice array */
-  for (i = 0; i < priv->num_webcam_devices; i++)
+  /* Free CheeseCameraDevice array */
+  for (i = 0; i < priv->num_camera_devices; i++)
   {
-    for (j = 0; j < priv->webcam_devices[i].num_video_formats; j++)
+    for (j = 0; j < priv->camera_devices[i].num_video_formats; j++)
     {
-      g_free (g_array_index (priv->webcam_devices[i].video_formats, CheeseVideoFormat, j).framerates);
-      g_free (g_array_index (priv->webcam_devices[i].video_formats, CheeseVideoFormat, j).mimetype);
+      g_free (g_array_index (priv->camera_devices[i].video_formats, CheeseVideoFormat, j).framerates);
+      g_free (g_array_index (priv->camera_devices[i].video_formats, CheeseVideoFormat, j).mimetype);
     }
-    g_free (priv->webcam_devices[i].video_device);
-    g_free (priv->webcam_devices[i].hal_udi);
-    g_free (priv->webcam_devices[i].gstreamer_src);
-    g_free (priv->webcam_devices[i].product_name);
-    g_array_free (priv->webcam_devices[i].video_formats, TRUE);
-    g_hash_table_destroy (priv->webcam_devices[i].supported_resolutions);
+    g_free (priv->camera_devices[i].video_device);
+    g_free (priv->camera_devices[i].hal_udi);
+    g_free (priv->camera_devices[i].gstreamer_src);
+    g_free (priv->camera_devices[i].product_name);
+    g_array_free (priv->camera_devices[i].video_formats, TRUE);
+    g_hash_table_destroy (priv->camera_devices[i].supported_resolutions);
   }
-  g_free (priv->webcam_devices);
+  g_free (priv->camera_devices);
 
-  G_OBJECT_CLASS (cheese_webcam_parent_class)->finalize (object);
+  G_OBJECT_CLASS (cheese_camera_parent_class)->finalize (object);
 }
 
 static void
-cheese_webcam_get_property (GObject *object, guint prop_id, GValue *value,
+cheese_camera_get_property (GObject *object, guint prop_id, GValue *value,
                             GParamSpec *pspec)
 {
-  CheeseWebcam *self;
+  CheeseCamera *self;
 
-  self = CHEESE_WEBCAM (object);
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (self);
+  self = CHEESE_CAMERA (object);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (self);
 
   switch (prop_id)
   {
@@ -1506,20 +1506,20 @@ cheese_webcam_get_property (GObject *object, guint prop_id, GValue *value,
 }
 
 static void
-cheese_webcam_set_property (GObject *object, guint prop_id, const GValue *value,
+cheese_camera_set_property (GObject *object, guint prop_id, const GValue *value,
                             GParamSpec *pspec)
 {
-  CheeseWebcam *self;
+  CheeseCamera *self;
 
-  self = CHEESE_WEBCAM (object);
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (self);
+  self = CHEESE_CAMERA (object);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (self);
 
   switch (prop_id)
   {
     case PROP_VIDEO_WINDOW:
       priv->video_window = g_value_get_pointer (value);
       g_signal_connect (priv->video_window, "expose-event",
-                        G_CALLBACK (cheese_webcam_expose_cb), self);
+                        G_CALLBACK (cheese_camera_expose_cb), self);
       break;
     case PROP_DEVICE_NAME:
       g_free (priv->device_name);
@@ -1538,24 +1538,24 @@ cheese_webcam_set_property (GObject *object, guint prop_id, const GValue *value,
 }
 
 static void
-cheese_webcam_class_init (CheeseWebcamClass *klass)
+cheese_camera_class_init (CheeseCameraClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  object_class->finalize     = cheese_webcam_finalize;
-  object_class->get_property = cheese_webcam_get_property;
-  object_class->set_property = cheese_webcam_set_property;
+  object_class->finalize     = cheese_camera_finalize;
+  object_class->get_property = cheese_camera_get_property;
+  object_class->set_property = cheese_camera_set_property;
 
-  webcam_signals[PHOTO_SAVED] = g_signal_new ("photo-saved", G_OBJECT_CLASS_TYPE (klass),
+  camera_signals[PHOTO_SAVED] = g_signal_new ("photo-saved", G_OBJECT_CLASS_TYPE (klass),
                                               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-                                              G_STRUCT_OFFSET (CheeseWebcamClass, photo_saved),
+                                              G_STRUCT_OFFSET (CheeseCameraClass, photo_saved),
                                               NULL, NULL,
                                               g_cclosure_marshal_VOID__VOID,
                                               G_TYPE_NONE, 0);
 
-  webcam_signals[VIDEO_SAVED] = g_signal_new ("video-saved", G_OBJECT_CLASS_TYPE (klass),
+  camera_signals[VIDEO_SAVED] = g_signal_new ("video-saved", G_OBJECT_CLASS_TYPE (klass),
                                               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-                                              G_STRUCT_OFFSET (CheeseWebcamClass, video_saved),
+                                              G_STRUCT_OFFSET (CheeseCameraClass, video_saved),
                                               NULL, NULL,
                                               g_cclosure_marshal_VOID__VOID,
                                               G_TYPE_NONE, 0);
@@ -1595,67 +1595,67 @@ cheese_webcam_class_init (CheeseWebcamClass *klass)
                                                      G_PARAM_CONSTRUCT_ONLY));
 
 
-  g_type_class_add_private (klass, sizeof (CheeseWebcamPrivate));
+  g_type_class_add_private (klass, sizeof (CheeseCameraPrivate));
 }
 
 static void
-cheese_webcam_init (CheeseWebcam *webcam)
+cheese_camera_init (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   priv->is_recording            = FALSE;
   priv->pipeline_is_playing     = FALSE;
   priv->photo_filename          = NULL;
-  priv->webcam_devices          = NULL;
+  priv->camera_devices          = NULL;
   priv->device_name             = NULL;
   priv->photo_handler_signal_id = 0;
 }
 
-CheeseWebcam *
-cheese_webcam_new (GtkWidget *video_window, char *webcam_device_name,
+CheeseCamera *
+cheese_camera_new (GtkWidget *video_window, char *camera_device_name,
                    int x_resolution, int y_resolution)
 {
-  CheeseWebcam *webcam;
+  CheeseCamera *camera;
 
-  if (webcam_device_name)
+  if (camera_device_name)
   {
-    webcam = g_object_new (CHEESE_TYPE_WEBCAM, "video-window", video_window,
-                           "device_name", webcam_device_name,
+    camera = g_object_new (CHEESE_TYPE_CAMERA, "video-window", video_window,
+                           "device_name", camera_device_name,
                            "x-resolution", x_resolution,
                            "y-resolution", y_resolution, NULL);
   }
   else
   {
-    webcam = g_object_new (CHEESE_TYPE_WEBCAM, "video-window", video_window,
+    camera = g_object_new (CHEESE_TYPE_CAMERA, "video-window", video_window,
                            "x-resolution", x_resolution,
                            "y-resolution", y_resolution, NULL);
   }
 
-  return webcam;
+  return camera;
 }
 
 void
-cheese_webcam_setup (CheeseWebcam *webcam, char *hal_dev_udi, GError **error)
+cheese_camera_setup (CheeseCamera *camera, char *hal_dev_udi, GError **error)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   gboolean ok        = TRUE;
   GError  *tmp_error = NULL;
 
-  cheese_webcam_detect_webcam_devices (webcam);
+  cheese_camera_detect_camera_devices (camera);
 
   if (hal_dev_udi != NULL)
   {
-    cheese_webcam_set_device_by_dev_udi (webcam, hal_dev_udi);
+    cheese_camera_set_device_by_dev_udi (camera, hal_dev_udi);
   }
 
   priv->pipeline = gst_pipeline_new ("pipeline");
 
-  cheese_webcam_create_video_display_bin (webcam, &tmp_error);
+  cheese_camera_create_video_display_bin (camera, &tmp_error);
 
-  cheese_webcam_create_photo_save_bin (webcam, &tmp_error);
+  cheese_camera_create_photo_save_bin (camera, &tmp_error);
 
-  cheese_webcam_create_video_save_bin (webcam, &tmp_error);
+  cheese_camera_create_video_save_bin (camera, &tmp_error);
   if (tmp_error != NULL)
   {
     g_propagate_error (error, tmp_error);
@@ -1672,74 +1672,74 @@ cheese_webcam_setup (CheeseWebcam *webcam, char *hal_dev_udi, GError **error)
   gst_bus_add_signal_watch (priv->bus);
 
   g_signal_connect (G_OBJECT (priv->bus), "message",
-                    G_CALLBACK (cheese_webcam_bus_message_cb), webcam);
+                    G_CALLBACK (cheese_camera_bus_message_cb), camera);
 
-  gst_bus_set_sync_handler (priv->bus, (GstBusSyncHandler) cheese_webcam_bus_sync_handler, webcam);
+  gst_bus_set_sync_handler (priv->bus, (GstBusSyncHandler) cheese_camera_bus_sync_handler, camera);
 
   if (!ok)
     g_error ("Unable link pipeline for photo");
 }
 
 int
-cheese_webcam_get_selected_device_index (CheeseWebcam *webcam)
+cheese_camera_get_selected_device_index (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   return priv->selected_device;
 }
 
 GArray *
-cheese_webcam_get_webcam_devices (CheeseWebcam *webcam)
+cheese_camera_get_camera_devices (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   GArray *devices_arr;
 
   devices_arr = g_array_sized_new (FALSE,
                                    TRUE,
-                                   sizeof (CheeseWebcamDevice),
-                                   priv->num_webcam_devices);
+                                   sizeof (CheeseCameraDevice),
+                                   priv->num_camera_devices);
   devices_arr = g_array_append_vals (devices_arr,
-                                     priv->webcam_devices,
-                                     priv->num_webcam_devices);
+                                     priv->camera_devices,
+                                     priv->num_camera_devices);
   return devices_arr;
 }
 
 void
-cheese_webcam_set_device_by_dev_file (CheeseWebcam *webcam, char *file)
+cheese_camera_set_device_by_dev_file (CheeseCamera *camera, char *file)
 {
-  g_object_set (webcam, "device_name", file, NULL);
+  g_object_set (camera, "device_name", file, NULL);
 }
 
 void
-cheese_webcam_set_device_by_dev_udi (CheeseWebcam *webcam, char *udi)
+cheese_camera_set_device_by_dev_udi (CheeseCamera *camera, char *udi)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   int i;
 
-  for (i = 0; i < priv->num_webcam_devices; i++)
+  for (i = 0; i < priv->num_camera_devices; i++)
   {
-    if (strcmp (priv->webcam_devices[i].hal_udi, udi) == 0)
+    if (strcmp (priv->camera_devices[i].hal_udi, udi) == 0)
     {
-      g_object_set (webcam, "device_name", priv->webcam_devices[i].video_device, NULL);
+      g_object_set (camera, "device_name", priv->camera_devices[i].video_device, NULL);
       break;
     }
   }
 }
 
 GArray *
-cheese_webcam_get_video_formats (CheeseWebcam *webcam)
+cheese_camera_get_video_formats (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
-  return priv->webcam_devices[priv->selected_device].video_formats;
+  return priv->camera_devices[priv->selected_device].video_formats;
 }
 
 void
-cheese_webcam_set_video_format (CheeseWebcam *webcam, CheeseVideoFormat *format)
+cheese_camera_set_video_format (CheeseCamera *camera, CheeseVideoFormat *format)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   GstCaps *new_caps;
 
@@ -1765,25 +1765,25 @@ cheese_webcam_set_video_format (CheeseWebcam *webcam, CheeseVideoFormat *format)
 
   priv->current_format = format;
 
-  cheese_webcam_stop (webcam);
+  cheese_camera_stop (camera);
   g_object_set (priv->capsfilter, "caps", new_caps, NULL);
-  cheese_webcam_play (webcam);
+  cheese_camera_play (camera);
 }
 
 CheeseVideoFormat *
-cheese_webcam_get_current_video_format (CheeseWebcam *webcam)
+cheese_camera_get_current_video_format (CheeseCamera *camera)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   return priv->current_format;
 }
 
 void
-cheese_webcam_get_balance_property_range (CheeseWebcam *webcam,
+cheese_camera_get_balance_property_range (CheeseCamera *camera,
                                           gchar *property,
                                           gdouble *min, gdouble *max, gdouble *def)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
   GParamSpec          *pspec;
 
   *min = 0.0;
@@ -1801,9 +1801,9 @@ cheese_webcam_get_balance_property_range (CheeseWebcam *webcam,
 }
 
 void
-cheese_webcam_set_balance_property (CheeseWebcam *webcam, gchar *property, gdouble value)
+cheese_camera_set_balance_property (CheeseCamera *camera, gchar *property, gdouble value)
 {
-  CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
 
   g_object_set (G_OBJECT (priv->video_balance), property, value, NULL);
 }
diff --git a/libcheese/cheese-camera.h b/libcheese/cheese-camera.h
new file mode 100644
index 0000000..7bc9e5d
--- /dev/null
+++ b/libcheese/cheese-camera.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright © 2007,2008 Jaap Haitsma <jaap haitsma org>
+ * Copyright © 2007-2009 daniel g. siegel <dgsiegel gnome org>
+ * Copyright © 2008 Ryan zeigler <zeiglerr gmail com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __CHEESE_CAMERA_H__
+#define __CHEESE_CAMERA_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <gst/interfaces/xoverlay.h>
+
+G_BEGIN_DECLS
+
+#define CHEESE_TYPE_CAMERA (cheese_camera_get_type ())
+#define CHEESE_CAMERA(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), CHEESE_TYPE_CAMERA, CheeseCamera))
+#define CHEESE_CAMERA_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), CHEESE_TYPE_CAMERA, CheeseCameraClass))
+#define CHEESE_IS_CAMERA(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), CHEESE_TYPE_CAMERA))
+#define CHEESE_IS_CAMERA_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), CHEESE_TYPE_CAMERA))
+#define CHEESE_CAMERA_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CHEESE_TYPE_CAMERA, CheeseCameraClass))
+
+typedef struct
+{
+  int numerator;
+  int denominator;
+} CheeseFramerate;
+
+typedef struct
+{
+  char *mimetype;
+  int   width;
+  int   height;
+  int   num_framerates;
+  CheeseFramerate *framerates;
+  CheeseFramerate  highest_framerate;
+} CheeseVideoFormat;
+
+typedef struct
+{
+  char *video_device;
+  char *hal_udi;
+  char *gstreamer_src;
+  char *product_name;
+  int   num_video_formats;
+  GArray *video_formats;
+
+  /* Hash table for resolution based lookup of video_formats */
+  GHashTable *supported_resolutions;
+} CheeseCameraDevice;
+
+typedef enum
+{
+  CHEESE_CAMERA_EFFECT_NO_EFFECT       = (0),
+  CHEESE_CAMERA_EFFECT_MAUVE           = (1 << 0),
+  CHEESE_CAMERA_EFFECT_NOIR_BLANC      = (1 << 1),
+  CHEESE_CAMERA_EFFECT_SATURATION      = (1 << 2),
+  CHEESE_CAMERA_EFFECT_HULK            = (1 << 3),
+  CHEESE_CAMERA_EFFECT_VERTICAL_FLIP   = (1 << 4),
+  CHEESE_CAMERA_EFFECT_HORIZONTAL_FLIP = (1 << 5),
+  CHEESE_CAMERA_EFFECT_SHAGADELIC      = (1 << 6),
+  CHEESE_CAMERA_EFFECT_VERTIGO         = (1 << 7),
+  CHEESE_CAMERA_EFFECT_EDGE            = (1 << 8),
+  CHEESE_CAMERA_EFFECT_DICE            = (1 << 9),
+  CHEESE_CAMERA_EFFECT_WARP            = (1 << 10),
+}
+CheeseCameraEffect;
+
+typedef struct
+{
+  GObject parent;
+} CheeseCamera;
+
+typedef struct
+{
+  GObjectClass parent_class;
+  void (*photo_saved)(CheeseCamera *camera);
+  void (*video_saved)(CheeseCamera *camera);
+} CheeseCameraClass;
+
+
+GType         cheese_camera_get_type (void);
+CheeseCamera *cheese_camera_new (GtkWidget *video_window,
+                                 char      *camera_device_name,
+                                 int        x_resolution,
+                                 int        y_resolution);
+
+CheeseVideoFormat *cheese_camera_get_current_video_format (CheeseCamera *camera);
+void               cheese_camera_setup (CheeseCamera *camera, char *udi, GError **error);
+void               cheese_camera_play (CheeseCamera *camera);
+void               cheese_camera_stop (CheeseCamera *camera);
+void               cheese_camera_set_effect (CheeseCamera *camera, CheeseCameraEffect effect);
+void               cheese_camera_start_video_recording (CheeseCamera *camera, char *filename);
+void               cheese_camera_stop_video_recording (CheeseCamera *camera);
+gboolean           cheese_camera_take_photo (CheeseCamera *camera, char *filename);
+gboolean           cheese_camera_has_camera (CheeseCamera *camera);
+int                cheese_camera_get_num_camera_devices (CheeseCamera *camera);
+int                cheese_camera_get_selected_device_index (CheeseCamera *camera);
+GArray *           cheese_camera_get_camera_devices (CheeseCamera *camera);
+void               cheese_camera_set_device_by_dev_file (CheeseCamera *camera, char *file);
+void               cheese_camera_set_device_by_dev_udi (CheeseCamera *camera, char *udi);
+gboolean           cheese_camera_switch_camera_device (CheeseCamera *camera);
+GArray *           cheese_camera_get_video_formats (CheeseCamera *camera);
+void               cheese_camera_set_video_format (CheeseCamera      *camera,
+                                                   CheeseVideoFormat *format);
+void cheese_camera_get_balance_property_range (CheeseCamera *camera,
+                                               gchar *property,
+                                               gdouble *min, gdouble *max, gdouble *def);
+void cheese_camera_set_balance_property (CheeseCamera *camera, gchar *property, gdouble value);
+G_END_DECLS
+
+#endif /* __CHEESE_CAMERA_H__ */
diff --git a/src/Makefile.am b/src/Makefile.am
index 233c71a..97a4787 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,14 +1,16 @@
-INCLUDES = 						\
-	-DBINDIR=\"$(bindir)\"			 	\
-	-DDATADIR=\"$(datadir)\"			\
-	-DPREFIX=\""$(prefix)"\" 			\
-	-DSYSCONFDIR=\""$(sysconfdir)"\" 		\
-	-DLIBDIR=\""$(libdir)"\" 			\
-	-DPACKAGE_DATADIR=\""$(datadir)/cheese"\"	\
-	-DPACKAGE_LOCALEDIR=\""$(datadir)/locale"\"	\
-	-DAPPNAME_DATA_DIR=\"$(pkgdatadir)\"		\
-	-DGNOME_DESKTOP_USE_UNSTABLE_API=1		\
-	$(CHEESE_CFLAGS)
+INCLUDES = \
+	-DBINDIR=\"$(bindir)\" \
+	-DDATADIR=\"$(datadir)\" \
+	-DPREFIX=\""$(prefix)"\" \
+	-DSYSCONFDIR=\""$(sysconfdir)"\" \
+	-DLIBDIR=\""$(libdir)"\" \
+	-DPACKAGE_DATADIR=\""$(datadir)/cheese"\" \
+	-DPACKAGE_LOCALEDIR=\""$(datadir)/locale"\" \
+	-DAPPNAME_DATA_DIR=\"$(pkgdatadir)\" \
+	-DGNOME_DESKTOP_USE_UNSTABLE_API=1 \
+	$(CHEESE_CFLAGS) \
+	-I top_srcdir@/libcheese \
+	$(NULL)
 
 bin_PROGRAMS = cheese
 
@@ -26,8 +28,6 @@ cheese_SOURCES = \
 	cheese-gconf.h \
 	cheese-thumb-view.c \
 	cheese-thumb-view.h \
-	cheese-webcam.c \
-	cheese-webcam.h \
 	cheese-window.c \
 	cheese-window.h \
 	eog-thumbnail.c \
@@ -50,11 +50,14 @@ cheese_SOURCES = \
 	cheese-prefs-dialog.h \
 	cheese-flash.h \
 	cheese-flash.c \
-	cheese-prefs-webcam-combo.c \
-	cheese-prefs-webcam-combo.h \
+	cheese-prefs-camera-combo.c \
+	cheese-prefs-camera-combo.h \
 	cheese-prefs-burst-spinbox.h \
 	cheese-prefs-burst-spinbox.c
-	
+
+cheese_LDFLAGS = \
+	-L top_srcdir@/libcheese -lcheese
+
 cheese_LDADD = \
 	$(CHEESE_LIBS)
 
diff --git a/src/cheese-effect-chooser.c b/src/cheese-effect-chooser.c
index 22e3b29..8716117 100644
--- a/src/cheese-effect-chooser.c
+++ b/src/cheese-effect-chooser.c
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2007,2008 daniel g. siegel <dgsiegel gnome org>
+ * Copyright © 2007-2009 daniel g. siegel <dgsiegel gnome org>
  * Copyright © 2007,2008 Jaap Haitsma <jaap haitsma org>
  *
  * Licensed under the GNU General Public License Version 2
@@ -28,8 +28,8 @@
 #include <gtk/gtk.h>
 #include <cairo.h>
 
+#include <cheese-camera.h>
 #include "cheese-effect-chooser.h"
-#include "cheese-webcam.h"
 
 #define BOARD_COLS  4
 #define BOARD_ROWS  3
@@ -50,36 +50,36 @@ typedef struct
 
 typedef struct
 {
-  CheeseWebcamEffect effect;
+  CheeseCameraEffect effect;
   char *name;
   char *filename;
   gboolean is_black;
 } GstEffect;
 
 static const GstEffect GST_EFFECT[] = {
-  {CHEESE_WEBCAM_EFFECT_NO_EFFECT,       N_("No Effect"),
+  {CHEESE_CAMERA_EFFECT_NO_EFFECT,       N_("No Effect"),
    PACKAGE_DATADIR "/effects/identity.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_MAUVE,           N_("Mauve"),
+  {CHEESE_CAMERA_EFFECT_MAUVE,           N_("Mauve"),
    PACKAGE_DATADIR "/effects/Mauve.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_NOIR_BLANC,      N_("Noir/Blanc"),
+  {CHEESE_CAMERA_EFFECT_NOIR_BLANC,      N_("Noir/Blanc"),
    PACKAGE_DATADIR "/effects/NoirBlanc.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_SATURATION,      N_("Saturation"),
+  {CHEESE_CAMERA_EFFECT_SATURATION,      N_("Saturation"),
    PACKAGE_DATADIR "/effects/Saturation.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_HULK,            N_("Hulk"),
+  {CHEESE_CAMERA_EFFECT_HULK,            N_("Hulk"),
    PACKAGE_DATADIR "/effects/Hulk.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_VERTICAL_FLIP,   N_("Vertical Flip"),
+  {CHEESE_CAMERA_EFFECT_VERTICAL_FLIP,   N_("Vertical Flip"),
    PACKAGE_DATADIR "/effects/videoflip_v.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_HORIZONTAL_FLIP, N_("Horizontal Flip"),
+  {CHEESE_CAMERA_EFFECT_HORIZONTAL_FLIP, N_("Horizontal Flip"),
    PACKAGE_DATADIR "/effects/videoflip_h.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_SHAGADELIC,      N_("Shagadelic"),
+  {CHEESE_CAMERA_EFFECT_SHAGADELIC,      N_("Shagadelic"),
    PACKAGE_DATADIR "/effects/shagadelictv.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_VERTIGO,         N_("Vertigo"),
+  {CHEESE_CAMERA_EFFECT_VERTIGO,         N_("Vertigo"),
    PACKAGE_DATADIR "/effects/vertigotv.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_EDGE,            N_("Edge"),
+  {CHEESE_CAMERA_EFFECT_EDGE,            N_("Edge"),
    PACKAGE_DATADIR "/effects/edgetv.png", TRUE},
-  {CHEESE_WEBCAM_EFFECT_DICE,            N_("Dice"),
+  {CHEESE_CAMERA_EFFECT_DICE,            N_("Dice"),
    PACKAGE_DATADIR "/effects/dicetv.png", FALSE},
-  {CHEESE_WEBCAM_EFFECT_WARP,            N_("Warp"),
+  {CHEESE_CAMERA_EFFECT_WARP,            N_("Warp"),
    PACKAGE_DATADIR "/effects/warptv.png", FALSE}
 };
 
@@ -253,13 +253,13 @@ cheese_effect_chooser_button_press_event_cb (GtkWidget *widget, GdkEventButton *
   return TRUE;
 }
 
-CheeseWebcamEffect
+CheeseCameraEffect
 cheese_effect_chooser_get_selection (CheeseEffectChooser *effect_chooser)
 {
   CheeseEffectChooserPrivate *priv = CHEESE_EFFECT_CHOOSER_GET_PRIVATE (effect_chooser);
 
   int                i;
-  CheeseWebcamEffect effect = 0;
+  CheeseCameraEffect effect = 0;
 
   for (i = 0; i < NUM_EFFECTS; i++)
   {
diff --git a/src/cheese-effect-chooser.h b/src/cheese-effect-chooser.h
index af39294..3cbc07e 100644
--- a/src/cheese-effect-chooser.h
+++ b/src/cheese-effect-chooser.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2007,2008 daniel g. siegel <dgsiegel gnome org>
+ * Copyright © 2007-2009 daniel g. siegel <dgsiegel gnome org>
  * Copyright © 2007,2008 Jaap Haitsma <jaap haitsma org>
  *
  * Licensed under the GNU General Public License Version 2
@@ -22,7 +22,7 @@
 #define __CHEESE_EFFECT_CHOOSER_H__
 
 #include <gtk/gtk.h>
-#include "cheese-webcam.h"
+#include <cheese-camera.h>
 
 G_BEGIN_DECLS
 
@@ -50,7 +50,7 @@ typedef struct
 GType      cheese_effect_chooser_get_type (void);
 GtkWidget *cheese_effect_chooser_new (char *selected_effects);
 
-CheeseWebcamEffect cheese_effect_chooser_get_selection (CheeseEffectChooser *effect_chooser);
+CheeseCameraEffect cheese_effect_chooser_get_selection (CheeseEffectChooser *effect_chooser);
 char *             cheese_effect_chooser_get_selection_string (CheeseEffectChooser *effect_chooser);
 void               cheese_effect_chooser_unselect_all (CheeseEffectChooser *effect_chooser);
 
diff --git a/src/cheese-flash.c b/src/cheese-flash.c
index be55ae9..1466948 100644
--- a/src/cheese-flash.c
+++ b/src/cheese-flash.c
@@ -1,6 +1,7 @@
 /*
  * Copyright © 2008 Alexander â??weejâ?? Jones <alex weej com>
  * Copyright © 2008 Thomas Perl <thp thpinfo com>
+ * Copyright © 2009 daniel g. siegel <dgsiegel gnome org>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -23,8 +24,8 @@
 
 #include <gtk/gtk.h>
 
+#include <cheese-camera.h>
 #include "cheese-flash.h"
-#include "cheese-webcam.h"
 
 /* How long to hold the flash for */
 #define FLASH_DURATION 250
diff --git a/src/cheese-gconf.c b/src/cheese-gconf.c
index b3e2c64..c039d89 100644
--- a/src/cheese-gconf.c
+++ b/src/cheese-gconf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2007,2008 daniel g. siegel <dgsiegel gnome org>
+ * Copyright © 2007-2009 daniel g. siegel <dgsiegel gnome org>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -60,9 +60,9 @@ cheese_gconf_get_property (GObject *object, guint prop_id, GValue *value,
                                                          CHEESE_GCONF_PREFIX "/countdown",
                                                          NULL));
       break;
-    case GCONF_PROP_WEBCAM:
+    case GCONF_PROP_CAMERA:
       g_value_set_string (value, gconf_client_get_string (priv->client,
-                                                          CHEESE_GCONF_PREFIX "/webcam",
+                                                          CHEESE_GCONF_PREFIX "/camera",
                                                           NULL));
       break;
     case GCONF_PROP_SELECTED_EFFECTS:
@@ -214,9 +214,9 @@ cheese_gconf_set_property (GObject *object, guint prop_id, const GValue *value,
                              g_value_get_boolean (value),
                              NULL);
       break;
-    case GCONF_PROP_WEBCAM:
+    case GCONF_PROP_CAMERA:
       gconf_client_set_string (priv->client,
-                               CHEESE_GCONF_PREFIX "/webcam",
+                               CHEESE_GCONF_PREFIX "/camera",
                                g_value_get_string (value),
                                NULL);
       break;
@@ -366,8 +366,8 @@ cheese_gconf_class_init (CheeseGConfClass *klass)
                                                          NULL,
                                                          FALSE,
                                                          G_PARAM_READWRITE));
-  g_object_class_install_property (object_class, GCONF_PROP_WEBCAM,
-                                   g_param_spec_string ("gconf_prop_webcam",
+  g_object_class_install_property (object_class, GCONF_PROP_CAMERA,
+                                   g_param_spec_string ("gconf_prop_camera",
                                                         NULL,
                                                         NULL,
                                                         "",
diff --git a/src/cheese-gconf.h b/src/cheese-gconf.h
index f7b5c2d..9b9b308 100644
--- a/src/cheese-gconf.h
+++ b/src/cheese-gconf.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2007,2008 daniel g. siegel <dgsiegel gnome org>
+ * Copyright © 2007-2009 daniel g. siegel <dgsiegel gnome org>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -43,7 +43,7 @@ enum
 {
   GCONF_PROP_0,
   GCONF_PROP_COUNTDOWN,
-  GCONF_PROP_WEBCAM,
+  GCONF_PROP_CAMERA,
   GCONF_PROP_SELECTED_EFFECTS,
   GCONF_PROP_X_RESOLUTION,
   GCONF_PROP_Y_RESOLUTION,
diff --git a/src/cheese-prefs-balance-scale.c b/src/cheese-prefs-balance-scale.c
index cb0e159..bd10946 100644
--- a/src/cheese-prefs-balance-scale.c
+++ b/src/cheese-prefs-balance-scale.c
@@ -20,7 +20,7 @@
 #include <string.h>
 #include <glib.h>
 
-#include "cheese-webcam.h"
+#include <cheese-camera.h>
 #include "cheese-prefs-widget.h"
 #include "cheese-prefs-balance-scale.h"
 
@@ -31,16 +31,16 @@ enum
   PROP_0,
   PROP_PROPERTY_NAME,
   PROP_GCONF_KEY,
-  PROP_WEBCAM
+  PROP_CAMERA
 };
 
 typedef struct CheesePrefsBalanceScalePrivate
 {
-  CheeseWebcam *webcam;
+  CheeseCamera *camera;
   gchar *property_name;
   gchar *gconf_key;
   gboolean has_been_synchronized;  /* Make sure we don't synchronize if client
-                                    * sets webcam on construction. */
+                                    * sets camera on construction. */
 } CheesePrefsBalanceScalePrivate;
 
 #define CHEESE_PREFS_BALANCE_SCALE_GET_PRIVATE(o)                     \
@@ -77,7 +77,7 @@ cheese_prefs_balance_scale_value_changed (GtkRange *scale, CheesePrefsBalanceSca
   CheesePrefsBalanceScalePrivate *priv  = CHEESE_PREFS_BALANCE_SCALE_GET_PRIVATE (self);
   gdouble                         value = gtk_range_get_value (scale);
 
-  cheese_webcam_set_balance_property (priv->webcam, priv->property_name, value);
+  cheese_camera_set_balance_property (priv->camera, priv->property_name, value);
 
   g_object_set (CHEESE_PREFS_WIDGET (self)->gconf, priv->gconf_key, value, NULL);
 
@@ -97,7 +97,7 @@ cheese_prefs_balance_scale_synchronize (CheesePrefsWidget *prefs_widget)
 
   g_object_get (prefs_widget, "widget", &scale, NULL);
 
-  cheese_webcam_get_balance_property_range (priv->webcam,
+  cheese_camera_get_balance_property_range (priv->camera,
                                             priv->property_name, &min, &max, &def);
 
   adj = GTK_ADJUSTMENT (gtk_adjustment_new (def, min, max, (max - min) / STEPS, 0.0, 0.0));
@@ -132,8 +132,8 @@ cheese_prefs_balance_scale_set_property (GObject *object, guint prop_id,
     case PROP_GCONF_KEY:
       priv->gconf_key = g_value_dup_string (value);
       break;
-    case PROP_WEBCAM:
-      priv->webcam = CHEESE_WEBCAM (g_value_get_object (value));
+    case PROP_CAMERA:
+      priv->camera = CHEESE_CAMERA (g_value_get_object (value));
       if (priv->has_been_synchronized)
         cheese_prefs_balance_scale_synchronize (CHEESE_PREFS_WIDGET (object));
       break;
@@ -159,8 +159,8 @@ cheese_prefs_balance_scale_get_property (GObject *object, guint prop_id,
     case PROP_GCONF_KEY:
       g_value_set_string (value, priv->gconf_key);
       break;
-    case PROP_WEBCAM:
-      g_value_set_object (value, priv->webcam);
+    case PROP_CAMERA:
+      g_value_set_object (value, priv->camera);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -198,17 +198,17 @@ cheese_prefs_balance_scale_class_init (CheesePrefsBalanceScaleClass *klass)
                                                         G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
 
   g_object_class_install_property (object_class,
-                                   PROP_WEBCAM,
-                                   g_param_spec_object ("webcam",
-                                                        "webcam",
-                                                        "Webcam object",
-                                                        CHEESE_TYPE_WEBCAM,
+                                   PROP_CAMERA,
+                                   g_param_spec_object ("camera",
+                                                        "camera",
+                                                        "Camera object",
+                                                        CHEESE_TYPE_CAMERA,
                                                         G_PARAM_READWRITE));
 }
 
 CheesePrefsBalanceScale *
 cheese_prefs_balance_scale_new (GtkWidget    *scale,
-                                CheeseWebcam *webcam,
+                                CheeseCamera *camera,
                                 const gchar  *property,
                                 const gchar  *gconf_key)
 {
@@ -217,7 +217,7 @@ cheese_prefs_balance_scale_new (GtkWidget    *scale,
 
   self = g_object_new (CHEESE_TYPE_PREFS_BALANCE_SCALE,
                        "widget", scale,
-                       "webcam", webcam,
+                       "camera", camera,
                        "property_name", property,
                        "gconf_key", gconf_key,
                        NULL);
diff --git a/src/cheese-prefs-balance-scale.h b/src/cheese-prefs-balance-scale.h
index 21c261c..a057382 100644
--- a/src/cheese-prefs-balance-scale.h
+++ b/src/cheese-prefs-balance-scale.h
@@ -21,8 +21,8 @@
 #define _CHEESE_PREFS_BALANCE_SCALE_H_
 
 #include <glib-object.h>
+#include <cheese-camera.h>
 #include "cheese-prefs-widget.h"
-#include "cheese-webcam.h"
 
 G_BEGIN_DECLS
 
@@ -51,7 +51,7 @@ struct _CheesePrefsBalanceScale
 
 GType                    cheese_prefs_balance_scale_get_type (void) G_GNUC_CONST;
 CheesePrefsBalanceScale *cheese_prefs_balance_scale_new (GtkWidget    *scale,
-                                                         CheeseWebcam *webcam,
+                                                         CheeseCamera *camera,
                                                          const gchar  *property,
                                                          const gchar  *balance_key);
 
diff --git a/src/cheese-prefs-burst-spinbox.h b/src/cheese-prefs-burst-spinbox.h
index 27391a8..3d67ebd 100644
--- a/src/cheese-prefs-burst-spinbox.h
+++ b/src/cheese-prefs-burst-spinbox.h
@@ -21,8 +21,8 @@
 #define _CHEESE_PREFS_BURST_SPINBOX_H_
 
 #include <glib-object.h>
+#include <cheese-camera.h>
 #include "cheese-prefs-widget.h"
-#include "cheese-webcam.h"
 
 G_BEGIN_DECLS
 
diff --git a/src/cheese-prefs-webcam-combo.c b/src/cheese-prefs-camera-combo.c
similarity index 58%
rename from src/cheese-prefs-webcam-combo.c
rename to src/cheese-prefs-camera-combo.c
index fe8f39f..c14122e 100644
--- a/src/cheese-prefs-webcam-combo.c
+++ b/src/cheese-prefs-camera-combo.c
@@ -22,9 +22,9 @@
 #include <string.h>
 #include <glib.h>
 
-#include "cheese-webcam.h"
+#include <cheese-camera.h>
 #include "cheese-prefs-widget.h"
-#include "cheese-prefs-webcam-combo.h"
+#include "cheese-prefs-camera-combo.h"
 
 enum
 {
@@ -36,77 +36,77 @@ enum
 enum
 {
   PROP_0,
-  PROP_WEBCAM_DEVICE_KEY,
-  PROP_WEBCAM
+  PROP_CAMERA_DEVICE_KEY,
+  PROP_CAMERA
 };
 
-typedef struct CheesePrefsWebcamComboPrivate
+typedef struct CheesePrefsCameraComboPrivate
 {
-  gchar *webcam_device_key;
+  gchar *camera_device_key;
   GtkListStore *list_store;
-  CheeseWebcam *webcam;
+  CheeseCamera *camera;
   gboolean has_been_synchronized;  /* Make sure we don't synchronize if client
-                                    * sets webcam on construction. */
-} CheesePrefsWebcamComboPrivate;
+                                    * sets camera on construction. */
+} CheesePrefsCameraComboPrivate;
 
-#define CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE(o)                     \
-  (G_TYPE_INSTANCE_GET_PRIVATE ((o), CHEESE_TYPE_PREFS_WEBCAM_COMBO, \
-                                CheesePrefsWebcamComboPrivate))
+#define CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE(o)                     \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), CHEESE_TYPE_PREFS_CAMERA_COMBO, \
+                                CheesePrefsCameraComboPrivate))
 
-G_DEFINE_TYPE (CheesePrefsWebcamCombo, cheese_prefs_webcam_combo, CHEESE_TYPE_PREFS_WIDGET);
+G_DEFINE_TYPE (CheesePrefsCameraCombo, cheese_prefs_camera_combo, CHEESE_TYPE_PREFS_WIDGET);
 
 static void
-cheese_prefs_webcam_combo_init (CheesePrefsWebcamCombo *self)
+cheese_prefs_camera_combo_init (CheesePrefsCameraCombo *self)
 {
-  CheesePrefsWebcamComboPrivate *priv = CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE (self);
+  CheesePrefsCameraComboPrivate *priv = CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE (self);
 
   priv->has_been_synchronized = FALSE;
-  priv->webcam                = NULL;
-  priv->webcam_device_key     = NULL;
+  priv->camera                = NULL;
+  priv->camera_device_key     = NULL;
   priv->list_store            = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING);
 }
 
 static void
-cheese_prefs_webcam_combo_finalize (GObject *object)
+cheese_prefs_camera_combo_finalize (GObject *object)
 {
-  CheesePrefsWebcamCombo        *self = CHEESE_PREFS_WEBCAM_COMBO (object);
-  CheesePrefsWebcamComboPrivate *priv = CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE (self);
+  CheesePrefsCameraCombo        *self = CHEESE_PREFS_CAMERA_COMBO (object);
+  CheesePrefsCameraComboPrivate *priv = CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE (self);
 
-  g_free (priv->webcam_device_key);
+  g_free (priv->camera_device_key);
   g_object_unref (priv->list_store);
 
-  G_OBJECT_CLASS (cheese_prefs_webcam_combo_parent_class)->finalize (object);
+  G_OBJECT_CLASS (cheese_prefs_camera_combo_parent_class)->finalize (object);
 }
 
 static void
-cheese_prefs_webcam_combo_selection_changed (GtkComboBox *combo_box, CheesePrefsWebcamCombo *self)
+cheese_prefs_camera_combo_selection_changed (GtkComboBox *combo_box, CheesePrefsCameraCombo *self)
 {
-  CheesePrefsWebcamComboPrivate *priv = CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE (self);
+  CheesePrefsCameraComboPrivate *priv = CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE (self);
 
   /* Put it into gconf */
-  char *new_device = cheese_prefs_webcam_combo_get_selected_webcam (self);
+  char *new_device = cheese_prefs_camera_combo_get_selected_camera (self);
 
-  g_object_set (CHEESE_PREFS_WIDGET (self)->gconf, priv->webcam_device_key, new_device, NULL);
+  g_object_set (CHEESE_PREFS_WIDGET (self)->gconf, priv->camera_device_key, new_device, NULL);
   g_free (new_device);
 
   cheese_prefs_widget_notify_changed (CHEESE_PREFS_WIDGET (self));
 }
 
 static void
-cheese_prefs_webcam_combo_synchronize (CheesePrefsWidget *prefs_widget)
+cheese_prefs_camera_combo_synchronize (CheesePrefsWidget *prefs_widget)
 {
-  CheesePrefsWebcamCombo        *self = CHEESE_PREFS_WEBCAM_COMBO (prefs_widget);
-  CheesePrefsWebcamComboPrivate *priv = CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE (self);
+  CheesePrefsCameraCombo        *self = CHEESE_PREFS_CAMERA_COMBO (prefs_widget);
+  CheesePrefsCameraComboPrivate *priv = CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE (self);
 
   GtkWidget          *combo_box;
-  GArray             *webcam_devices;
+  GArray             *camera_devices;
   int                 selected_device_ind;
   int                 num_devices;
-  CheeseWebcamDevice *selected_device;
+  CheeseCameraDevice *selected_device;
   char               *gconf_device_name;
   char               *product_name;
   char               *device_name;
-  CheeseWebcamDevice *device_ptr;
+  CheeseCameraDevice *device_ptr;
   GtkTreeIter         iter;
   GtkTreeIter         active_iter;
   int                 i;
@@ -116,27 +116,27 @@ cheese_prefs_webcam_combo_synchronize (CheesePrefsWidget *prefs_widget)
   g_object_get (prefs_widget, "widget", &combo_box, NULL);
 
   /* Disconnect to prevent a whole bunch of changed notifications */
-  g_signal_handlers_disconnect_by_func (combo_box, cheese_prefs_webcam_combo_selection_changed, prefs_widget);
+  g_signal_handlers_disconnect_by_func (combo_box, cheese_prefs_camera_combo_selection_changed, prefs_widget);
 
   g_object_ref (priv->list_store);
 
   gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), NULL);
 
-  webcam_devices      = cheese_webcam_get_webcam_devices (priv->webcam);
-  selected_device_ind = cheese_webcam_get_selected_device_index (priv->webcam);
-  num_devices         = cheese_webcam_get_num_webcam_devices (priv->webcam);
+  camera_devices      = cheese_camera_get_camera_devices (priv->camera);
+  selected_device_ind = cheese_camera_get_selected_device_index (priv->camera);
+  num_devices         = cheese_camera_get_num_camera_devices (priv->camera);
 
-  selected_device = &g_array_index (webcam_devices, CheeseWebcamDevice, selected_device_ind);
+  selected_device = &g_array_index (camera_devices, CheeseCameraDevice, selected_device_ind);
 
   /* If the selected device is not the same device as the one in gconf, the
    * selected device isn't available or was set by --hal-device. Set it now.
    * Not sure if this is desired behavior */
   if (num_devices > 0)
   {
-    g_object_get (prefs_widget->gconf, priv->webcam_device_key, &gconf_device_name, NULL);
+    g_object_get (prefs_widget->gconf, priv->camera_device_key, &gconf_device_name, NULL);
     if (!gconf_device_name || strcmp (selected_device->video_device, gconf_device_name) != 0)
     {
-      g_object_set (prefs_widget->gconf, priv->webcam_device_key, selected_device->video_device, NULL);
+      g_object_set (prefs_widget->gconf, priv->camera_device_key, selected_device->video_device, NULL);
     }
     g_free (gconf_device_name);
   }
@@ -144,7 +144,7 @@ cheese_prefs_webcam_combo_synchronize (CheesePrefsWidget *prefs_widget)
 
   for (i = 0; i < num_devices; i++)
   {
-    device_ptr   = &g_array_index (webcam_devices, CheeseWebcamDevice, i);
+    device_ptr   = &g_array_index (camera_devices, CheeseCameraDevice, i);
     product_name = g_strdup_printf ("%s (%s)", device_ptr->product_name, device_ptr->video_device);
     device_name  = g_strdup (device_ptr->video_device);
 
@@ -172,32 +172,32 @@ cheese_prefs_webcam_combo_synchronize (CheesePrefsWidget *prefs_widget)
     gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), 0);
 
   g_signal_connect (G_OBJECT (combo_box), "changed",
-                    G_CALLBACK (cheese_prefs_webcam_combo_selection_changed),
+                    G_CALLBACK (cheese_prefs_camera_combo_selection_changed),
                     self);
 
-  /* Set sensitive or not depending on whether or not there are webcam devices
+  /* Set sensitive or not depending on whether or not there are camera devices
    * available */
   gtk_widget_set_sensitive (combo_box, num_devices > 1);
 
-  g_array_free (webcam_devices, TRUE);
+  g_array_free (camera_devices, TRUE);
 }
 
 static void
-cheese_prefs_webcam_combo_set_property (GObject *object, guint prop_id,
+cheese_prefs_camera_combo_set_property (GObject *object, guint prop_id,
                                         const GValue *value,
                                         GParamSpec *pspec)
 {
-  CheesePrefsWebcamComboPrivate *priv = CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE (object);
+  CheesePrefsCameraComboPrivate *priv = CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE (object);
 
   switch (prop_id)
   {
-    case PROP_WEBCAM_DEVICE_KEY:
-      priv->webcam_device_key = g_value_dup_string (value);
+    case PROP_CAMERA_DEVICE_KEY:
+      priv->camera_device_key = g_value_dup_string (value);
       break;
-    case PROP_WEBCAM:
-      priv->webcam = CHEESE_WEBCAM (g_value_get_object (value));
+    case PROP_CAMERA:
+      priv->camera = CHEESE_CAMERA (g_value_get_object (value));
       if (priv->has_been_synchronized)
-        cheese_prefs_webcam_combo_synchronize (CHEESE_PREFS_WIDGET (object));
+        cheese_prefs_camera_combo_synchronize (CHEESE_PREFS_WIDGET (object));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -206,20 +206,20 @@ cheese_prefs_webcam_combo_set_property (GObject *object, guint prop_id,
 }
 
 static void
-cheese_prefs_webcam_combo_get_property (GObject *object, guint prop_id,
+cheese_prefs_camera_combo_get_property (GObject *object, guint prop_id,
                                         GValue *value, GParamSpec *pspec)
 {
-  CheesePrefsWebcamComboPrivate *priv = CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE (object);
+  CheesePrefsCameraComboPrivate *priv = CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE (object);
 
-  g_return_if_fail (CHEESE_IS_PREFS_WEBCAM_COMBO (object));
+  g_return_if_fail (CHEESE_IS_PREFS_CAMERA_COMBO (object));
 
   switch (prop_id)
   {
-    case PROP_WEBCAM_DEVICE_KEY:
-      g_value_set_string (value, priv->webcam_device_key);
+    case PROP_CAMERA_DEVICE_KEY:
+      g_value_set_string (value, priv->camera_device_key);
       break;
-    case PROP_WEBCAM:
-      g_value_set_object (value, priv->webcam);
+    case PROP_CAMERA:
+      g_value_set_object (value, priv->camera);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -228,50 +228,50 @@ cheese_prefs_webcam_combo_get_property (GObject *object, guint prop_id,
 }
 
 static void
-cheese_prefs_webcam_combo_class_init (CheesePrefsWebcamComboClass *klass)
+cheese_prefs_camera_combo_class_init (CheesePrefsCameraComboClass *klass)
 {
   GObjectClass           *object_class = G_OBJECT_CLASS (klass);
   CheesePrefsWidgetClass *parent_class = CHEESE_PREFS_WIDGET_CLASS (klass);
 
-  g_type_class_add_private (klass, sizeof (CheesePrefsWebcamComboPrivate));
+  g_type_class_add_private (klass, sizeof (CheesePrefsCameraComboPrivate));
 
-  object_class->finalize     = cheese_prefs_webcam_combo_finalize;
-  object_class->set_property = cheese_prefs_webcam_combo_set_property;
-  object_class->get_property = cheese_prefs_webcam_combo_get_property;
-  parent_class->synchronize  = cheese_prefs_webcam_combo_synchronize;
+  object_class->finalize     = cheese_prefs_camera_combo_finalize;
+  object_class->set_property = cheese_prefs_camera_combo_set_property;
+  object_class->get_property = cheese_prefs_camera_combo_get_property;
+  parent_class->synchronize  = cheese_prefs_camera_combo_synchronize;
 
   g_object_class_install_property (object_class,
-                                   PROP_WEBCAM_DEVICE_KEY,
-                                   g_param_spec_string ("webcam_device_key",
+                                   PROP_CAMERA_DEVICE_KEY,
+                                   g_param_spec_string ("camera_device_key",
                                                         "",
-                                                        "Webcam device gconf key",
+                                                        "Camera device gconf key",
                                                         "",
                                                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
   g_object_class_install_property (object_class,
-                                   PROP_WEBCAM,
-                                   g_param_spec_object ("webcam",
+                                   PROP_CAMERA,
+                                   g_param_spec_object ("camera",
                                                         "",
-                                                        "Webcam object",
-                                                        CHEESE_TYPE_WEBCAM,
+                                                        "Camera object",
+                                                        CHEESE_TYPE_CAMERA,
                                                         G_PARAM_READWRITE));
 }
 
-CheesePrefsWebcamCombo *
-cheese_prefs_webcam_combo_new (GtkWidget *combo_box, CheeseWebcam *webcam,
-                               const gchar *webcam_device_key)
+CheesePrefsCameraCombo *
+cheese_prefs_camera_combo_new (GtkWidget *combo_box, CheeseCamera *camera,
+                               const gchar *camera_device_key)
 {
-  CheesePrefsWebcamCombo        *self;
+  CheesePrefsCameraCombo        *self;
   GtkCellRenderer               *renderer;
-  CheesePrefsWebcamComboPrivate *priv;
+  CheesePrefsCameraComboPrivate *priv;
 
-  self = g_object_new (CHEESE_TYPE_PREFS_WEBCAM_COMBO,
+  self = g_object_new (CHEESE_TYPE_PREFS_CAMERA_COMBO,
                        "widget", combo_box,
-                       "webcam", webcam,
-                       "webcam_device_key", webcam_device_key,
+                       "camera", camera,
+                       "camera_device_key", camera_device_key,
                        NULL);
 
-  priv = CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE (self);
+  priv = CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE (self);
 
   renderer = gtk_cell_renderer_text_new ();
   gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), renderer, FALSE);
@@ -284,15 +284,15 @@ cheese_prefs_webcam_combo_new (GtkWidget *combo_box, CheeseWebcam *webcam,
 }
 
 char *
-cheese_prefs_webcam_combo_get_selected_webcam (CheesePrefsWebcamCombo *webcam)
+cheese_prefs_camera_combo_get_selected_camera (CheesePrefsCameraCombo *camera)
 {
-  CheesePrefsWebcamComboPrivate *priv = CHEESE_PREFS_WEBCAM_COMBO_GET_PRIVATE (webcam);
+  CheesePrefsCameraComboPrivate *priv = CHEESE_PREFS_CAMERA_COMBO_GET_PRIVATE (camera);
 
   GtkTreeIter active_iter;
   GtkWidget  *combo_box;
   char       *device;
 
-  g_object_get (webcam, "widget", &combo_box, NULL);
+  g_object_get (camera, "widget", &combo_box, NULL);
 
   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo_box), &active_iter);
   gtk_tree_model_get (GTK_TREE_MODEL (priv->list_store), &active_iter, DEVICE_NAME, &device, -1);
diff --git a/src/cheese-prefs-camera-combo.h b/src/cheese-prefs-camera-combo.h
new file mode 100644
index 0000000..0683441
--- /dev/null
+++ b/src/cheese-prefs-camera-combo.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2008 James Liggett <jrliggett cox net>
+ * Copyright © 2008 Ryan Zeigler <zeiglerr gmail com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _CHEESE_PREFS_CAMERA_COMBO_H_
+#define _CHEESE_PREFS_CAMERA_COMBO_H_
+
+#include <glib-object.h>
+#include <cheese-camera.h>
+#include "cheese-prefs-widget.h"
+
+G_BEGIN_DECLS
+
+#define CHEESE_TYPE_PREFS_CAMERA_COMBO (cheese_prefs_camera_combo_get_type ())
+#define CHEESE_PREFS_CAMERA_COMBO(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CHEESE_TYPE_PREFS_CAMERA_COMBO, \
+                                                                               CheesePrefsCameraCombo))
+#define CHEESE_PREFS_CAMERA_COMBO_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CHEESE_TYPE_PREFS_CAMERA_COMBO, \
+                                                                            CheesePrefsCameraComboClass))
+#define CHEESE_IS_PREFS_CAMERA_COMBO(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CHEESE_TYPE_PREFS_CAMERA_COMBO))
+#define CHEESE_IS_PREFS_CAMERA_COMBO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CHEESE_TYPE_PREFS_CAMERA_COMBO))
+#define CHEESE_PREFS_CAMERA_COMBO_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CHEESE_TYPE_PREFS_CAMERA_COMBO, \
+                                                                              CheesePrefsCameraComboClass))
+
+typedef struct _CheesePrefsCameraComboClass CheesePrefsCameraComboClass;
+typedef struct _CheesePrefsCameraCombo CheesePrefsCameraCombo;
+
+struct _CheesePrefsCameraComboClass
+{
+  CheesePrefsWidgetClass parent_class;
+};
+
+struct _CheesePrefsCameraCombo
+{
+  CheesePrefsWidget parent_instance;
+};
+
+GType                   cheese_prefs_camera_combo_get_type (void) G_GNUC_CONST;
+CheesePrefsCameraCombo *cheese_prefs_camera_combo_new (GtkWidget    *combo_box,
+                                                       CheeseCamera *camera,
+                                                       const gchar  *camera_device_key);
+
+char *cheese_prefs_camera_combo_get_selected_camera (CheesePrefsCameraCombo *camera);
+
+#endif /* _CHEESE_PREFS_CAMERA_COMBO_H_ */
diff --git a/src/cheese-prefs-dialog.c b/src/cheese-prefs-dialog.c
index bea44a3..45897e0 100644
--- a/src/cheese-prefs-dialog.c
+++ b/src/cheese-prefs-dialog.c
@@ -24,7 +24,7 @@ typedef struct
 {
   GtkWidget *cheese_prefs_dialog;
   GtkWidget *resolution_combo_box;
-  GtkWidget *webcam_combo_box;
+  GtkWidget *camera_combo_box;
   GtkWidget *brightness_scale;
   GtkWidget *contrast_scale;
   GtkWidget *saturation_scale;
@@ -33,7 +33,7 @@ typedef struct
   GtkWidget *burst_delay;
 
   GtkWidget *parent;
-  CheeseWebcam *webcam;
+  CheeseCamera *camera;
 
   CheesePrefsDialogWidgets *widgets;
 } CheesePrefsDialog;
@@ -58,8 +58,8 @@ cheese_prefs_dialog_create_dialog (CheesePrefsDialog *prefs_dialog)
                                                                           "cheese_prefs_dialog"));
   prefs_dialog->resolution_combo_box = GTK_WIDGET (gtk_builder_get_object (builder,
                                                                            "resolution_combo_box"));
-  prefs_dialog->webcam_combo_box = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                                       "webcam_combo_box"));
+  prefs_dialog->camera_combo_box = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                                       "camera_combo_box"));
   prefs_dialog->brightness_scale = GTK_WIDGET (gtk_builder_get_object (builder,
                                                                        "brightness_scale"));
   prefs_dialog->contrast_scale = GTK_WIDGET (gtk_builder_get_object (builder,
@@ -79,38 +79,38 @@ cheese_prefs_dialog_create_dialog (CheesePrefsDialog *prefs_dialog)
 static void
 cheese_prefs_dialog_on_resolution_changed (CheesePrefsWidget *widget, gpointer user_data)
 {
-  CheeseWebcam      *webcam;
+  CheeseCamera      *camera;
   CheeseVideoFormat *current_format;
   CheeseVideoFormat *new_format;
 
-  g_object_get (widget, "webcam", &webcam, NULL);
+  g_object_get (widget, "camera", &camera, NULL);
 
-  current_format = cheese_webcam_get_current_video_format (webcam);
+  current_format = cheese_camera_get_current_video_format (camera);
   new_format     = cheese_prefs_resolution_combo_get_selected_format (CHEESE_PREFS_RESOLUTION_COMBO (widget));
 
   if (new_format != current_format)
-    cheese_webcam_set_video_format (webcam, new_format);
+    cheese_camera_set_video_format (camera, new_format);
 }
 
 static void
 cheese_prefs_dialog_on_device_changed (CheesePrefsWidget *widget, CheesePrefsDialog *prefs_dialog)
 {
-  CheeseWebcam *webcam;
+  CheeseCamera *camera;
   char         *new_device_name;
   char         *old_device_name;
 
-  g_object_get (widget, "webcam", &webcam, NULL);
-  g_object_get (webcam, "device_name", &old_device_name, NULL);
+  g_object_get (widget, "camera", &camera, NULL);
+  g_object_get (camera, "device_name", &old_device_name, NULL);
 
-  new_device_name = cheese_prefs_webcam_combo_get_selected_webcam (CHEESE_PREFS_WEBCAM_COMBO (widget));
-  g_object_set (webcam, "device_name", new_device_name, NULL);
+  new_device_name = cheese_prefs_camera_combo_get_selected_camera (CHEESE_PREFS_CAMERA_COMBO (widget));
+  g_object_set (camera, "device_name", new_device_name, NULL);
   g_free (new_device_name);
-  if (!cheese_webcam_switch_webcam_device (webcam))
+  if (!cheese_camera_switch_camera_device (camera))
   {
-    g_warning ("Couldn't change webcam device.");
+    g_warning ("Couldn't change camera device.");
 
     /* Revert to default device */
-    g_object_set (webcam, "device_name", old_device_name, NULL);
+    g_object_set (camera, "device_name", old_device_name, NULL);
   }
   cheese_prefs_dialog_widgets_synchronize (prefs_dialog->widgets);
   g_free (old_device_name);
@@ -120,7 +120,7 @@ static void
 cheese_prefs_dialog_setup_widgets (CheesePrefsDialog *prefs_dialog)
 {
   CheesePrefsWidget *resolution_widget;
-  CheesePrefsWidget *webcam_widget;
+  CheesePrefsWidget *camera_widget;
   CheesePrefsWidget *brightness_widget;
   CheesePrefsWidget *contrast_widget;
   CheesePrefsWidget *saturation_widget;
@@ -129,7 +129,7 @@ cheese_prefs_dialog_setup_widgets (CheesePrefsDialog *prefs_dialog)
   CheesePrefsWidget *burst_repeat_widget;
 
   resolution_widget = CHEESE_PREFS_WIDGET (cheese_prefs_resolution_combo_new (prefs_dialog->resolution_combo_box,
-                                                                              prefs_dialog->webcam,
+                                                                              prefs_dialog->camera,
                                                                               "gconf_prop_x_resolution",
                                                                               "gconf_prop_y_resolution",
                                                                               0, 0));
@@ -138,35 +138,35 @@ cheese_prefs_dialog_setup_widgets (CheesePrefsDialog *prefs_dialog)
                     NULL);
   cheese_prefs_dialog_widgets_add (prefs_dialog->widgets, resolution_widget);
 
-  webcam_widget = CHEESE_PREFS_WIDGET (cheese_prefs_webcam_combo_new (prefs_dialog->webcam_combo_box,
-                                                                      prefs_dialog->webcam,
-                                                                      "gconf_prop_webcam"));
+  camera_widget = CHEESE_PREFS_WIDGET (cheese_prefs_camera_combo_new (prefs_dialog->camera_combo_box,
+                                                                      prefs_dialog->camera,
+                                                                      "gconf_prop_camera"));
 
-  g_signal_connect (G_OBJECT (webcam_widget), "changed",
+  g_signal_connect (G_OBJECT (camera_widget), "changed",
                     G_CALLBACK (cheese_prefs_dialog_on_device_changed),
                     prefs_dialog);
-  cheese_prefs_dialog_widgets_add (prefs_dialog->widgets, webcam_widget);
+  cheese_prefs_dialog_widgets_add (prefs_dialog->widgets, camera_widget);
 
   brightness_widget = CHEESE_PREFS_WIDGET (cheese_prefs_balance_scale_new (prefs_dialog->brightness_scale,
-                                                                           prefs_dialog->webcam, "brightness",
+                                                                           prefs_dialog->camera, "brightness",
                                                                            "gconf_prop_brightness"));
 
   cheese_prefs_dialog_widgets_add (prefs_dialog->widgets, brightness_widget);
 
   contrast_widget = CHEESE_PREFS_WIDGET (cheese_prefs_balance_scale_new (prefs_dialog->contrast_scale,
-                                                                         prefs_dialog->webcam, "contrast",
+                                                                         prefs_dialog->camera, "contrast",
                                                                          "gconf_prop_contrast"));
 
   cheese_prefs_dialog_widgets_add (prefs_dialog->widgets, contrast_widget);
 
   saturation_widget = CHEESE_PREFS_WIDGET (cheese_prefs_balance_scale_new (prefs_dialog->saturation_scale,
-                                                                           prefs_dialog->webcam, "saturation",
+                                                                           prefs_dialog->camera, "saturation",
                                                                            "gconf_prop_saturation"));
 
   cheese_prefs_dialog_widgets_add (prefs_dialog->widgets, saturation_widget);
 
   hue_widget = CHEESE_PREFS_WIDGET (cheese_prefs_balance_scale_new (prefs_dialog->hue_scale,
-                                                                    prefs_dialog->webcam, "hue",
+                                                                    prefs_dialog->camera, "hue",
                                                                     "gconf_prop_hue"));
 
   cheese_prefs_dialog_widgets_add (prefs_dialog->widgets, hue_widget);
@@ -196,14 +196,14 @@ cheese_prefs_dialog_destroy_dialog (CheesePrefsDialog *prefs_dialog)
 }
 
 void
-cheese_prefs_dialog_run (GtkWidget *parent, CheeseGConf *gconf, CheeseWebcam *webcam)
+cheese_prefs_dialog_run (GtkWidget *parent, CheeseGConf *gconf, CheeseCamera *camera)
 {
   CheesePrefsDialog *prefs_dialog;
 
   prefs_dialog = g_new0 (CheesePrefsDialog, 1);
 
   prefs_dialog->parent  = parent;
-  prefs_dialog->webcam  = webcam;
+  prefs_dialog->camera  = camera;
   prefs_dialog->widgets = cheese_prefs_dialog_widgets_new (gconf);
 
   cheese_prefs_dialog_create_dialog (prefs_dialog);
diff --git a/src/cheese-prefs-dialog.h b/src/cheese-prefs-dialog.h
index 569f7f8..ed768a1 100644
--- a/src/cheese-prefs-dialog.h
+++ b/src/cheese-prefs-dialog.h
@@ -24,13 +24,13 @@
   #include "cheese-config.h"
 #endif
 
-#include "cheese-webcam.h"
+#include <cheese-camera.h>
 #include "cheese-prefs-dialog-widgets.h"
 #include "cheese-prefs-resolution-combo.h"
-#include "cheese-prefs-webcam-combo.h"
+#include "cheese-prefs-camera-combo.h"
 #include "cheese-prefs-balance-scale.h"
 #include "cheese-prefs-burst-spinbox.h"
 
-void cheese_prefs_dialog_run (GtkWidget *parent, CheeseGConf *gconf, CheeseWebcam *webcam);
+void cheese_prefs_dialog_run (GtkWidget *parent, CheeseGConf *gconf, CheeseCamera *camera);
 
 #endif /* _CHEESE_PREFS_DIALOG_H_ */
diff --git a/src/cheese-prefs-resolution-combo.c b/src/cheese-prefs-resolution-combo.c
index 0399c41..1cbe68a 100644
--- a/src/cheese-prefs-resolution-combo.c
+++ b/src/cheese-prefs-resolution-combo.c
@@ -26,10 +26,10 @@ typedef struct
   unsigned int max_x_resolution;
   unsigned int max_y_resolution;
   GtkListStore *list_store;
-  CheeseWebcam *webcam;
+  CheeseCamera *camera;
   CheeseVideoFormat *selected_format;
   gboolean has_been_synchronized;  /* Make sure we don't synchronize if client
-                                    * sets webcam on construction. */
+                                    * sets camera on construction. */
 } CheesePrefsResolutionComboPrivate;
 
 #define CHEESE_PREFS_RESOLUTION_COMBO_GET_PRIVATE(o)                     \
@@ -44,7 +44,7 @@ enum
   PROP_Y_RESOLUTION_KEY,
   PROP_MAX_X_RESOLUTION,
   PROP_MAX_Y_RESOLUTION,
-  PROP_WEBCAM
+  PROP_CAMERA
 };
 
 enum
@@ -66,7 +66,7 @@ cheese_prefs_resolution_combo_init (CheesePrefsResolutionCombo *self)
   priv->max_x_resolution      = G_MAXUINT;
   priv->max_y_resolution      = G_MAXUINT;
   priv->list_store            = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_POINTER);
-  priv->webcam                = NULL;
+  priv->camera                = NULL;
   priv->selected_format       = NULL;
   priv->has_been_synchronized = FALSE;
 }
@@ -133,10 +133,10 @@ cheese_prefs_resolution_combo_synchronize (CheesePrefsWidget *prefs_widget)
   gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), NULL);
 
   gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), NULL);
-  current_format = cheese_webcam_get_current_video_format (priv->webcam);
+  current_format = cheese_camera_get_current_video_format (priv->camera);
 
   gtk_list_store_clear (priv->list_store);
-  formats = cheese_webcam_get_video_formats (priv->webcam);
+  formats = cheese_camera_get_video_formats (priv->camera);
 
   for (i = 0; i < formats->len; i++)
   {
@@ -202,10 +202,10 @@ cheese_prefs_resolution_combo_set_property (GObject *object, guint prop_id,
     case PROP_MAX_Y_RESOLUTION:
       priv->max_y_resolution = g_value_get_uint (value);
       break;
-    case PROP_WEBCAM:
-      priv->webcam = CHEESE_WEBCAM (g_value_get_object (value));
+    case PROP_CAMERA:
+      priv->camera = CHEESE_CAMERA (g_value_get_object (value));
 
-      /* If the webcam changes the resolutions change too. But only change the
+      /* If the camera changes the resolutions change too. But only change the
        * data if we've been synchronized once already. If this property is set
        * on construction, we would synchronize twice--once when the property is
        * set, and again when the dialog syncs when it's created. */
@@ -241,8 +241,8 @@ cheese_prefs_resolution_combo_get_property (GObject *object, guint prop_id,
     case PROP_MAX_Y_RESOLUTION:
       g_value_set_uint (value, priv->max_y_resolution);
       break;
-    case PROP_WEBCAM:
-      g_value_set_object (value, priv->webcam);
+    case PROP_CAMERA:
+      g_value_set_object (value, priv->camera);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -300,16 +300,16 @@ cheese_prefs_resolution_combo_class_init (CheesePrefsResolutionComboClass *klass
                                                       G_PARAM_READABLE | G_PARAM_WRITABLE));
 
   g_object_class_install_property (object_class,
-                                   PROP_WEBCAM,
-                                   g_param_spec_object ("webcam",
+                                   PROP_CAMERA,
+                                   g_param_spec_object ("camera",
                                                         "",
-                                                        "Webcam object",
-                                                        CHEESE_TYPE_WEBCAM,
+                                                        "Camera object",
+                                                        CHEESE_TYPE_CAMERA,
                                                         G_PARAM_READABLE | G_PARAM_WRITABLE));
 }
 
 CheesePrefsResolutionCombo *
-cheese_prefs_resolution_combo_new (GtkWidget *combo_box, CheeseWebcam *webcam,
+cheese_prefs_resolution_combo_new (GtkWidget *combo_box, CheeseCamera *camera,
                                    const gchar *x_resolution_key,
                                    const gchar *y_resolution_key,
                                    unsigned int max_x_resolution,
@@ -321,7 +321,7 @@ cheese_prefs_resolution_combo_new (GtkWidget *combo_box, CheeseWebcam *webcam,
 
   self = g_object_new (CHEESE_TYPE_PREFS_RESOLUTION_COMBO,
                        "widget", combo_box,
-                       "webcam", webcam,
+                       "camera", camera,
                        "x_resolution_key", x_resolution_key,
                        "y_resolution_key", y_resolution_key,
                        NULL);
diff --git a/src/cheese-prefs-resolution-combo.h b/src/cheese-prefs-resolution-combo.h
index c610b96..9fd11c0 100644
--- a/src/cheese-prefs-resolution-combo.h
+++ b/src/cheese-prefs-resolution-combo.h
@@ -21,8 +21,8 @@
 #define _CHEESE_PREFS_RESOLUTION_COMBO_H_
 
 #include <glib-object.h>
+#include <cheese-camera.h>
 #include "cheese-prefs-widget.h"
-#include "cheese-webcam.h"
 
 G_BEGIN_DECLS
 
@@ -56,7 +56,7 @@ struct _CheesePrefsResolutionCombo
 
 GType                       cheese_prefs_resolution_combo_get_type (void) G_GNUC_CONST;
 CheesePrefsResolutionCombo *cheese_prefs_resolution_combo_new (GtkWidget    *combo_box,
-                                                               CheeseWebcam *webcam,
+                                                               CheeseCamera *camera,
                                                                const gchar  *x_resolution_key,
                                                                const gchar  *y_resolution_key,
                                                                unsigned int  max_x_resolution,
diff --git a/src/cheese-window.c b/src/cheese-window.c
index 29cc38e..4c1f388 100644
--- a/src/cheese-window.c
+++ b/src/cheese-window.c
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2007,2008 daniel g. siegel <dgsiegel gnome org>
+ * Copyright © 2007-2009 daniel g. siegel <dgsiegel gnome org>
  * Copyright © 2007,2008 Jaap Haitsma <jaap haitsma org>
  * Copyright © 2008 Patryk Zawadzki <patrys pld-linux org>
  * Copyright © 2008 Ryan Zeigler <zeiglerr gmail com>
@@ -64,10 +64,10 @@
 
 typedef enum
 {
-  WEBCAM_MODE_PHOTO,
-  WEBCAM_MODE_VIDEO,
-  WEBCAM_MODE_BURST
-} WebcamMode;
+  CAMERA_MODE_PHOTO,
+  CAMERA_MODE_VIDEO,
+  CAMERA_MODE_BURST
+} CameraMode;
 
 typedef enum
 {
@@ -90,8 +90,8 @@ typedef struct
   char *startup_hal_dev_udi;
   char *video_filename;
 
-  CheeseWebcam *webcam;
-  WebcamMode webcam_mode;
+  CheeseCamera *camera;
+  CameraMode camera_mode;
   CheeseGConf *gconf;
   CheeseFileUtil *fileutil;
 
@@ -446,7 +446,7 @@ cheese_window_fullscreen_leave_notify_cb (GtkWidget        *widget,
 }
 
 static void
-cheese_window_photo_saved_cb (CheeseWebcam *webcam, CheeseWindow *cheese_window)
+cheese_window_photo_saved_cb (CheeseCamera *camera, CheeseWindow *cheese_window)
 {
   gdk_threads_enter ();
   if (!cheese_window->is_bursting)
@@ -461,7 +461,7 @@ cheese_window_photo_saved_cb (CheeseWebcam *webcam, CheeseWindow *cheese_window)
 }
 
 static void
-cheese_window_video_saved_cb (CheeseWebcam *webcam, CheeseWindow *cheese_window)
+cheese_window_video_saved_cb (CheeseCamera *camera, CheeseWindow *cheese_window)
 {
   gdk_threads_enter ();
 
@@ -478,7 +478,7 @@ cheese_window_video_saved_cb (CheeseWebcam *webcam, CheeseWindow *cheese_window)
 static void
 cheese_window_cmd_close (GtkWidget *widget, CheeseWindow *cheese_window)
 {
-  g_object_unref (cheese_window->webcam);
+  g_object_unref (cheese_window->camera);
   g_object_unref (cheese_window->actions_main);
   g_object_unref (cheese_window->actions_account_photo);
   g_object_unref (cheese_window->actions_countdown);
@@ -1206,11 +1206,11 @@ cheese_window_effect_button_pressed_cb (GtkWidget *widget, CheeseWindow *cheese_
     gtk_label_set_text_with_mnemonic (GTK_LABEL (cheese_window->label_effects), _("_Effects"));
     gtk_widget_set_sensitive (cheese_window->take_picture, TRUE);
     gtk_widget_set_sensitive (cheese_window->take_picture_fullscreen, TRUE);
-    if (cheese_window->webcam_mode == WEBCAM_MODE_PHOTO)
+    if (cheese_window->camera_mode == CAMERA_MODE_PHOTO)
     {
       gtk_action_group_set_sensitive (cheese_window->actions_photo, TRUE);
     }
-    else if (cheese_window->webcam_mode == WEBCAM_MODE_BURST)
+    else if (cheese_window->camera_mode == CAMERA_MODE_BURST)
     {
       gtk_action_group_set_sensitive (cheese_window->actions_burst, TRUE);
     }
@@ -1218,7 +1218,7 @@ cheese_window_effect_button_pressed_cb (GtkWidget *widget, CheeseWindow *cheese_
     {
       gtk_action_group_set_sensitive (cheese_window->actions_video, TRUE);
     }
-    cheese_webcam_set_effect (cheese_window->webcam,
+    cheese_camera_set_effect (cheese_window->camera,
                               cheese_effect_chooser_get_selection (CHEESE_EFFECT_CHOOSER (cheese_window->effect_chooser)));
     g_object_set (cheese_window->gconf, "gconf_prop_selected_effects",
                   cheese_effect_chooser_get_selection_string (CHEESE_EFFECT_CHOOSER (cheese_window->effect_chooser)),
@@ -1250,7 +1250,7 @@ cheese_window_countdown_picture_cb (gpointer data)
   CheeseWindow *cheese_window = (CheeseWindow *) data;
   char         *photo_filename;
 
-  if (cheese_window->webcam_mode == WEBCAM_MODE_BURST)
+  if (cheese_window->camera_mode == CAMERA_MODE_BURST)
   {
     photo_filename = cheese_fileutil_get_new_media_filename (cheese_window->fileutil, CHEESE_MEDIA_MODE_BURST);
   }
@@ -1259,7 +1259,7 @@ cheese_window_countdown_picture_cb (gpointer data)
     photo_filename = cheese_fileutil_get_new_media_filename (cheese_window->fileutil, CHEESE_MEDIA_MODE_PHOTO);
   }
 
-  if (cheese_webcam_take_photo (cheese_window->webcam, photo_filename))
+  if (cheese_camera_take_photo (cheese_window->camera, photo_filename))
   {
     cheese_flash_fire (cheese_window->flash);
     ca_gtk_play_for_widget (cheese_window->screen, 0,
@@ -1313,7 +1313,7 @@ cheese_window_stop_recording (CheeseWindow *cheese_window)
     gtk_image_set_from_stock (GTK_IMAGE (cheese_window->image_take_photo_fullscreen),
                               GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_BUTTON);
 
-    cheese_webcam_stop_video_recording (cheese_window->webcam);
+    cheese_camera_stop_video_recording (cheese_window->camera);
     cheese_window->recording = FALSE;
   }
 }
@@ -1336,7 +1336,7 @@ cheese_window_escape_key_cb (CheeseWindow *cheese_window,
   cheese_countdown_cancel ((CheeseCountdown *) cheese_window->countdown);
   cheese_countdown_cancel ((CheeseCountdown *) cheese_window->countdown_fullscreen);
 
-  if (cheese_window->webcam_mode == WEBCAM_MODE_PHOTO)
+  if (cheese_window->camera_mode == CAMERA_MODE_PHOTO)
   {
     gtk_notebook_set_current_page (GTK_NOTEBOOK (cheese_window->notebook_bar), 0);
     gtk_notebook_set_current_page (GTK_NOTEBOOK (cheese_window->fullscreen_bar), 0);
@@ -1344,7 +1344,7 @@ cheese_window_escape_key_cb (CheeseWindow *cheese_window,
     gtk_widget_set_sensitive (cheese_window->take_picture, TRUE);
     gtk_widget_set_sensitive (cheese_window->take_picture_fullscreen, TRUE);
   }
-  else if (cheese_window->webcam_mode == WEBCAM_MODE_BURST)
+  else if (cheese_window->camera_mode == CAMERA_MODE_BURST)
   {
     cheese_window->repeat_count = 0;
     cheese_window->is_bursting  = FALSE;
@@ -1372,7 +1372,7 @@ cheese_window_take_photo (gpointer data)
   CheeseWindow *cheese_window = (CheeseWindow *) data;
 
   /* return if burst mode was cancelled */
-  if (cheese_window->webcam_mode == WEBCAM_MODE_BURST &&
+  if (cheese_window->camera_mode == CAMERA_MODE_BURST &&
       !cheese_window->is_bursting && cheese_window->repeat_count <= 0)
   {
     return FALSE;
@@ -1413,7 +1413,7 @@ cheese_window_take_photo (gpointer data)
   gtk_widget_set_sensitive (cheese_window->take_picture, FALSE);
   gtk_widget_set_sensitive (cheese_window->take_picture_fullscreen, FALSE);
 
-  if (cheese_window->webcam_mode == WEBCAM_MODE_BURST)
+  if (cheese_window->camera_mode == CAMERA_MODE_BURST)
   {
     guint    repeat_delay = 1000;
     gboolean countdown    = FALSE;
@@ -1450,9 +1450,9 @@ cheese_window_action_button_clicked_cb (GtkWidget *widget, CheeseWindow *cheese_
 {
   char *str;
 
-  switch (cheese_window->webcam_mode)
+  switch (cheese_window->camera_mode)
   {
-    case WEBCAM_MODE_BURST:
+    case CAMERA_MODE_BURST:
 
       /* ignore keybindings and other while bursting */
       if (cheese_window->is_bursting)
@@ -1463,10 +1463,10 @@ cheese_window_action_button_clicked_cb (GtkWidget *widget, CheeseWindow *cheese_
       gtk_action_group_set_sensitive (cheese_window->actions_toggle, FALSE);
       g_object_get (cheese_window->gconf, "gconf_prop_burst_repeat", &cheese_window->repeat_count, NULL); /* reset burst counter */
       cheese_fileutil_reset_burst (cheese_window->fileutil); /* reset filename counter */
-    case WEBCAM_MODE_PHOTO:
+    case CAMERA_MODE_PHOTO:
       cheese_window_take_photo (cheese_window);
       break;
-    case WEBCAM_MODE_VIDEO:
+    case CAMERA_MODE_VIDEO:
       if (!cheese_window->recording)
       {
         gtk_action_group_set_sensitive (cheese_window->actions_effects, FALSE);
@@ -1483,8 +1483,8 @@ cheese_window_action_button_clicked_cb (GtkWidget *widget, CheeseWindow *cheese_
                                   GTK_STOCK_MEDIA_STOP, GTK_ICON_SIZE_BUTTON);
 
         cheese_window->video_filename = cheese_fileutil_get_new_media_filename (cheese_window->fileutil,
-                                                                                WEBCAM_MODE_VIDEO);
-        cheese_webcam_start_video_recording (cheese_window->webcam, cheese_window->video_filename);
+                                                                                CAMERA_MODE_VIDEO);
+        cheese_camera_start_video_recording (cheese_window->camera, cheese_window->video_filename);
 
         cheese_window->recording = TRUE;
       }
@@ -1503,7 +1503,7 @@ static void
 cheese_window_preferences_cb (GtkAction *action, CheeseWindow *cheese_window)
 {
   cheese_prefs_dialog_run (cheese_window->window, cheese_window->gconf,
-                           cheese_window->webcam);
+                           cheese_window->camera);
 }
 
 static const GtkActionEntry action_entries_main[] = {
@@ -1597,7 +1597,7 @@ cheese_window_activate_radio_action (GtkAction *action, GtkRadioAction *current,
 
   if (strcmp (gtk_action_get_name (GTK_ACTION (current)), "Photo") == 0)
   {
-    cheese_window->webcam_mode = WEBCAM_MODE_PHOTO;
+    cheese_window->camera_mode = CAMERA_MODE_PHOTO;
 
     str = g_strconcat ("<b>", _("_Take a Photo"), "</b>", NULL);
     gtk_label_set_text_with_mnemonic (GTK_LABEL (cheese_window->label_take_photo), g_strdup (str));
@@ -1610,7 +1610,7 @@ cheese_window_activate_radio_action (GtkAction *action, GtkRadioAction *current,
   }
   else if (strcmp (gtk_action_get_name (GTK_ACTION (current)), "Burst") == 0)
   {
-    cheese_window->webcam_mode = WEBCAM_MODE_BURST;
+    cheese_window->camera_mode = CAMERA_MODE_BURST;
 
     str = g_strconcat ("<b>", _("_Take multiple Photos"), "</b>", NULL);
     gtk_label_set_text_with_mnemonic (GTK_LABEL (cheese_window->label_take_photo), g_strdup (str));
@@ -1623,7 +1623,7 @@ cheese_window_activate_radio_action (GtkAction *action, GtkRadioAction *current,
   }
   else
   {
-    cheese_window->webcam_mode = WEBCAM_MODE_VIDEO;
+    cheese_window->camera_mode = CAMERA_MODE_VIDEO;
 
     str = g_strconcat ("<b>", _("_Start recording"), "</b>", NULL);
     gtk_label_set_text_with_mnemonic (GTK_LABEL (cheese_window->label_take_photo), g_strdup (str));
@@ -2007,7 +2007,7 @@ cheese_window_create_window (CheeseWindow *cheese_window)
 void
 setup_camera (CheeseWindow *cheese_window)
 {
-  char      *webcam_device = NULL;
+  char      *camera_device = NULL;
   int        x_resolution;
   int        y_resolution;
   gdouble    brightness;
@@ -2021,7 +2021,7 @@ setup_camera (CheeseWindow *cheese_window)
   g_object_get (cheese_window->gconf,
                 "gconf_prop_x_resolution", &x_resolution,
                 "gconf_prop_y_resolution", &y_resolution,
-                "gconf_prop_webcam", &webcam_device,
+                "gconf_prop_camera", &camera_device,
                 "gconf_prop_brightness", &brightness,
                 "gconf_prop_contrast", &contrast,
                 "gconf_prop_saturation", &saturation,
@@ -2029,15 +2029,15 @@ setup_camera (CheeseWindow *cheese_window)
                 NULL);
 
   gdk_threads_enter ();
-  cheese_window->webcam = cheese_webcam_new (cheese_window->screen,
-                                             webcam_device, x_resolution,
+  cheese_window->camera = cheese_camera_new (cheese_window->screen,
+                                             camera_device, x_resolution,
                                              y_resolution);
   gdk_threads_leave ();
 
-  g_free (webcam_device);
+  g_free (camera_device);
 
   error = NULL;
-  cheese_webcam_setup (cheese_window->webcam, cheese_window->startup_hal_dev_udi, &error);
+  cheese_camera_setup (cheese_window->camera, cheese_window->startup_hal_dev_udi, &error);
   if (error != NULL)
   {
     GtkWidget *dialog;
@@ -2069,24 +2069,24 @@ setup_camera (CheeseWindow *cheese_window)
     return;
   }
 
-  g_signal_connect (cheese_window->webcam, "photo-saved",
+  g_signal_connect (cheese_window->camera, "photo-saved",
                     G_CALLBACK (cheese_window_photo_saved_cb), cheese_window);
-  g_signal_connect (cheese_window->webcam, "video-saved",
+  g_signal_connect (cheese_window->camera, "video-saved",
                     G_CALLBACK (cheese_window_video_saved_cb), cheese_window);
 
-  cheese_webcam_set_effect (cheese_window->webcam,
+  cheese_camera_set_effect (cheese_window->camera,
                             cheese_effect_chooser_get_selection (CHEESE_EFFECT_CHOOSER (cheese_window->effect_chooser)));
 
-  cheese_webcam_set_balance_property (cheese_window->webcam, "brightness", brightness);
-  cheese_webcam_set_balance_property (cheese_window->webcam, "contrast", contrast);
-  cheese_webcam_set_balance_property (cheese_window->webcam, "saturation", saturation);
-  cheese_webcam_set_balance_property (cheese_window->webcam, "hue", hue);
+  cheese_camera_set_balance_property (cheese_window->camera, "brightness", brightness);
+  cheese_camera_set_balance_property (cheese_window->camera, "contrast", contrast);
+  cheese_camera_set_balance_property (cheese_window->camera, "saturation", saturation);
+  cheese_camera_set_balance_property (cheese_window->camera, "hue", hue);
 
-  cheese_webcam_play (cheese_window->webcam);
+  cheese_camera_play (cheese_window->camera);
   gdk_threads_enter ();
   gtk_notebook_set_current_page (GTK_NOTEBOOK (cheese_window->notebook), 0);
   ephy_spinner_stop (EPHY_SPINNER (cheese_window->throbber));
-  if (cheese_webcam_get_num_webcam_devices (cheese_window->webcam) == 0)
+  if (cheese_camera_get_num_camera_devices (cheese_window->camera) == 0)
   {
     info_bar = cheese_no_camera_info_bar_new ();
 
@@ -2133,7 +2133,7 @@ cheese_window_init (char *hal_dev_udi, CheeseDbus *dbus_server, gboolean startup
 
   gtk_notebook_set_current_page (GTK_NOTEBOOK (cheese_window->notebook), 2);
 
-  cheese_window->webcam_mode = WEBCAM_MODE_PHOTO;
+  cheese_window->camera_mode = CAMERA_MODE_PHOTO;
   cheese_window->recording   = FALSE;
 
   g_object_get (cheese_window->gconf,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]