[libbluray-devel] Improve libmmbd compatibility

npzacs git at videolan.org
Wed Feb 24 11:46:10 CET 2016


libbluray | branch: master | npzacs <npzacs at gmail.com> | Mon Feb  8 16:33:39 2016 +0200| [1c68b379790b174781f03128d365f182e0552661] | committer: npzacs

Improve libmmbd compatibility

libmmbd AACS can't be used with libbdplus.
Force libmmbd BD+ if libmmbd is used for AACS.

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=1c68b379790b174781f03128d365f182e0552661
---

 src/libbluray/disc/bdplus.c |   43 +++++++++++++++++++++++++++++++++++++++----
 1 file changed, 39 insertions(+), 4 deletions(-)

diff --git a/src/libbluray/disc/bdplus.c b/src/libbluray/disc/bdplus.c
index 4f08084..ad98517 100644
--- a/src/libbluray/disc/bdplus.c
+++ b/src/libbluray/disc/bdplus.c
@@ -46,6 +46,8 @@ struct bd_bdplus {
 
     /* old API */
     fptr_p_void    title;
+
+    int impl_id;
 };
 
 
@@ -85,7 +87,11 @@ int libbdplus_required(void *have_file_handle, int (*have_file)(void *, const ch
     return 0;
 }
 
-static void *_libbdplus_open(void)
+#define IMPL_USER       0
+#define IMPL_LIBBDPLUS  1
+#define IMPL_LIBMMBD    2
+
+static void *_libbdplus_open(int *impl_id)
 {
     const char * const libbdplus[] = {
       getenv("LIBBDPLUS_PATH"),
@@ -94,10 +100,11 @@ static void *_libbdplus_open(void)
     };
     unsigned ii;
 
-    for (ii = 0; ii < sizeof(libbdplus) / sizeof(libbdplus[0]); ii++) {
+    for (ii = *impl_id; ii < sizeof(libbdplus) / sizeof(libbdplus[0]); ii++) {
         if (libbdplus[ii]) {
             void *handle = dl_dlopen(libbdplus[ii], "0");
             if (handle) {
+                *impl_id = ii;
                 BD_DEBUG(DBG_BLURAY, "Using %s for BD+\n", libbdplus[ii]);
                 return handle;
             }
@@ -108,16 +115,17 @@ static void *_libbdplus_open(void)
     return NULL;
 }
 
-BD_BDPLUS *libbdplus_load(void)
+static BD_BDPLUS *_load(int impl_id)
 {
     BD_BDPLUS *p = calloc(1, sizeof(BD_BDPLUS));
     if (!p) {
         return NULL;
     }
+    p->impl_id = impl_id;
 
     BD_DEBUG(DBG_BDPLUS, "attempting to load libbdplus\n");
 
-    p->h_libbdplus = _libbdplus_open();
+    p->h_libbdplus = _libbdplus_open(&p->impl_id);
     if (!p->h_libbdplus) {
         X_FREE(p);
         return NULL;
@@ -148,6 +156,11 @@ BD_BDPLUS *libbdplus_load(void)
     return p;
 }
 
+BD_BDPLUS *libbdplus_load()
+{
+    return _load(0);
+}
+
 int libbdplus_init(BD_BDPLUS *p, const char *root,
                    void *file_open_handle, void *file_open_fp,
                    const uint8_t *vid, const uint8_t *mk)
@@ -157,6 +170,28 @@ int libbdplus_init(BD_BDPLUS *p, const char *root,
 
     _libbdplus_close(p);
 
+    /* force libmmbd BD+ if no AACS media key:
+     * - libbdplus requires media key
+     * - libmmbd does not export media key
+     *   (=> libbdplus won't work with libmmbd AACS)
+     */
+    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)) {
+                /* succeed - swap implementations */
+                _unload(p);
+                *p = *p2;
+                X_FREE(p2);
+                return 0;
+            }
+            /* failed - continue with original bd+ implementation */
+            libbdplus_unload(&p2);
+        }
+    }
+
+    /* */
+
     *(void **)(&bdplus_init) = dl_dlsym(p->h_libbdplus, "bdplus_init");
     *(void **)(&set_fopen)   = dl_dlsym(p->h_libbdplus, "bdplus_set_fopen");
 



More information about the libbluray-devel mailing list