lavf: Make make_absolute_url a lavf internal function

This is shared by both applehttp demuxer and protocol.

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
oldabi
Martin Storsjö 14 years ago committed by Luca Barbato
parent dc6fdad5dc
commit f1f60f5252
  1. 55
      libavformat/applehttp.c
  2. 55
      libavformat/applehttpproto.c
  3. 11
      libavformat/internal.h
  4. 51
      libavformat/utils.c

@ -86,57 +86,6 @@ static int read_chomp_line(AVIOContext *s, char *buf, int maxlen)
return len; return len;
} }
static void make_absolute_url(char *buf, int size, const char *base,
const char *rel)
{
char *sep;
/* Absolute path, relative to the current server */
if (base && strstr(base, "://") && rel[0] == '/') {
if (base != buf)
av_strlcpy(buf, base, size);
sep = strstr(buf, "://");
if (sep) {
sep += 3;
sep = strchr(sep, '/');
if (sep)
*sep = '\0';
}
av_strlcat(buf, rel, size);
return;
}
/* If rel actually is an absolute url, just copy it */
if (!base || strstr(rel, "://") || rel[0] == '/') {
av_strlcpy(buf, rel, size);
return;
}
if (base != buf)
av_strlcpy(buf, base, size);
/* Remove the file name from the base url */
sep = strrchr(buf, '/');
if (sep)
sep[1] = '\0';
else
buf[0] = '\0';
while (av_strstart(rel, "../", NULL) && sep) {
/* Remove the path delimiter at the end */
sep[0] = '\0';
sep = strrchr(buf, '/');
/* If the next directory name to pop off is "..", break here */
if (!strcmp(sep ? &sep[1] : buf, "..")) {
/* Readd the slash we just removed */
av_strlcat(buf, "/", size);
break;
}
/* Cut off the directory name */
if (sep)
sep[1] = '\0';
else
buf[0] = '\0';
rel += 3;
}
av_strlcat(buf, rel, size);
}
static void free_segment_list(struct variant *var) static void free_segment_list(struct variant *var)
{ {
int i; int i;
@ -183,7 +132,7 @@ static struct variant *new_variant(AppleHTTPContext *c, int bandwidth,
return NULL; return NULL;
reset_packet(&var->pkt); reset_packet(&var->pkt);
var->bandwidth = bandwidth; var->bandwidth = bandwidth;
make_absolute_url(var->url, sizeof(var->url), base, url); ff_make_absolute_url(var->url, sizeof(var->url), base, url);
dynarray_add(&c->variants, &c->n_variants, var); dynarray_add(&c->variants, &c->n_variants, var);
return var; return var;
} }
@ -274,7 +223,7 @@ static int parse_playlist(AppleHTTPContext *c, const char *url,
goto fail; goto fail;
} }
seg->duration = duration; seg->duration = duration;
make_absolute_url(seg->url, sizeof(seg->url), url, line); ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
dynarray_add(&var->segments, &var->n_segments, seg); dynarray_add(&var->segments, &var->n_segments, seg);
is_segment = 0; is_segment = 0;
} }

@ -75,57 +75,6 @@ static int read_chomp_line(AVIOContext *s, char *buf, int maxlen)
return len; return len;
} }
static void make_absolute_url(char *buf, int size, const char *base,
const char *rel)
{
char *sep;
/* Absolute path, relative to the current server */
if (base && strstr(base, "://") && rel[0] == '/') {
if (base != buf)
av_strlcpy(buf, base, size);
sep = strstr(buf, "://");
if (sep) {
sep += 3;
sep = strchr(sep, '/');
if (sep)
*sep = '\0';
}
av_strlcat(buf, rel, size);
return;
}
/* If rel actually is an absolute url, just copy it */
if (!base || strstr(rel, "://") || rel[0] == '/') {
av_strlcpy(buf, rel, size);
return;
}
if (base != buf)
av_strlcpy(buf, base, size);
/* Remove the file name from the base url */
sep = strrchr(buf, '/');
if (sep)
sep[1] = '\0';
else
buf[0] = '\0';
while (av_strstart(rel, "../", NULL) && sep) {
/* Remove the path delimiter at the end */
sep[0] = '\0';
sep = strrchr(buf, '/');
/* If the next directory name to pop off is "..", break here */
if (!strcmp(sep ? &sep[1] : buf, "..")) {
/* Readd the slash we just removed */
av_strlcat(buf, "/", size);
break;
}
/* Cut off the directory name */
if (sep)
sep[1] = '\0';
else
buf[0] = '\0';
rel += 3;
}
av_strlcat(buf, rel, size);
}
static void free_segment_list(AppleHTTPContext *s) static void free_segment_list(AppleHTTPContext *s)
{ {
int i; int i;
@ -201,7 +150,7 @@ static int parse_playlist(URLContext *h, const char *url)
goto fail; goto fail;
} }
seg->duration = duration; seg->duration = duration;
make_absolute_url(seg->url, sizeof(seg->url), url, line); ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
dynarray_add(&s->segments, &s->n_segments, seg); dynarray_add(&s->segments, &s->n_segments, seg);
is_segment = 0; is_segment = 0;
} else if (is_variant) { } else if (is_variant) {
@ -211,7 +160,7 @@ static int parse_playlist(URLContext *h, const char *url)
goto fail; goto fail;
} }
var->bandwidth = bandwidth; var->bandwidth = bandwidth;
make_absolute_url(var->url, sizeof(var->url), url, line); ff_make_absolute_url(var->url, sizeof(var->url), url, line);
dynarray_add(&s->variants, &s->n_variants, var); dynarray_add(&s->variants, &s->n_variants, var);
is_variant = 0; is_variant = 0;
} }

@ -239,4 +239,15 @@ AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base,
*/ */
void ff_reduce_index(AVFormatContext *s, int stream_index); void ff_reduce_index(AVFormatContext *s, int stream_index);
/*
* Convert a relative url into an absolute url, given a base url.
*
* @param buf the buffer where output absolute url is written
* @param size the size of buf
* @param base the base url, may be equal to buf.
* @param rel the new url, which is interpreted relative to base
*/
void ff_make_absolute_url(char *buf, int size, const char *base,
const char *rel);
#endif /* AVFORMAT_INTERNAL_H */ #endif /* AVFORMAT_INTERNAL_H */

@ -3814,3 +3814,54 @@ int ff_find_stream_index(AVFormatContext *s, int id)
} }
return -1; return -1;
} }
void ff_make_absolute_url(char *buf, int size, const char *base,
const char *rel)
{
char *sep;
/* Absolute path, relative to the current server */
if (base && strstr(base, "://") && rel[0] == '/') {
if (base != buf)
av_strlcpy(buf, base, size);
sep = strstr(buf, "://");
if (sep) {
sep += 3;
sep = strchr(sep, '/');
if (sep)
*sep = '\0';
}
av_strlcat(buf, rel, size);
return;
}
/* If rel actually is an absolute url, just copy it */
if (!base || strstr(rel, "://") || rel[0] == '/') {
av_strlcpy(buf, rel, size);
return;
}
if (base != buf)
av_strlcpy(buf, base, size);
/* Remove the file name from the base url */
sep = strrchr(buf, '/');
if (sep)
sep[1] = '\0';
else
buf[0] = '\0';
while (av_strstart(rel, "../", NULL) && sep) {
/* Remove the path delimiter at the end */
sep[0] = '\0';
sep = strrchr(buf, '/');
/* If the next directory name to pop off is "..", break here */
if (!strcmp(sep ? &sep[1] : buf, "..")) {
/* Readd the slash we just removed */
av_strlcat(buf, "/", size);
break;
}
/* Cut off the directory name */
if (sep)
sep[1] = '\0';
else
buf[0] = '\0';
rel += 3;
}
av_strlcat(buf, rel, size);
}

Loading…
Cancel
Save