dashdec: Support SegmentTemplate inside Period

Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
This commit is contained in:
sfan5 2018-01-14 23:02:26 +08:00 committed by Steven Liu
parent 01d74c4055
commit 57dbabd9c1
1 changed files with 17 additions and 10 deletions

View File

@ -646,6 +646,7 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
xmlNodePtr adaptionset_node, xmlNodePtr adaptionset_node,
xmlNodePtr mpd_baseurl_node, xmlNodePtr mpd_baseurl_node,
xmlNodePtr period_baseurl_node, xmlNodePtr period_baseurl_node,
xmlNodePtr period_segmenttemplate_node,
xmlNodePtr fragment_template_node, xmlNodePtr fragment_template_node,
xmlNodePtr content_component_node, xmlNodePtr content_component_node,
xmlNodePtr adaptionset_baseurl_node, xmlNodePtr adaptionset_baseurl_node,
@ -662,7 +663,7 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
xmlNodePtr representation_segmentlist_node = NULL; xmlNodePtr representation_segmentlist_node = NULL;
xmlNodePtr segmentlists_tab[2]; xmlNodePtr segmentlists_tab[2];
xmlNodePtr fragment_timeline_node = NULL; xmlNodePtr fragment_timeline_node = NULL;
xmlNodePtr fragment_templates_tab[3]; xmlNodePtr fragment_templates_tab[4];
char *duration_val = NULL; char *duration_val = NULL;
char *presentation_timeoffset_val = NULL; char *presentation_timeoffset_val = NULL;
char *startnumber_val = NULL; char *startnumber_val = NULL;
@ -702,18 +703,19 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
baseurl_nodes[2] = adaptionset_baseurl_node; baseurl_nodes[2] = adaptionset_baseurl_node;
baseurl_nodes[3] = representation_baseurl_node; baseurl_nodes[3] = representation_baseurl_node;
if (representation_segmenttemplate_node || fragment_template_node) { if (representation_segmenttemplate_node || fragment_template_node || period_segmenttemplate_node) {
fragment_timeline_node = NULL; fragment_timeline_node = NULL;
fragment_templates_tab[0] = representation_segmenttemplate_node; fragment_templates_tab[0] = representation_segmenttemplate_node;
fragment_templates_tab[1] = adaptionset_segmentlist_node; fragment_templates_tab[1] = adaptionset_segmentlist_node;
fragment_templates_tab[2] = fragment_template_node; fragment_templates_tab[2] = fragment_template_node;
fragment_templates_tab[3] = period_segmenttemplate_node;
presentation_timeoffset_val = get_val_from_nodes_tab(fragment_templates_tab, 3, "presentationTimeOffset"); presentation_timeoffset_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "presentationTimeOffset");
duration_val = get_val_from_nodes_tab(fragment_templates_tab, 3, "duration"); duration_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "duration");
startnumber_val = get_val_from_nodes_tab(fragment_templates_tab, 3, "startNumber"); startnumber_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "startNumber");
timescale_val = get_val_from_nodes_tab(fragment_templates_tab, 3, "timescale"); timescale_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "timescale");
initialization_val = get_val_from_nodes_tab(fragment_templates_tab, 3, "initialization"); initialization_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "initialization");
media_val = get_val_from_nodes_tab(fragment_templates_tab, 3, "media"); media_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "media");
if (initialization_val) { if (initialization_val) {
rep->init_section = av_mallocz(sizeof(struct fragment)); rep->init_section = av_mallocz(sizeof(struct fragment));
@ -866,7 +868,8 @@ end:
static int parse_manifest_adaptationset(AVFormatContext *s, const char *url, static int parse_manifest_adaptationset(AVFormatContext *s, const char *url,
xmlNodePtr adaptionset_node, xmlNodePtr adaptionset_node,
xmlNodePtr mpd_baseurl_node, xmlNodePtr mpd_baseurl_node,
xmlNodePtr period_baseurl_node) xmlNodePtr period_baseurl_node,
xmlNodePtr period_segmenttemplate_node)
{ {
int ret = 0; int ret = 0;
xmlNodePtr fragment_template_node = NULL; xmlNodePtr fragment_template_node = NULL;
@ -890,6 +893,7 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url,
adaptionset_node, adaptionset_node,
mpd_baseurl_node, mpd_baseurl_node,
period_baseurl_node, period_baseurl_node,
period_segmenttemplate_node,
fragment_template_node, fragment_template_node,
content_component_node, content_component_node,
adaptionset_baseurl_node, adaptionset_baseurl_node,
@ -918,6 +922,7 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
xmlNodePtr period_node = NULL; xmlNodePtr period_node = NULL;
xmlNodePtr mpd_baseurl_node = NULL; xmlNodePtr mpd_baseurl_node = NULL;
xmlNodePtr period_baseurl_node = NULL; xmlNodePtr period_baseurl_node = NULL;
xmlNodePtr period_segmenttemplate_node = NULL;
xmlNodePtr adaptionset_node = NULL; xmlNodePtr adaptionset_node = NULL;
xmlAttrPtr attr = NULL; xmlAttrPtr attr = NULL;
char *val = NULL; char *val = NULL;
@ -1047,8 +1052,10 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
while (adaptionset_node) { while (adaptionset_node) {
if (!av_strcasecmp(adaptionset_node->name, (const char *)"BaseURL")) { if (!av_strcasecmp(adaptionset_node->name, (const char *)"BaseURL")) {
period_baseurl_node = adaptionset_node; period_baseurl_node = adaptionset_node;
} else if (!av_strcasecmp(adaptionset_node->name, (const char *)"SegmentTemplate")) {
period_segmenttemplate_node = adaptionset_node;
} else if (!av_strcasecmp(adaptionset_node->name, (const char *)"AdaptationSet")) { } else if (!av_strcasecmp(adaptionset_node->name, (const char *)"AdaptationSet")) {
parse_manifest_adaptationset(s, url, adaptionset_node, mpd_baseurl_node, period_baseurl_node); parse_manifest_adaptationset(s, url, adaptionset_node, mpd_baseurl_node, period_baseurl_node, period_segmenttemplate_node);
} }
adaptionset_node = xmlNextElementSibling(adaptionset_node); adaptionset_node = xmlNextElementSibling(adaptionset_node);
} }