Camera works in arv-viewer but cannot be read by gst-aravis-launch aravissrc

Hi all,

I am really new to Aravis and my goal is to use Aravis to detect my GigE camera and then create /dev/videoX via v4l2loopback as suggested in Gstreamer pipelines to use GigE cams as webcam for Zoom/Teams/Skype · GitHub.

I followed the steps mentioned in the website with my MindVision Camera. I can see the real-time image from the camera by arv-viewer-0.8 . However, when I tried gst-launch-1.0 aravissrc ! videoconvert ! xvimagesink , I got error:

~/aravis/build$ gst-launch-1.0 aravissrc ! videoconvert ! xvimagesink
Setting pipeline to PAUSED ...

** (gst-launch-1.0:29128): CRITICAL **: 16:37:32.719: arv_camera_uv_set_usb_mode: assertion 'arv_camera_is_uv_device (camera)' failed
Pipeline is live and does not need PREROLL ...
ERROR: from element /GstPipeline:pipeline0/GstAravis:aravis0: Could not read camera "": [AcquisitionFrameRateAbs:ArvGcIntegerNode] Not a ArvGcFloat
Additional debug info:
../gst/gstaravis.c(445): gst_aravis_init_error (): /GstPipeline:pipeline0/GstAravis:aravis0
ERROR: pipeline doesn't want to preroll.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

I can do the similar thing by using fake camera instead of my camera:

arv-fake-gv-camera-0.8 # In one terminal
gst-launch-1.0 aravissrc ! videoconvert ! xvimagesink # In another terminal

A moving test video is observed from the popup window.

Lists of devices and some debug messages are listed below.

Computer: Nvidia Jetson nano (4GB)
Camera: MindVision-GE500C-051050520768 (GigE camera)

arv-tool-0.8 features:

~/aravis/build$ arv-tool-0.8 features
MindVision-GE500C-051050520768 (10.0.20.78)
Category    : 'Root'
    Category    : 'DeviceControl'
        StringReg    : [RO] 'DeviceModelName'
        StringReg    : [RO] 'DeviceFirmwareVersion'
        Float        : [RO] 'DeviceTemperature'
    Category    : 'AcquisitionControl'
        Enumeration  : [RW] 'AcquisitionMode'
            EnumEntry   : 'SingleFrame'
            EnumEntry   : 'Continuous'
        Command      : [WO] 'AcquisitionStart'
        Command      : [WO] 'AcquisitionStop'
        Enumeration  : [RW] 'AcquisitionFrameRate'
            EnumEntry   : 'Super'
            EnumEntry   : 'High'
            EnumEntry   : 'Mid'
            EnumEntry   : 'Low'
        Boolean      : [RW] 'AcquisitionFrameRateEnable'
        Integer      : [RW] 'AcquisitionFrameRateAbs'
        Integer      : [RW] 'AcquisitionFrameSendConfig'
    Category    : 'TriggerControl'
        Enumeration  : [RW] 'TriggerMode'
            EnumEntry   : 'On_GRR'
            EnumEntry   : 'On'
            EnumEntry   : 'Off'
        Integer      : [RW] 'TriggerCount'
        Integer      : [RW] 'TriggerInterval'
        Enumeration  : [RW] 'TriggerActivation'
            EnumEntry   : 'LowLevel'
            EnumEntry   : 'HighLevel'
            EnumEntry   : 'AnyEdge'
            EnumEntry   : 'FallingEdge'
            EnumEntry   : 'RisingEdge'
        Integer      : [RW] 'ExtTrigJitterTime'
        Integer      : [RW] 'TriggerDelay'
        Enumeration  : [RW] 'StrobeMode'
            EnumEntry   : 'Custom'
            EnumEntry   : 'Auto'
        Integer      : [RW] 'StrobeDelay'
        Integer      : [RW] 'StrobeWidth'
        Command      : [WO] 'TriggerSoftware'
    Category    : 'ImageFormatControl'
        Enumeration  : [RW] 'PixelFormat'
            EnumEntry   : 'BayerBG12'
            EnumEntry   : 'BayerGB12'
            EnumEntry   : 'BayerGR12'
            EnumEntry   : 'BayerRG12'
            EnumEntry   : 'BayerBG12Packed'
            EnumEntry   : 'BayerGB12Packed'
            EnumEntry   : 'BayerGR12Packed'
            EnumEntry   : 'BayerRG12Packed'
            EnumEntry   : 'BayerBG8'
            EnumEntry   : 'BayerGB8'
            EnumEntry   : 'BayerGR8'
            EnumEntry   : 'BayerRG8'
        Boolean      : [RW] 'ReverseX'
        Boolean      : [RW] 'ReverseY'
        Enumeration  : [RW] 'ResolutionPresetSel'
            EnumEntry   : 'Custom'
            EnumEntry   : 'Resol8'
            EnumEntry   : 'Resol7'
            EnumEntry   : 'Resol6'
            EnumEntry   : 'Resol5'
            EnumEntry   : 'Resol4'
            EnumEntry   : 'Resol3'
            EnumEntry   : 'Resol2'
            EnumEntry   : 'Resol1'
        Enumeration  : [RW] 'ResolutionMod'
            EnumEntry   : 'BINAVR4X'
            EnumEntry   : 'BINAVR2X'
            EnumEntry   : 'BINSUM4X'
            EnumEntry   : 'BINSUM2X'
            EnumEntry   : 'Normal'
        Integer      : [RW] 'OffsetX'
        Integer      : [RW] 'OffsetY'
        Integer      : [RW] 'Width'
        Integer      : [RW] 'Height'
        Integer      : [RO] 'WidthMax'
        Integer      : [RO] 'HeightMax'
    Category    : 'ExposureControl'
        Enumeration  : [RW] 'ExposureAuto'
            EnumEntry   : 'Continuous'
            EnumEntry   : 'Off'
        Integer      : [RW] 'AutoExposureTarget'
        Float        : [RW] 'ExposureTime'
        Float        : [RO] 'ExposureTimeMin'
    Category    : 'AnalogControls'
        Float        : [RW] 'Gain'
        Integer      : [RW] 'Contrast'
        Integer      : [RW] 'Gamma'
    Category    : 'ColorControl'
        Boolean      : [RW] 'ColorTemperatureAutoSel'
        Enumeration  : [RW] 'ColorTemperatureIndex'
            EnumEntry   : 'Custom'
            EnumEntry   : 'Index3'
            EnumEntry   : 'Index2'
            EnumEntry   : 'Index1'
        Integer      : [RW] 'RGain'
        Integer      : [RW] 'GGain'
        Integer      : [RW] 'BGain'
        Command      : [WO] 'WBOnce'
        Integer      : [RW] 'Saturation'
    Category    : 'DigitalIOControl'
        Enumeration  : [RW] 'In0Mod'
            EnumEntry   : 'TriggerInput'
            EnumEntry   : 'GPInput'
        Enumeration  : [RW] 'Out0Mod'
            EnumEntry   : 'PWMOutput'
            EnumEntry   : 'StrobeOutput'
            EnumEntry   : 'GPOutput'
        Enumeration  : [RW] 'Out1Mod'
            EnumEntry   : 'PWMOutput'
            EnumEntry   : 'GPOutput'
        Integer      : [RO] 'GPIn0'
        Integer      : [RO] 'GPIn1'
        Integer      : [RO] 'GPIn2'
        Integer      : [RW] 'GPOut0'
        Integer      : [RW] 'GPOut1'
        Integer      : [RW] 'GPOut2'
        Integer      : [RW] 'GPOut3'
        Integer      : [RW] 'PWMOut0Cycle'
        Integer      : [RW] 'PWMOut0Duty'
        Integer      : [RW] 'PWMOut1Cycle'
        Integer      : [RW] 'PWMOut1Duty'
    Category    : 'GigeVisionControl'
        Integer      : [RO] 'PayloadSize'
        Boolean      : [RW] 'GevCurrentIPConfigurationPersistentIP'
        Integer      : [RO] 'GevCurrentIPAddress'
        Integer      : [RO] 'GevCurrentSubnetMask'
        Integer      : [RO] 'GevCurrentDefaultGateway'
        Enumeration  : [RO] 'GevIPConfigurationStatus'
            EnumEntry   : 'ForceIP'
            EnumEntry   : 'LLA'
            EnumEntry   : 'DHCP'
            EnumEntry   : 'PersistentIP'
            EnumEntry   : 'None'
        Integer      : [RW] 'GevPersistentIPAddress'
        Integer      : [RW] 'GevPersistentSubnetMask'
        Integer      : [RW] 'GevPersistentDefaultGateway'
        Integer      : [RO] 'GevLinkSpeed'
        Integer      : [RW] 'GevHeartbeatTimeout'
        Boolean      : [RW] 'GevGVCPHeartbeatDisable'
        Enumeration  : [RW] 'GevCCP'
            EnumEntry   : 'ControlAccessSwitchoverActive'
            EnumEntry   : 'ControlAccess'
            EnumEntry   : 'ExclusiveAccess'
            EnumEntry   : 'OpenAccess'
        Integer      : [RW] 'GevPrimaryApplicationSocket'
        Integer      : [RW] 'GevPrimaryApplicationIPAddress'
        Integer      : [RW] 'GevSCPHostPort'
        Integer      : [RW] 'GevSCPSPacketSize'
        Integer      : [RW] 'GevSCPD'
        Integer      : [RW] 'GevSCDA'
        Integer      : [RW] 'GevSCSP'
    Category    : 'UserSetControl'
        Enumeration  : [RW] 'UserSetSelector'
              * UserSetLoad
              * UserSetSave
            EnumEntry   : 'UserSet2'
            EnumEntry   : 'UserSet1'
            EnumEntry   : 'Default'
        Command      : [WO] 'UserSetLoad'
        Command     : 'UserSetSave' (Not available)
        Enumeration  : [RW] 'UserSetDefaultSelector'
            EnumEntry   : 'UserSet2'
            EnumEntry   : 'UserSet1'
            EnumEntry   : 'Default'
    Category    : 'SensorCorrection'
        Integer      : [RW] 'CcdTap1GainStep'
        Integer      : [RW] 'CcdTap2GainStep'
        Integer      : [RW] 'CcdTap3GainStep'
        Integer      : [RW] 'CcdTap4GainStep'
        Command      : [WO] 'SensorCorrectionDataSave'

ARV_DEBUG=all ./gst/gst-aravis-launch aravissrc ! videoconvert ! ximagesink:

~/aravis/build$ ARV_DEBUG=all ./gst/gst-aravis-launch aravissrc ! videoconvert ! ximagesink
Setting pipeline to PAUSED ...
[16:14:50.465] 🅸 interface> Found 0 USB3Vision device (among 5 USB devices)
[16:14:50.465] 🅸 interface> [GvDiscoverSocket::new] Add interface 127.0.0.1 (127.0.0.1)
[16:14:50.466] 🅸 interface> [GvDiscoverSocket::new] Add interface 10.0.20.149 (10.0.21.255)
[16:14:50.467] 🅸 interface> [GvInterface::discovery] Device 'MindVision-GE500C-051050520768' found (interface 10.0.20.149) user_id '' - MAC 'dc:a5:01:6a:04:45'
[16:14:50.467] 🅸 device> [GvDevice::new] Interface address = 10.0.20.149
[16:14:50.467] 🅸 device> [GvDevice::new] Device address = 10.0.20.78
[16:14:50.468] 🅸 device> [GvDevice::load_genicam] xml url = 'Local:GE_C_V1_2_180428.zip;10424000;1d62' at 0x200
[16:14:50.468] 🅸 device> [GvDevice::load_genicam] Xml address = 0x10424000 - size = 0x1d62 - GE_C_V1_2_180428.zip
[16:14:50.477] 🅸 device> [GvDevice::load_genicam] Zipped xml data
[16:14:50.516] 🅸 genicam> [Gc::set_default_node_data] Add 'DeviceVendorName'
[16:14:50.517] 🅸 genicam> [Gc::set_default_node_data] Add 'DeviceVersion'
[16:14:50.517] 🅸 genicam> [Gc::set_default_node_data] Add 'DeviceManufacturerInfo'
[16:14:50.517] 🅸 genicam> [Gc::set_default_node_data] Add 'DeviceID'
[16:14:50.517] 🅸 genicam> [Gc::set_default_node_data] Add 'GevStreamChannelCount'
[16:14:50.518] 🅸 genicam> [Gc::set_default_node_data] Add 'GevTimestampTickFrequency'
[16:14:50.519] 🅸 genicam> [Gc::set_default_node_data] Add 'GevSCPSDoNotFragment'
[16:14:50.519] 🅸 genicam> [Gc::set_default_node_data] Add 'GevSCPSBigEndian'
[16:14:50.519] 🅸 genicam> [Gc::set_default_node_data] Add 'GevSCPAddrCalc'
[16:14:50.520] 🅸 genicam> [Gc::set_default_node_data] Add 'TLParamsLocked'
[16:14:50.559] 🅸 device> [GvDevice::new] Device endianness = big
[16:14:50.559] 🅸 device> [GvDevice::new] Packet resend     = yes
[16:14:50.560] 🅸 device> [GvDevice::new] Write memory      = yes
[16:14:50.560] 🅸 device> [GvDevice::new] Legacy endianness handling = yes

** (gst-launch-1.0:29434): CRITICAL **: 16:14:50.561: arv_camera_uv_set_usb_mode: assertion 'arv_camera_is_uv_device (camera)' failed
Pipeline is live and does not need PREROLL ...
ERROR: from element /GstPipeline:pipeline0/GstAravis:aravis0: Could not read camera "": [AcquisitionFrameRateAbs:ArvGcIntegerNode] Not a ArvGcFloat
Additional debug info:
../gst/gstaravis.c(445): gst_aravis_init_error (): /GstPipeline:pipeline0/GstAravis:aravis0
ERROR: pipeline doesn't want to preroll.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

Thank you for your time!

Best,
Lester

Hi,

That is the source of your issue. Your camera has its own funky way to handle frame rate. How are we supposed to know which frame rate corresponds to Super ?

There is already a kludge implemented in arvcamera.c for some TheImagingSource cameras, that also use an enumeration for this feature. At least in this case the enumeration labels are explicit.

Please open an issue on github. Patch welcome !

Cheers,

Emmanuel.

Thank you @Emmanuel ,

I saw a post Imperx Bobcat 6620C Support · Issue #439 · AravisProject/aravis · GitHub using a camera without AcquisitionFrameRateAbs and AcquisitionFrameRate. They can modify the arvcamera.c file and set the frame rate themselves. Is it workable in my case?

I had tried a similar thing, and the modifications are listed below:
1. Add ARV_CAMERA_VENDOR_MV under typedef enum { …} ArvCameraVendor;
2. Add ARV_CAMERA_SERIES_MV under typedef enum { …} ArvCameraSeries;
3. Under

void
arv_camera_set_frame_rate (ArvCamera *camera, double frame_rate, GError **error)

, add

case ARV_CAMERA_VENDOR_MV:
                        if (local_error == NULL)
/*                              arv_camera_set_string (camera, "TriggerMode", "Off", &local_error);
*/
                                arv_camera_set_boolean (camera, "AcquisitionFrameRateEnable", TRUE, &local_error);
                        if (local_error == NULL)
                                arv_camera_set_integer (camera, "AcquisitionFrameRateAbs", frame_rate, &local_error);
                        break;

4. Under

double
arv_camera_get_frame_rate (ArvCamera *camera, GError **error)

, add

case ARV_CAMERA_VENDOR_MV:
                        return arv_camera_get_integer (camera, "AcquisitionFrameRate", error);

5. Under

void
arv_camera_get_frame_rate_bounds (ArvCamera *camera, double *min, double *max, GError **error)

, add

case ARV_CAMERA_VENDOR_MV:
                        arv_camera_get_integer_bounds (camera, "AcquisitionFrameRateAbs", min, max, error);
                        break;

6. Under

gboolean
arv_camera_is_frame_rate_available (ArvCamera *camera, GError **error)

, add

case ARV_CAMERA_VENDOR_MV:
                        return arv_camera_is_feature_available (camera, "AcquisitionFrameRateAbs", error);

7. Under

static void
arv_camera_constructed (GObject *object)

, add

else if (g_strcmp0 (vendor_name, "MindVision") == 0) {
                vendor = ARV_CAMERA_VENDOR_MV;
                series = ARV_CAMERA_SERIES_MV;
}

Warning exist when I type ninja after modifying the file.

[1/34] Compiling C object src/libaravis-0.8.so.0.8.22.p/arvcamera.c.o
../src/arvcamera.c: In function ‘arv_camera_get_frame_rate_bounds’:
../src/arvcamera.c:1233:70: warning: passing argument 3 of ‘arv_camera_get_integer_bounds’ from incompatible pointer type [-Wincompatible-pointer-types]
    arv_camera_get_integer_bounds (camera, "AcquisitionFrameRateAbs", min, max, error);
                                                                      ^~~
In file included from ../src/arvcamera.c:34:0:
../src/arvcamera.h:165:15: note: expected ‘gint64 * {aka long int *}’ but argument is of type ‘double *’
 ARV_API void  arv_camera_get_integer_bounds  (ArvCamera *camera, const char *feature, gint64 *min, gint64 *max, GError **error);
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../src/arvcamera.c:1233:75: warning: passing argument 4 of ‘arv_camera_get_integer_bounds’ from incompatible pointer type [-Wincompatible-pointer-types]
    arv_camera_get_integer_bounds (camera, "AcquisitionFrameRateAbs", min, max, error);
                                                                           ^~~
In file included from ../src/arvcamera.c:34:0:
../src/arvcamera.h:165:15: note: expected ‘gint64 * {aka long int *}’ but argument is of type ‘double *’
 ARV_API void  arv_camera_get_integer_bounds  (ArvCamera *camera, const char *feature, gint64 *min, gint64 *max, GError **error);
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The output of ARV_DEBUG=all ./gst/gst-aravis-launch aravissrc ! videoconvert ! xvimagesink is :

~/aravis_int_float_2/build$ ARV_DEBUG=all ./gst/gst-aravis-launch aravissrc ! videoconvert ! xvimagesink
Setting pipeline to PAUSED ...
[09:34:21.046] 🅸 interface> Found 0 USB3Vision device (among 5 USB devices)
[09:34:21.047] 🅸 interface> [GvDiscoverSocket::new] Add interface 127.0.0.1 (127.0.0.1)
[09:34:21.047] 🅸 interface> [GvDiscoverSocket::new] Add interface 10.0.20.149 (10.0.21.255)
[09:34:21.048] 🅸 interface> [GvInterface::discovery] Device 'MindVision-GE500C-051050520768' found (interface 10.0.20.149) user_id '' - MAC 'dc:a5:01:6a:04:45'
[09:34:21.048] 🅸 device> [GvDevice::new] Interface address = 10.0.20.149
[09:34:21.048] 🅸 device> [GvDevice::new] Device address = 10.0.20.78
[09:34:21.049] 🅸 device> [GvDevice::load_genicam] xml url = 'Local:GE_C_V1_2_180428.zip;10424000;1d62' at 0x200
[09:34:21.050] 🅸 device> [GvDevice::load_genicam] Xml address = 0x10424000 - size = 0x1d62 - GE_C_V1_2_180428.zip
[09:34:21.059] 🅸 device> [GvDevice::load_genicam] Zipped xml data
[09:34:21.085] 🅸 genicam> [Gc::set_default_node_data] Add 'DeviceVendorName'
[09:34:21.085] 🅸 genicam> [Gc::set_default_node_data] Add 'DeviceVersion'
[09:34:21.085] 🅸 genicam> [Gc::set_default_node_data] Add 'DeviceManufacturerInfo'
[09:34:21.085] 🅸 genicam> [Gc::set_default_node_data] Add 'DeviceID'
[09:34:21.085] 🅸 genicam> [Gc::set_default_node_data] Add 'GevStreamChannelCount'
[09:34:21.086] 🅸 genicam> [Gc::set_default_node_data] Add 'GevTimestampTickFrequency'
[09:34:21.086] 🅸 genicam> [Gc::set_default_node_data] Add 'GevSCPSDoNotFragment'
[09:34:21.086] 🅸 genicam> [Gc::set_default_node_data] Add 'GevSCPSBigEndian'
[09:34:21.087] 🅸 genicam> [Gc::set_default_node_data] Add 'GevSCPAddrCalc'
[09:34:21.087] 🅸 genicam> [Gc::set_default_node_data] Add 'TLParamsLocked'
[09:34:21.132] 🅸 device> [GvDevice::new] Device endianness = big
[09:34:21.132] 🅸 device> [GvDevice::new] Packet resend     = yes
[09:34:21.132] 🅸 device> [GvDevice::new] Write memory      = yes
[09:34:21.132] 🅸 device> [GvDevice::new] Legacy endianness handling = yes

** (gst-launch-1.0:23598): CRITICAL **: 09:34:21.133: arv_camera_uv_set_usb_mode: assertion 'arv_camera_is_uv_device (camera)' failed

(gst-launch-1.0:23598): GStreamer-CRITICAL **: 09:34:21.134: range start is not smaller than end for `GstFractionRange'

(gst-launch-1.0:23598): GStreamer-CRITICAL **: 09:34:21.134: range start is not smaller than end for `GstFractionRange'

(gst-launch-1.0:23598): GStreamer-CRITICAL **: 09:34:21.134: range start is not smaller than end for `GstFractionRange'

(gst-launch-1.0:23598): GStreamer-CRITICAL **: 09:34:21.134: range start is not smaller than end for `GstFractionRange'
[09:34:21.134] 🆆 misc> [PixelFormat::to_gst_caps_string] 0x010c002b not found
[09:34:21.134] 🆆 misc> [PixelFormat::to_gst_caps_string] 0x010c002a not found
[09:34:21.134] 🆆 misc> [PixelFormat::to_gst_caps_string] 0x010c002c not found
[09:34:21.135] 🆆 misc> [PixelFormat::to_gst_caps_string] 0x010c002d not found
[09:34:21.135] 🆆 misc> [PixelFormat::to_gst_caps_string] 0x01100011 not found
[09:34:21.135] 🆆 misc> [PixelFormat::to_gst_caps_string] 0x01100010 not found
[09:34:21.135] 🆆 misc> [PixelFormat::to_gst_caps_string] 0x01100012 not found
[09:34:21.135] 🆆 misc> [PixelFormat::to_gst_caps_string] 0x01100013 not found
Pipeline is live and does not need PREROLL ...
ERROR: from element /GstPipeline:pipeline0/GstAravis:aravis0: Internal data stream error.
Additional debug info:
gstbasesrc.c(3055): gst_base_src_loop (): /GstPipeline:pipeline0/GstAravis:aravis0:
streaming stopped, reason not-negotiated (-4)
ERROR: pipeline doesn't want to preroll.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

I tried to set the AcquisitionFrameRateAbs as 30 by

~/aravis_int_float_2/build$ arv-tool-0.8 control AcquisitionFrameRateAbs=30
MindVision-GE500C-051050520768 (10.0.20.78)
AcquisitionFrameRateAbs = 30 min:0 max:65535

However it still does not work. Is it possible to ignore the strange ‘Super’ ‘High’ … AcquisitionFrameRate by modifying the arvcamera.c as I did above?

Again, thank you very much for your help!

Best,
Lester

On your camera, AcquisitionFrameRate is not a number, but an enumeration.

So what you need to implements in ArvCamera.c is a code that takes a frame rate as a float value (the frame_rate parameter of arv_camera_set_frame_rate) and convert it to either Super, High, Mid or Low, then call arv_camera_set_string(camera, "AcquisitionFrameRate", ...) with it.

And obviously you need the reverse operation in arv_camera_get_frame_rate.