|
|
@ -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); |
|
|
|