vorbiscomment: Add support for embedded cover art
authorJames Almer <jamrial@gmail.com>
Tue, 9 Jul 2013 05:39:10 +0000 (02:39 -0300)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 9 Jul 2013 17:21:23 +0000 (19:21 +0200)
Fixes ticket #2655

Signed-off-by: James Almer <jamrial@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/Makefile
libavformat/oggparsevorbis.c

index 2a6173c..3c4a3c8 100644 (file)
@@ -256,7 +256,8 @@ OBJS-$(CONFIG_OGG_DEMUXER)               += oggdec.o         \
                                             oggparsespeex.o  \
                                             oggparsetheora.o \
                                             oggparsevorbis.o \
-                                            vorbiscomment.o
+                                            vorbiscomment.o  \
+                                            flacdec_picture.o
 OBJS-$(CONFIG_OGG_MUXER)                 += oggenc.o \
                                             vorbiscomment.o
 OBJS-$(CONFIG_OMA_DEMUXER)               += omadec.o pcm.o oma.o
index da029a4..a21b3a9 100644 (file)
 
 #include <stdlib.h>
 #include "libavutil/avstring.h"
+#include "libavutil/base64.h"
 #include "libavutil/bswap.h"
 #include "libavutil/dict.h"
 #include "libavcodec/get_bits.h"
 #include "libavcodec/bytestream.h"
 #include "libavcodec/vorbis_parser.h"
 #include "avformat.h"
+#include "flacdec.h"
 #include "internal.h"
 #include "oggdec.h"
 #include "vorbiscomment.h"
@@ -128,7 +130,22 @@ ff_vorbis_comment(AVFormatContext * as, AVDictionary **m, const uint8_t *buf, in
             memcpy(ct, v, vl);
             ct[vl] = 0;
 
-            if (!ogm_chapter(as, tt, ct))
+            if (!strcmp(tt, "METADATA_BLOCK_PICTURE")) {
+                int ret;
+                char *pict = av_malloc(vl);
+
+                if (!pict) {
+                    av_log(as, AV_LOG_WARNING, "out-of-memory error. Skipping cover art block.\n");
+                    continue;
+                }
+                if ((ret = av_base64_decode(pict, ct, vl)) > 0)
+                    ret = ff_flac_parse_picture(as, pict, ret);
+                av_freep(&pict);
+                if (ret < 0) {
+                    av_log(as, AV_LOG_WARNING, "Failed to parse cover art block.\n");
+                    continue;
+                }
+            } else if (!ogm_chapter(as, tt, ct))
                 av_dict_set(m, tt, ct,
                                    AV_DICT_DONT_STRDUP_KEY |
                                    AV_DICT_DONT_STRDUP_VAL);