diff options
author | Sebastian Vater <cdgs.basty@googlemail.com> | 2010-05-05 21:26:59 +0400 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@rainbow.studorg.tuwien.ac.at> | 2010-05-05 21:26:59 +0400 |
commit | 8af7dbce61711c61c90dc8c2acec28fb7b4b77f0 (patch) | |
tree | 1669b028a255db0756ddb0993fbd9f28f7f0c4a4 | |
parent | cfdaee45d1d279ac2dcedef8abb00f1768488e38 (diff) |
Parse IFF metadata.
Patch by Sebastian Vater, cdgs D basty A googlemail
Originally committed as revision 23024 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/iff.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/libavformat/iff.c b/libavformat/iff.c index db74b8dc96..7e3f3ad33b 100644 --- a/libavformat/iff.c +++ b/libavformat/iff.c @@ -92,6 +92,25 @@ static void interleave_stereo(const uint8_t *src, uint8_t *dest, int size) } } +/* Metadata string read */ +static int get_metadata(AVFormatContext *s, + const char *const tag, + const unsigned data_size) +{ + uint8_t *buf = ((data_size + 1) == 0) ? NULL : av_malloc(data_size + 1); + + if (!buf) + return AVERROR(ENOMEM); + + if (get_buffer(s->pb, buf, data_size) < 0) { + av_free(buf); + return AVERROR(EIO); + } + buf[data_size] = 0; + av_metadata_set2(&s->metadata, tag, buf, AV_METADATA_DONT_STRDUP_VAL); + return 0; +} + static int iff_probe(AVProbeData *p) { const uint8_t *d = p->buf; @@ -110,7 +129,6 @@ static int iff_read_header(AVFormatContext *s, AVStream *st; uint32_t chunk_id, data_size; int compression = -1; - char *buf; st = av_new_stream(s, 0); if (!st) @@ -123,6 +141,8 @@ static int iff_read_header(AVFormatContext *s, while(!url_feof(pb)) { uint64_t orig_pos; + int res; + const char *metadata_tag = NULL; chunk_id = get_le32(pb); data_size = get_be32(pb); orig_pos = url_ftell(pb); @@ -181,15 +201,29 @@ static int iff_read_header(AVFormatContext *s, break; case ID_ANNO: - buf = av_malloc(data_size + 1); - if (!buf) - break; - get_buffer(pb, buf, data_size); - buf[data_size] = 0; - av_metadata_set2(&s->metadata, "comment", buf, AV_METADATA_DONT_STRDUP_VAL); + case ID_TEXT: + metadata_tag = "comment"; + break; + + case ID_AUTH: + metadata_tag = "artist"; + break; + + case ID_COPYRIGHT: + metadata_tag = "copyright"; + break; + + case ID_NAME: + metadata_tag = "title"; break; } + if (metadata_tag) { + if ((res = get_metadata(s, metadata_tag, data_size)) < 0) { + av_log(s, AV_LOG_ERROR, "iff: cannot allocate metadata tag %s!", metadata_tag); + return res; + } + } url_fskip(pb, data_size - (url_ftell(pb) - orig_pos) + (data_size & 1)); } |