Mercurial > mplayer.hg
annotate stream/stream_bd.c @ 34685:311b47301ea7
Remove gstrcasecmp().
This function isn't necessary. strcasecmp() can be used just as well,
because both arguments to the gstrcasecmp() calls have been checked
to be not NULL prior to the call.
author | ib |
---|---|
date | Fri, 24 Feb 2012 17:26:35 +0000 |
parents | 26eddbd6353a |
children | b5abdfe9bc61 |
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 | 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 | 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 | 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 | 75 static const key BD_CBC_IV = { |
76 .u8 = { | |
77 0x0b, 0xa0, 0xf8, 0xdd, 0xfe, 0xa6, 0x1f, 0xb3, | |
78 0xd8, 0xdf, 0x9f, 0x56, 0x6a, 0x05, 0x0f, 0x78 | |
79 } | |
80 }; | |
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 | 127 s->eof = 1; |
128 return 0; | |
129 } | |
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 | 137 #define ID_STR_LEN 41 |
138 static void id2str(const uint8_t *id, int idlen, char dst[ID_STR_LEN]) | |
139 { | |
140 int i; | |
141 idlen = FFMIN(idlen, 20); | |
142 for (i = 0; i < idlen; i++) | |
31911 | 143 snprintf(dst + 2*i, 3, "%02"PRIX8, id[i]); |
31910 | 144 } |
145 | |
31909 | 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 | 183 if (!vst) |
31840
af68430bf5de
whitespace cosmetics: prettyprinting, move statements to the next line.
diego
parents:
31836
diff
changeset
|
184 break; |
31914 | 185 vst += 6; |
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 | 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 | 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 | 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 | 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 | 239 "No Volume Unique Key (VUK) found for this Disc: %s\n", idstr); |
31907 | 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 | 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 | 260 id2str(discid, 20, idstr); |
261 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_BD_DISCID=%s\n", idstr); | |
262 id2str(bd->vuk.u8, 16, idstr); | |
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 | 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 | 507 // set up AES key from uk |
508 av_aes_init(bd->aeseed, bd->uks.keys[0].u8, 128, 0); | |
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 | 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 }; |