在下面的sourceforge 托管的 libdc1394 库,Damien Douxchamps 于 2014-3-6 正确地将几行代码添加到 /usb/control.c。最新的2.2.2 软件包该库的版本于同一天(2014-3-6)进行了修改并发布,但是,/usb/control.c
下载的包中的代码libdc1394-2.2.2.tar.gz
并未反映出/usb/control.c
同一天所做的更改。
这里可能发生了什么?我能做些什么来解决这个问题?我是 git 和 sourceforge 的新手。
我正在使用 homebrew 作为包管理器,它可以很好地下载并安装 2.2.2,但显然 2.2.2 不包含在同一天对代码所做的适当更改。
以下是自制配方的片段:
homepage "http://damien.douxchamps.net/ieee1394/libdc1394/"
url "https://downloads.sourceforge.net/project/libdc1394/libdc1394-2/2.2.2/libdc1394-2.2.2.tar.gz"
sha1 "13958c3cd0709565b5e4a9012dcf2a9b710264e2"
这是 /usb/control.c 代码在 sourceforge 上2014-3-6 编辑后(“GOOD”):
/*
* 1394-Based Digital Camera Control Library
*
* IIDC-over-USB using libusb backend for dc1394
*
* Written by David Moore <[email protected]>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include "config.h"
#include "platform.h"
#include "internal.h"
#include "usb.h"
static platform_t *
dc1394_usb_new (void)
{
libusb_context *context;
if (libusb_init(&context) != 0)
return NULL;
platform_t * p = calloc (1, sizeof (platform_t));
p->context = context;
return p;
}
static void
dc1394_usb_free (platform_t * p)
{
if (p->context)
libusb_exit(p->context);
p->context = NULL;
free (p);
}
struct _platform_device_t {
libusb_device * dev;
};
typedef struct _usb_device_list_t {
platform_device_list_t list;
libusb_device ** libusb_list;
} usb_device_list_t;
/* This is the list of USB vendor/products that we know support
* IIDC-over-USB. Currently, this is the only mechanism of detecting
* such cameras. */
static struct _vendor_product_t {
uint16_t vendor;
uint16_t product;
} usb_products[] = {
{ 0x1e10, 0x2000 }, // Point Grey Firefly MV Color
{ 0x1e10, 0x2001 }, // Point Grey Firefly MV Mono
{ 0x1e10, 0x2002 }, // Point Grey High Res Firefly MV Color
{ 0x1e10, 0x2003 }, // Point Grey High Res Firefly MV Mono
{ 0x1e10, 0x2004 }, // Point Grey Chameleon Color
{ 0x1e10, 0x2005 }, // Point Grey Chameleon Mono
{ 0x1e10, 0x3000 }, // Point Grey Flea 3
{ 0x1e10, 0x3005 }, // Point Grey Flea 3 (FL3-U3-13Y3M)
{ 0x1e10, 0x3006 }, // Point Grey Flea 3 (FL3-U3-13S2C)
{ 0x1e10, 0x3008 }, // Point Grey Flea 3 (FL3-U3-88S2C)
{ 0x1e10, 0x300a }, // Point Grey Flea 3 (FL3-U3-13E4C)
{ 0, 0 }
};
static int
is_device_iidc (uint16_t vendor, uint16_t product)
{
int j = 0;
while (usb_products[j].vendor != 0 && usb_products[j].product != 0) {
if (usb_products[j].vendor == vendor &&
usb_products[j].product == product)
return 1;
j++;
}
return 0;
}
static platform_device_list_t *
dc1394_usb_get_device_list (platform_t * p)
{
usb_device_list_t * list;
libusb_device * dev;
int i;
list = calloc (1, sizeof (usb_device_list_t));
if (!list)
return NULL;
if (libusb_get_device_list (p->context, &list->libusb_list) < 0)
return NULL;
dev = list->libusb_list[0];
for (i=0, dev = list->libusb_list[0]; dev; dev = list->libusb_list[++i]) {
struct libusb_device_descriptor desc;
if (libusb_get_device_descriptor (dev, &desc) != 0) {
dc1394_log_warning ("usb: Failed to get descriptor for device %d",
i);
continue;
}
if (!is_device_iidc (desc.idVendor, desc.idProduct))
continue;
list->list.num_devices++;
list->list.devices = realloc (list->list.devices,
list->list.num_devices * sizeof (platform_device_t *));
platform_device_t * pdev = malloc(sizeof(platform_device_t));
pdev->dev = dev;
list->list.devices[list->list.num_devices-1] = pdev;
dc1394_log_debug ("usb: Found vendor:prod %x:%x at address %x:%x",
desc.idVendor, desc.idProduct,
libusb_get_bus_number (dev), libusb_get_device_address (dev));
}
return &list->list;
}
static void
dc1394_usb_free_device_list (platform_device_list_t * d)
{
usb_device_list_t * list = (usb_device_list_t *) d;
int i;
for (i = 0; i < d->num_devices; i++)
free (d->devices[i]);
free (d->devices);
libusb_free_device_list (list->libusb_list, 1);
free (d);
}
/* The high 16 bits of the IEEE 1394 address space are mapped to the request
* byte of USB control transfers. Only a discrete set addresses are
* currently supported, as mapped by this function. */
static int
address_to_request (uint64_t address)
{
switch (address >> 32) {
case 0xffff:
return 0x7f;
case 0xd000:
return 0x80;
case 0xd0001:
return 0x81;
}
dc1394_log_error("usb: Invalid high address %x for request",
address >> 32);
return -1;
}
#define REQUEST_TIMEOUT_MS 1000
static int
do_read (libusb_device_handle * handle, uint64_t address, uint32_t * quads,
int num_quads)
{
int request = address_to_request (address);
if (request < 0)
return -1;
unsigned char buf[num_quads*4];
/* IEEE 1394 address reads are mapped to USB control transfers as
* shown here. */
int ret = libusb_control_transfer (handle, 0xc0, request,
address & 0xffff, (address >> 16) & 0xffff,
buf, num_quads * 4, REQUEST_TIMEOUT_MS);
if (ret < 0)
return -1;
int i;
int ret_quads = (ret + 3) / 4;
/* Convert from little-endian to host-endian */
for (i = 0; i < ret_quads; i++) {
quads[i] = (buf[4*i+3] << 24) | (buf[4*i+2] << 16)
| (buf[4*i+1] << 8) | buf[4*i];
}
return ret_quads;
}
static int
do_write (libusb_device_handle * handle, uint64_t address,
const uint32_t * quads, int num_quads)
{
int request = address_to_request (address);
if (request < 0)
return -1;
unsigned char buf[num_quads*4];
int i;
/* Convert from host-endian to little-endian */
for (i = 0; i < num_quads; i++) {
buf[4*i] = quads[i] & 0xff;
buf[4*i+1] = (quads[i] >> 8) & 0xff;
buf[4*i+2] = (quads[i] >> 16) & 0xff;
buf[4*i+3] = (quads[i] >> 24) & 0xff;
}
/* IEEE 1394 address writes are mapped to USB control transfers as
* shown here. */
int ret = libusb_control_transfer (handle, 0x40, request,
address & 0xffff, (address >> 16) & 0xffff,
buf, num_quads * 4, REQUEST_TIMEOUT_MS);
if (ret < 0)
return -1;
return ret / 4;
}
static int
dc1394_usb_device_get_config_rom (platform_device_t * device,
uint32_t * quads, int * num_quads)
{
libusb_device_handle * handle;
if (libusb_open (device->dev, &handle) < 0) {
dc1394_log_warning ("usb: Failed to open device for config ROM");
return DC1394_FAILURE;
}
if (*num_quads > 256)
*num_quads = 256;
/* Read the config ROM one quad at a time because a read longer than
* the length of the ROM will fail. */
int i;
for (i = 0; i < *num_quads; i++) {
int ret = do_read (handle, CONFIG_ROM_BASE + 0x400 + 4*i,
quads + i, 1);
if (ret < 1)
break;
}
if (i == 0) {
dc1394_log_error ("usb: Failed to read config ROM");
libusb_close (handle);
return -1;
}
*num_quads = i;
libusb_close (handle);
return 0;
}
static platform_camera_t *
dc1394_usb_camera_new (platform_t * p, platform_device_t * device,
uint32_t unit_directory_offset)
{
libusb_device_handle * handle;
platform_camera_t * camera;
if (libusb_open (device->dev, &handle) < 0) {
dc1394_log_error ("usb: Failed to open device");
return NULL;
}
if (libusb_set_configuration (handle, 1) < 0) {
dc1394_log_error ("usb: Failed to set configuration 1 after open");
libusb_close (handle);
return NULL;
}
camera = calloc (1, sizeof (platform_camera_t));
camera->handle = handle;
return camera;
}
static void dc1394_usb_camera_free (platform_camera_t * cam)
{
libusb_close (cam->handle);
cam->handle = NULL;
free (cam);
}
static void
dc1394_usb_camera_set_parent (platform_camera_t * cam, dc1394camera_t * parent)
{
cam->camera = parent;
}
static dc1394error_t
dc1394_usb_camera_print_info (platform_camera_t * camera, FILE *fd)
{
libusb_device *dev = libusb_get_device (camera->handle);
struct libusb_device_descriptor desc;
libusb_get_device_descriptor (dev, &desc);
fprintf(fd,"------ Camera platform-specific information ------\n");
fprintf(fd,"USB Bus Number : %d\n",
libusb_get_bus_number (dev));
fprintf(fd,"USB Device Address : %d\n",
libusb_get_device_address (dev));
fprintf(fd,"Vendor ID : 0x%x\n",
desc.idVendor);
fprintf(fd,"Product ID : 0x%x\n",
desc.idProduct);
return DC1394_SUCCESS;
}
static dc1394error_t
dc1394_usb_camera_read (platform_camera_t * cam, uint64_t offset,
uint32_t * quads, int num_quads)
{
if (do_read (cam->handle, CONFIG_ROM_BASE + offset, quads,
num_quads) != num_quads)
return DC1394_FAILURE;
return DC1394_SUCCESS;
}
static dc1394error_t
dc1394_usb_camera_write (platform_camera_t * cam, uint64_t offset,
const uint32_t * quads, int num_quads)
{
if (do_write (cam->handle, CONFIG_ROM_BASE + offset, quads,
num_quads) != num_quads)
return DC1394_FAILURE;
return DC1394_SUCCESS;
}
static dc1394error_t
dc1394_usb_camera_get_node(platform_camera_t *cam, uint32_t *node,
uint32_t * generation)
{
/* Since node/generation doesn't really apply to USB, we instead
* put the device address in the "node" argument and "bus number"
* in the generation argument. */
if (node)
*node = libusb_get_device_address (libusb_get_device (cam->handle));
if (generation)
*generation = libusb_get_bus_number (libusb_get_device (cam->handle));
return DC1394_SUCCESS;
}
static dc1394error_t
dc1394_usb_reset_bus (platform_camera_t * cam)
{
int ret = libusb_reset_device (cam->handle);
if (ret == 0 || ret == LIBUSB_ERROR_NOT_FOUND)
return DC1394_SUCCESS;
return DC1394_FAILURE;
}
static platform_dispatch_t
usb_dispatch = {
.platform_new = dc1394_usb_new,
.platform_free = dc1394_usb_free,
.get_device_list = dc1394_usb_get_device_list,
.free_device_list = dc1394_usb_free_device_list,
.device_get_config_rom = dc1394_usb_device_get_config_rom,
.camera_new = dc1394_usb_camera_new,
.camera_free = dc1394_usb_camera_free,
.camera_set_parent = dc1394_usb_camera_set_parent,
.camera_print_info = dc1394_usb_camera_print_info,
.camera_get_node = dc1394_usb_camera_get_node,
.reset_bus = dc1394_usb_reset_bus,
.camera_read = dc1394_usb_camera_read,
.camera_write = dc1394_usb_camera_write,
.capture_setup = dc1394_usb_capture_setup,
.capture_stop = dc1394_usb_capture_stop,
.capture_dequeue = dc1394_usb_capture_dequeue,
.capture_enqueue = dc1394_usb_capture_enqueue,
.capture_get_fileno = dc1394_usb_capture_get_fileno,
.capture_is_frame_corrupt = dc1394_usb_capture_is_frame_corrupt,
#ifdef HAVE_MACOSX
.capture_set_callback = dc1394_usb_capture_set_callback,
.capture_schedule_with_runloop = dc1394_usb_capture_schedule_with_runloop,
#else
.capture_set_callback = NULL,
.capture_schedule_with_runloop = NULL,
#endif
};
void
dc1394_usb_init(dc1394_t * d)
{
register_platform (d, &usb_dispatch, "usb");
}
这是 2014-3-6 发布 (“BAD”) 的 2.2.2 软件包中的 /usb/control.c 代码:
/*
* 1394-Based Digital Camera Control Library
*
* IIDC-over-USB using libusb backend for dc1394
*
* Written by David Moore <[email protected]>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include "config.h"
#include "platform.h"
#include "internal.h"
#include "usb.h"
static platform_t *
dc1394_usb_new (void)
{
libusb_context *context;
if (libusb_init(&context) != 0)
return NULL;
platform_t * p = calloc (1, sizeof (platform_t));
p->context = context;
return p;
}
static void
dc1394_usb_free (platform_t * p)
{
if (p->context)
libusb_exit(p->context);
p->context = NULL;
free (p);
}
struct _platform_device_t {
libusb_device * dev;
};
typedef struct _usb_device_list_t {
platform_device_list_t list;
libusb_device ** libusb_list;
} usb_device_list_t;
/* This is the list of USB vendor/products that we know support
* IIDC-over-USB. Currently, this is the only mechanism of detecting
* such cameras. */
static struct _vendor_product_t {
uint16_t vendor;
uint16_t product;
} usb_products[] = {
{ 0x1e10, 0x2000 }, // Point Grey Firefly MV Color
{ 0x1e10, 0x2001 }, // Point Grey Firefly MV Mono
{ 0x1e10, 0x2002 }, // Point Grey High Res Firefly MV Color
{ 0x1e10, 0x2003 }, // Point Grey High Res Firefly MV Mono
{ 0x1e10, 0x2004 }, // Point Grey Chameleon Color
{ 0x1e10, 0x2005 }, // Point Grey Chameleon Mono
{ 0x1e10, 0x3000 }, // Point Grey Flea 3
{ 0x1e10, 0x3005 }, // Point Grey Flea 3 (FL3-U3-13Y3M)
{ 0x1e10, 0x3006 }, // Point Grey Flea 3 (FL3-U3-13S2C)
{ 0x1e10, 0x3008 }, // Point Grey Flea 3 (FL3-U3-88S2C)
{ 0x1e10, 0x300a }, // Point Grey Flea 3 (FL3-U3-13E4C)
{ 0x1e10, 0x300b }, // Point Grey Flea 3 (FL3-U3-13E4M with 1.43.3.2 FW)
{ 0x1e10, 0x3300 }, // Point Grey Flea 3 (FL3-U3-13E4M with 2.7.3.0 FW)
{ 0, 0 }
};
static int
is_device_iidc (uint16_t vendor, uint16_t product)
{
int j = 0;
while (usb_products[j].vendor != 0 && usb_products[j].product != 0) {
if (usb_products[j].vendor == vendor &&
usb_products[j].product == product)
return 1;
j++;
}
return 0;
}
static platform_device_list_t *
dc1394_usb_get_device_list (platform_t * p)
{
usb_device_list_t * list;
libusb_device * dev;
int i;
list = calloc (1, sizeof (usb_device_list_t));
if (!list)
return NULL;
if (libusb_get_device_list (p->context, &list->libusb_list) < 0)
return NULL;
dev = list->libusb_list[0];
for (i=0, dev = list->libusb_list[0]; dev; dev = list->libusb_list[++i]) {
struct libusb_device_descriptor desc;
if (libusb_get_device_descriptor (dev, &desc) != 0) {
dc1394_log_warning ("usb: Failed to get descriptor for device %d",
i);
continue;
}
if (!is_device_iidc (desc.idVendor, desc.idProduct))
continue;
list->list.num_devices++;
list->list.devices = realloc (list->list.devices,
list->list.num_devices * sizeof (platform_device_t *));
platform_device_t * pdev = malloc(sizeof(platform_device_t));
pdev->dev = dev;
list->list.devices[list->list.num_devices-1] = pdev;
dc1394_log_debug ("usb: Found vendor:prod %x:%x at address %x:%x",
desc.idVendor, desc.idProduct,
libusb_get_bus_number (dev), libusb_get_device_address (dev));
}
return &list->list;
}
static void
dc1394_usb_free_device_list (platform_device_list_t * d)
{
usb_device_list_t * list = (usb_device_list_t *) d;
int i;
for (i = 0; i < d->num_devices; i++)
free (d->devices[i]);
free (d->devices);
libusb_free_device_list (list->libusb_list, 1);
free (d);
}
/* The high 16 bits of the IEEE 1394 address space are mapped to the request
* byte of USB control transfers. Only a discrete set addresses are
* currently supported, as mapped by this function. */
static int
address_to_request (uint64_t address)
{
switch (address >> 32) {
case 0xffff:
return 0x7f;
case 0xd000:
return 0x80;
case 0xd0001:
return 0x81;
}
dc1394_log_error("usb: Invalid high address %x for request",
address >> 32);
return -1;
}
#define REQUEST_TIMEOUT_MS 1000
static int
do_read (libusb_device_handle * handle, uint64_t address, uint32_t * quads,
int num_quads)
{
int request = address_to_request (address);
if (request < 0)
return -1;
unsigned char buf[num_quads*4];
/* IEEE 1394 address reads are mapped to USB control transfers as
* shown here. */
int ret = libusb_control_transfer (handle, 0xc0, request,
address & 0xffff, (address >> 16) & 0xffff,
buf, num_quads * 4, REQUEST_TIMEOUT_MS);
if (ret < 0)
return -1;
int i;
int ret_quads = (ret + 3) / 4;
/* Convert from little-endian to host-endian */
for (i = 0; i < ret_quads; i++) {
quads[i] = (buf[4*i+3] << 24) | (buf[4*i+2] << 16)
| (buf[4*i+1] << 8) | buf[4*i];
}
return ret_quads;
}
static int
do_write (libusb_device_handle * handle, uint64_t address,
const uint32_t * quads, int num_quads)
{
int request = address_to_request (address);
if (request < 0)
return -1;
unsigned char buf[num_quads*4];
int i;
/* Convert from host-endian to little-endian */
for (i = 0; i < num_quads; i++) {
buf[4*i] = quads[i] & 0xff;
buf[4*i+1] = (quads[i] >> 8) & 0xff;
buf[4*i+2] = (quads[i] >> 16) & 0xff;
buf[4*i+3] = (quads[i] >> 24) & 0xff;
}
/* IEEE 1394 address writes are mapped to USB control transfers as
* shown here. */
int ret = libusb_control_transfer (handle, 0x40, request,
address & 0xffff, (address >> 16) & 0xffff,
buf, num_quads * 4, REQUEST_TIMEOUT_MS);
if (ret < 0)
return -1;
return ret / 4;
}
static int
dc1394_usb_device_get_config_rom (platform_device_t * device,
uint32_t * quads, int * num_quads)
{
libusb_device_handle * handle;
if (libusb_open (device->dev, &handle) < 0) {
dc1394_log_warning ("usb: Failed to open device for config ROM");
return DC1394_FAILURE;
}
if (*num_quads > 256)
*num_quads = 256;
/* Read the config ROM one quad at a time because a read longer than
* the length of the ROM will fail. */
int i;
for (i = 0; i < *num_quads; i++) {
int ret = do_read (handle, CONFIG_ROM_BASE + 0x400 + 4*i,
quads + i, 1);
if (ret < 1)
break;
}
if (i == 0) {
dc1394_log_error ("usb: Failed to read config ROM");
libusb_close (handle);
return -1;
}
*num_quads = i;
libusb_close (handle);
return 0;
}
static platform_camera_t *
dc1394_usb_camera_new (platform_t * p, platform_device_t * device,
uint32_t unit_directory_offset)
{
libusb_device_handle * handle;
platform_camera_t * camera;
if (libusb_open (device->dev, &handle) < 0) {
dc1394_log_error ("usb: Failed to open device");
return NULL;
}
if (libusb_set_configuration (handle, 1) < 0) {
dc1394_log_error ("usb: Failed to set configuration 1 after open");
libusb_close (handle);
return NULL;
}
camera = calloc (1, sizeof (platform_camera_t));
camera->handle = handle;
return camera;
}
static void dc1394_usb_camera_free (platform_camera_t * cam)
{
libusb_close (cam->handle);
cam->handle = NULL;
free (cam);
}
static void
dc1394_usb_camera_set_parent (platform_camera_t * cam, dc1394camera_t * parent)
{
cam->camera = parent;
}
static dc1394error_t
dc1394_usb_camera_print_info (platform_camera_t * camera, FILE *fd)
{
libusb_device *dev = libusb_get_device (camera->handle);
struct libusb_device_descriptor desc;
libusb_get_device_descriptor (dev, &desc);
fprintf(fd,"------ Camera platform-specific information ------\n");
fprintf(fd,"USB Bus Number : %d\n",
libusb_get_bus_number (dev));
fprintf(fd,"USB Device Address : %d\n",
libusb_get_device_address (dev));
fprintf(fd,"Vendor ID : 0x%x\n",
desc.idVendor);
fprintf(fd,"Product ID : 0x%x\n",
desc.idProduct);
return DC1394_SUCCESS;
}
static dc1394error_t
dc1394_usb_camera_read (platform_camera_t * cam, uint64_t offset,
uint32_t * quads, int num_quads)
{
if (do_read (cam->handle, CONFIG_ROM_BASE + offset, quads,
num_quads) != num_quads)
return DC1394_FAILURE;
return DC1394_SUCCESS;
}
static dc1394error_t
dc1394_usb_camera_write (platform_camera_t * cam, uint64_t offset,
const uint32_t * quads, int num_quads)
{
if (do_write (cam->handle, CONFIG_ROM_BASE + offset, quads,
num_quads) != num_quads)
return DC1394_FAILURE;
return DC1394_SUCCESS;
}
static dc1394error_t
dc1394_usb_camera_get_node(platform_camera_t *cam, uint32_t *node,
uint32_t * generation)
{
/* Since node/generation doesn't really apply to USB, we instead
* put the device address in the "node" argument and "bus number"
* in the generation argument. */
if (node)
*node = libusb_get_device_address (libusb_get_device (cam->handle));
if (generation)
*generation = libusb_get_bus_number (libusb_get_device (cam->handle));
return DC1394_SUCCESS;
}
static dc1394error_t
dc1394_usb_reset_bus (platform_camera_t * cam)
{
int ret = libusb_reset_device (cam->handle);
if (ret == 0 || ret == LIBUSB_ERROR_NOT_FOUND)
return DC1394_SUCCESS;
return DC1394_FAILURE;
}
static platform_dispatch_t
usb_dispatch = {
.platform_new = dc1394_usb_new,
.platform_free = dc1394_usb_free,
.get_device_list = dc1394_usb_get_device_list,
.free_device_list = dc1394_usb_free_device_list,
.device_get_config_rom = dc1394_usb_device_get_config_rom,
.camera_new = dc1394_usb_camera_new,
.camera_free = dc1394_usb_camera_free,
.camera_set_parent = dc1394_usb_camera_set_parent,
.camera_print_info = dc1394_usb_camera_print_info,
.camera_get_node = dc1394_usb_camera_get_node,
.reset_bus = dc1394_usb_reset_bus,
.camera_read = dc1394_usb_camera_read,
.camera_write = dc1394_usb_camera_write,
.capture_setup = dc1394_usb_capture_setup,
.capture_stop = dc1394_usb_capture_stop,
.capture_dequeue = dc1394_usb_capture_dequeue,
.capture_enqueue = dc1394_usb_capture_enqueue,
.capture_get_fileno = dc1394_usb_capture_get_fileno,
.capture_is_frame_corrupt = dc1394_usb_capture_is_frame_corrupt,
#ifdef HAVE_MACOSX
.capture_set_callback = dc1394_usb_capture_set_callback,
.capture_schedule_with_runloop = dc1394_usb_capture_schedule_with_runloop,
#else
.capture_set_callback = NULL,
.capture_schedule_with_runloop = NULL,
#endif
};
void
dc1394_usb_init(dc1394_t * d)
{
register_platform (d, &usb_dispatch, "usb");
}
答案1
我解决这个问题的方法是要求项目所有者将版本更新到 2.2.3 并添加这些更改。
homebrew 使用 ruby 脚本编写配方,由于我看到 2.2.3 编辑发生得如此之近,homebrew 没有机会赶上。我只是修改了 rubylibdc1397.rb
配方文件(它们都位于 中/usr/local/Library/Formula/
)。新配方由 homebrew 人员添加,反过来,这些配方会在您自己的系统上使用 进行更新brew update
。
在里面libdc1397.rb
,我修改了 URL 部分以反映 2.2.3 的新位置。下面是文件的顶部。我只是用 2.2.3 替换了任何 2.2.2。
require "formula"
class Libdc1394 < Formula
homepage "http://damien.douxchamps.net/ieee1394/libdc1394/"
url "https://downloads.sourceforge.net/project/libdc1394/libdc1394-2/2.2.3/libdc1394-2.2.3.tar.gz"
#sha1 "13958c3cd0709565b5e4a9012dcf2a9b710264e2"
如上所示,我还注释掉了 sha1 加密哈希。sha1 哈希用作安全目的的“密钥”,并根据开源代码计算得出。由于代码已更改,必要的 sha1 哈希可能也已更改,因此我将其注释掉并跳过了开源人员使用的这个安全方面。我认为有一种方法可以重新计算新代码的 sha1 哈希,从而保持此安全功能,但我必须下次再学习。
我学到的另一件事是使用 Homebrew 公式中的参数来编译代码,而不会出现问题。之前,./configure
会出现很多错误和问题,但 Homebrew 运行顺利。查看 Homebrew 正在做什么,我能够传递参数./configure
以使其工作。
在里面libdc1397.rb
,我找到了以下代码,它为我提供了在./configure
、时使用的正确参数make
,以及make install
我自己对代码的修改。这样,将来我就不需要依赖新的“官方版本”了。
def install
system "./configure", "--disable-dependency-tracking",
"--prefix=#{prefix}",
”—-disable-examples",
"--disable-sdltest"
system "make install"
end
libdc1397
另外,关于如何正确安装 还有一件事。 ./configure
(homebrew
我认为)没有检测到libusb
,仍在安装但跳过了这个重要部分。您需要libusb
使用卸载,然后使用( )homebrew
重新安装。这对于通过 USB 执行 IEEE1397 的 PointGrey 相机至关重要。libusb
macports
sudo port libusb