libbluray | branch: master | hpi1 <[email protected]> | Thu May 11 14:22:23 2017 +0300| [2b816e6f20cea20c8c0d236efd08e12e9ec55541] | committer: hpi1
Cache "known" playlists when playing using on-disc menus > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=2b816e6f20cea20c8c0d236efd08e12e9ec55541 --- src/libbluray/bluray.c | 32 ++++++++++++++++++++++++++++++++ src/libbluray/disc/disc.h | 5 ++++- src/util/strutl.c | 21 +++++++++++++++++++++ src/util/strutl.h | 3 +++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c index ecb19de1..7faf4e51 100644 --- a/src/libbluray/bluray.c +++ b/src/libbluray/bluray.c @@ -2295,6 +2295,33 @@ static void _close_playlist(BLURAY *bd) _update_uo_mask(bd); } +static int _add_known_playlist(BD_DISC *p, const char *mpls_id) +{ + char *old_mpls_ids; + char *new_mpls_ids = NULL; + int result = -1; + + old_mpls_ids = disc_property_get(p, DISC_PROPERTY_PLAYLISTS); + if (!old_mpls_ids) { + return disc_property_put(p, DISC_PROPERTY_PLAYLISTS, mpls_id); + } + + /* no duplicates */ + if (str_strcasestr(old_mpls_ids, mpls_id)) { + goto out; + } + + new_mpls_ids = str_printf("%s,%s", old_mpls_ids, mpls_id); + if (new_mpls_ids) { + result = disc_property_put(p, DISC_PROPERTY_PLAYLISTS, new_mpls_ids); + } + + out: + X_FREE(old_mpls_ids); + X_FREE(new_mpls_ids); + return result; +} + static int _open_playlist(BLURAY *bd, const char *f_name, unsigned angle) { _close_playlist(bd); @@ -2325,6 +2352,11 @@ static int _open_playlist(BLURAY *bd, const char *f_name, unsigned angle) bd->st0.seek_flag = 1; + /* remember played playlists when using menus */ + if (bd->title_type != title_undef) { + _add_known_playlist(bd->disc, bd->title->name); + } + return 1; } return 0; diff --git a/src/libbluray/disc/disc.h b/src/libbluray/disc/disc.h index 3738c6f6..612a5473 100644 --- a/src/libbluray/disc/disc.h +++ b/src/libbluray/disc/disc.h @@ -1,6 +1,6 @@ /* * This file is part of libbluray - * Copyright (C) 2014 Petri Hintukainen <[email protected]> + * Copyright (C) 2014-2017 Petri Hintukainen <[email protected]> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -102,6 +102,9 @@ BD_PRIVATE struct bd_file_s *disc_open_stream(BD_DISC *disc, const char *file); BD_PRIVATE int disc_property_put(BD_DISC *disc, const char *property, const char *value); BD_PRIVATE char *disc_property_get(BD_DISC *disc, const char *property); +/* "Known" playlists */ +#define DISC_PROPERTY_PLAYLISTS "Playlists" + /* * */ diff --git a/src/util/strutl.c b/src/util/strutl.c index 4712373e..9669fef7 100644 --- a/src/util/strutl.c +++ b/src/util/strutl.c @@ -1,6 +1,7 @@ /* * This file is part of libbluray * Copyright (C) 2009-2010 John Stebbins + * Copyright (C) 2011-2017 Petri Hintukainen <[email protected]> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -118,3 +119,23 @@ char *str_print_hex(char *out, const uint8_t *buf, int count) return out; } + +const char *str_strcasestr(const char *haystack, const char *needle) +{ + const char *result = NULL; + + char *h = str_dup(haystack); + char *n = str_dup(needle); + if (h && n) { + str_tolower(h); + str_tolower(n); + result = strstr(h, n); + if (result) { + result = haystack + (result - h); + } + } + + X_FREE(h); + X_FREE(n); + return result; +} diff --git a/src/util/strutl.h b/src/util/strutl.h index b512655f..dbd5e1c3 100644 --- a/src/util/strutl.h +++ b/src/util/strutl.h @@ -1,6 +1,7 @@ /* * This file is part of libbluray * Copyright (C) 2009-2010 John Stebbins + * Copyright (C) 2011-2017 Petri Hintukainen <[email protected]> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -32,4 +33,6 @@ BD_PRIVATE void str_tolower(char *s); BD_PRIVATE char * str_print_hex(char *out, const uint8_t *str, int count); +BD_PRIVATE const char *str_strcasestr(const char *haystack, const char *needle); + #endif // STRUTL_H_ _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
