void camera_control_delete(CameraControl* cc) { #if defined(CAMERA_CONTROL_USE_CL_DRIVER) if (cc->frame3ch != 0x0) cvReleaseImage(&cc->frame3ch); if (cc->frame4ch != 0x0) cvReleaseImage(&cc->frame4ch); CLEyeDestroyCamera(cc->camera); #elif defined(CAMERA_CONTROL_USE_PS3EYE_DRIVER) cvReleaseImage(&cc->framebgr); ps3eye_close(cc->eye); ps3eye_uninit(); #else // linux, others and windows opencv only cvReleaseCapture(&cc->capture); #endif if (cc->frame3chUndistort) { cvReleaseImage(&cc->frame3chUndistort); } if (cc->mapx) { cvReleaseImage(&cc->mapx); } if (cc->mapy) { cvReleaseImage(&cc->mapy); } free(cc); }
ps3eye_t * ps3eye_open(uint32_t cameraID, uint32_t frame_width, uint32_t frame_height, uint8_t frame_rate) { bool success= true; ps3eye_t *camera= NULL; if ((camera = _ps3eye_camera_allocate()) == NULL) { debug("ps3eye_open: Can't open camera id %d (unable to allocate)\n", cameraID); success= false; } if (success && !_ps3eye_camera_setup(camera, cameraID, frame_width, frame_height, frame_rate)) { debug("ps3eye_open: Can't open camera id %d (unable to setup camera)\n", cameraID); success= false; } if (success && !_ps3eye_camera_start(camera)) { debug("ps3eye_open: Can't open camera id %d (unable to start streaming)\n", cameraID); success= false; } if (success && !_ps3eye_camera_thread_start(camera)) { debug("ps3eye_open: Can't open camera id %d (unable to start thread)\n", cameraID); success = false; } if (!success) { ps3eye_close(camera); camera = NULL; } return camera; }
int main(int argc, char *argv[]) { ps3eye_context ctx(640, 480, 30); if (!ctx.hasDevices()) { printf("No PS3 Eye camera connected\n"); return EXIT_FAILURE; } if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("Failed to initialize SDL: %s\n", SDL_GetError()); return EXIT_FAILURE; } SDL_Window *window = SDL_CreateWindow( "PS3 Eye - SDL 2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); if (window == NULL) { printf("Failed to create window: %s\n", SDL_GetError()); return EXIT_FAILURE; } SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC); if (renderer == NULL) { printf("Failed to create renderer: %s\n", SDL_GetError()); SDL_DestroyWindow(window); return EXIT_FAILURE; } SDL_RenderSetLogicalSize(renderer, ctx.frame_width, ctx.frame_height); print_renderer_info(renderer); SDL_Texture *video_tex = SDL_CreateTexture( renderer, SDL_PIXELFORMAT_YUY2, SDL_TEXTUREACCESS_STREAMING, ctx.frame_width, ctx.frame_height); if (video_tex == NULL) { printf("Failed to create video texture: %s\n", SDL_GetError()); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); return EXIT_FAILURE; } ctx.eye = ps3eye_open(0, ctx.frame_width, ctx.frame_height, ctx.frame_rate); if (ctx.eye == NULL) { printf("Failed to initialize camera: %s\n"); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); return EXIT_FAILURE; } ps3eye_set_flip(ctx.eye, true, false); printf("Camera mode: %dx%d@%d\n", ctx.frame_width, ctx.frame_height, ctx.frame_rate); SDL_Event e; void *video_tex_pixels; int pitch; while (ctx.running) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { ctx.running = false; } } // TODO: Proper thread signalling to wait for next available buffer SDL_Delay(10); int row_bytes = 0; uint8_t *frame_data = ps3eye_grab_frame(ctx.eye, &row_bytes); int frame_data_size = row_bytes * ctx.frame_height; if (frame_data != NULL) { SDL_LockTexture(video_tex, NULL, &video_tex_pixels, &pitch); memcpy(video_tex_pixels, frame_data, frame_data_size); SDL_UnlockTexture(video_tex); } SDL_RenderCopy(renderer, video_tex, NULL, NULL); SDL_RenderPresent(renderer); } ps3eye_close(ctx.eye); SDL_DestroyTexture(video_tex); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); return EXIT_SUCCESS; }