Blame dc1394/utils.c

Packit 713213
/*
Packit 713213
 * 1394-Based Digital Camera Control Library
Packit 713213
 *
Packit 713213
 * Utilities
Packit 713213
 *
Packit 713213
 * Written by Damien Douxchamps <ddouxchamps@users.sf.net>
Packit 713213
 *
Packit 713213
 * This library is free software; you can redistribute it and/or
Packit 713213
 * modify it under the terms of the GNU Lesser General Public
Packit 713213
 * License as published by the Free Software Foundation; either
Packit 713213
 * version 2.1 of the License, or (at your option) any later version.
Packit 713213
 *
Packit 713213
 * This library is distributed in the hope that it will be useful,
Packit 713213
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 713213
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 713213
 * Lesser General Public License for more details.
Packit 713213
 *
Packit 713213
 * You should have received a copy of the GNU Lesser General Public
Packit 713213
 * License along with this library; if not, write to the Free Software
Packit 713213
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit 713213
 */
Packit 713213
Packit 713213
#include "internal.h"
Packit 713213
Packit 713213
const char *dc1394_feature_desc[DC1394_FEATURE_NUM] = {
Packit 713213
    "Brightness",
Packit 713213
    "Exposure",
Packit 713213
    "Sharpness",
Packit 713213
    "White Balance",
Packit 713213
    "Hue",
Packit 713213
    "Saturation",
Packit 713213
    "Gamma",
Packit 713213
    "Shutter",
Packit 713213
    "Gain",
Packit 713213
    "Iris",
Packit 713213
    "Focus",
Packit 713213
    "Temperature",
Packit 713213
    "Trigger",
Packit 713213
    "Trigger Delay",
Packit 713213
    "White Shading",
Packit 713213
    "Frame Rate",
Packit 713213
    "Zoom",
Packit 713213
    "Pan",
Packit 713213
    "Tilt",
Packit 713213
    "Optical Filter",
Packit 713213
    "Capture Size",
Packit 713213
    "Capture Quality"
Packit 713213
};
Packit 713213
Packit 713213
const char *dc1394_error_strings[DC1394_ERROR_NUM] = {
Packit 713213
    "Success",
Packit 713213
    "Generic failure",
Packit 713213
    "This node is not a camera",
Packit 713213
    "Function not supported by this camera",
Packit 713213
    "Camera not initialized",
Packit 713213
    "Memory allocation failure",
Packit 713213
    "Tagged register not found",
Packit 713213
    "Could not allocate an ISO channel",
Packit 713213
    "Could not allocate bandwidth",
Packit 713213
    "IOCTL failure",
Packit 713213
    "Capture is not set",
Packit 713213
    "Capture is running",
Packit 713213
    "RAW1394 failure",
Packit 713213
    "Format_7 Error_flag_1 is set",
Packit 713213
    "Format_7 Error_flag_2 is set",
Packit 713213
    "Invalid argument value",
Packit 713213
    "Requested value is out of range",
Packit 713213
    "Invalid feature",
Packit 713213
    "Invalid video format",
Packit 713213
    "Invalid video mode",
Packit 713213
    "Invalid framerate",
Packit 713213
    "Invalid trigger mode",
Packit 713213
    "Invalid trigger source",
Packit 713213
    "Invalid ISO speed",
Packit 713213
    "Invalid IIDC version",
Packit 713213
    "Invalid Format_7 color coding",
Packit 713213
    "Invalid Format_7 elementary Bayer tile",
Packit 713213
    "Invalid capture mode",
Packit 713213
    "Invalid error code",
Packit 713213
    "Invalid Bayer method",
Packit 713213
    "Invalid video1394 device",
Packit 713213
    "Invalid operation mode",
Packit 713213
    "Invalid trigger polarity",
Packit 713213
    "Invalid feature mode",
Packit 713213
    "Invalid log type",
Packit 713213
    "Invalid byte order",
Packit 713213
    "Invalid stereo method",
Packit 713213
    "Basler error: no more SFF chunks",
Packit 713213
    "Basler error: corrupted SFF chunk",
Packit 713213
    "Basler error: unknown SFF chunk"
Packit 713213
};
Packit 713213
Packit 713213
dc1394error_t
Packit 713213
dc1394_get_image_size_from_video_mode(dc1394camera_t *camera, dc1394video_mode_t video_mode, uint32_t *w, uint32_t *h)
Packit 713213
{
Packit 713213
    dc1394error_t err;
Packit 713213
    uint32_t sx, sy;
Packit 713213
Packit 713213
    switch(video_mode) {
Packit 713213
    case DC1394_VIDEO_MODE_160x120_YUV444:
Packit 713213
        *w = 160;*h=120;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_320x240_YUV422:
Packit 713213
        *w = 320;*h=240;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_640x480_YUV411:
Packit 713213
    case DC1394_VIDEO_MODE_640x480_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_640x480_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_640x480_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_640x480_MONO16:
Packit 713213
        *w =640;*h=480;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_800x600_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_800x600_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_800x600_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_800x600_MONO16:
Packit 713213
        *w=800;*h=600;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_1024x768_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_1024x768_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_1024x768_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_1024x768_MONO16:
Packit 713213
        *w=1024;*h=768;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_1280x960_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_1280x960_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_1280x960_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_1280x960_MONO16:
Packit 713213
        *w=1280;*h=960;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_1600x1200_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_1600x1200_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_1600x1200_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_1600x1200_MONO16:
Packit 713213
        *w=1600;*h=1200;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_0:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_1:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_2:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_3:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_4:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_5:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_6:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_7:
Packit 713213
        // get the current color mode from the camera
Packit 713213
        err=dc1394_format7_get_image_size(camera, video_mode, &sx, &sy;;
Packit 713213
        if (err!=DC1394_SUCCESS) {
Packit 713213
            return err;
Packit 713213
        }
Packit 713213
        else {
Packit 713213
            *w=sx;
Packit 713213
            *h=sy;
Packit 713213
        }
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_EXIF:
Packit 713213
        return DC1394_FAILURE;
Packit 713213
    }
Packit 713213
Packit 713213
    return DC1394_FAILURE;
Packit 713213
}
Packit 713213
Packit 713213
Packit 713213
dc1394error_t
Packit 713213
dc1394_framerate_as_float(dc1394framerate_t framerate_enum, float *framerate)
Packit 713213
{
Packit 713213
    switch(framerate_enum)  {
Packit 713213
    case DC1394_FRAMERATE_1_875:
Packit 713213
        *framerate=1.875;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_FRAMERATE_3_75:
Packit 713213
        *framerate=3.75;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_FRAMERATE_7_5:
Packit 713213
        *framerate=7.5;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_FRAMERATE_15:
Packit 713213
        *framerate=15.0;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_FRAMERATE_30:
Packit 713213
        *framerate=30.0;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_FRAMERATE_60:
Packit 713213
        *framerate=60.0;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_FRAMERATE_120:
Packit 713213
        *framerate=120.0;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_FRAMERATE_240:
Packit 713213
        *framerate=240.0;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    }
Packit 713213
    return DC1394_INVALID_FRAMERATE;
Packit 713213
}
Packit 713213
Packit 713213
dc1394error_t
Packit 713213
dc1394_is_color(dc1394color_coding_t color_coding, dc1394bool_t *is_color)
Packit 713213
{
Packit 713213
    switch(color_coding)  {
Packit 713213
    case DC1394_COLOR_CODING_MONO8:
Packit 713213
    case DC1394_COLOR_CODING_MONO16:
Packit 713213
    case DC1394_COLOR_CODING_MONO16S:
Packit 713213
    case DC1394_COLOR_CODING_RAW8:
Packit 713213
    case DC1394_COLOR_CODING_RAW16:
Packit 713213
        *is_color=DC1394_FALSE;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_COLOR_CODING_YUV411:
Packit 713213
    case DC1394_COLOR_CODING_YUV422:
Packit 713213
    case DC1394_COLOR_CODING_YUV444:
Packit 713213
    case DC1394_COLOR_CODING_RGB8:
Packit 713213
    case DC1394_COLOR_CODING_RGB16:
Packit 713213
    case DC1394_COLOR_CODING_RGB16S:
Packit 713213
        *is_color=DC1394_TRUE;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    }
Packit 713213
    return DC1394_INVALID_COLOR_CODING;
Packit 713213
}
Packit 713213
Packit 713213
dc1394error_t
Packit 713213
dc1394_get_color_coding_data_depth(dc1394color_coding_t color_coding, uint32_t * bits)
Packit 713213
{
Packit 713213
    switch(color_coding) {
Packit 713213
    case DC1394_COLOR_CODING_MONO8:
Packit 713213
    case DC1394_COLOR_CODING_YUV411:
Packit 713213
    case DC1394_COLOR_CODING_YUV422:
Packit 713213
    case DC1394_COLOR_CODING_YUV444:
Packit 713213
    case DC1394_COLOR_CODING_RGB8:
Packit 713213
    case DC1394_COLOR_CODING_RAW8:
Packit 713213
        *bits = 8;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_COLOR_CODING_MONO16:
Packit 713213
    case DC1394_COLOR_CODING_RGB16:
Packit 713213
    case DC1394_COLOR_CODING_MONO16S:
Packit 713213
    case DC1394_COLOR_CODING_RGB16S:
Packit 713213
    case DC1394_COLOR_CODING_RAW16:
Packit 713213
        // shoudn't we return the real bit depth (e.g. 12) instead of systematically 16?
Packit 713213
        *bits = 16;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    }
Packit 713213
    return DC1394_INVALID_COLOR_CODING;
Packit 713213
}
Packit 713213
Packit 713213
dc1394error_t
Packit 713213
dc1394_get_color_coding_bit_size(dc1394color_coding_t color_coding, uint32_t* bits)
Packit 713213
{
Packit 713213
    switch(color_coding) {
Packit 713213
    case DC1394_COLOR_CODING_MONO8:
Packit 713213
    case DC1394_COLOR_CODING_RAW8:
Packit 713213
        *bits=8;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_COLOR_CODING_YUV411:
Packit 713213
        *bits=12;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_COLOR_CODING_MONO16:
Packit 713213
    case DC1394_COLOR_CODING_RAW16:
Packit 713213
    case DC1394_COLOR_CODING_MONO16S:
Packit 713213
    case DC1394_COLOR_CODING_YUV422:
Packit 713213
        *bits=16;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_COLOR_CODING_YUV444:
Packit 713213
    case DC1394_COLOR_CODING_RGB8:
Packit 713213
        *bits=24;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_COLOR_CODING_RGB16:
Packit 713213
    case DC1394_COLOR_CODING_RGB16S:
Packit 713213
        *bits=48;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    }
Packit 713213
    return DC1394_INVALID_COLOR_CODING;
Packit 713213
}
Packit 713213
Packit 713213
dc1394error_t
Packit 713213
dc1394_get_color_coding_from_video_mode(dc1394camera_t *camera, dc1394video_mode_t video_mode, dc1394color_coding_t *color_coding)
Packit 713213
{
Packit 713213
    dc1394error_t err;
Packit 713213
    dc1394color_coding_t id;
Packit 713213
Packit 713213
    switch(video_mode) {
Packit 713213
    case DC1394_VIDEO_MODE_160x120_YUV444:
Packit 713213
        *color_coding=DC1394_COLOR_CODING_YUV444;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_320x240_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_640x480_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_800x600_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_1024x768_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_1280x960_YUV422:
Packit 713213
    case DC1394_VIDEO_MODE_1600x1200_YUV422:
Packit 713213
        *color_coding=DC1394_COLOR_CODING_YUV422;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_640x480_YUV411:
Packit 713213
        *color_coding=DC1394_COLOR_CODING_YUV411;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_640x480_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_800x600_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_1024x768_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_1280x960_RGB8:
Packit 713213
    case DC1394_VIDEO_MODE_1600x1200_RGB8:
Packit 713213
        *color_coding=DC1394_COLOR_CODING_RGB8;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_640x480_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_800x600_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_1024x768_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_1280x960_MONO8:
Packit 713213
    case DC1394_VIDEO_MODE_1600x1200_MONO8:
Packit 713213
        *color_coding=DC1394_COLOR_CODING_MONO8;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_800x600_MONO16:
Packit 713213
    case DC1394_VIDEO_MODE_640x480_MONO16:
Packit 713213
    case DC1394_VIDEO_MODE_1024x768_MONO16:
Packit 713213
    case DC1394_VIDEO_MODE_1280x960_MONO16:
Packit 713213
    case DC1394_VIDEO_MODE_1600x1200_MONO16:
Packit 713213
        *color_coding=DC1394_COLOR_CODING_MONO16;
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_0:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_1:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_2:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_3:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_4:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_5:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_6:
Packit 713213
    case DC1394_VIDEO_MODE_FORMAT7_7:
Packit 713213
        // get the current color mode from the camera
Packit 713213
        err=dc1394_format7_get_color_coding(camera, video_mode, &id;;
Packit 713213
        if (err!=DC1394_SUCCESS) {
Packit 713213
            return err;
Packit 713213
        }
Packit 713213
        else {
Packit 713213
            *color_coding=id;
Packit 713213
        }
Packit 713213
        return DC1394_SUCCESS;
Packit 713213
    case DC1394_VIDEO_MODE_EXIF:
Packit 713213
        return DC1394_FAILURE;
Packit 713213
    }
Packit 713213
Packit 713213
    return DC1394_FAILURE;
Packit 713213
}
Packit 713213
Packit 713213
dc1394bool_t
Packit 713213
dc1394_is_video_mode_scalable(dc1394video_mode_t video_mode)
Packit 713213
{
Packit 713213
    return ((video_mode>=DC1394_VIDEO_MODE_FORMAT7_MIN)&&(video_mode<=DC1394_VIDEO_MODE_FORMAT7_MAX));
Packit 713213
}
Packit 713213
Packit 713213
dc1394bool_t
Packit 713213
dc1394_is_video_mode_still_image(dc1394video_mode_t video_mode)
Packit 713213
{
Packit 713213
    return ((video_mode>=DC1394_VIDEO_MODE_FORMAT6_MIN)&&(video_mode<=DC1394_VIDEO_MODE_FORMAT6_MAX));
Packit 713213
}
Packit 713213
Packit 713213
dc1394bool_t
Packit 713213
dc1394_is_same_camera(dc1394camera_id_t id1, dc1394camera_id_t id2)
Packit 713213
{
Packit 713213
    return ((id1.guid==id2.guid)&&(id1.unit==id2.unit));
Packit 713213
}
Packit 713213
Packit 713213
const char *
Packit 713213
dc1394_feature_get_string(dc1394feature_t feature)
Packit 713213
{
Packit 713213
    if ((feature>DC1394_FEATURE_MAX)||(feature
Packit 713213
        return NULL;
Packit 713213
Packit 713213
    return dc1394_feature_desc[feature-DC1394_FEATURE_MIN];
Packit 713213
}
Packit 713213
Packit 713213
const char *
Packit 713213
dc1394_error_get_string(dc1394error_t error)
Packit 713213
{
Packit 713213
Packit 713213
    if ((error>DC1394_ERROR_MAX)||(error
Packit 713213
        return NULL;
Packit 713213
Packit 713213
    return dc1394_error_strings[-error-DC1394_ERROR_MAX];
Packit 713213
}
Packit 713213
Packit 713213
Packit 713213
/*
Packit 713213
 * Checksum algorithms
Packit 713213
 * Copyright (C) 2006 Mikael Olenfalk, Tobii Technology AB, Stockholm Sweden
Packit 713213
 *
Packit 713213
 * Written by Mikael Olenfalk <mikael _DOT_ olenfalk _AT_ tobii _DOT_ com>
Packit 713213
 * Version : 16/02/2005
Packit 713213
 */
Packit 713213
Packit 713213
uint16_t
Packit 713213
dc1394_checksum_crc16 (const uint8_t* buffer, uint32_t buffer_size)
Packit 713213
{
Packit 713213
    uint32_t i, j, c, bit;
Packit 713213
    uint32_t crc = 0;
Packit 713213
    for (i = 0; i < buffer_size; i++) {
Packit 713213
        c = (uint32_t)*buffer++;
Packit 713213
        for (j = 0x80; j; j >>= 1) {
Packit 713213
            bit = crc & 0x8000;
Packit 713213
            crc <<= 1;
Packit 713213
            if (c & j) bit ^= 0x8000;
Packit 713213
            if (bit) crc ^= 0x1021;
Packit 713213
        }
Packit 713213
    }
Packit 713213
    return (uint16_t)(crc & 0xffff);
Packit 713213
}