Skip to content

Commit

Permalink
DASH: Parse and use EventStream.presentationTimeOffset
Browse files Browse the repository at this point in the history
Issue: google/ExoPlayer#10460
#minor-release
PiperOrigin-RevId: 463163839
  • Loading branch information
ojw28 authored and tonihei committed Aug 8, 2022
1 parent e54d2f5 commit 3786b64
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 11 deletions.
3 changes: 3 additions & 0 deletions RELEASENOTES.md
Expand Up @@ -14,6 +14,9 @@
`MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory,
boolean)` to specify whether the renderer will output metadata early or
in sync with the player position.
* DASH:
* Parse `EventStream.presentationTimeOffset` from manifests
([#10460](https://github.com/google/ExoPlayer/issues/10460)).
* UI:
* Use current overrides of the player as preset in
`TrackSelectionDialogBuilder`
Expand Down
Expand Up @@ -1105,13 +1105,15 @@ protected EventStream parseEventStream(XmlPullParser xpp)
String schemeIdUri = parseString(xpp, "schemeIdUri", "");
String value = parseString(xpp, "value", "");
long timescale = parseLong(xpp, "timescale", 1);
long presentationTimeOffset = parseLong(xpp, "presentationTimeOffset", 0);
List<Pair<Long, EventMessage>> eventMessages = new ArrayList<>();
ByteArrayOutputStream scratchOutputStream = new ByteArrayOutputStream(512);
do {
xpp.next();
if (XmlPullParserUtil.isStartTag(xpp, "Event")) {
Pair<Long, EventMessage> event =
parseEvent(xpp, schemeIdUri, value, timescale, scratchOutputStream);
parseEvent(
xpp, schemeIdUri, value, timescale, presentationTimeOffset, scratchOutputStream);
eventMessages.add(event);
} else {
maybeSkipTag(xpp);
Expand Down Expand Up @@ -1144,6 +1146,7 @@ protected EventStream buildEventStream(
* @param schemeIdUri The schemeIdUri of the parent EventStream.
* @param value The schemeIdUri of the parent EventStream.
* @param timescale The timescale of the parent EventStream.
* @param presentationTimeOffset The unscaled presentation time offset of the parent EventStream.
* @param scratchOutputStream A {@link ByteArrayOutputStream} that is used when parsing event
* objects.
* @return A pair containing the node's presentation timestamp in microseconds and the parsed
Expand All @@ -1156,14 +1159,16 @@ protected Pair<Long, EventMessage> parseEvent(
String schemeIdUri,
String value,
long timescale,
long presentationTimeOffset,
ByteArrayOutputStream scratchOutputStream)
throws IOException, XmlPullParserException {
long id = parseLong(xpp, "id", 0);
long duration = parseLong(xpp, "duration", C.TIME_UNSET);
long presentationTime = parseLong(xpp, "presentationTime", 0);
long durationMs = Util.scaleLargeTimestamp(duration, C.MILLIS_PER_SECOND, timescale);
long presentationTimesUs =
Util.scaleLargeTimestamp(presentationTime, C.MICROS_PER_SECOND, timescale);
Util.scaleLargeTimestamp(
presentationTime - presentationTimeOffset, C.MICROS_PER_SECOND, timescale);
String messageData = parseString(xpp, "messageData", null);
byte[] eventObject = parseEventObject(xpp, scratchOutputStream);
return Pair.create(
Expand Down
Expand Up @@ -139,7 +139,7 @@ public void parseMediaPresentationDescription_eventStream() throws IOException {
ApplicationProvider.getApplicationContext(), SAMPLE_MPD_EVENT_STREAM));

Period period = manifest.getPeriod(0);
assertThat(period.eventStreams).hasSize(3);
assertThat(period.eventStreams).hasSize(4);

// assert text-only event stream
EventStream eventStream1 = period.eventStreams.get(0);
Expand All @@ -150,10 +150,18 @@ public void parseMediaPresentationDescription_eventStream() throws IOException {
assertThat(eventStream1.events[0]).isEqualTo(expectedEvent1);
assertThat(eventStream1.presentationTimesUs[0]).isEqualTo(0);

// assert CData-structured event stream
// assert event stream with presentationTimeOffset
EventStream eventStream2 = period.eventStreams.get(1);
assertThat(eventStream2.events.length).isEqualTo(1);
EventMessage expectedEvent2 =
new EventMessage("urn:uuid:with-pto", "pto-4s", 10000, 0, "pt=1s".getBytes(Charsets.UTF_8));
assertThat(eventStream2.events[0]).isEqualTo(expectedEvent2);
assertThat(eventStream2.presentationTimesUs[0]).isEqualTo(1000000);

// assert CData-structured event stream
EventStream eventStream3 = period.eventStreams.get(2);
assertThat(eventStream3.events.length).isEqualTo(1);
EventMessage expectedEvent3 =
new EventMessage(
"urn:dvb:iptv:cpm:2014",
"",
Expand All @@ -173,13 +181,13 @@ public void parseMediaPresentationDescription_eventStream() throws IOException {
+ " </InstanceDescription>\n"
+ " </BroadcastEvent>]]>"));

assertThat(eventStream2.events[0]).isEqualTo(expectedEvent2);
assertThat(eventStream2.presentationTimesUs[0]).isEqualTo(300000000);
assertThat(eventStream3.events[0]).isEqualTo(expectedEvent3);
assertThat(eventStream3.presentationTimesUs[0]).isEqualTo(300000000);

// assert xml-structured event stream
EventStream eventStream3 = period.eventStreams.get(2);
assertThat(eventStream3.events.length).isEqualTo(1);
EventMessage expectedEvent3 =
EventStream eventStream4 = period.eventStreams.get(3);
assertThat(eventStream4.events.length).isEqualTo(1);
EventMessage expectedEvent4 =
new EventMessage(
"urn:scte:scte35:2014:xml+bin",
"",
Expand All @@ -191,8 +199,8 @@ public void parseMediaPresentationDescription_eventStream() throws IOException {
+ " /DAIAAAAAAAAAAAQAAZ/I0VniQAQAgBDVUVJQAAAAH+cAAAAAA==\n"
+ " </scte35:Binary>\n"
+ " </scte35:Signal>"));
assertThat(eventStream3.events[0]).isEqualTo(expectedEvent3);
assertThat(eventStream3.presentationTimesUs[0]).isEqualTo(1000000000);
assertThat(eventStream4.events[0]).isEqualTo(expectedEvent4);
assertThat(eventStream4.presentationTimesUs[0]).isEqualTo(1000000000);
}

@Test
Expand Down
Expand Up @@ -4,6 +4,9 @@
<EventStream schemeIdUri="urn:uuid:XYZY" timescale="1000" value="call">
<Event presentationTime="0" duration="10000" id="0" messageData="+ 1 800 10101010"/>
</EventStream>
<EventStream schemeIdUri="urn:uuid:with-pto" timescale="1000" presentationTimeOffset="4000" value="pto-4s">
<Event presentationTime="5000" duration="10000" id="0" messageData="pt=1s"/>
</EventStream>
<EventStream schemeIdUri="urn:dvb:iptv:cpm:2014">
<Event presentationTime="300" duration="1500" id="1"><![CDATA[<BroadcastEvent>
<Program crid="crid://broadcaster.example.com/ABCDEF"/>
Expand Down

0 comments on commit 3786b64

Please sign in to comment.