X8 Speeder v3.3.6.8版本的 MD5 值为:aa37d3a091cd7cb4c81fe778a047cb34
以下内容为反编译后的 DefaultDrmSessionManager.java 源代码,内容仅作参考
package com.mbridge.msdk.playercommon.exoplayer2.drm;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import com.mbridge.msdk.playercommon.exoplayer2.C;
import com.mbridge.msdk.playercommon.exoplayer2.drm.DefaultDrmSession;
import com.mbridge.msdk.playercommon.exoplayer2.drm.DefaultDrmSessionEventListener;
import com.mbridge.msdk.playercommon.exoplayer2.drm.DrmInitData;
import com.mbridge.msdk.playercommon.exoplayer2.drm.DrmSession;
import com.mbridge.msdk.playercommon.exoplayer2.drm.ExoMediaCrypto;
import com.mbridge.msdk.playercommon.exoplayer2.drm.ExoMediaDrm;
import com.mbridge.msdk.playercommon.exoplayer2.extractor.mp4.PsshAtomUtil;
import com.mbridge.msdk.playercommon.exoplayer2.util.Assertions;
import com.mbridge.msdk.playercommon.exoplayer2.util.Util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DefaultDrmSession.ProvisioningManager<T>, DrmSessionManager<T> {
public static final int INITIAL_DRM_REQUEST_RETRY_COUNT = 3;
public static final int MODE_DOWNLOAD = 2;
public static final int MODE_PLAYBACK = 0;
public static final int MODE_QUERY = 1;
public static final int MODE_RELEASE = 3;
public static final String PLAYREADY_CUSTOM_DATA_KEY = "PRCustomData";
private static final String TAG = "DefaultDrmSessionMgr";
private final MediaDrmCallback callback;
private final DefaultDrmSessionEventListener.EventDispatcher eventDispatcher;
private final int initialDrmRequestRetryCount;
private final ExoMediaDrm<T> mediaDrm;
volatile DefaultDrmSessionManager<T>.MediaDrmHandler mediaDrmHandler;
private int mode;
private final boolean multiSession;
private byte[] offlineLicenseKeySetId;
private final HashMap<String, String> optionalKeyRequestParameters;
private Looper playbackLooper;
private final List<DefaultDrmSession<T>> provisioningSessions;
private final List<DefaultDrmSession<T>> sessions;
private final UUID uuid;
public interface EventListener extends DefaultDrmSessionEventListener {
}
private class MediaDrmEventListener implements ExoMediaDrm.OnEventListener<T> {
private MediaDrmEventListener() {
}
@Override
public void onEvent(ExoMediaDrm<? extends T> exoMediaDrm, byte[] bArr, int i6, int i7, byte[] bArr2) {
if (DefaultDrmSessionManager.this.mode == 0) {
DefaultDrmSessionManager.this.mediaDrmHandler.obtainMessage(i6, bArr).sendToTarget();
}
}
}
private class MediaDrmHandler extends Handler {
public MediaDrmHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message message) {
byte[] bArr = (byte[]) message.obj;
for (DefaultDrmSession defaultDrmSession : DefaultDrmSessionManager.this.sessions) {
if (defaultDrmSession.hasSessionId(bArr)) {
defaultDrmSession.onMediaDrmEvent(message.what);
return;
}
}
}
}
public static final class MissingSchemeDataException extends Exception {
private MissingSchemeDataException(UUID uuid) {
super("Media does not support uuid: " + uuid);
}
}
public @interface Mode {
}
public DefaultDrmSessionManager(UUID uuid, ExoMediaDrm<T> exoMediaDrm, MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap, Handler handler, DefaultDrmSessionEventListener defaultDrmSessionEventListener) {
this(uuid, exoMediaDrm, mediaDrmCallback, hashMap);
if (handler == null || defaultDrmSessionEventListener == null) {
return;
}
addListener(handler, defaultDrmSessionEventListener);
}
private static DrmInitData.SchemeData getSchemeData(DrmInitData drmInitData, UUID uuid, boolean z6) {
int i6;
ArrayList arrayList = new ArrayList(drmInitData.schemeDataCount);
int i7 = 0;
while (true) {
boolean z7 = true;
if (i7 >= drmInitData.schemeDataCount) {
break;
}
DrmInitData.SchemeData schemeData = drmInitData.get(i7);
if (!schemeData.matches(uuid) && (!C.CLEARKEY_UUID.equals(uuid) || !schemeData.matches(C.COMMON_PSSH_UUID))) {
z7 = false;
}
if (z7 && (schemeData.data != null || z6)) {
arrayList.add(schemeData);
}
i7++;
}
if (arrayList.isEmpty()) {
return null;
}
if (C.WIDEVINE_UUID.equals(uuid)) {
for (int i8 = 0; i8 < arrayList.size(); i8++) {
DrmInitData.SchemeData schemeData2 = (DrmInitData.SchemeData) arrayList.get(i8);
if (schemeData2.hasData()) {
i6 = PsshAtomUtil.parseVersion(schemeData2.data);
} else {
i6 = -1;
}
int i9 = Util.SDK_INT;
if (i9 < 23 && i6 == 0) {
return schemeData2;
}
if (i9 >= 23 && i6 == 1) {
return schemeData2;
}
}
}
return (DrmInitData.SchemeData) arrayList.get(0);
}
public static DefaultDrmSessionManager<FrameworkMediaCrypto> newFrameworkInstance(UUID uuid, MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap, Handler handler, DefaultDrmSessionEventListener defaultDrmSessionEventListener) throws UnsupportedDrmException {
DefaultDrmSessionManager<FrameworkMediaCrypto> newFrameworkInstance = newFrameworkInstance(uuid, mediaDrmCallback, hashMap);
if (handler != null && defaultDrmSessionEventListener != null) {
newFrameworkInstance.addListener(handler, defaultDrmSessionEventListener);
}
return newFrameworkInstance;
}
public static DefaultDrmSessionManager<FrameworkMediaCrypto> newPlayReadyInstance(MediaDrmCallback mediaDrmCallback, String str, Handler handler, DefaultDrmSessionEventListener defaultDrmSessionEventListener) throws UnsupportedDrmException {
DefaultDrmSessionManager<FrameworkMediaCrypto> newPlayReadyInstance = newPlayReadyInstance(mediaDrmCallback, str);
if (handler != null && defaultDrmSessionEventListener != null) {
newPlayReadyInstance.addListener(handler, defaultDrmSessionEventListener);
}
return newPlayReadyInstance;
}
public static DefaultDrmSessionManager<FrameworkMediaCrypto> newWidevineInstance(MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap, Handler handler, DefaultDrmSessionEventListener defaultDrmSessionEventListener) throws UnsupportedDrmException {
DefaultDrmSessionManager<FrameworkMediaCrypto> newWidevineInstance = newWidevineInstance(mediaDrmCallback, hashMap);
if (handler != null && defaultDrmSessionEventListener != null) {
newWidevineInstance.addListener(handler, defaultDrmSessionEventListener);
}
return newWidevineInstance;
}
@Override
public DrmSession<T> acquireSession(Looper looper, DrmInitData drmInitData) {
boolean z6;
DrmInitData.SchemeData schemeData;
byte[] bArr;
Looper looper2 = this.playbackLooper;
if (looper2 != null && looper2 != looper) {
z6 = false;
} else {
z6 = true;
}
Assertions.checkState(z6);
if (this.sessions.isEmpty()) {
this.playbackLooper = looper;
if (this.mediaDrmHandler == null) {
this.mediaDrmHandler = new MediaDrmHandler(looper);
}
}
DefaultDrmSession<T> defaultDrmSession = 0;
defaultDrmSession = 0;
if (this.offlineLicenseKeySetId == null) {
DrmInitData.SchemeData schemeData2 = getSchemeData(drmInitData, this.uuid, false);
if (schemeData2 == null) {
MissingSchemeDataException missingSchemeDataException = new MissingSchemeDataException(this.uuid);
this.eventDispatcher.drmSessionManagerError(missingSchemeDataException);
return new ErrorStateDrmSession(new DrmSession.DrmSessionException(missingSchemeDataException));
}
schemeData = schemeData2;
} else {
schemeData = null;
}
if (!this.multiSession) {
if (!this.sessions.isEmpty()) {
defaultDrmSession = this.sessions.get(0);
}
} else {
if (schemeData != null) {
bArr = schemeData.data;
} else {
bArr = null;
}
Iterator<DefaultDrmSession<T>> it = this.sessions.iterator();
while (true) {
if (!it.hasNext()) {
break;
}
DefaultDrmSession<T> next = it.next();
if (next.hasInitData(bArr)) {
defaultDrmSession = next;
break;
}
}
}
if (defaultDrmSession == 0) {
DefaultDrmSession<T> defaultDrmSession2 = new DefaultDrmSession<>(this.uuid, this.mediaDrm, this, schemeData, this.mode, this.offlineLicenseKeySetId, this.optionalKeyRequestParameters, this.callback, looper, this.eventDispatcher, this.initialDrmRequestRetryCount);
this.sessions.add(defaultDrmSession2);
defaultDrmSession = defaultDrmSession2;
}
((DefaultDrmSession) defaultDrmSession).acquire();
return (DrmSession<T>) defaultDrmSession;
}
public final void addListener(Handler handler, DefaultDrmSessionEventListener defaultDrmSessionEventListener) {
this.eventDispatcher.addListener(handler, defaultDrmSessionEventListener);
}
@Override
public boolean canAcquireSession(DrmInitData drmInitData) {
if (this.offlineLicenseKeySetId != null) {
return true;
}
if (getSchemeData(drmInitData, this.uuid, true) == null) {
if (drmInitData.schemeDataCount != 1 || !drmInitData.get(0).matches(C.COMMON_PSSH_UUID)) {
return false;
}
Log.w(TAG, "DrmInitData only contains common PSSH SchemeData. Assuming support for: " + this.uuid);
}
String str = drmInitData.schemeType;
if (str == null || C.CENC_TYPE_cenc.equals(str)) {
return true;
}
if ((!C.CENC_TYPE_cbc1.equals(str) && !C.CENC_TYPE_cbcs.equals(str) && !C.CENC_TYPE_cens.equals(str)) || Util.SDK_INT >= 25) {
return true;
}
return false;
}
public final byte[] getPropertyByteArray(String str) {
return this.mediaDrm.getPropertyByteArray(str);
}
public final String getPropertyString(String str) {
return this.mediaDrm.getPropertyString(str);
}
@Override
public void onProvisionCompleted() {
Iterator<DefaultDrmSession<T>> it = this.provisioningSessions.iterator();
while (it.hasNext()) {
it.next().onProvisionCompleted();
}
this.provisioningSessions.clear();
}
@Override
public void onProvisionError(Exception exc) {
Iterator<DefaultDrmSession<T>> it = this.provisioningSessions.iterator();
while (it.hasNext()) {
it.next().onProvisionError(exc);
}
this.provisioningSessions.clear();
}
@Override
public void provisionRequired(DefaultDrmSession<T> defaultDrmSession) {
this.provisioningSessions.add(defaultDrmSession);
if (this.provisioningSessions.size() == 1) {
defaultDrmSession.provision();
}
}
@Override
public void releaseSession(DrmSession<T> drmSession) {
if (drmSession instanceof ErrorStateDrmSession) {
return;
}
DefaultDrmSession<T> defaultDrmSession = (DefaultDrmSession) drmSession;
if (defaultDrmSession.release()) {
this.sessions.remove(defaultDrmSession);
if (this.provisioningSessions.size() > 1 && this.provisioningSessions.get(0) == defaultDrmSession) {
this.provisioningSessions.get(1).provision();
}
this.provisioningSessions.remove(defaultDrmSession);
}
}
public final void removeListener(DefaultDrmSessionEventListener defaultDrmSessionEventListener) {
this.eventDispatcher.removeListener(defaultDrmSessionEventListener);
}
public void setMode(int i6, byte[] bArr) {
Assertions.checkState(this.sessions.isEmpty());
if (i6 == 1 || i6 == 3) {
Assertions.checkNotNull(bArr);
}
this.mode = i6;
this.offlineLicenseKeySetId = bArr;
}
public final void setPropertyByteArray(String str, byte[] bArr) {
this.mediaDrm.setPropertyByteArray(str, bArr);
}
public final void setPropertyString(String str, String str2) {
this.mediaDrm.setPropertyString(str, str2);
}
public DefaultDrmSessionManager(UUID uuid, ExoMediaDrm<T> exoMediaDrm, MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap) {
this(uuid, (ExoMediaDrm) exoMediaDrm, mediaDrmCallback, hashMap, false, 3);
}
public static DefaultDrmSessionManager<FrameworkMediaCrypto> newFrameworkInstance(UUID uuid, MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap) throws UnsupportedDrmException {
return new DefaultDrmSessionManager<>(uuid, (ExoMediaDrm) FrameworkMediaDrm.newInstance(uuid), mediaDrmCallback, hashMap, false, 3);
}
public static DefaultDrmSessionManager<FrameworkMediaCrypto> newPlayReadyInstance(MediaDrmCallback mediaDrmCallback, String str) throws UnsupportedDrmException {
HashMap hashMap;
if (TextUtils.isEmpty(str)) {
hashMap = null;
} else {
hashMap = new HashMap();
hashMap.put(PLAYREADY_CUSTOM_DATA_KEY, str);
}
return newFrameworkInstance(C.PLAYREADY_UUID, mediaDrmCallback, hashMap);
}
public static DefaultDrmSessionManager<FrameworkMediaCrypto> newWidevineInstance(MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap) throws UnsupportedDrmException {
return newFrameworkInstance(C.WIDEVINE_UUID, mediaDrmCallback, hashMap);
}
public DefaultDrmSessionManager(UUID uuid, ExoMediaDrm<T> exoMediaDrm, MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap, Handler handler, DefaultDrmSessionEventListener defaultDrmSessionEventListener, boolean z6) {
this(uuid, exoMediaDrm, mediaDrmCallback, hashMap, z6);
if (handler == null || defaultDrmSessionEventListener == null) {
return;
}
addListener(handler, defaultDrmSessionEventListener);
}
public DefaultDrmSessionManager(UUID uuid, ExoMediaDrm<T> exoMediaDrm, MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap, boolean z6) {
this(uuid, exoMediaDrm, mediaDrmCallback, hashMap, z6, 3);
}
public DefaultDrmSessionManager(UUID uuid, ExoMediaDrm<T> exoMediaDrm, MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap, Handler handler, DefaultDrmSessionEventListener defaultDrmSessionEventListener, boolean z6, int i6) {
this(uuid, exoMediaDrm, mediaDrmCallback, hashMap, z6, i6);
if (handler == null || defaultDrmSessionEventListener == null) {
return;
}
addListener(handler, defaultDrmSessionEventListener);
}
public DefaultDrmSessionManager(UUID uuid, ExoMediaDrm<T> exoMediaDrm, MediaDrmCallback mediaDrmCallback, HashMap<String, String> hashMap, boolean z6, int i6) {
Assertions.checkNotNull(uuid);
Assertions.checkNotNull(exoMediaDrm);
Assertions.checkArgument(!C.COMMON_PSSH_UUID.equals(uuid), "Use C.CLEARKEY_UUID instead");
this.uuid = uuid;
this.mediaDrm = exoMediaDrm;
this.callback = mediaDrmCallback;
this.optionalKeyRequestParameters = hashMap;
this.eventDispatcher = new DefaultDrmSessionEventListener.EventDispatcher();
this.multiSession = z6;
this.initialDrmRequestRetryCount = i6;
this.mode = 0;
this.sessions = new ArrayList();
this.provisioningSessions = new ArrayList();
if (z6) {
exoMediaDrm.setPropertyString("sessionSharing", "enable");
}
exoMediaDrm.setOnEventListener(new MediaDrmEventListener());
}
}