summaryrefslogtreecommitdiffstats
path: root/libmpdvdkit2
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-16 22:50:22 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-16 22:50:22 +0000
commitb1187223a37f7e79c386c6ec86b3cd082bf9021f (patch)
tree084ec952478e36b67d3de3ad1a335227e47289bb /libmpdvdkit2
parenta695955bd29a2691bf5e918d2e4716d58299b0cb (diff)
downloadmpv-b1187223a37f7e79c386c6ec86b3cd082bf9021f.tar.bz2
mpv-b1187223a37f7e79c386c6ec86b3cd082bf9021f.tar.xz
apply mplayer-specific patches
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7034 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdvdkit2')
-rw-r--r--libmpdvdkit2/bswap.h42
-rw-r--r--libmpdvdkit2/css.c2
-rw-r--r--libmpdvdkit2/device.c2
-rw-r--r--libmpdvdkit2/dvd_input.c182
-rw-r--r--libmpdvdkit2/dvd_reader.c25
-rw-r--r--libmpdvdkit2/dvd_udf.c2
-rw-r--r--libmpdvdkit2/dvdcss.h6
-rw-r--r--libmpdvdkit2/error.c2
-rw-r--r--libmpdvdkit2/ifo_print.c2
-rw-r--r--libmpdvdkit2/ifo_print.h4
-rw-r--r--libmpdvdkit2/ifo_read.c2
-rw-r--r--libmpdvdkit2/ifo_read.h4
-rw-r--r--libmpdvdkit2/ifo_types.h2
-rw-r--r--libmpdvdkit2/libdvdcss.c2
-rw-r--r--libmpdvdkit2/nav_print.c2
-rw-r--r--libmpdvdkit2/nav_print.h2
-rw-r--r--libmpdvdkit2/nav_read.c2
-rw-r--r--libmpdvdkit2/nav_read.h2
-rw-r--r--libmpdvdkit2/nav_types.h2
19 files changed, 94 insertions, 195 deletions
diff --git a/libmpdvdkit2/bswap.h b/libmpdvdkit2/bswap.h
index dd7417059a..5967c7fee9 100644
--- a/libmpdvdkit2/bswap.h
+++ b/libmpdvdkit2/bswap.h
@@ -20,8 +20,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <config.h>
-
#if defined(WORDS_BIGENDIAN)
/* All bigendian systems are fine, just ignore the swaps. */
#define B2N_16(x) (void)(x)
@@ -48,13 +46,51 @@
#define B2N_32(x) x = swap32(x)
#define B2N_64(x) x = swap64(x)
+#elif defined(ARCH_X86)
+inline static unsigned short bswap_16(unsigned short x)
+{
+ __asm("xchgb %b0,%h0" :
+ "=q" (x) :
+ "0" (x));
+ return x;
+}
+#define B2N_16(x) x = bswap_16(x)
+
+inline static unsigned int bswap_32(unsigned int x)
+{
+ __asm(
+#if __CPU__ > 386
+ "bswap %0":
+ "=r" (x) :
+#else
+ "xchgb %b0,%h0\n"
+ " rorl $16,%0\n"
+ " xchgb %b0,%h0":
+ "=q" (x) :
+#endif
+ "0" (x));
+ return x;
+}
+#define B2N_32(x) x = bswap_32(x)
+
+inline static unsigned long long int bswap_64(unsigned long long int x)
+{
+ register union { __extension__ uint64_t __ll;
+ uint32_t __l[2]; } __x;
+ asm("xchgl %0,%1":
+ "=r"(__x.__l[0]),"=r"(__x.__l[1]):
+ "0"(bswap_32((unsigned long)x)),"1"(bswap_32((unsigned long)(x>>32))));
+ return __x.__ll;
+}
+#define B2N_64(x) x = bswap_64(x)
+
/* This is a slow but portable implementation, it has multiple evaluation
* problems so beware.
* FreeBSD and Solaris don't have <byteswap.h> or any other such
* functionality!
*/
-#elif defined(__FreeBSD__) || defined(__sun) || defined(__bsdi__)
+#elif defined(__FreeBSD__) || defined(__sun) || defined(__bsdi__) || defined(__CYGWIN__)
#define B2N_16(x) \
x = ((((x) & 0xff00) >> 8) | \
(((x) & 0x00ff) << 8))
diff --git a/libmpdvdkit2/css.c b/libmpdvdkit2/css.c
index 156eab0c98..8e073b150c 100644
--- a/libmpdvdkit2/css.c
+++ b/libmpdvdkit2/css.c
@@ -42,7 +42,7 @@
#include <sys/stat.h>
#include <fcntl.h>
-#include "dvdcss/dvdcss.h"
+#include "dvdcss.h"
#include "common.h"
#include "css.h"
diff --git a/libmpdvdkit2/device.c b/libmpdvdkit2/device.c
index 18c68333c6..f3aedbee8a 100644
--- a/libmpdvdkit2/device.c
+++ b/libmpdvdkit2/device.c
@@ -45,7 +45,7 @@
# include <sys/uio.h> /* struct iovec */
#endif
-#include "dvdcss/dvdcss.h"
+#include "dvdcss.h"
#include "common.h"
#include "css.h"
diff --git a/libmpdvdkit2/dvd_input.c b/libmpdvdkit2/dvd_input.c
index c2d788fdb2..80a1de5beb 100644
--- a/libmpdvdkit2/dvd_input.c
+++ b/libmpdvdkit2/dvd_input.c
@@ -21,13 +21,11 @@
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
-#include <dlfcn.h>
#include "dvd_reader.h"
#include "dvd_input.h"
-/* For libdvdcss */
-typedef struct dvdcss_s *dvdcss_handle;
+#include "dvdcss.h"
dvdcss_handle (*DVDcss_open) (const char *);
int (*DVDcss_close) (dvdcss_handle);
@@ -123,176 +121,26 @@ static int css_close(dvd_input_t dev)
-
-
-
-/**
- * initialize and open a DVD device or file.
- */
-static dvd_input_t file_open(const char *target)
-{
- dvd_input_t dev;
-
- /* Allocate the library structure */
- dev = (dvd_input_t) malloc(sizeof(dvd_input_t));
- if(dev == NULL) {
- fprintf(stderr, "libdvdread: Could not allocate memory.\n");
- return NULL;
- }
-
- /* Open the device */
- dev->fd = open(target, O_RDONLY);
- if(dev->fd < 0) {
- perror("libdvdread: Could not open input");
- free(dev);
- return NULL;
- }
-
- return dev;
-}
-
-/**
- * return the last error message
- */
-static char *file_error(dvd_input_t dev)
-{
- /* use strerror(errno)? */
- return "unknown error";
-}
-
-/**
- * seek into the device.
- */
-static int file_seek(dvd_input_t dev, int blocks, int flags)
-{
- off_t pos;
-
- pos = lseek(dev->fd, (off_t)blocks * (off_t)DVD_VIDEO_LB_LEN, SEEK_SET);
- if(pos < 0) {
- return pos;
- }
- /* assert pos % DVD_VIDEO_LB_LEN == 0 */
- return (int) (pos / DVD_VIDEO_LB_LEN);
-}
-
-/**
- * set the block for the begining of a new title (key).
- */
-static int file_title(dvd_input_t dev, int block)
-{
- return -1;
-}
-
-/**
- * read data from the device.
- */
-static int file_read(dvd_input_t dev, void *buffer, int blocks, int flags)
-{
- size_t len;
- ssize_t ret;
-
- len = (size_t)blocks * DVD_VIDEO_LB_LEN;
-
- while(len > 0) {
-
- ret = read(dev->fd, buffer, len);
-
- if(ret < 0) {
- /* One of the reads failed, too bad. We won't even bother
- * returning the reads that went ok, and as in the posix spec
- * the file postition is left unspecified after a failure. */
- return ret;
- }
-
- if(ret == 0) {
- /* Nothing more to read. Return the whole blocks, if any, that we got.
- and adjust the file possition back to the previous block boundary. */
- size_t bytes = (size_t)blocks * DVD_VIDEO_LB_LEN - len;
- off_t over_read = -(bytes % DVD_VIDEO_LB_LEN);
- /*off_t pos =*/ lseek(dev->fd, over_read, SEEK_CUR);
- /* should have pos % 2048 == 0 */
- return (int) (bytes / DVD_VIDEO_LB_LEN);
- }
-
- len -= ret;
- }
-
- return blocks;
-}
-
-/**
- * close the DVD device and clean up.
- */
-static int file_close(dvd_input_t dev)
-{
- int ret;
-
- ret = close(dev->fd);
-
- if(ret < 0)
- return ret;
-
- free(dev);
-
- return 0;
-}
-
-
/**
* Setup read functions with either libdvdcss or minimal DVD access.
*/
int DVDInputSetup(void)
{
- void *dvdcss_library = NULL;
- char **dvdcss_version = NULL;
-
- dvdcss_library = dlopen("libdvdcss.so.2", RTLD_LAZY);
-
- if(dvdcss_library != NULL) {
-#if defined(__OpenBSD__) && !defined(__ELF__)
-#define U_S "_"
-#else
-#define U_S
-#endif
- DVDcss_open = (dvdcss_handle (*)(const char*))
- dlsym(dvdcss_library, U_S "dvdcss_open");
- DVDcss_close = (int (*)(dvdcss_handle))
- dlsym(dvdcss_library, U_S "dvdcss_close");
- DVDcss_title = (int (*)(dvdcss_handle, int))
- dlsym(dvdcss_library, U_S "dvdcss_title");
- DVDcss_seek = (int (*)(dvdcss_handle, int, int))
- dlsym(dvdcss_library, U_S "dvdcss_seek");
- DVDcss_read = (int (*)(dvdcss_handle, void*, int, int))
- dlsym(dvdcss_library, U_S "dvdcss_read");
- DVDcss_error = (char* (*)(dvdcss_handle))
- dlsym(dvdcss_library, U_S "dvdcss_error");
+ DVDcss_open = dvdcss_open;
+ DVDcss_close = dvdcss_close;
+ DVDcss_title = dvdcss_title;
+ DVDcss_seek = dvdcss_seek;
+ DVDcss_read = dvdcss_read;
+ DVDcss_error = dvdcss_error;
- dvdcss_version = (char **)dlsym(dvdcss_library, U_S "dvdcss_interface_2");
-
- if(dlsym(dvdcss_library, U_S "dvdcss_crack")) {
- fprintf(stderr,
- "libdvdread: Old (pre-0.0.2) version of libdvdcss found.\n"
- "libdvdread: You should get the latest version from "
- "http://www.videolan.org/\n" );
- dlclose(dvdcss_library);
- dvdcss_library = NULL;
- } else if(!DVDcss_open || !DVDcss_close || !DVDcss_title || !DVDcss_seek
- || !DVDcss_read || !DVDcss_error || !dvdcss_version) {
- fprintf(stderr, "libdvdread: Missing symbols in libdvdcss.so.2, "
- "this shouldn't happen !\n");
- dlclose(dvdcss_library);
- }
- }
-
- if(dvdcss_library != NULL) {
/*
char *psz_method = getenv( "DVDCSS_METHOD" );
char *psz_verbose = getenv( "DVDCSS_VERBOSE" );
fprintf(stderr, "DVDCSS_METHOD %s\n", psz_method);
fprintf(stderr, "DVDCSS_VERBOSE %s\n", psz_verbose);
*/
- fprintf(stderr, "libdvdread: Using libdvdcss version %s for DVD access\n",
- *dvdcss_version);
+// fprintf(stderr, "libdvdread: Using libdvdcss version %s for DVD access\n",
+// *dvdcss_version);
/* libdvdcss wraper functions */
DVDinput_open = css_open;
@@ -303,16 +151,4 @@ int DVDInputSetup(void)
DVDinput_error = css_error;
return 1;
- } else {
- fprintf(stderr, "libdvdread: Encrypted DVD support unavailable.\n");
-
- /* libdvdcss replacement functions */
- DVDinput_open = file_open;
- DVDinput_close = file_close;
- DVDinput_seek = file_seek;
- DVDinput_title = file_title;
- DVDinput_read = file_read;
- DVDinput_error = file_error;
- return 0;
- }
}
diff --git a/libmpdvdkit2/dvd_reader.c b/libmpdvdkit2/dvd_reader.c
index b296a49de3..037327700c 100644
--- a/libmpdvdkit2/dvd_reader.c
+++ b/libmpdvdkit2/dvd_reader.c
@@ -17,6 +17,8 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*/
+#include "config.h"
+
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h> /* For the timing of dvdcss_title crack. */
@@ -144,6 +146,13 @@ static int initAllCSSKeys( dvd_reader_t *dvd )
}
+#ifndef HAVE_MPLAYER
+ #include "get_path.c"
+#else
+ extern char * get_path( char * filename );
+#endif
+
+extern char * dvdcss_cache_dir;
/**
* Open a DVD image or block device file.
@@ -152,7 +161,16 @@ static dvd_reader_t *DVDOpenImageFile( const char *location, int have_css )
{
dvd_reader_t *dvd;
dvd_input_t dev;
+
+ /* setup cache dir */
+ if(!dvdcss_cache_dir){
+ dvdcss_cache_dir=get_path( "" );
+ if ( dvdcss_cache_dir ) { mkdir( dvdcss_cache_dir,493 ); free( dvdcss_cache_dir ); }
+ dvdcss_cache_dir=get_path( "DVDKeys" );
+ if(dvdcss_cache_dir) mkdir( dvdcss_cache_dir,493 );
+ }
+ /* open it */
dev = DVDinput_open( location );
if( !dev ) {
fprintf( stderr, "libdvdread: Can't open %s for reading\n", location );
@@ -364,6 +382,9 @@ dvd_reader_t *DVDOpen( const char *path )
}
fclose( mntfile );
}
+#elif defined(WIN32)
+ dev_name = strdup(path);
+ auth_drive = DVDOpenImageFile( path, have_css );
#endif
if( !dev_name ) {
fprintf( stderr, "libdvdread: Couldn't find device name.\n" );
@@ -554,8 +575,8 @@ static dvd_file_t *DVDOpenVOBUDF( dvd_reader_t *dvd, int title, int menu )
}
if( dvd->css_state == 1 /* Need key init */ ) {
- initAllCSSKeys( dvd );
- dvd->css_state = 2;
+// initAllCSSKeys( dvd );
+// dvd->css_state = 2;
}
/*
if( DVDinput_seek( dvd_file->dvd->dev,
diff --git a/libmpdvdkit2/dvd_udf.c b/libmpdvdkit2/dvd_udf.c
index 1cd2a0d2fe..443f2e22b0 100644
--- a/libmpdvdkit2/dvd_udf.c
+++ b/libmpdvdkit2/dvd_udf.c
@@ -30,7 +30,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <assert.h>
+//#include <assert.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/libmpdvdkit2/dvdcss.h b/libmpdvdkit2/dvdcss.h
index 71303d1693..72e82e2b27 100644
--- a/libmpdvdkit2/dvdcss.h
+++ b/libmpdvdkit2/dvdcss.h
@@ -61,12 +61,18 @@ typedef struct dvdcss_s* dvdcss_t;
*/
extern char * dvdcss_interface_2;
+/*
+ * Path to CSS key cache. Default == NULL (no cache).
+ */
+extern char * dvdcss_cache_dir;
/*
* Exported prototypes.
*/
extern dvdcss_t dvdcss_open ( char *psz_target );
extern int dvdcss_close ( dvdcss_t );
+extern int dvdcss_title ( dvdcss_t,
+ int i_block );
extern int dvdcss_seek ( dvdcss_t,
int i_blocks,
int i_flags );
diff --git a/libmpdvdkit2/error.c b/libmpdvdkit2/error.c
index 3c4309bcc5..4d7d19c0fc 100644
--- a/libmpdvdkit2/error.c
+++ b/libmpdvdkit2/error.c
@@ -25,7 +25,7 @@
#include <stdio.h>
-#include "dvdcss/dvdcss.h"
+#include "dvdcss.h"
#include "common.h"
#include "css.h"
diff --git a/libmpdvdkit2/ifo_print.c b/libmpdvdkit2/ifo_print.c
index 716f6897f7..22caa39ed5 100644
--- a/libmpdvdkit2/ifo_print.c
+++ b/libmpdvdkit2/ifo_print.c
@@ -23,7 +23,7 @@
#include <inttypes.h>
#include <string.h>
#include <ctype.h>
-#include <assert.h>
+//#include <assert.h>
#include "config.h" // Needed for WORDS_BIGENDIAN
#include "ifo_types.h"
diff --git a/libmpdvdkit2/ifo_print.h b/libmpdvdkit2/ifo_print.h
index 871bc73620..bf0bed366c 100644
--- a/libmpdvdkit2/ifo_print.h
+++ b/libmpdvdkit2/ifo_print.h
@@ -20,8 +20,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <dvdread/ifo_types.h>
-#include <dvdread/dvd_reader.h>
+#include "ifo_types.h"
+#include "dvd_reader.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libmpdvdkit2/ifo_read.c b/libmpdvdkit2/ifo_read.c
index d530bcf965..ae208ae48e 100644
--- a/libmpdvdkit2/ifo_read.c
+++ b/libmpdvdkit2/ifo_read.c
@@ -22,7 +22,7 @@
#include <unistd.h>
#include <inttypes.h>
#include <string.h>
-#include <assert.h>
+//#include <assert.h>
#include "dvd_reader.h"
diff --git a/libmpdvdkit2/ifo_read.h b/libmpdvdkit2/ifo_read.h
index dcf65a3479..508b672d22 100644
--- a/libmpdvdkit2/ifo_read.h
+++ b/libmpdvdkit2/ifo_read.h
@@ -20,8 +20,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <dvdread/ifo_types.h>
-#include <dvdread/dvd_reader.h>
+#include "ifo_types.h"
+#include "dvd_reader.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libmpdvdkit2/ifo_types.h b/libmpdvdkit2/ifo_types.h
index 1fd5c64b1b..efc4a96b20 100644
--- a/libmpdvdkit2/ifo_types.h
+++ b/libmpdvdkit2/ifo_types.h
@@ -21,7 +21,7 @@
*/
#include <inttypes.h>
-#include <dvdread/dvd_reader.h>
+#include "dvd_reader.h"
#undef ATTRIBUTE_PACKED
diff --git a/libmpdvdkit2/libdvdcss.c b/libmpdvdkit2/libdvdcss.c
index 0f04573576..4e715f1f5c 100644
--- a/libmpdvdkit2/libdvdcss.c
+++ b/libmpdvdkit2/libdvdcss.c
@@ -97,7 +97,7 @@
# include <unistd.h>
#endif
-#include "dvdcss/dvdcss.h"
+#include "dvdcss.h"
#include "common.h"
#include "css.h"
diff --git a/libmpdvdkit2/nav_print.c b/libmpdvdkit2/nav_print.c
index 3c9630cc1c..e82d3fa118 100644
--- a/libmpdvdkit2/nav_print.c
+++ b/libmpdvdkit2/nav_print.c
@@ -25,7 +25,7 @@
#include <stdio.h>
#include <inttypes.h>
-#include <assert.h>
+//#include <assert.h>
#include "config.h" // Needed for WORDS_BIGENDIAN
#include "nav_types.h"
diff --git a/libmpdvdkit2/nav_print.h b/libmpdvdkit2/nav_print.h
index 28aefc7e5b..f0551a39b3 100644
--- a/libmpdvdkit2/nav_print.h
+++ b/libmpdvdkit2/nav_print.h
@@ -20,7 +20,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <dvdread/nav_types.h>
+#include "nav_types.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libmpdvdkit2/nav_read.c b/libmpdvdkit2/nav_read.c
index ff0fd164ca..e8c196cb0d 100644
--- a/libmpdvdkit2/nav_read.c
+++ b/libmpdvdkit2/nav_read.c
@@ -19,7 +19,7 @@
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
-#include <assert.h>
+//#include <assert.h>
#include "config.h" // Needed for WORDS_BIGENDIAN
#include "bswap.h"
diff --git a/libmpdvdkit2/nav_read.h b/libmpdvdkit2/nav_read.h
index 61a11ea55e..bd48d5ce6f 100644
--- a/libmpdvdkit2/nav_read.h
+++ b/libmpdvdkit2/nav_read.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <dvdread/nav_types.h>
+#include "nav_types.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libmpdvdkit2/nav_types.h b/libmpdvdkit2/nav_types.h
index bb74e29ede..ba46f7451e 100644
--- a/libmpdvdkit2/nav_types.h
+++ b/libmpdvdkit2/nav_types.h
@@ -30,7 +30,7 @@
*/
#include <inttypes.h>
-#include <dvdread/ifo_types.h> // only dvd_time_t, vm_cmd_t and user_ops_t
+#include "ifo_types.h" // only dvd_time_t, vm_cmd_t and user_ops_t
#undef ATTRIBUTE_PACKED