From 3cbe91a3b0b31ac5b7a9a206e3378f87d662678b Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 26 Mar 2018 09:50:11 -0700 Subject: [PATCH] Pass DrmSessionManager through SimpleExoPlayer. This will allow SimpleExoPlayer to auto-register its own listener before the drm session manager is used to set-up the renderers. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=190478174 --- RELEASENOTES.md | 4 +- .../exoplayer2/castdemo/PlayerManager.java | 2 +- .../exoplayer2/demo/PlayerActivity.java | 7 +- .../exoplayer2/DefaultRenderersFactory.java | 75 +++++++++++++------ .../android/exoplayer2/ExoPlayerFactory.java | 51 ++++++++++--- .../android/exoplayer2/RenderersFactory.java | 14 +++- .../android/exoplayer2/SimpleExoPlayer.java | 24 +++++- .../playbacktests/gts/DashTestRunner.java | 5 +- .../testutil/DebugRenderersFactory.java | 5 +- .../testutil/ExoPlayerTestRunner.java | 7 +- 10 files changed, 141 insertions(+), 53 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b3040ab995..1d6df24d99 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -35,7 +35,9 @@ * Add release method to Cache interface. * Prevent multiple instances of SimpleCache in the same folder. Previous instance must be released. -* DRM: Allow multiple listeners for `DefaultDrmSessionManager`. +* DRM: + * Allow multiple listeners for `DefaultDrmSessionManager`. + * Pass `DrmSessionManager` to `ExoPlayerFactory` instead of `RendererFactory`. * Fix handling of zero padded strings when parsing Matroska streams ([#4010](https://github.com/google/ExoPlayer/issues/4010)). * Fix ANR issue on Redmi 4X and Redmi Note 4 diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 5ee74a595c..63b18b0aa7 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -120,7 +120,7 @@ import java.util.ArrayList; concatenatingMediaSource = new ConcatenatingMediaSource(); DefaultTrackSelector trackSelector = new DefaultTrackSelector(BANDWIDTH_METER); - RenderersFactory renderersFactory = new DefaultRenderersFactory(context, null); + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector); exoPlayer.addListener(this); localPlayerView.setPlayer(exoPlayer); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index f625f71f69..de5463aa89 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -309,10 +309,11 @@ public class PlayerActivity extends Activity ? (preferExtensionDecoders ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON) : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF; - DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this, - drmSessionManager, extensionRendererMode); + DefaultRenderersFactory renderersFactory = + new DefaultRenderersFactory(this, extensionRendererMode); - player = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector); + player = + ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, drmSessionManager); player.addListener(new PlayerEventListener()); player.addListener(eventLogger); player.addMetadataOutput(eventLogger); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java index 16074108b1..940d9376c1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java @@ -90,28 +90,37 @@ public class DefaultRenderersFactory implements RenderersFactory { * @param context A {@link Context}. */ public DefaultRenderersFactory(Context context) { - this(context, null); + this(context, EXTENSION_RENDERER_MODE_OFF); } /** - * @param context A {@link Context}. - * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if DRM protected - * playbacks are not required. + * @deprecated Use {@link #DefaultRenderersFactory(Context)} and pass {@link DrmSessionManager} + * directly to {@link SimpleExoPlayer} or {@link ExoPlayerFactory}. */ - public DefaultRenderersFactory(Context context, - @Nullable DrmSessionManager drmSessionManager) { + @Deprecated + public DefaultRenderersFactory( + Context context, @Nullable DrmSessionManager drmSessionManager) { this(context, drmSessionManager, EXTENSION_RENDERER_MODE_OFF); } /** * @param context A {@link Context}. - * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if DRM protected - * playbacks are not required. - * @param extensionRendererMode The extension renderer mode, which determines if and how - * available extension renderers are used. Note that extensions must be included in the - * application build for them to be considered available. + * @param extensionRendererMode The extension renderer mode, which determines if and how available + * extension renderers are used. Note that extensions must be included in the application + * build for them to be considered available. */ - public DefaultRenderersFactory(Context context, + public DefaultRenderersFactory( + Context context, @ExtensionRendererMode int extensionRendererMode) { + this(context, null, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS); + } + + /** + * @deprecated Use {@link #DefaultRenderersFactory(Context, int)} and pass {@link + * DrmSessionManager} directly to {@link SimpleExoPlayer} or {@link ExoPlayerFactory}. + */ + @Deprecated + public DefaultRenderersFactory( + Context context, @Nullable DrmSessionManager drmSessionManager, @ExtensionRendererMode int extensionRendererMode) { this(context, drmSessionManager, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS); @@ -119,28 +128,46 @@ public class DefaultRenderersFactory implements RenderersFactory { /** * @param context A {@link Context}. - * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if DRM protected - * playbacks are not required. - * @param extensionRendererMode The extension renderer mode, which determines if and how - * available extension renderers are used. Note that extensions must be included in the - * application build for them to be considered available. - * @param allowedVideoJoiningTimeMs The maximum duration for which video renderers can attempt - * to seamlessly join an ongoing playback. + * @param extensionRendererMode The extension renderer mode, which determines if and how available + * extension renderers are used. Note that extensions must be included in the application + * build for them to be considered available. + * @param allowedVideoJoiningTimeMs The maximum duration for which video renderers can attempt to + * seamlessly join an ongoing playback. */ - public DefaultRenderersFactory(Context context, + public DefaultRenderersFactory( + Context context, + @ExtensionRendererMode int extensionRendererMode, + long allowedVideoJoiningTimeMs) { + this(context, null, extensionRendererMode, allowedVideoJoiningTimeMs); + } + + /** + * @deprecated Use {@link #DefaultRenderersFactory(Context, int, long)} and pass {@link + * DrmSessionManager} directly to {@link SimpleExoPlayer} or {@link ExoPlayerFactory}. + */ + @Deprecated + public DefaultRenderersFactory( + Context context, @Nullable DrmSessionManager drmSessionManager, - @ExtensionRendererMode int extensionRendererMode, long allowedVideoJoiningTimeMs) { + @ExtensionRendererMode int extensionRendererMode, + long allowedVideoJoiningTimeMs) { this.context = context; - this.drmSessionManager = drmSessionManager; this.extensionRendererMode = extensionRendererMode; this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs; + this.drmSessionManager = drmSessionManager; } @Override - public Renderer[] createRenderers(Handler eventHandler, + public Renderer[] createRenderers( + Handler eventHandler, VideoRendererEventListener videoRendererEventListener, AudioRendererEventListener audioRendererEventListener, - TextOutput textRendererOutput, MetadataOutput metadataRendererOutput) { + TextOutput textRendererOutput, + MetadataOutput metadataRendererOutput, + @Nullable DrmSessionManager drmSessionManager) { + if (drmSessionManager == null) { + drmSessionManager = this.drmSessionManager; + } ArrayList renderersList = new ArrayList<>(); buildVideoRenderers(context, drmSessionManager, allowedVideoJoiningTimeMs, eventHandler, videoRendererEventListener, extensionRendererMode, renderersList); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java index 821671e34e..b89968e168 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java @@ -58,8 +58,8 @@ public final class ExoPlayerFactory { public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager) { - RenderersFactory renderersFactory = new DefaultRenderersFactory(context, drmSessionManager); - return newSimpleInstance(renderersFactory, trackSelector, loadControl); + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); + return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager); } /** @@ -79,9 +79,8 @@ public final class ExoPlayerFactory { public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager, @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) { - RenderersFactory renderersFactory = new DefaultRenderersFactory(context, drmSessionManager, - extensionRendererMode); - return newSimpleInstance(renderersFactory, trackSelector, loadControl); + RenderersFactory renderersFactory = new DefaultRenderersFactory(context, extensionRendererMode); + return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager); } /** @@ -104,9 +103,9 @@ public final class ExoPlayerFactory { LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager, @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode, long allowedVideoJoiningTimeMs) { - RenderersFactory renderersFactory = new DefaultRenderersFactory(context, drmSessionManager, - extensionRendererMode, allowedVideoJoiningTimeMs); - return newSimpleInstance(renderersFactory, trackSelector, loadControl); + RenderersFactory renderersFactory = + new DefaultRenderersFactory(context, extensionRendererMode, allowedVideoJoiningTimeMs); + return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager); } /** @@ -130,6 +129,22 @@ public final class ExoPlayerFactory { return newSimpleInstance(renderersFactory, trackSelector, new DefaultLoadControl()); } + /** + * Creates a {@link SimpleExoPlayer} instance. + * + * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. + * @param trackSelector The {@link TrackSelector} that will be used by the instance. + * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the instance + * will not be used for DRM protected playbacks. + */ + public static SimpleExoPlayer newSimpleInstance( + RenderersFactory renderersFactory, + TrackSelector trackSelector, + @Nullable DrmSessionManager drmSessionManager) { + return newSimpleInstance( + renderersFactory, trackSelector, new DefaultLoadControl(), drmSessionManager); + } + /** * Creates a {@link SimpleExoPlayer} instance. * @@ -139,7 +154,25 @@ public final class ExoPlayerFactory { */ public static SimpleExoPlayer newSimpleInstance(RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl) { - return new SimpleExoPlayer(renderersFactory, trackSelector, loadControl); + return new SimpleExoPlayer( + renderersFactory, trackSelector, loadControl, /* drmSessionManager= */ null); + } + + /** + * Creates a {@link SimpleExoPlayer} instance. + * + * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. + * @param trackSelector The {@link TrackSelector} that will be used by the instance. + * @param loadControl The {@link LoadControl} that will be used by the instance. + * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the instance + * will not be used for DRM protected playbacks. + */ + public static SimpleExoPlayer newSimpleInstance( + RenderersFactory renderersFactory, + TrackSelector trackSelector, + LoadControl loadControl, + @Nullable DrmSessionManager drmSessionManager) { + return new SimpleExoPlayer(renderersFactory, trackSelector, loadControl, drmSessionManager); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/RenderersFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/RenderersFactory.java index 944a6a9e5e..e221898471 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/RenderersFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/RenderersFactory.java @@ -16,7 +16,10 @@ package com.google.android.exoplayer2; import android.os.Handler; +import android.support.annotation.Nullable; import com.google.android.exoplayer2.audio.AudioRendererEventListener; +import com.google.android.exoplayer2.drm.DrmSessionManager; +import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.video.VideoRendererEventListener; @@ -34,11 +37,14 @@ public interface RenderersFactory { * @param audioRendererEventListener An event listener for audio renderers. * @param textRendererOutput An output for text renderers. * @param metadataRendererOutput An output for metadata renderers. + * @param drmSessionManager A drm session manager used by renderers. * @return The {@link Renderer instances}. */ - Renderer[] createRenderers(Handler eventHandler, + Renderer[] createRenderers( + Handler eventHandler, VideoRendererEventListener videoRendererEventListener, - AudioRendererEventListener audioRendererEventListener, TextOutput textRendererOutput, - MetadataOutput metadataRendererOutput); - + AudioRendererEventListener audioRendererEventListener, + TextOutput textRendererOutput, + MetadataOutput metadataRendererOutput, + @Nullable DrmSessionManager drmSessionManager); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 98ef35d62c..419e082dea 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -30,6 +30,8 @@ import android.view.TextureView; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.decoder.DecoderCounters; +import com.google.android.exoplayer2.drm.DrmSessionManager; +import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.MediaSource; @@ -88,16 +90,23 @@ public class SimpleExoPlayer implements ExoPlayer, Player.VideoComponent, Player * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. + * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the instance + * will not be used for DRM protected playbacks. */ protected SimpleExoPlayer( - RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl) { - this(renderersFactory, trackSelector, loadControl, Clock.DEFAULT); + RenderersFactory renderersFactory, + TrackSelector trackSelector, + LoadControl loadControl, + @Nullable DrmSessionManager drmSessionManager) { + this(renderersFactory, trackSelector, loadControl, drmSessionManager, Clock.DEFAULT); } /** * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. + * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the instance + * will not be used for DRM protected playbacks. * @param clock The {@link Clock} that will be used by the instance. Should always be {@link * Clock#DEFAULT}, unless the player is being used from a test. */ @@ -105,6 +114,7 @@ public class SimpleExoPlayer implements ExoPlayer, Player.VideoComponent, Player RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, + @Nullable DrmSessionManager drmSessionManager, Clock clock) { componentListener = new ComponentListener(); videoListeners = new CopyOnWriteArraySet<>(); @@ -114,8 +124,14 @@ public class SimpleExoPlayer implements ExoPlayer, Player.VideoComponent, Player audioDebugListeners = new CopyOnWriteArraySet<>(); Looper eventLooper = Looper.myLooper() != null ? Looper.myLooper() : Looper.getMainLooper(); Handler eventHandler = new Handler(eventLooper); - renderers = renderersFactory.createRenderers(eventHandler, componentListener, componentListener, - componentListener, componentListener); + renderers = + renderersFactory.createRenderers( + eventHandler, + componentListener, + componentListener, + componentListener, + componentListener, + drmSessionManager); // Set initial values. audioVolume = 1; diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java index f121ef944d..4e26255aa1 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java @@ -298,8 +298,9 @@ public final class DashTestRunner { protected SimpleExoPlayer buildExoPlayer(HostActivity host, Surface surface, MappingTrackSelector trackSelector, DrmSessionManager drmSessionManager) { - SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance( - new DebugRenderersFactory(host, drmSessionManager), trackSelector); + SimpleExoPlayer player = + ExoPlayerFactory.newSimpleInstance( + new DebugRenderersFactory(host), trackSelector, drmSessionManager); player.setVideoSurface(surface); return player; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DebugRenderersFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DebugRenderersFactory.java index 392a4907d4..4bbfef6bb8 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DebugRenderersFactory.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DebugRenderersFactory.java @@ -42,9 +42,8 @@ import java.util.ArrayList; @TargetApi(16) public class DebugRenderersFactory extends DefaultRenderersFactory { - public DebugRenderersFactory(Context context, - DrmSessionManager drmSessionManager) { - super(context, drmSessionManager, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, 0); + public DebugRenderersFactory(Context context) { + super(context, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, 0); } @Override diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index 8f06b82674..a5d282f631 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -29,6 +29,8 @@ import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioRendererEventListener; +import com.google.android.exoplayer2.drm.DrmSessionManager; +import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -298,7 +300,8 @@ public final class ExoPlayerTestRunner extends Player.DefaultEventListener VideoRendererEventListener videoRendererEventListener, AudioRendererEventListener audioRendererEventListener, TextOutput textRendererOutput, - MetadataOutput metadataRendererOutput) { + MetadataOutput metadataRendererOutput, + DrmSessionManager drmSessionManager) { return renderers; } }; @@ -634,7 +637,7 @@ public final class ExoPlayerTestRunner extends Player.DefaultEventListener TrackSelector trackSelector, LoadControl loadControl, Clock clock) { - super(renderersFactory, trackSelector, loadControl, clock); + super(renderersFactory, trackSelector, loadControl, /* drmSessionManager= */ null, clock); } } }