]> git.sesse.net Git - vlc/blobdiff - src/interface/main.c
The motion compensation routines are now modules as well ; choose your
[vlc] / src / interface / main.c
index 018dc54072c301ae51b0b6c03c4d787d29a30fb3..7449f1561dbdbdbcc6542a5cdaf0b68d2dc4b7e1 100644 (file)
 #include "defs.h"
 
 #include <signal.h>                               /* SIGHUP, SIGINT, SIGKILL */
 #include "defs.h"
 
 #include <signal.h>                               /* SIGHUP, SIGINT, SIGKILL */
-#include <getopt.h>                                              /* getopt() */
 #include <stdio.h>                                              /* sprintf() */
 
 #include <stdio.h>                                              /* sprintf() */
 
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>                                              /* getopt() */
+#endif
+
 #include <errno.h>                                                 /* ENOMEM */
 #include <stdlib.h>                                  /* getenv(), strtol(),  */
 #include <string.h>                                            /* strerror() */
 
 #include "config.h"
 #include "common.h"
 #include <errno.h>                                                 /* ENOMEM */
 #include <stdlib.h>                                  /* getenv(), strtol(),  */
 #include <string.h>                                            /* strerror() */
 
 #include "config.h"
 #include "common.h"
+#include "debug.h"
 #include "threads.h"
 #include "mtime.h"
 #include "threads.h"
 #include "mtime.h"
+#include "tests.h"                                              /* TestCPU() */
 #include "plugins.h"
 #include "plugins.h"
-#include "input_vlan.h"
+#include "modules.h"
+#include "playlist.h"
+#include "stream_control.h"
+#include "input_ext-intf.h"
 
 #include "intf_msg.h"
 #include "interface.h"
 
 #include "intf_msg.h"
 #include "interface.h"
 #define OPT_WIDTH               163
 #define OPT_HEIGHT              164
 #define OPT_COLOR               165
 #define OPT_WIDTH               163
 #define OPT_HEIGHT              164
 #define OPT_COLOR               165
+#define OPT_MOTION              167
+#define OPT_IDCT                168
+#define OPT_YUV                 169
 
 
-#define OPT_NOVLANS             170
+#define OPT_VLANS               170
 #define OPT_SERVER              171
 #define OPT_PORT                172
 #define OPT_SERVER              171
 #define OPT_PORT                172
+#define OPT_BROADCAST           173
+#define OPT_DVD                 174
+
+#define OPT_SYNCHRO             180
+
+#define OPT_WARNING             190
 
 /* Usage fashion */
 #define USAGE                     0
 
 /* Usage fashion */
 #define USAGE                     0
@@ -82,6 +99,7 @@
 #define LONG_HELP                 2
 
 /* Long options */
 #define LONG_HELP                 2
 
 /* Long options */
+#ifdef HAVE_GETOPT_H
 static const struct option longopts[] =
 {
     /*  name,               has_arg,    flag,   val */
 static const struct option longopts[] =
 {
     /*  name,               has_arg,    flag,   val */
@@ -105,17 +123,34 @@ static const struct option longopts[] =
     {   "height",           1,          0,      OPT_HEIGHT },
     {   "grayscale",        0,          0,      'g' },
     {   "color",            0,          0,      OPT_COLOR },
     {   "height",           1,          0,      OPT_HEIGHT },
     {   "grayscale",        0,          0,      'g' },
     {   "color",            0,          0,      OPT_COLOR },
-
+    {   "motion",           1,          0,      OPT_MOTION },
+    {   "idct",             1,          0,      OPT_IDCT },
+    {   "yuv",              1,          0,      OPT_YUV },
+
+    /* DVD options */
+    {   "dvdaudio",         1,          0,      'a' },
+    {   "dvdchannel",       1,          0,      'c' },
+    {   "dvdsubtitle",      1,          0,      's' },
+    
     /* Input options */
     /* Input options */
-    {   "novlans",          0,          0,      OPT_NOVLANS },
+    {   "vlans",            0,          0,      OPT_VLANS },
     {   "server",           1,          0,      OPT_SERVER },
     {   "port",             1,          0,      OPT_PORT },
     {   "server",           1,          0,      OPT_SERVER },
     {   "port",             1,          0,      OPT_PORT },
+    {   "broadcast",        0,          0,      OPT_BROADCAST },
+    {   "dvd",              0,          0,      OPT_DVD },
 
 
+    /* Synchro options */
+    {   "synchro",          1,          0,      OPT_SYNCHRO },
+
+    /* Interface messages */
+    {   "warning",          1,          0,      OPT_WARNING },
     {   0,                  0,          0,      0 }
 };
 
 /* Short options */
     {   0,                  0,          0,      0 }
 };
 
 /* Short options */
-static const char *psz_shortopts = "hHvg";
+static const char *psz_shortopts = "hHvga:s:c:";
+#endif
+
 
 /*****************************************************************************
  * Global variable program_data - this is the one and only, see main.h
 
 /*****************************************************************************
  * Global variable program_data - this is the one and only, see main.h
@@ -126,125 +161,216 @@ main_t *p_main;
  * Local prototypes
  *****************************************************************************/
 static void SetDefaultConfiguration ( void );
  * Local prototypes
  *****************************************************************************/
 static void SetDefaultConfiguration ( void );
-static int  GetConfiguration        ( int i_argc, char *ppsz_argv[], char *ppsz_env[] );
+static int  GetConfiguration        ( int i_argc, char *ppsz_argv[],
+                                      char *ppsz_env[] );
 static void Usage                   ( int i_fashion );
 static void Version                 ( void );
 
 static void InitSignalHandler       ( void );
 static void Usage                   ( int i_fashion );
 static void Version                 ( void );
 
 static void InitSignalHandler       ( void );
-static void SignalHandler           ( int i_signal );
-#ifdef HAVE_MMX
-static int  TestMMX                 ( void );
-#endif
+static void SimpleSignalHandler     ( int i_signal );
+static void FatalSignalHandler      ( int i_signal );
 
 /*****************************************************************************
  * main: parse command line, start interface and spawn threads
  *****************************************************************************
  * Steps during program execution are:
  *      -configuration parsing and messages interface initialization
 
 /*****************************************************************************
  * main: parse command line, start interface and spawn threads
  *****************************************************************************
  * Steps during program execution are:
  *      -configuration parsing and messages interface initialization
- *      -openning of audio output device and some global modules
+ *      -opening of audio output device and some global modules
  *      -execution of interface, which exit on error or on user request
  *      -closing of audio output device and some global modules
  *      -execution of interface, which exit on error or on user request
  *      -closing of audio output device and some global modules
- * On error, the spawned threads are cancelled, and the open devices closed.
+ * On error, the spawned threads are canceled, and the open devices closed.
  *****************************************************************************/
 int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
 {
     main_t  main_data;                      /* root of all data - see main.h */
  *****************************************************************************/
 int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
 {
     main_t  main_data;                      /* root of all data - see main.h */
+
     p_main = &main_data;                       /* set up the global variable */
 
     /*
      * System specific initialization code
      */
 #ifdef SYS_BEOS
     p_main = &main_data;                       /* set up the global variable */
 
     /*
      * System specific initialization code
      */
 #ifdef SYS_BEOS
-    beos_Init();
+    beos_Create();
 #endif
 
 #endif
 
+    p_main->i_cpu_capabilities = CPUCapabilities();
+
     /*
     /*
-     * Read configuration, initialize messages interface and set up program
+     * Test if our code is likely to run on this CPU 
      */
      */
+#if defined( __pentium__ ) || defined( __pentiumpro__ )
+    if( ! TestCPU( CPU_CAPABILITY_586 ) )
+    {
+        fprintf( stderr, "Sorry, this program needs a Pentium CPU.\n"
+                         "Please try a version without Pentium support.\n" );
+        return( 1 );
+    }
+#endif
+
 #ifdef HAVE_MMX
 #ifdef HAVE_MMX
-    if( !TestMMX() )
+    if( ! TestCPU( CPU_CAPABILITY_MMX ) )
     {
     {
-        fprintf( stderr, "Sorry, this program needs an MMX processor. Please run the non-MMX version.\n" );
+        fprintf( stderr, "Sorry, this program needs MMX extensions.\n"
+                         "Please try a version without MMX support.\n" );
         return( 1 );
     }
 #endif
         return( 1 );
     }
 #endif
+
+    /*
+     * Initialize messages interface
+     */
     p_main->p_msg = intf_MsgCreate();
     if( !p_main->p_msg )                         /* start messages interface */
     {
     p_main->p_msg = intf_MsgCreate();
     if( !p_main->p_msg )                         /* start messages interface */
     {
-        fprintf( stderr, "critical error: can't initialize messages interface (%s)\n",
-                strerror(errno) );
+        fprintf( stderr, "error: can't initialize messages interface (%s)\n",
+                 strerror(errno) );
         return( errno );
     }
         return( errno );
     }
+
+    /*
+     * Read configuration
+     */
     if( GetConfiguration( i_argc, ppsz_argv, ppsz_env ) )  /* parse cmd line */
     {
         intf_MsgDestroy();
         return( errno );
     }
     if( GetConfiguration( i_argc, ppsz_argv, ppsz_env ) )  /* parse cmd line */
     {
         intf_MsgDestroy();
         return( errno );
     }
-    intf_MsgImm( COPYRIGHT_MESSAGE "\n" );          /* print welcome message */
 
     /*
 
     /*
-     * Initialize shared resources and libraries
+     * Initialize playlist and get commandline files
      */
      */
-    if( main_data.b_vlans && input_VlanCreate() )
+    p_main->p_playlist = playlist_Create( );
+    if( !p_main->p_playlist )
     {
     {
-        /* On error during vlans initialization, switch of vlans */
-        intf_Msg( "Virtual LANs initialization failed : vlans management is deactivated\n" );
-        main_data.b_vlans = 0;
+        intf_ErrMsg( "playlist error: playlist initialization failed" );
+        intf_MsgDestroy();
+        return( errno );
     }
     }
+    playlist_Init( p_main->p_playlist, optind );
 
     /*
 
     /*
-     * Open audio device and start aout thread
+     * Initialize plugin bank
      */
      */
-    if( main_data.b_audio )
+    p_main->p_bank = bank_Create( );
+    if( !p_main->p_bank )
     {
     {
-        main_data.p_aout = aout_CreateThread( NULL );
-        if( main_data.p_aout == NULL )
-        {
-            /* On error during audio initialization, switch of audio */
-            intf_Msg( "Audio initialization failed : audio is deactivated\n" );
-            main_data.b_audio = 0;
-        }
+        intf_ErrMsg( "plugin error: plugin bank initialization failed" );
+        playlist_Destroy( p_main->p_playlist );
+        intf_MsgDestroy();
+        return( errno );
     }
     }
+    bank_Init( p_main->p_bank );
 
     /*
 
     /*
-     * Run interface
+     * Initialize module bank
      */
      */
-    main_data.p_intf = intf_Create();
-    if( main_data.p_intf != NULL )
+    p_main->p_module_bank = module_CreateBank( );
+    if( !p_main->p_module_bank )
     {
     {
-        InitSignalHandler();             /* prepare signals for interception */
-        intf_Run( main_data.p_intf );
-        intf_Destroy( main_data.p_intf );
+        intf_ErrMsg( "module error: module bank initialization failed" );
+        bank_Destroy( p_main->p_bank );
+        playlist_Destroy( p_main->p_playlist );
+        intf_MsgDestroy();
+        return( errno );
     }
     }
+    module_InitBank( p_main->p_module_bank );
 
     /*
 
     /*
-     * Close audio device
+     * Initialize shared resources and libraries
      */
      */
-    if( main_data.b_audio )
+    /* FIXME: no VLANs */
+#if 0
+    if( p_main->b_vlans && input_VlanCreate() )
     {
     {
-        aout_DestroyThread( main_data.p_aout, NULL );
+        /* On error during vlans initialization, switch off vlans */
+        intf_Msg( "Virtual LANs initialization failed : "
+                  "vlans management is deactivated" );
+        p_main->b_vlans = 0;
+    }
+#endif
+
+    /*
+     * Run interface
+     */
+    p_main->p_intf = intf_Create();
+
+    if( p_main->p_intf != NULL )
+    {
+        /*
+         * Set signal handling policy for all threads
+         */
+        InitSignalHandler();
+
+        /*
+         * Open audio device and start aout thread
+         */
+        if( p_main->b_audio )
+        {
+            p_main->p_aout = aout_CreateThread( NULL );
+            if( p_main->p_aout == NULL )
+            {
+                /* On error during audio initialization, switch off audio */
+                intf_ErrMsg( "aout error: audio initialization failed,"
+                             " audio is deactivated" );
+                p_main->b_audio = 0;
+            }
+        }
+
+        /*
+         * This is the main loop
+         */
+        intf_Run( p_main->p_intf );
+
+        intf_Destroy( p_main->p_intf );
+
+        /*
+         * Close audio device
+         */
+        if( p_main->b_audio )
+        {
+            aout_DestroyThread( p_main->p_aout, NULL );
+        }
     }
 
     /*
      * Free shared resources and libraries
      */
     }
 
     /*
      * Free shared resources and libraries
      */
-    if( main_data.b_vlans )
+    /* FIXME */
+#if 0
+    if( p_main->b_vlans )
     {
         input_VlanDestroy();
     }
     {
         input_VlanDestroy();
     }
+#endif
 
     /*
 
     /*
-     * System specific cleaning code
+     * Free module bank
+     */
+    module_DestroyBank( p_main->p_module_bank );
+
+    /*
+     * Free plugin bank
+     */
+    bank_Destroy( p_main->p_bank );
+
+    /*
+     * Free playlist
      */
      */
+    playlist_Destroy( p_main->p_playlist );
+
 #ifdef SYS_BEOS
 #ifdef SYS_BEOS
-    beos_Clean();
+    /*
+     * System specific cleaning code
+     */
+    beos_Destroy();
 #endif
 
     /*
      * Terminate messages interface and program
      */
 #endif
 
     /*
      * Terminate messages interface and program
      */
-    intf_Msg( "Program terminated.\n" );
+    intf_Msg( "intf: program terminated." );
     intf_MsgDestroy();
     intf_MsgDestroy();
+
     return( 0 );
 }
 
     return( 0 );
 }
 
@@ -302,14 +428,15 @@ void main_PutPszVariable( char *psz_name, char *psz_value )
     psz_env = malloc( strlen(psz_name) + strlen(psz_value) + 2 );
     if( psz_env == NULL )
     {
     psz_env = malloc( strlen(psz_name) + strlen(psz_value) + 2 );
     if( psz_env == NULL )
     {
-        intf_ErrMsg( "error: %s\n", strerror(ENOMEM) );
+        intf_ErrMsg( "intf error: cannot create psz_env (%s)",
+                     strerror(ENOMEM) );
     }
     else
     {
         sprintf( psz_env, "%s=%s", psz_name, psz_value );
         if( putenv( psz_env ) )
         {
     }
     else
     {
         sprintf( psz_env, "%s=%s", psz_name, psz_value );
         if( putenv( psz_env ) )
         {
-            intf_ErrMsg( "error: %s\n", strerror(errno) );
+            intf_ErrMsg( "intf error: cannot putenv (%s)", strerror(errno) );
         }
     }
 }
         }
     }
 }
@@ -342,11 +469,12 @@ void main_PutIntVariable( char *psz_name, int i_value )
 static void SetDefaultConfiguration( void )
 {
     /*
 static void SetDefaultConfiguration( void )
 {
     /*
-     * All features are activated by default
+     * All features are activated by default except vlans
      */
     p_main->b_audio  = 1;
     p_main->b_video  = 1;
      */
     p_main->b_audio  = 1;
     p_main->b_video  = 1;
-    p_main->b_vlans  = 1;
+    p_main->b_vlans  = 0;
+    p_main->b_dvd    = 0;
 }
 
 /*****************************************************************************
 }
 
 /*****************************************************************************
@@ -361,6 +489,7 @@ static void SetDefaultConfiguration( void )
 static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
 {
     int c, i_opt;
 static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
 {
     int c, i_opt;
+    char * p_pointer;
 
     /* Set default configuration and copy arguments */
     p_main->i_argc    = i_argc;
 
     /* Set default configuration and copy arguments */
     p_main->i_argc    = i_argc;
@@ -368,7 +497,24 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     p_main->ppsz_env  = ppsz_env;
     SetDefaultConfiguration();
 
     p_main->ppsz_env  = ppsz_env;
     SetDefaultConfiguration();
 
+    intf_MsgImm( COPYRIGHT_MESSAGE );
+
+    /* Get the executable name (similar to the basename command) */
+    p_main->psz_arg0 = p_pointer = ppsz_argv[ 0 ];
+    while( *p_pointer )
+    {
+        if( *p_pointer == '/' )
+        {
+            p_main->psz_arg0 = ++p_pointer;
+        }
+        else
+        {
+            ++p_pointer;
+        }
+    }
+
     /* Parse command line options */
     /* Parse command line options */
+#ifdef HAVE_GETOPT_H
     opterr = 0;
     while( ( c = getopt_long( i_argc, ppsz_argv, psz_shortopts, longopts, 0 ) ) != EOF )
     {
     opterr = 0;
     while( ( c = getopt_long( i_argc, ppsz_argv, psz_shortopts, longopts, 0 ) ) != EOF )
     {
@@ -425,10 +571,37 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
         case OPT_COLOR:                                           /* --color */
             main_PutIntVariable( VOUT_GRAYSCALE_VAR, 0 );
             break;
         case OPT_COLOR:                                           /* --color */
             main_PutIntVariable( VOUT_GRAYSCALE_VAR, 0 );
             break;
+       case OPT_MOTION:                                         /* --motion */
+            main_PutPszVariable( MOTION_METHOD_VAR, optarg );
+            break;
+       case OPT_IDCT:                                             /* --idct */
+            main_PutPszVariable( IDCT_METHOD_VAR, optarg );
+            break;
+        case OPT_YUV:                                               /* --yuv */
+            main_PutPszVariable( YUV_METHOD_VAR, optarg );
+            break;
+
+        /* DVD options */
+        case 'a':
+            if ( ! strcmp(optarg, "ac3") )
+                main_PutIntVariable( INPUT_DVD_AUDIO_VAR, REQUESTED_AC3 );
+            else if ( ! strcmp(optarg, "lpcm") )
+                main_PutIntVariable( INPUT_DVD_AUDIO_VAR, REQUESTED_LPCM );
+            else if ( ! strcmp(optarg, "off") )
+                main_PutIntVariable( INPUT_DVD_AUDIO_VAR, REQUESTED_NOAUDIO );
+            else
+                main_PutIntVariable( INPUT_DVD_AUDIO_VAR, REQUESTED_MPEG );
+            break;
+        case 'c':
+            main_PutIntVariable( INPUT_DVD_CHANNEL_VAR, atoi(optarg) );
+            break;
+        case 's':
+            main_PutIntVariable( INPUT_DVD_SUBTITLE_VAR, atoi(optarg) );
+            break;
 
         /* Input options */
 
         /* Input options */
-        case OPT_NOVLANS:                                       /* --novlans */
-            p_main->b_vlans = 0;
+        case OPT_VLANS:                                           /* --vlans */
+            p_main->b_vlans = 1;
             break;
         case OPT_SERVER:                                         /* --server */
             main_PutPszVariable( INPUT_SERVER_VAR, optarg );
             break;
         case OPT_SERVER:                                         /* --server */
             main_PutPszVariable( INPUT_SERVER_VAR, optarg );
@@ -436,16 +609,33 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
         case OPT_PORT:                                             /* --port */
             main_PutPszVariable( INPUT_PORT_VAR, optarg );
             break;
         case OPT_PORT:                                             /* --port */
             main_PutPszVariable( INPUT_PORT_VAR, optarg );
             break;
+        case OPT_BROADCAST:                                   /* --broadcast */
+            main_PutIntVariable( INPUT_BROADCAST_VAR, 1 );
+            break;
+        case OPT_DVD:                                               /* --dvd */
+            p_main->b_dvd = 1;
+            break;
+
+        /* Synchro options */
+        case OPT_SYNCHRO:                                      
+            main_PutPszVariable( VPAR_SYNCHRO_VAR, optarg );
+            break;
 
 
+        /* Interface warning messages level */
+        case OPT_WARNING:                                       /* --warning */
+            main_PutIntVariable( INTF_WARNING_VAR, atoi(optarg) );
+            break;
+            
         /* Internal error: unknown option */
         case '?':
         default:
         /* Internal error: unknown option */
         case '?':
         default:
-            intf_ErrMsg( "intf error: unknown option `%s'\n", ppsz_argv[optind - 1] );
+            intf_ErrMsg( "intf error: unknown option `%s'", ppsz_argv[optind - 1] );
             Usage( USAGE );
             return( EINVAL );
             break;
         }
     }
             Usage( USAGE );
             return( EINVAL );
             break;
         }
     }
+#endif
 
     /* Parse command line parameters - no check is made for these options */
     for( i_opt = optind; i_opt < i_argc; i_opt++ )
 
     /* Parse command line parameters - no check is made for these options */
     for( i_opt = optind; i_opt < i_argc; i_opt++ )
@@ -463,73 +653,95 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
 static void Usage( int i_fashion )
 {
     /* Usage */
 static void Usage( int i_fashion )
 {
     /* Usage */
-    intf_Msg( "Usage: vlc [options] [parameters]\n" );
+    intf_Msg( "Usage: %s [options] [parameters] [file]...",
+              p_main->psz_arg0 );
 
     if( i_fashion == USAGE )
     {
 
     if( i_fashion == USAGE )
     {
-        intf_Msg( "Try `vlc --help' for more information.\n" );
+        intf_Msg( "Try `%s --help' for more information.",
+                  p_main->psz_arg0 );
         return;
     }
 
         return;
     }
 
-    intf_MsgImm( COPYRIGHT_MESSAGE "\n" );
-
     /* Options */
     /* Options */
-    intf_Msg( "\n"
-              "Options:\n"
-              "      --noaudio                  \tdisable audio\n"
-              "      --aout <plugin>            \taudio output method\n"
-              "      --stereo, --mono           \tstereo/mono audio\n"
+    intf_Msg( "\nOptions:"
+              "\n      --noaudio                  \tdisable audio"
+              "\n      --aout <module>            \taudio output method"
+              "\n      --stereo, --mono           \tstereo/mono audio"
+              "\n"
+              "\n      --novideo                  \tdisable video"
+              "\n      --vout <module>            \tvideo output method"
+              "\n      --display <display>        \tdisplay string"
+              "\n      --width <w>, --height <h>  \tdisplay dimensions"
+              "\n  -g, --grayscale                \tgrayscale output"
+              "\n      --color                    \tcolor output"
+              "\n      --motion <module>          \tmotion compensation method"
+              "\n      --idct <module>            \tIDCT method"
+              "\n      --yuv <module>             \tYUV method"
+              "\n      --synchro <type>           \tforce synchro algorithm"
               "\n"
               "\n"
-              "      --novideo                  \tdisable video\n"
-              "      --vout <plugin>            \tvideo output method\n"
-              "      --display <display>        \tdisplay string\n"
-              "      --width <w>, --height <h>  \tdisplay dimensions\n"
-              "  -g, --grayscale                \tgrayscale output\n"
-              "      --color                    \tcolor output\n"
+              "\n      --dvd                      \tDVD mode"
+              "\n  -a, --dvdaudio <type>          \tchoose DVD audio type"
+              "\n  -c, --dvdchannel <channel>     \tchoose DVD audio channel"
+              "\n  -s, --dvdsubtitle <channel>    \tchoose DVD subtitle channel"
               "\n"
               "\n"
-              "      --novlans                  \tdisable vlans\n"
-              "      --server <host>            \tvideo server address\n"
-              "      --port <port>              \tvideo server port\n"
+              "\n      --vlans                    \tenable vlans"
+              "\n      --server <host>            \tvideo server address"
+              "\n      --port <port>              \tvideo server port"
+              "\n      --broadcast                \tlisten to a broadcast"
               "\n"
               "\n"
-              "  -h, --help                     \tprint help and exit\n"
-              "  -H, --longhelp                 \tprint long help and exit\n"
-              "  -v, --version                  \toutput version information and exit\n" );
+              "\n      --warning <level>          \tdisplay warning messages"
+              "\n"
+              "\n  -h, --help                     \tprint help and exit"
+              "\n  -H, --longhelp                 \tprint long help and exit"
+              "\n  -v, --version                  \toutput version information and exit" );
 
     if( i_fashion == SHORT_HELP )
         return;
 
     /* Interface parameters */
 
     if( i_fashion == SHORT_HELP )
         return;
 
     /* Interface parameters */
-    intf_Msg( "\n"
-              "Interface parameters:\n"
-              "  " INTF_INIT_SCRIPT_VAR "=<filename>             \tinitialization script\n"
-              "  " INTF_CHANNELS_VAR "=<filename>            \tchannels list\n" );
+    intf_Msg( "\nInterface parameters:\n"
+              "\n  " INTF_INIT_SCRIPT_VAR "=<filename>               \tinitialization script"
+              "\n  " INTF_CHANNELS_VAR "=<filename>            \tchannels list"
+              "\n  " INTF_WARNING_VAR "=<level>                \twarning level" );
 
     /* Audio parameters */
 
     /* Audio parameters */
-    intf_Msg( "\n"
-              "Audio 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\n" );
+    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 */
 
     /* Video parameters */
-    intf_Msg( "\n"
-              "Video 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_HEIGHT_VAR "=<height>             \tdislay height\n"
-              "  " VOUT_FB_DEV_VAR "=<filename>           \tframebuffer device path\n"
-              "  " VOUT_GRAYSCALE_VAR "={1|0}             \tgrayscale or color output\n" );
+    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_HEIGHT_VAR "=<height>             \tdislay height"
+              "\n  " VOUT_FB_DEV_VAR "=<filename>           \tframebuffer device path"
+              "\n  " VOUT_GRAYSCALE_VAR "={1|0}             \tgrayscale or color output"
+              "\n  " MOTION_METHOD_VAR "=<method name>      \tmotion compensation method"
+              "\n  " IDCT_METHOD_VAR "=<method name>        \tIDCT method"
+              "\n  " YUV_METHOD_VAR "=<method name>         \tYUV method"
+              "\n  " VPAR_SYNCHRO_VAR "={I|I+|IP|IP+|IPB}   \tsynchro algorithm" );
+
+    /* DVD parameters */
+    intf_Msg( "\nDVD parameters:"
+              "\n  " INPUT_DVD_DEVICE_VAR "=<device>           \tDVD device"
+              "\n  " INPUT_DVD_AUDIO_VAR "={ac3|lpcm|mpeg|off} \taudio type"
+              "\n  " INPUT_DVD_CHANNEL_VAR "=[0-15]            \taudio channel"
+              "\n  " INPUT_DVD_SUBTITLE_VAR "=[0-31]           \tsubtitle channel" );
 
     /* Input parameters */
 
     /* Input parameters */
-    intf_Msg( "\n"
-              "Input parameters:\n"
-              "  " INPUT_SERVER_VAR "=<hostname>          \tvideo server\n"
-              "  " INPUT_PORT_VAR "=<port>            \tvideo server port\n"
-              "  " INPUT_IFACE_VAR "=<interface>          \tnetwork interface\n"
-              "  " INPUT_VLAN_SERVER_VAR "=<hostname>     \tvlan server\n"
-              "  " INPUT_VLAN_PORT_VAR "=<port>           \tvlan server port\n" );
+    intf_Msg( "\nInput parameters:\n"
+              "\n  " INPUT_SERVER_VAR "=<hostname>          \tvideo server"
+              "\n  " INPUT_PORT_VAR "=<port>            \tvideo server port"
+              "\n  " INPUT_IFACE_VAR "=<interface>          \tnetwork interface"
+              "\n  " INPUT_BROADCAST_VAR "={1|0}            \tbroadcast mode"
+              "\n  " INPUT_VLAN_SERVER_VAR "=<hostname>     \tvlan server"
+              "\n  " INPUT_VLAN_PORT_VAR "=<port>           \tvlan server port"
+ );
+
 }
 
 /*****************************************************************************
 }
 
 /*****************************************************************************
@@ -543,8 +755,8 @@ static void Version( void )
               "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"
               "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"
-              "Written by the VideoLAN team at Ecole Centrale, Paris.\n" );
-           
+              "Written by the VideoLAN team at Ecole Centrale, Paris." );
+
 }
 
 /*****************************************************************************
 }
 
 /*****************************************************************************
@@ -557,18 +769,35 @@ static void Version( void )
 static void InitSignalHandler( void )
 {
     /* Termination signals */
 static void InitSignalHandler( void )
 {
     /* Termination signals */
-    signal( SIGHUP,  SignalHandler );
-    signal( SIGINT,  SignalHandler );
-    signal( SIGQUIT, SignalHandler );
+    signal( SIGHUP,  FatalSignalHandler );
+    signal( SIGINT,  FatalSignalHandler );
+    signal( SIGQUIT, FatalSignalHandler );
+
+    /* Other signals */
+    signal( SIGALRM, SimpleSignalHandler );
+    signal( SIGPIPE, SimpleSignalHandler );
 }
 
 }
 
+
 /*****************************************************************************
 /*****************************************************************************
- * SignalHandler: system signal handler
+ * SimpleSignalHandler: system signal handler
  *****************************************************************************
  *****************************************************************************
- * This function is called when a signal is received by the program. It tries to
- * end the program in a clean way.
+ * This function is called when a non fatal signal is received by the program.
  *****************************************************************************/
  *****************************************************************************/
-static void SignalHandler( int i_signal )
+static void SimpleSignalHandler( int i_signal )
+{
+    /* Acknowledge the signal received */
+    intf_WarnMsg(0, "intf: ignoring signal %d", i_signal );
+}
+
+
+/*****************************************************************************
+ * FatalSignalHandler: system signal handler
+ *****************************************************************************
+ * This function is called when a fatal signal is received by the program.
+ * It tries to end the program in a clean way.
+ *****************************************************************************/
+static void FatalSignalHandler( int i_signal )
 {
     /* Once a signal has been trapped, the termination sequence will be armed and
      * following signals will be ignored to avoid sending messages to an interface
 {
     /* Once a signal has been trapped, the termination sequence will be armed and
      * following signals will be ignored to avoid sending messages to an interface
@@ -578,89 +807,10 @@ static void SignalHandler( int i_signal )
     signal( SIGQUIT, SIG_IGN );
 
     /* Acknowledge the signal received */
     signal( SIGQUIT, SIG_IGN );
 
     /* Acknowledge the signal received */
-    intf_ErrMsgImm("intf: signal %d received\n", i_signal );
+    intf_ErrMsgImm("intf error: signal %d received, exiting", i_signal );
 
     /* Try to terminate everything - this is done by requesting the end of the
      * interface thread */
     p_main->p_intf->b_die = 1;
 }
 
 
     /* Try to terminate everything - this is done by requesting the end of the
      * interface thread */
     p_main->p_intf->b_die = 1;
 }
 
-#ifdef HAVE_MMX
-/*****************************************************************************
- * TestMMX: tests if the processor has MMX support.
- *****************************************************************************
- * This function is called if HAVE_MMX is enabled, to check whether the
- * cpu really supports MMX.
- *****************************************************************************/
-static int TestMMX( void )
-{
-/* FIXME: under beos, gcc does not support the foolowing inline assembly */ 
-#ifdef SYS_BEOS
-    return( 1 );
-#else
-
-    int i_reg, i_dummy = 0;
-
-    /* test for a 386 cpu */
-    asm volatile ( "pushfl
-                    popl %%eax
-                    movl %%eax, %%ecx
-                    xorl $0x40000, %%eax
-                    pushl %%eax
-                    popfl
-                    pushfl
-                    popl %%eax
-                    xorl %%ecx, %%eax
-                    andl $0x40000, %%eax"
-                 : "=a" ( i_reg ) );
-
-    if( !i_reg )
-        return( 0 );
-
-    /* test for a 486 cpu */
-    asm volatile ( "movl %%ecx, %%eax
-                    xorl $0x200000, %%eax
-                    pushl %%eax
-                    popfl
-                    pushfl
-                    popl %%eax
-                    xorl %%ecx, %%eax
-                    pushl %%ecx
-                    popfl
-                    andl $0x200000, %%eax"
-                 : "=a" ( i_reg ) );
-
-    if( !i_reg )
-        return( 0 );
-
-    /* the cpu supports the CPUID instruction - get its level */
-    asm volatile ( "cpuid"
-                 : "=a" ( i_reg ),
-                   "=b" ( i_dummy ),
-                   "=c" ( i_dummy ),
-                   "=d" ( i_dummy )
-                 : "a"  ( 0 ),       /* level 0 */
-                   "b"  ( i_dummy ) ); /* buggy compiler shouldn't complain */
-
-    /* this shouldn't happen on a normal cpu */
-    if( !i_reg )
-        return( 0 );
-
-    /* test for the MMX flag */
-    asm volatile ( "cpuid
-                    andl $0x00800000, %%edx" /* X86_FEATURE_MMX */
-                 : "=a" ( i_dummy ),
-                   "=b" ( i_dummy ),
-                   "=c" ( i_dummy ),
-                   "=d" ( i_reg )
-                 : "a"  ( 1 ),       /* level 1 */
-                   "b"  ( i_dummy ) ); /* buggy compiler shouldn't complain */
-
-    if( !i_reg )
-        return( 0 );
-
-    return( 1 );
-
-#endif
-}
-#endif