changeset 7033:596919e4f601

apply mplayer-specific patches
author arpi
date Fri, 16 Aug 2002 22:50:22 +0000
parents fd2d4be9ed6f
children 12a0f744c1f1
files libmpdvdkit2/bswap.h libmpdvdkit2/css.c libmpdvdkit2/device.c libmpdvdkit2/dvd_input.c libmpdvdkit2/dvd_reader.c libmpdvdkit2/dvd_udf.c libmpdvdkit2/dvdcss.h libmpdvdkit2/error.c libmpdvdkit2/ifo_print.c libmpdvdkit2/ifo_print.h libmpdvdkit2/ifo_read.c libmpdvdkit2/ifo_read.h libmpdvdkit2/ifo_types.h libmpdvdkit2/libdvdcss.c libmpdvdkit2/nav_print.c libmpdvdkit2/nav_print.h libmpdvdkit2/nav_read.c libmpdvdkit2/nav_read.h libmpdvdkit2/nav_types.h
diffstat 19 files changed, 94 insertions(+), 195 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdvdkit2/bswap.h	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/bswap.h	Fri Aug 16 22:50:22 2002 +0000
@@ -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))
--- a/libmpdvdkit2/css.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/css.c	Fri Aug 16 22:50:22 2002 +0000
@@ -42,7 +42,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 
-#include "dvdcss/dvdcss.h"
+#include "dvdcss.h"
 
 #include "common.h"
 #include "css.h"
--- a/libmpdvdkit2/device.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/device.c	Fri Aug 16 22:50:22 2002 +0000
@@ -45,7 +45,7 @@
 #   include <sys/uio.h>                                      /* struct iovec */
 #endif
 
-#include "dvdcss/dvdcss.h"
+#include "dvdcss.h"
 
 #include "common.h"
 #include "css.h"
--- a/libmpdvdkit2/dvd_input.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/dvd_input.c	Fri Aug 16 22:50:22 2002 +0000
@@ -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 @@
 
 
 
-
-
-
-/**
- * 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 @@
     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;
-  }
 }
--- a/libmpdvdkit2/dvd_reader.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/dvd_reader.c	Fri Aug 16 22:50:22 2002 +0000
@@ -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 @@
 }
 
 
+#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 @@
 {
     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 @@
             }
             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 @@
     }
     
     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, 
--- a/libmpdvdkit2/dvd_udf.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/dvd_udf.c	Fri Aug 16 22:50:22 2002 +0000
@@ -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>
--- a/libmpdvdkit2/dvdcss.h	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/dvdcss.h	Fri Aug 16 22:50:22 2002 +0000
@@ -61,12 +61,18 @@
  */
 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 );
--- a/libmpdvdkit2/error.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/error.c	Fri Aug 16 22:50:22 2002 +0000
@@ -25,7 +25,7 @@
 
 #include <stdio.h>
 
-#include "dvdcss/dvdcss.h"
+#include "dvdcss.h"
 
 #include "common.h"
 #include "css.h"
--- a/libmpdvdkit2/ifo_print.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/ifo_print.c	Fri Aug 16 22:50:22 2002 +0000
@@ -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"
--- a/libmpdvdkit2/ifo_print.h	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/ifo_print.h	Fri Aug 16 22:50:22 2002 +0000
@@ -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" {
--- a/libmpdvdkit2/ifo_read.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/ifo_read.c	Fri Aug 16 22:50:22 2002 +0000
@@ -22,7 +22,7 @@
 #include <unistd.h>
 #include <inttypes.h>
 #include <string.h>
-#include <assert.h>
+//#include <assert.h>
 
 #include "dvd_reader.h"
 
--- a/libmpdvdkit2/ifo_read.h	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/ifo_read.h	Fri Aug 16 22:50:22 2002 +0000
@@ -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" {
--- a/libmpdvdkit2/ifo_types.h	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/ifo_types.h	Fri Aug 16 22:50:22 2002 +0000
@@ -21,7 +21,7 @@
  */
 
 #include <inttypes.h>
-#include <dvdread/dvd_reader.h>
+#include "dvd_reader.h"
 
 
 #undef ATTRIBUTE_PACKED
--- a/libmpdvdkit2/libdvdcss.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/libdvdcss.c	Fri Aug 16 22:50:22 2002 +0000
@@ -97,7 +97,7 @@
 #   include <unistd.h>
 #endif
 
-#include "dvdcss/dvdcss.h"
+#include "dvdcss.h"
 
 #include "common.h"
 #include "css.h"
--- a/libmpdvdkit2/nav_print.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/nav_print.c	Fri Aug 16 22:50:22 2002 +0000
@@ -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"
--- a/libmpdvdkit2/nav_print.h	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/nav_print.h	Fri Aug 16 22:50:22 2002 +0000
@@ -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" {
--- a/libmpdvdkit2/nav_read.c	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/nav_read.c	Fri Aug 16 22:50:22 2002 +0000
@@ -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"
--- a/libmpdvdkit2/nav_read.h	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/nav_read.h	Fri Aug 16 22:50:22 2002 +0000
@@ -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" {
--- a/libmpdvdkit2/nav_types.h	Fri Aug 16 22:46:01 2002 +0000
+++ b/libmpdvdkit2/nav_types.h	Fri Aug 16 22:50:22 2002 +0000
@@ -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