From f64c28f2a67d5ebc10ba3a0b05e8ad4c705c423e Mon Sep 17 00:00:00 2001 From: tonihei Date: Fri, 19 Nov 2021 14:30:31 +0000 Subject: [PATCH] Set LogSessionId on MediaDrm session. PiperOrigin-RevId: 411047184 --- .../exoplayer2/drm/DefaultDrmSession.java | 7 +++++- .../drm/DefaultDrmSessionManager.java | 5 +++- .../android/exoplayer2/drm/ExoMediaDrm.java | 9 +++++++ .../exoplayer2/drm/FrameworkMediaDrm.java | 24 +++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java index fff8ab9e7b..43c91d0f30 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java @@ -31,6 +31,7 @@ import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest; @@ -133,6 +134,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private final HashMap keyRequestParameters; private final CopyOnWriteMultiset eventDispatchers; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; + private final PlayerId playerId; /* package */ final MediaDrmCallback callback; /* package */ final UUID uuid; @@ -182,7 +184,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; HashMap keyRequestParameters, MediaDrmCallback callback, Looper playbackLooper, - LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + LoadErrorHandlingPolicy loadErrorHandlingPolicy, + PlayerId playerId) { if (mode == DefaultDrmSessionManager.MODE_QUERY || mode == DefaultDrmSessionManager.MODE_RELEASE) { Assertions.checkNotNull(offlineLicenseKeySetId); @@ -204,6 +207,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; this.callback = callback; this.eventDispatchers = new CopyOnWriteMultiset<>(); this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; + this.playerId = playerId; state = STATE_OPENING; responseHandler = new ResponseHandler(playbackLooper); } @@ -370,6 +374,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; try { sessionId = mediaDrm.openSession(); + mediaDrm.setPlayerIdForSession(sessionId, playerId); cryptoConfig = mediaDrm.createCryptoConfig(sessionId); state = STATE_OPENED; // Capture state into a local so a consistent value is seen by the lambda. 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 652eb8b4a2..3fe2636d09 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 @@ -304,6 +304,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { private @MonotonicNonNull Handler playbackHandler; private int mode; @Nullable private byte[] offlineLicenseKeySetId; + private @MonotonicNonNull PlayerId playerId; /* package */ volatile @Nullable MediaDrmHandler mediaDrmHandler; @@ -492,6 +493,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { @Override public void setPlayer(Looper playbackLooper, PlayerId playerId) { initPlaybackLooper(playbackLooper); + this.playerId = playerId; } @Override @@ -777,7 +779,8 @@ public class DefaultDrmSessionManager implements DrmSessionManager { keyRequestParameters, callback, checkNotNull(playbackLooper), - loadErrorHandlingPolicy); + loadErrorHandlingPolicy, + checkNotNull(playerId)); // Acquire the session once on behalf of the caller to DrmSessionManager - this is the // reference 'assigned' to the caller which they're responsible for releasing. Do this first, // to ensure that eventDispatcher receives all events related to the initial 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 6d6a0a821a..722a010150 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 @@ -26,6 +26,7 @@ import android.os.PersistableBundle; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import java.lang.annotation.Documented; @@ -395,6 +396,14 @@ public interface ExoMediaDrm { */ void closeSession(byte[] sessionId); + /** + * Sets the {@link PlayerId} of the player using a session. + * + * @param sessionId The ID of the session. + * @param playerId The {@link PlayerId} of the player using the session. + */ + default void setPlayerIdForSession(byte[] sessionId, PlayerId playerId) {} + /** * Generates a key request. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java index 9cc9910443..2d02921c98 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.drm; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + import android.annotation.SuppressLint; import android.media.DeniedByServerException; import android.media.MediaCrypto; @@ -23,12 +25,14 @@ import android.media.MediaDrm; import android.media.MediaDrmException; import android.media.NotProvisionedException; import android.media.UnsupportedSchemeException; +import android.media.metrics.LogSessionId; import android.os.PersistableBundle; import android.text.TextUtils; import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil; import com.google.android.exoplayer2.util.Assertions; @@ -182,6 +186,13 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { mediaDrm.closeSession(sessionId); } + @Override + public void setPlayerIdForSession(byte[] sessionId, PlayerId playerId) { + if (Util.SDK_INT >= 31) { + Api31.setLogSessionIdOnMediaDrmSession(mediaDrm, sessionId, playerId); + } + } + // Return values of MediaDrm.KeyRequest.getRequestType are equal to KeyRequest.RequestType. @SuppressLint("WrongConstant") @Override @@ -504,9 +515,22 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { @RequiresApi(31) private static class Api31 { + private Api31() {} + @DoNotInline public static boolean requiresSecureDecoder(MediaDrm mediaDrm, String mimeType) { return mediaDrm.requiresSecureDecoder(mimeType); } + + @DoNotInline + public static void setLogSessionIdOnMediaDrmSession( + MediaDrm mediaDrm, byte[] drmSessionId, PlayerId playerId) { + LogSessionId logSessionId = playerId.getLogSessionId(); + if (!logSessionId.equals(LogSessionId.LOG_SESSION_ID_NONE)) { + MediaDrm.PlaybackComponent playbackComponent = + checkNotNull(mediaDrm.getPlaybackComponent(drmSessionId)); + playbackComponent.setLogSessionId(logSessionId); + } + } } }