Skip to content

Commit 3850ad8

Browse files
committed
Negotiate maximum USB packet length
Signed-off-by: Benn Snyder <[email protected]>
1 parent bc7acb4 commit 3850ad8

File tree

3 files changed

+65
-38
lines changed

3 files changed

+65
-38
lines changed

src/cameras.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,6 @@ static int freenect_fetch_zero_plane_info(freenect_device *dev)
841841
int freenect_start_depth(freenect_device *dev)
842842
{
843843
freenect_context *ctx = dev->parent;
844-
int res;
845844

846845
if (dev->depth.running)
847846
return -1;
@@ -869,7 +868,12 @@ int freenect_start_depth(freenect_device *dev)
869868
return -1;
870869
}
871870

872-
res = fnusb_start_iso(&dev->usb_cam, &dev->depth_isoc, depth_process, 0x82, NUM_XFERS, PKTS_PER_XFER, DEPTH_PKTBUF);
871+
const unsigned char depth_endpoint = 0x82;
872+
int packet_size = fnusb_get_max_iso_packet_size(&dev->usb_cam, depth_endpoint, DEPTH_PKTBUF);
873+
874+
FN_INFO("[Stream 70] Negotiated packet size %d\n", packet_size);
875+
876+
int res = fnusb_start_iso(&dev->usb_cam, &dev->depth_isoc, depth_process, depth_endpoint, NUM_XFERS, PKTS_PER_XFER, packet_size);
873877
if (res < 0)
874878
return res;
875879

@@ -901,7 +905,6 @@ int freenect_start_depth(freenect_device *dev)
901905
int freenect_start_video(freenect_device *dev)
902906
{
903907
freenect_context *ctx = dev->parent;
904-
int res;
905908

906909
if (dev->video.running)
907910
return -1;
@@ -1015,7 +1018,12 @@ int freenect_start_video(freenect_device *dev)
10151018
break;
10161019
}
10171020

1018-
res = fnusb_start_iso(&dev->usb_cam, &dev->video_isoc, video_process, 0x81, NUM_XFERS, PKTS_PER_XFER, VIDEO_PKTBUF);
1021+
const unsigned char video_endpoint = 0x81;
1022+
int packet_size = fnusb_get_max_iso_packet_size(&dev->usb_cam, video_endpoint, VIDEO_PKTBUF);
1023+
1024+
FN_INFO("[Stream 80] Negotiated packet size %d\n", packet_size);
1025+
1026+
int res = fnusb_start_iso(&dev->usb_cam, &dev->video_isoc, video_process, video_endpoint, NUM_XFERS, PKTS_PER_XFER, packet_size);
10191027
if (res < 0)
10201028
return res;
10211029

src/usb_libusb10.c

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,8 @@ FN_INTERNAL int fnusb_open_subdevices(freenect_device *dev, int index)
256256
{
257257
freenect_context *ctx = dev->parent;
258258

259-
dev->device_does_motor_control_with_audio = 0;
260-
dev->motor_control_with_audio_enabled = 0;
259+
dev->device_does_motor_control_with_audio = 0;
260+
dev->motor_control_with_audio_enabled = 0;
261261

262262
dev->usb_cam.parent = dev;
263263
dev->usb_cam.dev = NULL;
@@ -761,10 +761,22 @@ static void LIBUSB_CALL iso_callback(struct libusb_transfer *xfer)
761761
}
762762
}
763763

764-
FN_INTERNAL int fnusb_start_iso(fnusb_dev *dev, fnusb_isoc_stream *strm, fnusb_iso_cb cb, int ep, int xfers, int pkts, int len)
764+
FN_INTERNAL int fnusb_get_max_iso_packet_size(fnusb_dev *dev, unsigned char endpoint, int default_size)
765+
{
766+
freenect_context *ctx = dev->parent->parent;
767+
768+
int size = libusb_get_max_iso_packet_size(libusb_get_device(dev->dev), endpoint);
769+
if (size <= 0)
770+
{
771+
FN_WARNING("libusb_get_max_iso_packet_size() returned %d; using default %d\n", size, default_size);
772+
size = default_size;
773+
}
774+
return size;
775+
}
776+
777+
FN_INTERNAL int fnusb_start_iso(fnusb_dev *dev, fnusb_isoc_stream *strm, fnusb_iso_cb cb, unsigned char endpoint, int xfers, int pkts, int len)
765778
{
766779
freenect_context *ctx = dev->parent->parent;
767-
int ret, i;
768780

769781
strm->parent = dev;
770782
strm->cb = cb;
@@ -776,27 +788,36 @@ FN_INTERNAL int fnusb_start_iso(fnusb_dev *dev, fnusb_isoc_stream *strm, fnusb_i
776788
strm->dead = 0;
777789
strm->dead_xfers = 0;
778790

791+
int i;
779792
uint8_t *bufp = strm->buffer;
780793

781-
for (i=0; i<xfers; i++) {
782-
FN_SPEW("Creating EP %02x transfer #%d\n", ep, i);
783-
strm->xfers[i] = libusb_alloc_transfer(pkts);
784-
785-
libusb_fill_iso_transfer(strm->xfers[i], dev->dev, ep, bufp, pkts * len, pkts, iso_callback, strm, 0);
786-
787-
libusb_set_iso_packet_lengths(strm->xfers[i], len);
794+
for (i = 0; i < xfers; i++)
795+
{
796+
FN_SPEW("Creating endpoint %02x transfer #%d\n", endpoint, i);
788797

789-
ret = libusb_submit_transfer(strm->xfers[i]);
790-
if (ret < 0) {
791-
FN_WARNING("Failed to submit isochronous transfer %d: %d\n", i, ret);
798+
strm->xfers[i] = libusb_alloc_transfer(pkts);
799+
if (strm->xfers[i] == NULL)
800+
{
801+
FN_WARNING("Failed to allocate transfer\n");
792802
strm->dead_xfers++;
793803
}
804+
else
805+
{
806+
libusb_fill_iso_transfer(strm->xfers[i], dev->dev, endpoint, bufp, pkts * len, pkts, iso_callback, strm, 0);
807+
libusb_set_iso_packet_lengths(strm->xfers[i], len);
808+
809+
int ret = libusb_submit_transfer(strm->xfers[i]);
810+
if (ret < 0)
811+
{
812+
FN_WARNING("Failed to submit isochronous transfer %d: %d\n", i, ret);
813+
strm->dead_xfers++;
814+
}
815+
}
794816

795817
bufp += pkts*len;
796818
}
797819

798820
return 0;
799-
800821
}
801822

802823
FN_INTERNAL int fnusb_stop_iso(fnusb_dev *dev, fnusb_isoc_stream *strm)

src/usb_libusb10.h

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,24 @@
2929
#include "libfreenect.h"
3030
#include <libusb.h>
3131

32+
// There are a few rules: PKTS_PER_XFER * NUM_XFERS <= 1000, PKTS_PER_XFER % 8 == 0.
3233
#if defined(__APPLE__)
33-
/*
34-
https://github.com/OpenKinect/libfreenect/issues/22 (@Roefer)
34+
#define DEPTH_PKTBUF 2048
35+
#define VIDEO_PKTBUF 2048
3536

36-
In camera.c, I use PKTS_PER_XFER = 128, NUM_XFERS = 4. There are a
37-
few rules: PKTS_PER_XFER * NUM_XFERS <= 1000, PKTS_PER_XFER % 8 == 0.
38-
*/
39-
#define PKTS_PER_XFER 128
40-
#define NUM_XFERS 4
41-
#define DEPTH_PKTBUF 2048
42-
#define VIDEO_PKTBUF 2048
43-
#else
44-
#ifdef _WIN32
45-
#define PKTS_PER_XFER 32
46-
#define NUM_XFERS 8
37+
#define PKTS_PER_XFER 128
38+
#define NUM_XFERS 4
4739
#else
48-
#define PKTS_PER_XFER 16
49-
#define NUM_XFERS 16
50-
#endif
51-
#define DEPTH_PKTBUF 1920
52-
#define VIDEO_PKTBUF 1920
40+
#define DEPTH_PKTBUF 1920
41+
#define VIDEO_PKTBUF 1920
42+
43+
#if defined(_WIN32)
44+
#define PKTS_PER_XFER 32
45+
#define NUM_XFERS 8
46+
#else
47+
#define PKTS_PER_XFER 16
48+
#define NUM_XFERS 16
49+
#endif
5350
#endif
5451

5552
typedef struct {
@@ -88,8 +85,9 @@ int fnusb_process_events_timeout(fnusb_ctx *ctx, struct timeval* timeout);
8885
int fnusb_open_subdevices(freenect_device *dev, int index);
8986
int fnusb_close_subdevices(freenect_device *dev);
9087

91-
int fnusb_start_iso(fnusb_dev *dev, fnusb_isoc_stream *strm, fnusb_iso_cb cb, int ep, int xfers, int pkts, int len);
88+
int fnusb_start_iso(fnusb_dev *dev, fnusb_isoc_stream *strm, fnusb_iso_cb cb, unsigned char endpoint, int xfers, int pkts, int len);
9289
int fnusb_stop_iso(fnusb_dev *dev, fnusb_isoc_stream *strm);
90+
int fnusb_get_max_iso_packet_size(fnusb_dev *dev, unsigned char endpoint, int default_size);
9391

9492
int fnusb_control(fnusb_dev *dev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength);
9593
int fnusb_bulk(fnusb_dev *dev, uint8_t endpoint, uint8_t *data, int len, int *transferred);

0 commit comments

Comments
 (0)