Re: new dvd encryption - problem with stock libdvdread
Aurelien Jacobs <[email protected]> Tue, 30 Aug 2005 19:44:19 +0200
| Newsgroups | gmane.comp.video.ogle.devel |
|---|---|
| Message-ID | <[email protected]> |
On Tue, 30 Aug 2005 18:27:02 +0200 Bj|rn Englund <[email protected]> wrote: > Mon Aug 29 2005, Robos wrote: > > Hi, > > I'm the author of vobcopy which uses libdvdread (thanks folks, great > > library). Recently some people approached me with error messages > > where vobcopy wasn't able to copy a dvd where mplayer or xine could > > play it. I had to tell them that I use libdvdread and that most > > probably mplayer and/or xine use their own modified version. Is that > > so and couldn't you sync their changes back to libdvdread? Cheers > > Robos > > I don't know if/how much mplayer/xine has modified libdvdread. > I don't have time to check which other projects use their own modified > versions of libdvdread, but if you diff the modified versions against > the libdvdread cvs and try to find out what makes the modified version > work and not normal one, I will add patches to cvs. Here is the current diff of the mplayer modified libdvdread. It contains essentially some portability changes, but maybe it can help you to get vobcopy working... Aurel
libdvdread_changes.diff
(text/plain, 10 KB)
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 <config.h>
-
#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 <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)
+{
+ __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 <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 -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 <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;
@@ -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 <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>
+#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"
#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.
@@ -282,7 +305,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" */
@@ -303,6 +326,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 +343,7 @@
perror("");
return 0;
}
+ }
/* Try to open libdvdcss or fall back to standard functions */
have_css = dvdinput_setup();
@@ -335,7 +369,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 +384,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 +442,7 @@
}
fclose( mntfile );
}
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__CYGWIN__)
mntfile = fopen( MOUNTED, "r" );
if( mntfile ) {
struct mntent *me;
@@ -425,6 +461,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 +654,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 +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 )
{
/* 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>
+#ifndef __MINGW32__
#include <sys/ioctl.h>
+#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
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
*/
-#include <dvdread/ifo_types.h>
-#include <dvdread/dvd_reader.h>
+#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 <inttypes.h>
-#include <dvdread/dvd_reader.h>
+#include "dvd_reader.h"
#undef ATTRIBUTE_PACKED
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"
/**
* 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"
/**
* 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 */
#undef ATTRIBUTE_PACKED