X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plugins%2Fdvd%2Fdvd.c;h=a1d9d0c220f0f200fdef240e0684d621195041c6;hb=460360a85e2aa56f437ddb3ed25a7366a09569f5;hp=28f99bea9e6dc62ce67aa635e7e7ddf99cded8ca;hpb=29670af177bb9c5e5f9628ed5cfe893d236a3b71;p=vlc diff --git a/plugins/dvd/dvd.c b/plugins/dvd/dvd.c index 28f99bea9e..a1d9d0c220 100644 --- a/plugins/dvd/dvd.c +++ b/plugins/dvd/dvd.c @@ -2,6 +2,7 @@ * dvd.c : DVD input module for vlc ***************************************************************************** * Copyright (C) 2000 VideoLAN + * $Id: dvd.c,v 1.12 2001/08/06 13:28:00 sam Exp $ * * Authors: Samuel Hocevar * @@ -31,20 +32,20 @@ #include /* malloc(), free() */ #include /* strdup() */ +#ifdef GOD_DAMN_DMCA +# include +# include "dummy_dvdcss.h" +#endif + #include "config.h" #include "common.h" /* boolean_t, byte_t */ #include "threads.h" #include "mtime.h" -#include "modules.h" +#include "intf_msg.h" -/***************************************************************************** - * Build configuration tree. - *****************************************************************************/ -MODULE_CONFIG_START -ADD_WINDOW( "Configuration for DVD module" ) - ADD_COMMENT( "foobar !" ) -MODULE_CONFIG_END +#include "modules.h" +#include "modules_export.h" /***************************************************************************** * Capabilities defined in the other files. @@ -52,63 +53,143 @@ MODULE_CONFIG_END void _M( input_getfunctions )( function_list_t * p_function_list ); /***************************************************************************** - * InitModule: get the module structure and configuration. - ***************************************************************************** - * We have to fill psz_name, psz_longname and psz_version. These variables - * will be strdup()ed later by the main application because the module can - * be unloaded later to save memory, and we want to be able to access this - * data even after the module has been unloaded. + * Local prototypes. *****************************************************************************/ -MODULE_INIT -{ - p_module->psz_name = MODULE_STRING; -#ifdef HAVE_CSS - p_module->psz_longname = "full DVD input module with CSS decryption"; -#else - p_module->psz_longname = "DVD input module, CSS decryption disabled"; +#ifdef GOD_DAMN_DMCA +static void *p_libdvdcss; +static void ProbeLibDVDCSS ( void ); +static void UnprobeLibDVDCSS( void ); #endif - p_module->psz_version = VERSION; +/***************************************************************************** + * Build configuration tree. + *****************************************************************************/ +MODULE_CONFIG_START +ADD_WINDOW( "Configuration for DVD module" ) + ADD_COMMENT( "foobar !" ) +MODULE_CONFIG_STOP + +MODULE_INIT_START p_module->i_capabilities = MODULE_CAPABILITY_NULL | MODULE_CAPABILITY_INPUT; +#ifdef GOD_DAMN_DMCA + p_module->psz_longname = "DVD input module, uses libdvdcss if present"; +#else + p_module->psz_longname = "DVD input module, linked with libdvdcss"; +#endif +MODULE_INIT_STOP - return( 0 ); -} +MODULE_ACTIVATE_START + _M( input_getfunctions )( &p_module->p_functions->input ); +#ifdef GOD_DAMN_DMCA + ProbeLibDVDCSS(); +#endif +MODULE_ACTIVATE_STOP + +MODULE_DEACTIVATE_START +#ifdef GOD_DAMN_DMCA + UnprobeLibDVDCSS(); +#endif +MODULE_DEACTIVATE_STOP + +/* Following functions are local */ + +#ifdef GOD_DAMN_DMCA /***************************************************************************** - * ActivateModule: set the module to an usable state. + * ProbeLibDVDCSS: look for a libdvdcss object. ***************************************************************************** - * This function fills the capability functions and the configuration - * structure. Once ActivateModule() has been called, the i_usage can - * be set to 0 and calls to NeedModule() be made to increment it. To unload - * the module, one has to wait until i_usage == 0 and call DeactivateModule(). + * This functions looks for libdvdcss, using dlopen(), and fills function + * pointers with what it finds. On failure, uses the dummy libdvdcss + * replacement provided by vlc. *****************************************************************************/ -MODULE_ACTIVATE +static void ProbeLibDVDCSS( void ) { - p_module->p_functions = malloc( sizeof( module_functions_t ) ); - if( p_module->p_functions == NULL ) + char *pp_filelist[4] = { "libdvdcss.so.0", + "./libdvdcss.so.0", + "./lib/libdvdcss.so.0", + NULL }; + char **pp_file = pp_filelist; + + /* Try to open the dynamic object */ + do + { + p_libdvdcss = dlopen( *pp_file, RTLD_LAZY ); + if( p_libdvdcss != NULL ) + { + intf_WarnMsg( 2, "module: builtin module `dvd' found libdvdcss " + "in `%s'", *pp_file ); + break; + } + pp_file++; + + } while( *pp_file != NULL ); + + /* If libdvdcss.so was found, check that it's valid */ + if( p_libdvdcss == NULL ) { - return( -1 ); + intf_ErrMsg( "dvd warning: libdvdcss.so.0 not present" ); + } + else + { + /* Check for libdvdcss 0.0.1 */ + if( dlsym( p_libdvdcss, "dvdcss_crack" ) != NULL ) + { + intf_ErrMsg( "dvd warning: libdvdcss.so.0 has deprecated symbol " + "dvdcss_crack(), please upgrade" ); + dlclose( p_libdvdcss ); + p_libdvdcss = NULL; + } + else + { + dvdcss_open = dlsym( p_libdvdcss, "dvdcss_open" ); + dvdcss_close = dlsym( p_libdvdcss, "dvdcss_close" ); + dvdcss_title = dlsym( p_libdvdcss, "dvdcss_title" ); + dvdcss_seek = dlsym( p_libdvdcss, "dvdcss_seek" ); + dvdcss_read = dlsym( p_libdvdcss, "dvdcss_read" ); + dvdcss_readv = dlsym( p_libdvdcss, "dvdcss_readv" ); + dvdcss_error = dlsym( p_libdvdcss, "dvdcss_error" ); + + if( dvdcss_open == NULL || dvdcss_close == NULL + || dvdcss_title == NULL || dvdcss_seek == NULL + || dvdcss_read == NULL || dvdcss_readv == NULL + || dvdcss_error == NULL ) + { + intf_ErrMsg( "dvd warning: missing symbols in libdvdcss.so.0, " + "please upgrade libdvdcss or vlc" ); + dlclose( p_libdvdcss ); + p_libdvdcss = NULL; + } + } } - _M( input_getfunctions )( &p_module->p_functions->input ); - - p_module->p_config = p_config; - - return( 0 ); + /* If libdvdcss was not found or was not valid, use the dummy + * replacement functions. */ + if( p_libdvdcss == NULL ) + { + intf_ErrMsg( "dvd warning: no valid libdvdcss found, " + "I will only play unencrypted DVDs" ); + + dvdcss_open = dummy_dvdcss_open; + dvdcss_close = dummy_dvdcss_close; + dvdcss_title = dummy_dvdcss_title; + dvdcss_seek = dummy_dvdcss_seek; + dvdcss_read = dummy_dvdcss_read; + dvdcss_readv = dummy_dvdcss_readv; + dvdcss_error = dummy_dvdcss_error; + } } /***************************************************************************** - * DeactivateModule: make sure the module can be unloaded. - ***************************************************************************** - * This function must only be called when i_usage == 0. If it successfully - * returns, i_usage can be set to -1 and the module unloaded. Be careful to - * lock usage_lock during the whole process. + * UnprobeLibDVDCSS: free resources allocated by ProbeLibDVDCSS, if any. *****************************************************************************/ -MODULE_DEACTIVATE +static void UnprobeLibDVDCSS( void ) { - free( p_module->p_functions ); - - return( 0 ); + if( p_libdvdcss != NULL ) + { + dlclose( p_libdvdcss ); + p_libdvdcss = NULL; + } } +#endif