@@ -141,9 +141,21 @@ static int stream_process(packet_stream *strm, uint8_t *pkt, int len)
141
141
}
142
142
}
143
143
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
+
144
157
static void depth_process (freenect_device * dev , uint8_t * pkt , int len )
145
158
{
146
- int i ;
147
159
if (len == 0 )
148
160
return ;
149
161
@@ -155,13 +167,10 @@ static void depth_process(freenect_device *dev, uint8_t *pkt, int len)
155
167
//printf("GOT DEPTH FRAME %d/%d packets arrived, TS %08x\n",
156
168
// dev->depth_stream.valid_pkts, dev->depth_stream.pkts_per_frame, dev->depth_stream.timestamp);
157
169
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 )
165
174
166
175
if (dev -> depth_cb )
167
176
dev -> depth_cb (dev , dev -> depth_frame , dev -> depth_stream .timestamp );
@@ -282,6 +291,13 @@ static void send_init(freenect_device *dev)
282
291
chdr -> tag = ip -> tag ;
283
292
chdr -> len = ip -> cmdlen / 2 ;
284
293
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
+
285
301
ret = fnusb_control (& dev -> usb_cam , 0x40 , 0 , 0 , 0 , obuf , ip -> cmdlen + sizeof (* chdr ));
286
302
//printf("CTL CMD %04x %04x = %d\n", chdr->cmd, chdr->tag, ret);
287
303
do {
@@ -324,7 +340,9 @@ int freenect_start_depth(freenect_device *dev)
324
340
int res ;
325
341
326
342
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 ;
328
346
dev -> depth_stream .pkt_size = DEPTH_PKTDSIZE ;
329
347
dev -> depth_stream .synced = 0 ;
330
348
dev -> depth_stream .flag = 0x70 ;
@@ -378,3 +396,9 @@ int freenect_set_rgb_format(freenect_device *dev, freenect_rgb_format fmt)
378
396
dev -> rgb_format = fmt ;
379
397
return 0 ;
380
398
}
399
+
400
+ int freenect_set_depth_format (freenect_device * dev , freenect_depth_format fmt )
401
+ {
402
+ dev -> depth_format = fmt ;
403
+ return 0 ;
404
+ }
0 commit comments