Skip to content

Commit

Permalink
DASH: Parse and use EventStream.presentationTimeOffset
Browse files Browse the repository at this point in the history
Issue: #10460
#minor-release
PiperOrigin-RevId: 463163839
  • Loading branch information
ojw28 committed Jul 25, 2022
1 parent 92fc065 commit 6288182
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 11 deletions.
Expand Up @@ -1103,13 +1103,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 @@ -1142,6 +1144,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 @@ -1154,14 +1157,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
3 changes: 3 additions & 0 deletions testdata/src/test/assets/media/mpd/sample_mpd_event_stream
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 6288182

Please sign in to comment.