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:
parent
6c0d676050
commit
3cbe91a3b0
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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<FrameworkMediaCrypto> drmSessionManager) {
|
||||
@Deprecated
|
||||
public DefaultRenderersFactory(
|
||||
Context context, @Nullable DrmSessionManager<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> drmSessionManager) {
|
||||
if (drmSessionManager == null) {
|
||||
drmSessionManager = this.drmSessionManager;
|
||||
}
|
||||
ArrayList<Renderer> renderersList = new ArrayList<>();
|
||||
buildVideoRenderers(context, drmSessionManager, allowedVideoJoiningTimeMs,
|
||||
eventHandler, videoRendererEventListener, extensionRendererMode, renderersList);
|
||||
|
@ -58,8 +58,8 @@ public final class ExoPlayerFactory {
|
||||
public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector,
|
||||
LoadControl loadControl,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> drmSessionManager) {
|
||||
return new SimpleExoPlayer(renderersFactory, trackSelector, loadControl, drmSessionManager);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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<FrameworkMediaCrypto> drmSessionManager);
|
||||
}
|
||||
|
@ -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<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 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<FrameworkMediaCrypto> 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;
|
||||
|
@ -298,8 +298,9 @@ public final class DashTestRunner {
|
||||
protected SimpleExoPlayer buildExoPlayer(HostActivity host, Surface surface,
|
||||
MappingTrackSelector trackSelector,
|
||||
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
||||
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(
|
||||
new DebugRenderersFactory(host, drmSessionManager), trackSelector);
|
||||
SimpleExoPlayer player =
|
||||
ExoPlayerFactory.newSimpleInstance(
|
||||
new DebugRenderersFactory(host), trackSelector, drmSessionManager);
|
||||
player.setVideoSurface(surface);
|
||||
return player;
|
||||
}
|
||||
|
@ -42,9 +42,8 @@ import java.util.ArrayList;
|
||||
@TargetApi(16)
|
||||
public class DebugRenderersFactory extends DefaultRenderersFactory {
|
||||
|
||||
public DebugRenderersFactory(Context context,
|
||||
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
||||
super(context, drmSessionManager, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, 0);
|
||||
public DebugRenderersFactory(Context context) {
|
||||
super(context, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -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<FrameworkMediaCrypto> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user