shithub: libdvdcss

Download patch

ref: 3db91bb4dae32e2f639dcab6e9844482434ce520
parent: a68da5e6ae264f6f9d77bba4b08fae86473ddb4c
author: Sam Hocevar <sam@videolan.org>
date: Tue Mar 5 19:06:17 EST 2002

* Updated misc control files and added the sample program.


--- a/test/.cvsignore
+++ b/test/.cvsignore
@@ -3,3 +3,4 @@
 *.lo
 *.la
 stamp-h*
+test
--- /dev/null
+++ b/test/test.c
@@ -1,0 +1,88 @@
+/* csstest.c - test program for libdvdcss
+ * 
+ * Samuel Hocevar <sam@zoy.org> - June 2001
+ * Updated on Nov 13th 2001 for libdvdcss version 1.0.0
+ *
+ * This piece of code is public domain */
+
+#include <stdlib.h>
+
+#ifdef DVBPSI_DIST
+#include "../src/dvdcss.h"
+#else
+#include <videolan/dvdcss.h>
+#endif
+
+/* Macro to check if a sector is scrambled */
+#define IsSectorScrambled(buf) (((unsigned char*)(buf))[0x14] & 0x30)
+
+/* Print parts of a 2048 bytes buffer */
+void dumpsector( unsigned char *p_buffer )
+{
+    int i_amount = 10;
+    for( ; i_amount ; i_amount--, p_buffer++ ) printf( "%.2x", *p_buffer );
+    printf( " ... " );
+    i_amount = 25;
+    p_buffer += 200;
+    for( ; i_amount ; i_amount--, p_buffer++ ) printf( "%.2x", *p_buffer );
+    printf( " ...\n" );
+}
+
+int main( int i_argc, char *ppsz_argv[] )
+{
+    dvdcss_handle dvdcss;
+    unsigned char p_buffer[ DVDCSS_BLOCK_SIZE ];
+    unsigned int  i_sector;
+
+    /* Check for 2 arguments */
+    if( i_argc != 3 )
+    {
+        printf( "usage: %s <device> <sector>\n", ppsz_argv[0] );
+        return -1;
+    }
+
+    /* Save the requested sector */
+    i_sector = atoi( ppsz_argv[2] );
+
+    /* Initialize libdvdcss */
+    dvdcss = dvdcss_open( ppsz_argv[1] );
+    if( dvdcss == NULL )
+    {
+        printf( "argh ! couldn't open DVD (%s)\n", ppsz_argv[1] );
+        return -1;
+    }
+
+    /* Set the file descriptor at sector i_sector */
+    dvdcss_seek( dvdcss, i_sector, DVDCSS_NOFLAGS );
+
+    /* Read one sector */
+    dvdcss_read( dvdcss, p_buffer, 1, DVDCSS_NOFLAGS );
+
+    /* Print the sector */
+    printf( "requested sector:\n" );
+    dumpsector( p_buffer );
+
+    /* Check if sector was encrypted */
+    if( IsSectorScrambled( p_buffer ) )
+    {
+        /* Set the file descriptor position to the previous location */
+        dvdcss_seek( dvdcss, i_sector, DVDCSS_NOFLAGS );
+
+        /* Read sector again, and decrypt it on the fly */
+        dvdcss_read( dvdcss, p_buffer, 1, DVDCSS_READ_DECRYPT );
+
+        /* Print the decrypted sector */
+        printf( "unscrambled sector:\n" );
+        dumpsector( p_buffer );
+    }
+    else
+    {
+        printf( "sector is not scrambled\n" );
+    }
+
+    /* Close the device */
+    dvdcss_close( dvdcss );
+
+    return 0;
+}
+