@@ -204,13 +204,12 @@ static int stream_setbuf(freenect_context *ctx, packet_stream *strm, void *pbuf)
204
204
}
205
205
206
206
// Unpack buffer of (vw bit) data into padded 16bit buffer.
207
- static inline void convert_packed_to_16bit (uint8_t * raw , uint16_t * frame , int vw )
207
+ static inline void convert_packed_to_16bit (uint8_t * raw , uint16_t * frame , int vw , int len )
208
208
{
209
209
int mask = (1 << vw ) - 1 ;
210
- int j = 640 * 480 ;
211
210
uint32_t buffer = 0 ;
212
211
int bitsIn = 0 ;
213
- while (j -- ) {
212
+ while (len -- ) {
214
213
while (bitsIn < vw ) {
215
214
buffer = (buffer << 8 ) | * (raw ++ );
216
215
bitsIn += 8 ;
@@ -220,6 +219,21 @@ static inline void convert_packed_to_16bit(uint8_t *raw, uint16_t *frame, int vw
220
219
}
221
220
}
222
221
222
+ // Unpack buffer of (vw bit) data into 8bit buffer, dropping LSBs
223
+ static inline void convert_packed_to_8bit (uint8_t * raw , uint8_t * frame , int vw , int len )
224
+ {
225
+ uint32_t buffer = 0 ;
226
+ int bitsIn = 0 ;
227
+ while (len -- ) {
228
+ while (bitsIn < vw ) {
229
+ buffer = (buffer << 8 ) | * (raw ++ );
230
+ bitsIn += 8 ;
231
+ }
232
+ bitsIn -= vw ;
233
+ * (frame ++ ) = buffer >> (bitsIn + vw - 8 );
234
+ }
235
+ }
236
+
223
237
static void depth_process (freenect_device * dev , uint8_t * pkt , int len )
224
238
{
225
239
freenect_context * ctx = dev -> parent ;
@@ -240,10 +254,10 @@ static void depth_process(freenect_device *dev, uint8_t *pkt, int len)
240
254
241
255
switch (dev -> depth_format ) {
242
256
case FREENECT_DEPTH_11BIT :
243
- convert_packed_to_16bit (dev -> depth .raw_buf , dev -> depth .proc_buf , 11 );
257
+ convert_packed_to_16bit (dev -> depth .raw_buf , dev -> depth .proc_buf , 11 , FREENECT_FRAME_PIX );
244
258
break ;
245
259
case FREENECT_DEPTH_10BIT :
246
- convert_packed_to_16bit (dev -> depth .raw_buf , dev -> depth .proc_buf , 10 );
260
+ convert_packed_to_16bit (dev -> depth .raw_buf , dev -> depth .proc_buf , 10 , FREENECT_FRAME_PIX );
247
261
break ;
248
262
case FREENECT_DEPTH_10BIT_PACKED :
249
263
case FREENECT_DEPTH_11BIT_PACKED :
@@ -435,8 +449,20 @@ static void video_process(freenect_device *dev, uint8_t *pkt, int len)
435
449
FN_SPEW ("Got RGB frame %d/%d packets arrived, TS %08x\n" , dev -> video .valid_pkts ,
436
450
dev -> video .pkts_per_frame , dev -> video .timestamp );
437
451
438
- if (dev -> video_format == FREENECT_VIDEO_RGB ) {
439
- convert_bayer_to_rgb (dev -> video .raw_buf , dev -> video .proc_buf );
452
+ switch (dev -> video_format ) {
453
+ case FREENECT_VIDEO_RGB :
454
+ convert_bayer_to_rgb (dev -> video .raw_buf , dev -> video .proc_buf );
455
+ break ;
456
+ case FREENECT_VIDEO_BAYER :
457
+ break ;
458
+ case FREENECT_VIDEO_IR_10BIT :
459
+ convert_packed_to_16bit (dev -> video .raw_buf , dev -> video .proc_buf , 10 , FREENECT_IR_FRAME_PIX );
460
+ break ;
461
+ case FREENECT_VIDEO_IR_10BIT_PACKED :
462
+ break ;
463
+ case FREENECT_VIDEO_IR_8BIT :
464
+ convert_packed_to_8bit (dev -> video .raw_buf , dev -> video .proc_buf , 10 , FREENECT_IR_FRAME_PIX );
465
+ break ;
440
466
}
441
467
442
468
if (dev -> video_cb )
@@ -601,12 +627,29 @@ int freenect_start_video(freenect_device *dev)
601
627
if (dev -> video .running )
602
628
return -1 ;
603
629
604
- if (dev -> video_format == FREENECT_VIDEO_RGB )
605
- stream_initbufs (ctx , & dev -> video , FREENECT_VIDEO_BAYER_SIZE , FREENECT_VIDEO_RGB_SIZE );
606
- else
607
- stream_initbufs (ctx , & dev -> video , 0 , FREENECT_VIDEO_BAYER_SIZE );
630
+ switch (dev -> video_format ) {
631
+ case FREENECT_VIDEO_RGB :
632
+ stream_initbufs (ctx , & dev -> video , FREENECT_VIDEO_BAYER_SIZE , FREENECT_VIDEO_RGB_SIZE );
633
+ dev -> video .pkts_per_frame = VIDEO_PKTS_PER_FRAME ;
634
+ break ;
635
+ case FREENECT_VIDEO_BAYER :
636
+ stream_initbufs (ctx , & dev -> video , 0 , FREENECT_VIDEO_BAYER_SIZE );
637
+ dev -> video .pkts_per_frame = VIDEO_PKTS_PER_FRAME ;
638
+ break ;
639
+ case FREENECT_VIDEO_IR_8BIT :
640
+ stream_initbufs (ctx , & dev -> video , FREENECT_VIDEO_IR_10BIT_PACKED_SIZE , FREENECT_VIDEO_IR_8BIT_SIZE );
641
+ dev -> video .pkts_per_frame = VIDEO_PKTS_PER_FRAME_IR ;
642
+ break ;
643
+ case FREENECT_VIDEO_IR_10BIT :
644
+ stream_initbufs (ctx , & dev -> video , FREENECT_VIDEO_IR_10BIT_PACKED_SIZE , FREENECT_VIDEO_BAYER_SIZE );
645
+ dev -> video .pkts_per_frame = VIDEO_PKTS_PER_FRAME_IR ;
646
+ break ;
647
+ case FREENECT_VIDEO_IR_10BIT_PACKED :
648
+ stream_initbufs (ctx , & dev -> video , 0 , FREENECT_VIDEO_IR_10BIT_PACKED_SIZE );
649
+ dev -> video .pkts_per_frame = VIDEO_PKTS_PER_FRAME_IR ;
650
+ break ;
651
+ }
608
652
609
- dev -> video .pkts_per_frame = VIDEO_PKTS_PER_FRAME ;
610
653
dev -> video .pkt_size = VIDEO_PKTDSIZE ;
611
654
dev -> video .synced = 0 ;
612
655
dev -> video .flag = 0x80 ;
@@ -620,7 +663,17 @@ int freenect_start_video(freenect_device *dev)
620
663
write_register (dev , 0x0c , 0x00 );
621
664
write_register (dev , 0x0d , 0x01 );
622
665
write_register (dev , 0x0e , 0x1e ); // 30Hz bayer
623
- write_register (dev , 0x05 , 0x01 ); // start video stream
666
+ switch (dev -> video_format ) {
667
+ case FREENECT_VIDEO_RGB :
668
+ case FREENECT_VIDEO_BAYER :
669
+ write_register (dev , 0x05 , 0x01 ); // start video stream
670
+ break ;
671
+ case FREENECT_VIDEO_IR_8BIT :
672
+ case FREENECT_VIDEO_IR_10BIT :
673
+ case FREENECT_VIDEO_IR_10BIT_PACKED :
674
+ write_register (dev , 0x05 , 0x03 ); // start video stream
675
+ break ;
676
+ }
624
677
write_register (dev , 0x47 , 0x00 ); // disable Hflip
625
678
626
679
dev -> video .running = 1 ;
@@ -690,6 +743,9 @@ int freenect_set_video_format(freenect_device *dev, freenect_video_format fmt)
690
743
switch (fmt ) {
691
744
case FREENECT_VIDEO_RGB :
692
745
case FREENECT_VIDEO_BAYER :
746
+ case FREENECT_VIDEO_IR_8BIT :
747
+ case FREENECT_VIDEO_IR_10BIT :
748
+ case FREENECT_VIDEO_IR_10BIT_PACKED :
693
749
dev -> video_format = fmt ;
694
750
return 0 ;
695
751
default :
0 commit comments