summaryrefslogtreecommitdiffstats
path: root/vlc/build/vlc-1.0.3_dc1394_v2api.diff
diff options
context:
space:
mode:
author Eric Hameleers <alien@slackware.com>2009-12-10 00:10:24 +0000
committer Eric Hameleers <alien@slackware.com>2009-12-10 00:10:24 +0000
commitb5f9e8c8a8eeb3f2a1aa881cedf41668839d1fb7 (patch)
tree76aadb18a96476728245946c85d172f757b398a2 /vlc/build/vlc-1.0.3_dc1394_v2api.diff
parent6c7a11f602ff2bd1ad038c8991d9fd5942e148ab (diff)
downloadasb-b5f9e8c8a8eeb3f2a1aa881cedf41668839d1fb7.tar.gz
asb-b5f9e8c8a8eeb3f2a1aa881cedf41668839d1fb7.tar.xz
Initial revision
Diffstat (limited to 'vlc/build/vlc-1.0.3_dc1394_v2api.diff')
-rw-r--r--vlc/build/vlc-1.0.3_dc1394_v2api.diff1486
1 files changed, 1486 insertions, 0 deletions
diff --git a/vlc/build/vlc-1.0.3_dc1394_v2api.diff b/vlc/build/vlc-1.0.3_dc1394_v2api.diff
new file mode 100644
index 00000000..3b71723e
--- /dev/null
+++ b/vlc/build/vlc-1.0.3_dc1394_v2api.diff
@@ -0,0 +1,1486 @@
+From: Jean-Paul Saman <jean-paul.saman@m2x.nl>
+Date: Mon, 27 Apr 2009 10:40:50 +0000 (+0200)
+Subject: Use pkg-config to detect libraw1394 and libavc1394
+X-Git-Url: http://git.videolan.org/?p=vlc.git;a=commitdiff_plain;h=9f0d65737e7d810205b25cbb40f0eac4c758b951
+
+Use pkg-config to detect libraw1394 and libavc1394
+---
+
+diff --git a/configure.ac b/configure.ac
+index 17c1f63..1ec11f8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2055,120 +2055,29 @@ AC_ARG_ENABLE(dv,
+ [ --enable-dv dv input module (default disabled)])
+ if test "${enable_dv}" = "yes"
+ then
+- AC_ARG_WITH(dv-raw1394,
+- [ --with-dv-raw1394=PATH libraw1394 headers and libraries])
+- AC_ARG_WITH(dv-raw1394-tree,
+- [ --with-dv-raw1394=PATH libraw1394 tree for static linking])
+-
+- if test -z "${with_dv_raw1394}" -a "${with_dv_raw1394}" != ""
+- then
+- AC_MSG_CHECKING(for raw1394 headers in ${with_dv_raw1394})
+- if test -f ${with_dv_raw1394}/include/libraw1394/raw1394.h
+- then
+- dnl Use ${with_dv_raw1394}/include/libraw1394/raw1394.h
+- AC_MSG_RESULT(yes)
+- VLC_ADD_PLUGIN([access_dv])
+- VLC_ADD_LIBS([access_dv],[-L${with_dv_raw1394}/lib -lraw1394 -lpthread])
+- VLC_ADD_CPPFLAGS([access_dv],[-I${with_dv_raw1394}/include])
+- else
+- dnl No libraw1394 could be found, sorry
+- AC_MSG_RESULT(no)
+- AC_MSG_ERROR([cannot find ${with_dv_raw1394}/include/libraw1394/raw1394.h])
+- fi
+- else
+- AC_CHECK_HEADERS(libraw1394/raw1394.h,
+- [ VLC_ADD_PLUGIN([access_dv])
+- VLC_ADD_LIBS([access_dv],[-lraw1394 -lavc1394])
+- ],[
+- if test -n "${enable_dv}"
+- then
+- AC_MSG_ERROR([cannot find libraw1394 headers])
+- fi
+- ])
+- fi
+-
+- dnl Check for static linking of libraw1394
+- if test -z "${with_dv_raw1394_tree}" -a "${with_dv_raw1394_tree}" != ""
+- then
+- AC_MSG_CHECKING(for libraw1394.a in ${with_dv_raw1394_tree})
+- real_dv_raw1394_tree="`cd ${with_dv_raw1394_tree} 2>/dev/null && pwd`"
+- if test -z "${real_dv_raw1394_tree}"
+- then
+- dnl The given directory can't be found
+- AC_MSG_RESULT(no)
+- AC_MSG_ERROR([cannot cd to ${real_dv_raw1394_tree}])
+- fi
+- if test -f "${real_dv_raw1394_tree}/src/.libs/libraw1394.a"
+- then
+- dnl Use a custom libraw1394
+- AC_MSG_RESULT(${real_dv_raw1394_tree}/src/.libs/libraw1394.a)
++ dnl
++ dnl Check for libraw1394
++ dnl
++ PKG_CHECK_MODULES(LIBRAW1394, libraw1394 >= 2.0.1,
++ [
+ VLC_ADD_PLUGIN([access_dv])
+- VLC_ADD_LIBS([access_dv],[-L${real_dv_raw1394_tree}/src/.libs -lraw1394])
+- VLC_ADD_CPPFLAGS([access_dv],[-I${real_dv_raw1394_tree}])
+- else
+- dnl The given libraw1394 wasn't built
+- AC_MSG_RESULT(no)
+- AC_MSG_ERROR([cannot find ${real_dv_raw1394_tree}/src/.libs/libraw1394.a, make sure you compiled libraw1394 in ${with_dv_raw1394_tree}])
+- fi
+- fi
++ VLC_ADD_LIBS([access_dv],[`${PKG_CONFIG} --libs libraw1394`])
++ VLC_ADD_CPPFLAGS([access_dv],[`${PKG_CONFIG} --cflags libraw1394`])
++ ],
++ [AC_MSG_ERROR([Couldn't find libraw1394 >= 2.0.1, install libraw1394 development package ?])]
++ )
+
+ dnl
+ dnl Check for libavc1394
+ dnl
+-
+- AC_ARG_WITH(dv-avc1394,
+- [ --with-dv-avc1394=PATH libavc1394 headers and libraries])
+- AC_ARG_WITH(dv-avc1394-tree,
+- [ --with-dv-avc1394=PATH libavc1394 tree for static linking])
+-
+- if test -z "${with_dv_avc1394}" -a "${with_dv_avc1394}" != ""
+- then
+- AC_MSG_CHECKING(for avc1394 headers in ${with_dv_avc1394})
+- if test -f ${with_dv_avc1394}/include/libavc1394/avc1394.h
+- then
+- dnl Use ${with_dv_avc1394}/include/libavc1394/avc1394.h
+- AC_MSG_RESULT(yes)
+- VLC_ADD_LIBS([access_dv],[-L${with_dv_avc1394}/lib -lavc1394 -lrom1394 -lpthread])
+- VLC_ADD_CPPFLAGS([access_dv],[-I${with_avc1394}/include])
+- else
+- dnl No libavc1394 could be found, sorry
+- AC_MSG_RESULT(no)
+- AC_MSG_ERROR([cannot find ${with_dv_avc1394}/include/libavc1394/avc1394.h])
+- fi
+- else
+- AC_CHECK_HEADERS(libavc1394/avc1394.h,
+- [ VLC_ADD_LIBS([access_dv],[-lavc1394 -lrom1394 -lpthread])
+- ],[
+- if test -n "${enable_dv}"
+- then
+- AC_MSG_ERROR([cannot find libavc1394 headers])
+- fi
+- ])
+- fi
+-
+- dnl Check for static linking of libavc1394
+- if test -z "${with_dv_avc1394_tree}" -a "${with_dv_avc1394_tree}" != ""
+- then
+- AC_MSG_CHECKING(for libavc1394.a in ${with_dv_avc1394_tree})
+- real_dv_avc1394_tree="`cd ${with_dv_avc1394_tree} 2>/dev/null && pwd`"
+- if test -z "${real_dv_avc1394_tree}"
+- then
+- dnl The given directory can't be found
+- AC_MSG_RESULT(no)
+- AC_MSG_ERROR([cannot cd to ${real_dv_avc1394_tree}])
+- fi
+- if test -f "${real_dv_avc1394_tree}/src/.libs/libavc1394.a"
+- then
+- dnl Use a custom libavc1394
+- AC_MSG_RESULT(${real_dv_avc1394_tree}/src/.libs/libavc1394.a)
+- VLC_ADD_LIBS([access_dv],[-L${real_dv_avc1394_tree}/src/.libs -lavc1394 -lrom1394 -lpthread])
+- VLC_ADD_CPPFLAGS([access_dv],[-I${real_dv_avc1394_tree}])
+- else
+- dnl The given libavc1394 wasn't built
+- AC_MSG_RESULT(no)
+- AC_MSG_ERROR([cannot find ${real_dv_avc1394_tree}/src/.libs/libavc1394.a, make sure you compiled libavc1394 in ${with_dv_avc1394_tree}])
+- fi
+- fi
++ PKG_CHECK_MODULES(LIBAVC1394, libavc1394 >= 0.5.3,
++ [
++ VLC_ADD_PLUGIN([access_dv])
++ VLC_ADD_LIBS([access_dv],[`${PKG_CONFIG} --libs libavc1394`])
++ VLC_ADD_CPPFLAGS([access_dv],[`${PKG_CONFIG} --cflags libavc1394`])
++ ],
++ [AC_MSG_ERROR([Couldn't find libavc1394 >= 0.5.1, install libavc1394 development package ?])]
++ )
+ fi
+
+ dnl
+
+From: Jean-Paul Saman <jean-paul.saman@m2x.nl>
+Date: Tue, 12 May 2009 11:20:37 +0000 (+0200)
+Subject: dc1394 and dv1394: cleanup detection in configure.ac
+X-Git-Url: http://git.videolan.org/?p=vlc.git;a=commitdiff_plain;h=d6cc0b79ef3c7f15df5ef524b76bbbafe01e84eb
+
+dc1394 and dv1394: cleanup detection in configure.ac
+---
+
+diff --git a/configure.ac b/configure.ac
+index 1ec11f8..41dc3c2 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2024,28 +2024,28 @@ AC_ARG_ENABLE(dc1394,
+ [ --enable-dc1394 dc1394 access module (default disabled)])
+ if test "${enable_dc1394}" = "yes"
+ then
+- AC_CHECK_HEADERS(libraw1394/raw1394.h, [
+- AC_CHECK_LIB( raw1394, raw1394_get_nodecount, [
+- AC_CHECK_HEADERS(libdc1394/dc1394_control.h , [
+-dnl AC_CHECK_LIB( dc1394_control, dc1394_setup_capture, [
+- VLC_ADD_PLUGIN([dc1394])
+- VLC_ADD_LIBS([dc1394],[-ldc1394_control -lraw1394])
+-dnl ],
+-dnl [
+-dnl AC_MSG_ERROR([libdc1394 is mandatory for the dc1394 input module. try --disable-dc1394 or install this library])
+-dnl ])
+- ],
+- [
+- AC_MSG_ERROR([libdc1394 is mandatory for the dc1394 input module. try --disable-dc1394 or install this library])
+- ])
++ dnl
++ dnl Check for libraw1394
++ dnl
++ PKG_CHECK_MODULES(LIBRAW1394, libraw1394 >= 2.0.1,
++ [
++ VLC_ADD_LIBS([dc1394],[`${PKG_CONFIG} --libs libraw1394`])
++ VLC_ADD_CPPFLAGS([dc1394],[`${PKG_CONFIG} --cflags libraw1394`])
+ ],
++ [AC_MSG_ERROR([Couldn't find libraw1394 >= 2.0.1, install libraw1394 development package])]
++ )
++
++ dnl
++ dnl Check for libdc1394
++ dnl
++ PKG_CHECK_MODULES(LIBDC1394, libdc1394-2 >= 2.0.2,
+ [
+- AC_MSG_ERROR([libraw1394 is mandatory for the dc1394 input module. try --disable-dc1394 or install this library])
+- ])
+- ],
+- [
+- AC_MSG_ERROR([libraw1394 is mandatory for the dc1394 input module. try --disable-dc1394 or install this library])
+- ])
++ VLC_ADD_PLUGIN([dc1394])
++ VLC_ADD_LIBS([dc1394],[`${PKG_CONFIG} --libs libdc1394-2`])
++ VLC_ADD_CPPFLAGS([access_dv],[`${PKG_CONFIG} --cflags libdc1394-2`])
++ ],
++ [AC_MSG_ERROR([Couldn't find libdc1394 >= 2.0.2, install libdc1394 development package])]
++ )
+ fi
+
+ dnl
+@@ -2060,11 +2060,10 @@ then
+ dnl
+ PKG_CHECK_MODULES(LIBRAW1394, libraw1394 >= 2.0.1,
+ [
+- VLC_ADD_PLUGIN([access_dv])
+ VLC_ADD_LIBS([access_dv],[`${PKG_CONFIG} --libs libraw1394`])
+ VLC_ADD_CPPFLAGS([access_dv],[`${PKG_CONFIG} --cflags libraw1394`])
+ ],
+- [AC_MSG_ERROR([Couldn't find libraw1394 >= 2.0.1, install libraw1394 development package ?])]
++ [AC_MSG_ERROR([Couldn't find libraw1394 >= 2.0.1, install libraw1394 development package])]
+ )
+
+ dnl
+@@ -2076,7 +2075,7 @@ then
+ VLC_ADD_LIBS([access_dv],[`${PKG_CONFIG} --libs libavc1394`])
+ VLC_ADD_CPPFLAGS([access_dv],[`${PKG_CONFIG} --cflags libavc1394`])
+ ],
+- [AC_MSG_ERROR([Couldn't find libavc1394 >= 0.5.1, install libavc1394 development package ?])]
++ [AC_MSG_ERROR([Couldn't find libavc1394 >= 0.5.1, install libavc1394 development package])]
+ )
+ fi
+
+
+From: Jean-Baptiste Kempf <jb@videolan.org>
+Date: Wed, 5 Aug 2009 19:28:49 +0000 (+0200)
+Subject: Simplify dc1394 and dv detection.
+X-Git-Url: http://git.videolan.org/gitweb.cgi?p=vlc.git;a=commitdiff_plain;h=314bd6d6494fe9b9b948532595bf081be49a46ac;hp=d9f8dcc6bedcc6526642715fc64884c58116587c
+
+Simplify dc1394 and dv detection.
+
+Be careful, while dv was updated to the new APIs, dc1394 wasn't
+---
+
+diff --git a/configure.ac b/configure.ac
+index 9a1cafd..4d628e6 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1931,66 +1931,11 @@ lternatively you can use --disable-live555 to disable the liveMedia plugin.])
+ fi
+
+ dnl
+-dnl special access module for dc1394 input
++dnl - special access module for dc1394 input
++dnl - dv module: digital video module check for libraw1394
+ dnl
+-AC_ARG_ENABLE(dc1394,
+- [ --enable-dc1394 dc1394 access module (default disabled)])
+-if test "${enable_dc1394}" = "yes"
+-then
+- dnl
+- dnl Check for libraw1394
+- dnl
+- PKG_CHECK_MODULES(LIBRAW1394, libraw1394 >= 2.0.1,
+- [
+- VLC_ADD_LIBS([dc1394],[`${PKG_CONFIG} --libs libraw1394`])
+- VLC_ADD_CPPFLAGS([dc1394],[`${PKG_CONFIG} --cflags libraw1394`])
+- ],
+- [AC_MSG_ERROR([Couldn't find libraw1394 >= 2.0.1, install libraw1394 development package])]
+- )
+-
+- dnl
+- dnl Check for libdc1394
+- dnl
+- PKG_CHECK_MODULES(LIBDC1394, libdc1394-2 >= 2.0.2,
+- [
+- VLC_ADD_PLUGIN([dc1394])
+- VLC_ADD_LIBS([dc1394],[`${PKG_CONFIG} --libs libdc1394-2`])
+- VLC_ADD_CPPFLAGS([access_dv],[`${PKG_CONFIG} --cflags libdc1394-2`])
+- ],
+- [AC_MSG_ERROR([Couldn't find libdc1394 >= 2.0.2, install libdc1394 development package])]
+- )
+-fi
+-
+-dnl
+-dnl dv module: digital video module check for libraw1394
+-dnl
+-AC_ARG_ENABLE(dv,
+-[ --enable-dv dv input module (default disabled)])
+-if test "${enable_dv}" = "yes"
+-then
+- dnl
+- dnl Check for libraw1394
+- dnl
+- PKG_CHECK_MODULES(LIBRAW1394, libraw1394 >= 2.0.1,
+- [
+- VLC_ADD_LIBS([access_dv],[`${PKG_CONFIG} --libs libraw1394`])
+- VLC_ADD_CPPFLAGS([access_dv],[`${PKG_CONFIG} --cflags libraw1394`])
+- ],
+- [AC_MSG_ERROR([Couldn't find libraw1394 >= 2.0.1, install libraw1394 development package])]
+- )
+-
+- dnl
+- dnl Check for libavc1394
+- dnl
+- PKG_CHECK_MODULES(LIBAVC1394, libavc1394 >= 0.5.3,
+- [
+- VLC_ADD_PLUGIN([access_dv])
+- VLC_ADD_LIBS([access_dv],[`${PKG_CONFIG} --libs libavc1394`])
+- VLC_ADD_CPPFLAGS([access_dv],[`${PKG_CONFIG} --cflags libavc1394`])
+- ],
+- [AC_MSG_ERROR([Couldn't find libavc1394 >= 0.5.1, install libavc1394 development package])]
+- )
+-fi
++PKG_ENABLE_MODULES_VLC([dc1394], [libraw1394 >= 2.0.1 libdc1394 >= 1.0.0], [dc1394 access module], [auto])
++PKG_ENABLE_MODULES_VLC([access_dv], [libraw1394 >= 2.0.1 libavc1394 >= 0.5.3], [DV input module], [auto])
+
+ dnl
+ dnl dvdread module: check for libdvdread
+
+From: Rmi Denis-Courmont <remi@remlab.net>
+Date: Sat, 17 Oct 2009 20:28:29 +0000 (+0300)
+Subject: dc1394: path coming from MRL, need utf8_open()
+X-Git-Url: http://git.videolan.org/?p=vlc.git;a=commitdiff_plain;h=1188e4a5d039711c0afa64b532578e4c65c34ab4
+
+dc1394: path coming from MRL, need utf8_open()
+---
+
+diff --git a/modules/access/dc1394.c b/modules/access/dc1394.c
+index 5d2607a..0c174c6 100644
+--- a/modules/access/dc1394.c
++++ b/modules/access/dc1394.c
+@@ -34,7 +34,7 @@
+ #include <vlc_plugin.h>
+ #include <vlc_input.h>
+ #include <vlc_demux.h>
+-
++#include <vlc_charset.h>
+
+ #ifdef HAVE_FCNTL_H
+ # include <fcntl.h>
+@@ -545,7 +545,7 @@ static void OpenAudioDev( demux_t *p_demux )
+ int i_format = AFMT_S16_LE;
+ int result;
+
+- p_sys->fd_audio = open( psz_device, O_RDONLY | O_NONBLOCK );
++ p_sys->fd_audio = utf8_open( psz_device, O_RDONLY | O_NONBLOCK );
+ if( p_sys->fd_audio < 0 )
+ {
+ msg_Err( p_demux, "cannot open audio device (%s)", psz_device );
+
+From: Jean-Baptiste Kempf <jb@videolan.org>
+Date: Tue, 10 Nov 2009 10:00:01 +0000 (+0100)
+Subject: dc1394: update to v2 API
+X-Git-Url: http://git.videolan.org/?p=vlc.git;a=commitdiff_plain;h=577ce5a67c51c812f7ad97bf3e7f7f38913b72d3
+
+dc1394: update to v2 API
+
+This patch needs more testing, I think.
+---
+
+diff --git a/NEWS b/NEWS
+index fb00eba..1c8ae04 100644
+--- a/NEWS
++++ b/NEWS
+@@ -5,6 +5,7 @@ Access:
+ * Port of the screen module from Xlib to XCB
+ * Support for the sftp protocol
+ * Support for CDDB servers for Audio-CD on Windows version
++ * Port of the dc1394 module from libdc1394 to libdc1394 v2.0
+
+ Decoders:
+ * Support for Atrac1
+diff --git a/configure.ac b/configure.ac
+index e24c595..5762485 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2041,7 +2041,7 @@ dnl
+ dnl - special access module for dc1394 input
+ dnl - dv module: digital video module check for libraw1394
+ dnl
+-PKG_ENABLE_MODULES_VLC([DC1394], [], [libraw1394 >= 2.0.1 libdc1394 >= 1.0.0], [dc1394 access module], [auto])
++PKG_ENABLE_MODULES_VLC([DC1394], [], [libraw1394 >= 2.0.1 libdc1394-2 >= 2.1.0], [dc1394 access module], [auto])
+ PKG_ENABLE_MODULES_VLC([DV], [access_dv], [libraw1394 >= 2.0.1 libavc1394 >= 0.5.3], [DV input module], [auto])
+
+ dnl
+diff --git a/modules/access/dc1394.c b/modules/access/dc1394.c
+index 0c174c6..75a1146 100644
+--- a/modules/access/dc1394.c
++++ b/modules/access/dc1394.c
+@@ -1,9 +1,11 @@
+ /*****************************************************************************
+ * dc1394.c: firewire input module
+ *****************************************************************************
+- * Copyright (C) 2006 the VideoLAN team
++ * Copyright (C) 2006-2009 VideoLAN
+ *
+ * Authors: Xant Majere <xant@xant.net>
++ * Rob Shortt <rob@tvcentric.com> - libdc1394 V2 API updates
++ * Frederic Benoist <fridorik@gmail.com> - updates from Rob's work
+ *
+ *****************************************************************************
+ * This library is free software; you can redistribute it and/or
+@@ -35,6 +37,7 @@
+ #include <vlc_input.h>
+ #include <vlc_demux.h>
+ #include <vlc_charset.h>
++#include <vlc_picture.h>
+
+ #ifdef HAVE_FCNTL_H
+ # include <fcntl.h>
+@@ -49,7 +52,7 @@
+ #include <sys/soundcard.h>
+
+ #include <libraw1394/raw1394.h>
+-#include <libdc1394/dc1394_control.h>
++#include <dc1394/dc1394.h>
+
+ #define MAX_IEEE1394_HOSTS 32
+ #define MAX_CAMERA_NODES 32
+@@ -69,39 +72,31 @@ vlc_module_begin ()
+ set_callbacks( Open, Close )
+ vlc_module_end ()
+
+-typedef struct __dc_camera
++struct demux_sys_t
+ {
+- int port;
+- nodeid_t node;
+- u_int64_t uid;
+-} dc_camera;
+-
+-typedef struct demux_sys_t
+-{
+- dc1394_cameracapture camera;
+- picture_t pic;
+- int dma_capture;
+-#define DMA_OFF 0
+-#define DMA_ON 1
+- int num_ports;
+- int num_cameras;
++ /* camera info */
++ dc1394_t *p_dccontext;
++ uint32_t num_cameras;
++ dc1394camera_t *camera;
+ int selected_camera;
+- u_int64_t selected_uid;
+-
+- dc_camera *camera_nodes;
+- dc1394_camerainfo camera_info;
+- dc1394_miscinfo misc_info;
+- raw1394handle_t fd_video;
++ uint64_t selected_uid;
++ picture_t pic;
++ uint32_t dma_buffers;
++ dc1394featureset_t features;
+ quadlet_t supported_framerates;
++ bool reset_bus;
+
++ /* video info */
++ char *video_device;
++ dc1394video_mode_t video_mode;
+ int width;
+ int height;
+ int frame_size;
+ int frame_rate;
+ unsigned int brightness;
+ unsigned int focus;
+- char *dma_device;
+ es_out_id_t *p_es_video;
++ dc1394video_frame_t *frame;
+
+ /* audio stuff */
+ int i_sample_rate;
+@@ -113,7 +108,7 @@ typedef struct demux_sys_t
+ #define ROTATION_LEFT 1
+ #define ROTATION_RIGHT 2
+ es_out_id_t *p_es_audio;
+-} dc1394_sys;
++};
+
+ /*****************************************************************************
+ * Local prototypes
+@@ -125,82 +120,84 @@ static block_t *GrabAudio( demux_t *p_demux );
+ static int process_options( demux_t *p_demux);
+
+ /*****************************************************************************
+- * ScanCameras
++ * FindCameras
+ *****************************************************************************/
+-static void ScanCameras( dc1394_sys *sys, demux_t *p_demux )
++static int FindCamera( demux_sys_t *sys, demux_t *p_demux )
+ {
+- struct raw1394_portinfo portinfo[MAX_IEEE1394_HOSTS];
+- raw1394handle_t tempFd;
+- dc1394_camerainfo info;
+- dc_camera *node_list = NULL;
+- nodeid_t *nodes = NULL;
+- int num_ports = 0;
+- int num_cameras = 0;
+- int nodecount;
+- int i, n;
+-
+- memset( &portinfo, 0, sizeof(portinfo) );
++ dc1394camera_list_t *list;
+
+ msg_Dbg( p_demux, "Scanning for ieee1394 ports ..." );
+
+- tempFd = raw1394_new_handle();
+- if( !tempFd )
++ if( dc1394_camera_enumerate (sys->p_dccontext, &list) != DC1394_SUCCESS )
++ {
++ msg_Err(p_demux, "Can not ennumerate cameras");
++ dc1394_camera_free_list (list);
++ dc1394_free( sys->p_dccontext );
++ free( sys );
++ p_demux->p_sys = NULL;
+ return VLC_EGENERIC;
+- raw1394_get_port_info( tempFd, portinfo, MAX_IEEE1394_HOSTS);
+- raw1394_destroy_handle( tempFd );
+-
+- for( i=0; i < MAX_IEEE1394_HOSTS; i++ )
+- {
+- /* check if port exists and has at least one node*/
+- if( !portinfo[i].nodes )
+- continue;
+- nodes = NULL;
+- nodecount = 0;
+- tempFd = dc1394_create_handle( i );
+-
+- /* skip this port if we can't obtain a valid handle */
+- if( !tempFd )
+- continue;
+- msg_Dbg( p_demux, "Found ieee1394 port %d (%s) ... "
+- "checking for camera nodes",
+- i, portinfo[i].name );
+- num_ports++;
+-
+- nodes = dc1394_get_camera_nodes( tempFd, &nodecount, 0 );
+- if( nodecount )
+- {
+- msg_Dbg( p_demux, "Found %d dc1394 cameras on port %d (%s)",
+- nodecount, i, portinfo[i].name );
++ }
+
+- if( node_list )
+- node_list = realloc( node_list, sizeof(dc_camera) * (num_cameras+nodecount) );
+- else
+- node_list = malloc( sizeof(dc_camera) * nodecount);
++ if( list->num == 0 )
++ {
++ msg_Err(p_demux, "Can not find cameras");
++ dc1394_camera_free_list (list);
++ dc1394_free( sys->p_dccontext );
++ free( sys );
++ p_demux->p_sys = NULL;
++ return VLC_EGENERIC;
++ }
++
++ sys->num_cameras = list->num;
++ msg_Dbg( p_demux, "Found %d dc1394 cameras.", list->num);
+
+- for( n = 0; n < nodecount; n++ )
++ if( sys->selected_uid )
++ {
++ int found = 0;
++ for( unsigned i = 0; i < sys->num_cameras; i++ )
++ {
++ if( list->ids[i].guid == sys->selected_uid )
+ {
+- int result = 0;
+-
+- result = dc1394_get_camera_info( tempFd, nodes[n], &info );
+- if( result == DC1394_SUCCESS )
+- {
+- node_list[num_cameras+n].uid = info.euid_64;
+- }
+- node_list[num_cameras+n].node = nodes[n];
+- node_list[num_cameras+n].port = i;
++ sys->camera = dc1394_camera_new(sys->p_dccontext,
++ list->ids[i].guid);
++ found++;
++ break;
+ }
+- num_cameras += nodecount;
+ }
+- else
+- msg_Dbg( p_demux, "no cameras found on port %d (%s)",
+- i, portinfo[i].name );
+-
+- if( tempFd )
+- dc1394_destroy_handle( tempFd );
++ if( !found )
++ {
++ msg_Err( p_demux, "Can't find camera with uid : 0x%llx.",
++ sys->selected_uid );
++ dc1394_camera_free_list (list);
++ dc1394_free( sys->p_dccontext );
++ free( sys );
++ p_demux->p_sys = NULL;
++ return VLC_EGENERIC;
++ }
++ }
++ else if( sys->selected_camera >= (int)list->num )
++ {
++ msg_Err( p_demux, "There are not this many cameras. (%d/%d)",
++ sys->selected_camera, sys->num_cameras );
++ dc1394_camera_free_list (list);
++ dc1394_free( sys->p_dccontext );
++ free( sys );
++ p_demux->p_sys = NULL;
++ return VLC_EGENERIC;
++ }
++ else if( sys->selected_camera >= 0 )
++ {
++ sys->camera = dc1394_camera_new(sys->p_dccontext,
++ list->ids[sys->selected_camera].guid);
++ }
++ else
++ {
++ sys->camera = dc1394_camera_new(sys->p_dccontext,
++ list->ids[0].guid);
+ }
+- sys->num_ports = num_ports;
+- sys->num_cameras = num_cameras;
+- sys->camera_nodes = node_list;
++
++ dc1394_camera_free_list (list);
++ return VLC_SUCCESS;
+ }
+
+ /*****************************************************************************
+@@ -208,13 +205,12 @@ static void ScanCameras( dc1394_sys *sys, demux_t *p_demux )
+ *****************************************************************************/
+ static int Open( vlc_object_t *p_this )
+ {
+- demux_t *p_demux = (demux_t*)p_this;
+- demux_sys_t *p_sys;
+- es_format_t fmt;
+- int i;
+- int i_width;
+- int i_height;
+- int result = 0;
++ demux_t *p_demux = (demux_t*)p_this;
++ demux_sys_t *p_sys;
++ es_format_t fmt;
++ dc1394error_t res;
++ int i_width;
++ int i_height;
+
+ if( strncmp(p_demux->psz_access, "dc1394", 6) != 0 )
+ return VLC_EGENERIC;
+@@ -229,22 +225,22 @@ static int Open( vlc_object_t *p_this )
+ p_demux->p_sys = p_sys = calloc( 1, sizeof( demux_sys_t ) );
+ if( !p_sys )
+ return VLC_ENOMEM;
++
+ memset( &fmt, 0, sizeof( es_format_t ) );
+
+ /* DEFAULTS */
+- p_sys->frame_size = MODE_640x480_YUV422;
+- p_sys->width = 640;
+- p_sys->height = 480;
+- p_sys->frame_rate = FRAMERATE_30;
+- p_sys->brightness = 200;
+- p_sys->focus = 0;
+- p_sys->dma_capture = DMA_ON; /* defaults to VIDEO1394 capture mode */
+- p_sys->fd_audio = -1;
+- p_sys->fd_video = NULL;
+- p_sys->camera_nodes = NULL;
+- p_sys->selected_camera = 0;
+- p_sys->dma_device = NULL;
+- p_sys->selected_uid = 0;
++ p_sys->video_mode = DC1394_VIDEO_MODE_640x480_YUV422;
++ p_sys->width = 640;
++ p_sys->height = 480;
++ p_sys->frame_rate = DC1394_FRAMERATE_15;
++ p_sys->brightness = 200;
++ p_sys->focus = 0;
++ p_sys->fd_audio = -1;
++ p_sys->p_dccontext = NULL;
++ p_sys->camera = NULL;
++ p_sys->selected_camera = -1;
++ p_sys->dma_buffers = 1;
++ p_sys->reset_bus = 0;
+
+ /* PROCESS INPUT OPTIONS */
+ if( process_options(p_demux) != VLC_SUCCESS )
+@@ -257,223 +253,145 @@ static int Open( vlc_object_t *p_this )
+ return VLC_EGENERIC;
+ }
+
+- msg_Dbg( p_demux, "Selected camera %d", p_sys->selected_camera );
+- msg_Dbg( p_demux, "Selected uid 0x%llx", p_sys->selected_uid );
++ p_sys->p_dccontext = dc1394_new();
++ if( !p_sys->p_dccontext )
++ {
++ msg_Err( p_demux, "Failed to initialise libdc1394");
++ free(p_demux->p_sys);
++ p_demux->p_sys = NULL;
++ return VLC_EGENERIC;
++ }
++
++ if( FindCamera( p_sys, p_demux ) != VLC_SUCCESS )
++ return VLC_EGENERIC;
+
+- ScanCameras( p_sys, p_demux );
+- if( !p_sys->camera_nodes )
++ if( !p_sys->camera )
+ {
+ msg_Err( p_demux, "No camera found !!" );
++ dc1394_free( p_sys->p_dccontext );
+ free( p_sys );
+ p_demux->p_sys = NULL;
+ return VLC_EGENERIC;
+ }
+
+- if( p_sys->selected_uid )
++ if( p_sys->reset_bus )
+ {
+- int found = 0;
+- for( i=0; i < p_sys->num_cameras; i++ )
++ if( dc1394_reset_bus( p_sys->camera ) != DC1394_SUCCESS )
+ {
+- if( p_sys->camera_nodes[i].uid == p_sys->selected_uid )
+- {
+- p_sys->selected_camera = i;
+- found++;
+- break;
+- }
+- }
+- if( !found )
+- {
+- msg_Err( p_demux, "Can't find camera with uid : 0x%llx.",
+- p_sys->selected_uid );
++ msg_Err( p_demux, "Unable to reset IEEE 1394 bus");
+ Close( p_this );
+ return VLC_EGENERIC;
+ }
+- }
+- else if( p_sys->selected_camera >= p_sys->num_cameras )
+- {
+- msg_Err( p_demux, "there are not this many cameras. (%d/%d)",
+- p_sys->selected_camera, p_sys->num_cameras );
+- Close( p_this );
+- return VLC_EGENERIC;
++ else msg_Dbg( p_demux, "Successfully reset IEEE 1394 bus");
+ }
+
+- p_sys->fd_video = dc1394_create_handle(
+- p_sys->camera_nodes[p_sys->selected_camera].port );
+- if( (int)p_sys->fd_video < 0 )
++ if( dc1394_camera_reset( p_sys->camera ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux, "Can't init dc1394 handle" );
++ msg_Err( p_demux, "Unable to reset camera");
+ Close( p_this );
+ return VLC_EGENERIC;
+ }
+
+- /* get camera info */
+- result = dc1394_get_camera_info( p_sys->fd_video,
+- p_sys->camera_nodes[p_sys->selected_camera].node,
+- &p_sys->camera_info );
+- if( result != DC1394_SUCCESS )
++ if( dc1394_camera_print_info( p_sys->camera,
++ stderr ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux ,"unable to get camera info" );
++ msg_Err( p_demux, "Unable to print camera info");
+ Close( p_this );
+ return VLC_EGENERIC;
+ }
+
+- dc1394_print_camera_info( &p_sys->camera_info );
+- result = dc1394_get_camera_misc_info( p_sys->fd_video,
+- p_sys->camera_nodes[p_sys->selected_camera].node,
+- &p_sys->misc_info );
+- if( result != DC1394_SUCCESS )
++ if( dc1394_feature_get_all( p_sys->camera,
++ &p_sys->features ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux, "unable to get camera misc info" );
++ msg_Err( p_demux, "Unable to get feature set");
+ Close( p_this );
+ return VLC_EGENERIC;
+ }
++ // TODO: only print features if verbosity increased
++ dc1394_feature_print_all(&p_sys->features, stderr);
+
+- /* init camera and set some video options */
+- result = dc1394_init_camera( p_sys->camera_info.handle,
+- p_sys->camera_info.id );
+- if( result != DC1394_SUCCESS )
++#if 0 //"Note that you need to execute this function only if you use exotic video1394 device names. /dev/video1394, /dev/video1394/* and /dev/video1394-* are automatically recognized." http://damien.douxchamps.net/ieee1394/libdc1394/v2.x/api/capture/
++ if( p_sys->video_device )
+ {
+- msg_Err( p_demux, "unable to get init dc1394 camera" );
+- Close( p_this );
+- return VLC_EGENERIC;
++ if( dc1394_capture_set_device_filename( p_sys->camera,
++ p_sys->video_device ) != DC1394_SUCCESS )
++ {
++ msg_Err( p_demux, "Unable to set video device");
++ Close( p_this );
++ return VLC_EGENERIC;
++ }
+ }
++#endif
+
+ if( p_sys->focus )
+ {
+- result = dc1394_set_focus( p_sys->camera_info.handle,
+- p_sys->camera_nodes[p_sys->selected_camera].node,
+- p_sys->focus );
+- if( result != DC1394_SUCCESS )
++ if( dc1394_feature_set_value( p_sys->camera,
++ DC1394_FEATURE_FOCUS,
++ p_sys->focus ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux, "unable to set initial focus to %u",
++ msg_Err( p_demux, "Unable to set initial focus to %u",
+ p_sys->focus );
+ }
+ msg_Dbg( p_demux, "Initial focus set to %u", p_sys->focus );
+ }
+
+- result = dc1394_set_brightness( p_sys->camera_info.handle,
+- p_sys->camera_nodes[p_sys->selected_camera].node,
+- p_sys->brightness );
+- if( result != DC1394_SUCCESS )
+- {
+- msg_Err( p_demux, "unable to set init brightness to %d",
+- p_sys->brightness);
+- Close( p_this );
+- return VLC_EGENERIC;
+- }
+-
+- result = dc1394_set_video_framerate( p_sys->camera_info.handle,
+- p_sys->camera_nodes[p_sys->selected_camera].node,
+- p_sys->frame_rate );
+- if( result != DC1394_SUCCESS )
+- {
+- msg_Err( p_demux, "unable to set framerate to %d",
+- p_sys->frame_rate );
+- Close( p_this );
+- return VLC_EGENERIC;
+- }
+- p_sys->misc_info.framerate = p_sys->frame_rate;
+-
+- result = dc1394_set_video_format( p_sys->camera_info.handle,
+- p_sys->camera_nodes[p_sys->selected_camera].node,
+- FORMAT_VGA_NONCOMPRESSED );
+- if( result != DC1394_SUCCESS )
+- {
+- msg_Err( p_demux, "unable to set video format to VGA_NONCOMPRESSED" );
+- Close( p_this );
+- return VLC_EGENERIC;
+- }
+- p_sys->misc_info.format = FORMAT_VGA_NONCOMPRESSED;
+-
+- result = dc1394_set_video_mode( p_sys->camera_info.handle,
+- p_sys->camera_nodes[p_sys->selected_camera].node,
+- p_sys->frame_size );
+- if( result != DC1394_SUCCESS )
++ if( dc1394_feature_set_value( p_sys->camera,
++ DC1394_FEATURE_FOCUS,
++ p_sys->brightness ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux, "unable to set video mode" );
+- Close( p_this );
+- return VLC_EGENERIC;
++ msg_Err( p_demux, "Unable to set initial brightness to %u",
++ p_sys->brightness );
+ }
+- p_sys->misc_info.mode = p_sys->frame_size;
++ msg_Dbg( p_demux, "Initial brightness set to %u", p_sys->brightness );
+
+- /* reprobe everything */
+- result = dc1394_get_camera_info( p_sys->camera_info.handle,
+- p_sys->camera_info.id,
+- &p_sys->camera_info );
+- if( result != DC1394_SUCCESS )
++ if( dc1394_video_set_framerate( p_sys->camera,
++ p_sys->frame_rate ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux, "Could not get camera basic information!" );
++ msg_Err( p_demux, "Unable to set framerate");
+ Close( p_this );
+ return VLC_EGENERIC;
+ }
+
+- result = dc1394_get_camera_misc_info( p_sys->camera_info.handle,
+- p_sys->camera_info.id,
+- &p_sys->misc_info );
+- if( result != DC1394_SUCCESS )
++ if( dc1394_video_set_mode( p_sys->camera,
++ p_sys->video_mode ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux, "Could not get camera misc information!" );
++ msg_Err( p_demux, "Unable to set video mode");
+ Close( p_this );
+ return VLC_EGENERIC;
+ }
+
+- /* set iso_channel */
+- result = dc1394_set_iso_channel_and_speed( p_sys->camera_info.handle,
+- p_sys->camera_info.id,
+- p_sys->selected_camera,
+- SPEED_400 );
+- if( result != DC1394_SUCCESS )
++ if( dc1394_video_set_iso_speed( p_sys->camera,
++ DC1394_ISO_SPEED_400 ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux, "Could not set iso channel!" );
++ msg_Err( p_demux, "Unable to set iso speed");
+ Close( p_this );
+ return VLC_EGENERIC;
+ }
+- msg_Dbg( p_demux, "Using ISO channel %d", p_sys->misc_info.iso_channel );
+- p_sys->misc_info.iso_channel = p_sys->selected_camera;
+
+ /* and setup capture */
+- if( p_sys->dma_capture )
+- {
+- result = dc1394_dma_setup_capture( p_sys->camera_info.handle,
+- p_sys->camera_info.id,
+- p_sys->misc_info.iso_channel,
+- p_sys->misc_info.format,
+- p_sys->misc_info.mode,
+- SPEED_400,
+- p_sys->misc_info.framerate,
+- 10, 0,
+- p_sys->dma_device,
+- &p_sys->camera );
+- if( result != DC1394_SUCCESS )
++ res = dc1394_capture_setup( p_sys->camera,
++ p_sys->dma_buffers,
++ DC1394_CAPTURE_FLAGS_DEFAULT);
++ if( res != DC1394_SUCCESS )
++ {
++ if( res == DC1394_NO_BANDWIDTH )
+ {
+- msg_Err( p_demux ,"unable to setup camera" );
+- Close( p_this );
+- return VLC_EGENERIC;
++ msg_Err( p_demux ,"No bandwidth: try adding the "
++ "\"resetbus\" option" );
+ }
+- }
+- else
+- {
+- result = dc1394_setup_capture( p_sys->camera_info.handle,
+- p_sys->camera_info.id,
+- p_sys->misc_info.iso_channel,
+- p_sys->misc_info.format,
+- p_sys->misc_info.mode,
+- SPEED_400,
+- p_sys->misc_info.framerate,
+- &p_sys->camera );
+- if( result != DC1394_SUCCESS)
++ else
+ {
+- msg_Err( p_demux ,"unable to setup camera" );
+- Close( p_this );
+- return VLC_EGENERIC;
++ msg_Err( p_demux ,"Unable to setup capture" );
+ }
++ Close( p_this );
++ return VLC_EGENERIC;
+ }
+
+ /* TODO - UYV444 chroma converter is missing, when it will be available
+ * fourcc will become variable (and not just a fixed value for UYVY)
+ */
+- i_width = p_sys->camera.frame_width;
+- i_height = p_sys->camera.frame_height;
++ i_width = p_sys->width;
++ i_height = p_sys->height;
+
+ if( picture_Setup( &p_sys->pic, VLC_CODEC_UYVY,
+ i_width, i_height,
+@@ -489,7 +407,7 @@ static int Open( vlc_object_t *p_this )
+ fmt.video.i_width = i_width;
+ fmt.video.i_height = i_height;
+
+- msg_Dbg( p_demux, "added new video es %4.4s %dx%d",
++ msg_Dbg( p_demux, "Added new video es %4.4s %dx%d",
+ (char*)&fmt.i_codec, fmt.video.i_width, fmt.video.i_height );
+
+ p_sys->p_es_video = es_out_Add( p_demux->out, &fmt );
+@@ -510,7 +428,7 @@ static int Open( vlc_object_t *p_this )
+ fmt.i_bitrate = fmt.audio.i_channels * fmt.audio.i_rate *
+ fmt.audio.i_bitspersample;
+
+- msg_Dbg( p_demux, "new audio es %d channels %dHz",
++ msg_Dbg( p_demux, "New audio es %d channels %dHz",
+ fmt.audio.i_channels, fmt.audio.i_rate );
+
+ p_sys->p_es_audio = es_out_Add( p_demux->out, &fmt );
+@@ -518,23 +436,16 @@ static int Open( vlc_object_t *p_this )
+ }
+
+ /* have the camera start sending us data */
+- result = dc1394_start_iso_transmission( p_sys->camera_info.handle,
+- p_sys->camera_info.id );
+- if( result != DC1394_SUCCESS )
++ if( dc1394_video_set_transmission( p_sys->camera,
++ DC1394_ON ) != DC1394_SUCCESS )
+ {
+- msg_Err( p_demux, "unable to start camera iso transmission" );
+- if( p_sys->dma_capture )
+- {
+- dc1394_dma_release_camera( p_sys->fd_video, &p_sys->camera );
+- }
+- else
+- {
+- dc1394_release_camera( p_sys->fd_video, &p_sys->camera );
+- }
++ msg_Err( p_demux, "Unable to start camera iso transmission" );
++ dc1394_capture_stop( p_sys->camera );
+ Close( p_this );
+ return VLC_EGENERIC;
+ }
+- p_sys->misc_info.is_iso_on = DC1394_TRUE;
++ msg_Dbg( p_demux, "Set iso transmission" );
++ // TODO: reread camera
+ return VLC_SUCCESS;
+ }
+
+@@ -548,7 +459,7 @@ static void OpenAudioDev( demux_t *p_demux )
+ p_sys->fd_audio = utf8_open( psz_device, O_RDONLY | O_NONBLOCK );
+ if( p_sys->fd_audio < 0 )
+ {
+- msg_Err( p_demux, "cannot open audio device (%s)", psz_device );
++ msg_Err( p_demux, "Cannot open audio device (%s)", psz_device );
+ CloseAudioDev( p_demux );
+ }
+
+@@ -558,7 +469,7 @@ static void OpenAudioDev( demux_t *p_demux )
+ result = ioctl( p_sys->fd_audio, SNDCTL_DSP_SETFMT, &i_format );
+ if( (result < 0) || (i_format != AFMT_S16_LE) )
+ {
+- msg_Err( p_demux, "cannot set audio format (16b little endian) "
++ msg_Err( p_demux, "Cannot set audio format (16b little endian) "
+ "(%d)", i_format );
+ CloseAudioDev( p_demux );
+ }
+@@ -566,7 +477,7 @@ static void OpenAudioDev( demux_t *p_demux )
+ result = ioctl( p_sys->fd_audio, SNDCTL_DSP_CHANNELS, &p_sys->channels );
+ if( result < 0 )
+ {
+- msg_Err( p_demux, "cannot set audio channels count (%d)",
++ msg_Err( p_demux, "Cannot set audio channels count (%d)",
+ p_sys->channels );
+ CloseAudioDev( p_demux );
+ }
+@@ -574,11 +485,12 @@ static void OpenAudioDev( demux_t *p_demux )
+ result = ioctl( p_sys->fd_audio, SNDCTL_DSP_SPEED, &p_sys->i_sample_rate );
+ if( result < 0 )
+ {
+- msg_Err( p_demux, "cannot set audio sample rate (%s)", p_sys->i_sample_rate );
++ msg_Err( p_demux, "Cannot set audio sample rate (%d)",
++ p_sys->i_sample_rate );
+ CloseAudioDev( p_demux );
+ }
+
+- msg_Dbg( p_demux, "opened adev=`%s' %s %dHz",
++ msg_Dbg( p_demux, "Opened adev=`%s' %s %dHz",
+ psz_device,
+ (p_sys->channels > 1) ? "stereo" : "mono",
+ p_sys->i_sample_rate );
+@@ -605,37 +517,27 @@ static void Close( vlc_object_t *p_this )
+ {
+ demux_t *p_demux = (demux_t*)p_this;
+ demux_sys_t *p_sys = p_demux->p_sys;
+- int result = 0;
+
+ /* Stop data transmission */
+- result = dc1394_stop_iso_transmission( p_sys->fd_video,
+- p_sys->camera.node );
+- if( result != DC1394_SUCCESS )
+- {
+- msg_Err( p_demux, "couldn't stop the camera" );
+- }
++ if( dc1394_video_set_transmission( p_sys->camera,
++ DC1394_OFF ) != DC1394_SUCCESS )
++ msg_Err( p_demux, "Unable to stop camera iso transmission" );
+
+ /* Close camera */
+- if( p_sys->dma_capture )
+- {
+- dc1394_dma_unlisten( p_sys->fd_video, &p_sys->camera );
+- dc1394_dma_release_camera( p_sys->fd_video, &p_sys->camera );
+- }
+- else
+- {
+- dc1394_release_camera( p_sys->fd_video, &p_sys->camera );
+- }
++ dc1394_capture_stop( p_sys->camera );
+
+- if( p_sys->fd_video )
+- dc1394_destroy_handle( p_sys->fd_video );
+ CloseAudioDev( p_demux );
+
+- free( p_sys->camera_nodes );
+- free( p_sys->audio_device );
++ dc1394_camera_free(p_sys->camera);
++ dc1394_free(p_sys->p_dccontext);
++
++ if( p_sys->audio_device )
++ free( p_sys->audio_device );
+
+ free( p_sys );
+ }
+
++#if 0
+ static void MovePixelUYVY( void *src, int spos, void *dst, int dpos )
+ {
+ char u,v,y;
+@@ -667,6 +569,7 @@ static void MovePixelUYVY( void *src, int spos, void *dst, int dpos )
+ dc[1] = y;
+ }
+ }
++#endif
+
+ /*****************************************************************************
+ * Demux:
+@@ -675,49 +578,35 @@ static block_t *GrabVideo( demux_t *p_demux )
+ {
+ demux_sys_t *p_sys = p_demux->p_sys;
+ block_t *p_block = NULL;
+- int result = 0;
+
+- if( p_sys->dma_capture )
+- {
+- result = dc1394_dma_single_capture( &p_sys->camera );
+- if( result != DC1394_SUCCESS )
+- {
+- msg_Err( p_demux, "unable to capture a frame" );
+- return NULL;
+- }
+- }
+- else
++ if( dc1394_capture_dequeue( p_sys->camera,
++ DC1394_CAPTURE_POLICY_WAIT,
++ &p_sys->frame ) != DC1394_SUCCESS )
+ {
+- result = dc1394_single_capture( p_sys->camera_info.handle,
+- &p_sys->camera );
+- if( result != DC1394_SUCCESS )
+- {
+- msg_Err( p_demux, "unable to capture a frame" );
+- return NULL;
+- }
++ msg_Err( p_demux, "Unable to capture a frame" );
++ return NULL;
+ }
+
+- p_block = block_New( p_demux, p_sys->camera.frame_width *
+- p_sys->camera.frame_height * 2 );
++ p_block = block_New( p_demux, p_sys->frame->size[0] *
++ p_sys->frame->size[1] * 2 );
+ if( !p_block )
+ {
+- msg_Err( p_demux, "cannot get block" );
++ msg_Err( p_demux, "Can not get block" );
+ return NULL;
+ }
+
+- if( !p_sys->camera.capture_buffer )
++ if( !p_sys->frame->image )
+ {
+- msg_Err (p_demux, "caputer buffer empty");
++ msg_Err (p_demux, "Capture buffer empty");
+ block_Release( p_block );
+ return NULL;
+ }
+
+- memcpy( p_block->p_buffer, (const char *)p_sys->camera.capture_buffer,
+- p_sys->camera.frame_width * p_sys->camera.frame_height * 2 );
++ memcpy( p_block->p_buffer, (const char *)p_sys->frame->image,
++ p_sys->width * p_sys->height * 2 );
+
+ p_block->i_pts = p_block->i_dts = mdate();
+- if( p_sys->dma_capture )
+- dc1394_dma_done_with_buffer( &p_sys->camera );
++ dc1394_capture_enqueue( p_sys->camera, p_sys->frame );
+ return p_block;
+ }
+
+@@ -733,7 +622,7 @@ static block_t *GrabAudio( demux_t *p_demux )
+ p_block = block_New( p_demux, p_sys->i_audio_max_frame_size );
+ if( !p_block )
+ {
+- msg_Warn( p_demux, "cannot get buffer" );
++ msg_Warn( p_demux, "Cannot get buffer" );
+ return NULL;
+ }
+
+@@ -768,8 +657,7 @@ static int Demux( demux_t *p_demux )
+ p_blocka = GrabAudio( p_demux );
+
+ /* Try grabbing video frame */
+- if( (int)p_sys->fd_video > 0 )
+- p_blockv = GrabVideo( p_demux );
++ p_blockv = GrabVideo( p_demux );
+
+ if( !p_blocka && !p_blockv )
+ {
+@@ -799,6 +687,7 @@ static int Demux( demux_t *p_demux )
+ *****************************************************************************/
+ static int Control( demux_t *p_demux, int i_query, va_list args )
+ {
++ VLC_UNUSED( p_demux );
+ switch( i_query )
+ {
+ /* Special for access_demux */
+@@ -831,8 +720,13 @@ static int process_options( demux_t *p_demux )
+ char *psz_parser;
+ char *token = NULL;
+ char *state = NULL;
++ const char *in_size = NULL;
++ const char *in_fmt = NULL;
+ float rate_f;
+
++ if( strncmp(p_demux->psz_access, "dc1394", 6) != 0 )
++ return VLC_EGENERIC;
++
+ psz_dup = strdup( p_demux->psz_path );
+ psz_parser = psz_dup;
+ for( token = strtok_r( psz_parser,":",&state); token;
+@@ -847,26 +741,26 @@ static int process_options( demux_t *p_demux )
+ * video size of 160x120 is temporarily disabled
+ */
+ msg_Err( p_demux,
+- "video size of 160x120 is actually disabled for lack of chroma "
+- "support. It will relased ASAP, until then try an higher size "
+- "(320x240 and 640x480 are fully supported)" );
+- free( psz_dup );
++ "video size of 160x120 is actually disabled for lack of"
++ "chroma support. It will relased ASAP, until then try "
++ "an higher size (320x240 and 640x480 are fully supported)" );
++ free(psz_dup);
+ return VLC_EGENERIC;
+ #if 0
+- p_sys->frame_size = MODE_160x120_YUV444;
++ in_size = "160x120";
+ p_sys->width = 160;
+ p_sys->height = 120;
+ #endif
+ }
+ else if( strncmp( token, "320x240", 7 ) == 0 )
+ {
+- p_sys->frame_size = MODE_320x240_YUV422;
++ in_size = "320x240";
+ p_sys->width = 320;
+ p_sys->height = 240;
+ }
+ else if( strncmp( token, "640x480", 7 ) == 0 )
+ {
+- p_sys->frame_size = MODE_640x480_YUV422;
++ in_size = "640x480";
+ p_sys->width = 640;
+ p_sys->height = 480;
+ }
+@@ -877,27 +771,62 @@ static int process_options( demux_t *p_demux )
+ " 160x120, 320x240, and 640x480. "
+ "Please specify one of them. You have specified %s.",
+ token );
+- free( psz_dup );
++ free(psz_dup);
+ return VLC_EGENERIC;
+ }
+ msg_Dbg( p_demux, "Requested video size : %s",token );
+ }
++ if( strncmp( token, "format=", strlen("format=") ) == 0 )
++ {
++ token += strlen("format=");
++ if( strncmp( token, "YUV411", 6 ) == 0 )
++ {
++ in_fmt = "YUV411";
++ }
++ else if( strncmp( token, "YUV422", 6 ) == 0 )
++ {
++ in_fmt = "YUV422";
++ }
++ else if( strncmp( token, "YUV444", 6 ) == 0 )
++ {
++ in_fmt = "YUV444";
++ }
++ else if( strncmp( token, "RGB8", 4 ) == 0 )
++ {
++ in_fmt = "RGB8";
++ }
++ else if( strncmp( token, "MONO8", 5 ) == 0 )
++ {
++ in_fmt = "MONO8";
++ }
++ else if( strncmp( token, "MONO16", 6 ) == 0 )
++ {
++ in_fmt = "MONO16";
++ }
++ else
++ {
++ msg_Err( p_demux, "Invalid format %s.", token );
++ free(psz_dup);
++ return VLC_EGENERIC;
++ }
++ msg_Dbg( p_demux, "Requested video format : %s", token );
++ }
+ else if( strncmp( token, "fps=", strlen( "fps=" ) ) == 0 )
+ {
+ token += strlen("fps=");
+ sscanf( token, "%g", &rate_f );
+ if( rate_f == 1.875 )
+- p_sys->frame_rate = FRAMERATE_1_875;
++ p_sys->frame_rate = DC1394_FRAMERATE_1_875;
+ else if( rate_f == 3.75 )
+- p_sys->frame_rate = FRAMERATE_3_75;
++ p_sys->frame_rate = DC1394_FRAMERATE_3_75;
+ else if( rate_f == 7.5 )
+- p_sys->frame_rate = FRAMERATE_7_5;
++ p_sys->frame_rate = DC1394_FRAMERATE_7_5;
+ else if( rate_f == 15 )
+- p_sys->frame_rate = FRAMERATE_15;
++ p_sys->frame_rate = DC1394_FRAMERATE_15;
+ else if( rate_f == 30 )
+- p_sys->frame_rate = FRAMERATE_30;
++ p_sys->frame_rate = DC1394_FRAMERATE_30;
+ else if( rate_f == 60 )
+- p_sys->frame_rate = FRAMERATE_60;
++ p_sys->frame_rate = DC1394_FRAMERATE_60;
+ else
+ {
+ msg_Err( p_demux ,
+@@ -905,11 +834,16 @@ static int process_options( demux_t *p_demux )
+ " 1.875, 3.75, 7.5, 15, 30, 60. "
+ "Please specify one of them. You have specified %s.",
+ token);
+- free( psz_dup );
++ free(psz_dup);
+ return VLC_EGENERIC;
+ }
+ msg_Dbg( p_demux, "Requested frame rate : %s",token );
+ }
++ else if( strncmp( token, "resetbus", strlen( "resetbus" ) ) == 0 )
++ {
++ token += strlen("resetbus");
++ p_sys->reset_bus = 1;
++ }
+ else if( strncmp( token, "brightness=", strlen( "brightness=" ) ) == 0 )
+ {
+ int nr = 0;
+@@ -920,11 +854,27 @@ static int process_options( demux_t *p_demux )
+ msg_Err( p_demux, "Bad brightness value '%s', "
+ "must be an unsigned integer.",
+ token );
+- free( psz_dup );
++ free(psz_dup);
++ return VLC_EGENERIC;
++ }
++ }
++ else if( strncmp( token, "buffers=", strlen( "buffers=" ) ) == 0 )
++ {
++ int nr = 0;
++ int in_buf = 0;
++ token += strlen("buffers=");
++ nr = sscanf( token, "%d", &in_buf);
++ if( nr != 1 || in_buf < 1 )
++ {
++ msg_Err( p_demux, "DMA buffers must be 1 or greater." );
++ free(psz_dup);
+ return VLC_EGENERIC;
+ }
++ else p_sys->dma_buffers = in_buf;
+ }
+ #if 0
++ // NOTE: If controller support is added back, more logic will needed to be added
++ // after the cameras are scanned.
+ else if( strncmp( token, "controller=", strlen( "controller=" ) ) == 0 )
+ {
+ int nr = 0;
+@@ -949,31 +899,15 @@ static int process_options( demux_t *p_demux )
+ msg_Err( p_demux, "Bad camera number '%s', "
+ "must be an unsigned integer.",
+ token );
+- free( psz_dup );
++ free(psz_dup);
+ return VLC_EGENERIC;
+ }
+ }
+- else if( strncmp( token, "capture=", strlen( "capture=" ) ) == 0)
++ else if( strncmp( token, "vdev=", strlen( "vdev=" ) ) == 0)
+ {
+- token += strlen("capture=");
+- if( strncmp(token, "raw1394",7) == 0 )
+- {
+- msg_Dbg( p_demux, "DMA capture disabled!" );
+- p_sys->dma_capture = DMA_OFF;
+- }
+- else if( strncmp(token,"video1394",9) == 0 )
+- {
+- msg_Dbg( p_demux, "DMA capture enabled!" );
+- p_sys->dma_capture = DMA_ON;
+- }
+- else
+- {
+- msg_Err(p_demux, "Bad capture method value '%s', "
+- "it can be 'raw1394' or 'video1394'.",
+- token );
+- free( psz_dup );
+- return VLC_EGENERIC;
+- }
++ token += strlen("vdev=");
++ p_sys->video_device = strdup(token);
++ msg_Dbg( p_demux, "Using video device '%s'.", token );
+ }
+ else if( strncmp( token, "adev=", strlen( "adev=" ) ) == 0 )
+ {
+@@ -993,8 +927,17 @@ static int process_options( demux_t *p_demux )
+ }
+ else if( strncmp( token, "focus=", strlen("focus=" ) ) == 0)
+ {
++ int nr = 0;
+ token += strlen("focus=");
+- sscanf( token, "%u", &p_sys->focus );
++ nr = sscanf( token, "%u", &p_sys->focus );
++ if( nr != 1 )
++ {
++ msg_Err( p_demux, "Bad focus value '%s', "
++ "must be an unsigned integer.",
++ token );
++ free(psz_dup);
++ return VLC_EGENERIC;
++ }
+ }
+ else if( strncmp( token, "uid=", strlen("uid=") ) == 0)
+ {
+@@ -1002,7 +945,41 @@ static int process_options( demux_t *p_demux )
+ sscanf( token, "0x%llx", &p_sys->selected_uid );
+ }
+ }
+- free( psz_dup );
++
++ // The mode is a combination of size and format and not every format
++ // is supported by every size.
++ if( in_size)
++ {
++ if( strcmp( in_size, "160x120") == 0)
++ {
++ if( in_fmt && (strcmp( in_fmt, "YUV444") != 0) )
++ msg_Err(p_demux, "160x120 only supports YUV444 - forcing");
++ p_sys->video_mode = DC1394_VIDEO_MODE_160x120_YUV444;
++ }
++ else if( strcmp( in_size, "320x240") == 0)
++ {
++ if( in_fmt && (strcmp( in_fmt, "YUV422") != 0) )
++ msg_Err(p_demux, "320x240 only supports YUV422 - forcing");
++ p_sys->video_mode = DC1394_VIDEO_MODE_320x240_YUV422;
++ }
++ }
++ else
++ { // 640x480 default
++ if( in_fmt )
++ {
++ if( strcmp( in_fmt, "RGB8") == 0)
++ p_sys->video_mode = DC1394_VIDEO_MODE_640x480_RGB8;
++ else if( strcmp( in_fmt, "MONO8") == 0)
++ p_sys->video_mode = DC1394_VIDEO_MODE_640x480_MONO8;
++ else if( strcmp( in_fmt, "MONO16") == 0)
++ p_sys->video_mode = DC1394_VIDEO_MODE_640x480_MONO16;
++ else if( strcmp( in_fmt, "YUV411") == 0)
++ p_sys->video_mode = DC1394_VIDEO_MODE_640x480_YUV411;
++ else // YUV422 default
++ p_sys->video_mode = DC1394_VIDEO_MODE_640x480_YUV422;
++ }
++ else // YUV422 default
++ p_sys->video_mode = DC1394_VIDEO_MODE_640x480_YUV422;
++ }
+ return VLC_SUCCESS;
+ }
+-
+