00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef DEVICES_DC1394GRABBER2_C_DEFINED
00039 #define DEVICES_DC1394GRABBER2_C_DEFINED
00040
00041 #include "Devices/DC1394Grabber2.H"
00042
00043 #include "Devices/DeviceOpts.H"
00044 #include "Image/Image.H"
00045 #include "Image/Pixels.H"
00046 #include "Raster/GenericFrame.H"
00047 #include "Transport/TransportOpts.H"
00048 #include "Util/Assert.H"
00049 #include "Util/SimTime.H"
00050 #include "Util/sformat.H"
00051 #include "Video/VideoFrame.H"
00052
00053 #include <unistd.h>
00054
00055
00056 #define IEEE1394WAIT 1
00057
00058
00059
00060
00061 #ifdef HAVE_DC1394V2
00062
00063 namespace
00064 {
00065 std::string convertToString(dc1394video_mode_t mode)
00066 {
00067 switch (mode)
00068 {
00069 case DC1394_VIDEO_MODE_160x120_YUV444: return "160x120_YUV444";
00070 case DC1394_VIDEO_MODE_320x240_YUV422: return "320x240_YUV422";
00071 case DC1394_VIDEO_MODE_640x480_YUV411: return "640x480_YUV411";
00072 case DC1394_VIDEO_MODE_640x480_YUV422: return "640x480_YUV422";
00073 case DC1394_VIDEO_MODE_640x480_RGB8: return "640x480_RGB8";
00074 case DC1394_VIDEO_MODE_640x480_MONO8: return "640x480_MONO8";
00075 case DC1394_VIDEO_MODE_640x480_MONO16: return "640x480_MONO16";
00076 case DC1394_VIDEO_MODE_800x600_YUV422: return "800x600_YUV422";
00077 case DC1394_VIDEO_MODE_800x600_RGB8: return "800x600_RGB8";
00078 case DC1394_VIDEO_MODE_800x600_MONO8: return "800x600_MONO8";
00079 case DC1394_VIDEO_MODE_1024x768_YUV422: return "1024x768_YUV422";
00080 case DC1394_VIDEO_MODE_1024x768_RGB8: return "1024x768_RGB8";
00081 case DC1394_VIDEO_MODE_1024x768_MONO8: return "1024x768_MONO8";
00082 case DC1394_VIDEO_MODE_800x600_MONO16: return "800x600_MONO16";
00083 case DC1394_VIDEO_MODE_1024x768_MONO16: return "1024x768_MONO16";
00084 case DC1394_VIDEO_MODE_1280x960_YUV422: return "1280x960_YUV422";
00085 case DC1394_VIDEO_MODE_1280x960_RGB8: return "1280x960_RGB8";
00086 case DC1394_VIDEO_MODE_1280x960_MONO8: return "1280x960_MONO8";
00087 case DC1394_VIDEO_MODE_1600x1200_YUV422: return "1600x1200_YUV422";
00088 case DC1394_VIDEO_MODE_1600x1200_RGB8: return "1600x1200_RGB8";
00089 case DC1394_VIDEO_MODE_1600x1200_MONO8: return "1600x1200_MONO8";
00090 case DC1394_VIDEO_MODE_1280x960_MONO16: return "1280x960_MONO16";
00091 case DC1394_VIDEO_MODE_1600x1200_MONO16: return "1600x1200_MONO16";
00092 case DC1394_VIDEO_MODE_EXIF: return "EXIF";
00093 case DC1394_VIDEO_MODE_FORMAT7_0: return "FORMAT7_0";
00094 case DC1394_VIDEO_MODE_FORMAT7_1: return "FORMAT7_1";
00095 case DC1394_VIDEO_MODE_FORMAT7_2: return "FORMAT7_2";
00096 case DC1394_VIDEO_MODE_FORMAT7_3: return "FORMAT7_3";
00097 case DC1394_VIDEO_MODE_FORMAT7_4: return "FORMAT7_4";
00098 case DC1394_VIDEO_MODE_FORMAT7_5: return "FORMAT7_5";
00099 case DC1394_VIDEO_MODE_FORMAT7_6: return "FORMAT7_6";
00100 case DC1394_VIDEO_MODE_FORMAT7_7: return "FORMAT7_7";
00101 default: break;
00102 }
00103 return "unknown";
00104 }
00105
00106 std::string convertToString(dc1394framerate_t rate)
00107 {
00108 switch (rate)
00109 {
00110 case DC1394_FRAMERATE_1_875: return "1.875 fps";
00111 case DC1394_FRAMERATE_3_75: return "3.75 fps";
00112 case DC1394_FRAMERATE_7_5: return "7.5 fps";
00113 case DC1394_FRAMERATE_15: return "15 fps";
00114 case DC1394_FRAMERATE_30: return "30 fps";
00115 case DC1394_FRAMERATE_60: return "60 fps";
00116 case DC1394_FRAMERATE_120: return "120 fps";
00117 case DC1394_FRAMERATE_240: return "240 fps";
00118 default: break;
00119 }
00120 return "unknown";
00121 }
00122
00123 std::string convertToString(dc1394speed_t speed)
00124 {
00125 switch (speed)
00126 {
00127 case DC1394_ISO_SPEED_100: return "100";
00128 case DC1394_ISO_SPEED_200: return "200";
00129 case DC1394_ISO_SPEED_400: return "400";
00130 case DC1394_ISO_SPEED_800: return "800";
00131 case DC1394_ISO_SPEED_1600: return "1600";
00132 case DC1394_ISO_SPEED_3200: return "3200";
00133 default: break;
00134 }
00135 return "unknown";
00136 }
00137
00138 struct CameraModeInfo
00139 {
00140 VideoFormat vidfmt;
00141 int w;
00142 int h;
00143 dc1394video_mode_t dc1394mode;
00144 dc1394speed_t dc1394speed;
00145 };
00146
00147
00148
00149 void find1394mode(const VideoFormat vidfmt, const Dims& dims,
00150 dc1394video_mode_t* dc1394mode,
00151 dc1394speed_t* dc1394speed)
00152 {
00153 static const CameraModeInfo modes[] =
00154 {
00155 { VIDFMT_YUV444, 160, 120, DC1394_VIDEO_MODE_160x120_YUV444 , DC1394_ISO_SPEED_400 },
00156 { VIDFMT_YUV422, 320, 240, DC1394_VIDEO_MODE_320x240_YUV422 , DC1394_ISO_SPEED_400 },
00157 { VIDFMT_YUV411, 640, 480, DC1394_VIDEO_MODE_640x480_YUV411 , DC1394_ISO_SPEED_400 },
00158 { VIDFMT_YUV422, 640, 480, DC1394_VIDEO_MODE_640x480_YUV422 , DC1394_ISO_SPEED_400 },
00159 { VIDFMT_RGB24, 640, 480, DC1394_VIDEO_MODE_640x480_RGB8 , DC1394_ISO_SPEED_400 },
00160 { VIDFMT_GREY, 640, 480, DC1394_VIDEO_MODE_640x480_MONO8 , DC1394_ISO_SPEED_400 },
00161 { VIDFMT_YUV422, 800, 600, DC1394_VIDEO_MODE_800x600_YUV422 , DC1394_ISO_SPEED_800 },
00162 { VIDFMT_RGB24, 800, 600, DC1394_VIDEO_MODE_800x600_RGB8 , DC1394_ISO_SPEED_800 },
00163 { VIDFMT_GREY, 800, 600, DC1394_VIDEO_MODE_800x600_MONO8 , DC1394_ISO_SPEED_800 },
00164 { VIDFMT_YUV422, 1024, 768, DC1394_VIDEO_MODE_1024x768_YUV422 , DC1394_ISO_SPEED_800 },
00165 { VIDFMT_RGB24, 1024, 768, DC1394_VIDEO_MODE_1024x768_RGB8 , DC1394_ISO_SPEED_800 },
00166 { VIDFMT_GREY, 1024, 768, DC1394_VIDEO_MODE_1024x768_MONO8 , DC1394_ISO_SPEED_800 },
00167 { VIDFMT_YUV422, 1280, 960, DC1394_VIDEO_MODE_1280x960_YUV422 , DC1394_ISO_SPEED_800 },
00168 { VIDFMT_RGB24, 1280, 960, DC1394_VIDEO_MODE_1280x960_RGB8 , DC1394_ISO_SPEED_800 },
00169 { VIDFMT_GREY, 1280, 960, DC1394_VIDEO_MODE_1280x960_MONO8 , DC1394_ISO_SPEED_800 },
00170 { VIDFMT_YUV422, 1600, 1200, DC1394_VIDEO_MODE_1600x1200_YUV422 , DC1394_ISO_SPEED_800 },
00171 { VIDFMT_RGB24, 1600, 1200, DC1394_VIDEO_MODE_1600x1200_RGB8 , DC1394_ISO_SPEED_800 },
00172 { VIDFMT_GREY, 1600, 1200, DC1394_VIDEO_MODE_1600x1200_MONO8 , DC1394_ISO_SPEED_800 }
00173 };
00174
00175 for (size_t i = 0; i < sizeof(modes) / sizeof(CameraModeInfo); ++i)
00176 {
00177 if (modes[i].vidfmt == vidfmt
00178 && modes[i].w == dims.w()
00179 && modes[i].h == dims.h())
00180 {
00181 *dc1394mode = modes[i].dc1394mode;
00182 *dc1394speed = modes[i].dc1394speed;
00183 return;
00184 }
00185 }
00186
00187 std::string msg =
00188 sformat("Unsupported resolution/format combination %s @ %dx%d"
00189 "\nSupported combinations are:",
00190 convertToString(vidfmt).c_str(), dims.w(), dims.h());
00191 for (size_t i = 0; i < sizeof(modes) / sizeof(CameraModeInfo); ++i)
00192 {
00193 msg += sformat("\n\t%7s @ %dx%d",
00194 convertToString(modes[i].vidfmt).c_str(),
00195 modes[i].w, modes[i].h);
00196 }
00197
00198 LFATAL("%s", msg.c_str());
00199 }
00200
00201 struct FramerateInfo
00202 {
00203 float fps;
00204 dc1394framerate_t dc1394framerate;
00205 };
00206
00207
00208 dc1394framerate_t find1394framerate(const float fps)
00209 {
00210 static const FramerateInfo framerates[] =
00211 {
00212 { 1.875F, DC1394_FRAMERATE_1_875 },
00213 { 3.75F, DC1394_FRAMERATE_3_75 },
00214 { 7.5F, DC1394_FRAMERATE_7_5 },
00215 { 15.0F, DC1394_FRAMERATE_15 },
00216 { 30.0F, DC1394_FRAMERATE_30 },
00217 { 60.0F, DC1394_FRAMERATE_60 },
00218 { 120.0F, DC1394_FRAMERATE_120 },
00219 { 240.0F, DC1394_FRAMERATE_240 }
00220 };
00221
00222 for (size_t i = 0; i < sizeof(framerates) / sizeof(FramerateInfo); ++i)
00223 if (framerates[i].fps == fps)
00224 return framerates[i].dc1394framerate;
00225
00226 std::string msg =
00227 sformat("Unsupported framerate %f fps"
00228 "\nSupported framerates are:", fps);
00229 for (size_t i = 0; i < sizeof(framerates) / sizeof(FramerateInfo); ++i)
00230 msg += sformat("\n\t%.3f fps", framerates[i].fps);
00231
00232 LFATAL("%s", msg.c_str());
00233 return (dc1394framerate_t)-1;
00234 }
00235
00236 }
00237 #endif
00238
00239
00240 DC1394Grabber2::DC1394Grabber2(OptionManager& mgr,
00241 const std::string& descrName,
00242 const std::string& tagName) :
00243 FrameIstream(mgr, descrName, tagName),
00244
00245
00246
00247
00248
00249 itsShowInputDetails(&OPT_ShowInputDetails, this),
00250 itsDevName(&OPT_FrameGrabberDevice, this, "/dev/video1394/0", USE_MY_VAL),
00251 itsChannel(&OPT_FrameGrabberChannel, this, 0, USE_MY_VAL),
00252 itsSubChan(&OPT_FrameGrabberSubChan, this, 0, USE_MY_VAL),
00253 itsDims(&OPT_FrameGrabberDims, this, Dims(320, 240), USE_MY_VAL),
00254 itsGrabMode(&OPT_FrameGrabberMode, this, VIDFMT_YUV422, USE_MY_VAL),
00255 itsByteSwap(&OPT_FrameGrabberByteSwap, this, false, USE_MY_VAL),
00256 itsFPS(&OPT_FrameGrabberFPS, this, 30.0, USE_MY_VAL),
00257 itsNbuf(&OPT_FrameGrabberNbuf, this, 4, USE_MY_VAL),
00258 itsBrightness(&OPT_FrameGrabberBrightness, this, 32768, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00259 itsHue(&OPT_FrameGrabberHue, this, 32768, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00260 itsSaturation(&OPT_FrameGrabberSaturation, this, 90, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00261 itsExposure(&OPT_FrameGrabberExposure, this, 511, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00262 itsSharpness(&OPT_FrameGrabberSharpness, this, 80, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00263 itsWhiteBalBU(&OPT_FrameGrabberWhiteBalBU, this, 95, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00264 itsWhiteBalRV(&OPT_FrameGrabberWhiteBalRV, this, 87, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00265 itsGamma(&OPT_FrameGrabberGamma, this, 1, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00266 itsShutter(&OPT_FrameGrabberShutter, this, 6, USE_MY_VAL | ALLOW_ONLINE_CHANGES),
00267 itsGain(&OPT_FrameGrabberGain, this, 87, USE_MY_VAL | ALLOW_ONLINE_CHANGES)
00268 #ifdef HAVE_DC1394V2
00269 , itsDC1394(NULL)
00270 , itsCam(NULL)
00271 #endif
00272 {}
00273
00274
00275 void DC1394Grabber2::start1()
00276 {
00277 #ifndef HAVE_DC1394V2
00278 LFATAL("you must have libdc1394 version 2.x in order to use DC1394Grabber2");
00279 #else
00280 ASSERT(itsDC1394 == 0);
00281
00282 itsDC1394 = dc1394_new();
00283
00284 if (itsDC1394 == 0)
00285 LFATAL("dc1394_new() failed");
00286
00287 {
00288 dc1394camera_list_t* list = 0;
00289 const dc1394error_t err = dc1394_camera_enumerate(itsDC1394, &list);
00290 if (err != DC1394_SUCCESS)
00291 LFATAL("dc1394_camera_enumerate() failed (%s)",
00292 dc1394_error_get_string(err));
00293
00294 if (list->num == 0)
00295 LFATAL("no cameras found by dc1394_camera_enumerate()");
00296
00297 itsCam = dc1394_camera_new(itsDC1394, list->ids[0].guid);
00298 if (itsCam == 0)
00299 LFATAL("failed to initialize camera with guid %llx",
00300 (long long unsigned int)list->ids[0].guid);
00301
00302 LINFO("using the first camera on the bus");
00303
00304 dc1394_camera_free_list(list);
00305 }
00306
00307
00308 dc1394video_mode_t videomode = dc1394video_mode_t();
00309 dc1394speed_t speed = dc1394speed_t();
00310 find1394mode(itsGrabMode.getVal(), itsDims.getVal(),
00311 &videomode, &speed);
00312
00313 dc1394error_t code = DC1394_SUCCESS;
00314
00315 if (speed < DC1394_ISO_SPEED_800)
00316 {
00317 code = dc1394_video_set_operation_mode(itsCam, DC1394_OPERATION_MODE_LEGACY);
00318 if (code != DC1394_SUCCESS) LFATAL("couldn't set camera operation mode to 'legacy'");
00319 }
00320 else
00321 {
00322 code = dc1394_video_set_operation_mode(itsCam, DC1394_OPERATION_MODE_1394B);
00323 if (code != DC1394_SUCCESS) LFATAL("couldn't set camera operation mode to '1394B'");
00324 }
00325
00326 code = dc1394_video_set_iso_speed(itsCam, speed);
00327 if (code != DC1394_SUCCESS) LFATAL("couldn't set camera ISO speed");
00328
00329 code = dc1394_video_set_mode(itsCam, videomode);
00330 if (code != DC1394_SUCCESS) LFATAL("couldn't set camera video mode");
00331
00332 const dc1394framerate_t framerate = find1394framerate(itsFPS.getVal());
00333
00334 code = dc1394_video_set_framerate(itsCam, framerate);
00335 if (code != DC1394_SUCCESS) LFATAL("couldn't set camera framerate");
00336
00337 code = dc1394_capture_setup(itsCam, 4, DC1394_CAPTURE_FLAGS_DEFAULT);
00338 if (code != DC1394_SUCCESS) LFATAL("capture setup failed; check settings");
00339
00340
00341
00342 #define SET_FEATURE(fval, pname, fname) \
00343 do { \
00344 if (dc1394_feature_set_value(itsCam, DC1394_FEATURE_ ## fval, \
00345 pname.getVal()) != DC1394_SUCCESS) \
00346 LERROR("Unable to set " fname); \
00347 } while (0)
00348
00349 SET_FEATURE(BRIGHTNESS, itsBrightness, "brightness");
00350 SET_FEATURE(EXPOSURE, itsExposure, "exposure");
00351 SET_FEATURE(SHARPNESS, itsSharpness, "sharpness");
00352 SET_FEATURE(HUE, itsHue, "hue");
00353 SET_FEATURE(SATURATION, itsSaturation, "saturation");
00354 SET_FEATURE(GAMMA, itsGamma, "gamma");
00355 SET_FEATURE(SHUTTER, itsShutter, "shutter");
00356 SET_FEATURE(GAIN, itsGain, "gain");
00357
00358 #undef SET_FEATURE
00359
00360 if (dc1394_feature_whitebalance_set_value(itsCam,
00361 itsWhiteBalBU.getVal(),
00362 itsWhiteBalRV.getVal())
00363 != DC1394_SUCCESS)
00364 LERROR("Unable to set white balance");
00365
00366
00367 code = dc1394_video_set_transmission(itsCam, DC1394_ON);
00368 if (code != DC1394_SUCCESS) LINFO("unable to start camera iso transmission");
00369
00370
00371 if (itsShowInputDetails.getVal())
00372 {
00373 dc1394_camera_print_info(itsCam, stderr);
00374
00375 dc1394featureset_t features;
00376 if (dc1394_feature_get_all(itsCam, &features) == DC1394_SUCCESS)
00377 dc1394_feature_print_all(&features, stderr);
00378 }
00379
00380 {
00381 std::string info = sformat("vendor: %s; model: %s; ", itsCam->vendor, itsCam->model);
00382
00383 dc1394video_mode_t videomode;
00384 if (dc1394_video_get_mode(itsCam, &videomode) == DC1394_SUCCESS)
00385 info += sformat("video mode: %s; ", convertToString(videomode).c_str());
00386 else
00387 info += "video mode: unknown; ";
00388
00389 dc1394framerate_t framerate;
00390 if (dc1394_video_get_framerate(itsCam, &framerate) == DC1394_SUCCESS)
00391 info += sformat("framerate: %s; ", convertToString(framerate).c_str());
00392 else
00393 info += "framerate: unknown; ";
00394
00395 dc1394speed_t speed;
00396 if (dc1394_video_get_iso_speed(itsCam, &speed) == DC1394_SUCCESS)
00397 info += sformat("speed: %s; ", convertToString(speed).c_str());
00398 else
00399 info += "speed: unknown; ";
00400
00401 uint32_t chan = 0;
00402 if (dc1394_video_get_iso_channel(itsCam, &chan) == DC1394_SUCCESS)
00403 info += sformat("ISO channel: %u; ", (unsigned int) chan);
00404 else
00405 info += "ISO channel: unknown; ";
00406
00407 LINFO("%s", info.c_str());
00408 }
00409 #endif // HAVE_DC1394V2
00410 }
00411
00412
00413 void DC1394Grabber2::stop2()
00414 {
00415 #ifndef HAVE_DC1394V2
00416
00417 LERROR("you must have libdc1394 version 2.x in order to use DC1394Grabber2");
00418 #else
00419 if (itsCam != 0)
00420 {
00421 dc1394_video_set_transmission(itsCam, DC1394_OFF);
00422 dc1394_capture_stop(itsCam);
00423 dc1394_camera_free(itsCam);
00424 itsCam = 0;
00425 }
00426 if (itsDC1394 != 0)
00427 {
00428 dc1394_free(itsDC1394);
00429 itsDC1394 = 0;
00430 }
00431 #endif // HAVE_DC1394V2
00432 }
00433
00434
00435 DC1394Grabber2::~DC1394Grabber2()
00436 { }
00437
00438
00439 GenericFrameSpec DC1394Grabber2::peekFrameSpec()
00440 {
00441 GenericFrameSpec result;
00442
00443 result.nativeType = GenericFrame::VIDEO;
00444 result.videoFormat = itsGrabMode.getVal();
00445 result.videoByteSwap = itsByteSwap.getVal();
00446 result.dims = itsDims.getVal();
00447 result.floatFlags = 0;
00448
00449 return result;
00450 }
00451
00452
00453 SimTime DC1394Grabber2::getNaturalFrameTime() const
00454 {
00455 return SimTime::HERTZ(itsFPS.getVal());
00456 }
00457
00458
00459 GenericFrame DC1394Grabber2::readFrame()
00460 {
00461 return GenericFrame(this->grabRaw());
00462 }
00463
00464
00465 VideoFrame DC1394Grabber2::grabRaw()
00466 {
00467 #ifndef HAVE_DC1394V2
00468 LFATAL("you must have libdc1394 version 2.x in order to use DC1394Grabber2");
00469 return VideoFrame();
00470 #else
00471 dc1394video_frame_t* frame = 0;
00472
00473 int code = dc1394_capture_dequeue(itsCam, DC1394_CAPTURE_POLICY_WAIT, &frame);
00474 if (code != DC1394_SUCCESS) LFATAL("unable to capture video frame");
00475
00476 VideoFrame result(frame->image, frame->total_bytes, itsDims.getVal(),
00477 itsGrabMode.getVal(), itsByteSwap.getVal(), false);
00478
00479 code = dc1394_capture_enqueue(itsCam, frame);
00480 if (code != DC1394_SUCCESS) LFATAL("couldn't re-enqueue frame");
00481
00482 return result;
00483 #endif // HAVE_DC1394V2
00484 }
00485
00486
00487 void DC1394Grabber2::paramChanged(ModelParamBase* const param,
00488 const bool valueChanged,
00489 ParamClient::ChangeStatus* status)
00490 {
00491 #ifndef HAVE_DC1394V2
00492 LFATAL("you must have libdc1394 version 2.x in order to use DC1394Grabber2");
00493 #else
00494
00495 FrameIstream::paramChanged(param, valueChanged, status);
00496
00497
00498
00499
00500
00501
00502 #define HANDLE_PARAM(FVAL, MODELPARAM, FNAME) \
00503 if (valueChanged && param == &MODELPARAM) \
00504 { \
00505 LDEBUG("online change of " FNAME " from %s", \
00506 MODELPARAM.getName().c_str()); \
00507 if (dc1394_feature_set_value \
00508 (itsCam, DC1394_FEATURE_ ## FVAL, \
00509 MODELPARAM.getVal()) \
00510 != DC1394_SUCCESS) \
00511 { \
00512 *status = ParamClient::CHANGE_REJECTED; \
00513 LERROR("Unable to set " FNAME); \
00514 } \
00515 }
00516
00517 HANDLE_PARAM(BRIGHTNESS, itsBrightness, "brightness");
00518 HANDLE_PARAM(EXPOSURE, itsExposure, "exposure");
00519 HANDLE_PARAM(SHARPNESS, itsSharpness, "sharpness");
00520 HANDLE_PARAM(HUE, itsHue, "hue");
00521 HANDLE_PARAM(SATURATION, itsSaturation, "saturation");
00522 HANDLE_PARAM(GAMMA, itsGamma, "gamma");
00523 HANDLE_PARAM(SHUTTER, itsShutter, "shutter");
00524 HANDLE_PARAM(GAIN, itsGain, "gain");
00525
00526 #undef HANDLE_PARAM
00527
00528 if (valueChanged
00529 && (param == &itsWhiteBalBU || param == &itsWhiteBalRV))
00530 {
00531 LDEBUG("online change of white balance from %s",
00532 param->getName().c_str());
00533
00534 if (dc1394_feature_whitebalance_set_value
00535 (itsCam, itsWhiteBalBU.getVal(), itsWhiteBalRV.getVal())
00536 != DC1394_SUCCESS)
00537 {
00538 *status = ParamClient::CHANGE_REJECTED;
00539 LERROR("Unable to set white balance");
00540 }
00541 }
00542
00543 #endif // HAVE_DC1394V2
00544 }
00545
00546
00547
00548
00549
00550
00551
00552
00553 #endif // DEVICES_DC1394GRABBER2_C_DEFINED