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;
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) {
......
......@@ -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) {
......
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