libbluray | branch: master | ace20022 <[email protected]> | Fri Sep 19 16:00:06 2014 +0200| [0141be514756a8c5243983c5c0bd01c327ddda0f] | committer: hpi1
Add the possibility to set the persistent/cache root path via bd_set_player_setting_str() > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=0141be514756a8c5243983c5c0bd01c327ddda0f --- ChangeLog | 1 + src/libbluray/bdj/bdj.c | 22 +++++++++++++++------- src/libbluray/bdj/bdj.h | 8 +++++++- src/libbluray/bluray.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- src/libbluray/bluray.h | 2 ++ 5 files changed, 69 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index d773b69..f0cca99 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ - Fix animations in some BD-J menus. +- Add player setting for persistent/cache root path. 2014-09-03: Version 0.6.2 - Fix possible subtitle corruption after seek. diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c index c54e7ee..d57776c 100644 --- a/src/libbluray/bdj/bdj.c +++ b/src/libbluray/bdj/bdj.c @@ -254,10 +254,14 @@ static const char *_find_libbluray_jar(void) return classpath; } -static const char *_bdj_persistent_root(void) +static const char *_bdj_persistent_root(BDJ_STORAGE *storage) { static const char *root = NULL; + if (storage && storage->persistent_root) { + return storage->persistent_root; + } + if (root) { return root; } @@ -278,10 +282,14 @@ static const char *_bdj_persistent_root(void) return root; } -static const char *_bdj_buda_root(void) +static const char *_bdj_buda_root(BDJ_STORAGE *storage) { static const char *root = NULL; + if (storage && storage->cache_root) { + return storage->cache_root; + } + if (root) { return root; } @@ -383,7 +391,7 @@ static int _find_jvm(void *jvm_lib, JNIEnv **env, JavaVM **jvm) return 0; } -static int _create_jvm(void *jvm_lib, const char *java_home, JNIEnv **env, JavaVM **jvm) +static int _create_jvm(void *jvm_lib, const char *java_home, JNIEnv **env, JavaVM **jvm, BDJ_STORAGE *storage) { (void)java_home; /* used only with J2ME */ @@ -396,8 +404,8 @@ static int _create_jvm(void *jvm_lib, const char *java_home, JNIEnv **env, JavaV JavaVMOption* option = calloc(1, sizeof(JavaVMOption) * 20); int n = 0; JavaVMInitArgs args; - option[n++].optionString = str_printf("-Ddvb.persistent.root=%s", _bdj_persistent_root()); - option[n++].optionString = str_printf("-Dbluray.bindingunit.root=%s", _bdj_buda_root()); + option[n++].optionString = str_printf("-Ddvb.persistent.root=%s", _bdj_persistent_root(storage)); + option[n++].optionString = str_printf("-Dbluray.bindingunit.root=%s", _bdj_buda_root(storage)); option[n++].optionString = str_dup ("-Dawt.toolkit=java.awt.BDToolkit"); option[n++].optionString = str_dup ("-Djava.awt.graphicsenv=java.awt.BDGraphicsEnvironment"); @@ -452,7 +460,7 @@ static int _create_jvm(void *jvm_lib, const char *java_home, JNIEnv **env, JavaV } BDJAVA* bdj_open(const char *path, struct bluray *bd, - bdj_overlay_cb osd_cb, struct bd_argb_buffer_s *buf) + bdj_overlay_cb osd_cb, struct bd_argb_buffer_s *buf, BDJ_STORAGE *storage) { BD_DEBUG(DBG_BDJ, "bdj_open()\n"); @@ -467,7 +475,7 @@ BDJAVA* bdj_open(const char *path, struct bluray *bd, JNIEnv* env = NULL; JavaVM *jvm = NULL; - if (!_find_jvm(jvm_lib, &env, &jvm) && !_create_jvm(jvm_lib, java_home, &env, &jvm)) { + if (!_find_jvm(jvm_lib, &env, &jvm) && !_create_jvm(jvm_lib, java_home, &env, &jvm, storage)) { dl_dlclose(jvm_lib); return NULL; } diff --git a/src/libbluray/bdj/bdj.h b/src/libbluray/bdj/bdj.h index a177510..721c02f 100644 --- a/src/libbluray/bdj/bdj.h +++ b/src/libbluray/bdj/bdj.h @@ -42,6 +42,11 @@ typedef enum { BDJ_EVENT_RATE, } BDJ_EVENT; +typedef struct { + char *persistent_root; + char *cache_root; +} BDJ_STORAGE; + /* bdj_get_uo_mask() */ #define BDJ_MENU_CALL_MASK 0x01 #define BDJ_TITLE_SEARCH_MASK 0x02 @@ -55,7 +60,8 @@ typedef void (*bdj_overlay_cb)(struct bluray *, const unsigned *, int, int, int, int, int, int); BD_PRIVATE BDJAVA* bdj_open(const char *path, struct bluray *bd, - bdj_overlay_cb osd_cb, struct bd_argb_buffer_s *buf); + bdj_overlay_cb osd_cb, struct bd_argb_buffer_s *buf, + BDJ_STORAGE *storage); BD_PRIVATE void bdj_close(BDJAVA *bdjava); BD_PRIVATE int bdj_process_event(BDJAVA *bdjava, unsigned ev, unsigned param); BD_PRIVATE int bdj_get_uo_mask(BDJAVA *bdjava); diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c index 320f009..c750b18 100644 --- a/src/libbluray/bluray.c +++ b/src/libbluray/bluray.c @@ -159,6 +159,7 @@ struct bluray { uint8_t hdmv_suspended; #ifdef USING_BDJAVA BDJAVA *bdjava; + BDJ_STORAGE *bdjstorage; #endif /* delayed sending of BDJ_EVENT_END_OF_PLAYLIST: * 1 - message pending. 3 - message sent. */ @@ -1236,7 +1237,7 @@ static int _start_bdj(BLURAY *bd, unsigned title) { #ifdef USING_BDJAVA if (bd->bdjava == NULL) { - bd->bdjava = bdj_open(bd->device_path, bd, _bdj_osd_cb, bd->argb_buffer); + bd->bdjava = bdj_open(bd->device_path, bd, _bdj_osd_cb, bd->argb_buffer, bd->bdjstorage); if (!bd->bdjava) { return 0; } @@ -1283,6 +1284,19 @@ static void _close_bdj(BLURAY *bd) #define _close_bdj(bd) do{}while(0) #endif +#ifdef USING_BDJAVA +static void _storage_free(BLURAY *bd) +{ + if (bd->bdjstorage){ + X_FREE(bd->bdjstorage->cache_root); + X_FREE(bd->bdjstorage->persistent_root); + X_FREE(bd->bdjstorage); + } +} +#else +#define _storage_free(bd) do{}while(0) +#endif + #ifdef HAVE_MNTENT_H /* * Replace device node (/dev/sr0) by mount point @@ -1423,6 +1437,7 @@ void bd_close(BLURAY *bd) _free_event_queue(bd); X_FREE(bd->device_path); array_free((void**)&bd->titles); + _storage_free(bd); bd_mutex_destroy(&bd->mutex); @@ -2588,6 +2603,34 @@ int bd_set_player_setting_str(BLURAY *bd, uint32_t idx, const char *s) case BLURAY_PLAYER_SETTING_COUNTRY_CODE: return bd_set_player_setting(bd, idx, str_to_uint32(s, 2)); +#ifdef USING_BDJAVA + case BLURAY_PLAYER_CACHE_ROOT: + case BLURAY_PLAYER_PERSISTENT_ROOT: + if (!bd->bdjstorage) { + bd->bdjstorage = calloc(1, sizeof(BDJ_STORAGE)); + } + switch (idx) { + case BLURAY_PLAYER_CACHE_ROOT: + if (bd->bdjstorage) { + X_FREE(bd->bdjstorage->cache_root); + bd->bdjstorage->cache_root = str_dup(s); + BD_DEBUG(DBG_BDJ, "Cache root dir set to %s\n", bd->bdjstorage->cache_root); + return 1; + } + else + return 0; + + case BLURAY_PLAYER_PERSISTENT_ROOT: + if (bd->bdjstorage) { + X_FREE(bd->bdjstorage->persistent_root); + bd->bdjstorage->persistent_root = str_dup(s); + BD_DEBUG(DBG_BDJ, "Persistent root dir set to %s\n", bd->bdjstorage->persistent_root); + return 1; + } + else + return 0; + } +#endif /* USING_BDJAVA */ default: return 0; } diff --git a/src/libbluray/bluray.h b/src/libbluray/bluray.h index 54f4df7..e89ab39 100644 --- a/src/libbluray/bluray.h +++ b/src/libbluray/bluray.h @@ -561,6 +561,8 @@ typedef enum { BLURAY_PLAYER_SETTING_PLAYER_PROFILE = 31, /* Profile1: 0, Profile1+: 1, Profile2: 3, Profile3: 8 */ BLURAY_PLAYER_SETTING_DECODE_PG = 0x100, /* enable/disable PG (subtitle) decoder */ + BLURAY_PLAYER_PERSISTENT_ROOT = 400, /* Root path (string) to the BD_J persistent storage location */ + BLURAY_PLAYER_CACHE_ROOT = 401, /* Root path (string) to the BD_J cache storage location */ } bd_player_setting; /** _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
