[aravis] camera: add chunk data API



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]