Merge "MediaDrm: implement PlaybackComponent"

This commit is contained in:
Robert Shih
2021-01-21 16:36:20 +00:00
committed by Android (Google) Code Review
4 changed files with 110 additions and 6 deletions

View File

@@ -1095,6 +1095,11 @@ package android.media {
method public void forceResourceLost();
}
public final class MediaCodec implements android.media.metrics.PlaybackComponent {
method public String getPlaybackId();
method public void setPlaybackId(@NonNull String);
}
public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint {
ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(int, int, int, int, @NonNull android.util.Size);
ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(@NonNull android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint, @NonNull android.util.Size);
@@ -1103,6 +1108,10 @@ package android.media {
method public int getMaxMacroBlocks();
}
public final class MediaDrm implements java.lang.AutoCloseable {
method @Nullable public android.media.metrics.PlaybackComponent getPlaybackComponent(@NonNull byte[]);
}
public final class MediaRoute2Info implements android.os.Parcelable {
method @NonNull public String getOriginalId();
}
@@ -1165,6 +1174,15 @@ package android.media.audiopolicy {
}
package android.media.metrics {
public interface PlaybackComponent {
method @NonNull public String getPlaybackId();
method public void setPlaybackId(@NonNull String);
}
}
package android.media.tv {
public final class TvInputManager {

View File

@@ -21,8 +21,10 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringDef;
import android.annotation.TestApi;
import android.app.ActivityThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.media.metrics.PlaybackComponent;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
@@ -35,8 +37,8 @@ import dalvik.system.CloseGuard;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
@@ -49,7 +51,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* MediaDrm can be used to obtain keys for decrypting protected media streams, in
* conjunction with {@link android.media.MediaCrypto}. The MediaDrm APIs
@@ -963,14 +964,30 @@ public final class MediaDrm implements AutoCloseable {
* a session
*/
@NonNull
public native byte[] openSession(@SecurityLevel int level) throws
public byte[] openSession(@SecurityLevel int level) throws
NotProvisionedException, ResourceBusyException {
byte[] sessionId = openSessionNative(level);
mPlaybackComponentMap.put(ByteBuffer.wrap(sessionId), new PlaybackComponentImpl(sessionId));
return sessionId;
}
@NonNull
private native byte[] openSessionNative(int level) throws
NotProvisionedException, ResourceBusyException;
/**
* Close a session on the MediaDrm object that was previously opened
* with {@link #openSession}.
*/
public native void closeSession(@NonNull byte[] sessionId);
public void closeSession(@NonNull byte[] sessionId) {
closeSessionNative(sessionId);
mPlaybackComponentMap.remove(ByteBuffer.wrap(sessionId));
}
private native void closeSessionNative(@NonNull byte[] sessionId);
private final Map<ByteBuffer, PlaybackComponent> mPlaybackComponentMap
= new ConcurrentHashMap<>();
/**
* This key request type species that the keys will be for online use, they will
@@ -2056,6 +2073,7 @@ public final class MediaDrm implements AutoCloseable {
mCloseGuard.close();
if (mClosed.compareAndSet(false, true)) {
native_release();
mPlaybackComponentMap.clear();
}
}
@@ -2430,4 +2448,49 @@ public final class MediaDrm implements AutoCloseable {
public static final String EVENT_SESSION_RECLAIMED_COUNT
= "drm.mediadrm.event.SESSION_RECLAIMED.count";
}
/**
* Obtain a {@link PlaybackComponent} associated with a DRM session.
* Call {@link PlaybackComponent#setPlaybackId(String)} on the returned object
* to associate a playback session with the DRM session.
*
* @param sessionId a DRM session ID obtained from {@link #openSession()}
* @return a {@link PlaybackComponent} associated with the session,
* or {@code null} if the session is closed or does not exist.
* @see PlaybackComponent
* @hide
*/
@TestApi
@Nullable
public PlaybackComponent getPlaybackComponent(@NonNull byte[] sessionId) {
if (sessionId == null) {
throw new IllegalArgumentException("sessionId is null");
}
return mPlaybackComponentMap.get(ByteBuffer.wrap(sessionId));
}
private native void setPlaybackId(byte[] sessionId, String playbackId);
private final class PlaybackComponentImpl implements PlaybackComponent {
private final byte[] mSessionId;
private String mPlaybackId = "";
public PlaybackComponentImpl(byte[] sessionId) {
mSessionId = sessionId;
}
@Override
public void setPlaybackId(@NonNull String playbackId) {
if (playbackId == null) {
throw new IllegalArgumentException("playbackId is null");
}
MediaDrm.this.setPlaybackId(mSessionId, playbackId);
mPlaybackId = playbackId;
}
@Override
@NonNull public String getPlaybackId() {
return mPlaybackId;
}
}
}

View File

@@ -17,11 +17,13 @@
package android.media.metrics;
import android.annotation.NonNull;
import android.annotation.TestApi;
/**
* Interface for playback related components used by playback metrics.
* @hide
*/
@TestApi
public interface PlaybackComponent {
/**

View File

@@ -1978,6 +1978,24 @@ static jboolean android_media_MediaDrm_requiresSecureDecoder(
return drm->requiresSecureDecoder(mimeType.c_str(), securityLevel);
}
static void android_media_MediaDrm_setPlaybackId(
JNIEnv *env, jobject thiz, jbyteArray jsessionId,
jstring jplaybackId) {
sp<IDrm> drm = GetDrm(env, thiz);
if (!CheckSession(env, drm, jsessionId)) {
return;
}
Vector<uint8_t> sessionId(JByteArrayToVector(env, jsessionId));
String8 playbackId;
if (jplaybackId != NULL) {
playbackId = JStringToString8(env, jplaybackId);
}
status_t err = drm->setPlaybackId(sessionId, playbackId.c_str());
throwExceptionAsNecessary(env, err, "Failed to set playbackId");
}
static const JNINativeMethod gMethods[] = {
{ "native_release", "()V", (void *)android_media_MediaDrm_native_release },
@@ -1992,10 +2010,10 @@ static const JNINativeMethod gMethods[] = {
{ "isCryptoSchemeSupportedNative", "([BLjava/lang/String;I)Z",
(void *)android_media_MediaDrm_isCryptoSchemeSupportedNative },
{ "openSession", "(I)[B",
{ "openSessionNative", "(I)[B",
(void *)android_media_MediaDrm_openSession },
{ "closeSession", "([B)V",
{ "closeSessionNative", "([B)V",
(void *)android_media_MediaDrm_closeSession },
{ "getKeyRequest", "([B[BLjava/lang/String;ILjava/util/HashMap;)"
@@ -2102,6 +2120,9 @@ static const JNINativeMethod gMethods[] = {
{ "requiresSecureDecoder", "(Ljava/lang/String;I)Z",
(void *)android_media_MediaDrm_requiresSecureDecoder },
{ "setPlaybackId", "([BLjava/lang/String;)V",
(void *)android_media_MediaDrm_setPlaybackId },
};
int register_android_media_Drm(JNIEnv *env) {