summaryrefslogtreecommitdiff
path: root/src/input/libdvdnav/dvd_input.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/libdvdnav/dvd_input.c')
-rw-r--r--src/input/libdvdnav/dvd_input.c83
1 files changed, 81 insertions, 2 deletions
diff --git a/src/input/libdvdnav/dvd_input.c b/src/input/libdvdnav/dvd_input.c
index 1e7775c73..6e8dbd8d0 100644
--- a/src/input/libdvdnav/dvd_input.c
+++ b/src/input/libdvdnav/dvd_input.c
@@ -35,6 +35,7 @@ int (*dvdinput_seek) (dvd_input_t, int);
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 @@ char * (*dvdinput_error) (dvd_input_t);
#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 @@ static int css_close(dvd_input_t dev)
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 @@ static int file_close(dvd_input_t dev)
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 @@ int dvdinput_setup(void)
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 @@ int dvdinput_setup(void)
dvdinput_title = file_title;
dvdinput_read = file_read;
dvdinput_error = file_error;
+ dvdinput_is_encrypted = file_is_encrypted;
return 0;
}
}