summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@ipe.fzk.de>2011-03-09 10:10:13 +0100
committerMatthias Vogelgesang <matthias.vogelgesang@ipe.fzk.de>2011-03-09 10:10:13 +0100
commit876c0214e6f341d071929026a08e1b127e8a0b7f (patch)
treedfdd2b510ed02409a989917d9aeeaebae6dcc376
parent12ebb0471719b2993c6dd49c58a5965018737320 (diff)
downloaduca-876c0214e6f341d071929026a08e1b127e8a0b7f.tar.gz
uca-876c0214e6f341d071929026a08e1b127e8a0b7f.tar.bz2
uca-876c0214e6f341d071929026a08e1b127e8a0b7f.tar.xz
uca-876c0214e6f341d071929026a08e1b127e8a0b7f.zip
Almost real video playback
-rw-r--r--src/cameras/pco.c6
-rw-r--r--src/grabbers/me4.c4
-rw-r--r--test/control.c126
3 files changed, 99 insertions, 37 deletions
diff --git a/src/cameras/pco.c b/src/cameras/pco.c
index b84ee01..ccf7d90 100644
--- a/src/cameras/pco.c
+++ b/src/cameras/pco.c
@@ -48,6 +48,7 @@ static uint32_t uca_pco_acquire_image(struct uca_camera_t *cam, void *buffer)
static uint32_t uca_pco_destroy(struct uca_camera_t *cam)
{
+ pco_set_rec_state(GET_PCO(cam), 0);
pco_destroy(GET_PCO(cam));
return UCA_NO_ERROR;
}
@@ -231,7 +232,8 @@ uint32_t uca_pco_grab(struct uca_camera_t *cam, char *buffer)
if (err != UCA_NO_ERROR)
return err;
/* FIXME: choose according to data format */
- pco_reorder_image_5x16((uint16_t *) buffer, frame, cam->frame_width, cam->frame_height);
+ //pco_reorder_image_5x16((uint16_t *) buffer, frame, cam->frame_width, cam->frame_height);
+ memcpy(buffer, frame, cam->frame_width*cam->frame_height*2);
return UCA_NO_ERROR;
}
@@ -251,7 +253,7 @@ uint32_t uca_pco_init(struct uca_camera_t **cam, struct uca_grabber_t *grabber)
struct uca_camera_t *uca = (struct uca_camera_t *) malloc(sizeof(struct uca_camera_t));
uca->user = pco;
uca->grabber = grabber;
- uca->grabber->asynchronous = false;
+ uca->grabber->asynchronous = true;
/* Camera found, set function pointers... */
uca->destroy = &uca_pco_destroy;
diff --git a/src/grabbers/me4.c b/src/grabbers/me4.c
index 17b46e3..a833c07 100644
--- a/src/grabbers/me4.c
+++ b/src/grabbers/me4.c
@@ -18,8 +18,10 @@ struct uca_me4_grabber_t {
uint32_t uca_me4_destroy(struct uca_grabber_t *grabber)
{
- if (grabber != NULL)
+ if (grabber != NULL) {
+ Fg_FreeMemEx(GET_FG(grabber), GET_MEM(grabber));
Fg_FreeGrabber(GET_FG(grabber));
+ }
}
uint32_t uca_me4_set_property(struct uca_grabber_t *grabber, enum uca_property_ids property, void *data)
diff --git a/test/control.c b/test/control.c
index 2cf8a4f..3223991 100644
--- a/test/control.c
+++ b/test/control.c
@@ -7,12 +7,19 @@
struct ThreadData {
guchar *buffer, *pixels;
+ gboolean run;
GtkWidget *image;
GdkPixbuf *pixbuf;
int width;
int height;
int bits;
struct uca_camera_t *cam;
+ struct uca_t *uca;
+};
+
+struct ValueCellData {
+ struct ThreadData *thread_data;
+ GtkTreeStore *tree_store;
};
enum {
@@ -23,18 +30,6 @@ enum {
NUM_COLUMNS
};
-static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- return FALSE;
-}
-
-static void destroy(GtkWidget *widget, gpointer data)
-{
- struct uca_t *uca = (struct uca_t *) data;
- uca_destroy(uca);
- gtk_main_quit ();
-}
-
void convert_8bit_to_rgb(guchar *output, guchar *input, int width, int height)
{
for (int x = 0; x < width; x++) {
@@ -61,12 +56,24 @@ void convert_16bit_to_rgb(guchar *output, guchar *input, int width, int height)
}
}
+static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ return FALSE;
+}
+
+static void destroy(GtkWidget *widget, gpointer data)
+{
+ struct uca_t *uca = (struct uca_t *) data;
+ uca_destroy(uca);
+ gtk_main_quit ();
+}
+
void *grab_thread(void *args)
{
struct ThreadData *data = (struct ThreadData *) args;
struct uca_camera_t *cam = data->cam;
- while (TRUE) {
+ while (data->run) {
cam->grab(cam, (char *) data->buffer);
if (data->bits == 8)
convert_8bit_to_rgb(data->pixels, data->buffer, data->width, data->height);
@@ -80,6 +87,49 @@ void *grab_thread(void *args)
gtk_widget_queue_draw_area(data->image, 0, 0, data->width, data->height);
gdk_threads_leave();
}
+ return NULL;
+}
+
+static void on_toolbutton_run_clicked(GtkWidget *widget, gpointer args)
+{
+ struct ThreadData *data = (struct ThreadData *) args;
+ GError *error = NULL;
+ data->run = TRUE;
+ data->cam->start_recording(data->cam);
+ if (!g_thread_create(grab_thread, data, FALSE, &error)) {
+ g_printerr("Failed to create thread: %s\n", error->message);
+ uca_destroy(data->uca);
+ }
+}
+
+static void on_toolbutton_stop_clicked(GtkWidget *widget, gpointer args)
+{
+ struct ThreadData *data = (struct ThreadData *) args;
+ data->run = FALSE;
+ data->cam->stop_recording(data->cam);
+}
+
+static void on_valuecell_edited(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data)
+{
+ struct ValueCellData *value_data = (struct ValueCellData *) data;
+
+ if (value_data->thread_data->run)
+ return;
+
+ GtkTreeModel *tree_model = GTK_TREE_MODEL(value_data->tree_store);
+ GtkTreePath *tree_path = gtk_tree_path_new_from_string(path);
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter(tree_model, &iter, tree_path)) {
+ struct uca_camera_t *cam = value_data->thread_data->cam;
+ uint32_t prop_id;
+ gtk_tree_model_get(tree_model, &iter, COLUMN_UCA_ID, &prop_id, -1);
+
+ /* TODO: extensive value checking */
+ uint32_t val = (uint32_t) g_ascii_strtoull(new_text, NULL, 10);
+ cam->set_property(cam, prop_id, &val);
+ gtk_tree_store_set(value_data->tree_store, &iter, COLUMN_VALUE, new_text, -1);
+ }
}
void get_first_level_root(GtkTreeStore *store, GtkTreeIter *iter, gchar *group)
@@ -228,10 +278,10 @@ int main(int argc, char *argv[])
return 1;
}
- int width, height, bits_per_sample;
+ int width = 640, height = 480, bits_per_sample;
struct uca_camera_t *cam = uca->cameras;
- cam->get_property(cam, UCA_PROP_WIDTH, &width);
- cam->get_property(cam, UCA_PROP_HEIGHT, &height);
+ cam->set_property(cam, UCA_PROP_WIDTH, &width);
+ cam->set_property(cam, UCA_PROP_HEIGHT, &height);
cam->get_property(cam, UCA_PROP_BITDEPTH, &bits_per_sample);
g_thread_init(NULL);
@@ -248,6 +298,8 @@ int main(int argc, char *argv[])
GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
GtkWidget *image = GTK_WIDGET(gtk_builder_get_object(builder, "image"));
+ GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, width, height);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
GtkTreeStore *tree_store = GTK_TREE_STORE(gtk_builder_get_object(builder, "cameraproperties"));
GtkTreeViewColumn *value_column = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "valuecolumn"));
@@ -256,18 +308,6 @@ int main(int argc, char *argv[])
gtk_tree_view_column_set_cell_data_func(value_column, GTK_CELL_RENDERER(value_renderer), value_cell_data_func, NULL, NULL);
- g_signal_connect (window, "delete-event",
- G_CALLBACK (delete_event), NULL);
-
- g_signal_connect (window, "destroy",
- G_CALLBACK (destroy), uca);
-
- GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, width, height);
- gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
-
- gtk_widget_show(image);
- gtk_widget_show(window);
-
/* start grabbing and thread */
int mem_size = bits_per_sample == 8 ? 1 : 2;
struct ThreadData td;
@@ -280,13 +320,31 @@ int main(int argc, char *argv[])
td.height = height;
td.bits = bits_per_sample;
td.cam = cam;
- cam->start_recording(cam);
- if (!g_thread_create(grab_thread, &td, FALSE, &error)) {
- g_printerr("Failed to create thread: %s\n", error->message);
- uca_destroy(uca);
- return 1;
- }
+ td.uca = uca;
+
+ g_signal_connect(window, "delete-event",
+ G_CALLBACK (delete_event), NULL);
+ g_signal_connect(window, "destroy",
+ G_CALLBACK (destroy), uca);
+
+ g_signal_connect(GTK_WIDGET(gtk_builder_get_object(builder, "toolbutton_run")), "clicked",
+ G_CALLBACK(on_toolbutton_run_clicked), &td);
+
+ g_signal_connect(GTK_WIDGET(gtk_builder_get_object(builder, "toolbutton_stop")), "clicked",
+ G_CALLBACK(on_toolbutton_stop_clicked), &td);
+
+
+ struct ValueCellData value_cell_data;
+ value_cell_data.thread_data = &td;
+ value_cell_data.tree_store = tree_store;
+
+ g_signal_connect(gtk_builder_get_object(builder, "valuecell"), "edited",
+ G_CALLBACK(on_valuecell_edited), &value_cell_data);
+
+ gtk_widget_show(image);
+ gtk_widget_show(window);
+
gdk_threads_enter();
gtk_main ();
gdk_threads_leave();