From f08eed4145613527c0a4907e035ba483db6df253 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 12 Mar 2020 13:55:11 +0000 Subject: [PATCH] Add DRM event plumbing to Playlist and CompositeMediaSource Related to issue:#6765 PiperOrigin-RevId: 300539527 --- .../google/android/exoplayer2/Playlist.java | 53 ++++++++++++++++++- .../source/CompositeMediaSource.java | 53 ++++++++++++++++++- 2 files changed, 102 insertions(+), 4 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Playlist.java b/library/core/src/main/java/com/google/android/exoplayer2/Playlist.java index b11b454d65..94fa88464c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Playlist.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Playlist.java @@ -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) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java index 5876c5157d..5cc75e8e0b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java @@ -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 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 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 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 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) {