libbluray | branch: master | npzacs <[email protected]> | Sun Jul 3 13:47:15 2016 +0300| [a8ea94802b040ecbad69f581c50a08513bc389b3] | committer: npzacs
disc: support unmounted discs with libmmbd > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=a8ea94802b040ecbad69f581c50a08513bc389b3 --- src/libbluray/disc/aacs.c | 10 ++++++++++ src/libbluray/disc/bdplus.c | 18 ++++++++++++++++-- src/libbluray/disc/bdplus.h | 2 +- src/libbluray/disc/dec.c | 2 +- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/libbluray/disc/aacs.c b/src/libbluray/disc/aacs.c index e44b5a7..1c8984d 100644 --- a/src/libbluray/disc/aacs.c +++ b/src/libbluray/disc/aacs.c @@ -30,6 +30,7 @@ #include "util/strutl.h" #include <stdlib.h> +#include <string.h> struct bd_aacs { @@ -181,6 +182,15 @@ int libaacs_open(BD_AACS *p, const char *device, } else if (open2) { BD_DEBUG(DBG_BLURAY, "Using old aacs_open2(), no UDF support available\n"); p->aacs = open2(device, keyfile_path, &error_code); + + /* libmmbd needs dev: for devices */ + if (!p->aacs && p->impl_id == IMPL_LIBMMBD && !strncmp(device, "/dev/", 5)) { + char *tmp_device = str_printf("dev:%s", device); + if (tmp_device) { + p->aacs = open2(tmp_device, keyfile_path, &error_code); + X_FREE(tmp_device); + } + } } else if (open) { BD_DEBUG(DBG_BLURAY, "Using old aacs_open(), no verbose error reporting available\n"); p->aacs = open(device, keyfile_path); diff --git a/src/libbluray/disc/bdplus.c b/src/libbluray/disc/bdplus.c index 1ec3bc2..8afe980 100644 --- a/src/libbluray/disc/bdplus.c +++ b/src/libbluray/disc/bdplus.c @@ -30,6 +30,7 @@ #include "util/strutl.h" #include <stdlib.h> +#include <string.h> struct bd_bdplus { @@ -166,7 +167,7 @@ BD_BDPLUS *libbdplus_load() return _load(0); } -int libbdplus_init(BD_BDPLUS *p, const char *root, +int libbdplus_init(BD_BDPLUS *p, const char *root, const char *device, void *file_open_handle, void *file_open_fp, const uint8_t *vid, const uint8_t *mk) { @@ -183,7 +184,7 @@ int libbdplus_init(BD_BDPLUS *p, const char *root, if (mk == NULL && p->impl_id == IMPL_LIBBDPLUS) { BD_BDPLUS *p2 = _load(IMPL_LIBMMBD); if (p2) { - if (!libbdplus_init(p2, root, file_open_handle, file_open_fp, vid, mk)) { + if (!libbdplus_init(p2, root, device, file_open_handle, file_open_fp, vid, mk)) { /* succeed - swap implementations */ _unload(p); *p = *p2; @@ -206,10 +207,23 @@ int libbdplus_init(BD_BDPLUS *p, const char *root, } if (set_fopen) { + /* New libbdplus. Use libbluray for file I/O */ p->bdplus = bdplus_init(NULL, NULL, vid); set_fopen(p->bdplus, file_open_handle, file_open_fp); } else if (root) { + /* Old libbdplus or libmmbd. Disc is mounted. */ p->bdplus = bdplus_init(root, NULL, vid); + } else if (device) { + /* Unmounted device */ + if (p->impl_id == IMPL_LIBMMBD && !strncmp(device, "/dev/", 5)) { + char *tmp = str_printf("dev:%s", device); + if (tmp) { + p->bdplus = bdplus_init(tmp, NULL, vid); + X_FREE(tmp); + } + } else { + BD_DEBUG(DBG_BLURAY | DBG_CRIT, "Too old libbdplus detected. Disc must be mounted first.\n"); + } } if (!p->bdplus) { diff --git a/src/libbluray/disc/bdplus.h b/src/libbluray/disc/bdplus.h index 6589d88..88e940c 100644 --- a/src/libbluray/disc/bdplus.h +++ b/src/libbluray/disc/bdplus.h @@ -30,7 +30,7 @@ typedef struct bd_bdplus BD_BDPLUS; BD_PRIVATE int libbdplus_required(void *have_file_handle, int (*have_file)(void *, const char *, const char *)); BD_PRIVATE BD_BDPLUS *libbdplus_load(void); BD_PRIVATE int libbdplus_is_mmbd(BD_BDPLUS *); -BD_PRIVATE int libbdplus_init(BD_BDPLUS *p, const char *root, +BD_PRIVATE int libbdplus_init(BD_BDPLUS *p, const char *root, const char *device, void *open_file_handle, void *open_file_fp, const uint8_t *vid, const uint8_t *mk); BD_PRIVATE void libbdplus_unload(BD_BDPLUS **p); diff --git a/src/libbluray/disc/dec.c b/src/libbluray/disc/dec.c index ebe2c39..e2d9ef9 100644 --- a/src/libbluray/disc/dec.c +++ b/src/libbluray/disc/dec.c @@ -219,7 +219,7 @@ static int _libbdplus_init(BD_DEC *dec, struct dec_dev *dev, return 0; } - if (libbdplus_init(dec->bdplus, dev->root, dev->file_open_bdrom_handle, (void*)dev->pf_file_open_bdrom, vid, mk)) { + if (libbdplus_init(dec->bdplus, dev->root, dev->device, dev->file_open_bdrom_handle, (void*)dev->pf_file_open_bdrom, vid, mk)) { BD_DEBUG(DBG_BLURAY | DBG_CRIT, "bdplus_init() failed\n"); i->bdplus_handled = 0; _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
