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
This commit is contained in:
tonihei 2018-03-26 09:50:11 -07:00 committed by Oliver Woodman
parent 6c0d676050
commit 3cbe91a3b0
10 changed files with 141 additions and 53 deletions

View File

@ -35,7 +35,9 @@
* Add release method to Cache interface. * Add release method to Cache interface.
* Prevent multiple instances of SimpleCache in the same folder. * Prevent multiple instances of SimpleCache in the same folder.
Previous instance must be released. 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 * Fix handling of zero padded strings when parsing Matroska streams
([#4010](https://github.com/google/ExoPlayer/issues/4010)). ([#4010](https://github.com/google/ExoPlayer/issues/4010)).
* Fix ANR issue on Redmi 4X and Redmi Note 4 * Fix ANR issue on Redmi 4X and Redmi Note 4

View File

@ -120,7 +120,7 @@ import java.util.ArrayList;
concatenatingMediaSource = new ConcatenatingMediaSource(); concatenatingMediaSource = new ConcatenatingMediaSource();
DefaultTrackSelector trackSelector = new DefaultTrackSelector(BANDWIDTH_METER); DefaultTrackSelector trackSelector = new DefaultTrackSelector(BANDWIDTH_METER);
RenderersFactory renderersFactory = new DefaultRenderersFactory(context, null); RenderersFactory renderersFactory = new DefaultRenderersFactory(context);
exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector); exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector);
exoPlayer.addListener(this); exoPlayer.addListener(this);
localPlayerView.setPlayer(exoPlayer); localPlayerView.setPlayer(exoPlayer);

View File

@ -309,10 +309,11 @@ public class PlayerActivity extends Activity
? (preferExtensionDecoders ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER ? (preferExtensionDecoders ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER
: DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON) : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
: DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF; : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF;
DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this, DefaultRenderersFactory renderersFactory =
drmSessionManager, extensionRendererMode); new DefaultRenderersFactory(this, extensionRendererMode);
player = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector); player =
ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, drmSessionManager);
player.addListener(new PlayerEventListener()); player.addListener(new PlayerEventListener());
player.addListener(eventLogger); player.addListener(eventLogger);
player.addMetadataOutput(eventLogger); player.addMetadataOutput(eventLogger);

View File

@ -90,28 +90,37 @@ public class DefaultRenderersFactory implements RenderersFactory {
* @param context A {@link Context}. * @param context A {@link Context}.
*/ */
public DefaultRenderersFactory(Context context) { public DefaultRenderersFactory(Context context) {
this(context, null); this(context, EXTENSION_RENDERER_MODE_OFF);
} }
/** /**
* @param context A {@link Context}. * @deprecated Use {@link #DefaultRenderersFactory(Context)} and pass {@link DrmSessionManager}
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if DRM protected * directly to {@link SimpleExoPlayer} or {@link ExoPlayerFactory}.
* playbacks are not required.
*/ */
public DefaultRenderersFactory(Context context, @Deprecated
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) { public DefaultRenderersFactory(
Context context, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
this(context, drmSessionManager, EXTENSION_RENDERER_MODE_OFF); this(context, drmSessionManager, EXTENSION_RENDERER_MODE_OFF);
} }
/** /**
* @param context A {@link Context}. * @param context A {@link Context}.
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if DRM protected * @param extensionRendererMode The extension renderer mode, which determines if and how available
* playbacks are not required. * extension renderers are used. Note that extensions must be included in the application
* @param extensionRendererMode The extension renderer mode, which determines if and how * build for them to be considered available.
* 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<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@ExtensionRendererMode int extensionRendererMode) { @ExtensionRendererMode int extensionRendererMode) {
this(context, drmSessionManager, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS); 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 context A {@link Context}.
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if DRM protected * @param extensionRendererMode The extension renderer mode, which determines if and how available
* playbacks are not required. * extension renderers are used. Note that extensions must be included in the application
* @param extensionRendererMode The extension renderer mode, which determines if and how * build for them to be considered available.
* available extension renderers are used. Note that extensions must be included in the * @param allowedVideoJoiningTimeMs The maximum duration for which video renderers can attempt to
* application build for them to be considered available. * seamlessly join an ongoing playback.
* @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<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@ExtensionRendererMode int extensionRendererMode, long allowedVideoJoiningTimeMs) { @ExtensionRendererMode int extensionRendererMode,
long allowedVideoJoiningTimeMs) {
this.context = context; this.context = context;
this.drmSessionManager = drmSessionManager;
this.extensionRendererMode = extensionRendererMode; this.extensionRendererMode = extensionRendererMode;
this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs; this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs;
this.drmSessionManager = drmSessionManager;
} }
@Override @Override
public Renderer[] createRenderers(Handler eventHandler, public Renderer[] createRenderers(
Handler eventHandler,
VideoRendererEventListener videoRendererEventListener, VideoRendererEventListener videoRendererEventListener,
AudioRendererEventListener audioRendererEventListener, AudioRendererEventListener audioRendererEventListener,
TextOutput textRendererOutput, MetadataOutput metadataRendererOutput) { TextOutput textRendererOutput,
MetadataOutput metadataRendererOutput,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
if (drmSessionManager == null) {
drmSessionManager = this.drmSessionManager;
}
ArrayList<Renderer> renderersList = new ArrayList<>(); ArrayList<Renderer> renderersList = new ArrayList<>();
buildVideoRenderers(context, drmSessionManager, allowedVideoJoiningTimeMs, buildVideoRenderers(context, drmSessionManager, allowedVideoJoiningTimeMs,
eventHandler, videoRendererEventListener, extensionRendererMode, renderersList); eventHandler, videoRendererEventListener, extensionRendererMode, renderersList);

View File

@ -58,8 +58,8 @@ public final class ExoPlayerFactory {
public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector, public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) { @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
RenderersFactory renderersFactory = new DefaultRenderersFactory(context, drmSessionManager); RenderersFactory renderersFactory = new DefaultRenderersFactory(context);
return newSimpleInstance(renderersFactory, trackSelector, loadControl); return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager);
} }
/** /**
@ -79,9 +79,8 @@ public final class ExoPlayerFactory {
public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector, public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector,
LoadControl loadControl, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, LoadControl loadControl, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) { @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) {
RenderersFactory renderersFactory = new DefaultRenderersFactory(context, drmSessionManager, RenderersFactory renderersFactory = new DefaultRenderersFactory(context, extensionRendererMode);
extensionRendererMode); return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager);
return newSimpleInstance(renderersFactory, trackSelector, loadControl);
} }
/** /**
@ -104,9 +103,9 @@ public final class ExoPlayerFactory {
LoadControl loadControl, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, LoadControl loadControl, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode, @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode,
long allowedVideoJoiningTimeMs) { long allowedVideoJoiningTimeMs) {
RenderersFactory renderersFactory = new DefaultRenderersFactory(context, drmSessionManager, RenderersFactory renderersFactory =
extensionRendererMode, allowedVideoJoiningTimeMs); new DefaultRenderersFactory(context, extensionRendererMode, allowedVideoJoiningTimeMs);
return newSimpleInstance(renderersFactory, trackSelector, loadControl); return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager);
} }
/** /**
@ -130,6 +129,22 @@ public final class ExoPlayerFactory {
return newSimpleInstance(renderersFactory, trackSelector, new DefaultLoadControl()); 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<FrameworkMediaCrypto> drmSessionManager) {
return newSimpleInstance(
renderersFactory, trackSelector, new DefaultLoadControl(), drmSessionManager);
}
/** /**
* Creates a {@link SimpleExoPlayer} instance. * Creates a {@link SimpleExoPlayer} instance.
* *
@ -139,7 +154,25 @@ public final class ExoPlayerFactory {
*/ */
public static SimpleExoPlayer newSimpleInstance(RenderersFactory renderersFactory, public static SimpleExoPlayer newSimpleInstance(RenderersFactory renderersFactory,
TrackSelector trackSelector, LoadControl loadControl) { 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<FrameworkMediaCrypto> drmSessionManager) {
return new SimpleExoPlayer(renderersFactory, trackSelector, loadControl, drmSessionManager);
} }
/** /**

View File

@ -16,7 +16,10 @@
package com.google.android.exoplayer2; package com.google.android.exoplayer2;
import android.os.Handler; import android.os.Handler;
import android.support.annotation.Nullable;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; 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.metadata.MetadataOutput;
import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.text.TextOutput;
import com.google.android.exoplayer2.video.VideoRendererEventListener; import com.google.android.exoplayer2.video.VideoRendererEventListener;
@ -34,11 +37,14 @@ public interface RenderersFactory {
* @param audioRendererEventListener An event listener for audio renderers. * @param audioRendererEventListener An event listener for audio renderers.
* @param textRendererOutput An output for text renderers. * @param textRendererOutput An output for text renderers.
* @param metadataRendererOutput An output for metadata renderers. * @param metadataRendererOutput An output for metadata renderers.
* @param drmSessionManager A drm session manager used by renderers.
* @return The {@link Renderer instances}. * @return The {@link Renderer instances}.
*/ */
Renderer[] createRenderers(Handler eventHandler, Renderer[] createRenderers(
Handler eventHandler,
VideoRendererEventListener videoRendererEventListener, VideoRendererEventListener videoRendererEventListener,
AudioRendererEventListener audioRendererEventListener, TextOutput textRendererOutput, AudioRendererEventListener audioRendererEventListener,
MetadataOutput metadataRendererOutput); TextOutput textRendererOutput,
MetadataOutput metadataRendererOutput,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager);
} }

View File

@ -30,6 +30,8 @@ import android.view.TextureView;
import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioAttributes;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.decoder.DecoderCounters; 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.Metadata;
import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataOutput;
import com.google.android.exoplayer2.source.MediaSource; 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 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 trackSelector The {@link TrackSelector} that will be used by the instance.
* @param loadControl The {@link LoadControl} 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( protected SimpleExoPlayer(
RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl) { RenderersFactory renderersFactory,
this(renderersFactory, trackSelector, loadControl, Clock.DEFAULT); TrackSelector trackSelector,
LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
this(renderersFactory, trackSelector, loadControl, drmSessionManager, Clock.DEFAULT);
} }
/** /**
* @param renderersFactory A factory for creating {@link Renderer}s to be used by the 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 trackSelector The {@link TrackSelector} that will be used by the instance.
* @param loadControl The {@link LoadControl} 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 * @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. * 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, RenderersFactory renderersFactory,
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
Clock clock) { Clock clock) {
componentListener = new ComponentListener(); componentListener = new ComponentListener();
videoListeners = new CopyOnWriteArraySet<>(); videoListeners = new CopyOnWriteArraySet<>();
@ -114,8 +124,14 @@ public class SimpleExoPlayer implements ExoPlayer, Player.VideoComponent, Player
audioDebugListeners = new CopyOnWriteArraySet<>(); audioDebugListeners = new CopyOnWriteArraySet<>();
Looper eventLooper = Looper.myLooper() != null ? Looper.myLooper() : Looper.getMainLooper(); Looper eventLooper = Looper.myLooper() != null ? Looper.myLooper() : Looper.getMainLooper();
Handler eventHandler = new Handler(eventLooper); Handler eventHandler = new Handler(eventLooper);
renderers = renderersFactory.createRenderers(eventHandler, componentListener, componentListener, renderers =
componentListener, componentListener); renderersFactory.createRenderers(
eventHandler,
componentListener,
componentListener,
componentListener,
componentListener,
drmSessionManager);
// Set initial values. // Set initial values.
audioVolume = 1; audioVolume = 1;

View File

@ -298,8 +298,9 @@ public final class DashTestRunner {
protected SimpleExoPlayer buildExoPlayer(HostActivity host, Surface surface, protected SimpleExoPlayer buildExoPlayer(HostActivity host, Surface surface,
MappingTrackSelector trackSelector, MappingTrackSelector trackSelector,
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) { DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance( SimpleExoPlayer player =
new DebugRenderersFactory(host, drmSessionManager), trackSelector); ExoPlayerFactory.newSimpleInstance(
new DebugRenderersFactory(host), trackSelector, drmSessionManager);
player.setVideoSurface(surface); player.setVideoSurface(surface);
return player; return player;
} }

View File

@ -42,9 +42,8 @@ import java.util.ArrayList;
@TargetApi(16) @TargetApi(16)
public class DebugRenderersFactory extends DefaultRenderersFactory { public class DebugRenderersFactory extends DefaultRenderersFactory {
public DebugRenderersFactory(Context context, public DebugRenderersFactory(Context context) {
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) { super(context, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, 0);
super(context, drmSessionManager, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, 0);
} }
@Override @Override

View File

@ -29,6 +29,8 @@ import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; 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.metadata.MetadataOutput;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
@ -298,7 +300,8 @@ public final class ExoPlayerTestRunner extends Player.DefaultEventListener
VideoRendererEventListener videoRendererEventListener, VideoRendererEventListener videoRendererEventListener,
AudioRendererEventListener audioRendererEventListener, AudioRendererEventListener audioRendererEventListener,
TextOutput textRendererOutput, TextOutput textRendererOutput,
MetadataOutput metadataRendererOutput) { MetadataOutput metadataRendererOutput,
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
return renderers; return renderers;
} }
}; };
@ -634,7 +637,7 @@ public final class ExoPlayerTestRunner extends Player.DefaultEventListener
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
Clock clock) { Clock clock) {
super(renderersFactory, trackSelector, loadControl, clock); super(renderersFactory, trackSelector, loadControl, /* drmSessionManager= */ null, clock);
} }
} }
} }