[aravis] camera: add GigEVision specific API



commit cfa2ca6f9e777c07ad2ab68d29dd5819fddf950e
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Fri Nov 28 16:15:34 2014 +0100

    camera: add GigEVision specific API

 docs/reference/aravis/aravis-sections.txt |    8 ++
 src/arvcamera.c                           |  176 ++++++++++++++++++++++++++++-
 src/arvcamera.h                           |   13 ++
 tests/arvcameratest.c                     |   50 +++++++--
 4 files changed, 234 insertions(+), 13 deletions(-)
---
diff --git a/docs/reference/aravis/aravis-sections.txt b/docs/reference/aravis/aravis-sections.txt
index d2b8bed..7812b85 100644
--- a/docs/reference/aravis/aravis-sections.txt
+++ b/docs/reference/aravis/aravis-sections.txt
@@ -53,6 +53,14 @@ arv_camera_get_gain_bounds
 arv_camera_set_gain_auto
 arv_camera_get_gain_auto
 arv_camera_get_payload
+arv_camera_is_gv_device
+arv_camera_gv_get_n_stream_channels
+arv_camera_gv_select_stream_channel
+arv_camera_gv_get_current_stream_channel
+arv_camera_gv_get_packet_delay
+arv_camera_gv_set_packet_delay
+arv_camera_gv_get_packet_size
+arv_camera_gv_set_packet_size
 arv_camera_get_chunk_mode
 arv_camera_get_chunk_state
 arv_camera_set_chunk_mode
diff --git a/src/arvcamera.c b/src/arvcamera.c
index d342bd1..a3635a5 100644
--- a/src/arvcamera.c
+++ b/src/arvcamera.c
@@ -48,7 +48,7 @@
 #include <arvgcenumentry.h>
 #include <arvgcstring.h>
 #include <arvgc.h>
-#include <arvdevice.h>
+#include <arvgvdevice.h>
 #include <arvenums.h>
 #include <arvstr.h>
 
@@ -1305,6 +1305,177 @@ arv_camera_is_gain_auto_available (ArvCamera *camera)
 }
 
 /**
+ * arv_camera_is_gv_device:
+ * @camera: a #ArvCamera
+ *
+ * Returns: %TRUE if @camera is a GigEVision device.
+ *
+ * Since: 0.4.0
+ */
+
+gboolean
+arv_camera_is_gv_device        (ArvCamera *camera)
+{
+       g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE);
+
+       return ARV_IS_GV_DEVICE (camera->priv->device);
+}
+
+/**
+ * arv_camera_gv_get_n_stream_channels:
+ * @camera: a #ArvCamera
+ *
+ * Returns: the number of supported stream channels.
+ *
+ * Since: 0.4.0
+ */
+
+gint
+arv_camera_gv_get_n_stream_channels (ArvCamera *camera)
+{
+       g_return_val_if_fail (arv_camera_is_gv_device (camera), 0);
+
+       return arv_device_get_integer_feature_value (camera->priv->device, "GevStreamChannelCount");
+}
+
+/**
+ * arv_camera_gv_select_stream_channel:
+ * @camera: a #ArvCamera
+ * @channel_id: id of the channel to select
+ *
+ * Select the current stream channel.
+ *
+ * Since: 0.4.0
+ */
+
+void
+arv_camera_gv_select_stream_channel (ArvCamera *camera, gint channel_id)
+{
+       if (channel_id < 0)
+               return;
+
+       g_return_if_fail (arv_camera_is_gv_device (camera));
+
+       arv_device_set_integer_feature_value (camera->priv->device, "GevStreamChannelSelector", channel_id);
+}
+
+/**
+ * arv_camera_gv_get_current_stream_channel:
+ * @camera: a #ArvCamera
+ *
+ * Returns: The current stream channel id.
+ *
+ * Since: 0.4.0
+ */
+
+int
+arv_camera_gv_get_current_stream_channel (ArvCamera *camera)
+{
+       g_return_val_if_fail (arv_camera_is_gv_device (camera), 0);
+
+       return arv_device_get_integer_feature_value (camera->priv->device, "GevStreamChannelSelector");
+}
+
+/**
+ * arv_camera_gv_set_packet_delay:
+ * @camera: a #ArvCamera
+ * @delay_ns: inter packet delay, in nanoseconds
+ *
+ * Configure the inter packet delay to insert between each packet for the current stream
+ * channel. This can be used as a crude flow-control mechanism if the application or the network
+ * infrastructure cannot keep up with the packets coming from the device.
+ *
+ * Since: 0.4.0
+ */
+
+void
+arv_camera_gv_set_packet_delay (ArvCamera *camera, gint64 delay_ns)
+{
+       gint64 tick_frequency;
+       gint64 value;
+
+       if (delay_ns < 0)
+               return;
+
+       g_return_if_fail (arv_camera_is_gv_device (camera));
+
+       tick_frequency = arv_device_get_integer_feature_value (camera->priv->device, 
"GevTimestampTickFrequency");
+       if (tick_frequency <= 0)
+               return;
+
+       value = tick_frequency * delay_ns / 1000000000LL;
+       arv_device_set_integer_feature_value (camera->priv->device, "GevSCPD", value);
+}
+
+/**
+ * arv_camera_gv_get_packet_delay:
+ * @camera: a #ArvCamera
+ *
+ * Returns: The inter packet delay, in nanoseconds.
+ *
+ * Since: 0.4.0
+ */
+
+gint64
+arv_camera_gv_get_packet_delay (ArvCamera *camera)
+{
+       gint64 tick_frequency;
+       gint64 value;
+
+       g_return_val_if_fail (arv_camera_is_gv_device (camera), 0);
+
+       tick_frequency = arv_device_get_integer_feature_value (camera->priv->device, 
"GevTimestampTickFrequency");
+       if (tick_frequency <= 0)
+               return 0;
+
+       value = arv_device_get_integer_feature_value (camera->priv->device, "GevSCPD");
+
+       return value * 1000000000LL / tick_frequency;
+}
+
+/**
+ * arv_camera_gv_set_packet_size:
+ * @camera: a #ArvCamera
+ * @packet_size: packet size, in bytes
+ *
+ * Specifies the stream packet size, in bytes, to send on the selected channel for a GVSP transmitter
+ * or specifies the maximum packet size supported by a GVSP receiver.
+ *
+ * This does not include data leader and data trailer and the last data packet which might be of
+ * smaller size (since packet size is not necessarily a multiple of block size for stream channel).
+ *
+ * Since: 0.4.0
+ */
+
+void
+arv_camera_gv_set_packet_size (ArvCamera *camera, gint packet_size)
+{
+       if (packet_size <= 0)
+               return;
+
+       g_return_if_fail (arv_camera_is_gv_device (camera));
+
+       arv_device_set_integer_feature_value (camera->priv->device, "GevSCPSPacketSize", packet_size);
+}
+
+/**
+ * arv_camera_gv_get_packet_size:
+ * @camera: a #ArvCamera
+ *
+ * Returns: The stream packet size, in bytes.
+ *
+ * Since: 0.4.0
+ */
+
+gint
+arv_camera_gv_get_packet_size (ArvCamera *camera)
+{
+       g_return_val_if_fail (arv_camera_is_gv_device (camera), 0);
+
+       return arv_device_get_integer_feature_value (camera->priv->device, "GevSCPSPacketSize");
+}
+
+/**
  * arv_camera_set_chunk_mode:
  * @camera: a #ArvCamera
  * @is_active: wether to enable chunk data mode
@@ -1560,7 +1731,8 @@ arv_camera_constructor (GType gtype, guint n_properties, GObjectConstructParam *
 
        camera->priv->use_gain_raw = !ARV_IS_GC_FLOAT (arv_device_get_feature (camera->priv->device, "Gain"));
        camera->priv->use_exposure_time_abs = !ARV_IS_GC_FLOAT (arv_device_get_feature (camera->priv->device, 
"ExposureTime"));
-       camera->priv->use_acquisition_frame_rate_abs = !ARV_IS_GC_FLOAT (arv_device_get_feature 
(camera->priv->device, "AcquisitionFrameRate"));
+       camera->priv->use_acquisition_frame_rate_abs = !ARV_IS_GC_FLOAT (arv_device_get_feature 
(camera->priv->device,
+                                                                                                
"AcquisitionFrameRate"));
 
     return object;
 }
diff --git a/src/arvcamera.h b/src/arvcamera.h
index 79b83a1..e641aed 100644
--- a/src/arvcamera.h
+++ b/src/arvcamera.h
@@ -123,6 +123,19 @@ ArvAuto            arv_camera_get_gain_auto        (ArvCamera *camera);
 
 guint          arv_camera_get_payload          (ArvCamera *camera);
 
+/* GigEVision specific API */
+
+gboolean       arv_camera_is_gv_device                 (ArvCamera *camera);
+
+gint           arv_camera_gv_get_n_stream_channels     (ArvCamera *camera);
+void           arv_camera_gv_select_stream_channel     (ArvCamera *camera, gint channel_id);
+int            arv_camera_gv_get_current_stream_channel(ArvCamera *camera);
+
+void           arv_camera_gv_set_packet_delay          (ArvCamera *camera, gint64 delay_ns);
+gint64                 arv_camera_gv_get_packet_delay          (ArvCamera *camera);
+void           arv_camera_gv_set_packet_size           (ArvCamera *camera, gint packet_size);
+gint           arv_camera_gv_get_packet_size           (ArvCamera *camera);
+
 /* Chunk data */
 
 void                   arv_camera_set_chunk_mode       (ArvCamera *camera, gboolean is_active);
diff --git a/tests/arvcameratest.c b/tests/arvcameratest.c
index d4214ef..2d101b5 100644
--- a/tests/arvcameratest.c
+++ b/tests/arvcameratest.c
@@ -20,6 +20,9 @@ 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 int arv_option_gv_stream_channel = -1;
+static int arv_option_gv_packet_delay = -1;
+static int arv_option_gv_packet_size = -1;
 static char *arv_option_chunks = NULL;
 
 static const GOptionEntry arv_option_entries[] =
@@ -85,7 +88,19 @@ static const GOptionEntry arv_option_entries[] =
                &arv_option_frame_retention,            "Frame retention (ms)", NULL
        },
        {
-               "chunks",                               'c', 0, G_OPTION_ARG_STRING,
+               "gv-stream-channel",                    'c', 0, G_OPTION_ARG_INT,
+               &arv_option_gv_stream_channel,          "GigEVision stream channel id", NULL
+       },
+       {
+               "gv-packet-delay",                      'y', 0, G_OPTION_ARG_INT,
+               &arv_option_gv_packet_delay,            "GigEVision packet delay (ns)", NULL
+       },
+       {
+               "gv-packet-size",                       'i', 0, G_OPTION_ARG_INT,
+               &arv_option_gv_packet_size,             "GigEVision packet size (bytes)", NULL
+       },
+       {
+               "chunks",                               'u', 0, G_OPTION_ARG_STRING,
                &arv_option_chunks,                     "Chunks", NULL
        },
        {
@@ -241,6 +256,12 @@ main (int argc, char **argv)
                arv_camera_set_binning (camera, arv_option_horizontal_binning, arv_option_vertical_binning);
                arv_camera_set_exposure_time (camera, arv_option_exposure_time_us);
                arv_camera_set_gain (camera, arv_option_gain);
+               
+               if (arv_camera_is_gv_device (camera)) {
+                       arv_camera_gv_select_stream_channel (camera, arv_option_gv_stream_channel);
+                       arv_camera_gv_set_packet_delay (camera, arv_option_gv_packet_delay);
+                       arv_camera_gv_set_packet_size (camera, arv_option_gv_packet_size);
+               }
 
                arv_camera_get_region (camera, &x, &y, &width, &height);
                arv_camera_get_binning (camera, &dx, &dy);
@@ -248,16 +269,23 @@ main (int argc, char **argv)
                payload = arv_camera_get_payload (camera);
                gain = arv_camera_get_gain (camera);
 
-               printf ("vendor name         = %s\n", arv_camera_get_vendor_name (camera));
-               printf ("model name          = %s\n", arv_camera_get_model_name (camera));
-               printf ("device id           = %s\n", arv_camera_get_device_id (camera));
-               printf ("image width         = %d\n", width);
-               printf ("image height        = %d\n", height);
-               printf ("horizontal binning  = %d\n", dx);
-               printf ("vertical binning    = %d\n", dy);
-               printf ("payload             = %d bytes\n", payload);
-               printf ("exposure            = %g µs\n", exposure);
-               printf ("gain                = %d dB\n", gain);
+               printf ("vendor name           = %s\n", arv_camera_get_vendor_name (camera));
+               printf ("model name            = %s\n", arv_camera_get_model_name (camera));
+               printf ("device id             = %s\n", arv_camera_get_device_id (camera));
+               printf ("image width           = %d\n", width);
+               printf ("image height          = %d\n", height);
+               printf ("horizontal binning    = %d\n", dx);
+               printf ("vertical binning      = %d\n", dy);
+               printf ("payload               = %d bytes\n", payload);
+               printf ("exposure              = %g µs\n", exposure);
+               printf ("gain                  = %d dB\n", gain);
+
+               if (arv_camera_is_gv_device (camera)) {
+                       printf ("gv n_stream channels  = %d\n", arv_camera_gv_get_n_stream_channels (camera));
+                       printf ("gv current channel    = %d\n", arv_camera_gv_get_current_stream_channel 
(camera));
+                       printf ("gv packet delay       = %" G_GINT64_FORMAT " ns\n", 
arv_camera_gv_get_packet_delay (camera));
+                       printf ("gv packet size        = %d bytes\n", arv_camera_gv_get_packet_size (camera));
+               }
 
                stream = arv_camera_create_stream (camera, NULL, NULL);
                if (stream != NULL) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]