[aravis] camera: add GigEVision specific API
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [aravis] camera: add GigEVision specific API
- Date: Fri, 28 Nov 2014 15:16:15 +0000 (UTC)
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]