mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 12:09:55 +00:00
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>
This commit is contained in:
parent
dc6fdad5dc
commit
f1f60f5252
@ -86,57 +86,6 @@ static int read_chomp_line(AVIOContext *s, char *buf, int maxlen)
|
||||
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)
|
||||
{
|
||||
int i;
|
||||
@ -183,7 +132,7 @@ static struct variant *new_variant(AppleHTTPContext *c, int bandwidth,
|
||||
return NULL;
|
||||
reset_packet(&var->pkt);
|
||||
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);
|
||||
return var;
|
||||
}
|
||||
@ -274,7 +223,7 @@ static int parse_playlist(AppleHTTPContext *c, const char *url,
|
||||
goto fail;
|
||||
}
|
||||
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);
|
||||
is_segment = 0;
|
||||
}
|
||||
|
@ -75,57 +75,6 @@ static int read_chomp_line(AVIOContext *s, char *buf, int maxlen)
|
||||
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)
|
||||
{
|
||||
int i;
|
||||
@ -201,7 +150,7 @@ static int parse_playlist(URLContext *h, const char *url)
|
||||
goto fail;
|
||||
}
|
||||
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);
|
||||
is_segment = 0;
|
||||
} else if (is_variant) {
|
||||
@ -211,7 +160,7 @@ static int parse_playlist(URLContext *h, const char *url)
|
||||
goto fail;
|
||||
}
|
||||
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);
|
||||
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);
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
|
@ -3814,3 +3814,54 @@ int ff_find_stream_index(AVFormatContext *s, int id)
|
||||
}
|
||||
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…
Reference in New Issue
Block a user