|
|
|
@ -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; |
|
|
|
|