annotate stream/stream_bd.c @ 35419:d86249ebbcca

Don't unconditionally reset Track, Chapter and Angle after playback. Only do so if they had been used (i.e. the current StreamType makes use of them).
author ib
date Thu, 29 Nov 2012 14:23:26 +0000
parents 26eddbd6353a
children b5abdfe9bc61
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"
34648
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
28 #include "libavutil/avstring.h"
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
29 #include "libmpdemux/demuxer.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
30 #include "libavutil/intreadwrite.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
31 #include "m_struct.h"
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
32 #include "m_option.h"
34174
a93891202051 Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents: 32531
diff changeset
33 #include "mp_msg.h"
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
34 #include "stream.h"
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
35 #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
36
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
37 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
38 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
39 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
40 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
41
31873
dd09c62c1adf Avoid pointless additional string pointers.
reimar
parents: 31872
diff changeset
42 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
43
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
44 static const struct stream_priv_s {
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
45 int title;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
46 char *device;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
47 } stream_priv_dflts = {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
48 0,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
49 NULL
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
50 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
51
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
52 // Format: bd://[title][</mntlocation>]
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
53 // --> 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
54 // --> or bd://152
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
55 // 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
56 #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
57 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
58 { "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
59 { "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
60 { 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
61 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
62
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
63 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
64 "bd",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
65 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
66 &stream_priv_dflts,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
67 stream_opts_fields
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
68 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
69
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
70 typedef union {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
71 uint64_t u64[2];
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
72 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
73 } key;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
74
31845
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
75 static const key BD_CBC_IV = {
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
76 .u8 = {
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
77 0x0b, 0xa0, 0xf8, 0xdd, 0xfe, 0xa6, 0x1f, 0xb3,
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
78 0xd8, 0xdf, 0x9f, 0x56, 0x6a, 0x05, 0x0f, 0x78
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
79 }
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
80 };
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
81
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
82 struct uks {
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
83 int count;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
84 key *keys;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
85 };
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
86
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
87 // This is just a guess
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
88 #define LANG_NAME_LEN 20
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
89
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
90 struct lang_map {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
91 int id;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
92 int type;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
93 char lang_name[LANG_NAME_LEN + 1];
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
94 };
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
95
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
96 struct bd_priv {
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
97 key vuk;
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
98 key iv;
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
99 int title;
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
100 const char *device;
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
101 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
102 struct AVAES *aescbc;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
103 struct AVAES *aeseed;
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
104 off_t pos;
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
105 struct uks uks;
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
106 int nr_lang_maps;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
107 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
108 };
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 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
111 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
112 struct bd_priv *bd = s->priv;
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
113 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
114 av_free(bd->aescbc);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
115 av_free(bd->aeseed);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
116 free(bd->uks.keys);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
117 free(bd);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
118 }
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 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
121 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
122 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
123
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
124 // 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
125 pos -= pos % BD_UNIT_SIZE;
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
126 if (!stream_seek(bd->title_file, pos)) {
31848
1241f62e54e7 Return an error when seeking beyond EOF.
reimar
parents: 31847
diff changeset
127 s->eof = 1;
1241f62e54e7 Return an error when seeking beyond EOF.
reimar
parents: 31847
diff changeset
128 return 0;
1241f62e54e7 Return an error when seeking beyond EOF.
reimar
parents: 31847
diff changeset
129 }
1241f62e54e7 Return an error when seeking beyond EOF.
reimar
parents: 31847
diff changeset
130
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
131 bd->pos = pos;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
132 s->pos = pos;
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 return 1;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
135 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
136
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
137 #define ID_STR_LEN 41
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
138 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
139 {
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
140 int i;
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
141 idlen = FFMIN(idlen, 20);
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
142 for (i = 0; i < idlen; i++)
31911
0a5093edd406 Switch to uppercase hex.
reimar
parents: 31910
diff changeset
143 snprintf(dst + 2*i, 3, "%02"PRIX8, id[i]);
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
144 }
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
145
31909
349f13e9d27b Add const to pointer argument.
reimar
parents: 31908
diff changeset
146 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
147 {
31917
d0d09a75bb17 Check stream_read_line result instead of checking stream_eof,
reimar
parents: 31916
diff changeset
148 char line[1024];
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
149 char filename[PATH_MAX];
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
150 const char *home;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
151 int vukfound = 0;
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
152 stream_t *file;
31912
c8935911ca00 Simplify searching for discid by comparing the string representations.
reimar
parents: 31911
diff changeset
153 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
154
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
155 // 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
156 home = getenv("HOME");
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
157 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
158 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
159 if (!file) {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
160 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
161 "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
162 return 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
163 }
31912
c8935911ca00 Simplify searching for discid by comparing the string representations.
reimar
parents: 31911
diff changeset
164 id2str(discid, 20, idstr);
31917
d0d09a75bb17 Check stream_read_line result instead of checking stream_eof,
reimar
parents: 31916
diff changeset
165 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
166 char *vst;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
167
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
168 // 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
169 // DISCID = title | V | VUK
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
170 // or
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
171 // DISCID = title | key-pair
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
172 // key-pair = V | VUK
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
173 // or D | Date
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
174 // or M | M-key???
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
175 // or I | I-Key
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
176 // 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
177
31912
c8935911ca00 Simplify searching for discid by comparing the string representations.
reimar
parents: 31911
diff changeset
178 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
179 continue;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
180 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
181
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
182 vst = strstr(line, "| V |");
31913
0aaca064dd5c Format NULL-pointer check consistently.
reimar
parents: 31912
diff changeset
183 if (!vst)
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
184 break;
31914
579d0c6b4270 Avoid a pointless extra variable.
reimar
parents: 31913
diff changeset
185 vst += 6;
579d0c6b4270 Avoid a pointless extra variable.
reimar
parents: 31913
diff changeset
186 while (isspace(*vst)) vst++;
31916
6b45e5fb9dc4 Fix reading of VUK: actually fail if the key is incomplete instead
reimar
parents: 31915
diff changeset
187 if (sscanf(vst, "%16"SCNx64, &bd->vuk.u64[0]) != 1)
31914
579d0c6b4270 Avoid a pointless extra variable.
reimar
parents: 31913
diff changeset
188 continue;
31916
6b45e5fb9dc4 Fix reading of VUK: actually fail if the key is incomplete instead
reimar
parents: 31915
diff changeset
189 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
190 continue;
6b45e5fb9dc4 Fix reading of VUK: actually fail if the key is incomplete instead
reimar
parents: 31915
diff changeset
191 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
192 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
193 vukfound = 1;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
194 }
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
195 free_stream(file);
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
196 return vukfound;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
197 }
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 static int bd_get_uks(struct bd_priv *bd)
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
200 {
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
201 unsigned char *buf;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
202 size_t file_size;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
203 int pos;
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
204 int i;
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
205 struct AVAES *a;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
206 struct AVSHA *asha;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
207 stream_t *file;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
208 char filename[PATH_MAX];
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
209 uint8_t discid[20];
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
210 char idstr[ID_STR_LEN];
31906
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
211
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
212 snprintf(filename, sizeof(filename), BD_UKF_PATH, bd->device);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
213 file = open_stream(filename, NULL, NULL);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
214 if (!file) {
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
215 mp_msg(MSGT_OPEN, MSGL_ERR,
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
216 "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
217 return 0;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
218 }
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
219 file_size = file->end_pos;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
220 if (file_size <= 0 || file_size > 10 * 1024* 1024) {
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
221 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
222 free_stream(file);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
223 return 0;
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
224 }
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
225 buf = av_malloc(file_size);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
226 stream_read(file, buf, file_size);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
227 free_stream(file);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
228
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
229 // get discid from file
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
230 asha = av_malloc(av_sha_size);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
231 av_sha_init(asha, 160);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
232 av_sha_update(asha, buf, file_size);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
233 av_sha_final(asha, discid);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
234 av_free(asha);
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
235
0a895a0ce15a Extract reading KEDB.cfg into a separate function.
reimar
parents: 31877
diff changeset
236 if (!find_vuk(bd, discid)) {
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
237 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
238 mp_msg(MSGT_OPEN, MSGL_ERR,
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
239 "No Volume Unique Key (VUK) found for this Disc: %s\n", idstr);
31907
8df8d8fbadf1 Fix a memleak.
reimar
parents: 31906
diff changeset
240 av_free(buf);
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
241 return 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
242 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
243
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
244 pos = AV_RB32(buf);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
245 if (pos < file_size) {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
246 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
247 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
248 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
249 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
250 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
251 "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
252 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
253 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
254 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
255 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
256
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
257 a = av_malloc(av_aes_size);
31908
b1ba93bcedb1 Remove a unused assignment.
reimar
parents: 31907
diff changeset
258 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
259
31910
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
260 id2str(discid, 20, idstr);
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
261 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
262 id2str(bd->vuk.u8, 16, idstr);
5f57e2bd697f Simplify/fix printing of disc id/VUK
reimar
parents: 31909
diff changeset
263 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
264
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
265 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
266 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
267 key_pos += 48;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
268 }
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 av_free(a);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
271 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
272
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
273 av_free(buf);
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
274 return 1;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
275 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
276
31846
3f84ee74869d Minor optimization/simplification and document the alignment requirements
reimar
parents: 31845
diff changeset
277 // 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
278 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
279 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
280 int read_len;
32530
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
281 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
282 len &= ~15;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
283 if (!len)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
284 return 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
285
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
286 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
287 if (read_len != len)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
288 return -1;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
289
32530
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
290 if (unit_offset) {
32531
48ee2c151251 100l, add forgotten FFMIN to fix small reads (-nocache) with bd:// protocol.
reimar
parents: 32530
diff changeset
291 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
292 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
293 buf += decrypt_len;
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
294 len -= decrypt_len;
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
295 }
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
296 while (len) {
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
297 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
298 // 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
299 key enc_seed;
31845
678884af8ade Use the "key" type also for the IV constant.
reimar
parents: 31840
diff changeset
300 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
301
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
302 // 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
303 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
304
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
305 // perform xor
31846
3f84ee74869d Minor optimization/simplification and document the alignment requirements
reimar
parents: 31845
diff changeset
306 enc_seed.u64[0] ^= AV_RN64A(buf);
3f84ee74869d Minor optimization/simplification and document the alignment requirements
reimar
parents: 31845
diff changeset
307 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
308
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
309 // 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
310 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
311
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
312 // decrypt
31840
af68430bf5de whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents: 31836
diff changeset
313 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
314 (decrypt_len - 16) / 16, bd->iv.u8, 1);
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
315 buf += decrypt_len;
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
316 len -= decrypt_len;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
317 }
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 bd->pos += 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 return read_len;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
322 }
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 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
325 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
326 int read_len;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
327 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
328
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
329 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
330
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
331 s->pos = bd->pos;
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 return read_len;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
334 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
335
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
336 static int is_video_type(int type)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
337 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
338 switch (type) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
339 case 1:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
340 case 2:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
341 case 0x10:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
342 case 0x1b:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
343 case 0xD1:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
344 case 0xEA:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
345 return 1;
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 return 0;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
348 }
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 static int is_audio_type(int type)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
351 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
352 switch (type) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
353 case 3:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
354 case 4:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
355 case 0x0f:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
356 case 0x11:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
357 case 0x81:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
358 case 0x8A:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
359 case 0x82:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
360 case 0x85:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
361 case 0x86:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
362 return 1;
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 return 0;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
365 }
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 static int is_sub_type(int type)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
368 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
369 switch (type) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
370 case 0x90:
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
371 return 1;
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 return 0;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
374 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
375
34648
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
376 static const char *bd_lang_from_id(stream_t *s, int id)
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
377 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
378 struct bd_priv *bd = s->priv;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
379 int i;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
380 for (i = 0; i < bd->nr_lang_maps; i++) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
381 if (bd->lang_maps[i].id == id)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
382 return bd->lang_maps[i].lang_name;
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 return NULL;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
385 }
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 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
388 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
389 struct bd_priv *bd = s->priv;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
390 int i;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
391 for (i = 0; i < bd->nr_lang_maps; i++) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
392 if (is_audio_type(bd->lang_maps[i].type) &&
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
393 strstr(bd->lang_maps[i].lang_name, lang))
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
394 return bd->lang_maps[i].id;
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 return -1;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
397 }
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 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
400 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
401 struct bd_priv *bd = s->priv;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
402 int i;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
403 for (i = 0; i < bd->nr_lang_maps; i++) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
404 if (is_sub_type(bd->lang_maps[i].type) &&
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
405 strstr(bd->lang_maps[i].lang_name, lang))
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
406 return bd->lang_maps[i].id;
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 return -1;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
409 }
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 static void get_clipinf(struct bd_priv *bd)
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
412 {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
413 int i;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
414 int langmap_offset, index_offset, end_offset;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
415 char filename[PATH_MAX];
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
416 stream_t *file;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
417
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
418 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
419 file = open_stream(filename, NULL, NULL);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
420 if (!file) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
421 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
422 return;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
423 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
424 if (stream_read_qword(file) != AV_RB64("HDMV0200")) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
425 mp_msg(MSGT_OPEN, MSGL_ERR, "Unknown clipinf format\n");
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
426 return;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
427 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
428 stream_read_dword(file); // unknown offset
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
429 langmap_offset = stream_read_dword(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
430 index_offset = stream_read_dword(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
431 end_offset = stream_read_dword(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
432
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
433 // read language <-> stream id mappings
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
434 stream_seek(file, langmap_offset);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
435 stream_read_dword(file); // size
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
436 stream_skip(file, 8); // unknown
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
437 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
438 stream_read_char(file); // unknown
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
439
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
440 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
441 for (i = 0; i < bd->nr_lang_maps; i++) {
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
442 int type;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
443 bd->lang_maps[i].id = stream_read_word(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
444 stream_read_char(file); // unknown
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
445 type = stream_read_char(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
446 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
447 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
448 bd->lang_maps[i].type = type;
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
449 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
450 }
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 free_stream(file);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
453 }
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
454
34648
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
455 static int bd_stream_control(stream_t *s, int cmd, void *arg)
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
456 {
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
457 switch (cmd) {
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
458 case STREAM_CTRL_GET_LANG:
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
459 {
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
460 struct stream_lang_req *req = arg;
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
461 const char *lang = bd_lang_from_id(s, req->id);
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
462 if (!lang)
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
463 return STREAM_ERROR;
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
464 av_strlcpy(req->buf, lang, sizeof(req->buf));
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
465 return STREAM_OK;
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
466 }
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
467 }
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
468 return STREAM_UNSUPPORTED;
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
469 }
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
470
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
471 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
472 {
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
473 char filename[PATH_MAX];
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
474
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
475 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
476 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
477
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
478 if (p->device)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
479 bd->device = p->device;
32326
4189a8951568 Use bluray_device variable also for bd:// instead of dvd_device
reimar
parents: 31917
diff changeset
480 else if (bluray_device)
4189a8951568 Use bluray_device variable also for bd:// instead of dvd_device
reimar
parents: 31917
diff changeset
481 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
482 else
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
483 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
484
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
485 s->sector_size = BD_UNIT_SIZE;
32530
4157eca96947 Support reading larger blocks in one go for bd:// protocol.
reimar
parents: 32519
diff changeset
486 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
487 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
488 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
489 s->seek = bd_stream_seek;
34648
26eddbd6353a Code cleanup: Use a stream_control instead of global functions to
reimar
parents: 34174
diff changeset
490 s->control = bd_stream_control;
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
491 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
492 s->start_pos = 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
493 s->priv = bd;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
494 s->type = STREAMTYPE_BD;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
495 s->url = strdup("bd://");
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
496
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
497 bd->pos = 0;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
498 bd->title = p->title;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
499
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
500 // 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
501 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
502 return STREAM_ERROR;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
503
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
504 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
505 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
506
31847
273d40130183 Move one AES initialization out of inner loop.
reimar
parents: 31846
diff changeset
507 // set up AES key from uk
273d40130183 Move one AES initialization out of inner loop.
reimar
parents: 31846
diff changeset
508 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
509
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
510 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
511 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
512 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
513 if (!bd->title_file)
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
514 return STREAM_ERROR;
31872
66b846665274 Use the stream functions instead of the fopen/fread/fclose interface
reimar
parents: 31848
diff changeset
515 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
516
31877
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
517 get_clipinf(bd);
e30fe0cb79cd Add incomplete clipinf reading support to display audio
reimar
parents: 31874
diff changeset
518
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
519 return STREAM_OK;
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
520 }
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
521
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
522 const stream_info_t stream_info_bd = {
32519
68f26b2ca07e cosmetics: Fix Bluray vs. Blu-ray typo.
diego
parents: 32494
diff changeset
523 "Blu-ray",
31836
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
524 "bd",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
525 "cRTrn13",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
526 "",
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
527 bd_stream_open,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
528 { "bd", NULL },
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
529 &stream_opts,
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
530 1
dcd515ac5f6c Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
diff changeset
531 };