[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xine-devel
Subject:    [xine-devel] [PATCH] play mounted non-UDF DVDs
From:       Bastien Nocera <hadess () hadess ! net>
Date:       2006-02-25 21:34:06
Message-ID: 1140903246.25107.9.camel () wyatt ! hadess ! net
[Download RAW message or body]

Heya,

I just burnt a video DVD as an ISO9660 filesystem on a DVD+R disc, and
couldn't play it back using xine-lib. The DVD is unencrypted, and played
back properly when on the hard-drive.

The attached patch makes libdvdnav use the file access instead of the
DVD device when the disc isn't encrypted, meaning that we don't need to
care about the filesystem type.

Michael, any comments on that?

Cheers

---
Bastien Nocera <hadess@hadess.net> 


["libdvdnav-play-non-udf-dvds.patch" (libdvdnav-play-non-udf-dvds.patch)]

Index: dvd_input.c
===================================================================
RCS file: /cvsroot/xine/xine-lib/src/input/libdvdnav/dvd_input.c,v
retrieving revision 1.6
diff -u -r1.6 dvd_input.c
--- dvd_input.c	5 Apr 2004 18:01:09 -0000	1.6
+++ dvd_input.c	25 Feb 2006 21:20:59 -0000
@@ -35,6 +35,7 @@
 int         (*dvdinput_title) (dvd_input_t, int); 
 int         (*dvdinput_read)  (dvd_input_t, void *, int, int);
 char *      (*dvdinput_error) (dvd_input_t);
+int         (*dvdinput_is_encrypted) (dvd_input_t);
 
 #ifdef HAVE_DVDCSS_DVDCSS_H
 /* linking to libdvdcss */
@@ -55,6 +56,73 @@
 #include "../../msvc/contrib/dlfcn.c"
 #endif
 
+/* Copied from css.h */
+#define KEY_SIZE 5
+
+typedef uint8_t dvd_key_t[KEY_SIZE];
+
+typedef struct dvd_title_s
+{
+    int                 i_startlb;
+    dvd_key_t           p_key;
+    struct dvd_title_s *p_next;
+} dvd_title_t;
+
+typedef struct css_s
+{
+    int             i_agid;      /* Current Authenication Grant ID. */
+    dvd_key_t       p_bus_key;   /* Current session key. */
+    dvd_key_t       p_disc_key;  /* This DVD disc's key. */
+    dvd_key_t       p_title_key; /* Current title key. */
+} css_t;
+
+/* Copied from libdvdcss.h */
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+struct dvdcss_s
+{
+    /* File descriptor */
+    char * psz_device;
+    int    i_fd;
+    int    i_read_fd;
+    int    i_pos;
+
+    /* File handling */
+    void *pf_seek;
+    void *pf_read;
+    void *pf_readv;
+
+    /* Decryption stuff */
+    int          i_method;
+    css_t        css;
+    int          b_ioctls;
+    int          b_scrambled;
+    dvd_title_t *p_titles;
+
+    /* Key cache directory and pointer to the filename */
+    char   psz_cachefile[PATH_MAX];
+    char * psz_block;
+
+    /* Error management */
+    char * psz_error;
+    int    b_errors;
+    int    b_debug;
+
+#ifdef WIN32
+    int    b_file;
+    char * p_readv_buffer;
+    int    i_readv_buf_size;
+#endif
+
+#ifndef WIN32
+    int    i_raw_fd;
+#endif
+};
+
+
 typedef struct dvdcss_s *dvdcss_handle;
 static dvdcss_handle (*DVDcss_open)  (const char *);
 static int           (*DVDcss_close) (dvdcss_handle);
@@ -149,8 +217,13 @@
   return 0;
 }
 
-
-
+static int css_is_encrypted (dvd_input_t dev)
+{
+  if (dev->dvdcss == NULL) {
+    return 0;
+  }
+  return dev->dvdcss->b_scrambled;
+}
 
 
 
@@ -269,6 +342,10 @@
   return 0;
 }
 
+static int file_is_encrypted (dvd_input_t dev)
+{
+  return 0;
+}
 
 /**
  * Setup read functions with either libdvdcss or minimal DVD access.
@@ -347,6 +424,7 @@
     dvdinput_title = css_title;
     dvdinput_read  = css_read;
     dvdinput_error = css_error;
+    dvdinput_is_encrypted = css_is_encrypted;
     return 1;
     
   } else {
@@ -359,6 +437,7 @@
     dvdinput_title = file_title;
     dvdinput_read  = file_read;
     dvdinput_error = file_error;
+    dvdinput_is_encrypted = file_is_encrypted;
     return 0;
   }
 }
Index: dvd_input.h
===================================================================
RCS file: /cvsroot/xine/xine-lib/src/input/libdvdnav/dvd_input.h,v
retrieving revision 1.1
diff -u -r1.1 dvd_input.h
--- dvd_input.h	29 Apr 2003 15:58:29 -0000	1.1
+++ dvd_input.h	25 Feb 2006 21:20:59 -0000
@@ -38,6 +38,7 @@
 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);
+extern int         (*dvdinput_is_encrypted) (dvd_input_t);
 
 /**
  * Setup function accessed by dvd_reader.c.  Returns 1 if there is CSS support.
Index: dvd_reader.c
===================================================================
RCS file: /cvsroot/xine/xine-lib/src/input/libdvdnav/dvd_reader.c,v
retrieving revision 1.11
diff -u -r1.11 dvd_reader.c
--- dvd_reader.c	20 Sep 2004 19:30:04 -0000	1.11
+++ dvd_reader.c	25 Feb 2006 21:21:00 -0000
@@ -480,6 +480,13 @@
 			     me->mnt_fsname,
 			     me->mnt_dir );
                     auth_drive = DVDOpenImageFile( me->mnt_fsname, have_css );
+		    /* If the device is not encrypted, don't access the device
+		     * directly as it would fail for non-UDF DVDs */
+		    if ( dvdinput_is_encrypted( auth_drive->dev ) == 0) {
+		      DVDClose( auth_drive );
+		      auth_drive = NULL;
+		      break;
+		    }
 		    dev_name = strdup(me->mnt_fsname);
                     break;
                 }

-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
xine-devel mailing list
xine-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xine-devel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic