annotate libdvdcss/libdvdcss.c @ 27409:e2de11109139

If (has outline) blur(outline) else blur(glyph). If there is an outline, the glyph itself should not be blurred. Keeps the border between glyph and outline clear (unblurred), which is probably how it should be. Patch by Diogo Franco (diogomfranco gmail com).
author eugeni
date Thu, 07 Aug 2008 22:20:58 +0000
parents f0788169e503
children afa2cc0166be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20613
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
1 /* libdvdcss.c: DVD reading library.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
2 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
3 * Authors: Stéphane Borel <stef@via.ecp.fr>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
4 * Samuel Hocevar <sam@zoy.org>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
5 * Håkan Hjort <d95hjort@dtek.chalmers.se>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
6 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
7 * Copyright (C) 1998-2002 VideoLAN
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
8 * $Id$
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
9 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
10 * This program is free software; you can redistribute it and/or modify
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
11 * it under the terms of the GNU General Public License as published by
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
12 * the Free Software Foundation; either version 2 of the License, or
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
13 * (at your option) any later version.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
14 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
18 * GNU General Public License for more details.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
19 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
21 * along with this program; if not, write to the Free Software
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
23 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
24
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
25 /**
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
26 * \mainpage libdvdcss developer documentation
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
27 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
28 * \section intro Introduction
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
29 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
30 * \e libdvdcss is a simple library designed for accessing DVDs like a block
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
31 * device without having to bother about the decryption. The important features
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
32 * are:
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
33 * \li portability: currently supported platforms are GNU/Linux, FreeBSD,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
34 * NetBSD, OpenBSD, BSD/OS, BeOS, Windows 95/98, Windows NT/2000, MacOS X,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
35 * Solaris, HP-UX and OS/2.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
36 * \li adaptability: unlike most similar projects, libdvdcss doesn't require
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
37 * the region of your drive to be set and will try its best to read from
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
38 * the disc even in the case of a region mismatch.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
39 * \li simplicity: a DVD player can be built around the \e libdvdcss API using
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
40 * no more than 4 or 5 library calls.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
41 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
42 * \e libdvdcss is free software, released under the General Public License.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
43 * This ensures that \e libdvdcss remains free and used only with free
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
44 * software.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
45 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
46 * \section api The libdvdcss API
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
47 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
48 * The complete \e libdvdcss programming interface is documented in the
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
49 * dvdcss.h file.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
50 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
51 * \section env Environment variables
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
52 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
53 * Some environment variables can be used to change the behaviour of
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
54 * \e libdvdcss without having to modify the program which uses it. These
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
55 * variables are:
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
56 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
57 * \li \b DVDCSS_VERBOSE: sets the verbosity level.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
58 * - \c 0 outputs no messages at all.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
59 * - \c 1 outputs error messages to stderr.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
60 * - \c 2 outputs error messages and debug messages to stderr.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
61 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
62 * \li \b DVDCSS_METHOD: sets the authentication and decryption method
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
63 * that \e libdvdcss will use to read scrambled discs. Can be one
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
64 * of \c title, \c key or \c disc.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
65 * - \c key is the default method. \e libdvdcss will use a set of
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
66 * calculated player keys to try and get the disc key. This can fail
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
67 * if the drive does not recognize any of the player keys.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
68 * - \c disc is a fallback method when \c key has failed. Instead of
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
69 * using player keys, \e libdvdcss will crack the disc key using
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
70 * a brute force algorithm. This process is CPU intensive and requires
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
71 * 64 MB of memory to store temporary data.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
72 * - \c title is the fallback when all other methods have failed. It does
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
73 * not rely on a key exchange with the DVD drive, but rather uses a
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
74 * crypto attack to guess the title key. On rare cases this may fail
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
75 * because there is not enough encrypted data on the disc to perform
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
76 * a statistical attack, but in the other hand it is the only way to
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
77 * decrypt a DVD stored on a hard disc, or a DVD with the wrong region
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
78 * on an RPC2 drive.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
79 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
80 * \li \b DVDCSS_RAW_DEVICE: specify the raw device to use. Exact usage will
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
81 * depend on your operating system, the Linux utility to set up raw devices
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
82 * is \c raw(8) for instance. Please note that on most operating systems,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
83 * using a raw device requires highly aligned buffers: Linux requires a
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
84 * 2048 bytes alignment (which is the size of a DVD sector).
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
85 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
86 * \li \b DVDCSS_CACHE: specify a directory in which to store title key
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
87 * values. This will speed up descrambling of DVDs which are in the
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
88 * cache. The DVDCSS_CACHE directory is created if it does not exist,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
89 * and a subdirectory is created named after the DVD's title or
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
90 * manufacturing date. If DVDCSS_CACHE is not set or is empty, \e libdvdcss
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
91 * will use the default value which is "${HOME}/.dvdcss/" under Unix and
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
92 * "C:\Documents and Settings\$USER\Application Data\dvdcss\" under Win32.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
93 * The special value "off" disables caching.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
94 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
95
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
96 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
97 * Preamble
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
98 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
99 #include "config.h"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
100
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
101 #include <stdio.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
102 #include <stdlib.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
103 #include <string.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
104 #include <sys/types.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
105 #include <sys/stat.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
106 #ifdef HAVE_SYS_PARAM_H
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
107 # include <sys/param.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
108 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
109 #ifdef HAVE_PWD_H
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
110 # include <pwd.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
111 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
112 #include <fcntl.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
113 #include <errno.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
114
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
115 #ifdef HAVE_UNISTD_H
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
116 # include <unistd.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
117 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
118
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
119 #ifdef HAVE_LIMITS_H
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
120 # include <limits.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
121 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
122
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
123 #ifdef HAVE_DIRECT_H
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
124 # include <direct.h>
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
125 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
126
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
127 #include "dvdcss/dvdcss.h"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
128
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
129 #include "common.h"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
130 #include "css.h"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
131 #include "libdvdcss.h"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
132 #include "ioctl.h"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
133 #include "device.h"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
134
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
135 /**
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
136 * \brief Symbol for version checks.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
137 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
138 * The name of this symbol contains the library major number, which makes it
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
139 * easy to check which \e libdvdcss development headers are installed on the
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
140 * system with tools such as autoconf.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
141 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
142 * The variable itself contains the exact version number of the library,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
143 * which can be useful for specific feature needs.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
144 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
145 char * dvdcss_interface_2 = VERSION;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
146
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
147 /**
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
148 * \brief Open a DVD device or directory and return a dvdcss instance.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
149 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
150 * \param psz_target a string containing the target name, for instance
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
151 * "/dev/hdc" or "E:".
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
152 * \return a handle to a dvdcss instance or NULL on error.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
153 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
154 * Initialize the \e libdvdcss library and open the requested DVD device or
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
155 * directory. \e libdvdcss checks whether ioctls can be performed on the disc,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
156 * and when possible, the disc key is retrieved.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
157 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
158 * dvdcss_open() returns a handle to be used for all subsequent \e libdvdcss
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
159 * calls. If an error occurred, NULL is returned.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
160 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
161 LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( char *psz_target )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
162 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
163 char psz_buffer[PATH_MAX];
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
164 int i_ret;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
165
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
166 char *psz_method = getenv( "DVDCSS_METHOD" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
167 char *psz_verbose = getenv( "DVDCSS_VERBOSE" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
168 char *psz_cache = getenv( "DVDCSS_CACHE" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
169 #ifndef WIN32
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
170 char *psz_raw_device = getenv( "DVDCSS_RAW_DEVICE" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
171 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
172
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
173 dvdcss_t dvdcss;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
174
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
175 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
176 * Allocate the library structure
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
177 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
178 dvdcss = malloc( sizeof( struct dvdcss_s ) );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
179 if( dvdcss == NULL )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
180 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
181 return NULL;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
182 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
183
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
184 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
185 * Initialize structure with default values
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
186 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
187 #ifndef WIN32
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
188 dvdcss->i_raw_fd = -1;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
189 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
190 dvdcss->p_titles = NULL;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
191 dvdcss->psz_device = (char *)strdup( psz_target );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
192 dvdcss->psz_error = "no error";
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
193 dvdcss->i_method = DVDCSS_METHOD_KEY;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
194 dvdcss->psz_cachefile[0] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
195 dvdcss->b_debug = 0;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
196 dvdcss->b_errors = 0;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
197
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
198 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
199 * Find verbosity from DVDCSS_VERBOSE environment variable
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
200 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
201 if( psz_verbose != NULL )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
202 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
203 int i = atoi( psz_verbose );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
204
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
205 if( i >= 2 ) dvdcss->b_debug = i;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
206 if( i >= 1 ) dvdcss->b_errors = 1;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
207 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
208
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
209 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
210 * Find method from DVDCSS_METHOD environment variable
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
211 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
212 if( psz_method != NULL )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
213 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
214 if( !strncmp( psz_method, "key", 4 ) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
215 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
216 dvdcss->i_method = DVDCSS_METHOD_KEY;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
217 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
218 else if( !strncmp( psz_method, "disc", 5 ) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
219 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
220 dvdcss->i_method = DVDCSS_METHOD_DISC;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
221 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
222 else if( !strncmp( psz_method, "title", 5 ) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
223 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
224 dvdcss->i_method = DVDCSS_METHOD_TITLE;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
225 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
226 else
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
227 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
228 print_error( dvdcss, "unknown decrypt method, please choose "
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
229 "from 'title', 'key' or 'disc'" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
230 free( dvdcss->psz_device );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
231 free( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
232 return NULL;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
233 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
234 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
235
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
236 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
237 * If DVDCSS_CACHE was not set, try to guess a default value
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
238 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
239 if( psz_cache == NULL || psz_cache[0] == '\0' )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
240 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
241 #ifdef HAVE_DIRECT_H
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
242 typedef HRESULT( WINAPI *SHGETFOLDERPATH )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
243 ( HWND, int, HANDLE, DWORD, LPTSTR );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
244
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
245 # define CSIDL_FLAG_CREATE 0x8000
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
246 # define CSIDL_APPDATA 0x1A
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
247 # define SHGFP_TYPE_CURRENT 0
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
248
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
249 char psz_home[MAX_PATH];
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
250 HINSTANCE p_dll;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
251 SHGETFOLDERPATH p_getpath;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
252
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
253 *psz_home = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
254
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
255 /* Load the shfolder dll to retrieve SHGetFolderPath */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
256 p_dll = LoadLibrary( "shfolder.dll" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
257 if( p_dll )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
258 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
259 p_getpath = (void*)GetProcAddress( p_dll, "SHGetFolderPathA" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
260 if( p_getpath )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
261 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
262 /* Get the "Application Data" folder for the current user */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
263 if( p_getpath( NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
264 NULL, SHGFP_TYPE_CURRENT, psz_home ) == S_OK )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
265 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
266 FreeLibrary( p_dll );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
267 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
268 else
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
269 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
270 *psz_home = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
271 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
272 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
273 FreeLibrary( p_dll );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
274 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
275
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
276 /* Cache our keys in
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
277 * C:\Documents and Settings\$USER\Application Data\dvdcss\ */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
278 if( *psz_home )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
279 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
280 snprintf( psz_buffer, PATH_MAX, "%s/dvdcss", psz_home );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
281 psz_buffer[PATH_MAX-1] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
282 psz_cache = psz_buffer;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
283 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
284 #else
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
285 char *psz_home = NULL;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
286 # ifdef HAVE_PWD_H
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
287 struct passwd *p_pwd;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
288
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
289 /* Try looking in password file for home dir. */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
290 p_pwd = getpwuid(getuid());
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
291 if( p_pwd )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
292 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
293 psz_home = p_pwd->pw_dir;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
294 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
295 # endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
296
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
297 if( psz_home == NULL )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
298 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
299 psz_home = getenv( "HOME" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
300 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
301 if( psz_home == NULL )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
302 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
303 psz_home = getenv( "USERPROFILE" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
304 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
305
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
306 /* Cache our keys in ${HOME}/.dvdcss/ */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
307 if( psz_home )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
308 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
309 snprintf( psz_buffer, PATH_MAX, "%s/.dvdcss", psz_home );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
310 psz_buffer[PATH_MAX-1] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
311 psz_cache = psz_buffer;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
312 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
313 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
314 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
315
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
316 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
317 * Find cache dir from the DVDCSS_CACHE environment variable
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
318 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
319 if( psz_cache != NULL )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
320 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
321 if( psz_cache[0] == '\0' || !strcmp( psz_cache, "off" ) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
322 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
323 psz_cache = NULL;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
324 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
325 /* Check that we can add the ID directory and the block filename */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
326 else if( strlen( psz_cache ) + 1 + 32 + 1 + (KEY_SIZE * 2) + 10 + 1
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
327 > PATH_MAX )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
328 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
329 print_error( dvdcss, "cache directory name is too long" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
330 psz_cache = NULL;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
331 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
332 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
333
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
334 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
335 * Open device
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
336 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
337 _dvdcss_check( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
338 i_ret = _dvdcss_open( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
339 if( i_ret < 0 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
340 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
341 free( dvdcss->psz_device );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
342 free( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
343 return NULL;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
344 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
345
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
346 dvdcss->b_scrambled = 1; /* Assume the worst */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
347 dvdcss->b_ioctls = _dvdcss_use_ioctls( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
348
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
349 if( dvdcss->b_ioctls )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
350 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
351 i_ret = _dvdcss_test( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
352 if( i_ret < 0 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
353 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
354 /* Disable the CSS ioctls and hope that it works? */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
355 print_debug( dvdcss,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
356 "could not check whether the disc was scrambled" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
357 dvdcss->b_ioctls = 0;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
358 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
359 else
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
360 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
361 print_debug( dvdcss, i_ret ? "disc is scrambled"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
362 : "disc is unscrambled" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
363 dvdcss->b_scrambled = i_ret;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
364 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
365 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
366
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
367 /* If disc is CSS protected and the ioctls work, authenticate the drive */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
368 if( dvdcss->b_scrambled && dvdcss->b_ioctls )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
369 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
370 i_ret = _dvdcss_disckey( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
371
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
372 if( i_ret < 0 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
373 {
26234
f0788169e503 Ignore if we fail to get disc key, fixes playback of one of my DVDs which
reimar
parents: 24534
diff changeset
374 print_debug( dvdcss,
f0788169e503 Ignore if we fail to get disc key, fixes playback of one of my DVDs which
reimar
parents: 24534
diff changeset
375 "could not get disc key" );
20613
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
376 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
377 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
378
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
379 /* If the cache is enabled, write the cache directory tag */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
380 if( psz_cache )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
381 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
382 char *psz_tag = "Signature: 8a477f597d28d172789f06886806bc55\r\n"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
383 "# This file is a cache directory tag created by libdvdcss.\r\n"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
384 "# For information about cache directory tags, see:\r\n"
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
385 "# http://www.brynosaurus.com/cachedir/\r\n";
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
386 char psz_tagfile[PATH_MAX + 1 + 12 + 1];
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
387 int i_fd;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
388
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
389 sprintf( psz_tagfile, "%s/CACHEDIR.TAG", psz_cache );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
390 i_fd = open( psz_tagfile, O_RDWR|O_CREAT, 0644 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
391 if( i_fd >= 0 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
392 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
393 write( i_fd, psz_tag, strlen(psz_tag) );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
394 close( i_fd );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
395 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
396 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
397
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
398 /* If the cache is enabled, extract a unique disc ID */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
399 if( psz_cache )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
400 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
401 uint8_t p_sector[DVDCSS_BLOCK_SIZE];
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
402 char psz_debug[PATH_MAX + 30];
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
403 char psz_key[1 + KEY_SIZE * 2 + 1];
23708
1fb5f0b13a1a Fix crash on some DVDs
iive
parents: 23707
diff changeset
404 char *psz_title;
1fb5f0b13a1a Fix crash on some DVDs
iive
parents: 23707
diff changeset
405 uint8_t *psz_serial;
20613
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
406 int i;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
407
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
408 /* We read sector 0. If it starts with 0x000001ba (BE), we are
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
409 * reading a VOB file, and we should not cache anything. */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
410
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
411 i_ret = dvdcss->pf_seek( dvdcss, 0 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
412 if( i_ret != 0 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
413 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
414 goto nocache;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
415 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
416
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
417 i_ret = dvdcss->pf_read( dvdcss, p_sector, 1 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
418 if( i_ret != 1 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
419 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
420 goto nocache;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
421 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
422
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
423 if( p_sector[0] == 0x00 && p_sector[1] == 0x00
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
424 && p_sector[2] == 0x01 && p_sector[3] == 0xba )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
425 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
426 goto nocache;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
427 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
428
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
429 /* The data we are looking for is at sector 16 (32768 bytes):
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
430 * - offset 40: disc title (32 uppercase chars)
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
431 * - offset 813: manufacturing date + serial no (16 digits) */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
432
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
433 i_ret = dvdcss->pf_seek( dvdcss, 16 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
434 if( i_ret != 16 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
435 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
436 goto nocache;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
437 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
438
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
439 i_ret = dvdcss->pf_read( dvdcss, p_sector, 1 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
440 if( i_ret != 1 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
441 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
442 goto nocache;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
443 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
444
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
445 /* Get the disc title */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
446 psz_title = (char *)p_sector + 40;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
447 psz_title[32] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
448
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
449 for( i = 0 ; i < 32 ; i++ )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
450 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
451 if( psz_title[i] <= ' ' )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
452 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
453 psz_title[i] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
454 break;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
455 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
456 else if( psz_title[i] == '/' || psz_title[i] == '\\' )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
457 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
458 psz_title[i] = '-';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
459 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
460 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
461
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
462 /* Get the date + serial */
23708
1fb5f0b13a1a Fix crash on some DVDs
iive
parents: 23707
diff changeset
463 psz_serial = p_sector + 813;
20613
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
464 psz_serial[16] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
465
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
466 /* Check that all characters are digits, otherwise convert. */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
467 for( i = 0 ; i < 16 ; i++ )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
468 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
469 if( psz_serial[i] < '0' || psz_serial[i] > '9' )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
470 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
471 char psz_tmp[16 + 1];
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
472 sprintf( psz_tmp,
23707
552963611d77 Fix CSS format strings, they could print more than two digits for
reimar
parents: 20613
diff changeset
473 "%.2"PRIx8"%.2"PRIx8"%.2"PRIx8"%.2"PRIx8"%.2"PRIx8"%.2"PRIx8"%.2"PRIx8"%.2"PRIx8"",
20613
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
474 psz_serial[0], psz_serial[1], psz_serial[2],
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
475 psz_serial[3], psz_serial[4], psz_serial[5],
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
476 psz_serial[6], psz_serial[7] );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
477 memcpy( psz_serial, psz_tmp, 16 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
478 break;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
479 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
480 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
481
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
482 /* Get disk key, since some discs have got same title, manufacturing
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
483 * date and serial number, but different keys */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
484 if( dvdcss->b_scrambled )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
485 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
486 psz_key[0] = '-';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
487 for( i = 0; i < KEY_SIZE; i++ )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
488 {
23707
552963611d77 Fix CSS format strings, they could print more than two digits for
reimar
parents: 20613
diff changeset
489 sprintf( &psz_key[1+i*2], "%.2"PRIx8, dvdcss->css.p_disc_key[i] );
20613
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
490 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
491 psz_key[1 + KEY_SIZE * 2] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
492 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
493 else
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
494 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
495 psz_key[0] = 0;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
496 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
497
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
498 /* We have a disc name or ID, we can create the cache dir */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
499 i = sprintf( dvdcss->psz_cachefile, "%s", psz_cache );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
500 #if !defined( WIN32 ) || defined( SYS_CYGWIN )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
501 i_ret = mkdir( dvdcss->psz_cachefile, 0755 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
502 #else
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
503 i_ret = mkdir( dvdcss->psz_cachefile );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
504 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
505 if( i_ret < 0 && errno != EEXIST )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
506 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
507 print_error( dvdcss, "failed creating cache directory" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
508 dvdcss->psz_cachefile[0] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
509 goto nocache;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
510 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
511
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
512 i += sprintf( dvdcss->psz_cachefile + i, "/%s-%s%s", psz_title,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
513 psz_serial, psz_key );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
514 #if !defined( WIN32 ) || defined( SYS_CYGWIN )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
515 i_ret = mkdir( dvdcss->psz_cachefile, 0755 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
516 #else
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
517 i_ret = mkdir( dvdcss->psz_cachefile );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
518 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
519 if( i_ret < 0 && errno != EEXIST )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
520 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
521 print_error( dvdcss, "failed creating cache subdirectory" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
522 dvdcss->psz_cachefile[0] = '\0';
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
523 goto nocache;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
524 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
525 i += sprintf( dvdcss->psz_cachefile + i, "/");
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
526
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
527 /* Pointer to the filename we will use. */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
528 dvdcss->psz_block = dvdcss->psz_cachefile + i;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
529
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
530 sprintf( psz_debug, "using CSS key cache dir: %s",
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
531 dvdcss->psz_cachefile );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
532 print_debug( dvdcss, psz_debug );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
533 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
534 nocache:
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
535
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
536 #ifndef WIN32
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
537 if( psz_raw_device != NULL )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
538 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
539 _dvdcss_raw_open( dvdcss, psz_raw_device );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
540 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
541 #endif
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
542
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
543 /* Seek at the beginning, just for safety. */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
544 dvdcss->pf_seek( dvdcss, 0 );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
545
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
546 return dvdcss;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
547 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
548
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
549 /**
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
550 * \brief Return a string containing the latest error that occurred in the
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
551 * given \e libdvdcss instance.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
552 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
553 * \param dvdcss a \e libdvdcss instance.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
554 * \return a null-terminated string containing the latest error message.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
555 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
556 * This function returns a constant string containing the latest error that
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
557 * occurred in \e libdvdcss. It can be used to format error messages at your
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
558 * convenience in your application.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
559 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
560 LIBDVDCSS_EXPORT char * dvdcss_error ( dvdcss_t dvdcss )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
561 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
562 return dvdcss->psz_error;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
563 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
564
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
565 /**
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
566 * \brief Seek in the disc and change the current key if requested.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
567 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
568 * \param dvdcss a \e libdvdcss instance.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
569 * \param i_blocks an absolute block offset to seek to.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
570 * \param i_flags #DVDCSS_NOFLAGS, optionally ored with one of #DVDCSS_SEEK_KEY
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
571 * or #DVDCSS_SEEK_MPEG.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
572 * \return the new position in blocks, or a negative value in case an error
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
573 * happened.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
574 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
575 * This function seeks to the requested position, in logical blocks.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
576 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
577 * You typically set \p i_flags to #DVDCSS_NOFLAGS when seeking in a .IFO.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
578 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
579 * If #DVDCSS_SEEK_MPEG is specified in \p i_flags and if \e libdvdcss finds it
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
580 * reasonable to do so (ie, if the dvdcss method is not "title"), the current
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
581 * title key will be checked and a new one will be calculated if necessary.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
582 * This flag is typically used when reading data from a VOB.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
583 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
584 * If #DVDCSS_SEEK_KEY is specified, the title key will be always checked,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
585 * even with the "title" method. This is equivalent to using the now
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
586 * deprecated dvdcss_title() call. This flag is typically used when seeking
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
587 * in a new title.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
588 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
589 LIBDVDCSS_EXPORT int dvdcss_seek ( dvdcss_t dvdcss, int i_blocks, int i_flags )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
590 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
591 /* title cracking method is too slow to be used at each seek */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
592 if( ( ( i_flags & DVDCSS_SEEK_MPEG )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
593 && ( dvdcss->i_method != DVDCSS_METHOD_TITLE ) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
594 || ( i_flags & DVDCSS_SEEK_KEY ) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
595 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
596 /* check the title key */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
597 if( _dvdcss_title( dvdcss, i_blocks ) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
598 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
599 return -1;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
600 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
601 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
602
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
603 return dvdcss->pf_seek( dvdcss, i_blocks );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
604 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
605
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
606 /**
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
607 * \brief Read from the disc and decrypt data if requested.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
608 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
609 * \param dvdcss a \e libdvdcss instance.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
610 * \param p_buffer a buffer that will contain the data read from the disc.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
611 * \param i_blocks the amount of blocks to read.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
612 * \param i_flags #DVDCSS_NOFLAGS, optionally ored with #DVDCSS_READ_DECRYPT.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
613 * \return the amount of blocks read, or a negative value in case an
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
614 * error happened.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
615 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
616 * This function reads \p i_blocks logical blocks from the DVD.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
617 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
618 * You typically set \p i_flags to #DVDCSS_NOFLAGS when reading data from a
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
619 * .IFO file on the DVD.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
620 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
621 * If #DVDCSS_READ_DECRYPT is specified in \p i_flags, dvdcss_read() will
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
622 * automatically decrypt scrambled sectors. This flag is typically used when
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
623 * reading data from a .VOB file on the DVD. It has no effect on unscrambled
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
624 * discs or unscrambled sectors, and can be safely used on those.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
625 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
626 * \warning dvdcss_read() expects to be able to write \p i_blocks *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
627 * #DVDCSS_BLOCK_SIZE bytes in \p p_buffer.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
628 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
629 LIBDVDCSS_EXPORT int dvdcss_read ( dvdcss_t dvdcss, void *p_buffer,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
630 int i_blocks,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
631 int i_flags )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
632 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
633 int i_ret, i_index;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
634
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
635 i_ret = dvdcss->pf_read( dvdcss, p_buffer, i_blocks );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
636
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
637 if( i_ret <= 0
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
638 || !dvdcss->b_scrambled
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
639 || !(i_flags & DVDCSS_READ_DECRYPT) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
640 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
641 return i_ret;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
642 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
643
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
644 if( ! memcmp( dvdcss->css.p_title_key, "\0\0\0\0\0", 5 ) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
645 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
646 /* For what we believe is an unencrypted title,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
647 * check that there are no encrypted blocks */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
648 for( i_index = i_ret; i_index; i_index-- )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
649 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
650 if( ((uint8_t*)p_buffer)[0x14] & 0x30 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
651 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
652 print_error( dvdcss, "no key but found encrypted block" );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
653 /* Only return the initial range of unscrambled blocks? */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
654 /* or fail completely? return 0; */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
655 break;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
656 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
657 p_buffer = (void *) ((uint8_t *)p_buffer + DVDCSS_BLOCK_SIZE);
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
658 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
659 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
660 else
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
661 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
662 /* Decrypt the blocks we managed to read */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
663 for( i_index = i_ret; i_index; i_index-- )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
664 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
665 _dvdcss_unscramble( dvdcss->css.p_title_key, p_buffer );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
666 ((uint8_t*)p_buffer)[0x14] &= 0x8f;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
667 p_buffer = (void *) ((uint8_t *)p_buffer + DVDCSS_BLOCK_SIZE);
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
668 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
669 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
670
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
671 return i_ret;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
672 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
673
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
674 /**
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
675 * \brief Read from the disc into multiple buffers and decrypt data if
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
676 * requested.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
677 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
678 * \param dvdcss a \e libdvdcss instance.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
679 * \param p_iovec a pointer to an array of iovec structures that will contain
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
680 * the data read from the disc.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
681 * \param i_blocks the amount of blocks to read.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
682 * \param i_flags #DVDCSS_NOFLAGS, optionally ored with #DVDCSS_READ_DECRYPT.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
683 * \return the amount of blocks read, or a negative value in case an
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
684 * error happened.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
685 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
686 * This function reads \p i_blocks logical blocks from the DVD and writes them
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
687 * to an array of iovec structures.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
688 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
689 * You typically set \p i_flags to #DVDCSS_NOFLAGS when reading data from a
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
690 * .IFO file on the DVD.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
691 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
692 * If #DVDCSS_READ_DECRYPT is specified in \p i_flags, dvdcss_readv() will
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
693 * automatically decrypt scrambled sectors. This flag is typically used when
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
694 * reading data from a .VOB file on the DVD. It has no effect on unscrambled
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
695 * discs or unscrambled sectors, and can be safely used on those.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
696 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
697 * \warning dvdcss_readv() expects to be able to write \p i_blocks *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
698 * #DVDCSS_BLOCK_SIZE bytes in the buffers pointed by \p p_iovec.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
699 * Moreover, all iov_len members of the iovec structures should be
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
700 * multiples of #DVDCSS_BLOCK_SIZE.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
701 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
702 LIBDVDCSS_EXPORT int dvdcss_readv ( dvdcss_t dvdcss, void *p_iovec,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
703 int i_blocks,
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
704 int i_flags )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
705 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
706 struct iovec *_p_iovec = (struct iovec *)p_iovec;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
707 int i_ret, i_index;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
708 void *iov_base;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
709 size_t iov_len;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
710
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
711 i_ret = dvdcss->pf_readv( dvdcss, _p_iovec, i_blocks );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
712
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
713 if( i_ret <= 0
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
714 || !dvdcss->b_scrambled
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
715 || !(i_flags & DVDCSS_READ_DECRYPT) )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
716 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
717 return i_ret;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
718 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
719
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
720 /* Initialize loop for decryption */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
721 iov_base = _p_iovec->iov_base;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
722 iov_len = _p_iovec->iov_len;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
723
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
724 /* Decrypt the blocks we managed to read */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
725 for( i_index = i_ret; i_index; i_index-- )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
726 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
727 /* Check that iov_len is a multiple of 2048 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
728 if( iov_len & 0x7ff )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
729 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
730 return -1;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
731 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
732
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
733 while( iov_len == 0 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
734 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
735 _p_iovec++;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
736 iov_base = _p_iovec->iov_base;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
737 iov_len = _p_iovec->iov_len;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
738 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
739
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
740 _dvdcss_unscramble( dvdcss->css.p_title_key, iov_base );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
741 ((uint8_t*)iov_base)[0x14] &= 0x8f;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
742
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
743 iov_base = (void *) ((uint8_t*)iov_base + DVDCSS_BLOCK_SIZE);
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
744 iov_len -= DVDCSS_BLOCK_SIZE;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
745 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
746
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
747 return i_ret;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
748 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
749
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
750 /**
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
751 * \brief Close the DVD and clean up the library.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
752 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
753 * \param dvdcss a \e libdvdcss instance.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
754 * \return zero in case of success, a negative value otherwise.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
755 *
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
756 * This function closes the DVD device and frees all the memory allocated
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
757 * by \e libdvdcss. On return, the #dvdcss_t is invalidated and may not be
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
758 * used again.
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
759 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
760 LIBDVDCSS_EXPORT int dvdcss_close ( dvdcss_t dvdcss )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
761 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
762 dvd_title_t *p_title;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
763 int i_ret;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
764
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
765 /* Free our list of keys */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
766 p_title = dvdcss->p_titles;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
767 while( p_title )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
768 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
769 dvd_title_t *p_tmptitle = p_title->p_next;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
770 free( p_title );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
771 p_title = p_tmptitle;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
772 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
773
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
774 i_ret = _dvdcss_close( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
775
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
776 if( i_ret < 0 )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
777 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
778 return i_ret;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
779 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
780
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
781 free( dvdcss->psz_device );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
782 free( dvdcss );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
783
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
784 return 0;
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
785 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
786
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
787 /*
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
788 * Deprecated. See dvdcss_seek().
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
789 */
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
790 #undef dvdcss_title
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
791 LIBDVDCSS_EXPORT int dvdcss_title ( dvdcss_t dvdcss, int i_block )
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
792 {
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
793 return _dvdcss_title( dvdcss, i_block );
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
794 }
e68f255d7d64 Move libdvdcss into its own subdirectory.
diego
parents:
diff changeset
795