cheese/cheese-2.23.91-cheese_webcam_get_supported_video_formats-shuffle.patch

238 lines
9.6 KiB
Diff

diff -up cheese-2.23.91/src/cheese-webcam.c.coocoo cheese-2.23.91/src/cheese-webcam.c
--- cheese-2.23.91/src/cheese-webcam.c.coocoo 2008-09-03 20:34:12.000000000 +0200
+++ cheese-2.23.91/src/cheese-webcam.c 2008-09-03 22:36:43.000000000 +0200
@@ -48,6 +48,8 @@ G_DEFINE_TYPE (CheeseWebcam, cheese_webc
#define CHEESE_WEBCAM_ERROR cheese_webcam_error_quark ()
+static void find_highest_framerate (CheeseVideoFormat *format);
+
enum CheeseWebcamError
{
CHEESE_WEBCAM_ERROR_UNKNOWN,
@@ -444,6 +446,33 @@ cheese_webcam_get_supported_framerates (
}
static void
+cheese_webcam_add_video_format (CheeseWebcamDevice *webcam_device,
+ CheeseVideoFormat *video_format, GstStructure *format_structure)
+{
+ int i;
+
+ cheese_webcam_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,
+ video_format->height, video_format->num_framerates);
+ for (i = 0; i < video_format->num_framerates; i++)
+ {
+ g_print ("%d/%d ", video_format->framerates[i].numerator,
+ video_format->framerates[i].denominator);
+ }
+ g_print ("\n");
+
+ g_array_append_val (webcam_device->video_formats, *video_format);
+ g_hash_table_insert (webcam_device->supported_resolutions,
+ g_strdup_printf ("%ix%i", video_format->width,
+ video_format->height),
+ GINT_TO_POINTER(webcam_device->num_video_formats + 1));
+
+ webcam_device->num_video_formats++;
+}
+
+static void
cheese_webcam_get_supported_video_formats (CheeseWebcamDevice *webcam_device, GstCaps *caps)
{
int i;
@@ -476,10 +505,7 @@ cheese_webcam_get_supported_video_format
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_get_supported_framerates (&video_format, structure);
-
- g_array_append_val (webcam_device->video_formats, video_format);
- webcam_device->num_video_formats++;
+ cheese_webcam_add_video_format(webcam_device, &video_format, structure);
}
else if (GST_VALUE_HOLDS_INT_RANGE (width))
{
@@ -500,9 +526,7 @@ cheese_webcam_get_supported_video_format
video_format.mimetype = g_strdup (gst_structure_get_name (structure));
video_format.width = cur_width;
video_format.height = cur_height;
- cheese_webcam_get_supported_framerates (&video_format, structure);
- g_array_append_val (webcam_device->video_formats, video_format);
- webcam_device->num_video_formats++;
+ cheese_webcam_add_video_format(webcam_device, &video_format, structure);
cur_width *= 2;
cur_height *= 2;
}
@@ -516,9 +540,7 @@ cheese_webcam_get_supported_video_format
video_format.mimetype = g_strdup (gst_structure_get_name (structure));
video_format.width = cur_width;
video_format.height = cur_height;
- cheese_webcam_get_supported_framerates (&video_format, structure);
- g_array_append_val (webcam_device->video_formats, video_format);
- webcam_device->num_video_formats++;
+ cheese_webcam_add_video_format(webcam_device, &video_format, structure);
cur_width /= 2;
cur_height /= 2;
}
@@ -540,7 +562,6 @@ cheese_webcam_get_webcam_device_data (Ch
GstStateChangeReturn ret;
GstMessage *msg;
GstBus *bus;
- int i, j;
{
pipeline_desc = g_strdup_printf ("%s name=source device=%s ! fakesink",
@@ -575,6 +596,7 @@ cheese_webcam_get_webcam_device_data (Ch
name = "Unknown";
g_print ("Detected webcam: %s\n", name);
+ g_print ("device: %s\n", webcam_device->video_device);
pad = gst_element_get_pad (src, "src");
caps = gst_pad_get_caps (pad);
gst_object_unref (pad);
@@ -589,27 +611,6 @@ cheese_webcam_get_webcam_device_data (Ch
g_free (pipeline_desc);
}
-
- g_print ("device: %s\n", webcam_device->video_device);
- for (i = 0; i < webcam_device->num_video_formats; i++)
- {
- CheeseVideoFormat video_format;
-
- video_format = g_array_index (webcam_device->video_formats, CheeseVideoFormat, i);
- g_hash_table_insert (webcam_device->supported_resolutions,
- g_strdup_printf ("%ix%i", video_format.width,
- video_format.height),
- &g_array_index (webcam_device->video_formats,
- CheeseVideoFormat, i));
- g_print ("%s %d x %d num_framerates %d\n", video_format.mimetype, video_format.width,
- video_format.height, video_format.num_framerates);
- for (j = 0; j < video_format.num_framerates; j++)
- {
- g_print ("%d/%d ", video_format.framerates[j].numerator,
- video_format.framerates[j].denominator);
- }
- g_print ("\n");
- }
}
static void
@@ -651,8 +652,7 @@ cheese_webcam_detect_webcam_devices (Che
}
static void
-find_highest_framerate (CheeseVideoFormat *format, int *numerator,
- int *denominator)
+find_highest_framerate (CheeseVideoFormat *format)
{
int framerate_numerator;
int framerate_denominator;
@@ -672,8 +672,8 @@ find_highest_framerate (CheeseVideoForma
}
}
- *numerator = framerate_numerator;
- *denominator = framerate_denominator;
+ format->highest_framerate.numerator = framerate_numerator;
+ format->highest_framerate.denominator = framerate_denominator;
}
static gboolean
@@ -695,7 +695,6 @@ cheese_webcam_create_webcam_source_bin (
{
CheeseVideoFormat *format;
int i;
- int framerate_numerator, framerate_denominator;
gchar *resolution;
/* If we have a matching video device use that one, otherwise use the first */
@@ -714,7 +713,12 @@ cheese_webcam_create_webcam_source_bin (
/* Use the previously set resolution from gconf if it is set and the
* camera supports it. */
if (priv->x_resolution != 0 && priv->y_resolution != 0)
- format = g_hash_table_lookup (selected_webcam->supported_resolutions, resolution);
+ {
+ i = GPOINTER_TO_INT(g_hash_table_lookup (selected_webcam->supported_resolutions, resolution));
+ if (i)
+ format = &g_array_index (selected_webcam->video_formats,
+ CheeseVideoFormat, i - 1);
+ }
if (!format)
{
@@ -738,21 +742,18 @@ cheese_webcam_create_webcam_source_bin (
if (format == NULL)
goto fallback;
- find_highest_framerate (format, &framerate_numerator,
- &framerate_denominator);
-
webcam_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,
format->width,
format->height,
- framerate_numerator,
- framerate_denominator,
+ format->highest_framerate.numerator,
+ format->highest_framerate.denominator,
format->width,
format->height,
- framerate_numerator,
- framerate_denominator);
+ format->highest_framerate.numerator,
+ format->highest_framerate.denominator);
g_print ("%s\n", webcam_input);
priv->webcam_source_bin = gst_parse_bin_from_description (webcam_input,
@@ -1539,10 +1540,6 @@ cheese_webcam_set_video_format (CheeseWe
CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
GstCaps *new_caps;
- int framerate_numerator;
- int framerate_denominator;
-
- find_highest_framerate (format, &framerate_numerator, &framerate_denominator);
new_caps = gst_caps_new_simple ("video/x-raw-rgb",
"width", G_TYPE_INT,
@@ -1550,8 +1547,8 @@ cheese_webcam_set_video_format (CheeseWe
"height", G_TYPE_INT,
format->height,
"framerate", GST_TYPE_FRACTION,
- framerate_numerator,
- framerate_denominator,
+ format->highest_framerate.numerator,
+ format->highest_framerate.denominator,
NULL);
gst_caps_append(new_caps, gst_caps_new_simple ("video/x-raw-yuv",
@@ -1560,8 +1557,8 @@ cheese_webcam_set_video_format (CheeseWe
"height", G_TYPE_INT,
format->height,
"framerate", GST_TYPE_FRACTION,
- framerate_numerator,
- framerate_denominator,
+ format->highest_framerate.numerator,
+ format->highest_framerate.denominator,
NULL));
priv->current_format = format;
diff -up cheese-2.23.91/src/cheese-webcam.h.coocoo cheese-2.23.91/src/cheese-webcam.h
--- cheese-2.23.91/src/cheese-webcam.h.coocoo 2008-09-03 20:27:59.000000000 +0200
+++ cheese-2.23.91/src/cheese-webcam.h 2008-09-03 22:31:42.000000000 +0200
@@ -49,6 +49,7 @@ typedef struct
int height;
int num_framerates;
CheeseFramerate *framerates;
+ CheeseFramerate highest_framerate;
} CheeseVideoFormat;
typedef struct