ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Revision history [back]

click to hide/show revision 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);

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);

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);