📄 main.c
字号:
/* following functions are local *//***************************************************************************** * SetDefaultConfiguration: set default options ***************************************************************************** * This function is called by GetConfiguration before command line is parsed. * It sets all the default values required later by the program. At this stage, * most structure are not yet allocated, so initialization must be done using * environment. *****************************************************************************/static void SetDefaultConfiguration( void ){ /* * All features are activated by default */ p_main->b_audio = 1; p_main->b_video = 1; p_main->b_vlans = 1;}/***************************************************************************** * GetConfiguration: parse command line ***************************************************************************** * Parse command line and configuration file for configuration. If the inline * help is requested, the function Usage() is called and the function returns * -1 (causing main() to exit). The messages interface is initialized at this * stage, but most structures are not allocated, so only environment should * be used. *****************************************************************************/static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] ){ int c, i_opt; /* Set default configuration and copy arguments */ p_main->i_argc = i_argc; p_main->ppsz_argv = ppsz_argv; p_main->ppsz_env = ppsz_env; SetDefaultConfiguration(); /* Parse command line options */ opterr = 0; while( ( c = getopt_long( i_argc, ppsz_argv, psz_shortopts, longopts, 0 ) ) != EOF ) { switch( c ) { /* General/common options */ case 'h': /* -h, --help */ Usage( SHORT_HELP ); return( -1 ); break; case 'H': /* -H, --longhelp */ Usage( LONG_HELP ); return( -1 ); break; case 'v': /* -v, --version */ Version(); return( -1 ); break; /* Audio options */ case OPT_NOAUDIO: /* --noaudio */ p_main->b_audio = 0; break; case OPT_AOUT: /* --aout */ main_PutPszVariable( AOUT_METHOD_VAR, optarg ); break; case OPT_STEREO: /* --stereo */ main_PutIntVariable( AOUT_STEREO_VAR, 1 ); break; case OPT_MONO: /* --mono */ main_PutIntVariable( AOUT_STEREO_VAR, 0 ); break; /* Video options */ case OPT_NOVIDEO: /* --novideo */ p_main->b_video = 0; break; case OPT_VOUT: /* --vout */ main_PutPszVariable( VOUT_METHOD_VAR, optarg ); break; case OPT_DISPLAY: /* --display */ main_PutPszVariable( VOUT_DISPLAY_VAR, optarg ); break; case OPT_WIDTH: /* --width */ main_PutPszVariable( VOUT_WIDTH_VAR, optarg ); break; case OPT_HEIGHT: /* --height */ main_PutPszVariable( VOUT_HEIGHT_VAR, optarg ); break; case 'g': /* -g, --grayscale */ main_PutIntVariable( VOUT_GRAYSCALE_VAR, 1 ); break; case OPT_COLOR: /* --color */ main_PutIntVariable( VOUT_GRAYSCALE_VAR, 0 ); break; /* DVD options */ case 'a': if ( ! strcmp(optarg, "mpeg") ) main_PutIntVariable( INPUT_DVD_AUDIO_VAR, REQUESTED_MPEG ); 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_AC3 ); 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 */ case OPT_NOVLANS: /* --novlans */ p_main->b_vlans = 0; break; case OPT_SERVER: /* --server */ main_PutPszVariable( INPUT_SERVER_VAR, optarg ); break; case OPT_PORT: /* --port */ main_PutPszVariable( INPUT_PORT_VAR, optarg ); break; /* Internal error: unknown option */ case '?': default: intf_ErrMsg( "intf error: unknown option `%s'\n", ppsz_argv[optind - 1] ); Usage( USAGE ); return( EINVAL ); break; } } /* Parse command line parameters - no check is made for these options */ for( i_opt = optind; i_opt < i_argc; i_opt++ ) { putenv( ppsz_argv[ i_opt ] ); } return( 0 );}/***************************************************************************** * Usage: print program usage ***************************************************************************** * Print a short inline help. Message interface is initialized at this stage. *****************************************************************************/static void Usage( int i_fashion ){ /* Usage */ intf_Msg( "Usage: vlc [options] [parameters]\n" ); if( i_fashion == USAGE ) { intf_Msg( "Try `vlc --help' for more information.\n" ); return; } intf_MsgImm( COPYRIGHT_MESSAGE "\n" ); /* Options */ intf_Msg( "\n" "Options:\n" " --noaudio \tdisable audio\n" " --aout <plugin> \taudio output method\n" " --stereo, --mono \tstereo/mono audio\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" " -a, --dvdaudio \tchoose DVD audio type\n" " -c, --dvdchannel \tchoose DVD audio channel\n" " -s, --dvdsubtitle \tchoose DVD subtitle channel\n" "\n" " --novlans \tdisable vlans\n" " --server <host> \tvideo server address\n" " --port <port> \tvideo server port\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" ); 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" ); /* 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" ); /* 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" ); /* DVD parameters */ intf_Msg( "\n" "DVD parameters:\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\n" ); /* 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" );}/***************************************************************************** * Version: print complete program version ***************************************************************************** * Print complete program version and build number. *****************************************************************************/static void Version( void ){ 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" "Written by the VideoLAN team at Ecole Centrale, Paris.\n" );}/***************************************************************************** * InitSignalHandler: system signal handler initialization ***************************************************************************** * Set the signal handlers. SIGTERM is not intercepted, because we need at * at least a method to kill the program when all other methods failed, and * when we don't want to use SIGKILL. *****************************************************************************/static void InitSignalHandler( void ){ /* Termination signals */ signal( SIGHUP, SignalHandler ); signal( SIGINT, SignalHandler ); signal( SIGQUIT, SignalHandler );}/***************************************************************************** * SignalHandler: 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. *****************************************************************************/static void SignalHandler( 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 * having been destroyed */ signal( SIGHUP, SIG_IGN ); signal( SIGINT, SIG_IGN ); signal( SIGQUIT, SIG_IGN ); /* Acknowledge the signal received */ intf_ErrMsgImm("intf: signal %d received\n", i_signal ); /* 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -