Commit f08eed41 by ibaker Committed by Oliver Woodman

Add DRM event plumbing to Playlist and CompositeMediaSource

Related to issue:#6765

PiperOrigin-RevId: 300539527
parent beab272a
...@@ -18,6 +18,7 @@ package com.google.android.exoplayer2; ...@@ -18,6 +18,7 @@ package com.google.android.exoplayer2;
import android.os.Handler; import android.os.Handler;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.analytics.AnalyticsCollector; 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.LoadEventInfo;
import com.google.android.exoplayer2.source.MaskingMediaPeriod; import com.google.android.exoplayer2.source.MaskingMediaPeriod;
import com.google.android.exoplayer2.source.MaskingMediaSource; import com.google.android.exoplayer2.source.MaskingMediaSource;
...@@ -425,9 +426,10 @@ import java.util.Set; ...@@ -425,9 +426,10 @@ import java.util.Set;
MediaSource mediaSource = holder.mediaSource; MediaSource mediaSource = holder.mediaSource;
MediaSource.MediaSourceCaller caller = MediaSource.MediaSourceCaller caller =
(source, timeline) -> playlistInfoListener.onPlaylistUpdateRequested(); (source, timeline) -> playlistInfoListener.onPlaylistUpdateRequested();
MediaSourceEventListener eventListener = new ForwardingEventListener(holder); ForwardingEventListener eventListener = new ForwardingEventListener(holder);
childSources.put(holder, new MediaSourceAndListener(mediaSource, caller, eventListener)); childSources.put(holder, new MediaSourceAndListener(mediaSource, caller, eventListener));
mediaSource.addEventListener(Util.createHandler(), eventListener); mediaSource.addEventListener(Util.createHandler(), eventListener);
mediaSource.addDrmEventListener(Util.createHandler(), eventListener);
mediaSource.prepareSource(caller, mediaTransferListener); mediaSource.prepareSource(caller, mediaTransferListener);
} }
...@@ -588,7 +590,8 @@ import java.util.Set; ...@@ -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 final Playlist.MediaSourceHolder id;
private EventDispatcher eventDispatcher; private EventDispatcher eventDispatcher;
...@@ -598,6 +601,8 @@ import java.util.Set; ...@@ -598,6 +601,8 @@ import java.util.Set;
this.id = id; this.id = id;
} }
// MediaSourceEventListener implementation
@Override @Override
public void onMediaPeriodCreated(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) { public void onMediaPeriodCreated(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) {
if (maybeUpdateEventDispatcher(windowIndex, mediaPeriodId)) { if (maybeUpdateEventDispatcher(windowIndex, mediaPeriodId)) {
...@@ -685,6 +690,50 @@ import java.util.Set; ...@@ -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. */ /** Updates the event dispatcher and returns whether the event should be dispatched. */
private boolean maybeUpdateEventDispatcher( private boolean maybeUpdateEventDispatcher(
int childWindowIndex, @Nullable MediaSource.MediaPeriodId childMediaPeriodId) { int childWindowIndex, @Nullable MediaSource.MediaPeriodId childMediaPeriodId) {
......
...@@ -19,6 +19,7 @@ import android.os.Handler; ...@@ -19,6 +19,7 @@ import android.os.Handler;
import androidx.annotation.CallSuper; import androidx.annotation.CallSuper;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.Timeline; 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.upstream.TransferListener;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.UnknownNull; import com.google.android.exoplayer2.util.UnknownNull;
...@@ -110,9 +111,10 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource { ...@@ -110,9 +111,10 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
Assertions.checkArgument(!childSources.containsKey(id)); Assertions.checkArgument(!childSources.containsKey(id));
MediaSourceCaller caller = MediaSourceCaller caller =
(source, timeline) -> onChildSourceInfoRefreshed(id, source, timeline); (source, timeline) -> onChildSourceInfoRefreshed(id, source, timeline);
MediaSourceEventListener eventListener = new ForwardingEventListener(id); ForwardingEventListener eventListener = new ForwardingEventListener(id);
childSources.put(id, new MediaSourceAndListener(mediaSource, caller, eventListener)); childSources.put(id, new MediaSourceAndListener(mediaSource, caller, eventListener));
mediaSource.addEventListener(Assertions.checkNotNull(eventHandler), eventListener); mediaSource.addEventListener(Assertions.checkNotNull(eventHandler), eventListener);
mediaSource.addDrmEventListener(Assertions.checkNotNull(eventHandler), eventListener);
mediaSource.prepareSource(caller, mediaTransferListener); mediaSource.prepareSource(caller, mediaTransferListener);
if (!isEnabled()) { if (!isEnabled()) {
mediaSource.disable(caller); mediaSource.disable(caller);
...@@ -216,7 +218,8 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource { ...@@ -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; @UnknownNull private final T id;
private EventDispatcher eventDispatcher; private EventDispatcher eventDispatcher;
...@@ -226,6 +229,8 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource { ...@@ -226,6 +229,8 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource {
this.id = id; this.id = id;
} }
// MediaSourceEventListener implementation
@Override @Override
public void onMediaPeriodCreated(int windowIndex, MediaPeriodId mediaPeriodId) { public void onMediaPeriodCreated(int windowIndex, MediaPeriodId mediaPeriodId) {
if (maybeUpdateEventDispatcher(windowIndex, mediaPeriodId)) { if (maybeUpdateEventDispatcher(windowIndex, mediaPeriodId)) {
...@@ -316,6 +321,50 @@ public abstract class CompositeMediaSource<T> extends BaseMediaSource { ...@@ -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. */ /** Updates the event dispatcher and returns whether the event should be dispatched. */
private boolean maybeUpdateEventDispatcher( private boolean maybeUpdateEventDispatcher(
int childWindowIndex, @Nullable MediaPeriodId childMediaPeriodId) { int childWindowIndex, @Nullable MediaPeriodId childMediaPeriodId) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment