oggvorbisdec: add support for embedded cover art

Signed-off-by: James Almer <jamrial@gmail.com>
pull/37/merge
James Almer 12 years ago committed by Anton Khirnov
parent 601d6228c4
commit c18375ec80
  1. 3
      libavformat/Makefile
  2. 28
      libavformat/oggparsevorbis.c

@ -218,7 +218,8 @@ OBJS-$(CONFIG_OGG_DEMUXER) += oggdec.o \
oggparsespeex.o \ oggparsespeex.o \
oggparsetheora.o \ oggparsetheora.o \
oggparsevorbis.o \ oggparsevorbis.o \
vorbiscomment.o vorbiscomment.o \
flac_picture.o
OBJS-$(CONFIG_OGG_MUXER) += oggenc.o \ OBJS-$(CONFIG_OGG_MUXER) += oggenc.o \
vorbiscomment.o vorbiscomment.o
OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o

@ -25,12 +25,14 @@
#include <stdlib.h> #include <stdlib.h>
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "libavutil/base64.h"
#include "libavutil/bswap.h" #include "libavutil/bswap.h"
#include "libavutil/dict.h" #include "libavutil/dict.h"
#include "libavcodec/bytestream.h" #include "libavcodec/bytestream.h"
#include "libavcodec/get_bits.h" #include "libavcodec/get_bits.h"
#include "libavcodec/vorbis_parser.h" #include "libavcodec/vorbis_parser.h"
#include "avformat.h" #include "avformat.h"
#include "flac_picture.h"
#include "internal.h" #include "internal.h"
#include "oggdec.h" #include "oggdec.h"
#include "vorbiscomment.h" #include "vorbiscomment.h"
@ -130,7 +132,31 @@ int ff_vorbis_comment(AVFormatContext *as, AVDictionary **m,
memcpy(ct, v, vl); memcpy(ct, v, vl);
ct[vl] = 0; ct[vl] = 0;
if (!ogm_chapter(as, tt, ct)) /* The format in which the pictures are stored is the FLAC format.
* Xiph says: "The binary FLAC picture structure is base64 encoded
* and placed within a VorbisComment with the tag name
* 'METADATA_BLOCK_PICTURE'. This is the preferred and
* recommended way of embedding cover art within VorbisComments."
*/
if (!strcmp(tt, "METADATA_BLOCK_PICTURE")) {
int ret;
char *pict = av_malloc(vl);
if (!pict) {
av_freep(&tt);
av_freep(&ct);
return AVERROR(ENOMEM);
}
if ((ret = av_base64_decode(pict, ct, vl)) > 0)
ret = ff_flac_parse_picture(as, pict, ret);
av_freep(&tt);
av_freep(&ct);
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_set(m, tt, ct,
AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_KEY |
AV_DICT_DONT_STRDUP_VAL); AV_DICT_DONT_STRDUP_VAL);

Loading…
Cancel
Save