* COMPLETE CVS BREAKAGE !! The MAIN branch is going to be a playground
authorSam Hocevar <sam@videolan.org>
Sun, 9 Dec 2001 17:01:37 +0000 (17:01 +0000)
committerSam Hocevar <sam@videolan.org>
Sun, 9 Dec 2001 17:01:37 +0000 (17:01 +0000)
    for my nevrotic and destructive pulsions during the next few hours!

  * If you want to test vlc, please use the v0_2_92_branch branch.

  * Stuff currently working:
     - direct to YUV buffer decoding
     - non-ugly subtitle blending
     - XVideo and SDL video output

  * Stuff currently utterly broken:
     - aspect ratio
     - software rendering (ie, all other video output plugins)

  * Additional misc changes:
     - Renamed spu_dec to spudec and mad_adec to mad to stay coherent with
       other plugins. Also, renamed mpeg to mpeg_system.
     - Added jobi to the AUTHORS file.
     - Factored code common to vout_x11.c and vout_xvideo.c.

201 files changed:
AUTHORS
Makefile
Makefile.opts.in
configure
configure.in
debian/control
debian/rules
extras/libdvdcss/css.c
extras/libdvdcss/ioctl.c
extras/libdvdcss/libdvdcss.c
include/common.h
include/config.h.in
include/defs.h.in
include/interface.h
include/modules.h
include/modules_export.h
include/vdec_ext-plugins.h
include/video.h
include/video_output.h
ipkg/rules
plugins/ac3_adec/ac3_adec.c
plugins/ac3_adec/ac3_bit_allocate.c
plugins/ac3_adec/ac3_decoder.c
plugins/ac3_adec/ac3_exponent.c
plugins/ac3_adec/ac3_imdct.c
plugins/ac3_adec/ac3_mantissa.c
plugins/ac3_adec/ac3_parse.c
plugins/ac3_adec/ac3_rematrix.c
plugins/ac3_spdif/ac3_iec958.c
plugins/ac3_spdif/ac3_spdif.c
plugins/alsa/alsa.c
plugins/arts/arts.c
plugins/beos/beos.cpp
plugins/chroma/.cvsignore [new file with mode: 0644]
plugins/chroma/Makefile [new file with mode: 0644]
plugins/directx/directx.c
plugins/downmix/ac3_downmix_3dn.c
plugins/downmix/ac3_downmix_c.c
plugins/downmix/ac3_downmix_sse.c
plugins/downmix/downmix.c
plugins/downmix/downmix3dn.c
plugins/downmix/downmixsse.c
plugins/dsp/dsp.c
plugins/dummy/dummy.c
plugins/dummy/null.c
plugins/dummy/vout_dummy.c
plugins/dvd/dummy_dvdcss.c
plugins/dvd/dvd.c
plugins/dvd/dvd_ifo.c
plugins/dvd/dvd_udf.c
plugins/dvdread/dvdread.c
plugins/esd/esd.c
plugins/fb/fb.c
plugins/ggi/ggi.c
plugins/glide/glide.c
plugins/gtk/gnome.c
plugins/gtk/gtk.c
plugins/idct/idct.c
plugins/idct/idctaltivec.c
plugins/idct/idctclassic.c
plugins/idct/idctmmx.c
plugins/idct/idctmmxext.c
plugins/idct/vdec_block_c.c [new file with mode: 0644]
plugins/idct/vdec_block_mmx.c [new file with mode: 0644]
plugins/imdct/ac3_imdct_3dn.c
plugins/imdct/ac3_imdct_c.c
plugins/imdct/ac3_imdct_common.c
plugins/imdct/ac3_imdct_sse.c
plugins/imdct/ac3_srfft_3dn.c
plugins/imdct/ac3_srfft_c.c
plugins/imdct/ac3_srfft_sse.c
plugins/imdct/imdct.c
plugins/imdct/imdct3dn.c
plugins/imdct/imdctsse.c
plugins/lpcm_adec/lpcm_adec.c
plugins/macosx/intf_main.c
plugins/macosx/macosx.c
plugins/mad/.cvsignore [new file with mode: 0644]
plugins/mad/API [new file with mode: 0644]
plugins/mad/BUGS [new file with mode: 0644]
plugins/mad/DESIGN [new file with mode: 0644]
plugins/mad/Makefile [new file with mode: 0644]
plugins/mad/TODO [new file with mode: 0644]
plugins/mad/docs/joe_drew.txt [new file with mode: 0644]
plugins/mad/docs/rob_leslie.txt [new file with mode: 0644]
plugins/mad/mad_adec.c [new file with mode: 0644]
plugins/mad/mad_adec.h [new file with mode: 0644]
plugins/mad/mad_libmad.c [new file with mode: 0644]
plugins/mad/mad_libmad.h [new file with mode: 0644]
plugins/mad_adec/.cvsignore [deleted file]
plugins/mad_adec/API [deleted file]
plugins/mad_adec/BUGS [deleted file]
plugins/mad_adec/DESIGN [deleted file]
plugins/mad_adec/Makefile [deleted file]
plugins/mad_adec/TODO [deleted file]
plugins/mad_adec/docs/joe_drew.txt [deleted file]
plugins/mad_adec/docs/rob_leslie.txt [deleted file]
plugins/mad_adec/mad_adec.c [deleted file]
plugins/mad_adec/mad_adec.h [deleted file]
plugins/mad_adec/mad_libmad.c [deleted file]
plugins/mad_adec/mad_libmad.h [deleted file]
plugins/mga/mga.c
plugins/mga/vout_mga.c
plugins/motion/motion.c
plugins/motion/motion3dnow.c
plugins/motion/motionaltivec.c
plugins/motion/motionmmx.c
plugins/motion/motionmmxext.c
plugins/motion/vdec_motion_common.c [new file with mode: 0644]
plugins/motion/vdec_motion_inner.c [new file with mode: 0644]
plugins/motion/vdec_motion_inner_mmx.c [new file with mode: 0644]
plugins/motion/vdec_motion_inner_mmxext.c [new file with mode: 0644]
plugins/mpeg/.cvsignore [deleted file]
plugins/mpeg/Makefile [deleted file]
plugins/mpeg/es.c [deleted file]
plugins/mpeg/input_es.c [deleted file]
plugins/mpeg/input_es.h [deleted file]
plugins/mpeg/input_ps.c [deleted file]
plugins/mpeg/input_ps.h [deleted file]
plugins/mpeg/input_ts.c [deleted file]
plugins/mpeg/input_ts.h [deleted file]
plugins/mpeg/ps.c [deleted file]
plugins/mpeg/ts.c [deleted file]
plugins/mpeg_adec/adec_layer1.c
plugins/mpeg_adec/adec_layer2.c
plugins/mpeg_adec/mpeg_adec.c
plugins/mpeg_adec/mpeg_adec_generic.c
plugins/mpeg_system/.cvsignore [new file with mode: 0644]
plugins/mpeg_system/Makefile [new file with mode: 0644]
plugins/mpeg_system/input_es.c [new file with mode: 0644]
plugins/mpeg_system/input_es.h [new file with mode: 0644]
plugins/mpeg_system/input_ps.c [new file with mode: 0644]
plugins/mpeg_system/input_ps.h [new file with mode: 0644]
plugins/mpeg_system/input_ts.c [new file with mode: 0644]
plugins/mpeg_system/input_ts.h [new file with mode: 0644]
plugins/mpeg_system/mpeg_es.c [new file with mode: 0644]
plugins/mpeg_system/mpeg_ps.c [new file with mode: 0644]
plugins/mpeg_system/mpeg_ts.c [new file with mode: 0644]
plugins/mpeg_vdec/video_decoder.c
plugins/mpeg_vdec/vpar_blocks.c
plugins/mpeg_vdec/vpar_headers.c
plugins/mpeg_vdec/vpar_pool.c
plugins/qnx/qnx.c
plugins/qt/qt.cpp
plugins/sdl/sdl.c
plugins/sdl/vout_sdl.c
plugins/spu_dec/.cvsignore [deleted file]
plugins/spu_dec/Makefile [deleted file]
plugins/spu_dec/spu_decoder.c [deleted file]
plugins/spu_dec/spu_decoder.h [deleted file]
plugins/spudec/.cvsignore [new file with mode: 0644]
plugins/spudec/Makefile [new file with mode: 0644]
plugins/spudec/spu_decoder.c [new file with mode: 0644]
plugins/spudec/spu_decoder.h [new file with mode: 0644]
plugins/text/intf_rc.c
plugins/text/ncurses.c
plugins/text/rc.c
plugins/vcd/input_vcd.c
plugins/vcd/vcd.c
plugins/x11/Makefile
plugins/x11/vout_common.c [new file with mode: 0644]
plugins/x11/vout_common.h [new file with mode: 0644]
plugins/x11/vout_x11.c
plugins/x11/vout_xvideo.c
plugins/x11/x11.c
plugins/x11/xvideo.c
plugins/yuv/.cvsignore [deleted file]
plugins/yuv/Makefile [deleted file]
plugins/yuv/transforms_common.h [deleted file]
plugins/yuv/transforms_yuv.c [deleted file]
plugins/yuv/transforms_yuv.h [deleted file]
plugins/yuv/transforms_yuvmmx.c [deleted file]
plugins/yuv/transforms_yuvmmx.h [deleted file]
plugins/yuv/video_common.h [deleted file]
plugins/yuv/video_yuv.c [deleted file]
plugins/yuv/video_yuvmmx.c [deleted file]
plugins/yuv/yuv.c [deleted file]
plugins/yuv/yuvmmx.c [deleted file]
src/audio_output/aout_s8.c
src/audio_output/aout_spdif.c
src/audio_output/aout_u16.c
src/input/input_dec.c
src/input/input_ext-dec.c
src/input/input_ext-intf.c
src/input/input_netlist.c
src/input/mpeg_system.c
src/interface/interface.c
src/interface/main.c
src/misc/beos_specific.cpp
src/misc/darwin_specific.c
src/misc/iso_lang.c
src/misc/mtime.c
src/misc/win32_specific.c
src/video_output/video_output.c
src/video_output/video_spu.c [deleted file]
src/video_output/video_spu.h [deleted file]
src/video_output/video_text.c
src/video_output/video_yuv.c [deleted file]
src/video_output/video_yuv.h [deleted file]
src/video_output/vout_pictures.c [new file with mode: 0644]
src/video_output/vout_subpictures.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index 39d9574..1496142 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -29,6 +29,11 @@ N: Billy Biggs
 E: vektor@dumbterm.net
 D: libdvdcss enhancements
 
+N: Johan Bilien
+E: jobi@via.ecp.fr
+C: jobi
+D: VCD input
+
 N: Emmanuel Blindauer
 E: manu@agat.net
 D: aRts audio output
index e7be454..96b3ee2 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,8 +16,9 @@ endif
 PLUGINS_DIR := ac3_adec \
                ac3_spdif \
                alsa \
-               arts \
+               arts \
                beos \
+               chroma \
                directx \
                dsp \
                dummy \
@@ -34,26 +35,26 @@ PLUGINS_DIR :=      ac3_adec \
                kde \
                lpcm_adec \
                macosx \
-               mad_adec \
+               mad \
                memcpy \
                mga \
                motion \
-               mpeg \
+               mpeg_system \
                mpeg_adec \
                mpeg_vdec \
                qt \
                sdl \
-               spu_dec \
+               spudec \
                text \
                vcd \
-               x11 \
-               yuv
+               x11
 
 PLUGINS_TARGETS := ac3_adec/ac3_adec \
                ac3_spdif/ac3_spdif \
                alsa/alsa \
-               arts/arts \
+               arts/arts \
                beos/beos \
+               chroma/yuv2rgb8 \
                directx/directx \
                dsp/dsp \
                dummy/dummy \
@@ -80,7 +81,7 @@ PLUGINS_TARGETS := ac3_adec/ac3_adec \
                kde/kde \
                lpcm_adec/lpcm_adec \
                macosx/macosx \
-               mad_adec/mad_adec \
+               mad/mad \
                memcpy/memcpy \
                memcpy/memcpymmx \
                memcpy/memcpymmxext \
@@ -91,14 +92,14 @@ PLUGINS_TARGETS := ac3_adec/ac3_adec \
                motion/motionmmxext \
                motion/motion3dnow \
                motion/motionaltivec \
+               mpeg_system/mpeg_es \
+               mpeg_system/mpeg_ps \
+               mpeg_system/mpeg_ts \
                mpeg_adec/mpeg_adec \
                mpeg_vdec/mpeg_vdec \
-               mpeg/es \
-               mpeg/ps \
-               mpeg/ts \
                qt/qt \
                sdl/sdl \
-               spu_dec/spu_dec \
+               spudec/spudec \
                text/ncurses \
                text/rc \
                vcd/vcd \
@@ -106,12 +107,13 @@ PLUGINS_TARGETS := ac3_adec/ac3_adec \
                x11/xvideo \
                yuv/yuv \
                yuv/yuvmmx
+
 #
 # C Objects
 # 
 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
+VIDEO_OUTPUT := video_output video_text vout_pictures vout_subpictures
 AUDIO_OUTPUT := audio_output aout_ext-dec aout_u8 aout_s8 aout_u16 aout_s16 aout_spdif
 MISC := mtime tests modules netutils iso_lang
 
index 843a223..6174d34 100644 (file)
@@ -83,13 +83,13 @@ LIB_GTK = @LIB_GTK@
 LIB_KDE = @LIB_KDE@
 LIB_LIBDVDCSS = @LIB_LIBDVDCSS@
 LIB_MACOSX = @LIB_MACOSX@
-LIB_MAD_ADEC = @LIB_MAD_ADEC@
+LIB_MAD = @LIB_MAD@
+LIB_MPEG_TS = @LIB_MPEG_TS@
 LIB_NCURSES = @LIB_NCURSES@
 LIB_QNX = @LIB_QNX@
 LIB_QT = @LIB_QT@
 LIB_RC = @LIB_RC@
 LIB_SDL = @LIB_SDL@
-LIB_TS = @LIB_TS@
 LIB_X11 = @LIB_X11@
 LIB_XVIDEO = @LIB_XVIDEO@
 LIB_YUV = @LIB_YUV@
@@ -105,7 +105,7 @@ CFLAGS_ESD = @CFLAGS_ESD@
 CFLAGS_LIBDVDCSS = @CFLAGS_LIBDVDCSS@
 CFLAGS_ESD = @CFLAGS_ESD@
 CFLAGS_GTK = @CFLAGS_GTK@
-CFLAGS_MAD_ADEC = @CFLAGS_MAD_ADEC@
+CFLAGS_MAD = @CFLAGS_MAD@
 CFLAGS_SDL = @CFLAGS_SDL@
 CFLAGS_X11 = @CFLAGS_X11@
 
index 3863f5f..a4781ab 100755 (executable)
--- a/configure
+++ b/configure
@@ -48,9 +48,9 @@ ac_help="$ac_help
 ac_help="$ac_help
   --disable-null          Null module (default enabled)"
 ac_help="$ac_help
-  --disable-rc            rc module (default enabled)"
+  --disable-rc            Remote Control module (default enabled)"
 ac_help="$ac_help
-  --with-libmad[=PATH]    libmad module (default disabled)"
+  --with-mad[=PATH]       libmad module (default disabled)"
 ac_help="$ac_help
   --disable-dsp           Linux /dev/dsp support (default enabled)"
 ac_help="$ac_help
@@ -2378,15 +2378,12 @@ else
 #include <sys/types.h>
 #include <fcntl.h>
 #include <sys/mman.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
 
 /* This mess was copied from the GNU getpagesize.h.  */
 #ifndef HAVE_GETPAGESIZE
+# ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+# endif
 
 /* Assume that all systems that can run configure have sys/param.h.  */
 # ifndef HAVE_SYS_PARAM_H
@@ -2441,7 +2438,7 @@ main()
        /*
         * First, make a file with some known garbage in it.
         */
-       data = (char*)malloc(pagesize);
+       data = malloc(pagesize);
        if (!data)
                exit(1);
        for (i = 0; i < pagesize; ++i)
@@ -2462,7 +2459,7 @@ main()
        fd = open("conftestmmap", O_RDWR);
        if (fd < 0)
                exit(1);
-       data2 = (char*)malloc(2 * pagesize);
+       data2 = malloc(2 * pagesize);
        if (!data2)
                exit(1);
        data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
@@ -2480,7 +2477,7 @@ main()
         */
        for (i = 0; i < pagesize; ++i)
                *(data2 + i) = *(data2 + i) + 1;
-       data3 = (char*)malloc(pagesize);
+       data3 = malloc(pagesize);
        if (!data3)
                exit(1);
        if (read(fd, data3, pagesize) != pagesize)
@@ -2494,7 +2491,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:2498: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2495: \"$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
@@ -2517,12 +2514,12 @@ EOF
 fi
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:2521: checking return type of signal handlers" >&5
+echo "configure:2518: 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 2526 "configure"
+#line 2523 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -2539,7 +2536,7 @@ int main() {
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:2543: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2540: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -2558,7 +2555,7 @@ EOF
 
 
 echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:2562: checking for dlopen in -ldl" >&5
+echo "configure:2559: 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
@@ -2566,7 +2563,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2570 "configure"
+#line 2567 "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
@@ -2577,7 +2574,7 @@ int main() {
 dlopen()
 ; return 0; }
 EOF
-if { (eval echo configure:2581: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2578: \"$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
@@ -2597,8 +2594,48 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
+echo $ac_n "checking for cos in -lm""... $ac_c" 1>&6
+echo "configure:2599: checking for cos in -lm" >&5
+ac_lib_var=`echo m'_'cos | 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="-lm  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2607 "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 cos();
+
+int main() {
+cos()
+; return 0; }
+EOF
+if { (eval echo configure:2618: \"$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"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  LIB_IMDCT="${LIB_IMDCT} -lm"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
 echo $ac_n "checking for pow in -lm""... $ac_c" 1>&6
-echo "configure:2602: checking for pow in -lm" >&5
+echo "configure:2639: 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
@@ -2606,7 +2643,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2610 "configure"
+#line 2647 "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
@@ -2617,7 +2654,7 @@ int main() {
 pow()
 ; return 0; }
 EOF
-if { (eval echo configure:2621: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2658: \"$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
@@ -2641,7 +2678,7 @@ fi
 THREAD_LIB=error
 if test "x${THREAD_LIB}" = xerror; then
   echo $ac_n "checking for pthread_attr_init in -lpthread""... $ac_c" 1>&6
-echo "configure:2645: checking for pthread_attr_init in -lpthread" >&5
+echo "configure:2682: 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
@@ -2649,7 +2686,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthread  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2653 "configure"
+#line 2690 "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
@@ -2660,7 +2697,7 @@ int main() {
 pthread_attr_init()
 ; return 0; }
 EOF
-if { (eval echo configure:2664: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2701: \"$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
@@ -2683,7 +2720,7 @@ fi
 fi
 if test "x${THREAD_LIB}" = xerror; then
   echo $ac_n "checking for pthread_attr_init in -lpthreads""... $ac_c" 1>&6
-echo "configure:2687: checking for pthread_attr_init in -lpthreads" >&5
+echo "configure:2724: 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
@@ -2691,7 +2728,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthreads  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2695 "configure"
+#line 2732 "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
@@ -2702,7 +2739,7 @@ int main() {
 pthread_attr_init()
 ; return 0; }
 EOF
-if { (eval echo configure:2706: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2743: \"$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
@@ -2725,7 +2762,7 @@ fi
 fi
 if test "x${THREAD_LIB}" = xerror; then
   echo $ac_n "checking for pthread_attr_init in -lc_r""... $ac_c" 1>&6
-echo "configure:2729: checking for pthread_attr_init in -lc_r" >&5
+echo "configure:2766: 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
@@ -2733,7 +2770,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lc_r  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2737 "configure"
+#line 2774 "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
@@ -2744,7 +2781,7 @@ int main() {
 pthread_attr_init()
 ; return 0; }
 EOF
-if { (eval echo configure:2748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2785: \"$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
@@ -2767,12 +2804,12 @@ fi
 fi
 if test "x${THREAD_LIB}" = xerror; then
   echo $ac_n "checking for pthread_attr_init""... $ac_c" 1>&6
-echo "configure:2771: checking for pthread_attr_init" >&5
+echo "configure:2808: 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 2776 "configure"
+#line 2813 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char pthread_attr_init(); below.  */
@@ -2795,7 +2832,7 @@ pthread_attr_init();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2799: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2836: \"$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
@@ -2818,7 +2855,7 @@ fi
 fi
 
 echo $ac_n "checking for cthread_fork in -lthreads""... $ac_c" 1>&6
-echo "configure:2822: checking for cthread_fork in -lthreads" >&5
+echo "configure:2859: checking for cthread_fork in -lthreads" >&5
 ac_lib_var=`echo threads'_'cthread_fork | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2826,7 +2863,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lthreads  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2830 "configure"
+#line 2867 "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
@@ -2837,7 +2874,7 @@ int main() {
 cthread_fork()
 ; return 0; }
 EOF
-if { (eval echo configure:2841: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2878: \"$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
@@ -2859,7 +2896,7 @@ fi
 
 
 cat > conftest.$ac_ext <<EOF
-#line 2863 "configure"
+#line 2900 "configure"
 #include "confdefs.h"
 #include <pthread.h>
 EOF
@@ -2875,7 +2912,7 @@ fi
 rm -f conftest*
 
 cat > conftest.$ac_ext <<EOF
-#line 2879 "configure"
+#line 2916 "configure"
 #include "confdefs.h"
 #include <strings.h>
 EOF
@@ -2895,17 +2932,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:2899: checking for $ac_hdr" >&5
+echo "configure:2936: 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 2904 "configure"
+#line 2941 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2909: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2946: \"$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*
@@ -2935,17 +2972,17 @@ for ac_hdr in sys/sockio.h fcntl.h sys/time.h sys/times.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2939: checking for $ac_hdr" >&5
+echo "configure:2976: 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 2944 "configure"
+#line 2981 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2949: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2986: \"$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*
@@ -2975,17 +3012,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:2979: checking for $ac_hdr" >&5
+echo "configure:3016: 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 2984 "configure"
+#line 3021 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2989: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3026: \"$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*
@@ -3015,17 +3052,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:3019: checking for $ac_hdr" >&5
+echo "configure:3056: 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 3024 "configure"
+#line 3061 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3029: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3066: \"$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*
@@ -3055,17 +3092,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:3059: checking for $ac_hdr" >&5
+echo "configure:3096: 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 3064 "configure"
+#line 3101 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3069: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3106: \"$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*
@@ -3095,17 +3132,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:3099: checking for $ac_hdr" >&5
+echo "configure:3136: 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 3104 "configure"
+#line 3141 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3109: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3146: \"$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*
@@ -3136,17 +3173,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:3140: checking for $ac_hdr" >&5
+echo "configure:3177: 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 3145 "configure"
+#line 3182 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3150: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3187: \"$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*
@@ -3174,20 +3211,20 @@ done
 
 
 echo $ac_n "checking for ntohl in sys/param.h""... $ac_c" 1>&6
-echo "configure:3178: checking for ntohl in sys/param.h" >&5
+echo "configure:3215: checking for ntohl in sys/param.h" >&5
 if eval "test \"`echo '$''{'ac_cv_c_ntohl_sys_param_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   CFLAGS="${save_CFLAGS} -Wall -Werror"
      cat > conftest.$ac_ext <<EOF
-#line 3184 "configure"
+#line 3221 "configure"
 #include "confdefs.h"
 #include <sys/param.h>
 int main() {
 void foo() { int meuh; ntohl(meuh); }
 ; return 0; }
 EOF
-if { (eval echo configure:3191: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3228: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_ntohl_sys_param_h=yes
 else
@@ -3208,20 +3245,20 @@ EOF
 fi
 
 echo $ac_n "checking if \$CC accepts -finline-limit""... $ac_c" 1>&6
-echo "configure:3212: checking if \$CC accepts -finline-limit" >&5
+echo "configure:3249: checking if \$CC accepts -finline-limit" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline_limit'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   CFLAGS="${save_CFLAGS} -finline-limit-30000"
      cat > conftest.$ac_ext <<EOF
-#line 3218 "configure"
+#line 3255 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3225: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3262: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline_limit=yes
 else
@@ -3239,20 +3276,20 @@ if test x"$ac_cv_c_inline_limit" != x"no"; then
 fi
 
 echo $ac_n "checking if \$CC accepts -bundle -undefined error""... $ac_c" 1>&6
-echo "configure:3243: checking if \$CC accepts -bundle -undefined error" >&5
+echo "configure:3280: checking if \$CC accepts -bundle -undefined error" >&5
 if eval "test \"`echo '$''{'ac_cv_ld_darwin'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   CFLAGS="${save_CFLAGS} -bundle -undefined error"
      cat > conftest.$ac_ext <<EOF
-#line 3249 "configure"
+#line 3286 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3256: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_ld_darwin=yes
 else
@@ -3270,20 +3307,20 @@ if test x"$ac_cv_ld_darwin" != x"no"; then
 fi
 
 echo $ac_n "checking if \$CC accepts -shared""... $ac_c" 1>&6
-echo "configure:3274: checking if \$CC accepts -shared" >&5
+echo "configure:3311: checking if \$CC accepts -shared" >&5
 if eval "test \"`echo '$''{'ac_cv_ld_plugins'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   CFLAGS="${save_CFLAGS} -shared"
      cat > conftest.$ac_ext <<EOF
-#line 3280 "configure"
+#line 3317 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3287: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3324: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_ld_plugins=yes
 else
@@ -3302,7 +3339,7 @@ fi
         
 if test x"${SOFLAGS}" = x; then
     echo $ac_n "checking for soname setting""... $ac_c" 1>&6
-echo "configure:3306: checking for soname setting" >&5
+echo "configure:3343: checking for soname setting" >&5
 if eval "test \"`echo '$''{'ac_cv_ld_soname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3311,14 +3348,14 @@ else
         try_SOFLAGS="-Wl,-soname -Wl,"
         LDFLAGS="${save_LDFLAGS} ${try_SOFLAGS}foo.so.0"
         cat > conftest.$ac_ext <<EOF
-#line 3315 "configure"
+#line 3352 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3322: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3359: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_ld_soname="${try_SOFLAGS}"
 else
@@ -3330,14 +3367,14 @@ else
             try_SOFLAGS="-Wl,-h -Wl,"
             LDFLAGS="${save_LDFLAGS} ${try_SOFLAGS}foo.so.0"
             cat > conftest.$ac_ext <<EOF
-#line 3334 "configure"
+#line 3371 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_ld_soname="${try_SOFLAGS}"
 else
@@ -3366,7 +3403,7 @@ have problems using libdvdcss.
 fi
 
 echo $ac_n "checking __attribute__ ((aligned ())) support""... $ac_c" 1>&6
-echo "configure:3370: checking __attribute__ ((aligned ())) support" >&5
+echo "configure:3407: checking __attribute__ ((aligned ())) support" >&5
 if eval "test \"`echo '$''{'ac_cv_c_attribute_aligned'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3374,14 +3411,14 @@ else
        CFLAGS="${save_CFLAGS} -Werror"
     for ac_cv_c_attr_align_try in 2 4 8 16 32 64; do
         cat > conftest.$ac_ext <<EOF
-#line 3378 "configure"
+#line 3415 "configure"
 #include "confdefs.h"
 
 int main() {
 static char c __attribute__ ((aligned($ac_cv_c_attr_align_try))) = 0; return c;
 ; return 0; }
 EOF
-if { (eval echo configure:3385: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3422: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_attribute_aligned=$ac_cv_c_attr_align_try
 else
@@ -3404,19 +3441,19 @@ CFLAGS="${save_CFLAGS}"
 LDFLAGS="${save_LDFLAGS}"
 
 echo $ac_n "checking for boolean_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:3408: checking for boolean_t in sys/types.h" >&5
+echo "configure:3445: checking for boolean_t in sys/types.h" >&5
 if eval "test \"`echo '$''{'ac_cv_c_boolean_t_sys_types_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3413 "configure"
+#line 3450 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 int main() {
 boolean_t foo;
 ; return 0; }
 EOF
-if { (eval echo configure:3420: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3457: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_boolean_t_sys_types_h=yes
 else
@@ -3437,19 +3474,19 @@ EOF
 fi
 
 echo $ac_n "checking for boolean_t in pthread.h""... $ac_c" 1>&6
-echo "configure:3441: checking for boolean_t in pthread.h" >&5
+echo "configure:3478: checking for boolean_t in pthread.h" >&5
 if eval "test \"`echo '$''{'ac_cv_c_boolean_t_pthread_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3446 "configure"
+#line 3483 "configure"
 #include "confdefs.h"
 #include <pthread.h>
 int main() {
 boolean_t foo;
 ; return 0; }
 EOF
-if { (eval echo configure:3453: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3490: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_boolean_t_pthread_h=yes
 else
@@ -3470,19 +3507,19 @@ EOF
 fi
 
 echo $ac_n "checking for boolean_t in cthreads.h""... $ac_c" 1>&6
-echo "configure:3474: checking for boolean_t in cthreads.h" >&5
+echo "configure:3511: checking for boolean_t in cthreads.h" >&5
 if eval "test \"`echo '$''{'ac_cv_c_boolean_t_cthreads_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3479 "configure"
+#line 3516 "configure"
 #include "confdefs.h"
 #include <cthreads.h>
 int main() {
 boolean_t foo;
 ; return 0; }
 EOF
-if { (eval echo configure:3486: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3523: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_boolean_t_cthreads_h=yes
 else
@@ -3503,18 +3540,18 @@ EOF
 fi
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:3507: checking for working const" >&5
+echo "configure:3544: 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 3512 "configure"
+#line 3549 "configure"
 #include "confdefs.h"
 
 int main() {
 
 /* Ultrix mips cc rejects this.  */
-typedef int charset[2]; const charset x = {0,0};
+typedef int charset[2]; const charset x;
 /* SunOS 4.1.1 cc rejects this.  */
 char const *const *ccp;
 char **p;
@@ -3557,7 +3594,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:3561: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3598: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -3578,12 +3615,12 @@ EOF
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:3582: checking for ANSI C header files" >&5
+echo "configure:3619: 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 3587 "configure"
+#line 3624 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -3591,7 +3628,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3595: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3632: \"$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*
@@ -3608,7 +3645,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 3612 "configure"
+#line 3649 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -3626,7 +3663,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 3630 "configure"
+#line 3667 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -3647,7 +3684,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 3651 "configure"
+#line 3688 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -3658,7 +3695,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:3662: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -3682,12 +3719,12 @@ EOF
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:3686: checking for size_t" >&5
+echo "configure:3723: 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 3691 "configure"
+#line 3728 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3715,12 +3752,12 @@ EOF
 fi
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:3719: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:3756: 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 3724 "configure"
+#line 3761 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -3729,7 +3766,7 @@ int main() {
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:3733: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3770: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -3753,29 +3790,30 @@ fi
 
 ARCH=${target_cpu}
 
-BUILTINS="${BUILTINS} es ps ts memcpy yuv idct idctclassic motion imdct downmix mpeg_adec lpcm_adec ac3_adec mpeg_vdec"
-PLUGINS="${PLUGINS} ac3_spdif spu_dec"
+#BUILTINS="${BUILTINS} mpeg_es mpeg_ps mpeg_ts memcpy yuv2rgb8 idct idctclassic motion imdct downmix mpeg_adec lpcm_adec ac3_adec mpeg_vdec"
+BUILTINS="${BUILTINS} mpeg_es mpeg_ps mpeg_ts memcpy idct idctclassic motion imdct downmix mpeg_adec lpcm_adec ac3_adec mpeg_vdec"
+PLUGINS="${PLUGINS} ac3_spdif spudec"
 
-MMX_MODULES="memcpymmx yuvmmx idctmmx motionmmx"
+MMX_MODULES="memcpymmx idctmmx motionmmx"
 MMXEXT_MODULES="memcpymmxext idctmmxext motionmmxext"
 THREEDNOW_MODULES="memcpy3dn imdct3dn downmix3dn"
 SSE_MODULES="imdctsse downmixsse"
 ALTIVEC_MODULES="idctaltivec motionaltivec"
 
 echo $ac_n "checking if \$CC groks MMX inline assembly""... $ac_c" 1>&6
-echo "configure:3767: checking if \$CC groks MMX inline assembly" >&5
+echo "configure:3805: checking if \$CC groks MMX inline assembly" >&5
 if eval "test \"`echo '$''{'ac_cv_mmx_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3772 "configure"
+#line 3810 "configure"
 #include "confdefs.h"
 
 int main() {
 void *p;asm volatile("packuswb %%mm1,%%mm2"::"r"(p));
 ; return 0; }
 EOF
-if { (eval echo configure:3779: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3817: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_mmx_inline=yes
 else
@@ -3793,19 +3831,19 @@ if test x"$ac_cv_mmx_inline" != x"no"; then
 fi
 
 echo $ac_n "checking if \$CC groks MMX EXT inline assembly""... $ac_c" 1>&6
-echo "configure:3797: checking if \$CC groks MMX EXT inline assembly" >&5
+echo "configure:3835: checking if \$CC groks MMX EXT inline assembly" >&5
 if eval "test \"`echo '$''{'ac_cv_mmxext_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3802 "configure"
+#line 3840 "configure"
 #include "confdefs.h"
 
 int main() {
 void *p;asm volatile("maskmovq %%mm1,%%mm2"::"r"(p));
 ; return 0; }
 EOF
-if { (eval echo configure:3809: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3847: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_mmxext_inline=yes
 else
@@ -3823,19 +3861,19 @@ if test x"$ac_cv_mmxext_inline" != x"no"; then
 fi
 
 echo $ac_n "checking if \$CC groks 3D Now! inline assembly""... $ac_c" 1>&6
-echo "configure:3827: checking if \$CC groks 3D Now! inline assembly" >&5
+echo "configure:3865: checking if \$CC groks 3D Now! inline assembly" >&5
 if eval "test \"`echo '$''{'ac_cv_3dnow_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3832 "configure"
+#line 3870 "configure"
 #include "confdefs.h"
 
 int main() {
 void *p;asm volatile("pfadd %%mm1,%%mm2"::"r"(p));
 ; return 0; }
 EOF
-if { (eval echo configure:3839: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3877: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_3dnow_inline=yes
 else
@@ -3857,19 +3895,19 @@ EOF
 fi
 
 echo $ac_n "checking if \$CC groks SSE inline assembly""... $ac_c" 1>&6
-echo "configure:3861: checking if \$CC groks SSE inline assembly" >&5
+echo "configure:3899: checking if \$CC groks SSE inline assembly" >&5
 if eval "test \"`echo '$''{'ac_cv_sse_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3866 "configure"
+#line 3904 "configure"
 #include "confdefs.h"
 
 int main() {
 void *p;asm volatile("xorps %%xmm1,%%xmm2"::"r"(p));
 ; return 0; }
 EOF
-if { (eval echo configure:3873: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3911: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_sse_inline=yes
 else
@@ -3891,19 +3929,19 @@ EOF
 fi
 
 echo $ac_n "checking if \$CC groks Altivec inline assembly""... $ac_c" 1>&6
-echo "configure:3895: checking if \$CC groks Altivec inline assembly" >&5
+echo "configure:3933: checking if \$CC groks Altivec inline assembly" >&5
 if eval "test \"`echo '$''{'ac_cv_altivec_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3900 "configure"
+#line 3938 "configure"
 #include "confdefs.h"
 
 int main() {
 asm volatile("vperm 0,1,2,3");
 ; return 0; }
 EOF
-if { (eval echo configure:3907: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3945: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_altivec_inline=yes
 else
@@ -3913,14 +3951,14 @@ else
   save_CFLAGS=$CFLAGS
           CFLAGS="$CFLAGS -Wa,-m7400"
           cat > conftest.$ac_ext <<EOF
-#line 3917 "configure"
+#line 3955 "configure"
 #include "confdefs.h"
 
 int main() {
 asm volatile("vperm 0,1,2,3");
 ; return 0; }
 EOF
-if { (eval echo configure:3924: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3962: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_altivec_inline="-Wa,-m7400"
 else
@@ -3949,7 +3987,7 @@ EOF
 fi
 
 echo $ac_n "checking if \$CC groks Altivec C extensions""... $ac_c" 1>&6
-echo "configure:3953: checking if \$CC groks Altivec C extensions" >&5
+echo "configure:3991: checking if \$CC groks Altivec C extensions" >&5
 if eval "test \"`echo '$''{'ac_cv_c_altivec'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3957,14 +3995,14 @@ else
      CFLAGS="$CFLAGS -faltivec"
      # Darwin test
      cat > conftest.$ac_ext <<EOF
-#line 3961 "configure"
+#line 3999 "configure"
 #include "confdefs.h"
 
 int main() {
 vec_mtvscr((vector unsigned int)(0));
 ; return 0; }
 EOF
-if { (eval echo configure:3968: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4006: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_altivec=-faltivec
 else
@@ -3975,14 +4013,14 @@ else
         # Linux/PPC test
         CFLAGS="$save_CFLAGS $CFLAGS_ALTIVEC -fvec"
         cat > conftest.$ac_ext <<EOF
-#line 3979 "configure"
+#line 4017 "configure"
 #include "confdefs.h"
 
 int main() {
 vec_mtvscr((vector unsigned int)(0));
 ; return 0; }
 EOF
-if { (eval echo configure:3986: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4024: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_altivec="-fvec"
 else
@@ -4010,21 +4048,21 @@ EOF
 fi
 
 echo $ac_n "checking if linker needs -framework vecLib""... $ac_c" 1>&6
-echo "configure:4014: checking if linker needs -framework vecLib" >&5
+echo "configure:4052: checking if linker needs -framework vecLib" >&5
 if eval "test \"`echo '$''{'ac_cv_ld_altivec'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   save_LDFLAGS=$LDFLAGS
      LDFLAGS="$LDFLAGS -framework vecLib"
      cat > conftest.$ac_ext <<EOF
-#line 4021 "configure"
+#line 4059 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:4028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4066: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_ld_altivec=yes
 else
@@ -4056,6 +4094,11 @@ case ${target_os} in
   *mingw32*)
     SYS=mingw32
     ;;
+  *nto*)
+    SYS=nto
+    LIB_X11="${LIB_X11} -lsocket"
+    LIB_XVIDEO="${LIB_XVIDEO} -lsocket"
+    ;;
   *)
     SYS=${target_os}
     ;;
@@ -4065,7 +4108,7 @@ if test $SYS = mingw32; then
 # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
 set dummy ${ac_tool_prefix}windres; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4069: checking for $ac_word" >&5
+echo "configure:4112: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4097,7 +4140,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "windres", so it can be a program name with args.
 set dummy windres; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4101: checking for $ac_word" >&5
+echo "configure:4144: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4129,7 +4172,7 @@ else
 fi
 fi
 
-LIB_TS="-lws2_32"
+LIB_MPEG_TS="-lws2_32"
 LIB_RC="-lws2_32"
 fi
 
@@ -4140,17 +4183,17 @@ for ac_hdr in winioctl.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4144: checking for $ac_hdr" >&5
+echo "configure:4187: 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 4149 "configure"
+#line 4192 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4154: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4197: \"$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*
@@ -4183,17 +4226,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:4187: checking for $ac_hdr" >&5
+echo "configure:4230: 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 4192 "configure"
+#line 4235 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4197: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4240: \"$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*
@@ -4219,17 +4262,17 @@ EOF
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4223: checking for $ac_hdr" >&5
+echo "configure:4266: 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 4228 "configure"
+#line 4271 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4233: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4276: \"$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*
@@ -4259,7 +4302,7 @@ done
   LINUX_DVD_STRUCT=0
   OPENBSD_DVD_STRUCT=0
         cat > conftest.$ac_ext <<EOF
-#line 4263 "configure"
+#line 4306 "configure"
 #include "confdefs.h"
 #include <sys/cdio.h>
 EOF
@@ -4272,7 +4315,7 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
 EOF
 
     cat > conftest.$ac_ext <<EOF
-#line 4276 "configure"
+#line 4319 "configure"
 #include "confdefs.h"
 #include <sys/cdio.h>
 EOF
@@ -4292,7 +4335,7 @@ fi
 rm -f conftest*
 
         cat > conftest.$ac_ext <<EOF
-#line 4296 "configure"
+#line 4339 "configure"
 #include "confdefs.h"
 #include <sys/dvdio.h>
 EOF
@@ -4305,7 +4348,7 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
 EOF
 
     cat > conftest.$ac_ext <<EOF
-#line 4309 "configure"
+#line 4352 "configure"
 #include "confdefs.h"
 #include <sys/dvdio.h>
 EOF
@@ -4325,7 +4368,7 @@ fi
 rm -f conftest*
 
         cat > conftest.$ac_ext <<EOF
-#line 4329 "configure"
+#line 4372 "configure"
 #include "confdefs.h"
 #include <linux/cdrom.h>
 EOF
@@ -4344,7 +4387,7 @@ rm -f conftest*
 
         NEED_BSDI_LIBDVD=0
   cat > conftest.$ac_ext <<EOF
-#line 4348 "configure"
+#line 4391 "configure"
 #include "confdefs.h"
 #include <dvd.h>
 EOF
@@ -4366,17 +4409,17 @@ else
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4370: checking for $ac_hdr" >&5
+echo "configure:4413: 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 4375 "configure"
+#line 4418 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4380: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4423: \"$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*
@@ -4416,17 +4459,17 @@ rm -f conftest*
 
         ac_safe=`echo "sys/scsi/scsi_types.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/scsi/scsi_types.h""... $ac_c" 1>&6
-echo "configure:4420: checking for sys/scsi/scsi_types.h" >&5
+echo "configure:4463: checking for sys/scsi/scsi_types.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 4425 "configure"
+#line 4468 "configure"
 #include "confdefs.h"
 #include <sys/scsi/scsi_types.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4430: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4473: \"$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*
@@ -4445,17 +4488,17 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   
     ac_safe=`echo "sys/scsi/impl/uscsi.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/scsi/impl/uscsi.h""... $ac_c" 1>&6
-echo "configure:4449: checking for sys/scsi/impl/uscsi.h" >&5
+echo "configure:4492: checking for sys/scsi/impl/uscsi.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 4454 "configure"
+#line 4497 "configure"
 #include "confdefs.h"
 #include <sys/scsi/impl/uscsi.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4459: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4502: \"$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*
@@ -4512,6 +4555,19 @@ fi
 done
 
 
+
+case ${target_os} in
+  bsdi*)
+    SYS=bsdi
+    ;;
+  darwin*)
+    SYS=darwin
+    ;;
+  *)
+    SYS=${target_os}
+    ;;
+esac
+
 # Check whether --with-tuning or --without-tuning was given.
 if test "${with_tuning+set}" = set; then
   withval="$with_tuning"
@@ -4610,7 +4666,7 @@ 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:4614: checking for pth_init in -lpth" >&5
+echo "configure:4670: 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
@@ -4618,7 +4674,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpth  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4622 "configure"
+#line 4678 "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
@@ -4629,7 +4685,7 @@ int main() {
 pth_init()
 ; return 0; }
 EOF
-if { (eval echo configure:4633: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4689: \"$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
@@ -4657,7 +4713,7 @@ else
 fi
 
     cat > conftest.$ac_ext <<EOF
-#line 4661 "configure"
+#line 4717 "configure"
 #include "confdefs.h"
 #include <pth.h>
 EOF
@@ -4778,7 +4834,7 @@ fi
 if test x$enable_vcd != xno
 then
   cat > conftest.$ac_ext <<EOF
-#line 4782 "configure"
+#line 4838 "configure"
 #include "confdefs.h"
 #include <linux/cdrom.h>
 EOF
@@ -4828,40 +4884,41 @@ if test "${enable_rc+set}" = set; then
   :
 fi
 
+
 if test x$enable_rc != xno
 then
   BUILTINS="${BUILTINS} rc"
 fi
 
-# Check whether --with-libmad or --without-libmad was given.
-if test "${with_libmad+set}" = set; then
-  withval="$with_libmad"
+# Check whether --with-mad or --without-mad was given.
+if test "${with_mad+set}" = set; then
+  withval="$with_mad"
    if test "x$with_val" != "xno"; then
       if test -n $with_val; then
-           CFLAGS_MAD_ADEC="-I$with_val/include"
-        LIB_MAD_ADEC="-L$with_val/lib -lmad"
+           CFLAGS_MAD="-I$with_val/include"
+        LIB_MAD="-L$with_val/lib -lmad"
       else
-        LIB_MAD_ADEC="-lmad"
+        LIB_MAD="-lmad"
       fi
       save_CFLAGS=$CFLAGS
       save_LDFLAGS=$LDFLAGS
-      CFLAGS="$CFLAGS $CFLAGS_MAD_ADEC"
-      LDFLAGS="$LDFLAGS $LIB_MAD_ADEC"
+      CFLAGS="$CFLAGS $CFLAGS_MAD"
+      LDFLAGS="$LDFLAGS $LIB_MAD"
       for ac_hdr in mad.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4855: checking for $ac_hdr" >&5
+echo "configure:4912: 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 4860 "configure"
+#line 4917 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4865: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4922: \"$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*
@@ -4891,7 +4948,7 @@ fi
 done
 
       echo $ac_n "checking for mad_bit_init in -lmad""... $ac_c" 1>&6
-echo "configure:4895: checking for mad_bit_init in -lmad" >&5
+echo "configure:4952: checking for mad_bit_init in -lmad" >&5
 ac_lib_var=`echo mad'_'mad_bit_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
@@ -4899,7 +4956,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lmad  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4903 "configure"
+#line 4960 "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
@@ -4910,7 +4967,7 @@ int main() {
 mad_bit_init()
 ; return 0; }
 EOF
-if { (eval echo configure:4914: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4971: \"$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
@@ -4942,7 +4999,7 @@ fi
 
       CFLAGS=$save_CFLAGS
       LDFLAGS=$save_LDFLAGS
-      BUILTINS="${BUILTINS} mad_adec"
+      PLUGINS="${PLUGINS} mad"
     fi 
 fi
 
@@ -4979,7 +5036,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:4983: checking for $ac_word" >&5
+echo "configure:5040: 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
@@ -5030,7 +5087,7 @@ if test "${enable_arts+set}" = set; then
      # Extract the first word of "artsc-config", so it can be a program name with args.
 set dummy artsc-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5034: checking for $ac_word" >&5
+echo "configure:5091: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_ARTS_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5087,17 +5144,17 @@ else
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5091: checking for $ac_hdr" >&5
+echo "configure:5148: 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 5096 "configure"
+#line 5153 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5101: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5158: \"$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*
@@ -5141,17 +5198,17 @@ fi
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5145: checking for $ac_hdr" >&5
+echo "configure:5202: 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 5150 "configure"
+#line 5207 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5155: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5212: \"$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*
@@ -5229,7 +5286,7 @@ fi
   # Extract the first word of "sdl12-config", so it can be a program name with args.
 set dummy sdl12-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5233: checking for $ac_word" >&5
+echo "configure:5290: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_SDL12_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5269,7 +5326,7 @@ fi
     # Extract the first word of "sdl11-config", so it can be a program name with args.
 set dummy sdl11-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5273: checking for $ac_word" >&5
+echo "configure:5330: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_SDL11_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5310,7 +5367,7 @@ fi
     # Extract the first word of "sdl-config", so it can be a program name with args.
 set dummy sdl-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5314: checking for $ac_word" >&5
+echo "configure:5371: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_SDL_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5356,17 +5413,17 @@ fi
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5360: checking for $ac_hdr" >&5
+echo "configure:5417: 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 5365 "configure"
+#line 5422 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5370: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5427: \"$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*
@@ -5436,17 +5493,17 @@ fi
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5440: checking for $ac_hdr" >&5
+echo "configure:5497: 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 5445 "configure"
+#line 5502 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5450: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5507: \"$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*
@@ -5475,7 +5532,7 @@ done
 
     else
       echo $ac_n "checking for directX headers in ${withval}""... $ac_c" 1>&6
-echo "configure:5479: checking for directX headers in ${withval}" >&5
+echo "configure:5536: checking for directX headers in ${withval}" >&5
       if test -f ${withval}/include/directx.h
       then
         PLUGINS="${PLUGINS} directx"
@@ -5558,7 +5615,7 @@ if test "${enable_gnome+set}" = set; then
     # Extract the first word of "gnome-config", so it can be a program name with args.
 set dummy gnome-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5562: checking for $ac_word" >&5
+echo "configure:5619: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GNOME_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5603,17 +5660,17 @@ fi
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5607: checking for $ac_hdr" >&5
+echo "configure:5664: 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 5612 "configure"
+#line 5669 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5617: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5674: \"$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*
@@ -5673,7 +5730,7 @@ fi
   # 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:5677: checking for $ac_word" >&5
+echo "configure:5734: 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
@@ -5719,17 +5776,17 @@ fi
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5723: checking for $ac_hdr" >&5
+echo "configure:5780: 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 5728 "configure"
+#line 5785 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5790: \"$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*
@@ -5785,17 +5842,17 @@ if test x$enable_x11 != xno &&
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5789: checking for $ac_hdr" >&5
+echo "configure:5846: 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 5794 "configure"
+#line 5851 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5799: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5856: \"$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*
@@ -5816,7 +5873,7 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
 #define $ac_tr_hdr 1
 EOF
  
-    PLUGINS="${PLUGINS} x11"
+    #PLUGINS="${PLUGINS} x11"
     LIB_X11="-L$x_libraries -lX11 -lXext"
     CFLAGS_X11="-I$x_includes"
   
@@ -5848,17 +5905,17 @@ if test x$enable_xvideo != xno &&
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5852: checking for $ac_hdr" >&5
+echo "configure:5909: 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 5857 "configure"
+#line 5914 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5862: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5919: \"$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*
@@ -5898,17 +5955,17 @@ if test "${enable_alsa+set}" = set; then
    then
      ac_safe=`echo "alsa/asoundlib.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for alsa/asoundlib.h""... $ac_c" 1>&6
-echo "configure:5902: checking for alsa/asoundlib.h" >&5
+echo "configure:5959: checking for alsa/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 5907 "configure"
+#line 5964 "configure"
 #include "confdefs.h"
 #include <alsa/asoundlib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5912: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5969: \"$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*
@@ -5925,7 +5982,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:5929: checking for main in -lasound" >&5
+echo "configure:5986: 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
@@ -5933,14 +5990,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lasound  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5937 "configure"
+#line 5994 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:5944: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6001: \"$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
@@ -6264,13 +6321,13 @@ s%@LIB_GTK@%$LIB_GTK%g
 s%@LIB_KDE@%$LIB_KDE%g
 s%@LIB_LIBDVDCSS@%$LIB_LIBDVDCSS%g
 s%@LIB_MACOSX@%$LIB_MACOSX%g
-s%@LIB_MAD_ADEC@%$LIB_MAD_ADEC%g
+s%@LIB_MAD@%$LIB_MAD%g
+s%@LIB_MPEG_TS@%$LIB_MPEG_TS%g
 s%@LIB_NCURSES@%$LIB_NCURSES%g
 s%@LIB_QNX@%$LIB_QNX%g
 s%@LIB_QT@%$LIB_QT%g
 s%@LIB_RC@%$LIB_RC%g
 s%@LIB_SDL@%$LIB_SDL%g
-s%@LIB_TS@%$LIB_TS%g
 s%@LIB_X11@%$LIB_X11%g
 s%@LIB_XVIDEO@%$LIB_XVIDEO%g
 s%@LIB_YUV@%$LIB_YUV%g
@@ -6282,7 +6339,7 @@ s%@CFLAGS_LIBDVDCSS@%$CFLAGS_LIBDVDCSS%g
 s%@CFLAGS_ARTS@%$CFLAGS_ARTS%g
 s%@CFLAGS_ESD@%$CFLAGS_ESD%g
 s%@CFLAGS_GTK@%$CFLAGS_GTK%g
-s%@CFLAGS_MAD_ADEC@%$CFLAGS_MAD_ADEC%g
+s%@CFLAGS_MAD@%$CFLAGS_MAD%g
 s%@CFLAGS_SDL@%$CFLAGS_SDL%g
 s%@CFLAGS_X11@%$CFLAGS_X11%g
 s%@OBJ_DVD@%$OBJ_DVD%g
index 229c8ff..99d696d 100644 (file)
@@ -135,6 +135,7 @@ AC_CHECK_FUNC(getopt_long,[AC_DEFINE(HAVE_GETOPT_LONG,1,long getopt support)],
 AC_FUNC_MMAP
 AC_TYPE_SIGNAL
 AC_CHECK_LIB(dl,dlopen,LIB="${LIB} -ldl")
+AC_CHECK_LIB(m,cos,LIB_IMDCT="${LIB_IMDCT} -lm")
 AC_CHECK_LIB(m,pow,LIB_YUV="${LIB_YUV} -lm")
 
 dnl Check for pthreads - borrowed from XMMS
@@ -295,13 +296,14 @@ ARCH=${target_cpu}
 dnl
 dnl  default modules
 dnl
-BUILTINS="${BUILTINS} es ps ts memcpy yuv idct idctclassic motion imdct downmix mpeg_adec lpcm_adec ac3_adec mpeg_vdec"
-PLUGINS="${PLUGINS} ac3_spdif spu_dec"
+#BUILTINS="${BUILTINS} mpeg_es mpeg_ps mpeg_ts memcpy yuv2rgb8 idct idctclassic motion imdct downmix mpeg_adec lpcm_adec ac3_adec mpeg_vdec"
+BUILTINS="${BUILTINS} mpeg_es mpeg_ps mpeg_ts memcpy idct idctclassic motion imdct downmix mpeg_adec lpcm_adec ac3_adec mpeg_vdec"
+PLUGINS="${PLUGINS} ac3_spdif spudec"
 
 dnl
 dnl  Accelerated modules
 dnl
-MMX_MODULES="memcpymmx yuvmmx idctmmx motionmmx"
+MMX_MODULES="memcpymmx idctmmx motionmmx"
 MMXEXT_MODULES="memcpymmxext idctmmxext motionmmxext"
 THREEDNOW_MODULES="memcpy3dn imdct3dn downmix3dn"
 SSE_MODULES="imdctsse downmixsse"
@@ -407,6 +409,11 @@ case ${target_os} in
   *mingw32*)
     SYS=mingw32
     ;;
+  *nto*)
+    SYS=nto
+    LIB_X11="${LIB_X11} -lsocket"
+    LIB_XVIDEO="${LIB_XVIDEO} -lsocket"
+    ;;
   *)
     SYS=${target_os}
     ;;
@@ -417,7 +424,7 @@ dnl Windoze specific section
 dnl
 if test $SYS = mingw32; then
 AC_CHECK_TOOL(WINDRES, windres, :)
-LIB_TS="-lws2_32"
+LIB_MPEG_TS="-lws2_32"
 LIB_RC="-lws2_32"
 fi
 
@@ -513,6 +520,22 @@ AC_CHECK_HEADERS(sys/ioctl.h,[
   fi
 ])
 
+
+dnl
+dnl  Check the operating system
+dnl
+case ${target_os} in
+  bsdi*)
+    SYS=bsdi
+    ;;
+  darwin*)
+    SYS=darwin
+    ;;
+  *)
+    SYS=${target_os}
+    ;;
+esac
+
 dnl
 dnl  Special arch tuning
 dnl
@@ -749,28 +772,29 @@ dnl
 dnl  rc plugin
 dnl
 AC_ARG_ENABLE(rc,
-  [  --disable-rc            rc module (default enabled)])
+  [  --disable-rc            Remote Control module (default enabled)])
+
 if test x$enable_rc != xno
 then
   BUILTINS="${BUILTINS} rc"
 fi
 
 dnl
-dnl  libmad plugin
+dnl  mad plugin
 dnl
-AC_ARG_WITH(libmad,
-  [  --with-libmad[=PATH]    libmad module (default disabled)],
+AC_ARG_WITH(mad,
+  [  --with-mad[=PATH]       libmad module (default disabled)],
   [ if test "x$with_val" != "xno"; then
       if test -n $with_val; then
-           CFLAGS_MAD_ADEC="-I$with_val/include"
-        LIB_MAD_ADEC="-L$with_val/lib -lmad"
+           CFLAGS_MAD="-I$with_val/include"
+        LIB_MAD="-L$with_val/lib -lmad"
       else
-        LIB_MAD_ADEC="-lmad"
+        LIB_MAD="-lmad"
       fi
       save_CFLAGS=$CFLAGS
       save_LDFLAGS=$LDFLAGS
-      CFLAGS="$CFLAGS $CFLAGS_MAD_ADEC"
-      LDFLAGS="$LDFLAGS $LIB_MAD_ADEC"
+      CFLAGS="$CFLAGS $CFLAGS_MAD"
+      LDFLAGS="$LDFLAGS $LIB_MAD"
       AC_CHECK_HEADERS(mad.h, ,
       [ echo "Cannot find development headers for libmad..."
         exit 1
@@ -781,7 +805,7 @@ AC_ARG_WITH(libmad,
       ])
       CFLAGS=$save_CFLAGS
       LDFLAGS=$save_LDFLAGS
-      BUILTINS="${BUILTINS} mad_adec"
+      PLUGINS="${PLUGINS} mad"
     fi ])
 
 dnl special case for BeOS
@@ -1127,7 +1151,7 @@ if test x$enable_x11 != xno &&
   saved_CPPFLAGS=$CPPFLAGS
   CPPFLAGS="$CPPFLAGS -I$x_includes"
   AC_CHECK_HEADERS(X11/Xlib.h, [
-    PLUGINS="${PLUGINS} x11"
+    #PLUGINS="${PLUGINS} x11"
     LIB_X11="-L$x_libraries -lX11 -lXext"
     CFLAGS_X11="-I$x_includes"
   ]
@@ -1234,13 +1258,13 @@ AC_SUBST(LIB_GTK)
 AC_SUBST(LIB_KDE)
 AC_SUBST(LIB_LIBDVDCSS)
 AC_SUBST(LIB_MACOSX)
-AC_SUBST(LIB_MAD_ADEC)
+AC_SUBST(LIB_MAD)
+AC_SUBST(LIB_MPEG_TS)
 AC_SUBST(LIB_NCURSES)
 AC_SUBST(LIB_QNX)
 AC_SUBST(LIB_QT)
 AC_SUBST(LIB_RC)
 AC_SUBST(LIB_SDL)
-AC_SUBST(LIB_TS)
 AC_SUBST(LIB_X11)
 AC_SUBST(LIB_XVIDEO)
 AC_SUBST(LIB_YUV)
@@ -1253,7 +1277,7 @@ AC_SUBST(CFLAGS_LIBDVDCSS)
 AC_SUBST(CFLAGS_ARTS)
 AC_SUBST(CFLAGS_ESD)
 AC_SUBST(CFLAGS_GTK)
-AC_SUBST(CFLAGS_MAD_ADEC)
+AC_SUBST(CFLAGS_MAD)
 AC_SUBST(CFLAGS_SDL)
 AC_SUBST(CFLAGS_X11)
 
index e31cf43..1891373 100644 (file)
@@ -2,7 +2,7 @@ Source: vlc
 Section: graphics
 Priority: optional
 Maintainer: Samuel Hocevar <sam@zoy.org>
-Build-Depends: debhelper (>=2.2.0), xlibs-dev, libgnome-dev, libggi2-dev, libglide2-dev [i386], libesd0-dev, libsdl1.2-dev, libqt-dev, libasound2-dev [alpha i386 ia64 m68k powerpc] (>=0.9.0beta7)
+Build-Depends: debhelper (>=2.2.0), xlibs-dev, libgnome-dev, libggi2-dev, libglide2-dev [i386], libesd0-dev, libsdl1.2-dev, libqt-dev, libasound2-dev [alpha i386 ia64 m68k powerpc] (>=0.9.0beta7), libmad0-dev
 Standards-Version: 3.0.1
 
 Package: vlc
@@ -107,3 +107,12 @@ Description: Qt plugin for vlc
  VideoLAN is a free MPEG, MPEG2 and DVD software solution.
  .
  This plugin adds a Qt interface to vlc, the VideoLAN Client.
+
+Package: vlc-mad
+Architecture: any
+Depends: vlc (= ${Source-Version}), ${shlibs:Depends}
+Description: MAD plugin for vlc
+ VideoLAN is a free MPEG, MPEG2 and DVD software solution.
+ .
+ This plugin adds support for libmad, the MPEG audio decoder library, to
+ the VideoLAN Client. MAD is 100% fixed-point based.
index 6eced2e..ccb865d 100755 (executable)
@@ -9,14 +9,14 @@
 export DH_COMPAT=3
 
 # Compilation options
-export CONFIG_FLAGS="--enable-release --prefix=/usr --enable-gnome --enable-gtk --enable-fb --with-ggi --enable-sdl --enable-esd --enable-qt"
+export CONFIG_FLAGS="--enable-release --prefix=/usr --enable-gnome --enable-gtk --enable-fb --with-ggi --enable-sdl --enable-esd --enable-qt --with-mad"
 export LIBDVDCSS_FLAGS="--with-dvdcss=local-shared"
 export VIDDIR="usr/share/videolan"
 export PIXDIR="usr/share/pixmaps"
 export GNOMEDIR="usr/share/gnome/apps/Multimedia"
 
 # Library options
-version=$(shell grep '^ *LIBDVDCSS_VERSION=[0-9]' configure.in | head -1 | cut -f2 -d=)
+version=$(shell grep '^ *LIBDVDCSS_VERSION=' configure.in | head -1 | sed 's/"//g' | cut -f2 -d=)
 major=$(shell echo "$(version)" | cut -f1 -d.)
 
 build: build-stamp
index 1207663..4620106 100644 (file)
@@ -2,7 +2,7 @@
  * css.c: Functions for DVD authentification and unscrambling
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: css.c,v 1.16 2001/11/13 02:03:46 sam Exp $
+ * $Id: css.c,v 1.17 2001/12/09 17:01:35 sam Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *         Håkan Hjort <d95hjort@dtek.chalmers.se>
@@ -40,7 +40,6 @@
 
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 
 #include "videolan/dvdcss.h"
index 54d74bf..fe26db0 100644 (file)
@@ -2,7 +2,7 @@
  * ioctl.c: DVD ioctl replacement function
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ioctl.c,v 1.14 2001/10/18 23:13:46 ej Exp $
+ * $Id: ioctl.c,v 1.15 2001/12/09 17:01:35 sam Exp $
  *
  * Authors: Markus Kuespert <ltlBeBoy@beosmail.com>
  *          Samuel Hocevar <sam@zoy.org>
@@ -69,7 +69,6 @@
 #   include <sys/scsi/impl/uscsi.h>
 #endif
 
-#include "config.h"
 #include "common.h"
 
 #ifdef SYS_DARWIN
index 947c1e9..646ba25 100644 (file)
@@ -2,7 +2,7 @@
  * libdvdcss.c: DVD reading library.
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: libdvdcss.c,v 1.24 2001/11/27 10:18:33 massiot Exp $
+ * $Id: libdvdcss.c,v 1.25 2001/12/09 17:01:35 sam Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -45,7 +45,6 @@
 #   include <sys/uio.h>                                      /* struct iovec */
 #endif
 
-#include "config.h"
 #include "common.h"
 
 #if defined( WIN32 )
index 5a730aa..7c3aff2 100644 (file)
@@ -3,7 +3,7 @@
  * Collection of useful common types and macros definitions
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: common.h,v 1.53 2001/12/07 18:33:07 sam Exp $
+ * $Id: common.h,v 1.54 2001/12/09 17:01:35 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@via.ecp.fr>
  *          Vincent Seguin <seguin@via.ecp.fr>
@@ -119,10 +119,12 @@ typedef struct intf_channel_s *         p_intf_channel_t;
 struct input_thread_s;
 struct input_channel_s;
 struct input_cfg_s;
+struct input_area_s;
 
 typedef struct input_thread_s *         p_input_thread_t;
 typedef struct input_channel_s *        p_input_channel_t;
 typedef struct input_cfg_s *            p_input_cfg_t;
+typedef struct input_area_s *           p_input_area_t;
 
 /* Audio */
 struct aout_thread_s;
@@ -142,6 +144,7 @@ struct video_parser_s;
 typedef struct vout_thread_s *          p_vout_thread_t;
 typedef struct vout_font_s *            p_vout_font_t;
 typedef struct vout_sys_s *             p_vout_sys_t;
+typedef struct chroma_sys_s *           p_chroma_sys_t;
 typedef struct vdec_thread_s *          p_vdec_thread_t;
 typedef struct vpar_thread_s *          p_vpar_thread_t;
 typedef struct video_parser_s *         p_video_parser_t;
@@ -149,6 +152,11 @@ typedef struct video_parser_s *         p_video_parser_t;
 /* Misc */
 struct macroblock_s;
 struct data_packet_s;
+struct imdct_s;
+struct complex_s;
+struct dm_par_s;
+struct picture_s;
+struct picture_sys_s;
 struct es_descriptor_s;
 struct pgrm_descriptor_s;
 struct pes_packet_s;
@@ -362,11 +370,11 @@ typedef struct module_symbols_s
                                        ( int, int, long, long, long, void * );
     void ( * aout_DestroyFifo )     ( struct aout_fifo_s * );
 
-    struct vout_thread_s * (* vout_CreateThread) ( int *, int, int );
+    struct vout_thread_s * (* vout_CreateThread) ( int *, int, int, int, int );
     struct subpicture_s * (* vout_CreateSubPicture) ( struct vout_thread_s *, 
                                                       int, int );
     struct picture_s * ( * vout_CreatePicture ) ( struct vout_thread_s *, 
-                                                  int, int, int );
+                                                  int, int, int, int );
 
     void  ( * vout_DestroySubPicture )  ( struct vout_thread_s *, 
                                           struct subpicture_s * );
index c50c2d9..3e78b4a 100644 (file)
  * since higher stream values will result in no display at all. */
 #define VOUT_MAX_WIDTH                  4096
 
+/* Number of planes in a picture */
+#define VOUT_MAX_PLANES                 5
+
 /* Video heap size - remember that a decompressed picture is big
  * (~1 Mbyte) before using huge values */
 #define VOUT_MAX_PICTURES               8
index f4ba358..c63b407 100644 (file)
@@ -73,9 +73,6 @@
 /* Define if you have the <Ph.h> header file.  */
 #undef HAVE_PH_H
 
-/* Define if you have the <X11/Xlib.h> header file.  */
-#undef HAVE_X11_XLIB_H
-
 /* Define if you have the <X11/extensions/Xv.h> header file.  */
 #undef HAVE_X11_EXTENSIONS_XV_H
 
index ba86301..8fdb60f 100644 (file)
@@ -4,7 +4,7 @@
  * interface, such as message output.
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: interface.h,v 1.22 2001/03/21 13:42:33 sam Exp $
+ * $Id: interface.h,v 1.23 2001/12/09 17:01:35 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
  * This structe describes all interface-specific data of the main (interface)
  * thread.
  *****************************************************************************/
-typedef struct _keyparam
-{
-    int key;
-    int param;
-} keyparm;
-
-typedef struct _key
-{
-    int received_key;
-    keyparm forwarded;
-    struct _key *  next;
-} intf_key;
-
-typedef intf_key * p_intf_key;
-
 typedef struct intf_thread_s
 {
     boolean_t           b_die;                                 /* `die' flag */
@@ -66,7 +51,6 @@ typedef struct intf_thread_s
     /* Specific interfaces */
     p_intf_console_t    p_console;                                /* console */
     p_intf_sys_t        p_sys;                           /* system interface */
-    p_intf_key          p_keys;
     
     /* Plugin used and shortcuts to access its capabilities */
     struct module_s *   p_module;
@@ -83,12 +67,9 @@ typedef struct intf_thread_s
     /* Channels array - NULL if not used */
     p_intf_channel_t    p_channel;                /* description of channels */
 
-    /* Main threads - NULL if not active */
+    /* Input thread - NULL if not active */
     p_input_thread_t    p_input;
 
-    /* Specific functions */
-    keyparm (*p_intf_get_key)(struct intf_thread_s *p_intf, int r_key) ;
-
     /* XXX: new message passing stuff will go here */
     vlc_mutex_t         change_lock;
     boolean_t           b_menu_change;
@@ -102,9 +83,3 @@ typedef struct intf_thread_s
 intf_thread_t * intf_Create             ( void );
 void            intf_Destroy            ( intf_thread_t * p_intf );
 
-int             intf_ProcessKey         ( intf_thread_t * p_intf, int i_key );
-
-void intf_AssignKey( intf_thread_t *p_intf, int r_key, int f_key, int param);
-keyparm intf_GetKey( intf_thread_t *p_intf, int r_key);
-void intf_AssignNormalKeys( intf_thread_t *p_intf);
-
index 8065843..a7aad93 100644 (file)
@@ -2,7 +2,7 @@
  * modules.h : Module management functions.
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: modules.h,v 1.35 2001/12/07 18:33:07 sam Exp $
+ * $Id: modules.h,v 1.36 2001/12/09 17:01:35 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -64,7 +64,7 @@ typedef void *  module_handle_t;
 #define MODULE_CAPABILITY_IDCT     1 <<  6  /* IDCT transformation */
 #define MODULE_CAPABILITY_AOUT     1 <<  7  /* Audio output */
 #define MODULE_CAPABILITY_VOUT     1 <<  8  /* Video output */
-#define MODULE_CAPABILITY_YUV      1 <<  9  /* YUV colorspace conversion */
+#define MODULE_CAPABILITY_CHROMA   1 <<  9  /* colorspace conversion */
 #define MODULE_CAPABILITY_IMDCT    1 << 10  /* IMDCT transformation */
 #define MODULE_CAPABILITY_DOWNMIX  1 << 11  /* AC3 downmix */
 #define MODULE_CAPABILITY_MEMCPY   1 << 12  /* memcpy */
@@ -87,6 +87,13 @@ typedef struct probedata_s
     {
         char * psz_data;
     } aout;
+
+    struct
+    {
+        struct { int i_chroma; int i_width; int i_height; } source;
+        struct { int i_chroma; int i_width; int i_height; } dest;
+    } chroma;
+
 } probedata_t;
 
 /* FIXME: find a nicer way to do this. */
@@ -155,9 +162,10 @@ typedef struct function_list_s
             void ( * pf_end )        ( struct vout_thread_s * );
             void ( * pf_destroy )    ( struct vout_thread_s * );
             int  ( * pf_manage )     ( struct vout_thread_s * );
-            void ( * pf_display )    ( struct vout_thread_s * );
-            void ( * pf_setpalette ) ( struct vout_thread_s *, u16 *red,
-                                       u16 *green, u16 *blue, u16 *transp );
+            void ( * pf_display )    ( struct vout_thread_s *,
+                                       struct picture_s * );
+            void ( * pf_setpalette ) ( struct vout_thread_s *,
+                                       u16 *, u16 *, u16 * );
         } vout;
 
         /* Motion compensation plugin */
@@ -182,13 +190,13 @@ typedef struct function_list_s
             void ( * pf_norm_scan )    ( u8 ppi_scan[2][64] );
         } idct;
 
-        /* YUV transformation plugin */
+        /* Chroma transformation plugin */
         struct
         {
             int  ( * pf_init )         ( struct vout_thread_s * );
             int  ( * pf_reset )        ( struct vout_thread_s * );
             void ( * pf_end )          ( struct vout_thread_s * );
-        } yuv;
+        } chroma;
 
         /* IMDCT plugin */
         struct
@@ -247,7 +255,7 @@ typedef struct module_functions_s
     function_list_t idct;
     function_list_t aout;
     function_list_t vout;
-    function_list_t yuv;
+    function_list_t chroma;
     function_list_t imdct;
     function_list_t downmix;
     function_list_t memcpy;
index 4317a32..a515c3d 100644 (file)
@@ -31,8 +31,6 @@
     (p_symbols)->TestProgram = TestProgram; \
     (p_symbols)->TestMethod = TestMethod; \
     (p_symbols)->TestCPU = TestCPU; \
-    (p_symbols)->intf_AssignKey = intf_AssignKey; \
-    (p_symbols)->intf_ProcessKey = intf_ProcessKey; \
     (p_symbols)->intf_Msg = intf_Msg; \
     (p_symbols)->intf_ErrMsg = intf_ErrMsg; \
     (p_symbols)->intf_StatMsg = intf_StatMsg;\
 #   define TestMethod(a,b) p_symbols->TestMethod(a,b)
 #   define TestCPU(a) p_symbols->TestCPU(a)
 
-#   define intf_AssignKey(a,b,c,d) p_symbols->intf_AssignKey(a,b,c,d)
-#   define intf_ProcessKey(a,b) p_symbols->intf_ProcessKey(a,b)
-
 #   define intf_Msg p_symbols->intf_Msg
 #   define intf_ErrMsg p_symbols->intf_ErrMsg
 #   define intf_StatMsg p_symbols->intf_StatMsg
index c6d4183..5c50241 100644 (file)
@@ -2,7 +2,7 @@
  * vdec_ext-plugins.h : structures from the video decoder exported to plug-ins
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: vdec_ext-plugins.h,v 1.7 2001/10/11 16:12:43 massiot Exp $
+ * $Id: vdec_ext-plugins.h,v 1.8 2001/12/09 17:01:35 sam Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -63,7 +63,8 @@ typedef struct macroblock_s
     /* Motion compensation information */
     motion_inner_t          p_motions[8];
     int                     i_nb_motions;
-    yuv_data_t *            pp_dest[3];
+    pixel_data_t *          pp_dest[3];
+
 } macroblock_t;
 
 /* Macroblock Modes */
index 2e5e50a..1d5fb3d 100644 (file)
@@ -4,7 +4,7 @@
  * includes all common video types and constants.
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: video.h,v 1.32 2001/08/22 17:21:45 massiot Exp $
+ * $Id: video.h,v 1.33 2001/12/09 17:01:35 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
  *  "mtime.h"
  *****************************************************************************/
 
+/*****************************************************************************
+ * plane_t: description of a planar graphic field
+ *****************************************************************************/
+typedef u8 pixel_data_t;
+
+typedef struct plane_s
+{
+    pixel_data_t *p_data;
+    int           i_bytes;
+} plane_t;
+
 /*****************************************************************************
  * picture_t: video picture
  *****************************************************************************
  *****************************************************************************/
 typedef struct picture_s
 {
+    /* Picture data - data can always be freely modified, but no pointer
+     * may EVER be modified. A direct buffer can be handled as the plugin
+     * wishes, but for internal video output pictures the allocated pointer
+     * MUST be planes[0].p_data */
+    plane_t         planes[ VOUT_MAX_PLANES ];  /* description of the planes */
+    int             i_planes;                  /* number of allocated planes */
+
     /* Type and flags - should NOT be modified except by the vout thread */
-    int             i_type;                                  /* picture type */
     int             i_status;                               /* picture flags */
     int             i_matrix_coefficients;     /* in YUV type, encoding type */
 
     /* Picture management properties - these properties can be modified using
-     * the video output thread API, but should ne be written directly */
+     * the video output thread API, but should never be written directly */
     int             i_refcount;                    /* link reference counter */
     mtime_t         date;                                    /* display date */
 
     /* Picture static properties - those properties are fixed at initialization
      * and should NOT be modified */
     int             i_width;                                /* picture width */
-    int             i_chroma_width;                          /* chroma width */
     int             i_height;                              /* picture height */
-    int             i_size;                                /* number of pels */
-    int             i_chroma_size;                  /* number of chroma pels */
+    int             i_chroma;                              /* picture chroma */
+    int             i_aspect_ratio;                          /* aspect ratio */
+    boolean_t       b_directbuffer;               /* is it a direct buffer ? */
+
+    /* These values can be calculated from i_chroma, i_width and i_height
+     * but we leave them to prevent unnecessary calculation */
+    int             i_size;
+    int             i_chroma_width;
+    int             i_chroma_size;
+
+    /* Picture margins - needed because of possible padding issues */
+    int             i_left_margin;
+    int             i_right_margin;
+    int             i_top_margin;
+    int             i_bottom_margin;
 
     /* Picture dynamic properties - those properties can be changed by the
      * decoder */
-    int             i_display_horizontal_offset;   /* ISO/IEC 13818-2 6.3.12 */
-    int             i_display_vertical_offset;     /* ISO/IEC 13818-2 6.3.12 */
-    int             i_display_width;                 /* useful picture width */
-    int             i_display_height;               /* useful picture height */
-    int             i_aspect_ratio;                          /* aspect ratio */
+    boolean_t       b_progressive_frame;      /* is it a progressive frame ? */
+    boolean_t       b_repeat_first_field;                         /* RFF bit */
+    boolean_t       b_top_field_first;               /* which field is first */
+
+    /* Macroblock counter - the decoder use it to verify if it has
+     * decoded all the macroblocks of the picture */
+    int             i_deccount;
+    vlc_mutex_t     lock_deccount;
+
+    /* Private data - the video output plugin might want to put stuff here to
+     * keep track of the picture */
+    struct picture_sys_s *p_sys;
 
-    /* Picture data - data can always be freely modified. p_data itself
-     * (the pointer) should NEVER be modified. In YUV format, the p_y, p_u and
-     * p_v data pointers refers to different areas of p_data, and should not
-     * be freed */
-    void *          p_data;                                  /* picture data */
-    yuv_data_t *    p_y;        /* pointer to beginning of Y image in p_data */
-    yuv_data_t *    p_u;        /* pointer to beginning of U image in p_data */
-    yuv_data_t *    p_v;        /* pointer to beginning of V image in p_data */
 } picture_t;
 
-/* Pictures types */
+/* Pictures chromas */
 #define EMPTY_PICTURE           0     /* picture slot is empty and available */
 #define YUV_420_PICTURE         100                     /* 4:2:0 YUV picture */
 #define YUV_422_PICTURE         101                     /* 4:2:2 YUV picture */
 #define YUV_444_PICTURE         102                     /* 4:4:4 YUV picture */
+#define RGB_8BPP_PICTURE        200                      /* RGB 8bpp picture */
+#define RGB_16BPP_PICTURE       201                     /* RGB 16bpp picture */
+#define RGB_32BPP_PICTURE       202                     /* RGB 32bpp picture */
 
 /* Pictures status */
 #define FREE_PICTURE            0                  /* free and not allocated */
@@ -97,6 +128,23 @@ typedef struct picture_s
 #define AR_16_9_PICTURE         3              /* 16:9 picture (wide screen) */
 #define AR_221_1_PICTURE        4                  /* 2.21:1 picture (movie) */
 
+/* Plane indices */
+#define YUV_PLANE               0
+#define RGB_PLANE               0
+#define Y_PLANE                 0
+#define U_PLANE                 1
+#define V_PLANE                 2
+#define Cb_PLANE                1
+#define Cr_PLANE                2
+#define R_PLANE                 0
+#define G_PLANE                 1
+#define B_PLANE                 2
+
+/* Shortcuts */
+#define P_Y planes[ Y_PLANE ].p_data
+#define P_U planes[ U_PLANE ].p_data
+#define P_V planes[ V_PLANE ].p_data
+
 /*****************************************************************************
  * subpicture_t: video subtitle
  *****************************************************************************
index dd4885a..e3e2be0 100644 (file)
@@ -5,7 +5,7 @@
  * thread, and destroy a previously oppenned video output thread.
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: video_output.h,v 1.63 2001/10/01 16:18:48 massiot Exp $
+ * $Id: video_output.h,v 1.64 2001/12/09 17:01:35 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
@@ -42,64 +42,31 @@ typedef struct vout_bank_s
 extern vout_bank_t *p_vout_bank;
 
 /*****************************************************************************
- * vout_yuv_convert_t: YUV conversion function
+ * vout_chroma_t: Chroma conversion function
  *****************************************************************************
- * This is the prototype common to all conversion functions. The type of p_pic
- * will change depending on the processed screen depth.
+ * This is the prototype common to all conversion functions.
  * Parameters:
- *      p_vout                          video output thread
- *      p_pic                           picture address
- *      p_y, p_u, p_v                   Y,U,V samples addresses
- *      i_width, i_height               Y samples extension
- *      i_pic_width, i_pic_height       picture extension
- *      i_pic_line_width                picture total line width
- *      i_matrix_coefficients           matrix coefficients
+ *      p_source                        source picture
+ *      p_dest                          destination picture
  * Picture width and source dimensions must be multiples of 16.
  *****************************************************************************/
-typedef void (vout_yuv_convert_t)( p_vout_thread_t p_vout, void *p_pic,
-                                   yuv_data_t *p_y, yuv_data_t *p_u, yuv_data_t *p_v,
-                                   int i_width, int i_height,
-                                   int i_pic_width, int i_pic_height, int i_pic_line_width,
-                                   int i_matrix_coefficients );
+typedef void (vout_chroma_convert_t)( picture_t *p_source, picture_t *p_dest );
 
-/*****************************************************************************
- * vout_yuv_t: pre-calculated YUV conversion tables
- *****************************************************************************
- * These tables are used by conversion and scaling functions.
- *****************************************************************************/
-typedef int  (yuv_init_t)           ( p_vout_thread_t p_vout );
-typedef int  (yuv_reset_t)          ( p_vout_thread_t p_vout );
-typedef void (yuv_end_t)            ( p_vout_thread_t p_vout );
-
-typedef struct vout_yuv_s
+typedef struct vout_chroma_s
 {
     /* conversion functions */
-    vout_yuv_convert_t *pf_yuv420;                    /* YUV 4:2:0 converter */
-    vout_yuv_convert_t *pf_yuv422;                    /* YUV 4:2:2 converter */
-    vout_yuv_convert_t *pf_yuv444;                    /* YUV 4:4:4 converter */
-
-    /* Pre-calculated conversion tables */
-    void *              p_base;            /* base for all conversion tables */
-    union
-    {
-        u8 *            p_gray8;                        /* gray 8 bits table */
-        u16 *           p_gray16;                      /* gray 16 bits table */
-        u32 *           p_gray32;                      /* gray 32 bits table */
-        u8 *            p_rgb8;                          /* RGB 8 bits table */
-        u16 *           p_rgb16;                        /* RGB 16 bits table */
-        u32 *           p_rgb32;                        /* RGB 32 bits table */
-    } yuv;
-
-    /* Temporary conversion buffer and offset array */
-    void *              p_buffer;                       /* conversion buffer */
-    int *               p_offset;                            /* offset array */
+    vout_chroma_convert_t *pf_convert;
+
+    /* Private module-dependant data */
+    p_chroma_sys_t      p_sys;                               /* private data */
 
     /* Plugin used and shortcuts to access its capabilities */
     struct module_s *   p_module;
-    yuv_init_t *        pf_init;                    /* initialize YUV tables */
-    yuv_reset_t *       pf_reset;                        /* reset YUV tables */
-    yuv_end_t *         pf_end;                           /* free YUV tables */
-} vout_yuv_t;
+    int  ( * pf_init )  ( struct vout_thread_s * );
+    int  ( * pf_reset ) ( struct vout_thread_s * );
+    void ( * pf_end )   ( struct vout_thread_s * );
+
+} vout_chroma_t;
 
 /*****************************************************************************
  * vout_buffer_t: rendering buffer
@@ -132,9 +99,6 @@ typedef struct vout_fifo_s
     boolean_t           b_die;
     int                 i_fifo;      /* Just to keep track of the fifo index */
 
-    int                 i_width;
-    int                 i_height;
-
     vlc_mutex_t         data_lock;
     vlc_cond_t          data_wait;
 
@@ -164,16 +128,15 @@ typedef struct vout_thread_s
     int *               pi_status;                  /* temporary status flag */
     p_vout_sys_t        p_sys;                       /* system output method */
                                                                    
+    /* Current input properties */
+    int                 i_width;                      /* current input width */
+    int                 i_height;                    /* current input height */
+    int                 i_chroma;                    /* current input chroma */
+    int                 i_aspect_ratio;        /* current input aspect ratio */
+
     /* Current display properties */
     u16                 i_changes;             /* changes made to the thread */
-    int                 i_width;              /* current output method width */
-    int                 i_height;            /* current output method height */
-    int                 i_bytes_per_line;  /* bytes per line (incl. virtual) */
-    int                 i_screen_depth;  /* significant bpp: 8, 15, 16 or 24 */
-    int                 i_bytes_per_pixel;/* real screen depth: 1, 2, 3 or 4 */
     float               f_gamma;                                    /* gamma */
-    boolean_t           b_need_render;  /* does the output method need a YUV 
-                                         * conversion ?                      */
 
     /* Color masks and shifts in RGB mode - masks are set by system
      * initialization, shifts are calculated. A pixel color value can be
@@ -194,46 +157,36 @@ typedef struct vout_thread_s
 
     /* Plugin used and shortcuts to access its capabilities */
     struct module_s *   p_module;
-    int  ( *pf_create )     ( struct vout_thread_s * );
-    int  ( *pf_init )       ( struct vout_thread_s * );
-    void ( *pf_end )        ( struct vout_thread_s * );
-    void ( *pf_destroy )    ( struct vout_thread_s * );
-    int  ( *pf_manage )     ( struct vout_thread_s * );
-    void ( *pf_display )    ( struct vout_thread_s * );
-    void ( *pf_setpalette ) ( struct vout_thread_s *, u16 *red,
-                              u16 *green, u16 *blue, u16 *transp );
-    void ( *pf_setbuffers ) ( struct vout_thread_s *, void *, void * );
+    int              ( *pf_create )     ( struct vout_thread_s * );
+    int              ( *pf_init )       ( struct vout_thread_s * );
+    void             ( *pf_end )        ( struct vout_thread_s * );
+    void             ( *pf_destroy )    ( struct vout_thread_s * );
+    int              ( *pf_manage )     ( struct vout_thread_s * );
+    void             ( *pf_display )    ( struct vout_thread_s *,
+                                          struct picture_s * );
+    void             ( *pf_setpalette ) ( struct vout_thread_s *,
+                                          u16 *, u16 *, u16 * );
 
     /* Pictures and rendering properties */
     boolean_t           b_grayscale;           /* color or grayscale display */
-    boolean_t           b_YCbr;            /* use YUV to YCbr instead of RGB */
     boolean_t           b_info;              /* print additional information */
     boolean_t           b_interface;                     /* render interface */
     boolean_t           b_scale;                    /* allow picture scaling */
-    boolean_t           b_fullscreen;           /* toogle fullscreen dusplay */
+    boolean_t           b_fullscreen;           /* toogle fullscreen display */
     mtime_t             render_time;             /* last picture render time */
 
-
-    /* Idle screens management */
-    mtime_t             last_display_date;     /* last non idle display date */
-    mtime_t             last_idle_date;            /* last idle display date */
-    mtime_t             init_display_date;
-
     /* Statistics - these numbers are not supposed to be accurate, but are a
      * good indication of the thread status */
     count_t             c_fps_samples;                     /* picture counts */
     mtime_t             p_fps_sample[VOUT_FPS_SAMPLES]; /* FPS samples dates */
 
-    /* Rendering buffers */
-    int                 i_buffer_index;                      /* buffer index */
-    vout_buffer_t       p_buffer[2];                   /* buffers properties */
-
     /* Video heap and translation tables */
     picture_t           p_picture[VOUT_MAX_PICTURES];            /* pictures */
     subpicture_t        p_subpicture[VOUT_MAX_PICTURES];      /* subpictures */
+    int                 i_directbuffers;       /* number of pictures in VRAM */
     int                 i_pictures;                     /* current heap size */
-    vout_yuv_t          yuv;                           /* translation tables */
-    picture_t *         p_rendered_pic;  /* picture currently being rendered */
+
+    vout_chroma_t       chroma;                        /* translation tables */
 
     /* Bitmap fonts */
     p_vout_font_t       p_default_font;                      /* default font */
@@ -258,7 +211,7 @@ typedef struct vout_thread_s
 #define VOUT_FULLSCREEN_CHANGE  0x0040               /* b_fullscreen changed */
 #define VOUT_SIZE_CHANGE        0x0200                       /* size changed */
 #define VOUT_DEPTH_CHANGE       0x0400                      /* depth changed */
-#define VOUT_YUV_CHANGE         0x0800                  /* change yuv tables */
+#define VOUT_CHROMA_CHANGE      0x0800               /* change chroma tables */
 
 /* Disabled for thread deadlocks issues --Meuuh */
 //#define VOUT_NODISPLAY_CHANGE   0xff00    /* changes which forbidden display */
@@ -279,25 +232,28 @@ typedef struct vout_thread_s
 /*****************************************************************************
  * Prototypes
  *****************************************************************************/
-void            vout_InitBank           ( void );
-void            vout_EndBank            ( void );
-
-vout_thread_t * vout_CreateThread   ( int *pi_status, int i_width, int i_height );
-void            vout_DestroyThread  ( vout_thread_t *p_vout, int *pi_status );
-
-vout_fifo_t *   vout_CreateFifo         ( void );
-void            vout_DestroyFifo        ( vout_fifo_t *p_fifo );
-void            vout_FreeFifo           ( vout_fifo_t *p_fifo );
-
-picture_t *     vout_CreatePicture  ( vout_thread_t *p_vout, int i_type,
-                                      int i_width, int i_height );
-void            vout_DestroyPicture ( vout_thread_t *p_vout, picture_t *p_pic );
-void            vout_DisplayPicture ( vout_thread_t *p_vout, picture_t *p_pic );
-void            vout_DatePicture    ( vout_thread_t *p_vout, picture_t *p_pic, mtime_t date );
-void            vout_LinkPicture    ( vout_thread_t *p_vout, picture_t *p_pic );
-void            vout_UnlinkPicture  ( vout_thread_t *p_vout, picture_t *p_pic );
-
-subpicture_t *  vout_CreateSubPicture   ( vout_thread_t *p_vout, int i_type, int i_size );
-void            vout_DestroySubPicture  ( vout_thread_t *p_vout, subpicture_t *p_subpic );
-void            vout_DisplaySubPicture  ( vout_thread_t *p_vout, subpicture_t *p_subpic );
+void            vout_InitBank       ( void );
+void            vout_EndBank        ( void );
+
+vout_thread_t * vout_CreateThread   ( int *pi_status, int, int, int, int );
+void            vout_DestroyThread  ( vout_thread_t *, int *pi_status );
+
+vout_fifo_t *   vout_CreateFifo     ( void );
+void            vout_DestroyFifo    ( vout_fifo_t * );
+void            vout_FreeFifo       ( vout_fifo_t * );
+
+picture_t *     vout_CreatePicture  ( vout_thread_t *, int, int, int, int );
+void            vout_DestroyPicture ( vout_thread_t *, picture_t * );
+void            vout_DisplayPicture ( vout_thread_t *, picture_t * );
+void            vout_DatePicture    ( vout_thread_t *, picture_t *, mtime_t );
+void            vout_LinkPicture    ( vout_thread_t *, picture_t * );
+void            vout_UnlinkPicture  ( vout_thread_t *, picture_t * );
+picture_t *     vout_RenderPicture  ( vout_thread_t *, picture_t *,
+                                                       subpicture_t * );
+
+subpicture_t *  vout_CreateSubPicture   ( vout_thread_t *, int, int );
+void            vout_DestroySubPicture  ( vout_thread_t *, subpicture_t * );
+void            vout_DisplaySubPicture  ( vout_thread_t *, subpicture_t * );
+subpicture_t *  vout_SortSubPictures    ( vout_thread_t *, mtime_t );
+void            vout_RenderSubPictures  ( picture_t *, subpicture_t * );
 
index d6b3044..b693687 100755 (executable)
@@ -7,7 +7,7 @@
 export CC=arm-linux-gcc
 export LD=arm-linux-ld
 export STRIP=arm-linux-strip
-export CONFIG_FLAGS="--enable-release --prefix=/usr --disable-gtk --enable-fb --enable-sdl --disable-xvideo --disable-plugins --with-tuning=strongarm1100 --x-includes=/skiff/local/arm-linux/include --x-libraries=/skiff/local/arm-linux/lib/X11 --with-sdl-config-path=/skiff/local/bin --with-libmad=/skiff/local/arm-linux"
+export CONFIG_FLAGS="--enable-release --prefix=/usr --disable-gtk --enable-fb --enable-sdl --disable-xvideo --disable-plugins --with-tuning=strongarm1100 --x-includes=/skiff/local/arm-linux/include --x-libraries=/skiff/local/arm-linux/lib/X11 --with-sdl-config-path=/skiff/local/bin --with-mad=/skiff/local/arm-linux"
 export LIBDVDCSS_FLAGS="--with-dvdcss=local-static"
 export VIDDIR="usr/share/videolan"
 export PIXDIR="usr/share/pixmaps"
index 0633e76..50211fd 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_adec.c: ac3 decoder module main file
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_adec.c,v 1.5 2001/12/03 16:18:37 sam Exp $
+ * $Id: ac3_adec.c,v 1.6 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Lespinasse <walken@zoy.org>
  *
@@ -36,7 +36,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>                                              /* memset() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
 #include "threads.h"
index 55d1aa0..419a32c 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_bit_allocate.c: ac3 allocation tables
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: ac3_bit_allocate.c,v 1.3 2001/11/28 15:08:04 massiot Exp $
+ * $Id: ac3_bit_allocate.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -30,7 +30,6 @@
 
 #include <string.h>                                              /* memcpy() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index c49d25e..ad0cbc5 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_decoder.c: core ac3 decoder
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_decoder.c,v 1.3 2001/11/28 15:08:04 massiot Exp $
+ * $Id: ac3_decoder.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Michel Lespinasse <walken@zoy.org>
@@ -30,7 +30,6 @@
 
 #include <string.h>                                              /* memcpy() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
 #include "threads.h"
index bab0a45..c9f6b45 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_exponent.c: ac3 exponent calculations
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_exponent.c,v 1.3 2001/11/28 15:08:04 massiot Exp $
+ * $Id: ac3_exponent.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Michel Lespinasse <walken@zoy.org>
@@ -30,7 +30,6 @@
 
 #include <string.h>                                    /* memcpy(), memset() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
 #include "threads.h"
index 27901f9..980f7bd 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_imdct.c: ac3 DCT
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_imdct.c,v 1.4 2001/11/28 15:08:04 massiot Exp $
+ * $Id: ac3_imdct.c,v 1.5 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -33,7 +33,6 @@
 #include <math.h>
 #include <stdio.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 037bc01..c4f95d7 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_mantissa.c: ac3 mantissa computation
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_mantissa.c,v 1.3 2001/11/28 15:08:04 massiot Exp $
+ * $Id: ac3_mantissa.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -30,7 +30,6 @@
 
 #include <string.h>                                              /* memcpy() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index a14c17b..3d1aba7 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_parse.c: ac3 parsing procedures
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_parse.c,v 1.3 2001/11/28 15:08:04 massiot Exp $
+ * $Id: ac3_parse.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -30,7 +30,6 @@
 
 #include <string.h>                                              /* memset() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 16f659e..b7a7a30 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_rematrix.c: ac3 audio rematrixing
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_rematrix.c,v 1.3 2001/11/28 15:08:04 massiot Exp $
+ * $Id: ac3_rematrix.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -29,7 +29,6 @@
 
 #include <string.h>                                              /* memcpy() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 3152c12..bd4722b 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_iec958.c: ac3 to spdif converter
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: ac3_iec958.c,v 1.2 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_iec958.c,v 1.3 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *          Juha Yrjola <jyrjola@cc.hut.fi>
@@ -37,7 +37,6 @@
 #include <unistd.h>
 #endif
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
 #include "threads.h"
index b6e98be..95c26b3 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_spdif.c: ac3 pass-through to external decoder with enabled soundcard
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: ac3_spdif.c,v 1.5 2001/12/03 16:18:37 sam Exp $
+ * $Id: ac3_spdif.c,v 1.6 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *          Juha Yrjola <jyrjola@cc.hut.fi>
@@ -40,7 +40,6 @@
 #include <unistd.h>
 #endif
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
 #include "threads.h"
index 77e606a..ffede17 100644 (file)
@@ -2,7 +2,7 @@
  * alsa.c : alsa plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: alsa.c,v 1.11 2001/11/28 15:08:05 massiot Exp $
+ * $Id: alsa.c,v 1.12 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Henri Fallon <henri@videolan.org>
  *
@@ -33,7 +33,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 5b80232..3a9f96b 100644 (file)
@@ -31,7 +31,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>                                              /* strdup() */
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index fb7d503..1255239 100644 (file)
@@ -2,7 +2,7 @@
  * beos.cpp : BeOS plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: beos.cpp,v 1.13 2001/11/30 09:49:48 tcastley Exp $
+ * $Id: beos.cpp,v 1.14 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -35,7 +35,6 @@
 
 extern "C"
 {
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
diff --git a/plugins/chroma/.cvsignore b/plugins/chroma/.cvsignore
new file mode 100644 (file)
index 0000000..63e7180
--- /dev/null
@@ -0,0 +1 @@
+.dep
diff --git a/plugins/chroma/Makefile b/plugins/chroma/Makefile
new file mode 100644 (file)
index 0000000..315a145
--- /dev/null
@@ -0,0 +1,34 @@
+###############################################################################
+# vlc (VideoLAN Client) chroma conversion modules makefile
+# (c)2001 VideoLAN
+###############################################################################
+
+#
+# Objects
+#
+
+PLUGIN_YUV2RGB8 = yuv2rgb8.o #common.o
+
+BUILTIN_YUV2RGB8 = $(PLUGIN_YUV2RGB8:%.o=BUILTIN_%.o)
+
+PLUGIN_C = $(PLUGIN_YUV2RGB8)
+BUILTIN_C = $(BUILTIN_YUV2RGB8)
+ALL_OBJ = $(PLUGIN_C) $(BUILTIN_C)
+
+#
+# Virtual targets
+#
+
+include ../../Makefile.modules
+
+#
+# Real targets
+#
+
+../yuv2rgb8.so: $(PLUGIN_YUV2RGB8)
+       $(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) 
+
+../yuv2rgb8.a: $(BUILTIN_YUV2RGB8)
+       ar r $@ $^
+       $(RANLIB) $@
+
index c1b7b0b..97c9c27 100644 (file)
@@ -2,7 +2,7 @@
  * directx.c : Windows DirectX plugin for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: directx.c,v 1.2 2001/11/28 15:08:05 massiot Exp $
+ * $Id: directx.c,v 1.3 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *      
@@ -32,7 +32,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 83c335a..dc0ba6e 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_downmix_3dn.c: accelerated 3D Now! ac3 downmix functions
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: ac3_downmix_3dn.c,v 1.6 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_downmix_3dn.c,v 1.7 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *
@@ -29,7 +29,6 @@
  *****************************************************************************/
 #include "defs.h"
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_downmix.h"
index f47ebd0..722b8f4 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_downmix_c.c: ac3 downmix functions in C
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: ac3_downmix_c.c,v 1.2 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_downmix_c.c,v 1.3 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -32,7 +32,6 @@
 
 #include <string.h>                                              /* memcpy() */
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_downmix.h"
index 2e2898b..4d2e971 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_downmix_sse.c: accelerated SSE ac3 downmix functions
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: ac3_downmix_sse.c,v 1.6 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_downmix_sse.c,v 1.7 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -30,7 +30,6 @@
  *****************************************************************************/
 #include "defs.h"
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_downmix.h"
index 1aa1e7c..b7b2dcd 100644 (file)
@@ -2,7 +2,7 @@
  * downmix.c : AC3 downmix module
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: downmix.c,v 1.4 2001/11/28 15:08:05 massiot Exp $
+ * $Id: downmix.c,v 1.5 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@via.ecp.fr>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 4b6ca32..86cfc34 100644 (file)
@@ -2,7 +2,7 @@
  * downmix3dn.c : accelerated 3D Now! AC3 downmix module
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: downmix3dn.c,v 1.5 2001/11/28 15:08:05 massiot Exp $
+ * $Id: downmix3dn.c,v 1.6 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@via.ecp.fr>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index f361a49..0a7c6eb 100644 (file)
@@ -2,7 +2,7 @@
  * downmixsse.c : accelerated SSE AC3 downmix module
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: downmixsse.c,v 1.5 2001/11/28 15:08:05 massiot Exp $
+ * $Id: downmixsse.c,v 1.6 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@via.ecp.fr>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 2f3f65c..6a5c3dc 100644 (file)
@@ -2,7 +2,7 @@
  * dsp.c : OSS /dev/dsp module for vlc
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: dsp.c,v 1.10 2001/11/28 15:08:05 massiot Exp $
+ * $Id: dsp.c,v 1.11 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -33,7 +33,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>                                              /* strdup() */
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 0fd71b5..344c71b 100644 (file)
@@ -2,7 +2,7 @@
  * dummy.c : dummy plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: dummy.c,v 1.11 2001/11/28 15:08:05 massiot Exp $
+ * $Id: dummy.c,v 1.12 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 3073f8b..46b134c 100644 (file)
@@ -2,7 +2,7 @@
  * null.c : NULL module for vlc
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: null.c,v 1.2 2001/11/28 15:08:05 massiot Exp $
+ * $Id: null.c,v 1.3 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -31,7 +31,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>                                              /* strdup() */
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 0ac14da..558a9ac 100644 (file)
@@ -2,7 +2,7 @@
  * vout_dummy.c: Dummy video output display method for testing purposes
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: vout_dummy.c,v 1.9 2001/11/28 15:08:05 massiot Exp $
+ * $Id: vout_dummy.c,v 1.10 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -33,7 +33,6 @@
 #include <stdlib.h>                                                /* free() */
 #include <string.h>                                            /* strerror() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
@@ -48,8 +47,7 @@
 
 #define DUMMY_WIDTH 16
 #define DUMMY_HEIGHT 16
-#define DUMMY_BITS_PER_PLANE 16
-#define DUMMY_BYTES_PER_PIXEL 2
+#define DUMMY_MAX_DIRECTBUFFERS 5
 
 /*****************************************************************************
  * vout_sys_t: dummy video output method descriptor
@@ -59,9 +57,7 @@
  *****************************************************************************/
 typedef struct vout_sys_s
 {
-    /* Dummy video memory */
-    byte_t *                    p_video;                      /* base adress */
-    size_t                      i_page_size;                    /* page size */
+    /* Nothing needed here. Maybe stats ? */
 
 } vout_sys_t;
 
@@ -74,7 +70,7 @@ static int  vout_Init      ( struct vout_thread_s * );
 static void vout_End       ( struct vout_thread_s * );
 static void vout_Destroy   ( struct vout_thread_s * );
 static int  vout_Manage    ( struct vout_thread_s * );
-static void vout_Display   ( struct vout_thread_s * );
+static void vout_Display   ( struct vout_thread_s *, struct picture_s * );
 
 /*****************************************************************************
  * Functions exported as capabilities. They are declared as static so that
@@ -120,29 +116,6 @@ static int vout_Create( vout_thread_t *p_vout )
         return( 1 );
     }
 
-    p_vout->i_width            = DUMMY_WIDTH;
-    p_vout->i_height           = DUMMY_HEIGHT;
-    p_vout->i_screen_depth     = DUMMY_BITS_PER_PLANE;
-    p_vout->i_bytes_per_pixel  = DUMMY_BYTES_PER_PIXEL;
-    p_vout->i_bytes_per_line   = DUMMY_WIDTH * DUMMY_BYTES_PER_PIXEL;
-
-    p_vout->p_sys->i_page_size = DUMMY_WIDTH * DUMMY_HEIGHT
-                                  * DUMMY_BYTES_PER_PIXEL;
-
-    /* Map two framebuffers a the very beginning of the fb */
-    p_vout->p_sys->p_video = malloc( 2 * p_vout->p_sys->i_page_size );
-    if( p_vout->p_sys->p_video == NULL )
-    {
-        intf_ErrMsg( "vout error: can't map video memory (%s)",
-                     strerror(errno) );
-        free( p_vout->p_sys );
-        return( 1 );
-    }
-
-    /* Set and initialize buffers */
-    p_vout->pf_setbuffers( p_vout, p_vout->p_sys->p_video,
-                     p_vout->p_sys->p_video + p_vout->p_sys->i_page_size );
-
     return( 0 );
 }
 
@@ -151,6 +124,92 @@ static int vout_Create( vout_thread_t *p_vout )
  *****************************************************************************/
 static int vout_Init( vout_thread_t *p_vout )
 {
+    picture_t *p_pic;
+    int        i_index = 0;
+    int        i_luma_bytes, i_chroma_bytes;
+
+    /* Try to initialize DUMMY_MAX_DIRECTBUFFERS direct buffers */
+    while( i_index < DUMMY_MAX_DIRECTBUFFERS )
+    {
+        p_pic = &p_vout->p_picture[ i_index ];
+
+        switch( p_vout->i_chroma )
+        {
+        /* We know this chroma, allocate a buffer which will be used
+         * directly by the decoder */
+        case YUV_420_PICTURE:
+
+            p_pic->i_chroma = YUV_420_PICTURE;
+            p_pic->i_width  = p_vout->i_width;
+            p_pic->i_height = p_vout->i_height;
+
+            /* Precalculate some values */
+            p_pic->i_size         = p_vout->i_width * p_vout->i_height;
+            p_pic->i_chroma_width = p_vout->i_width / 2;
+            p_pic->i_chroma_size  = p_vout->i_width * p_vout->i_height / 2;
+
+            /* Allocate the memory buffer */
+            i_luma_bytes = p_pic->i_size * sizeof(pixel_data_t);
+            i_chroma_bytes = p_pic->i_chroma_size * sizeof(pixel_data_t);
+
+            /* Y buffer */
+            p_pic->planes[ Y_PLANE ].p_data = malloc( i_luma_bytes + 2 * i_chroma_bytes );
+            p_pic->planes[ Y_PLANE ].i_bytes = i_luma_bytes;
+
+            /* U buffer */
+            p_pic->planes[ U_PLANE ].p_data = p_pic->planes[ Y_PLANE ].p_data + p_pic->i_height * p_pic->i_width;
+            p_pic->planes[ U_PLANE ].i_bytes = i_chroma_bytes;
+
+            /* V buffer */
+            p_pic->planes[ V_PLANE ].p_data = p_pic->planes[ U_PLANE ].p_data + p_pic->i_height * p_pic->i_chroma_width;
+            p_pic->planes[ V_PLANE ].i_bytes = i_chroma_bytes;
+
+            /* We allocated 3 planes */
+            p_pic->i_planes = 3;
+
+            break;
+
+        /* Unknown chroma, allocate an RGB buffer, the video output's job
+         * will be to do the chroma->RGB conversion */
+        default:
+
+            p_pic->i_chroma = RGB_16BPP_PICTURE;
+            p_pic->i_width  = DUMMY_WIDTH;
+            p_pic->i_height = DUMMY_HEIGHT;
+
+            /* Precalculate some values */
+            i_luma_bytes    = sizeof(u16) * DUMMY_WIDTH * DUMMY_HEIGHT;
+
+            /* Allocate the memory buffer */
+            p_pic->planes[ RGB_PLANE ].p_data = malloc( i_luma_bytes );
+            p_pic->planes[ RGB_PLANE ].i_bytes = i_luma_bytes;
+
+            /* We allocated 1 plane */
+            p_pic->i_planes = 1;
+
+            break;
+        }
+
+        if( p_pic->i_planes == 0 )
+        {
+            break;
+        }
+
+        p_pic->i_status        = DESTROYED_PICTURE;
+
+        p_pic->b_directbuffer  = 1;
+
+        p_pic->i_left_margin   =
+        p_pic->i_right_margin  =
+        p_pic->i_top_margin    =
+        p_pic->i_bottom_margin = 0;
+
+        i_index++;
+    }
+
+    /* How many directbuffers did we create ? */
+    p_vout->i_directbuffers = i_index;
+
     return( 0 );
 }
 
@@ -159,7 +218,14 @@ static int vout_Init( vout_thread_t *p_vout )
  *****************************************************************************/
 static void vout_End( vout_thread_t *p_vout )
 {
-    ;
+    int i_index;
+
+    /* Free the fake direct buffers we allocated */
+    for( i_index = p_vout->i_directbuffers ; i_index ; )
+    {
+        i_index--;
+        free( p_vout->p_picture[ i_index ].planes[ 0 ].p_data );
+    }
 }
 
 /*****************************************************************************
@@ -169,7 +235,6 @@ static void vout_End( vout_thread_t *p_vout )
  *****************************************************************************/
 static void vout_Destroy( vout_thread_t *p_vout )
 {
-    free( p_vout->p_sys->p_video );
     free( p_vout->p_sys );
 }
 
@@ -190,8 +255,8 @@ static int vout_Manage( vout_thread_t *p_vout )
  * This function send the currently rendered image to dummy image, waits until
  * it is displayed and switch the two rendering buffers, preparing next frame.
  *****************************************************************************/
-static void vout_Display( vout_thread_t *p_vout )
+static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic )
 {
-    ;
+    /* No need to do anything, the fake direct buffers stay as they are */
 }
 
index 1cc92cb..c0ef5df 100644 (file)
@@ -2,7 +2,7 @@
  * dummy_dvdcss.c: Dummy libdvdcss with minimal DVD access.
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: dummy_dvdcss.c,v 1.3 2001/11/12 20:16:33 sam Exp $
+ * $Id: dummy_dvdcss.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -43,7 +43,6 @@
 #   error "building dummy libdvdcss on this system does not make sense !"
 #endif
 
-#include "config.h"
 #include "common.h"
 
 #include "dummy_dvdcss.h"
index 1445f2e..2013a49 100644 (file)
@@ -2,7 +2,7 @@
  * dvd.c : DVD input module for vlc
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: dvd.c,v 1.15 2001/11/28 15:08:05 massiot Exp $
+ * $Id: dvd.c,v 1.16 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -37,7 +37,6 @@
 #   include "dummy_dvdcss.h"
 #endif
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index b1d3a7e..eff7fe6 100644 (file)
@@ -2,7 +2,7 @@
  * dvd_ifo.c: Functions for ifo parsing
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: dvd_ifo.c,v 1.41 2001/11/28 15:08:05 massiot Exp $
+ * $Id: dvd_ifo.c,v 1.42 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *          German Tischler <tanis@gaspode.franken.de>
@@ -31,7 +31,6 @@
  * Preamble
  *****************************************************************************/
 #include "defs.h"
-#include "config.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -51,7 +50,6 @@
 #   include <videolan/dvdcss.h>
 #endif
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 83c6a40..e6e22d3 100644 (file)
@@ -5,7 +5,7 @@
  * contains the basic udf handling functions
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: dvd_udf.c,v 1.16 2001/11/28 15:08:05 massiot Exp $
+ * $Id: dvd_udf.c,v 1.17 2001/12/09 17:01:36 sam Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -56,7 +56,6 @@
 #   include <videolan/dvdcss.h>
 #endif
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 8456963..8f89d27 100644 (file)
@@ -2,7 +2,7 @@
  * dvdread.c : DvdRead input module for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: dvdread.c,v 1.2 2001/11/28 15:08:05 massiot Exp $
+ * $Id: dvdread.c,v 1.3 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -37,7 +37,6 @@
 #   include "dummy_dvdcss.h"
 #endif
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 456e102..9adfc68 100644 (file)
@@ -2,7 +2,7 @@
  * esd.c : EsounD module
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: esd.c,v 1.9 2001/11/28 15:08:05 massiot Exp $
+ * $Id: esd.c,v 1.10 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>                                              /* strdup() */
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 0066d54..a73047d 100644 (file)
@@ -2,7 +2,7 @@
  * fb.c : framebuffer plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: fb.c,v 1.8 2001/11/28 15:08:05 massiot Exp $
+ * $Id: fb.c,v 1.9 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *      
@@ -32,7 +32,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 3c314c7..791c101 100644 (file)
@@ -2,7 +2,7 @@
  * ggi.c : GGI plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: ggi.c,v 1.8 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ggi.c,v 1.9 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *      
@@ -32,7 +32,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 55c5ee9..a426e36 100644 (file)
@@ -2,7 +2,7 @@
  * glide.c : 3dfx Glide plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: glide.c,v 1.7 2001/11/28 15:08:05 massiot Exp $
+ * $Id: glide.c,v 1.8 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index d4fd605..af752b9 100644 (file)
@@ -2,7 +2,7 @@
  * gnome.c : Gnome plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000 VideoLAN
- * $Id: gnome.c,v 1.2 2001/05/30 17:03:12 sam Exp $
+ * $Id: gnome.c,v 1.3 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *      
  *****************************************************************************/
 #include "defs.h"
 
+#include <string.h>
 #include <stdlib.h>                                      /* malloc(), free() */
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
+#include "intf_msg.h"
 #include "threads.h"
 #include "mtime.h"
 
index 6c91751..e2aa479 100644 (file)
@@ -2,7 +2,7 @@
  * gtk.c : Gtk+ plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: gtk.c,v 1.5 2001/11/28 15:08:05 massiot Exp $
+ * $Id: gtk.c,v 1.6 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *      
@@ -32,7 +32,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
index 9461dd5..3530aa8 100644 (file)
@@ -2,7 +2,7 @@
  * idct.c : C IDCT module
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: idct.c,v 1.17 2001/11/28 15:08:05 massiot Exp $
+ * $Id: idct.c,v 1.18 2001/12/09 17:01:36 sam Exp $
  *
  * Author: Gaël Hendryckx <jimmy@via.ecp.fr>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index f082dc4..831ffac 100644 (file)
@@ -2,7 +2,7 @@
  * idctaltivec.c : Altivec IDCT module
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: idctaltivec.c,v 1.20 2001/12/06 13:46:23 massiot Exp $
+ * $Id: idctaltivec.c,v 1.21 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -35,7 +35,6 @@
 #include <string.h>
 #include <inttypes.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index fa8b6c2..9a0bb0b 100644 (file)
@@ -2,7 +2,7 @@
  * idctclassic.c : Classic IDCT module
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: idctclassic.c,v 1.17 2001/11/28 15:08:05 massiot Exp $
+ * $Id: idctclassic.c,v 1.18 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Gaël Hendryckx <jimmy@via.ecp.fr>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index d79b689..29e10a5 100644 (file)
@@ -2,7 +2,7 @@
  * idctmmx.c : MMX IDCT module
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: idctmmx.c,v 1.20 2001/11/28 15:08:05 massiot Exp $
+ * $Id: idctmmx.c,v 1.21 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  *          Michel Lespinasse <walken@zoy.org>
@@ -36,7 +36,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 3baed08..1cf6a22 100644 (file)
@@ -2,7 +2,7 @@
  * idctmmxext.c : MMX EXT IDCT module
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: idctmmxext.c,v 1.17 2001/11/28 15:08:05 massiot Exp $
+ * $Id: idctmmxext.c,v 1.18 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  *          Michel Lespinasse <walken@zoy.org>
@@ -36,7 +36,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
diff --git a/plugins/idct/vdec_block_c.c b/plugins/idct/vdec_block_c.c
new file mode 100644 (file)
index 0000000..0ec9f2f
--- /dev/null
@@ -0,0 +1,127 @@
+/*****************************************************************************
+ * vdec_block_c.c: Macroblock copy functions in C
+ *****************************************************************************
+ * Copyright (C) 1999, 2000, 2001 VideoLAN
+ * $Id: vdec_block_c.c,v 1.8 2001/12/09 17:01:36 sam Exp $
+ *
+ * Authors: Christophe Massiot <massiot@via.ecp.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *****************************************************************************/
+
+/* MODULE_NAME defined in Makefile together with -DBUILTIN */
+#ifdef BUILTIN
+#   include "modules_inner.h"
+#else
+#   define _M( foo ) foo
+#endif
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include "defs.h"
+
+#include <string.h>                                    /* memcpy(), memset() */
+
+#include "common.h"
+#include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
+#include "threads.h"
+#include "mtime.h"
+
+#include "vdec_idct.h"
+
+#include "modules.h"
+#include "modules_export.h"
+
+/*****************************************************************************
+ * Static variables
+ *****************************************************************************
+ * We can keep them static since they will always contain the same values.
+ *****************************************************************************/
+static u8  pi_crop_buf[VDEC_CROPRANGE];
+static u8 *pi_crop;
+
+/*****************************************************************************
+ * vdec_InitDecode: initialize video decoder thread
+ *****************************************************************************/
+void _M( vdec_InitDecode ) ( )
+{
+    int i_dummy;
+
+    /* Init crop table */
+    pi_crop = pi_crop_buf + (VDEC_CROPRANGE >> 1);
+
+    for( i_dummy = -(VDEC_CROPRANGE >> 1); i_dummy < 0; i_dummy++ )
+    {
+        pi_crop[i_dummy] = 0;
+    }
+
+    for( ; i_dummy < 255; i_dummy ++ )
+    {
+        pi_crop[i_dummy] = i_dummy;
+    }
+
+    for( ; i_dummy < (VDEC_CROPRANGE >> 1) -1; i_dummy++ )
+    {
+        pi_crop[i_dummy] = 255;
+    }
+}
+
+/*****************************************************************************
+ * vdec_AddBlock : add a block
+ *****************************************************************************/
+void _M( vdec_AddBlock ) ( dctelem_t * p_block, yuv_data_t * p_data,
+                           int i_incr )
+{
+    int i = 8;
+
+    do {
+        p_data[0] = pi_crop[ p_data[0] + p_block[0] ];
+        p_data[1] = pi_crop[ p_data[1] + p_block[1] ];
+        p_data[2] = pi_crop[ p_data[2] + p_block[2] ];
+        p_data[3] = pi_crop[ p_data[3] + p_block[3] ];
+        p_data[4] = pi_crop[ p_data[4] + p_block[4] ];
+        p_data[5] = pi_crop[ p_data[5] + p_block[5] ];
+        p_data[6] = pi_crop[ p_data[6] + p_block[6] ];
+        p_data[7] = pi_crop[ p_data[7] + p_block[7] ];
+
+        p_data += i_incr;
+        p_block += 8;
+    } while( --i );
+}
+
+/*****************************************************************************
+ * vdec_CopyBlock : copy a block
+ *****************************************************************************/
+void _M( vdec_CopyBlock )( dctelem_t * p_block, yuv_data_t * p_data,
+                           int i_incr )
+{
+    int i = 8;
+
+    do {
+        p_data[0] = pi_crop[ p_block[0] ];
+        p_data[1] = pi_crop[ p_block[1] ];
+        p_data[2] = pi_crop[ p_block[2] ];
+        p_data[3] = pi_crop[ p_block[3] ];
+        p_data[4] = pi_crop[ p_block[4] ];
+        p_data[5] = pi_crop[ p_block[5] ];
+        p_data[6] = pi_crop[ p_block[6] ];
+        p_data[7] = pi_crop[ p_block[7] ];
+
+        p_data += i_incr;
+        p_block += 8;
+    } while( --i );
+}
+
diff --git a/plugins/idct/vdec_block_mmx.c b/plugins/idct/vdec_block_mmx.c
new file mode 100644 (file)
index 0000000..a0595b7
--- /dev/null
@@ -0,0 +1,134 @@
+/*****************************************************************************
+ * vdec_block_mmx.c: Macroblock copy functions in MMX assembly
+ *****************************************************************************
+ * Copyright (C) 1999, 2000, 2001 VideoLAN
+ * $Id: vdec_block_mmx.c,v 1.8 2001/12/09 17:01:36 sam Exp $
+ *
+ * Authors: Michel Lespinasse <walken@zoy.org>
+ *          Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *****************************************************************************/
+
+/* MODULE_NAME defined in Makefile together with -DBUILTIN */
+#ifdef BUILTIN
+#   include "modules_inner.h"
+#else
+#   define _M( foo ) foo
+#endif
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include "defs.h"
+
+#include <string.h>                                    /* memcpy(), memset() */
+
+#include "common.h"
+#include "intf_msg.h"
+#include "threads.h"
+#include "mtime.h"
+
+#include "input_ext-dec.h"
+
+#include "video.h"
+#include "video_output.h"
+
+#include "vdec_idct.h"
+
+#include "modules.h"
+#include "modules_export.h"
+
+#include "mmx.h"
+
+/*****************************************************************************
+ * vdec_InitDecode: initialize video decoder thread
+ *****************************************************************************/
+void _M( vdec_InitDecode ) ( )
+{
+    ;
+}
+
+/*****************************************************************************
+ * vdec_AddBlock : add a block
+ *****************************************************************************/
+#define ADD_MMX(offset,r1,r2,r3,r4)                                         \
+    movq_m2r (*(p_data+2*i_incr), r1);                                      \
+    packuswb_r2r (r4, r3);                                                  \
+    movq_r2r (r1, r2);                                                      \
+    p_data += i_incr;                                                       \
+    movq_r2m (r3, *p_data);                                                 \
+    punpcklbw_r2r (mm0, r1);                                                \
+    paddsw_m2r (*(p_block+offset), r1);                                     \
+    punpckhbw_r2r (mm0, r2);                                                \
+    paddsw_m2r (*(p_block+offset+4), r2);
+
+void _M( vdec_AddBlock ) ( dctelem_t * p_block, yuv_data_t * p_data,
+                           int i_incr )
+{
+    movq_m2r (*p_data, mm1);
+    pxor_r2r (mm0, mm0);
+    movq_m2r (*(p_data + i_incr), mm3);
+    movq_r2r (mm1, mm2);
+    punpcklbw_r2r (mm0, mm1);
+    movq_r2r (mm3, mm4);
+    paddsw_m2r (*(p_block+0*8), mm1);
+    punpckhbw_r2r (mm0, mm2);
+    paddsw_m2r (*(p_block+0*8+4), mm2);
+    punpcklbw_r2r (mm0, mm3);
+    paddsw_m2r (*(p_block+1*8), mm3);
+    packuswb_r2r (mm2, mm1);
+    punpckhbw_r2r (mm0, mm4);
+    movq_r2m (mm1, *p_data);
+    paddsw_m2r (*(p_block+1*8+4), mm4);
+    ADD_MMX (2*8, mm1, mm2, mm3, mm4);
+    ADD_MMX (3*8, mm3, mm4, mm1, mm2);
+    ADD_MMX (4*8, mm1, mm2, mm3, mm4);
+    ADD_MMX (5*8, mm3, mm4, mm1, mm2);
+    ADD_MMX (6*8, mm1, mm2, mm3, mm4);
+    ADD_MMX (7*8, mm3, mm4, mm1, mm2);
+    packuswb_r2r (mm4, mm3);
+    movq_r2m (mm3, *(p_data + i_incr));
+}
+
+/*****************************************************************************
+ * vdec_CopyBlock : copy a block
+ *****************************************************************************/
+#define COPY_MMX(offset,r0,r1,r2)                                           \
+    movq_m2r (*(p_block+offset), r0);                                       \
+    p_data += i_incr;                                                       \
+    movq_m2r (*(p_block+offset+4), r1);                                     \
+    movq_r2m (r2, *p_data);                                                 \
+    packuswb_r2r (r1, r0);
+
+void _M( vdec_CopyBlock ) ( dctelem_t * p_block, yuv_data_t * p_data,
+                            int i_incr )
+{
+    movq_m2r (*(p_block+0*8), mm0);
+    movq_m2r (*(p_block+0*8+4), mm1);
+    movq_m2r (*(p_block+1*8), mm2);
+    packuswb_r2r (mm1, mm0);
+    movq_m2r (*(p_block+1*8+4), mm3);
+    movq_r2m (mm0, *p_data);
+    packuswb_r2r (mm3, mm2);
+    COPY_MMX (2*8, mm0, mm1, mm2);
+    COPY_MMX (3*8, mm2, mm3, mm0);
+    COPY_MMX (4*8, mm0, mm1, mm2);
+    COPY_MMX (5*8, mm2, mm3, mm0);
+    COPY_MMX (6*8, mm0, mm1, mm2);
+    COPY_MMX (7*8, mm2, mm3, mm0);
+    movq_r2m (mm2, *(p_data + i_incr));
+}
+
index a02345a..76267c1 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_imdct_3dn.c: accelerated 3D Now! ac3 DCT
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: ac3_imdct_3dn.c,v 1.7 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_imdct_3dn.c,v 1.8 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *
@@ -32,7 +32,6 @@
 #include <math.h>
 #include <stdio.h>
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_imdct.h"
index 3c43759..973091c 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_imdct_c.c: ac3 DCT in C
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_imdct_c.c,v 1.3 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_imdct_c.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -35,7 +35,6 @@
 #include <math.h>
 #include <stdio.h>
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_imdct.h"
index c4d0e01..634e238 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_imdct_common.c: common ac3 DCT functions
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: ac3_imdct_common.c,v 1.4 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_imdct_common.c,v 1.5 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -39,7 +39,6 @@
 #include <math.h>
 #include <stdio.h>
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_imdct.h"
index 002df6f..6c15eb7 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_imdct_sse.c: accelerated SSE ac3 DCT
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: ac3_imdct_sse.c,v 1.8 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_imdct_sse.c,v 1.9 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -33,7 +33,6 @@
 #include <math.h>
 #include <stdio.h>
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_imdct.h"
index b385a31..432362d 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_srfft_3dn.c: accelerated 3D Now! ac3 fft functions
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_srfft_3dn.c,v 1.3 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_srfft_3dn.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *
@@ -34,7 +34,6 @@
 #include <math.h>
 #include <stdio.h>
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_imdct.h"
index 9be2411..51e8947 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_srfft.c: ac3 FFT in C
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_srfft_c.c,v 1.2 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_srfft_c.c,v 1.3 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -35,7 +35,6 @@
 #include <math.h>
 #include <stdio.h>
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_imdct.h"
index 2855fa1..cfc94f2 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_srfft_sse.c: accelerated SSE ac3 fft functions
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_srfft_sse.c,v 1.9 2001/11/28 15:08:05 massiot Exp $
+ * $Id: ac3_srfft_sse.c,v 1.10 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@videolan.org>
  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
@@ -35,7 +35,6 @@
 #include <math.h>
 #include <stdio.h>
 
-#include "config.h"
 #include "common.h"
 
 #include "ac3_imdct.h"
index d844f6a..a0897bc 100644 (file)
@@ -2,7 +2,7 @@
  * imdct.c : IMDCT module
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: imdct.c,v 1.5 2001/11/28 15:08:05 massiot Exp $
+ * $Id: imdct.c,v 1.6 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Gaël Hendryckx <jimmy@via.ecp.fr>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index aafac8f..4f7b19f 100644 (file)
@@ -2,7 +2,7 @@
  * imdct3dn.c : accelerated 3D Now! IMDCT module
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: imdct3dn.c,v 1.7 2001/11/28 15:08:05 massiot Exp $
+ * $Id: imdct3dn.c,v 1.8 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Renaud Dartus <reno@via.ecp.fr>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index be95200..d812e41 100644 (file)
@@ -2,7 +2,7 @@
  * imdctsse.c : accelerated SSE IMDCT module
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: imdctsse.c,v 1.8 2001/11/28 15:08:05 massiot Exp $
+ * $Id: imdctsse.c,v 1.9 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Gaël Hendryckx <jimmy@via.ecp.fr>
  *
@@ -32,7 +32,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index 4fb641b..164ab20 100644 (file)
@@ -2,7 +2,7 @@
  * lpcm_decoder_thread.c: lpcm decoder thread
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: lpcm_adec.c,v 1.3 2001/12/03 16:18:37 sam Exp $
+ * $Id: lpcm_adec.c,v 1.4 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Henri Fallon <henri@videolan.org>
@@ -38,7 +38,6 @@
 #include <string.h>                                    /* memcpy(), memset() */
 #include <stdlib.h>                                      /* malloc(), free() */
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
 #include "threads.h"
index 5cd526b..3c68f48 100644 (file)
@@ -33,7 +33,6 @@
 #include <sys/param.h>                                    /* for MAXPATHLEN */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"
 #include "intf_msg.h"
 #include "threads.h"
index e00c640..52bb8dc 100644 (file)
@@ -2,7 +2,7 @@
  * macosx.c : MacOS X plugin for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: macosx.c,v 1.8 2001/11/29 15:56:37 massiot Exp $
+ * $Id: macosx.c,v 1.9 2001/12/09 17:01:36 sam Exp $
  *
  * Authors: Colin Delacroix <colin@zoy.org>
  *          Eugenio Jarosiewicz <ej0@cise.ufl.edu>
@@ -34,7 +34,6 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
-#include "config.h"
 #include "common.h"                                     /* boolean_t, byte_t */
 #include "intf_msg.h"
 #include "threads.h"
diff --git a/plugins/mad/.cvsignore b/plugins/mad/.cvsignore
new file mode 100644 (file)
index 0000000..63e7180
--- /dev/null
@@ -0,0 +1 @@
+.dep
diff --git a/plugins/mad/API b/plugins/mad/API
new file mode 100644 (file)
index 0000000..83a8731
--- /dev/null
@@ -0,0 +1,262 @@
+MAD API documentation collected from e-mails of Joe Drew and Rob Leslie.
+The original e-mails can be found in the docs directory. They contain the
+same information as is presented below.
+
+INDEX
+======
+1. I/O Synchronous Mode
+2. Low-level API
+
+
+
+1. I/O SYNCHRONOUS MODE (extract from Joe Drew)
+===============================================
+MAD operates with callbacks for functions. Each of these functions is
+expected to return type enum mad_flow; this allows you to control the
+decoding process.
+
+MAD always outputs 32-bit (well, mad_fixed_t) little-endian data. Take
+this into account when outputting samples to the sound card.
+Related to the above, since MAD outputs type mad_fixed_t, unless you can
+output with 32-bit accuracy (most sound cards can't), you will have to
+quantize, round, dither, etc these samples to 16-bit (or whatever you
+need.) While there is a sample routine in minimad.c, if you want good
+quality you'll either want to roll your own or take a look in madplay's
+sources.
+
+Integral to understanding MAD: MAD is a decoding library only. You
+handle input and output; you're responsible for fast-forwarding and
+rewinding, if you want that type of functionality. All that MAD will do
+is take input from you, decode the MPEG frames, give you some
+information about them, and give you the decoded PCM data.
+
+Now, the nitty-gritty information.
+
+First, you need a mad_decoder struct. This holds all information about
+how you want your stream decoded, such as input/output functions, error
+handling functions, etc.
+
+mad_decoder_init() sets this structure up for you.
+
+struct mad_decoder decoder;
+struct my_playbuf playbuf;
+
+mad_decoder_init(&decoder, &playbuf, input_func, header_func, /*filter*/
+0, output_func, /*error*/ 0, /* message */ 0);
+
+In this example, the function called to get more data is set to
+input_func, the function called after MPEG headers have been decoded is
+header_func, the function called after all sound data has been decoded
+to PCM (for output) is output_func, and the filter, error, and message
+functions are unset.
+
+Now, MAD runs in a constant decoding loop. It runs something along the
+following lines:
+
+if I'm out of data
+       call input_func
+if input_func says there's no more data,
+       quit
+decode the header and call header_func
+decode the mpeg audio data
+call the filter function
+call the output function
+loop
+
+Now, this is an oversimplification obviously. The important thing to
+realise is that at every step of the process you can tell MAD what to
+do.
+
+Since all of these functions return enum mad_flow, you can tell MAD to
+do any of the following:
+
+enum mad_flow {
+  MAD_FLOW_CONTINUE = 0x0000, /* Keep decoding this stream */
+  MAD_FLOW_STOP     = 0x0010, /* Stop decoding this stream, but exit
+                                normally */
+  MAD_FLOW_BREAK    = 0x0011, /* Stop decoding this stream, and exit
+                                 with an error */
+  MAD_FLOW_IGNORE   = 0x0020  /* Don't decode this frame,
+                                but continue afterwards */
+};
+
+Most of the time you'll probably want to return MAD_FLOW_CONTINUE. In
+every case, you'll have to return one of these values from the functions
+you define.
+
+This is the definition of each of the functions:
+
+enum mad_flow (*input_func)(void *, struct mad_stream *);
+enum mad_flow (*header_func)(void *, struct mad_header const *);
+enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct
+mad_frame *);
+enum mad_flow (*output_func)(void *, struct mad_header const *, struct
+mad_pcm *);
+enum mad_flow (*error_func)(void *, struct mad_stream *, struct
+mad_frame *);
+enum mad_flow (*message_func)(void *, void *, unsigned int *);
+
+In each of these functions the void* pointer passed to the function is
+your "playbuf" structure. This can hold whatever you want - for example,
+song title, length, number of frames - just remember to re-cast it to
+the type you've defined.
+
+input_func takes a mad_stream pointer. Most of the time what you'll want
+to do is something along the lines of the following:
+
+if (more_data_available)
+  buffer = refill_buffer();
+  mad_stream_buffer(stream, buffer, length_of_buffer);
+  return MAD_FLOW_CONTINUE;
+else
+  return MAD_FLOW_STOP;
+
+(On many systems you'll want to use mmap() for this.)
+
+header_func takes a mad_header pointer. This contains most of the
+important information about a given frame; in constant bitrate files, it
+can contain most of the important information about the stream. It will
+give you the length of that frame, using mad_timer_t; the audio layer;
+extension; bitrate... the list is long. Read frame.h or mad.h in the
+frame.h area for more information.
+Again, return MAD_FLOW_{CONTINUE,STOP,BREAK} depending on outside
+conditions.
+
+The only other function I have firsthand information on is output_func;
+in this case, you are given a pointer to struct mad_pcm. This gives you
+the sampling rate, number of channels, and number of samples per
+channel; doing something like the following should work:
+
+mad_fixed_t *left_channel = pcm->samples[0], *right_channel =
+pcm->samples[1];
+int nsamples = pcm->length;
+signed int sample;
+unsigned char * buffer = some_buffer;
+unsigned char * ptr = buffer;
+
+while (nsamples--)
+{
+            sample = (signed int) do_downsample(*left_ch++)
+
+            *ptr++ = (unsigned char) (sample >> 0);
+            *ptr++ = (unsigned char) (sample >> 8);
+
+            sample = (signed int) do_downsample(*right_ch++)
+
+            *ptr++ = (unsigned char) (sample >> 0);
+            *ptr++ = (unsigned char) (sample >> 8);
+}
+
+output buffer to device.
+
+Be sure to handle the big-endian case (autoconf can test for this), and
+also the mono (1 channel) case. See mad.c in mpg321, at the end of the
+file, for an example.
+
+Information on the other (error, filter, message) functions would be
+appreciated, though I think in knowing this information anyone should be
+able to puzzle it out.
+
+Now that the decoder is set up with all these callback functions, you
+call
+
+mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);
+
+and then
+
+mad_decoder_finish(&decoder);
+
+Once you've called mad_decoder_finish, you can re-use the decoder
+struct, if you're, for example, within a playlist. Incidentally, all MAD
+structures have similar mad_(whatever)_init and mad_(whatever)_finish
+functions.
+
+I hope this helps people get their feet wet with MAD. Read the source,
+and particularly mad.h - there are a lot of things there you might not
+expect. Rob has done a good job in making MAD a complete solution. :)
+
+
+2. LOW-LEVEL API (extract from Rob Leslie)
+==========================================
+
+By way of clarification, MAD also has a low-level API which does not use
+callbacks. You can control the entire decoding process yourself more or less
+as follows:
+
+  /* load buffer with your MPEG audio data */
+
+  mad_stream_buffer(&stream, buffer, buflen);
+
+  while (1) {
+    mad_frame_decode(&frame, &stream);
+    mad_synth_frame(&synth, &frame);
+
+    /* output PCM samples in synth.pcm */
+  }
+
+This is vastly simplified, but it shows the general idea. mad_frame_decode()
+decodes the next frame's header and subband samples. mad_synth_frame() takes
+those subband samples and synthesizes PCM samples.
+
+It is also possible to call mad_header_decode() before mad_frame_decode().
+This just gives you the frame's header info, in case that's all you want, or
+perhaps to help you decide whether you want to decode the rest of the frame.
+
+As Joe mentions, each of the stream, frame, and synth structs needs to be
+initialized and "finished" before and after use:
+
+  struct mad_stream stream;
+  struct mad_frame frame;
+  struct mad_synth synth;
+
+  mad_stream_init(&stream);
+  mad_frame_init(&frame);
+  mad_synth_init(&synth);
+
+  /* ... */
+
+  mad_synth_finish(&synth);
+  mad_frame_finish(&frame);
+  mad_stream_finish(&stream);
+
+You can work with just a struct mad_header instead of a struct mad_frame if
+you only want to decode frame headers.
+
+Joe writes:
+> MAD always outputs 32-bit (well, mad_fixed_t) little-endian data. Take
+> this into account when outputting samples to the sound card.
+
+This isn't quite right: the mad_fixed_t type is not necessarily little-endian.
+It's the same endianness as the native integer types. Also, it's only
+guaranteed to be *at least* 32 bits wide.
+
+The fixed-point sample format is important to understand, and I recommend
+reading the comments in libmad/fixed.h. The thing to remember when converting
+MAD's fixed-point integer samples to 16-bit PCM (or whatever) is that MAD
+encodes samples as numbers in the full-scale range [-1.0, +1.0) where the
+binary point is placed 28 (MAD_F_FRACBITS) bits to the left of the integer.
+However, you need to be prepared to handle clipping as some numbers may be
+less than -1.0 (-MAD_F_ONE) or greater than or equal to +1.0 (MAD_F_ONE, aka
+1 << MAD_F_FRACBITS).
+
+> Information on the other (error, filter, message) functions would be
+> appreciated, though I think in knowing this information anyone should be
+> able to puzzle it out.
+
+In the high-level API, the error callback function is called whenever a
+decoding error occurs. The error number is in stream->error.
+
+The filter callback function is called after decoding a frame, but before
+synthesis. Here it is possible to modify the frame's subband samples, for
+example to perform a uniform attenuation/amplification, or to do other special
+processing in the frequency domain.
+
+The message callback function is only used with MAD_DECODER_MODE_ASYNC, and is
+called whenever the parent process sends a message via mad_decoder_message().
+This callback can generate a reply by overwriting the message buffer that is
+passed to it. (The size of the reply must be the same or smaller than the
+message.)
+
+
+
+
diff --git a/plugins/mad/BUGS b/plugins/mad/BUGS
new file mode 100644 (file)
index 0000000..0a9f74c
--- /dev/null
@@ -0,0 +1,20 @@
+bug #09/11/2001-1: (FIXED 20/11/2001, by JP Saman)
+       Makefile.opts.in and Makefile.opts static libmad.a library is not filled in automatically by configure.
+       It should say in Makefile.opts LIB_MAD=lib/libmad.a
+
+bug #09/11/2001-2:
+       libmad/mad.h is not created automatically. Fix compile step and dependencies for mad_adec to automatically
+       configure and or build libmad when not build yet. This means integration of configure.in scripts.
+
+bug #12/11/2001-1 (WORKING, by JP Saman)
+       smoothen out audio in libmad_output callback function, by optimizing conversion routines. After investigation
+       and experimenting I found out that my input routine and output routine were not balanced correctly with
+       respect to buffer sizes. A lot of data got lost. I fixed that, but still need a bater scaling/smoothing routine
+       for the audio.
+
+bug #20/11/2001-1 (FIXED 25/11/2001, by JP Saman)
+       synchronization between audio and video output is lost. In libmad_output a timestamp is set on the audio data, but
+       it points to a later video frame, then when the audio data was read. How can I set the correct timestamp on the
+        audio fifo at the time it was read from the bitstream, so that it matches the video frame it belongs to?
+        Solution: Do it in two steps, in the input function save i_pts of fifo and in output function pass saved i_pts to
+        aout_fifo.
diff --git a/plugins/mad/DESIGN b/plugins/mad/DESIGN
new file mode 100644 (file)
index 0000000..c3790ca
--- /dev/null
@@ -0,0 +1,60 @@
+File:  Plugin mad for vlc is based upon libmad from the mad distribution.
+Author: Jean-Paul Saman <jpsaman@wxs.nl>
+
+Directories:
+============
+vlc/                   : adapted config.in and Makefile
+                       : added libtool, ltmain.sh and ltconfig
+vlc/plugins/mad                : mad audio decoder plugin for vlc
+
+Interface functions to implement in mad plugin are:
+=========
+adec_mad_Probe
+adec_mad_Run
+adec_mad_Init
+adec_mad_ErrorThread
+adec_mad_EndThread
+
+libmad_input
+libmad_output
+libmad_header
+libmad_messages
+
+Design: (ASCII art)
+=======
+It represents the function call flow viewed from the vlc main program. The main program is in charge of allocating decoders,
+initializing, starting and stopping them.
+
+      ---------------  
+      |  <library>  |
+      |   libmad    |
+      ---------------
+            ^
+            |
+      ---------------          
+      |   <plugin>  |
+      |     mad     |
+      _______________
+            ^
+            |
+      ________________________
+      |  <decoder interface> |
+      | vlc plugin interface |
+      ________________________
+
+
+Interface view:
+===============
+                                   [mad decoder plugin]
+                                  ----------------------
+       vlc decoder interface -> | mad_adec     mad_libmad | -> libmad
+                                  -----------------------
+
+Rationel:
+Keeping libmad as a separate library, either dynamic or statically linked in, makes maintenance so much simpeler.
+Merging with a new libmad version should be straight forward as long as the interface stays stable.
+There is another benefit: Disk (actually flash ROM) resources and memory are very limited on a iPaq.
+Other programs or utilities like madplay and BBplay can make use of the same libmad version we do. In this way
+limiting the needed storage place on disk (flash ROM). Also this is only possible when the interface stays the same.
+
+
diff --git a/plugins/mad/Makefile b/plugins/mad/Makefile
new file mode 100644 (file)
index 0000000..b63ed76
--- /dev/null
@@ -0,0 +1,37 @@
+###############################################################################
+# vlc (VideoLAN Client) MAD audio decoder module makefile
+# (c)2001 VideoLAN
+###############################################################################
+
+#
+# Objects
+#
+PLUGIN_MAD = mad_adec.o mad_libmad.o
+BUILTIN_MAD = $(PLUGIN_MAD:%.o=BUILTIN_%.o)
+
+ALL_OBJ = $(PLUGIN_MAD) $(BUILTIN_MAD)
+#
+# Virtual targets
+#
+
+include ../../Makefile.modules
+
+$(PLUGIN_MAD): %.o: .dep/%.d
+$(PLUGIN_MAD): %.o: %.c
+       $(CC) $(CFLAGS) $(PCFLAGS) $(CFLAGS_MAD) -DPLUGIN -c -o $@ $<
+
+$(BUILTIN_MAD): BUILTIN_%.o: .dep/%.d
+$(BUILTIN_MAD): BUILTIN_%.o: %.c
+       $(CC) $(CFLAGS) $(CFLAGS_MAD) -DBUILTIN -c -o $@ $<
+
+#
+# Real targets
+#
+
+../mad.so: $(PLUGIN_MAD)
+       $(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_MAD)
+
+../mad.a: $(BUILTIN_MAD)
+       ar r $@ $^
+       $(RANLIB) $@
+
diff --git a/plugins/mad/TODO b/plugins/mad/TODO
new file mode 100644 (file)
index 0000000..a586971
--- /dev/null
@@ -0,0 +1,47 @@
+TODO: (Jean-Paul Saman <jpsaman@wxs.nl>)
+
+[1 - 30 October 2001, done]
+introduce libmad in vlc-dev code tree, this includes:
+       configure from top level of source tree
+       compilable from top level of source tree
+
+[2 - 25 November 2001, done]
+creating basic mad plugin in vlc-dev code tree, this include:
+       writing most simple vlc-plugin (no fancy stuf)
+       configurable from top level of source tree
+       compilable from top level of source tree
+
+[3 - 25 November 2001, done]
+test basic mad plugin 
+       native Intel
+       native iPaq
+
+[4 - 26 November 2001, working]
+commit to current vlc-dev tree in CVS at VideoLan 
+       fix broken things and conflicts
+       run tests again (see [3])
+       
+[5 - all ready done by Christophe Massiot]
+make cross-compile possible for vlc without interface. With interface it is to damn difficult to do cross-compilation.
+
+[6 - ]
+extending mad plugin with more features
+       do fancy stuff (enable MP3 decoding)
+
+[7 - ]
+test extended plugin 
+       native Intel
+       native iPaq
+       cross-compile iPaq
+
+[8 - ]
+commit to current vlc-dev tree in CVS at Videolan
+       fix broken things and conflicts
+       run tests again (see [7])
+[9 - ]
+incorporate new libmad version if possible
+       see 1
+       see 7
+       see 8
+
diff --git a/plugins/mad/docs/joe_drew.txt b/plugins/mad/docs/joe_drew.txt
new file mode 100644 (file)
index 0000000..97dbab9
--- /dev/null
@@ -0,0 +1,174 @@
+Subject: [mad-dev] Some information about programming with MAD (in synchronous mode)
+
+As the author of mpg321, I too faced the problem of MAD not being
+documented. However, in looking at minimad.c, and re-writing mpg321 to
+use MAD, I came to understand it better. Here's some information which
+will help anybody start out with MAD:
+
+First, some basic information.
+MAD operates with callbacks for functions. Each of these functions is
+expected to return type enum mad_flow; this allows you to control the
+decoding process.
+MAD always outputs 32-bit (well, mad_fixed_t) little-endian data. Take
+this into account when outputting samples to the sound card.
+Related to the above, since MAD outputs type mad_fixed_t, unless you can
+output with 32-bit accuracy (most sound cards can't), you will have to
+quantize, round, dither, etc these samples to 16-bit (or whatever you
+need.) While there is a sample routine in minimad.c, if you want good
+quality you'll either want to roll your own or take a look in madplay's
+sources.
+Integral to understanding MAD: MAD is a decoding library only. You
+handle input and output; you're responsible for fast-forwarding and
+rewinding, if you want that type of functionality. All that MAD will do
+is take input from you, decode the MPEG frames, give you some
+information about them, and give you the decoded PCM data.
+
+Now, the nitty-gritty information.
+
+First, you need a mad_decoder struct. This holds all information about
+how you want your stream decoded, such as input/output functions, error
+handling functions, etc.
+
+mad_decoder_init() sets this structure up for you.
+
+struct mad_decoder decoder;
+struct my_playbuf playbuf;
+
+mad_decoder_init(&decoder, &playbuf, input_func, header_func, /*filter*/
+0, output_func, /*error*/ 0, /* message */ 0);
+
+In this example, the function called to get more data is set to
+input_func, the function called after MPEG headers have been decoded is
+header_func, the function called after all sound data has been decoded
+to PCM (for output) is output_func, and the filter, error, and message
+functions are unset.
+
+Now, MAD runs in a constant decoding loop. It runs something along the
+following lines:
+
+if I'm out of data
+       call input_func
+if input_func says there's no more data,
+       quit
+decode the header and call header_func
+decode the mpeg audio data
+call the filter function
+call the output function
+loop
+
+Now, this is an oversimplification obviously. The important thing to
+realise is that at every step of the process you can tell MAD what to
+do.
+
+Since all of these functions return enum mad_flow, you can tell MAD to
+do any of the following:
+
+enum mad_flow {
+  MAD_FLOW_CONTINUE = 0x0000, /* Keep decoding this stream */
+  MAD_FLOW_STOP     = 0x0010, /* Stop decoding this stream, but exit
+                                normally */
+  MAD_FLOW_BREAK    = 0x0011, /* Stop decoding this stream, and exit
+                                 with an error */
+  MAD_FLOW_IGNORE   = 0x0020  /* Don't decode this frame, 
+                                but continue afterwards */
+};
+
+Most of the time you'll probably want to return MAD_FLOW_CONTINUE. In
+every case, you'll have to return one of these values from the functions
+you define.
+
+This is the definition of each of the functions:
+
+enum mad_flow (*input_func)(void *, struct mad_stream *);
+enum mad_flow (*header_func)(void *, struct mad_header const *);
+enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct
+mad_frame *);
+enum mad_flow (*output_func)(void *, struct mad_header const *, struct
+mad_pcm *);
+enum mad_flow (*error_func)(void *, struct mad_stream *, struct
+mad_frame *);
+enum mad_flow (*message_func)(void *, void *, unsigned int *);
+
+In each of these functions the void* pointer passed to the function is
+your "playbuf" structure. This can hold whatever you want - for example,
+song title, length, number of frames - just remember to re-cast it to
+the type you've defined.
+
+input_func takes a mad_stream pointer. Most of the time what you'll want
+to do is something along the lines of the following:
+
+if (more_data_available)
+  buffer = refill_buffer();
+  mad_stream_buffer(stream, buffer, length_of_buffer);
+  return MAD_FLOW_CONTINUE;
+else
+  return MAD_FLOW_STOP;
+
+(On many systems you'll want to use mmap() for this.)
+
+header_func takes a mad_header pointer. This contains most of the
+important information about a given frame; in constant bitrate files, it
+can contain most of the important information about the stream. It will
+give you the length of that frame, using mad_timer_t; the audio layer;
+extension; bitrate... the list is long. Read frame.h or mad.h in the
+frame.h area for more information.
+Again, return MAD_FLOW_{CONTINUE,STOP,BREAK} depending on outside
+conditions.
+
+The only other function I have firsthand information on is output_func;
+in this case, you are given a pointer to struct mad_pcm. This gives you
+the sampling rate, number of channels, and number of samples per
+channel; doing something like the following should work:
+
+mad_fixed_t *left_channel = pcm->samples[0], *right_channel =
+pcm->samples[1];
+int nsamples = pcm->length;
+signed int sample;
+unsigned char * buffer = some_buffer;
+unsigned char * ptr = buffer;
+
+while (nsamples--)
+{
+            sample = (signed int) do_downsample(*left_ch++)
+
+            *ptr++ = (unsigned char) (sample >> 0);
+            *ptr++ = (unsigned char) (sample >> 8);
+            
+            sample = (signed int) do_downsample(*right_ch++)
+
+            *ptr++ = (unsigned char) (sample >> 0);
+            *ptr++ = (unsigned char) (sample >> 8);
+}
+
+output buffer to device.
+
+Be sure to handle the big-endian case (autoconf can test for this), and
+also the mono (1 channel) case. See mad.c in mpg321, at the end of the
+file, for an example.
+
+Information on the other (error, filter, message) functions would be
+appreciated, though I think in knowing this information anyone should be
+able to puzzle it out.
+
+Now that the decoder is set up with all these callback functions, you
+call 
+
+mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);
+
+and then
+
+mad_decoder_finish(&decoder);
+
+Once you've called mad_decoder_finish, you can re-use the decoder
+struct, if you're, for example, within a playlist. Incidentally, all MAD
+structures have similar mad_(whatever)_init and mad_(whatever)_finish
+functions.
+
+I hope this helps people get their feet wet with MAD. Read the source,
+and particularly mad.h - there are a lot of things there you might not
+expect. Rob has done a good job in making MAD a complete solution. :)
+
+-- 
+Joe Drew <hoserhead@woot.net> <drew@debian.org>
+
+Please encrypt email sent to me.
diff --git a/plugins/mad/docs/rob_leslie.txt b/plugins/mad/docs/rob_leslie.txt
new file mode 100644 (file)
index 0000000..fbe49e4
--- /dev/null
@@ -0,0 +1,124 @@
+From - Mon Nov  5 09:19:09 2001
+Return-Path: <mad-dev-admin@lists.mars.org>
+Received: from smtp01.wxs.nl ([195.121.5.15]) by po05.wxs.nl
+          (Netscape Messaging Server 4.15) with ESMTP id GLLMFJ00.3DF for
+          <jpsaman@wxs.nl>; Mon, 22 Oct 2001 10:33:19 +0200 
+Received: from surveyor.mars.org ([216.98.134.66]) by
+          smtp01.wxs.nl (Netscape Messaging Server 4.15) with ESMTP id
+          GLLMFZ00.C2Z for <jpsaman@wxs.nl>; Mon, 22 Oct 2001 10:33:35 +0200 
+Received: from surveyor.mars.org (localhost [127.0.0.1])
+       by surveyor.mars.org (8.9.3/8.9.3/Debian 8.9.3-21) with ESMTP id BAA07654;
+       Mon, 22 Oct 2001 01:32:07 -0700
+Received: from mars.org (localhost [127.0.0.1])
+       by surveyor.mars.org (8.9.3/8.9.3/Debian 8.9.3-21) with ESMTP id BAA07629
+       for <mad-dev@lists.mars.org>; Mon, 22 Oct 2001 01:31:30 -0700
+Message-Id: <200110220831.BAA07629@surveyor.mars.org>
+X-Authentication-Warning: surveyor.mars.org: Host localhost [127.0.0.1] claimed to be mars.org
+From: Rob Leslie <rob@mars.org>
+To: mad-dev@lists.mars.org
+Subject: Re: [mad-dev] Some information about programming with MAD (in synchronous mode)
+In-reply-to: Your message of "21 Oct 2001 16:13:19 EDT."
+       <1003695199.24019.56.camel@pisces>
+Mime-Version: 1.0 (generated by tm-edit 7.106)
+Content-Type: text/plain; charset=US-ASCII
+Sender: mad-dev-admin@lists.mars.org
+Errors-To: mad-dev-admin@lists.mars.org
+X-BeenThere: mad-dev@lists.mars.org
+X-Mailman-Version: 2.0.1
+Precedence: bulk
+List-Help: <mailto:mad-dev-request@lists.mars.org?subject=help>
+List-Post: <mailto:mad-dev@lists.mars.org>
+List-Subscribe: <http://www.mars.org/bin/mailman/listinfo/mad-dev>,
+       <mailto:mad-dev-request@lists.mars.org?subject=subscribe>
+List-Id: MAD developer's mailing list <mad-dev.lists.mars.org>
+List-Unsubscribe: <http://www.mars.org/bin/mailman/listinfo/mad-dev>,
+       <mailto:mad-dev-request@lists.mars.org?subject=unsubscribe>
+List-Archive: <http://www.mars.org/mailman/public/mad-dev/>
+Date: Mon, 22 Oct 2001 01:31:30 -0700
+X-Mozilla-Status: 8011
+X-Mozilla-Status2: 00000000
+X-UIDL: 1879-1001307689
+
+Joe Drew wrote some good info on the MAD high-level API that I hope will be
+helpful to others.
+
+By way of clarification, MAD also has a low-level API which does not use
+callbacks. You can control the entire decoding process yourself more or less
+as follows:
+
+  /* load buffer with your MPEG audio data */
+
+  mad_stream_buffer(&stream, buffer, buflen);
+
+  while (1) {
+    mad_frame_decode(&frame, &stream);
+    mad_synth_frame(&synth, &frame);
+
+    /* output PCM samples in synth.pcm */
+  }
+
+This is vastly simplified, but it shows the general idea. mad_frame_decode()
+decodes the next frame's header and subband samples. mad_synth_frame() takes
+those subband samples and synthesizes PCM samples.
+
+It is also possible to call mad_header_decode() before mad_frame_decode().
+This just gives you the frame's header info, in case that's all you want, or
+perhaps to help you decide whether you want to decode the rest of the frame.
+
+As Joe mentions, each of the stream, frame, and synth structs needs to be
+initialized and "finished" before and after use:
+
+  struct mad_stream stream;
+  struct mad_frame frame;
+  struct mad_synth synth;
+
+  mad_stream_init(&stream);
+  mad_frame_init(&frame);
+  mad_synth_init(&synth);
+
+  /* ... */
+
+  mad_synth_finish(&synth);
+  mad_frame_finish(&frame);
+  mad_stream_finish(&stream);
+
+You can work with just a struct mad_header instead of a struct mad_frame if
+you only want to decode frame headers.
+
+Joe writes:
+> MAD always outputs 32-bit (well, mad_fixed_t) little-endian data. Take
+> this into account when outputting samples to the sound card.
+
+This isn't quite right: the mad_fixed_t type is not necessarily little-endian.
+It's the same endianness as the native integer types. Also, it's only
+guaranteed to be *at least* 32 bits wide.
+
+The fixed-point sample format is important to understand, and I recommend
+reading the comments in libmad/fixed.h. The thing to remember when converting
+MAD's fixed-point integer samples to 16-bit PCM (or whatever) is that MAD
+encodes samples as numbers in the full-scale range [-1.0, +1.0) where the
+binary point is placed 28 (MAD_F_FRACBITS) bits to the left of the integer.
+However, you need to be prepared to handle clipping as some numbers may be
+less than -1.0 (-MAD_F_ONE) or greater than or equal to +1.0 (MAD_F_ONE, aka
+1 << MAD_F_FRACBITS).
+
+> Information on the other (error, filter, message) functions would be
+> appreciated, though I think in knowing this information anyone should be
+> able to puzzle it out.
+
+In the high-level API, the error callback function is called whenever a
+decoding error occurs. The error number is in stream->error.
+
+The filter callback function is called after decoding a frame, but before
+synthesis. Here it is possible to modify the frame's subband samples, for
+example to perform a uniform attenuation/amplification, or to do other special
+processing in the frequency domain.
+
+The message callback function is only used with MAD_DECODER_MODE_ASYNC, and is
+called whenever the parent process sends a message via mad_decoder_message().
+This callback can generate a reply by overwriting the message buffer that is
+passed to it. (The size of the reply must be the same or smaller than the
+message.)
+
+Cheers,
+  -rob
diff --git a/plugins/mad/mad_adec.c b/plugins/mad/mad_adec.c
new file mode 100644 (file)
index 0000000..8b3f55a
--- /dev/null
@@ -0,0 +1,285 @@
+/***************************************************************************
+              mad_adec.c  -  description
+                -------------------
+    Plugin Module definition for using libmad audio decoder in vlc. The
+    libmad codec uses integer arithmic only. This makes it suitable for using
+    it on architectures without a hardware FPU unit, such as the StrongArm
+    CPU.
+
+    begin                : Mon Nov 5 2001
+    copyright            : (C) 2001 by Jean-Paul Saman
+    email                : jpsaman@wxs.nl
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#define MODULE_NAME mad
+#include "modules_inner.h"
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include "defs.h"
+
+#include <stdlib.h>                                      /* malloc(), free() */
+#include <string.h>                                              /* strdup() */
+
+#include "common.h"                                     /* boolean_t, byte_t */
+#include "intf_msg.h"
+#include "threads.h"
+#include "mtime.h"
+#include "tests.h"
+
+#include "audio_output.h"
+
+#include "modules.h"
+#include "modules_export.h"
+
+#include "stream_control.h"
+#include "input_ext-dec.h"
+
+#include "debug.h"
+
+/*****************************************************************************
+ * Libmad include files                                                      *
+ *****************************************************************************/
+#include <mad.h>
+#include "mad_adec.h"
+#include "mad_libmad.h"
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static int      mad_adec_Probe       ( probedata_t * );
+static int      mad_adec_Run         ( decoder_config_t * );
+static int      mad_adec_Init        (mad_adec_thread_t * p_mad_adec);
+static void     mad_adec_ErrorThread (mad_adec_thread_t * p_mad_adec);
+static void     mad_adec_EndThread   (mad_adec_thread_t * p_mad_adec);
+
+/*****************************************************************************
+ * Capabilities
+ *****************************************************************************/
+void _M( adec_getfunctions )( function_list_t * p_function_list )
+{
+    p_function_list->pf_probe = mad_adec_Probe;
+    p_function_list->functions.dec.pf_run = mad_adec_Run;
+}
+
+/*****************************************************************************
+ * Build configuration tree.
+ *****************************************************************************/
+MODULE_CONFIG_START
+ADD_WINDOW( "Configuration for mad_adec module" )
+    ADD_COMMENT( "No device to configure." )
+MODULE_CONFIG_STOP
+
+MODULE_INIT_START
+    p_module->i_capabilities = MODULE_CAPABILITY_DEC;
+    p_module->psz_longname = "Libmad MPEG 1/2/3 audio decoder library";
+MODULE_INIT_STOP
+
+MODULE_ACTIVATE_START
+    _M( adec_getfunctions )( &p_module->p_functions->dec );
+MODULE_ACTIVATE_STOP
+
+MODULE_DEACTIVATE_START
+MODULE_DEACTIVATE_STOP
+
+/*****************************************************************************
+ * mad_adec_Probe: probe the decoder and return score
+ *****************************************************************************
+ * Tries to launch a decoder and return score so that the interface is able
+ * to chose.
+ *****************************************************************************/
+static int mad_adec_Probe( probedata_t *p_data )
+{
+    if( p_data->i_type == MPEG1_AUDIO_ES || p_data->i_type == MPEG2_AUDIO_ES )
+    {
+        if( TestMethod( ADEC_MPEG_VAR, "mad" ) )
+        {
+            return( 999 );
+        }
+        return( 50 );
+    }
+    else
+    {
+        return( 0 );
+    }
+}
+
+/*****************************************************************************
+ * mad_adec_Run: this function is called just after the thread is created
+ *****************************************************************************/
+static int mad_adec_Run ( decoder_config_t * p_config )
+{
+    mad_adec_thread_t *   p_mad_adec;
+
+    intf_ErrMsg( "mad_adec debug: mad_adec thread launched, initializing" );
+
+    /* Allocate the memory needed to store the thread's structure */
+    p_mad_adec = (mad_adec_thread_t *) malloc(sizeof(mad_adec_thread_t));
+
+    if (p_mad_adec == NULL)
+    {
+        intf_ErrMsg ( "mad_adec error: not enough memory "
+                      "for mad_adec_Run() to allocate p_mad_adec" );
+        return( -1 );
+    }
+
+    /*
+     * Initialize the thread properties
+     */
+    p_mad_adec->p_config = p_config;
+    p_mad_adec->p_fifo = p_mad_adec->p_config->p_decoder_fifo;
+    if( mad_adec_Init( p_mad_adec ) )
+    {
+        intf_ErrMsg( "mad_adec error: could not initialize thread" );
+        return( -1 );
+    }
+
+    /* mad decoder thread's main loop */
+    while ((!p_mad_adec->p_fifo->b_die) && (!p_mad_adec->p_fifo->b_error))
+    {
+       intf_ErrMsg( "mad_adec: starting libmad decoder" );
+       if (mad_decoder_run(p_mad_adec->libmad_decoder, MAD_DECODER_MODE_SYNC)==-1)
+       {
+         intf_ErrMsg( "mad_adec error: libmad decoder returns abnormally");
+         mad_adec_EndThread(p_mad_adec);
+         return( -1 );
+       }
+    }
+
+    /* If b_error is set, the mad decoder thread enters the error loop */
+    if (p_mad_adec->p_fifo->b_error)
+    {
+        mad_adec_ErrorThread (p_mad_adec);
+    }
+
+    /* End of the ac3 decoder thread */
+    mad_adec_EndThread (p_mad_adec);
+
+    return( 0 );
+}
+
+/*****************************************************************************
+ * mad_adec_Init: initialize data before entering main loop
+ *****************************************************************************/
+static int mad_adec_Init( mad_adec_thread_t * p_mad_adec )
+{
+    /*
+     * Properties of audio for libmad
+     */
+       
+    /* Initialize the libmad decoder structures */
+    p_mad_adec->libmad_decoder = (struct mad_decoder*) malloc(sizeof(struct mad_decoder));
+
+    /*
+     * Initialize bit stream
+     */
+    p_mad_adec->p_config->pf_init_bit_stream( &p_mad_adec->bit_stream,
+                                             p_mad_adec->p_config->p_decoder_fifo,
+                                             NULL,    /* pf_bitstream_callback */
+                                             NULL );  /* void **/
+
+    RealignBits( &p_mad_adec->bit_stream );
+
+    mad_decoder_init( p_mad_adec->libmad_decoder,
+                     p_mad_adec,       /* vlc's thread structure and p_fifo playbuffer */
+                     libmad_input,     /* input_func */
+                     libmad_header,    /* header_func */
+                     0,                /* filter */
+                     libmad_output,    /* output_func */
+                     0,        /* error */
+                     0);               /* message */
+
+    mad_decoder_options(p_mad_adec->libmad_decoder, MAD_OPTION_IGNORECRC);
+       
+    /*
+     * Initialize the output properties
+     */
+
+    /* Creating the audio output fifo */
+    p_mad_adec->p_aout_fifo = aout_CreateFifo(  AOUT_ADEC_STEREO_FIFO, /* fifo type */
+                                               2,                     /* nr. of channels */
+                                               48000,                 /* frame rate in Hz ?*/
+                                               0,                     /* units */
+                                                ADEC_FRAME_SIZE/2,     /* frame size */
+                                               NULL  );               /* buffer */
+
+    if ( p_mad_adec->p_aout_fifo == NULL )
+    {
+        return( -1 );
+    }
+
+    intf_ErrMsg("mad_adec debug: mad decoder thread %p initialized", p_mad_adec);
+
+    return( 0 );
+}
+
+
+/*****************************************************************************
+ * mad_adec_ErrorThread : mad decoder's RunThread() error loop
+ *****************************************************************************/
+static void mad_adec_ErrorThread (mad_adec_thread_t * p_mad_adec)
+{
+    /* We take the lock, because we are going to read/write the start/end
+     * indexes of the decoder fifo */
+    vlc_mutex_lock (&p_mad_adec->p_fifo->data_lock);
+
+    /* Wait until a `die' order is sent */
+    while (!p_mad_adec->p_fifo->b_die)
+    {
+        /* Trash all received PES packets */
+        while (!DECODER_FIFO_ISEMPTY(*p_mad_adec->p_fifo))
+        {
+            p_mad_adec->p_fifo->pf_delete_pes(
+                    p_mad_adec->p_fifo->p_packets_mgt,
+                    DECODER_FIFO_START(*p_mad_adec->p_fifo));
+            DECODER_FIFO_INCSTART (*p_mad_adec->p_fifo);
+        }
+
+        /* Waiting for the input thread to put new PES packets in the fifo */
+        vlc_cond_wait (&p_mad_adec->p_fifo->data_wait,
+                       &p_mad_adec->p_fifo->data_lock);
+    }
+
+    /* We can release the lock before leaving */
+    vlc_mutex_unlock (&p_mad_adec->p_fifo->data_lock);
+}
+
+/*****************************************************************************
+ * mad_adec_EndThread : libmad decoder thread destruction
+ *****************************************************************************/
+static void mad_adec_EndThread (mad_adec_thread_t * p_mad_adec)
+{
+    intf_ErrMsg ("mad_adec debug: destroying mad decoder thread %p", p_mad_adec);
+
+    /* If the audio output fifo was created, we destroy it */
+    if (p_mad_adec->p_aout_fifo != NULL)
+    {
+        aout_DestroyFifo (p_mad_adec->p_aout_fifo);
+
+        /* Make sure the output thread leaves the NextFrame() function */
+        vlc_mutex_lock (&(p_mad_adec->p_aout_fifo->data_lock));
+        vlc_cond_signal (&(p_mad_adec->p_aout_fifo->data_wait));
+        vlc_mutex_unlock (&(p_mad_adec->p_aout_fifo->data_lock));
+    }
+
+    /* mad_decoder_finish releases the memory allocated inside the struct */
+    mad_decoder_finish( p_mad_adec->libmad_decoder );
+
+    /* Unlock the modules */
+    free( p_mad_adec->libmad_decoder );
+//    free( p_mad_adec->p_config ); /* for now a reminder until integration with cvs */
+    free( p_mad_adec );
+
+    intf_ErrMsg ("mad_adec debug: mad decoder thread %p destroyed", p_mad_adec);
+}
+
diff --git a/plugins/mad/mad_adec.h b/plugins/mad/mad_adec.h
new file mode 100644 (file)
index 0000000..b1639b8
--- /dev/null
@@ -0,0 +1,61 @@
+/***************************************************************************
+             mad_adec.h  -  description
+                -------------------
+    begin                : Mon Nov 5 2001
+    copyright            : (C) 2001 by Jean-Paul Saman
+    email                : jpsaman@wxs.nl
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef _VLC_MAD_ADEC_H_
+#define _VLC_MAD_ADEC_H_
+/*****************************************************************************
+ * mad_adec_thread_t : mad decoder thread descriptor
+ *****************************************************************************/
+
+// FIXME: Ugly define inside a decoder
+#define ADEC_FRAME_SIZE (4*1152)
+
+typedef struct mad_adec_thread_s
+{
+    /*
+     * Decoder properties
+     */
+    struct mad_decoder *libmad_decoder;
+
+    /*
+     * Thread properties
+     */
+    vlc_thread_t        thread_id;                /* id for thread functions */
+
+    /*
+     * Input properties
+     */
+    decoder_fifo_t *    p_fifo;                /* stores the PES stream data */
+    /* The bit stream structure handles the PES stream at the bit level */
+    bit_stream_t        bit_stream;
+    decoder_config_t *  p_config;
+    /* Store i_pts for syncing audio frames */
+    mtime_t            i_pts_save;
+
+    /*
+     * Output properties
+     */
+    aout_fifo_t *       p_aout_fifo; /* stores the decompressed audio frames */
+
+} mad_adec_thread_t;
+
+/*****************************************************************************
+ * Prototypes
+ *****************************************************************************/
+vlc_thread_t            mad_adec_CreateThread( decoder_config_t * p_config );
+
+#endif
diff --git a/plugins/mad/mad_libmad.c b/plugins/mad/mad_libmad.c
new file mode 100644 (file)
index 0000000..a63fa92
--- /dev/null
@@ -0,0 +1,392 @@
+/***************************************************************************
+           mad_libmad.c  -  description
+               -------------------
+    Functions that are called by libmad to communicate with vlc decoder
+    infrastructure.
+
+    begin                : Mon Nov 5 2001
+    copyright            : (C) 2001 by Jean-Paul Saman
+    email                : jpsaman@wxs.nl
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+
+#include "defs.h"
+
+#include <stdlib.h>                                      /* malloc(), free() */
+#include <string.h>                                              /* strdup() */
+
+#include "common.h"                                     /* boolean_t, byte_t */
+#include "intf_msg.h"
+#include "threads.h"
+#include "mtime.h"
+#include "intf_msg.h"
+
+#include "audio_output.h"
+
+#include "modules.h"
+#include "modules_export.h"
+
+#include "stream_control.h"
+#include "input_ext-dec.h"
+
+#include "debug.h"
+
+/*****************************************************************************
+ * Libmad includes files
+ *****************************************************************************/
+
+#include <mad.h>
+#include "mad_adec.h"
+#include "mad_libmad.h"
+
+/*****************************************************************************
+ * libmad_input: this function is called by libmad when the input buffer needs
+ * to be filled.
+ *****************************************************************************/
+enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream)
+{
+    mad_adec_thread_t *p_mad_adec = (mad_adec_thread_t *) data;
+    byte_t buffer[ADEC_FRAME_SIZE];
+
+    /* Store time stamp of current frame */
+    if ( DECODER_FIFO_START(*p_mad_adec->p_fifo)->i_pts ) {
+         p_mad_adec->i_pts_save = DECODER_FIFO_START(*p_mad_adec->p_fifo)->i_pts;
+         DECODER_FIFO_START(*p_mad_adec->p_fifo)->i_pts = 0;
+    }
+    else {
+         p_mad_adec->i_pts_save = LAST_MDATE;
+    }
+
+    GetChunk( &p_mad_adec->bit_stream, buffer, ADEC_FRAME_SIZE );
+
+    if ( p_mad_adec->p_fifo->b_die == 1 ) {
+        intf_ErrMsg( "mad_adec error: libmad_input stopping libmad decoder" );
+        return MAD_FLOW_STOP;
+    }
+
+    if ( p_mad_adec->p_fifo->b_error == 1 ) {
+        intf_ErrMsg( "mad_adec error: libmad_input ignoring current audio frame" );    
+        return MAD_FLOW_IGNORE;
+    }
+
+    /* the length meant to be in bytes */
+    mad_stream_buffer(p_libmad_stream, (unsigned char*) &buffer, ADEC_FRAME_SIZE );
+
+    return MAD_FLOW_CONTINUE;
+}
+
+/*****************************************************************************
+ * libmad_header: this function is called just after the header of a frame is
+ * decoded
+ *****************************************************************************/
+enum mad_flow libmad_header(void *data, struct mad_header const *p_libmad_header)
+{
+    mad_adec_thread_t *p_mad_adec = (mad_adec_thread_t *) data;
+
+    vlc_mutex_lock (&p_mad_adec->p_aout_fifo->data_lock);
+/*
+    intf_ErrMsg( "mad_adec: libmad_header samplerate %d", p_libmad_header->samplerate);
+       intf_DbgMsg( "mad_adec: libmad_header bitrate %d", p_libmad_header->bitrate);   
+*/
+    p_mad_adec->p_aout_fifo->l_rate = p_libmad_header->samplerate;
+    vlc_cond_signal (&p_mad_adec->p_aout_fifo->data_wait);
+    vlc_mutex_unlock (&p_mad_adec->p_aout_fifo->data_lock);
+
+    return MAD_FLOW_CONTINUE;
+}
+
+/*****************************************************************************
+ * lib_mad_filter: this function is called to filter data of a frame
+ *****************************************************************************/
+/* enum mad_flow libmad_filter(void *data, struct mad_stream const *p_libmad_stream, struct mad_frame *p_libmad_frame)
+ * {
+ *     return MAD_FLOW_CONTINUE;
+ * }
+ */
+
+/*****************************************************************************
+ * support routines borrowed from mpg321 (file: mad.c), which is distributed
+ * under GPL license
+ *
+ * mpg321 was written by Joe Drew <drew@debian.org>, and based upon 'plaympeg'
+ * from the smpeg sources, which was written by various people from Loki Software
+ * (http://www.lokigames.com).
+ *
+ * It also incorporates some source from mad, written by Robert Leslie
+ *****************************************************************************/
+
+/* The following two routines and data structure are from the ever-brilliant
+     Rob Leslie.
+*/
+
+struct audio_dither {
+    mad_fixed_t error[3];
+    mad_fixed_t random;
+};
+
+/*
+* NAME:                prng()
+* DESCRIPTION: 32-bit pseudo-random number generator
+*/
+static __inline__ unsigned long prng(unsigned long state)
+{
+    return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
+}
+
+/*
+* NAME:                audio_linear_dither()
+* DESCRIPTION: generic linear sample quantize and dither routine
+*/
+static __inline__ signed long audio_linear_dither(unsigned int bits, mad_fixed_t sample,
+                                    struct audio_dither *dither)
+{
+    unsigned int scalebits;
+    mad_fixed_t output, mask, random;
+
+    enum {
+        MIN = -MAD_F_ONE,
+        MAX =    MAD_F_ONE - 1
+    };
+
+    /* noise shape */
+    sample += dither->error[0] - dither->error[1] + dither->error[2];
+
+    dither->error[2] = dither->error[1];
+    dither->error[1] = dither->error[0] / 2;
+
+    /* bias */
+    output = sample + (1L << (MAD_F_FRACBITS + 1 - bits - 1));
+
+    scalebits = MAD_F_FRACBITS + 1 - bits;
+    mask = (1L << scalebits) - 1;
+
+    /* dither */
+    random    = prng(dither->random);
+    output += (random & mask) - (dither->random & mask);
+
+    dither->random = random;
+
+    /* clip */
+    if (output > MAX) {
+        output = MAX;
+
+        if (sample > MAX)
+            sample = MAX;
+    }
+    else if (output < MIN) {
+        output = MIN;
+
+        if (sample < MIN)
+            sample = MIN;
+    }
+
+    /* quantize */
+    output &= ~mask;
+
+    /* error feedback */
+    dither->error[0] = sample - output;
+
+    /* scale */
+    return output >> scalebits;
+}
+
+/*****************************************************************************
+ * libmad_ouput: this function is called just after the frame is decoded
+ *****************************************************************************/
+enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header, struct mad_pcm *p_libmad_pcm)
+{
+    mad_adec_thread_t *p_mad_adec= (mad_adec_thread_t *) data;
+    byte_t *buffer=NULL;
+
+    mad_fixed_t const *left_ch = p_libmad_pcm->samples[0], *right_ch = p_libmad_pcm->samples[1];
+    /*
+     * 1152 because that's what mad has as a max; *4 because
+     * there are 4 distinct bytes per sample (in 2 channel case)
+     */
+    static unsigned char stream[ADEC_FRAME_SIZE];
+    register int nsamples = p_libmad_pcm->length;
+    static struct audio_dither dither;
+
+    register char * ptr = stream;
+    register signed int sample;
+
+    /* Set timestamp to synchronize audio and video decoder fifo's */
+    vlc_mutex_lock (&p_mad_adec->p_aout_fifo->data_lock);
+    p_mad_adec->p_aout_fifo->date[p_mad_adec->p_aout_fifo->l_end_frame] = p_mad_adec->i_pts_save;
+
+    buffer = ((byte_t *)p_mad_adec->p_aout_fifo->buffer) + (p_mad_adec->p_aout_fifo->l_end_frame * ADEC_FRAME_SIZE);
+
+    if (p_libmad_pcm->channels == 2)
+    {
+        while (nsamples--)
+        {
+            sample = (signed int) audio_linear_dither(16, *left_ch++, &dither);
+#ifndef WORDS_BIGENDIAN
+            *ptr++ = (unsigned char) (sample >> 0);
+            *ptr++ = (unsigned char) (sample >> 8);
+#else
+            *ptr++ = (unsigned char) (sample >> 8);
+            *ptr++ = (unsigned char) (sample >> 0);
+#endif
+
+            sample = (signed int) audio_linear_dither(16, *right_ch++, &dither);
+#ifndef WORDS_BIGENDIAN
+            *ptr++ = (unsigned char) (sample >> 0);
+            *ptr++ = (unsigned char) (sample >> 8);
+#else
+            *ptr++ = (unsigned char) (sample >> 8);
+            *ptr++ = (unsigned char) (sample >> 0);
+#endif                                         
+        }
+        buffer = memcpy(buffer,stream,p_libmad_pcm->length*4);
+        vlc_cond_signal (&p_mad_adec->p_aout_fifo->data_wait);
+  }
+  else
+  {
+        while (nsamples--)
+        {
+            sample = (signed int) audio_linear_dither(16, *left_ch++, &dither);
+
+#ifndef WORDS_BIGENDIAN
+            *ptr++ = (unsigned char) (sample >> 0);
+            *ptr++ = (unsigned char) (sample >> 8);
+#else
+            *ptr++ = (unsigned char) (sample >> 8);
+            *ptr++ = (unsigned char) (sample >> 0);
+#endif                                 
+        }
+        buffer = memcpy(buffer,stream,p_libmad_pcm->length*2);
+        vlc_cond_signal (&p_mad_adec->p_aout_fifo->data_wait);
+    }
+    vlc_mutex_unlock (&p_mad_adec->p_aout_fifo->data_lock);
+
+    vlc_mutex_lock (&p_mad_adec->p_aout_fifo->data_lock);
+    p_mad_adec->p_aout_fifo->l_end_frame = (p_mad_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
+    vlc_cond_signal (&p_mad_adec->p_aout_fifo->data_wait);
+    vlc_mutex_unlock (&p_mad_adec->p_aout_fifo->data_lock);
+
+    return MAD_FLOW_CONTINUE;
+}
+
+/*****************************************************************************
+ * libmad_error: this function is called when an error occurs during decoding
+ *****************************************************************************/
+enum mad_flow libmad_error(void *data, struct mad_stream *p_libmad_stream, struct mad_frame *p_libmad_frame)
+{
+    enum mad_flow result = MAD_FLOW_CONTINUE;
+
+    switch (p_libmad_stream->error)
+    {             
+    case MAD_ERROR_BUFLEN:                /* input buffer too small (or EOF) */
+        intf_ErrMsg("libmad error: input buffer too small (or EOF)");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BUFPTR:                /* invalid (null) buffer pointer */
+        intf_ErrMsg("libmad error: invalid (null) buffer pointer");
+        result = MAD_FLOW_STOP;
+        break;
+    case MAD_ERROR_NOMEM:                 /* not enough memory */
+        intf_ErrMsg("libmad error: invalid (null) buffer pointer");
+        result = MAD_FLOW_STOP;
+        break;
+    case MAD_ERROR_LOSTSYNC:            /* lost synchronization */
+        intf_ErrMsg("libmad error: lost synchronization");
+        mad_stream_sync(p_libmad_stream);
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADLAYER:            /* reserved header layer value */
+        intf_ErrMsg("libmad error: reserved header layer value");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADBITRATE:        /* forbidden bitrate value */
+        intf_ErrMsg("libmad error: forbidden bitrate value");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADSAMPLERATE: /* reserved sample frequency value */
+            intf_ErrMsg("libmad error: reserved sample frequency value");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADEMPHASIS:     /* reserved emphasis value */
+        intf_ErrMsg("libmad error: reserverd emphasis value");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADCRC:                /* CRC check failed */
+        intf_ErrMsg("libmad error: CRC check failed");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADBITALLOC:     /* forbidden bit allocation value */
+        intf_ErrMsg("libmad error: forbidden bit allocation value");
+        result = MAD_FLOW_IGNORE;
+        break;
+    case MAD_ERROR_BADSCALEFACTOR:/* bad scalefactor index */
+        intf_ErrMsg("libmad error: bad scalefactor index");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADFRAMELEN:     /* bad frame length */
+        intf_ErrMsg("libmad error: bad frame length");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADBIGVALUES:    /* bad big_values count */
+        intf_ErrMsg("libmad error: bad big values count");
+        result = MAD_FLOW_IGNORE;
+        break;
+    case MAD_ERROR_BADBLOCKTYPE:    /* reserved block_type */
+        intf_ErrMsg("libmad error: reserverd block_type");
+        result = MAD_FLOW_IGNORE;
+        break;
+    case MAD_ERROR_BADSCFSI:            /* bad scalefactor selection info */
+        intf_ErrMsg("libmad error: bad scalefactor selection info");
+        result = MAD_FLOW_CONTINUE;
+        break;
+    case MAD_ERROR_BADDATAPTR:        /* bad main_data_begin pointer */
+        intf_ErrMsg("libmad error: bad main_data_begin pointer");
+        result = MAD_FLOW_STOP;
+        break;
+    case MAD_ERROR_BADPART3LEN:     /* bad audio data length */
+        intf_ErrMsg("libmad error: bad audio data length");
+        result = MAD_FLOW_IGNORE;
+        break;
+    case MAD_ERROR_BADHUFFTABLE:    /* bad Huffman table select */
+        intf_ErrMsg("libmad error: bad Huffman table select");
+        result = MAD_FLOW_IGNORE;
+        break;
+    case MAD_ERROR_BADHUFFDATA:     /* Huffman data overrun */
+        intf_ErrMsg("libmad error: Huffman data overrun");
+        result = MAD_FLOW_IGNORE;
+        break;
+    case MAD_ERROR_BADSTEREO:         /* incompatible block_type for JS */
+        intf_ErrMsg("libmad error: incompatible block_type for JS");
+        result = MAD_FLOW_IGNORE;
+        break;
+    default:
+        intf_ErrMsg("libmad error: unknown error occured stopping decoder");
+        result = MAD_FLOW_STOP;
+        break;
+    }
+    
+    //return (MAD_RECOVERABLE(p_libmad_stream->error)? result: MAD_FLOW_STOP);
+    return (MAD_FLOW_CONTINUE);
+}
+
+/*****************************************************************************
+ * libmad_message: this function is called to send a message
+ *****************************************************************************/
+/* enum mad_flow libmad_message(void *, void*, unsigned int*)
+ * {
+ *     return MAD_FLOW_CONTINUE;
+ * }
+ */
+
+
diff --git a/plugins/mad/mad_libmad.h b/plugins/mad/mad_libmad.h
new file mode 100644 (file)
index 0000000..676fd45
--- /dev/null
@@ -0,0 +1,52 @@
+/***************************************************************************
+           mad_libmad.h  -  description
+               -------------------
+    begin                : Mon Nov 5 2001
+    copyright            : (C) 2001 by Jean-Paul Saman
+    email                : jpsaman@wxs.nl
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef _VLC_MAD_LIBMAD_H_
+#define _VLC_MAD_LIBMAD_H_
+
+/*
+ * Function prototypes for libmad callback functions.
+ */
+
+/*
+ * Each of the following functions will return one of:
+ * MAD_FLOW_CONTINUE = continue normally
+ * MAD_FLOW_STOP     = stop decoding normally
+ * MAD_FLOW_BREAK    = stop decoding and signal an error
+ * MAD_FLOW_IGNORE   = ignore the current frame
+ */
+
+/* enum mad_flow (*input_func)(void *, struct mad_stream *);*/
+enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream);
+
+/* enum mad_flow (*header_func)(void *, struct mad_header const *);*/
+enum mad_flow libmad_header(void *data, struct mad_header const *p_libmad_header);
+
+/* enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct mad_frame *); */
+// enum mad_flow libmad_filter(void *data, struct mad_stream const *p_libmad_stream, struct mad_frame *p_libmad_frame);
+
+/* enum mad_flow (*output_func)(void *, struct mad_header const *, struct mad_pcm *); */
+enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header, struct mad_pcm *p_libmad_pcm);
+enum mad_flow libmad_output2(void *data, struct mad_header const *p_libmad_header, struct mad_pcm *p_libmad_pcm);
+
+/* enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); */
+enum mad_flow libmad_error(void *data, struct mad_stream *p_libmad_stream, struct mad_frame *p_libmad_frame);
+
+/* enum mad_flow (*message_func)(void *, void *, unsigned int *); */
+/* enum mad_flow libmad_message(void *, void*, unsigned int*); */
+
+#endif
diff --git a/plugins/mad_adec/.cvsignore b/plugins/mad_adec/.cvsignore
deleted file mode 100644 (file)
index 63e7180..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.dep
diff --git a/plugins/mad_adec/API b/plugins/mad_adec/API
deleted file mode 100644 (file)
index 83a8731..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-MAD API documentation collected from e-mails of Joe Drew and Rob Leslie.
-The original e-mails can be found in the docs directory. They contain the
-same information as is presented below.
-
-INDEX
-======
-1. I/O Synchronous Mode
-2. Low-level API
-
-
-
-1. I/O SYNCHRONOUS MODE (extract from Joe Drew)
-===============================================
-MAD operates with callbacks for functions. Each of these functions is
-expected to return type enum mad_flow; this allows you to control the
-decoding process.
-
-MAD always outputs 32-bit (well, mad_fixed_t) little-endian data. Take
-this into account when outputting samples to the sound card.
-Related to the above, since MAD outputs type mad_fixed_t, unless you can
-output with 32-bit accuracy (most sound cards can't), you will have to
-quantize, round, dither, etc these samples to 16-bit (or whatever you
-need.) While there is a sample routine in minimad.c, if you want good
-quality you'll either want to roll your own or take a look in madplay's
-sources.
-
-Integral to understanding MAD: MAD is a decoding library only. You
-handle input and output; you're responsible for fast-forwarding and
-rewinding, if you want that type of functionality. All that MAD will do
-is take input from you, decode the MPEG frames, give you some
-information about them, and give you the decoded PCM data.
-
-Now, the nitty-gritty information.
-
-First, you need a mad_decoder struct. This holds all information about
-how you want your stream decoded, such as input/output functions, error
-handling functions, etc.
-
-mad_decoder_init() sets this structure up for you.
-
-struct mad_decoder decoder;
-struct my_playbuf playbuf;
-
-mad_decoder_init(&decoder, &playbuf, input_func, header_func, /*filter*/
-0, output_func, /*error*/ 0, /* message */ 0);
-
-In this example, the function called to get more data is set to
-input_func, the function called after MPEG headers have been decoded is
-header_func, the function called after all sound data has been decoded
-to PCM (for output) is output_func, and the filter, error, and message
-functions are unset.
-
-Now, MAD runs in a constant decoding loop. It runs something along the
-following lines:
-
-if I'm out of data
-       call input_func
-if input_func says there's no more data,
-       quit
-decode the header and call header_func
-decode the mpeg audio data
-call the filter function
-call the output function
-loop
-
-Now, this is an oversimplification obviously. The important thing to
-realise is that at every step of the process you can tell MAD what to
-do.
-
-Since all of these functions return enum mad_flow, you can tell MAD to
-do any of the following:
-
-enum mad_flow {
-  MAD_FLOW_CONTINUE = 0x0000, /* Keep decoding this stream */
-  MAD_FLOW_STOP     = 0x0010, /* Stop decoding this stream, but exit
-                                normally */
-  MAD_FLOW_BREAK    = 0x0011, /* Stop decoding this stream, and exit
-                                 with an error */
-  MAD_FLOW_IGNORE   = 0x0020  /* Don't decode this frame,
-                                but continue afterwards */
-};
-
-Most of the time you'll probably want to return MAD_FLOW_CONTINUE. In
-every case, you'll have to return one of these values from the functions
-you define.
-
-This is the definition of each of the functions:
-
-enum mad_flow (*input_func)(void *, struct mad_stream *);
-enum mad_flow (*header_func)(void *, struct mad_header const *);
-enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct
-mad_frame *);
-enum mad_flow (*output_func)(void *, struct mad_header const *, struct
-mad_pcm *);
-enum mad_flow (*error_func)(void *, struct mad_stream *, struct
-mad_frame *);
-enum mad_flow (*message_func)(void *, void *, unsigned int *);
-
-In each of these functions the void* pointer passed to the function is
-your "playbuf" structure. This can hold whatever you want - for example,
-song title, length, number of frames - just remember to re-cast it to
-the type you've defined.
-
-input_func takes a mad_stream pointer. Most of the time what you'll want
-to do is something along the lines of the following:
-
-if (more_data_available)
-  buffer = refill_buffer();
-  mad_stream_buffer(stream, buffer, length_of_buffer);
-  return MAD_FLOW_CONTINUE;
-else
-  return MAD_FLOW_STOP;
-
-(On many systems you'll want to use mmap() for this.)
-
-header_func takes a mad_header pointer. This contains most of the
-important information about a given frame; in constant bitrate files, it
-can contain most of the important information about the stream. It will
-give you the length of that frame, using mad_timer_t; the audio layer;
-extension; bitrate... the list is long. Read frame.h or mad.h in the
-frame.h area for more information.
-Again, return MAD_FLOW_{CONTINUE,STOP,BREAK} depending on outside
-conditions.
-
-The only other function I have firsthand information on is output_func;
-in this case, you are given a pointer to struct mad_pcm. This gives you
-the sampling rate, number of channels, and number of samples per
-channel; doing something like the following should work:
-
-mad_fixed_t *left_channel = pcm->samples[0], *right_channel =
-pcm->samples[1];
-int nsamples = pcm->length;
-signed int sample;
-unsigned char * buffer = some_buffer;
-unsigned char * ptr = buffer;
-
-while (nsamples--)
-{
-            sample = (signed int) do_downsample(*left_ch++)
-
-            *ptr++ = (unsigned char) (sample >> 0);
-            *ptr++ = (unsigned char) (sample >> 8);
-
-            sample = (signed int) do_downsample(*right_ch++)
-
-            *ptr++ = (unsigned char) (sample >> 0);
-            *ptr++ = (unsigned char) (sample >> 8);
-}
-
-output buffer to device.
-
-Be sure to handle the big-endian case (autoconf can test for this), and
-also the mono (1 channel) case. See mad.c in mpg321, at the end of the
-file, for an example.
-
-Information on the other (error, filter, message) functions would be
-appreciated, though I think in knowing this information anyone should be
-able to puzzle it out.
-
-Now that the decoder is set up with all these callback functions, you
-call
-
-mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);
-
-and then
-
-mad_decoder_finish(&decoder);
-
-Once you've called mad_decoder_finish, you can re-use the decoder
-struct, if you're, for example, within a playlist. Incidentally, all MAD
-structures have similar mad_(whatever)_init and mad_(whatever)_finish
-functions.
-
-I hope this helps people get their feet wet with MAD. Read the source,
-and particularly mad.h - there are a lot of things there you might not
-expect. Rob has done a good job in making MAD a complete solution. :)
-
-
-2. LOW-LEVEL API (extract from Rob Leslie)
-==========================================
-
-By way of clarification, MAD also has a low-level API which does not use
-callbacks. You can control the entire decoding process yourself more or less
-as follows:
-
-  /* load buffer with your MPEG audio data */
-
-  mad_stream_buffer(&stream, buffer, buflen);
-
-  while (1) {
-    mad_frame_decode(&frame, &stream);
-    mad_synth_frame(&synth, &frame);
-
-    /* output PCM samples in synth.pcm */
-  }
-
-This is vastly simplified, but it shows the general idea. mad_frame_decode()
-decodes the next frame's header and subband samples. mad_synth_frame() takes
-those subband samples and synthesizes PCM samples.
-
-It is also possible to call mad_header_decode() before mad_frame_decode().
-This just gives you the frame's header info, in case that's all you want, or
-perhaps to help you decide whether you want to decode the rest of the frame.
-
-As Joe mentions, each of the stream, frame, and synth structs needs to be
-initialized and "finished" before and after use:
-
-  struct mad_stream stream;
-  struct mad_frame frame;
-  struct mad_synth synth;
-
-  mad_stream_init(&stream);
-  mad_frame_init(&frame);
-  mad_synth_init(&synth);
-
-  /* ... */
-
-  mad_synth_finish(&synth);
-  mad_frame_finish(&frame);
-  mad_stream_finish(&stream);
-
-You can work with just a struct mad_header instead of a struct mad_frame if
-you only want to decode frame headers.
-
-Joe writes:
-> MAD always outputs 32-bit (well, mad_fixed_t) little-endian data. Take
-> this into account when outputting samples to the sound card.
-
-This isn't quite right: the mad_fixed_t type is not necessarily little-endian.
-It's the same endianness as the native integer types. Also, it's only
-guaranteed to be *at least* 32 bits wide.
-
-The fixed-point sample format is important to understand, and I recommend
-reading the comments in libmad/fixed.h. The thing to remember when converting
-MAD's fixed-point integer samples to 16-bit PCM (or whatever) is that MAD
-encodes samples as numbers in the full-scale range [-1.0, +1.0) where the
-binary point is placed 28 (MAD_F_FRACBITS) bits to the left of the integer.
-However, you need to be prepared to handle clipping as some numbers may be
-less than -1.0 (-MAD_F_ONE) or greater than or equal to +1.0 (MAD_F_ONE, aka
-1 << MAD_F_FRACBITS).
-
-> Information on the other (error, filter, message) functions would be
-> appreciated, though I think in knowing this information anyone should be
-> able to puzzle it out.
-
-In the high-level API, the error callback function is called whenever a
-decoding error occurs. The error number is in stream->error.
-
-The filter callback function is called after decoding a frame, but before
-synthesis. Here it is possible to modify the frame's subband samples, for
-example to perform a uniform attenuation/amplification, or to do other special
-processing in the frequency domain.
-
-The message callback function is only used with MAD_DECODER_MODE_ASYNC, and is
-called whenever the parent process sends a message via mad_decoder_message().
-This callback can generate a reply by overwriting the message buffer that is
-passed to it. (The size of the reply must be the same or smaller than the
-message.)
-
-
-
-
diff --git a/plugins/mad_adec/BUGS b/plugins/mad_adec/BUGS
deleted file mode 100644 (file)
index d16e71d..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-bug #09/11/2001-1: (FIXED 20/11/2001, by JP Saman)
-       Makefile.opts.in and Makefile.opts static libmad.a library is not filled in automatically by configure.
-       It should say in Makefile.opts LIB_MAD_ADEC=lib/libmad.a
-
-bug #09/11/2001-2:
-       libmad/mad.h is not created automatically. Fix compile step and dependencies for mad_adec to automatically
-       configure and or build libmad when not build yet. This means integration of configure.in scripts.
-
-bug #12/11/2001-1 (WORKING, by JP Saman)
-       smoothen out audio in libmad_output callback function, by optimizing conversion routines. After investigation
-       and experimenting I found out that my input routine and output routine were not balanced correctly with
-       respect to buffer sizes. A lot of data got lost. I fixed that, but still need a bater scaling/smoothing routine
-       for the audio.
-
-bug #20/11/2001-1 (FIXED 25/11/2001, by JP Saman)
-       synchronization between audio and video output is lost. In libmad_output a timestamp is set on the audio data, but
-       it points to a later video frame, then when the audio data was read. How can I set the correct timestamp on the
-        audio fifo at the time it was read from the bitstream, so that it matches the video frame it belongs to?
-        Solution: Do it in two steps, in the input function save i_pts of fifo and in output function pass saved i_pts to
-        aout_fifo.
\ No newline at end of file
diff --git a/plugins/mad_adec/DESIGN b/plugins/mad_adec/DESIGN
deleted file mode 100644 (file)
index d9327c4..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-File:  Plugin mad for vlc is based upon libmad from the mad distribution.
-Author: Jean-Paul Saman <jpsaman@wxs.nl>
-
-Directories:
-============
-vlc/                   : adapted config.in and Makefile
-                       : added libtool, ltmain.sh and ltconfig
-vlc/extras/libmad      : libmad from the original mad distribution
-vlc/plugins/mad_adec   : mad audio decoder plugin for vlc
-
-Interface functions to implement in mad plugin are:
-=========
-adec_mad_Probe
-adec_mad_Run
-adec_mad_Init
-adec_mad_ErrorThread
-adec_mad_EndThread
-
-libmad_input
-libmad_output
-libmad_header
-libmad_messages
-
-Design: (ASCII art)
-=======
-It represents the function call flow viewed from the vlc main program. The main program is in charge of allocating decoders,
-initializing, starting and stopping them.
-
-      ---------------  
-      |  <library>  |
-      |   libmad    |
-      ---------------
-            ^
-            |
-      ---------------          
-      |   <plugin>  |
-      |   mad_adec  |
-      _______________
-            ^
-            |
-      ________________________
-      |  <decoder interface> |
-      | vlc plugin interface |
-      ________________________
-
-
-Interface view:
-===============
-                                 [mad_adec decoder plugin]
-                                  ----------------------
-       vlc decoder interface -> | mad_adec     mad_libmad | -> libmad
-                                  -----------------------
-
-Rationel:
-Keeping libmad as a separate library, either dynamic or statically linked in, makes maintenance so much simpeler.
-Merging with a new libmad version should be straight forward as long as the interface stays stable.
-There is another benefit: Disk (actually flash ROM) resources and memory are very limited on a iPaq.
-Other programs or utilities like madplay and BBplay can make use of the same libmad version we do. In this way
-limiting the needed storage place on disk (flash ROM). Also this is only possible when the interface stays the same.
-
-
diff --git a/plugins/mad_adec/Makefile b/plugins/mad_adec/Makefile
deleted file mode 100644 (file)
index e1ca10a..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-###############################################################################
-# vlc (VideoLAN Client) MAD audio decoder module makefile
-# (c)2001 VideoLAN
-###############################################################################
-
-#
-# Objects
-#
-PLUGIN_MAD = mad_adec.o mad_libmad.o
-BUILTIN_MAD = $(PLUGIN_MAD:%.o=BUILTIN_%.o)
-
-ALL_OBJ = $(PLUGIN_MAD) $(BUILTIN_MAD)
-#
-# Virtual targets
-#
-
-include ../../Makefile.modules
-
-$(PLUGIN_MAD): %.o: .dep/%.d
-$(PLUGIN_MAD): %.o: %.c
-       $(CC) $(CFLAGS) $(PCFLAGS) $(CFLAGS_MAD_ADEC) -DPLUGIN -c -o $@ $<
-
-$(BUILTIN_MAD): BUILTIN_%.o: .dep/%.d
-$(BUILTIN_MAD): BUILTIN_%.o: %.c
-       $(CC) $(CFLAGS) $(CFLAGS_MAD_ADEC) -DBUILTIN -c -o $@ $<
-
-#
-# Real targets
-#
-
-../mad_adec.so: $(PLUGIN_MAD)
-       $(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_MAD_ADEC)
-
-../mad_adec.a: $(BUILTIN_MAD)
-       ar r $@ $^
-       $(RANLIB) $@
-
diff --git a/plugins/mad_adec/TODO b/plugins/mad_adec/TODO
deleted file mode 100644 (file)
index a586971..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-TODO: (Jean-Paul Saman <jpsaman@wxs.nl>)
-
-[1 - 30 October 2001, done]
-introduce libmad in vlc-dev code tree, this includes:
-       configure from top level of source tree
-       compilable from top level of source tree
-
-[2 - 25 November 2001, done]
-creating basic mad plugin in vlc-dev code tree, this include:
-       writing most simple vlc-plugin (no fancy stuf)
-       configurable from top level of source tree
-       compilable from top level of source tree
-
-[3 - 25 November 2001, done]
-test basic mad plugin 
-       native Intel
-       native iPaq
-
-[4 - 26 November 2001, working]
-commit to current vlc-dev tree in CVS at VideoLan 
-       fix broken things and conflicts
-       run tests again (see [3])
-       
-[5 - all ready done by Christophe Massiot]
-make cross-compile possible for vlc without interface. With interface it is to damn difficult to do cross-compilation.
-
-[6 - ]
-extending mad plugin with more features
-       do fancy stuff (enable MP3 decoding)
-
-[7 - ]
-test extended plugin 
-       native Intel
-       native iPaq
-       cross-compile iPaq
-
-[8 - ]
-commit to current vlc-dev tree in CVS at Videolan
-       fix broken things and conflicts
-       run tests again (see [7])
-[9 - ]
-incorporate new libmad version if possible
-       see 1
-       see 7
-       see 8
-
diff --git a/plugins/mad_adec/docs/joe_drew.txt b/plugins/mad_adec/docs/joe_drew.txt
deleted file mode 100644 (file)
index 97dbab9..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-Subject: [mad-dev] Some information about programming with MAD (in synchronous mode)
-
-As the author of mpg321, I too faced the problem of MAD not being
-documented. However, in looking at minimad.c, and re-writing mpg321 to
-use MAD, I came to understand it better. Here's some information which
-will help anybody start out with MAD:
-
-First, some basic information.
-MAD operates with callbacks for functions. Each of these functions is
-expected to return type enum mad_flow; this allows you to control the
-decoding process.
-MAD always outputs 32-bit (well, mad_fixed_t) little-endian data. Take
-this into account when outputting samples to the sound card.
-Related to the above, since MAD outputs type mad_fixed_t, unless you can
-output with 32-bit accuracy (most sound cards can't), you will have to
-quantize, round, dither, etc these samples to 16-bit (or whatever you
-need.) While there is a sample routine in minimad.c, if you want good
-quality you'll either want to roll your own or take a look in madplay's
-sources.
-Integral to understanding MAD: MAD is a decoding library only. You
-handle input and output; you're responsible for fast-forwarding and
-rewinding, if you want that type of functionality. All that MAD will do
-is take input from you, decode the MPEG frames, give you some
-information about them, and give you the decoded PCM data.
-
-Now, the nitty-gritty information.
-
-First, you need a mad_decoder struct. This holds all information about
-how you want your stream decoded, such as input/output functions, error
-handling functions, etc.
-
-mad_decoder_init() sets this structure up for you.
-
-struct mad_decoder decoder;
-struct my_playbuf playbuf;
-
-mad_decoder_init(&decoder, &playbuf, input_func, header_func, /*filter*/
-0, output_func, /*error*/ 0, /* message */ 0);
-
-In this example, the function called to get more data is set to
-input_func, the function called after MPEG headers have been decoded is
-header_func, the function called after all sound data has been decoded
-to PCM (for output) is output_func, and the filter, error, and message
-functions are unset.
-
-Now, MAD runs in a constant decoding loop. It runs something along the
-following lines:
-
-if I'm out of data
-       call input_func
-if input_func says there's no more data,
-       quit
-decode the header and call header_func
-decode the mpeg audio data
-call the filter function
-call the output function
-loop
-
-Now, this is an oversimplification obviously. The important thing to
-realise is that at every step of the process you can tell MAD what to
-do.
-
-Since all of these functions return enum mad_flow, you can tell MAD to
-do any of the following:
-
-enum mad_flow {
-  MAD_FLOW_CONTINUE = 0x0000, /* Keep decoding this stream */
-  MAD_FLOW_STOP     = 0x0010, /* Stop decoding this stream, but exit
-                                normally */
-  MAD_FLOW_BREAK    = 0x0011, /* Stop decoding this stream, and exit
-                                 with an error */
-  MAD_FLOW_IGNORE   = 0x0020  /* Don't decode this frame, 
-                                but continue afterwards */
-};
-
-Most of the time you'll probably want to return MAD_FLOW_CONTINUE. In
-every case, you'll have to return one of these values from the functions
-you define.
-
-This is the definition of each of the functions:
-
-enum mad_flow (*input_func)(void *, struct mad_stream *);
-enum mad_flow (*header_func)(void *, struct mad_header const *);
-enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct
-mad_frame *);
-enum mad_flow (*output_func)(void *, struct mad_header const *, struct
-mad_pcm *);
-enum mad_flow (*error_func)(void *, struct mad_stream *, struct
-mad_frame *);
-enum mad_flow (*message_func)(void *, void *, unsigned int *);
-
-In each of these functions the void* pointer passed to the function is
-your "playbuf" structure. This can hold whatever you want - for example,
-song title, length, number of frames - just remember to re-cast it to
-the type you've defined.
-
-input_func takes a mad_stream pointer. Most of the time what you'll want
-to do is something along the lines of the following:
-
-if (more_data_available)
-  buffer = refill_buffer();
-  mad_stream_buffer(stream, buffer, length_of_buffer);
-  return MAD_FLOW_CONTINUE;
-else
-  return MAD_FLOW_STOP;
-
-(On many systems you'll want to use mmap() for this.)
-
-header_func takes a mad_header pointer. This contains most of the
-important information about a given frame; in constant bitrate files, it
-can contain most of the important information about the stream. It will
-give you the length of that frame, using mad_timer_t; the audio layer;
-extension; bitrate... the list is long. Read frame.h or mad.h in the
-frame.h area for more information.
-Again, return MAD_FLOW_{CONTINUE,STOP,BREAK} depending on outside
-conditions.
-
-The only other function I have firsthand information on is output_func;
-in this case, you are given a pointer to struct mad_pcm. This gives you
-the sampling rate, number of channels, and number of samples per
-channel; doing something like the following should work:
-
-mad_fixed_t *left_channel = pcm->samples[0], *right_channel =
-pcm->samples[1];
-int nsamples = pcm->length;
-signed int sample;
-unsigned char * buffer = some_buffer;
-unsigned char * ptr = buffer;
-
-while (nsamples--)
-{
-            sample = (signed int) do_downsample(*left_ch++)
-
-            *ptr++ = (unsigned char) (sample >> 0);
-            *ptr++ = (unsigned char) (sample >> 8);
-            
-            sample = (signed int) do_downsample(*right_ch++)
-
-            *ptr++ = (unsigned char) (sample >> 0);
-            *ptr++ = (unsigned char) (sample >> 8);
-}
-
-output buffer to device.
-
-Be sure to handle the big-endian case (autoconf can test for this), and
-also the mono (1 channel) case. See mad.c in mpg321, at the end of the
-file, for an example.
-
-Information on the other (error, filter, message) functions would be
-appreciated, though I think in knowing this information anyone should be
-able to puzzle it out.
-
-Now that the decoder is set up with all these callback functions, you
-call 
-
-mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);
-
-and then
-
-mad_decoder_finish(&decoder);
-
-Once you've called mad_decoder_finish, you can re-use the decoder
-struct, if you're, for example, within a playlist. Incidentally, all MAD
-structures have similar mad_(whatever)_init and mad_(whatever)_finish
-functions.
-
-I hope this helps people get their feet wet with MAD. Read the source,
-and particularly mad.h - there are a lot of things there you might not
-expect. Rob has done a good job in making MAD a complete solution. :)
-
--- 
-Joe Drew <hoserhead@woot.net> <drew@debian.org>
-
-Please encrypt email sent to me.
diff --git a/plugins/mad_adec/docs/rob_leslie.txt b/plugins/mad_adec/docs/rob_leslie.txt
deleted file mode 100644 (file)
index fbe49e4..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-From - Mon Nov  5 09:19:09 2001
-Return-Path: <mad-dev-admin@lists.mars.org>
-Received: from smtp01.wxs.nl ([195.121.5.15]) by po05.wxs.nl
-          (Netscape Messaging Server 4.15) with ESMTP id GLLMFJ00.3DF for
-          <jpsaman@wxs.nl>; Mon, 22 Oct 2001 10:33:19 +0200 
-Received: from surveyor.mars.org ([216.98.134.66]) by
-          smtp01.wxs.nl (Netscape Messaging Server 4.15) with ESMTP id
-          GLLMFZ00.C2Z for <jpsaman@wxs.nl>; Mon, 22 Oct 2001 10:33:35 +0200 
-Received: from surveyor.mars.org (localhost [127.0.0.1])
-       by surveyor.mars.org (8.9.3/8.9.3/Debian 8.9.3-21) with ESMTP id BAA07654;
-       Mon, 22 Oct 2001 01:32:07 -0700
-Received: from mars.org (localhost [127.0.0.1])
-       by surveyor.mars.org (8.9.3/8.9.3/Debian 8.9.3-21) with ESMTP id BAA07629
-       for <mad-dev@lists.mars.org>; Mon, 22 Oct 2001 01:31:30 -0700
-Message-Id: <200110220831.BAA07629@surveyor.mars.org>
-X-Authentication-Warning: surveyor.mars.org: Host localhost [127.0.0.1] claimed to be mars.org
-From: Rob Leslie <rob@mars.org>
-To: mad-dev@lists.mars.org
-Subject: Re: [mad-dev] Some information about programming with MAD (in synchronous mode)
-In-reply-to: Your message of "21 Oct 2001 16:13:19 EDT."
-       <1003695199.24019.56.camel@pisces>
-Mime-Version: 1.0 (generated by tm-edit 7.106)
-Content-Type: text/plain; charset=US-ASCII
-Sender: mad-dev-admin@lists.mars.org
-Errors-To: mad-dev-admin@lists.mars.org
-X-BeenThere: mad-dev@lists.mars.org
-X-Mailman-Version: 2.0.1
-Precedence: bulk
-List-Help: <mailto:mad-dev-request@lists.mars.org?subject=help>
-List-Post: <mailto:mad-dev@lists.mars.org>
-List-Subscribe: <http://www.mars.org/bin/mailman/listinfo/mad-dev>,
-       <mailto:mad-dev-request@lists.mars.org?subject=subscribe>
-List-Id: MAD developer's mailing list <mad-dev.lists.mars.org>
-List-Unsubscribe: <http://www.mars.org/bin/mailman/listinfo/mad-dev>,
-       <mailto:mad-dev-request@lists.mars.org?subject=unsubscribe>
-List-Archive: <http://www.mars.org/mailman/public/mad-dev/>
-Date: Mon, 22 Oct 2001 01:31:30 -0700
-X-Mozilla-Status: 8011
-X-Mozilla-Status2: 00000000
-X-UIDL: 1879-1001307689
-
-Joe Drew wrote some good info on the MAD high-level API that I hope will be
-helpful to others.
-
-By way of clarification, MAD also has a low-level API which does not use
-callbacks. You can control the entire decoding process yourself more or less
-as follows:
-
-  /* load buffer with your MPEG audio data */
-
-  mad_stream_buffer(&stream, buffer, buflen);
-
-  while (1) {
-    mad_frame_decode(&frame, &stream);
-    mad_synth_frame(&synth, &frame);
-
-    /* output PCM samples in synth.pcm */
-  }
-
-This is vastly simplified, but it shows the general idea. mad_frame_decode()
-decodes the next frame's header and subband samples. mad_synth_frame() takes
-those subband samples and synthesizes PCM samples.
-
-It is also possible to call mad_header_decode() before mad_frame_decode().
-This just gives you the frame's header info, in case that's all you want, or
-perhaps to help you decide whether you want to decode the rest of the frame.
-
-As Joe mentions, each of the stream, frame, and synth structs needs to be
-initialized and "finished" before and after use:
-
-  struct mad_stream stream;
-  struct mad_frame frame;
-  struct mad_synth synth;
-
-  mad_stream_init(&stream);
-  mad_frame_init(&frame);
-  mad_synth_init(&synth);
-
-  /* ... */
-
-  mad_synth_finish(&synth);
-  mad_frame_finish(&frame);
-  mad_stream_finish(&stream);
-
-You can work with just a struct mad_header instead of a struct mad_frame if
-you only want to decode frame headers.
-
-Joe writes:
-> MAD always outputs 32-bit (well, mad_fixed_t) little-endian data. Take
-> this into account when outputting samples to the sound card.
-
-This isn't quite right: the mad_fixed_t type is not necessarily little-endian.
-It's the same endianness as the native integer types. Also, it's only
-guaranteed to be *at least* 32 bits wide.
-
-The fixed-point sample format is important to understand, and I recommend
-reading the comments in libmad/fixed.h. The thing to remember when converting
-MAD's fixed-point integer samples to 16-bit PCM (or whatever) is that MAD
-encodes samples as numbers in the full-scale range [-1.0, +1.0) where the
-binary point is placed 28 (MAD_F_FRACBITS) bits to the left of the integer.
-However, you need to be prepared to handle clipping as some numbers may be
-less than -1.0 (-MAD_F_ONE) or greater than or equal to +1.0 (MAD_F_ONE, aka
-1 << MAD_F_FRACBITS).
-
-> Information on the other (error, filter, message) functions would be
-> appreciated, though I think in knowing this information anyone should be
-> able to puzzle it out.
-
-In the high-level API, the error callback function is called whenever a
-decoding error occurs. The error number is in stream->error.
-
-The filter callback function is called after decoding a frame, but before
-synthesis. Here it is possible to modify the frame's subband samples, for
-example to perform a uniform attenuation/amplification, or to do other special
-processing in the frequency domain.
-
-The message callback function is only used with MAD_DECODER_MODE_ASYNC, and is
-called whenever the parent process sends a message via mad_decoder_message().
-This callback can generate a reply by overwriting the message buffer that is
-passed to it. (The size of the reply must be the same or smaller than the
-message.)
-
-Cheers,
-  -rob
diff --git a/plugins/mad_adec/mad_adec.c b/plugins/mad_adec/mad_adec.c
deleted file mode 100644 (file)
index ab8a9ca..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-/***************************************************************************
-              mad_adec.c  -  description
-                -------------------
-    Plugin Module definition for using libmad audio decoder in vlc. The
-    libmad codec uses integer arithmic only. This makes it suitable for using
-    it on architectures without a hardware FPU unit, such as the StrongArm
-    CPU.
-
-    begin                : Mon Nov 5 2001
-    copyright            : (C) 2001 by Jean-Paul Saman
-    email                : jpsaman@wxs.nl
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- ***************************************************************************/
-
-#define MODULE_NAME mad_adec
-#include "modules_inner.h"
-
-/*****************************************************************************
- * Preamble
- *****************************************************************************/
-#include "defs.h"
-
-#include <stdlib.h>                                      /* malloc(), free() */
-#include <string.h>                                              /* strdup() */
-
-#include "config.h"
-#include "common.h"                                     /* boolean_t, byte_t */
-#include "intf_msg.h"
-#include "threads.h"
-#include "mtime.h"
-
-#include "audio_output.h"
-
-#include "modules.h"
-#include "modules_export.h"
-
-#include "stream_control.h"
-#include "input_ext-dec.h"
-
-#include "debug.h"
-
-/*****************************************************************************
- * Libmad include files                                                      *
- *****************************************************************************/
-#include <mad.h>
-#include "mad_adec.h"
-#include "mad_libmad.h"
-
-/*****************************************************************************
- * Local prototypes
- *****************************************************************************/
-static int      mad_adec_Probe       ( probedata_t * );
-static int      mad_adec_Run         ( decoder_config_t * );
-static int      mad_adec_Init        (mad_adec_thread_t * p_mad_adec);
-static void     mad_adec_ErrorThread (mad_adec_thread_t * p_mad_adec);
-static void     mad_adec_EndThread   (mad_adec_thread_t * p_mad_adec);
-
-/*****************************************************************************
- * Capabilities
- *****************************************************************************/
-void _M( adec_getfunctions )( function_list_t * p_function_list )
-{
-    p_function_list->pf_probe = mad_adec_Probe;
-    p_function_list->functions.dec.pf_run = mad_adec_Run;
-}
-
-/*****************************************************************************
- * Build configuration tree.
- *****************************************************************************/
-MODULE_CONFIG_START
-ADD_WINDOW( "Configuration for mad_adec module" )
-    ADD_COMMENT( "No device to configure." )
-MODULE_CONFIG_STOP
-
-MODULE_INIT_START
-    p_module->i_capabilities = MODULE_CAPABILITY_DEC;
-    p_module->psz_longname = "Libmad MPEG 1/2/3 audio decoder library";
-MODULE_INIT_STOP
-
-MODULE_ACTIVATE_START
-    _M( adec_getfunctions )( &p_module->p_functions->dec );
-MODULE_ACTIVATE_STOP
-
-MODULE_DEACTIVATE_START
-MODULE_DEACTIVATE_STOP
-
-/*****************************************************************************
- * mad_adec_Probe: probe the decoder and return score
- *****************************************************************************
- * Tries to launch a decoder and return score so that the interface is able
- * to chose.
- *****************************************************************************/
-static int mad_adec_Probe( probedata_t *p_data )
-{
-    if( p_data->i_type == MPEG1_AUDIO_ES || p_data->i_type == MPEG2_AUDIO_ES )
-    {
-        if( TestMethod( ADEC_MPEG_VAR, "mad" ) )
-        {
-            return( 999 );
-        }
-        return( 50 );
-    }
-    else
-    {
-        return( 0 );
-    }
-}
-
-/*****************************************************************************
- * mad_adec_Run: this function is called just after the thread is created
- *****************************************************************************/
-static int mad_adec_Run ( decoder_config_t * p_config )
-{
-    mad_adec_thread_t *   p_mad_adec;
-
-    intf_ErrMsg( "mad_adec debug: mad_adec thread launched, initializing" );
-
-    /* Allocate the memory needed to store the thread's structure */
-    p_mad_adec = (mad_adec_thread_t *) malloc(sizeof(mad_adec_thread_t));
-
-    if (p_mad_adec == NULL)
-    {
-        intf_ErrMsg ( "mad_adec error: not enough memory "
-                      "for mad_adec_Run() to allocate p_mad_adec" );
-        return( -1 );
-    }
-
-    /*
-     * Initialize the thread properties
-     */
-    p_mad_adec->p_config = p_config;
-    p_mad_adec->p_fifo = p_mad_adec->p_config->p_decoder_fifo;
-    if( mad_adec_Init( p_mad_adec ) )
-    {
-        intf_ErrMsg( "mad_adec error: could not initialize thread" );
-        return( -1 );
-    }
-
-    /* mad decoder thread's main loop */
-    while ((!p_mad_adec->p_fifo->b_die) && (!p_mad_adec->p_fifo->b_error))
-    {
-       intf_ErrMsg( "mad_adec: starting libmad decoder" );
-       if (mad_decoder_run(p_mad_adec->libmad_decoder, MAD_DECODER_MODE_SYNC)==-1)
-       {
-         intf_ErrMsg( "mad_adec error: libmad decoder returns abnormally");
-         mad_adec_EndThread(p_mad_adec);
-         return( -1 );
-       }
-    }
-
-    /* If b_error is set, the mad decoder thread enters the error loop */
-    if (p_mad_adec->p_fifo->b_error)
-    {
-        mad_adec_ErrorThread (p_mad_adec);
-    }
-
-    /* End of the ac3 decoder thread */
-    mad_adec_EndThread (p_mad_adec);
-
-    return( 0 );
-}
-
-/*****************************************************************************
- * mad_adec_Init: initialize data before entering main loop
- *****************************************************************************/
-static int mad_adec_Init( mad_adec_thread_t * p_mad_adec )
-{
-    /*
-     * Properties of audio for libmad
-     */
-       
-    /* Initialize the libmad decoder structures */
-    p_mad_adec->libmad_decoder = (struct mad_decoder*) malloc(sizeof(struct mad_decoder));
-
-    /*
-     * Initialize bit stream
-     */
-    p_mad_adec->p_config->pf_init_bit_stream( &p_mad_adec->bit_stream,
-                                             p_mad_adec->p_config->p_decoder_fifo,
-                                             NULL,    /* pf_bitstream_callback */
-                                             NULL );  /* void **/
-
-    RealignBits( &p_mad_adec->bit_stream );
-
-    mad_decoder_init( p_mad_adec->libmad_decoder,
-                     p_mad_adec,       /* vlc's thread structure and p_fifo playbuffer */
-                     libmad_input,     /* input_func */
-                     libmad_header,    /* header_func */
-                     0,                /* filter */
-                     libmad_output,    /* output_func */
-                     0,        /* error */
-                     0);               /* message */
-
-    mad_decoder_options(p_mad_adec->libmad_decoder, MAD_OPTION_IGNORECRC);
-       
-    /*
-     * Initialize the output