From c7f763a3692b1bd24f24e0e9492360bfe937a74f Mon Sep 17 00:00:00 2001 From: Arnold Szabo Date: Thu, 8 Nov 2018 22:22:23 +0200 Subject: [PATCH] #1583 - Modify in event time generation of TtmlNode Look for "div" tags when generating the set of times. --- .../exoplayer2/text/ttml/TtmlDecoder.java | 8 ++++++-- .../exoplayer2/text/ttml/TtmlNode.java | 20 ++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java index 8be5af5a3fa..6da9502e1b2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java @@ -479,7 +479,7 @@ private TtmlNode parseNode(XmlPullParser parser, TtmlNode parent, long startTime = C.TIME_UNSET; long endTime = C.TIME_UNSET; String regionId = TtmlNode.ANONYMOUS_REGION_ID; - String imageId = ""; + String imageId = null; String[] styleIds = null; int attributeCount = parser.getAttributeCount(); TtmlStyle style = parseStyleAttributes(parser, null); @@ -511,7 +511,11 @@ private TtmlNode parseNode(XmlPullParser parser, TtmlNode parent, } break; case ATTR_IMAGE: - imageId = value.substring(1); + // Parse URI reference only if refers to an element in the same document (it must start with '#') + // Resolving URIs from external sources is not supported + if (value.startsWith("#")) { + imageId = value.substring(1); + } break; default: // Do nothing. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java b/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java index 6b2a524e49a..479d6a1771d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java @@ -159,7 +159,8 @@ public long[] getEventTimesUs() { private void getEventTimes(TreeSet out, boolean descendsPNode) { boolean isPNode = TAG_P.equals(tag); - if (descendsPNode || isPNode) { + boolean isDivNode = TAG_DIV.equals(tag); + if (descendsPNode || isPNode || (isDivNode && imageId != null)) { if (startTimeUs != C.TIME_UNSET) { out.add(startTimeUs); } @@ -180,7 +181,7 @@ public String[] getStyleIds() { } public List getCues(long timeUs, Map globalStyles, - Map regionMap, Map imageMap) { + Map regionMap, Map imageMap) { TreeMap regionOutputs = new TreeMap<>(); List> regionImageList = new ArrayList<>(); @@ -204,7 +205,7 @@ public List getCues(long timeUs, Map globalStyles, Cue.TYPE_UNSET, region.line, region.lineAnchor, - region.width, + region.width == Cue.DIMEN_UNSET ? 0.5f : region.width, Cue.DIMEN_UNSET ) ); @@ -229,12 +230,17 @@ public List getCues(long timeUs, Map globalStyles, return cues; } - private void traverseForImage(long timeUs, String inheritedRegion, List> regionImageList) { - // TODO isActive needed? + private void traverseForImage( + long timeUs, + String inheritedRegion, + List> regionImageList) { String resolvedRegionId = ANONYMOUS_REGION_ID.equals(regionId) ? inheritedRegion : regionId; - if (TAG_DIV.equals(tag) && imageId != null) { - regionImageList.add(new Pair<>(resolvedRegionId, imageId)); + + if (isActive(timeUs)) { + if (TAG_DIV.equals(tag) && imageId != null) { + regionImageList.add(new Pair<>(resolvedRegionId, imageId)); + } } for (int i = 0; i < getChildCount(); ++i) {