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 */ -#include - #if defined(WORDS_BIGENDIAN) /* All bigendian systems are fine, just ignore the swaps. */ #define B2N_16(x) (void)(x) @@ -59,13 +61,57 @@ #define B2N_32(x) x = be32toh(x) #define B2N_64(x) x = be64toh(x) +#elif defined(__DragonFly__) +#include +#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) +{ + __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. * Old FreeBSD's and Solaris don't have 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 -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 @@ #ifdef HAVE_DVDCSS_DVDCSS_H /* linking to libdvdcss */ -#include +#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; @@ -154,7 +158,7 @@ dvd_input_t dev; /* Allocate the library 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; @@ -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); + */ /* 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 #include -#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 +#elif defined(hpux) +#include #elif defined(SYS_BSD) #include -#elif defined(__linux__) +#elif defined(__linux__) || defined(__CYGWIN__) #include #endif +#ifdef __MINGW32__ +#include +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" #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 @@ } +#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. @@ -278,11 +301,16 @@ Darwin /dev/rdisk0, it needs to be the raw device BSD/OS /dev/sr0c (if not mounted) or /dev/rsr0c ('c' any letter will do) */ static char *bsd_block2char( const char *path ) +#if defined(__FreeBSD__) +{ + return (char *) strdup( path ); +} +#else { 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" */ @@ -292,6 +320,7 @@ return new_path; } +#endif /* __FreeBSD__ */ #endif dvd_reader_t *DVDOpen( const char *path ) @@ -303,6 +332,16 @@ if( path == NULL ) 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 */ @@ -310,6 +349,7 @@ perror(""); return 0; } + } /* Try to open libdvdcss or fall back to standard functions */ have_css = dvdinput_setup(); @@ -335,7 +375,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 @@ -350,7 +390,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 ); @@ -406,7 +448,7 @@ } fclose( mntfile ); } -#elif defined(__linux__) +#elif defined(__linux__) || defined(__CYGWIN__) mntfile = fopen( MOUNTED, "r" ); if( mntfile ) { struct mntent *me; @@ -425,6 +467,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" ); @@ -615,8 +660,8 @@ } if( dvd->css_state == 1 /* Need key init */ ) { - initAllCSSKeys( dvd ); - dvd->css_state = 2; +// initAllCSSKeys( dvd ); +// dvd->css_state = 2; } /* if( dvdinput_title( dvd_file->dvd->dev, (int)start ) < 0 ) { @@ -915,7 +960,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 ) { /* 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 #include #include +#ifndef __MINGW32__ #include +#endif #include #include #include diff -Naur dvdread.orig/ifo_print.c dvdread/ifo_print.c --- dvdread.orig/ifo_print.c 30 Jun 2005 22:48:26 -0000 1.4 +++ dvdread/ifo_print.c 3 Oct 2005 14:29:01 -0000 1.5 @@ -761,14 +761,14 @@ ifoPrint_USER_OPS(&pgc->prohibited_ops); for(i = 0; i < 8; i++) { - if(pgc->audio_control[i] & 0x8000) { /* The 'is present' bit */ + if(pgc->audio_control[i].present) { printf("Audio stream %i control: %04x\n", i, pgc->audio_control[i]); } } for(i = 0; i < 32; i++) { - if(pgc->subp_control[i] & 0x80000000) { /* The 'is present' bit */ + if(pgc->subp_control[i].present) { printf("Subpicture stream %2i control: %08x\n", i, pgc->subp_control[i]); } diff -Naur dvdread.orig/ifo_print.h dvdread/ifo_print.h --- dvdread/ifo_print.h 2002-08-15 22:13:21.000000000 +0200 +++ /home/diego/src/mplayer/vanilla/libmpdvdkit2/ifo_print.h 2005-12-29 13:13:21.000000000 +0100 @@ -20,8 +24,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include -#include +#include "ifo_types.h" +#include "dvd_reader.h" #ifdef __cplusplus extern "C" { diff -Naur dvdread.orig/ifo_read.c dvdread/ifo_read.c --- dvdread.orig/ifo_read.c 30 Jun 2005 22:48:26 -0000 1.4 +++ dvdread/ifo_read.c 3 Oct 2005 14:29:01 -0000 1.5 @@ -638,10 +638,6 @@ B2N_16(pgc->cell_playback_offset); B2N_16(pgc->cell_position_offset); - for(i = 0; i < 8; i++) - B2N_16(pgc->audio_control[i]); - for(i = 0; i < 32; i++) - B2N_32(pgc->subp_control[i]); for(i = 0; i < 16; i++) B2N_32(pgc->palette[i]); @@ -650,10 +646,10 @@ /* verify time (look at print_time) */ for(i = 0; i < 8; i++) - if(!pgc->audio_control[i] & 0x8000) /* The 'is present' bit */ + if(!pgc->audio_control[i].present) CHECK_ZERO(pgc->audio_control[i]); for(i = 0; i < 32; i++) - if(!pgc->subp_control[i] & 0x80000000) /* The 'is present' bit */ + if(!pgc->subp_control[i].present) CHECK_ZERO(pgc->subp_control[i]); /* Check that time is 0:0:0:0 also if nr_of_programs == 0 */ 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 */ -#include -#include +#include "ifo_types.h" +#include "dvd_reader.h" #ifdef __cplusplus extern "C" { 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 -#include +#include "dvd_reader.h" #undef ATTRIBUTE_PACKED @@ -394,6 +398,55 @@ } ATTRIBUTE_PACKED user_ops_t; /** + * Subpicture stream mapping for a subtitle + */ +typedef struct { +#ifdef WORDS_BIGENDIAN + unsigned int present : 1; + unsigned int zero1 : 2; + unsigned int s_4p3 : 5; /* stream for 4:3 on any display */ + + unsigned int zero2 : 3; + unsigned int s_wide : 5; /* stream for 16:9 on widescreen display */ + + unsigned int zero3 : 3; + unsigned int s_lbox : 5; /* stream for 16:9 on letterboxed 4:3 display */ + + unsigned int zero4 : 3; + unsigned int s_panscan : 5; /* stream for 16:9 with pan&scan data on 4:3 display */ +#else + unsigned int s_4p3 : 5; /* stream for 4:3 on any display */ + unsigned int zero1 : 2; + unsigned int present : 1; + + unsigned int s_wide : 5; /* stream for 16:9 on widescreen display */ + unsigned int zero2 : 3; + + unsigned int s_lbox : 5; /* stream for 16:9 on letterboxed 4:3 display */ + unsigned int zero3 : 3; + + unsigned int s_panscan : 5; /* stream for 16:9 with pan&scan data on 4:3 display */ + unsigned int zero4 : 3; +#endif +} ATTRIBUTE_PACKED subp_mapping_t; + +/** + * Audio stream mapping for a soundtrack + */ +typedef struct { +#ifdef WORDS_BIGENDIAN + unsigned int present : 1; + unsigned int zero1 : 4; + unsigned int s_audio : 3; +#else + unsigned int s_audio : 3; + unsigned int zero1 : 4; + unsigned int present : 1; +#endif + uint8_t zero2; +} ATTRIBUTE_PACKED audio_mapping_t; + +/** * Program Chain Information. */ typedef struct { @@ -402,8 +455,8 @@ uint8_t nr_of_cells; dvd_time_t playback_time; user_ops_t prohibited_ops; - uint16_t audio_control[8]; /* New type? */ - uint32_t subp_control[32]; /* New type? */ + audio_mapping_t audio_control[8]; + subp_mapping_t subp_control[32]; uint16_t next_pgc_nr; uint16_t prev_pgc_nr; uint16_t goup_pgc_nr; 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 +#include "nav_types.h" /** * 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 +#include "nav_types.h" /** * 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 -#include /* 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