DASH: Parse and use EventStream.presentationTimeOffset
Issue: google/ExoPlayer#10460 #minor-release PiperOrigin-RevId: 463163839
This commit is contained in:
parent
e54d2f5658
commit
3786b64217
@ -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`
|
||||
|
@ -1105,13 +1105,15 @@ public class DashManifestParser extends DefaultHandler
|
||||
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);
|
||||
@ -1144,6 +1146,7 @@ public class DashManifestParser extends DefaultHandler
|
||||
* @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
|
||||
@ -1156,6 +1159,7 @@ public class DashManifestParser extends DefaultHandler
|
||||
String schemeIdUri,
|
||||
String value,
|
||||
long timescale,
|
||||
long presentationTimeOffset,
|
||||
ByteArrayOutputStream scratchOutputStream)
|
||||
throws IOException, XmlPullParserException {
|
||||
long id = parseLong(xpp, "id", 0);
|
||||
@ -1163,7 +1167,8 @@ public class DashManifestParser extends DefaultHandler
|
||||
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(
|
||||
|
@ -139,7 +139,7 @@ public class DashManifestParserTest {
|
||||
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);
|
||||
@ -150,10 +150,18 @@ public class DashManifestParserTest {
|
||||
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",
|
||||
"",
|
||||
@ -173,13 +181,13 @@ public class DashManifestParserTest {
|
||||
+ " </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",
|
||||
"",
|
||||
@ -191,8 +199,8 @@ public class DashManifestParserTest {
|
||||
+ " /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
|
||||
|
@ -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"/>
|
||||
|
Loading…
x
Reference in New Issue
Block a user