]> git.sesse.net Git - vlc/blob - plugins/dvdread/dvdread.c
* COMPLETE CVS BREAKAGE !! The MAIN branch is going to be a playground
[vlc] / plugins / dvdread / dvdread.c
1 /*****************************************************************************
2  * dvdread.c : DvdRead input module for vlc
3  *****************************************************************************
4  * Copyright (C) 2001 VideoLAN
5  * $Id: dvdread.c,v 1.3 2001/12/09 17:01:36 sam Exp $
6  *
7  * Authors: Samuel Hocevar <sam@zoy.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  * 
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 #define MODULE_NAME dvdread
25 #include "modules_inner.h"
26
27 /*****************************************************************************
28  * Preamble
29  *****************************************************************************/
30 #include "defs.h"
31
32 #include <stdlib.h>                                      /* malloc(), free() */
33 #include <string.h>                                              /* strdup() */
34
35 #ifdef GOD_DAMN_DMCA
36 #   include <dlfcn.h>
37 #   include "dummy_dvdcss.h"
38 #endif
39
40 #include "common.h"                                     /* boolean_t, byte_t */
41 #include "intf_msg.h"
42 #include "threads.h"
43 #include "mtime.h"
44
45 #include "modules.h"
46 #include "modules_export.h"
47
48 /*****************************************************************************
49  * Capabilities defined in the other files.
50  *****************************************************************************/
51 void _M( input_getfunctions )( function_list_t * p_function_list );
52
53 /*****************************************************************************
54  * Local prototypes.
55  *****************************************************************************/
56 #ifdef GOD_DAMN_DMCA
57 static void *p_libdvdcss;
58 static void ProbeLibDVDCSS  ( void );
59 static void UnprobeLibDVDCSS( void );
60 #endif
61
62 /*****************************************************************************
63  * Build configuration tree.
64  *****************************************************************************/
65 MODULE_CONFIG_START
66 ADD_WINDOW( "Configuration for DVD module" )
67     ADD_COMMENT( "foobar !" )
68 MODULE_CONFIG_STOP
69
70 MODULE_INIT_START
71     p_module->i_capabilities = MODULE_CAPABILITY_NULL
72                                 | MODULE_CAPABILITY_INPUT;
73 #ifdef GOD_DAMN_DMCA
74     p_module->psz_longname = "DVD input module, uses libdvdcss if present";
75 #else
76     p_module->psz_longname = "DVD input module, linked with libdvdcss";
77 #endif
78 MODULE_INIT_STOP
79
80 MODULE_ACTIVATE_START
81     _M( input_getfunctions )( &p_module->p_functions->input );
82 #ifdef GOD_DAMN_DMCA
83     ProbeLibDVDCSS();
84 #endif
85 MODULE_ACTIVATE_STOP
86
87 MODULE_DEACTIVATE_START
88 #ifdef GOD_DAMN_DMCA
89     UnprobeLibDVDCSS();
90 #endif
91 MODULE_DEACTIVATE_STOP
92
93
94 /* Following functions are local */
95
96 #ifdef GOD_DAMN_DMCA
97 /*****************************************************************************
98  * ProbeLibDVDCSS: look for a libdvdcss object.
99  *****************************************************************************
100  * This functions looks for libdvdcss, using dlopen(), and fills function
101  * pointers with what it finds. On failure, uses the dummy libdvdcss
102  * replacement provided by vlc.
103  *****************************************************************************/
104 static void ProbeLibDVDCSS( void )
105 {
106     char *pp_filelist[4] = { "libdvdcss.so.0",
107                              "./libdvdcss.so.0",
108                              "./lib/libdvdcss.so.0",
109                              NULL };
110     char **pp_file = pp_filelist;
111
112     /* Try to open the dynamic object */
113     do
114     {
115         p_libdvdcss = dlopen( *pp_file, RTLD_LAZY );
116         if( p_libdvdcss != NULL )
117         {
118             intf_WarnMsg( 2, "module: builtin module `dvd' found libdvdcss "
119                              "in `%s'", *pp_file );
120             break;
121         }
122         pp_file++;
123
124     } while( *pp_file != NULL );
125
126     /* If libdvdcss.so was found, check that it's valid */
127     if( p_libdvdcss == NULL )
128     {
129         intf_ErrMsg( "dvd warning: libdvdcss.so.0 not present" );
130     }
131     else
132     {
133         /* Check for libdvdcss 0.0.1 */
134         if( dlsym( p_libdvdcss, "dvdcss_crack" ) != NULL )
135         {
136             intf_ErrMsg( "dvd warning: libdvdcss.so.0 has deprecated symbol "
137                          "dvdcss_crack(), please upgrade" );
138             dlclose( p_libdvdcss );
139             p_libdvdcss = NULL;
140         }
141         else
142         {
143             dvdcss_open = dlsym( p_libdvdcss, "dvdcss_open" );
144             dvdcss_close = dlsym( p_libdvdcss, "dvdcss_close" );
145             dvdcss_title = dlsym( p_libdvdcss, "dvdcss_title" );
146             dvdcss_seek = dlsym( p_libdvdcss, "dvdcss_seek" );
147             dvdcss_read = dlsym( p_libdvdcss, "dvdcss_read" );
148             dvdcss_readv = dlsym( p_libdvdcss, "dvdcss_readv" );
149             dvdcss_error = dlsym( p_libdvdcss, "dvdcss_error" );
150
151             if( dvdcss_open == NULL || dvdcss_close == NULL
152                  || dvdcss_title == NULL || dvdcss_seek == NULL
153                  || dvdcss_read == NULL || dvdcss_readv == NULL
154                  || dvdcss_error == NULL )
155             {
156                 intf_ErrMsg( "dvd warning: missing symbols in libdvdcss.so.0, "
157                              "please upgrade libdvdcss or vlc" );
158                 dlclose( p_libdvdcss );
159                 p_libdvdcss = NULL;
160             }
161         }
162     }
163
164     /* If libdvdcss was not found or was not valid, use the dummy
165      * replacement functions. */
166     if( p_libdvdcss == NULL )
167     {
168         intf_ErrMsg( "dvd warning: no valid libdvdcss found, "
169                      "I will only play unencrypted DVDs" );
170         intf_ErrMsg( "dvd warning: get libdvdcss at "
171                      "http://www.videolan.org/libdvdcss/" );
172
173         dvdcss_open = dummy_dvdcss_open;
174         dvdcss_close = dummy_dvdcss_close;
175         dvdcss_title = dummy_dvdcss_title;
176         dvdcss_seek = dummy_dvdcss_seek;
177         dvdcss_read = dummy_dvdcss_read;
178         dvdcss_readv = dummy_dvdcss_readv;
179         dvdcss_error = dummy_dvdcss_error;
180     }
181 }
182
183 /*****************************************************************************
184  * UnprobeLibDVDCSS: free resources allocated by ProbeLibDVDCSS, if any.
185  *****************************************************************************/
186 static void UnprobeLibDVDCSS( void )
187 {
188     if( p_libdvdcss != NULL )
189     {
190         dlclose( p_libdvdcss );
191         p_libdvdcss = NULL;
192     }
193 }
194 #endif
195