ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange |
1 | initial version |
The code still won't run.
The good news is that I figured out what's wrong.
For some reason, the frame being captured has smaller size than it should. The bottom part(almost 1/3) of the frames is not returned.
When deinterlacing takes part, the function assumes that it has to deal with 640*480 images. At some point, not allocated memory is being parsed and segfault occurs.
I found a file named "videre_fix.patch", which patches dc1394/control.c and dc1394/control.h and I was told that is supposed to fix that problem. Patched, configure, make, make install libdc1394-2.1.2 but still no luck.
Are there any suggestions to this problem?
Anton, thank you very much for your time!
videre_fix.patch
Index: dc1394/control.c
===================================================================
--- dc1394/control.c (revision 563)
+++ dc1394/control.c (working copy)
@@ -1038,6 +1038,20 @@
}
dc1394error_t
+dc1394_feature_whitebalance_set_value_blind(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value)
+{
+ uint32_t curval;
+ dc1394error_t err;
+ // err=dc1394_get_control_register(camera, REG_CAMERA_WHITE_BALANCE, &curval);
+ // DC1394_ERR_RTN(err, "Could not get white balance");
+
+ curval= ( ((u_b_value & 0xFFFUL) << 12) | (v_r_value & 0xFFFUL) );
+ err=dc1394_set_control_register(camera, REG_CAMERA_WHITE_BALANCE, curval);
+ DC1394_ERR_RTN(err, "Could not set white balance");
+ return err;
+}
+
+dc1394error_t
dc1394_feature_temperature_get_value(dc1394camera_t *camera, uint32_t *target_temperature, uint32_t *temperature)
{
uint32_t value;
@@ -1248,6 +1262,33 @@
}
dc1394error_t
+dc1394_feature_set_value_blind(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value)
+{
+ uint32_t quadval;
+ uint64_t offset;
+ dc1394error_t err;
+
+ if ( (feature<DC1394_FEATURE_MIN) || (feature>DC1394_FEATURE_MAX) )
+ return DC1394_INVALID_FEATURE;
+
+ if ((feature==DC1394_FEATURE_WHITE_BALANCE)||
+ (feature==DC1394_FEATURE_WHITE_SHADING)||
+ (feature==DC1394_FEATURE_TEMPERATURE)) {
+ err=DC1394_INVALID_FEATURE;
+ DC1394_ERR_RTN(err, "You should use the specific functions to write from multiple-value features");
+ }
+
+ FEATURE_TO_VALUE_OFFSET(feature, offset);
+
+ // err=dc1394_get_control_register(camera, offset, &quadval);
+ // DC1394_ERR_RTN(err, "Could not get feature value");
+
+ err=dc1394_set_control_register(camera, offset, (value & 0xFFFUL));
+ DC1394_ERR_RTN(err, "Could not set feature value");
+ return err;
+}
+
+dc1394error_t
dc1394_feature_is_present(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value)
{
/*
@@ -1536,6 +1577,44 @@
}
dc1394error_t
+dc1394_feature_set_mode_blind(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode)
+{
+ dc1394error_t err;
+ uint64_t offset;
+ uint32_t value;
+
+ if ( (feature<DC1394_FEATURE_MIN) || (feature>DC1394_FEATURE_MAX) )
+ return DC1394_INVALID_FEATURE;
+
+ if ( (mode<DC1394_FEATURE_MODE_MIN) || (mode>DC1394_FEATURE_MODE_MAX) )
+ return DC1394_INVALID_FEATURE_MODE;
+
+ if (feature == DC1394_FEATURE_TRIGGER) {
+ return DC1394_INVALID_FEATURE;
+ }
+
+ FEATURE_TO_VALUE_OFFSET(feature, offset);
+
+ // err=dc1394_get_control_register(camera, offset, &curval);
+ // DC1394_ERR_RTN(err, "Could not get feature register");
+
+ if (mode==DC1394_FEATURE_MODE_AUTO)
+ {
+ value = 0x01000000UL;
+ err=dc1394_set_control_register(camera, offset, value);
+ DC1394_ERR_RTN(err, "Could not set auto mode for feature");
+ }
+ else if (mode==DC1394_FEATURE_MODE_MANUAL)
+ {
+ value = 0;
+ err=dc1394_set_control_register(camera, offset, value);
+ DC1394_ERR_RTN(err, "Could not set auto mode for feature");
+ }
+
+ return err;
+}
+
+dc1394error_t
dc1394_feature_get_boundaries(dc1394camera_t *camera, dc1394feature_t feature, uint32_t *min, uint32_t *max)
{
dc1394error_t err;
Index: dc1394/control.h
===================================================================
--- dc1394/control.h (revision 563)
+++ dc1394/control.h (working copy)
@@ -234,6 +234,11 @@
dc1394error_t dc1394_feature_whitebalance_set_value(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value);
/**
+ * Sets the whitebalance values without checking the current values
+ */
+dc1394error_t dc1394_feature_whitebalance_set_value_blind(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value);
+
+/**
* Gets the temperature values (target and current)
*/
dc1394error_t dc1394_feature_temperature_get_value(dc1394camera_t *camera, uint32_t *target_temperature, uint32_t *temperature);
@@ -264,6 +269,11 @@
dc1394error_t dc1394_feature_set_value(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value);
/**
+ * Sets the value of a feature without checking the current value
+ */
+dc1394error_t dc1394_feature_set_value_blind(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value);
+
+/**
* Tells whether a feature is present or not
*/
dc1394error_t dc1394_feature_is_present(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value);
@@ -309,6 +319,11 @@
dc1394error_t dc1394_feature_set_mode(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode);
/**
+ * Sets the current control modes for a feature without checking current value
+ */
+dc1394error_t dc1394_feature_set_mode_blind(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode);
+
+/**
* Tells whether a feature can be controlled in absolute mode
*/
dc1394error_t dc1394_feature_has_absolute_control(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value);
2 | No.2 Revision |
The code still won't run.
The good news is are that I figured out what's wrong.
For some reason, the frame being captured has smaller size than it should. The bottom part(almost 1/3) of the frames is not returned.
When deinterlacing takes part, the function assumes that it has to deal with 640*480 images. At some point, not allocated memory is being parsed and segfault occurs.
I found a file named "videre_fix.patch", which patches dc1394/control.c and dc1394/control.h and I was told that is supposed to fix that problem. Patched, configure, make, make install libdc1394-2.1.2 but still no luck.
Are there any suggestions to this problem?
Anton, thank you very much for your time!
videre_fix.patch
Index: dc1394/control.c
===================================================================
--- dc1394/control.c (revision 563)
+++ dc1394/control.c (working copy)
@@ -1038,6 +1038,20 @@
}
dc1394error_t
+dc1394_feature_whitebalance_set_value_blind(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value)
+{
+ uint32_t curval;
+ dc1394error_t err;
+ // err=dc1394_get_control_register(camera, REG_CAMERA_WHITE_BALANCE, &curval);
+ // DC1394_ERR_RTN(err, "Could not get white balance");
+
+ curval= ( ((u_b_value & 0xFFFUL) << 12) | (v_r_value & 0xFFFUL) );
+ err=dc1394_set_control_register(camera, REG_CAMERA_WHITE_BALANCE, curval);
+ DC1394_ERR_RTN(err, "Could not set white balance");
+ return err;
+}
+
+dc1394error_t
dc1394_feature_temperature_get_value(dc1394camera_t *camera, uint32_t *target_temperature, uint32_t *temperature)
{
uint32_t value;
@@ -1248,6 +1262,33 @@
}
dc1394error_t
+dc1394_feature_set_value_blind(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value)
+{
+ uint32_t quadval;
+ uint64_t offset;
+ dc1394error_t err;
+
+ if ( (feature<DC1394_FEATURE_MIN) || (feature>DC1394_FEATURE_MAX) )
+ return DC1394_INVALID_FEATURE;
+
+ if ((feature==DC1394_FEATURE_WHITE_BALANCE)||
+ (feature==DC1394_FEATURE_WHITE_SHADING)||
+ (feature==DC1394_FEATURE_TEMPERATURE)) {
+ err=DC1394_INVALID_FEATURE;
+ DC1394_ERR_RTN(err, "You should use the specific functions to write from multiple-value features");
+ }
+
+ FEATURE_TO_VALUE_OFFSET(feature, offset);
+
+ // err=dc1394_get_control_register(camera, offset, &quadval);
+ // DC1394_ERR_RTN(err, "Could not get feature value");
+
+ err=dc1394_set_control_register(camera, offset, (value & 0xFFFUL));
+ DC1394_ERR_RTN(err, "Could not set feature value");
+ return err;
+}
+
+dc1394error_t
dc1394_feature_is_present(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value)
{
/*
@@ -1536,6 +1577,44 @@
}
dc1394error_t
+dc1394_feature_set_mode_blind(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode)
+{
+ dc1394error_t err;
+ uint64_t offset;
+ uint32_t value;
+
+ if ( (feature<DC1394_FEATURE_MIN) || (feature>DC1394_FEATURE_MAX) )
+ return DC1394_INVALID_FEATURE;
+
+ if ( (mode<DC1394_FEATURE_MODE_MIN) || (mode>DC1394_FEATURE_MODE_MAX) )
+ return DC1394_INVALID_FEATURE_MODE;
+
+ if (feature == DC1394_FEATURE_TRIGGER) {
+ return DC1394_INVALID_FEATURE;
+ }
+
+ FEATURE_TO_VALUE_OFFSET(feature, offset);
+
+ // err=dc1394_get_control_register(camera, offset, &curval);
+ // DC1394_ERR_RTN(err, "Could not get feature register");
+
+ if (mode==DC1394_FEATURE_MODE_AUTO)
+ {
+ value = 0x01000000UL;
+ err=dc1394_set_control_register(camera, offset, value);
+ DC1394_ERR_RTN(err, "Could not set auto mode for feature");
+ }
+ else if (mode==DC1394_FEATURE_MODE_MANUAL)
+ {
+ value = 0;
+ err=dc1394_set_control_register(camera, offset, value);
+ DC1394_ERR_RTN(err, "Could not set auto mode for feature");
+ }
+
+ return err;
+}
+
+dc1394error_t
dc1394_feature_get_boundaries(dc1394camera_t *camera, dc1394feature_t feature, uint32_t *min, uint32_t *max)
{
dc1394error_t err;
Index: dc1394/control.h
===================================================================
--- dc1394/control.h (revision 563)
+++ dc1394/control.h (working copy)
@@ -234,6 +234,11 @@
dc1394error_t dc1394_feature_whitebalance_set_value(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value);
/**
+ * Sets the whitebalance values without checking the current values
+ */
+dc1394error_t dc1394_feature_whitebalance_set_value_blind(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value);
+
+/**
* Gets the temperature values (target and current)
*/
dc1394error_t dc1394_feature_temperature_get_value(dc1394camera_t *camera, uint32_t *target_temperature, uint32_t *temperature);
@@ -264,6 +269,11 @@
dc1394error_t dc1394_feature_set_value(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value);
/**
+ * Sets the value of a feature without checking the current value
+ */
+dc1394error_t dc1394_feature_set_value_blind(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value);
+
+/**
* Tells whether a feature is present or not
*/
dc1394error_t dc1394_feature_is_present(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value);
@@ -309,6 +319,11 @@
dc1394error_t dc1394_feature_set_mode(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode);
/**
+ * Sets the current control modes for a feature without checking current value
+ */
+dc1394error_t dc1394_feature_set_mode_blind(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode);
+
+/**
* Tells whether a feature can be controlled in absolute mode
*/
dc1394error_t dc1394_feature_has_absolute_control(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value);
3 | No.3 Revision |
The code still won't run.
The good news are that I figured out what's wrong.
For some reason, the frame being captured has smaller size than it should. The bottom part(almost 1/3) of the frames is not returned.
When deinterlacing takes part, place, the function assumes that it has to deal with 640*480 images. At some point, not allocated unallocated memory is being parsed and segfault occurs.
I found a file named "videre_fix.patch", which patches dc1394/control.c and dc1394/control.h and I was told that is supposed to fix that problem. Patched, configure, make, make install libdc1394-2.1.2 but still no luck.
Are there any suggestions to this problem?
Anton, thank you very much for your time!
videre_fix.patch
Index: dc1394/control.c
===================================================================
--- dc1394/control.c (revision 563)
+++ dc1394/control.c (working copy)
@@ -1038,6 +1038,20 @@
}
dc1394error_t
+dc1394_feature_whitebalance_set_value_blind(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value)
+{
+ uint32_t curval;
+ dc1394error_t err;
+ // err=dc1394_get_control_register(camera, REG_CAMERA_WHITE_BALANCE, &curval);
+ // DC1394_ERR_RTN(err, "Could not get white balance");
+
+ curval= ( ((u_b_value & 0xFFFUL) << 12) | (v_r_value & 0xFFFUL) );
+ err=dc1394_set_control_register(camera, REG_CAMERA_WHITE_BALANCE, curval);
+ DC1394_ERR_RTN(err, "Could not set white balance");
+ return err;
+}
+
+dc1394error_t
dc1394_feature_temperature_get_value(dc1394camera_t *camera, uint32_t *target_temperature, uint32_t *temperature)
{
uint32_t value;
@@ -1248,6 +1262,33 @@
}
dc1394error_t
+dc1394_feature_set_value_blind(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value)
+{
+ uint32_t quadval;
+ uint64_t offset;
+ dc1394error_t err;
+
+ if ( (feature<DC1394_FEATURE_MIN) || (feature>DC1394_FEATURE_MAX) )
+ return DC1394_INVALID_FEATURE;
+
+ if ((feature==DC1394_FEATURE_WHITE_BALANCE)||
+ (feature==DC1394_FEATURE_WHITE_SHADING)||
+ (feature==DC1394_FEATURE_TEMPERATURE)) {
+ err=DC1394_INVALID_FEATURE;
+ DC1394_ERR_RTN(err, "You should use the specific functions to write from multiple-value features");
+ }
+
+ FEATURE_TO_VALUE_OFFSET(feature, offset);
+
+ // err=dc1394_get_control_register(camera, offset, &quadval);
+ // DC1394_ERR_RTN(err, "Could not get feature value");
+
+ err=dc1394_set_control_register(camera, offset, (value & 0xFFFUL));
+ DC1394_ERR_RTN(err, "Could not set feature value");
+ return err;
+}
+
+dc1394error_t
dc1394_feature_is_present(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value)
{
/*
@@ -1536,6 +1577,44 @@
}
dc1394error_t
+dc1394_feature_set_mode_blind(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode)
+{
+ dc1394error_t err;
+ uint64_t offset;
+ uint32_t value;
+
+ if ( (feature<DC1394_FEATURE_MIN) || (feature>DC1394_FEATURE_MAX) )
+ return DC1394_INVALID_FEATURE;
+
+ if ( (mode<DC1394_FEATURE_MODE_MIN) || (mode>DC1394_FEATURE_MODE_MAX) )
+ return DC1394_INVALID_FEATURE_MODE;
+
+ if (feature == DC1394_FEATURE_TRIGGER) {
+ return DC1394_INVALID_FEATURE;
+ }
+
+ FEATURE_TO_VALUE_OFFSET(feature, offset);
+
+ // err=dc1394_get_control_register(camera, offset, &curval);
+ // DC1394_ERR_RTN(err, "Could not get feature register");
+
+ if (mode==DC1394_FEATURE_MODE_AUTO)
+ {
+ value = 0x01000000UL;
+ err=dc1394_set_control_register(camera, offset, value);
+ DC1394_ERR_RTN(err, "Could not set auto mode for feature");
+ }
+ else if (mode==DC1394_FEATURE_MODE_MANUAL)
+ {
+ value = 0;
+ err=dc1394_set_control_register(camera, offset, value);
+ DC1394_ERR_RTN(err, "Could not set auto mode for feature");
+ }
+
+ return err;
+}
+
+dc1394error_t
dc1394_feature_get_boundaries(dc1394camera_t *camera, dc1394feature_t feature, uint32_t *min, uint32_t *max)
{
dc1394error_t err;
Index: dc1394/control.h
===================================================================
--- dc1394/control.h (revision 563)
+++ dc1394/control.h (working copy)
@@ -234,6 +234,11 @@
dc1394error_t dc1394_feature_whitebalance_set_value(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value);
/**
+ * Sets the whitebalance values without checking the current values
+ */
+dc1394error_t dc1394_feature_whitebalance_set_value_blind(dc1394camera_t *camera, uint32_t u_b_value, uint32_t v_r_value);
+
+/**
* Gets the temperature values (target and current)
*/
dc1394error_t dc1394_feature_temperature_get_value(dc1394camera_t *camera, uint32_t *target_temperature, uint32_t *temperature);
@@ -264,6 +269,11 @@
dc1394error_t dc1394_feature_set_value(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value);
/**
+ * Sets the value of a feature without checking the current value
+ */
+dc1394error_t dc1394_feature_set_value_blind(dc1394camera_t *camera, dc1394feature_t feature, uint32_t value);
+
+/**
* Tells whether a feature is present or not
*/
dc1394error_t dc1394_feature_is_present(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value);
@@ -309,6 +319,11 @@
dc1394error_t dc1394_feature_set_mode(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode);
/**
+ * Sets the current control modes for a feature without checking current value
+ */
+dc1394error_t dc1394_feature_set_mode_blind(dc1394camera_t *camera, dc1394feature_t feature, dc1394feature_mode_t mode);
+
+/**
* Tells whether a feature can be controlled in absolute mode
*/
dc1394error_t dc1394_feature_has_absolute_control(dc1394camera_t *camera, dc1394feature_t feature, dc1394bool_t *value);