Mercurial > mplayer.hg
changeset 31806:383f17e1ef2f
Handle failing ioctls more gracefully for dvdcss.
Also set b_scrambled and b_ioctls in the dvdcss_test function
instead of both in and outside it and in case of b_scrambled
forgetting to set it half of the time.
author | reimar |
---|---|
date | Sun, 01 Aug 2010 13:52:17 +0000 |
parents | 05ca6dd36faf |
children | c42c4e88e6f5 |
files | libdvdcss/css.c libdvdcss/css.h libdvdcss/libdvdcss.c |
diffstat | 3 files changed, 16 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/libdvdcss/css.c Sun Aug 01 13:30:26 2010 +0000 +++ b/libdvdcss/css.c Sun Aug 01 13:52:17 2010 +0000 @@ -90,57 +90,48 @@ /***************************************************************************** * _dvdcss_test: check if the disc is encrypted or not ***************************************************************************** - * Return values: - * 1: DVD is scrambled but can be read - * 0: DVD is not scrambled and can be read - * -1: could not get "copyright" information - * -3: drive is RPC-II, region is not set, and DVD is scrambled: the RPC - * scheme will prevent us from reading the scrambled data + * Sets b_scrambled, b_ioctl *****************************************************************************/ -int _dvdcss_test( dvdcss_t dvdcss ) +void _dvdcss_test( dvdcss_t dvdcss ) { char const *psz_type, *psz_rpc; int i_ret, i_copyright, i_type, i_mask, i_rpc; i_ret = ioctl_ReadCopyright( dvdcss->i_fd, 0 /* i_layer */, &i_copyright ); -#ifdef WIN32 if( i_ret < 0 ) { /* Maybe we didn't have enough privileges to read the copyright * (see ioctl_ReadCopyright comments). * Apparently, on unencrypted DVDs _dvdcss_disckey() always fails, so * we can check this as a workaround. */ +#ifdef WIN32 i_ret = 0; +#else + /* Since it's the first ioctl we try to issue, we add a notice */ + print_error( dvdcss, "css error: could not get \"copyright\"" + " information, make sure there is a DVD in the drive," + " and that you have used the correct device node." ); + /* Try without ioctls */ + dvdcss->b_ioctls = 0; +#endif i_copyright = 1; if( _dvdcss_disckey( dvdcss ) < 0 ) { i_copyright = 0; } } -#endif - - if( i_ret < 0 ) - { - /* Since it's the first ioctl we try to issue, we add a notice */ - print_error( dvdcss, "css error: could not get \"copyright\"" - " information, make sure there is a DVD in the drive," - " and that you have used the correct device node." ); - - return -1; - } print_debug( dvdcss, "disc reports copyright information 0x%x", i_copyright ); + dvdcss->b_scrambled = i_copyright; i_ret = ioctl_ReportRPC( dvdcss->i_fd, &i_type, &i_mask, &i_rpc); if( i_ret < 0 ) { - print_error( dvdcss, "css error: could not get RPC status" ); - // do not return an error, the drive might be a region-free one - // and we definitely should not just fail for that case. - return i_copyright ? 1 : 0; + print_error( dvdcss, "css error: could not get RPC status, region-free drive?" ); + return; } switch( i_rpc ) @@ -166,10 +157,7 @@ { print_error( dvdcss, "css error: drive will prevent access to " "scrambled data" ); - return -3; } - - return i_copyright ? 1 : 0; } /*****************************************************************************
--- a/libdvdcss/css.h Sun Aug 01 13:30:26 2010 +0000 +++ b/libdvdcss/css.h Sun Aug 01 13:52:17 2010 +0000 @@ -48,7 +48,7 @@ /***************************************************************************** * Prototypes in css.c *****************************************************************************/ -int _dvdcss_test ( dvdcss_t ); +void _dvdcss_test ( dvdcss_t ); int _dvdcss_title ( dvdcss_t, int ); int _dvdcss_disckey ( dvdcss_t ); int _dvdcss_titlekey ( dvdcss_t, int , dvd_key_t );
--- a/libdvdcss/libdvdcss.c Sun Aug 01 13:30:26 2010 +0000 +++ b/libdvdcss/libdvdcss.c Sun Aug 01 13:52:17 2010 +0000 @@ -366,27 +366,7 @@ if( dvdcss->b_ioctls ) { - i_ret = _dvdcss_test( dvdcss ); - - if( i_ret == -3 ) - { - print_debug( dvdcss, "scrambled disc on a region-free RPC-II " - "drive: possible failure, but continuing " - "anyway" ); - } - else if( i_ret < 0 ) - { - /* Disable the CSS ioctls and hope that it works? */ - print_debug( dvdcss, - "could not check whether the disc was scrambled" ); - dvdcss->b_ioctls = 0; - } - else - { - print_debug( dvdcss, i_ret ? "disc is scrambled" - : "disc is unscrambled" ); - dvdcss->b_scrambled = i_ret; - } + _dvdcss_test( dvdcss ); } /* If disc is CSS protected and the ioctls work, authenticate the drive */