正在查看: CallApp v2.226 应用的 FrameworkMediaDrm.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: CallApp v2.226 应用的 FrameworkMediaDrm.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package io.bidmachine.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.annotation.Nullable;
import androidx.media3.exoplayer.drm.DefaultDrmSessionManager;
import io.bidmachine.iab.vast.tags.VastAttributes;
import io.bidmachine.media3.common.C;
import io.bidmachine.media3.common.DrmInitData;
import io.bidmachine.media3.common.MimeTypes;
import io.bidmachine.media3.common.util.Assertions;
import io.bidmachine.media3.common.util.Log;
import io.bidmachine.media3.common.util.ParsableByteArray;
import io.bidmachine.media3.common.util.UnstableApi;
import io.bidmachine.media3.common.util.Util;
import io.bidmachine.media3.exoplayer.analytics.PlayerId;
import io.bidmachine.media3.exoplayer.drm.ExoMediaDrm;
import io.bidmachine.media3.extractor.mp4.PsshAtomUtil;
import j2.j;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import k2.t;
import k2.u;
public final class FrameworkMediaDrm implements ExoMediaDrm {
private static final String CENC_SCHEME_MIME_TYPE = "cenc";
@UnstableApi
public static final ExoMediaDrm.Provider DEFAULT_PROVIDER = new d();
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;
public static class a {
private a() {
}
public static boolean requiresSecureDecoder(MediaDrm mediaDrm, String str) {
boolean requiresSecureDecoder;
requiresSecureDecoder = mediaDrm.requiresSecureDecoder(str);
return requiresSecureDecoder;
}
public static void setLogSessionIdOnMediaDrmSession(MediaDrm mediaDrm, byte[] bArr, PlayerId playerId) {
LogSessionId logSessionId = playerId.getLogSessionId();
j.c();
if (j.z(logSessionId)) {
return;
}
j.m(j.b(Assertions.checkNotNull(j.a(mediaDrm, bArr))), logSessionId);
}
}
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);
}
}
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;
}
short readLittleEndianShort3 = parsableByteArray.readLittleEndianShort();
Charset charset = mj.e.e;
String readString = parsableByteArray.readString(readLittleEndianShort3, charset);
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.");
}
StringBuilder sb = new StringBuilder();
sb.append(readString.substring(0, indexOf));
sb.append(MOCK_LA_URL);
String j = t.j(indexOf, readString, sb);
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) (j.length() * 2));
allocate.put(j.getBytes(charset));
return allocate.array();
}
private String adjustLicenseServerUrl(String str) {
if (MOCK_LA_URL.equals(str)) {
return "";
}
if (Util.SDK_INT >= 33 && "https://default.url".equals(str)) {
String propertyString = getPropertyString(VastAttributes.VERSION);
if (Objects.equals(propertyString, "1.2") || Objects.equals(propertyString, "aidl-1")) {
return "";
}
}
return str;
}
private static byte[] adjustRequestData(UUID uuid, byte[] bArr) {
return C.CLEARKEY_UUID.equals(uuid) ? io.bidmachine.media3.exoplayer.drm.a.adjustRequestData(bArr) : bArr;
}
private static byte[] adjustRequestInitData(java.util.UUID r3, byte[] r4) {
throw new UnsupportedOperationException("Method not decompiled: io.bidmachine.media3.exoplayer.drm.FrameworkMediaDrm.adjustRequestInitData(java.util.UUID, byte[]):byte[]");
}
private static String adjustRequestMimeType(UUID uuid, String str) {
return (Util.SDK_INT < 26 && C.CLEARKEY_UUID.equals(uuid) && (MimeTypes.VIDEO_MP4.equals(str) || MimeTypes.AUDIO_MP4.equals(str))) ? "cenc" : str;
}
private static UUID adjustUuid(UUID uuid) {
return (Util.SDK_INT >= 27 || !C.CLEARKEY_UUID.equals(uuid)) ? uuid : C.COMMON_PSSH_UUID;
}
private static void forceWidevineL3(MediaDrm mediaDrm) {
mediaDrm.setPropertyString("securityLevel", "L3");
}
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));
int i6 = Util.SDK_INT;
if ((i6 < 23 && parseVersion == 0) || (i6 >= 23 && parseVersion == 1)) {
return schemeData3;
}
}
return list.get(0);
}
public static boolean isCryptoSchemeSupported(UUID uuid) {
return MediaDrm.isCryptoSchemeSupported(adjustUuid(uuid));
}
private boolean isMediaDrmRequiresSecureDecoderImplemented() {
if (!this.uuid.equals(C.WIDEVINE_UUID)) {
return this.uuid.equals(C.CLEARKEY_UUID);
}
String propertyString = getPropertyString(VastAttributes.VERSION);
return (propertyString.startsWith("v5.") || propertyString.startsWith("14.") || propertyString.startsWith("15.") || propertyString.startsWith("16.0")) ? false : true;
}
public void lambda$setOnEventListener$1(ExoMediaDrm.OnEventListener onEventListener, MediaDrm mediaDrm, byte[] bArr, int i, int i2, byte[] bArr2) {
onEventListener.onEvent(this, bArr, i, i2, bArr2);
}
public void lambda$setOnExpirationUpdateListener$3(ExoMediaDrm.OnExpirationUpdateListener onExpirationUpdateListener, MediaDrm mediaDrm, byte[] bArr, long j) {
onExpirationUpdateListener.onExpirationUpdate(this, bArr, j);
}
public void lambda$setOnKeyStatusChangeListener$2(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);
}
public static 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();
}
}
private static boolean needsForceWidevineL3Workaround() {
return "ASUS_Z00AD".equals(Util.MODEL);
}
@UnstableApi
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 boolean shouldForceAllowInsecureDecoderComponents() {
return Util.SDK_INT < 21 && C.WIDEVINE_UUID.equals(this.uuid) && "L3".equals(getPropertyString("securityLevel"));
}
@Override
@UnstableApi
public synchronized void acquire() {
Assertions.checkState(this.referenceCount > 0);
this.referenceCount++;
}
@Override
@UnstableApi
public void closeSession(byte[] bArr) {
this.mediaDrm.closeSession(bArr);
}
@Override
@UnstableApi
public int getCryptoType() {
return 2;
}
@Override
@UnstableApi
public ExoMediaDrm.KeyRequest getKeyRequest(byte[] bArr, @Nullable List<DrmInitData.SchemeData> list, int i, @Nullable 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);
}
@Override
@Nullable
@UnstableApi
public PersistableBundle getMetrics() {
if (Util.SDK_INT < 28) {
return null;
}
return com.google.android.material.bottomappbar.a.l(this.mediaDrm);
}
@Override
@UnstableApi
public List<byte[]> getOfflineLicenseKeySetIds() {
if (Util.SDK_INT >= 29) {
return com.google.firebase.messaging.t.j(this.mediaDrm);
}
throw new UnsupportedOperationException();
}
@Override
@UnstableApi
public byte[] getPropertyByteArray(String str) {
return this.mediaDrm.getPropertyByteArray(str);
}
@Override
@UnstableApi
public String getPropertyString(String str) {
return this.mediaDrm.getPropertyString(str);
}
@Override
@UnstableApi
public ExoMediaDrm.ProvisionRequest getProvisionRequest() {
MediaDrm.ProvisionRequest provisionRequest = this.mediaDrm.getProvisionRequest();
return new ExoMediaDrm.ProvisionRequest(provisionRequest.getData(), provisionRequest.getDefaultUrl());
}
@Override
@UnstableApi
public byte[] openSession() throws MediaDrmException {
return this.mediaDrm.openSession();
}
@Override
@Nullable
@UnstableApi
public byte[] provideKeyResponse(byte[] bArr, byte[] bArr2) throws NotProvisionedException, DeniedByServerException {
if (C.CLEARKEY_UUID.equals(this.uuid)) {
bArr2 = io.bidmachine.media3.exoplayer.drm.a.adjustResponseData(bArr2);
}
return this.mediaDrm.provideKeyResponse(bArr, bArr2);
}
@Override
@UnstableApi
public void provideProvisionResponse(byte[] bArr) throws DeniedByServerException {
this.mediaDrm.provideProvisionResponse(bArr);
}
@Override
@UnstableApi
public Map<String, String> queryKeyStatus(byte[] bArr) {
return this.mediaDrm.queryKeyStatus(bArr);
}
@Override
@UnstableApi
public synchronized void release() {
int i = this.referenceCount - 1;
this.referenceCount = i;
if (i == 0) {
this.mediaDrm.release();
}
}
@Override
@UnstableApi
public void removeOfflineLicense(byte[] bArr) {
if (Util.SDK_INT < 29) {
throw new UnsupportedOperationException();
}
com.google.firebase.messaging.t.o(this.mediaDrm, bArr);
}
@Override
@UnstableApi
public boolean requiresSecureDecoder(byte[] bArr, String str) {
boolean z;
MediaCrypto mediaCrypto;
if (Util.SDK_INT < 31 || !isMediaDrmRequiresSecureDecoderImplemented()) {
MediaCrypto mediaCrypto2 = null;
try {
mediaCrypto = new MediaCrypto(this.uuid, bArr);
} catch (MediaCryptoException unused) {
} catch (Throwable th) {
th = th;
}
try {
z = mediaCrypto.requiresSecureDecoderComponent(str);
mediaCrypto.release();
} catch (MediaCryptoException unused2) {
mediaCrypto2 = mediaCrypto;
if (mediaCrypto2 != null) {
mediaCrypto2.release();
}
z = true;
if (z) {
}
} catch (Throwable th2) {
th = th2;
mediaCrypto2 = mediaCrypto;
if (mediaCrypto2 != null) {
mediaCrypto2.release();
}
throw th;
}
} else {
z = a.requiresSecureDecoder(this.mediaDrm, str);
}
return (z || shouldForceAllowInsecureDecoderComponents()) ? false : true;
}
@Override
@UnstableApi
public void restoreKeys(byte[] bArr, byte[] bArr2) {
this.mediaDrm.restoreKeys(bArr, bArr2);
}
@Override
@UnstableApi
public void setOnEventListener(@Nullable final ExoMediaDrm.OnEventListener onEventListener) {
MediaDrm.OnEventListener onEventListener2;
MediaDrm mediaDrm = this.mediaDrm;
if (onEventListener == null) {
onEventListener2 = null;
} else {
final int i = 0;
onEventListener2 = new MediaDrm.OnEventListener() {
@Override
public final void onEvent(MediaDrm mediaDrm2, byte[] bArr, int i2, int i3, byte[] bArr2) {
switch (i) {
case 0:
((FrameworkMediaDrm) this).lambda$setOnEventListener$1((ExoMediaDrm.OnEventListener) onEventListener, mediaDrm2, bArr, i2, i3, bArr2);
break;
default:
u uVar = (u) this;
DefaultDrmSessionManager.b bVar = (DefaultDrmSessionManager.b) onEventListener;
uVar.getClass();
DefaultDrmSessionManager.c cVar = bVar.a.x;
cVar.getClass();
cVar.obtainMessage(i2, bArr).sendToTarget();
break;
}
}
};
}
mediaDrm.setOnEventListener(onEventListener2);
}
@Override
@UnstableApi
public void setOnExpirationUpdateListener(@Nullable final ExoMediaDrm.OnExpirationUpdateListener onExpirationUpdateListener) {
if (Util.SDK_INT < 23) {
throw new UnsupportedOperationException();
}
this.mediaDrm.setOnExpirationUpdateListener(onExpirationUpdateListener == null ? null : new MediaDrm.OnExpirationUpdateListener() {
@Override
public final void onExpirationUpdate(MediaDrm mediaDrm, byte[] bArr, long j) {
FrameworkMediaDrm.this.lambda$setOnExpirationUpdateListener$3(onExpirationUpdateListener, mediaDrm, bArr, j);
}
}, (Handler) null);
}
@Override
@UnstableApi
public void setOnKeyStatusChangeListener(@Nullable final ExoMediaDrm.OnKeyStatusChangeListener onKeyStatusChangeListener) {
if (Util.SDK_INT < 23) {
throw new UnsupportedOperationException();
}
this.mediaDrm.setOnKeyStatusChangeListener(onKeyStatusChangeListener == null ? null : new MediaDrm.OnKeyStatusChangeListener() {
@Override
public final void onKeyStatusChange(MediaDrm mediaDrm, byte[] bArr, List list, boolean z) {
FrameworkMediaDrm.this.lambda$setOnKeyStatusChangeListener$2(onKeyStatusChangeListener, mediaDrm, bArr, list, z);
}
}, (Handler) null);
}
@Override
@UnstableApi
public void setPlayerIdForSession(byte[] bArr, PlayerId playerId) {
if (Util.SDK_INT >= 31) {
try {
a.setLogSessionIdOnMediaDrmSession(this.mediaDrm, bArr, playerId);
} catch (UnsupportedOperationException unused) {
Log.w(TAG, "setLogSessionId failed.");
}
}
}
@Override
@UnstableApi
public void setPropertyByteArray(String str, byte[] bArr) {
this.mediaDrm.setPropertyByteArray(str, bArr);
}
@Override
@UnstableApi
public void setPropertyString(String str, String str2) {
this.mediaDrm.setPropertyString(str, str2);
}
@Override
@UnstableApi
public FrameworkCryptoConfig createCryptoConfig(byte[] bArr) throws MediaCryptoException {
return new FrameworkCryptoConfig(adjustUuid(this.uuid), bArr, shouldForceAllowInsecureDecoderComponents());
}
}