[easytag/wip/help: 7/18] Implement cover art support for MP4



commit db6d50178a5f1b2e80faed02638a49be89b0a96e
Author: Santtu Lakkala <inz inz fi>
Date:   Thu Apr 10 08:32:29 2014 +0300

    Implement cover art support for MP4
    
    Adds support for saving cover image into MP4 files, and show the images
    tab for them as well. Add G_BEGIN_DECLS and G_END_DECLS in picture.h.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=701506

 src/easytag.c  |    2 +-
 src/mp4_tag.cc |   51 +++++++++++++++++++++++++++++++++++++++++++++++++--
 src/picture.h  |    2 ++
 3 files changed, 52 insertions(+), 3 deletions(-)
---
diff --git a/src/easytag.c b/src/easytag.c
index 86340e6..92a5def 100644
--- a/src/easytag.c
+++ b/src/easytag.c
@@ -4139,7 +4139,7 @@ void Tag_Area_Display_Controls (ET_File *ETFile)
             gtk_widget_hide(GTK_WIDGET(URLEntry));
             gtk_widget_show (GTK_WIDGET (EncodedByLabel));
             gtk_widget_show (GTK_WIDGET (EncodedByEntry));
-            et_tag_notebook_hide_images_tab (TagNoteBook);
+            et_tag_notebook_show_images_tab (TagNoteBook);
             break;
 #endif
 
diff --git a/src/mp4_tag.cc b/src/mp4_tag.cc
index b26ef8a..2434628 100644
--- a/src/mp4_tag.cc
+++ b/src/mp4_tag.cc
@@ -171,7 +171,23 @@ gboolean Mp4tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
     /***********
      * Picture *
      ***********/
-    /* FIXME: Add picture support. */
+    const TagLib::MP4::ItemListMap extra_items = tag->itemListMap ();
+
+    if (extra_items.contains ("covr"))
+    {
+        const TagLib::MP4::Item cover = extra_items["covr"];
+        const TagLib::MP4::CoverArt &art = cover.toCoverArtList ().front ();
+
+        FileTag->picture = Picture_Allocate ();
+
+        FileTag->picture->size = art.data ().size ();
+        FileTag->picture->data = (guchar *)g_memdup (art.data ().data (),
+                                                     art.data ().size ());
+    }
+    else
+    {
+        FileTag->picture = NULL;
+    }
 
     return TRUE;
 }
@@ -344,8 +360,39 @@ gboolean Mp4tag_Write_File_Tag (ET_File *ETFile)
     /***********
      * Picture *
      ***********/
+    TagLib::MP4::ItemListMap &extra_items = tag->itemListMap ();
+
+    if (FileTag->picture)
+    {
+        Picture_Format pf;
+        TagLib::MP4::CoverArt::Format f;
+
+        pf = Picture_Format_From_Data (FileTag->picture);
+
+        switch (pf)
+        {
+            case PICTURE_FORMAT_JPEG:
+                f = TagLib::MP4::CoverArt::JPEG;
+                break;
+            case PICTURE_FORMAT_PNG:
+                f = TagLib::MP4::CoverArt::PNG;
+                break;
+            case PICTURE_FORMAT_GIF:
+                f = TagLib::MP4::CoverArt::GIF;
+                break;
+            default:
+                g_critical ("Unknown format");
+                f = TagLib::MP4::CoverArt::JPEG;
+                break;
+        }
+
+        TagLib::MP4::CoverArt art (f, TagLib::ByteVector((char *)FileTag->picture->data,
+                                                         FileTag->picture->size));
+
+        extra_items.insert ("covr",
+                            TagLib::MP4::Item (TagLib::MP4::CoverArtList ().append (art)));
+    }
 
-    /* FIXME: Add picture support. */
     tag->setProperties (fields);
     success = mp4file.save () ? TRUE : FALSE;
 
diff --git a/src/picture.h b/src/picture.h
index 14224fd..caf5616 100644
--- a/src/picture.h
+++ b/src/picture.h
@@ -24,6 +24,7 @@
 
 #include "et_core.h"
 
+G_BEGIN_DECLS
 
 /***************
  * Declaration *
@@ -126,5 +127,6 @@ const gchar   *Picture_Mime_Type_String (Picture_Format format);
 gboolean Picture_Entry_View_Button_Pressed (GtkTreeView *treeview, GdkEventButton *event, gpointer data);
 gboolean Picture_Entry_View_Key_Pressed    (GtkTreeView *treeview, GdkEvent *event, gpointer data);
 
+G_END_DECLS
 
 #endif /* __PICTURE_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]