[vlc-devel] [PATCH] bluray: use input attachment for album art

Petri Hintukainen phintuka at gmail.com
Fri Oct 16 18:03:57 CEST 2015


---
 modules/access/bluray.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 68 insertions(+), 2 deletions(-)

diff --git a/modules/access/bluray.c b/modules/access/bluray.c
index f2b9d3a..85c3754 100644
--- a/modules/access/bluray.c
+++ b/modules/access/bluray.c
@@ -137,6 +137,11 @@ struct  demux_sys_t
     BLURAY_TITLE_INFO      *p_pl_info;
     const BLURAY_CLIP_INFO *p_clip_info;
 
+    /* Attachments */
+    int                 i_attachments;
+    input_attachment_t  **attachments;
+    int                 i_cover_idx;
+
     /* Meta information */
     const META_DL       *p_meta;
 
@@ -419,6 +424,38 @@ static void setTitleInfo(demux_sys_t *p_sys, BLURAY_TITLE_INFO *info)
 }
 
 /*****************************************************************************
+ * create input attachment for thumbnail
+ *****************************************************************************/
+
+static void attachThumbnail(demux_t *p_demux)
+{
+    demux_sys_t *p_sys = p_demux->p_sys;
+
+    if (!p_sys->p_meta)
+        return;
+
+#if BLURAY_VERSION >= BLURAY_VERSION_CODE(0,9,0)
+    if (p_sys->p_meta->thumb_count > 0 && p_sys->p_meta->thumbnails) {
+        int64_t size;
+        void *data;
+        if (bd_get_meta_file(p_sys->bluray, p_sys->p_meta->thumbnails[0].path, &data, &size) > 0) {
+            char psz_name[64];
+            input_attachment_t *p_attachment;
+
+            snprintf(psz_name, sizeof(psz_name), "picture%d_%s", p_sys->i_attachments, p_sys->p_meta->thumbnails[0].path);
+
+            p_attachment = vlc_input_attachment_New(psz_name, NULL, "Album art", data, size);
+            if (p_attachment) {
+                p_sys->i_cover_idx = p_sys->i_attachments;
+                TAB_APPEND(p_sys->i_attachments, p_sys->attachments, p_attachment);
+            }
+        }
+        free(data);
+    }
+#endif
+}
+
+/*****************************************************************************
  * blurayOpen: module init function
  *****************************************************************************/
 static int blurayOpen(vlc_object_t *object)
@@ -450,6 +487,7 @@ static int blurayOpen(vlc_object_t *object)
     p_demux->info.i_seekpoint = 0;
 
     TAB_INIT(p_sys->i_title, p_sys->pp_title);
+    TAB_INIT(p_sys->i_attachments, p_sys->attachments);
 
     /* store current bd path */
     if (p_demux->psz_file)
@@ -537,6 +575,9 @@ static int blurayOpen(vlc_object_t *object)
     if (!p_sys->p_meta)
         msg_Warn(p_demux, "Failed to get meta info.");
 
+    p_sys->i_cover_idx = -1;
+    attachThumbnail(p_demux);
+
     p_sys->b_menu = var_InheritBool(p_demux, "bluray-menu");
 
     blurayInitTitles(p_demux, disc_info->num_hdmv_titles + disc_info->num_bdj_titles + 1/*Top Menu*/ + 1/*First Play*/);
@@ -628,6 +669,10 @@ static void blurayClose(vlc_object_t *object)
         vlc_input_title_Delete(p_sys->pp_title[i]);
     TAB_CLEAN(p_sys->i_title, p_sys->pp_title);
 
+    for (int i = 0; i < p_sys->i_attachments; i++)
+      vlc_input_attachment_Delete(p_sys->attachments[i]);
+    TAB_CLEAN(p_sys->i_attachments, p_sys->attachments);
+
     vlc_mutex_destroy(&p_sys->pl_info_lock);
     vlc_mutex_destroy(&p_sys->bdj_overlay_lock);
 
@@ -1510,7 +1555,13 @@ static int blurayControl(demux_t *p_demux, int query, va_list args)
         // if (meta->di_set_number > 0) vlc_meta_SetTrackNum(p_meta, meta->di_set_number);
         // if (meta->di_num_sets > 0) vlc_meta_AddExtra(p_meta, "Discs numbers in Set", meta->di_num_sets);
 
-        if (meta->thumb_count > 0 && meta->thumbnails) {
+        if (p_sys->i_cover_idx >= 0 && p_sys->i_cover_idx < p_sys->i_attachments) {
+            char psz_url[128];
+            snprintf( psz_url, sizeof(psz_url), "attachment://%s",
+                      p_sys->attachments[p_sys->i_cover_idx]->psz_name );
+            vlc_meta_Set( p_meta, vlc_meta_ArtworkURL, psz_url );
+        }
+        else if (meta->thumb_count > 0 && meta->thumbnails) {
             char *psz_thumbpath;
             if (asprintf(&psz_thumbpath, "%s" DIR_SEP "BDMV" DIR_SEP "META" DIR_SEP "DL" DIR_SEP "%s",
                           p_sys->psz_bd_path, meta->thumbnails[0].path) > 0) {
@@ -1529,6 +1580,22 @@ static int blurayControl(demux_t *p_demux, int query, va_list args)
         return VLC_SUCCESS;
     }
 
+    case DEMUX_GET_ATTACHMENTS:
+    {
+        input_attachment_t ***ppp_attach =
+            (input_attachment_t ***)va_arg(args, input_attachment_t ***);
+        int *pi_int = (int *)va_arg(args, int *);
+
+        if (p_sys->i_attachments <= 0)
+            return VLC_EGENERIC;
+
+        *pi_int = p_sys->i_attachments;
+        *ppp_attach = xmalloc(sizeof(input_attachment_t *) * p_sys->i_attachments);
+        for (int i = 0; i < p_sys->i_attachments; i++)
+            (*ppp_attach)[i] = vlc_input_attachment_Duplicate(p_sys->attachments[i]);
+        return VLC_SUCCESS;
+    }
+
     case DEMUX_NAV_ACTIVATE:
         if (p_sys->b_popup_available && !p_sys->b_menu_open) {
             return sendKeyEvent(p_sys, BD_VK_POPUP);
@@ -1547,7 +1614,6 @@ static int blurayControl(demux_t *p_demux, int query, va_list args)
     case DEMUX_GET_FPS:
     case DEMUX_SET_GROUP:
     case DEMUX_HAS_UNSUPPORTED_META:
-    case DEMUX_GET_ATTACHMENTS:
         return VLC_EGENERIC;
     default:
         msg_Warn(p_demux, "unimplemented query (%d) in control", query);
-- 
2.1.4



More information about the vlc-devel mailing list