[aravis] camera: add chunk data API
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [aravis] camera: add chunk data API
- Date: Tue, 19 Aug 2014 14:21:13 +0000 (UTC)
commit 2f942b33d9427f1684e09c41edca25aada4e88ba
Author: Emmanuel Pacaud <emmanuel gnome org>
Date: Tue Aug 19 16:20:37 2014 +0200
camera: add chunk data API
docs/reference/aravis/aravis-sections.txt | 6 +
src/arvcamera.c | 146 +++++++++++++++++++++++++++++
src/arvcamera.h | 9 ++
tests/arvcameratest.c | 30 ++++++
viewer/arvviewer.c | 2 +
5 files changed, 193 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/aravis/aravis-sections.txt b/docs/reference/aravis/aravis-sections.txt
index 49649ba..afd1053 100644
--- a/docs/reference/aravis/aravis-sections.txt
+++ b/docs/reference/aravis/aravis-sections.txt
@@ -52,6 +52,12 @@ arv_camera_get_gain_bounds
arv_camera_set_gain_auto
arv_camera_get_gain_auto
arv_camera_get_payload
+arv_camera_get_chunk_mode
+arv_camera_get_chunk_state
+arv_camera_set_chunk_mode
+arv_camera_set_chunk_state
+arv_camera_set_chunks
+arv_camera_create_chunk_parser
ArvAcquisitionMode
arv_acquisition_mode_to_string
arv_acquisition_mode_from_string
diff --git a/src/arvcamera.c b/src/arvcamera.c
index cc2db59..0ff670e 100644
--- a/src/arvcamera.c
+++ b/src/arvcamera.c
@@ -1287,6 +1287,152 @@ arv_camera_is_gain_auto_available (ArvCamera *camera)
}
/**
+ * arv_camera_set_chunk_mode:
+ * @camera: a #ArvCamera
+ * @is_active: wether to enable chunk data mode
+ *
+ * Controls wether chunk data mode is active. When active, chunk data
+ * are appended to image data in #ArvBuffer. A #ArvChunkParser must be used in
+ * order to extract chunk data.
+ *
+ * Since: 0.4.0
+ **/
+
+void
+arv_camera_set_chunk_mode (ArvCamera *camera, gboolean is_active)
+{
+ g_return_if_fail (ARV_IS_CAMERA (camera));
+
+ arv_device_set_integer_feature_value (camera->priv->device, "ChunkModeActive", is_active ? 1 : 0);
+}
+
+/**
+ * arv_camera_get_chunk_mode:
+ * @camera: a #ArvCamera
+ *
+ * Check wether chunk data mode is active. Please see @arv_camera_set_chunk_mode.
+ *
+ * Returns: %TRUE if chunk data mode is active.
+ *
+ * Since: 0.4.0
+ **/
+
+gboolean
+arv_camera_get_chunk_mode (ArvCamera *camera)
+{
+ g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE);
+
+ return arv_device_get_integer_feature_value (camera->priv->device, "ChunkModeActive");
+}
+
+/**
+ * arv_camera_set_chunk_state:
+ * @camera: a #ArvCamera
+ * @chunk: chunk data name
+ * @is_enabled: wether to enable this chunk
+ *
+ * Sets state of a chunk data. Chunk data are be embedded in #ArvBuffer only
+ * if chunk mode is active. Please see @arv_camera_set_chunk_mode.
+ *
+ * Since: 0.4.0
+ **/
+
+void
+arv_camera_set_chunk_state (ArvCamera *camera, const char *chunk, gboolean is_enabled)
+{
+ g_return_if_fail (ARV_IS_CAMERA (camera));
+ g_return_if_fail (chunk != NULL && chunk[0] != '\0');
+
+ arv_device_set_string_feature_value (camera->priv->device, "ChunkSelector", chunk);
+ arv_device_set_integer_feature_value (camera->priv->device, "ChunkEnable", is_enabled ? 1 : 0);
+}
+
+/**
+ * arv_camera_get_chunk_state:
+ * @camera: a #ArvCamera
+ * @chunk: chunk data name
+ *
+ * Gets state of chunk data. Chunk data are be embedded in #ArvBuffer only
+ * if chunk mode is active. Please see @arv_camera_set_chunk_mode.
+ *
+ * Returns: %TRUE if @chunk is enabled.
+ *
+ * Since: 0.4.0
+ */
+
+gboolean
+arv_camera_get_chunk_state (ArvCamera *camera, const char *chunk)
+{
+ g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE);
+ g_return_val_if_fail (chunk != NULL && chunk[0] != '\0', FALSE);
+
+ arv_device_set_string_feature_value (camera->priv->device, "ChunkSelector", chunk);
+ return arv_device_get_integer_feature_value (camera->priv->device, "ChunkEnable");
+}
+
+/**
+ * arv_camera_set_chunks:
+ * @camera: a #ArvCamera
+ * @chunk_list: chunk data names, as a comma or space separated list
+ *
+ * Convenience function for enabling a set of chunk data. Chunk mode is activated, or deactivated
+ * if @chunk_list is %NULL or empty. All chunk data not listed are disabled.
+ *
+ * Since: 0.4.0
+ */
+
+void
+arv_camera_set_chunks (ArvCamera *camera, const char *chunk_list)
+{
+ char **chunks;
+ gboolean enable_chunk_data = FALSE;
+ int i;
+ guint n_values;
+
+ g_return_if_fail (ARV_IS_CAMERA (camera));
+
+ if (chunk_list == NULL) {
+ arv_camera_set_chunk_mode (camera, FALSE);
+ return;
+ }
+
+ chunks = (char **) arv_device_get_available_enumeration_feature_values_as_strings
(camera->priv->device,
+ "ChunkSelector",
&n_values);
+ for (i = 0; i < n_values; i++)
+ arv_camera_set_chunk_state (camera, chunks[i], FALSE);
+
+ chunks = g_strsplit_set (chunk_list, " ,:;", -1);
+
+ for (i = 0; chunks[i] != NULL; i++) {
+ arv_camera_set_chunk_state (camera, chunks[i], TRUE);
+ enable_chunk_data = TRUE;
+ }
+
+ g_strfreev (chunks);
+
+ arv_camera_set_chunk_mode (camera, enable_chunk_data);
+}
+
+/**
+ * arv_camera_create_chunk_parser:
+ * @camera: a #ArvCamera
+ *
+ * Creates a new #ArvChunkParser object, used for the extraction of chunk data from #ArvBuffer.
+ *
+ * Returns: (transfer full): a new #ArvChunkParser.
+ *
+ * Since: 0.4.0
+ */
+
+ArvChunkParser *
+arv_camera_create_chunk_parser (ArvCamera *camera)
+{
+ g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL);
+
+ return arv_device_create_chunk_parser (camera->priv->device);
+}
+
+/**
* arv_camera_new:
* @name: (allow-none): name of the camera.
*
diff --git a/src/arvcamera.h b/src/arvcamera.h
index d8026b0..10eebe7 100644
--- a/src/arvcamera.h
+++ b/src/arvcamera.h
@@ -122,6 +122,15 @@ ArvAuto arv_camera_get_gain_auto (ArvCamera *camera);
guint arv_camera_get_payload (ArvCamera *camera);
+/* Chunk data */
+
+void arv_camera_set_chunk_mode (ArvCamera *camera, gboolean is_active);
+gboolean arv_camera_get_chunk_mode (ArvCamera *camera);
+void arv_camera_set_chunk_state (ArvCamera *camera, const char *chunk, gboolean
is_enabled);
+gboolean arv_camera_get_chunk_state (ArvCamera *camera, const char *chunk);
+void arv_camera_set_chunks (ArvCamera *camera, const char *chunk_list);
+ArvChunkParser * arv_camera_create_chunk_parser (ArvCamera *camera);
+
G_END_DECLS
#endif
diff --git a/tests/arvcameratest.c b/tests/arvcameratest.c
index 5064de0..8db19e0 100644
--- a/tests/arvcameratest.c
+++ b/tests/arvcameratest.c
@@ -19,6 +19,7 @@ static gboolean arv_option_auto_socket_buffer = FALSE;
static gboolean arv_option_no_packet_resend = FALSE;
static unsigned int arv_option_packet_timeout = 20;
static unsigned int arv_option_frame_retention = 100;
+static char *arv_option_chunks = NULL;
static const GOptionEntry arv_option_entries[] =
{
@@ -83,6 +84,10 @@ static const GOptionEntry arv_option_entries[] =
&arv_option_frame_retention, "Frame retention (ms)", NULL
},
{
+ "chunks", 'c', 0, G_OPTION_ARG_STRING,
+ &arv_option_chunks, "Chunks", NULL
+ },
+ {
"debug", 'd', 0, G_OPTION_ARG_STRING,
&arv_option_debug_domains, "Debug domains", NULL
},
@@ -92,6 +97,8 @@ static const GOptionEntry arv_option_entries[] =
typedef struct {
GMainLoop *main_loop;
int buffer_count;
+ ArvChunkParser *chunk_parser;
+ char **chunks;
} ApplicationData;
static gboolean cancel = FALSE;
@@ -111,7 +118,18 @@ new_buffer_cb (ArvStream *stream, ApplicationData *data)
if (buffer != NULL) {
if (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_SUCCESS)
data->buffer_count++;
+
+ if (arv_buffer_get_payload_type (buffer) == ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA &&
+ data->chunks != NULL) {
+ int i;
+
+ for (i = 0; data->chunks[i] != NULL; i++)
+ printf ("%s = %d\n", data->chunks[i],
+ arv_chunk_parser_get_integer_value (data->chunk_parser, buffer,
data->chunks[i]));
+ }
+
/* Image processing here */
+
arv_stream_push_buffer (stream, buffer);
}
}
@@ -161,6 +179,7 @@ main (int argc, char **argv)
int i;
data.buffer_count = 0;
+ data.chunks = NULL;
arv_g_thread_init (NULL);
arv_g_type_init ();
@@ -197,6 +216,12 @@ main (int argc, char **argv)
int gain;
guint software_trigger_source = 0;
+ if (arv_option_chunks != NULL) {
+ data.chunks = g_strsplit_set (arv_option_chunks, " ,:;", -1);
+ data.chunk_parser = arv_camera_create_chunk_parser (camera);
+ }
+
+ arv_camera_set_chunks (camera, arv_option_chunks);
arv_camera_set_region (camera, 0, 0, arv_option_width, arv_option_height);
arv_camera_set_binning (camera, arv_option_horizontal_binning, arv_option_vertical_binning);
arv_camera_set_exposure_time (camera, arv_option_exposure_time_us);
@@ -294,5 +319,10 @@ main (int argc, char **argv)
} else
printf ("No camera found\n");
+ if (data.chunks != NULL)
+ g_strfreev (data.chunks);
+
+ g_clear_object (&data.chunk_parser);
+
return 0;
}
diff --git a/viewer/arvviewer.c b/viewer/arvviewer.c
index 77b1092..502d5dc 100644
--- a/viewer/arvviewer.c
+++ b/viewer/arvviewer.c
@@ -551,6 +551,8 @@ arv_viewer_select_camera_cb (GtkComboBox *combo_box, ArvViewer *viewer)
if (viewer->camera == NULL)
return;
+ arv_camera_set_chunk_mode (viewer->camera, FALSE);
+
viewer->rotation = 0;
viewer->stream = arv_camera_create_stream (viewer->camera, NULL, NULL);
if (viewer->stream == NULL) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]