summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@gmail.com>2013-04-10 09:02:09 +0200
committerMatthias Vogelgesang <matthias.vogelgesang@gmail.com>2013-04-10 09:02:09 +0200
commit0ef77576760e3b384ff15f6155c6073ab96fc8c7 (patch)
tree0951d48033ece37fdacd9745529de2a6deb43a0b
parent617a46bff0cda0a30e30e5173f1666b2338bff25 (diff)
downloaduca-0ef77576760e3b384ff15f6155c6073ab96fc8c7.tar.gz
uca-0ef77576760e3b384ff15f6155c6073ab96fc8c7.tar.bz2
uca-0ef77576760e3b384ff15f6155c6073ab96fc8c7.tar.xz
uca-0ef77576760e3b384ff15f6155c6073ab96fc8c7.zip
grab takes -n and -t parameters now
-rw-r--r--tools/CMakeLists.txt2
-rw-r--r--tools/grab.c238
-rw-r--r--tools/gui/CMakeLists.txt3
-rw-r--r--tools/ring-buffer.c (renamed from tools/gui/ring-buffer.c)6
-rw-r--r--tools/ring-buffer.h (renamed from tools/gui/ring-buffer.h)1
5 files changed, 146 insertions, 104 deletions
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 0e4d28e..66cbd6b 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -21,7 +21,7 @@ set(libs uca ${GLIB2_LIBRARIES} ${GOBJECT2_LIBRARIES})
add_executable(gen-doc gen-doc.c)
target_link_libraries(gen-doc ${libs})
-add_executable(grab grab.c)
+add_executable(grab grab.c ring-buffer.c)
target_link_libraries(grab ${libs})
add_executable(grab-async grab-async.c)
diff --git a/tools/grab.c b/tools/grab.c
index e8e91be..bbe9269 100644
--- a/tools/grab.c
+++ b/tools/grab.c
@@ -21,140 +21,174 @@
#include <stdlib.h>
#include "uca-plugin-manager.h"
#include "uca-camera.h"
+#include "ring-buffer.h"
-static UcaCamera *camera = NULL;
-static void sigint_handler(int signal)
-{
- printf("Closing down libuca\n");
- uca_camera_stop_recording(camera, NULL);
- g_object_unref(camera);
- exit(signal);
-}
+typedef struct {
+ gint n_frames;
+ gdouble duration;
+} Options;
-static void
-print_usage (void)
+
+static gchar *
+get_camera_list (void)
{
GList *types;
+ GString *str;
UcaPluginManager *manager;
manager = uca_plugin_manager_new ();
- g_print ("Usage: benchmark [ ");
types = uca_plugin_manager_get_available_cameras (manager);
+ str = g_string_new ("[ ");
+
+ if (types != NULL) {
+ for (GList *it = g_list_first (types); it != NULL; it = g_list_next (it)) {
+ gchar *name = (gchar *) it->data;
- if (types == NULL) {
- g_print ("] -- no camera plugin found\n");
- return;
+ if (g_list_next (it) == NULL)
+ g_string_append_printf (str, "%s ]", name);
+ else
+ g_string_append_printf (str, "%s, ", name);
+ }
}
+ else {
+ g_string_append (str, "]");
+ }
+
+ g_object_unref (manager);
+ return g_string_free (str, FALSE);
+}
- for (GList *it = g_list_first (types); it != NULL; it = g_list_next (it)) {
- gchar *name = (gchar *) it->data;
- if (g_list_next (it) == NULL)
- g_print ("%s ]\n", name);
- else
- g_print ("%s, ", name);
+static void
+store_frames (RingBuffer *buffer)
+{
+ guint n_frames;
+ gsize size;
+
+ size = ring_buffer_get_block_size (buffer);
+ n_frames = ring_buffer_get_num_blocks (buffer);
+
+ for (gint i = 0; i < n_frames; i++) {
+ FILE *fp;
+ gchar *filename;
+ gpointer data;
+
+ filename = g_strdup_printf ("frame-%08i.raw", i);
+ fp = fopen(filename, "wb");
+ data = ring_buffer_get_pointer (buffer, i);
+
+ fwrite (data, size, 1, fp);
+ fclose (fp);
+ g_free (filename);
}
}
-int main(int argc, char *argv[])
+static GError *
+record_frames (UcaCamera *camera, Options *opts)
{
+ guint roi_width;
+ guint roi_height;
+ guint bits;
+ guint pixel_size;
+ gsize size;
+ gint n_frames;
+ guint n_allocated;
+ GTimer *timer;
+ RingBuffer *buffer;
+ GError *error = NULL;
+
+ g_object_get (G_OBJECT (camera),
+ "roi-width", &roi_width,
+ "roi-height", &roi_height,
+ "sensor-bitdepth", &bits,
+ NULL);
+
+ pixel_size = bits == 8 ? 1 : 2;
+ size = roi_width * roi_height * pixel_size;
+ n_allocated = opts->n_frames > 0 ? opts->n_frames : 256;
+ buffer = ring_buffer_new (size, n_allocated);
+ timer = g_timer_new();
+
+ g_print("Start recording: %ix%i at %i bits/pixel\n",
+ roi_width, roi_height, bits);
+
+ uca_camera_start_recording(camera, &error);
+
+ if (error != NULL)
+ return error;
+
+ n_frames = 0;
+ g_timer_start(timer);
+
+ while (n_frames < opts->n_frames || g_timer_elapsed (timer, NULL) < opts->duration) {
+ uca_camera_grab (camera, ring_buffer_get_current_pointer (buffer), &error);
+ ring_buffer_proceed (buffer);
+
+ if (error != NULL)
+ return error;
+
+ n_frames++;
+ }
+
+ g_print ("Stop recording\n");
+ uca_camera_stop_recording (camera, &error);
+ store_frames (buffer);
+ ring_buffer_free (buffer);
+ g_timer_destroy (timer);
+
+ return error;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GOptionContext *context;
UcaPluginManager *manager;
+ UcaCamera *camera;
+ gchar *cam_list;
GError *error = NULL;
- (void) signal(SIGINT, sigint_handler);
- guint sensor_width, sensor_height;
- guint roi_width, roi_height, roi_x, roi_y, roi_width_multiplier, roi_height_multiplier;
- guint bits;
- gchar *name;
+ static Options opts = {
+ .n_frames = -1,
+ .duration = -1.0
+ };
+
+ static GOptionEntry entries[] = {
+ { "num-frames", 'n', 0, G_OPTION_ARG_INT, &opts.n_frames, "Number of frames to acquire", "N" },
+ { "time", 't', 0, G_OPTION_ARG_DOUBLE, &opts.duration, "Duration in seconds", NULL },
+ { NULL }
+ };
g_type_init();
+ cam_list = get_camera_list ();
+ context = g_option_context_new (cam_list);
+ g_option_context_add_main_entries (context, entries, NULL);
+ g_free (cam_list);
+
+ if (!g_option_context_parse (context, &argc, &argv, &error)) {
+ g_print ("Failed parsing arguments: %s\n", error->message);
+ exit (1);
+ }
+
if (argc < 2) {
- print_usage();
- return 1;
+ g_print ("%s\n", g_option_context_get_help (context, TRUE, NULL));
+ exit (0);
}
manager = uca_plugin_manager_new ();
camera = uca_plugin_manager_get_camera (manager, argv[1], &error, NULL);
if (camera == NULL) {
- g_print("Error during initialization: %s\n", error->message);
- return 1;
- }
-
- g_object_get(G_OBJECT(camera),
- "sensor-width", &sensor_width,
- "sensor-height", &sensor_height,
- "name", &name,
- NULL);
-
- g_object_set(G_OBJECT(camera),
- "exposure-time", 0.001,
- "roi-x0", 0,
- "roi-y0", 0,
- "roi-width", 1000,
- "roi-height", sensor_height,
- NULL);
-
- g_object_get(G_OBJECT(camera),
- "roi-width", &roi_width,
- "roi-height", &roi_height,
- "roi-width-multiplier", &roi_width_multiplier,
- "roi-height-multiplier", &roi_height_multiplier,
- "roi-x0", &roi_x,
- "roi-y0", &roi_y,
- "sensor-bitdepth", &bits,
- NULL);
-
- g_print("Camera: %s\n", name);
- g_free(name);
-
- g_print("Sensor: %ix%i px\n", sensor_width, sensor_height);
- g_print("ROI: %ix%i @ (%i, %i), steps: %i, %i\n",
- roi_width, roi_height, roi_x, roi_y, roi_width_multiplier, roi_height_multiplier);
-
- const int pixel_size = bits == 8 ? 1 : 2;
- gpointer buffer = g_malloc0(roi_width * roi_height * pixel_size);
- gchar filename[FILENAME_MAX];
- GTimer *timer = g_timer_new();
-
- for (int i = 0; i < 1; i++) {
- gint counter = 0;
- g_print("Start recording\n");
- uca_camera_start_recording(camera, &error);
- g_assert_no_error(error);
-
- while (counter < 5) {
- g_print(" grab frame ... ");
- g_timer_start(timer);
- uca_camera_grab(camera, buffer, &error);
-
- if (error != NULL) {
- g_print("\nError: %s\n", error->message);
- goto cleanup;
- }
-
- g_timer_stop(timer);
- g_print("done (took %3.5fs)\n", g_timer_elapsed(timer, NULL));
-
- snprintf(filename, FILENAME_MAX, "frame-%08i.raw", counter++);
- FILE *fp = fopen(filename, "wb");
- fwrite(buffer, roi_width * roi_height, pixel_size, fp);
- fclose(fp);
- g_usleep(2 * G_USEC_PER_SEC);
- }
-
- g_print("Stop recording\n");
- uca_camera_stop_recording(camera, &error);
- g_assert_no_error(error);
+ g_print ("Error during initialization: %s\n", error->message);
+ exit (1);
}
- g_timer_destroy(timer);
+ error = record_frames (camera, &opts);
-cleanup:
- uca_camera_stop_recording(camera, NULL);
- g_object_unref(camera);
- g_free(buffer);
+ if (error != NULL)
+ g_print ("Error: %s\n", error->message);
+ g_object_unref (camera);
return error != NULL ? 1 : 0;
}
diff --git a/tools/gui/CMakeLists.txt b/tools/gui/CMakeLists.txt
index 1000ac6..07f597b 100644
--- a/tools/gui/CMakeLists.txt
+++ b/tools/gui/CMakeLists.txt
@@ -18,6 +18,7 @@ include_directories(
${GOBJECT2_INCLUDE_DIRS}
${CMAKE_CURRENT_BINARY_DIR}/../../src/
${CMAKE_CURRENT_SOURCE_DIR}/../../src
+ ${CMAKE_CURRENT_SOURCE_DIR}/../
)
if (GTK2_FOUND)
@@ -25,7 +26,7 @@ if (GTK2_FOUND)
add_executable(control
control.c
- ring-buffer.c
+ ../ring-buffer.c # yes this sucks and should be fixed
egg-property-cell-renderer.c
egg-property-tree-view.c
egg-histogram-view.c)
diff --git a/tools/gui/ring-buffer.c b/tools/ring-buffer.c
index ec2638c..039024f 100644
--- a/tools/gui/ring-buffer.c
+++ b/tools/ring-buffer.c
@@ -32,6 +32,12 @@ ring_buffer_reset (RingBuffer *buffer)
buffer->current_index = 0;
}
+gsize
+ring_buffer_get_block_size (RingBuffer *buffer)
+{
+ return buffer->block_size;
+}
+
gpointer
ring_buffer_get_current_pointer (RingBuffer *buffer)
{
diff --git a/tools/gui/ring-buffer.h b/tools/ring-buffer.h
index 9966eb7..a3758cb 100644
--- a/tools/gui/ring-buffer.h
+++ b/tools/ring-buffer.h
@@ -17,6 +17,7 @@ RingBuffer * ring_buffer_new (gsize block_size,
gsize n_blocks);
void ring_buffer_free (RingBuffer *buffer);
void ring_buffer_reset (RingBuffer *buffer);
+gsize ring_buffer_get_block_size (RingBuffer *buffer);
gpointer ring_buffer_get_current_pointer (RingBuffer *buffer);
gpointer ring_buffer_get_pointer (RingBuffer *buffer,
guint index);