[libdc] fix for USB3 transfer errors
Capture and control API for IIDC compliant cameras
Brought to you by:
ddouxchamps,
gordp
From: Zahniser, M. <mic...@ro...> - 2017-04-11 19:13:49
|
Hello libdc1394 folks. I'm using a USB3 camera (Point Grey Grasshopper3 GS3-U3-23S6M) on Ubuntu 16.04. When running in Format 7 Mode 0, image acquisition works properly as long as I specify a frame size that is evenly divisible by the packet size. (For example, a packet size of 46080 bytes at 1920x1200.) On the other hand, if the packet size does not divide the frame size evenly, I get "Bulk transfer failed with code 6" error messages. (I believe this issue has been reported already in this list.) The debug messages report that the number of bytes received in the USB3 bulk transfer is larger than the image size, but smaller than the expected size. On firewire and USB2, when the frame size is not divisible by the packet size, the camera will transfer extra padding bytes to increase the total transfer size to an integral number of packets. But based on my testing, it appears that the Grasshopper 3 camera is not doing so: it transfers the image bytes, and nothing more. The bug is occurring because libdc1394 expects padding and tries to read more bytes than the camera is sending. If I modify dc1394/usb/capture.c as follows, the bug disappears, and the library works with my USB2 camera (a Chameleon CMLN-13S2M) as well as the USB3 camera: *** dc1394/usb/capture.c 2017-04-11 13:47:57.214220904 -0400 --- modified_capture.c 2017-04-11 13:51:05.019691035 -0400 *************** dc1394_usb_capture_setup(platform_camera *** 197,202 **** --- 197,204 ---- dc1394_usb_capture_stop (craw); return DC1394_FAILURE; } + if (libusb_get_device_speed(libusb_get_device(craw->handle)) == LIBUSB_SPEED_SUPER) + proto.total_bytes = proto.image_bytes; if (pipe (craw->notify_pipe) < 0) { dc1394_usb_capture_stop (craw); |