Fix DashManifestParser to properly skip unknown tags
Robustness fix to make sure we ignore tags with known names, but which are nested inside of unknown tags. For example we don't want to parse the third period in: <Period>...</Period> <Period>...</Period> <CustomTag> <Period>...</Period> </CustomTag> ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=217101630
This commit is contained in:
parent
ba6a118998
commit
d511370338
@ -155,6 +155,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
: (period.startMs + periodDurationMs);
|
: (period.startMs + periodDurationMs);
|
||||||
periods.add(period);
|
periods.add(period);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "MPD"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "MPD"));
|
||||||
|
|
||||||
@ -221,6 +223,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
segmentBase = parseSegmentList(xpp, null);
|
segmentBase = parseSegmentList(xpp, null);
|
||||||
} else if (XmlPullParserUtil.isStartTag(xpp, "SegmentTemplate")) {
|
} else if (XmlPullParserUtil.isStartTag(xpp, "SegmentTemplate")) {
|
||||||
segmentBase = parseSegmentTemplate(xpp, null);
|
segmentBase = parseSegmentTemplate(xpp, null);
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "Period"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "Period"));
|
||||||
|
|
||||||
@ -409,8 +413,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
} else if (XmlPullParserUtil.isStartTag(xpp, "widevine:license")) {
|
} else if (XmlPullParserUtil.isStartTag(xpp, "widevine:license")) {
|
||||||
String robustnessLevel = xpp.getAttributeValue(null, "robustness_level");
|
String robustnessLevel = xpp.getAttributeValue(null, "robustness_level");
|
||||||
requiresSecureDecoder = robustnessLevel != null && robustnessLevel.startsWith("HW");
|
requiresSecureDecoder = robustnessLevel != null && robustnessLevel.startsWith("HW");
|
||||||
} else if (data == null) {
|
} else if (data == null
|
||||||
if (XmlPullParserUtil.isStartTagIgnorePrefix(xpp, "pssh")
|
&& XmlPullParserUtil.isStartTagIgnorePrefix(xpp, "pssh")
|
||||||
&& xpp.next() == XmlPullParser.TEXT) {
|
&& xpp.next() == XmlPullParser.TEXT) {
|
||||||
// The cenc:pssh element is defined in 23001-7:2015.
|
// The cenc:pssh element is defined in 23001-7:2015.
|
||||||
data = Base64.decode(xpp.getText(), Base64.DEFAULT);
|
data = Base64.decode(xpp.getText(), Base64.DEFAULT);
|
||||||
@ -419,12 +423,16 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
Log.w(TAG, "Skipping malformed cenc:pssh data");
|
Log.w(TAG, "Skipping malformed cenc:pssh data");
|
||||||
data = null;
|
data = null;
|
||||||
}
|
}
|
||||||
} else if (C.PLAYREADY_UUID.equals(uuid) && XmlPullParserUtil.isStartTag(xpp, "mspr:pro")
|
} else if (data == null
|
||||||
|
&& C.PLAYREADY_UUID.equals(uuid)
|
||||||
|
&& XmlPullParserUtil.isStartTag(xpp, "mspr:pro")
|
||||||
&& xpp.next() == XmlPullParser.TEXT) {
|
&& xpp.next() == XmlPullParser.TEXT) {
|
||||||
// The mspr:pro element is defined in DASH Content Protection using Microsoft PlayReady.
|
// The mspr:pro element is defined in DASH Content Protection using Microsoft PlayReady.
|
||||||
data = PsshAtomUtil.buildPsshAtom(C.PLAYREADY_UUID,
|
data =
|
||||||
Base64.decode(xpp.getText(), Base64.DEFAULT));
|
PsshAtomUtil.buildPsshAtom(
|
||||||
}
|
C.PLAYREADY_UUID, Base64.decode(xpp.getText(), Base64.DEFAULT));
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "ContentProtection"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "ContentProtection"));
|
||||||
SchemeData schemeData =
|
SchemeData schemeData =
|
||||||
@ -462,7 +470,7 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
*/
|
*/
|
||||||
protected void parseAdaptationSetChild(XmlPullParser xpp)
|
protected void parseAdaptationSetChild(XmlPullParser xpp)
|
||||||
throws XmlPullParserException, IOException {
|
throws XmlPullParserException, IOException {
|
||||||
// pass
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Representation parsing.
|
// Representation parsing.
|
||||||
@ -526,6 +534,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
inbandEventStreams.add(parseDescriptor(xpp, "InbandEventStream"));
|
inbandEventStreams.add(parseDescriptor(xpp, "InbandEventStream"));
|
||||||
} else if (XmlPullParserUtil.isStartTag(xpp, "SupplementalProperty")) {
|
} else if (XmlPullParserUtil.isStartTag(xpp, "SupplementalProperty")) {
|
||||||
supplementalProperties.add(parseDescriptor(xpp, "SupplementalProperty"));
|
supplementalProperties.add(parseDescriptor(xpp, "SupplementalProperty"));
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "Representation"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "Representation"));
|
||||||
|
|
||||||
@ -664,6 +674,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
xpp.next();
|
xpp.next();
|
||||||
if (XmlPullParserUtil.isStartTag(xpp, "Initialization")) {
|
if (XmlPullParserUtil.isStartTag(xpp, "Initialization")) {
|
||||||
initialization = parseInitialization(xpp);
|
initialization = parseInitialization(xpp);
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "SegmentBase"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "SegmentBase"));
|
||||||
|
|
||||||
@ -701,6 +713,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
segments = new ArrayList<>();
|
segments = new ArrayList<>();
|
||||||
}
|
}
|
||||||
segments.add(parseSegmentUrl(xpp));
|
segments.add(parseSegmentUrl(xpp));
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "SegmentList"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "SegmentList"));
|
||||||
|
|
||||||
@ -747,6 +761,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
initialization = parseInitialization(xpp);
|
initialization = parseInitialization(xpp);
|
||||||
} else if (XmlPullParserUtil.isStartTag(xpp, "SegmentTimeline")) {
|
} else if (XmlPullParserUtil.isStartTag(xpp, "SegmentTimeline")) {
|
||||||
timeline = parseSegmentTimeline(xpp);
|
timeline = parseSegmentTimeline(xpp);
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "SegmentTemplate"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "SegmentTemplate"));
|
||||||
|
|
||||||
@ -794,6 +810,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
EventMessage event = parseEvent(xpp, schemeIdUri, value, timescale,
|
EventMessage event = parseEvent(xpp, schemeIdUri, value, timescale,
|
||||||
scratchOutputStream);
|
scratchOutputStream);
|
||||||
eventMessages.add(event);
|
eventMessages.add(event);
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "EventStream"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "EventStream"));
|
||||||
|
|
||||||
@ -932,6 +950,8 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
segmentTimeline.add(buildSegmentTimelineElement(elapsedTime, duration));
|
segmentTimeline.add(buildSegmentTimelineElement(elapsedTime, duration));
|
||||||
elapsedTime += duration;
|
elapsedTime += duration;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
maybeSkipTag(xpp);
|
||||||
}
|
}
|
||||||
} while (!XmlPullParserUtil.isEndTag(xpp, "SegmentTimeline"));
|
} while (!XmlPullParserUtil.isEndTag(xpp, "SegmentTimeline"));
|
||||||
return segmentTimeline;
|
return segmentTimeline;
|
||||||
@ -995,6 +1015,29 @@ public class DashManifestParser extends DefaultHandler
|
|||||||
|
|
||||||
// Utility methods.
|
// Utility methods.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the provided {@link XmlPullParser} is currently positioned at the start of a tag, skips
|
||||||
|
* forward to the end of that tag.
|
||||||
|
*
|
||||||
|
* @param xpp The {@link XmlPullParser}.
|
||||||
|
* @throws XmlPullParserException If an error occurs parsing the stream.
|
||||||
|
* @throws IOException If an error occurs reading the stream.
|
||||||
|
*/
|
||||||
|
public static void maybeSkipTag(XmlPullParser xpp) throws IOException, XmlPullParserException {
|
||||||
|
if (!XmlPullParserUtil.isStartTag(xpp)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int depth = 1;
|
||||||
|
while (depth != 0) {
|
||||||
|
xpp.next();
|
||||||
|
if (XmlPullParserUtil.isStartTag(xpp)) {
|
||||||
|
depth++;
|
||||||
|
} else if (XmlPullParserUtil.isEndTag(xpp)) {
|
||||||
|
depth--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes unnecessary {@link SchemeData}s with null {@link SchemeData#data}.
|
* Removes unnecessary {@link SchemeData}s with null {@link SchemeData#data}.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user