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