stream_bluray: select title by playlist

Blu-ray titles can now be selected by playlist number like this:
    bd://mpls/[playlist]
This commit is contained in:
schnusch 2016-10-11 23:33:28 +02:00 committed by wm4
parent 139f6b5de7
commit 51dbb5607e
1 changed files with 34 additions and 18 deletions

View File

@ -53,6 +53,7 @@
#define BLURAY_DEFAULT_ANGLE 0
#define BLURAY_DEFAULT_CHAPTER 0
#define BLURAY_PLAYLIST_TITLE -3
#define BLURAY_DEFAULT_TITLE -2
#define BLURAY_MENU_TITLE -1
@ -80,6 +81,7 @@ struct bluray_priv_s {
int current_playlist;
int cfg_title;
int cfg_playlist;
char *cfg_device;
bool use_nav;
@ -92,6 +94,11 @@ static void destruct(struct bluray_priv_s *priv)
bd_close(priv->bd);
}
inline static int play_playlist(struct bluray_priv_s *priv, int playlist)
{
return bd_select_playlist(priv->bd, playlist);
}
inline static int play_title(struct bluray_priv_s *priv, int title)
{
return bd_select_title(priv->bd, title);
@ -341,19 +348,25 @@ static bool check_disc_info(stream_t *s)
static void select_initial_title(stream_t *s, int title_guess) {
struct bluray_priv_s *b = s->priv;
int title = -1;
if (b->cfg_title != BLURAY_DEFAULT_TITLE )
title = b->cfg_title;
else
title = title_guess;
if (title < 0)
return;
if (play_title(b, title))
b->current_title = title;
else {
MP_WARN(s, "Couldn't start title '%d'.\n", title);
if (b->cfg_title == BLURAY_PLAYLIST_TITLE) {
if (!play_playlist(b, b->cfg_playlist))
MP_WARN(s, "Couldn't start playlist '%05d'.\n", b->cfg_playlist);
b->current_title = bd_get_current_title(b->bd);
} else {
int title = -1;
if (b->cfg_title != BLURAY_DEFAULT_TITLE )
title = b->cfg_title;
else
title = title_guess;
if (title < 0)
return;
if (play_title(b, title))
b->current_title = title;
else {
MP_WARN(s, "Couldn't start title '%d'.\n", title);
b->current_title = bd_get_current_title(b->bd);
}
}
}
@ -456,7 +469,7 @@ static int bluray_stream_open(stream_t *s)
b->use_nav = s->info == &stream_info_bdnav;
bstr title, bdevice;
bstr title, bdevice, rest = { .len = 0 };
bstr_split_tok(bstr0(s->path), "/", &title, &bdevice);
b->cfg_title = BLURAY_DEFAULT_TITLE;
@ -465,13 +478,16 @@ static int bluray_stream_open(stream_t *s)
b->cfg_title = BLURAY_DEFAULT_TITLE;
} else if (bstr_equals0(title, "menu")) {
b->cfg_title = BLURAY_MENU_TITLE;
} else if (bstr_equals0(title, "mpls")) {
bstr_split_tok(bdevice, "/", &title, &bdevice);
b->cfg_playlist = bstrtoll(title, &rest, 10);
b->cfg_title = BLURAY_PLAYLIST_TITLE;
} else if (title.len) {
bstr rest;
b->cfg_title = bstrtoll(title, &rest, 10);
if (rest.len) {
MP_ERR(s, "number expected: '%.*s'\n", BSTR_P(rest));
return STREAM_ERROR;
}
}
if (rest.len) {
MP_ERR(s, "number expected: '%.*s'\n", BSTR_P(rest));
return STREAM_ERROR;
}
b->cfg_device = bstrto0(b, bdevice);