annotate stream/stream_bd.c @ 33771:6e774a02d00c

Remove gtkClearStruct code from mplayer() in interface.c. Move it as static function guiInfoMediumClear() where it is used and rename the symbolic constants used with this code.
author ib
date Sat, 09 Jul 2011 11:48:13 +0000
parents 48ee2c151251
children a93891202051
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
1 /*
32519
68f26b2ca07e cosmetics: Fix Bluray vs. Blu-ray typo.
diego
parents: 32494
diff changeset
2 * Blu-ray stream playback
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
3 * by cRTrn13 <crtrn13-at-gmail.com> 2009
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
4 *
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
5 * This file is part of MPlayer.
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
6 *
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
7 * MPlayer is free software; you can redistribute it and/or modify
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
10 * (at your option) any later version.
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
11 *
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
12 * MPlayer is distributed in the hope that it will be useful,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
15 * GNU General Public License for more details.
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
16 *
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License along
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
18 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
20 */
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
21
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
22 #include <stdio.h>
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
23 #include <limits.h>
31914
579d0c6b4270 Avoid a pointless extra variable.
reimar
parents: 31913
diff changeset
24 #include <ctype.h>
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
25 #include "libavutil/common.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
26 #include "libavutil/aes.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
27 #include "libavutil/sha.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
28 #include "libmpdemux/demuxer.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
29 #include "libavutil/intreadwrite.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
30 #include "m_struct.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
31 #include "m_option.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
32 #include "stream.h"
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
33 #include "stream_bd.h"
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
34
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
35 static const int BD_UNIT_SIZE = 6144;
31874
cedbffa1629d Make it possible to use relative, http:// etc. paths with bd://
reimar
parents: 31873
diff changeset
36 static const char BD_UKF_PATH[] = "%s/AACS/Unit_Key_RO.inf";
cedbffa1629d Make it possible to use relative, http:// etc. paths with bd://
reimar
parents: 31873
diff changeset
37 static const char BD_M2TS_PATH[] = "%s/BDMV/STREAM/%05d.m2ts";
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
38 static const char BD_CLIPINF_PATH[] = "%s/BDMV/CLIPINF/%05d.clpi";
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
39
31873
dd09c62c1adf Avoid pointless additional string pointers.
reimar
parents: 31872
diff changeset
40 static const char DEFAULT_BD_DEVICE[] = "/mnt/bd";
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
41
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
42 static const struct stream_priv_s {
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
43 int title;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
44 char *device;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
45 } stream_priv_dflts = {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
46 0,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
47 NULL
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
48 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
49
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
50 // Format: bd://[title][</mntlocation>]
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
51 // --> e.g.: bd://117/media/THE_MUMMY/
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
52 // --> or bd://152
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
53 // instead of directly, mount location can also be gotten through -dvd-device
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
54 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
55 static const m_option_t stream_opts_fields[] = {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
56 { "hostname", ST_OFF(title), CONF_TYPE_INT, M_OPT_RANGE, 0, 99999, NULL},
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
57 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL},
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
58 { NULL, NULL, 0, 0, 0, 0, NULL }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
59 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
60
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
61 static const struct m_struct_st stream_opts = {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
62 "bd",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
63 sizeof(struct stream_priv_s),
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
64 &stream_priv_dflts,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
65 stream_opts_fields
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
66 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
67
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
68 typedef union {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
69 uint64_t u64[2];
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
70 uint8_t u8[16];
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
71 } key;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
72
31845
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
73 static const key BD_CBC_IV = {
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
74 .u8 = {
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
75 0x0b, 0xa0, 0xf8, 0xdd, 0xfe, 0xa6, 0x1f, 0xb3,
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
76 0xd8, 0xdf, 0x9f, 0x56, 0x6a, 0x05, 0x0f, 0x78
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
77 }
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
78 };
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
79
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
80 struct uks {
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
81 int count;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
82 key *keys;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
83 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
84
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
85 // This is just a guess
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
86 #define LANG_NAME_LEN 20
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
87
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
88 struct lang_map {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
89 int id;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
90 int type;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
91 char lang_name[LANG_NAME_LEN + 1];
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
92 };
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
93
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
94 struct bd_priv {
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
95 key vuk;
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
96 key iv;
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
97 int title;
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
98 const char *device;
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
99 stream_t *title_file;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
100 struct AVAES *aescbc;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
101 struct AVAES *aeseed;
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
102 off_t pos;
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
103 struct uks uks;
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
104 int nr_lang_maps;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
105 struct lang_map *lang_maps;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
106 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
107
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
108 static void bd_stream_close(stream_t *s)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
109 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
110 struct bd_priv *bd = s->priv;
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
111 free_stream(bd->title_file);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
112 av_free(bd->aescbc);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
113 av_free(bd->aeseed);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
114 free(bd->uks.keys);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
115 free(bd);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
116 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
117
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
118 static int bd_stream_seek(stream_t *s, off_t pos)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
119 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
120 struct bd_priv *bd = s->priv;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
121
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
122 // must seek to start of unit
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
123 pos -= pos % BD_UNIT_SIZE;
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
124 if (!stream_seek(bd->title_file, pos)) {
31848
1241f62e54e7 Return an error when seeking beyond EOF.
reimar
parents: 31847
diff changeset
125 s->eof = 1;
1241f62e54e7 Return an error when seeking beyond EOF.
reimar
parents: 31847
diff changeset
126 return 0;
1241f62e54e7 Return an error when seeking beyond EOF.
reimar
parents: 31847
diff changeset
127 }
1241f62e54e7 Return an error when seeking beyond EOF.
reimar
parents: 31847
diff changeset
128
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
129 bd->pos = pos;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
130 s->pos = pos;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
131
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
132 return 1;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
133 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
134
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
135 #define ID_STR_LEN 41
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
136 static void id2str(const uint8_t *id, int idlen, char dst[ID_STR_LEN])
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
137 {
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
138 int i;
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
139 idlen = FFMIN(idlen, 20);
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
140 for (i = 0; i < idlen; i++)
31911
0a5093edd406 Switch to uppercase hex.
reimar
parents: 31910
diff changeset
141 snprintf(dst + 2*i, 3, "%02"PRIX8, id[i]);
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
142 }
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
143
31909
349f13e9d27b Add const to pointer argument.
reimar
parents: 31908
diff changeset
144 static int find_vuk(struct bd_priv *bd, const uint8_t discid[20])
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
145 {
31917
d0d09a75bb17 Check stream_read_line result instead of checking stream_eof,
reimar
parents: 31916
diff changeset
146 char line[1024];
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
147 char filename[PATH_MAX];
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
148 const char *home;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
149 int vukfound = 0;
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
150 stream_t *file;
31912
c8935911ca00 Simplify searching for discid by comparing the string representations.
reimar
parents: 31911
diff changeset
151 char idstr[ID_STR_LEN];
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
152
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
153 // look up discid in KEYDB.cfg to get VUK
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
154 home = getenv("HOME");
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
155 snprintf(filename, sizeof(filename), "%s/.dvdcss/KEYDB.cfg", home);
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
156 file = open_stream(filename, NULL, NULL);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
157 if (!file) {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
158 mp_msg(MSGT_OPEN,MSGL_ERR,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
159 "Cannot open VUK database file %s\n", filename);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
160 return 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
161 }
31912
c8935911ca00 Simplify searching for discid by comparing the string representations.
reimar
parents: 31911
diff changeset
162 id2str(discid, 20, idstr);
31917
d0d09a75bb17 Check stream_read_line result instead of checking stream_eof,
reimar
parents: 31916
diff changeset
163 while (stream_read_line(file, line, sizeof(line), 0)) {
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
164 char *vst;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
165
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
166 // file is built up this way:
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
167 // DISCID = title | V | VUK
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
168 // or
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
169 // DISCID = title | key-pair
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
170 // key-pair = V | VUK
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
171 // or D | Date
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
172 // or M | M-key???
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
173 // or I | I-Key
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
174 // can be followed by ; and comment
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
175
31912
c8935911ca00 Simplify searching for discid by comparing the string representations.
reimar
parents: 31911
diff changeset
176 if (strncasecmp(line, idstr, 40))
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
177 continue;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
178 mp_msg(MSGT_OPEN, MSGL_V, "KeyDB found Entry for DiscID:\n%s\n", line);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
179
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
180 vst = strstr(line, "| V |");
31913
0aaca064dd5c Format NULL-pointer check consistently.
reimar
parents: 31912
diff changeset
181 if (!vst)
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
182 break;
31914
579d0c6b4270 Avoid a pointless extra variable.
reimar
parents: 31913
diff changeset
183 vst += 6;
579d0c6b4270 Avoid a pointless extra variable.
reimar
parents: 31913
diff changeset
184 while (isspace(*vst)) vst++;
31916
6b45e5fb9dc4 Fix reading of VUK: actually fail if the key is incomplete instead
reimar
parents: 31915
diff changeset
185 if (sscanf(vst, "%16"SCNx64, &bd->vuk.u64[0]) != 1)
31914
579d0c6b4270 Avoid a pointless extra variable.
reimar
parents: 31913
diff changeset
186 continue;
31916
6b45e5fb9dc4 Fix reading of VUK: actually fail if the key is incomplete instead
reimar
parents: 31915
diff changeset
187 if (sscanf(vst + 16, "%16"SCNx64, &bd->vuk.u64[1]) != 1)
6b45e5fb9dc4 Fix reading of VUK: actually fail if the key is incomplete instead
reimar
parents: 31915
diff changeset
188 continue;
6b45e5fb9dc4 Fix reading of VUK: actually fail if the key is incomplete instead
reimar
parents: 31915
diff changeset
189 bd->vuk.u64[0] = av_be2ne64(bd->vuk.u64[0]);
6b45e5fb9dc4 Fix reading of VUK: actually fail if the key is incomplete instead
reimar
parents: 31915
diff changeset
190 bd->vuk.u64[1] = av_be2ne64(bd->vuk.u64[1]);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
191 vukfound = 1;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
192 }
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
193 free_stream(file);
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
194 return vukfound;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
195 }
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
196
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
197 static int bd_get_uks(struct bd_priv *bd)
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
198 {
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
199 unsigned char *buf;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
200 size_t file_size;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
201 int pos;
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
202 int i;
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
203 struct AVAES *a;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
204 struct AVSHA *asha;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
205 stream_t *file;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
206 char filename[PATH_MAX];
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
207 uint8_t discid[20];
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
208 char idstr[ID_STR_LEN];
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
209
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
210 snprintf(filename, sizeof(filename), BD_UKF_PATH, bd->device);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
211 file = open_stream(filename, NULL, NULL);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
212 if (!file) {
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
213 mp_msg(MSGT_OPEN, MSGL_ERR,
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
214 "Cannot open file %s to get UK and DiscID\n", filename);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
215 return 0;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
216 }
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
217 file_size = file->end_pos;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
218 if (file_size <= 0 || file_size > 10 * 1024* 1024) {
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
219 mp_msg(MSGT_OPEN, MSGL_ERR, "File %s too large\n", filename);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
220 free_stream(file);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
221 return 0;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
222 }
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
223 buf = av_malloc(file_size);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
224 stream_read(file, buf, file_size);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
225 free_stream(file);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
226
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
227 // get discid from file
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
228 asha = av_malloc(av_sha_size);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
229 av_sha_init(asha, 160);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
230 av_sha_update(asha, buf, file_size);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
231 av_sha_final(asha, discid);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
232 av_free(asha);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
233
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
234 if (!find_vuk(bd, discid)) {
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
235 id2str(discid, 20, idstr);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
236 mp_msg(MSGT_OPEN, MSGL_ERR,
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
237 "No Volume Unique Key (VUK) found for this Disc: %s\n", idstr);
31907
8df8d8fbadf1 Fix a memleak.
reimar
parents: 31906
diff changeset
238 av_free(buf);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
239 return 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
240 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
241
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
242 pos = AV_RB32(buf);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
243 if (pos < file_size) {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
244 int key_pos = pos + 48;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
245 int max_count = (file_size - key_pos - 16) / 48;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
246 bd->uks.count = AV_RB16(&buf[pos]);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
247 if (max_count < bd->uks.count) {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
248 mp_msg(MSGT_OPEN, MSGL_ERR,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
249 "File to small for key count %i, using %i\n",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
250 bd->uks.count, max_count);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
251 bd->uks.count = max_count;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
252 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
253 bd->uks.keys = calloc(bd->uks.count, sizeof(key));
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
254
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
255 a = av_malloc(av_aes_size);
31908
b1ba93bcedb1 Remove a unused assignment.
reimar
parents: 31907
diff changeset
256 av_aes_init(a, bd->vuk.u8, 128, 1);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
257
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
258 id2str(discid, 20, idstr);
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
259 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_BD_DISCID=%s\n", idstr);
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
260 id2str(bd->vuk.u8, 16, idstr);
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
261 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_BD_VUK=%s\n", idstr);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
262
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
263 for (i = 0; i < bd->uks.count; i++) {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
264 av_aes_crypt(a, bd->uks.keys[i].u8, &buf[key_pos], 1, NULL, 1); // decrypt unit key
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
265 key_pos += 48;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
266 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
267
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
268 av_free(a);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
269 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
270
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
271 av_free(buf);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
272 return 1;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
273 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
274
31846
3f84ee74869d Minor optimization/simplification and document the alignment requirements
reimar
parents: 31845
diff changeset
275 // NOTE: we assume buf is sufficiently aligned to 64 bit read/writes
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
276 static off_t bd_read(struct bd_priv *bd, uint8_t *buf, int len)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
277 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
278 int read_len;
32530
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
279 int unit_offset = bd->pos % BD_UNIT_SIZE;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
280 len &= ~15;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
281 if (!len)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
282 return 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
283
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
284 read_len = stream_read(bd->title_file, buf, len);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
285 if (read_len != len)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
286 return -1;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
287
32530
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
288 if (unit_offset) {
32531
48ee2c151251 100l, add forgotten FFMIN to fix small reads (-nocache) with bd:// protocol.
reimar
parents: 32530
diff changeset
289 int decrypt_len = FFMIN(len, BD_UNIT_SIZE - unit_offset);
32530
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
290 av_aes_crypt(bd->aescbc, buf, buf, decrypt_len / 16, bd->iv.u8, 1);
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
291 buf += decrypt_len;
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
292 len -= decrypt_len;
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
293 }
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
294 while (len) {
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
295 int decrypt_len = FFMIN(len, BD_UNIT_SIZE);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
296 // reset aes context as at start of unit
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
297 key enc_seed;
31845
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
298 bd->iv = BD_CBC_IV;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
299
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
300 // perform encryption of first 16 bytes of unit (seed)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
301 av_aes_crypt(bd->aeseed, enc_seed.u8, buf, 1, NULL, 0);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
302
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
303 // perform xor
31846
3f84ee74869d Minor optimization/simplification and document the alignment requirements
reimar
parents: 31845
diff changeset
304 enc_seed.u64[0] ^= AV_RN64A(buf);
3f84ee74869d Minor optimization/simplification and document the alignment requirements
reimar
parents: 31845
diff changeset
305 enc_seed.u64[1] ^= AV_RN64A(buf + 8);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
306
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
307 // set uk AES-CBC key from enc_seed and BD_CBC_IV
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
308 av_aes_init(bd->aescbc, enc_seed.u8, 128, 1);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
309
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
310 // decrypt
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
311 av_aes_crypt(bd->aescbc, &buf[16], &buf[16],
32530
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
312 (decrypt_len - 16) / 16, bd->iv.u8, 1);
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
313 buf += decrypt_len;
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
314 len -= decrypt_len;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
315 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
316
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
317 bd->pos += read_len;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
318
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
319 return read_len;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
320 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
321
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
322 static int bd_stream_fill_buffer(stream_t *s, char *buf, int len)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
323 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
324 int read_len;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
325 struct bd_priv *bd = s->priv;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
326
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
327 read_len = bd_read(bd, buf, len);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
328
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
329 s->pos = bd->pos;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
330
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
331 return read_len;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
332 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
333
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
334 static int is_video_type(int type)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
335 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
336 switch (type) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
337 case 1:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
338 case 2:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
339 case 0x10:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
340 case 0x1b:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
341 case 0xD1:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
342 case 0xEA:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
343 return 1;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
344 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
345 return 0;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
346 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
347
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
348 static int is_audio_type(int type)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
349 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
350 switch (type) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
351 case 3:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
352 case 4:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
353 case 0x0f:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
354 case 0x11:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
355 case 0x81:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
356 case 0x8A:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
357 case 0x82:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
358 case 0x85:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
359 case 0x86:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
360 return 1;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
361 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
362 return 0;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
363 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
364
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
365 static int is_sub_type(int type)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
366 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
367 switch (type) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
368 case 0x90:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
369 return 1;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
370 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
371 return 0;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
372 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
373
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
374 const char *bd_lang_from_id(stream_t *s, int id)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
375 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
376 struct bd_priv *bd = s->priv;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
377 int i;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
378 for (i = 0; i < bd->nr_lang_maps; i++) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
379 if (bd->lang_maps[i].id == id)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
380 return bd->lang_maps[i].lang_name;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
381 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
382 return NULL;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
383 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
384
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
385 int bd_aid_from_lang(stream_t *s, const char *lang)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
386 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
387 struct bd_priv *bd = s->priv;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
388 int i;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
389 for (i = 0; i < bd->nr_lang_maps; i++) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
390 if (is_audio_type(bd->lang_maps[i].type) &&
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
391 strstr(bd->lang_maps[i].lang_name, lang))
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
392 return bd->lang_maps[i].id;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
393 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
394 return -1;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
395 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
396
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
397 int bd_sid_from_lang(stream_t *s, const char *lang)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
398 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
399 struct bd_priv *bd = s->priv;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
400 int i;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
401 for (i = 0; i < bd->nr_lang_maps; i++) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
402 if (is_sub_type(bd->lang_maps[i].type) &&
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
403 strstr(bd->lang_maps[i].lang_name, lang))
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
404 return bd->lang_maps[i].id;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
405 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
406 return -1;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
407 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
408
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
409 static void get_clipinf(struct bd_priv *bd)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
410 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
411 int i;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
412 int langmap_offset, index_offset, end_offset;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
413 char filename[PATH_MAX];
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
414 stream_t *file;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
415
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
416 snprintf(filename, sizeof(filename), BD_CLIPINF_PATH, bd->device, bd->title);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
417 file = open_stream(filename, NULL, NULL);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
418 if (!file) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
419 mp_msg(MSGT_OPEN, MSGL_ERR, "Cannot open clipinf %s\n", filename);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
420 return;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
421 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
422 if (stream_read_qword(file) != AV_RB64("HDMV0200")) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
423 mp_msg(MSGT_OPEN, MSGL_ERR, "Unknown clipinf format\n");
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
424 return;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
425 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
426 stream_read_dword(file); // unknown offset
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
427 langmap_offset = stream_read_dword(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
428 index_offset = stream_read_dword(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
429 end_offset = stream_read_dword(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
430
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
431 // read language <-> stream id mappings
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
432 stream_seek(file, langmap_offset);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
433 stream_read_dword(file); // size
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
434 stream_skip(file, 8); // unknown
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
435 bd->nr_lang_maps = stream_read_char(file); // number of entries
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
436 stream_read_char(file); // unknown
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
437
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
438 bd->lang_maps = calloc(bd->nr_lang_maps, sizeof(*bd->lang_maps));
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
439 for (i = 0; i < bd->nr_lang_maps; i++) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
440 int type;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
441 bd->lang_maps[i].id = stream_read_word(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
442 stream_read_char(file); // unknown
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
443 type = stream_read_char(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
444 if (!is_video_type(type) && !is_audio_type(type) && !is_sub_type(type))
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
445 mp_msg(MSGT_OPEN, MSGL_WARN, "Unknown type %x in clipinf\n", type);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
446 bd->lang_maps[i].type = type;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
447 stream_read(file, bd->lang_maps[i].lang_name, LANG_NAME_LEN);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
448 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
449
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
450 free_stream(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
451 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
452
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
453 static int bd_stream_open(stream_t *s, int mode, void* opts, int* file_format)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
454 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
455 char filename[PATH_MAX];
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
456
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
457 struct stream_priv_s* p = opts;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
458 struct bd_priv *bd = calloc(1, sizeof(*bd));
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
459
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
460 if (p->device)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
461 bd->device = p->device;
32326
4189a8951568 Use bluray_device variable also for bd:// instead of dvd_device
reimar
parents: 31917
diff changeset
462 else if (bluray_device)
4189a8951568 Use bluray_device variable also for bd:// instead of dvd_device
reimar
parents: 31917
diff changeset
463 bd->device = bluray_device;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
464 else
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
465 bd->device = DEFAULT_BD_DEVICE;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
466
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
467 s->sector_size = BD_UNIT_SIZE;
32530
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
468 s->read_chunk = 32 * BD_UNIT_SIZE;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
469 s->flags = STREAM_READ | MP_STREAM_SEEK;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
470 s->fill_buffer = bd_stream_fill_buffer;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
471 s->seek = bd_stream_seek;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
472 s->close = bd_stream_close;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
473 s->start_pos = 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
474 s->priv = bd;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
475 s->type = STREAMTYPE_BD;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
476 s->url = strdup("bd://");
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
477
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
478 bd->pos = 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
479 bd->title = p->title;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
480
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
481 // get and decrypt unit keys
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
482 if (!bd_get_uks(bd))
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
483 return STREAM_ERROR;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
484
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
485 bd->aescbc = av_malloc(av_aes_size);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
486 bd->aeseed = av_malloc(av_aes_size);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
487
31847
273d40130183 Move one AES initialization out of inner loop.
reimar
parents: 31846
diff changeset
488 // set up AES key from uk
273d40130183 Move one AES initialization out of inner loop.
reimar
parents: 31846
diff changeset
489 av_aes_init(bd->aeseed, bd->uks.keys[0].u8, 128, 0);
273d40130183 Move one AES initialization out of inner loop.
reimar
parents: 31846
diff changeset
490
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
491 snprintf(filename, sizeof(filename), BD_M2TS_PATH, bd->device, bd->title);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
492 mp_msg(MSGT_OPEN, MSGL_STATUS, "Opening %s\n", filename);
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
493 bd->title_file = open_stream(filename, NULL, NULL);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
494 if (!bd->title_file)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
495 return STREAM_ERROR;
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
496 s->end_pos = bd->title_file->end_pos;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
497
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
498 get_clipinf(bd);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
499
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
500 return STREAM_OK;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
501 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
502
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
503 const stream_info_t stream_info_bd = {
32519
68f26b2ca07e cosmetics: Fix Bluray vs. Blu-ray typo.
diego
parents: 32494
diff changeset
504 "Blu-ray",
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
505 "bd",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
506 "cRTrn13",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
507 "",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
508 bd_stream_open,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
509 { "bd", NULL },
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
510 &stream_opts,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
511 1
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
512 };