From 7601f9412a2d3387617a45966b65b452a632c27a Mon Sep 17 00:00:00 2001 From: Andrew Stone Date: Thu, 31 Jul 2014 19:56:35 -0400 Subject: http: export icecast metadata as an option with name "metadata". Signed-off-by: Anton Khirnov --- libavformat/http.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'libavformat/http.c') diff --git a/libavformat/http.c b/libavformat/http.c index b2e07b485c..d729fafc87 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -80,6 +80,7 @@ typedef struct { int icy_metaint; char *icy_metadata_headers; char *icy_metadata_packet; + AVDictionary *metadata; #if CONFIG_ZLIB int compressed; z_stream inflate_stream; @@ -107,6 +108,7 @@ static const AVOption options[] = { { "icy", "request ICY metadata", OFFSET(icy), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, D }, { "icy_metadata_headers", "return ICY metadata headers", OFFSET(icy_metadata_headers), AV_OPT_TYPE_STRING, { 0 }, 0, 0, AV_OPT_FLAG_EXPORT }, { "icy_metadata_packet", "return current ICY metadata packet", OFFSET(icy_metadata_packet), AV_OPT_TYPE_STRING, { 0 }, 0, 0, AV_OPT_FLAG_EXPORT }, + { "metadata", "metadata read from the bitstream", OFFSET(metadata), AV_OPT_TYPE_DICT, {0}, 0, 0, AV_OPT_FLAG_EXPORT }, { "auth_type", "HTTP authentication type", OFFSET(auth_state.auth_type), AV_OPT_TYPE_INT, { .i64 = HTTP_AUTH_NONE }, HTTP_AUTH_NONE, HTTP_AUTH_BASIC, D | E, "auth_type"}, { "none", "No auth method set, autodetect", 0, AV_OPT_TYPE_CONST, { .i64 = HTTP_AUTH_NONE }, 0, 0, D | E, "auth_type"}, { "basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, { .i64 = HTTP_AUTH_BASIC }, 0, 0, D | E, "auth_type"}, @@ -421,6 +423,8 @@ static int parse_icy(HTTPContext *s, const char *tag, const char *p) int is_first = !s->icy_metadata_headers; int ret; + av_dict_set(&s->metadata, tag, p, 0); + if (s->icy_metadata_headers) len += strlen(s->icy_metadata_headers); @@ -800,6 +804,32 @@ static int http_read_stream_all(URLContext *h, uint8_t *buf, int size) return pos; } +static void update_metadata(HTTPContext *s, char *data) +{ + char *key; + char *val; + char *end; + char *next = data; + + while (*next) { + key = next; + val = strstr(key, "='"); + if (!val) + break; + end = strstr(val, "';"); + if (!end) + break; + + *val = '\0'; + *end = '\0'; + val += 2; + + av_dict_set(&s->metadata, key, val, 0); + + next = end + 2; + } +} + static int store_icy(URLContext *h, int size) { HTTPContext *s = h->priv_data; @@ -828,6 +858,7 @@ static int store_icy(URLContext *h, int size) data[len + 1] = 0; if ((ret = av_opt_set(s, "icy_metadata_packet", data, 0)) < 0) return ret; + update_metadata(s, data); } s->icy_data_read = 0; remaining = s->icy_metaint; -- cgit v1.2.3