mirror of https://git.ffmpeg.org/ffmpeg.git
avformat/dashdec.c: Download dash content with byte range info
This commit is contained in:
parent
1f48c5c067
commit
8db4ef3e6d
|
@ -552,6 +552,23 @@ static enum AVMediaType get_content_type(xmlNodePtr node)
|
|||
return type;
|
||||
}
|
||||
|
||||
static struct fragment * get_Fragment(char *range)
|
||||
{
|
||||
struct fragment * seg = av_mallocz(sizeof(struct fragment));
|
||||
|
||||
if (!seg)
|
||||
return NULL;
|
||||
|
||||
seg->size = -1;
|
||||
if (range) {
|
||||
char *str_end_offset;
|
||||
char *str_offset = av_strtok(range, "-", &str_end_offset);
|
||||
seg->url_offset = strtoll(str_offset, NULL, 10);
|
||||
seg->size = strtoll(str_end_offset, NULL, 10) - seg->url_offset;
|
||||
}
|
||||
return seg;
|
||||
}
|
||||
|
||||
static int parse_manifest_segmenturlnode(AVFormatContext *s, struct representation *rep,
|
||||
xmlNodePtr fragmenturl_node,
|
||||
xmlNodePtr *baseurl_nodes,
|
||||
|
@ -560,13 +577,16 @@ static int parse_manifest_segmenturlnode(AVFormatContext *s, struct representati
|
|||
{
|
||||
char *initialization_val = NULL;
|
||||
char *media_val = NULL;
|
||||
char *range_val = NULL;
|
||||
|
||||
if (!av_strcasecmp(fragmenturl_node->name, (const char *)"Initialization")) {
|
||||
initialization_val = xmlGetProp(fragmenturl_node, "sourceURL");
|
||||
if (initialization_val) {
|
||||
rep->init_section = av_mallocz(sizeof(struct fragment));
|
||||
range_val = xmlGetProp(fragmenturl_node, "range");
|
||||
if (initialization_val || range_val) {
|
||||
rep->init_section = get_Fragment(range_val);
|
||||
if (!rep->init_section) {
|
||||
xmlFree(initialization_val);
|
||||
xmlFree(range_val);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
rep->init_section->url = get_content_url(baseurl_nodes, 4,
|
||||
|
@ -576,17 +596,20 @@ static int parse_manifest_segmenturlnode(AVFormatContext *s, struct representati
|
|||
if (!rep->init_section->url) {
|
||||
av_free(rep->init_section);
|
||||
xmlFree(initialization_val);
|
||||
xmlFree(range_val);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
rep->init_section->size = -1;
|
||||
xmlFree(initialization_val);
|
||||
xmlFree(range_val);
|
||||
}
|
||||
} else if (!av_strcasecmp(fragmenturl_node->name, (const char *)"SegmentURL")) {
|
||||
media_val = xmlGetProp(fragmenturl_node, "media");
|
||||
if (media_val) {
|
||||
struct fragment *seg = av_mallocz(sizeof(struct fragment));
|
||||
range_val = xmlGetProp(fragmenturl_node, "mediaRange");
|
||||
if (media_val || range_val) {
|
||||
struct fragment *seg = get_Fragment(range_val);
|
||||
if (!seg) {
|
||||
xmlFree(media_val);
|
||||
xmlFree(range_val);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
seg->url = get_content_url(baseurl_nodes, 4,
|
||||
|
@ -596,11 +619,12 @@ static int parse_manifest_segmenturlnode(AVFormatContext *s, struct representati
|
|||
if (!seg->url) {
|
||||
av_free(seg);
|
||||
xmlFree(media_val);
|
||||
xmlFree(range_val);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
seg->size = -1;
|
||||
dynarray_add(&rep->fragments, &rep->n_fragments, seg);
|
||||
xmlFree(media_val);
|
||||
xmlFree(range_val);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue