From ecc834d70431f6b8e0d5ac9bc011d9bb6587ff9f Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Mon, 20 Jul 2020 14:30:23 +0100 Subject: [PATCH] Make DrmSessionManager.getExoMediaCryptoType cover placeholder sessions getExoMediaCryptoType will only return null for drmInitData == null and track types for which placeholder sessions are not used. This change will allow renderers to abstract themselves from format.drmInitData. PiperOrigin-RevId: 322131219 --- .../drm/DefaultDrmSessionManager.java | 15 ++++++++--- .../exoplayer2/drm/DrmSessionManager.java | 25 +++++++++++++++---- .../exoplayer2/drm/DummyExoMediaDrm.java | 6 ++--- .../android/exoplayer2/drm/ExoMediaDrm.java | 6 +---- .../source/ProgressiveMediaPeriod.java | 3 ++- .../source/dash/DashMediaPeriod.java | 3 ++- .../source/hls/HlsSampleStreamWrapper.java | 3 ++- .../source/smoothstreaming/SsMediaPeriod.java | 5 +++- .../exoplayer2/testutil/FakeExoMediaDrm.java | 3 +-- 9 files changed, 45 insertions(+), 24 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index 890c2dac28..fb23005b82 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -578,10 +578,17 @@ public class DefaultDrmSessionManager implements DrmSessionManager { @Override @Nullable - public Class getExoMediaCryptoType(DrmInitData drmInitData) { - return canAcquireSession(drmInitData) - ? Assertions.checkNotNull(exoMediaDrm).getExoMediaCryptoType() - : null; + public Class getExoMediaCryptoType( + @Nullable DrmInitData drmInitData, int trackType) { + Class exoMediaCryptoType = + Assertions.checkNotNull(exoMediaDrm).getExoMediaCryptoType(); + if (drmInitData == null) { + return Util.linearSearch(useDrmSessionsForClearContentTrackTypes, trackType) != C.INDEX_UNSET + ? exoMediaCryptoType + : null; + } else { + return canAcquireSession(drmInitData) ? exoMediaCryptoType : UnsupportedMediaCrypto.class; + } } // Internal methods. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java index 69da101837..df2536b6f8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java @@ -49,8 +49,9 @@ public interface DrmSessionManager { @Override @Nullable - public Class getExoMediaCryptoType(DrmInitData drmInitData) { - return null; + public Class getExoMediaCryptoType( + @Nullable DrmInitData drmInitData, int trackType) { + return drmInitData != null ? UnsupportedMediaCrypto.class : null; } }; @@ -118,9 +119,23 @@ public interface DrmSessionManager { DrmInitData drmInitData); /** - * Returns the {@link ExoMediaCrypto} type returned by sessions acquired using the given {@link - * DrmInitData}, or null if a session cannot be acquired with the given {@link DrmInitData}. + * Returns the {@link ExoMediaCrypto} type associated to sessions acquired using the given + * parameters. Returns the {@link UnsupportedMediaCrypto} type if this DRM session manager does + * not support the given {@link DrmInitData}. If {@code drmInitData} is null, returns an {@link + * ExoMediaCrypto} type if this DRM session manager would associate a {@link + * #acquirePlaceholderSession placeholder session} to the given {@code trackType}, or null + * otherwise. + * + * @param drmInitData The {@link DrmInitData} to acquire sessions with. May be null for + * unencrypted content (See {@link #acquirePlaceholderSession placeholder sessions}). + * @param trackType The type of the track to which {@code drmInitData} belongs. Must be one of the + * {@link C}{@code .TRACK_TYPE_*} constants. + * @return The {@link ExoMediaCrypto} type associated to sessions acquired using the given + * parameters, or the {@link UnsupportedMediaCrypto} type if the provided {@code drmInitData} + * is not supported, or {@code null} if {@code drmInitData} is null and no DRM session will be + * associated to the given {@code trackType}. */ @Nullable - Class getExoMediaCryptoType(DrmInitData drmInitData); + Class getExoMediaCryptoType( + @Nullable DrmInitData drmInitData, int trackType); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java index d8311f6701..9631b76491 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java @@ -142,9 +142,7 @@ public final class DummyExoMediaDrm implements ExoMediaDrm { } @Override - @Nullable - public Class getExoMediaCryptoType() { - // No ExoMediaCrypto type is supported. - return null; + public Class getExoMediaCryptoType() { + return UnsupportedMediaCrypto.class; } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java index 957945fa2a..6684064f63 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java @@ -369,10 +369,6 @@ public interface ExoMediaDrm { */ ExoMediaCrypto createMediaCrypto(byte[] sessionId) throws MediaCryptoException; - /** - * Returns the {@link ExoMediaCrypto} type created by {@link #createMediaCrypto(byte[])}, or null - * if this instance cannot create any {@link ExoMediaCrypto} instances. - */ - @Nullable + /** Returns the {@link ExoMediaCrypto} type created by {@link #createMediaCrypto(byte[])}. */ Class getExoMediaCryptoType(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index cd1b49d101..77901cc3fb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -787,7 +787,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; if (trackFormat.drmInitData != null) { trackFormat = trackFormat.copyWithExoMediaCryptoType( - drmSessionManager.getExoMediaCryptoType(trackFormat.drmInitData)); + drmSessionManager.getExoMediaCryptoType( + trackFormat.drmInitData, MimeTypes.getTrackType(trackFormat.sampleMimeType))); } trackArray[i] = new TrackGroup(trackFormat); } diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java index 3d5f05268b..f466f8eae0 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java @@ -674,7 +674,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; if (drmInitData != null) { format = format.copyWithExoMediaCryptoType( - drmSessionManager.getExoMediaCryptoType(drmInitData)); + drmSessionManager.getExoMediaCryptoType( + drmInitData, MimeTypes.getTrackType(format.sampleMimeType))); } formats[j] = format; } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index e7f55807f8..f599938cfe 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -1313,7 +1313,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; if (format.drmInitData != null) { format = format.copyWithExoMediaCryptoType( - drmSessionManager.getExoMediaCryptoType(format.drmInitData)); + drmSessionManager.getExoMediaCryptoType( + format.drmInitData, MimeTypes.getTrackType(format.sampleMimeType))); } exposedFormats[j] = format; } diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java index 6fe999661c..80743fd9a2 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java @@ -36,6 +36,7 @@ import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoaderErrorThrower; import com.google.android.exoplayer2.upstream.TransferListener; +import com.google.android.exoplayer2.util.MimeTypes; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -274,7 +275,9 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; exposedFormats[j] = manifestFormat.drmInitData != null ? manifestFormat.copyWithExoMediaCryptoType( - drmSessionManager.getExoMediaCryptoType(manifestFormat.drmInitData)) + drmSessionManager.getExoMediaCryptoType( + manifestFormat.drmInitData, + MimeTypes.getTrackType(manifestFormat.sampleMimeType))) : manifestFormat; } trackGroups[i] = new TrackGroup(exposedFormats); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java index c698b2e8b3..19ea68cbf2 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java @@ -269,9 +269,8 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { return new FakeExoMediaCrypto(); } - @Nullable @Override - public Class getExoMediaCryptoType() { + public Class getExoMediaCryptoType() { return FakeExoMediaCrypto.class; }