]> git.sesse.net Git - vlc/commitdiff
* DirectX enhancements by Gildas Bazin, such as software rendering.
authorSam Hocevar <sam@videolan.org>
Thu, 14 Jun 2001 01:49:44 +0000 (01:49 +0000)
committerSam Hocevar <sam@videolan.org>
Thu, 14 Jun 2001 01:49:44 +0000 (01:49 +0000)
  * Merged dvdcss_init and dvdcss_open into dvdcss_open, and dvdcss_close
    and dvdcss_end into dvdcss_close. libdvdcss API now has 7 functions.
  * Another failed attempt at profiling vlc under Linux: ported the
    threads API to GNU Pth. Activate with --enable-pth. It doesn't seem to
    spawn new threads for me, maybe someone will have better luck.
  * Makefile optimizations.
  * Automatic build of libdvdcss if not found.

27 files changed:
Makefile
Makefile.opts.in
configure
configure.in
debian/control
extras/libdvdcss/Makefile
extras/libdvdcss/libdvdcss.c
extras/libdvdcss/libdvdcss.h
extras/libdvdcss/videolan/dvdcss.h
include/defs.h.in
include/threads.h
lib/.cvsignore
plugins/directx/aout_directx.c
plugins/directx/vout_directx.c
plugins/dummy/aout_dummy.c
plugins/dummy/intf_dummy.c
plugins/dvd/Makefile
plugins/dvd/input_dvd.c
plugins/gtk/gtk_menu.c
plugins/gtk/gtk_menu.h
plugins/gtk/intf_gtk.h
src/input/input.c
src/interface/main.c
src/misc/modules.c
src/misc/modules_core.h
src/misc/mtime.c
src/video_output/video_output.c

index da2610b9a391bbf6ab9cfccf24c596fe26b4761d..9301e54cb0e6828b7015add19221e2b232b4a8ce 100644 (file)
--- a/Makefile
+++ b/Makefile
 # 
 # All possible plugin directories, needed for make clean
 #
-PLUGINS_DIR := alsa beos darwin directx dsp dummy \
-               dvd esd fb ggi glide gtk \
-               downmix idct imdct \
-               macosx mga \
-               motion \
-               mpeg qt sdl \
-               text x11 yuv
+PLUGINS_DIR := alsa beos darwin directx dsp dummy dvd esd fb ggi glide gtk downmix idct imdct macosx mga motion mpeg qt sdl text x11 yuv
 
 #
 # All possible plugin objects
 #
-PLUGINS_TARGETS := alsa/alsa beos/beos darwin/darwin directx/directx \
-               dsp/dsp dummy/dummy dummy/null dvd/dvd esd/esd fb/fb \
-               ggi/ggi glide/glide gtk/gnome gtk/gtk \
-               downmix/downmix downmix/downmixsse downmix/downmix3dn \
-               idct/idct idct/idctclassic idct/idctmmx idct/idctmmxext \
-               imdct/imdct imdct/imdct3dn imdct/imdctsse \
-               macosx/macosx mga/mga \
-               motion/motion motion/motionmmx motion/motionmmxext \
-               mpeg/es mpeg/ps mpeg/ts qt/qt sdl/sdl \
-               text/ncurses text/rc x11/x11 x11/xvideo yuv/yuv yuv/yuvmmx
+PLUGINS_TARGETS := alsa/alsa beos/beos darwin/darwin directx/directx dsp/dsp dummy/dummy dummy/null dvd/dvd esd/esd fb/fb ggi/ggi glide/glide gtk/gnome gtk/gtk downmix/downmix downmix/downmixsse downmix/downmix3dn idct/idct idct/idctclassic idct/idctmmx idct/idctmmxext imdct/imdct imdct/imdct3dn imdct/imdctsse macosx/macosx mga/mga motion/motion motion/motionmmx motion/motionmmxext mpeg/es mpeg/ps mpeg/ts qt/qt sdl/sdl text/ncurses text/rc x11/x11 x11/xvideo yuv/yuv yuv/yuvmmx
 
 #
 # C Objects
 # 
-INTERFACE :=   src/interface/main.o \
-               src/interface/interface.o \
-               src/interface/intf_msg.o \
-               src/interface/intf_playlist.o \
-               src/interface/intf_channels.o
-
-INPUT :=       src/input/input.o \
-               src/input/input_ext-dec.o \
-               src/input/input_ext-intf.o \
-               src/input/input_dec.o \
-               src/input/input_programs.o \
-               src/input/input_netlist.o \
-               src/input/input_clock.o \
-               src/input/mpeg_system.o
-
-AUDIO_OUTPUT :=        src/audio_output/audio_output.o \
-               src/audio_output/aout_ext-dec.o \
-               src/audio_output/aout_u8.o \
-               src/audio_output/aout_s8.o \
-               src/audio_output/aout_u16.o \
-               src/audio_output/aout_s16.o \
-               src/audio_output/aout_spdif.o
-
-VIDEO_OUTPUT :=        src/video_output/video_output.o \
-               src/video_output/video_text.o \
-               src/video_output/video_spu.o \
-               src/video_output/video_yuv.o
-
-AC3_DECODER := src/ac3_decoder/ac3_decoder_thread.o \
-               src/ac3_decoder/ac3_decoder.o \
-               src/ac3_decoder/ac3_parse.o \
-               src/ac3_decoder/ac3_exponent.o \
-               src/ac3_decoder/ac3_bit_allocate.o \
-               src/ac3_decoder/ac3_mantissa.o \
-               src/ac3_decoder/ac3_rematrix.o \
-               src/ac3_decoder/ac3_imdct.o
-
-AC3_SPDIF :=   src/ac3_spdif/ac3_spdif.o \
-               src/ac3_spdif/ac3_iec958.o
-
-LPCM_DECODER :=        src/lpcm_decoder/lpcm_decoder_thread.o \
-
-AUDIO_DECODER :=       src/audio_decoder/audio_decoder.o \
-                       src/audio_decoder/adec_generic.o \
-                       src/audio_decoder/adec_layer1.o \
-                       src/audio_decoder/adec_layer2.o \
-                       src/audio_decoder/adec_math.o
-
-SPU_DECODER := src/spu_decoder/spu_decoder.o
-
-#GEN_DECODER :=        src/generic_decoder/generic_decoder.o
-
-VIDEO_PARSER :=        src/video_parser/video_parser.o \
-               src/video_parser/vpar_headers.o \
-               src/video_parser/vpar_blocks.o \
-               src/video_parser/vpar_synchro.o \
-               src/video_parser/video_fifo.o
-
-VIDEO_DECODER :=       src/video_decoder/video_decoder.o
-
-MISC :=                src/misc/mtime.o \
-               src/misc/tests.o \
-               src/misc/modules.o \
-               src/misc/netutils.o
-
-C_OBJ :=       $(INTERFACE) \
-               $(INPUT) \
-               $(VIDEO_OUTPUT) \
-               $(AUDIO_OUTPUT) \
-               $(AC3_DECODER) \
-               $(AC3_SPDIF) \
-               $(LPCM_DECODER) \
-               $(AUDIO_DECODER) \
-               $(SPU_DECODER) \
-               $(GEN_DECODER) \
-               $(VIDEO_PARSER) \
-               $(VIDEO_DECODER) \
-               $(MISC)
+INTERFACE := main interface intf_msg intf_playlist intf_channels
+INPUT := input input_ext-dec input_ext-intf input_dec input_programs input_netlist input_clock mpeg_system
+VIDEO_OUTPUT := video_output video_text video_spu video_yuv
+AUDIO_OUTPUT := audio_output aout_ext-dec aout_u8 aout_s8 aout_u16 aout_s16 aout_spdif
+AC3_DECODER := ac3_decoder_thread ac3_decoder ac3_parse ac3_exponent ac3_bit_allocate ac3_mantissa ac3_rematrix ac3_imdct
+AC3_SPDIF := ac3_spdif ac3_iec958
+LPCM_DECODER := lpcm_decoder_thread
+AUDIO_DECODER := audio_decoder adec_generic adec_layer1 adec_layer2 adec_math
+SPU_DECODER := spu_decoder
+#GEN_DECODER := generic_decoder
+VIDEO_PARSER := video_parser vpar_headers vpar_blocks vpar_synchro video_fifo
+VIDEO_DECODER := video_decoder
+MISC := mtime tests modules netutils
+
+C_OBJ :=       $(INTERFACE:%=src/interface/%.o) \
+               $(INPUT:%=src/input/%.o) \
+               $(VIDEO_OUTPUT:%=src/video_output/%.o) \
+               $(AUDIO_OUTPUT:%=src/audio_output/%.o) \
+               $(AC3_DECODER:%=src/ac3_decoder/%.o) \
+               $(AC3_SPDIF:%=src/ac3_spdif/%.o) \
+               $(LPCM_DECODER:%=src/lpcm_decoder/%.o) \
+               $(AUDIO_DECODER:%=src/audio_decoder/%.o) \
+               $(SPU_DECODER:%=src/spu_decoder/%.o) \
+               $(GEN_DECODER:%=src/generic_decoder/%.o) \
+               $(VIDEO_PARSER:%=src/video_parser/%.o) \
+               $(VIDEO_DECODER:%=src/video_decoder/%.o) \
+               $(MISC:%=src/misc/%.o)
 
 #
 # Misc Objects
@@ -163,13 +97,21 @@ export
 #
 all: vlc ${ALIASES} plugins vlc.app
 
-clean:
+clean: libdvdcss-clean plugins-clean vlc-clean
+       rm -f src/*/*.o extras/*/*.o
+       rm -f lib/*.so lib/*.so.* lib/*.a
+
+libdvdcss-clean:
+       cd extras/libdvdcss && $(MAKE) clean
+
+plugins-clean:
        for dir in $(PLUGINS_DIR) ; do \
                ( cd plugins/$${dir} && $(MAKE) clean ) ; done
        rm -f plugins/*/*.o plugins/*/*.moc plugins/*/*.bak
+
+vlc-clean:
        rm -f $(C_OBJ) $(CPP_OBJ)
-       rm -f src/*/*.o extras/*/*.o
-       rm -f lib/*.so lib/*.a vlc gnome-vlc gvlc kvlc qvlc
+       rm -f vlc gnome-vlc gvlc kvlc qvlc
        rm -Rf vlc.app
 
 distclean: clean
@@ -182,21 +124,28 @@ distclean: clean
        rm -Rf .dep
        rm -f .gdb_history
 
-install:
+install: libdvdcss-install vlc-install plugins-install
+
+vlc-install:
        mkdir -p $(DESTDIR)$(bindir)
        $(INSTALL) vlc $(DESTDIR)$(bindir)
 ifneq (,$(ALIASES))
        for alias in $(ALIASES) ; do if test $$alias ; then rm -f $(DESTDIR)$(bindir)/$$alias && ln -s vlc $(DESTDIR)$(bindir)/$$alias ; fi ; done
-endif
-       mkdir -p $(DESTDIR)$(libdir)/videolan/vlc
-ifneq (,$(PLUGINS))
-       $(INSTALL) -m 644 $(PLUGINS:%=lib/%.so) $(DESTDIR)$(libdir)/videolan/vlc
 endif
        mkdir -p $(DESTDIR)$(datadir)/videolan
        $(INSTALL) -m 644 share/*.psf $(DESTDIR)$(datadir)/videolan
        $(INSTALL) -m 644 share/*.png $(DESTDIR)$(datadir)/videolan
        $(INSTALL) -m 644 share/*.xpm $(DESTDIR)$(datadir)/videolan
 
+plugins-install:
+       mkdir -p $(DESTDIR)$(libdir)/videolan/vlc
+ifneq (,$(PLUGINS))
+       $(INSTALL) -m 644 $(PLUGINS:%=lib/%.so) $(DESTDIR)$(libdir)/videolan/vlc
+endif
+
+libdvdcss-install:
+       cd extras/libdvdcss && $(MAKE) install
+
 show:
        @echo CC: $(CC)
        @echo CFLAGS: $(CFLAGS)
index 9c6905629145224c2ba7108afe3e325e6a6c5ae9..f8e70f2117ac9533794410a57d7407ade2bbc1c0 100644 (file)
@@ -55,6 +55,7 @@ prefix = @prefix@
 bindir = @bindir@
 datadir = @datadir@
 libdir = @libdir@
+includedir = @includedir@
 
 #
 # Libraries for special cases
@@ -87,6 +88,11 @@ CFLAGS_GTK = @CFLAGS_GTK@
 CFLAGS_SDL = @CFLAGS_SDL@
 CFLAGS_X11 = @CFLAGS_X11@
 
+#
+# Other special cases
+#
+LOCAL_LIBDVDCSS = @LOCAL_LIBDVDCSS@
+
 ###############################################################################
 # Configuration pre-processing
 ###############################################################################
@@ -140,22 +146,28 @@ endif
 INCLUDE += @INCLUDE@
 INCLUDE += -Iinclude -Iextras -I/usr/local/include
 
+#
+# Libraries needed by built-in modules
+#
+ifneq (,$(BUILTINS))
+LIB_BUILTINS := $(shell for i in ${BUILTINS} ; do echo $$i | tr '[a-z]' '[A-Z]' | sed -e 's/.*/$$LIB_&/' ; done)
+LIB += $(LIB_BUILTINS)
+endif
+
 #
 # Libraries
 #
-LIB += @LIB@ -L/usr/local/lib
+ifeq (1,$(LOCAL_LIBDVDCSS))
+ifneq (,$(findstring dvd,$(BUILTINS)))
+LIB += lib/libdvdcss.a
+endif
+endif
 
 ifneq (,$(findstring mingw32,$(SYS)))
 LIB += -lws2_32 -lnetapi32
 endif
 
-#
-# Libraries needed by built-in modules
-#
-ifneq (,$(BUILTINS))
-LIB_BUILTINS := $(shell for i in ${BUILTINS} ; do echo $$i | tr '[a-z]' '[A-Z]' | sed -e 's/.*/$$LIB_&/' ; done)
-LIB += $(LIB_BUILTINS)
-endif
+LIB += -L/usr/local/lib @LIB@
 
 #
 # C compiler flags: mainstream compilation
index d46163879c87cc2f974435f6bd2515b39e45d2a0..3386e690c85959ea220c23ffa64946c381a4273f 100755 (executable)
--- a/configure
+++ b/configure
@@ -12,11 +12,7 @@ ac_help=
 ac_default_prefix=/usr/local
 # Any additions from configure.in:
 ac_help="$ac_help
-  --disable-dummy         dummy module (default enabled)"
-ac_help="$ac_help
-  --disable-null          Null module (default enabled)"
-ac_help="$ac_help
-  --disable-rc            rc module (default enabled)"
+  --enable-pth            Enable GNU Pth support (default disabled)"
 ac_help="$ac_help
   --disable-ppro          Disable PentiumPro optimizations (default enabled for x86)"
 ac_help="$ac_help
@@ -33,6 +29,12 @@ ac_help="$ac_help
   --enable-trace          Enable trace mode (default disabled)"
 ac_help="$ac_help
   --disable-optimizations Disable compiler optimizations (default enabled)"
+ac_help="$ac_help
+  --disable-dummy         dummy module (default enabled)"
+ac_help="$ac_help
+  --disable-null          Null module (default enabled)"
+ac_help="$ac_help
+  --disable-rc            rc module (default enabled)"
 ac_help="$ac_help
   --disable-dsp           Linux /dev/dsp support (default enabled)"
 ac_help="$ac_help
@@ -605,7 +607,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:609: checking host system type" >&5
+echo "configure:611: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -634,7 +636,7 @@ VLC_CODENAME=Ourumov
 save_CFLAGS="${CFLAGS}"
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:638: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:640: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -663,7 +665,7 @@ fi
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:667: checking for $ac_word" >&5
+echo "configure:669: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -693,7 +695,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:697: checking for $ac_word" >&5
+echo "configure:699: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -744,7 +746,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:748: checking for $ac_word" >&5
+echo "configure:750: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -776,7 +778,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:780: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:782: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -787,12 +789,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 791 "configure"
+#line 793 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:796: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:798: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -818,12 +820,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:822: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:824: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:827: checking whether we are using GNU C" >&5
+echo "configure:829: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -832,7 +834,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:836: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:838: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -851,7 +853,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:855: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:857: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -883,7 +885,7 @@ else
 fi
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:887: checking how to run the C preprocessor" >&5
+echo "configure:889: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -898,13 +900,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 902 "configure"
+#line 904 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:908: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -915,13 +917,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 919 "configure"
+#line 921 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:925: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:927: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -932,13 +934,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 936 "configure"
+#line 938 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:942: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:944: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -965,7 +967,7 @@ echo "$ac_t""$CPP" 1>&6
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:969: checking for $ac_word" >&5
+echo "configure:971: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1005,7 +1007,7 @@ fi
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1009: checking for a BSD compatible install" >&5
+echo "configure:1011: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1059,12 +1061,12 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:1063: checking for working const" >&5
+echo "configure:1065: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1068 "configure"
+#line 1070 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -1113,7 +1115,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:1117: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -1136,14 +1138,14 @@ fi
 
 if test x${cross_compiling} != xyes; then
   echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:1140: checking whether byte ordering is bigendian" >&5
+echo "configure:1142: checking whether byte ordering is bigendian" >&5
 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_bigendian=unknown
 # See if sys/param.h defines the BYTE_ORDER macro.
 cat > conftest.$ac_ext <<EOF
-#line 1147 "configure"
+#line 1149 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -1154,11 +1156,11 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:1158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1160: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   # It does; now see whether it defined to BIG_ENDIAN or not.
 cat > conftest.$ac_ext <<EOF
-#line 1162 "configure"
+#line 1164 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -1169,7 +1171,7 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:1173: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1175: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_bigendian=yes
 else
@@ -1189,7 +1191,7 @@ if test "$cross_compiling" = yes; then
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 1193 "configure"
+#line 1195 "configure"
 #include "confdefs.h"
 main () {
   /* Are we little or big endian?  From Harbison&Steele.  */
@@ -1202,7 +1204,7 @@ main () {
   exit (u.c[sizeof (long) - 1] == 1);
 }
 EOF
-if { (eval echo configure:1206: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1208: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_bigendian=no
 else
@@ -1230,12 +1232,12 @@ fi
 for ac_func in gettimeofday select strerror strtod strtol
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1234: checking for $ac_func" >&5
+echo "configure:1236: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1239 "configure"
+#line 1241 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1258,7 +1260,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1262: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1264: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1285,12 +1287,12 @@ done
 for ac_func in setenv putenv
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1289: checking for $ac_func" >&5
+echo "configure:1291: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1294 "configure"
+#line 1296 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1313,7 +1315,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1317: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1319: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1338,12 +1340,12 @@ fi
 done
 
 echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:1342: checking for connect" >&5
+echo "configure:1344: checking for connect" >&5
 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1347 "configure"
+#line 1349 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -1366,7 +1368,7 @@ connect();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1372: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -1385,7 +1387,7 @@ else
   echo "$ac_t""no" 1>&6
 
   echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:1389: checking for connect in -lsocket" >&5
+echo "configure:1391: checking for connect in -lsocket" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1393,7 +1395,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1397 "configure"
+#line 1399 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1404,7 +1406,7 @@ int main() {
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:1408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1410: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1428,12 +1430,12 @@ fi
 fi
 
 echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:1432: checking for gethostbyname" >&5
+echo "configure:1434: checking for gethostbyname" >&5
 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1437 "configure"
+#line 1439 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -1456,7 +1458,7 @@ gethostbyname();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1460: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1462: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -1475,7 +1477,7 @@ else
   echo "$ac_t""no" 1>&6
 
   echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:1479: checking for gethostbyname in -lnsl" >&5
+echo "configure:1481: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1483,7 +1485,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1487 "configure"
+#line 1489 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1494,7 +1496,7 @@ int main() {
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:1498: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1518,12 +1520,12 @@ fi
 fi
 
 echo $ac_n "checking for nanosleep""... $ac_c" 1>&6
-echo "configure:1522: checking for nanosleep" >&5
+echo "configure:1524: checking for nanosleep" >&5
 if eval "test \"`echo '$''{'ac_cv_func_nanosleep'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1527 "configure"
+#line 1529 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char nanosleep(); below.  */
@@ -1546,7 +1548,7 @@ nanosleep();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1550: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1552: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_nanosleep=yes"
 else
@@ -1565,7 +1567,7 @@ else
   echo "$ac_t""no" 1>&6
 
   echo $ac_n "checking for nanosleep in -lrt""... $ac_c" 1>&6
-echo "configure:1569: checking for nanosleep in -lrt" >&5
+echo "configure:1571: checking for nanosleep in -lrt" >&5
 ac_lib_var=`echo rt'_'nanosleep | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1573,7 +1575,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lrt  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1577 "configure"
+#line 1579 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1584,7 +1586,7 @@ int main() {
 nanosleep()
 ; return 0; }
 EOF
-if { (eval echo configure:1588: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1590: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1604,7 +1606,7 @@ else
   echo "$ac_t""no" 1>&6
 
     echo $ac_n "checking for nanosleep in -lposix4""... $ac_c" 1>&6
-echo "configure:1608: checking for nanosleep in -lposix4" >&5
+echo "configure:1610: checking for nanosleep in -lposix4" >&5
 ac_lib_var=`echo posix4'_'nanosleep | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1612,7 +1614,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lposix4  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1616 "configure"
+#line 1618 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1623,7 +1625,7 @@ int main() {
 nanosleep()
 ; return 0; }
 EOF
-if { (eval echo configure:1627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1629: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1652,12 +1654,12 @@ fi
 for ac_func in usleep
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1656: checking for $ac_func" >&5
+echo "configure:1658: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1661 "configure"
+#line 1663 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1680,7 +1682,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1684: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1686: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1705,12 +1707,12 @@ fi
 done
 
 echo $ac_n "checking for inet_aton""... $ac_c" 1>&6
-echo "configure:1709: checking for inet_aton" >&5
+echo "configure:1711: checking for inet_aton" >&5
 if eval "test \"`echo '$''{'ac_cv_func_inet_aton'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1714 "configure"
+#line 1716 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char inet_aton(); below.  */
@@ -1733,7 +1735,7 @@ inet_aton();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_inet_aton=yes"
 else
@@ -1752,7 +1754,7 @@ else
   echo "$ac_t""no" 1>&6
 
   echo $ac_n "checking for inet_aton in -lresolv""... $ac_c" 1>&6
-echo "configure:1756: checking for inet_aton in -lresolv" >&5
+echo "configure:1758: checking for inet_aton in -lresolv" >&5
 ac_lib_var=`echo resolv'_'inet_aton | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1760,7 +1762,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lresolv  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1764 "configure"
+#line 1766 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1771,7 +1773,7 @@ int main() {
 inet_aton()
 ; return 0; }
 EOF
-if { (eval echo configure:1775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1777: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1797,12 +1799,12 @@ fi
 for ac_func in vasprintf
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1801: checking for $ac_func" >&5
+echo "configure:1803: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1806 "configure"
+#line 1808 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1825,7 +1827,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1829: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1831: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1852,12 +1854,68 @@ done
 for ac_func in swab
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1856: checking for $ac_func" >&5
+echo "configure:1858: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1863 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1886: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+for ac_func in sigrelse
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1914: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1861 "configure"
+#line 1919 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1880,7 +1938,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1884: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1942: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1906,12 +1964,12 @@ done
 
 
 echo $ac_n "checking for getopt_long""... $ac_c" 1>&6
-echo "configure:1910: checking for getopt_long" >&5
+echo "configure:1968: checking for getopt_long" >&5
 if eval "test \"`echo '$''{'ac_cv_func_getopt_long'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1915 "configure"
+#line 1973 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char getopt_long(); below.  */
@@ -1934,7 +1992,7 @@ getopt_long();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1996: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_getopt_long=yes"
 else
@@ -1956,7 +2014,7 @@ else
   echo "$ac_t""no" 1>&6
  # FreeBSD has a gnugetopt library for this:
   echo $ac_n "checking for getopt_long in -lgnugetopt""... $ac_c" 1>&6
-echo "configure:1960: checking for getopt_long in -lgnugetopt" >&5
+echo "configure:2018: checking for getopt_long in -lgnugetopt" >&5
 ac_lib_var=`echo gnugetopt'_'getopt_long | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1964,7 +2022,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgnugetopt  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1968 "configure"
+#line 2026 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1975,7 +2033,7 @@ int main() {
 getopt_long()
 ; return 0; }
 EOF
-if { (eval echo configure:1979: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2037: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2007,17 +2065,17 @@ for ac_hdr in unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2011: checking for $ac_hdr" >&5
+echo "configure:2069: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2016 "configure"
+#line 2074 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2021: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2079: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2046,12 +2104,12 @@ done
 for ac_func in getpagesize
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2050: checking for $ac_func" >&5
+echo "configure:2108: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2055 "configure"
+#line 2113 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -2074,7 +2132,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2078: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -2099,7 +2157,7 @@ fi
 done
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:2103: checking for working mmap" >&5
+echo "configure:2161: checking for working mmap" >&5
 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2107,7 +2165,7 @@ else
   ac_cv_func_mmap_fixed_mapped=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 2111 "configure"
+#line 2169 "configure"
 #include "confdefs.h"
 
 /* Thanks to Mike Haertel and Jim Avera for this test.
@@ -2247,7 +2305,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:2251: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_mmap_fixed_mapped=yes
 else
@@ -2270,12 +2328,12 @@ EOF
 fi
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:2274: checking return type of signal handlers" >&5
+echo "configure:2332: checking return type of signal handlers" >&5
 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2279 "configure"
+#line 2337 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -2292,7 +2350,7 @@ int main() {
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:2296: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2354: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -2311,7 +2369,7 @@ EOF
 
 
 echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:2315: checking for dlopen in -ldl" >&5
+echo "configure:2373: checking for dlopen in -ldl" >&5
 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2319,7 +2377,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2323 "configure"
+#line 2381 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2330,7 +2388,7 @@ int main() {
 dlopen()
 ; return 0; }
 EOF
-if { (eval echo configure:2334: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2392: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2351,7 +2409,7 @@ else
 fi
 
 echo $ac_n "checking for pow in -lm""... $ac_c" 1>&6
-echo "configure:2355: checking for pow in -lm" >&5
+echo "configure:2413: checking for pow in -lm" >&5
 ac_lib_var=`echo m'_'pow | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2359,7 +2417,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2363 "configure"
+#line 2421 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2370,7 +2428,7 @@ int main() {
 pow()
 ; return 0; }
 EOF
-if { (eval echo configure:2374: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2432: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2396,7 +2454,7 @@ CFLAGS="${CFLAGS} -I/usr/local/include"
 
 PTHREAD_LIBS=error
 echo $ac_n "checking for pthread_attr_init in -lpthread""... $ac_c" 1>&6
-echo "configure:2400: checking for pthread_attr_init in -lpthread" >&5
+echo "configure:2458: checking for pthread_attr_init in -lpthread" >&5
 ac_lib_var=`echo pthread'_'pthread_attr_init | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2404,7 +2462,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthread  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2408 "configure"
+#line 2466 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2415,7 +2473,7 @@ int main() {
 pthread_attr_init()
 ; return 0; }
 EOF
-if { (eval echo configure:2419: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2477: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2430,14 +2488,14 @@ LIBS="$ac_save_LIBS"
 fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  PTHREAD_LIBS="-lpthread"
+  THREAD_LIB="-lpthread"
 else
   echo "$ac_t""no" 1>&6
 fi
 
-if test "x${PTHREAD_LIBS}" = xerror; then
+if test "x${THREAD_LIB}" = xerror; then
   echo $ac_n "checking for pthread_attr_init in -lpthreads""... $ac_c" 1>&6
-echo "configure:2441: checking for pthread_attr_init in -lpthreads" >&5
+echo "configure:2499: checking for pthread_attr_init in -lpthreads" >&5
 ac_lib_var=`echo pthreads'_'pthread_attr_init | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2445,7 +2503,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthreads  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2449 "configure"
+#line 2507 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2456,7 +2514,7 @@ int main() {
 pthread_attr_init()
 ; return 0; }
 EOF
-if { (eval echo configure:2460: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2518: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2471,15 +2529,15 @@ LIBS="$ac_save_LIBS"
 fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  PTHREAD_LIBS="-lpthreads"
+  THREAD_LIB="-lpthreads"
 else
   echo "$ac_t""no" 1>&6
 fi
 
 fi
-if test "x${PTHREAD_LIBS}" = xerror; then
+if test "x${THREAD_LIB}" = xerror; then
   echo $ac_n "checking for pthread_attr_init in -lc_r""... $ac_c" 1>&6
-echo "configure:2483: checking for pthread_attr_init in -lc_r" >&5
+echo "configure:2541: checking for pthread_attr_init in -lc_r" >&5
 ac_lib_var=`echo c_r'_'pthread_attr_init | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2487,7 +2545,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lc_r  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2491 "configure"
+#line 2549 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2498,7 +2556,7 @@ int main() {
 pthread_attr_init()
 ; return 0; }
 EOF
-if { (eval echo configure:2502: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2513,21 +2571,21 @@ LIBS="$ac_save_LIBS"
 fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  PTHREAD_LIBS="-lc_r"
+  THREAD_LIB="-lc_r"
 else
   echo "$ac_t""no" 1>&6
 fi
 
 fi
-if test "x${PTHREAD_LIBS}" = xerror; then
-  PTHREAD_LIBS=""
+if test "x${THREAD_LIB}" = xerror; then
+  THREAD_LIBS=""
   echo $ac_n "checking for pthread_attr_init""... $ac_c" 1>&6
-echo "configure:2526: checking for pthread_attr_init" >&5
+echo "configure:2584: checking for pthread_attr_init" >&5
 if eval "test \"`echo '$''{'ac_cv_func_pthread_attr_init'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2531 "configure"
+#line 2589 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char pthread_attr_init(); below.  */
@@ -2550,7 +2608,7 @@ pthread_attr_init();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2554: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2612: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_pthread_attr_init=yes"
 else
@@ -2570,10 +2628,9 @@ else
 fi
 
 fi
-LIB="${LIB} ${PTHREAD_LIBS}"
 
 cat > conftest.$ac_ext <<EOF
-#line 2577 "configure"
+#line 2634 "configure"
 #include "confdefs.h"
 #include <pthread.h>
 EOF
@@ -2585,12 +2642,11 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
 #define PTHREAD_COND_T_IN_PTHREAD_H 1
 EOF
 
-
 fi
 rm -f conftest*
 
 cat > conftest.$ac_ext <<EOF
-#line 2594 "configure"
+#line 2650 "configure"
 #include "confdefs.h"
 #include <strings.h>
 EOF
@@ -2602,7 +2658,6 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
 #define STRNCASECMP_IN_STRINGS_H 1
 EOF
 
-
 fi
 rm -f conftest*
 
@@ -2611,17 +2666,17 @@ for ac_hdr in stddef.h getopt.h strings.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2615: checking for $ac_hdr" >&5
+echo "configure:2670: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2620 "configure"
+#line 2675 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2625: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2651,17 +2706,17 @@ for ac_hdr in sys/sockio.h fcntl.h sys/time.h unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2655: checking for $ac_hdr" >&5
+echo "configure:2710: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2660 "configure"
+#line 2715 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2665: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2720: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2691,17 +2746,17 @@ for ac_hdr in sys/soundcard.h machine/soundcard.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2695: checking for $ac_hdr" >&5
+echo "configure:2750: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2700 "configure"
+#line 2755 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2705: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2760: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2731,17 +2786,17 @@ for ac_hdr in dlfcn.h image.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2735: checking for $ac_hdr" >&5
+echo "configure:2790: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2740 "configure"
+#line 2795 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2745: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2800: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2771,17 +2826,17 @@ for ac_hdr in arpa/inet.h net/if.h netinet/in.h sys/socket.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2775: checking for $ac_hdr" >&5
+echo "configure:2830: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2780 "configure"
+#line 2835 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2785: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2811,17 +2866,17 @@ for ac_hdr in machine/param.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2815: checking for $ac_hdr" >&5
+echo "configure:2870: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2820 "configure"
+#line 2875 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2825: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2880: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2852,17 +2907,17 @@ for ac_hdr in cthreads.h pthread.h kernel/scheduler.h kernel/OS.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2856: checking for $ac_hdr" >&5
+echo "configure:2911: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2861 "configure"
+#line 2916 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2866: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2921: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2891,9 +2946,9 @@ done
 
 CFLAGS="${save_CFLAGS} -Wall -Werror"
 echo $ac_n "checking for ntohl in sys/param.h""... $ac_c" 1>&6
-echo "configure:2895: checking for ntohl in sys/param.h" >&5
+echo "configure:2950: checking for ntohl in sys/param.h" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2897 "configure"
+#line 2952 "configure"
 #include "confdefs.h"
 #include <sys/param.h>
 void foo() { int meuh; ntohl(meuh); }
@@ -2901,7 +2956,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2905: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2960: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define NTOHL_IN_SYS_PARAM_H 1
@@ -2918,16 +2973,16 @@ rm -f conftest*
 
 CFLAGS="${save_CFLAGS} -bundle -undefined suppress"
 echo $ac_n "checking if \$CC compiles plugins with -bundle -undefined suppress""... $ac_c" 1>&6
-echo "configure:2922: checking if \$CC compiles plugins with -bundle -undefined suppress" >&5
+echo "configure:2977: checking if \$CC compiles plugins with -bundle -undefined suppress" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2924 "configure"
+#line 2979 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2931: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2986: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   PLCFLAGS="${PLCFLAGS} -bundle -undefined suppress"; echo "$ac_t""yes" 1>&6
 else
@@ -2940,16 +2995,16 @@ rm -f conftest*
 
 CFLAGS="${save_CFLAGS} -shared"
 echo $ac_n "checking if \$CC compiles plugins with -shared""... $ac_c" 1>&6
-echo "configure:2944: checking if \$CC compiles plugins with -shared" >&5
+echo "configure:2999: checking if \$CC compiles plugins with -shared" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2946 "configure"
+#line 3001 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2953: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3008: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   PLCFLAGS="${PLCFLAGS} -shared"; echo "$ac_t""yes" 1>&6
 else
@@ -2963,9 +3018,9 @@ rm -f conftest*
 CFLAGS="${save_CFLAGS}"
 
 echo $ac_n "checking for boolean_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:2967: checking for boolean_t in sys/types.h" >&5
+echo "configure:3022: checking for boolean_t in sys/types.h" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2969 "configure"
+#line 3024 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 void quux() { boolean_t foo; }
@@ -2973,7 +3028,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2977: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3032: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define BOOLEAN_T_IN_SYS_TYPES_H 1
@@ -2988,9 +3043,9 @@ else
 fi
 rm -f conftest*
 echo $ac_n "checking for boolean_t in pthread.h""... $ac_c" 1>&6
-echo "configure:2992: checking for boolean_t in pthread.h" >&5
+echo "configure:3047: checking for boolean_t in pthread.h" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2994 "configure"
+#line 3049 "configure"
 #include "confdefs.h"
 #include <pthread.h>
 void quux() { boolean_t foo; }
@@ -2998,7 +3053,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3057: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define BOOLEAN_T_IN_PTHREAD_H 1
@@ -3014,12 +3069,12 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:3018: checking for working const" >&5
+echo "configure:3073: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3023 "configure"
+#line 3078 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -3068,7 +3123,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:3072: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3127: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -3089,12 +3144,12 @@ EOF
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:3093: checking for ANSI C header files" >&5
+echo "configure:3148: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3098 "configure"
+#line 3153 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -3102,7 +3157,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3106: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3161: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3119,7 +3174,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3123 "configure"
+#line 3178 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -3137,7 +3192,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3141 "configure"
+#line 3196 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -3158,7 +3213,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 3162 "configure"
+#line 3217 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -3169,7 +3224,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:3173: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3228: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -3193,12 +3248,12 @@ EOF
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:3197: checking for size_t" >&5
+echo "configure:3252: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3202 "configure"
+#line 3257 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3226,12 +3281,12 @@ EOF
 fi
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:3230: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:3285: checking whether time.h and sys/time.h may both be included" >&5
 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3235 "configure"
+#line 3290 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -3240,7 +3295,7 @@ int main() {
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:3244: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3299: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -3278,16 +3333,16 @@ case x$host_os in
 esac
 
 echo $ac_n "checking if \$CC groks MMX inline assembly""... $ac_c" 1>&6
-echo "configure:3282: checking if \$CC groks MMX inline assembly" >&5
+echo "configure:3337: checking if \$CC groks MMX inline assembly" >&5
 cat > conftest.$ac_ext <<EOF
-#line 3284 "configure"
+#line 3339 "configure"
 #include "confdefs.h"
 void quux(){void *p;asm("packuswb %%mm1,%%mm2"::"r"(p));}
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3291: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3346: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ACCEL_MODULES="${ACCEL_MODULES} ${MMX_MODULES}"
   echo "$ac_t""yes" 1>&6
@@ -3300,16 +3355,16 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking if \$CC groks MMX EXT or SSE inline assembly""... $ac_c" 1>&6
-echo "configure:3304: checking if \$CC groks MMX EXT or SSE inline assembly" >&5
+echo "configure:3359: checking if \$CC groks MMX EXT or SSE inline assembly" >&5
 cat > conftest.$ac_ext <<EOF
-#line 3306 "configure"
+#line 3361 "configure"
 #include "confdefs.h"
 void quux(){void *p;asm("maskmovq %%mm1,%%mm2"::"r"(p));}
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3313: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3368: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ACCEL_MODULES="${ACCEL_MODULES} ${MMXEXT_MODULES}"
   echo "$ac_t""yes" 1>&6
@@ -3325,17 +3380,17 @@ for ac_hdr in sys/ioctl.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3329: checking for $ac_hdr" >&5
+echo "configure:3384: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3334 "configure"
+#line 3389 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3339: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3394: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3356,24 +3411,22 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
 #define $ac_tr_hdr 1
 EOF
  
-  BUILTINS="${BUILTINS} dvd"
-  LIB_DVD="${LIB_DVD} -Llib -L../../lib -ldvdcss"
-  CFLAGS_DVD="${CFLAGS_DVD} -I../../extras/libdvdcss"
+  LIBDVDCSS=1
   for ac_hdr in sys/cdio.h sys/dvdio.h linux/cdrom.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3367: checking for $ac_hdr" >&5
+echo "configure:3420: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3372 "configure"
+#line 3425 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3377: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3430: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3401,7 +3454,7 @@ done
 
   BSD_DVD_STRUCT=0
         cat > conftest.$ac_ext <<EOF
-#line 3405 "configure"
+#line 3458 "configure"
 #include "confdefs.h"
 #include <sys/dvdio.h>
 EOF
@@ -3419,7 +3472,7 @@ fi
 rm -f conftest*
 
         cat > conftest.$ac_ext <<EOF
-#line 3423 "configure"
+#line 3476 "configure"
 #include "confdefs.h"
 #include <sys/cdio.h>
 EOF
@@ -3443,7 +3496,7 @@ EOF
 
   fi
         cat > conftest.$ac_ext <<EOF
-#line 3447 "configure"
+#line 3500 "configure"
 #include "confdefs.h"
 #include <linux/cdrom.h>
 EOF
@@ -3466,32 +3519,80 @@ fi
 done
 
 
-# Check whether --enable-dummy or --disable-dummy was given.
-if test "${enable_dummy+set}" = set; then
-  enableval="$enable_dummy"
-  :
+# Check whether --enable-pth or --disable-pth was given.
+if test "${enable_pth+set}" = set; then
+  enableval="$enable_pth"
+   if test x$enableval = xyes; then
+    echo $ac_n "checking for pth_init in -lpth""... $ac_c" 1>&6
+echo "configure:3528: checking for pth_init in -lpth" >&5
+ac_lib_var=`echo pth'_'pth_init | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lpth  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3536 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char pth_init();
+
+int main() {
+pth_init()
+; return 0; }
+EOF
+if { (eval echo configure:3547: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
 fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
 
-if test x$enable_dummy != xno; then
-  BUILTINS="${BUILTINS} dummy"; fi
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo pth | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
 
-# Check whether --enable-null or --disable-null was given.
-if test "${enable_null+set}" = set; then
-  enableval="$enable_null"
-  :
+  LIBS="-lpth $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
 fi
 
-if test x$enable_null != xno; then
-  BUILTINS="${BUILTINS} null"; fi
+    cat > conftest.$ac_ext <<EOF
+#line 3575 "configure"
+#include "confdefs.h"
+#include <pth.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "pth_init" >/dev/null 2>&1; then
+  rm -rf conftest*
+  
+      cat >> confdefs.h <<\EOF
+#define PTH_INIT_IN_PTH_H 1
+EOF
 
-# Check whether --enable-rc or --disable-rc was given.
-if test "${enable_rc+set}" = set; then
-  enableval="$enable_rc"
-  :
+    THREAD_LIB="-lpth"
+    fi
 fi
+rm -f conftest*
 
-if test x$enable_rc != xno; then
-  BUILTINS="${BUILTINS} rc"; fi
+
+fi
+
+
+LIB="${LIB} ${THREAD_LIB}"
 
 # Check whether --enable-ppro or --disable-ppro was given.
 if test "${enable_ppro+set}" = set; then
@@ -3567,6 +3668,83 @@ else
 fi
 
 
+for ac_hdr in videolan/dvdcss.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:3676: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3681 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+  # installed libdvdcss
+  BUILTINS="${BUILTINS} dvd"
+  LIB_DVD="${LIB_DVD} -ldvdcss"
+else
+  echo "$ac_t""no" 1>&6
+if test x${LIBDVDCSS} = x1; then
+    # local libdvdcss
+    LOCAL_LIBDVDCSS=1
+    BUILTINS="${BUILTINS} dvd"
+    CFLAGS_DVD="${CFLAGS_DVD} -I../../extras/libdvdcss"
+  fi
+fi
+done
+
+
+# Check whether --enable-dummy or --disable-dummy was given.
+if test "${enable_dummy+set}" = set; then
+  enableval="$enable_dummy"
+  :
+fi
+
+if test x$enable_dummy != xno; then
+  BUILTINS="${BUILTINS} dummy"; fi
+
+# Check whether --enable-null or --disable-null was given.
+if test "${enable_null+set}" = set; then
+  enableval="$enable_null"
+  :
+fi
+
+if test x$enable_null != xno; then
+  BUILTINS="${BUILTINS} null"; fi
+
+# Check whether --enable-rc or --disable-rc was given.
+if test "${enable_rc+set}" = set; then
+  enableval="$enable_rc"
+  :
+fi
+
+if test x$enable_rc != xno; then
+  BUILTINS="${BUILTINS} rc"; fi
+
 SYS=${host_os}
 
 if test x$host_os = xbeos; then
@@ -3595,7 +3773,7 @@ if test "${enable_esd+set}" = set; then
      # Extract the first word of "esd-config", so it can be a program name with args.
 set dummy esd-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3599: checking for $ac_word" >&5
+echo "configure:3777: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_ESD_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3660,17 +3838,17 @@ else
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3664: checking for $ac_hdr" >&5
+echo "configure:3842: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3669 "configure"
+#line 3847 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3674: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3852: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3741,17 +3919,17 @@ if test "${with_sdl+set}" = set; then
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3745: checking for $ac_hdr" >&5
+echo "configure:3923: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3750 "configure"
+#line 3928 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3755: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3933: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3789,17 +3967,17 @@ fi
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3793: checking for $ac_hdr" >&5
+echo "configure:3971: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3798 "configure"
+#line 3976 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3803: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3981: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3836,24 +4014,24 @@ if test "${with_directx+set}" = set; then
       PLUGINS="${PLUGINS} directx";
       if test "x$withval" != "xyes";
       then
-        LIB_DIRECTX="${LIB_DIRECTX} -L"$withval"/lib -lddraw -ldsound"
+        LIB_DIRECTX="${LIB_DIRECTX} -L"$withval"/lib -lgdi32 -ldxguid"
         INCLUDE="${INCLUDE} -I"$withval"/include"
       else
         for ac_hdr in directx.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3847: checking for $ac_hdr" >&5
+echo "configure:4025: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3852 "configure"
+#line 4030 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3857: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4035: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3880,7 +4058,7 @@ echo "Cannot find DirectX headers !"; exit
 fi
 done
 
-        LIB_DIRECTX="${LIB_DIRECTX} -L/usr/lib -lddraw -ldsound"
+        LIB_DIRECTX="${LIB_DIRECTX} -L/usr/lib -lgdi32 -ldxguid"
       fi
     fi 
 fi
@@ -3891,17 +4069,17 @@ fi
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3895: checking for $ac_hdr" >&5
+echo "configure:4073: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3900 "configure"
+#line 4078 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3905: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4083: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3922,7 +4100,7 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
 #define $ac_tr_hdr 1
 EOF
  PLUGINS="${PLUGINS} directx"
-       LIB_DIRECTX="${LIB_DIRECTX} -L/usr/lib -lddraw -ldsound"
+       LIB_DIRECTX="${LIB_DIRECTX} -L/usr/lib -lgdi32 -ldxguid"
 else
   echo "$ac_t""no" 1>&6
 fi
@@ -4001,7 +4179,7 @@ if test x$enable_gtk != xno; then
   # Extract the first word of "gtk-config", so it can be a program name with args.
 set dummy gtk-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4005: checking for $ac_word" >&5
+echo "configure:4183: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4061,17 +4239,17 @@ if test x$enable_x11 != xno; then
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4065: checking for $ac_hdr" >&5
+echo "configure:4243: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4070 "configure"
+#line 4248 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4075: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4253: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4123,17 +4301,17 @@ if test x$enable_xvideo != xno; then
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4127: checking for $ac_hdr" >&5
+echo "configure:4305: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4132 "configure"
+#line 4310 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4137: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4315: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4171,17 +4349,17 @@ if test "${enable_alsa+set}" = set; then
   enableval="$enable_alsa"
   if test x$enable_alsa = xyes; then ac_safe=`echo "sys/asoundlib.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/asoundlib.h""... $ac_c" 1>&6
-echo "configure:4175: checking for sys/asoundlib.h" >&5
+echo "configure:4353: checking for sys/asoundlib.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4180 "configure"
+#line 4358 "configure"
 #include "confdefs.h"
 #include <sys/asoundlib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4185: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4363: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4198,7 +4376,7 @@ fi
 if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for main in -lasound""... $ac_c" 1>&6
-echo "configure:4202: checking for main in -lasound" >&5
+echo "configure:4380: checking for main in -lasound" >&5
 ac_lib_var=`echo asound'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4206,14 +4384,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lasound  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4210 "configure"
+#line 4388 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:4217: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4395: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4287,6 +4465,9 @@ fi
 
 
 
+
+
+
 
 
 
@@ -4450,6 +4631,7 @@ s%@DEFINE@%$DEFINE%g
 s%@INCLUDE@%$INCLUDE%g
 s%@DEBUG@%$DEBUG%g
 s%@STATS@%$STATS%g
+s%@ASM@%$ASM%g
 s%@TRACE@%$TRACE%g
 s%@OPTIMS@%$OPTIMS%g
 s%@CSS@%$CSS%g
@@ -4481,6 +4663,7 @@ s%@CFLAGS_DVD@%$CFLAGS_DVD%g
 s%@CFLAGS_GTK@%$CFLAGS_GTK%g
 s%@CFLAGS_SDL@%$CFLAGS_SDL%g
 s%@CFLAGS_X11@%$CFLAGS_X11%g
+s%@LOCAL_LIBDVDCSS@%$LOCAL_LIBDVDCSS%g
 
 CEOF
 EOF
@@ -4707,6 +4890,7 @@ global configuration
 system                : ${SYS}
 architecture          : ${ARCH}
 optimizations         : ${OPTIMS}
+inline assembly       : ${ASM}
 
 vlc configuration
 -----------------
index 1525a275d104dda94e4e0857f006a183c55d82b6..d59cd2d56a04ca904b8042867a5b214e878898ad 100644 (file)
@@ -50,6 +50,8 @@ AC_CHECK_FUNC(inet_aton,,[
 AC_CHECK_FUNCS(vasprintf)
 AC_CHECK_FUNCS(swab)
 
+AC_CHECK_FUNCS(sigrelse)
+
 AC_CHECK_FUNC(getopt_long,[AC_DEFINE(HAVE_GETOPT_LONG,1,long getopt support)],
 [ # FreeBSD has a gnugetopt library for this:
   AC_CHECK_LIB([gnugetopt],[getopt_long],
@@ -67,28 +69,25 @@ CFLAGS="${CFLAGS} -I/usr/local/include"
 
 dnl Check for pthreads - borrowed from XMMS
 PTHREAD_LIBS=error
-AC_CHECK_LIB(pthread,pthread_attr_init,PTHREAD_LIBS="-lpthread")
-if test "x${PTHREAD_LIBS}" = xerror; then
-  AC_CHECK_LIB(pthreads,pthread_attr_init,PTHREAD_LIBS="-lpthreads")
+AC_CHECK_LIB(pthread,pthread_attr_init,THREAD_LIB="-lpthread")
+if test "x${THREAD_LIB}" = xerror; then
+  AC_CHECK_LIB(pthreads,pthread_attr_init,THREAD_LIB="-lpthreads")
 fi
-if test "x${PTHREAD_LIBS}" = xerror; then
-  AC_CHECK_LIB(c_r,pthread_attr_init,PTHREAD_LIBS="-lc_r")
+if test "x${THREAD_LIB}" = xerror; then
+  AC_CHECK_LIB(c_r,pthread_attr_init,THREAD_LIB="-lc_r")
 fi
-if test "x${PTHREAD_LIBS}" = xerror; then
-  PTHREAD_LIBS=""
+if test "x${THREAD_LIB}" = xerror; then
+  THREAD_LIBS=""
   AC_CHECK_FUNC(pthread_attr_init)
 fi
-LIB="${LIB} ${PTHREAD_LIBS}"
 
 dnl Check for misc headers
 AC_EGREP_HEADER(pthread_cond_t,pthread.h,[
   AC_DEFINE(PTHREAD_COND_T_IN_PTHREAD_H, 1,
-            Define if <pthread.h> defines pthread_cond_t.)
-])
+            Define if <pthread.h> defines pthread_cond_t.)])
 AC_EGREP_HEADER(strncasecmp,strings.h,[
   AC_DEFINE(STRNCASECMP_IN_STRINGS_H, 1,
-            Define if <strings.h> defines strncasecmp.)
-])
+            Define if <strings.h> defines strncasecmp.)])
 
 dnl Check for headers
 AC_CHECK_HEADERS(stddef.h getopt.h strings.h)
@@ -176,12 +175,10 @@ AC_TRY_COMPILE([void quux(){void *p;asm("maskmovq %%mm1,%%mm2"::"r"(p));}],,
   AC_MSG_RESULT(yes), AC_MSG_RESULT(no))
 
 dnl
-dnl  DVD module: check for DVD ioctls
+dnl  libdvdcss: check for DVD ioctls
 dnl
 AC_CHECK_HEADERS(sys/ioctl.h,[
-  BUILTINS="${BUILTINS} dvd"
-  LIB_DVD="${LIB_DVD} -Llib -L../../lib -ldvdcss"
-  CFLAGS_DVD="${CFLAGS_DVD} -I../../extras/libdvdcss"
+  LIBDVDCSS=1
   AC_CHECK_HEADERS(sys/cdio.h sys/dvdio.h linux/cdrom.h)
   BSD_DVD_STRUCT=0
   dnl
@@ -214,34 +211,26 @@ AC_CHECK_HEADERS(sys/ioctl.h,[
 ])
 
 dnl
-dnl  dummy plugin
-dnl
-AC_ARG_ENABLE(dummy,
-  [  --disable-dummy         dummy module (default enabled)])
-if test x$enable_dummy != xno; then
-  BUILTINS="${BUILTINS} dummy"; fi
-
-dnl
-dnl  null plugin
+dnl  GNU portable threads
 dnl
-AC_ARG_ENABLE(null,
-  [  --disable-null          Null module (default enabled)])
-if test x$enable_null != xno; then
-  BUILTINS="${BUILTINS} null"; fi
+AC_ARG_ENABLE(pth,
+  [  --enable-pth            Enable GNU Pth support (default disabled)],
+  [ if test x$enableval = xyes; then
+    AC_CHECK_LIB(pth,pth_init)
+    AC_EGREP_HEADER(pth_init,pth.h,[
+      AC_DEFINE(PTH_INIT_IN_PTH_H, 1,
+                Define if <pth.h> defines pth_init)
+    THREAD_LIB="-lpth"
+    fi])
+])
 
-dnl
-dnl  rc plugin
-dnl
-AC_ARG_ENABLE(rc,
-  [  --disable-rc            rc module (default enabled)])
-if test x$enable_rc != xno; then
-  BUILTINS="${BUILTINS} rc"; fi
+LIB="${LIB} ${THREAD_LIB}"
 
 dnl
 dnl  PentiumPro acceleration
 dnl
 AC_ARG_ENABLE(ppro,
-[  --disable-ppro          Disable PentiumPro optimizations (default enabled for x86)],
+  [  --disable-ppro          Disable PentiumPro optimizations (default enabled for x86)],
 [ if test x$enableval = xyes; then ARCH="${ARCH} ppro"; fi ],
 [ if test x${host_cpu} = xi686; then ARCH="${ARCH} ppro"; fi ])
 
@@ -303,6 +292,45 @@ AC_ARG_ENABLE(optimizations,
 [ if test x$enableval = xno; then OPTIMS=0; fi ],
 [ OPTIMS=1 ])
 
+dnl
+dnl  DVD module: check for installed libdvdcss or local libdvdcss
+dnl  TODO: use user-provided --with-dvdcss flag
+dnl
+AC_CHECK_HEADERS(videolan/dvdcss.h,[
+  # installed libdvdcss
+  BUILTINS="${BUILTINS} dvd"
+  LIB_DVD="${LIB_DVD} -ldvdcss"],
+  [if test x${LIBDVDCSS} = x1; then
+    # local libdvdcss
+    LOCAL_LIBDVDCSS=1
+    BUILTINS="${BUILTINS} dvd"
+    CFLAGS_DVD="${CFLAGS_DVD} -I../../extras/libdvdcss"
+  fi])
+
+dnl
+dnl  dummy plugin
+dnl
+AC_ARG_ENABLE(dummy,
+  [  --disable-dummy         dummy module (default enabled)])
+if test x$enable_dummy != xno; then
+  BUILTINS="${BUILTINS} dummy"; fi
+
+dnl
+dnl  null plugin
+dnl
+AC_ARG_ENABLE(null,
+  [  --disable-null          Null module (default enabled)])
+if test x$enable_null != xno; then
+  BUILTINS="${BUILTINS} null"; fi
+
+dnl
+dnl  rc plugin
+dnl
+AC_ARG_ENABLE(rc,
+  [  --disable-rc            rc module (default enabled)])
+if test x$enable_rc != xno; then
+  BUILTINS="${BUILTINS} rc"; fi
+
 SYS=${host_os}
 
 dnl special case for BeOS
@@ -423,18 +451,18 @@ AC_ARG_WITH(directx,
       PLUGINS="${PLUGINS} directx";
       if test "x$withval" != "xyes";
       then
-        LIB_DIRECTX="${LIB_DIRECTX} -L"$withval"/lib -lddraw -ldsound"
+        LIB_DIRECTX="${LIB_DIRECTX} -L"$withval"/lib -lgdi32 -ldxguid"
         INCLUDE="${INCLUDE} -I"$withval"/include"
       else
         AC_CHECK_HEADERS(directx.h, , [echo "Cannot find DirectX headers !"; exit])
-        LIB_DIRECTX="${LIB_DIRECTX} -L/usr/lib -lddraw -ldsound"
+        LIB_DIRECTX="${LIB_DIRECTX} -L/usr/lib -lgdi32 -ldxguid"
       fi
     fi ])
     if test "x$withval" = "x";
     then
       AC_CHECK_HEADERS(directx.h,
       [PLUGINS="${PLUGINS} directx"
-       LIB_DIRECTX="${LIB_DIRECTX} -L/usr/lib -lddraw -ldsound"])
+       LIB_DIRECTX="${LIB_DIRECTX} -L/usr/lib -lgdi32 -ldxguid"])
     fi
 
 dnl
@@ -582,6 +610,7 @@ AC_SUBST(DEFINE)
 AC_SUBST(INCLUDE)
 AC_SUBST(DEBUG)
 AC_SUBST(STATS)
+AC_SUBST(ASM)
 AC_SUBST(TRACE)
 AC_SUBST(OPTIMS)
 AC_SUBST(CSS)
@@ -617,6 +646,8 @@ AC_SUBST(CFLAGS_GTK)
 AC_SUBST(CFLAGS_SDL)
 AC_SUBST(CFLAGS_X11)
 
+AC_SUBST(LOCAL_LIBDVDCSS)
+
 AC_OUTPUT([Makefile.opts include/config.h])
 
 echo "
@@ -625,6 +656,7 @@ global configuration
 system                : ${SYS}
 architecture          : ${ARCH}
 optimizations         : ${OPTIMS}
+inline assembly       : ${ASM}
 
 vlc configuration
 -----------------
index 9d77cfbc0f6d7b6e1bc1570a70323c2ce8404dba..71d480c435b3826ac3e5960a8b79e150efdeda4e 100644 (file)
@@ -2,7 +2,7 @@ Source: vlc
 Section: graphics
 Priority: optional
 Maintainer: Samuel Hocevar <sam@zoy.org>
-Build-Depends: debhelper (>=2.2.0), xlib6g-dev, libgnome-dev, libggi2-dev, libglide-dev [i386], libesd0-dev, libsdl1.2-dev, libqt-dev, libasound2-dev
+Build-Depends: debhelper (>=2.2.0), xlib6g-dev, libgnome-dev, libggi2-dev, libglide3-dev [i386], libesd0-dev, libsdl1.2-dev, libqt-dev, libasound2-dev
 Standards-Version: 3.0.1
 
 Package: vlc
index 149859ebf8291246379f1fd9a6550107749ad39b..4b06ce53664c1dd58d19ce17b6c0fc6eb1adec0d 100644 (file)
@@ -5,6 +5,9 @@
 
 include ../../Makefile.opts
 
+LIBDVDCSS_VERSION = 0.0.1
+LIBDVDCSS_MAJOR = 0
+
 #
 # Objects
 #
@@ -18,13 +21,23 @@ $(LIBDVDCSS_O): %.o: .dep/%.d
 $(LIBDVDCSS_O): %.o: %.c
        $(CC) $(CFLAGS) $(PCFLAGS) -c -o $@ $<
 
-../../lib/libdvdcss.so: $(LIBDVDCSS_O)
+../../lib/libdvdcss.so.$(LIBDVDCSS_VERSION): $(LIBDVDCSS_O)
        $(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS)
+       rm -f ../../lib/libdvdcss.so && ln -s libdvdcss.so.$(LIBDVDCSS_VERSION) ../../lib/libdvdcss.so
+       rm -f ../../lib/libdvdcss.so.$(LIBDVDCSS_MAJOR) && ln -s libdvdcss.so.$(LIBDVDCSS_VERSION) ../../lib/libdvdcss.so.$(LIBDVDCSS_MAJOR)
 
 ../../lib/libdvdcss.a: $(LIBDVDCSS_O)
        ar r $@ $^
        $(RANLIB) $@
 
-#all: ../../lib/libdvdcss.so ../../lib/libdvdcss.a
-all: ../../lib/libdvdcss.a
+all: ../../lib/libdvdcss.so.$(LIBDVDCSS_VERSION) ../../lib/libdvdcss.a
+
+install:
+       mkdir -p $(DESTDIR)$(includedir)/videolan
+       $(INSTALL) -m 644 videolan/dvdcss.h $(DESTDIR)$(includedir)/videolan
+       mkdir -p $(DESTDIR)$(libdir)
+       $(INSTALL) -m 644 ../../lib/libdvdcss.a $(DESTDIR)$(libdir)
+       $(INSTALL) -m 644 ../../lib/libdvdcss.so.$(LIBDVDCSS_VERSION) $(DESTDIR)$(libdir)
+       rm -f $(DESTDIR)$(libdir)/libdvdcss.so && ln -s libdvdcss.so.$(LIBDVDCSS_VERSION) $(DESTDIR)$(libdir)/libdvdcss.so
+       rm -f $(DESTDIR)$(libdir)/libdvdcss.so.$(LIBDVDCSS_MAJOR) && ln -s libdvdcss.so.$(LIBDVDCSS_VERSION) $(DESTDIR)$(libdir)/libdvdcss.so.$(LIBDVDCSS_MAJOR)
 
index d20ef9b5583e09987e0392383495d45a777085f7..c3404bea7ba2e5c4c361e9725f103da01ee52c56 100644 (file)
@@ -2,7 +2,7 @@
  * libdvdcss.c: DVD reading library.
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: libdvdcss.c,v 1.1 2001/06/12 22:14:44 sam Exp $
+ * $Id: libdvdcss.c,v 1.2 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -57,10 +57,12 @@ static int _dvdcss_read  ( dvdcss_handle, void *p_buffer, int i_blocks );
 static int _dvdcss_readv ( dvdcss_handle, struct iovec *p_iovec, int i_blocks );
 
 /*****************************************************************************
- * dvdcss_init: initialize libdvdcss
+ * dvdcss_open: initialize library, open a DVD device, crack CSS key
  *****************************************************************************/
-extern dvdcss_handle dvdcss_init ( int i_flags )
+extern dvdcss_handle dvdcss_open ( char *psz_target, int i_flags )
 {
+    int i_ret;
+
     dvdcss_handle dvdcss;
 
     /* Allocate the library structure */
@@ -76,50 +78,15 @@ extern dvdcss_handle dvdcss_init ( int i_flags )
     }
 
     /* Initialize structure */
-    dvdcss->i_status = DVDCSS_STATUS_NONE;
-
     dvdcss->b_debug = i_flags & DVDCSS_INIT_DEBUG;
     dvdcss->b_errors = !(i_flags & DVDCSS_INIT_QUIET);
     dvdcss->psz_error = "no error";
 
-    /* XXX: additional initialization stuff might come here */
-
-    dvdcss->i_status |= DVDCSS_STATUS_INIT;
-
-    return dvdcss;
-}
-
-/*****************************************************************************
- * dvdcss_error: return the last libdvdcss error message
- *****************************************************************************/
-extern char * dvdcss_error ( dvdcss_handle dvdcss )
-{
-    return dvdcss->psz_error;
-}
-
-/*****************************************************************************
- * dvdcss_open: open a DVD device, crack CSS key if disc is encrypted
- *****************************************************************************/
-extern int dvdcss_open ( dvdcss_handle dvdcss, char *psz_target )
-{
-    int i_ret;
-
-    if( ! (dvdcss->i_status & DVDCSS_STATUS_INIT) )
-    {
-        _dvdcss_error( dvdcss, "library not initialized" );
-        return -1;
-    }
-
-    if( dvdcss->i_status & DVDCSS_STATUS_OPEN )
-    {
-        _dvdcss_error( dvdcss, "a device is already opened" );
-        return -1;
-    }
-
     i_ret = _dvdcss_open( dvdcss, psz_target );
     if( i_ret < 0 )
     {
-        return i_ret;
+        free( dvdcss );
+        return NULL;
     }
 
     i_ret = CSSTest( dvdcss );
@@ -127,7 +94,8 @@ extern int dvdcss_open ( dvdcss_handle dvdcss, char *psz_target )
     {
         _dvdcss_error( dvdcss, "css test failed" );
         _dvdcss_close( dvdcss );
-        return i_ret;
+        free( dvdcss );
+        return NULL;
     }
 
     dvdcss->b_encrypted = i_ret;
@@ -140,13 +108,20 @@ extern int dvdcss_open ( dvdcss_handle dvdcss, char *psz_target )
         if( i_ret < 0 )
         {
             _dvdcss_close( dvdcss );
-            return i_ret;
+            free( dvdcss );
+            return NULL;
         }
     }
 
-    dvdcss->i_status |= DVDCSS_STATUS_OPEN;
+    return dvdcss;
+}
 
-    return 0;
+/*****************************************************************************
+ * dvdcss_error: return the last libdvdcss error message
+ *****************************************************************************/
+extern char * dvdcss_error ( dvdcss_handle dvdcss )
+{
+    return dvdcss->psz_error;
 }
 
 /*****************************************************************************
@@ -154,12 +129,6 @@ extern int dvdcss_open ( dvdcss_handle dvdcss, char *psz_target )
  *****************************************************************************/
 extern int dvdcss_seek ( dvdcss_handle dvdcss, int i_blocks )
 {
-    if( ! (dvdcss->i_status & DVDCSS_STATUS_OPEN) )
-    {
-        _dvdcss_error( dvdcss, "no device opened" );
-        return -1;
-    }
-
     return _dvdcss_seek( dvdcss, i_blocks );
 }
 
@@ -170,12 +139,6 @@ extern int dvdcss_crack ( dvdcss_handle dvdcss, int i_title, int i_block )
 {
     int i_ret;
 
-    if( ! (dvdcss->i_status & DVDCSS_STATUS_OPEN) )
-    {
-        _dvdcss_error( dvdcss, "no device opened" );
-        return -1;
-    }
-
     if( ! dvdcss->b_encrypted )
     {
         return 0;
@@ -210,12 +173,6 @@ extern int dvdcss_read ( dvdcss_handle dvdcss, void *p_buffer,
 {
     int i_ret;
 
-    if( ! (dvdcss->i_status & DVDCSS_STATUS_OPEN) )
-    {
-        _dvdcss_error( dvdcss, "no device opened" );
-        return -1;
-    }
-
     i_ret = _dvdcss_read( dvdcss, p_buffer, i_blocks );
 
     if( i_ret != i_blocks
@@ -248,12 +205,6 @@ extern int dvdcss_readv ( dvdcss_handle dvdcss, void *p_iovec,
     void *iov_base;
     size_t iov_len;
 
-    if( ! (dvdcss->i_status & DVDCSS_STATUS_OPEN) )
-    {
-        _dvdcss_error( dvdcss, "no device opened" );
-        return -1;
-    }
-
     i_ret = _dvdcss_readv( dvdcss, P_IOVEC, i_blocks );
 
     if( i_ret != i_blocks
@@ -296,18 +247,12 @@ extern int dvdcss_readv ( dvdcss_handle dvdcss, void *p_iovec,
 }
 
 /*****************************************************************************
- * dvdcss_close: close the DVD device
+ * dvdcss_close: close the DVD device and clean up the library
  *****************************************************************************/
 extern int dvdcss_close ( dvdcss_handle dvdcss )
 {
     int i_ret;
 
-    if( ! (dvdcss->i_status & DVDCSS_STATUS_OPEN) )
-    {
-        _dvdcss_error( dvdcss, "no device opened" );
-        return -1;
-    }
-
     i_ret = _dvdcss_close( dvdcss );
 
     if( i_ret < 0 )
@@ -315,22 +260,6 @@ extern int dvdcss_close ( dvdcss_handle dvdcss )
         return i_ret;
     }
 
-    dvdcss->i_status &= ~DVDCSS_STATUS_OPEN;
-
-    return 0;
-}
-
-/*****************************************************************************
- * dvdcss_end: clean up the library
- *****************************************************************************/
-extern int dvdcss_end ( dvdcss_handle dvdcss )
-{
-    if( dvdcss->i_status & DVDCSS_STATUS_OPEN )
-    {
-        _dvdcss_error( dvdcss, "a device is still open" );
-        return -1;
-    }
-
     free( dvdcss );
 
     return 0;
index 4870ee0125e8dc7a8dba3abd5bab689f294c23fb..8fadec1df9c1118e1c1843567a234bab005f073f 100644 (file)
@@ -2,7 +2,7 @@
  * private.h: private DVD reading library data
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: libdvdcss.h,v 1.1 2001/06/12 22:14:44 sam Exp $
+ * $Id: libdvdcss.h,v 1.2 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -32,9 +32,6 @@
  *****************************************************************************/
 struct dvdcss_s
 {
-    /* Status */
-    int i_status;
-
     /* File descriptor */
     int i_fd;
 
@@ -49,13 +46,6 @@ struct dvdcss_s
 
 };
 
-/*****************************************************************************
- * Flags
- *****************************************************************************/
-#define DVDCSS_STATUS_NONE     0
-#define DVDCSS_STATUS_INIT     1 << 0
-#define DVDCSS_STATUS_OPEN     1 << 1
-
 /*****************************************************************************
  * Error management
  *****************************************************************************/
index 63dacac6164f4531930ea6f28dc47508f6750af3..4ec87de3e4ed0481828796975e4f12aa539d7a0f 100644 (file)
@@ -2,7 +2,7 @@
  * libdvdcss.h: DVD reading library, exported functions.
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: dvdcss.h,v 1.1 2001/06/12 22:14:44 sam Exp $
+ * $Id: dvdcss.h,v 1.2 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -42,10 +42,8 @@ typedef struct dvdcss_s* dvdcss_handle;
 /*****************************************************************************
  * Exported prototypes
  *****************************************************************************/
-extern dvdcss_handle dvdcss_init  ( int i_flags );
-extern int           dvdcss_end   ( dvdcss_handle );
-extern int           dvdcss_open  ( dvdcss_handle,
-                                    char *psz_target );
+extern dvdcss_handle dvdcss_open  ( char *psz_target,
+                                    int i_flags );
 extern int           dvdcss_close ( dvdcss_handle );
 extern int           dvdcss_crack ( dvdcss_handle,
                                     int i_title,
index 693b60fd509234923d86d3831d507d65cbe2b906..9baf7bd49f207dd7d1aa661ecc42fa7f59c17895 100644 (file)
@@ -37,6 +37,9 @@
 /* Define if you have the setenv function.  */
 #undef HAVE_SETENV
 
+/* Define if you have the sigrelse function.  */
+#undef HAVE_SIGRELSE
+
 /* Define if you have the strerror function.  */
 #undef HAVE_STRERROR
 
@@ -73,6 +76,9 @@
 /* Define if you have the <cthreads.h> header file.  */
 #undef HAVE_CTHREADS_H
 
+/* Define if you have the <directx.h> header file.  */
+#undef HAVE_DIRECTX_H
+
 /* Define if you have the <dlfcn.h> header file.  */
 #undef HAVE_DLFCN_H
 
 /* Define if you have the <unistd.h> header file.  */
 #undef HAVE_UNISTD_H
 
+/* Define if you have the <videolan/dvdcss.h> header file.  */
+#undef HAVE_VIDEOLAN_DVDCSS_H
+
+/* Define if you have the pth library (-lpth).  */
+#undef HAVE_LIBPTH
+
 /* long getopt support */
 #undef HAVE_GETOPT_LONG
 
 /* Define if <linux/cdrom.h> defines DVD_STRUCT. */
 #undef DVD_STRUCT_IN_LINUX_CDROM_H
 
+/* Define if <pth.h> defines pth_init */
+#undef PTH_INIT_IN_PTH_H
+
 /* Define if you want DVD CSS decryption. */
 #undef HAVE_CSS
 
index bf67af4f193989cc2d9c1850bbb7db7ed7e30296..7984ca93c98a8ee2d4150d1f081648c9cb54ba3f 100644 (file)
@@ -3,7 +3,7 @@
  * This header provides a portable threads implementation.
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: threads.h,v 1.17 2001/04/28 03:36:25 sam Exp $
+ * $Id: threads.h,v 1.18 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@via.ecp.fr>
 
 #include <stdio.h>
 
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)      /* pthreads (like Linux & BSD) */
-#include <pthread.h>
+#if defined( PTH_INIT_IN_PTH_H )                                  /* GNU Pth */
+#   include <pth.h>
 
-#elif defined(HAVE_CTHREADS_H)                                    /* GNUMach */
-#include <cthreads.h>
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )  /* pthreads (like Linux & BSD) */
+#   include <pthread.h>
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)  /* BeOS */
-#undef MAX
-#undef MIN
-#include <kernel/OS.h>
-#include <kernel/scheduler.h>
-#include <byteorder.h>
+#elif defined( HAVE_CTHREADS_H )                                  /* GNUMach */
+#   include <cthreads.h>
 
-#elif defined(WIN32)                          /* Win32 with MinGW32 compiler */
-#include <windows.h>
-#include <process.h>
+#elif defined( HAVE_KERNEL_SCHEDULER_H )                             /* BeOS */
+#   undef MAX
+#   undef MIN
+#   include <kernel/OS.h>
+#   include <kernel/scheduler.h>
+#   include <byteorder.h>
+
+#elif defined( WIN32 )                        /* Win32 with MinGW32 compiler */
+#   include <windows.h>
+#   include <process.h>
 
 #else
-#error no threads available on your system !
+#   error no threads available on your system !
+
 #endif
 
 /*****************************************************************************
  * Types definition
  *****************************************************************************/
 
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+typedef pth_t            vlc_thread_t;
+typedef pth_mutex_t      vlc_mutex_t;
+typedef pth_cond_t       vlc_cond_t;
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
 typedef pthread_t        vlc_thread_t;
 typedef pthread_mutex_t  vlc_mutex_t;
 typedef pthread_cond_t   vlc_cond_t;
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
 typedef cthread_t        vlc_thread_t;
 
 /* Those structs are the ones defined in /include/cthreads.h but we need
@@ -101,7 +110,7 @@ typedef struct s_condition {
     struct cond_imp *implications;
 } vlc_cond_t;
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
 /* This is the BeOS implementation of the vlc threads, note that the mutex is
  * not a real mutex and the cond_var is not like a pthread cond_var but it is
  * enough for what wee need */
@@ -120,7 +129,7 @@ typedef struct
     thread_id       thread;
 } vlc_cond_t;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
 typedef HANDLE      vlc_thread_t;
 typedef HANDLE      vlc_mutex_t;
 typedef HANDLE      vlc_cond_t; 
@@ -159,21 +168,25 @@ static __inline__ int  vlc_cond_timedwait( vlc_cond_t *, vlc_mutex_t *,
  *****************************************************************************/
 static __inline__ int vlc_thread_create( vlc_thread_t *p_thread,
                                          char *psz_name, vlc_thread_func_t func,
-                                         void *p_data)
+                                         void *p_data )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    *p_thread = pth_spawn( PTH_ATTR_DEFAULT, func, p_data );
+    return ( p_thread == NULL );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_create( p_thread, NULL, func, p_data );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     *p_thread = cthread_fork( (cthread_fn_t)func, (any_t)p_data );
     return 0;
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     *p_thread = spawn_thread( (thread_func)func, psz_name,
                               B_NORMAL_PRIORITY, p_data );
     return resume_thread( *p_thread );
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
 #if 0
     DWORD threadID;
     /* This method is not recommended when using the MSVCRT C library,
@@ -198,17 +211,20 @@ static __inline__ int vlc_thread_create( vlc_thread_t *p_thread,
  *****************************************************************************/
 static __inline__ void vlc_thread_exit( void )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    pth_exit( 0 );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     pthread_exit( 0 );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     int result;
     cthread_exit( &result );
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     exit_thread( 0 );
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
 #if 0
     ExitThread( 0 );
 #endif
@@ -224,17 +240,20 @@ static __inline__ void vlc_thread_exit( void )
  *****************************************************************************/
 static __inline__ void vlc_thread_join( vlc_thread_t thread )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    pth_join( thread, NULL );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     pthread_join( thread, NULL );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     cthread_join( thread );
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     int32 exit_value;
     wait_for_thread( thread, &exit_value );
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     WaitForSingleObject( thread, INFINITE);
 
 #endif
@@ -245,14 +264,17 @@ static __inline__ void vlc_thread_join( vlc_thread_t thread )
  *****************************************************************************/
 static __inline__ int vlc_mutex_init( vlc_mutex_t *p_mutex )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    return pth_mutex_init( p_mutex );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_mutex_init( p_mutex, NULL );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     mutex_init( p_mutex );
     return 0;
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
 
     /* check the arguments and whether it's already been initialized */
     if( p_mutex == NULL )
@@ -274,7 +296,7 @@ static __inline__ int vlc_mutex_init( vlc_mutex_t *p_mutex )
     p_mutex->init = 9999;
     return B_OK;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     *p_mutex = CreateMutex(0,FALSE,0);
     return (*p_mutex?0:1);
 
@@ -286,14 +308,17 @@ static __inline__ int vlc_mutex_init( vlc_mutex_t *p_mutex )
  *****************************************************************************/
 static __inline__ int vlc_mutex_lock( vlc_mutex_t *p_mutex )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    return pth_mutex_acquire( p_mutex, TRUE, NULL );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_mutex_lock( p_mutex );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     mutex_lock( p_mutex );
     return 0;
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     status_t err;
 
     if( !p_mutex )
@@ -309,7 +334,7 @@ static __inline__ int vlc_mutex_lock( vlc_mutex_t *p_mutex )
     err = acquire_sem( p_mutex->lock );
     return err;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     WaitForSingleObject( *p_mutex, INFINITE );
     return 0;
 
@@ -321,14 +346,17 @@ static __inline__ int vlc_mutex_lock( vlc_mutex_t *p_mutex )
  *****************************************************************************/
 static __inline__ int vlc_mutex_unlock( vlc_mutex_t *p_mutex )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    return pth_mutex_release( p_mutex );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_mutex_unlock( p_mutex );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     mutex_unlock( p_mutex );
     return 0;
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     if( !p_mutex)
     {
         return B_BAD_VALUE;
@@ -342,7 +370,7 @@ static __inline__ int vlc_mutex_unlock( vlc_mutex_t *p_mutex )
     release_sem( p_mutex->lock );
     return B_OK;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     ReleaseMutex( *p_mutex );
     return 0;
 
@@ -354,10 +382,13 @@ static __inline__ int vlc_mutex_unlock( vlc_mutex_t *p_mutex )
  *****************************************************************************/
 static __inline__ int vlc_mutex_destroy( vlc_mutex_t *p_mutex )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)    
+#if defined( PTH_INIT_IN_PTH_H )
+    return 0;
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )    
     return pthread_mutex_destroy( p_mutex );
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     if( p_mutex->init == 9999 )
     {
         delete_sem( p_mutex->lock );
@@ -366,7 +397,7 @@ static __inline__ int vlc_mutex_destroy( vlc_mutex_t *p_mutex )
     p_mutex->init = 0;
     return B_OK;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     CloseHandle(*p_mutex);
     return 0;
 
@@ -378,10 +409,13 @@ static __inline__ int vlc_mutex_destroy( vlc_mutex_t *p_mutex )
  *****************************************************************************/
 static __inline__ int vlc_cond_init( vlc_cond_t *p_condvar )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    return pth_cond_init( p_condvar );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_cond_init( p_condvar, NULL );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     /* condition_init() */
     spin_lock_init( &p_condvar->lock );
     cthread_queue_init( &p_condvar->queue );
@@ -390,7 +424,7 @@ static __inline__ int vlc_cond_init( vlc_cond_t *p_condvar )
 
     return 0;
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     if( !p_condvar )
     {
         return B_BAD_VALUE;
@@ -405,7 +439,7 @@ static __inline__ int vlc_cond_init( vlc_cond_t *p_condvar )
     p_condvar->init = 9999;
     return 0;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     /* Create an auto-reset event. */
     *p_condvar = CreateEvent( NULL,   /* no security */
                               FALSE,  /* auto-reset event */
@@ -422,10 +456,13 @@ static __inline__ int vlc_cond_init( vlc_cond_t *p_condvar )
  *****************************************************************************/
 static __inline__ int vlc_cond_signal( vlc_cond_t *p_condvar )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    return pth_cond_notify( p_condvar, FALSE );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_cond_signal( p_condvar );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     /* condition_signal() */
     if ( p_condvar->queue.head || p_condvar->implications )
     {
@@ -433,7 +470,7 @@ static __inline__ int vlc_cond_signal( vlc_cond_t *p_condvar )
     }
     return 0;
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     if( !p_condvar )
     {
         return B_BAD_VALUE;
@@ -469,7 +506,7 @@ static __inline__ int vlc_cond_signal( vlc_cond_t *p_condvar )
     }
     return 0;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     /* Try to release one waiting thread. */
     PulseEvent ( *p_condvar );
     return 0;
@@ -482,14 +519,17 @@ static __inline__ int vlc_cond_signal( vlc_cond_t *p_condvar )
  *****************************************************************************/
 static __inline__ int vlc_cond_wait( vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    return pth_cond_await( p_condvar, p_mutex, NULL );
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_cond_wait( p_condvar, p_mutex );
 
-#elif defined(HAVE_CTHREADS_H)
+#elif defined( HAVE_CTHREADS_H )
     condition_wait( (condition_t)p_condvar, (mutex_t)p_mutex );
     return 0;
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     if( !p_condvar )
     {
         return B_BAD_VALUE;
@@ -516,7 +556,7 @@ static __inline__ int vlc_cond_wait( vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex
     vlc_mutex_lock( p_mutex );
     return 0;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     /* Release the <external_mutex> here and wait for the event
      * to become signaled, due to <pthread_cond_signal> being
      * called. */
@@ -536,14 +576,17 @@ static __inline__ int vlc_cond_wait( vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex
  *****************************************************************************/
 static __inline__ int vlc_cond_destroy( vlc_cond_t *p_condvar )
 {
-#if defined(PTHREAD_COND_T_IN_PTHREAD_H)
+#if defined( PTH_INIT_IN_PTH_H )
+    return 0;
+
+#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
     return pthread_cond_destroy( p_condvar );
 
-#elif defined(HAVE_KERNEL_SCHEDULER_H) && defined(HAVE_KERNEL_OS_H)
+#elif defined( HAVE_KERNEL_SCHEDULER_H )
     p_condvar->init = 0;
     return 0;
 
-#elif defined(WIN32)
+#elif defined( WIN32 )
     CloseHandle( *p_condvar );
     return 0;
 
index 140f8cf80f2c88e66c141b1c4074b92b29fde4e6..952bbd3b582ec54d22ece639ef796800f7880665 100644 (file)
@@ -1 +1,2 @@
 *.so
+*.so.*
index 8396d30b06566fd33f8d614b1c84b5a6a2a4bca8..b7406e58f1119a7db03f3a1290bc1696eddf622b 100644 (file)
@@ -2,7 +2,7 @@
  * aout_directx.c: Windows DirectX audio output method
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: aout_directx.c,v 1.2 2001/06/03 12:47:21 sam Exp $
+ * $Id: aout_directx.c,v 1.3 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
@@ -24,7 +24,7 @@
 #define MODULE_NAME directx
 #include "modules_inner.h"
 
-/* The most important this to do for now is to fix the audio bug we've got
+/* The most important thing to do for now is to fix the audio bug we've got
  * on startup: the audio will start later than the video (sometimes) and
  * is trying to catching up with it.
  * At first sight it seems to be a scheduling problem
@@ -77,6 +77,8 @@ typedef struct aout_sys_s
                                        * takes care of mixing all the
                                        * secondary buffers into the primary) */
 
+    HINSTANCE           hdsound_dll;      /* handle of the opened dsound dll */
+
     long l_buffer_size;                       /* secondary sound buffer size */
     long l_write_position;             /* next write position for the buffer */
 
@@ -96,7 +98,8 @@ static void    aout_Play        ( aout_thread_t *p_aout,
 static void    aout_Close       ( aout_thread_t *p_aout );
 
 /* local function */
-static int windx_CreateSecondaryBuffer( aout_thread_t *p_aout );
+static int DirectxCreateSecondaryBuffer( aout_thread_t *p_aout );
+static int DirectxInitDSound( aout_thread_t *p_aout );
 
 /*****************************************************************************
  * Functions exported as capabilities. They are declared as static so that
@@ -135,11 +138,11 @@ static int aout_Probe( probedata_t *p_data )
  *****************************************************************************/
 static int aout_Open( aout_thread_t *p_aout )
 {
-#if 0
     HRESULT dsresult;
     DSBUFFERDESC dsbuffer_desc;
     WAVEFORMATEX waveformat;
-#endif
+
+    intf_WarnMsg( 3, "aout: DirectX aout_Open ");
 
    /* Allocate structure */
     p_aout->p_sys = malloc( sizeof( aout_sys_t ) );
@@ -162,32 +165,13 @@ static int aout_Open( aout_thread_t *p_aout )
     p_aout->l_rate     = main_GetIntVariable( AOUT_RATE_VAR,
                                               AOUT_RATE_DEFAULT );
 
-    /* Create the direct sound object */
-    if( DirectSoundCreate(NULL, &p_aout->p_sys->p_dsobject, NULL) != DS_OK )
+    /* Initialise DirectSound */
+    if( DirectxInitDSound( p_aout ) )
     {
-        intf_WarnMsg( 3, "aout: can't create a direct sound device ");
-        p_aout->p_sys->p_dsobject = NULL;
+        intf_WarnMsg( 3, "aout: can't initialise DirectSound ");
         return( 1 );
     }
 
-    /* Set DirectSound Cooperative level, ie what control we want over Windows
-     * sound device. In our case, DSSCL_EXCLUSIVE means that we can modify the
-     * settings of the primary buffer, but also that only the sound of our
-     * application will be hearable when it will have the focus.
-     * !!! (this is not really working as intended yet because to set the
-     * cooperative level you need the window handle of your application, and
-     * I don't know of any easy way to get it. Especially since we might play
-     * sound without any video, and so what window handle should we use ???
-     * The hack for now is to use the Desktop window handle - it seems to be
-     * working */
-    if( IDirectSound_SetCooperativeLevel(p_aout->p_sys->p_dsobject,
-                                         GetDesktopWindow(),
-                                         DSSCL_EXCLUSIVE) )
-    {
-        intf_WarnMsg( 3, "aout: can't set direct sound cooperative level ");
-    }
-
-#if 0
     /* Obtain (not create) Direct Sound primary buffer */
     memset( &dsbuffer_desc, 0, sizeof(DSBUFFERDESC) );
     dsbuffer_desc.dwSize = sizeof(DSBUFFERDESC);
@@ -240,21 +224,6 @@ static int aout_Open( aout_thread_t *p_aout )
         p_aout->p_sys->p_dsbuffer_primary = NULL;
         return( 1 );
     }
-#endif
-
-    /* Now create the buffer that we'll actually use: the secondary buffer */
-    if( windx_CreateSecondaryBuffer( p_aout ) )
-    {
-        intf_WarnMsg( 3, "aout: can't create direct sound secondary buffer ");
-#if 0
-        IDirectSound_Release( p_aout->p_sys->p_dsbuffer_primary );
-#endif
-        IDirectSound_Release( p_aout->p_sys->p_dsobject );
-        p_aout->p_sys->p_dsobject = NULL;
-        p_aout->p_sys->p_dsbuffer_primary = NULL;
-        p_aout->p_sys->p_dsbuffer = NULL;
-        return( 1 );
-    }
 
     return( 0 );
 }
@@ -270,6 +239,8 @@ static int aout_SetFormat( aout_thread_t *p_aout )
 {
     HRESULT dsresult;
 
+    intf_WarnMsg( 3, "aout: DirectX aout_SetFormat ");
+
     /* first release the current secondary buffer */
     if( p_aout->p_sys->p_dsbuffer != NULL )
     {
@@ -278,10 +249,10 @@ static int aout_SetFormat( aout_thread_t *p_aout )
     }
 
     /* then create a new secondary buffer */
-    dsresult = windx_CreateSecondaryBuffer( p_aout );    
+    dsresult = DirectxCreateSecondaryBuffer( p_aout );    
     if( dsresult != DS_OK )
     {
-        intf_WarnMsg( 3, "aout: WinDX aout_SetFormat cannot create buffer");
+        intf_WarnMsg( 3, "aout: DirectX aout_SetFormat cannot create buffer");
         return( 1 );
     }
   
@@ -311,16 +282,25 @@ static long aout_GetBufInfo( aout_thread_t *p_aout, long l_buffer_limit )
     }
     if( dsresult != DS_OK )
     {
-        intf_WarnMsg( 3, "aout: WinDX aout_GetBufInfo cannot get current pos");
+        intf_WarnMsg(3,"aout: DirectX aout_GetBufInfo cannot get current pos");
         return( l_buffer_limit );
     }
 
-    l_result = ((p_aout->p_sys->l_write_position >= l_play_position) ?
-                (p_aout->p_sys->l_write_position - l_play_position)/2
-                : (p_aout->p_sys->l_buffer_size - l_play_position
-                    + p_aout->p_sys->l_write_position)/2 );
+    /* temporary hack. When you start playing a new file, the play position
+     * doesn't start changing immediatly, even though sound is already
+     * playing from the sound card */
+    if( l_play_position == 0 )
+    { 
+       intf_WarnMsg( 5, "aout: DirectX aout_GetBufInfo: %li", l_buffer_limit);
+       return( l_buffer_limit );
+    }
+
+    l_result = (p_aout->p_sys->l_write_position >= l_play_position) ?
+      (p_aout->p_sys->l_write_position - l_play_position) /2
+               : (p_aout->p_sys->l_buffer_size - l_play_position
+                  + p_aout->p_sys->l_write_position) /2 ;
 
-    intf_WarnMsg( 5, "aout: WinDX aout_GetBufInfo: %li", l_result);
+    intf_WarnMsg( 5, "aout: DirectX aout_GetBufInfo: %li", l_result);
     return l_result;
 }
 
@@ -336,7 +316,7 @@ static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size )
     long            l_play_position, l_notused, l_buffer_free_length;
     HRESULT         dsresult;
 
-    /* We want to copy data to the circular sound buffer, so first we need to
+    /* We want to copy data to the circular sound buffer, so we first need to
      * find out were in the buffer we can write our data */
     dsresult = IDirectSoundBuffer_GetCurrentPosition(p_aout->p_sys->p_dsbuffer,
                                                      &l_play_position,
@@ -351,20 +331,31 @@ static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size )
     }
     if( dsresult != DS_OK )
     {
-        intf_WarnMsg( 3, "aout: WinDX aout_Play can'get buffer position");
+        intf_WarnMsg( 3, "aout: DirectX aout_Play can'get buffer position");
     }
 
     /* check that we are not overflowing the circular buffer (everything should
      * be alright but just in case) */
     l_buffer_free_length =  l_play_position - p_aout->p_sys->l_write_position;
     if( l_buffer_free_length <= 0 )
-        l_buffer_free_length += p_aout->p_sys->l_buffer_size  ;
+        l_buffer_free_length += p_aout->p_sys->l_buffer_size;
 
     if( i_size > l_buffer_free_length )
     {
-        intf_WarnMsg( 3, "aout: WinDX aout_Play buffer overflow: size %i, free %i !!!", i_size, l_buffer_free_length);
-        intf_WarnMsg( 3, "aout: WinDX aout_Play buffer overflow: writepos %i, readpos %i !!!", l_play_position, p_aout->p_sys->l_write_position);
+        intf_WarnMsg( 3, "aout: DirectX aout_Play buffer overflow: size %i, free %i !!!", i_size, l_buffer_free_length);
+        intf_WarnMsg( 3, "aout: DirectX aout_Play buffer overflow: writepos %i, readpos %i !!!", p_aout->p_sys->l_write_position, l_play_position);
         /*i_size = l_buffer_free_length;*/
+
+        /* Update the write pointer */
+        p_aout->p_sys->l_write_position = l_notused;
+
+    }
+    else
+    {
+        intf_WarnMsg( 4, "aout: DirectX aout_Play buffer: size %i, free %i !!!"
+                      , i_size, l_buffer_free_length);
+        intf_WarnMsg( 4, "aout: DirectX aout_Play buffer: writepos %i, readpos %i !!!", p_aout->p_sys->l_write_position, l_play_position);
+
     }
 
     /* Before copying anything, we have to lock the buffer */
@@ -391,7 +382,7 @@ static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size )
     }
     if( dsresult != DS_OK )
     {
-        intf_WarnMsg( 3, "aout: WinDX aout_Play can't lock buffer");
+        intf_WarnMsg( 3, "aout: DirectX aout_Play can't lock buffer");
         return;
     }
 
@@ -423,7 +414,7 @@ static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size )
     }
     if( dsresult != DS_OK )
     {
-        intf_WarnMsg( 3, "aout: WinDX aout_Play can't play buffer");
+        intf_WarnMsg( 3, "aout: DirectX aout_Play can't play buffer");
         return;
     }
 
@@ -434,6 +425,9 @@ static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size )
  *****************************************************************************/
 static void aout_Close( aout_thread_t *p_aout )
 {
+
+    intf_WarnMsg( 3, "aout: DirectX aout_Close ");
+
     /* make sure the buffer isn't playing */
     if( p_aout->p_sys->p_dsbuffer != NULL )
     {
@@ -461,6 +455,13 @@ static void aout_Close( aout_thread_t *p_aout )
         p_aout->p_sys->p_dsobject = NULL;
     }  
     
+    /* free DSOUND.DLL */
+    if( p_aout->p_sys->hdsound_dll != NULL )
+    {
+       FreeLibrary( p_aout->p_sys->hdsound_dll );
+       p_aout->p_sys->hdsound_dll = NULL;
+    }
+
     /* Close the Output. */
     if ( p_aout->p_sys != NULL )
     { 
@@ -470,7 +471,63 @@ static void aout_Close( aout_thread_t *p_aout )
 }
 
 /*****************************************************************************
- * windx_CreateSecondaryBuffer
+ * DirectxInitDSound
+ *****************************************************************************
+ *****************************************************************************/
+static int DirectxInitDSound( aout_thread_t *p_aout )
+{
+    HRESULT (WINAPI *OurDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
+
+    p_aout->p_sys->hdsound_dll = LoadLibrary("DSOUND.DLL");
+    if( p_aout->p_sys->hdsound_dll == NULL )
+    {
+      intf_WarnMsg( 3, "aout: can't open DSOUND.DLL ");
+      return( 1 );
+    }
+
+    OurDirectSoundCreate = (void *)GetProcAddress( p_aout->p_sys->hdsound_dll,
+                                                   "DirectSoundCreate" );
+
+    if( OurDirectSoundCreate == NULL )
+    {
+      intf_WarnMsg( 3, "aout: GetProcAddress FAILED ");
+      FreeLibrary( p_aout->p_sys->hdsound_dll );
+      p_aout->p_sys->hdsound_dll = NULL;
+      return( 1 );
+    }
+
+    /* Create the direct sound object */
+    if( OurDirectSoundCreate(NULL, &p_aout->p_sys->p_dsobject, NULL) != DS_OK )
+    {
+        intf_WarnMsg( 3, "aout: can't create a direct sound device ");
+        p_aout->p_sys->p_dsobject = NULL;
+        FreeLibrary( p_aout->p_sys->hdsound_dll );
+        p_aout->p_sys->hdsound_dll = NULL;
+        return( 1 );
+    }
+
+    /* Set DirectSound Cooperative level, ie what control we want over Windows
+     * sound device. In our case, DSSCL_EXCLUSIVE means that we can modify the
+     * settings of the primary buffer, but also that only the sound of our
+     * application will be hearable when it will have the focus.
+     * !!! (this is not really working as intended yet because to set the
+     * cooperative level you need the window handle of your application, and
+     * I don't know of any easy way to get it. Especially since we might play
+     * sound without any video, and so what window handle should we use ???
+     * The hack for now is to use the Desktop window handle - it seems to be
+     * working */
+    if( IDirectSound_SetCooperativeLevel(p_aout->p_sys->p_dsobject,
+                                         GetDesktopWindow(),
+                                         DSSCL_EXCLUSIVE) )
+    {
+        intf_WarnMsg( 3, "aout: can't set direct sound cooperative level ");
+    }
+
+    return( 0 );
+}
+
+/*****************************************************************************
+ * DirectxCreateSecondaryBuffer
  *****************************************************************************
  * This function creates the buffer we'll use to play audio.
  * In DirectSound there are two kinds of buffers:
@@ -481,7 +538,7 @@ static void aout_Close( aout_thread_t *p_aout )
  * Once you create a secondary buffer, you cannot change its format anymore so
  * you have to release the current and create another one.
  *****************************************************************************/
-static int windx_CreateSecondaryBuffer( aout_thread_t *p_aout )
+static int DirectxCreateSecondaryBuffer( aout_thread_t *p_aout )
 {
     WAVEFORMATEX waveformat;
     DSBUFFERDESC dsbdesc;
@@ -504,10 +561,6 @@ static int windx_CreateSecondaryBuffer( aout_thread_t *p_aout )
     dsbdesc.dwSize = sizeof(DSBUFFERDESC); 
     dsbdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2/* Better position accuracy */
                     | DSBCAPS_GLOBALFOCUS;      /* Allows background playing */
-    /*              | DSBCAPS_CTRLPAN
-                    | DSBCAPS_CTRLVOLUME
-                    | DSBCAPS_CTRLFREQUENCY;
-    */
     dsbdesc.dwBufferBytes = waveformat.nAvgBytesPerSec * 4; /* 4 sec buffer */
     dsbdesc.lpwfxFormat = &waveformat; 
  
@@ -523,32 +576,12 @@ static int windx_CreateSecondaryBuffer( aout_thread_t *p_aout )
 
     /* backup the size of the secondary sound buffer */
     memset(&dsbcaps, 0, sizeof(DSBCAPS)); 
-    dsbcaps.dwSize = sizeof(DSBCAPS); 
+    dsbcaps.dwSize = sizeof(DSBCAPS);
     IDirectSoundBuffer_GetCaps( p_aout->p_sys->p_dsbuffer, &dsbcaps  );
     p_aout->p_sys->l_buffer_size = dsbcaps.dwBufferBytes;
     p_aout->p_sys->l_write_position = 0;
-    intf_WarnMsg( 3, "aout: WinDX WinDX_CreateSecondaryBuffer: %li",
+    intf_WarnMsg( 3, "aout: DirectX DirectxCreateSecondaryBuffer: %li",
                   p_aout->p_sys->l_buffer_size);
 
-    /* make sure the buffer isn't playing */
-    IDirectSoundBuffer_Stop( p_aout->p_sys->p_dsbuffer );
-
-    /* reset play position, just to be sure (and after some tests it seems
-     * indeed necessary */
-    dsresult = IDirectSoundBuffer_SetCurrentPosition(p_aout->p_sys->p_dsbuffer,
-                                                     0 );
-    if( dsresult == DSERR_BUFFERLOST )
-    {
-        IDirectSoundBuffer_Restore( p_aout->p_sys->p_dsbuffer );
-        dsresult = IDirectSoundBuffer_SetCurrentPosition(
-                                                 p_aout->p_sys->p_dsbuffer,
-                                                 0 );
-    }
-    if( dsresult != DS_OK )
-    {
-        intf_WarnMsg( 3, "aout: WinDX CreateSecondary cannot wet current pos");
-    }
-
     return( 0 );
 }
-
index bc6d3b74fba38f2bf93fa9946a50f2724dc1dfbc..907e752c8554fcdc935af28439965377cd4114b3 100644 (file)
@@ -2,7 +2,7 @@
  * vout_directx.c: Windows DirectX video output display method
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: vout_directx.c,v 1.3 2001/06/08 20:03:15 sam Exp $
+ * $Id: vout_directx.c,v 1.4 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
 typedef struct vout_sys_s
 {
 
-    LPDIRECTDRAW         p_ddobject;                    /* DirectDraw object */
-    LPDIRECTDRAWSURFACE  p_display;                        /* display device */
-    LPDIRECTDRAWSURFACE  p_overlay;                        /* overlay device */
-    LPDIRECTDRAWCLIPPER  p_clipper;                               /* clipper */
+    LPDIRECTDRAW2        p_ddobject;                    /* DirectDraw object */
+    LPDIRECTDRAWSURFACE3 p_display;                        /* Display device */
+    LPDIRECTDRAWSURFACE3 p_surface;    /* surface where we display the video */
+    LPDIRECTDRAWCLIPPER  p_clipper;             /* clipper used for blitting */
+    HINSTANCE            hddraw_dll;       /* handle of the opened ddraw dll */
     HBRUSH               hbrush;           /* window backgound brush (color) */
     HWND                 hwnd;                  /* Handle of the main window */
 
@@ -103,7 +104,7 @@ typedef struct vout_sys_s
     boolean_t   b_cursor_autohidden;
     mtime_t     i_lastmoved;
 
-    char       *p_windx_buf[2];                        /* Buffer information */
+    char       *p_directx_buf[2];                      /* Buffer information */
 
 } vout_sys_t;
 
@@ -120,15 +121,16 @@ static void vout_Display   ( struct vout_thread_s * );
 static void vout_SetPalette( p_vout_thread_t p_vout, u16 *red, u16 *green,
                              u16 *blue, u16 *transp );
 
-static int  WinDXCreateWindow     ( vout_thread_t *p_vout );
-static int  WinDXInitDDraw        ( vout_thread_t *p_vout );
-static int  WinDXCreateDisplay    ( vout_thread_t *p_vout );
-static int  WinDXCreateYUVOverlay ( vout_thread_t *p_vout );
-static int  WinDXUpdateOverlay    ( vout_thread_t *p_vout );
-static void WinDXCloseDDraw       ( vout_thread_t *p_vout );
-static void WinDXCloseWindow      ( vout_thread_t *p_vout );
-static void WinDXCloseDisplay     ( vout_thread_t *p_vout );
-static void WinDXCloseYUVOverlay  ( vout_thread_t *p_vout );
+static int  DirectXCreateWindow   ( vout_thread_t *p_vout );
+static int  DirectXInitDDraw      ( vout_thread_t *p_vout );
+static int  DirectXCreateDisplay  ( vout_thread_t *p_vout );
+static int  DirectXCreateSurface  ( vout_thread_t *p_vout );
+static int  DirectXCreateClipper  ( vout_thread_t *p_vout );
+static int  DirectXUpdateOverlay  ( vout_thread_t *p_vout );
+static void DirectXCloseDDraw     ( vout_thread_t *p_vout );
+static void DirectXCloseWindow    ( vout_thread_t *p_vout );
+static void DirectXCloseDisplay   ( vout_thread_t *p_vout );
+static void DirectXCloseSurface   ( vout_thread_t *p_vout );
 
 /*****************************************************************************
  * Functions exported as capabilities. They are declared as static so that
@@ -154,11 +156,15 @@ void _M( vout_getfunctions )( function_list_t * p_function_list )
  *****************************************************************************/
 static int vout_Probe( probedata_t *p_data )
 {
+
     if( TestMethod( VOUT_METHOD_VAR, "directx" ) )
     {
         return( 999 );
     }
 
+    /* Check that at least DirectX5 is installed on the computer */
+    /* Fixme */
+
     return( 400 );
 }
 
@@ -180,15 +186,16 @@ static int vout_Create( vout_thread_t *p_vout )
     /* Initialisations */
     p_vout->p_sys->p_ddobject = NULL;
     p_vout->p_sys->p_display = NULL;
-    p_vout->p_sys->p_overlay = NULL;
+    p_vout->p_sys->p_surface = NULL;
     p_vout->p_sys->p_clipper = NULL;
-    p_vout->p_sys->hbrush = INVALID_HANDLE_VALUE;
-    p_vout->p_sys->hwnd = INVALID_HANDLE_VALUE;
+    p_vout->p_sys->hbrush = NULL;
+    p_vout->p_sys->hwnd = NULL;
+    p_vout->p_sys->b_display_enabled = 0;
+    p_vout->b_need_render = 0;      /* by default try an YUV overlay display */
 
     p_vout->p_sys->b_cursor = 1; /* TODO should be done with a main_GetInt.. */
 
     p_vout->p_sys->b_cursor_autohidden = 0;
-    p_vout->p_sys->b_display_enabled = 0;
     p_vout->p_sys->i_lastmoved = mdate();
 
     p_vout->b_fullscreen = main_GetIntVariable( VOUT_FULLSCREEN_VAR,
@@ -207,7 +214,7 @@ static int vout_Create( vout_thread_t *p_vout )
     /* Create a window for the video */
     /* Creating a window under Windows also initializes the thread's event
      * message qeue */
-    if( WinDXCreateWindow( p_vout ) )
+    if( DirectXCreateWindow( p_vout ) )
     {
         intf_ErrMsg( "vout error: can't create window" );
         free( p_vout->p_sys );
@@ -215,20 +222,20 @@ static int vout_Create( vout_thread_t *p_vout )
     }
 
     /* Initialise DirectDraw */
-    if( WinDXInitDDraw( p_vout ) )
+    if( DirectXInitDDraw( p_vout ) )
     {
         intf_ErrMsg( "vout error: can't initialise DirectDraw" );
-        WinDXCloseWindow( p_vout );
+        DirectXCloseWindow( p_vout );
         free( p_vout->p_sys );
         return ( 1 );
     }
 
-    /* create the directx display */
-    if( WinDXCreateDisplay( p_vout ) )
+    /* Create the directx display */
+    if( DirectXCreateDisplay( p_vout ) )
     {
         intf_ErrMsg( "vout error: can't initialise DirectDraw" );
-        WinDXCloseDDraw( p_vout );
-        WinDXCloseWindow( p_vout );
+        DirectXCloseDDraw( p_vout );
+        DirectXCloseWindow( p_vout );
         free( p_vout->p_sys );
         return ( 1 );
     }
@@ -265,9 +272,9 @@ static void vout_End( vout_thread_t *p_vout )
 static void vout_Destroy( vout_thread_t *p_vout )
 {
     intf_WarnMsg( 3, "vout: vout_Destroy" );
-    WinDXCloseDisplay( p_vout );
-    WinDXCloseDDraw( p_vout );
-    WinDXCloseWindow( p_vout );
+    DirectXCloseDisplay( p_vout );
+    DirectXCloseDDraw( p_vout );
+    DirectXCloseWindow( p_vout );
 
     if( p_vout->p_sys != NULL )
     {
@@ -297,17 +304,17 @@ static int vout_Manage( vout_thread_t *p_vout )
             {
 
                 case WM_CLOSE:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_CLOSE" );
+                    intf_WarnMsg( 4, "vout: vout_Manage WM_CLOSE" );
                     p_vout->b_die = 1;
                     break;
 
                 case WM_QUIT:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_QUIT" );
+                    intf_WarnMsg( 4, "vout: vout_Manage WM_QUIT" );
                     p_main->p_intf->b_die = 1;
                     break;
 
                 case WM_MOVE:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_MOVE" );
+                    intf_WarnMsg( 3, "vout: vout_Manage WM_MOVE" );
                     if( !p_vout->b_need_render )
                     {
                         p_vout->i_changes |= VOUT_SIZE_CHANGE;
@@ -317,7 +324,7 @@ static int vout_Manage( vout_thread_t *p_vout )
                     break;
 
                 case WM_APP:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_APP" );
+                    intf_WarnMsg( 3, "vout: vout_Manage WM_APP" );
                     if( !p_vout->b_need_render )
                     {
                         p_vout->i_changes |= VOUT_SIZE_CHANGE;
@@ -327,18 +334,18 @@ static int vout_Manage( vout_thread_t *p_vout )
                     break;
 
                 case WM_PAINT:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_PAINT" );
+                    intf_WarnMsg( 4, "vout: vout_Manage WM_PAINT" );
                     break;
 
                 case WM_ERASEBKGND:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_ERASEBKGND" );
+                    intf_WarnMsg( 4, "vout: vout_Manage WM_ERASEBKGND" );
                     break;
 
                 case WM_MOUSEMOVE:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_MOUSEMOVE" );
+                    intf_WarnMsg( 4, "vout: vout_Manage WM_MOUSEMOVE" );
                     if( p_vout->p_sys->b_cursor )
                     {
-                    if( p_vout->p_sys->b_cursor_autohidden )
+                        if( p_vout->p_sys->b_cursor_autohidden )
                         {
                             p_vout->p_sys->b_cursor_autohidden = 0;
                             p_vout->p_sys->i_lastmoved = mdate();
@@ -355,7 +362,7 @@ static int vout_Manage( vout_thread_t *p_vout )
                     /* the key events are first processed here. The next
                      * message processed by this main message loop will be the
                      * char translation of the key event */
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_KEYDOWN" );
+                    intf_WarnMsg( 3, "vout: vout_Manage WM_KEYDOWN" );
                     switch( msg.wParam )
                     {
                         case VK_ESCAPE:
@@ -368,7 +375,7 @@ static int vout_Manage( vout_thread_t *p_vout )
                     break;
 
                 case WM_CHAR:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM_CHAR" );
+                    intf_WarnMsg( 3, "vout: vout_Manage WM_CHAR" );
                     switch( msg.wParam )
                     {
                         case 'q':
@@ -376,11 +383,39 @@ static int vout_Manage( vout_thread_t *p_vout )
                             p_main->p_intf->b_die = 1;
                             break;
 
-                        case 'f':
+                        case 'f':                    /* switch to fullscreen */
                         case 'F':
                             p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
                             break;
 
+                        case 'y':                      /* switch to hard YUV */
+                        case 'Y':
+                            p_vout->i_changes |= VOUT_YUV_CHANGE;
+                            break;
+                          
+                        case 'c':                        /* toggle grayscale */
+                        case 'C':
+                            p_vout->b_grayscale = ! p_vout->b_grayscale;
+                            p_vout->i_changes |= VOUT_GRAYSCALE_CHANGE;
+                            break;
+                          
+                        case 'i':                             /* toggle info */
+                        case 'I':
+                            p_vout->b_info = ! p_vout->b_info;
+                            p_vout->i_changes |= VOUT_INFO_CHANGE;
+                            break;
+
+                        case 's':                          /* toggle scaling */
+                        case 'S':
+                            p_vout->b_scale = ! p_vout->b_scale;
+                            p_vout->i_changes |= VOUT_SCALE_CHANGE;
+                            break;
+
+                        case ' ':                        /* toggle interface */
+                            p_vout->b_interface = ! p_vout->b_interface;
+                            p_vout->i_changes |= VOUT_INTF_CHANGE;
+                            break;
+
                         case '0': network_ChannelJoin( 0 ); break;
                         case '1': network_ChannelJoin( 1 ); break;
                         case '2': network_ChannelJoin( 2 ); break;
@@ -403,7 +438,7 @@ static int vout_Manage( vout_thread_t *p_vout )
                     }
 
                 default:
-                    intf_WarnMsg( 3, "vout: WinDX vout_Manage WM Default %i",
+                    intf_WarnMsg( 4, "vout: vout_Manage WM Default %i",
                                   msg.message );
                 break;
             }
@@ -425,16 +460,52 @@ static int vout_Manage( vout_thread_t *p_vout )
     }
 
 
+    /*
+     * Scale Change 
+     */
+    if( p_vout->i_changes & VOUT_SCALE_CHANGE )
+    {
+        intf_WarnMsg( 3, "vout: vout_Manage Scale Change" );
+        DirectXUpdateOverlay( p_vout );
+        p_vout->i_changes &= ~VOUT_SCALE_CHANGE;
+    }
+
     /*
      * Size Change 
      */
     if( p_vout->i_changes & VOUT_SIZE_CHANGE )
     {
-        intf_WarnMsg( 3, "vout: WinDX vout_Manage Size Change" );
-        WinDXUpdateOverlay( p_vout );
+        intf_WarnMsg( 3, "vout: vout_Manage Size Change" );
+        DirectXUpdateOverlay( p_vout );
         p_vout->i_changes &= ~VOUT_SIZE_CHANGE;
     }
 
+    /*
+     * YUV Change 
+     */
+    if( p_vout->i_changes & VOUT_YUV_CHANGE )
+    {
+        p_vout->b_need_render = ! p_vout->b_need_render;
+        
+        /* Need to reopen display */
+        DirectXCloseSurface( p_vout );
+        if( DirectXCreateSurface( p_vout ) )
+        {
+          intf_ErrMsg( "error: can't reopen display after YUV change" );
+          return( 1 );
+        }
+
+        /* Repaint the window background (needed by the overlay surface) */
+        if( !p_vout->b_need_render )
+       {
+            InvalidateRect( p_vout->p_sys->hwnd, NULL, TRUE );
+            p_vout->p_sys->b_display_enabled = 1;
+            DirectXUpdateOverlay( p_vout );
+       }
+
+        p_vout->i_changes &= ~VOUT_YUV_CHANGE;
+    }
+
     /*
      * Fullscreen change
      */
@@ -463,7 +534,6 @@ static int vout_Manage( vout_thread_t *p_vout )
         }
 
         SetWindowPlacement( p_vout->p_sys->hwnd, &window_placement );
-        /*WinDXUpdateOverlay( p_vout );*/
 
         p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
     }
@@ -472,7 +542,7 @@ static int vout_Manage( vout_thread_t *p_vout )
      * Pointer change
      */
     if( ! p_vout->p_sys->b_cursor_autohidden &&
-        ( mdate() - p_vout->p_sys->i_lastmoved > 2000000 ) )
+        ( mdate() - p_vout->p_sys->i_lastmoved > 5000000 ) )
     {
         /* Hide the mouse automatically */
         p_vout->p_sys->b_cursor_autohidden = 1;
@@ -517,22 +587,86 @@ static void vout_Display( vout_thread_t *p_vout )
     DDSURFACEDESC ddsd;
     HRESULT       dxresult;
     int           i;
-    int           i_image_width  = p_vout->p_rendered_pic->i_width;
-    int           i_image_height = p_vout->p_rendered_pic->i_height;
+    int           i_image_width;
+    int           i_image_height;
 
 
+    intf_WarnMsg( 5, "vout: vout_Display" );
+
     if( (p_vout->p_sys->p_display == NULL) )
     {
-        intf_WarnMsg( 3, "vout error: WinDX no display!!" );
+        intf_WarnMsg( 3, "vout error: vout_Display no display!!" );
         return;
     }
 
     /* The first time this function is called it enables the display */
     p_vout->p_sys->b_display_enabled = 1;
 
+    /* if the size of the decoded pictures has changed then we close the
+     * video surface (which doesn't have the right size anymore). */
+    i_image_width = ( p_vout->p_rendered_pic ) ?
+      p_vout->p_rendered_pic->i_width : p_vout->p_sys->i_image_width;
+    i_image_height = ( p_vout->p_rendered_pic ) ?
+      p_vout->p_rendered_pic->i_height : p_vout->p_sys->i_image_height;
+
+    if( p_vout->p_sys->i_image_width != i_image_width
+        || p_vout->p_sys->i_image_height != i_image_height )
+    {
+        intf_WarnMsg( 3, "vout: video surface size changed" );
+        p_vout->p_sys->i_image_width = i_image_width;
+        p_vout->p_sys->i_image_height = i_image_height;
+        DirectXCloseSurface( p_vout );
+    }
+
     if( p_vout->b_need_render )
     {
+        RECT  rect_window;
+        POINT point_window;
+  
         /* Nothing yet */
+        if( p_vout->p_sys->p_surface == NULL )
+        {
+            intf_WarnMsg( 3, "vout: no video surface, open one..." );
+            if( DirectXCreateSurface( p_vout ) )
+            {
+                intf_WarnMsg( 3, "vout: cannot open a new video surface !!" );
+                return;
+            }
+            /* Display the surface */
+            p_vout->p_sys->b_display_enabled = 1;
+        }
+
+        /* Now get the coordinates of the window. We don't actually want the
+         * window coordinates but these of the usable surface inside the window
+         * By specification GetClientRect will always set rect_window.left and
+         * rect_window.top to 0 because the Client area is always relative to
+         * the container window */
+        GetClientRect(p_vout->p_sys->hwnd, &rect_window);
+        
+        point_window.x = 0;
+        point_window.y = 0;
+        ClientToScreen(p_vout->p_sys->hwnd, &point_window);
+        rect_window.left = point_window.x;
+        rect_window.top = point_window.y;
+        
+        point_window.x = rect_window.right;
+        point_window.y = rect_window.bottom;
+        ClientToScreen(p_vout->p_sys->hwnd, &point_window);
+        rect_window.right = point_window.x;
+        rect_window.bottom = point_window.y;
+
+        /* Blit video surface to display */
+        dxresult = IDirectDrawSurface3_Blt(p_vout->p_sys->p_display,
+                                           &rect_window,
+                                           p_vout->p_sys->p_surface,
+                                           NULL,
+                                           0, NULL );
+        if( dxresult != DD_OK )
+        {
+            intf_WarnMsg( 3, "vout: could not Blit the surface" );
+            return;
+        }
+
     }
     else
     {
@@ -542,47 +676,36 @@ static void vout_Display( vout_thread_t *p_vout )
          */
         /* TODO: support for streams other than 4:2:0 */
 
-        /* if the size of the decoded pictures has changed then we close the
-         * YUVOverlay (which doesn't have the right size anymore). */
-        if( p_vout->p_sys->i_image_width != i_image_width
-            || p_vout->p_sys->i_image_height != i_image_height )
-        {
-            intf_WarnMsg( 3, "vout: WinDX overlay size changed" );
-            p_vout->p_sys->i_image_width = i_image_width;
-            p_vout->p_sys->i_image_height = i_image_height;
-            WinDXCloseYUVOverlay( p_vout );
-        }
-
-        if( p_vout->p_sys->p_overlay == NULL )
+        if( p_vout->p_sys->p_surface == NULL )
         {
-            intf_WarnMsg( 3, "vout: WinDX no overlay, open one..." );
-            if( WinDXCreateYUVOverlay( p_vout ) )
+            intf_WarnMsg( 3, "vout: no video surface, open one..." );
+            if( DirectXCreateSurface( p_vout ) )
             {
-                intf_WarnMsg( 3, "vout: WinDX cannot open a new overlay !!" );
+                intf_WarnMsg( 3, "vout: cannot open a new video surface !!" );
                 return;
             }
             /* Display the Overlay */
             p_vout->p_sys->b_display_enabled = 1;
-            WinDXUpdateOverlay( p_vout );
+            DirectXUpdateOverlay( p_vout );
         }
 
         /* Lock the overlay surface */
         memset( &ddsd, 0, sizeof( DDSURFACEDESC ));
         ddsd.dwSize = sizeof(DDSURFACEDESC);
-        dxresult = IDirectDrawSurface_Lock(p_vout->p_sys->p_overlay, NULL,
-                                           &ddsd, DDLOCK_NOSYSLOCK, NULL);
+        dxresult = IDirectDrawSurface3_Lock(p_vout->p_sys->p_surface, NULL,
+                                            &ddsd, DDLOCK_NOSYSLOCK, NULL);
         if ( dxresult == DDERR_SURFACELOST )
         {
             /* Your surface can be lost (thanks to windows) so be sure
              * to check this and restore it if needed */
-            dxresult = IDirectDrawSurface_Restore( p_vout->p_sys->p_overlay );
-            dxresult = IDirectDrawSurface_Lock( p_vout->p_sys->p_overlay,
-                                                NULL, &ddsd, DDLOCK_NOSYSLOCK
-                                                | DDLOCK_WAIT, NULL);
+            dxresult = IDirectDrawSurface3_Restore( p_vout->p_sys->p_surface );
+            dxresult = IDirectDrawSurface3_Lock( p_vout->p_sys->p_surface,
+                                                 NULL, &ddsd, DDLOCK_NOSYSLOCK
+                                                 | DDLOCK_WAIT, NULL);
         }
         if( dxresult != DD_OK )
         {
-            intf_WarnMsg( 3, "vout: WinDX could not lock the surface" );
+            intf_WarnMsg( 3, "vout: could not lock the surface" );
             return;
         }
 
@@ -634,8 +757,8 @@ static void vout_Display( vout_thread_t *p_vout )
         }
 
         /* Unlock the Surface */
-        dxresult = IDirectDrawSurface_Unlock(p_vout->p_sys->p_overlay,
-                                             ddsd.lpSurface );
+        dxresult = IDirectDrawSurface3_Unlock(p_vout->p_sys->p_surface,
+                                              ddsd.lpSurface );
 
     }
 
@@ -646,7 +769,7 @@ static void vout_Display( vout_thread_t *p_vout )
 
 
 /*****************************************************************************
- * WinDXEventProc: This is the window event processing function.
+ * DirectXEventProc: This is the window event processing function.
  *****************************************************************************
  * On Windows, when you create a window you have to attach an event processing
  * function to it. The aim of this function is to manage "Queued Messages" and
@@ -656,28 +779,30 @@ static void vout_Display( vout_thread_t *p_vout )
  * Nonqueued Messages are those that Windows will send directly to this
  * function (like WM_DESTROY, WM_WINDOWPOSCHANGED...)
  *****************************************************************************/
-long FAR PASCAL WinDXEventProc( HWND hwnd, UINT message,
-                                WPARAM wParam, LPARAM lParam )
+long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message,
+                                  WPARAM wParam, LPARAM lParam )
 {
     switch( message )
     {
 
+#if 0
     case WM_ACTIVATE:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_ACTIVED" );
+        intf_WarnMsg( 4, "vout: WinProc WM_ACTIVED" );
         break;
 
     case WM_CREATE:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_CREATE" );
+        intf_WarnMsg( 4, "vout: WinProc WM_CREATE" );
         break;
 
     /* the user wants to close the window */
     case WM_CLOSE:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_CLOSE" );
+        intf_WarnMsg( 4, "vout: WinProc WM_CLOSE" );
         break;
+#endif
 
     /* the window has been closed so shut down everything now */
     case WM_DESTROY:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_DESTROY" );
+        intf_WarnMsg( 4, "vout: WinProc WM_DESTROY" );
         PostQuitMessage( 0 );
         break;
 
@@ -686,60 +811,64 @@ long FAR PASCAL WinDXEventProc( HWND hwnd, UINT message,
         {
             case SC_SCREENSAVE:                     /* catch the screensaver */
             case SC_MONITORPOWER:              /* catch the monitor turn-off */
-            intf_WarnMsg( 3, "vout: WinDX WinProc WM_SYSCOMMAND" );
+            intf_WarnMsg( 3, "vout: WinProc WM_SYSCOMMAND" );
             return 0;                      /* this stops them from happening */
         }
         break;
 
+#if 0
     case WM_MOVE:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_MOVE" );
+        intf_WarnMsg( 4, "vout: WinProc WM_MOVE" );
         break;
 
     case WM_SIZE:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_SIZE" );
+        intf_WarnMsg( 4, "vout: WinProc WM_SIZE" );
         break;
 
     case WM_MOVING:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_MOVING" );
+        intf_WarnMsg( 4, "vout: WinProc WM_MOVING" );
         break;
 
     case WM_SIZING:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_SIZING" );
+        intf_WarnMsg( 4, "vout: WinProc WM_SIZING" );
         break;
+#endif
 
     case WM_WINDOWPOSCHANGED:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_WINDOWPOSCHANGED" );
+        intf_WarnMsg( 3, "vout: WinProc WM_WINDOWPOSCHANGED" );
         PostMessage( NULL, WM_APP, 0, 0);
         break;
 
+#if 0
     case WM_WINDOWPOSCHANGING:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_WINDOWPOSCHANGING" );
+        intf_WarnMsg( 3, "vout: WinProc WM_WINDOWPOSCHANGING" );
         break;
 
     case WM_PAINT:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_PAINT" );
+        intf_WarnMsg( 4, "vout: WinProc WM_PAINT" );
         break;
 
     case WM_ERASEBKGND:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM_ERASEBKGND" );
+        intf_WarnMsg( 4, "vout: WinProc WM_ERASEBKGND" );
         break;
 
     default:
-        intf_WarnMsg( 3, "vout: WinDX WinProc WM Default %i", message );
+        intf_WarnMsg( 4, "vout: WinProc WM Default %i", message );
         break;
+#endif
     }
 
     return DefWindowProc(hwnd, message, wParam, lParam);
 }
 
 /*****************************************************************************
- * WinDXCreateWindow: create a windows window where the video will play.
+ * DirectXCreateWindow: create a windows window where the video will play.
  *****************************************************************************
  * Before creating a direct draw surface, we need to create a window in which
  * the video will be displayed. This window will also allow us to capture the
  * events.
  *****************************************************************************/
-static int WinDXCreateWindow( vout_thread_t *p_vout )
+static int DirectXCreateWindow( vout_thread_t *p_vout )
 {
     HINSTANCE hInstance;
     WNDCLASS  wc;                                 /* window class components */
@@ -770,7 +899,7 @@ static int WinDXCreateWindow( vout_thread_t *p_vout )
         if( colorkey == GetNearestColor( hdc, colorkey ) )
           break;
     }
-    intf_WarnMsg( 3, "vout: WinDXCreateWindow background color:%i", colorkey );
+    intf_WarnMsg(3,"vout: DirectXCreateWindow background color:%i", colorkey);
     ReleaseDC( p_vout->p_sys->hwnd, hdc );
 
     /* create the actual brush */  
@@ -779,7 +908,7 @@ static int WinDXCreateWindow( vout_thread_t *p_vout )
 
     /* fill in the window class structure */
     wc.style         = 0;                               /* no special styles */
-    wc.lpfnWndProc   = (WNDPROC)WinDXEventProc;             /* event handler */
+    wc.lpfnWndProc   = (WNDPROC)DirectXEventProc;           /* event handler */
     wc.cbClsExtra    = 0;                             /* no extra class data */
     wc.cbWndExtra    = 0;                            /* no extra window data */
     wc.hInstance     = hInstance;                                /* instance */
@@ -791,7 +920,7 @@ static int WinDXCreateWindow( vout_thread_t *p_vout )
 
     /* register the window class */
     if (!RegisterClass(&wc)) {
-        intf_WarnMsg( 3, "vout: WinDX register window FAILED" );
+        intf_WarnMsg( 3, "vout: DirectXCreateWindow register window FAILED" );
         return (1);
     }
 
@@ -820,7 +949,7 @@ static int WinDXCreateWindow( vout_thread_t *p_vout )
                     NULL);                        /* no additional arguments */
 
     if (p_vout->p_sys->hwnd == NULL) {
-        intf_WarnMsg( 3, "vout: WinDX create window FAILED" );
+        intf_WarnMsg( 3, "vout: DirectXCreateWindow create window FAILED" );
         return (1);
     }
 
@@ -831,72 +960,107 @@ static int WinDXCreateWindow( vout_thread_t *p_vout )
 }
 
 /*****************************************************************************
- * WinDXInitDDraw: Takes care of all the DirectDraw initialisations
+ * DirectXInitDDraw: Takes care of all the DirectDraw initialisations
  *****************************************************************************
  * This function initialise and allocate resources for DirectDraw.
  *****************************************************************************/
-static int WinDXInitDDraw( vout_thread_t *p_vout )
+static int DirectXInitDDraw( vout_thread_t *p_vout )
 {
-    HRESULT     dxresult;
-    DWORD       flags;
+    HRESULT    dxresult;
+    HRESULT    (WINAPI *OurDirectDrawCreate)(GUID *,LPDIRECTDRAW *,IUnknown *);
+    LPDIRECTDRAW  p_ddobject;
 
-    intf_WarnMsg( 3, "vout: WinDX WinDXInitDDraw" );
+    intf_WarnMsg( 3, "vout: DirectXInitDDraw" );
 
-    /* Initialize DirectDraw */
-    dxresult = DirectDrawCreate( NULL, &p_vout->p_sys->p_ddobject, NULL );
-    if( dxresult != DD_OK )
+    /* load direct draw DLL */
+    p_vout->p_sys->hddraw_dll = LoadLibrary("DDRAW.DLL");
+    if( p_vout->p_sys->hddraw_dll == NULL )
     {
-        intf_ErrMsg( "vout error: can't initialize Direct Draw" );
+        intf_WarnMsg( 3, "vout: DirectXInitDDraw failed loading ddraw.dll" );
         return( 1 );
     }
-
-    /* Set DirectDraw Cooperative level, ie what control we want over Windows
-       display */
-    if( p_vout->b_fullscreen )
+      
+    OurDirectDrawCreate = 
+      (void *)GetProcAddress(p_vout->p_sys->hddraw_dll, "DirectDrawCreate");
+    if ( OurDirectDrawCreate == NULL )
     {
-        flags = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN;
+        intf_ErrMsg( "vout error: DirectXInitDDraw failed GetProcAddress" );
+        FreeLibrary( p_vout->p_sys->hddraw_dll );
+        p_vout->p_sys->hddraw_dll = NULL;
+        return( 1 );    
     }
-    else
+
+    /* Initialize DirectDraw now */
+    dxresult = OurDirectDrawCreate( NULL, &p_ddobject, NULL );
+    if( dxresult != DD_OK )
     {
-        flags = DDSCL_NORMAL;
+        intf_ErrMsg( "vout error: DirectXInitDDraw can't initialize DDraw" );
+        p_vout->p_sys->p_ddobject = NULL;
+        FreeLibrary( p_vout->p_sys->hddraw_dll );
+        p_vout->p_sys->hddraw_dll = NULL;
+        return( 1 );
     }
 
-    dxresult = IDirectDraw_SetCooperativeLevel( p_vout->p_sys->p_ddobject,
-                                                p_vout->p_sys->hwnd, flags );
+    /* Set DirectDraw Cooperative level, ie what control we want over Windows
+     * display */
+    dxresult = IDirectDraw_SetCooperativeLevel( p_ddobject,
+                                           p_vout->p_sys->hwnd, DDSCL_NORMAL );
     if( dxresult != DD_OK )
     {
         intf_ErrMsg( "vout error: can't set direct draw cooperative level." );
-        IDirectDraw_Release(p_vout->p_sys->p_ddobject);
+        IDirectDraw_Release( p_ddobject );
         p_vout->p_sys->p_ddobject = NULL;
+        FreeLibrary( p_vout->p_sys->hddraw_dll );
+        p_vout->p_sys->hddraw_dll = NULL;
         return( 1 );
     }
 
+    /* Get the IDirectDraw2 interface */
+    dxresult = IDirectDraw_QueryInterface( p_ddobject, &IID_IDirectDraw2,
+                                        (LPVOID *)&p_vout->p_sys->p_ddobject );
+    if( dxresult != DD_OK )
+    {
+        intf_ErrMsg( "vout error: can't get IDirectDraw2 interface." );
+        IDirectDraw_Release( p_ddobject );
+        p_vout->p_sys->p_ddobject = NULL;
+        FreeLibrary( p_vout->p_sys->hddraw_dll );
+        p_vout->p_sys->hddraw_dll = NULL;
+        return( 1 );
+    }
+    else
+    {
+        /* Release the unused interface */
+        IDirectDraw_Release( p_ddobject );
+    }
+
     return( 0 );
 }
 
 /*****************************************************************************
- * WinDXCreateDisplay: create the DirectDraw display.
+ * DirectXCreateDisplay: create the DirectDraw display.
  *****************************************************************************
  * Create and initialize display according to preferences specified in the vout
  * thread fields.
  *****************************************************************************/
-static int WinDXCreateDisplay( vout_thread_t *p_vout )
+static int DirectXCreateDisplay( vout_thread_t *p_vout )
 {
-    DDCAPS        ddcaps;
-    HRESULT       dxresult;
-    DDSURFACEDESC ddsd;
-    BOOL          bHasOverlay, bHasColorKey, bCanStretch;
+    HRESULT              dxresult;
+    DDSURFACEDESC        ddsd;
+    LPDIRECTDRAWSURFACE  p_display;
+    DDPIXELFORMAT        ddpfPixelFormat;
+
+    intf_WarnMsg( 3, "vout: DirectXCreateDisplay" );
 
-    /* Now create the primary surface. This surface is the displayed surface */
-    /* The following two steps are important! */
+    /* Now create the primary surface. This surface is what you actually see
+     * on your screen */
     memset( &ddsd, 0, sizeof( DDSURFACEDESC ));
     ddsd.dwSize = sizeof(DDSURFACEDESC);
     ddsd.dwFlags = DDSD_CAPS;
     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
 
-    dxresult = IDirectDraw_CreateSurface( p_vout->p_sys->p_ddobject,
-                                          &ddsd,
-                                          &p_vout->p_sys->p_display, NULL );
+    dxresult = IDirectDraw2_CreateSurface( p_vout->p_sys->p_ddobject,
+                                           &ddsd,
+                                           &p_display, NULL );
     if( dxresult != DD_OK )
     {
         intf_ErrMsg( "vout error: can't create direct draw primary surface." );
@@ -904,57 +1068,97 @@ static int WinDXCreateDisplay( vout_thread_t *p_vout )
         return( 1 );
     }
 
-#if 0
-    /* Now create a clipper for our window.
-     * This clipper prevents us to modify by mistake anything on the screen
-     * (primary surface) which doesn't belong to our window */
-    dxresult = IDirectDraw_CreateClipper(p_vout->p_sys->p_ddobject, 0,
-                                         &p_vout->p_sys->p_clipper, NULL);
-    if( dxresult != DD_OK )
+    dxresult = IDirectDrawSurface_QueryInterface( p_display,
+                                         &IID_IDirectDrawSurface3,
+                                         (LPVOID *)&p_vout->p_sys->p_display );
+    if ( dxresult != DD_OK )
     {
-        intf_ErrMsg( "vout error: can't create clipper." );
-        IDirectDrawSurface_Release( p_vout->p_sys->p_display );
+        intf_ErrMsg( "vout error: can't get IDirectDrawSurface3 interface." );
+        IDirectDrawSurface_Release( p_display );
         p_vout->p_sys->p_display = NULL;
         return( 1 );
     }
-
-    dxresult = IDirectDrawClipper_SetHWnd(p_vout->p_sys->p_clipper, 0,
-                                              p_vout->p_sys->hwnd);
-    if( dxresult != DD_OK )
+    else
     {
-        intf_ErrMsg( "vout error: can't attach clipper to window." );
-        IDirectDrawSurface_Release( p_vout->p_sys->p_display );
-        p_vout->p_sys->p_display = NULL;
-        return( 1 );
+        /* Release the old interface */
+        IDirectDrawSurface_Release( p_display );
     }
 
-    dxresult = IDirectDrawSurface_SetClipper(p_vout->p_sys->p_display,
-                                              p_vout->p_sys->p_clipper);
-    if( dxresult != DD_OK )
+
+    /* We need to fill in some information for the video output thread.
+     * We do this here because it must be done before the video_output
+     * thread enters its main loop - and DirectXCreateSurface can be called
+     * after that ! */
+    ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
+    IDirectDrawSurface3_GetPixelFormat( p_vout->p_sys->p_display,
+                                        &ddpfPixelFormat );
+#ifdef NONAMELESSUNION
+    p_vout->i_screen_depth =    ddpfPixelFormat.u1.dwRGBBitCount;
+    p_vout->i_bytes_per_pixel = ddpfPixelFormat.u1.dwRGBBitCount/8;
+    
+    p_vout->i_red_mask =        ddpfPixelFormat.u2.dwRBitMask;
+    p_vout->i_green_mask =      ddpfPixelFormat.u3.dwGBitMask;
+    p_vout->i_blue_mask =       ddpfPixelFormat.u4.dwBBitMask;
+#else
+    p_vout->i_screen_depth =    ddpfPixelFormat.dwRGBBitCount;
+    p_vout->i_bytes_per_pixel = ddpfPixelFormat.dwRGBBitCount/8;
+
+    p_vout->i_red_mask =        ddpfPixelFormat.dwRBitMask;
+    p_vout->i_green_mask =      ddpfPixelFormat.dwGBitMask;
+    p_vout->i_blue_mask =       ddpfPixelFormat.dwBBitMask;
+#endif /* NONAMELESSUNION */
+
+    /* Create a video surface. This function will try to create an
+     * YUV overlay first and if it can't it will create a simple RGB surface */
+    if( DirectXCreateSurface( p_vout ) )
     {
-        intf_ErrMsg( "vout error: can't attach clipper to surface." );
-        IDirectDrawSurface_Release( p_vout->p_sys->p_display );
+        intf_ErrMsg( "vout error: can't create a video surface." );
+        IDirectDrawSurface3_Release( p_vout->p_sys->p_display );
         p_vout->p_sys->p_display = NULL;
         return( 1 );
     }
-#endif
+      
+    return( 0 );
+}
 
+/*****************************************************************************
+ * DirectXCreateSurface: create an YUV overlay or RGB surface for the video.
+ *****************************************************************************
+ * The best method of display is with an YUV overlay because the YUV->RGB
+ * conversion is done in hardware, so we'll try to create this surface first.
+ * If we fail, we'll try to create a plain RGB surface.
+ * ( Maybe we could also try an RGB overlay surface, which could have hardware
+ * scaling and which would also be faster in window mode because you don't
+ * need to do any blitting to the main display...)
+ *****************************************************************************/
+static int DirectXCreateSurface( vout_thread_t *p_vout )
+{
+    HRESULT dxresult;
+    DDSURFACEDESC ddsd;
+    LPDIRECTDRAWSURFACE p_surface;
+    DDCAPS ddcaps;
+
+    intf_WarnMsg( 3, "vout: DirectXCreateSurface" );
+
+    /* Disable display */
+    p_vout->p_sys->b_display_enabled = 0;
+
+#if 1
     /* Probe the capabilities of the hardware */
-    /* This is just an indication of whever or not we'll support overlay,
+    /* This is just an indication of whether or not we'll support overlay,
      * but with this test we don't know if we support YUV overlay */
     memset( &ddcaps, 0, sizeof( DDCAPS ));
     ddcaps.dwSize = sizeof(DDCAPS);
-    dxresult = IDirectDraw_GetCaps( p_vout->p_sys->p_ddobject,
-                                    &ddcaps, NULL );
+    dxresult = IDirectDraw2_GetCaps( p_vout->p_sys->p_ddobject,
+                                     &ddcaps, NULL );
     if(dxresult != DD_OK )
     {
-        intf_ErrMsg( "vout error: can't get caps." );
-        bHasOverlay  = FALSE;
-        bHasColorKey = FALSE;
-        bCanStretch  = FALSE;
+        intf_WarnMsg( 3,"vout error: can't get caps." );
     }
     else
     {
+        BOOL bHasOverlay, bHasColorKey, bCanStretch;
+
         /* Determine if the hardware supports overlay surfaces */
         bHasOverlay = ((ddcaps.dwCaps & DDCAPS_OVERLAY) ==
                        DDCAPS_OVERLAY) ? TRUE : FALSE;
@@ -964,59 +1168,158 @@ static int WinDXCreateDisplay( vout_thread_t *p_vout )
         /* Determine if the hardware supports scaling of the overlay surface */
         bCanStretch = ((ddcaps.dwCaps & DDCAPS_OVERLAYSTRETCH) ==
                        DDCAPS_OVERLAYSTRETCH) ? TRUE : FALSE;
-        intf_WarnMsg( 3, "vout: WinDX Caps: overlay=%i colorkey=%i stretch=%i",
+        intf_WarnMsg( 3, "vout: Dx Caps: overlay=%i colorkey=%i stretch=%i",
                          bHasOverlay, bHasColorKey, bCanStretch );
+
+        if( !bHasOverlay ) p_vout->b_need_render = 1;
     }
+#endif
+
 
-    p_vout->p_sys->p_overlay = NULL;
-    if( bHasOverlay && bHasColorKey && bCanStretch )
+    /* Create the video surface */
+    if( !p_vout->b_need_render )
     {
-        if( !WinDXCreateYUVOverlay( p_vout ) )
+        /* Now try to create the YUV overlay surface.
+         * This overlay will be displayed on top of the primary surface.
+         * A color key is used to determine whether or not the overlay will be
+         * displayed, ie the overlay will be displayed in place of the primary
+         * surface wherever the primary surface will have this color.
+         * The video window has been created with a background of this color so
+         * the overlay will be only displayed on top of this window */
+
+        memset( &ddsd, 0, sizeof( DDSURFACEDESC ));
+        ddsd.dwSize = sizeof(DDSURFACEDESC);
+        ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
+        ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC;
+        ddsd.ddpfPixelFormat.dwFourCC = mmioFOURCC('Y','V','1','2');
+#ifdef NONAMELESSUNION
+        ddsd.ddpfPixelFormat.u1.dwYUVBitCount = 16;
+#else
+        ddsd.ddpfPixelFormat.dwYUVBitCount = 16;
+#endif
+        ddsd.dwFlags = DDSD_CAPS |
+                       DDSD_HEIGHT |
+                       DDSD_WIDTH |
+                       DDSD_PIXELFORMAT;
+        ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY;
+        ddsd.dwHeight =  p_vout->p_sys->i_image_height;
+        ddsd.dwWidth =  p_vout->p_sys->i_image_width;
+
+        dxresult = IDirectDraw2_CreateSurface( p_vout->p_sys->p_ddobject,
+                                               &ddsd, &p_surface, NULL );
+        if( dxresult == DD_OK )
+        {
+            intf_WarnMsg( 3,"vout: DirectX YUV overlay created successfully" );
+        }
+        else
         {
-           /* Overlay created successfully */
-           p_vout->b_need_render = 0;
+            intf_ErrMsg( "vout error: can't create YUV overlay surface." );
+            p_vout->b_need_render = 1;
         }
     }
 
-
-    /* Now do some initialisation for video_output */
     if( p_vout->b_need_render )
     {
-        /* if we want a valid pointer to the surface memory, we must lock
-         * the surface */
+        /* Now try to create a plain RGB surface. */
         memset( &ddsd, 0, sizeof( DDSURFACEDESC ));
         ddsd.dwSize = sizeof(DDSURFACEDESC);
-        dxresult = IDirectDrawSurface_Lock(p_vout->p_sys->p_display,
-                                           NULL, &ddsd,
-                                           DDLOCK_NOSYSLOCK, NULL);
-        if ( dxresult == DDERR_SURFACELOST )
+        ddsd.dwFlags = DDSD_HEIGHT |
+                       DDSD_WIDTH |
+                       DDSD_CAPS;
+        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+        ddsd.dwHeight =  p_vout->p_sys->i_image_height;
+        ddsd.dwWidth =  p_vout->p_sys->i_image_width;
+
+        dxresult = IDirectDraw2_CreateSurface( p_vout->p_sys->p_ddobject,
+                                               &ddsd, &p_surface, NULL );
+        if( dxresult == DD_OK )
         {
-            /* Your surface can be lost so be sure
-             * to check this and restore it if needed */
-            dxresult = IDirectDrawSurface_Restore( p_vout->p_sys->p_display );
-            dxresult = IDirectDrawSurface_Lock( p_vout->p_sys->p_display,
-                                                NULL, &ddsd, DDLOCK_NOSYSLOCK
-                                                | DDLOCK_WAIT, NULL);
+            intf_WarnMsg( 3,"vout: DirectX RGB surface created successfully" );
         }
-        if( dxresult != DD_OK )
+        else
         {
-            intf_WarnMsg( 3, "vout: WinDX could not lock the surface" );
+            intf_ErrMsg( "vout error: can't create RGB surface." );
+            p_vout->p_sys->p_surface = NULL;
             return( 1 );
         }
+    }
+      
+    /* Now that the surface is created, try to get a newer DirectX interface */
+    dxresult = IDirectDrawSurface_QueryInterface( p_surface,
+                                         &IID_IDirectDrawSurface3,
+                                         (LPVOID *)&p_vout->p_sys->p_surface );
+    if ( dxresult != DD_OK )
+    {
+        intf_ErrMsg( "vout error: can't get IDirectDrawSurface3 interface." );
+        IDirectDrawSurface_Release( p_surface );
+        p_vout->p_sys->p_surface = NULL;
+        return( 1 );
+    }
+    else
+    {
+        /* Release the old interface */
+        IDirectDrawSurface_Release( p_surface );
+    }
+
+    if( !p_vout->b_need_render )
+    {
+        /* Hide the overlay for now */
+        IDirectDrawSurface3_UpdateOverlay(p_vout->p_sys->p_surface,
+                                          NULL,
+                                          p_vout->p_sys->p_display,
+                                          NULL,
+                                          DDOVER_HIDE,
+                                          NULL);
+    }
+    else
+    {
+         DirectXCreateClipper( p_vout );
+    }
 
-        /* Set the pointer to the surface memory */
-        p_vout->p_sys->p_windx_buf[ 0 ] = ddsd.lpSurface;
-        /* back buffer, none for now */
-        p_vout->p_sys->p_windx_buf[ 1 ] = ddsd.lpSurface;
 
+    /* From now on, do some initialisation for video_output */
 
-        /* Set thread information */
-        p_vout->i_width =           ddsd.dwWidth;
-        p_vout->i_height =          ddsd.dwHeight;
+    /* if we want a valid pointer to the surface memory, we must lock
+     * the surface */
 
+    memset( &ddsd, 0, sizeof( DDSURFACEDESC ));
+    ddsd.dwSize = sizeof(DDSURFACEDESC);
+    dxresult = IDirectDrawSurface3_Lock( p_vout->p_sys->p_surface, NULL, &ddsd,
+                                         DDLOCK_NOSYSLOCK | DDLOCK_WAIT, NULL);
+    if ( dxresult == DDERR_SURFACELOST )
+    {
+        /* Your surface can be lost so be sure
+         * to check this and restore it if needed */
+        dxresult = IDirectDrawSurface3_Restore( p_vout->p_sys->p_surface );
+        dxresult = IDirectDrawSurface3_Lock( p_vout->p_sys->p_surface,
+                                             NULL, &ddsd, DDLOCK_NOSYSLOCK
+                                             | DDLOCK_WAIT, NULL);
+    }
+    if( dxresult != DD_OK )
+    {
+        intf_ErrMsg( "vout: DirectXCreateDisplay could not lock the surface" );
+        return( 1 );
+    }
+
+    /* Set the pointer to the surface memory */
+    p_vout->p_sys->p_directx_buf[ 0 ] = ddsd.lpSurface;
+    /* back buffer, none for now */
+    p_vout->p_sys->p_directx_buf[ 1 ] = ddsd.lpSurface;
+
+    /* Set thread information */
+    p_vout->i_width =  ddsd.dwWidth;
+    p_vout->i_height = ddsd.dwHeight;
 #ifdef NONAMELESSUNION
-        p_vout->i_bytes_per_line =  ddsd.u1.lPitch;
+    p_vout->i_bytes_per_line =  ddsd.u1.lPitch;
+#else
+    p_vout->i_bytes_per_line =  ddsd.lPitch;
+#endif /* NONAMELESSUNION */
+
 
+    if( p_vout->b_need_render )
+    {
+        /* For an RGB surface we need to fill in some more info */
+#ifdef NONAMELESSUNION
         p_vout->i_screen_depth =    ddsd.ddpfPixelFormat.u1.dwRGBBitCount;
         p_vout->i_bytes_per_pixel = ddsd.ddpfPixelFormat.u1.dwRGBBitCount/8;
 
@@ -1024,8 +1327,6 @@ static int WinDXCreateDisplay( vout_thread_t *p_vout )
         p_vout->i_green_mask =      ddsd.ddpfPixelFormat.u3.dwGBitMask;
         p_vout->i_blue_mask =       ddsd.ddpfPixelFormat.u4.dwBBitMask;
 #else
-        p_vout->i_bytes_per_line =  ddsd.lPitch;
-
         p_vout->i_screen_depth =    ddsd.ddpfPixelFormat.dwRGBBitCount;
         p_vout->i_bytes_per_pixel = ddsd.ddpfPixelFormat.dwRGBBitCount/8;
 
@@ -1034,144 +1335,95 @@ static int WinDXCreateDisplay( vout_thread_t *p_vout )
         p_vout->i_blue_mask =       ddsd.ddpfPixelFormat.dwBBitMask;
 
 #endif /* NONAMELESSUNION */
-
-        /* Unlock the Surface */
-        dxresult = IDirectDrawSurface_Unlock(p_vout->p_sys->p_display,
-                                             ddsd.lpSurface );
-        /* FIXME: palette in 8bpp ?? */
-        /* Set and initialize buffers */
-        p_vout->pf_setbuffers( p_vout, p_vout->p_sys->p_windx_buf[ 0 ],
-                                 p_vout->p_sys->p_windx_buf[ 1 ] );
     }
-    else
-    {
-        /* Lock the surface */
-        memset( &ddsd, 0, sizeof( DDSURFACEDESC ));
-        ddsd.dwSize = sizeof(DDSURFACEDESC);
-        dxresult = IDirectDrawSurface_Lock(p_vout->p_sys->p_overlay,
-                                          NULL, &ddsd, DDLOCK_NOSYSLOCK, NULL);
-        if ( dxresult == DDERR_SURFACELOST )
-        {
-            /* Your surface can be lost (thanks to windows) so be sure
-             * to check this every time you want to do something with
-             * it */
-            dxresult = IDirectDrawSurface_Restore(
-                                           p_vout->p_sys->p_overlay );
-            dxresult = IDirectDrawSurface_Lock( p_vout->p_sys->p_overlay
-                        , NULL, &ddsd,DDLOCK_NOSYSLOCK| DDLOCK_WAIT, NULL);
-        }
-        if( dxresult != DD_OK )
-        {
-            intf_WarnMsg( 3, "vout: WinDX could not lock the surface" );
-            return( 1 );
-        }
 
-        p_vout->p_sys->p_windx_buf[ 0 ] = ddsd.lpSurface;
-        p_vout->p_sys->p_windx_buf[ 1 ] = ddsd.lpSurface;
+    /* Unlock the Surface */
+    dxresult = IDirectDrawSurface3_Unlock(p_vout->p_sys->p_surface,
+                                          ddsd.lpSurface );
 
-        /* Set thread information */
-        p_vout->i_width =           ddsd.dwWidth;
-        p_vout->i_height =          ddsd.dwHeight;
-#ifdef NONAMELESSUNION
-        p_vout->i_bytes_per_line =  ddsd.u1.lPitch;
-#else
-        p_vout->i_bytes_per_line =  ddsd.lPitch;
-#endif /* NONAMELESSUNION */
+    /* Set and initialize buffers */
+    p_vout->pf_setbuffers( p_vout, p_vout->p_sys->p_directx_buf[ 0 ],
+                           p_vout->p_sys->p_directx_buf[ 1 ] );
 
-        /* Unlock the Surface */
-        dxresult = IDirectDrawSurface_Unlock(p_vout->p_sys->p_overlay,
-                                             ddsd.lpSurface );
 
-        p_vout->pf_setbuffers( p_vout, p_vout->p_sys->p_windx_buf[ 0 ],
-                                 p_vout->p_sys->p_windx_buf[ 1 ] );
-    }
-
-    return( 0 );
+    return ( 0 );
 }
 
+
 /*****************************************************************************
- * WinDXCreateYUVOveraly: create an YUV overlay surface for the video.
+ * DirectXCreateClipper: Create a clipper that will be used when blitting the
+ *                       RGB surface to the main display.
  *****************************************************************************
- * The best method of display is with an YUV overlay because the YUV->RGB
- * conversion is done in hardware.
- * This function will try to create an YUV overlay.
+ * This clipper prevents us to modify by mistake anything on the screen
+ * which doesn't belong to our window. For example when a part of our video
+ * window is hidden by another window.
  *****************************************************************************/
-static int WinDXCreateYUVOverlay( vout_thread_t *p_vout )
+static int DirectXCreateClipper( vout_thread_t *p_vout )
 {
     HRESULT dxresult;
-    DDSURFACEDESC ddsd;
 
-    /* Now create the overlay surface. This overlay will be displayed on
-     * top of the primary surface.
-     * A color key is used to determine whether or not the overlay will be
-     * displayed, ie the overlay will be displayed in place of the primary
-     * surface wherever the primary surface will have this color.
-     * The video window has been created with a background of this color so
-     * the overlay will be only displayed on top of this window */
+    intf_WarnMsg( 3, "vout: DirectXCreateClipper" );
 
-    memset( &ddsd, 0, sizeof( DDSURFACEDESC ));
-    ddsd.dwSize = sizeof(DDSURFACEDESC);
-    ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
-    ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC;
-    ddsd.ddpfPixelFormat.dwFourCC = mmioFOURCC('Y','V','1','2');
-#ifdef NONAMELESSUNION
-    ddsd.ddpfPixelFormat.u1.dwYUVBitCount = 16;
-#else
-    ddsd.ddpfPixelFormat.dwYUVBitCount = 16;
-#endif
-
-    ddsd.dwSize = sizeof(DDSURFACEDESC);
-    ddsd.dwFlags = DDSD_CAPS |
-                   DDSD_HEIGHT |
-                   DDSD_WIDTH |
-                   DDSD_PIXELFORMAT;
-    ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY;
-    ddsd.dwHeight =  p_vout->p_sys->i_image_height;
-    ddsd.dwWidth =  p_vout->p_sys->i_image_width;
-
-    dxresult = IDirectDraw_CreateSurface( p_vout->p_sys->p_ddobject,
-                                          &ddsd,
-                                          &p_vout->p_sys->p_overlay, NULL );
+    /* Create the clipper */
+    dxresult = IDirectDraw2_CreateClipper( p_vout->p_sys->p_ddobject, 0,
+                                           &p_vout->p_sys->p_clipper, NULL );
     if( dxresult != DD_OK )
     {
-        intf_ErrMsg( "vout error: can't create overlay surface." );
-        p_vout->p_sys->p_overlay = NULL;
+        intf_WarnMsg( 3, "vout: DirectXCreateClipper can't create clipper." );
+        IDirectDrawSurface_Release( p_vout->p_sys->p_clipper );
+        p_vout->p_sys->p_clipper = NULL;
+        return( 1 );
     }
-    else
+    
+    /* associate the clipper to the window */
+    dxresult = IDirectDrawClipper_SetHWnd(p_vout->p_sys->p_clipper, 0,
+                                          p_vout->p_sys->hwnd);
+    if( dxresult != DD_OK )
     {
-        intf_WarnMsg( 3, "vout: WinDX YUV overlay created successfully" );
+        intf_WarnMsg( 3,
+            "vout: DirectXCreateClipper can't attach clipper to window." );
+        IDirectDrawSurface_Release( p_vout->p_sys->p_clipper );
+        p_vout->p_sys->p_clipper = NULL;
+        return( 1 );
     }
-    /* Hide the overlay for now */
-    IDirectDrawSurface_UpdateOverlay(p_vout->p_sys->p_overlay,
-                                     NULL,
-                                     p_vout->p_sys->p_display,
-                                     NULL,
-                                     DDOVER_HIDE,
-                                     NULL);
-
-    return ( 0 );
+    
+    /* associate the clipper with the surface */
+    dxresult = IDirectDrawSurface_SetClipper(p_vout->p_sys->p_display,
+                                             p_vout->p_sys->p_clipper);
+    if( dxresult != DD_OK )
+    {
+        intf_WarnMsg( 3,
+            "vout: DirectXCreateClipper can't attach clipper to surface." );
+        IDirectDrawSurface_Release( p_vout->p_sys->p_clipper );
+        p_vout->p_sys->p_clipper = NULL;
+        return( 1 );
+    }    
+     
+    return( 0 );
 }
 
+
 /*****************************************************************************
- * WinDXUpdateOverlay: Move or resize overlay surface on video display.
+ * DirectXUpdateOverlay: Move or resize overlay surface on video display.
  *****************************************************************************
  * This function is used to move or resize an overlay surface on the screen.
  * Ususally the overlay is moved by the user and thus, by a move or resize
  * event (in vout_Manage).
  *****************************************************************************/
-static int WinDXUpdateOverlay( vout_thread_t *p_vout )
+static int DirectXUpdateOverlay( vout_thread_t *p_vout )
 {
     DDOVERLAYFX     ddofx;
-    RECT            rect_window, rect_image;
+    RECT            rect_window, rect_window_backup, rect_image;
     POINT           point_window;
     DWORD           dwFlags;
     HRESULT         dxresult;
     DWORD           dw_colorkey;
     DDPIXELFORMAT   pixel_format;
+    DDSURFACEDESC   ddsd;
 
-    if( p_vout->p_sys->p_overlay == NULL || p_vout->b_need_render)
+    if( p_vout->p_sys->p_surface == NULL || p_vout->b_need_render )
     {
-        intf_WarnMsg( 3, "vout: WinDX no overlay !!" );
+        intf_WarnMsg( 3, "vout: DirectXUpdateOverlay no overlay !!" );
         return( 0 );
     }
 
@@ -1292,16 +1544,65 @@ static int WinDXUpdateOverlay( vout_thread_t *p_vout )
 
     /* It seems we can't feed the UpdateOverlay directdraw function with
      * negative values so we have to clip the computed rectangles */
-    /* FIXME */
-
+    memset( &ddsd, 0, sizeof( DDSURFACEDESC ));
+    ddsd.dwSize = sizeof(DDSURFACEDESC);
+    ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
+    IDirectDraw2_GetDisplayMode( p_vout->p_sys->p_ddobject, &ddsd );
+
+    rect_window_backup = rect_window;
+
+    /* Clip the destination window */
+    rect_window.left = (rect_window.left < 0) ? 0 : rect_window.left;
+    rect_window.right = (rect_window.right < 0) ? 0 : rect_window.right;
+    rect_window.top = (rect_window.top < 0) ? 0 : rect_window.top;
+    rect_window.bottom = (rect_window.bottom < 0) ? 0 : rect_window.bottom;
+
+    rect_window.left = (rect_window.left > ddsd.dwWidth) ? ddsd.dwWidth
+      : rect_window.left;
+    rect_window.right = (rect_window.right > ddsd.dwWidth) ? ddsd.dwWidth
+      : rect_window.right;
+    rect_window.top = (rect_window.top > ddsd.dwHeight) ? ddsd.dwHeight
+      : rect_window.top;
+    rect_window.bottom = (rect_window.bottom > ddsd.dwHeight) ? ddsd.dwHeight
+      : rect_window.bottom;
+
+    intf_WarnMsg( 3, "vout: DirectXUpdateOverlay window coords: %i,%i,%i,%i",
+                  rect_window.left, rect_window.top,
+                  rect_window.right, rect_window.bottom);
+
+    /* Clip the source image */
+    rect_image.left = ( rect_window.left == rect_window_backup.left ) ? 0
+      : labs(rect_window_backup.left - rect_window.left) *
+      p_vout->p_rendered_pic->i_width /
+      (rect_window_backup.right - rect_window_backup.left);
+    rect_image.right = ( rect_window.right == rect_window_backup.right ) ?
+      p_vout->p_rendered_pic->i_width
+      : p_vout->p_rendered_pic->i_width -
+      labs(rect_window_backup.right - rect_window.right) *
+      p_vout->p_rendered_pic->i_width /
+      (rect_window_backup.right - rect_window_backup.left);
+    rect_image.top = ( rect_window.top == rect_window_backup.top ) ? 0
+      : labs(rect_window_backup.top - rect_window.top) *
+      p_vout->p_rendered_pic->i_height /
+      (rect_window_backup.bottom - rect_window_backup.top);
+    rect_image.bottom = ( rect_window.bottom == rect_window_backup.bottom ) ?
+      p_vout->p_rendered_pic->i_height
+      : p_vout->p_rendered_pic->i_height -
+      labs(rect_window_backup.bottom - rect_window.bottom) *
+      p_vout->p_rendered_pic->i_height /
+      (rect_window_backup.bottom - rect_window_backup.top);
+
+    intf_WarnMsg( 3, "vout: DirectXUpdateOverlay image coords: %i,%i,%i,%i",
+                  rect_image.left, rect_image.top,
+                  rect_image.right, rect_image.bottom);
 
     /* compute the colorkey pixel value from the RGB value we've got */
     memset( &pixel_format, 0, sizeof( DDPIXELFORMAT ));
     pixel_format.dwSize = sizeof( DDPIXELFORMAT );
-    dxresult = IDirectDrawSurface_GetPixelFormat( p_vout->p_sys->p_display,
-                                                  &pixel_format );
+    dxresult = IDirectDrawSurface3_GetPixelFormat( p_vout->p_sys->p_display,
+                                                   &pixel_format );
     if( dxresult != DD_OK )
-        intf_WarnMsg( 3, "vout: WinDX GetPixelFormat failed !!" );
+        intf_WarnMsg( 3, "vout: DirectXUpdateOverlay GetPixelFormat failed" );
     dw_colorkey = (DWORD)p_vout->p_sys->i_colorkey;
 #ifdef NONAMELESSUNION
     dw_colorkey = (DWORD)((( dw_colorkey * pixel_format.u2.dwRBitMask) / 255)
@@ -1319,34 +1620,35 @@ static int WinDXUpdateOverlay( vout_thread_t *p_vout )
 
     dwFlags = DDOVER_KEYDESTOVERRIDE | DDOVER_SHOW;
 
-    dxresult = IDirectDrawSurface_UpdateOverlay(p_vout->p_sys->p_overlay,
-                                                NULL,    /*&rect_image,*/
-                                                p_vout->p_sys->p_display,
-                                                &rect_window,
-                                                dwFlags,
-                                                &ddofx);
+    dxresult = IDirectDrawSurface3_UpdateOverlay(p_vout->p_sys->p_surface,
+                                                 &rect_image,
+                                                 p_vout->p_sys->p_display,
+                                                 &rect_window,
+                                                 dwFlags,
+                                                 &ddofx);
     if(dxresult != DD_OK)
     {
-        intf_WarnMsg( 3, "vout: WinDX can't move or resize overlay" );
+        intf_WarnMsg( 3,
+          "vout: DirectXUpdateOverlay can't move or resize overlay" );
     }
 
     return ( 0 );
 }
 
 /*****************************************************************************
- * WinDXCloseWindow: close the window created by WinDXCreateWindow
+ * DirectXCloseWindow: close the window created by DirectXCreateWindow
  *****************************************************************************
- * This function returns all resources allocated by WinDXCreateWindow.
+ * This function returns all resources allocated by DirectXCreateWindow.
  *****************************************************************************/
-static void WinDXCloseWindow( vout_thread_t *p_vout )
+static void DirectXCloseWindow( vout_thread_t *p_vout )
 {
     HINSTANCE hInstance;
 
-    intf_WarnMsg( 3, "vout: WinDXCloseWindow" );
-    if( p_vout->p_sys->hwnd != INVALID_HANDLE_VALUE )
+    intf_WarnMsg( 3, "vout: DirectXCloseWindow" );
+    if( p_vout->p_sys->hwnd != NULL )
     {
         DestroyWindow( p_vout->p_sys->hwnd);
-        p_vout->p_sys->hwnd = INVALID_HANDLE_VALUE;
+        p_vout->p_sys->hwnd = NULL;
     }
 
     hInstance = GetModuleHandle(NULL);
@@ -1354,74 +1656,77 @@ static void WinDXCloseWindow( vout_thread_t *p_vout )
                      hInstance );          /* handle to application instance */
 
     /* free window background brush */
-    if( p_vout->p_sys->hwnd != INVALID_HANDLE_VALUE )
+    if( p_vout->p_sys->hwnd != NULL )
     {
         DeleteObject( p_vout->p_sys->hbrush );
-        p_vout->p_sys->hbrush = INVALID_HANDLE_VALUE;
+        p_vout->p_sys->hbrush = NULL;
     }
 }
 
 /*****************************************************************************
- * WinDXCloseDDraw: Release the DDraw object allocated by WinDXInitDDraw
+ * DirectXCloseDDraw: Release the DDraw object allocated by DirectXInitDDraw
  *****************************************************************************
- * This function returns all resources allocated by WinDXInitDDraw.
+ * This function returns all resources allocated by DirectXInitDDraw.
  *****************************************************************************/
-static void WinDXCloseDDraw( vout_thread_t *p_vout )
+static void DirectXCloseDDraw( vout_thread_t *p_vout )
 {
-    intf_WarnMsg(3, "vout: WinDXCloseDDraw" );
+    intf_WarnMsg(3, "vout: DirectXCloseDDraw" );
     if( p_vout->p_sys->p_ddobject != NULL )
     {
-        IDirectDraw_Release(p_vout->p_sys->p_ddobject);
+        IDirectDraw2_Release(p_vout->p_sys->p_ddobject);
         p_vout->p_sys->p_ddobject = NULL;
     }
+
+    if( p_vout->p_sys->hddraw_dll != NULL )
+    {
+        FreeLibrary( p_vout->p_sys->hddraw_dll );
+        p_vout->p_sys->hddraw_dll = NULL;
+    }
 }
 
 /*****************************************************************************
- * WinDXCloseDisplay: close and reset DirectX device
+ * DirectXCloseDisplay: close and reset the DirectX display device
  *****************************************************************************
- * This function returns all resources allocated by WinDXCreateDisplay and
- * restore the original state of the device.
+ * This function returns all resources allocated by DirectXCreateDisplay.
  *****************************************************************************/
-static void WinDXCloseDisplay( vout_thread_t *p_vout )
+static void DirectXCloseDisplay( vout_thread_t *p_vout )
 {
-    intf_WarnMsg( 3, "vout: WinDXCloseDisplay" );
+    intf_WarnMsg( 3, "vout: DirectXCloseDisplay" );
     if( p_vout->p_sys->p_display != NULL )
     {
-        if( p_vout->p_sys->p_overlay != NULL )
-        {
-            intf_WarnMsg( 3, "vout: WinDXCloseDisplay overlay" );
-            IDirectDraw_Release( p_vout->p_sys->p_overlay );
-            p_vout->p_sys->p_overlay = NULL;
-        }
+        DirectXCloseSurface( p_vout );
 
-        if( p_vout->p_sys->p_clipper != NULL )
-        {
-            intf_WarnMsg( 3, "vout: WinDXCloseDisplay clipper" );
-            IDirectDraw_Release( p_vout->p_sys->p_clipper );
-            p_vout->p_sys->p_clipper = NULL;
-        }
-
-        intf_WarnMsg( 3, "vout: WinDXCloseDisplay display" );
-        IDirectDraw_Release( p_vout->p_sys->p_display );
+        intf_WarnMsg( 3, "vout: DirectXCloseDisplay display" );
+        IDirectDraw2_Release( p_vout->p_sys->p_display );
         p_vout->p_sys->p_display = NULL;
     }
 }
 
 /*****************************************************************************
- * WinDXCloseYUVOverlay: close the overlay surface
+ * DirectXCloseSurface: close the YUV overlay or RGB surface.
  *****************************************************************************
- * This function returns all resources allocated by the overlay surface.
+ * This function returns all resources allocated by the surface.
  * We also call this function when the decoded picture change its dimensions
  * (in that case we close the overlay surface and reopen another with the
  * right dimensions).
  *****************************************************************************/
-static void WinDXCloseYUVOverlay( vout_thread_t *p_vout )
+static void DirectXCloseSurface( vout_thread_t *p_vout )
 {
-    intf_WarnMsg( 3, "vout: WinDXCloseYUVOverlay" );
-    if( p_vout->p_sys->p_overlay != NULL )
+    intf_WarnMsg( 3, "vout: DirectXCloseSurface" );
+    if( p_vout->p_sys->p_surface != NULL )
+    {
+        intf_WarnMsg( 3, "vout: DirectXCloseSurface surface" );
+        IDirectDraw2_Release( p_vout->p_sys->p_surface );
+        p_vout->p_sys->p_surface = NULL;
+    }
+
+    if( p_vout->p_sys->p_clipper != NULL )
     {
-        IDirectDraw_Release( p_vout->p_sys->p_overlay );
-        p_vout->p_sys->p_overlay = NULL;
+        intf_WarnMsg( 3, "vout: DirectXCloseSurface clipper" );
+        IDirectDraw2_Release( p_vout->p_sys->p_clipper );
+        p_vout->p_sys->p_clipper = NULL;
     }
+
+    /* Disable any display */
     p_vout->p_sys->b_display_enabled = 0;
 }
index ef779eed82f362b6ddb72e9ce1db803064bd70f9..397ef0eb73236c6bcd766be45c98495cb6b30b6d 100644 (file)
@@ -2,7 +2,7 @@
  * aout_dummy.c : dummy audio output plugin
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: aout_dummy.c,v 1.12 2001/05/31 01:37:08 sam Exp $
+ * $Id: aout_dummy.c,v 1.13 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -50,9 +50,9 @@
  *****************************************************************************/
 typedef struct aout_sys_s
 {
-#if defined( _MSC_VER )
+    /* Prevent malloc(0) */
     int i_dummy;
-#endif
+
 } aout_sys_t;
 
 /*****************************************************************************
index 0961f6d12213a8ea19eb3f55a3711f3f17b2d96f..361e7d6fe3ac08f31d0ec45c83d2b5b0c5a426b6 100644 (file)
@@ -2,7 +2,7 @@
  * intf_dummy.c: dummy interface plugin
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: intf_dummy.c,v 1.9 2001/05/31 01:37:08 sam Exp $
+ * $Id: intf_dummy.c,v 1.10 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -50,9 +50,9 @@
  *****************************************************************************/
 typedef struct intf_sys_s
 {
-#if defined( _MSC_VER )
+    /* Prevent malloc(0) */
     int i_dummy;
-#endif
+
 } intf_sys_t;
 
 /*****************************************************************************
index 040793209259ee38d5b69330efea5f2fc8f096d8..fb9e9fda8b4e540ef7d8ed2110e768119c1f38e2 100644 (file)
@@ -30,12 +30,21 @@ $(BUILTIN_DVD): BUILTIN_%.o: %.c
 # Real targets
 #
 
+ifeq (1,$(LOCAL_LIBDVDCSS))
 ../../lib/dvd.so: libdvdcss $(PLUGIN_DVD)
-       $(CC) $(PCFLAGS) -o $@ $(PLUGIN_DVD) $(PLCFLAGS) $(LIB_DVD)
+       $(CC) $(PCFLAGS) -o $@ $(PLUGIN_DVD) $(PLCFLAGS) ../../lib/libdvdcss.a $(LIB_DVD)
 
 ../../lib/dvd.a: libdvdcss $(BUILTIN_DVD)
        ar r $@ $(BUILTIN_DVD)
        $(RANLIB) $@
+else
+../../lib/dvd.so: $(PLUGIN_DVD)
+       $(CC) $(PCFLAGS) -o $@ $(PLUGIN_DVD) $(PLCFLAGS) $(LIB_DVD)
+
+../../lib/dvd.a: $(BUILTIN_DVD)
+       ar r $@ $(BUILTIN_DVD)
+       $(RANLIB) $@
+endif
 
 libdvdcss:
        cd ../../ && $(MAKE) libdvdcss
index 3512d8e2471c37bc0ca2c9e8f7628d115cd8d5b8..a46b9eb6a0a2ed59939234da5d5c5aee3ecd736e 100644 (file)
@@ -10,7 +10,7 @@
  *  -dvd_udf to find files
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: input_dvd.c,v 1.72 2001/06/13 00:03:08 stef Exp $
+ * $Id: input_dvd.c,v 1.73 2001/06/14 01:49:44 sam Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -215,7 +215,6 @@ static void DVDInit( input_thread_t * p_input )
     input_area_t *       p_area;
     int                  i_title;
     int                  i_chapter;
-    int                  i_ret;
     int                  i;
 
     p_dvd = malloc( sizeof(thread_dvd_data_t) );
@@ -229,29 +228,21 @@ static void DVDInit( input_thread_t * p_input )
     p_input->p_plugin_data = (void *)p_dvd;
     p_input->p_method_data = NULL;
 
-    p_dvd->dvdhandle = dvdcss_init( DVDCSS_INIT_QUIET );
-
-    if( p_dvd->dvdhandle == NULL )
-    {
-        free( p_dvd );
-        p_input->b_error = 1;
-        return;
-    }
-
     /* XXX: put this shit in an access plugin */
     if( strlen( p_input->p_source ) > 4
          && !strncasecmp( p_input->p_source, "dvd:", 4 ) )
     {
-        i_ret = dvdcss_open( p_dvd->dvdhandle, p_input->p_source + 4 );
+        p_dvd->dvdhandle = dvdcss_open( p_input->p_source + 4,
+                                        DVDCSS_INIT_QUIET );
     }
     else
     {
-        i_ret = dvdcss_open( p_dvd->dvdhandle, p_input->p_source );
+        p_dvd->dvdhandle = dvdcss_open( p_input->p_source,
+                                        DVDCSS_INIT_QUIET );
     }
 
-    if( i_ret < 0 )
+    if( p_dvd->dvdhandle == NULL )
     {
-        dvdcss_end( p_dvd->dvdhandle );
         free( p_dvd );
         p_input->b_error = 1;
         return;
@@ -276,7 +267,6 @@ static void DVDInit( input_thread_t * p_input )
     {
         intf_ErrMsg( "dvd error: allcation error in ifo" );
         dvdcss_close( p_dvd->dvdhandle );
-        dvdcss_end( p_dvd->dvdhandle );
         free( p_dvd );
         p_input->b_error = 1;
         return;
@@ -287,7 +277,6 @@ static void DVDInit( input_thread_t * p_input )
         intf_ErrMsg( "dvd error: fatal failure in ifo" );
         IfoDestroy( p_dvd->p_ifo );
         dvdcss_close( p_dvd->dvdhandle );
-        dvdcss_end( p_dvd->dvdhandle );
         free( p_dvd );
         p_input->b_error = 1;
         return;
@@ -378,7 +367,6 @@ static void DVDEnd( input_thread_t * p_input )
 
     /* Clean up libdvdcss */
     dvdcss_close( p_dvd->dvdhandle );
-    dvdcss_end( p_dvd->dvdhandle );
 
     free( p_dvd );
 
@@ -441,10 +429,8 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
         p_dvd->i_title_id =
             vts.title_inf.p_title_start[i_vts_title-1].i_title_id;
 
-        intf_WarnMsg( 3, "dvd: title %d vts_title %d pgc %d",
-                        p_dvd->i_title,
-                        i_vts_title,
-                        p_dvd->i_title_id );
+        intf_WarnMsgImm( 3, "dvd: title %d vts_title %d pgc %d",
+                         p_dvd->i_title, i_vts_title, p_dvd->i_title_id );
 
         /*
          * CSS cracking has to be done again
@@ -473,7 +459,6 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
 
         /* last video cell */
         p_dvd->i_cell = 0;
-       intf_FlushMsg();
         p_dvd->i_prg_cell = -1 +
             vts.title_unit.p_title[p_dvd->i_title_id-1].title.i_cell_nb;
 
index cefa5e44860d54e594cd1869e9263e5bf8150622..50b7eade9f88d3b677d026a03b382472b4f1297f 100644 (file)
@@ -2,7 +2,7 @@
  * gtk_menu.c : functions to handle menu items.
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: gtk_menu.c,v 1.9 2001/06/02 01:09:03 sam Exp $
+ * $Id: gtk_menu.c,v 1.10 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Stéphane Borel <stef@via.ecp.fr>
@@ -92,7 +92,7 @@ gint GtkSetupMenus( intf_thread_t * p_intf );
  * user_data to transmit intf_* and we need to refresh the other menu.
  ****************************************************************************/
 
-#define GtkLangToggle( intf, window, menu, type, callback, b_update )   \
+#define GTKLANGTOGGLE( intf, window, menu, type, callback, b_update )   \
     intf_thread_t *         p_intf;                                     \
     GtkWidget *             p_menu;                                     \
     es_descriptor_t *       p_es;                                       \
@@ -123,13 +123,13 @@ gint GtkSetupMenus( intf_thread_t * p_intf );
 
 void GtkMenubarAudioToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 {
-    GtkLangToggle( "intf_window", p_popup, "popup_audio", AUDIO_ES,
+    GTKLANGTOGGLE( "intf_window", p_popup, "popup_audio", AUDIO_ES,
                    GtkPopupAudioToggle, b_audio_update );
 }
 
 void GtkPopupAudioToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 {
-    GtkLangToggle( "intf_popup", p_window, "menubar_audio", AUDIO_ES,
+    GTKLANGTOGGLE( "intf_popup", p_window, "menubar_audio", AUDIO_ES,
                    GtkMenubarAudioToggle, b_audio_update );
 }
 
@@ -139,17 +139,17 @@ void GtkPopupAudioToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 
 void GtkMenubarSubtitleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 {
-    GtkLangToggle( "intf_window", p_popup, "popup_subpictures", SPU_ES,
+    GTKLANGTOGGLE( "intf_window", p_popup, "popup_subpictures", SPU_ES,
                    GtkPopupSubtitleToggle, b_spu_update );
 }
 
 void GtkPopupSubtitleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 {
-    GtkLangToggle( "intf_popup", p_window, "menubar_subpictures", SPU_ES,
+    GTKLANGTOGGLE( "intf_popup", p_window, "menubar_subpictures", SPU_ES,
                    GtkMenubarSubtitleToggle, b_spu_update );
 }
 
-#undef GtkLangToggle
+#undef GTKLANGTOGGLE
 
 /*
  * Navigation
@@ -259,7 +259,7 @@ void GtkMenubarChapterToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
  * Angle
  */
 
-#define GtkAngleToggle( intf, window, menu, callback )                      \
+#define GTKANGLETOGGLE( intf, window, menu, callback )                      \
     intf_thread_t * p_intf;                                                 \
     GtkWidget *     p_menu;                                                 \
     input_area_t *  p_area;                                                 \
@@ -285,17 +285,17 @@ void GtkMenubarChapterToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 
 void GtkMenubarAngleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 {
-    GtkAngleToggle( "intf_window", p_popup, "popup_angle",
+    GTKANGLETOGGLE( "intf_window", p_popup, "popup_angle",
                     GtkPopupAngleToggle );
 }
 
 void GtkPopupAngleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 {
-    GtkAngleToggle( "intf_popup", p_window, "menubar_angle",
+    GTKANGLETOGGLE( "intf_popup", p_window, "menubar_angle",
                     GtkMenubarAngleToggle );
 }
 
-#undef GtkAngleToggle
+#undef GTKANGLETOGGLE
 
 /****************************************************************************
  * Functions to generate menus
index 3cc2d1829bff84a1d3f07508bf29c5c6d85b6235..6e3ef82b26c81c94b3a952329ba6debafc1729b7 100644 (file)
@@ -2,7 +2,7 @@
  * gtk_menu.h: prototypes for menu functions
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: gtk_menu.h,v 1.3 2001/05/19 00:39:30 stef Exp $
+ * $Id: gtk_menu.h,v 1.4 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Stéphane Borel <stef@via.ecp.fr>
@@ -26,3 +26,15 @@ struct intf_thread_s;
 
 gint GtkSetupMenus( struct intf_thread_s * );
 
+/*****************************************************************************
+ * String sizes
+ *****************************************************************************/
+#define GTK_MENU_LABEL_SIZE 64
+
+/*****************************************************************************
+ * Convert user_data structures to title and chapter information
+ *****************************************************************************/
+#define DATA2TITLE( user_data )    ( (gint)(user_data) >> 16 )
+#define DATA2CHAPTER( user_data )  ( (gint)(user_data) & 0xffff )
+#define POS2DATA( title, chapter ) ( ((title) << 16) | ((chapter) & 0xffff) )
+
index 5427c123ac809bde9db8049fd722d334bae34cd0..b4c8b9847708fe851c8c3939debdbd3f27bea58f 100644 (file)
@@ -2,7 +2,7 @@
  * intf_gtk.h: private Gtk+ interface description
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: intf_gtk.h,v 1.6 2001/05/23 23:08:20 stef Exp $
+ * $Id: intf_gtk.h,v 1.7 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
 #define DROP_ACCEPT_TEXT_URI_LIST  0
 #define DROP_ACCEPT_TEXT_PLAIN     1
 
-/*****************************************************************************
- * String sizes
- *****************************************************************************/
-#define GTK_MENU_LABEL_SIZE 64
-
-/*****************************************************************************
- * Convert user_data structures to title and chapter information
- *****************************************************************************/
-#define DATA2TITLE( user_data )    ( (gint)(user_data) >> 16 )
-#define DATA2CHAPTER( user_data )  ( (gint)(user_data) & 0xffff )
-#define POS2DATA( title, chapter ) ( ((title) << 16) | ((chapter) & 0xffff) )
-
 /*****************************************************************************
  * Useful inline function
  ****************************************************************************/
index bac0a0506efedcb179a6e403b0c41d3f54f36cc6..cca1ae734440266bf35960449725615daa5c7f6a 100644 (file)
@@ -4,7 +4,7 @@
  * decoders.
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: input.c,v 1.120 2001/06/12 18:16:49 stef Exp $
+ * $Id: input.c,v 1.121 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -145,7 +145,8 @@ input_thread_t *input_CreateThread ( playlist_item_t *p_item, int *pi_status )
     p_input->stream.pp_areas = NULL;
     p_input->stream.p_selected_area = NULL;
     p_input->stream.p_new_area = NULL;
-    /* By default there is one areas in a stream */
+
+    /* By default there is one area in a stream */
     input_AddArea( p_input );
     p_input->stream.p_selected_area = p_input->stream.pp_areas[0];
 
@@ -163,10 +164,7 @@ input_thread_t *input_CreateThread ( playlist_item_t *p_item, int *pi_status )
     p_input->pf_network_close = NetworkClose;
 #endif
 
-    /* Create thread and set locks. */
-    vlc_mutex_init( &p_input->stream.stream_lock );
-    vlc_cond_init( &p_input->stream.stream_wait );
-    vlc_mutex_init( &p_input->stream.control.control_lock );
+    /* Create thread. */
     if( vlc_thread_create( &p_input->thread_id, "input", (void *) RunThread,
                            (void *) p_input ) )
     {
@@ -242,6 +240,7 @@ static void RunThread( input_thread_t *p_input )
         p_input->b_error = 1;
         ErrorThread( p_input );
         DestroyThread( p_input );
+        free( p_input );
         return;
     }
 
@@ -378,6 +377,11 @@ static int InitThread( input_thread_t * p_input )
     p_input->c_packets_trashed          = 0;
 #endif
 
+    /* Set locks. */
+    vlc_mutex_init( &p_input->stream.stream_lock );
+    vlc_cond_init( &p_input->stream.stream_wait );
+    vlc_mutex_init( &p_input->stream.control.control_lock );
+
     /* Default, might get overwritten */
     p_input->pf_open = p_input->pf_file_open;
     p_input->pf_close = p_input->pf_file_close;
index c5d701db50b8d9971056dc21515e13cb79244198..f7c825840c5c3320c411a3ecda401d79d4b2b0d8 100644 (file)
@@ -4,7 +4,7 @@
  * and spawn threads.
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: main.c,v 1.102 2001/06/12 22:14:44 sam Exp $
+ * $Id: main.c,v 1.103 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -251,6 +251,13 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     p_aout_bank   = &aout_bank;
     p_vout_bank   = &vout_bank;
 
+    /*
+     * Initialize threads
+     */
+#if defined( PTH_INIT_IN_PTH_H )
+    pth_init( );
+#endif
+
     /*
      * Test if our code is likely to run on this CPU 
      */
@@ -385,12 +392,17 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     system_End();
 #endif
 
+
     /*
      * Terminate messages interface and program
      */
     intf_Msg( "intf: program terminated" );
     intf_MsgDestroy();
 
+#if defined( PTH_INIT_IN_PTH_H )
+    pth_kill( );
+#endif
+
     return 0;
 }
 
@@ -926,7 +938,9 @@ static void InstructionSignalHandler( int i_signal )
 
     i_illegal = 1;
     
+#ifdef HAVE_SIGRELSE
     sigrelse( i_signal );
+#endif
     longjmp( env, 1 );
 }
 
@@ -980,7 +994,7 @@ static int CPUCapabilities( void )
     volatile unsigned int  i_eax, i_ebx, i_ecx, i_edx;
     volatile boolean_t     b_amd;
 
-    signal( SIGILL,  InstructionSignalHandler );
+    signal( SIGILL, InstructionSignalHandler );
     
     /* test for a 486 CPU */
     asm volatile ( "pushfl\n\t"
index befb69a9eb81b0bc4969ea4b30c7dd35dc728cc5..4af7d2dbfa539d60b90a3c80371c6b763584511f 100644 (file)
@@ -2,7 +2,7 @@
  * modules.c : Built-in and plugin modules management functions
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: modules.c,v 1.34 2001/06/03 12:47:22 sam Exp $
+ * $Id: modules.c,v 1.35 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Ethan C. Baldridge <BaldridgeE@cadmus.com>
@@ -515,10 +515,27 @@ static int AllocatePluginModule( char * psz_filename )
             || p_module->psz_version == NULL )
     {
         intf_ErrMsg( "module error: can't duplicate strings" );
-        free( p_module->is.plugin.psz_filename );
-        free( p_module->psz_name );
-        free( p_module->psz_longname );
-        free( p_module->psz_version );
+
+        if( p_module->is.plugin.psz_filename != NULL )
+        {
+            free( p_module->is.plugin.psz_filename );
+        }
+
+        if( p_module->psz_name != NULL )
+        {
+            free( p_module->psz_name );
+        }
+
+        if( p_module->psz_longname != NULL )
+        {
+            free( p_module->psz_longname );
+        }
+
+        if( p_module->psz_version != NULL )
+        {
+            free( p_module->psz_version );
+        }
+
         free( p_module );
         module_unload( handle );
         return( -1 );
@@ -619,9 +636,22 @@ static int AllocateBuiltinModule( int ( *pf_init ) ( module_t * ),
             || p_module->psz_version == NULL )
     {
         intf_ErrMsg( "module error: can't duplicate strings" );
-        free( p_module->psz_name );
-        free( p_module->psz_longname );
-        free( p_module->psz_version );
+
+        if( p_module->psz_name != NULL )
+        {
+            free( p_module->psz_name );
+        }
+
+        if( p_module->psz_longname != NULL )
+        {
+            free( p_module->psz_longname );
+        }
+
+        if( p_module->psz_version != NULL )
+        {
+            free( p_module->psz_version );
+        }
+
         free( p_module );
         return( -1 );
     }
index 7f154283b5b245c5d4bc851b4400b2da3bf8099f..19148a2a946dd6554c14d06b3e23fe9779ef8a5f 100644 (file)
@@ -2,7 +2,7 @@
  * modules_core.h : Module management functions used by the core application.
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: modules_core.h,v 1.1 2001/06/02 01:09:03 sam Exp $
+ * $Id: modules_core.h,v 1.2 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -116,6 +116,7 @@ module_getsymbol( module_handle_t handle, char * psz_function )
 
 #else
     return( dlsym( handle, psz_function ) );
+
 #endif
 }
 
index 2afe4289fd672cab2398faffe9fa7e721bc25167..27b45a79a9ea69b1aadbeb33ad4fe5c42f4121fa 100644 (file)
@@ -3,7 +3,7 @@
  * Functions are prototyped in mtime.h.
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: mtime.c,v 1.21 2001/05/31 12:45:39 sam Exp $
+ * $Id: mtime.c,v 1.22 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
 
 #include <stdio.h>                                              /* sprintf() */
 
+#if defined( PTH_INIT_IN_PTH_H )                                  /* GNU Pth */
+#   include <pth.h>
+#endif
+
 #ifdef HAVE_UNISTD_H
 #   include <unistd.h>                                           /* select() */
 #endif
@@ -198,14 +202,18 @@ void mwait( mtime_t date )
         return;
     }
 
-#   ifdef HAVE_USLEEP
+#   if defined( PTH_INIT_IN_PTH_H )
+    pth_usleep( delay );
+
+#   elif defined( HAVE_USLEEP )
     usleep( delay );
+
 #   else
     tv_delay.tv_sec = delay / 1000000;
     tv_delay.tv_usec = delay % 1000000;
-
     /* see msleep() about select() errors */
     select( 0, NULL, NULL, NULL, &tv_delay );
+
 #   endif
 
 #endif
@@ -224,6 +232,12 @@ void msleep( mtime_t delay )
 #elif defined( HAVE_USLEEP ) || defined( WIN32 )
     usleep( delay );
 
+#elif defined( PTH_INIT_IN_PTH_H )
+    struct timeval tv_delay;
+    tv_delay.tv_sec = delay / 1000000;
+    tv_delay.tv_usec = delay % 1000000;
+    pth_select( 0, NULL, NULL, NULL, &tv_delay );
+
 #else
     struct timeval tv_delay;
 
index 406fa4ec9d4efedcc55fe347d88e016d2a53fb7f..2778fbf559ac886ccd371ab6e2eb3efda054edcb 100644 (file)
@@ -5,7 +5,7 @@
  * thread, and destroy a previously oppened video output thread.
  *****************************************************************************
  * Copyright (C) 2000 VideoLAN
- * $Id: video_output.c,v 1.131 2001/05/31 03:57:54 sam Exp $
+ * $Id: video_output.c,v 1.132 2001/06/14 01:49:44 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
@@ -979,6 +979,7 @@ static void RunThread( vout_thread_t *p_vout)
     while( (!p_vout->b_die) && (!p_vout->b_error) )
     {
         /* Initialize loop variables */
+        p_vout->p_rendered_pic = NULL;
         p_pic =         NULL;
         p_subpic =      NULL;
         p_ephemer =     NULL;