changeset 15875:50960b929dd0

update mplayer specific libdvdread diff to match v0.9.4
author aurel
date Thu, 30 Jun 2005 22:52:59 +0000
parents 483e955893b8
children 15f4ed477c39
files libmpdvdkit2/libdvdread_changes.diff
diffstat 1 files changed, 122 insertions(+), 751 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdvdkit2/libdvdread_changes.diff	Thu Jun 30 22:48:26 2005 +0000
+++ b/libmpdvdkit2/libdvdread_changes.diff	Thu Jun 30 22:52:59 2005 +0000
@@ -1,6 +1,7 @@
---- dvdread/bswap.h	2002-04-07 19:52:00.000000000 +0200
-+++ bswap.h	2005-03-01 07:07:45.000000000 +0100
-@@ -20,8 +20,6 @@
+diff -Naur dvdread.orig/bswap.h dvdread/bswap.h
+--- dvdread.orig/bswap.h	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/bswap.h	2005-06-23 00:19:10.000000000 +0200
+@@ -20,8 +24,6 @@
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
   */
  
@@ -9,10 +10,16 @@
  #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)
+@@ -59,13 +61,57 @@
+ #define B2N_32(x) x = be32toh(x)
+ #define B2N_64(x) x = be64toh(x)
  
++#elif defined(__DragonFly__)
++#include <sys/endian.h>
++#define B2N_16(x) x = be16toh(x)
++#define B2N_32(x) x = be32toh(x)
++#define B2N_64(x) x = be64toh(x)
++
 +#elif defined(ARCH_X86)
 +inline static unsigned short bswap_16(unsigned short x)
 +{
@@ -53,7 +60,7 @@
 +
  /* 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 
+  * Old FreeBSD's and Solaris don't have <byteswap.h> or any other such 
   * functionality! 
   */
  
@@ -62,280 +69,51 @@
  #define B2N_16(x) \
   x = ((((x) & 0xff00) >> 8) | \
        (((x) & 0x00ff) << 8))
---- dvdread/dvd_input.c	2002-05-09 23:32:46.000000000 +0200
-+++ dvd_input.c	2005-03-01 07:07:46.000000000 +0100
-@@ -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"
+diff -Naur dvdread.orig/.cvsignore dvdread/.cvsignore
+diff -Naur dvdread.orig/dvd_input.c dvdread/dvd_input.c
+--- dvdread.orig/dvd_input.c	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/dvd_input.c	2005-06-23 00:30:23.000000000 +0200
+@@ -37,7 +41,7 @@
  
- dvdcss_handle (*DVDcss_open)  (const char *);
- int           (*DVDcss_close) (dvdcss_handle);
-@@ -36,6 +34,12 @@
- int           (*DVDcss_read)  (dvdcss_handle, void *, int, int);
- char *        (*DVDcss_error) (dvdcss_handle);
- 
-+dvd_input_t (*DVDinput_open)  (const char *);
-+int         (*DVDinput_close) (dvd_input_t);
-+int         (*DVDinput_seek)  (dvd_input_t, int, int);
-+int         (*DVDinput_title) (dvd_input_t, int); 
-+int         (*DVDinput_read)  (dvd_input_t, void *, int, int);
-+char *      (*DVDinput_error) (dvd_input_t);
- 
- /* The DVDinput handle, add stuff here for new input methods. */
- struct dvd_input_s {
-@@ -55,7 +59,7 @@
+ #ifdef HAVE_DVDCSS_DVDCSS_H
+ /* linking to libdvdcss */
+-#include <dvdcss/dvdcss.h>
++#include "dvdcss.h"
+ #define DVDcss_open(a) dvdcss_open((char*)(a))
+ #define DVDcss_close   dvdcss_close
+ #define DVDcss_seek    dvdcss_seek
+@@ -74,7 +78,7 @@
    dvd_input_t dev;
-   
+     
    /* Allocate the handle structure */
 -  dev = (dvd_input_t) malloc(sizeof(dvd_input_t));
 +  dev = (dvd_input_t) malloc(sizeof(struct dvd_input_s));
    if(dev == NULL) {
      fprintf(stderr, "libdvdread: Could not allocate memory.\n");
      return NULL;
-@@ -123,176 +127,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" );
+@@ -320,8 +324,10 @@
      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 +157,4 @@
-     DVDinput_error = css_error;
-     return 1;
++    /*
+     fprintf(stderr, "libdvdread: Using libdvdcss version %s for DVD access\n",
+ 	    *dvdcss_version);
++    */
      
--  } 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;
--  }
- }
---- dvdread/dvd_input.h	2002-05-09 23:21:20.000000000 +0200
-+++ dvd_input.h	2005-03-01 07:07:46.000000000 +0100
-@@ -36,12 +36,12 @@
- /**
-  * Pointers which will be filled either the input meathods functions.
-  */
--dvd_input_t (*DVDinput_open)  (const char *);
--int         (*DVDinput_close) (dvd_input_t);
--int         (*DVDinput_seek)  (dvd_input_t, int, int);
--int         (*DVDinput_title) (dvd_input_t, int); 
--int         (*DVDinput_read)  (dvd_input_t, void *, int, int);
--char *      (*DVDinput_error) (dvd_input_t);
-+extern dvd_input_t (*DVDinput_open)  (const char *);
-+extern int         (*DVDinput_close) (dvd_input_t);
-+extern int         (*DVDinput_seek)  (dvd_input_t, int, int);
-+extern int         (*DVDinput_title) (dvd_input_t, int); 
-+extern int         (*DVDinput_read)  (dvd_input_t, void *, int, int);
-+extern char *      (*DVDinput_error) (dvd_input_t);
- 
- /**
-  * Setup function accessed by dvd_reader.c.  Returns 1 if there is CSS support.
---- dvdread/dvd_reader.c	2002-05-19 17:48:41.000000000 +0200
-+++ dvd_reader.c	2005-03-01 07:07:46.000000000 +0100
-@@ -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. */
-@@ -35,12 +37,24 @@
+     /* libdvdcss wrapper functions */
+     dvdinput_open  = css_open;
+diff -Naur dvdread.orig/dvd_input.h dvdread/dvd_input.h
+diff -Naur dvdread.orig/dvd_reader.c dvdread/dvd_reader.c
+--- dvdread.orig/dvd_reader.c	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/dvd_reader.c	2005-06-23 00:19:10.000000000 +0200
+@@ -32,24 +36,36 @@
+ #include <limits.h>
+ #include <dirent.h>
+  
+-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__bsdi__)|| defined(__DARWIN__)
++#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__bsdi__)|| defined(__DARWIN__) || defined(__DragonFly__)
+ #define SYS_BSD 1
+ #endif
  
  #if defined(__sun)
  #include <sys/mnttab.h>
@@ -361,7 +139,14 @@
  #include "dvd_udf.h"
  #include "dvd_input.h"
  #include "dvd_reader.h"
-@@ -144,6 +158,13 @@
+ #include "md5.h"
+ 
+-#define DEFAULT_UDF_CACHE_LEVEL 1
++#define DEFAULT_UDF_CACHE_LEVEL 0
+ 
+ struct dvd_reader_s {
+     /* Basic information. */
+@@ -194,6 +210,13 @@
  }
  
  
@@ -375,25 +160,7 @@
  
  /**
   * Open a DVD image or block device file.
-@@ -152,7 +173,17 @@
- {
-     dvd_reader_t *dvd;
-     dvd_input_t dev;
-+
-+    /* setup cache dir is no longer needed, it's now implemented in libdvdcss.c
-+    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 );
-@@ -222,7 +253,7 @@
+@@ -282,7 +305,7 @@
      char *new_path;
  
      /* If it doesn't start with "/dev/" or does start with "/dev/r" exit */ 
@@ -402,9 +169,9 @@
        return (char *) strdup( path );
  
      /* Replace "/dev/" with "/dev/r" */
-@@ -242,6 +273,16 @@
- 
-     if( !path ) return 0;
+@@ -303,6 +326,16 @@
+     if( path == NULL )
+       return 0;
  
 +#ifdef WIN32
 +    /* Stat doesn't work on devices under mingwin/cygwin. */
@@ -419,15 +186,15 @@
      ret = stat( path, &fileinfo );
      if( ret < 0 ) {
  	/* If we can't stat the file, give up */
-@@ -249,6 +290,7 @@
+@@ -310,6 +343,7 @@
  	perror("");
  	return 0;
      }
 +    }
  
      /* Try to open libdvdcss or fall back to standard functions */
-     have_css = DVDInputSetup();
-@@ -274,7 +320,7 @@
+     have_css = dvdinput_setup();
+@@ -335,7 +369,7 @@
  	char *path_copy;
  #if defined(SYS_BSD)
  	struct fstab* fe;
@@ -436,7 +203,7 @@
  	FILE *mntfile;
  #endif
  
-@@ -289,7 +331,9 @@
+@@ -350,7 +384,9 @@
  	    if( cdir >= 0 ) {
  		chdir( path_copy );
  		new_path = getcwd( NULL, PATH_MAX );
@@ -446,7 +213,7 @@
  		close( cdir );
  		if( new_path ) {
  		    free( path_copy );
-@@ -345,7 +393,7 @@
+@@ -406,7 +442,7 @@
  	    }
  	    fclose( mntfile );
  	}
@@ -455,7 +222,7 @@
          mntfile = fopen( MOUNTED, "r" );
          if( mntfile ) {
              struct mntent *me;
-@@ -364,6 +408,9 @@
+@@ -425,6 +461,9 @@
              }
              fclose( mntfile );
  	}
@@ -465,7 +232,7 @@
  #endif
  	if( !dev_name ) {
  	  fprintf( stderr, "libdvdread: Couldn't find device name.\n" );
-@@ -554,8 +601,8 @@
+@@ -615,8 +654,8 @@
      }
      
      if( dvd->css_state == 1 /* Need key init */ ) {
@@ -475,399 +242,53 @@
 +//	dvd->css_state = 2;
      }
      /*    
-     if( DVDinput_seek( dvd_file->dvd->dev, 
-@@ -631,10 +678,9 @@
-             dvd_file->title_sizes[ i ] = fileinfo.st_size / DVD_VIDEO_LB_LEN;
-             dvd_file->title_devs[ i ] = DVDinput_open( full_path );
-             dvd_file->filesize += dvd_file->title_sizes[ i ];
-+            DVDinput_seek( dvd_file->title_devs[ i ], 0, DVDINPUT_SEEK_KEY );
-         }
--        if( dvd_file->title_devs[ 0 ] ) {
--	    DVDinput_seek( dvd_file->title_devs[ 0 ], 0, DVDINPUT_SEEK_KEY );
--	} else {
-+        if( !dvd_file->title_devs[ 0 ] ) {
-             free( dvd_file );
-             return 0;
-         }
-@@ -794,7 +840,10 @@
- 		if( ret < 0 ) return ret;
- 		/* FIXME: This is wrong if i is the last file in the set. 
-                  * also error from this read will not show in ret. */
--		
-+
-+                /* Does the next part exist? If not then return now. */
-+                if( !dvd_file->title_devs[ i + 1 ] ) return ret;
-+
-                 /* Read part 2 */
-                 off = DVDinput_seek( dvd_file->title_devs[ i + 1 ], 
- 				     0, DVDINPUT_NOFLAGS );
-@@ -846,7 +895,7 @@
+     if( dvdinput_title( dvd_file->dvd->dev, (int)start ) < 0 ) {
+@@ -915,7 +954,7 @@
      return (ssize_t)ret;
  }
  
 -int32_t DVDFileSeek( dvd_file_t *dvd_file, int32_t offset )
 +int DVDFileSeek( dvd_file_t *dvd_file, int offset )
  {
-    if( offset > dvd_file->filesize * DVD_VIDEO_LB_LEN ) {
-        return -1;
---- dvdread/dvd_udf.c	2002-05-06 22:16:31.000000000 +0200
-+++ dvd_udf.c	2005-03-01 07:07:46.000000000 +0100
-@@ -4,6 +4,9 @@
-  *
-  * Modifications by:
-  *   Billy Biggs <vektor@dumbterm.net>.
-+ *   Björn Englund <d4bjorn@dtek.chalmers.se>.
-+ *   Joey Parrish <joey@nicewarrior.org>.
-+ *     - updated from libdvdread 0.9.4 and removed udf caching
-  *
-  * dvdudf: parse and read the UDF volume information of a DVD Video
-  * Copyright (C) 1999 Christian Wolff for convergence integrated media
-@@ -30,8 +33,10 @@
+     /* Check arguments. */
+     if( dvd_file == NULL || offset < 0 )
+diff -Naur dvdread.orig/dvdread_internal.h dvdread/dvdread_internal.h
+--- dvdread.orig/dvdread_internal.h	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/dvdread_internal.h	2005-06-23 00:19:10.000000000 +0200
+@@ -2,11 +2,7 @@
+ #define DVDREAD_INTERNAL_H
+ 
+ 
+-#define CHECK_VALUE(arg) \
+- if(!(arg)) { \
+-   fprintf(stderr, "\n*** libdvdread: CHECK_VALUE failed in %s:%i ***" \
+-                   "\n*** for %s ***\n\n", \
+-                   __FILE__, __LINE__, # arg ); \
+- }
++#define CHECK_VALUE(arg)
++
+ 
+ #endif /* DVDREAD_INTERNAL_H */
+diff -Naur dvdread.orig/dvd_udf.c dvdread/dvd_udf.c
+--- dvdread.orig/dvd_udf.c	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/dvd_udf.c	2005-06-23 00:19:10.000000000 +0200
+@@ -33,7 +37,9 @@
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
--#include <assert.h>
-+//#include <assert.h>
 +#ifndef __MINGW32__
  #include <sys/ioctl.h>
 +#endif
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <unistd.h>
-@@ -93,6 +98,32 @@
-     uint16_t Partition;
- };
- 
-+struct extent_ad {
-+  uint32_t location;
-+  uint32_t length;
-+};
-+
-+struct avdp_t {
-+  struct extent_ad mvds;
-+  struct extent_ad rvds;
-+};
-+
-+struct pvd_t {
-+  uint8_t VolumeIdentifier[32];
-+  uint8_t VolumeSetIdentifier[128];
-+};
-+
-+struct lbudf {
-+  uint32_t lb;
-+  uint8_t *data;
-+};
-+
-+struct icbmap {
-+  uint32_t lbn;
-+  struct AD file;
-+  uint8_t filetype;
-+};
-+
- /* For direct data access, LSB first */
- #define GETN1(p) ((uint8_t)data[p])
- #define GETN2(p) ((uint16_t)data[p] | ((uint16_t)data[(p) + 1] << 8))
-@@ -334,6 +365,67 @@
-     return 0;
- }
- 
-+
-+static int UDFGetAVDP( dvd_reader_t *device,
-+		       struct avdp_t *avdp)
-+{
-+  uint8_t Anchor[ DVD_VIDEO_LB_LEN ];
-+  uint32_t lbnum, MVDS_location, MVDS_length;
-+  uint16_t TagID;
-+  uint32_t lastsector;
-+  int terminate;
-+  struct avdp_t; 
-+  
-+  /* Find Anchor */
-+  lastsector = 0;
-+  lbnum = 256;   /* Try #1, prime anchor */
-+  terminate = 0;
-+  
-+  for(;;) {
-+    if( DVDReadLBUDF( device, lbnum, 1, Anchor, 0 ) > 0 ) {
-+      UDFDescriptor( Anchor, &TagID );
-+    } else {
-+      TagID = 0;
-+    }
-+    if (TagID != 2) {
-+      /* Not an anchor */
-+      if( terminate ) return 0; /* Final try failed */
-+      
-+      if( lastsector ) {
-+	
-+	/* We already found the last sector.  Try #3, alternative
-+	 * backup anchor.  If that fails, don't try again.
-+	 */
-+	lbnum = lastsector;
-+	terminate = 1;
-+      } else {
-+	/* TODO: Find last sector of the disc (this is optional). */
-+	if( lastsector ) {
-+	  /* Try #2, backup anchor */
-+	  lbnum = lastsector - 256;
-+	} else {
-+	  /* Unable to find last sector */
-+	  return 0;
-+	}
-+      }
-+    } else {
-+      /* It's an anchor! We can leave */
-+      break;
-+    }
-+  }
-+  /* Main volume descriptor */
-+  UDFExtentAD( &Anchor[ 16 ], &MVDS_length, &MVDS_location );
-+  avdp->mvds.location = MVDS_location;
-+  avdp->mvds.length = MVDS_length;
-+  
-+  /* Backup volume descriptor */
-+  UDFExtentAD( &Anchor[ 24 ], &MVDS_length, &MVDS_location );
-+  avdp->rvds.location = MVDS_location;
-+  avdp->rvds.length = MVDS_length;
-+  
-+  return 1;
-+}
-+
- /**
-  * Looks for partition on the disc.  Returns 1 if partition found, 0 on error.
-  *   partnum: Number of the partition, starting at 0.
-@@ -342,52 +434,21 @@
- static int UDFFindPartition( dvd_reader_t *device, int partnum,
- 			     struct Partition *part ) 
- {
--    uint8_t LogBlock[ DVD_VIDEO_LB_LEN ], Anchor[ DVD_VIDEO_LB_LEN ];
-+    uint8_t LogBlock[ DVD_VIDEO_LB_LEN ];
-     uint32_t lbnum, MVDS_location, MVDS_length;
-     uint16_t TagID;
--    uint32_t lastsector;
--    int i, terminate, volvalid;
-+    int i, volvalid;
-+    struct avdp_t avdp;
- 
--    /* Find Anchor */
--    lastsector = 0;
--    lbnum = 256;   /* Try #1, prime anchor */
--    terminate = 0;
--
--    for(;;) {
--        if( DVDReadLBUDF( device, lbnum, 1, Anchor, 0 ) > 0 ) {
--            UDFDescriptor( Anchor, &TagID );
--        } else {
--            TagID = 0;
--        }
--        if (TagID != 2) {
--            /* Not an anchor */
--            if( terminate ) return 0; /* Final try failed */
--
--            if( lastsector ) {
--
--                /* We already found the last sector.  Try #3, alternative
--                 * backup anchor.  If that fails, don't try again.
--                 */
--                lbnum = lastsector;
--                terminate = 1;
--            } else {
--                /* TODO: Find last sector of the disc (this is optional). */
--                if( lastsector ) {
--                    /* Try #2, backup anchor */
--                    lbnum = lastsector - 256;
--                } else {
--                    /* Unable to find last sector */
--                    return 0;
--                }
--            }
--        } else {
--            /* It's an anchor! We can leave */
--            break;
--        }
-+    
-+    if(!UDFGetAVDP(device, &avdp)) {
-+      return 0;
-     }
-+
-     /* Main volume descriptor */
--    UDFExtentAD( &Anchor[ 16 ], &MVDS_length, &MVDS_location );
--	
-+    MVDS_location = avdp.mvds.location;
-+    MVDS_length = avdp.mvds.length;
-+
-     part->valid = 0;
-     volvalid = 0;
-     part->VolumeDesc[ 0 ] = '\0';
-@@ -422,8 +483,9 @@
-                  && ( ( !part->valid ) || ( !volvalid ) ) );
- 
-         if( ( !part->valid) || ( !volvalid ) ) {
--            /* Backup volume descriptor */
--            UDFExtentAD( &Anchor[ 24 ], &MVDS_length, &MVDS_location );
-+	  /* Backup volume descriptor */
-+	  MVDS_location = avdp.mvds.location;
-+	  MVDS_length = avdp.mvds.length;
-         }
-     } while( i-- && ( ( !part->valid ) || ( !volvalid ) ) );
- 
-@@ -442,17 +504,18 @@
-     char tokenline[ MAX_UDF_FILE_NAME_LEN ];
-     char *token;
-     uint8_t filetype;
--	
-+
-     *filesize = 0;
-     tokenline[0] = '\0';
-     strcat( tokenline, filename );
- 
--    /* Find partition, 0 is the standard location for DVD Video.*/
--    if( !UDFFindPartition( device, 0, &partition ) ) return 0;
--
--    /* Find root dir ICB */
--    lbnum = partition.Start;
--    do {
-+    
-+      /* Find partition, 0 is the standard location for DVD Video.*/
-+      if( !UDFFindPartition( device, 0, &partition ) ) return 0;
-+      
-+      /* Find root dir ICB */
-+      lbnum = partition.Start;
-+      do {
-         if( DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ) <= 0 ) {
-             TagID = 0;
-         } else {
-@@ -469,19 +532,27 @@
-     /* Sanity checks. */
-     if( TagID != 256 ) return 0;
-     if( RootICB.Partition != 0 ) return 0;
--	
-+
-     /* Find root dir */
-     if( !UDFMapICB( device, RootICB, &filetype, &partition, &File ) ) return 0;
-     if( filetype != 4 ) return 0;  /* Root dir should be dir */
- 
--    /* Tokenize filepath */
--    token = strtok(tokenline, "/");
--    while( token != NULL ) {
--        if( !UDFScanDir( device, File, token, &partition, &ICB ) ) return 0;
--        if( !UDFMapICB( device, ICB, &filetype, &partition, &File ) ) return 0;
-+    {
-+      /* Tokenize filepath */
-+      token = strtok(tokenline, "/");
-+      
-+      while( token != NULL ) {
-+       
-+        if( !UDFScanDir( device, File, token, &partition, &ICB)) {
-+         return 0;
-+       }
-+        if( !UDFMapICB( device, ICB, &filetype, &partition, &File ) ) {
-+         return 0;
-+       }
-         token = strtok( NULL, "/" );
--    }
--    
-+      }
-+    } 
-+
-     /* Sanity check. */
-     if( File.Partition != 0 ) return 0;
-    
-@@ -492,3 +563,81 @@
-     else
-       return partition.Start + File.Location;
- }
-+
-+
-+
-+/**
-+ * Gets a Descriptor .
-+ * Returns 1 if descriptor found, 0 on error.
-+ * id, tagid of descriptor
-+ * bufsize, size of BlockBuf (must be >= DVD_VIDEO_LB_LEN).
-+ */
-+static int UDFGetDescriptor( dvd_reader_t *device, int id,
-+			     uint8_t *descriptor, int bufsize) 
-+{
-+  uint32_t lbnum, MVDS_location, MVDS_length;
-+  struct avdp_t avdp;
-+  uint16_t TagID;
-+  uint32_t lastsector;
-+  int i, terminate;
-+  int desc_found = 0;
-+  /* Find Anchor */
-+  lastsector = 0;
-+  lbnum = 256;   /* Try #1, prime anchor */
-+  terminate = 0;
-+  if(bufsize < DVD_VIDEO_LB_LEN) {
-+    return 0;
-+  }
-+  
-+  if(!UDFGetAVDP(device, &avdp)) {
-+    return 0;
-+  }
-+
-+  /* Main volume descriptor */
-+  MVDS_location = avdp.mvds.location;
-+  MVDS_length = avdp.mvds.length;
-+  
-+  i = 1;
-+  do {
-+    /* Find  Descriptor */
-+    lbnum = MVDS_location;
-+    do {
-+      
-+      if( DVDReadLBUDF( device, lbnum++, 1, descriptor, 0 ) <= 0 ) {
-+	TagID = 0;
-+      } else {
-+	UDFDescriptor( descriptor, &TagID );
-+      }
-+      
-+      if( (TagID == id) && ( !desc_found ) ) {
-+	/* Descriptor */
-+	desc_found = 1;
-+      }
-+    } while( ( lbnum <= MVDS_location + ( MVDS_length - 1 )
-+	       / DVD_VIDEO_LB_LEN ) && ( TagID != 8 )
-+	     && ( !desc_found) );
-+    
-+    if( !desc_found ) {
-+      /* Backup volume descriptor */
-+      MVDS_location = avdp.rvds.location;
-+      MVDS_length = avdp.rvds.length;
-+    }
-+  } while( i-- && ( !desc_found )  );
-+  
-+  return desc_found;
-+}
-+
-+
-+static int UDFGetPVD(dvd_reader_t *device, struct pvd_t *pvd)
-+{
-+  uint8_t pvd_buf[DVD_VIDEO_LB_LEN];
-+  
-+  if(!UDFGetDescriptor( device, 1, pvd_buf, sizeof(pvd_buf))) {
-+    return 0;
-+  }
-+  
-+  memcpy(pvd->VolumeIdentifier, &pvd_buf[24], 32);
-+  memcpy(pvd->VolumeSetIdentifier, &pvd_buf[72], 128);
-+  
-+  return 1;
-+}
---- dvdread/ifo_print.c	2002-05-15 21:35:54.000000000 +0200
-+++ ifo_print.c	2005-03-01 07:07:46.000000000 +0100
-@@ -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"
---- dvdread/ifo_print.h	2002-04-07 19:52:01.000000000 +0200
-+++ ifo_print.h	2005-03-01 07:07:46.000000000 +0100
-@@ -20,8 +20,8 @@
+diff -Naur dvdread.orig/ifo_print.c dvdread/ifo_print.c
+diff -Naur dvdread.orig/ifo_print.h dvdread/ifo_print.h
+diff -Naur dvdread.orig/ifo_read.c dvdread/ifo_read.c
+diff -Naur dvdread.orig/ifo_read.h dvdread/ifo_read.h
+--- dvdread.orig/ifo_read.h	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/ifo_read.h	2005-06-23 00:19:10.000000000 +0200
+@@ -20,8 +24,8 @@
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
@@ -878,33 +299,10 @@
  
  #ifdef __cplusplus
  extern "C" {
---- dvdread/ifo_read.c	2002-05-25 21:37:18.000000000 +0200
-+++ ifo_read.c	2005-03-01 07:07:46.000000000 +0100
-@@ -22,7 +22,7 @@
- #include <unistd.h>
- #include <inttypes.h>
- #include <string.h>
--#include <assert.h>
-+//#include <assert.h>
- 
- #include "dvd_reader.h"
- 
---- dvdread/ifo_read.h	2002-04-07 19:52:01.000000000 +0200
-+++ ifo_read.h	2005-03-01 07:07:46.000000000 +0100
-@@ -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" {
---- dvdread/ifo_types.h	2002-04-07 19:52:01.000000000 +0200
-+++ ifo_types.h	2005-03-01 07:07:46.000000000 +0100
-@@ -21,7 +21,7 @@
+diff -Naur dvdread.orig/ifo_types.h dvdread/ifo_types.h
+--- dvdread.orig/ifo_types.h	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/ifo_types.h	2005-06-23 00:19:10.000000000 +0200
+@@ -21,7 +25,7 @@
   */
  
  #include <inttypes.h>
@@ -913,68 +311,41 @@
  
  
  #undef ATTRIBUTE_PACKED
---- dvdread/nav_print.c	2002-04-07 19:18:06.000000000 +0200
-+++ nav_print.c	2005-03-01 07:07:46.000000000 +0100
-@@ -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"
---- dvdread/nav_print.h	2002-04-07 20:17:19.000000000 +0200
-+++ nav_print.h	2005-03-01 07:07:46.000000000 +0100
-@@ -20,7 +20,7 @@
+diff -Naur dvdread.orig/nav_print.c dvdread/nav_print.c
+diff -Naur dvdread.orig/nav_print.h dvdread/nav_print.h
+--- dvdread.orig/nav_print.h	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/nav_print.h	2005-06-23 00:19:10.000000000 +0200
+@@ -20,7 +24,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" {
---- dvdread/nav_read.c	2002-04-07 19:52:01.000000000 +0200
-+++ nav_read.c	2005-03-01 07:07:46.000000000 +0100
-@@ -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"
-@@ -95,7 +95,9 @@
-   /* pci hli btnit */
-   for(i = 0; i < pci->hli.hl_gi.btngr_ns; i++) {
-     for(j = 0; j < (36 / pci->hli.hl_gi.btngr_ns); j++) {
-+#ifdef HAVE_ASSERT_H
-       int n = (36 / pci->hli.hl_gi.btngr_ns) * i + j;
-+#endif
-       assert(pci->hli.btnit[n].zero1 == 0);
-       assert(pci->hli.btnit[n].zero2 == 0);
-       assert(pci->hli.btnit[n].zero3 == 0);
---- dvdread/nav_read.h	2002-04-07 20:17:19.000000000 +0200
-+++ nav_read.h	2005-03-01 07:07:46.000000000 +0100
-@@ -19,7 +19,7 @@
+ /**
+  * Pretty printing of the NAV packets, PCI and DSI structs.
+diff -Naur dvdread.orig/nav_read.c dvdread/nav_read.c
+diff -Naur dvdread.orig/nav_read.h dvdread/nav_read.h
+--- dvdread.orig/nav_read.h	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/nav_read.h	2005-06-23 00:19:10.000000000 +0200
+@@ -19,7 +23,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" {
---- dvdread/nav_types.h	2002-04-07 20:41:59.000000000 +0200
-+++ nav_types.h	2005-03-01 07:07:46.000000000 +0100
-@@ -30,7 +30,7 @@
+ /**
+  * Parsing of NAV data, PCI and DSI parts.
+diff -Naur dvdread.orig/nav_types.h dvdread/nav_types.h
+--- dvdread.orig/nav_types.h	2005-06-23 00:18:54.000000000 +0200
++++ dvdread/nav_types.h	2005-06-23 00:19:10.000000000 +0200
+@@ -30,7 +34,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
+-#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