]> git.sesse.net Git - vlc/blob - plugins/dvd/dvd.c
Input III (Episode 1).
[vlc] / plugins / dvd / dvd.c
1 /*****************************************************************************
2  * dvd.c : DVD input module for vlc
3  *****************************************************************************
4  * Copyright (C) 2000-2001 VideoLAN
5  * $Id: dvd.c,v 1.21 2002/03/01 00:33:18 massiot 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( access_getfunctions )( function_list_t * p_function_list );
41 void _M( demux_getfunctions )( function_list_t * p_function_list );
42
43 /*****************************************************************************
44  * Local prototypes.
45  *****************************************************************************/
46 #ifdef GOD_DAMN_DMCA
47 static void *p_libdvdcss;
48 static void ProbeLibDVDCSS  ( void );
49 static void UnprobeLibDVDCSS( void );
50 #endif
51
52 /*****************************************************************************
53  * Build configuration tree.
54  *****************************************************************************/
55 MODULE_CONFIG_START
56 MODULE_CONFIG_STOP
57
58 MODULE_INIT_START
59 #ifdef GOD_DAMN_DMCA
60     SET_DESCRIPTION( "DVD input module, uses libdvdcss if present" )
61 #else
62     SET_DESCRIPTION( "DVD input module, linked with libdvdcss" )
63 #endif
64     ADD_CAPABILITY( ACCESS, 0 )
65     ADD_CAPABILITY( DEMUX, 0 )
66     ADD_SHORTCUT( "dvd" )
67 MODULE_INIT_STOP
68
69 MODULE_ACTIVATE_START
70     _M( access_getfunctions )( &p_module->p_functions->access );
71     _M( demux_getfunctions )( &p_module->p_functions->demux );
72 #ifdef GOD_DAMN_DMCA
73     ProbeLibDVDCSS();
74 #endif
75 MODULE_ACTIVATE_STOP
76
77 MODULE_DEACTIVATE_START
78 #ifdef GOD_DAMN_DMCA
79     UnprobeLibDVDCSS();
80 #endif
81 MODULE_DEACTIVATE_STOP
82
83
84 /* Following functions are local */
85
86 #ifdef GOD_DAMN_DMCA
87 /*****************************************************************************
88  * ProbeLibDVDCSS: look for a libdvdcss object.
89  *****************************************************************************
90  * This functions looks for libdvdcss, using dlopen(), and fills function
91  * pointers with what it finds. On failure, uses the dummy libdvdcss
92  * replacement provided by vlc.
93  *****************************************************************************/
94 static void ProbeLibDVDCSS( void )
95 {
96     char *pp_filelist[4] = { "libdvdcss.so.1",
97                              "./libdvdcss.so.1",
98                              "./lib/libdvdcss.so.1",
99                              NULL };
100     char **pp_file = pp_filelist;
101
102     /* Try to open the dynamic object */
103     do
104     {
105         p_libdvdcss = dlopen( *pp_file, RTLD_LAZY );
106         if( p_libdvdcss != NULL )
107         {
108             intf_WarnMsg( 2, "module: builtin module `dvd' found libdvdcss "
109                              "in `%s'", *pp_file );
110             break;
111         }
112         pp_file++;
113
114     } while( *pp_file != NULL );
115
116     /* If libdvdcss.so was found, check that it's valid */
117     if( p_libdvdcss == NULL )
118     {
119         intf_ErrMsg( "dvd warning: libdvdcss.so.1 not present" );
120     }
121     else
122     {
123         ____dvdcss_open = dlsym( p_libdvdcss, "dvdcss_open" );
124         ____dvdcss_close = dlsym( p_libdvdcss, "dvdcss_close" );
125         ____dvdcss_title = dlsym( p_libdvdcss, "dvdcss_title" );
126         ____dvdcss_seek = dlsym( p_libdvdcss, "dvdcss_seek" );
127         ____dvdcss_read = dlsym( p_libdvdcss, "dvdcss_read" );
128         ____dvdcss_readv = dlsym( p_libdvdcss, "dvdcss_readv" );
129         ____dvdcss_error = dlsym( p_libdvdcss, "dvdcss_error" );
130
131         if( ____dvdcss_open == NULL || ____dvdcss_close == NULL
132              || ____dvdcss_title == NULL || ____dvdcss_seek == NULL
133              || ____dvdcss_read == NULL || ____dvdcss_readv == NULL
134              || ____dvdcss_error == NULL )
135         {
136             intf_ErrMsg( "dvd warning: missing symbols in libdvdcss.so.1, "
137                          "this shouldn't happen !" );
138             dlclose( p_libdvdcss );
139             p_libdvdcss = NULL;
140         }
141     }
142
143     /* If libdvdcss was not found or was not valid, use the dummy
144      * replacement functions. */
145     if( p_libdvdcss == NULL )
146     {
147         intf_ErrMsg( "dvd warning: no valid libdvdcss found, "
148                      "I will only play unencrypted DVDs" );
149         intf_ErrMsg( "dvd warning: get libdvdcss at "
150                      "http://www.videolan.org/libdvdcss/" );
151
152         ____dvdcss_open = dummy_dvdcss_open;
153         ____dvdcss_close = dummy_dvdcss_close;
154         ____dvdcss_title = dummy_dvdcss_title;
155         ____dvdcss_seek = dummy_dvdcss_seek;
156         ____dvdcss_read = dummy_dvdcss_read;
157         ____dvdcss_readv = dummy_dvdcss_readv;
158         ____dvdcss_error = dummy_dvdcss_error;
159     }
160 }
161
162 /*****************************************************************************
163  * UnprobeLibDVDCSS: free resources allocated by ProbeLibDVDCSS, if any.
164  *****************************************************************************/
165 static void UnprobeLibDVDCSS( void )
166 {
167     if( p_libdvdcss != NULL )
168     {
169         dlclose( p_libdvdcss );
170         p_libdvdcss = NULL;
171     }
172 }
173 #endif
174