Commit 14b40506 by tonihei Committed by Ian Baker

Set LogSessionId on MediaDrm session.

PiperOrigin-RevId: 411047184
parent 9ab02154
...@@ -38,6 +38,7 @@ import androidx.media3.common.util.CopyOnWriteMultiset; ...@@ -38,6 +38,7 @@ import androidx.media3.common.util.CopyOnWriteMultiset;
import androidx.media3.common.util.Log; import androidx.media3.common.util.Log;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.decoder.CryptoConfig; import androidx.media3.decoder.CryptoConfig;
import androidx.media3.exoplayer.analytics.PlayerId;
import androidx.media3.exoplayer.drm.ExoMediaDrm.KeyRequest; import androidx.media3.exoplayer.drm.ExoMediaDrm.KeyRequest;
import androidx.media3.exoplayer.drm.ExoMediaDrm.ProvisionRequest; import androidx.media3.exoplayer.drm.ExoMediaDrm.ProvisionRequest;
import androidx.media3.exoplayer.source.LoadEventInfo; import androidx.media3.exoplayer.source.LoadEventInfo;
...@@ -133,6 +134,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -133,6 +134,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private final HashMap<String, String> keyRequestParameters; private final HashMap<String, String> keyRequestParameters;
private final CopyOnWriteMultiset<DrmSessionEventListener.EventDispatcher> eventDispatchers; private final CopyOnWriteMultiset<DrmSessionEventListener.EventDispatcher> eventDispatchers;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final PlayerId playerId;
/* package */ final MediaDrmCallback callback; /* package */ final MediaDrmCallback callback;
/* package */ final UUID uuid; /* package */ final UUID uuid;
...@@ -182,7 +184,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -182,7 +184,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
HashMap<String, String> keyRequestParameters, HashMap<String, String> keyRequestParameters,
MediaDrmCallback callback, MediaDrmCallback callback,
Looper playbackLooper, Looper playbackLooper,
LoadErrorHandlingPolicy loadErrorHandlingPolicy) { LoadErrorHandlingPolicy loadErrorHandlingPolicy,
PlayerId playerId) {
if (mode == DefaultDrmSessionManager.MODE_QUERY if (mode == DefaultDrmSessionManager.MODE_QUERY
|| mode == DefaultDrmSessionManager.MODE_RELEASE) { || mode == DefaultDrmSessionManager.MODE_RELEASE) {
Assertions.checkNotNull(offlineLicenseKeySetId); Assertions.checkNotNull(offlineLicenseKeySetId);
...@@ -204,6 +207,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -204,6 +207,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
this.callback = callback; this.callback = callback;
this.eventDispatchers = new CopyOnWriteMultiset<>(); this.eventDispatchers = new CopyOnWriteMultiset<>();
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; this.loadErrorHandlingPolicy = loadErrorHandlingPolicy;
this.playerId = playerId;
state = STATE_OPENING; state = STATE_OPENING;
responseHandler = new ResponseHandler(playbackLooper); responseHandler = new ResponseHandler(playbackLooper);
} }
...@@ -370,6 +374,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -370,6 +374,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
try { try {
sessionId = mediaDrm.openSession(); sessionId = mediaDrm.openSession();
mediaDrm.setPlayerIdForSession(sessionId, playerId);
cryptoConfig = mediaDrm.createCryptoConfig(sessionId); cryptoConfig = mediaDrm.createCryptoConfig(sessionId);
state = STATE_OPENED; state = STATE_OPENED;
// Capture state into a local so a consistent value is seen by the lambda. // Capture state into a local so a consistent value is seen by the lambda.
......
...@@ -307,6 +307,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { ...@@ -307,6 +307,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
private @MonotonicNonNull Handler playbackHandler; private @MonotonicNonNull Handler playbackHandler;
private int mode; private int mode;
@Nullable private byte[] offlineLicenseKeySetId; @Nullable private byte[] offlineLicenseKeySetId;
private @MonotonicNonNull PlayerId playerId;
/* package */ volatile @Nullable MediaDrmHandler mediaDrmHandler; /* package */ volatile @Nullable MediaDrmHandler mediaDrmHandler;
...@@ -495,6 +496,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { ...@@ -495,6 +496,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Override @Override
public void setPlayer(Looper playbackLooper, PlayerId playerId) { public void setPlayer(Looper playbackLooper, PlayerId playerId) {
initPlaybackLooper(playbackLooper); initPlaybackLooper(playbackLooper);
this.playerId = playerId;
} }
@Override @Override
...@@ -780,7 +782,8 @@ public class DefaultDrmSessionManager implements DrmSessionManager { ...@@ -780,7 +782,8 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
keyRequestParameters, keyRequestParameters,
callback, callback,
checkNotNull(playbackLooper), checkNotNull(playbackLooper),
loadErrorHandlingPolicy); loadErrorHandlingPolicy,
checkNotNull(playerId));
// Acquire the session once on behalf of the caller to DrmSessionManager - this is the // 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, // 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 // to ensure that eventDispatcher receives all events related to the initial
......
...@@ -29,6 +29,7 @@ import androidx.media3.common.C; ...@@ -29,6 +29,7 @@ import androidx.media3.common.C;
import androidx.media3.common.DrmInitData.SchemeData; import androidx.media3.common.DrmInitData.SchemeData;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.decoder.CryptoConfig; import androidx.media3.decoder.CryptoConfig;
import androidx.media3.exoplayer.analytics.PlayerId;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
...@@ -398,6 +399,14 @@ public interface ExoMediaDrm { ...@@ -398,6 +399,14 @@ public interface ExoMediaDrm {
void closeSession(byte[] sessionId); 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. * Generates a key request.
* *
* @param scope If {@code keyType} is {@link #KEY_TYPE_STREAMING} or {@link #KEY_TYPE_OFFLINE}, * @param scope If {@code keyType} is {@link #KEY_TYPE_STREAMING} or {@link #KEY_TYPE_OFFLINE},
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
*/ */
package androidx.media3.exoplayer.drm; package androidx.media3.exoplayer.drm;
import static androidx.media3.common.util.Assertions.checkNotNull;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.media.DeniedByServerException; import android.media.DeniedByServerException;
import android.media.MediaCrypto; import android.media.MediaCrypto;
...@@ -23,6 +25,7 @@ import android.media.MediaDrm; ...@@ -23,6 +25,7 @@ import android.media.MediaDrm;
import android.media.MediaDrmException; import android.media.MediaDrmException;
import android.media.NotProvisionedException; import android.media.NotProvisionedException;
import android.media.UnsupportedSchemeException; import android.media.UnsupportedSchemeException;
import android.media.metrics.LogSessionId;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.DoNotInline; import androidx.annotation.DoNotInline;
...@@ -37,6 +40,7 @@ import androidx.media3.common.util.Log; ...@@ -37,6 +40,7 @@ import androidx.media3.common.util.Log;
import androidx.media3.common.util.ParsableByteArray; import androidx.media3.common.util.ParsableByteArray;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.exoplayer.analytics.PlayerId;
import androidx.media3.extractor.mp4.PsshAtomUtil; import androidx.media3.extractor.mp4.PsshAtomUtil;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
...@@ -185,6 +189,13 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { ...@@ -185,6 +189,13 @@ public final class FrameworkMediaDrm implements ExoMediaDrm {
mediaDrm.closeSession(sessionId); 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. // Return values of MediaDrm.KeyRequest.getRequestType are equal to KeyRequest.RequestType.
@SuppressLint("WrongConstant") @SuppressLint("WrongConstant")
@Override @Override
...@@ -507,9 +518,22 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { ...@@ -507,9 +518,22 @@ public final class FrameworkMediaDrm implements ExoMediaDrm {
@RequiresApi(31) @RequiresApi(31)
private static class Api31 { private static class Api31 {
private Api31() {}
@DoNotInline @DoNotInline
public static boolean requiresSecureDecoder(MediaDrm mediaDrm, String mimeType) { public static boolean requiresSecureDecoder(MediaDrm mediaDrm, String mimeType) {
return mediaDrm.requiresSecureDecoder(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);
}
}
} }
} }
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