void ofxLibdc::applySettings() { if(camera) dc1394_capture_stop(camera); if(use1394b) { // assumes you want to run your 1394b camera at 800 Mbps dc1394_video_set_operation_mode(camera, DC1394_OPERATION_MODE_1394B); dc1394_video_set_iso_speed(camera, DC1394_ISO_SPEED_800); } else { dc1394_video_set_operation_mode(camera, DC1394_OPERATION_MODE_LEGACY); dc1394_video_set_iso_speed(camera, DC1394_ISO_SPEED_400); } dc1394framerate_t framerate; if(useFormat7) { videoMode = (dc1394video_mode_t) ((int) DC1394_VIDEO_MODE_FORMAT7_0 + format7Mode); } else { dc1394video_modes_t video_modes; dc1394_video_get_supported_modes(camera, &video_modes); dc1394color_coding_t coding; dc1394color_coding_t targetCoding = getLibdcType(imageType); for (int i = 0; i < video_modes.num; i++) { if (!dc1394_is_video_mode_scalable(video_modes.modes[i])) { dc1394video_mode_t curMode = video_modes.modes[i]; dc1394_get_color_coding_from_video_mode(camera, curMode, &coding); unsigned int curWidth, curHeight; dc1394_get_image_size_from_video_mode(camera, curMode, &curWidth, &curHeight); if (coding == targetCoding && width == curWidth && height == curHeight) { videoMode = curMode; break; } } if(i == video_modes.num - 1) { ofLog(OF_LOG_ERROR, "Camera does not support target mode."); return; } } // get fastest framerate // todo: make this settable dc1394framerates_t framerates; dc1394_video_get_supported_framerates(camera, videoMode, &framerates); framerate = framerates.framerates[framerates.num - 1]; } if(useFormat7) { quantizePosition(); quantizeSize(); dc1394_format7_set_roi(camera, videoMode, getLibdcType(imageType), DC1394_USE_MAX_AVAIL, left, top, width, height); unsigned int curWidth, curHeight; dc1394_format7_get_image_size(camera, videoMode, &curWidth, &curHeight); } else { dc1394_video_set_framerate(camera, framerate); } // contrary to the libdc1394 format7 demo, this should go after the roi setting dc1394_video_set_mode(camera, videoMode); dc1394_capture_setup(camera, OFXLIBDC_BUFFER_SIZE, DC1394_CAPTURE_FLAGS_DEFAULT); }
uint32_t of1394VideoGrabber::getHeight(){ uint32_t f, f2; dc1394_format7_get_image_size(camera, DC1394_VIDEO_MODE_FORMAT7_0, &f, &f2); return f2; }
//-------------------------------------------------------------------- int of1394VideoGrabber::initGrabber() { // moved from constructor int i; printf("Making new camera\n"); d = dc1394_new (); err=dc1394_camera_enumerate (d, &list); DC1394_ERR_RTN(err,"Failed to enumerate cameras"); if (list->num == 0) { if(err!=0 && bVerbose)printf("\n No cameras found\n "); return 1; } camera = dc1394_camera_new (d, list->ids[0].guid); if (!camera) { if(err!=0 && bVerbose)printf("\n Failed to initialize camera with guid %PRIx64", list->ids[0].guid); return 1; } dc1394_camera_free_list (list); /*----------------------------------------------------------------------- * setup capture *-----------------------------------------------------------------------*/ dc1394_video_set_mode(camera, DC1394_VIDEO_MODE_FORMAT7_0); uint32_t f, f2; dc1394_format7_get_image_size(camera, DC1394_VIDEO_MODE_FORMAT7_0, &f, &f2); err=dc1394_capture_setup(camera,4, DC1394_CAPTURE_FLAGS_DEFAULT); DC1394_ERR_CLN_RTN(err,cleanup_and_exit(camera),"Could not setup camera-\nmake sure that the video mode and framerate are\nsupported by your camera\n"); /*----------------------------------------------------------------------- * have the camera start sending us data *-----------------------------------------------------------------------*/ err=dc1394_video_set_transmission(camera, DC1394_ON); DC1394_ERR_CLN_RTN(err,cleanup_and_exit(camera),"Could not start camera iso transmission\n"); dc1394_get_image_size_from_video_mode(camera, video_mode, &width, &height); if(err != DC1394_SUCCESS){ cout<<"get image size error: "<<err<<endl; } printf("Size from video mode = %i wide %i high\n", width, height); pixels = new unsigned char[width*height*3]; // x3 for RGB pixels2 = new unsigned char[width*height*3]; // x3 for RGB tex.allocate(width,height,GL_LUMINANCE); err = dc1394_capture_dequeue( camera, DC1394_CAPTURE_POLICY_WAIT, &frame ) ; DC1394_ERR_CLN_RTN(err,cleanup_and_exit(camera),"Could not capture a frame\n"); memcpy( pixels, frame->image, width * height*3) ; dc1394_capture_enqueue( camera, frame ) ; ofSleepMillis(10); startThread(true, false); failedToInit = false; dc1394_feature_set_mode(camera, DC1394_FEATURE_EXPOSURE, DC1394_FEATURE_MODE_MANUAL); dc1394_feature_set_mode(camera, DC1394_FEATURE_BRIGHTNESS, DC1394_FEATURE_MODE_MANUAL); dc1394_feature_set_mode(camera, DC1394_FEATURE_GAMMA, DC1394_FEATURE_MODE_AUTO); dc1394_feature_set_mode(camera, DC1394_FEATURE_SHUTTER, DC1394_FEATURE_MODE_MANUAL); dc1394_feature_set_mode(camera, DC1394_FEATURE_GAIN, DC1394_FEATURE_MODE_AUTO); dc1394_feature_set_mode(camera, DC1394_FEATURE_IRIS, DC1394_FEATURE_MODE_AUTO); dc1394_feature_set_mode(camera, DC1394_FEATURE_WHITE_BALANCE, DC1394_FEATURE_MODE_AUTO); dc1394_feature_set_mode(camera, DC1394_FEATURE_TEMPERATURE, DC1394_FEATURE_MODE_AUTO); dc1394_feature_set_mode(camera, DC1394_FEATURE_WHITE_SHADING, DC1394_FEATURE_MODE_AUTO); dc1394_feature_set_mode(camera, DC1394_FEATURE_SATURATION, DC1394_FEATURE_MODE_AUTO); dc1394_feature_set_mode(camera, DC1394_FEATURE_HUE, DC1394_FEATURE_MODE_AUTO); //Print features dc1394_feature_get_all(camera, &features); dc1394_feature_print_all(&features, stdout); return 0; }
dc1394error_t dc1394_get_image_size_from_video_mode(dc1394camera_t *camera, dc1394video_mode_t video_mode, uint32_t *w, uint32_t *h) { dc1394error_t err; uint32_t sx, sy; switch(video_mode) { case DC1394_VIDEO_MODE_160x120_YUV444: *w = 160;*h=120; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_320x240_YUV422: *w = 320;*h=240; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_640x480_YUV411: case DC1394_VIDEO_MODE_640x480_YUV422: case DC1394_VIDEO_MODE_640x480_RGB8: case DC1394_VIDEO_MODE_640x480_MONO8: case DC1394_VIDEO_MODE_640x480_MONO16: *w =640;*h=480; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_800x600_YUV422: case DC1394_VIDEO_MODE_800x600_RGB8: case DC1394_VIDEO_MODE_800x600_MONO8: case DC1394_VIDEO_MODE_800x600_MONO16: *w=800;*h=600; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_1024x768_YUV422: case DC1394_VIDEO_MODE_1024x768_RGB8: case DC1394_VIDEO_MODE_1024x768_MONO8: case DC1394_VIDEO_MODE_1024x768_MONO16: *w=1024;*h=768; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_1280x960_YUV422: case DC1394_VIDEO_MODE_1280x960_RGB8: case DC1394_VIDEO_MODE_1280x960_MONO8: case DC1394_VIDEO_MODE_1280x960_MONO16: *w=1280;*h=960; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_1600x1200_YUV422: case DC1394_VIDEO_MODE_1600x1200_RGB8: case DC1394_VIDEO_MODE_1600x1200_MONO8: case DC1394_VIDEO_MODE_1600x1200_MONO16: *w=1600;*h=1200; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_FORMAT7_0: case DC1394_VIDEO_MODE_FORMAT7_1: case DC1394_VIDEO_MODE_FORMAT7_2: case DC1394_VIDEO_MODE_FORMAT7_3: case DC1394_VIDEO_MODE_FORMAT7_4: case DC1394_VIDEO_MODE_FORMAT7_5: case DC1394_VIDEO_MODE_FORMAT7_6: case DC1394_VIDEO_MODE_FORMAT7_7: // get the current color mode from the camera err=dc1394_format7_get_image_size(camera, video_mode, &sx, &sy); if (err!=DC1394_SUCCESS) { return err; } else { *w=sx; *h=sy; } return DC1394_SUCCESS; case DC1394_VIDEO_MODE_EXIF: return DC1394_FAILURE; } return DC1394_FAILURE; }
Libdc1394SequenceGrabber::Libdc1394SequenceGrabber(const std::string& name, unsigned int w, unsigned int h, unsigned int rate) : cefix::SequenceGrabber(name, w, h, rate), _context(Libdc1394Context::get()), _camera(NULL), _firstFrame(true), _bayerMethod(DC1394_BAYER_METHOD_BILINEAR), _bayerPattern(DC1394_COLOR_FILTER_RGGB) { msg(osg::INFO) << "LibdcSequenceGrabber " << name << std::endl; setImage(new osg::ImageStream()); getImage()->setOrigin(osg::Image::TOP_LEFT); uint64_t uid = 0; bool grey = false; _format7 = false; int format_7_format_delta(0); if (name.empty() == false) { std::vector<std::string> parts; cefix::strTokenize(name,parts,":"); uid=cefix::hexToLong(parts[0]); for(unsigned int i = 1; i < parts.size(); ++i) { std::string part = cefix::strToLower(parts[i]); if (part == "grey") grey = true; else if (part == "format7") { _format7 = true; if (i+1 < parts.size()) { format_7_format_delta = atoi(parts[i+1].c_str()); ++i; } } } } if (_roi.height == 0) _roi.height = h; if (_roi.width == 0) _roi.width = w; initCamera(uid); if (_camera) { unsigned int video_mode(0); unsigned int color_mode(0); if (_format7) { video_mode = DC1394_VIDEO_MODE_FORMAT7_0+format_7_format_delta; color_mode = (!grey) ? DC1394_COLOR_CODING_RGB8 : DC1394_COLOR_CODING_MONO8; } if (!initVideoMode(w,h, grey, video_mode, color_mode)) { grey = !grey; msg(osg::INFO) << " could not find suitable video mode, toggling grey/color " << std::endl; if (!initVideoMode(w,h, grey)) { msg(osg::WARN) << "could not find suitable video mode for " << w << "x" << h << std::endl; } } initFrameRate(rate); dc1394error_t err; if (_format7) { err = dc1394_format7_set_color_coding(_camera, _videomode, (dc1394color_coding_t)color_mode); checkSuccess(err, "dc1394_format7_set_color_coding failed"); } if (_format7) { err = dc1394_format7_get_image_size(_camera, _videomode, &w, &h); checkSuccess(err, "dc1394_format7_get_image_size failed"); } else { err = dc1394_get_image_size_from_video_mode(_camera, _videomode, &w, &h); checkSuccess(err, "dc1394_get_image_size_from_video_mode failed"); } } if (grey) { getImage()->allocateImage(w,h,1,GL_LUMINANCE, GL_UNSIGNED_BYTE); } else { getImage()->allocateImage(w,h,1,GL_RGB, GL_UNSIGNED_BYTE); } _grey = grey; }