Add DRM event plumbing to Playlist and CompositeMediaSource

Related to issue:#6765

PiperOrigin-RevId: 300539527
This commit is contained in:
ibaker 2020-03-12 13:55:11 +00:00 committed by Oliver Woodman
parent beab272a8c
commit f08eed4145
2 changed files with 102 additions and 4 deletions

View file

@ -18,6 +18,7 @@ package com.google.android.exoplayer2;
import android.os.Handler;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MaskingMediaPeriod;
import com.google.android.exoplayer2.source.MaskingMediaSource;
@ -425,9 +426,10 @@ import java.util.Set;
MediaSource mediaSource = holder.mediaSource;
MediaSource.MediaSourceCaller caller =
(source, timeline) -> playlistInfoListener.onPlaylistUpdateRequested();
MediaSourceEventListener eventListener = new ForwardingEventListener(holder);
ForwardingEventListener eventListener = new ForwardingEventListener(holder);
childSources.put(holder, new MediaSourceAndListener(mediaSource, caller, eventListener));
mediaSource.addEventListener(Util.createHandler(), eventListener);
mediaSource.addDrmEventListener(Util.createHandler(), eventListener);
mediaSource.prepareSource(caller, mediaTransferListener);
}
@ -588,7 +590,8 @@ import java.util.Set;
}
}
private final class ForwardingEventListener implements MediaSourceEventListener {
private final class ForwardingEventListener
implements MediaSourceEventListener, DrmSessionEventListener {
private final Playlist.MediaSourceHolder id;
private EventDispatcher eventDispatcher;
@ -598,6 +601,8 @@ import java.util.Set;
this.id = id;
}
// MediaSourceEventListener implementation
@Override
public void onMediaPeriodCreated(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) {
if (maybeUpdateEventDispatcher(windowIndex, mediaPeriodId)) {
@ -685,6 +690,50 @@ import java.util.Set;
}
}
// DrmSessionEventListener implementation
@Override
public void onDrmSessionAcquired() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionAcquired(),
DrmSessionEventListener.class);
}
@Override
public void onDrmKeysLoaded() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysLoaded(),
DrmSessionEventListener.class);
}
@Override
public void onDrmSessionManagerError(Exception error) {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionManagerError(error),
DrmSessionEventListener.class);
}
@Override
public void onDrmKeysRestored() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysRestored(),
DrmSessionEventListener.class);
}
@Override
public void onDrmKeysRemoved() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysRemoved(),
DrmSessionEventListener.class);
}
@Override
public void onDrmSessionReleased() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionReleased(),
DrmSessionEventListener.class);
}
/** Updates the event dispatcher and returns whether the event should be dispatched. */
private boolean maybeUpdateEventDispatcher(
int childWindowIndex, @Nullable MediaSource.MediaPeriodId childMediaPeriodId) {

View file

@ -19,6 +19,7 @@ import android.os.Handler;
import androidx.annotation.CallSuper;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.upstream.TransferListener;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.UnknownNull;
@ -110,9 +111,10 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
Assertions.checkArgument(!childSources.containsKey(id));
MediaSourceCaller caller =
(source, timeline) -> onChildSourceInfoRefreshed(id, source, timeline);
MediaSourceEventListener eventListener = new ForwardingEventListener(id);
ForwardingEventListener eventListener = new ForwardingEventListener(id);
childSources.put(id, new MediaSourceAndListener(mediaSource, caller, eventListener));
mediaSource.addEventListener(Assertions.checkNotNull(eventHandler), eventListener);
mediaSource.addDrmEventListener(Assertions.checkNotNull(eventHandler), eventListener);
mediaSource.prepareSource(caller, mediaTransferListener);
if (!isEnabled()) {
mediaSource.disable(caller);
@ -216,7 +218,8 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
}
}
private final class ForwardingEventListener implements MediaSourceEventListener {
private final class ForwardingEventListener
implements MediaSourceEventListener, DrmSessionEventListener {
@UnknownNull private final T id;
private EventDispatcher eventDispatcher;
@ -226,6 +229,8 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
this.id = id;
}
// MediaSourceEventListener implementation
@Override
public void onMediaPeriodCreated(int windowIndex, MediaPeriodId mediaPeriodId) {
if (maybeUpdateEventDispatcher(windowIndex, mediaPeriodId)) {
@ -316,6 +321,50 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
}
}
// DrmSessionEventListener implementation
@Override
public void onDrmSessionAcquired() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionAcquired(),
DrmSessionEventListener.class);
}
@Override
public void onDrmKeysLoaded() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysLoaded(),
DrmSessionEventListener.class);
}
@Override
public void onDrmSessionManagerError(Exception error) {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionManagerError(error),
DrmSessionEventListener.class);
}
@Override
public void onDrmKeysRestored() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysRestored(),
DrmSessionEventListener.class);
}
@Override
public void onDrmKeysRemoved() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysRemoved(),
DrmSessionEventListener.class);
}
@Override
public void onDrmSessionReleased() {
eventDispatcher.dispatch(
(listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionReleased(),
DrmSessionEventListener.class);
}
/** Updates the event dispatcher and returns whether the event should be dispatched. */
private boolean maybeUpdateEventDispatcher(
int childWindowIndex, @Nullable MediaPeriodId childMediaPeriodId) {