[aravis] viewer: working frame rate control, and log exposure slider.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [aravis] viewer: working frame rate control, and log exposure slider.
- Date: Wed, 5 Jan 2011 15:27:31 +0000 (UTC)
commit 2b17430bf207087f0ae5a680228c69bdbe3d1fa3
Author: Emmanuel Pacaud <emmanuel pacaud lapp in2p3 fr>
Date: Wed Jan 5 16:27:08 2011 +0100
viewer: working frame rate control, and log exposure slider.
viewer/Makefile.am | 2 +-
viewer/arv-viewer.ui | 11 -------
viewer/arvviewer.c | 81 ++++++++++++++++++++++++++++++++++++++++++-------
3 files changed, 70 insertions(+), 24 deletions(-)
---
diff --git a/viewer/Makefile.am b/viewer/Makefile.am
index dd2a19f..65c41d5 100644
--- a/viewer/Makefile.am
+++ b/viewer/Makefile.am
@@ -9,7 +9,7 @@ INCLUDES = \
-DARAVIS_DATA_DIR=\""$(aravis_datadir)"\" \
-DG_LOG_DOMAIN=\"Aravis\"
-AM_CFLAGS = -Wall
+AM_CFLAGS = -Wall -lm
bin_PROGRAMS = arv-viewer
diff --git a/viewer/arv-viewer.ui b/viewer/arv-viewer.ui
index 8b228bd..06a5d71 100644
--- a/viewer/arv-viewer.ui
+++ b/viewer/arv-viewer.ui
@@ -127,17 +127,6 @@
</packing>
</child>
<child>
- <object class="GtkHScale" id="frame_rate_hscale">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="draw_value">False</property>
- </object>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- </packing>
- </child>
- <child>
<object class="GtkHScale" id="exposure_hscale">
<property name="visible">True</property>
<property name="can_focus">True</property>
diff --git a/viewer/arvviewer.c b/viewer/arvviewer.c
index 5a53848..762710e 100644
--- a/viewer/arvviewer.c
+++ b/viewer/arvviewer.c
@@ -5,6 +5,7 @@
#include <gdk/gdkx.h>
#include <arv.h>
#include <stdlib.h>
+#include <math.h>
typedef struct {
ArvCamera *camera;
@@ -20,6 +21,7 @@ typedef struct {
GtkWidget *main_window;
GtkWidget *drawing_area;
GtkWidget *camera_combo_box;
+ GtkWidget *frame_rate_entry;
GtkWidget *exposure_spin_button;
GtkWidget *gain_spin_button;
GtkWidget *exposure_hscale;
@@ -29,8 +31,36 @@ typedef struct {
gulong gain_spin_changed;
gulong exposure_hscale_changed;
gulong gain_hscale_changed;
+
+ double exposure_min, exposure_max;
} ArvViewer;
+double
+arv_viewer_value_to_log (double value, double min, double max)
+{
+ if (min >= max)
+ return 1.0;
+
+ if (value < min)
+ return 0.0;
+
+ return (log10 (value) - log10 (min)) / (log10 (max) - log10 (min));
+}
+
+double
+arv_viewer_value_from_log (double value, double min, double max)
+{
+ if (min <= 0.0 || max <= 0)
+ return 0.0;
+
+ if (value > 1.0)
+ return max;
+ if (value < 0.0)
+ return min;
+
+ return pow (10.0, (value * (log10 (max) - log10 (min)) + log10 (min)));
+}
+
void
arv_viewer_update_device_list_cb (ArvViewer *viewer)
{
@@ -85,12 +115,25 @@ arv_viewer_new_buffer_cb (ArvStream *stream, ArvViewer *viewer)
}
void
+arv_viewer_frame_rate_entry_cb (GtkEntry *entry, ArvViewer *viewer)
+{
+ const char *text;
+
+ text = gtk_entry_get_text (entry);
+
+ arv_camera_set_frame_rate (viewer->camera, g_strtod (text, NULL));
+}
+
+void
arv_viewer_exposure_spin_cb (GtkSpinButton *spin_button, ArvViewer *viewer)
{
- arv_camera_set_exposure_time (viewer->camera, gtk_spin_button_get_value (spin_button));
+ double exposure = gtk_spin_button_get_value (spin_button);
+ double log_exposure = arv_viewer_value_to_log (exposure, viewer->exposure_min, viewer->exposure_max);
+
+ arv_camera_set_exposure_time (viewer->camera, exposure);
g_signal_handler_block (viewer->exposure_hscale, viewer->exposure_hscale_changed);
- gtk_range_set_value (GTK_RANGE (viewer->exposure_hscale), gtk_spin_button_get_value (spin_button));
+ gtk_range_set_value (GTK_RANGE (viewer->exposure_hscale), log_exposure);
g_signal_handler_unblock (viewer->exposure_hscale, viewer->exposure_hscale_changed);
}
@@ -107,10 +150,13 @@ arv_viewer_gain_spin_cb (GtkSpinButton *spin_button, ArvViewer *viewer)
void
arv_viewer_exposure_scale_cb (GtkRange *range, ArvViewer *viewer)
{
- arv_camera_set_exposure_time (viewer->camera, gtk_range_get_value (range));
+ double log_exposure = gtk_range_get_value (range);
+ double exposure = arv_viewer_value_from_log (log_exposure, viewer->exposure_min, viewer->exposure_max);
+
+ arv_camera_set_exposure_time (viewer->camera, exposure);
g_signal_handler_block (viewer->exposure_spin_button, viewer->exposure_spin_changed);
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->exposure_spin_button), gtk_range_get_value (range));
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->exposure_spin_button), exposure);
g_signal_handler_unblock (viewer->exposure_spin_button, viewer->exposure_spin_changed);
}
@@ -162,13 +208,15 @@ arv_viewer_select_camera_cb (GtkComboBox *combo_box, ArvViewer *viewer)
GstElement *ffmpegcolorspace;
GstElement *ximagesink;
char *camera_id;
+ char *text;
unsigned int payload;
int width;
int height;
- unsigned int frame_rate;
unsigned int i;
gulong window_xid;
- double exposure, exposure_min, exposure_max;
+ double exposure;
+ double log_exposure;
+ double frame_rate;
gint64 gain, gain_min, gain_max;
g_return_if_fail (viewer != NULL);
@@ -188,24 +236,30 @@ arv_viewer_select_camera_cb (GtkComboBox *combo_box, ArvViewer *viewer)
arv_stream_push_buffer (viewer->stream, arv_buffer_new (payload, NULL));
arv_camera_get_region (viewer->camera, NULL, NULL, &width, &height);
- frame_rate = (unsigned int) (double) (0.5 + arv_camera_get_frame_rate (viewer->camera));
exposure = arv_camera_get_exposure_time (viewer->camera);
gain = arv_camera_get_gain (viewer->camera);
- arv_camera_get_exposure_time_bounds (viewer->camera, &exposure_min, &exposure_max);
+ arv_camera_get_exposure_time_bounds (viewer->camera, &viewer->exposure_min, &viewer->exposure_max);
arv_camera_get_gain_bounds (viewer->camera, &gain_min, &gain_max);
+ frame_rate = arv_camera_get_frame_rate (viewer->camera);
- gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->exposure_spin_button), exposure_min, exposure_max);
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->exposure_spin_button), viewer->exposure_min, viewer->exposure_max);
gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->exposure_spin_button), 200.0, 1000.0);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->exposure_spin_button), exposure);
gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->gain_spin_button), gain_min, gain_max);
gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->gain_spin_button), 1, 10);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->gain_spin_button), gain);
- gtk_range_set_range (GTK_RANGE (viewer->exposure_hscale), exposure_min, exposure_max);
- gtk_range_set_value (GTK_RANGE (viewer->exposure_hscale), exposure);
+ log_exposure = arv_viewer_value_to_log (exposure, viewer->exposure_min, viewer->exposure_max);
+
+ gtk_range_set_range (GTK_RANGE (viewer->exposure_hscale), 0.0, 1.0);
+ gtk_range_set_value (GTK_RANGE (viewer->exposure_hscale), log_exposure);
gtk_range_set_range (GTK_RANGE (viewer->gain_hscale), gain_min, gain_max);
gtk_range_set_value (GTK_RANGE (viewer->gain_hscale), gain);
+ text = g_strdup_printf ("%g", frame_rate);
+ gtk_entry_set_text (GTK_ENTRY (viewer->frame_rate_entry), text);
+ g_free (text);
+
arv_camera_start_acquisition (viewer->camera);
viewer->pipeline = gst_pipeline_new ("pipeline");
@@ -222,7 +276,7 @@ arv_viewer_select_camera_cb (GtkComboBox *combo_box, ArvViewer *viewer)
"endianness", G_TYPE_INT, G_BIG_ENDIAN,
"width", G_TYPE_INT, width,
"height", G_TYPE_INT, height,
- "framerate", GST_TYPE_FRACTION, frame_rate, 1,
+ "framerate", GST_TYPE_FRACTION, (unsigned int ) (double) (0.5 + frame_rate), 1,
"pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
NULL);
gst_app_src_set_caps (GST_APP_SRC (viewer->appsrc), caps);
@@ -270,6 +324,7 @@ arv_viewer_new (void)
viewer->camera_combo_box = GTK_WIDGET (gtk_builder_get_object (builder, "camera_combobox"));
viewer->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
viewer->drawing_area = GTK_WIDGET (gtk_builder_get_object (builder, "video_drawingarea"));
+ viewer->frame_rate_entry = GTK_WIDGET (gtk_builder_get_object (builder, "frame_rate_entry"));
viewer->exposure_spin_button = GTK_WIDGET (gtk_builder_get_object (builder, "exposure_spinbutton"));
viewer->gain_spin_button = GTK_WIDGET (gtk_builder_get_object (builder, "gain_spinbutton"));
viewer->exposure_hscale = GTK_WIDGET (gtk_builder_get_object (builder, "exposure_hscale"));
@@ -286,6 +341,8 @@ arv_viewer_new (void)
g_signal_connect (viewer->main_window, "destroy", G_CALLBACK (arv_viewer_quit_cb), viewer);
g_signal_connect (viewer->camera_combo_box, "changed", G_CALLBACK (arv_viewer_select_camera_cb), viewer);
+ g_signal_connect (viewer->frame_rate_entry, "changed", G_CALLBACK (arv_viewer_frame_rate_entry_cb), viewer);
+
viewer->exposure_spin_changed = g_signal_connect (viewer->exposure_spin_button, "value-changed",
G_CALLBACK (arv_viewer_exposure_spin_cb), viewer);
viewer->gain_spin_changed = g_signal_connect (viewer->gain_spin_button, "value-changed",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]