Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 1 addition & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)

if (POLICY CMP0053)
cmake_policy(SET CMP0053 OLD)
endif ()

if (POLICY CMP0054)
cmake_policy(SET CMP0054 OLD)
endif ()

project(uca C)

Expand Down
2 changes: 1 addition & 1 deletion bin/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)

add_subdirectory(gui)
add_subdirectory(tools)
2 changes: 1 addition & 1 deletion bin/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)

find_package(PkgConfig)
find_program(GLIB_COMPILE_RESOURCES glib-compile-resources REQUIRED)
Expand Down
8 changes: 4 additions & 4 deletions bin/gui/uca-camera-control.c
Original file line number Diff line number Diff line change
Expand Up @@ -887,7 +887,7 @@ preview_frames (void *args)
update_pixbuf (data, data->shadow);
gdk_threads_leave ();

gpointer buffer = uca_ring_buffer_get_write_pointer (data->buffer);
gpointer buffer = uca_ring_buffer_get_write_pointer (data->buffer, TODO, TODO);
memcpy (buffer, data->shadow, uca_ring_buffer_get_block_size (data->buffer));
g_free (data->shadow);

Expand Down Expand Up @@ -916,7 +916,7 @@ record_frames (gpointer args)
if (n_max > 0 && n_frames >= n_max)
break;

buffer = uca_ring_buffer_get_write_pointer (data->buffer);
buffer = uca_ring_buffer_get_write_pointer (data->buffer, TODO, TODO);
uca_camera_grab (data->camera, buffer, NULL);
uca_ring_buffer_write_advance (data->buffer);

Expand Down Expand Up @@ -977,7 +977,7 @@ update_current_frame (ThreadData *data)
else {
/* we were in preview mode. Grab the 'next' frame in the buffer */
uca_ring_buffer_write_advance (data->buffer);
buffer = uca_ring_buffer_get_read_pointer (data->buffer);
buffer = uca_ring_buffer_get_read_pointer (data->buffer, TODO, TODO);
}

egg_histogram_view_update (EGG_HISTOGRAM_VIEW (data->histogram_view), buffer);
Expand Down Expand Up @@ -1118,7 +1118,7 @@ download_frames (ThreadData *data)
uca_ring_buffer_reset (data->buffer);

while (error == NULL) {
buffer = uca_ring_buffer_get_write_pointer (data->buffer);
buffer = uca_ring_buffer_get_write_pointer (data->buffer, TODO, TODO);
uca_camera_grab (data->camera, buffer, &error);
uca_ring_buffer_write_advance (data->buffer);

Expand Down
2 changes: 1 addition & 1 deletion bin/tools/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)

#{{{ Variables
set(libs uca)
Expand Down
12 changes: 7 additions & 5 deletions bin/tools/grab.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ write_tiff (UcaRingBuffer *buffer,
for (guint i = 0; i < n_frames; i++) {
gpointer data;
gsize offset = 0;

data = uca_ring_buffer_get_read_pointer (buffer);
gpointer metadata;
uca_ring_buffer_get_read_pointer (buffer, data, metadata);

TIFFSetField (tif, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField (tif, TIFFTAG_IMAGELENGTH, height);
Expand Down Expand Up @@ -144,15 +144,15 @@ write_raw (UcaRingBuffer *buffer,

for (gint i = 0; i < n_frames; i++) {
gpointer data;

gpointer metadata;
if (multiple_files) {
gchar *filename;
filename = g_strdup_printf (opts->filename, i);
fp = fopen (filename, "wb");
g_free (filename);
}

data = uca_ring_buffer_get_read_pointer (buffer);
uca_ring_buffer_get_read_pointer (buffer, data, metadata);
fwrite (data, size, 1, fp);

if (multiple_files)
Expand Down Expand Up @@ -210,7 +210,9 @@ record_frames (UcaCamera *camera, Options *opts)

while (1) {
g_timer_continue (frame_timer);
uca_camera_grab (camera, uca_ring_buffer_get_write_pointer (buffer), &error);
gpointer image, metadata;
uca_ring_buffer_get_write_pointer (buffer, image, metadata);
uca_camera_grab (camera, image, &error);
g_timer_stop (frame_timer);
uca_ring_buffer_write_advance (buffer);

Expand Down
2 changes: 1 addition & 1 deletion plugins/file/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)
project(ucafile C)

find_package(TIFF)
Expand Down
2 changes: 1 addition & 1 deletion plugins/mock/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)
project(ucamock C)

set(UCA_CAMERA_NAME "mock")
Expand Down
32 changes: 32 additions & 0 deletions plugins/mock/uca-mock-camera.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,37 @@ uca_mock_camera_grab (UcaCamera *camera, gpointer data, GError **error)
return TRUE;
}

static gboolean
uca_mock_camera_grab_with_metadata (UcaCamera *camera, gpointer data, gpointer metadata, GError **error)
{
g_return_val_if_fail(UCA_IS_CAMERA(camera), FALSE);
g_return_val_if_fail(data != NULL, FALSE);
g_return_val_if_fail(metadata != NULL, FALSE);

UcaMockCameraPrivate *priv = UCA_MOCK_CAMERA_GET_PRIVATE (camera);

// normal grab
guint frame_number = priv->current_frame;
gboolean success = uca_mock_camera_grab(camera, data, error);

if (success) {
// time in epoch
GTimeVal current_time;
g_get_current_time(&current_time);

// convert to microseconds
guint64 timestamp = (guint64) current_time.tv_sec * 1000000 + current_time.tv_usec;

// put as string
gchar *timestamp_str = g_strdup_printf("%" G_GUINT64_FORMAT, timestamp);
g_hash_table_insert(metadata, g_strdup("timestamp"), &timestamp);
g_hash_table_insert(metadata, g_strdup("frame_number"), &frame_number);
}

return success;
}


static gboolean
uca_mock_camera_readout (UcaCamera *camera, gpointer data, guint index, GError **error)
{
Expand Down Expand Up @@ -555,6 +586,7 @@ uca_mock_camera_class_init(UcaMockCameraClass *klass)
camera_class->grab = uca_mock_camera_grab;
camera_class->readout = uca_mock_camera_readout;
camera_class->trigger = uca_mock_camera_trigger;
camera_class->grab_with_metadata = uca_mock_camera_grab_with_metadata;

for (guint i = 0; mock_overrideables[i] != 0; i++)
g_object_class_override_property(gobject_class, mock_overrideables[i], uca_camera_props[mock_overrideables[i]]);
Expand Down
2 changes: 1 addition & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)
project(uca C)

#{{{ Sources
Expand Down
45 changes: 42 additions & 3 deletions src/uca-camera.c
Original file line number Diff line number Diff line change
Expand Up @@ -670,10 +670,26 @@ buffer_thread (UcaCamera *camera)

while (!camera->priv->cancelling_recording) {
gpointer buffer;
gpointer metadata;
uca_ring_buffer_get_write_pointer (camera->priv->ring_buffer, buffer, metadata);

buffer = uca_ring_buffer_get_write_pointer (camera->priv->ring_buffer);
// select if grab_with_metadata is there.

if (!(*klass->grab) (camera, buffer, &error)) {

int grab_success;

if (klass->grab_with_metadata != NULL) {
// if plugin implements grab_with_metadata, use it
grab_success = klass->grab_with_metadata(camera, buffer, metadata, error);
} else {
// if plugin does not implement grab_with_metadata, use grab
if (metadata != NULL) {
memset(metadata, 0, sizeof(metadata));
}
grab_success = klass->grab(camera, buffer, error);
}

if (!grab_success) {
camera->priv->cancelling_grab = TRUE;
break;
}
Expand Down Expand Up @@ -1234,6 +1250,7 @@ uca_camera_grab (UcaCamera *camera, gpointer data, GError **error)
}
else {
gpointer buffer;
gpointer metadata;

if (camera->priv->ring_buffer == NULL)
return FALSE;
Expand All @@ -1249,20 +1266,42 @@ uca_camera_grab (UcaCamera *camera, gpointer data, GError **error)
}
}

buffer = uca_ring_buffer_get_read_pointer (camera->priv->ring_buffer);
uca_ring_buffer_get_read_pointer (camera->priv->ring_buffer, buffer, metadata);

if (buffer == NULL) {
g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_END_OF_STREAM,
"Ring buffer is empty");
}
else {
// TODO copy metadata
memcpy (data, buffer, uca_ring_buffer_get_block_size (camera->priv->ring_buffer));
result = TRUE;
}
}
return result;
}

gboolean uca_camera_grab_with_metadata(UcaCamera *camera, gpointer data, gpointer metadata, GError **error)
{
g_return_val_if_fail(UCA_IS_CAMERA(camera), FALSE);
g_return_val_if_fail(data != NULL, FALSE);

UcaCameraClass *klass;
klass = UCA_CAMERA_GET_CLASS(camera);

if (klass->grab_with_metadata != NULL) {
// if plugin implements grab_with_metadata, use it
return klass->grab_with_metadata(camera, data, metadata, error);
} else {
// if plugin does not implement grab_with_metadata, use grab
if (metadata != NULL) {
memset(metadata, 0, sizeof(metadata));
}
return klass->grab(camera, data, error);
}
}


/**
* uca_camera_readout:
* @camera: A #UcaCamera object
Expand Down
4 changes: 4 additions & 0 deletions src/uca-camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ struct _UcaCameraClass {
void (*trigger) (UcaCamera *camera, GError **error);
void (*write) (UcaCamera *camera, const gchar *name, gpointer data, gsize size, GError **error);
gboolean (*grab) (UcaCamera *camera, gpointer data, GError **error);
gboolean (*grab_with_metadata) (UcaCamera *camera, gpointer data, gpointer metadata, GError **error);
gboolean (*readout) (UcaCamera *camera, gpointer data, guint index, GError **error);
};

Expand Down Expand Up @@ -176,6 +177,9 @@ gboolean uca_camera_grab (UcaCamera *camera,
gpointer data,
GError **error)
__attribute__((nonnull (2)));
gboolean uca_camera_grab_with_metadata(UcaCamera *camera,
gpointer data, gpointer metadata, GError **error)
__attribute__((nonnull (2)));
gboolean uca_camera_readout (UcaCamera *camera,
gpointer data,
guint index,
Expand Down
27 changes: 18 additions & 9 deletions src/uca-ring-buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct _UcaRingBufferPrivate {
guint read_index;
guint read;
guint written;
GHashTable *metadata;
};

enum {
Expand Down Expand Up @@ -84,10 +85,11 @@ uca_ring_buffer_available (UcaRingBuffer *buffer)
* Get pointer to current read location. If no data is available, %NULL is
* returned.
*
* Return value: (transfer none): Pointer to current read location
* @param image GPointer to image buffer
* @param metadata GPointer to metadata has table
*/
gpointer
uca_ring_buffer_get_read_pointer (UcaRingBuffer *buffer)
void
uca_ring_buffer_get_read_pointer (UcaRingBuffer *buffer, gpointer image, gpointer metadata)
{
UcaRingBufferPrivate *priv;
gpointer data;
Expand All @@ -96,11 +98,12 @@ uca_ring_buffer_get_read_pointer (UcaRingBuffer *buffer)
priv = buffer->priv;

g_return_val_if_fail (priv->read_index != priv->write_index, NULL);
data = priv->data + (priv->read_index % priv->n_blocks_total) * priv->block_size;
image = priv->data + (priv->read_index % priv->n_blocks_total) * priv->block_size;
metadata = (gpointer) priv->metadata + priv->read_index % priv->n_blocks_total;
priv->read_index++;
return data;
}


/**
* uca_ring_buffer_get_write_pointer:
* @buffer: A #UcaRingBuffer object
Expand All @@ -109,18 +112,18 @@ uca_ring_buffer_get_read_pointer (UcaRingBuffer *buffer)
*
* Return value: (transfer none): Pointer to current write location
*/
gpointer
uca_ring_buffer_get_write_pointer (UcaRingBuffer *buffer)
void
uca_ring_buffer_get_write_pointer(UcaRingBuffer *buffer, gpointer image, gpointer metadata)
{
UcaRingBufferPrivate *priv;
gpointer data;

g_return_val_if_fail (UCA_IS_RING_BUFFER (buffer), NULL);

priv = buffer->priv;
data = priv->data + (priv->write_index % priv->n_blocks_total) * priv->block_size;
image = priv->data + (priv->write_index % priv->n_blocks_total) * priv->block_size;
metadata = (gpointer) priv->metadata + (priv->write_index % priv->n_blocks_total);

return data;
}

void
Expand Down Expand Up @@ -181,8 +184,11 @@ realloc_mem (UcaRingBufferPrivate *priv)
{
if (priv->data != NULL)
g_free (priv->data);
if (priv->metadata != NULL)
g_free (priv->metadata);

priv->data = g_malloc0_n (priv->n_blocks_total, priv->block_size);
priv->metadata = g_malloc0_n (priv->n_blocks_total, priv->n_blocks_total);
}

static void
Expand Down Expand Up @@ -253,6 +259,8 @@ uca_ring_buffer_finalize (GObject *object)
priv = UCA_RING_BUFFER_GET_PRIVATE (object);
g_free (priv->data);
priv->data = NULL;
g_free (priv->metadata);
priv->metadata = NULL;
G_OBJECT_CLASS (uca_ring_buffer_parent_class)->finalize (object);
}

Expand Down Expand Up @@ -297,4 +305,5 @@ uca_ring_buffer_init (UcaRingBuffer *buffer)
priv->n_blocks_total = 0;
priv->block_size = 0;
priv->data = NULL;
priv->metadata = NULL;
}
4 changes: 2 additions & 2 deletions src/uca-ring-buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ gsize uca_ring_buffer_get_block_size (UcaRingBuffer *buffer);
guint uca_ring_buffer_get_num_blocks (UcaRingBuffer *buffer);
gboolean uca_ring_buffer_available (UcaRingBuffer *buffer);
void uca_ring_buffer_proceed (UcaRingBuffer *buffer);
gpointer uca_ring_buffer_get_read_pointer (UcaRingBuffer *buffer);
gpointer uca_ring_buffer_get_write_pointer (UcaRingBuffer *buffer);
void uca_ring_buffer_get_read_pointer (UcaRingBuffer *buffer, gpointer image, gpointer metadata);
void uca_ring_buffer_get_write_pointer(UcaRingBuffer *buffer, gpointer image, gpointer metadata);
void uca_ring_buffer_write_advance (UcaRingBuffer *buffer);
gpointer uca_ring_buffer_get_pointer (UcaRingBuffer *buffer,
guint index);
Expand Down
2 changes: 1 addition & 1 deletion test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gtester.xsl
${CMAKE_CURRENT_BINARY_DIR}/gtester.xsl)
Expand Down
Loading
Loading