CrackMe.apk
Download file
package com.google.android.exoplayer2.source.smoothstreaming;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.offline.StreamKey;
import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory;
import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSourceEventListener;
import com.google.android.exoplayer2.source.SampleStream;
import com.google.android.exoplayer2.source.SequenceableLoader;
import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.chunk.ChunkSampleStream;
import com.google.android.exoplayer2.source.smoothstreaming.SsChunkSource;
import com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest;
import com.google.android.exoplayer2.trackselection.ExoTrackSelection;
import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy;
import com.google.android.exoplayer2.upstream.LoaderErrorThrower;
import com.google.android.exoplayer2.upstream.TransferListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
final class SsMediaPeriod implements MediaPeriod, SequenceableLoader.Callback<ChunkSampleStream<SsChunkSource>> {
private final Allocator allocator;
private MediaPeriod.Callback callback;
private final SsChunkSource.Factory chunkSourceFactory;
private SequenceableLoader compositeSequenceableLoader;
private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private final DrmSessionEventListener.EventDispatcher drmEventDispatcher;
private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private SsManifest manifest;
private final LoaderErrorThrower manifestLoaderErrorThrower;
private final MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher;
private ChunkSampleStream<SsChunkSource>[] sampleStreams;
private final TrackGroupArray trackGroups;
private final TransferListener transferListener;
public long readDiscontinuity() {
return C.TIME_UNSET;
}
public SsMediaPeriod(SsManifest ssManifest, SsChunkSource.Factory factory, TransferListener transferListener2, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory2, DrmSessionManager drmSessionManager2, DrmSessionEventListener.EventDispatcher eventDispatcher, LoadErrorHandlingPolicy loadErrorHandlingPolicy2, MediaSourceEventListener.EventDispatcher eventDispatcher2, LoaderErrorThrower loaderErrorThrower, Allocator allocator2) {
this.manifest = ssManifest;
this.chunkSourceFactory = factory;
this.transferListener = transferListener2;
this.manifestLoaderErrorThrower = loaderErrorThrower;
this.drmSessionManager = drmSessionManager2;
this.drmEventDispatcher = eventDispatcher;
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy2;
this.mediaSourceEventDispatcher = eventDispatcher2;
this.allocator = allocator2;
this.compositeSequenceableLoaderFactory = compositeSequenceableLoaderFactory2;
this.trackGroups = buildTrackGroups(ssManifest, drmSessionManager2);
ChunkSampleStream<SsChunkSource>[] newSampleStreamArray = newSampleStreamArray(0);
this.sampleStreams = newSampleStreamArray;
this.compositeSequenceableLoader = compositeSequenceableLoaderFactory2.createCompositeSequenceableLoader(newSampleStreamArray);
}
public void updateManifest(SsManifest ssManifest) {
this.manifest = ssManifest;
for (ChunkSampleStream<SsChunkSource> chunkSource : this.sampleStreams) {
chunkSource.getChunkSource().updateManifest(ssManifest);
}
this.callback.onContinueLoadingRequested(this);
}
public void release() {
for (ChunkSampleStream<SsChunkSource> release : this.sampleStreams) {
release.release();
}
this.callback = null;
}
public void prepare(MediaPeriod.Callback callback2, long j) {
this.callback = callback2;
callback2.onPrepared(this);
}
public void maybeThrowPrepareError() throws IOException {
this.manifestLoaderErrorThrower.maybeThrowError();
}
public TrackGroupArray getTrackGroups() {
return this.trackGroups;
}
public long selectTracks(ExoTrackSelection[] exoTrackSelectionArr, boolean[] zArr, SampleStream[] sampleStreamArr, boolean[] zArr2, long j) {
ArrayList arrayList = new ArrayList();
for (int i = 0; i < exoTrackSelectionArr.length; i++) {
if (sampleStreamArr[i] != null) {
ChunkSampleStream chunkSampleStream = sampleStreamArr[i];
if (exoTrackSelectionArr[i] == null || !zArr[i]) {
chunkSampleStream.release();
sampleStreamArr[i] = null;
} else {
((SsChunkSource) chunkSampleStream.getChunkSource()).updateTrackSelection(exoTrackSelectionArr[i]);
arrayList.add(chunkSampleStream);
}
}
if (sampleStreamArr[i] == null && exoTrackSelectionArr[i] != null) {
ChunkSampleStream<SsChunkSource> buildSampleStream = buildSampleStream(exoTrackSelectionArr[i], j);
arrayList.add(buildSampleStream);
sampleStreamArr[i] = buildSampleStream;
zArr2[i] = true;
}
}
ChunkSampleStream<SsChunkSource>[] newSampleStreamArray = newSampleStreamArray(arrayList.size());
this.sampleStreams = newSampleStreamArray;
arrayList.toArray(newSampleStreamArray);
this.compositeSequenceableLoader = this.compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(this.sampleStreams);
return j;
}
public List<StreamKey> getStreamKeys(List<ExoTrackSelection> list) {
ArrayList arrayList = new ArrayList();
for (int i = 0; i < list.size(); i++) {
ExoTrackSelection exoTrackSelection = list.get(i);
int indexOf = this.trackGroups.indexOf(exoTrackSelection.getTrackGroup());
for (int i2 = 0; i2 < exoTrackSelection.length(); i2++) {
arrayList.add(new StreamKey(indexOf, exoTrackSelection.getIndexInTrackGroup(i2)));
}
}
return arrayList;
}
public void discardBuffer(long j, boolean z) {
for (ChunkSampleStream<SsChunkSource> discardBuffer : this.sampleStreams) {
discardBuffer.discardBuffer(j, z);
}
}
public void reevaluateBuffer(long j) {
this.compositeSequenceableLoader.reevaluateBuffer(j);
}
public boolean continueLoading(long j) {
return this.compositeSequenceableLoader.continueLoading(j);
}
public boolean isLoading() {
return this.compositeSequenceableLoader.isLoading();
}
public long getNextLoadPositionUs() {
return this.compositeSequenceableLoader.getNextLoadPositionUs();
}
public long getBufferedPositionUs() {
return this.compositeSequenceableLoader.getBufferedPositionUs();
}
public long seekToUs(long j) {
for (ChunkSampleStream<SsChunkSource> seekToUs : this.sampleStreams) {
seekToUs.seekToUs(j);
}
return j;
}
public long getAdjustedSeekPositionUs(long j, SeekParameters seekParameters) {
for (ChunkSampleStream<SsChunkSource> chunkSampleStream : this.sampleStreams) {
if (chunkSampleStream.primaryTrackType == 2) {
return chunkSampleStream.getAdjustedSeekPositionUs(j, seekParameters);
}
}
return j;
}
public void onContinueLoadingRequested(ChunkSampleStream<SsChunkSource> chunkSampleStream) {
this.callback.onContinueLoadingRequested(this);
}
private ChunkSampleStream<SsChunkSource> buildSampleStream(ExoTrackSelection exoTrackSelection, long j) {
int indexOf = this.trackGroups.indexOf(exoTrackSelection.getTrackGroup());
return new ChunkSampleStream(this.manifest.streamElements[indexOf].type, (int[]) null, (Format[]) null, this.chunkSourceFactory.createChunkSource(this.manifestLoaderErrorThrower, this.manifest, indexOf, exoTrackSelection, this.transferListener), this, this.allocator, j, this.drmSessionManager, this.drmEventDispatcher, this.loadErrorHandlingPolicy, this.mediaSourceEventDispatcher);
}
private static TrackGroupArray buildTrackGroups(SsManifest ssManifest, DrmSessionManager drmSessionManager2) {
TrackGroup[] trackGroupArr = new TrackGroup[ssManifest.streamElements.length];
for (int i = 0; i < ssManifest.streamElements.length; i++) {
Format[] formatArr = ssManifest.streamElements[i].formats;
Format[] formatArr2 = new Format[formatArr.length];
for (int i2 = 0; i2 < formatArr.length; i2++) {
Format format = formatArr[i2];
formatArr2[i2] = format.copyWithCryptoType(drmSessionManager2.getCryptoType(format));
}
trackGroupArr[i] = new TrackGroup(Integer.toString(i), formatArr2);
}
return new TrackGroupArray(trackGroupArr);
}
private static ChunkSampleStream<SsChunkSource>[] newSampleStreamArray(int i) {
return new ChunkSampleStream[i];
}
}
Download file