diff --git a/docs/live-streaming.md b/docs/live-streaming.md index 368ae11afc..5b09d0af68 100644 --- a/docs/live-streaming.md +++ b/docs/live-streaming.md @@ -106,7 +106,10 @@ SimpleExoPlayer player = MediaItem mediaItem = new MediaItem.Builder() .setUri(mediaUri) - .setLiveMaxPlaybackSpeed(1.02f) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setMaxPlaybackSpeed(1.02f) + .build()) .build(); player.setMediaItem(mediaItem); ~~~ diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index fab7b86a16..2fda88cf20 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -9101,7 +9101,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Player.Listener mockListener = mock(Player.Listener.class); player.addListener(mockListener); player.pause(); @@ -9146,7 +9150,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); player.pause(); player.seekTo(18_000); @@ -9187,7 +9195,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); player.pause(); player.setMediaSource(new FakeMediaSource(timeline)); player.prepare(); @@ -9230,7 +9242,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Timeline updatedTimeline = new FakeTimeline( new TimelineWindowDefinition( @@ -9244,7 +9260,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs + 50_000), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(4_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(4_000).build()) + .build())); FakeMediaSource fakeMediaSource = new FakeMediaSource(initialTimeline); player.pause(); player.setMediaSource(fakeMediaSource); @@ -9304,7 +9324,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 20 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Player.Listener mockListener = mock(Player.Listener.class); player.addListener(mockListener); player.pause(); @@ -9353,7 +9377,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); player.pause(); player.addMediaSource(new FakeMediaSource(nonLiveTimeline)); player.addMediaSource(new FakeMediaSource(liveTimeline)); @@ -9393,7 +9421,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Timeline liveTimeline2 = new FakeTimeline( new TimelineWindowDefinition( @@ -9407,7 +9439,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(4_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(4_000).build()) + .build())); player.pause(); player.addMediaSource(new FakeMediaSource(liveTimeline1)); player.addMediaSource(new FakeMediaSource(liveTimeline2)); @@ -9451,7 +9487,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Timeline liveTimeline2 = new FakeTimeline( new TimelineWindowDefinition( @@ -9465,7 +9505,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(4_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(4_000).build()) + .build())); player.pause(); player.addMediaSource(new FakeMediaSource(liveTimeline1)); player.addMediaSource(new FakeMediaSource(liveTimeline2)); @@ -9492,7 +9536,11 @@ public final class ExoPlayerTest { new FakeClock(/* initialTimeMs= */ 987_654_321L, /* isAutoAdvancing= */ true); ExoPlayer player = new TestExoPlayerBuilder(context).setClock(fakeClock).build(); MediaItem mediaItem = - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(4_000).build(); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(4_000).build()) + .build(); Timeline liveTimeline = new SinglePeriodTimeline( /* presentationStartTimeMs= */ C.TIME_UNSET, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java index f15988a8c1..ed1960b708 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java @@ -264,11 +264,14 @@ public final class DefaultMediaSourceFactoryTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(URI_MEDIA + "/file.mp4") - .setLiveTargetOffsetMs(10) - .setLiveMinOffsetMs(1111) - .setLiveMinOffsetMs(3333) - .setLiveMinPlaybackSpeed(20.0f) - .setLiveMaxPlaybackSpeed(20.0f) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(10) + .setMinOffsetMs(1111) + .setMinOffsetMs(3333) + .setMinPlaybackSpeed(20.0f) + .setMaxPlaybackSpeed(20.0f) + .build()) .build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index c9e10b8667..f99e6017b1 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -223,7 +223,8 @@ public final class DashMediaSource extends BaseMediaSource { } /** - * @deprecated Use {@link MediaItem.Builder#setLiveTargetOffsetMs(long)} to override the + * @deprecated Use {@link MediaItem.Builder#setLiveConfiguration(MediaItem.LiveConfiguration)} + * and {@link MediaItem.LiveConfiguration.Builder#setTargetOffsetMs(long)} to override the * manifest, or {@link #setFallbackTargetLiveOffsetMs(long)} to provide a fallback value. */ @Deprecated @@ -321,7 +322,12 @@ public final class DashMediaSource extends BaseMediaSource { mediaItemBuilder.setTag(tag); } if (mediaItem.liveConfiguration.targetOffsetMs == C.TIME_UNSET) { - mediaItemBuilder.setLiveTargetOffsetMs(targetLiveOffsetOverrideMs); + mediaItemBuilder.setLiveConfiguration( + mediaItem + .liveConfiguration + .buildUpon() + .setTargetOffsetMs(targetLiveOffsetOverrideMs) + .build()); } if (mediaItem.playbackProperties == null || mediaItem.playbackProperties.streamKeys.isEmpty()) { @@ -393,7 +399,12 @@ public final class DashMediaSource extends BaseMediaSource { builder.setStreamKeys(streamKeys); } if (needsTargetLiveOffset) { - builder.setLiveTargetOffsetMs(targetLiveOffsetOverrideMs); + builder.setLiveConfiguration( + mediaItem + .liveConfiguration + .buildUpon() + .setTargetOffsetMs(targetLiveOffsetOverrideMs) + .build()); } mediaItem = builder.build(); } diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java index 6f82c4f6fd..cc9947b4d3 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java @@ -187,7 +187,11 @@ public final class DashMediaSourceTest { @Test public void factorySetFallbackTargetLiveOffsetMs_withMediaLiveTargetOffsetMs_usesMediaOffset() { MediaItem mediaItem = - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(2L).build(); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(2L).build()) + .build(); DashMediaSource.Factory factory = new DashMediaSource.Factory(new FileDataSource.Factory()) .setFallbackTargetLiveOffsetMs(1234L); @@ -200,7 +204,11 @@ public final class DashMediaSourceTest { @Test public void factorySetLivePresentationDelayMs_withMediaLiveTargetOffset_usesMediaOffset() { MediaItem mediaItem = - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(2L).build(); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(2L).build()) + .build(); DashMediaSource.Factory factory = new DashMediaSource.Factory(new FileDataSource.Factory()) .setLivePresentationDelayMs(1234L, /* overridesManifest= */ true); @@ -290,11 +298,14 @@ public final class DashMediaSourceTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setLiveTargetOffsetMs(876L) - .setLiveMinPlaybackSpeed(23f) - .setLiveMaxPlaybackSpeed(42f) - .setLiveMinOffsetMs(500L) - .setLiveMaxOffsetMs(20_000L) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(876L) + .setMinPlaybackSpeed(23f) + .setMaxPlaybackSpeed(42f) + .setMinOffsetMs(500L) + .setMaxOffsetMs(20_000L) + .build()) .build(); DashMediaSource mediaSource = new DashMediaSource.Factory( @@ -336,11 +347,14 @@ public final class DashMediaSourceTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setLiveTargetOffsetMs(876L) - .setLiveMinPlaybackSpeed(23f) - .setLiveMaxPlaybackSpeed(42f) - .setLiveMinOffsetMs(200L) - .setLiveMaxOffsetMs(999L) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(876L) + .setMinPlaybackSpeed(23f) + .setMaxPlaybackSpeed(42f) + .setMinOffsetMs(200L) + .setMaxOffsetMs(999L) + .build()) .build(); DashMediaSource mediaSource = new DashMediaSource.Factory( @@ -385,11 +399,14 @@ public final class DashMediaSourceTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setLiveTargetOffsetMs(876L) - .setLiveMinPlaybackSpeed(23f) - .setLiveMaxPlaybackSpeed(42f) - .setLiveMinOffsetMs(100L) - .setLiveMaxOffsetMs(999L) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(876L) + .setMinPlaybackSpeed(23f) + .setMaxPlaybackSpeed(42f) + .setMinOffsetMs(100L) + .setMaxOffsetMs(999L) + .build()) .build(); DashMediaSource mediaSource = new DashMediaSource.Factory( diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 7736b26b4c..6fafd35a46 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -641,7 +641,7 @@ public final class HlsMediaSource extends BaseMediaSource long targetLiveOffsetMs = C.usToMs(targetLiveOffsetUs); if (targetLiveOffsetMs != liveConfiguration.targetOffsetMs) { liveConfiguration = - mediaItem.buildUpon().setLiveTargetOffsetMs(targetLiveOffsetMs).build().liveConfiguration; + liveConfiguration.buildUpon().setTargetOffsetMs(targetLiveOffsetMs).build(); } } diff --git a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java index 635c5615e1..aeda359e0a 100644 --- a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java +++ b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java @@ -364,7 +364,11 @@ public class HlsMediaSourceTest { SystemClock.setCurrentTimeMillis(Util.parseXsDateTime("2020-01-01T00:00:17.0+00:00")); HlsMediaSource.Factory factory = createHlsMediaSourceFactory(playlistUri, playlist); MediaItem mediaItem = - new MediaItem.Builder().setUri(playlistUri).setLiveTargetOffsetMs(3000).build(); + new MediaItem.Builder() + .setUri(playlistUri) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(3000).build()) + .build(); HlsMediaSource mediaSource = factory.createMediaSource(mediaItem); Timeline timeline = prepareAndWaitForTimeline(mediaSource); @@ -439,7 +443,11 @@ public class HlsMediaSourceTest { SystemClock.setCurrentTimeMillis(Util.parseXsDateTime("2020-01-01T00:00:17.0+00:00")); HlsMediaSource.Factory factory = createHlsMediaSourceFactory(playlistUri, playlist); MediaItem mediaItem = - new MediaItem.Builder().setUri(playlistUri).setLiveTargetOffsetMs(3000).build(); + new MediaItem.Builder() + .setUri(playlistUri) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(3000).build()) + .build(); HlsMediaSource mediaSource = factory.createMediaSource(mediaItem); Timeline timeline = prepareAndWaitForTimeline(mediaSource); @@ -469,7 +477,11 @@ public class HlsMediaSourceTest { SystemClock.setCurrentTimeMillis(Util.parseXsDateTime("2020-01-01T00:00:05.0+00:00")); HlsMediaSource.Factory factory = createHlsMediaSourceFactory(playlistUri, playlist); MediaItem mediaItem = - new MediaItem.Builder().setUri(playlistUri).setLiveTargetOffsetMs(1000).build(); + new MediaItem.Builder() + .setUri(playlistUri) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(1000).build()) + .build(); HlsMediaSource mediaSource = factory.createMediaSource(mediaItem); Timeline timeline = prepareAndWaitForTimeline(mediaSource); @@ -502,7 +514,11 @@ public class HlsMediaSourceTest { SystemClock.setCurrentTimeMillis(Util.parseXsDateTime("2020-01-01T00:00:09.0+00:00")); HlsMediaSource.Factory factory = createHlsMediaSourceFactory(playlistUri, playlist); MediaItem mediaItem = - new MediaItem.Builder().setUri(playlistUri).setLiveTargetOffsetMs(20_000).build(); + new MediaItem.Builder() + .setUri(playlistUri) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(20_000).build()) + .build(); HlsMediaSource mediaSource = factory.createMediaSource(mediaItem); Timeline timeline = prepareAndWaitForTimeline(mediaSource);