* All intf_*Msg functions now write to stderr.
* Implemented a message queue interface plugins can subscribe to.
* Wrote the logger interface plugin. Usage:
vlc -I logger:filename.log
* Lots of fixes in the SPU renderer.
qt/qt \
sdl/sdl \
spudec/spudec \
+ text/logger \
text/ncurses \
text/rc \
vcd/vcd \
# Compilation options
#
DEBUG = @DEBUG@
-TRACE = @TRACE@
CPROF = @CPROF@
GPROF = @GPROF@
OPTIMS = @OPTIMS@
PROGRAM_OPTIONS += DEBUG
DEFINE += -DDEBUG
endif
-ifeq ($(TRACE),1)
-PROGRAM_OPTIONS += TRACE
-DEFINE += -DTRACE
-endif
ifeq ($(CPROF),1)
PROGRAM_OPTIONS += CPROF
DEFINE += -DCPROF
--disable-altivec Disable altivec optimizations (default enabled on PPC)"
ac_help="$ac_help
--enable-debug Enable debug mode (default disabled)"
-ac_help="$ac_help
- --enable-trace Enable trace mode (default disabled)"
ac_help="$ac_help
--enable-gprof Enable gprof profiling (default disabled)"
ac_help="$ac_help
--enable-vcd VCD support for Linux (default enabled)"
ac_help="$ac_help
--disable-dummy dummy module (default enabled)"
+ac_help="$ac_help
+ --disable-logger file logger module (default enabled)"
ac_help="$ac_help
--disable-null Null module (default enabled)"
ac_help="$ac_help
fi
-TRACE=0
-# Check whether --enable-trace or --disable-trace was given.
-if test "${enable_trace+set}" = set; then
- enableval="$enable_trace"
- if test x$enableval = xyes; then TRACE=1; fi
-fi
-
-
GPROF=0
# Check whether --enable-gprof or --disable-gprof was given.
if test "${enable_gprof+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:6281: checking for pth_init in -lpth" >&5
+echo "configure:6273: 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
ac_save_LIBS="$LIBS"
LIBS="-lpth $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6289 "configure"
+#line 6281 "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
pth_init()
; return 0; }
EOF
-if { (eval echo configure:6300: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6292: \"$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
fi
cat > conftest.$ac_ext <<EOF
-#line 6328 "configure"
+#line 6320 "configure"
#include "confdefs.h"
#include <pth.h>
EOF
if test x$enable_vcd != xno
then
cat > conftest.$ac_ext <<EOF
-#line 6486 "configure"
+#line 6478 "configure"
#include "confdefs.h"
#include <linux/cdrom.h>
EOF
if test x$enable_dummy != xno
then
- BUILTINS="${BUILTINS} dummy"
+ PLUGINS="${PLUGINS} dummy"
+fi
+
+# Check whether --enable-logger or --disable-logger was given.
+if test "${enable_logger+set}" = set; then
+ enableval="$enable_logger"
+ :
+fi
+
+
+if test x$enable_logger != xno
+then
+ PLUGINS="${PLUGINS} logger"
fi
# Check whether --enable-null or --disable-null was given.
if test x$enable_null != xno
then
- BUILTINS="${BUILTINS} null"
+ PLUGINS="${PLUGINS} null"
fi
# Check whether --enable-rc or --disable-rc was given.
if test x$enable_rc != xno
then
- BUILTINS="${BUILTINS} rc"
+ PLUGINS="${PLUGINS} rc"
fi
# Check whether --with-mad or --without-mad was given.
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6560: checking for $ac_hdr" >&5
+echo "configure:6564: 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 6565 "configure"
+#line 6569 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6570: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6574: \"$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*
done
echo $ac_n "checking for mad_bit_init in -lmad""... $ac_c" 1>&6
-echo "configure:6600: checking for mad_bit_init in -lmad" >&5
+echo "configure:6604: 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
ac_save_LIBS="$LIBS"
LIBS="-lmad $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6608 "configure"
+#line 6612 "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
mad_bit_init()
; return 0; }
EOF
-if { (eval echo configure:6619: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6623: \"$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
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6676: checking for $ac_hdr" >&5
+echo "configure:6680: 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 6681 "configure"
+#line 6685 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6690: \"$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*
# 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:6724: checking for $ac_word" >&5
+echo "configure:6728: 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
# 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:6775: checking for $ac_word" >&5
+echo "configure:6779: 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
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6833: checking for $ac_hdr" >&5
+echo "configure:6837: 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 6838 "configure"
+#line 6842 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6847: \"$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*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6888: checking for $ac_hdr" >&5
+echo "configure:6892: 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 6893 "configure"
+#line 6897 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6898: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6902: \"$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*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6941: checking for $ac_hdr" >&5
+echo "configure:6945: 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 6946 "configure"
+#line 6950 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6951: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6955: \"$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*
# 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:7039: checking for $ac_word" >&5
+echo "configure:7043: 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
# 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:7079: checking for $ac_word" >&5
+echo "configure:7083: 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
# 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:7120: checking for $ac_word" >&5
+echo "configure:7124: 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
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7166: checking for $ac_hdr" >&5
+echo "configure:7170: 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 7171 "configure"
+#line 7175 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7176: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7180: \"$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*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7246: checking for $ac_hdr" >&5
+echo "configure:7250: 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 7251 "configure"
+#line 7255 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7256: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7260: \"$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*
else
echo $ac_n "checking for directX headers in ${withval}""... $ac_c" 1>&6
-echo "configure:7285: checking for directX headers in ${withval}" >&5
+echo "configure:7289: checking for directX headers in ${withval}" >&5
if test -f ${withval}/include/ddraw.h
then
PLUGINS="${PLUGINS} directx"
# 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:7394: checking for $ac_word" >&5
+echo "configure:7398: 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
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7439: checking for $ac_hdr" >&5
+echo "configure:7443: 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 7444 "configure"
+#line 7448 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7449: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7453: \"$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*
# 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:7509: checking for $ac_word" >&5
+echo "configure:7513: 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
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7559: checking for $ac_hdr" >&5
+echo "configure:7563: 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 7564 "configure"
+#line 7568 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7573: \"$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*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7626: checking for $ac_hdr" >&5
+echo "configure:7630: 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 7631 "configure"
+#line 7635 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7636: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7640: \"$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*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7689: checking for $ac_hdr" >&5
+echo "configure:7693: 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 7694 "configure"
+#line 7698 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7699: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7703: \"$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*
saved_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -L$x_libraries -lX11 -lXext"
echo $ac_n "checking for XvSetPortAttribute in -lXv_pic""... $ac_c" 1>&6
-echo "configure:7723: checking for XvSetPortAttribute in -lXv_pic" >&5
+echo "configure:7727: checking for XvSetPortAttribute in -lXv_pic" >&5
ac_lib_var=`echo Xv_pic'_'XvSetPortAttribute | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXv_pic $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7731 "configure"
+#line 7735 "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
XvSetPortAttribute()
; return 0; }
EOF
-if { (eval echo configure:7742: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7746: \"$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
then
ac_safe=`echo "lirc/lirc_client.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for lirc/lirc_client.h""... $ac_c" 1>&6
-echo "configure:7789: checking for lirc/lirc_client.h" >&5
+echo "configure:7793: checking for lirc/lirc_client.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 7794 "configure"
+#line 7798 "configure"
#include "confdefs.h"
#include <lirc/lirc_client.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7799: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7803: \"$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*
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
echo "$ac_t""yes" 1>&6
echo $ac_n "checking for lirc_init in -llirc_client""... $ac_c" 1>&6
-echo "configure:7816: checking for lirc_init in -llirc_client" >&5
+echo "configure:7820: checking for lirc_init in -llirc_client" >&5
ac_lib_var=`echo lirc_client'_'lirc_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
ac_save_LIBS="$LIBS"
LIBS="-llirc_client $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7824 "configure"
+#line 7828 "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
lirc_init()
; return 0; }
EOF
-if { (eval echo configure:7835: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7839: \"$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
then
ac_safe=`echo "alsa/asoundlib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for alsa/asoundlib.h""... $ac_c" 1>&6
-echo "configure:7875: checking for alsa/asoundlib.h" >&5
+echo "configure:7879: 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 7880 "configure"
+#line 7884 "configure"
#include "confdefs.h"
#include <alsa/asoundlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7885: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7889: \"$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*
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:7902: checking for main in -lasound" >&5
+echo "configure:7906: 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
ac_save_LIBS="$LIBS"
LIBS="-lasound $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7910 "configure"
+#line 7914 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:7917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7921: \"$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
-
trap '' 1 2 15
s%@INCLUDE@%$INCLUDE%g
s%@DEBUG@%$DEBUG%g
s%@ASM@%$ASM%g
-s%@TRACE@%$TRACE%g
s%@CPROF@%$CPROF%g
s%@GPROF@%$GPROF%g
s%@OPTIMS@%$OPTIMS%g
-----------------
vlc version : ${VLC_VERSION}
debug mode : ${DEBUG}
-trace mode : ${TRACE}
cprof/gprof support : ${CPROF}/${GPROF}
need builtin getopt : ${NEED_GETOPT}
built-in modules :${BUILTINS}
[ --enable-debug Enable debug mode (default disabled)],
[ if test x$enableval = xyes; then DEBUG=1; fi ])
-dnl
-dnl Trace mode
-dnl
-TRACE=0
-AC_ARG_ENABLE(trace,
-[ --enable-trace Enable trace mode (default disabled)],
-[ if test x$enableval = xyes; then TRACE=1; fi ])
-
dnl
dnl Profiling
dnl
if test x$enable_dummy != xno
then
- BUILTINS="${BUILTINS} dummy"
+ PLUGINS="${PLUGINS} dummy"
+fi
+
+dnl
+dnl log plugin
+dnl
+AC_ARG_ENABLE(logger,
+ [ --disable-logger file logger module (default enabled)])
+
+if test x$enable_logger != xno
+then
+ PLUGINS="${PLUGINS} logger"
fi
dnl
if test x$enable_null != xno
then
- BUILTINS="${BUILTINS} null"
+ PLUGINS="${PLUGINS} null"
fi
dnl
if test x$enable_rc != xno
then
- BUILTINS="${BUILTINS} rc"
+ PLUGINS="${PLUGINS} rc"
fi
dnl
AC_SUBST(INCLUDE)
AC_SUBST(DEBUG)
AC_SUBST(ASM)
-AC_SUBST(TRACE)
AC_SUBST(CPROF)
AC_SUBST(GPROF)
AC_SUBST(OPTIMS)
-----------------
vlc version : ${VLC_VERSION}
debug mode : ${DEBUG}
-trace mode : ${TRACE}
cprof/gprof support : ${CPROF}/${GPROF}
need builtin getopt : ${NEED_GETOPT}
built-in modules :${BUILTINS}
* Collection of useful common types and macros definitions
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: common.h,v 1.73 2002/02/15 13:32:52 sam Exp $
+ * $Id: common.h,v 1.74 2002/02/19 00:50:18 sam Exp $
*
* Authors: Samuel Hocevar <sam@via.ecp.fr>
* Vincent Seguin <seguin@via.ecp.fr>
struct pes_packet_s;
struct input_area_s;
struct bit_stream_s;
+struct intf_subscription_s;
/*****************************************************************************
* Macros and inline functions
void ( * main_PutIntVariable ) ( char *, int );
void ( * main_PutPszVariable ) ( char *, char * );
- int ( * intf_ProcessKey ) ( struct intf_thread_s *, int );
- void ( * intf_AssignKey ) ( struct intf_thread_s *, int, int, int );
+ struct intf_subscription_s * ( * intf_MsgSub ) ( void );
+ void ( * intf_MsgUnsub ) ( struct intf_subscription_s * );
void ( * intf_Msg ) ( char *, ... );
void ( * intf_ErrMsg ) ( char *, ... );
void ( * intf_StatMsg ) ( char *, ... );
void ( * intf_WarnMsg ) ( int, char *, ... );
- void ( * intf_WarnMsgImm ) ( int, char *, ... );
-#ifdef TRACE
- void ( * intf_DbgMsg ) ( char *, char *, int, char *, ... );
- void ( * intf_DbgMsgImm ) ( char *, char *, int, char *, ... );
-#endif
int ( * intf_PlaylistAdd ) ( struct playlist_s *, int, const char* );
int ( * intf_PlaylistDelete ) ( struct playlist_s *, int );
*
*/
-/*****************************************************************************
- * Debugging options - define or undefine symbols
- *****************************************************************************/
-#ifdef TRACE
-/* General trace support, which depends of the TRACE define, is determined
- * in the Makefile */
-
-/* Modules specific debugging - this will produce a lot of output, but can be
- * useful to track a bug */
-//#define TRACE_INTF
-//#define TRACE_INPUT
-//#define TRACE_AUDIO
-#define TRACE_VOUT
-#define TRACE_VPAR
-
-/* Trace log file - if defined, a file can be used to store all messages. If
- * TRACE_LOG_ONLY is defined, debug messages will only be printed to the log and
- * will not appear on the screen */
-#define TRACE_LOG "vlc-trace.log"
-#define TRACE_LOG_ONLY
-
-#endif
-
/*****************************************************************************
* General configuration
*****************************************************************************/
#define INTF_PATH_VAR "vlc_search_path"
#define INTF_PATH_DEFAULT ""
-/* Environment variable containing the standard output method */
-#define INTF_STDOUT_VAR "vlc_stdout"
-#define INTF_STDOUT_DEFAULT ""
-
/*****************************************************************************
* Input thread configuration
*****************************************************************************/
/* Maximal size of a message to be stored in the mesage queue,
* it is needed when vasprintf is not avalaible */
-#define INTF_MAX_MSG_SIZE 512
+#define INTF_MAX_MSG_SIZE 512
/* Maximal size of the message queue - in case of overflow, all messages in the
- * queue are printed by the calling thread */
-#define INTF_MSG_QSIZE 64
+ * queue are printed, but not sent to the threads */
+#define INTF_MSG_QSIZE 256
/* Interface warnig message level */
#define INTF_WARNING_VAR "vlc_warning_level"
#define INTF_WARNING_DEFAULT 0
-/* Define to enable messages queues - disabling messages queue can be useful
- * when debugging, since it allows messages which would not be printed
- * due to a crash to be printed anyway */
-#ifndef DEBUG
-#define INTF_MSG_QUEUE
-#endif
-
-/* Format of the header for debug messages. The arguments following this header
- * are the file (char *), the function (char *) and the line (int) in which the
- * message function was called */
-#define INTF_MSG_DBG_FORMAT "## %s:%s(),%i: "
-
-/* Max number of arguments on a command line, including the function name */
-#define INTF_MAX_ARGS 20
-
-/* Maximal size of a command line in a script */
-#define INTF_MAX_CMD_SIZE 240
-
-/* Number of memorized lines in console window text zone */
-#define INTF_CONSOLE_MAX_TEXT 100
-
-/* Maximal number of commands which can be saved in history list */
-#define INTF_CONSOLE_MAX_HISTORY 20
-
/****************************************************************************
* Playlist defaults
****************************************************************************/
/* Define if you have the <cthreads.h> header file. */
#undef HAVE_CTHREADS_H
-/* Define if you have the <directx.h> header file. */
-#undef HAVE_DIRECTX_H
+/* Define if you have the <ddraw.h> header file. */
+#undef HAVE_DDRAW_H
/* Define if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
* interface, such as message output.
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: interface.h,v 1.26 2002/01/07 02:12:29 sam Exp $
+ * $Id: interface.h,v 1.27 2002/02/19 00:50:18 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
} intf_thread_t;
+/*****************************************************************************
+ * msg_item_t
+ *****************************************************************************
+ * Store a single message. Messages have a maximal size of INTF_MSG_MSGSIZE.
+ *****************************************************************************/
+typedef struct
+{
+ int i_type; /* message type, see below */
+ char * psz_msg; /* the message itself */
+
+#if 0
+ mtime_t date; /* date of the message */
+ char * psz_file; /* file in which the function was called */
+ char * psz_function; /* function from which the function was called */
+ int i_line; /* line at which the function was called */
+#endif
+} msg_item_t;
+
+/* Message types */
+#define INTF_MSG_STD 0 /* standard message */
+#define INTF_MSG_ERR 1 /* error message */
+#define INTF_MSG_WARN 2 /* warning message */
+#define INTF_MSG_STAT 3 /* statistic message */
+
+/*****************************************************************************
+ * intf_subscription_t
+ *****************************************************************************
+ * Used by interface plugins which subscribe to the message queue.
+ *****************************************************************************/
+typedef struct intf_subscription_s
+{
+ int i_start;
+ int* pi_stop;
+
+ msg_item_t* p_msg;
+ vlc_mutex_t* p_lock;
+} intf_subscription_t;
+
/*****************************************************************************
* Prototypes
*****************************************************************************/
-intf_thread_t * intf_Create ( void );
-void intf_Destroy ( intf_thread_t * p_intf );
+intf_thread_t * intf_Create ( void );
+void intf_Destroy ( intf_thread_t * p_intf );
+
+void intf_MsgCreate ( void );
+void intf_MsgDestroy ( void );
+
+#ifndef PLUGIN
+intf_subscription_t* intf_MsgSub ( void );
+void intf_MsgUnsub ( intf_subscription_t * );
+#else
+# define intf_MsgSub p_symbols->intf_MsgSub
+# define intf_MsgUnsub p_symbols->intf_MsgUnsub
+#endif
* interface, such as message output. See config.h for output configuration.
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: intf_msg.h,v 1.17 2001/12/30 07:09:54 sam Exp $
+ * $Id: intf_msg.h,v 1.18 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
-/*****************************************************************************
- * intf_DbgMsg macros and functions
- *****************************************************************************
- * The intf_DbgMsg* functions are defined as macro to be able to use the
- * compiler extensions and print the file, the function and the line number
- * from which they have been called. They call _intf_DbgMsg*() functions after
- * having added debugging informations.
- * Outside trace mode, intf_DbgMsg* functions do nothing.
- *****************************************************************************/
-#ifdef TRACE
-
-/* TRACE mode */
-void _intf_DbgMsg ( char *psz_file, char *psz_function, int i_line,
- char *psz_format, ... );
-void _intf_DbgMsgImm ( char *psz_file, char *psz_function, int i_line,
- char *psz_format, ... );
-
-#define intf_DbgMsg( format, args... ) \
- _intf_DbgMsg( __FILE__, __FUNCTION__, __LINE__, format, ## args )
-#define intf_DbgMsgImm( format, args... ) \
- _intf_DbgMsg( __FILE__, __FUNCTION__, __LINE__, format, ## args )
-
-#else
-
-/* Non-TRACE mode */
-#if defined( _MSC_VER )
-# define intf_DbgMsg
-# define intf_DbgMsgImm
-#else
-# define intf_DbgMsg( format, args... )
-# define intf_DbgMsgImm( format, args...)
-#endif
-
-#endif
-
-/*****************************************************************************
- * intf_FlushMsg macro and function
- *****************************************************************************
- * intf_FlushMsg is a function which flushs message queue and print all messages
- * remaining. It is only useful if INTF_MSG_QUEUE is defined. In this case, it
- * is really a function. In the other case, it is a macro doing nothing.
- *****************************************************************************/
-#ifdef INTF_MSG_QUEUE
-
-/* Message queue mode */
-void intf_FlushMsg ( void );
-
-#else
-
-/* Direct mode */
-#define intf_FlushMsg() ;
-
-#endif
-
/*****************************************************************************
* Prototypes
*****************************************************************************/
#ifndef PLUGIN
-p_intf_msg_t intf_MsgCreate ( void );
-void intf_MsgDestroy ( void );
+void intf_Msg ( char *psz_format, ... );
+void intf_ErrMsg ( char *psz_format, ... );
+void intf_WarnMsg ( int i_level, char *psz_format, ... );
+void intf_StatMsg ( char *psz_format, ... );
-void intf_Msg ( char *psz_format, ... );
-void intf_ErrMsg ( char *psz_format, ... );
-void intf_WarnMsg ( int i_level, char *psz_format, ... );
-void intf_StatMsg ( char *psz_format, ... );
-
-void intf_MsgImm ( char *psz_format, ... );
-void intf_ErrMsgImm ( char *psz_format, ... );
-void intf_WarnMsgImm ( int i_level, char *psz_format, ... );
-void intf_WarnHexDump ( int i_level, void *p_data, int i_size );
+void intf_WarnHexDump ( int i_level, void *p_data, int i_size );
#else
+# define intf_MsgSub p_symbols->intf_MsgSub
+# define intf_MsgUnsub p_symbols->intf_MsgUnsub
+
# define intf_Msg p_symbols->intf_Msg
# define intf_ErrMsg p_symbols->intf_ErrMsg
# define intf_StatMsg p_symbols->intf_StatMsg
# define intf_WarnMsg p_symbols->intf_WarnMsg
-# define intf_WarnMsgImm p_symbols->intf_WarnMsgImm
-# ifdef TRACE
-# undef intf_DbgMsg
-# undef intf_DbgMsgImm
-# define intf_DbgMsg( format, args... ) \
- p_symbols->intf_DbgMsg( __FILE__, __FUNCTION__, \
- __LINE__, format, ## args )
-# define intf_DbgMsgImm( format, args... ) \
- p_symbols->intf_DbgMsgImm( __FILE__, __FUNCTION__, \
- __LINE__, format, ## args )
-# endif
-
#endif
* includes all common video types and constants.
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: video.h,v 1.42 2002/02/08 15:57:29 sam Exp $
+ * $Id: video.h,v 1.43 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
int i_y; /* offset from alignment position */
int i_width; /* picture width */
int i_height; /* picture height */
- int i_horizontal_align; /* horizontal alignment */
- int i_vertical_align; /* vertical alignment */
/* Additionnal properties depending of the subpicture type */
union
#define READY_SUBPICTURE 2 /* ready for display */
#define DESTROYED_SUBPICTURE 3 /* allocated but not used anymore */
-/* Alignment types */
-#define RIGHT_ALIGN 10 /* x is absolute for right */
-#define LEFT_ALIGN 11 /* x is absolute for left */
-#define RIGHT_RALIGN 12 /* x is relative for right from right */
-#define LEFT_RALIGN 13 /* x is relative for left from left */
-
-#define CENTER_ALIGN 20 /* x, y are absolute for center */
-#define CENTER_RALIGN 21 /* x,y are relative for center from center */
-
-#define BOTTOM_ALIGN 30 /* y is absolute for bottom */
-#define TOP_ALIGN 31 /* y is absolute for top */
-#define BOTTOM_RALIGN 32 /* y is relative for bottom from bottom */
-#define TOP_RALIGN 33 /* y is relative for top from top */
-#define SUBTITLE_RALIGN 34 /* y is relative for center from subtitle */
-
-
break;
}
+#else
-+ intf_ProcessKey( p_main->p_intf, SDLK_q );
++ //intf_ProcessKey( p_main->p_intf, SDLK_q );
+#endif
break;
* ac3_adec.c: ac3 decoder module main file
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_adec.c,v 1.19 2002/02/15 13:32:52 sam Exp $
+ * $Id: ac3_adec.c,v 1.20 2002/02/19 00:50:19 sam Exp $
*
* Authors: Michel Lespinasse <walken@zoy.org>
*
*/
p_ac3thread->p_aout_fifo = NULL;
- intf_DbgMsg ( "ac3_adec debug: ac3_adec thread (%p) initialized",
- p_ac3thread );
-
/*
* Bit stream
*/
p_ac3thread->p_config->p_decoder_fifo,
BitstreamCallback, (void *) p_ac3thread );
- intf_DbgMsg("ac3dec debug: ac3 decoder thread %p initialized", p_ac3thread);
-
return( 0 );
}
ac3dec_thread_t * p_ac3thread;
boolean_t b_sync = 0;
- intf_DbgMsg( "ac3_adec debug: ac3_adec thread launched, initializing" );
-
/* Allocate the memory needed to store the thread's structure */
p_ac3thread = (ac3dec_thread_t *)memalign(16, sizeof(ac3dec_thread_t));
*****************************************************************************/
static void EndThread (ac3dec_thread_t * p_ac3thread)
{
- intf_DbgMsg ("ac3dec debug: destroying ac3 decoder thread %p", p_ac3thread);
-
/* If the audio output fifo was created, we destroy it */
if (p_ac3thread->p_aout_fifo != NULL)
{
/* Free what's left of the decoder */
free( p_ac3thread->ac3_decoder->imdct );
free( p_ac3thread->ac3_decoder );
-
- intf_DbgMsg( "ac3dec debug: ac3 decoder thread %p destroyed", p_ac3thread );
}
/*****************************************************************************
* ac3_parse.c: ac3 parsing procedures
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: ac3_parse.c,v 1.6 2001/12/30 07:09:54 sam Exp $
+ * $Id: ac3_parse.c,v 1.7 2002/02/19 00:50:19 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Aaron Holtzman <aholtzma@engr.uvic.ca>
static const int fscod_tbl[] = {48000, 44100, 32000};
/* Some internal functions */
-#ifdef TRACE
static void parse_bsi_stats (ac3dec_t * p_ac3dec);
static void parse_audblk_stats (ac3dec_t * p_ac3dec);
-#endif
/* Parse a syncinfo structure */
int ac3_sync_frame (ac3dec_t * p_ac3dec, ac3_sync_info_t * p_sync_info)
}
p_ac3dec->total_bits_read += 25;
-#ifdef TRACE
- parse_bsi_stats (p_ac3dec);
-#endif
+ if( p_main->b_stats )
+ {
+ parse_bsi_stats (p_ac3dec);
+ }
return 0;
}
p_ac3dec->total_bits_read += 8 * p_ac3dec->audblk.skipl + 9;
}
-#ifdef TRACE
- parse_audblk_stats(p_ac3dec);
-#endif
+ if( p_main->b_stats )
+ {
+ parse_audblk_stats(p_ac3dec);
+ }
return 0;
}
RemoveBits (&p_ac3dec->bit_stream,16);
}
-#ifdef TRACE
static void parse_bsi_stats (ac3dec_t * p_ac3dec) /* Some stats */
{
struct mixlev_s
intf_ErrMsg ("%1d",p_ac3dec->audblk.blksw[i]);
intf_ErrMsg ("]");
}
-#endif
* ac3_spdif.c: ac3 pass-through to external decoder with enabled soundcard
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: ac3_spdif.c,v 1.13 2002/02/15 13:32:52 sam Exp $
+ * $Id: ac3_spdif.c,v 1.14 2002/02/19 00:50:19 sam Exp $
*
* Authors: Stéphane Borel <stef@via.ecp.fr>
* Juha Yrjola <jyrjola@cc.hut.fi>
/* PTS of the current frame */
mtime_t i_current_pts = 0;
- intf_DbgMsg( "spdif debug: ac3_spdif thread created, initializing." );
-
/* Allocate the memory needed to store the thread's structure */
p_spdif = malloc( sizeof(ac3_spdif_thread_t) );
i_frame_time = 1000000 * AC3_FRAME_SIZE /
p_spdif->ac3_info.i_sample_rate;
- intf_DbgMsg( "spdif debug: ac3_spdif thread (%p) initialized", p_spdif );
-
while( !p_spdif->p_fifo->b_die && !p_spdif->p_fifo->b_error )
{
/* Handle the dates */
*****************************************************************************/
static void EndThread( ac3_spdif_thread_t * p_spdif )
{
- intf_DbgMsg( "spdif debug: destroying thread %p", p_spdif );
-
/* If the audio output fifo was created, we destroy it */
if( p_spdif->p_aout_fifo != NULL )
{
/* Destroy descriptor */
free( p_spdif->p_ac3 );
free( p_spdif );
-
- intf_DbgMsg ("spdif debug: thread %p destroyed", p_spdif );
}
/*****************************************************************************
* aout_alsa.c : Alsa functions library
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: aout_alsa.c,v 1.26 2002/02/15 13:32:52 sam Exp $
+ * $Id: aout_alsa.c,v 1.27 2002/02/19 00:50:19 sam Exp $
*
* Authors: Henri Fallon <henri@videolan.org> - Original Author
* Jeffrey Baker <jwbaker@acm.org> - Port to ALSA 1.0 API
return( -1 );
}
- intf_DbgMsg( "aout info: ALSA device successfully opened" );
return( 0 );
}
}
free( p_aout->p_sys );
-
- intf_DbgMsg( "aout: ALSA device closed" );
}
/*****************************************************************************
* vout_events.c: Windows DirectX video output events handler
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: vout_events.c,v 1.10 2002/01/27 22:14:52 gbazin Exp $
+ * $Id: vout_events.c,v 1.11 2002/02/19 00:50:19 sam Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
case '9': network_ChannelJoin( 9 ); break;
default:
- intf_DbgMsg( "unhandled key '%c' (%i)",
- (char)msg.wParam, msg.wParam );
break;
}
* -dvd_udf to find files
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: input_dvd.c,v 1.119 2002/02/15 13:32:53 sam Exp $
+ * $Id: input_dvd.c,v 1.120 2002/02/19 00:50:19 sam Exp $
*
* Author: Stéphane Borel <stef@via.ecp.fr>
*
p_dvd->i_title_id =
vts.title_inf.p_title_start[i_vts_title-1].i_title_id;
- intf_WarnMsgImm( 3, "dvd: title %d vts_title %d pgc %d",
- p_dvd->i_title, i_vts_title, p_dvd->i_title_id );
-
+ intf_WarnMsg( 3, "dvd: title %d vts_title %d pgc %d",
+ p_dvd->i_title, i_vts_title, p_dvd->i_title_id );
/*
* Angle management
* ggi.c : GGI plugin for vlc
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
- * $Id: ggi.c,v 1.13 2002/02/15 13:32:53 sam Exp $
+ * $Id: ggi.c,v 1.14 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
}
}
- if( p_vout->p_sys->b_must_acquire )
- {
- intf_DbgMsg("buffers must be acquired");
- }
-
/* Set graphic context colors */
col_fg.r = col_fg.g = col_fg.b = -1;
col_bg.r = col_bg.g = col_bg.b = 0;
* gnome.c : Gnome plugin for vlc
*****************************************************************************
* Copyright (C) 2000 VideoLAN
- * $Id: gnome.c,v 1.9 2002/02/15 13:32:53 sam Exp $
+ * $Id: gnome.c,v 1.10 2002/02/19 00:50:19 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
{
ADD_CAPABILITY( INTF, 100 )
}
- ADD_SHORTCUT( "gtk" )
+ ADD_SHORTCUT( "gnome" )
ADD_PROGRAM( "gnome-vlc" )
MODULE_INIT_STOP
* lirc.c : lirc plugin for vlc
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: lirc.c,v 1.2 2002/02/15 13:32:53 sam Exp $
+ * $Id: lirc.c,v 1.3 2002/02/19 00:50:19 sam Exp $
*
* Authors: Sigmund Augdal <sigmunau@idi.ntnu.no>
*
*****************************************************************************/
static int intf_Open( intf_thread_t *p_intf )
{
- /* Non-buffered stdout */
- setvbuf( stdout, (char *)NULL, _IOLBF, 0 );
-
/* Allocate instance and initialize some members */
p_intf->p_sys = malloc( sizeof( intf_sys_t ) );
if( p_intf->p_sys == NULL )
* lpcm_decoder_thread.c: lpcm decoder thread
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: lpcm_adec.c,v 1.11 2002/02/15 13:32:53 sam Exp $
+ * $Id: lpcm_adec.c,v 1.12 2002/02/19 00:50:19 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Henri Fallon <henri@videolan.org>
{
lpcmdec_thread_t * p_lpcmdec;
- intf_DbgMsg("lpcm_adec debug: thread launched, initializing.");
-
/* Allocate the memory needed to store the thread's structure */
if( (p_lpcmdec = (lpcmdec_thread_t *)malloc (sizeof(lpcmdec_thread_t)) )
== NULL)
return( -1 );
}
- intf_DbgMsg( "LPCM Debug: lpcm decoder thread %p initialized\n",
- p_lpcmdec );
-
/* lpcm decoder thread's main loop */
while ((!p_lpcmdec->p_fifo->b_die) && (!p_lpcmdec->p_fifo->b_error))
{
(p_lpcmdec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
vlc_cond_signal (&p_lpcmdec->p_aout_fifo->data_wait);
vlc_mutex_unlock (&p_lpcmdec->p_aout_fifo->data_lock);
-
- intf_DbgMsg( "LPCM Debug: %x", *buffer );
-
}
/*****************************************************************************
*****************************************************************************/
static void EndThread( lpcmdec_thread_t * p_lpcmdec )
{
- intf_DbgMsg( "LPCM Debug: destroying lpcm decoder thread %p", p_lpcmdec );
-
/* If the audio output fifo was created, we destroy it */
if( p_lpcmdec->p_aout_fifo != NULL )
{
/* Destroy descriptor */
free( p_lpcmdec );
-
- intf_DbgMsg( "LPCM Debug: lpcm decoder thread %p destroyed", p_lpcmdec );
}
* aout_darwin.c : Darwin audio output plugin
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: aout_macosx.c,v 1.12 2002/02/15 13:32:53 sam Exp $
+ * $Id: aout_macosx.c,v 1.13 2002/02/19 00:50:19 sam Exp $
*
* Authors: Colin Delacroix <colin@zoy.org>
*
if( err == noErr )
{
- intf_DbgMsg( "audio output format is %i", p_aout->i_format );
-
/*
* setting format.mFormatFlags to anything but the default value
* doesn't seem to work. Can anybody explain that ??
return( -1 );
case AOUT_FMT_S16_LE: /* Little endian signed 16 */
- intf_DbgMsg( "This means Little endian signed 16" );
// format.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian;
intf_ErrMsg( "Audio format (LE Unsigned 16) not supported now,"
"please report stream" );
return( -1 );
case AOUT_FMT_S16_BE: /* Big endian signed 16 */
- intf_DbgMsg( "This means big endian signed 16" );
// format.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
break;
case AOUT_FMT_U16_LE: /* Little endian U16 */
// format.mFormatFlags &= ~kLinearPCMFormatFlagIsSignedInteger;
- intf_DbgMsg( "This means Little endian U16" );
intf_ErrMsg( "Audio format (LE Unsigned 8) not supported now,"
"please report stream" );
return( -1 );
break;
default:
- intf_DbgMsg( "This means Unknown aout format" );
return( -1 );
}
{
#if WRITE_AUDIO_OUTPUT_TO_FILE
write( p_aout->p_sys->fd, buffer, i_size );
- intf_DbgMsg( "write() -> %d", write( p_aout->p_sys->fd, buffer, i_size ) );
#else
Convert16BitIntegerTo32Float( buffer, p_aout->p_sys->p_Data, i_size );
* mad_adec_thread_t *p_mad_adec = (mad_adec_thread_t *) data;
*
* 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;
* mad_timer_add(&p_mad_adec->libmad_timer,p_libmad_header->duration);
* xmga.c : X11 MGA plugin for vlc
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: xmga.c,v 1.4 2002/02/15 13:32:53 sam Exp $
+ * $Id: xmga.c,v 1.5 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
case '9': network_ChannelJoin( 9 ); break;
default:
- intf_DbgMsg( "vout: unhandled key '%c' (%i)",
- (char)i_key, i_key );
break;
}
}
{
p_main->p_intf->b_die = 1;
}
- else
- {
- intf_DbgMsg( "vout: unhandled ClientMessage received" );
- }
}
/*
{
int dummy;
- intf_DbgMsg( "vout: enabling screen saver" );
XSetScreenSaver( p_vout->p_sys->p_display, p_vout->p_sys->i_ss_timeout,
p_vout->p_sys->i_ss_interval,
p_vout->p_sys->i_ss_blanking,
&p_vout->p_sys->i_ss_exposure );
/* Disable screen saver */
- intf_DbgMsg( "vout: disabling screen saver" );
XSetScreenSaver( p_vout->p_sys->p_display, 0,
p_vout->p_sys->i_ss_interval,
p_vout->p_sys->i_ss_blanking,
/* Save DPMS current state */
DPMSInfo( p_vout->p_sys->p_display, &dummy,
&p_vout->p_sys->b_ss_dpms );
- intf_DbgMsg( "vout: disabling DPMS" );
DPMSDisable( p_vout->p_sys->p_display );
}
}
* mpeg_adec.c: MPEG audio decoder thread
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: mpeg_adec.c,v 1.18 2002/02/15 13:32:53 sam Exp $
+ * $Id: mpeg_adec.c,v 1.19 2002/02/19 00:50:19 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Michel Lespinasse <walken@via.ecp.fr>
{
adec_thread_t * p_adec;
- intf_DbgMsg("mpeg_adec debug: thread launched, initializing.");
-
/* Allocate the memory needed to store the thread's structure */
if ( (p_adec = (adec_thread_t *)malloc (sizeof(adec_thread_t))) == NULL )
{
it will be created when the first frame is received */
p_adec->p_aout_fifo = NULL;
- intf_DbgMsg("mpeg_adec debug: thread initialized, decoding begins.");
-
p_adec->i_sync = 0;
/* Audio decoder thread's main loop */
*****************************************************************************/
static void EndThread ( adec_thread_t *p_adec )
{
- intf_DbgMsg ( "adec debug: destroying audio decoder thread %p", p_adec );
-
/* If the audio output fifo was created, we destroy it */
if ( p_adec->p_aout_fifo != NULL )
{
}
/* Destroy descriptor */
free( p_adec );
-
- intf_DbgMsg ("adec debug: audio decoder thread %p destroyed", p_adec);
}
* video_decoder.c : video decoder thread
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: video_decoder.c,v 1.5 2001/12/30 07:09:56 sam Exp $
+ * $Id: video_decoder.c,v 1.6 2002/02/19 00:50:19 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Michel Lespinasse <walken@zoy.org>
{
vdec_thread_t * p_vdec;
- intf_DbgMsg("vdec debug: creating video decoder thread");
-
/* Allocate the memory needed to store the thread's structure */
if ( (p_vdec = (vdec_thread_t *)malloc( sizeof(vdec_thread_t) )) == NULL )
{
return( NULL );
}
- intf_DbgMsg("vdec debug: video decoder thread (%p) created", p_vdec);
return( p_vdec );
}
*****************************************************************************/
void vdec_DestroyThread( vdec_thread_t *p_vdec )
{
- intf_DbgMsg("vdec debug: requesting termination of video decoder thread %p", p_vdec);
-
/* Ask thread to kill itself */
p_vdec->b_die = 1;
*****************************************************************************/
void vdec_InitThread( vdec_thread_t * p_vdec )
{
- intf_DbgMsg("vdec debug: initializing video decoder thread %p", p_vdec);
-
#if !defined(SYS_BEOS)
# if VDEC_NICE
/* Re-nice ourself - otherwise we would steal CPU time from the video
p_vdec->p_pool->pf_idct_init( &p_vdec->p_idct_data );
/* Mark thread as running and return */
- intf_DbgMsg("vdec debug: InitThread(%p) succeeded", p_vdec);
}
/*****************************************************************************
*****************************************************************************/
void vdec_EndThread( vdec_thread_t * p_vdec )
{
- intf_DbgMsg("vdec debug: EndThread(%p)", p_vdec);
-
if( p_vdec->p_idct_data != NULL )
{
free( p_vdec->p_idct_data );
*****************************************************************************/
static void RunThread( vdec_thread_t *p_vdec )
{
- intf_DbgMsg("vdec debug: running video decoder thread (%p) (pid == %i)",
- p_vdec, getpid());
-
vdec_InitThread( p_vdec );
/*
* video_parser.c : video parser thread
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: video_parser.c,v 1.13 2002/02/15 13:32:53 sam Exp $
+ * $Id: video_parser.c,v 1.14 2002/02/19 00:50:19 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Samuel Hocevar <sam@via.ecp.fr>
vpar_thread_t * p_vpar;
boolean_t b_error;
- intf_DbgMsg( "vpar debug: video parser thread created. Initializing..." );
-
/* Allocate the memory needed to store the thread's structure */
if ( (p_vpar = (vpar_thread_t *)malloc( sizeof(vpar_thread_t) )) == NULL )
{
vpar_InitPool( p_vpar );
/* Mark thread as running and return */
- intf_DbgMsg("vpar debug: InitThread(%p) succeeded", p_vpar);
return( 0 );
}
*****************************************************************************/
static void EndThread( vpar_thread_t *p_vpar )
{
- intf_DbgMsg("vpar debug: destroying video parser thread %p", p_vpar);
-
/* Release used video buffers. */
if( p_vpar->sequence.p_forward != NULL )
{
module_Unneed( p_vpar->p_motion_module );
free( p_vpar );
-
- intf_DbgMsg("vpar debug: EndThread(%p)", p_vpar);
}
/*****************************************************************************
if( p_bit_stream->p_decoder_fifo->p_first->b_discontinuity )
{
-#ifdef TRACE_VPAR
- intf_DbgMsg( "Discontinuity in BitstreamCallback" );
-#endif
/* Escape the current picture and reset the picture predictors. */
p_vpar->sequence.b_expect_discontinuity = 1;
p_vpar->picture.b_error = 1;
if( p_bit_stream->p_data->b_discard_payload )
{
-#ifdef TRACE_VPAR
- intf_DbgMsg( "Discard payload in BitstreamCallback" );
-#endif
/* 1 packet messed up, trash the slice. */
p_vpar->picture.b_error = 1;
}
* vpar_headers.c : headers parsing
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: vpar_headers.c,v 1.13 2002/02/13 22:10:40 sam Exp $
+ * $Id: vpar_headers.c,v 1.14 2002/02/19 00:50:19 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Stéphane Borel <stef@via.ecp.fr>
p_vpar->picture.b_repeat_first_field ) )
== NULL )
{
- intf_DbgMsg("vpar debug: vout_CreatePicture failed, delaying");
if( p_vpar->p_fifo->b_die || p_vpar->p_fifo->b_error )
{
return;
* vpar_synchro.c : frame dropping routines
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: vpar_synchro.c,v 1.5 2001/12/30 07:09:56 sam Exp $
+ * $Id: vpar_synchro.c,v 1.6 2002/02/19 00:50:19 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Samuel Hocevar <sam@via.ecp.fr>
mtime_t now, period, tau_yuv;
mtime_t pts = 0;
boolean_t b_decode = 0;
-#ifdef TRACE_VPAR
- char p_date[MSTRTIME_MAX_SIZE];
-#endif
now = mdate();
period = 1000000 * 1001 / p_vpar->sequence.i_frame_rate
}
}
-#ifdef TRACE_VPAR
- intf_DbgMsg("vpar synchro debug: %s picture scheduled for %s, %s (%lld)",
- i_coding_type == B_CODING_TYPE ? "B" :
- (i_coding_type == P_CODING_TYPE ? "P" : "I"),
- mstrtime(p_date, pts), b_decode ? "decoding" : "trashed",
- S.p_tau[i_coding_type]);
-#endif
if( !b_decode )
{
S.i_not_chosen_pic++;
p_vpar->synchro.pi_meaningful[i_coding_type]++;
}
}
-
-#ifdef TRACE_VPAR
- intf_DbgMsg("vpar synchro debug: finished decoding %s (%lld)",
- i_coding_type == B_CODING_TYPE ? "B" :
- (i_coding_type == P_CODING_TYPE ? "P" : "I"), tau);
-#endif
- }
- else
- {
- intf_DbgMsg("vpar synchro debug: aborting %s",
- i_coding_type == B_CODING_TYPE ? "B" :
- (i_coding_type == P_CODING_TYPE ? "P" : "I"));
}
}
{
network_ChannelJoin( i_key );
}
- else if( intf_ProcessKey( p_main->p_intf,
- (char) i_key ) )
- {
- intf_DbgMsg( "vout: unhandled key '%c' (%i)",
- (char) i_key, i_key );
- }
break;
}
}
{
PhDim_t dim;
- intf_DbgMsg( "vout: changing full-screen status" );
-
p_vout->b_fullscreen = !p_vout->b_fullscreen;
p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
*/
if( p_vout->i_changes & VOUT_SIZE_CHANGE )
{
- intf_DbgMsg( "vout: resizing window" );
p_vout->i_changes &= ~VOUT_SIZE_CHANGE;
if( p_vout->p_sys->i_mode != MODE_VIDEO_OVERLAY )
*/
if( b_repos && p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY )
{
- intf_DbgMsg( "vout: moving video channel" );
-
vout_End( p_vout );
if( vout_Init( p_vout ) )
{
hwcaps.currently_available_video_ram >=
( ( minfo.width * minfo.height * minfo.bits_per_pixel ) / 8 ) )
{
- intf_DbgMsg( "vout: using video ram" );
p_vout->p_sys->i_mode = MODE_VIDEO_MEM;
}
* vout_sdl.c: SDL video output display method
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: vout_sdl.c,v 1.81 2002/02/15 13:32:53 sam Exp $
+ * $Id: vout_sdl.c,v 1.82 2002/02/19 00:50:19 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Pierre Baillet <oct@zoy.org>
case SDLK_F9: network_ChannelJoin( 9 ); break;
default:
- intf_DbgMsg( "unhandled key %i", event.key.keysym.sym );
break;
}
break;
* spu_decoder.c : spu decoder thread
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: spu_decoder.c,v 1.9 2002/02/15 13:32:53 sam Exp $
+ * $Id: spu_decoder.c,v 1.10 2002/02/19 00:50:19 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
*****************************************************************************/
static int InitThread( spudec_thread_t *p_spudec )
{
- int i_retry = 0;
-
- /* Spawn a video output if there is none */
+ /* Find an available video output */
vlc_mutex_lock( &p_vout_bank->lock );
while( p_vout_bank->i_count == 0 )
{
vlc_mutex_unlock( &p_vout_bank->lock );
- if( i_retry++ > 10 )
+ if( p_spudec->p_fifo->b_die || p_spudec->p_fifo->b_error )
{
- intf_WarnMsg( 1, "spudec: waited too long for vout, aborting" );
- free( p_spudec );
-
return( -1 );
}
ncurses_SOURCES = ncurses.c
rc_SOURCES = rc.c
+logger_SOURCES = logger.c
--- /dev/null
+/*****************************************************************************
+ * logger.c : file logging plugin for vlc
+ *****************************************************************************
+ * Copyright (C) 2002 VideoLAN
+ * $Id: logger.c,v 1.1 2002/02/19 00:50:19 sam Exp $
+ *
+ * Authors: Samuel Hocevar <sam@zoy.org>
+ *
+ * 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.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <stdlib.h> /* malloc(), free() */
+#include <string.h>
+
+#include <errno.h> /* ENOMEM */
+#include <stdio.h>
+
+#include <videolan/vlc.h>
+
+#include "interface.h"
+
+#define LOG_FILE "vlc.log"
+#define LOG_STRING( msg, file ) fwrite( msg, strlen( msg ), 1, file );
+
+/*****************************************************************************
+ * intf_sys_t: description and status of log interface
+ *****************************************************************************/
+typedef struct intf_sys_s
+{
+ FILE * p_file; /* The log file */
+ intf_subscription_t *p_sub;
+
+} intf_sys_t;
+
+/*****************************************************************************
+ * Local prototypes.
+ *****************************************************************************/
+static void intf_getfunctions ( function_list_t * p_function_list );
+static int intf_Open ( intf_thread_t *p_intf );
+static void intf_Close ( intf_thread_t *p_intf );
+static void intf_Run ( intf_thread_t *p_intf );
+
+static void FlushQueue ( intf_subscription_t *, FILE * );
+
+/*****************************************************************************
+ * Build configuration tree.
+ *****************************************************************************/
+MODULE_CONFIG_START
+MODULE_CONFIG_STOP
+
+MODULE_INIT_START
+ SET_DESCRIPTION( "file logging interface module" )
+ ADD_CAPABILITY( INTF, 1 )
+ ADD_SHORTCUT( "logger" )
+MODULE_INIT_STOP
+
+MODULE_ACTIVATE_START
+ intf_getfunctions( &p_module->p_functions->intf );
+MODULE_ACTIVATE_STOP
+
+MODULE_DEACTIVATE_START
+MODULE_DEACTIVATE_STOP
+
+/*****************************************************************************
+ * Functions exported as capabilities. They are declared as static so that
+ * we don't pollute the namespace too much.
+ *****************************************************************************/
+static void intf_getfunctions( function_list_t * p_function_list )
+{
+ p_function_list->functions.intf.pf_open = intf_Open;
+ p_function_list->functions.intf.pf_close = intf_Close;
+ p_function_list->functions.intf.pf_run = intf_Run;
+}
+
+/*****************************************************************************
+ * intf_Open: initialize and create stuff
+ *****************************************************************************/
+static int intf_Open( intf_thread_t *p_intf )
+{
+ char *psz_filename;
+
+ /* Allocate instance and initialize some members */
+ p_intf->p_sys = (intf_sys_t *)malloc( sizeof( intf_sys_t ) );
+ if( p_intf->p_sys == NULL )
+ {
+ intf_ErrMsg( "intf error: %s", strerror(ENOMEM) );
+ return -1;
+ }
+
+ psz_filename = main_GetPszVariable( INTF_METHOD_VAR, NULL );
+
+ while( *psz_filename && *psz_filename != ':' )
+ {
+ psz_filename++;
+ }
+
+ if( *psz_filename == ':' )
+ {
+ psz_filename++;
+ }
+ else
+ {
+ intf_ErrMsg( "intf error: no log filename provided, using `%s'",
+ LOG_FILE );
+ psz_filename = LOG_FILE;
+ }
+
+ /* Open the log file */
+ intf_WarnMsg( 1, "intf: opening logfile `%s'", psz_filename );
+ p_intf->p_sys->p_file = fopen( psz_filename, "w" );
+
+ p_intf->p_sys->p_sub = intf_MsgSub();
+
+ if( p_intf->p_sys->p_file == NULL )
+ {
+ intf_ErrMsg( "intf error: error opening logfile `%s'", psz_filename );
+ free( p_intf->p_sys );
+ intf_MsgUnsub( p_intf->p_sys->p_sub );
+ return -1;
+ }
+
+ LOG_STRING( "-- log plugin started --\n", p_intf->p_sys->p_file );
+
+ return 0;
+}
+
+/*****************************************************************************
+ * intf_Close: destroy interface stuff
+ *****************************************************************************/
+static void intf_Close( intf_thread_t *p_intf )
+{
+ /* Flush the queue and unsubscribe from the message queue */
+ FlushQueue( p_intf->p_sys->p_sub, p_intf->p_sys->p_file );
+ intf_MsgUnsub( p_intf->p_sys->p_sub );
+
+ LOG_STRING( "-- log plugin stopped --\n", p_intf->p_sys->p_file );
+
+ /* Close the log file */
+ fclose( p_intf->p_sys->p_file );
+
+ /* Destroy structure */
+ free( p_intf->p_sys );
+}
+
+/*****************************************************************************
+ * intf_Run: rc thread
+ *****************************************************************************
+ * This part of the interface is in a separate thread so that we can call
+ * exec() from within it without annoying the rest of the program.
+ *****************************************************************************/
+static void intf_Run( intf_thread_t *p_intf )
+{
+ while( !p_intf->b_die )
+ {
+ p_intf->pf_manage( p_intf );
+
+ FlushQueue( p_intf->p_sys->p_sub, p_intf->p_sys->p_file );
+
+ msleep( INTF_IDLE_SLEEP );
+ }
+}
+
+/*****************************************************************************
+ * FlushQueue: flush the message queue into the log file
+ *****************************************************************************/
+static void FlushQueue( intf_subscription_t *p_sub, FILE *p_file )
+{
+ int i_start, i_stop;
+ char *psz_msg;
+
+ vlc_mutex_lock( p_sub->p_lock );
+ i_stop = *p_sub->pi_stop;
+ vlc_mutex_unlock( p_sub->p_lock );
+
+ /* Append all messages to log file */
+ for( i_start = p_sub->i_start; i_start < i_stop; i_start++ )
+ {
+ psz_msg = p_sub->p_msg[i_start].psz_msg;
+ LOG_STRING( psz_msg, p_file );
+ LOG_STRING( "\n", p_file );
+ }
+
+ vlc_mutex_lock( p_sub->p_lock );
+ p_sub->i_start = i_start;
+ vlc_mutex_unlock( p_sub->p_lock );
+}
+
break; /* go to the next sector */
}
- intf_DbgMsg( "packet start code : %X", i_header );
-
switch( i_header )
{
/* 0x1b9 == SYSTEM_END_CODE, it is only 4 bytes long. */
break;
}
- intf_DbgMsg( "i_index : %d", i_index );
- intf_DbgMsg( "i_packet_size : %d", i_packet_size );
-
if ( i_index + i_packet_size > BUFFER_SIZE )
{
intf_ErrMsg( "vcd error: packet too long (%i)",
p_msf->minute = i_dummy / (CD_FRAMES * CD_SECS);
p_msf->second = ( i_dummy % (CD_FRAMES * CD_SECS) ) / CD_FRAMES;
p_msf->frame = ( i_dummy % (CD_FRAMES * CD_SECS) ) % CD_FRAMES;
-
- intf_DbgMsg( "vcd debug: playing frame %d:%d-%d",
- p_msf->minute, p_msf->second, p_msf->frame);
#undef p_msf
if( ioctl(i_fd, CDROMREADRAW, p_block) == -1 )
* x11.c : X11 plugin for vlc
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: x11.c,v 1.10 2001/12/30 07:09:56 sam Exp $
+ * $Id: x11.c,v 1.11 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
int i, j;
XColor p_colors[255];
- intf_DbgMsg( "vout: Palette change called" );
-
/* allocate palette */
for( i = 0, j = 255; i < 255; i++, j-- )
{
* xcommon.c: Functions common to the X11 and XVideo plugins
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: xcommon.c,v 1.16 2002/02/15 13:32:54 sam Exp $
+ * $Id: xcommon.c,v 1.17 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
case '9': network_ChannelJoin( 9 ); break;
default:
- intf_DbgMsg( "vout: unhandled key '%c' (%i)",
- (char)i_key, i_key );
break;
}
}
{
p_main->p_intf->b_die = 1;
}
- else
- {
- intf_DbgMsg( "vout: unhandled ClientMessage received" );
- }
}
/*
if( b_resized )
{
/* If interface window has been resized, change vout size */
- intf_DbgMsg( "vout: resizing output window" );
p_vout->i_width = p_vout->p_sys->i_width;
p_vout->i_height = p_vout->p_sys->i_height;
p_vout->i_changes |= VOUT_SIZE_CHANGE;
(p_vout->i_height != p_vout->p_sys->i_height) )
{
/* If video output size has changed, change interface window size */
- intf_DbgMsg( "vout: resizing output window" );
p_vout->p_sys->i_width = p_vout->i_width;
p_vout->p_sys->i_height = p_vout->i_height;
XResizeWindow( p_vout->p_sys->p_display, p_vout->p_sys->window,
*/
if( p_vout->i_changes & VOUT_SIZE_CHANGE )
{
- intf_DbgMsg( "vout info: resizing window" );
p_vout->i_changes &= ~VOUT_SIZE_CHANGE;
/* Resize window */
int dummy;
#endif
- intf_DbgMsg( "vout: enabling screen saver" );
XSetScreenSaver( p_vout->p_sys->p_display, p_vout->p_sys->i_ss_timeout,
p_vout->p_sys->i_ss_interval,
p_vout->p_sys->i_ss_blanking,
&p_vout->p_sys->i_ss_exposure );
/* Disable screen saver */
- intf_DbgMsg( "vout: disabling screen saver" );
XSetScreenSaver( p_vout->p_sys->p_display, 0,
p_vout->p_sys->i_ss_interval,
p_vout->p_sys->i_ss_blanking,
/* Save DPMS current state */
DPMSInfo( p_vout->p_sys->p_display, &unused,
&p_vout->p_sys->b_ss_dpms );
- intf_DbgMsg( "vout: disabling DPMS" );
DPMSDisable( p_vout->p_sys->p_display );
}
#endif
* aout_common.c: generic audio output functions
*****************************************************************************
* Copyright (C) 1999-2002 VideoLAN
- * $Id: aout_common.c,v 1.2 2002/01/14 19:54:36 asmax Exp $
+ * $Id: aout_common.c,v 1.3 2002/02/19 00:50:19 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Cyril Deguet <asmax@via.ecp.fr>
default:
- intf_DbgMsg("aout debug: unknown fifo type (%i)", p_fifo->i_type);
+ intf_ErrMsg("aout error: unknown fifo type (%i)", p_fifo->i_type);
break;
}
}
l_rate = p_fifo->l_rate;
}
- intf_DbgMsg( "aout debug: %lli (%li);", aout_date -
- p_fifo->date[p_fifo->l_start_frame], l_rate );
-
InitializeIncrement( &p_fifo->unit_increment, l_rate, p_aout->l_rate );
p_fifo->l_units = (((l_units - (p_fifo->l_unit -
* aout_spdif: ac3 passthrough output
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: aout_spdif.c,v 1.21 2001/12/30 07:09:56 sam Exp $
+ * $Id: aout_spdif.c,v 1.22 2002/02/19 00:50:19 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Stéphane Borel <stef@via.ecp.fr>
mtime_t m_old = 0;
- intf_DbgMsg( "aout debug: starting spdif output loop" );
-
while( !p_aout->b_die )
{
for( i_fifo = 0 ; i_fifo < AOUT_MAX_FIFOS ; i_fifo++ )
/* check continuity */
if( (m_play - m_old) != m_frame_time )
{
- intf_DbgMsg( "aout debug: malformed frame ? (%lld)",
- m_play - m_old );
mwait( m_play - m_frame_time );
}
else
(byte_t *)p_aout->buffer,
SPDIF_FRAME_SIZE );
}
- else
- {
- intf_DbgMsg( "aout debug: late spdif frame" );
- }
}
else
{
}
}
- intf_DbgMsg( "aout debug: exiting spdif loop" );
vlc_mutex_lock( &p_aout->fifos_lock );
for ( i_fifo = 0; i_fifo < AOUT_MAX_FIFOS; i_fifo++ )
* decoders.
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: input.c,v 1.174 2002/02/15 13:32:54 sam Exp $
+ * $Id: input.c,v 1.175 2002/02/19 00:50:19 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
EndThread( p_input );
DestroyThread( p_input );
-
- intf_DbgMsg("input: Thread end");
}
/*****************************************************************************
* input_dec.c: Functions for the management of decoders
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: input_dec.c,v 1.26 2002/02/15 13:32:54 sam Exp $
+ * $Id: input_dec.c,v 1.27 2002/02/19 00:50:19 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
return( 0 );
}
- intf_DbgMsg( "input debug: decoder \"%s\"thread created",
- p_es->p_module->psz_name );
-
return thread_id;
}
* input_programs.c: es_descriptor_t, pgrm_descriptor_t management
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: input_programs.c,v 1.70 2001/12/30 07:09:56 sam Exp $
+ * $Id: input_programs.c,v 1.71 2002/02/19 00:50:19 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
/* Where to add the pgrm */
int i_pgrm_index = p_input->stream.i_pgrm_number;
- intf_DbgMsg("Adding description for pgrm %d", i_pgrm_id);
-
/* Add an entry to the list of program associated with the stream */
p_input->stream.i_pgrm_number++;
p_input->stream.pp_programs = realloc( p_input->stream.pp_programs,
ASSERT( p_pgrm );
- intf_DbgMsg("Deleting description for pgrm %d", p_pgrm->i_number);
-
/* Free the structures that describe the es that belongs to that program */
while( p_pgrm->i_es_number )
{
/* Where to add the pgrm */
int i_area_index = p_input->stream.i_area_nb;
- intf_DbgMsg("Adding description for area %d", i_area_index );
-
/* Add an entry to the list of program associated with the stream */
p_input->stream.i_area_nb++;
p_input->stream.pp_areas = realloc( p_input->stream.pp_areas,
ASSERT( p_area );
- intf_DbgMsg("Deleting description for area %d", p_area->i_id );
-
/* Find the area in the areas table */
for( i_area_index = 0; i_area_index < p_input->stream.i_area_nb;
i_area_index++ )
{
es_descriptor_t * p_es;
- intf_DbgMsg("Adding description for ES 0x%x", i_es_id);
-
p_es = (es_descriptor_t *)malloc( sizeof(es_descriptor_t) );
if( p_es == NULL )
{
{
if( p_es == NULL )
{
- intf_ErrMsg( "Nothing to do in input_SelectES" );
+ intf_ErrMsg( "input error: nothing to do in input_SelectES" );
return -1;
}
-#ifdef TRACE_INPUT
- intf_DbgMsg( "Selecting ES 0x%x", p_es->i_id );
-#endif
+ intf_WarnMsg( 4, "input: selecting ES 0x%x", p_es->i_id );
if( p_es->p_decoder_fifo != NULL )
{
return -1;
}
-#ifdef TRACE_INPUT
- intf_DbgMsg( "Unselecting ES 0x%x", p_es->i_id );
-#endif
+ intf_WarnMsg( 4, "input: unselecting ES 0x%x", p_es->i_id );
if( p_es->p_decoder_fifo == NULL )
{
if( p_input->stream.pp_selected_es == NULL )
{
-#ifdef TRACE_INPUT
- intf_DbgMsg( "No more selected ES in input_UnselectES" );
-#endif
+ intf_WarnMsg( 4, "input: no more selected ES in input_UnselectES" );
return( 1 );
}
}
* mpeg_system.c: TS, PS and PES management
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: mpeg_system.c,v 1.78 2002/01/04 14:01:34 sam Exp $
+ * $Id: mpeg_system.c,v 1.79 2002/02/19 00:50:19 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Michel Lespinasse <walken@via.ecp.fr>
#define p_pes (p_es->p_pes)
- //intf_DbgMsg("End of PES packet %p", p_pes);
-
/* Parse the header. The header has a variable length, but in order
* to improve the algorithm, we will read the 14 bytes we may be
* interested in */
{
#define p_pes (p_es->p_pes)
- //intf_DbgMsg("PES-demultiplexing %p (%p)", p_ts_packet, p_pes);
-
/* If we lost data, insert a NULL data packet (philosophy : 0 is quite
* often an escape sequence in decoders, so that should make them wait
* for the next start code). */
return;
}
- intf_DbgMsg( "input: building PSM" );
p_demux->b_has_PSM = 1;
p_demux->i_PSM_version = p_data->p_demux_start[6] & 0x1F;
* interface, such as command line.
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: interface.c,v 1.88 2002/02/15 13:32:54 sam Exp $
+ * $Id: interface.c,v 1.89 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
*****************************************************************************/
static void intf_Manage( intf_thread_t *p_intf )
{
- /* Flush waiting messages */
- intf_FlushMsg();
-
/* Manage module bank */
module_ManageBank( );
* interface, such as message output. See config.h for output configuration.
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: intf_msg.c,v 1.42 2002/01/04 14:01:35 sam Exp $
+ * $Id: intf_msg.c,v 1.43 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
#include "interface.h"
-/*****************************************************************************
- * intf_msg_item_t
- *****************************************************************************
- * Store a single message. Messages have a maximal size of INTF_MSG_MSGSIZE.
- * If TRACE is defined, messages have a date field and debug messages are
- * printed with a date to allow more precise profiling.
- *****************************************************************************/
-typedef struct
-{
- int i_type; /* message type, see below */
- char * psz_msg; /* the message itself */
-
-#ifdef TRACE
- /* Debugging informations - in TRACE mode, debug messages have calling
- * location information printed */
- mtime_t date; /* date of the message */
- char * psz_file; /* file in which the function was called */
- char * psz_function; /* function from which the function was called */
- int i_line; /* line at which the function was called */
-#endif
-} intf_msg_item_t;
-
-/* Message types */
-#define INTF_MSG_STD 0 /* standard message */
-#define INTF_MSG_ERR 1 /* error message */
-#define INTF_MSG_DBG 3 /* debug message */
-#define INTF_MSG_WARN 4 /* warning message */
-#define INTF_MSG_STAT 5 /* statistic message */
-
/*****************************************************************************
* intf_msg_t
* Store all data requiered by messages interfaces. It has a single reference
* int p_main.
*****************************************************************************/
-typedef struct intf_msg_s
+typedef struct msg_bank_s
{
-#ifdef INTF_MSG_QUEUE
+ /* Message queue lock */
+ vlc_mutex_t lock;
+
/* Message queue */
- vlc_mutex_t lock; /* message queue lock */
- int i_count; /* number of messages stored */
- intf_msg_item_t msg[INTF_MSG_QSIZE]; /* message queue */
-#endif
+ msg_item_t msg[INTF_MSG_QSIZE]; /* message queue */
+ int i_start;
+ int i_stop;
-#ifdef TRACE_LOG
- /* Log file */
- FILE * p_log_file; /* log file */
-#endif
+ /* Subscribers */
+ int i_sub;
+ intf_subscription_t **pp_sub;
-#if !defined(INTF_MSG_QUEUE) && !defined(TRACE_LOG)
- /* If neither messages queue, neither log file is used, then the structure
- * is empty. However, empty structures are not allowed in C. Therefore, a
- * dummy integer is used to fill it. */
- int i_dummy; /* unused filler */
-#endif
-} intf_msg_t;
+} msg_bank_t;
+
+msg_bank_t msg_bank;
/*****************************************************************************
* Local prototypes
*****************************************************************************/
-
-static void QueueMsg ( intf_msg_t *p_msg, int i_type,
- char *psz_format, va_list ap );
-static void PrintMsg ( intf_msg_item_t *p_msg );
-#ifdef TRACE
-static void QueueDbgMsg ( intf_msg_t *p_msg, char *psz_file,
- char *psz_function, int i_line,
- char *psz_format, va_list ap );
-#endif
-#ifdef INTF_MSG_QUEUE
-static void FlushLockedMsg ( intf_msg_t *p_msg );
-#endif
+static void QueueMsg ( int, char *, va_list );
+static void FlushLockedMsg ( void );
#if defined( WIN32 )
static char *ConvertPrintfFormatString ( char *psz_format );
* This functions has to be called before any call to other intf_*Msg functions.
* It set up the locks and the message queue if it is used.
*****************************************************************************/
-p_intf_msg_t intf_MsgCreate( void )
+void intf_MsgCreate( void )
{
- p_intf_msg_t p_msg;
-
- /* Allocate structure */
- p_msg = malloc( sizeof( intf_msg_t ) );
- if( p_msg == NULL )
- {
- errno = ENOMEM;
- }
- else
- {
-#ifdef INTF_MSG_QUEUE
/* Message queue initialization */
- vlc_mutex_init( &p_msg->lock ); /* intialize lock */
- p_msg->i_count = 0; /* queue is empty */
-#endif
+ vlc_mutex_init( &msg_bank.lock );
+ msg_bank.i_start = 0;
+ msg_bank.i_stop = 0;
-
-#ifdef TRACE_LOG
- /* Log file initialization - on failure, file pointer will be null,
- * and no log will be issued, but this is not considered as an
- * error */
- p_msg->p_log_file = fopen( TRACE_LOG, "w" );
-#endif
- }
- return( p_msg );
+ msg_bank.i_sub = 0;
+ msg_bank.pp_sub = NULL;
}
/*****************************************************************************
*****************************************************************************/
void intf_MsgDestroy( void )
{
- intf_FlushMsg(); /* print all remaining messages */
+ /* Destroy lock */
+ vlc_mutex_destroy( &msg_bank.lock );
-#ifdef TRACE_LOG
- /* Close log file if any */
- if( p_main->p_msg->p_log_file != NULL )
+ if( msg_bank.i_sub )
{
- fclose( p_main->p_msg->p_log_file );
+ fprintf( stderr, "intf error: stale interface subscribers\n" );
}
-#endif
-#ifdef INTF_MSG_QUEUE
- /* destroy lock */
- vlc_mutex_destroy( &p_main->p_msg->lock );
-#endif
-
- /* Free structure */
- free( p_main->p_msg );
+ /* Free remaining messages */
+ FlushLockedMsg( );
+}
+
+/*****************************************************************************
+ * intf_MsgSub: subscribe to the message queue.
+ *****************************************************************************/
+intf_subscription_t *intf_MsgSub( void )
+{
+ intf_subscription_t *p_sub = malloc( sizeof( intf_subscription_t ) );
+
+ vlc_mutex_lock( &msg_bank.lock );
+
+ /* Add subscription to the list */
+ msg_bank.i_sub++;
+ msg_bank.pp_sub = realloc( msg_bank.pp_sub,
+ msg_bank.i_sub * sizeof( intf_subscription_t* ) );
+
+ msg_bank.pp_sub[ msg_bank.i_sub - 1 ] = p_sub;
+
+ p_sub->i_start = msg_bank.i_start;
+ p_sub->pi_stop = &msg_bank.i_stop;
+
+ p_sub->p_msg = msg_bank.msg;
+ p_sub->p_lock = &msg_bank.lock;
+
+ vlc_mutex_unlock( &msg_bank.lock );
+
+ return p_sub;
+}
+
+/*****************************************************************************
+ * intf_MsgSub: unsubscribe from the message queue.
+ *****************************************************************************/
+void intf_MsgUnsub( intf_subscription_t *p_sub )
+{
+ int i_index;
+
+ vlc_mutex_lock( &msg_bank.lock );
+
+ /* Look for the appropriate subscription */
+ for( i_index = 0; i_index < msg_bank.i_sub; i_index++ )
+ {
+ if( msg_bank.pp_sub[ i_index ] == p_sub )
+ {
+ break;
+ }
+ }
+
+ if( msg_bank.pp_sub[ i_index ] != p_sub )
+ {
+ intf_ErrMsg( "intf error: subscriber not found" );
+ vlc_mutex_unlock( &msg_bank.lock );
+ return;
+ }
+
+ /* Remove this subscription */
+ for( ; i_index < msg_bank.i_sub; i_index++ )
+ {
+ msg_bank.pp_sub[ i_index ] = msg_bank.pp_sub[ i_index+1 ];
+ }
+
+ msg_bank.i_sub--;
+ msg_bank.pp_sub = realloc( msg_bank.pp_sub,
+ msg_bank.i_sub * sizeof( intf_subscription_t* ) );
+
+ vlc_mutex_unlock( &msg_bank.lock );
}
/*****************************************************************************
va_list ap;
va_start( ap, psz_format );
- QueueMsg( p_main->p_msg, INTF_MSG_STD, psz_format, ap );
+ QueueMsg( INTF_MSG_STD, psz_format, ap );
va_end( ap );
}
va_list ap;
va_start( ap, psz_format );
- QueueMsg( p_main->p_msg, INTF_MSG_ERR, psz_format, ap );
+ QueueMsg( INTF_MSG_ERR, psz_format, ap );
va_end( ap );
}
if( i_level <= p_main->i_warning_level )
{
va_start( ap, psz_format );
- QueueMsg( p_main->p_msg, INTF_MSG_WARN, psz_format, ap );
+ QueueMsg( INTF_MSG_WARN, psz_format, ap );
va_end( ap );
}
}
if( p_main->b_stats )
{
va_start( ap, psz_format );
- QueueMsg( p_main->p_msg, INTF_MSG_STAT, psz_format, ap );
- va_end( ap );
- }
-}
-
-/*****************************************************************************
- * _intf_DbgMsg: print a debugging message (ok ?)
- *****************************************************************************
- * This function prints a debugging message. Compared to other intf_*Msg
- * functions, it is only defined if TRACE is defined and require a file name,
- * a function name and a line number as additionnal debugging informations. It
- * also prints a debugging header for each received line.
- *****************************************************************************/
-#ifdef TRACE
-void _intf_DbgMsg( char *psz_file, char *psz_function, int i_line,
- char *psz_format, ...)
-{
- va_list ap;
-
- va_start( ap, psz_format );
- QueueDbgMsg( p_main->p_msg, psz_file, psz_function, i_line,
- psz_format, ap );
- va_end( ap );
-}
-#endif
-
-/*****************************************************************************
- * intf_MsgImm: print a message (ok ?)
- *****************************************************************************
- * This function prints a message immediately. If the queue is used, all
- * waiting messages are also printed.
- *****************************************************************************/
-void intf_MsgImm( char *psz_format, ... )
-{
- va_list ap;
-
- va_start( ap, psz_format );
- QueueMsg( p_main->p_msg, INTF_MSG_STD, psz_format, ap );
- va_end( ap );
- intf_FlushMsg();
-}
-
-/*****************************************************************************
- * intf_ErrMsgImm: print an error message immediately (ok ?)
- *****************************************************************************
- * This function is the same as intf_MsgImm, except that it prints its message
- * on stderr.
- *****************************************************************************/
-void intf_ErrMsgImm(char *psz_format, ...)
-{
- va_list ap;
-
- va_start( ap, psz_format );
- QueueMsg( p_main->p_msg, INTF_MSG_ERR, psz_format, ap );
- va_end( ap );
- intf_FlushMsg();
-}
-
-/*****************************************************************************
- * intf_WarnMsgImm : print a warning message
- *****************************************************************************
- * This function is the same as intf_MsgImm, except that it concerns warning
- * messages for testing purpose.
- *****************************************************************************/
-void intf_WarnMsgImm( int i_level, char *psz_format, ... )
-{
- va_list ap;
-
- if( i_level <= p_main->i_warning_level )
- {
- va_start( ap, psz_format );
- QueueMsg( p_main->p_msg, INTF_MSG_WARN, psz_format, ap );
+ QueueMsg( INTF_MSG_STAT, psz_format, ap );
va_end( ap );
}
- intf_FlushMsg();
-}
-
-
-
-/*****************************************************************************
- * _intf_DbgMsgImm: print a debugging message immediately (ok ?)
- *****************************************************************************
- * This function is the same as intf_DbgMsgImm, except that it prints its
- * message immediately. It should only be called through the macro
- * intf_DbgMsgImm().
- *****************************************************************************/
-#ifdef TRACE
-void _intf_DbgMsgImm( char *psz_file, char *psz_function, int i_line,
- char *psz_format, ...)
-{
- va_list ap;
-
- va_start( ap, psz_format );
- QueueDbgMsg( p_main->p_msg, psz_file, psz_function, i_line,
- psz_format, ap );
- va_end( ap );
- intf_FlushMsg();
}
-#endif
/*****************************************************************************
* intf_WarnHexDump : print a hexadecimal dump of a memory area
intf_WarnMsg( i_level, "hexdump: %i bytes dumped", i_size );
}
-/*****************************************************************************
- * intf_FlushMsg (ok ?)
- *****************************************************************************
- * Print all messages remaining in queue: get lock and call FlushLockedMsg.
- * This function does nothing if the message queue isn't used.
- * This function is only implemented if message queue is used. If not, it is
- * an empty macro.
- *****************************************************************************/
-#ifdef INTF_MSG_QUEUE
-void intf_FlushMsg( void )
-{
- vlc_mutex_lock( &p_main->p_msg->lock ); /* get lock */
- FlushLockedMsg( p_main->p_msg ); /* flush messages */
- vlc_mutex_unlock( &p_main->p_msg->lock ); /* give lock back */
-}
-#endif
-
/* following functions are local */
/*****************************************************************************
* is full. If the message can't be converted to string in memory, it exit the
* program. If the queue is not used, it prints the message immediately.
*****************************************************************************/
-static void QueueMsg( intf_msg_t *p_msg, int i_type, char *psz_format, va_list ap )
+static void QueueMsg( int i_type, char *psz_format, va_list ap )
{
char * psz_str; /* formatted message string */
- intf_msg_item_t * p_msg_item; /* pointer to message */
+ msg_item_t * p_item; /* pointer to message */
#ifdef WIN32
char * psz_temp;
#endif
-#ifndef INTF_MSG_QUEUE /*................................... instant mode ...*/
- intf_msg_item_t msg_item; /* message */
- p_msg_item = &msg_item;
-#endif /*....................................................................*/
-
/*
* Convert message to string
*/
-
#ifdef HAVE_VASPRINTF
vasprintf( &psz_str, psz_format, ap );
#else
psz_str = (char*) malloc( strlen(psz_format) + INTF_MAX_MSG_SIZE );
#endif
+
if( psz_str == NULL )
{
- fprintf(stderr, "warning: can't store following message (%s): ",
+ fprintf(stderr, "intf warning: can't store following message (%s): ",
strerror(errno) );
vfprintf(stderr, psz_format, ap );
fprintf(stderr, "\n" );
exit( errno );
}
+
#ifndef HAVE_VASPRINTF
-#ifdef WIN32
+# ifdef WIN32
psz_temp = ConvertPrintfFormatString(psz_format);
vsprintf( psz_str, psz_temp, ap );
free( psz_temp );
-#else
+# else
vsprintf( psz_str, psz_format, ap );
-#endif /* WIN32 */
-#endif /* HAVE_VASPRINTF */
-
-#ifdef INTF_MSG_QUEUE /*...................................... queue mode ...*/
- vlc_mutex_lock( &p_msg->lock ); /* get lock */
- if( p_msg->i_count == INTF_MSG_QSIZE ) /* flush queue if needed */
- {
-#ifdef DEBUG /* in debug mode, queue overflow causes a warning */
- fprintf(stderr, "warning: message queue overflow\n" );
-#endif
- FlushLockedMsg( p_msg );
- }
- p_msg_item = p_msg->msg + p_msg->i_count++; /* select message */
-#endif /*.............................................. end of queue mode ...*/
-
- /*
- * Fill message information fields
- */
- p_msg_item->i_type = i_type;
- p_msg_item->psz_msg = psz_str;
-#ifdef TRACE
- p_msg_item->date = mdate();
+# endif
#endif
-#ifdef INTF_MSG_QUEUE /*......................................... queue mode */
- vlc_mutex_unlock( &p_msg->lock ); /* give lock back */
-#else /*....................................................... instant mode */
- PrintMsg( p_msg_item ); /* print message */
- free( psz_str ); /* free message data */
-#endif /*....................................................................*/
-}
-
-/*****************************************************************************
- * QueueDbgMsg: add a message to a queue with debugging informations
- *****************************************************************************
- * This function is the same as QueueMsg, except that it is only defined when
- * TRACE is define, and require additionnal debugging informations.
- *****************************************************************************/
-#ifdef TRACE
-static void QueueDbgMsg(intf_msg_t *p_msg, char *psz_file, char *psz_function,
- int i_line, char *psz_format, va_list ap)
-{
- char * psz_str; /* formatted message string */
- intf_msg_item_t * p_msg_item; /* pointer to message */
-#ifdef WIN32
- char * psz_temp;
-#endif
+ /* Put message in queue */
+ vlc_mutex_lock( &msg_bank.lock );
-#ifndef INTF_MSG_QUEUE /*................................... instant mode ...*/
- intf_msg_item_t msg_item; /* message */
- p_msg_item = &msg_item;
-#endif /*....................................................................*/
+ /* Send the message to stderr */
+ fprintf( stderr, "%s\n", psz_str );
- /*
- * Convert message to string
- */
-#ifdef HAVE_VASPRINTF
- vasprintf( &psz_str, psz_format, ap );
-#else
- psz_str = (char*) malloc( INTF_MAX_MSG_SIZE );
-#endif
- if( psz_str == NULL )
+ if( ((msg_bank.i_stop - msg_bank.i_start + 1) % INTF_MSG_QSIZE) == 0 )
{
- fprintf(stderr, "warning: can't store following message (%s): ",
- strerror(errno) );
- fprintf(stderr, INTF_MSG_DBG_FORMAT, psz_file, psz_function, i_line );
- vfprintf(stderr, psz_format, ap );
- fprintf(stderr, "\n" );
- exit( errno );
- }
-#ifndef HAVE_VASPRINTF
-#ifdef WIN32
- psz_temp = ConvertPrintfFormatString(psz_format);
- vsprintf( psz_str, psz_temp, ap );
- free( psz_temp );
-#else
- vsprintf( psz_str, psz_format, ap );
-#endif /* WIN32 */
-#endif /* HAVE_VASPRINTF */
+ FlushLockedMsg( );
-#ifdef INTF_MSG_QUEUE /*...................................... queue mode ...*/
- vlc_mutex_lock( &p_msg->lock ); /* get lock */
- if( p_msg->i_count == INTF_MSG_QSIZE ) /* flush queue if needed */
- {
- fprintf(stderr, "warning: message queue overflow\n" );
- FlushLockedMsg( p_msg );
+ if( ((msg_bank.i_stop - msg_bank.i_start + 1) % INTF_MSG_QSIZE) == 0 )
+ {
+ fprintf( stderr, "intf warning: message queue overflow\n" );
+ vlc_mutex_unlock( &msg_bank.lock );
+ return;
+ }
}
- p_msg_item = p_msg->msg + p_msg->i_count++; /* select message */
-#endif /*.............................................. end of queue mode ...*/
- /*
- * Fill message information fields
- */
- p_msg_item->i_type = INTF_MSG_DBG;
- p_msg_item->psz_msg = psz_str;
- p_msg_item->psz_file = psz_file;
- p_msg_item->psz_function = psz_function;
- p_msg_item->i_line = i_line;
- p_msg_item->date = mdate();
-
-#ifdef INTF_MSG_QUEUE /*......................................... queue mode */
- vlc_mutex_unlock( &p_msg->lock ); /* give lock back */
-#else /*....................................................... instant mode */
- PrintMsg( p_msg_item ); /* print message */
- free( psz_str ); /* free message data */
-#endif /*....................................................................*/
-}
-#endif
+ p_item = msg_bank.msg + msg_bank.i_stop;
+ msg_bank.i_stop = (msg_bank.i_stop + 1) % INTF_MSG_QSIZE;
-/*****************************************************************************
- * FlushLockedMsg (ok ?)
- *****************************************************************************
- * Print all messages remaining in queue. MESSAGE QUEUE MUST BE LOCKED, since
- * this function does not check the lock. This function is only defined if
- * INTF_MSG_QUEUE is defined.
- *****************************************************************************/
-#ifdef INTF_MSG_QUEUE
-static void FlushLockedMsg ( intf_msg_t *p_msg )
-{
- int i_index;
+ /* Fill message information fields */
+ p_item->i_type = i_type;
+ p_item->psz_msg = psz_str;
- for( i_index = 0; i_index < p_msg->i_count; i_index++ )
- {
- /* Print message and free message data */
- PrintMsg( &p_msg->msg[i_index] );
- free( p_msg->msg[i_index].psz_msg );
- }
-
- p_msg->i_count = 0;
+ vlc_mutex_unlock( &msg_bank.lock );
}
-#endif
/*****************************************************************************
- * PrintMsg: print a message (ok ?)
+ * FlushLockedMsg (ok ?)
*****************************************************************************
- * Print a single message. The message data is not freed. This function exists
- * in two version. The TRACE version prints a date with each message, and is
- * able to log messages (if TRACE_LOG is defined).
- * The normal one just prints messages to the screen.
+ * Print all messages remaining in queue. MESSAGE QUEUE MUST BE LOCKED, since
+ * this function does not check the lock.
*****************************************************************************/
-#ifdef TRACE
-
-static void PrintMsg( intf_msg_item_t *p_msg )
+static void FlushLockedMsg ( void )
{
- char psz_date[MSTRTIME_MAX_SIZE]; /* formatted time buffer */
- int i_msg_len = MSTRTIME_MAX_SIZE + strlen(p_msg->psz_msg) + 200;
- char *psz_msg; /* message buffer */
+ int i_index, i_start, i_stop;
- psz_msg = malloc( sizeof( char ) * i_msg_len );
+ /* Get the maximum message index that can be freed */
+ i_stop = msg_bank.i_stop;
- /* Check if allocation succeeded */
- if( psz_msg == NULL )
+ /* Check until which value we can free messages */
+ for( i_index = 0; i_index < msg_bank.i_sub; i_index++ )
{
- fprintf( stderr, "error: not enough memory for message %s\n",
- p_msg->psz_msg );
- return;
+ i_start = msg_bank.pp_sub[ i_index ]->i_start;
+
+ /* If this subscriber is late, we don't free messages before
+ * his i_start value, otherwise he'll miss messages */
+ if( ( i_start < i_stop
+ && (msg_bank.i_stop <= i_start || i_stop <= msg_bank.i_stop) )
+ || ( i_stop < i_start
+ && (i_stop <= msg_bank.i_stop && msg_bank.i_stop <= i_start) ) )
+ {
+ i_stop = i_start;
+ }
}
- /* Format message - the message is formatted here because in case the log
- * file is used, it avoids another format string parsing */
- switch( p_msg->i_type )
+ /* Free message data */
+ if( msg_bank.i_start <= i_stop )
{
- case INTF_MSG_STD: /* regular messages */
- case INTF_MSG_STAT:
- case INTF_MSG_ERR:
- snprintf( psz_msg, i_msg_len, "%s", p_msg->psz_msg );
- break;
-
- case INTF_MSG_WARN: /* Warning message */
- mstrtime( psz_date, p_msg->date );
- snprintf( psz_msg, i_msg_len, "(%s) %s",
- psz_date, p_msg->psz_msg );
-
- break;
-
- case INTF_MSG_DBG: /* debug messages */
- mstrtime( psz_date, p_msg->date );
- snprintf( psz_msg, i_msg_len, "(%s) " INTF_MSG_DBG_FORMAT "%s",
- psz_date, p_msg->psz_file, p_msg->psz_function, p_msg->i_line,
- p_msg->psz_msg );
- break;
+ i_index = msg_bank.i_start;
}
-
- /*
- * Print messages
- */
- switch( p_msg->i_type )
+ else
{
- case INTF_MSG_STD: /* standard messages */
- case INTF_MSG_STAT:
- fprintf( stdout, "%s\n", psz_msg );
- break;
- case INTF_MSG_ERR: /* error messages */
- case INTF_MSG_WARN:
-#ifndef TRACE_LOG_ONLY
- case INTF_MSG_DBG: /* debugging messages */
-#endif
- fprintf( stderr, "%s\n", psz_msg );
- break;
- }
+ for( i_index = msg_bank.i_start; i_index < INTF_MSG_QSIZE; i_index++ )
+ {
+ free( msg_bank.msg[i_index].psz_msg );
+ }
-#ifdef TRACE_LOG
- /* Append all messages to log file */
- if( p_main->p_msg->p_log_file != NULL )
- {
- fwrite( psz_msg, strlen( psz_msg ), 1, p_main->p_msg->p_log_file );
- fwrite( "\n", 1, 1, p_main->p_msg->p_log_file );
+ i_index = 0;
}
-#endif
- /* Free the message */
- free( psz_msg );
-}
-
-#else
-
-static void PrintMsg( intf_msg_item_t *p_msg )
-{
- /*
- * Print messages on screen
- */
- switch( p_msg->i_type )
+ for( ; i_index < i_stop; i_index++ )
{
- case INTF_MSG_STD: /* standard messages */
- case INTF_MSG_STAT:
- case INTF_MSG_DBG: /* debug messages */
- fprintf( stdout, "%s\n", p_msg->psz_msg );
- break;
- case INTF_MSG_ERR: /* error messages */
- case INTF_MSG_WARN:
- fprintf( stderr, "%s\n", p_msg->psz_msg ); /* warning message */
- break;
+ free( msg_bank.msg[i_index].psz_msg );
}
-}
-
-#endif
+ /* Update the new start value */
+ msg_bank.i_start = i_index;
+}
-#if defined( WIN32 )
/*****************************************************************************
* ConvertPrintfFormatString: replace all occurrences of %ll with %I64 in the
* printf format string.
* a "long long" type!!!
* By the way, if we don't do this we can sometimes end up with segfaults.
*****************************************************************************/
+#if defined( WIN32 )
static char *ConvertPrintfFormatString( char *psz_format )
{
int i, i_counter=0, i_pos=0;
psz_dest = malloc( strlen(psz_format) + i_counter + 1 );
if( psz_dest == NULL )
{
- fprintf(stderr, "warning: malloc failed in ConvertPrintfFormatString\n");
+ fprintf( stderr, "intf warning: ConvertPrintfFormatString failed\n");
exit (errno);
}
* and spawn threads.
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: main.c,v 1.151 2002/02/15 13:32:54 sam Exp $
+ * $Id: main.c,v 1.152 2002/02/19 00:50:19 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
#define OPT_SYNCHRO 190
#define OPT_WARNING 191
#define OPT_VERSION 192
-#define OPT_STDOUT 193
-#define OPT_STATS 194
+#define OPT_STATS 193
#define OPT_MPEG_ADEC 200
#define OPT_AC3_ADEC 201
/* Interface options */
{ "intf", 1, 0, 'I' },
{ "warning", 1, 0, OPT_WARNING },
- { "stdout", 1, 0, OPT_STDOUT },
{ "stats", 0, 0, OPT_STATS },
/* Audio options */
static void IllegalSignalHandler ( int i_signal );
static u32 CPUCapabilities ( void );
-static int RedirectSTDOUT ( void );
static void ShowConsole ( void );
static jmp_buf env;
/*
* Initialize messages interface
*/
- p_main->p_msg = intf_MsgCreate();
- if( !p_main->p_msg ) /* start messages interface */
- {
- fprintf( stderr, "error: can't initialize messages interface (%s)\n",
- strerror(errno) );
- return( errno );
- }
+ intf_MsgCreate();
- intf_MsgImm( COPYRIGHT_MESSAGE "\n" );
+ intf_Msg( COPYRIGHT_MESSAGE "\n" );
/*
* Read configuration
* Redirect the standard output if required by the user, and on Win32 we
* also open a console to display the debug messages.
*/
- RedirectSTDOUT();
-
if( p_main->b_stats )
{
char p_capabilities[200];
/* General/common options */
case 'h': /* -h, --help */
ShowConsole();
- RedirectSTDOUT();
Usage( SHORT_HELP );
#ifdef WIN32 /* Pause the console because it's destroyed when we exit */
- if( strcmp( "", main_GetPszVariable( INTF_STDOUT_VAR,
- INTF_STDOUT_DEFAULT ) ) == 0 )
- {
- /* No stdout redirection has been asked for */
- intf_MsgImm( "\nPress the RETURN key to continue..." );
- getchar();
- }
+ intf_Msg( "\nPress the RETURN key to continue..." );
+ getchar();
#endif
return( -1 );
break;
case 'H': /* -H, --longhelp */
ShowConsole();
- RedirectSTDOUT();
Usage( LONG_HELP );
#ifdef WIN32 /* Pause the console because it's destroyed when we exit */
- if( strcmp( "", main_GetPszVariable( INTF_STDOUT_VAR,
- INTF_STDOUT_DEFAULT ) ) == 0 )
- {
- /* No stdout redirection has been asked for */
- intf_MsgImm( "\nPress the RETURN key to continue..." );
- getchar();
- }
+ intf_Msg( "\nPress the RETURN key to continue..." );
+ getchar();
#endif
return( -1 );
break;
case OPT_VERSION: /* --version */
ShowConsole();
- RedirectSTDOUT();
Version();
#ifdef WIN32 /* Pause the console because it's destroyed when we exit */
- if( strcmp( "", main_GetPszVariable( INTF_STDOUT_VAR,
- INTF_STDOUT_DEFAULT ) ) == 0 )
- {
- /* No stdout redirection has been asked for */
- intf_MsgImm( "\nPress the RETURN key to continue..." );
- getchar();
- }
+ intf_Msg( "\nPress the RETURN key to continue..." );
+ getchar();
#endif
return( -1 );
break;
p_main->i_warning_level = atoi(optarg);
break;
- case OPT_STDOUT: /* --stdout */
- main_PutPszVariable( INTF_STDOUT_VAR, optarg );
- break;
-
case OPT_STATS:
p_main->b_stats = 1;
break;
case '?':
default:
ShowConsole();
- RedirectSTDOUT();
intf_ErrMsg( "intf error: unknown option `%s'",
ppsz_argv[optind] );
Usage( USAGE );
#ifdef WIN32 /* Pause the console because it's destroyed when we exit */
- if( strcmp( "", main_GetPszVariable( INTF_STDOUT_VAR,
- INTF_STDOUT_DEFAULT ) ) == 0 )
- {
- /* No stdout redirection has been asked for */
- intf_MsgImm( "\nPress the RETURN key to continue..." );
- getchar();
- }
+ intf_Msg( "\nPress the RETURN key to continue..." );
+ getchar();
#endif
return( EINVAL );
break;
static void Usage( int i_fashion )
{
/* Usage */
- intf_MsgImm( "Usage: %s [options] [parameters] [file]...",
+ intf_Msg( "Usage: %s [options] [parameters] [file]...",
p_main->psz_arg0 );
if( i_fashion == USAGE )
{
- intf_MsgImm( "Try `%s --help' for more information.",
+ intf_Msg( "Try `%s --help' for more information.",
p_main->psz_arg0 );
return;
}
/* Options */
- intf_MsgImm( "\nOptions:"
+ intf_Msg( "\nOptions:"
"\n -I, --intf <module> \tinterface method"
"\n -v, --verbose \tverbose mode (cumulative)"
- "\n --stdout <filename> \tredirect console stdout"
"\n --memcpy <module> \tmemcpy method"
"\n"
"\n --noaudio \tdisable audio"
return;
/* Interface parameters */
- intf_MsgImm( "\nInterface parameters:"
+ intf_Msg( "\nInterface parameters:"
"\n " INTF_METHOD_VAR "=<method name> \tinterface method"
"\n " INTF_INIT_SCRIPT_VAR "=<filename> \tinitialization script"
"\n " INTF_CHANNELS_VAR "=<filename> \tchannels list"
- "\n " INTF_STDOUT_VAR "=<filename> \tredirect console stdout"
"\n " MEMCPY_METHOD_VAR "=<method name> \tmemcpy method" );
/* Audio parameters */
- intf_MsgImm( "\nAudio parameters:"
+ intf_Msg( "\nAudio parameters:"
"\n " AOUT_METHOD_VAR "=<method name> \taudio method"
"\n " AOUT_DSP_VAR "=<filename> \tdsp device path"
"\n " AOUT_STEREO_VAR "={1|0} \tstereo or mono output"
"\n " AOUT_RATE_VAR "=<rate> \toutput rate" );
/* Video parameters */
- intf_MsgImm( "\nVideo parameters:"
+ intf_Msg( "\nVideo parameters:"
"\n " VOUT_METHOD_VAR "=<method name> \tdisplay method"
"\n " VOUT_DISPLAY_VAR "=<display name> \tdisplay used"
"\n " VOUT_WIDTH_VAR "=<width> \tdisplay width"
"\n " VOUT_SPUMARGIN_VAR "=<margin> \tforce SPU margin" );
/* DVD parameters */
- intf_MsgImm( "\nDVD parameters:"
+ intf_Msg( "\nDVD parameters:"
"\n " INPUT_DVD_DEVICE_VAR "=<device> \tDVD device"
"\n " INPUT_TITLE_VAR "=<title> \ttitle number"
"\n " INPUT_CHAPTER_VAR "=<chapter> \tchapter number"
"\n " INPUT_SUBTITLE_VAR "=[0-31] \tsubtitle channel" );
/* Input parameters */
- intf_MsgImm( "\nInput parameters:"
+ intf_Msg( "\nInput parameters:"
"\n " INPUT_IFACE_VAR "=<interface> \tnetwork interface"
"\n " INPUT_CHANNEL_SERVER_VAR "=<hostname> \tchannel server"
"\n " INPUT_CHANNEL_PORT_VAR "=<port> \tchannel server port" );
/* Decoder parameters */
- intf_MsgImm( "\nDecoder parameters:"
+ intf_Msg( "\nDecoder parameters:"
"\n " ADEC_MPEG_VAR "=<builtin|mad> \tMPEG audio decoder"
"\n " ADEC_AC3_VAR "=<builtin|a52> \tAC3 audio decoder" );
}
*****************************************************************************/
static void Version( void )
{
- intf_MsgImm( VERSION_MESSAGE
+ intf_Msg( VERSION_MESSAGE
"This program comes with NO WARRANTY, to the extent permitted by law.\n"
"You may redistribute it under the terms of the GNU General Public License;\n"
"see the file named COPYING for details.\n"
#endif
/* Acknowledge the signal received */
- intf_ErrMsgImm( "intf error: signal %d received, exiting", i_signal );
+ intf_ErrMsg( "intf error: signal %d received, exiting", i_signal );
/* Try to terminate everything - this is done by requesting the end of the
* interface thread */
#endif
}
-/*****************************************************************************
- * RedirectSTDOUT: redirect stdout and stderr to a file
- *****************************************************************************
- * This function will redirect stdout and stderr to a file if the user has
- * specified so.
- *****************************************************************************/
-static int RedirectSTDOUT( void )
-{
- int i_fd;
- char *psz_filename;
-
- psz_filename = main_GetPszVariable( INTF_STDOUT_VAR, INTF_STDOUT_DEFAULT );
-
- if( *psz_filename )
- {
- ShowConsole();
- i_fd = open( psz_filename, O_CREAT | O_TRUNC | O_RDWR,
- S_IREAD | S_IWRITE );
- if( dup2( i_fd, fileno(stdout) ) == -1 )
- {
- intf_ErrMsg( "warning: unable to redirect stdout" );
- }
-
- if( dup2( i_fd, fileno(stderr) ) == -1 )
- {
- intf_ErrMsg( "warning: unable to redirect stderr" );
- }
-
- close( i_fd );
- }
- else
- {
- /* No stdout redirection has been asked so open a console */
- if( p_main->i_warning_level )
- {
- ShowConsole();
- }
-
- }
-
- return 0;
-}
-
/*****************************************************************************
* ShowConsole: On Win32, create an output console for debug messages
*****************************************************************************
* modules.c : Built-in and plugin modules management functions
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: modules.c,v 1.52 2002/02/15 13:32:54 sam Exp $
+ * $Id: modules.c,v 1.53 2002/02/19 00:50:20 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Ethan C. Baldridge <BaldridgeE@cadmus.com>
break;
default:
- intf_ErrMsg( "module error: if you can read this, sam fucked up something very bad... fuck him with a chainsaw on vlc-devel" );
+ intf_ErrMsg( "module error: unknown module type %i",
+ i_capability );
i_ret = -1;
break;
}
}
else if( psz_name != NULL && *psz_name )
{
- intf_ErrMsg( "module error: requested %s module `%s' not found",
+ intf_ErrMsg( "module error: requested %s module `%s' unavailable",
GetCapabilityName( i_capability ), psz_name );
}
psz_fullpath = *ppsz_path;
}
- intf_WarnMsgImm( 1, "module: browsing `%s'", psz_fullpath );
+ intf_WarnMsg( 1, "module: browsing `%s'", psz_fullpath );
if( (dir = opendir( psz_fullpath )) )
{
if( module_load( psz_filename, &handle ) )
{
/* The plugin module couldn't be opened */
- intf_WarnMsgImm( 1, "module warning: cannot open %s (%s)",
+ intf_WarnMsg( 1, "module warning: cannot open %s (%s)",
psz_filename, module_error() );
return( -1 );
}
p_module_bank->i_count++;
/* Immediate message so that a slow module doesn't make the user wait */
- intf_WarnMsgImm( 2, "module: new plugin module `%s', %s",
+ intf_WarnMsg( 2, "module: new plugin module `%s', %s",
p_module->psz_name, p_module->psz_longname );
return( 0 );
p_module_bank->i_count++;
/* Immediate message so that a slow module doesn't make the user wait */
- intf_WarnMsgImm( 2, "module: new builtin module `%s', %s",
+ intf_WarnMsg( 2, "module: new builtin module `%s', %s",
p_module->psz_name, p_module->psz_longname );
return( 0 );
* modules_plugin.h : Plugin management functions used by the core application.
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: modules_plugin.h,v 1.8 2002/01/29 20:11:18 gbazin Exp $
+ * $Id: modules_plugin.h,v 1.9 2002/02/19 00:50:20 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
/*****************************************************************************
* STORE_SYMBOLS: store known symbols into p_symbols for plugin access.
*****************************************************************************/
-#ifdef TRACE
-# define STORE_TRACE_SYMBOLS( p_symbols ) \
- (p_symbols)->intf_DbgMsg = _intf_DbgMsg; \
- (p_symbols)->intf_DbgMsgImm = _intf_DbgMsgImm;
-#else
-# define STORE_TRACE_SYMBOLS( p_symbols )
-#endif
-
#define STORE_SYMBOLS( p_symbols ) \
- STORE_TRACE_SYMBOLS( p_symbols ) \
(p_symbols)->p_main = p_main; \
(p_symbols)->p_input_bank = p_input_bank; \
(p_symbols)->p_aout_bank = p_aout_bank; \
(p_symbols)->main_GetPszVariable = main_GetPszVariable; \
(p_symbols)->main_PutIntVariable = main_PutIntVariable; \
(p_symbols)->main_PutPszVariable = main_PutPszVariable; \
+ (p_symbols)->intf_MsgSub = intf_MsgSub; \
+ (p_symbols)->intf_MsgUnsub = intf_MsgUnsub; \
(p_symbols)->intf_Msg = intf_Msg; \
(p_symbols)->intf_ErrMsg = intf_ErrMsg; \
(p_symbols)->intf_StatMsg = intf_StatMsg;\
(p_symbols)->intf_WarnMsg = intf_WarnMsg; \
- (p_symbols)->intf_WarnMsgImm = intf_WarnMsgImm; \
(p_symbols)->intf_PlaylistAdd = intf_PlaylistAdd; \
(p_symbols)->intf_PlaylistDelete = intf_PlaylistDelete; \
(p_symbols)->intf_PlaylistNext = intf_PlaylistNext; \
* thread, and destroy a previously oppened video output thread.
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: video_output.c,v 1.159 2002/02/18 19:02:41 stef Exp $
+ * $Id: video_output.c,v 1.160 2002/02/19 00:50:20 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
p_vout->b_active = 1;
*p_vout->pi_status = THREAD_READY;
- intf_DbgMsg("thread ready");
return( 0 );
}
* to display. */
vlc_mutex_lock( &p_vout->change_lock );
-#ifdef TRACE_VOUT
- intf_DbgMsg( "picture %p, subpicture %p", p_picture, p_subpic );
-#endif
-
/*
* Display the previously rendered picture
*/
/* Destroy thread structures allocated by CreateThread */
DestroyThread( p_vout, THREAD_OVER );
- intf_DbgMsg( "thread end" );
}
/*****************************************************************************
* video_text.c : text manipulation functions
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: video_text.c,v 1.33 2001/12/30 07:09:56 sam Exp $
+ * $Id: video_text.c,v 1.34 2002/02/19 00:50:20 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
if( i_file == -1 )
{
- intf_DbgMsg( "vout error: can't open file '%s' (%s)",
+ intf_ErrMsg( "vout error: can't open file '%s' (%s)",
psz_name, strerror(errno) );
return( NULL );
}
break;
}
-
- intf_DbgMsg( "loaded %s: type %d, %d-%dx%d", psz_name, p_font->i_type,
+ intf_ErrMsg( "loaded %s: type %d, %d-%dx%d", psz_name, p_font->i_type,
p_font->i_width, p_font->i_interspacing, p_font->i_height );
+
return( p_font );
}
return;
}
- intf_DbgMsg( "vout: unloading font %p", p_font );
free( p_font->p_data );
free( p_font );
}
* vout_pictures.c : picture management functions
*****************************************************************************
* Copyright (C) 2000 VideoLAN
- * $Id: vout_pictures.c,v 1.15 2002/02/15 13:32:54 sam Exp $
+ * $Id: vout_pictures.c,v 1.16 2002/02/19 00:50:20 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
case RESERVED_DATED_PICTURE:
p_pic->i_status = READY_PICTURE;
break;
-#ifdef DEBUG
default:
intf_ErrMsg( "error: picture %p has invalid status %d",
p_pic, p_pic->i_status );
break;
-#endif
}
-#ifdef TRACE_VOUT
- intf_DbgMsg("picture %p", p_pic);
-#endif
vlc_mutex_unlock( &p_vout->picture_lock );
}
void vout_DatePicture( vout_thread_t *p_vout,
picture_t *p_pic, mtime_t date )
{
-#ifdef TRACE_VOUT
- char psz_date[ MSTRTIME_MAX_SIZE ]; /* date */
-#endif
-
vlc_mutex_lock( &p_vout->picture_lock );
p_pic->date = date;
switch( p_pic->i_status )
case RESERVED_DISP_PICTURE:
p_pic->i_status = READY_PICTURE;
break;
-#ifdef DEBUG
default:
intf_ErrMsg( "error: picture %p has invalid status %d",
p_pic, p_pic->i_status );
break;
-#endif
}
-#ifdef TRACE_VOUT
- intf_DbgMsg( "picture %p, display date: %s",
- p_pic, mstrtime( psz_date, p_pic->date) );
-#endif
vlc_mutex_unlock( &p_vout->picture_lock );
}
{
vlc_mutex_lock( &p_vout->picture_lock );
p_pic->i_refcount++;
-
-#ifdef TRACE_VOUT
- intf_DbgMsg( "picture %p refcount=%d", p_pic, p_pic->i_refcount );
-#endif
-
vlc_mutex_unlock( &p_vout->picture_lock );
}
vlc_mutex_lock( &p_vout->picture_lock );
p_pic->i_refcount--;
-#ifdef TRACE_VOUT
if( p_pic->i_refcount < 0 )
{
- intf_DbgMsg( "error: refcount < 0" );
+ intf_ErrMsg( "vout error: picture refcount is %i", p_pic->i_refcount );
p_pic->i_refcount = 0;
}
-#endif
if( ( p_pic->i_refcount == 0 ) &&
( p_pic->i_status == DISPLAYED_PICTURE ) )
p_vout->i_heap_size--;
}
-#ifdef TRACE_VOUT
- intf_DbgMsg( "picture %p refcount=%d", p_pic, p_pic->i_refcount );
-#endif
-
vlc_mutex_unlock( &p_vout->picture_lock );
}
* vout_subpictures.c : subpicture management functions
*****************************************************************************
* Copyright (C) 2000 VideoLAN
- * $Id: vout_subpictures.c,v 1.7 2002/02/13 22:10:40 sam Exp $
+ * $Id: vout_subpictures.c,v 1.8 2002/02/19 00:50:20 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
static void vout_RenderSPU( const vout_thread_t *p_vout, picture_t *p_pic,
const subpicture_t *p_spu );
-/* FIXME: fake palette - the real one has to be sought in the .IFO */
-static int p_palette[4] = { 0x0000, 0x0000, 0xffff, 0x8888 };
-
/*****************************************************************************
* vout_DisplaySubPicture: display a subpicture unit
*****************************************************************************
- * Remove the reservation flag of a subpicture, which will cause it to be ready
- * for display. The picture does not need to be locked, since it is ignored by
- * the output thread if is reserved.
+ * Remove the reservation flag of a subpicture, which will cause it to be
+ * ready for display.
*****************************************************************************/
void vout_DisplaySubPicture( vout_thread_t *p_vout, subpicture_t *p_subpic )
{
-#ifdef TRACE_VOUT
- char psz_start[ MSTRTIME_MAX_SIZE ]; /* buffer for date string */
- char psz_stop[ MSTRTIME_MAX_SIZE ]; /* buffer for date string */
-#endif
int i_margin;
-#ifdef DEBUG
/* Check if status is valid */
if( p_subpic->i_status != RESERVED_SUBPICTURE )
{
- intf_ErrMsg( "error: subpicture %p has invalid status #%d",
+ intf_ErrMsg( "vout error: subpicture %p has invalid status #%d",
p_subpic, p_subpic->i_status );
}
-#endif
/* If the user requested an SPU margin, we force the position after
* having checked that it was a valid value. */
/* Remove reservation flag */
p_subpic->i_status = READY_SUBPICTURE;
-
-#ifdef TRACE_VOUT
- /* Send subpicture information */
- intf_DbgMsg("subpicture %p: type=%d, begin date=%s, end date=%s",
- p_subpic, p_subpic->i_type,
- mstrtime( psz_start, p_subpic->i_start ),
- mstrtime( psz_stop, p_subpic->i_stop ) );
-#endif
}
/*****************************************************************************
* the best possible case, since no memory allocation needs
* to be done */
p_vout->p_subpicture[i_subpic].i_status = RESERVED_SUBPICTURE;
-#ifdef TRACE_VOUT
- intf_DbgMsg("subpicture %p (in destroyed subpicture slot)",
- &p_vout->p_subpicture[i_subpic] );
-#endif
vlc_mutex_unlock( &p_vout->subpicture_lock );
return( &p_vout->p_subpicture[i_subpic] );
}
p_free_subpic = p_destroyed_subpic;
}
- /*
- * Prepare subpicture
- */
- if( p_free_subpic != NULL )
+ /* If no free or destroyed subpicture could be found */
+ if( p_free_subpic == NULL )
{
- /* Allocate memory */
- switch( i_type )
- {
- case TEXT_SUBPICTURE: /* text subpicture */
- p_free_subpic->p_data = memalign( 16, i_size + 1 );
- break;
- case DVD_SUBPICTURE: /* DVD subpicture unit */
- p_free_subpic->p_data = memalign( 16, i_size );
- break;
-#ifdef DEBUG
- default:
- intf_ErrMsg("error: unknown subpicture type %d", i_type );
- p_free_subpic->p_data = NULL;
- break;
-#endif
- }
+ intf_ErrMsg( "vout error: subpicture heap is full" );
+ vlc_mutex_unlock( &p_vout->subpicture_lock );
+ return( NULL );
+ }
- if( p_free_subpic->p_data != NULL )
- {
- /* Copy subpicture information, set some default values */
- p_free_subpic->i_type = i_type;
- p_free_subpic->i_status = RESERVED_SUBPICTURE;
- p_free_subpic->i_size = i_size;
- p_free_subpic->i_x = 0;
- p_free_subpic->i_y = 0;
- p_free_subpic->i_width = 0;
- p_free_subpic->i_height = 0;
- p_free_subpic->i_horizontal_align = CENTER_RALIGN;
- p_free_subpic->i_vertical_align = CENTER_RALIGN;
- }
- else
- {
- /* Memory allocation failed : set subpicture as empty */
- p_free_subpic->i_type = EMPTY_SUBPICTURE;
- p_free_subpic->i_status = FREE_SUBPICTURE;
- p_free_subpic = NULL;
- intf_ErrMsg( "vout error: spu allocation returned %s",
- strerror( ENOMEM ) );
- }
+ /* Prepare subpicture */
+ switch( i_type )
+ {
+ case TEXT_SUBPICTURE: /* text subpicture */
+ p_free_subpic->p_data = memalign( 16, i_size + 1 );
+ break;
+ case DVD_SUBPICTURE: /* DVD subpicture unit */
+ p_free_subpic->p_data = memalign( 16, i_size );
+ break;
+ default:
+ intf_ErrMsg( "vout error: unknown subpicture type %d", i_type );
+ p_free_subpic->p_data = NULL;
+ break;
+ }
-#ifdef TRACE_VOUT
- intf_DbgMsg("subpicture %p (in free subpicture slot)", p_free_subpic );
-#endif
- vlc_mutex_unlock( &p_vout->subpicture_lock );
- return( p_free_subpic );
+ if( p_free_subpic->p_data != NULL )
+ {
+ /* Copy subpicture information, set some default values */
+ p_free_subpic->i_type = i_type;
+ p_free_subpic->i_status = RESERVED_SUBPICTURE;
+ p_free_subpic->i_size = i_size;
+ p_free_subpic->i_x = 0;
+ p_free_subpic->i_y = 0;
+ p_free_subpic->i_width = 0;
+ p_free_subpic->i_height = 0;
+ }
+ else
+ {
+ /* Memory allocation failed : set subpicture as empty */
+ p_free_subpic->i_type = EMPTY_SUBPICTURE;
+ p_free_subpic->i_status = FREE_SUBPICTURE;
+ p_free_subpic = NULL;
+ intf_ErrMsg( "vout error: spu allocation returned %s",
+ strerror( ENOMEM ) );
}
- /* No free or destroyed subpicture could be found */
- intf_DbgMsg( "warning: subpicture heap is full" );
vlc_mutex_unlock( &p_vout->subpicture_lock );
- return( NULL );
+
+ return( p_free_subpic );
}
/*****************************************************************************
*****************************************************************************/
void vout_DestroySubPicture( vout_thread_t *p_vout, subpicture_t *p_subpic )
{
-#ifdef DEBUG
/* Check if status is valid */
if( ( p_subpic->i_status != RESERVED_SUBPICTURE )
&& ( p_subpic->i_status != READY_SUBPICTURE ) )
{
- intf_ErrMsg("error: subpicture %p has invalid status %d",
+ intf_ErrMsg( "vout error: subpicture %p has invalid status %d",
p_subpic, p_subpic->i_status );
}
-#endif
p_subpic->i_status = DESTROYED_SUBPICTURE;
-
-#ifdef TRACE_VOUT
- intf_DbgMsg("subpicture %p", p_subpic);
-#endif
}
/*****************************************************************************
#endif
default:
-#ifdef DEBUG
- intf_ErrMsg( "error: unknown subpicture %p type %d",
+ intf_ErrMsg( "vout error: unknown subpicture %p type %d",
p_subpic, p_subpic->i_type );
-#endif
break;
}
return p_subpic;
}
-#if 0 /* code removed because we should use the FOURCC value instead */
/*****************************************************************************
- * vout_RenderRGBSPU: draw an SPU on a picture
+ * vout_RenderSPU: draw an SPU on a picture
*****************************************************************************
* This is a fast implementation of the subpicture drawing code. The data
* has been preprocessed once in spu_decoder.c, so we don't need to parse the
* RLE buffer again and again. Most sanity checks are done in spu_decoder.c
* so that this routine can be as fast as possible.
*****************************************************************************/
-static void vout_RenderRGBSPU( const vout_thread_t *p_vout, picture_t *p_pic,
- const subpicture_t *p_spu )
+static void vout_RenderSPU( const vout_thread_t *p_vout, picture_t *p_pic,
+ const subpicture_t *p_spu )
{
- int i_len, i_color;
+ /* Common variables */
+ u8 p_clut8[4], p_trsp[4];
+ u16 p_clut16[4];
+ u8 *p_dest;
u16 *p_source = (u16 *)p_spu->p_data;
- int i_xscale = ( p_buffer->i_pic_width << 6 ) / p_pic->i_width;
- int i_yscale = ( p_buffer->i_pic_height << 6 ) / p_pic->i_height;
+ int i_x, i_y;
+ int i_len, i_color;
+
+ /* RGB-specific */
+ int i_xscale, i_yscale, i_width, i_height, i_ytmp, i_yreal, i_ynext;
+
+ /* FIXME: get this from the DVD */
+ p_trsp[0] = 0x00; p_trsp[1] = 0xff; p_trsp[2] = 0xff; p_trsp[3] = 0xff;
- int i_width = p_spu->i_width * i_xscale;
- int i_height = p_spu->i_height * i_yscale;
+ switch( p_vout->output.i_chroma )
+ {
+ /* I420 target, no scaling */
+ case FOURCC_I420:
+ case FOURCC_IYUV:
+ case FOURCC_YV12:
- int i_x, i_y, i_ytmp, i_yreal, i_ynext;
+ /* FIXME: get this from the DVD */
+ p_clut8[0] = 0xaa; p_clut8[1] = 0x44;
+ p_clut8[2] = 0xff; p_clut8[3] = 0x88;
- u8 *p_dest = p_buffer->p_data + ( i_width >> 6 ) * i_bytes_per_pixel
- /* Add the picture coordinates and the SPU coordinates */
- + ( p_buffer->i_pic_x + ((p_spu->i_x * i_xscale) >> 6))
- * i_bytes_per_pixel
- + ( p_buffer->i_pic_y + ((p_spu->i_y * i_yscale) >> 6))
- * i_bytes_per_line;
+ p_dest = p_pic->p->p_pixels + p_spu->i_x + p_spu->i_width
+ + p_vout->output.i_width * ( p_spu->i_y + p_spu->i_height );
/* Draw until we reach the bottom of the subtitle */
- i_y = 0;
+ for( i_y = p_spu->i_height * p_vout->output.i_width ;
+ i_y ;
+ i_y -= p_vout->output.i_width )
+ {
+ /* Draw until we reach the end of the line */
+ for( i_x = p_spu->i_width ; i_x ; )
+ {
+ /* Get the RLE part, then draw the line */
+ i_color = *p_source & 0x3;
+
+ switch( p_trsp[ i_color ] )
+ {
+ case 0x00:
+ i_x -= *p_source++ >> 2;
+ break;
- while( i_y < i_height )
+ case 0xff:
+ i_len = *p_source++ >> 2;
+ memset( p_dest - i_x - i_y, p_clut8[ i_color ], i_len );
+ i_x -= i_len;
+ break;
+
+ default:
+ /* FIXME: we should do transparency */
+ i_len = *p_source++ >> 2;
+ memset( p_dest - i_x - i_y, p_clut8[ i_color ], i_len );
+ i_x -= i_len;
+ break;
+ }
+ }
+ }
+
+ break;
+
+ /* RV16 target, scaling */
+ case FOURCC_RV16:
+
+ /* FIXME: get this from the DVD */
+ p_clut16[0] = 0xaaaa; p_clut16[1] = 0x4444;
+ p_clut16[2] = 0xffff; p_clut16[3] = 0x8888;
+
+ i_xscale = ( p_vout->output.i_width << 6 ) / p_vout->render.i_width;
+ i_yscale = ( p_vout->output.i_height << 6 ) / p_vout->render.i_height;
+
+ i_width = p_spu->i_width * i_xscale;
+ i_height = p_spu->i_height * i_yscale;
+
+ p_dest = p_pic->p->p_pixels + ( i_width >> 6 ) * 2
+ /* Add the picture coordinates and the SPU coordinates */
+ + ( (p_spu->i_x * i_xscale) >> 6 ) * 2
+ + ( (p_spu->i_y * i_yscale) >> 6 ) * p_vout->output.i_width * 2;
+
+ /* Draw until we reach the bottom of the subtitle */
+ for( i_y = 0 ; i_y < i_height ; )
{
i_ytmp = i_y >> 6;
i_y += i_yscale;
if( i_ytmp + 1 >= ( i_y >> 6 ) )
{
/* Just one line : we precalculate i_y >> 6 */
- i_yreal = i_bytes_per_line * i_ytmp;
+ i_yreal = p_vout->output.i_width * 2 * i_ytmp;
/* Draw until we reach the end of the line */
- i_x = i_width;
-
- while( i_x )
+ for( i_x = i_width ; i_x ; )
{
- /* Get the RLE part */
+ /* Get the RLE part, then draw the line */
i_color = *p_source & 0x3;
- /* Draw the line */
- if( i_color )
+ switch( p_trsp[ i_color ] )
{
- i_len = i_xscale * ( *p_source++ >> 2 );
+ case 0x00:
+ i_x -= i_xscale * ( *p_source++ >> 2 );
+ break;
- memset( p_dest - i_bytes_per_pixel * ( i_x >> 6 )
- + i_yreal,
- p_palette[ i_color ],
- i_bytes_per_pixel * ( ( i_len >> 6 ) + 1 ) );
+ case 0xff:
+ i_len = i_xscale * ( *p_source++ >> 2 );
+ memset( p_dest - 2 * ( i_x >> 6 ) + i_yreal,
+ p_clut16[ i_color ],
+ 2 * ( ( i_len >> 6 ) + 1 ) );
+ i_x -= i_len;
+ break;
+ default:
+ /* FIXME: we should do transparency */
+ i_len = i_xscale * ( *p_source++ >> 2 );
+ memset( p_dest - 2 * ( i_x >> 6 ) + i_yreal,
+ p_clut16[ i_color ],
+ 2 * ( ( i_len >> 6 ) + 1 ) );
i_x -= i_len;
- continue;
+ break;
}
- i_x -= i_xscale * ( *p_source++ >> 2 );
}
}
else
{
- i_yreal = i_bytes_per_line * i_ytmp;
- i_ynext = i_bytes_per_line * i_y >> 6;
+ i_yreal = p_vout->output.i_width * 2 * i_ytmp;
+ i_ynext = p_vout->output.i_width * 2 * i_y >> 6;
/* Draw until we reach the end of the line */
- i_x = i_width;
-
- while( i_x )
+ for( i_x = i_width ; i_x ; )
{
- /* Get the RLE part */
+ /* Get the RLE part, then draw as many lines as needed */
i_color = *p_source & 0x3;
- /* Draw as many lines as needed */
- if( i_color )
+ switch( p_trsp[ i_color ] )
{
- i_len = i_xscale * ( *p_source++ >> 2 );
+ case 0x00:
+ i_x -= i_xscale * ( *p_source++ >> 2 );
+ break;
- for( i_ytmp = i_yreal ;
- i_ytmp < i_ynext ;
- i_ytmp += i_bytes_per_line )
+ case 0xff:
+ i_len = i_xscale * ( *p_source++ >> 2 );
+ for( i_ytmp = i_yreal ; i_ytmp < i_ynext ;
+ i_ytmp += p_vout->output.i_width * 2 )
{
- memset( p_dest - i_bytes_per_pixel * ( i_x >> 6 )
- + i_ytmp,
- p_palette[ i_color ],
- i_bytes_per_pixel * ( ( i_len >> 6 ) + 1 ) );
+ memset( p_dest - 2 * ( i_x >> 6 ) + i_ytmp,
+ p_clut16[ i_color ],
+ 2 * ( ( i_len >> 6 ) + 1 ) );
}
+ i_x -= i_len;
+ break;
+ default:
+ /* FIXME: we should do transparency */
+ i_len = i_xscale * ( *p_source++ >> 2 );
+ for( i_ytmp = i_yreal ; i_ytmp < i_ynext ;
+ i_ytmp += p_vout->output.i_width * 2 )
+ {
+ memset( p_dest - 2 * ( i_x >> 6 ) + i_ytmp,
+ p_clut16[ i_color ],
+ 2 * ( ( i_len >> 6 ) + 1 ) );
+ }
i_x -= i_len;
- continue;
+ break;
}
-
- i_x -= i_xscale * ( *p_source++ >> 2 );
}
}
}
-}
-#endif
-
-/*****************************************************************************
- * vout_RenderSPU: draw an SPU on an YUV overlay
- *****************************************************************************
- * This is a fast implementation of the subpicture drawing code. The data
- * has been preprocessed once in spu_decoder.c, so we don't need to parse the
- * RLE buffer again and again. Most sanity checks are done in spu_decoder.c
- * so that this routine can be as fast as possible.
- *****************************************************************************/
-static void vout_RenderSPU( const vout_thread_t *p_vout, picture_t *p_pic,
- const subpicture_t *p_spu )
-{
- int i_len, i_color;
- u16 *p_source = (u16 *)p_spu->p_data;
-
- int i_x, i_y;
- u8 *p_dest = p_pic->p->p_pixels + p_spu->i_x + p_spu->i_width
- + p_vout->output.i_width * ( p_spu->i_y + p_spu->i_height );
-
- /* Draw until we reach the bottom of the subtitle */
- i_y = p_spu->i_height * p_vout->output.i_width;
-
- while( i_y )
- {
- /* Draw until we reach the end of the line */
- i_x = p_spu->i_width;
-
- while( i_x )
- {
- /* Draw the line if needed */
- i_color = *p_source & 0x3;
-
- if( i_color )
- {
- i_len = *p_source++ >> 2;
- memset( p_dest - i_x - i_y, p_palette[ i_color ], i_len );
- i_x -= i_len;
- continue;
- }
-
- i_x -= *p_source++ >> 2;
- }
+ break;
- i_y -= p_vout->output.i_width;
+ default:
+ intf_ErrMsg( "vout error: unknown chroma, can't render SPU" );
+ break;
}
}