Skip to content

Commit ece9eef

Browse files
stevenlovegroveqdot
authored andcommitted
Support for 10bit depth buffer mode
The Kinect supports different modes for returning depth data. From some experimentation, modifying the data of init 7 changes these modes. mode 0x02 is easy to interpret as a 10bit depth buffer mode which this commit adds support for. Signed-off-by: Steven Lovegrove <[email protected]>
1 parent 0755600 commit ece9eef

File tree

4 files changed

+45
-13
lines changed

4 files changed

+45
-13
lines changed

c/examples/glview.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ int main(int argc, char **argv)
278278
freenect_set_depth_callback(f_dev, depth_cb);
279279
freenect_set_rgb_callback(f_dev, rgb_cb);
280280
freenect_set_rgb_format(f_dev, FREENECT_FORMAT_RGB);
281+
freenect_set_depth_format(f_dev, FREENECT_FORMAT_11_BIT);
281282

282283
res = pthread_create(&gl_thread, NULL, gl_threadfunc, NULL);
283284
if (res) {

c/include/libfreenect.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ typedef enum {
5959
LED_BLINK_RED_YELLOW = 6
6060
} freenect_led_options;
6161

62-
62+
typedef enum {
63+
FREENECT_FORMAT_11_BIT = 0,
64+
FREENECT_FORMAT_10_BIT = 1
65+
} freenect_depth_format;
6366

6467
struct _freenect_context;
6568
typedef struct _freenect_context freenect_context;
@@ -90,6 +93,7 @@ typedef void (*freenect_rgb_cb)(freenect_device *dev, freenect_pixel *rgb, uint3
9093
void freenect_set_depth_callback(freenect_device *dev, freenect_depth_cb cb);
9194
void freenect_set_rgb_callback(freenect_device *dev, freenect_rgb_cb cb);
9295
int freenect_set_rgb_format(freenect_device *dev, freenect_rgb_format fmt);
96+
int freenect_set_depth_format(freenect_device *dev, freenect_depth_format fmt);
9397

9498
int freenect_start_depth(freenect_device *dev);
9599
int freenect_start_rgb(freenect_device *dev);

c/lib/cameras.c

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,21 @@ static int stream_process(packet_stream *strm, uint8_t *pkt, int len)
141141
}
142142
}
143143

144+
// Unpack buffer of (vw bit) data into padded 16bit buffer.
145+
#define CONVERT_PACKED_BUFFER_TO_16_BIT(depth_raw, depth_frame, vw) {\
146+
const int mask = (1 << vw) - 1; \
147+
int i; \
148+
int bitshift = 0; \
149+
for (i=0; i<(640*480); i++) { \
150+
int idx = (i*vw)/8; \
151+
uint32_t word = (depth_raw[idx]<<(16)) | (depth_raw[idx+1]<<8) | depth_raw[idx+2]; \
152+
depth_frame[i] = ((word >> (((3*8)-vw)-bitshift)) & mask); \
153+
bitshift = (bitshift + vw) % 8; \
154+
} \
155+
}
156+
144157
static void depth_process(freenect_device *dev, uint8_t *pkt, int len)
145158
{
146-
int i;
147159
if (len == 0)
148160
return;
149161

@@ -155,13 +167,10 @@ static void depth_process(freenect_device *dev, uint8_t *pkt, int len)
155167
//printf("GOT DEPTH FRAME %d/%d packets arrived, TS %08x\n",
156168
// dev->depth_stream.valid_pkts, dev->depth_stream.pkts_per_frame, dev->depth_stream.timestamp);
157169

158-
int bitshift = 0;
159-
for (i=0; i<(640*480); i++) {
160-
int idx = (i*11)/8;
161-
uint32_t word = (dev->depth_raw[idx]<<16) | (dev->depth_raw[idx+1]<<8) | dev->depth_raw[idx+2];
162-
dev->depth_frame[i] = ((word >> (13-bitshift)) & 0x7ff);
163-
bitshift = (bitshift + 11) % 8;
164-
}
170+
if( dev->depth_format == FREENECT_FORMAT_11_BIT )
171+
CONVERT_PACKED_BUFFER_TO_16_BIT(dev->depth_raw, dev->depth_frame, 11)
172+
else
173+
CONVERT_PACKED_BUFFER_TO_16_BIT(dev->depth_raw, dev->depth_frame, 10)
165174

166175
if (dev->depth_cb)
167176
dev->depth_cb(dev, dev->depth_frame, dev->depth_stream.timestamp);
@@ -282,6 +291,13 @@ static void send_init(freenect_device *dev)
282291
chdr->tag = ip->tag;
283292
chdr->len = ip->cmdlen / 2;
284293
memcpy(obuf+sizeof(*chdr), ip->cmddata, ip->cmdlen);
294+
295+
if( i==6 )
296+
{
297+
// Choose 10bit or 11 bit depth output
298+
obuf[sizeof(*chdr) + 2] = dev->depth_format == FREENECT_FORMAT_11_BIT ? 0x03 : 0x02;
299+
}
300+
285301
ret = fnusb_control(&dev->usb_cam, 0x40, 0, 0, 0, obuf, ip->cmdlen + sizeof(*chdr));
286302
//printf("CTL CMD %04x %04x = %d\n", chdr->cmd, chdr->tag, ret);
287303
do {
@@ -324,7 +340,9 @@ int freenect_start_depth(freenect_device *dev)
324340
int res;
325341

326342
dev->depth_stream.buf = dev->depth_raw;
327-
dev->depth_stream.pkts_per_frame = DEPTH_PKTS_PER_FRAME;
343+
dev->depth_stream.pkts_per_frame =
344+
dev->depth_format == FREENECT_FORMAT_11_BIT ?
345+
DEPTH_PKTS_11_BIT_PER_FRAME : DEPTH_PKTS_10_BIT_PER_FRAME;
328346
dev->depth_stream.pkt_size = DEPTH_PKTDSIZE;
329347
dev->depth_stream.synced = 0;
330348
dev->depth_stream.flag = 0x70;
@@ -378,3 +396,9 @@ int freenect_set_rgb_format(freenect_device *dev, freenect_rgb_format fmt)
378396
dev->rgb_format = fmt;
379397
return 0;
380398
}
399+
400+
int freenect_set_depth_format(freenect_device *dev, freenect_depth_format fmt)
401+
{
402+
dev->depth_format = fmt;
403+
return 0;
404+
}

c/lib/freenect_internal.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ struct _freenect_context {
3939
fnusb_ctx usb;
4040
};
4141

42-
#define DEPTH_RAW_SIZE 422400
42+
#define DEPTH_RAW_10_BIT_SIZE 384000
43+
#define DEPTH_RAW_11_BIT_SIZE 422400
4344
#define FRAME_H FREENECT_FRAME_H
4445
#define FRAME_W FREENECT_FRAME_W
4546
#define FRAME_PIX FREENECT_FRAME_PIX
@@ -50,7 +51,8 @@ struct _freenect_context {
5051
#define DEPTH_PKTDSIZE (DEPTH_PKTSIZE-12)
5152
#define RGB_PKTDSIZE (RGB_PKTSIZE-12)
5253

53-
#define DEPTH_PKTS_PER_FRAME ((DEPTH_RAW_SIZE+DEPTH_PKTDSIZE-1)/DEPTH_PKTDSIZE)
54+
#define DEPTH_PKTS_10_BIT_PER_FRAME ((DEPTH_RAW_10_BIT_SIZE+DEPTH_PKTDSIZE-1)/DEPTH_PKTDSIZE)
55+
#define DEPTH_PKTS_11_BIT_PER_FRAME ((DEPTH_RAW_11_BIT_SIZE+DEPTH_PKTDSIZE-1)/DEPTH_PKTDSIZE)
5456
#define RGB_PKTS_PER_FRAME ((FRAME_PIX+RGB_PKTDSIZE-1)/RGB_PKTDSIZE)
5557

5658
#define MS_MAGIC_VENDOR 0x45e
@@ -83,11 +85,12 @@ struct _freenect_device {
8385
freenect_depth_cb depth_cb;
8486
freenect_rgb_cb rgb_cb;
8587
freenect_rgb_format rgb_format;
88+
freenect_depth_format depth_format;
8689

8790
int cam_inited;
8891

8992
packet_stream depth_stream;
90-
uint8_t depth_raw[DEPTH_RAW_SIZE];
93+
uint8_t depth_raw[DEPTH_RAW_11_BIT_SIZE];
9194
uint16_t depth_frame[FRAME_PIX];
9295

9396
packet_stream rgb_stream;

0 commit comments

Comments
 (0)