Parse IFF metadata.
Patch by Sebastian Vater, cdgs D basty A googlemail Originally committed as revision 23024 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
cfdaee45d1
commit
8af7dbce61
@ -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)
|
static int iff_probe(AVProbeData *p)
|
||||||
{
|
{
|
||||||
const uint8_t *d = p->buf;
|
const uint8_t *d = p->buf;
|
||||||
@ -110,7 +129,6 @@ static int iff_read_header(AVFormatContext *s,
|
|||||||
AVStream *st;
|
AVStream *st;
|
||||||
uint32_t chunk_id, data_size;
|
uint32_t chunk_id, data_size;
|
||||||
int compression = -1;
|
int compression = -1;
|
||||||
char *buf;
|
|
||||||
|
|
||||||
st = av_new_stream(s, 0);
|
st = av_new_stream(s, 0);
|
||||||
if (!st)
|
if (!st)
|
||||||
@ -123,6 +141,8 @@ static int iff_read_header(AVFormatContext *s,
|
|||||||
|
|
||||||
while(!url_feof(pb)) {
|
while(!url_feof(pb)) {
|
||||||
uint64_t orig_pos;
|
uint64_t orig_pos;
|
||||||
|
int res;
|
||||||
|
const char *metadata_tag = NULL;
|
||||||
chunk_id = get_le32(pb);
|
chunk_id = get_le32(pb);
|
||||||
data_size = get_be32(pb);
|
data_size = get_be32(pb);
|
||||||
orig_pos = url_ftell(pb);
|
orig_pos = url_ftell(pb);
|
||||||
@ -181,15 +201,29 @@ static int iff_read_header(AVFormatContext *s,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_ANNO:
|
case ID_ANNO:
|
||||||
buf = av_malloc(data_size + 1);
|
case ID_TEXT:
|
||||||
if (!buf)
|
metadata_tag = "comment";
|
||||||
break;
|
break;
|
||||||
get_buffer(pb, buf, data_size);
|
|
||||||
buf[data_size] = 0;
|
case ID_AUTH:
|
||||||
av_metadata_set2(&s->metadata, "comment", buf, AV_METADATA_DONT_STRDUP_VAL);
|
metadata_tag = "artist";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ID_COPYRIGHT:
|
||||||
|
metadata_tag = "copyright";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ID_NAME:
|
||||||
|
metadata_tag = "title";
|
||||||
break;
|
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));
|
url_fskip(pb, data_size - (url_ftell(pb) - orig_pos) + (data_size & 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user