summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--plugins/dexela/CMakeLists.txt4
-rw-r--r--plugins/dexela/changelog.txt2
-rw-r--r--plugins/dexela/software-roi.c12
-rw-r--r--plugins/dexela/software-roi.h18
-rw-r--r--plugins/dexela/uca-dexela-camera.c52
-rw-r--r--test/CMakeLists.txt4
-rw-r--r--test/test-software-roi.c53
8 files changed, 137 insertions, 9 deletions
diff --git a/.gitignore b/.gitignore
index 59f657e..33c959e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,7 +11,6 @@ Makefile
src/config.h
src/libuca.so*
tags
-test/
tools/benchmark
tools/gen-doc
tools/grab
diff --git a/plugins/dexela/CMakeLists.txt b/plugins/dexela/CMakeLists.txt
index a93ddc6..e7f0a11 100644
--- a/plugins/dexela/CMakeLists.txt
+++ b/plugins/dexela/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 2.6)
project(ucadexela C)
-set(VERSION "1.2.0")
+set(VERSION "1.3.0")
find_package(DEXELA)
@@ -20,7 +20,7 @@ if (DEXELA_FOUND)
include_directories(${DEXELA_INCLUDE_DIRS}
${UCA_CONFIGDIR})
- add_library(ucadexela SHARED uca-dexela-camera.c)
+ add_library(ucadexela SHARED uca-dexela-camera.c software-roi.c)
target_link_libraries(ucadexela ${UCA_DEPS} ${DEXELA_LIBRARIES})
diff --git a/plugins/dexela/changelog.txt b/plugins/dexela/changelog.txt
index 4bcd2d6..d535142 100644
--- a/plugins/dexela/changelog.txt
+++ b/plugins/dexela/changelog.txt
@@ -1,3 +1,5 @@
+* Tue Sep 9 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.3.0-1
+- add software roi feature
* Tue Jul 29 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.2.0-1
- bump plugin version for package management systems
* Wed Mar 19 2014 Mihael Koep <mihael.koep@softwareschneiderei.de> 1.0.3-1
diff --git a/plugins/dexela/software-roi.c b/plugins/dexela/software-roi.c
new file mode 100644
index 0000000..74baa96
--- /dev/null
+++ b/plugins/dexela/software-roi.c
@@ -0,0 +1,12 @@
+#include "software-roi.h"
+#include <string.h>
+
+void apply_software_roi(const guchar* src, guint srcWidth, guchar* dest, guint x, guint y, guint roiWidth, guint roiHeight)
+{
+ for (guint row = 0; row < roiHeight; row++) {
+ guint rowOffset = srcWidth * (y + row);
+ guint offset = rowOffset + x;
+ memcpy(dest + row * roiWidth, src + offset, roiWidth);
+ }
+}
+
diff --git a/plugins/dexela/software-roi.h b/plugins/dexela/software-roi.h
new file mode 100644
index 0000000..e2916f0
--- /dev/null
+++ b/plugins/dexela/software-roi.h
@@ -0,0 +1,18 @@
+#ifndef SOFTWAREROI_H
+#define SOFTWAREROI_H
+#include <glib.h>
+
+/**
+ * @brief apply_software_roi Extracts the pixels defined by x, y, roiWidth, roiHeight from
+ * the src array and writes them into the dest buffer
+ * @param src
+ * @param srcWidth
+ * @param dest
+ * @param x
+ * @param y
+ * @param roiWidth
+ * @param roiHeight
+ */
+void apply_software_roi(const guchar* src, guint srcWidth, guchar* dest, guint x, guint y, guint roiWidth, guint roiHeight);
+
+#endif // SOFTWAREROI_H
diff --git a/plugins/dexela/uca-dexela-camera.c b/plugins/dexela/uca-dexela-camera.c
index 4c30ad7..9269457 100644
--- a/plugins/dexela/uca-dexela-camera.c
+++ b/plugins/dexela/uca-dexela-camera.c
@@ -20,6 +20,7 @@
#include <gmodule.h>
#include "uca-dexela-camera.h"
#include "dexela/dexela_api.h"
+#include "software-roi.h"
#define UCA_DEXELA_CAMERA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_DEXELA_CAMERA, UcaDexelaCameraPrivate))
@@ -73,6 +74,10 @@ struct _UcaDexelaCameraPrivate {
GValueArray *binnings;
guint width;
guint height;
+ guint roi_x;
+ guint roi_y;
+ guint roi_width;
+ guint roi_height;
guint bits;
gsize num_bytes;
};
@@ -182,14 +187,24 @@ static void uca_dexela_camera_get_property(GObject *object, guint property_id, G
g_value_set_uint(value, priv->height);
break;
}
+ case PROP_ROI_X:
+ {
+ g_value_set_uint(value, priv->roi_x);
+ break;
+ }
+ case PROP_ROI_Y:
+ {
+ g_value_set_uint(value, priv->roi_y);
+ break;
+ }
case PROP_ROI_WIDTH:
{
- g_value_set_uint(value, dexela_get_width());
+ g_value_set_uint(value, priv->roi_width);
break;
}
case PROP_ROI_HEIGHT:
{
- g_value_set_uint(value, dexela_get_height());
+ g_value_set_uint(value, priv->roi_height);
break;
}
case PROP_SENSOR_HORIZONTAL_BINNING:
@@ -246,6 +261,26 @@ static void uca_dexela_camera_set_property(GObject *object, guint property_id, c
dexela_set_exposure_time_micros((gint) (exposureTimeInSeconds * MICROS_TO_SECONDS_FACTOR));
break;
}
+ case PROP_ROI_X:
+ {
+ priv->roi_x = g_value_get_uint(value);
+ break;
+ }
+ case PROP_ROI_Y:
+ {
+ priv->roi_y = g_value_get_uint(value);
+ break;
+ }
+ case PROP_ROI_WIDTH:
+ {
+ priv->roi_width = g_value_get_uint(value);
+ break;
+ }
+ case PROP_ROI_HEIGHT:
+ {
+ priv->roi_height = g_value_get_uint(value);
+ break;
+ }
case PROP_SENSOR_HORIZONTAL_BINNING:
{
const guint horizontalBinning = g_value_get_uint(value);
@@ -315,9 +350,10 @@ static void uca_dexela_camera_stop_recording(UcaCamera *camera, GError **error)
static gboolean uca_dexela_camera_grab(UcaCamera *camera, gpointer data, GError **error)
{
g_debug("grab called");
- g_return_if_fail(UCA_IS_DEXELA_CAMERA(camera));
+ g_return_val_if_fail(UCA_IS_DEXELA_CAMERA(camera), FALSE);
UcaDexelaCameraPrivate *priv = UCA_DEXELA_CAMERA_GET_PRIVATE(camera);
- memcpy((gchar *) data, dexela_grab(), priv->width * priv->height * priv->num_bytes);
+ guchar* fullFrame = dexela_grab();
+ apply_software_roi(fullFrame, priv->width, data, priv->roi_x, priv->roi_y, priv->roi_width, priv->roi_height);
return TRUE;
}
@@ -361,12 +397,12 @@ static void uca_dexela_camera_class_init(UcaDexelaCameraClass *klass)
for (guint i = 0; base_overrideables[i] != 0; i++) {
g_object_class_override_property(gobject_class, base_overrideables[i], uca_camera_props[base_overrideables[i]]);
}
- dexela_properties[PROP_GAIN_MODE] =
+ dexela_properties[PROP_GAIN_MODE] =
g_param_spec_uint("gain-mode",
"High or Low Full Well",
"High (1) or Low (0) Full Well",
0, 1, 0, G_PARAM_READWRITE);
- dexela_properties[PROP_TEST_MODE] =
+ dexela_properties[PROP_TEST_MODE] =
g_param_spec_boolean("test-mode",
"Enable or disable test mode",
"Enable (true) or disable (false) test mode",
@@ -388,6 +424,10 @@ static void uca_dexela_camera_init(UcaDexelaCamera *self)
priv->bits = dexela_get_bit_depth();
priv->width = dexela_get_width();
priv->height = dexela_get_height();
+ priv->roi_x = 0;
+ priv->roi_y = 0;
+ priv->roi_width = priv->width;
+ priv->roi_height = priv->height;
priv->num_bytes = 2;
}
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 0e8cfad..afe79ec 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,10 +1,14 @@
cmake_minimum_required(VERSION 2.6)
+include_directories(${ucadexela_SOURCE_DIR})
+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gtester.xsl
${CMAKE_CURRENT_BINARY_DIR}/gtester.xsl)
add_executable(test-mock test-mock.c)
add_executable(test-ring-buffer test-ring-buffer.c)
+add_executable(test-software-roi test-software-roi.c ${ucadexela_SOURCE_DIR}/software-roi.c)
target_link_libraries(test-mock uca ${UCA_DEPS})
target_link_libraries(test-ring-buffer uca ${UCA_DEPS})
+target_link_libraries(test-software-roi ${UCA_DEPS})
diff --git a/test/test-software-roi.c b/test/test-software-roi.c
new file mode 100644
index 0000000..2b628c5
--- /dev/null
+++ b/test/test-software-roi.c
@@ -0,0 +1,53 @@
+#include <glib.h>
+#include "software-roi.h"
+
+static const guchar test_frame[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8,
+};
+static const guint test_frame_width = 9;
+
+static guchar test_roi_2x1_5x3[] = {
+ 2, 3, 4, 5, 6,
+ 2, 3, 4, 5, 6,
+ 2, 3, 4, 5, 6,
+};
+
+void typical_roi_test(void)
+{
+ guint roiX = 2;
+ guint roiY = 1;
+ guint roiWidth = 5;
+ guint roiHeight = 3;
+ guint roiSize = roiWidth * roiHeight;
+ guchar roiFrame[roiSize];
+ apply_software_roi(test_frame, test_frame_width, roiFrame, roiX, roiY, roiWidth, roiHeight);
+ for (guint i = 0; i < roiSize; i++) {
+ g_assert_cmpint(test_roi_2x1_5x3[i], ==, roiFrame[i]);
+ }
+}
+
+void nrows_only_roi_test(void)
+{
+ guint roiX = 0;
+ guint roiY = 0;
+ guint roiWidth = test_frame_width;
+ guint roiHeight = 3;
+ guint roiSize = roiWidth * roiHeight;
+ guchar roiFrame[roiSize];
+ apply_software_roi(test_frame, test_frame_width, roiFrame, roiX, roiY, roiWidth, roiHeight);
+ for (guint i = 0; i < roiSize; i++) {
+ g_assert_cmpint(test_frame[i], ==, roiFrame[i]);
+ }
+}
+
+int main(int argc, char** argv)
+{
+ g_test_init(&argc, &argv, NULL);
+ g_test_add_func("/software-roi/apply-typical-roi", typical_roi_test);
+ g_test_add_func("/software-roi/apply-roi-nrows-only", nrows_only_roi_test);
+ return g_test_run();
+}