annotate stream/stream_bluray.c @ 35332:d6b957072297

subreader: do not skip the first char of ASS fields. Without this change, fields that can be sometimes empty and sometimes not, such as the Effect field, are counted in an inconsistent way. Since the number of fields is used to find where the text starts, it leads to internal field arriving on the video. Bug reported anonymously on the users mailing list.
author cigaes
date Tue, 20 Nov 2012 19:43:53 +0000
parents 3b2c280da1af
children b5abdfe9bc61
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
1 /*
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
2 * Copyright (C) 2010 Benjamin Zores <ben@geexbox.org>
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
3 *
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
4 * This file is part of MPlayer.
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
5 *
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
9 * (at your option) any later version.
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
10 *
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
14 * GNU General Public License for more details.
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
15 *
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License along
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
19 */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
20
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
21 /*
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
22 * Blu-ray parser/reader using libbluray
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
23 * Use 'git clone git://git.videolan.org/libbluray' to get it.
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
24 *
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
25 * TODO:
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
26 * - Add libbdnav support for menus navigation
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
27 * - Add AACS/BD+ protection detection
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
28 * - Add descrambled keys database support (KEYDB.cfg)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
29 *
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
30 */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
31
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
32 #include <libbluray/bluray.h>
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
33
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
34 #include "config.h"
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
35 #include "libavutil/common.h"
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
36 #include "libmpdemux/demuxer.h"
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
37 #include "mp_msg.h"
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
38 #include "help_mp.h"
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
39 #include "m_struct.h"
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
40 #include "m_option.h"
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
41 #include "stream.h"
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
42
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
43 #define BLURAY_SECTOR_SIZE 6144
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
44
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
45 #define BLURAY_DEFAULT_ANGLE 0
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
46 #define BLURAY_DEFAULT_CHAPTER 0
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
47 #define BLURAY_DEFAULT_TITLE 0
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
48
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
49 int bluray_angle = 0;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
50 int bluray_chapter = 0;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
51
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
52 struct bluray_priv_s {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
53 BLURAY *bd;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
54 int current_angle;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
55 int current_chapter;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
56 int current_title;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
57 };
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
58
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
59 static struct stream_priv_s {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
60 int title;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
61 char *device;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
62 } bluray_stream_priv_dflts = {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
63 BLURAY_DEFAULT_TITLE,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
64 NULL
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
65 };
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
66
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
67 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
68 static const m_option_t bluray_stream_opts_fields[] = {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
69 { "hostname", ST_OFF(title), CONF_TYPE_INT, M_OPT_RANGE, 0, 99999, NULL},
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
70 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL},
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
71 { NULL, NULL, 0, 0, 0, 0, NULL }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
72 };
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
73
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
74 static const struct m_struct_st bluray_stream_opts = {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
75 "bluray",
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
76 sizeof(struct stream_priv_s),
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
77 &bluray_stream_priv_dflts,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
78 bluray_stream_opts_fields
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
79 };
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
80
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
81 static void bluray_stream_close(stream_t *s)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
82 {
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
83 struct bluray_priv_s *b = s->priv;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
84
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
85 bd_close(b->bd);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
86 b->bd = NULL;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
87 free(b);
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
88 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
89
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
90 static int bluray_stream_seek(stream_t *s, off_t pos)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
91 {
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
92 struct bluray_priv_s *b = s->priv;
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
93 off_t p;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
94
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
95 p = bd_seek(b->bd, pos);
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
96 if (p == -1)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
97 return 0;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
98
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
99 s->pos = p;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
100 return 1;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
101 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
102
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
103 static int bluray_stream_fill_buffer(stream_t *s, char *buf, int len)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
104 {
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
105 struct bluray_priv_s *b = s->priv;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
106
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
107 return bd_read(b->bd, buf, len);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
108 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
109
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
110 static int bluray_stream_control(stream_t *s, int cmd, void *arg)
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
111 {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
112 struct bluray_priv_s *b = s->priv;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
113
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
114 switch (cmd) {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
115
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
116 case STREAM_CTRL_GET_NUM_CHAPTERS: {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
117 BLURAY_TITLE_INFO *ti;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
118
34038
422eb76aee70 stream_bluray: switch to new libbluray API
diego
parents: 33827
diff changeset
119 ti = bd_get_title_info(b->bd, b->current_title, b->current_angle);
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
120 if (!ti)
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
121 return STREAM_UNSUPPORTED;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
122
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
123 *((unsigned int *) arg) = ti->chapter_count;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
124 bd_free_title_info(ti);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
125
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
126 return 1;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
127 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
128
35169
3b2c280da1af Add new stream control command STREAM_CTRL_GET_CURRENT_TITLE for DVDs.
ib
parents: 34649
diff changeset
129 case STREAM_CTRL_GET_CURRENT_TITLE: {
3b2c280da1af Add new stream control command STREAM_CTRL_GET_CURRENT_TITLE for DVDs.
ib
parents: 34649
diff changeset
130 *((unsigned int *) arg) = b->current_title;
3b2c280da1af Add new stream control command STREAM_CTRL_GET_CURRENT_TITLE for DVDs.
ib
parents: 34649
diff changeset
131 return 1;
3b2c280da1af Add new stream control command STREAM_CTRL_GET_CURRENT_TITLE for DVDs.
ib
parents: 34649
diff changeset
132 }
3b2c280da1af Add new stream control command STREAM_CTRL_GET_CURRENT_TITLE for DVDs.
ib
parents: 34649
diff changeset
133
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
134 case STREAM_CTRL_GET_CURRENT_CHAPTER: {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
135 *((unsigned int *) arg) = b->current_chapter;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
136 return 1;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
137 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
138
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
139 case STREAM_CTRL_SEEK_TO_CHAPTER: {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
140 BLURAY_TITLE_INFO *ti;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
141 int chapter = *((unsigned int *) arg);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
142 int64_t pos;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
143 int r;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
144
34038
422eb76aee70 stream_bluray: switch to new libbluray API
diego
parents: 33827
diff changeset
145 ti = bd_get_title_info(b->bd, b->current_title, b->current_angle);
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
146 if (!ti)
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
147 return STREAM_UNSUPPORTED;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
148
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
149 if (chapter < 0 || chapter > ti->chapter_count) {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
150 bd_free_title_info(ti);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
151 return STREAM_UNSUPPORTED;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
152 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
153
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
154 pos = bd_chapter_pos(b->bd, chapter);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
155 r = bluray_stream_seek(s, pos);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
156 bd_free_title_info(ti);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
157
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
158 return r ? 1 : STREAM_UNSUPPORTED;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
159 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
160
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
161 case STREAM_CTRL_GET_NUM_ANGLES: {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
162 BLURAY_TITLE_INFO *ti;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
163
34038
422eb76aee70 stream_bluray: switch to new libbluray API
diego
parents: 33827
diff changeset
164 ti = bd_get_title_info(b->bd, b->current_title, b->current_angle);
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
165 if (!ti)
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
166 return STREAM_UNSUPPORTED;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
167
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
168 *((int *) arg) = ti->angle_count;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
169 bd_free_title_info(ti);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
170
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
171 return 1;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
172 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
173
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
174 case STREAM_CTRL_GET_ANGLE: {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
175 *((int *) arg) = b->current_angle;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
176 return 1;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
177 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
178
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
179 case STREAM_CTRL_SET_ANGLE: {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
180 BLURAY_TITLE_INFO *ti;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
181 int angle = *((int *) arg);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
182
34038
422eb76aee70 stream_bluray: switch to new libbluray API
diego
parents: 33827
diff changeset
183 ti = bd_get_title_info(b->bd, b->current_title, b->current_angle);
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
184 if (!ti)
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
185 return STREAM_UNSUPPORTED;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
186
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
187 if (angle < 0 || angle > ti->angle_count) {
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
188 bd_free_title_info(ti);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
189 return STREAM_UNSUPPORTED;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
190 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
191
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
192 b->current_angle = angle;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
193 bd_seamless_angle_change(b->bd, angle);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
194 bd_free_title_info(ti);
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
195
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
196 return 1;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
197 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
198
34649
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
199 case STREAM_CTRL_GET_LANG: {
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
200 struct stream_lang_req *req = arg;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
201 BLURAY_TITLE_INFO *ti = bd_get_title_info(b->bd, b->current_title, b->current_angle);
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
202 if (ti->clip_count) {
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
203 BLURAY_STREAM_INFO *si = NULL;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
204 int count = 0;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
205 switch (req->type) {
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
206 case stream_ctrl_audio:
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
207 count = ti->clips[0].audio_stream_count;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
208 si = ti->clips[0].audio_streams;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
209 break;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
210 case stream_ctrl_sub:
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
211 count = ti->clips[0].pg_stream_count;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
212 si = ti->clips[0].pg_streams;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
213 break;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
214 }
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
215 while (count-- > 0) {
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
216 if (si->pid == req->id) {
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
217 memcpy(req->buf, si->lang, 4);
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
218 req->buf[4] = 0;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
219 bd_free_title_info(ti);
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
220 return STREAM_OK;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
221 }
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
222 si++;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
223 }
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
224 }
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
225 bd_free_title_info(ti);
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
226 return STREAM_ERROR;
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
227 }
6dcc91eb3cf8 Support showing the stream language with br:// playback.
reimar
parents: 34038
diff changeset
228
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
229 default:
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
230 break;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
231 }
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
232
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
233 return STREAM_UNSUPPORTED;
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
234 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
235
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
236 static int bluray_stream_open(stream_t *s, int mode,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
237 void *opts, int *file_format)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
238 {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
239 struct stream_priv_s *p = opts;
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
240 struct bluray_priv_s *b;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
241
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
242 BLURAY_TITLE_INFO *info = NULL;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
243 BLURAY *bd;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
244
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
245 int title, title_guess, title_count;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
246 uint64_t title_size;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
247
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
248 unsigned int chapter = 0, angle = 0;
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
249 uint64_t max_duration = 0;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
250 int64_t chapter_pos = 0;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
251
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
252 char *device = NULL;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
253 int i;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
254
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
255 /* find the requested device */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
256 if (p->device)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
257 device = p->device;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
258 else if (bluray_device)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
259 device = bluray_device;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
260
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
261 if (!device) {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
262 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_BlurayNoDevice);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
263 return STREAM_UNSUPPORTED;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
264 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
265
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
266 /* open device */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
267 bd = bd_open(device, NULL);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
268 if (!bd) {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
269 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_CantOpenBluray, device);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
270 return STREAM_UNSUPPORTED;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
271 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
272
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
273 /* check for available titles on disc */
34038
422eb76aee70 stream_bluray: switch to new libbluray API
diego
parents: 33827
diff changeset
274 title_count = bd_get_titles(bd, TITLES_RELEVANT, angle);
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
275 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_BLURAY_TITLES=%d\n", title_count);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
276 if (!title_count) {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
277 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_BlurayNoTitles);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
278 bd_close(bd);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
279 return STREAM_UNSUPPORTED;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
280 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
281
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
282 /* parse titles information */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
283 title_guess = BLURAY_DEFAULT_TITLE;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
284 for (i = 0; i < title_count; i++) {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
285 BLURAY_TITLE_INFO *ti;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
286 int sec, msec;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
287
34038
422eb76aee70 stream_bluray: switch to new libbluray API
diego
parents: 33827
diff changeset
288 ti = bd_get_title_info(bd, i, angle);
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
289 if (!ti)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
290 continue;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
291
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
292 sec = ti->duration / 90000;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
293 msec = (ti->duration - sec) % 1000;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
294
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
295 mp_msg(MSGT_IDENTIFY, MSGL_INFO,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
296 "ID_BLURAY_TITLE_%d_CHAPTERS=%d\n", i + 1, ti->chapter_count);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
297 mp_msg(MSGT_IDENTIFY, MSGL_INFO,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
298 "ID_BLURAY_TITLE_%d_ANGLE=%d\n", i + 1, ti->angle_count);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
299 mp_msg(MSGT_IDENTIFY, MSGL_V,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
300 "ID_BLURAY_TITLE_%d_LENGTH=%d.%03d\n", i + 1, sec, msec);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
301
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
302 /* try to guess which title may contain the main movie */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
303 if (ti->duration > max_duration) {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
304 max_duration = ti->duration;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
305 title_guess = i;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
306 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
307
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
308 bd_free_title_info(ti);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
309 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
310
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
311 /* Select current title */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
312 title = p->title ? p->title - 1: title_guess;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
313 title = FFMIN(title, title_count - 1);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
314
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
315 bd_select_title(bd, title);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
316
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
317 title_size = bd_get_title_size(bd);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
318 mp_msg(MSGT_IDENTIFY, MSGL_INFO,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
319 "ID_BLURAY_CURRENT_TITLE=%d\n", title + 1);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
320
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
321 /* Get current title information */
34038
422eb76aee70 stream_bluray: switch to new libbluray API
diego
parents: 33827
diff changeset
322 info = bd_get_title_info(bd, title, angle);
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
323 if (!info)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
324 goto err_no_info;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
325
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
326 /* Select chapter */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
327 chapter = bluray_chapter ? bluray_chapter : BLURAY_DEFAULT_CHAPTER;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
328 chapter = FFMIN(chapter, info->chapter_count);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
329
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
330 if (chapter)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
331 chapter_pos = bd_chapter_pos(bd, chapter);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
332
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
333 mp_msg(MSGT_IDENTIFY, MSGL_INFO,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
334 "ID_BLURAY_CURRENT_CHAPTER=%d\n", chapter + 1);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
335
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
336 /* Select angle */
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
337 angle = bluray_angle ? bluray_angle : BLURAY_DEFAULT_ANGLE;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
338 angle = FFMIN(angle, info->angle_count);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
339
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
340 if (angle)
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
341 bd_select_angle(bd, angle);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
342
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
343 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_BLURAY_CURRENT_ANGLE=%d\n", angle + 1);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
344
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
345 bd_free_title_info(info);
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
346
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
347 err_no_info:
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
348 s->fill_buffer = bluray_stream_fill_buffer;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
349 s->seek = bluray_stream_seek;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
350 s->close = bluray_stream_close;
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
351 s->control = bluray_stream_control;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
352
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
353 b = calloc(1, sizeof(struct bluray_priv_s));
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
354 b->bd = bd;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
355 b->current_angle = angle;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
356 b->current_chapter = chapter;
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
357 b->current_title = title;
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
358
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
359 s->start_pos = chapter_pos;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
360 s->end_pos = title_size;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
361 s->sector_size = BLURAY_SECTOR_SIZE;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
362 s->flags = mode | MP_STREAM_SEEK;
31574
1d31cd52aa08 Implement slave mode compatible stream controls for Blu-ray.
ben
parents: 31565
diff changeset
363 s->priv = b;
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
364 s->type = STREAMTYPE_BLURAY;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
365 s->url = strdup("br://");
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
366
33827
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32326
diff changeset
367 mp_msg(MSGT_OPEN, MSGL_V, "Blu-ray successfully opened.\n");
31565
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
368
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
369 return STREAM_OK;
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
370 }
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
371
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
372 const stream_info_t stream_info_bluray = {
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
373 "Blu-ray Disc",
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
374 "bd",
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
375 "Benjamin Zores",
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
376 "Play Blu-ray discs through external libbluray",
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
377 bluray_stream_open,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
378 { "br", "bluray", NULL },
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
379 &bluray_stream_opts,
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
380 1
9a590e7aac57 Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
diff changeset
381 };