Skip to content

Commit 83e57e1

Browse files
Cwiiispiedar
authored andcommitted
Add FREENECT_DEPTH_REGISTERED support to fakenect (#536)
Reviewed-by: Benn Snyder <benn.snyder@gmail.com>
1 parent 5ac2987 commit 83e57e1

File tree

4 files changed

+34
-14
lines changed

4 files changed

+34
-14
lines changed

fakenect/fakenect.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ static freenect_frame_mode depth_11_mode =
7979
{MAKE_RESERVED(FREENECT_RESOLUTION_MEDIUM, FREENECT_DEPTH_11BIT),
8080
FREENECT_RESOLUTION_MEDIUM, {FREENECT_DEPTH_11BIT},
8181
640*480*2, 640, 480, 11, 5, 30, 1};
82+
static freenect_frame_mode depth_registered_mode =
83+
{MAKE_RESERVED(FREENECT_RESOLUTION_MEDIUM, FREENECT_DEPTH_REGISTERED),
84+
FREENECT_RESOLUTION_MEDIUM, {FREENECT_DEPTH_REGISTERED},
85+
640*480*2, 640, 480, 16, 0, 30, 1};
8286
static freenect_frame_mode depth_mm_mode =
8387
{MAKE_RESERVED(FREENECT_RESOLUTION_MEDIUM, FREENECT_DEPTH_MM),
8488
FREENECT_RESOLUTION_MEDIUM, {FREENECT_DEPTH_MM},
@@ -246,6 +250,9 @@ int freenect_process_events(freenect_context *ctx)
246250
case FREENECT_DEPTH_11BIT:
247251
memcpy(depth_buffer, cur_depth, mode.bytes);
248252
break;
253+
case FREENECT_DEPTH_REGISTERED:
254+
freenect_apply_registration(fake_dev, cur_depth, depth_buffer, true);
255+
break;
249256
case FREENECT_DEPTH_MM:
250257
freenect_apply_depth_unpacked_to_mm(fake_dev, cur_depth, depth_buffer);
251258
break;
@@ -353,7 +360,8 @@ int freenect_set_depth_mode(freenect_device* dev, const freenect_frame_mode mode
353360
// underlying data. Would be better to check for conflict.
354361
depth_mode = mode;
355362

356-
if (mode.depth_format == FREENECT_DEPTH_MM &&
363+
if ((mode.depth_format == FREENECT_DEPTH_MM ||
364+
mode.depth_format == FREENECT_DEPTH_REGISTERED) &&
357365
dev->registration.zero_plane_info.reference_distance == 0) {
358366
printf("Warning: older fakenect recording doesn't contain "
359367
"registration info for mapping depth to MM units\n");
@@ -407,6 +415,8 @@ freenect_frame_mode freenect_find_depth_mode(freenect_resolution res, freenect_d
407415
switch (fmt) {
408416
case FREENECT_DEPTH_11BIT:
409417
return depth_11_mode;
418+
case FREENECT_DEPTH_REGISTERED:
419+
return depth_registered_mode;
410420
case FREENECT_DEPTH_MM:
411421
return depth_mm_mode;
412422
default:
@@ -420,7 +430,7 @@ freenect_frame_mode freenect_find_depth_mode(freenect_resolution res, freenect_d
420430

421431
int freenect_get_depth_mode_count()
422432
{
423-
return 1;
433+
return 3;
424434
}
425435

426436
freenect_frame_mode freenect_get_depth_mode(int mode_num)
@@ -429,6 +439,8 @@ freenect_frame_mode freenect_get_depth_mode(int mode_num)
429439
return depth_11_mode;
430440
else if (mode_num == 1)
431441
return depth_mm_mode;
442+
else if (mode_num == 2)
443+
return depth_registered_mode;
432444
else {
433445
freenect_frame_mode invalid = { 0 };
434446
return invalid;

src/cameras.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ static void depth_process(freenect_device *dev, uint8_t *pkt, int len)
397397
convert_packed11_to_16bit(dev->depth.raw_buf, (uint16_t*)dev->depth.proc_buf, 640*480);
398398
break;
399399
case FREENECT_DEPTH_REGISTERED:
400-
freenect_apply_registration(dev, dev->depth.raw_buf, (uint16_t*)dev->depth.proc_buf );
400+
freenect_apply_registration(dev, dev->depth.raw_buf, (uint16_t*)dev->depth.proc_buf, false);
401401
break;
402402
case FREENECT_DEPTH_MM:
403403
freenect_apply_depth_to_mm(dev, dev->depth.raw_buf, (uint16_t*)dev->depth.proc_buf );

src/registration.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ static inline void unpack_8_pixels(uint8_t *raw, uint16_t *frame)
101101
}
102102

103103
// apply registration data to a single packed frame
104-
FN_INTERNAL int freenect_apply_registration(freenect_device* dev, uint8_t* input_packed, uint16_t* output_mm)
104+
FN_INTERNAL int freenect_apply_registration(freenect_device* dev, uint8_t* input, uint16_t* output_mm, bool unpacked)
105105
{
106106
freenect_registration* reg = &(dev->registration);
107107
// set output buffer to zero using pointer-sized memory access (~ 30-40% faster than memset)
@@ -116,15 +116,22 @@ FN_INTERNAL int freenect_apply_registration(freenect_device* dev, uint8_t* input
116116
for (y = 0; y < DEPTH_Y_RES; y++) {
117117
for (x = 0; x < DEPTH_X_RES; x++) {
118118

119-
// get 8 pixels from the packed frame
120-
if (source_index == 8) {
121-
unpack_8_pixels( input_packed, unpack );
122-
source_index = 0;
123-
input_packed += 11;
124-
}
125-
126-
// get the value at the current depth pixel, convert to millimeters
127-
uint16_t metric_depth = reg->raw_to_mm_shift[ unpack[source_index++] ];
119+
uint16_t metric_depth;
120+
121+
if (unpacked) {
122+
uint32_t buf_index = y * DEPTH_X_RES + x;
123+
metric_depth = reg->raw_to_mm_shift[((uint16_t *)input)[buf_index]];
124+
} else {
125+
// get 8 pixels from the packed frame
126+
if (source_index == 8) {
127+
unpack_8_pixels( input, unpack );
128+
source_index = 0;
129+
input += 11;
130+
}
131+
132+
// get the value at the current depth pixel, convert to millimeters
133+
metric_depth = reg->raw_to_mm_shift[ unpack[source_index++] ];
134+
}
128135

129136
// so long as the current pixel has a depth value
130137
if (metric_depth == DEPTH_NO_MM_VALUE) continue;

src/registration.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@
2626

2727
#pragma once
2828

29+
#include <stdbool.h>
2930
#include "libfreenect.h"
3031

3132
// Internal function declarations relating to registration
3233
int freenect_init_registration(freenect_device* dev);
33-
int freenect_apply_registration(freenect_device* dev, uint8_t* input_packed, uint16_t* output_mm);
34+
int freenect_apply_registration(freenect_device* dev, uint8_t* input, uint16_t* output_mm, bool unpacked);
3435
int freenect_apply_depth_to_mm(freenect_device* dev, uint8_t* input_packed, uint16_t* output_mm);
3536
int freenect_apply_depth_unpacked_to_mm(freenect_device* dev, uint16_t* input, uint16_t* output_mm);

0 commit comments

Comments
 (0)