static gpointer buffer_thread (UcaCamera *camera) { UcaCameraClass *klass; GError *error = NULL; klass = UCA_CAMERA_GET_CLASS (camera); while (!camera->priv->cancelling_recording) { gpointer buffer; buffer = uca_ring_buffer_get_write_pointer (camera->priv->ring_buffer); if (!(*klass->grab) (camera, buffer, &error)) break; uca_ring_buffer_write_advance (camera->priv->ring_buffer); } return error; }
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; UcaRingBuffer *buffer; GError *error = NULL; gdouble last_printed; g_object_get (G_OBJECT (camera), "roi-width", &roi_width, "roi-height", &roi_height, "sensor-bitdepth", &bits, NULL); pixel_size = get_bytes_per_pixel (bits); size = roi_width * roi_height * pixel_size; n_allocated = opts->n_frames > 0 ? opts->n_frames : 256; buffer = uca_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); last_printed = 0.0; while (1) { gdouble elapsed; uca_camera_grab (camera, uca_ring_buffer_get_write_pointer (buffer), &error); uca_ring_buffer_write_advance (buffer); if (error != NULL) return error; n_frames++; elapsed = g_timer_elapsed (timer, NULL); if (n_frames == opts->n_frames || (opts->duration > 0.0 && elapsed >= opts->duration)) break; if (elapsed - last_printed >= 1.0) { g_print ("Recorded %i frames at %.2f frames/s\n", n_frames, n_frames / elapsed); last_printed = elapsed; } } g_print ("Stop recording: %3.2f frames/s\n", n_frames / g_timer_elapsed (timer, NULL)); uca_camera_stop_recording (camera, &error); #ifdef HAVE_LIBTIFF if (opts->write_tiff) write_tiff (buffer, opts, roi_width, roi_height, bits); else write_raw (buffer, opts); #else write_raw (buffer, opts); #endif g_object_unref (buffer); g_timer_destroy (timer); return error; }