summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlgb <lgb@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-04-20 14:32:09 +0000
committerlgb <lgb@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-04-20 14:32:09 +0000
commitcd663cd2f2ce800ad12918a33f030b85574bdfb8 (patch)
tree54f27a591b6678f7b2ab35df97b3900e41db58a5
parentea0d313e21bd1e711db76c47f830996f6d8e36ae (diff)
downloadmpv-cd663cd2f2ce800ad12918a33f030b85574bdfb8.tar.bz2
mpv-cd663cd2f2ce800ad12918a33f030b85574bdfb8.tar.xz
command line requested DVD key support for Arpi :)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@547 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--cfg-mplayer.h1
-rw-r--r--demux_mpg.c5
-rw-r--r--dvdauth.c28
-rw-r--r--dvdauth.h4
-rw-r--r--mplayer.c7
5 files changed, 43 insertions, 2 deletions
diff --git a/cfg-mplayer.h b/cfg-mplayer.h
index c52bd9772d..2f6fccd2a1 100644
--- a/cfg-mplayer.h
+++ b/cfg-mplayer.h
@@ -25,6 +25,7 @@ struct config conf[]={
{"master", &mixer_usemaster, CONF_TYPE_FLAG, 0, 0, 1},
#ifdef HAVE_LIBCSS
{"dvd", &dvd_device, CONF_TYPE_STRING, 0, 0, 0},
+ {"dvdkey", &dvdimportkey, CONF_TYPE_STRING, 0, 0, 0},
#else
{"dvd", "DVD support was not compiled in. See file DOCS/DVD.\n",
CONF_TYPE_PRINT, CONF_NOCFG, 0 , 0},
diff --git a/demux_mpg.c b/demux_mpg.c
index 7c0018c848..c3745539dc 100644
--- a/demux_mpg.c
+++ b/demux_mpg.c
@@ -180,7 +180,10 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
if(verbose>=2) printf("DEMUX_MPG: Read %d data bytes from packet %04X\n",len,id);
// printf("packet start = 0x%X \n",stream_tell(demux->stream)-packet_start_pos);
#ifdef HAVE_LIBCSS
- if (css) CSSDescramble(demux->stream->buffer,key_title);
+ if (css) {
+ if (descrambling) CSSDescramble(demux->stream->buffer,key_title); else
+ printf("Encrypted stream but authentication was not requested by you!!\n");
+ }
#endif
ds_read_packet(ds,demux->stream,len,pts/90000.0f,0);
return 1;
diff --git a/dvdauth.c b/dvdauth.c
index da6832c58a..cd3dcb94aa 100644
--- a/dvdauth.c
+++ b/dvdauth.c
@@ -23,6 +23,8 @@
char *dvd_device=NULL;
unsigned char key_disc[2048];
unsigned char key_title[5];
+unsigned char *dvdimportkey=NULL;
+int descrambling=0;
#include <linux/fs.h>
@@ -59,6 +61,30 @@ static void reset_agids ( int fd )
}
+int dvd_import_key ( unsigned char *hexkey )
+{
+ unsigned char *t=key_title;
+ int digit=4,len;
+ bzero(key_title,sizeof(key_title));
+// printf("DVD key: %s\n",hexkey);
+ for (len=0;len<10;len++) {
+// printf("-> %c\n",*hexkey);
+ if (!*hexkey) return 1;
+ if (*hexkey>='A'&&*hexkey<='F') *t|=(*hexkey-'A'+10)<<digit;
+ else if (*hexkey>='0'&&*hexkey<='9') *t|=(*hexkey-'0')<<digit;
+ else return 1;
+ if (digit) digit=0; else {
+ digit=4;
+ t++;
+ }
+ hexkey++;
+ }
+ if (*hexkey) return 1;
+ printf("DVD key (requested): %02X%02X%02X%02X%02X\n",key_title[0],key_title[1],key_title[2],key_title[3],key_title[4]);
+ descrambling=1;
+ return 0;
+}
+
int dvd_auth ( char *dev , int fd )
{
@@ -99,6 +125,8 @@ int dvd_auth ( char *dev , int fd )
}
close(devfd);
+ printf("DVD title key is: %02X%02X%02X%02X%02X\n",key_title[0],key_title[1],key_title[2],key_title[3],key_title[4]);
+ descrambling=1;
return 0;
}
diff --git a/dvdauth.h b/dvdauth.h
index b719bf0caa..763e79d40f 100644
--- a/dvdauth.h
+++ b/dvdauth.h
@@ -6,9 +6,11 @@
extern char *dvd_device;
extern unsigned char key_disc[];
extern unsigned char key_title[];
+extern unsigned char *dvdimportkey;
+extern int descrambling;
int dvd_auth ( char *, int );
-
+int dvd_import_key ( unsigned char * );
#endif
#endif \ No newline at end of file
diff --git a/mplayer.c b/mplayer.c
index e26ba22e60..746cdcbf9b 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -613,6 +613,13 @@ if(vcd_track){
f=open(filename,O_RDONLY);
if(f<0){ printf("File not found: '%s'\n",filename);return 1; }
#ifdef HAVE_LIBCSS
+ if (dvdimportkey) {
+ if (dvd_import_key(dvdimportkey)) {
+ fprintf(stderr,"Error processing DVD KEY.\n");
+ exit(1);
+ }
+ printf("DVD command line requested key is stored for descrambling.\n");
+ }
if (dvd_device) {
if (dvd_auth(dvd_device,f)) exit(0);
printf("DVD auth sequence seems to be OK.\n");