1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-14 19:05:33 +00:00
mpv/libmpdvdkit2/libdvdread_changes.diff

981 lines
26 KiB
Diff
Raw Normal View History

--- 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 @@
* 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))
--- 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"
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 @@
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" );
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;
- } 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 @@
#if defined(__sun)
#include <sys/mnttab.h>
+#elif defined(hpux)
+#include </usr/conf/h/mnttab.h>
#elif defined(SYS_BSD)
#include <fstab.h>
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__CYGWIN__)
#include <mntent.h>
#endif
+#ifdef __MINGW32__
+#include <sys/timeb.h>
+static void gettimeofday(struct timeval* t,void* timezone){
+ struct timeb timebuffer;
+ ftime( &timebuffer );
+ t->tv_sec=timebuffer.time;
+ t->tv_usec=1000*timebuffer.millitm;
+}
+#endif
+
#include "dvd_udf.h"
#include "dvd_input.h"
#include "dvd_reader.h"
@@ -144,6 +158,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 +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 @@
char *new_path;
/* If it doesn't start with "/dev/" or does start with "/dev/r" exit */
- if( !strncmp( path, "/dev/", 5 ) || strncmp( path, "/dev/r", 6 ) )
+ if( strncmp( path, "/dev/", 5 ) || !strncmp( path, "/dev/r", 6 ) )
return (char *) strdup( path );
/* Replace "/dev/" with "/dev/r" */
@@ -242,6 +273,16 @@
if( !path ) return 0;
+#ifdef WIN32
+ /* Stat doesn't work on devices under mingwin/cygwin. */
+ if( path[0] && path[1] == ':' && path[2] == '\0' )
+ {
+ /* Don't try to stat the file */
+ fileinfo.st_mode = S_IFBLK;
+ }
+ else
+#endif
+ {
ret = stat( path, &fileinfo );
if( ret < 0 ) {
/* If we can't stat the file, give up */
@@ -249,6 +290,7 @@
perror("");
return 0;
}
+ }
/* Try to open libdvdcss or fall back to standard functions */
have_css = DVDInputSetup();
@@ -274,7 +320,7 @@
char *path_copy;
#if defined(SYS_BSD)
struct fstab* fe;
-#elif defined(__sun) || defined(__linux__)
+#elif defined(__sun) || defined(__linux__) || defined(__CYGWIN__)
FILE *mntfile;
#endif
@@ -289,7 +331,9 @@
if( cdir >= 0 ) {
chdir( path_copy );
new_path = getcwd( NULL, PATH_MAX );
+#ifndef __MINGW32__
fchdir( cdir );
+#endif
close( cdir );
if( new_path ) {
free( path_copy );
@@ -345,7 +393,7 @@
}
fclose( mntfile );
}
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__CYGWIN__)
mntfile = fopen( MOUNTED, "r" );
if( mntfile ) {
struct mntent *me;
@@ -364,6 +408,9 @@
}
fclose( mntfile );
}
+#elif defined(__MINGW32__)
+ 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 +601,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,
@@ -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 @@
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<42>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 @@
#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 @@
* 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_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 @@
*/
#include <inttypes.h>
-#include <dvdread/dvd_reader.h>
+#include "dvd_reader.h"
#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 @@
* 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 @@
* 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 @@
*/
#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