]> 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 bbf7f382b2089746097f1681ce2b135bc9a03fcb..7449f1561dbdbdbcc6542a5cdaf0b68d2dc4b7e1 100644 (file)
@@ -43,7 +43,7 @@
 #include "debug.h"
 #include "threads.h"
 #include "mtime.h"
-#include "tests.h"                                              /* TestMMX() */
+#include "tests.h"                                              /* TestCPU() */
 #include "plugins.h"
 #include "modules.h"
 #include "playlist.h"
 #define OPT_WIDTH               163
 #define OPT_HEIGHT              164
 #define OPT_COLOR               165
-#define OPT_YUV                 166
+#define OPT_MOTION              167
+#define OPT_IDCT                168
+#define OPT_YUV                 169
 
 #define OPT_VLANS               170
 #define OPT_SERVER              171
 #define OPT_PORT                172
 #define OPT_BROADCAST           173
+#define OPT_DVD                 174
 
 #define OPT_SYNCHRO             180
 
@@ -120,6 +123,8 @@ static const struct option longopts[] =
     {   "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 */
@@ -132,6 +137,7 @@ static const struct option longopts[] =
     {   "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 },
@@ -163,9 +169,6 @@ static void Version                 ( void );
 static void InitSignalHandler       ( void );
 static void SimpleSignalHandler     ( int i_signal );
 static void FatalSignalHandler      ( int i_signal );
-#ifdef HAVE_MMX
-       int  TestMMX                 ( void );
-#endif
 
 /*****************************************************************************
  * main: parse command line, start interface and spawn threads
@@ -190,14 +193,25 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     beos_Create();
 #endif
 
+    p_main->i_cpu_capabilities = CPUCapabilities();
+
     /*
      * 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
-    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
@@ -213,11 +227,6 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
         return( errno );
     }
 
-    /*
-     * Set signal handling policy up for all the threads that will be created
-     */
-    InitSignalHandler();                 /* prepare signals for interception */
-
     /*
      * Read configuration
      */
@@ -233,7 +242,7 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     p_main->p_playlist = playlist_Create( );
     if( !p_main->p_playlist )
     {
-        intf_Msg( "Playlist initialization failed" );
+        intf_ErrMsg( "playlist error: playlist initialization failed" );
         intf_MsgDestroy();
         return( errno );
     }
@@ -245,7 +254,7 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     p_main->p_bank = bank_Create( );
     if( !p_main->p_bank )
     {
-        intf_Msg( "Plugin bank initialization failed" );
+        intf_ErrMsg( "plugin error: plugin bank initialization failed" );
         playlist_Destroy( p_main->p_playlist );
         intf_MsgDestroy();
         return( errno );
@@ -258,7 +267,7 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     p_main->p_module_bank = module_CreateBank( );
     if( !p_main->p_module_bank )
     {
-        intf_Msg( "Module bank initialization failed" );
+        intf_ErrMsg( "module error: module bank initialization failed" );
         bank_Destroy( p_main->p_bank );
         playlist_Destroy( p_main->p_playlist );
         intf_MsgDestroy();
@@ -280,40 +289,47 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     }
 #endif
 
-    /*
-     * 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_Msg( "Audio initialization failed : audio is deactivated" );
-            p_main->b_audio = 0;
-        }
-    }
-
     /*
      * 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 );
+        /*
+         * Close audio device
+         */
+        if( p_main->b_audio )
+        {
+            aout_DestroyThread( p_main->p_aout, NULL );
+        }
     }
 
     /*
@@ -352,7 +368,7 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
     /*
      * Terminate messages interface and program
      */
-    intf_Msg( "Program terminated." );
+    intf_Msg( "intf: program terminated." );
     intf_MsgDestroy();
 
     return( 0 );
@@ -458,6 +474,7 @@ static void SetDefaultConfiguration( void )
     p_main->b_audio  = 1;
     p_main->b_video  = 1;
     p_main->b_vlans  = 0;
+    p_main->b_dvd    = 0;
 }
 
 /*****************************************************************************
@@ -554,6 +571,12 @@ 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_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;
@@ -589,6 +612,9 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
         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:                                      
@@ -640,16 +666,21 @@ static void Usage( int i_fashion )
     /* Options */
     intf_Msg( "\nOptions:"
               "\n      --noaudio                  \tdisable audio"
-              "\n      --aout <plugin>            \taudio output method"
+              "\n      --aout <module>            \taudio output method"
               "\n      --stereo, --mono           \tstereo/mono audio"
               "\n"
               "\n      --novideo                  \tdisable video"
-              "\n      --vout <plugin>            \tvideo output method"
+              "\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      --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"
@@ -659,8 +690,6 @@ static void Usage( int i_fashion )
               "\n      --port <port>              \tvideo server port"
               "\n      --broadcast                \tlisten to a broadcast"
               "\n"
-              "\n      --synchro <type>           \tforce synchro algorithm"
-              "\n"
               "\n      --warning <level>          \tdisplay warning messages"
               "\n"
               "\n  -h, --help                     \tprint help and exit"
@@ -690,10 +719,15 @@ static void Usage( int i_fashion )
               "\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  " 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" );
@@ -705,11 +739,9 @@ static void Usage( int i_fashion )
               "\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" );
+              "\n  " INPUT_VLAN_PORT_VAR "=<port>           \tvlan server port"
+ );
 
-    /* Synchro parameters */
-    intf_Msg( "\nSynchro parameters:"
-              "\n  " VPAR_SYNCHRO_VAR "={I|I+|IP|IP+|IPB}   \tsynchro algorithm");
 }
 
 /*****************************************************************************