/** Get Format7 color coding. * * @pre camera is in a Format7 video mode. * * @param camera points to DC1394 camera struct * @param video_mode currently selected Format7 video mode. * @param[in,out] color_coding Config parameter for this option, * updated if the camera does not support the * requested value * @return corresponding dc1394color_coding_t enum value selected */ dc1394color_coding_t getColorCoding(dc1394camera_t *camera, dc1394video_mode_t video_mode, std::string &color_coding) { for (int ccode = DC1394_COLOR_CODING_MIN; ccode <= DC1394_COLOR_CODING_MAX; ++ccode) { if (color_coding_names_[ccode-DC1394_COLOR_CODING_MIN] == color_coding) { // found the requested mode dc1394color_codings_t ccs; dc1394error_t err = dc1394_format7_get_color_codings(camera, video_mode, &ccs); if (err != DC1394_SUCCESS) { ROS_FATAL("unable to get supported color codings"); // TODO raise exception return (dc1394color_coding_t) 0; } // see if requested mode is available for (uint32_t i = 0; i < ccs.num; ++i) { if (ccs.codings[i] == ccode) return (dc1394color_coding_t) ccode; // yes: success } // requested mode not available, revert to current mode of camera ROS_ERROR_STREAM("Color coding " << color_coding << " not supported by this camera"); dc1394color_coding_t current_mode; err = dc1394_format7_get_color_coding(camera, video_mode, ¤t_mode); if (err != DC1394_SUCCESS) { ROS_FATAL("unable to get current color coding"); // TODO raise exception return (dc1394color_coding_t) 0; } // TODO list available modes // change color_coding parameter to show current mode of camera color_coding = colorCodingName(current_mode); return current_mode; } } // Requested color coding does not match any known string, set to // "mono8" and update parameter. ROS_FATAL_STREAM("Unknown color_coding: " << color_coding); color_coding = colorCodingName(DC1394_COLOR_CODING_MONO8); return (dc1394color_coding_t) DC1394_COLOR_CODING_MONO8; }
dc1394error_t dc1394_get_color_coding_from_video_mode(dc1394camera_t *camera, dc1394video_mode_t video_mode, dc1394color_coding_t *color_coding) { dc1394error_t err; dc1394color_coding_t id; switch(video_mode) { case DC1394_VIDEO_MODE_160x120_YUV444: *color_coding=DC1394_COLOR_CODING_YUV444; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_320x240_YUV422: case DC1394_VIDEO_MODE_640x480_YUV422: case DC1394_VIDEO_MODE_800x600_YUV422: case DC1394_VIDEO_MODE_1024x768_YUV422: case DC1394_VIDEO_MODE_1280x960_YUV422: case DC1394_VIDEO_MODE_1600x1200_YUV422: *color_coding=DC1394_COLOR_CODING_YUV422; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_640x480_YUV411: *color_coding=DC1394_COLOR_CODING_YUV411; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_640x480_RGB8: case DC1394_VIDEO_MODE_800x600_RGB8: case DC1394_VIDEO_MODE_1024x768_RGB8: case DC1394_VIDEO_MODE_1280x960_RGB8: case DC1394_VIDEO_MODE_1600x1200_RGB8: *color_coding=DC1394_COLOR_CODING_RGB8; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_640x480_MONO8: case DC1394_VIDEO_MODE_800x600_MONO8: case DC1394_VIDEO_MODE_1024x768_MONO8: case DC1394_VIDEO_MODE_1280x960_MONO8: case DC1394_VIDEO_MODE_1600x1200_MONO8: *color_coding=DC1394_COLOR_CODING_MONO8; return DC1394_SUCCESS; case DC1394_VIDEO_MODE_800x600_MONO16: case DC1394_VIDEO_MODE_640x480_MONO16: case DC1394_VIDEO_MODE_1024x768_MONO16: case DC1394_VIDEO_MODE_1280x960_MONO16: case DC1394_VIDEO_MODE_1600x1200_MONO16: *color_coding=DC1394_COLOR_CODING_MONO16; 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_color_coding(camera, video_mode, &id); if (err!=DC1394_SUCCESS) { return err; } else { *color_coding=id; } return DC1394_SUCCESS; case DC1394_VIDEO_MODE_EXIF: return DC1394_FAILURE; } return DC1394_FAILURE; }