summaryrefslogtreecommitdiffstats
path: root/test/control.c
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@ipe.fzk.de>2011-03-08 16:49:16 +0100
committerMatthias Vogelgesang <matthias.vogelgesang@ipe.fzk.de>2011-03-08 16:49:16 +0100
commit12ebb0471719b2993c6dd49c58a5965018737320 (patch)
tree1b0b636519cf38366ea3443bcc46c5b26b609845 /test/control.c
parentc7b0d014b3a568ceb2db5d582a57cb7002face5e (diff)
downloadlibuca-12ebb0471719b2993c6dd49c58a5965018737320.tar.gz
libuca-12ebb0471719b2993c6dd49c58a5965018737320.tar.bz2
libuca-12ebb0471719b2993c6dd49c58a5965018737320.tar.xz
libuca-12ebb0471719b2993c6dd49c58a5965018737320.zip
Add temperature and some bug fixes
Diffstat (limited to 'test/control.c')
-rw-r--r--test/control.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/test/control.c b/test/control.c
index 5444755..2cf8a4f 100644
--- a/test/control.c
+++ b/test/control.c
@@ -11,7 +11,7 @@ struct ThreadData {
GdkPixbuf *pixbuf;
int width;
int height;
-
+ int bits;
struct uca_camera_t *cam;
};
@@ -35,7 +35,7 @@ static void destroy(GtkWidget *widget, gpointer data)
gtk_main_quit ();
}
-void grey_to_rgb(guchar *output, guchar *input, int width, int height)
+void convert_8bit_to_rgb(guchar *output, guchar *input, int width, int height)
{
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
@@ -47,6 +47,20 @@ void grey_to_rgb(guchar *output, guchar *input, int width, int height)
}
}
+void convert_16bit_to_rgb(guchar *output, guchar *input, int width, int height)
+{
+ uint16_t *in = (uint16_t *) input;
+ for (int x = 0; x < width; x++) {
+ for (int y = 0; y < height; y++) {
+ const int off = y*width + x;
+ guchar val = (uint8_t) ((in[off]/65536.0f)*256.0f);
+ output[off*3] = val;
+ output[off*3+1] = val;
+ output[off*3+2] = val;
+ }
+ }
+}
+
void *grab_thread(void *args)
{
struct ThreadData *data = (struct ThreadData *) args;
@@ -54,7 +68,10 @@ void *grab_thread(void *args)
while (TRUE) {
cam->grab(cam, (char *) data->buffer);
- grey_to_rgb(data->pixels, data->buffer, data->width, data->height);
+ if (data->bits == 8)
+ convert_8bit_to_rgb(data->pixels, data->buffer, data->width, data->height);
+ else if (data->bits == 16)
+ convert_16bit_to_rgb(data->pixels, data->buffer, data->width, data->height);
gdk_threads_enter();
gdk_flush();
@@ -216,7 +233,6 @@ int main(int argc, char *argv[])
cam->get_property(cam, UCA_PROP_WIDTH, &width);
cam->get_property(cam, UCA_PROP_HEIGHT, &height);
cam->get_property(cam, UCA_PROP_BITDEPTH, &bits_per_sample);
- bits_per_sample = 8;
g_thread_init(NULL);
gdk_threads_init();
@@ -246,21 +262,23 @@ int main(int argc, char *argv[])
g_signal_connect (window, "destroy",
G_CALLBACK (destroy), uca);
- GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, bits_per_sample, width, height);
+ 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;
uca_cam_alloc(cam, 20);
td.image = image;
td.pixbuf = pixbuf;
- td.buffer = (guchar *) g_malloc(width * height);
+ td.buffer = (guchar *) g_malloc(mem_size * width * height);
td.pixels = gdk_pixbuf_get_pixels(pixbuf);
td.width = width;
td.height = height;
+ td.bits = bits_per_sample;
td.cam = cam;
cam->start_recording(cam);
if (!g_thread_create(grab_thread, &td, FALSE, &error)) {