diff options
author | Anssi Hannula <anssi.hannula@iki.fi> | 2013-12-30 10:09:17 +0200 |
---|---|---|
committer | Anssi Hannula <anssi.hannula@iki.fi> | 2013-12-31 03:18:53 +0200 |
commit | 53765ae33b8b0baaebd1914b165bb26fb6122176 (patch) | |
tree | 1ed64a8a13f7c2146507a2bafe4d8875d9b3b9b3 /libavformat/id3v2.c | |
parent | 4a4437c0fbc8f7afe0c533070395a42e56b4ee75 (diff) | |
download | ffmpeg-53765ae33b8b0baaebd1914b165bb26fb6122176.tar.gz |
avformat/id3v2: parse ID3 Private frames as extra metadata
They are used in HLS.
Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
Diffstat (limited to 'libavformat/id3v2.c')
-rw-r--r-- | libavformat/id3v2.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index 3eb368e918..54c85d13b6 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -570,6 +570,51 @@ end: av_free(dst); } +static void free_priv(void *obj) +{ + ID3v2ExtraMetaPRIV *priv = obj; + av_freep(&priv->owner); + av_freep(&priv->data); + av_freep(&priv); +} + +static void read_priv(AVFormatContext *s, AVIOContext *pb, int taglen, + char *tag, ID3v2ExtraMeta **extra_meta, int isv34) +{ + ID3v2ExtraMeta *meta; + ID3v2ExtraMetaPRIV *priv; + + meta = av_mallocz(sizeof(*meta)); + priv = av_mallocz(sizeof(*priv)); + + if (!meta || !priv) + goto fail; + + if (decode_str(s, pb, ID3v2_ENCODING_ISO8859, &priv->owner, &taglen) < 0) + goto fail; + + priv->data = av_malloc(taglen); + if (!priv->data) + goto fail; + + priv->datasize = taglen; + + if (avio_read(pb, priv->data, priv->datasize) != priv->datasize) + goto fail; + + meta->tag = "PRIV"; + meta->data = priv; + meta->next = *extra_meta; + *extra_meta = meta; + + return; + +fail: + if (priv) + free_priv(priv); + av_freep(&meta); +} + typedef struct ID3v2EMFunc { const char *tag3; const char *tag4; @@ -582,6 +627,7 @@ static const ID3v2EMFunc id3v2_extra_meta_funcs[] = { { "GEO", "GEOB", read_geobtag, free_geobtag }, { "PIC", "APIC", read_apic, free_apic }, { "CHAP","CHAP", read_chapter, NULL }, + { "PRIV","PRIV", read_priv, free_priv }, { NULL } }; |