24 #include <core/exception.h> 25 #include <core/exceptions/software.h> 26 #include <utils/system/console_colors.h> 33 #include <fvcams/firewire.h> 34 #include <fvcams/cam_exceptions.h> 35 #include <fvutils/system/camargp.h> 37 #include <dc1394/utils.h> 60 FirewireCamera::FirewireCamera(dc1394framerate_t framerate,
61 dc1394video_mode_t mode,
65 _started = _opened =
false;
66 _valid_frame_received =
false;
68 _auto_shutter =
false;
69 _auto_white_balance =
false;
71 _num_buffers = num_buffers;
73 _framerate = framerate;
74 _white_balance_ub = 0xFFFFFFFF;
75 _white_balance_vr = 0xFFFFFFFF;
76 _format7_mode_enabled =
false;
77 _format7_width = _format7_height = _format7_startx = _format7_starty = 0;
79 _model = strdup(
"any");
80 _do_set_shutter =
false;
81 _do_set_white_balance =
false;
82 _do_set_focus =
false;
89 if ((mode == DC1394_VIDEO_MODE_640x480_YUV422) && (framerate == DC1394_FRAMERATE_30)) {
91 _framerate = DC1394_FRAMERATE_15;
97 FirewireCamera::~FirewireCamera()
101 if ( _model != NULL ) {
108 FirewireCamera::open()
112 _dc1394 = dc1394_new();
113 dc1394camera_list_t *list;
116 if ( dc1394_camera_enumerate(_dc1394, &list) != DC1394_SUCCESS ) {
117 throw Exception(
"Could not enumerate cameras");
121 if ( strcmp(_model,
"any") == 0 ) {
123 _camera = dc1394_camera_new(_dc1394, list->ids[0].guid);
125 dc1394_free(_dc1394);
127 throw Exception(
"Could not create camera for first foiund camera");
131 for (
unsigned int i = 0; i < list->num; ++i) {
132 dc1394camera_t *tmpcam = dc1394_camera_new(_dc1394, list->ids[i].guid);
133 if ( strcmp(_model, tmpcam->model) == 0) {
138 dc1394_camera_free(tmpcam);
141 if ( _camera == NULL ) {
142 throw Exception(
"Could not find camera with model %s", _model);
146 if ( iso_mode_enabled() ) {
147 dc1394_video_set_transmission(_camera, DC1394_OFF);
151 dc1394_iso_release_bandwidth(_camera, INT_MAX);
152 for (
int channel = 0; channel < 64; ++channel) {
153 dc1394_iso_release_channel(_camera, channel);
158 if (_camera->bmode_capable > 0) {
159 dc1394_video_set_operation_mode(_camera, DC1394_OPERATION_MODE_1394B);
162 ((err = dc1394_video_set_iso_speed(_camera, _speed)) != DC1394_SUCCESS) ||
163 ((err = dc1394_video_set_mode(_camera, _mode)) != DC1394_SUCCESS) ||
164 ((err = dc1394_video_set_framerate(_camera, _framerate)) != DC1394_SUCCESS) ) {
165 throw Exception(
"Setting up the camera failed: %s", dc1394_error_get_string(err));
168 if (_format7_mode_enabled) {
169 if (_format7_bpp == 0) {
171 dc1394_format7_get_recommended_packet_size(_camera, _mode, &rps);
175 if ( ((err = dc1394_format7_set_image_size(_camera, _mode, _format7_width, _format7_height)) != DC1394_SUCCESS) ||
176 ((err = dc1394_format7_set_image_position(_camera, _mode, _format7_startx, _format7_starty)) != DC1394_SUCCESS) ||
177 ((err = dc1394_format7_set_color_coding(_camera, _mode, _format7_coding)) != DC1394_SUCCESS) ||
178 ((err = dc1394_format7_set_packet_size(_camera, _mode, _format7_bpp)) != DC1394_SUCCESS) ) {
179 throw Exception(
"Could not setup Format7 parameters: %s", dc1394_error_get_string(err));
183 set_auto_shutter(_auto_shutter);
184 if ( !_auto_shutter && _do_set_shutter ) {
185 set_shutter(_shutter);
188 set_auto_focus(_auto_focus);
189 if ( ! _auto_focus && _do_set_focus ) {
193 set_auto_white_balance(_auto_white_balance);
194 if ( ! _auto_white_balance &&
195 (_white_balance_ub != 0xFFFFFFFF) &&
196 (_white_balance_vr != 0xFFFFFFFF) &&
197 _do_set_white_balance ) {
198 set_white_balance(_white_balance_ub, _white_balance_vr);
214 FirewireCamera::start()
216 if (_started)
return;
219 throw Exception(
"FirewireCamera: Cannot start closed camera");
223 if ( (err = dc1394_capture_setup(_camera, _num_buffers, DC1394_CAPTURE_FLAGS_DEFAULT )) != DC1394_SUCCESS ) {
224 dc1394_capture_stop(_camera);
225 throw Exception(
"FirewireCamera: Could not setup capture (%s)", dc1394_error_get_string(err));
228 if ( (err = dc1394_video_set_transmission(_camera, DC1394_ON)) != DC1394_SUCCESS) {
230 dc1394_capture_stop(_camera);
231 throw Exception(
"FirewireCamera: Could not start ISO transmission (%s)", dc1394_error_get_string(err));
242 FirewireCamera::stop()
244 dc1394_video_set_transmission(_camera, DC1394_OFF);
245 dc1394_capture_stop(_camera);
255 FirewireCamera::iso_mode_enabled()
257 dc1394switch_t status;
258 if ( dc1394_video_get_transmission(_camera, &status) != DC1394_SUCCESS) {
259 throw Exception(
"Could not get transmission status");
261 return (status == DC1394_ON);
267 FirewireCamera::print_info()
270 dc1394_camera_print_info( _camera, stdout );
273 printf(
"Parameters:\n" 274 "valid frame received: %i\n" 276 "auto shutter: %i (shutter value: %u)\n" 277 "auto white balance: %i (white balance value %u/%u)\n" 278 "do set shutter: %i do set white balance: %i\n",
279 _valid_frame_received,_auto_focus,
280 _auto_shutter, _shutter,
281 _auto_white_balance, _white_balance_ub, _white_balance_vr,
282 _do_set_shutter =
false, _do_set_white_balance =
false 291 FirewireCamera::guid()
const 297 return _camera->guid;
305 FirewireCamera::model()
const 311 return _camera->model;
316 FirewireCamera::capture()
320 throw CaptureException(
"FirewireCamera(%s): cannot capture on closed camera", _model);
323 throw CaptureException(
"FirewireCamera(%s): cannot capture on stopped camera", _model);
326 if (! iso_mode_enabled()) {
327 throw CaptureException(
"FirewireCamera(%s): isochronous transfer not active", _model);
331 if (DC1394_SUCCESS != (err = dc1394_capture_dequeue(_camera, DC1394_CAPTURE_POLICY_WAIT, &_frame))) {
332 _valid_frame_received =
false;
334 _model, dc1394_error_get_string(err));
336 _valid_frame_received = (_frame != NULL);
342 FirewireCamera::flush()
352 FirewireCamera::buffer()
354 if ( _valid_frame_received ) {
355 return _frame->image;
363 FirewireCamera::buffer_size()
365 if ( _valid_frame_received ) {
366 return _frame->total_bytes;
373 FirewireCamera::close()
375 if ( _started ) stop();
377 dc1394_camera_free( _camera );
378 dc1394_free(_dc1394);
387 FirewireCamera::dispose_buffer()
389 if ( _valid_frame_received ) {
390 dc1394_capture_enqueue( _camera, _frame );
396 FirewireCamera::pixel_width()
399 if ( _valid_frame_received ) {
400 return _frame->size[0];
402 unsigned int width, height;
404 if ((err = dc1394_get_image_size_from_video_mode(_camera, _mode, &width, &height)) != DC1394_SUCCESS) {
405 throw Exception(
"FirewireCamera(%s): cannot get width (%s)", _model,
406 dc1394_error_get_string(err));
417 FirewireCamera::pixel_height()
420 if ( _valid_frame_received ) {
421 return _frame->size[1];
423 unsigned int width, height;
425 if ((err = dc1394_get_image_size_from_video_mode(_camera, _mode, &width, &height)) != DC1394_SUCCESS) {
426 throw Exception(
"FirewireCamera(%s): cannot get width (%s)", _model,
427 dc1394_error_get_string(err));
438 FirewireCamera::colorspace()
442 case DC1394_VIDEO_MODE_320x240_YUV422:
443 case DC1394_VIDEO_MODE_640x480_YUV422:
444 case DC1394_VIDEO_MODE_800x600_YUV422:
445 case DC1394_VIDEO_MODE_1024x768_YUV422:
446 case DC1394_VIDEO_MODE_1280x960_YUV422:
447 case DC1394_VIDEO_MODE_1600x1200_YUV422:
448 return YUV422_PACKED;
450 case DC1394_VIDEO_MODE_640x480_YUV411:
451 return YUV411_PACKED;
454 case DC1394_VIDEO_MODE_640x480_RGB8:
455 case DC1394_VIDEO_MODE_800x600_RGB8:
456 case DC1394_VIDEO_MODE_1024x768_RGB8:
457 case DC1394_VIDEO_MODE_1280x960_RGB8:
458 case DC1394_VIDEO_MODE_1600x1200_RGB8:
461 case DC1394_VIDEO_MODE_640x480_MONO8:
462 case DC1394_VIDEO_MODE_800x600_MONO8:
463 case DC1394_VIDEO_MODE_1024x768_MONO8:
464 case DC1394_VIDEO_MODE_1280x960_MONO8:
465 case DC1394_VIDEO_MODE_1600x1200_MONO8:
468 case DC1394_VIDEO_MODE_640x480_MONO16:
469 case DC1394_VIDEO_MODE_800x600_MONO16:
470 case DC1394_VIDEO_MODE_1024x768_MONO16:
471 case DC1394_VIDEO_MODE_1280x960_MONO16:
472 case DC1394_VIDEO_MODE_1600x1200_MONO16:
475 case DC1394_VIDEO_MODE_FORMAT7_0:
476 case DC1394_VIDEO_MODE_FORMAT7_1:
477 case DC1394_VIDEO_MODE_FORMAT7_2:
478 case DC1394_VIDEO_MODE_FORMAT7_3:
479 case DC1394_VIDEO_MODE_FORMAT7_4:
480 case DC1394_VIDEO_MODE_FORMAT7_5:
481 case DC1394_VIDEO_MODE_FORMAT7_6:
482 case DC1394_VIDEO_MODE_FORMAT7_7:
483 switch (_format7_coding) {
484 case DC1394_COLOR_CODING_MONO8:
486 case DC1394_COLOR_CODING_YUV411:
487 return YUV411_PACKED;
488 case DC1394_COLOR_CODING_YUV422:
489 return YUV422_PACKED;
490 case DC1394_COLOR_CODING_RGB8:
492 case DC1394_COLOR_CODING_MONO16:
494 case DC1394_COLOR_CODING_RAW8:
496 case DC1394_COLOR_CODING_RAW16:
510 FirewireCamera::ready()
517 FirewireCamera::set_image_number(
unsigned int n)
525 FirewireCamera::set_auto_focus(
bool enabled)
528 if ((err = dc1394_feature_set_mode(_camera, DC1394_FEATURE_FOCUS,
529 enabled ? DC1394_FEATURE_MODE_AUTO : DC1394_FEATURE_MODE_MANUAL))
531 _auto_focus = enabled;
533 throw Exception(
"FirewireCamera(%s): Setting auto focus failed (%s)", _model,
534 dc1394_error_get_string(err));
540 FirewireCamera::auto_focus()
547 FirewireCamera::focus()
549 unsigned int focus = 0;
550 if (dc1394_feature_get_value(_camera, DC1394_FEATURE_FOCUS, &focus) == DC1394_SUCCESS) {
560 FirewireCamera::set_focus(
unsigned int focus)
562 dc1394_feature_set_value(_camera, DC1394_FEATURE_FOCUS, focus);
567 FirewireCamera::focus_min()
569 unsigned int min = 0;
570 unsigned int max = 0;
571 if (dc1394_feature_get_boundaries(_camera, DC1394_FEATURE_FOCUS, &min, &max) == DC1394_SUCCESS) {
580 FirewireCamera::focus_max()
582 unsigned int max = 0;
583 unsigned int min = 0;
584 if (dc1394_feature_get_boundaries(_camera, DC1394_FEATURE_FOCUS, &min, &max) == DC1394_SUCCESS) {
596 FirewireCamera::set_auto_shutter(
bool enabled)
598 if (dc1394_feature_set_mode(_camera, DC1394_FEATURE_SHUTTER,
599 enabled ? DC1394_FEATURE_MODE_AUTO : DC1394_FEATURE_MODE_MANUAL)
601 _auto_shutter = enabled;
610 FirewireCamera::auto_shutter()
612 return _auto_shutter;
620 FirewireCamera::set_shutter(
unsigned int shutter)
622 if ( dc1394_feature_set_value(_camera, DC1394_FEATURE_SHUTTER, shutter) != DC1394_SUCCESS ) {
623 throw Exception(
"Failed to set shutter to %d", shutter);
632 FirewireCamera::shutter()
634 if ( dc1394_feature_get_value(_camera, DC1394_FEATURE_SHUTTER, &_shutter) != DC1394_SUCCESS ) {
635 throw Exception(
"Failed to retrieve shutter value");
646 FirewireCamera::set_auto_white_balance(
bool enabled)
648 if (dc1394_feature_set_mode(_camera, DC1394_FEATURE_WHITE_BALANCE,
649 enabled ? DC1394_FEATURE_MODE_AUTO : DC1394_FEATURE_MODE_MANUAL)
651 _auto_white_balance = enabled;
660 FirewireCamera::auto_white_balance()
662 return _auto_white_balance;
671 FirewireCamera::white_balance(
unsigned int *ub,
unsigned int *vr)
673 if ( dc1394_feature_whitebalance_get_value(_camera, &_white_balance_ub, &_white_balance_vr) != DC1394_SUCCESS ) {
674 throw Exception(
"Failed to retrieve white balance values");
677 *ub = _white_balance_ub;
678 *vr = _white_balance_vr;
687 FirewireCamera::set_white_balance(
unsigned int ub,
unsigned int vr)
689 if ( dc1394_feature_whitebalance_set_value(_camera, ub, vr) != DC1394_SUCCESS ) {
690 throw Exception(
"Failed to set white balance to ub=%d vr=%d", ub, vr);
698 FirewireCamera::set_gain(
unsigned int gain)
702 if ( dc1394_feature_get_boundaries(_camera, DC1394_FEATURE_GAIN, &min, &max) != DC1394_SUCCESS ) {
703 throw Exception(
"Failed to get boundaries for feature gain");
711 if ( dc1394_feature_set_mode( _camera, DC1394_FEATURE_GAIN, DC1394_FEATURE_MODE_MANUAL ) != DC1394_SUCCESS ) {
712 throw Exception(
"Failed to set manual mode for feature gain");
714 if ( dc1394_feature_set_value( _camera, DC1394_FEATURE_GAIN, gain ) != DC1394_SUCCESS) {
715 throw Exception(
"Failed to set value for feature gain");
724 FirewireCamera::parse_set_focus(
const char *focus)
729 }
else if ( f ==
"manual" ) {
733 long int focus = strtol(f.c_str(), &endptr, 10);
734 if ( endptr[0] != 0 ) {
736 }
else if ( focus < 0 ) {
741 _do_set_focus =
true;
751 FirewireCamera::parse_set_white_balance(
const char *white_balance)
753 string w = white_balance;
755 _auto_white_balance =
true;
758 string::size_type commapos = w.find(
",", 0);
759 if ( commapos == string::npos ) {
760 throw Exception(
"Illegal white balance value, neither auto and no comma found");
762 string ub = w.substr(0, commapos);
763 string vr = w.substr(commapos + 1);
765 long int ub_i = strtol(ub.c_str(), &endptr, 10);
766 if ( endptr[0] != 0 ) {
768 "String to int conversion failed");
769 }
else if ( ub_i < 0 ) {
772 long int vr_i = strtol(vr.c_str(), &endptr, 10);
773 if ( endptr[0] != 0 ) {
775 "String to int conversion failed");
776 }
else if ( vr_i < 0 ) {
780 _auto_white_balance =
false;
781 _white_balance_ub = ub_i;
782 _white_balance_vr = vr_i;
783 _do_set_white_balance =
true;
793 FirewireCamera::parse_set_shutter(
const char *shutter)
797 _auto_shutter =
true;
800 long int tmp = strtol(s.c_str(), &endptr, 10);
801 if ( endptr[0] !=
'\0' ) {
803 "String to int conversion failed");
804 }
else if ( tmp < 0 ) {
807 _auto_shutter =
false;
809 _do_set_shutter =
true;
856 _started = _opened =
false;
857 _valid_frame_received =
false;
859 _auto_shutter =
false;
860 _auto_white_balance =
false;
861 _white_balance_ub = 0xFFFFFFFF;
862 _white_balance_vr = 0xFFFFFFFF;
863 _do_set_shutter =
false;
864 _do_set_white_balance =
false;
865 _do_set_focus =
false;
868 _mode = DC1394_VIDEO_MODE_640x480_YUV422;
869 _speed = DC1394_ISO_SPEED_400;
870 _framerate = DC1394_FRAMERATE_15;
873 _format7_mode_enabled =
false;
874 _format7_width = _format7_height = _format7_startx = _format7_starty = 0;
876 _model = strdup(cap->
cam_id().c_str());
882 if ( cap->
has(
"mode") ) {
883 string m = cap->
get(
"mode");
884 if ( m ==
"640x480_MONO16" ) {
885 _mode = DC1394_VIDEO_MODE_640x480_MONO16;
886 }
else if ( m ==
"FORMAT7_0" ) {
887 _mode = DC1394_VIDEO_MODE_FORMAT7_0;
888 _format7_mode_enabled =
true;
889 }
else if ( m ==
"FORMAT7_1" ) {
890 _mode = DC1394_VIDEO_MODE_FORMAT7_1;
891 _format7_mode_enabled =
true;
892 }
else if ( m ==
"FORMAT7_2" ) {
893 _mode = DC1394_VIDEO_MODE_FORMAT7_2;
894 _format7_mode_enabled =
true;
895 }
else if ( m ==
"FORMAT7_3" ) {
896 _mode = DC1394_VIDEO_MODE_FORMAT7_3;
897 _format7_mode_enabled =
true;
898 }
else if ( m ==
"FORMAT7_4" ) {
899 _mode = DC1394_VIDEO_MODE_FORMAT7_4;
900 _format7_mode_enabled =
true;
901 }
else if ( m ==
"FORMAT7_5" ) {
902 _mode = DC1394_VIDEO_MODE_FORMAT7_5;
903 _format7_mode_enabled =
true;
904 }
else if ( m ==
"FORMAT7_6" ) {
905 _mode = DC1394_VIDEO_MODE_FORMAT7_6;
906 _format7_mode_enabled =
true;
907 }
else if ( m ==
"FORMAT7_7" ) {
908 _mode = DC1394_VIDEO_MODE_FORMAT7_7;
909 _format7_mode_enabled =
true;
912 if ( cap->
has(
"coding") ) {
913 string c = cap->
get(
"coding");
914 if ( c ==
"YUV422" ) {
915 _format7_coding = DC1394_COLOR_CODING_YUV422;
916 }
else if ( c ==
"MONO8" ) {
917 _format7_coding = DC1394_COLOR_CODING_MONO8;
918 }
else if ( c ==
"MONO16" ) {
919 _format7_coding = DC1394_COLOR_CODING_MONO16;
920 }
else if ( c ==
"RAW16" ) {
921 _format7_coding = DC1394_COLOR_CODING_RAW16;
924 if ( cap->
has(
"isospeed") ) {
925 string s = cap->
get(
"isospeed");
927 _speed = DC1394_ISO_SPEED_400;
928 }
else if ( s ==
"800" ) {
929 _speed = DC1394_ISO_SPEED_800;
932 if ( cap->
has(
"framerate") ) {
933 string f = cap->
get(
"framerate");
934 if ( f ==
"1.875" ) {
935 _framerate = DC1394_FRAMERATE_1_875;
936 }
else if ( f ==
"3.75" ) {
937 _framerate = DC1394_FRAMERATE_3_75;
938 }
else if ( f ==
"7.5" ) {
939 _framerate = DC1394_FRAMERATE_7_5;
940 }
else if ( f ==
"15" ) {
941 _framerate = DC1394_FRAMERATE_15;
942 }
else if ( f ==
"30" ) {
943 _framerate = DC1394_FRAMERATE_30;
944 }
else if ( f ==
"60" ) {
945 _framerate = DC1394_FRAMERATE_60;
946 }
else if ( f ==
"120" ) {
947 _framerate = DC1394_FRAMERATE_120;
948 }
else if ( f ==
"240" ) {
949 _framerate = DC1394_FRAMERATE_240;
952 if ( cap->
has(
"focus") ) {
953 parse_set_focus(cap->
get(
"focus").c_str());
955 if ( cap->
has(
"nbufs") ) {
956 _num_buffers = atoi(cap->
get(
"nbufs").c_str());
958 if ( cap->
has(
"width") ) {
959 _format7_width = atoi(cap->
get(
"width").c_str());
961 if ( cap->
has(
"height") ) {
962 _format7_height = atoi(cap->
get(
"height").c_str());
964 if ( cap->
has(
"startx") ) {
965 _format7_startx = atoi(cap->
get(
"startx").c_str());
967 if ( cap->
has(
"starty") ) {
968 _format7_starty = atoi(cap->
get(
"starty").c_str());
970 if ( cap->
has(
"packetsize") ) {
971 string p = cap->
get(
"packetsize");
972 if ( p ==
"recommended" ) {
975 _format7_bpp = atoi(p.c_str());
978 if ( cap->
has(
"gain") ) {
979 string g = cap->
get(
"gain");
981 _gain = atoi(g.c_str());
985 if ( cap->
has(
"white_balance") ) {
986 parse_set_white_balance(cap->
get(
"white_balance").c_str());
988 if ( cap->
has(
"shutter") ) {
989 parse_set_shutter(cap->
get(
"shutter").c_str());
998 FirewireCamera::print_available_fwcams()
1001 dc1394_t *dc1394 = dc1394_new();
1002 dc1394camera_list_t *list;
1004 if ( (err = dc1394_camera_enumerate(dc1394, &list)) != DC1394_SUCCESS ) {
1005 throw Exception(
"Could not enumerate cameras: %s", dc1394_error_get_string(err));
1008 if (list->num > 0) {
1009 for (
unsigned int i = 0; i < list->num; ++i) {
1010 dc1394camera_t *tmpcam = dc1394_camera_new(dc1394, list->ids[i].guid);
1011 dc1394_camera_print_info(tmpcam, stdout);
1012 dc1394_camera_free(tmpcam);
1015 printf(
"Could not find any cameras\n");
std::string get(std::string s) const
Get the value of the given parameter.
Fawkes library namespace.
Capturing a frame failed.
Base class for exceptions in Fawkes.
bool has(std::string s) const
Check if an parameter was given.
std::string cam_id() const
Get camera ID.