mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avformat/id3v2: parse ID3 Private frames as extra metadata
They are used in HLS. Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
This commit is contained in:
parent
4a4437c0fb
commit
53765ae33b
@ -570,6 +570,51 @@ end:
|
|||||||
av_free(dst);
|
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 {
|
typedef struct ID3v2EMFunc {
|
||||||
const char *tag3;
|
const char *tag3;
|
||||||
const char *tag4;
|
const char *tag4;
|
||||||
@ -582,6 +627,7 @@ static const ID3v2EMFunc id3v2_extra_meta_funcs[] = {
|
|||||||
{ "GEO", "GEOB", read_geobtag, free_geobtag },
|
{ "GEO", "GEOB", read_geobtag, free_geobtag },
|
||||||
{ "PIC", "APIC", read_apic, free_apic },
|
{ "PIC", "APIC", read_apic, free_apic },
|
||||||
{ "CHAP","CHAP", read_chapter, NULL },
|
{ "CHAP","CHAP", read_chapter, NULL },
|
||||||
|
{ "PRIV","PRIV", read_priv, free_priv },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -73,6 +73,12 @@ typedef struct ID3v2ExtraMetaAPIC {
|
|||||||
enum AVCodecID id;
|
enum AVCodecID id;
|
||||||
} ID3v2ExtraMetaAPIC;
|
} ID3v2ExtraMetaAPIC;
|
||||||
|
|
||||||
|
typedef struct ID3v2ExtraMetaPRIV {
|
||||||
|
uint8_t *owner;
|
||||||
|
uint8_t *data;
|
||||||
|
uint32_t datasize;
|
||||||
|
} ID3v2ExtraMetaPRIV;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detect ID3v2 Header.
|
* Detect ID3v2 Header.
|
||||||
* @param buf must be ID3v2_HEADER_SIZE byte long
|
* @param buf must be ID3v2_HEADER_SIZE byte long
|
||||||
|
Loading…
Reference in New Issue
Block a user