mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2025-01-09 13:43:22 +00:00
408 lines
18 KiB
Java
408 lines
18 KiB
Java
package androidx.media3.exoplayer.drm;
|
|
|
|
import android.media.DeniedByServerException;
|
|
import android.media.MediaCrypto;
|
|
import android.media.MediaCryptoException;
|
|
import android.media.MediaDrm;
|
|
import android.media.MediaDrmException;
|
|
import android.media.NotProvisionedException;
|
|
import android.media.UnsupportedSchemeException;
|
|
import android.media.metrics.LogSessionId;
|
|
import android.os.Handler;
|
|
import android.os.PersistableBundle;
|
|
import android.text.TextUtils;
|
|
import androidx.media3.common.C;
|
|
import androidx.media3.common.DrmInitData;
|
|
import androidx.media3.common.util.Assertions;
|
|
import androidx.media3.common.util.Log;
|
|
import androidx.media3.common.util.ParsableByteArray;
|
|
import androidx.media3.common.util.Util;
|
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
|
import androidx.media3.exoplayer.drm.ExoMediaDrm;
|
|
import androidx.media3.extractor.mp4.PsshAtomUtil;
|
|
import com.google.common.base.Charsets;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.UUID;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public final class FrameworkMediaDrm implements ExoMediaDrm {
|
|
private static final String CENC_SCHEME_MIME_TYPE = "cenc";
|
|
public static final ExoMediaDrm.Provider DEFAULT_PROVIDER = new ExoMediaDrm.Provider() { // from class: androidx.media3.exoplayer.drm.FrameworkMediaDrm$$ExternalSyntheticLambda1
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm.Provider
|
|
public final ExoMediaDrm acquireExoMediaDrm(UUID uuid) {
|
|
return FrameworkMediaDrm.lambda$static$0(uuid);
|
|
}
|
|
};
|
|
private static final String MOCK_LA_URL = "<LA_URL>https://x</LA_URL>";
|
|
private static final String MOCK_LA_URL_VALUE = "https://x";
|
|
private static final String TAG = "FrameworkMediaDrm";
|
|
private static final int UTF_16_BYTES_PER_CHARACTER = 2;
|
|
private final MediaDrm mediaDrm;
|
|
private int referenceCount;
|
|
private final UUID uuid;
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public int getCryptoType() {
|
|
return 2;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public static /* synthetic */ ExoMediaDrm lambda$static$0(UUID uuid) {
|
|
try {
|
|
return newInstance(uuid);
|
|
} catch (UnsupportedDrmException unused) {
|
|
Log.e(TAG, "Failed to instantiate a FrameworkMediaDrm for uuid: " + uuid + ".");
|
|
return new DummyExoMediaDrm();
|
|
}
|
|
}
|
|
|
|
public static boolean isCryptoSchemeSupported(UUID uuid) {
|
|
return MediaDrm.isCryptoSchemeSupported(adjustUuid(uuid));
|
|
}
|
|
|
|
public static FrameworkMediaDrm newInstance(UUID uuid) throws UnsupportedDrmException {
|
|
try {
|
|
return new FrameworkMediaDrm(uuid);
|
|
} catch (UnsupportedSchemeException e) {
|
|
throw new UnsupportedDrmException(1, e);
|
|
} catch (Exception e2) {
|
|
throw new UnsupportedDrmException(2, e2);
|
|
}
|
|
}
|
|
|
|
private FrameworkMediaDrm(UUID uuid) throws UnsupportedSchemeException {
|
|
Assertions.checkNotNull(uuid);
|
|
Assertions.checkArgument(!C.COMMON_PSSH_UUID.equals(uuid), "Use C.CLEARKEY_UUID instead");
|
|
this.uuid = uuid;
|
|
MediaDrm mediaDrm = new MediaDrm(adjustUuid(uuid));
|
|
this.mediaDrm = mediaDrm;
|
|
this.referenceCount = 1;
|
|
if (C.WIDEVINE_UUID.equals(uuid) && needsForceWidevineL3Workaround()) {
|
|
forceWidevineL3(mediaDrm);
|
|
}
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void setOnEventListener(final ExoMediaDrm.OnEventListener onEventListener) {
|
|
this.mediaDrm.setOnEventListener(onEventListener == null ? null : new MediaDrm.OnEventListener() { // from class: androidx.media3.exoplayer.drm.FrameworkMediaDrm$$ExternalSyntheticLambda2
|
|
@Override // android.media.MediaDrm.OnEventListener
|
|
public final void onEvent(MediaDrm mediaDrm, byte[] bArr, int i, int i2, byte[] bArr2) {
|
|
FrameworkMediaDrm.this.m5240x5e84e274(onEventListener, mediaDrm, bArr, i, i2, bArr2);
|
|
}
|
|
});
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* renamed from: lambda$setOnEventListener$1$androidx-media3-exoplayer-drm-FrameworkMediaDrm, reason: not valid java name */
|
|
public /* synthetic */ void m5240x5e84e274(ExoMediaDrm.OnEventListener onEventListener, MediaDrm mediaDrm, byte[] bArr, int i, int i2, byte[] bArr2) {
|
|
onEventListener.onEvent(this, bArr, i, i2, bArr2);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void setOnKeyStatusChangeListener(final ExoMediaDrm.OnKeyStatusChangeListener onKeyStatusChangeListener) {
|
|
if (Util.SDK_INT < 23) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
this.mediaDrm.setOnKeyStatusChangeListener(onKeyStatusChangeListener == null ? null : new MediaDrm.OnKeyStatusChangeListener() { // from class: androidx.media3.exoplayer.drm.FrameworkMediaDrm$$ExternalSyntheticLambda3
|
|
@Override // android.media.MediaDrm.OnKeyStatusChangeListener
|
|
public final void onKeyStatusChange(MediaDrm mediaDrm, byte[] bArr, List list, boolean z) {
|
|
FrameworkMediaDrm.this.m5242xc78bb65c(onKeyStatusChangeListener, mediaDrm, bArr, list, z);
|
|
}
|
|
}, (Handler) null);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* renamed from: lambda$setOnKeyStatusChangeListener$2$androidx-media3-exoplayer-drm-FrameworkMediaDrm, reason: not valid java name */
|
|
public /* synthetic */ void m5242xc78bb65c(ExoMediaDrm.OnKeyStatusChangeListener onKeyStatusChangeListener, MediaDrm mediaDrm, byte[] bArr, List list, boolean z) {
|
|
ArrayList arrayList = new ArrayList();
|
|
Iterator it = list.iterator();
|
|
while (it.hasNext()) {
|
|
MediaDrm.KeyStatus keyStatus = (MediaDrm.KeyStatus) it.next();
|
|
arrayList.add(new ExoMediaDrm.KeyStatus(keyStatus.getStatusCode(), keyStatus.getKeyId()));
|
|
}
|
|
onKeyStatusChangeListener.onKeyStatusChange(this, bArr, arrayList, z);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void setOnExpirationUpdateListener(final ExoMediaDrm.OnExpirationUpdateListener onExpirationUpdateListener) {
|
|
if (Util.SDK_INT < 23) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
this.mediaDrm.setOnExpirationUpdateListener(onExpirationUpdateListener == null ? null : new MediaDrm.OnExpirationUpdateListener() { // from class: androidx.media3.exoplayer.drm.FrameworkMediaDrm$$ExternalSyntheticLambda0
|
|
@Override // android.media.MediaDrm.OnExpirationUpdateListener
|
|
public final void onExpirationUpdate(MediaDrm mediaDrm, byte[] bArr, long j) {
|
|
FrameworkMediaDrm.this.m5241x3bcdcffc(onExpirationUpdateListener, mediaDrm, bArr, j);
|
|
}
|
|
}, (Handler) null);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* renamed from: lambda$setOnExpirationUpdateListener$3$androidx-media3-exoplayer-drm-FrameworkMediaDrm, reason: not valid java name */
|
|
public /* synthetic */ void m5241x3bcdcffc(ExoMediaDrm.OnExpirationUpdateListener onExpirationUpdateListener, MediaDrm mediaDrm, byte[] bArr, long j) {
|
|
onExpirationUpdateListener.onExpirationUpdate(this, bArr, j);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public byte[] openSession() throws MediaDrmException {
|
|
return this.mediaDrm.openSession();
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void closeSession(byte[] bArr) {
|
|
this.mediaDrm.closeSession(bArr);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void setPlayerIdForSession(byte[] bArr, PlayerId playerId) {
|
|
if (Util.SDK_INT >= 31) {
|
|
try {
|
|
Api31.setLogSessionIdOnMediaDrmSession(this.mediaDrm, bArr, playerId);
|
|
} catch (UnsupportedOperationException unused) {
|
|
Log.w(TAG, "setLogSessionId failed.");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public ExoMediaDrm.KeyRequest getKeyRequest(byte[] bArr, List<DrmInitData.SchemeData> list, int i, HashMap<String, String> hashMap) throws NotProvisionedException {
|
|
DrmInitData.SchemeData schemeData;
|
|
byte[] bArr2;
|
|
String str;
|
|
if (list != null) {
|
|
schemeData = getSchemeData(this.uuid, list);
|
|
bArr2 = adjustRequestInitData(this.uuid, (byte[]) Assertions.checkNotNull(schemeData.data));
|
|
str = adjustRequestMimeType(this.uuid, schemeData.mimeType);
|
|
} else {
|
|
schemeData = null;
|
|
bArr2 = null;
|
|
str = null;
|
|
}
|
|
MediaDrm.KeyRequest keyRequest = this.mediaDrm.getKeyRequest(bArr, bArr2, str, i, hashMap);
|
|
byte[] adjustRequestData = adjustRequestData(this.uuid, keyRequest.getData());
|
|
String adjustLicenseServerUrl = adjustLicenseServerUrl(keyRequest.getDefaultUrl());
|
|
if (TextUtils.isEmpty(adjustLicenseServerUrl) && schemeData != null && !TextUtils.isEmpty(schemeData.licenseServerUrl)) {
|
|
adjustLicenseServerUrl = schemeData.licenseServerUrl;
|
|
}
|
|
return new ExoMediaDrm.KeyRequest(adjustRequestData, adjustLicenseServerUrl, Util.SDK_INT >= 23 ? keyRequest.getRequestType() : Integer.MIN_VALUE);
|
|
}
|
|
|
|
private static String adjustLicenseServerUrl(String str) {
|
|
return MOCK_LA_URL.equals(str) ? "" : (Util.SDK_INT == 33 && "https://default.url".equals(str)) ? "" : str;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public byte[] provideKeyResponse(byte[] bArr, byte[] bArr2) throws NotProvisionedException, DeniedByServerException {
|
|
if (C.CLEARKEY_UUID.equals(this.uuid)) {
|
|
bArr2 = ClearKeyUtil.adjustResponseData(bArr2);
|
|
}
|
|
return this.mediaDrm.provideKeyResponse(bArr, bArr2);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public ExoMediaDrm.ProvisionRequest getProvisionRequest() {
|
|
MediaDrm.ProvisionRequest provisionRequest = this.mediaDrm.getProvisionRequest();
|
|
return new ExoMediaDrm.ProvisionRequest(provisionRequest.getData(), provisionRequest.getDefaultUrl());
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void provideProvisionResponse(byte[] bArr) throws DeniedByServerException {
|
|
this.mediaDrm.provideProvisionResponse(bArr);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public Map<String, String> queryKeyStatus(byte[] bArr) {
|
|
return this.mediaDrm.queryKeyStatus(bArr);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public boolean requiresSecureDecoder(byte[] bArr, String str) {
|
|
if (Util.SDK_INT >= 31) {
|
|
return Api31.requiresSecureDecoder(this.mediaDrm, str);
|
|
}
|
|
try {
|
|
MediaCrypto mediaCrypto = new MediaCrypto(this.uuid, bArr);
|
|
try {
|
|
return mediaCrypto.requiresSecureDecoderComponent(str);
|
|
} finally {
|
|
mediaCrypto.release();
|
|
}
|
|
} catch (MediaCryptoException unused) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public synchronized void acquire() {
|
|
Assertions.checkState(this.referenceCount > 0);
|
|
this.referenceCount++;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public synchronized void release() {
|
|
int i = this.referenceCount - 1;
|
|
this.referenceCount = i;
|
|
if (i == 0) {
|
|
this.mediaDrm.release();
|
|
}
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void restoreKeys(byte[] bArr, byte[] bArr2) {
|
|
this.mediaDrm.restoreKeys(bArr, bArr2);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public PersistableBundle getMetrics() {
|
|
if (Util.SDK_INT < 28) {
|
|
return null;
|
|
}
|
|
return this.mediaDrm.getMetrics();
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public String getPropertyString(String str) {
|
|
return this.mediaDrm.getPropertyString(str);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public byte[] getPropertyByteArray(String str) {
|
|
return this.mediaDrm.getPropertyByteArray(str);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void setPropertyString(String str, String str2) {
|
|
this.mediaDrm.setPropertyString(str, str2);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public void setPropertyByteArray(String str, byte[] bArr) {
|
|
this.mediaDrm.setPropertyByteArray(str, bArr);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.drm.ExoMediaDrm
|
|
public FrameworkCryptoConfig createCryptoConfig(byte[] bArr) throws MediaCryptoException {
|
|
return new FrameworkCryptoConfig(adjustUuid(this.uuid), bArr, Util.SDK_INT < 21 && C.WIDEVINE_UUID.equals(this.uuid) && "L3".equals(getPropertyString("securityLevel")));
|
|
}
|
|
|
|
private static DrmInitData.SchemeData getSchemeData(UUID uuid, List<DrmInitData.SchemeData> list) {
|
|
if (!C.WIDEVINE_UUID.equals(uuid)) {
|
|
return list.get(0);
|
|
}
|
|
if (Util.SDK_INT >= 28 && list.size() > 1) {
|
|
DrmInitData.SchemeData schemeData = list.get(0);
|
|
int i = 0;
|
|
for (int i2 = 0; i2 < list.size(); i2++) {
|
|
DrmInitData.SchemeData schemeData2 = list.get(i2);
|
|
byte[] bArr = (byte[]) Assertions.checkNotNull(schemeData2.data);
|
|
if (Util.areEqual(schemeData2.mimeType, schemeData.mimeType) && Util.areEqual(schemeData2.licenseServerUrl, schemeData.licenseServerUrl) && PsshAtomUtil.isPsshAtom(bArr)) {
|
|
i += bArr.length;
|
|
}
|
|
}
|
|
byte[] bArr2 = new byte[i];
|
|
int i3 = 0;
|
|
for (int i4 = 0; i4 < list.size(); i4++) {
|
|
byte[] bArr3 = (byte[]) Assertions.checkNotNull(list.get(i4).data);
|
|
int length = bArr3.length;
|
|
System.arraycopy(bArr3, 0, bArr2, i3, length);
|
|
i3 += length;
|
|
}
|
|
return schemeData.copyWithData(bArr2);
|
|
}
|
|
for (int i5 = 0; i5 < list.size(); i5++) {
|
|
DrmInitData.SchemeData schemeData3 = list.get(i5);
|
|
int parseVersion = PsshAtomUtil.parseVersion((byte[]) Assertions.checkNotNull(schemeData3.data));
|
|
if (Util.SDK_INT < 23 && parseVersion == 0) {
|
|
return schemeData3;
|
|
}
|
|
if (Util.SDK_INT >= 23 && parseVersion == 1) {
|
|
return schemeData3;
|
|
}
|
|
}
|
|
return list.get(0);
|
|
}
|
|
|
|
private static UUID adjustUuid(UUID uuid) {
|
|
return (Util.SDK_INT >= 27 || !C.CLEARKEY_UUID.equals(uuid)) ? uuid : C.COMMON_PSSH_UUID;
|
|
}
|
|
|
|
private static byte[] adjustRequestInitData(UUID uuid, byte[] bArr) {
|
|
byte[] parseSchemeSpecificData;
|
|
if (C.PLAYREADY_UUID.equals(uuid)) {
|
|
byte[] parseSchemeSpecificData2 = PsshAtomUtil.parseSchemeSpecificData(bArr, uuid);
|
|
if (parseSchemeSpecificData2 != null) {
|
|
bArr = parseSchemeSpecificData2;
|
|
}
|
|
bArr = PsshAtomUtil.buildPsshAtom(C.PLAYREADY_UUID, addLaUrlAttributeIfMissing(bArr));
|
|
}
|
|
return (((Util.SDK_INT >= 23 || !C.WIDEVINE_UUID.equals(uuid)) && !(C.PLAYREADY_UUID.equals(uuid) && "Amazon".equals(Util.MANUFACTURER) && ("AFTB".equals(Util.MODEL) || "AFTS".equals(Util.MODEL) || "AFTM".equals(Util.MODEL) || "AFTT".equals(Util.MODEL)))) || (parseSchemeSpecificData = PsshAtomUtil.parseSchemeSpecificData(bArr, uuid)) == null) ? bArr : parseSchemeSpecificData;
|
|
}
|
|
|
|
private static String adjustRequestMimeType(UUID uuid, String str) {
|
|
return (Util.SDK_INT < 26 && C.CLEARKEY_UUID.equals(uuid) && ("video/mp4".equals(str) || "audio/mp4".equals(str))) ? "cenc" : str;
|
|
}
|
|
|
|
private static byte[] adjustRequestData(UUID uuid, byte[] bArr) {
|
|
return C.CLEARKEY_UUID.equals(uuid) ? ClearKeyUtil.adjustRequestData(bArr) : bArr;
|
|
}
|
|
|
|
private static void forceWidevineL3(MediaDrm mediaDrm) {
|
|
mediaDrm.setPropertyString("securityLevel", "L3");
|
|
}
|
|
|
|
private static boolean needsForceWidevineL3Workaround() {
|
|
return "ASUS_Z00AD".equals(Util.MODEL);
|
|
}
|
|
|
|
private static byte[] addLaUrlAttributeIfMissing(byte[] bArr) {
|
|
ParsableByteArray parsableByteArray = new ParsableByteArray(bArr);
|
|
int readLittleEndianInt = parsableByteArray.readLittleEndianInt();
|
|
short readLittleEndianShort = parsableByteArray.readLittleEndianShort();
|
|
short readLittleEndianShort2 = parsableByteArray.readLittleEndianShort();
|
|
if (readLittleEndianShort != 1 || readLittleEndianShort2 != 1) {
|
|
Log.i(TAG, "Unexpected record count or type. Skipping LA_URL workaround.");
|
|
return bArr;
|
|
}
|
|
String readString = parsableByteArray.readString(parsableByteArray.readLittleEndianShort(), Charsets.UTF_16LE);
|
|
if (readString.contains("<LA_URL>")) {
|
|
return bArr;
|
|
}
|
|
int indexOf = readString.indexOf("</DATA>");
|
|
if (indexOf == -1) {
|
|
Log.w(TAG, "Could not find the </DATA> tag. Skipping LA_URL workaround.");
|
|
}
|
|
String str = readString.substring(0, indexOf) + MOCK_LA_URL + readString.substring(indexOf);
|
|
int i = readLittleEndianInt + 52;
|
|
ByteBuffer allocate = ByteBuffer.allocate(i);
|
|
allocate.order(ByteOrder.LITTLE_ENDIAN);
|
|
allocate.putInt(i);
|
|
allocate.putShort(readLittleEndianShort);
|
|
allocate.putShort(readLittleEndianShort2);
|
|
allocate.putShort((short) (str.length() * 2));
|
|
allocate.put(str.getBytes(Charsets.UTF_16LE));
|
|
return allocate.array();
|
|
}
|
|
|
|
/* loaded from: classes2.dex */
|
|
private static class Api31 {
|
|
private Api31() {
|
|
}
|
|
|
|
public static boolean requiresSecureDecoder(MediaDrm mediaDrm, String str) {
|
|
return mediaDrm.requiresSecureDecoder(str);
|
|
}
|
|
|
|
public static void setLogSessionIdOnMediaDrmSession(MediaDrm mediaDrm, byte[] bArr, PlayerId playerId) {
|
|
LogSessionId logSessionId = playerId.getLogSessionId();
|
|
if (logSessionId.equals(LogSessionId.LOG_SESSION_ID_NONE)) {
|
|
return;
|
|
}
|
|
((MediaDrm.PlaybackComponent) Assertions.checkNotNull(mediaDrm.getPlaybackComponent(bArr))).setLogSessionId(logSessionId);
|
|
}
|
|
}
|
|
}
|