Commit e752da54 authored by sfan5's avatar sfan5 Committed by Steven Liu

dashdec: Support SegmentTimeline inside Period

Reviewed-by: 's avatarSteven Liu <lq@onvideo.cn>
parent 08c220d2
...@@ -801,6 +801,7 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, ...@@ -801,6 +801,7 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
xmlNodePtr mpd_baseurl_node, xmlNodePtr mpd_baseurl_node,
xmlNodePtr period_baseurl_node, xmlNodePtr period_baseurl_node,
xmlNodePtr period_segmenttemplate_node, xmlNodePtr period_segmenttemplate_node,
xmlNodePtr period_segmentlist_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,
...@@ -817,7 +818,7 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, ...@@ -817,7 +818,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[4]; xmlNodePtr fragment_templates_tab[5];
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;
...@@ -869,6 +870,7 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, ...@@ -869,6 +870,7 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
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; fragment_templates_tab[3] = period_segmenttemplate_node;
fragment_templates_tab[4] = period_segmentlist_node;
presentation_timeoffset_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "presentationTimeOffset"); presentation_timeoffset_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "presentationTimeOffset");
duration_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "duration"); duration_val = get_val_from_nodes_tab(fragment_templates_tab, 4, "duration");
...@@ -925,6 +927,8 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, ...@@ -925,6 +927,8 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
fragment_timeline_node = find_child_node_by_name(fragment_template_node, "SegmentTimeline"); fragment_timeline_node = find_child_node_by_name(fragment_template_node, "SegmentTimeline");
if (!fragment_timeline_node) if (!fragment_timeline_node)
fragment_timeline_node = find_child_node_by_name(adaptionset_segmentlist_node, "SegmentTimeline"); fragment_timeline_node = find_child_node_by_name(adaptionset_segmentlist_node, "SegmentTimeline");
if (!fragment_timeline_node)
fragment_timeline_node = find_child_node_by_name(period_segmentlist_node, "SegmentTimeline");
if (fragment_timeline_node) { if (fragment_timeline_node) {
fragment_timeline_node = xmlFirstElementChild(fragment_timeline_node); fragment_timeline_node = xmlFirstElementChild(fragment_timeline_node);
while (fragment_timeline_node) { while (fragment_timeline_node) {
...@@ -984,6 +988,8 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, ...@@ -984,6 +988,8 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
fragment_timeline_node = find_child_node_by_name(fragment_template_node, "SegmentTimeline"); fragment_timeline_node = find_child_node_by_name(fragment_template_node, "SegmentTimeline");
if (!fragment_timeline_node) if (!fragment_timeline_node)
fragment_timeline_node = find_child_node_by_name(adaptionset_segmentlist_node, "SegmentTimeline"); fragment_timeline_node = find_child_node_by_name(adaptionset_segmentlist_node, "SegmentTimeline");
if (!fragment_timeline_node)
fragment_timeline_node = find_child_node_by_name(period_segmentlist_node, "SegmentTimeline");
if (fragment_timeline_node) { if (fragment_timeline_node) {
fragment_timeline_node = xmlFirstElementChild(fragment_timeline_node); fragment_timeline_node = xmlFirstElementChild(fragment_timeline_node);
while (fragment_timeline_node) { while (fragment_timeline_node) {
...@@ -1040,7 +1046,8 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url, ...@@ -1040,7 +1046,8 @@ 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) xmlNodePtr period_segmenttemplate_node,
xmlNodePtr period_segmentlist_node)
{ {
int ret = 0; int ret = 0;
xmlNodePtr fragment_template_node = NULL; xmlNodePtr fragment_template_node = NULL;
...@@ -1065,6 +1072,7 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url, ...@@ -1065,6 +1072,7 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url,
mpd_baseurl_node, mpd_baseurl_node,
period_baseurl_node, period_baseurl_node,
period_segmenttemplate_node, period_segmenttemplate_node,
period_segmentlist_node,
fragment_template_node, fragment_template_node,
content_component_node, content_component_node,
adaptionset_baseurl_node, adaptionset_baseurl_node,
...@@ -1094,6 +1102,7 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in) ...@@ -1094,6 +1102,7 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
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 period_segmenttemplate_node = NULL;
xmlNodePtr period_segmentlist_node = NULL;
xmlNodePtr adaptionset_node = NULL; xmlNodePtr adaptionset_node = NULL;
xmlAttrPtr attr = NULL; xmlAttrPtr attr = NULL;
char *val = NULL; char *val = NULL;
...@@ -1228,8 +1237,10 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in) ...@@ -1228,8 +1237,10 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
period_baseurl_node = adaptionset_node; period_baseurl_node = adaptionset_node;
} else if (!av_strcasecmp(adaptionset_node->name, (const char *)"SegmentTemplate")) { } else if (!av_strcasecmp(adaptionset_node->name, (const char *)"SegmentTemplate")) {
period_segmenttemplate_node = adaptionset_node; period_segmenttemplate_node = adaptionset_node;
} else if (!av_strcasecmp(adaptionset_node->name, (const char *)"SegmentList")) {
period_segmentlist_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, period_segmenttemplate_node); parse_manifest_adaptationset(s, url, adaptionset_node, mpd_baseurl_node, period_baseurl_node, period_segmenttemplate_node, period_segmentlist_node);
} }
adaptionset_node = xmlNextElementSibling(adaptionset_node); adaptionset_node = xmlNextElementSibling(adaptionset_node);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment