]> git.sesse.net Git - vlc/blob - plugins/dvdread/dvdread.c
* ./BUGS: added a list of known bugs. Please add your findings!
[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.6 2002/01/04 14:01:34 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 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #include <stdlib.h>                                      /* malloc(), free() */
28 #include <string.h>                                              /* strdup() */
29
30 #include <videolan/vlc.h>
31
32 #ifdef GOD_DAMN_DMCA
33 #   include <dlfcn.h>
34 #   include "dummy_dvdcss.h"
35 #endif
36
37 /*****************************************************************************
38  * Capabilities defined in the other files.
39  *****************************************************************************/
40 void _M( input_getfunctions )( function_list_t * p_function_list );
41
42 /*****************************************************************************
43  * Local prototypes.
44  *****************************************************************************/
45 #ifdef GOD_DAMN_DMCA
46 static void *p_libdvdcss;
47 static void ProbeLibDVDCSS  ( void );
48 static void UnprobeLibDVDCSS( void );
49 #endif
50
51 /*****************************************************************************
52  * Build configuration tree.
53  *****************************************************************************/
54 MODULE_CONFIG_START
55 MODULE_CONFIG_STOP
56
57 MODULE_INIT_START
58 #ifdef GOD_DAMN_DMCA
59     SET_DESCRIPTION( "DVDRead input module, uses libdvdcss if present" )
60     ADD_CAPABILITY( INPUT, 70 )
61 #else
62     SET_DESCRIPTION( "DVDRead input module, linked with libdvdcss" )
63     ADD_CAPABILITY( INPUT, 80 )
64 #endif
65     ADD_SHORTCUT( "dvdread" )
66     
67 MODULE_INIT_STOP
68
69 MODULE_ACTIVATE_START
70     _M( input_getfunctions )( &p_module->p_functions->input );
71 #ifdef GOD_DAMN_DMCA
72     ProbeLibDVDCSS();
73 #endif
74 MODULE_ACTIVATE_STOP
75
76 MODULE_DEACTIVATE_START
77 #ifdef GOD_DAMN_DMCA
78     UnprobeLibDVDCSS();
79 #endif
80 MODULE_DEACTIVATE_STOP
81
82
83 /* Following functions are local */
84
85 #ifdef GOD_DAMN_DMCA
86 /*****************************************************************************
87  * ProbeLibDVDCSS: look for a libdvdcss object.
88  *****************************************************************************
89  * This functions looks for libdvdcss, using dlopen(), and fills function
90  * pointers with what it finds. On failure, uses the dummy libdvdcss
91  * replacement provided by vlc.
92  *****************************************************************************/
93 static void ProbeLibDVDCSS( void )
94 {
95     char *pp_filelist[4] = { "libdvdcss.so.0",
96                              "./libdvdcss.so.0",
97                              "./lib/libdvdcss.so.0",
98                              NULL };
99     char **pp_file = pp_filelist;
100
101     /* Try to open the dynamic object */
102     do
103     {
104         p_libdvdcss = dlopen( *pp_file, RTLD_LAZY );
105         if( p_libdvdcss != NULL )
106         {
107             intf_WarnMsg( 2, "module: builtin module `dvd' found libdvdcss "
108                              "in `%s'", *pp_file );
109             break;
110         }
111         pp_file++;
112
113     } while( *pp_file != NULL );
114
115     /* If libdvdcss.so was found, check that it's valid */
116     if( p_libdvdcss == NULL )
117     {
118         intf_ErrMsg( "dvd warning: libdvdcss.so.0 not present" );
119     }
120     else
121     {
122         /* Check for libdvdcss 0.0.1 */
123         if( dlsym( p_libdvdcss, "dvdcss_crack" ) != NULL )
124         {
125             intf_ErrMsg( "dvd warning: libdvdcss.so.0 has deprecated symbol "
126                          "dvdcss_crack(), please upgrade" );
127             dlclose( p_libdvdcss );
128             p_libdvdcss = NULL;
129         }
130         else
131         {
132             dvdcss_open = dlsym( p_libdvdcss, "dvdcss_open" );
133             dvdcss_close = dlsym( p_libdvdcss, "dvdcss_close" );
134             dvdcss_title = dlsym( p_libdvdcss, "dvdcss_title" );
135             dvdcss_seek = dlsym( p_libdvdcss, "dvdcss_seek" );
136             dvdcss_read = dlsym( p_libdvdcss, "dvdcss_read" );
137             dvdcss_readv = dlsym( p_libdvdcss, "dvdcss_readv" );
138             dvdcss_error = dlsym( p_libdvdcss, "dvdcss_error" );
139
140             if( dvdcss_open == NULL || dvdcss_close == NULL
141                  || dvdcss_title == NULL || dvdcss_seek == NULL
142                  || dvdcss_read == NULL || dvdcss_readv == NULL
143                  || dvdcss_error == NULL )
144             {
145                 intf_ErrMsg( "dvd warning: missing symbols in libdvdcss.so.0, "
146                              "please upgrade libdvdcss or vlc" );
147                 dlclose( p_libdvdcss );
148                 p_libdvdcss = NULL;
149             }
150         }
151     }
152
153     /* If libdvdcss was not found or was not valid, use the dummy
154      * replacement functions. */
155     if( p_libdvdcss == NULL )
156     {
157         intf_ErrMsg( "dvd warning: no valid libdvdcss found, "
158                      "I will only play unencrypted DVDs" );
159         intf_ErrMsg( "dvd warning: get libdvdcss at "
160                      "http://www.videolan.org/libdvdcss/" );
161
162         dvdcss_open = dummy_dvdcss_open;
163         dvdcss_close = dummy_dvdcss_close;
164         dvdcss_title = dummy_dvdcss_title;
165         dvdcss_seek = dummy_dvdcss_seek;
166         dvdcss_read = dummy_dvdcss_read;
167         dvdcss_readv = dummy_dvdcss_readv;
168         dvdcss_error = dummy_dvdcss_error;
169     }
170 }
171
172 /*****************************************************************************
173  * UnprobeLibDVDCSS: free resources allocated by ProbeLibDVDCSS, if any.
174  *****************************************************************************/
175 static void UnprobeLibDVDCSS( void )
176 {
177     if( p_libdvdcss != NULL )
178     {
179         dlclose( p_libdvdcss );
180         p_libdvdcss = NULL;
181     }
182 }
183 #endif
184