Skip to content

Commit

Permalink
New API, new streaming code, new demosaicing code, update gltest
Browse files Browse the repository at this point in the history
Now with less random buffer overflows on streaming, less random buffer
overflows in the demosaicer, and actual bilinear demosaicing.

Signed-off-by: Hector Martin <hector@marcansoft.com>
  • Loading branch information
marcan committed Nov 15, 2010
1 parent 92ab7f3 commit 420f5c6
Show file tree
Hide file tree
Showing 10 changed files with 733 additions and 284 deletions.
53 changes: 24 additions & 29 deletions c/examples/glview.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,17 +176,13 @@ void *gl_threadfunc(void *arg)

uint16_t t_gamma[2048];

void depthimg(uint16_t *buf, int width, int height)
void depth_cb(freenect_device *dev, freenect_depth *depth, uint32_t timestamp)
{
/* FILE *f = fopen("depth.bin", "w");
fwrite(depth_frame, 640*480, 2, f);
fclose(f);*/

int i;

pthread_mutex_lock(&gl_backbuf_mutex);
for (i=0; i<640*480; i++) {
int pval = t_gamma[buf[i]];
for (i=0; i<FREENECT_FRAME_PIX; i++) {
int pval = t_gamma[depth[i]];
int lb = pval & 0xff;
switch (pval>>8) {
case 0:
Expand Down Expand Up @@ -231,23 +227,21 @@ void depthimg(uint16_t *buf, int width, int height)
pthread_mutex_unlock(&gl_backbuf_mutex);
}

void rgbimg(uint8_t *buf, int width, int height)
void rgb_cb(freenect_device *dev, freenect_pixel *rgb, uint32_t timestamp)
{

int i;

pthread_mutex_lock(&gl_backbuf_mutex);
memcpy(gl_rgb_back, buf, width*height*3);
got_frames++;
memcpy(gl_rgb_back, rgb, FREENECT_RGB_SIZE);
pthread_cond_signal(&gl_frame_cond);
pthread_mutex_unlock(&gl_backbuf_mutex);
}


int main(int argc, char **argv)
{
int res;
libusb_device_handle *dev;
freenect_context *f_ctx;
freenect_device *f_dev;

printf("Kinect camera test\n");

int i;
Expand All @@ -260,31 +254,32 @@ int main(int argc, char **argv)
g_argc = argc;
g_argv = argv;

libusb_init(NULL);
//libusb_set_debug(0, 3);
if (freenect_init(&f_ctx, NULL) < 0) {
printf("freenect_init() failed\n");
return 1;
}

dev = libusb_open_device_with_vid_pid(NULL, 0x45e, 0x2ae);
if (!dev) {
if (freenect_open_device(f_ctx, &f_dev, 0) < 0) {
printf("Could not open device\n");
return 1;
}

freenect_set_depth_callback(f_dev, depth_cb);
freenect_set_rgb_callback(f_dev, rgb_cb);
freenect_set_rgb_format(f_dev, FREENECT_FORMAT_RGB);

res = pthread_create(&gl_thread, NULL, gl_threadfunc, NULL);
if (res) {
printf("pthread_create failed\n");
return 1;
}

libusb_claim_interface(dev, 0);

//gl_threadfunc(&none);

printf("device is %i\n", libusb_get_device_address(libusb_get_device(dev)));

cams_init(dev, depthimg, rgbimg);

while(!die && libusb_handle_events(NULL) == 0 );

freenect_start_depth(f_dev);
freenect_start_rgb(f_dev);

while(!die && freenect_process_events(f_ctx) >= 0 );

printf("-- done!\n");

pthread_exit(NULL);
}
55 changes: 52 additions & 3 deletions c/include/libfreenect.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,62 @@
#ifndef LIBFREENECT_H
#define LIBFREENECT_H

typedef void (*depthcb)(uint16_t *buf, int width, int height);
typedef void (*rgbcb)(uint8_t *buf, int width, int height);
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif
void cams_init(libusb_device_handle *d, depthcb depth_cb, rgbcb rgb_cb);

typedef uint16_t freenect_depth;
typedef uint8_t freenect_pixel;

#define FREENECT_FRAME_W 640
#define FREENECT_FRAME_H 480
#define FREENECT_FRAME_PIX (FREENECT_FRAME_H*FREENECT_FRAME_W)
#define FREENECT_RGB_SIZE (FREENECT_FRAME_PIX*3)
#define FREENECT_BAYER_SIZE (FREENECT_FRAME_PIX)
#define FREENECT_DEPTH_SIZE (FREENECT_FRAME_PIX*sizeof(freenect_depth))

typedef enum {
FREENECT_FORMAT_RGB = 0,
FREENECT_FORMAT_BAYER = 1,
} freenect_rgb_format;

struct _freenect_context;
typedef struct _freenect_context freenect_context;

struct _freenect_device;
typedef struct _freenect_device freenect_device;

// usb backend specific section
#include <libusb.h>
typedef libusb_context freenect_usb_context;
//

int freenect_init(freenect_context **ctx, freenect_usb_context *usb_ctx);
int freenect_shutdown(freenect_context *ctx);

int freenect_process_events(freenect_context *ctx);

int freenect_num_devices(freenect_context *ctx);
int freenect_open_device(freenect_context *ctx, freenect_device **dev, int index);
int freenect_close_device(freenect_device *dev);

void freenect_set_user(freenect_device *dev, void *user);
void *freenect_get_user(freenect_device *dev);

typedef void (*freenect_depth_cb)(freenect_device *dev, freenect_depth *depth, uint32_t timestamp);
typedef void (*freenect_rgb_cb)(freenect_device *dev, freenect_pixel *rgb, uint32_t timestamp);

void freenect_set_depth_callback(freenect_device *dev, freenect_depth_cb cb);
void freenect_set_rgb_callback(freenect_device *dev, freenect_rgb_cb cb);
int freenect_set_rgb_format(freenect_device *dev, freenect_rgb_format fmt);

int freenect_start_depth(freenect_device *dev);
int freenect_start_rgb(freenect_device *dev);
int freenect_stop_depth(freenect_device *dev);
int freenect_stop_rgb(freenect_device *dev);

#ifdef __cplusplus
}
#endif
Expand Down
2 changes: 1 addition & 1 deletion c/lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ find_package(Threads REQUIRED)
find_package(USB REQUIRED)
include_directories(${USB_INCLUDE_DIRS})

add_library (freenect cameras.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c)
add_library (freenect core.c cameras.c usb_libusb10.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c)
find_library (PTHREAD pthread)
target_link_libraries (freenect ${CMAKE_THREAD_LIBS_INIT} ${USB_LIBRARIES})

Expand Down
Loading

0 comments on commit 420f5c6

Please sign in to comment.