package ai.clova.cic.clientlib.exoplayer2.drm; import ai.clova.cic.clientlib.exoplayer2.C; import ai.clova.cic.clientlib.exoplayer2.drm.DrmInitData; import ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm; import ai.clova.cic.clientlib.exoplayer2.extractor.mp4.PsshAtomUtil; import ai.clova.cic.clientlib.exoplayer2.util.Assertions; import ai.clova.cic.clientlib.exoplayer2.util.Log; import ai.clova.cic.clientlib.exoplayer2.util.ParsableByteArray; import ai.clova.cic.clientlib.exoplayer2.util.Util; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.media.DeniedByServerException; import android.media.MediaCryptoException; import android.media.MediaDrm; import android.media.MediaDrmException; import android.media.NotProvisionedException; import android.media.UnsupportedSchemeException; import android.os.Handler; import android.os.PersistableBundle; import android.text.TextUtils; 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.UUID; @TargetApi(23) public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto> { private static final String CENC_SCHEME_MIME_TYPE = "cenc"; public static final ExoMediaDrm.Provider<FrameworkMediaCrypto> DEFAULT_PROVIDER = i.f4555a; 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 = 1; private final UUID uuid; private FrameworkMediaDrm(UUID uuid2) throws UnsupportedSchemeException { Assertions.checkNotNull(uuid2); Assertions.checkArgument(!C.COMMON_PSSH_UUID.equals(uuid2), "Use C.CLEARKEY_UUID instead"); this.uuid = uuid2; MediaDrm mediaDrm2 = new MediaDrm(adjustUuid(uuid2)); this.mediaDrm = mediaDrm2; if (C.WIDEVINE_UUID.equals(uuid2) && needsForceWidevineL3Workaround()) { forceWidevineL3(mediaDrm2); } } 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) { String readString = parsableByteArray.readString(parsableByteArray.readLittleEndianShort(), Charset.forName(C.UTF16LE_NAME)); 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 i14 = readLittleEndianInt + 52; ByteBuffer allocate = ByteBuffer.allocate(i14); allocate.order(ByteOrder.LITTLE_ENDIAN); allocate.putInt(i14); allocate.putShort((short) readLittleEndianShort); allocate.putShort((short) readLittleEndianShort2); allocate.putShort((short) (str.length() * 2)); allocate.put(str.getBytes(Charset.forName(C.UTF16LE_NAME))); return allocate.array(); } Log.i(TAG, "Unexpected record count or type. Skipping LA_URL workaround."); return bArr; } private static byte[] adjustRequestData(UUID uuid2, byte[] bArr) { return C.CLEARKEY_UUID.equals(uuid2) ? ClearKeyUtil.adjustRequestData(bArr) : bArr; } /* JADX WARNING: Code restructure failed: missing block: B:21:0x0056, code lost: if ("AFTT".equals(r0) == false) goto L_0x005f; */ private static byte[] adjustRequestInitData(UUID uuid2, byte[] bArr) { UUID uuid3 = C.PLAYREADY_UUID; if (uuid3.equals(uuid2)) { byte[] parseSchemeSpecificData = PsshAtomUtil.parseSchemeSpecificData(bArr, uuid2); if (parseSchemeSpecificData != null) { bArr = parseSchemeSpecificData; } bArr = PsshAtomUtil.buildPsshAtom(uuid3, addLaUrlAttributeIfMissing(bArr)); } if (Util.SDK_INT >= 23 || !C.WIDEVINE_UUID.equals(uuid2)) { if (uuid3.equals(uuid2) && "Amazon".equals(Util.MANUFACTURER)) { String str = Util.MODEL; if (!"AFTB".equals(str)) { if (!"AFTS".equals(str)) { if (!"AFTM".equals(str)) { } } } } } byte[] parseSchemeSpecificData2 = PsshAtomUtil.parseSchemeSpecificData(bArr, uuid2); return parseSchemeSpecificData2 != null ? parseSchemeSpecificData2 : bArr; } private static String adjustRequestMimeType(UUID uuid2, String str) { return (Util.SDK_INT >= 26 || !C.CLEARKEY_UUID.equals(uuid2) || (!"video/mp4".equals(str) && !"audio/mp4".equals(str))) ? str : "cenc"; } private static UUID adjustUuid(UUID uuid2) { return (Util.SDK_INT >= 27 || !C.CLEARKEY_UUID.equals(uuid2)) ? uuid2 : C.COMMON_PSSH_UUID; } @SuppressLint({"WrongConstant"}) private static void forceWidevineL3(MediaDrm mediaDrm2) { mediaDrm2.setPropertyString("securityLevel", "L3"); } private static DrmInitData.SchemeData getSchemeData(UUID uuid2, List<DrmInitData.SchemeData> list) { boolean z14; if (C.WIDEVINE_UUID.equals(uuid2)) { if (Util.SDK_INT >= 28 && list.size() > 1) { DrmInitData.SchemeData schemeData = list.get(0); int i14 = 0; int i15 = 0; while (true) { if (i14 >= list.size()) { z14 = true; break; } DrmInitData.SchemeData schemeData2 = list.get(i14); byte[] bArr = (byte[]) Util.castNonNull(schemeData2.data); if (!Util.areEqual(schemeData2.mimeType, schemeData.mimeType) || !Util.areEqual(schemeData2.licenseServerUrl, schemeData.licenseServerUrl) || !PsshAtomUtil.isPsshAtom(bArr)) { z14 = false; } else { i15 += bArr.length; i14++; } } z14 = false; if (z14) { byte[] bArr2 = new byte[i15]; int i16 = 0; for (int i17 = 0; i17 < list.size(); i17++) { byte[] bArr3 = (byte[]) Util.castNonNull(list.get(i17).data); int length = bArr3.length; System.arraycopy(bArr3, 0, bArr2, i16, length); i16 += length; } return schemeData.copyWithData(bArr2); } } for (int i18 = 0; i18 < list.size(); i18++) { DrmInitData.SchemeData schemeData3 = list.get(i18); int parseVersion = PsshAtomUtil.parseVersion((byte[]) Util.castNonNull(schemeData3.data)); int i19 = Util.SDK_INT; if (i19 < 23 && parseVersion == 0) { return schemeData3; } if (i19 >= 23 && parseVersion == 1) { return schemeData3; } } } return list.get(0); } public static boolean isCryptoSchemeSupported(UUID uuid2) { return MediaDrm.isCryptoSchemeSupported(adjustUuid(uuid2)); } /* access modifiers changed from: private */ public /* synthetic */ void lambda$setOnEventListener$1(ExoMediaDrm.OnEventListener onEventListener, MediaDrm mediaDrm2, byte[] bArr, int i14, int i15, byte[] bArr2) { onEventListener.onEvent(this, bArr, i14, i15, bArr2); } /* access modifiers changed from: private */ public /* synthetic */ void lambda$setOnKeyStatusChangeListener$2(ExoMediaDrm.OnKeyStatusChangeListener onKeyStatusChangeListener, MediaDrm mediaDrm2, byte[] bArr, List list, boolean z14) { ArrayList arrayList = new ArrayList(); Iterator it3 = list.iterator(); while (it3.hasNext()) { MediaDrm.KeyStatus keyStatus = (MediaDrm.KeyStatus) it3.next(); arrayList.add(new ExoMediaDrm.KeyStatus(keyStatus.getStatusCode(), keyStatus.getKeyId())); } onKeyStatusChangeListener.onKeyStatusChange(this, bArr, arrayList, z14); } /* access modifiers changed from: private */ public static /* synthetic */ ExoMediaDrm lambda$static$0(UUID uuid2) { try { return newInstance(uuid2); } catch (UnsupportedDrmException unused) { Log.e(TAG, "Failed to instantiate a FrameworkMediaDrm for uuid: " + uuid2 + "."); return new DummyExoMediaDrm(); } } private static boolean needsForceWidevineL3Workaround() { return "ASUS_Z00AD".equals(Util.MODEL); } public static FrameworkMediaDrm newInstance(UUID uuid2) throws UnsupportedDrmException { try { return new FrameworkMediaDrm(uuid2); } catch (UnsupportedSchemeException e14) { throw new UnsupportedDrmException(1, e14); } catch (Exception e15) { throw new UnsupportedDrmException(2, e15); } } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public synchronized void acquire() { Assertions.checkState(this.referenceCount > 0); this.referenceCount++; } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public void closeSession(byte[] bArr) { this.mediaDrm.closeSession(bArr); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public FrameworkMediaCrypto createMediaCrypto(byte[] bArr) throws MediaCryptoException { return new FrameworkMediaCrypto(adjustUuid(this.uuid), bArr, Util.SDK_INT < 21 && C.WIDEVINE_UUID.equals(this.uuid) && "L3".equals(getPropertyString("securityLevel"))); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public Class<FrameworkMediaCrypto> getExoMediaCryptoType() { return FrameworkMediaCrypto.class; } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public ExoMediaDrm.KeyRequest getKeyRequest(byte[] bArr, List<DrmInitData.SchemeData> list, int i14, HashMap<String, String> hashMap) throws NotProvisionedException { String str; byte[] bArr2; DrmInitData.SchemeData schemeData = null; if (list != null) { schemeData = getSchemeData(this.uuid, list); bArr2 = adjustRequestInitData(this.uuid, (byte[]) Assertions.checkNotNull(schemeData.data)); str = adjustRequestMimeType(this.uuid, schemeData.mimeType); } else { bArr2 = null; str = null; } MediaDrm.KeyRequest keyRequest = this.mediaDrm.getKeyRequest(bArr, bArr2, str, i14, hashMap); byte[] adjustRequestData = adjustRequestData(this.uuid, keyRequest.getData()); String defaultUrl = keyRequest.getDefaultUrl(); if (MOCK_LA_URL_VALUE.equals(defaultUrl)) { defaultUrl = ""; } if (TextUtils.isEmpty(defaultUrl) && schemeData != null && !TextUtils.isEmpty(schemeData.licenseServerUrl)) { defaultUrl = schemeData.licenseServerUrl; } return new ExoMediaDrm.KeyRequest(adjustRequestData, defaultUrl); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm @TargetApi(28) public PersistableBundle getMetrics() { if (Util.SDK_INT < 28) { return null; } return this.mediaDrm.getMetrics(); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public byte[] getPropertyByteArray(String str) { return this.mediaDrm.getPropertyByteArray(str); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public String getPropertyString(String str) { return this.mediaDrm.getPropertyString(str); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public ExoMediaDrm.ProvisionRequest getProvisionRequest() { MediaDrm.ProvisionRequest provisionRequest = this.mediaDrm.getProvisionRequest(); return new ExoMediaDrm.ProvisionRequest(provisionRequest.getData(), provisionRequest.getDefaultUrl()); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public byte[] openSession() throws MediaDrmException { return this.mediaDrm.openSession(); } @Override // ai.clova.cic.clientlib.exoplayer2.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 // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public void provideProvisionResponse(byte[] bArr) throws DeniedByServerException { this.mediaDrm.provideProvisionResponse(bArr); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public Map<String, String> queryKeyStatus(byte[] bArr) { return this.mediaDrm.queryKeyStatus(bArr); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public synchronized void release() { int i14 = this.referenceCount - 1; this.referenceCount = i14; if (i14 == 0) { this.mediaDrm.release(); } } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public void restoreKeys(byte[] bArr, byte[] bArr2) { this.mediaDrm.restoreKeys(bArr, bArr2); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public void setOnEventListener(ExoMediaDrm.OnEventListener<? super FrameworkMediaCrypto> onEventListener) { this.mediaDrm.setOnEventListener(onEventListener == null ? null : new j(this, onEventListener)); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public void setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener<? super FrameworkMediaCrypto> onKeyStatusChangeListener) { if (Util.SDK_INT >= 23) { this.mediaDrm.setOnKeyStatusChangeListener(onKeyStatusChangeListener == null ? null : new k(this, onKeyStatusChangeListener), (Handler) null); return; } throw new UnsupportedOperationException(); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public void setPropertyByteArray(String str, byte[] bArr) { this.mediaDrm.setPropertyByteArray(str, bArr); } @Override // ai.clova.cic.clientlib.exoplayer2.drm.ExoMediaDrm public void setPropertyString(String str, String str2) { this.mediaDrm.setPropertyString(str, str2); } }