CrackMe.apk
Download file
package com.google.android.exoplayer2.extractor.ts;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.extractor.ExtractorOutput;
import com.google.android.exoplayer2.extractor.TrackOutput;
import com.google.android.exoplayer2.extractor.ts.TsPayloadReader;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.ParsableByteArray;
import java.util.Collections;
import java.util.List;
public final class DvbSubtitleReader implements ElementaryStreamReader {
private int bytesToCheck;
private final TrackOutput[] outputs;
private int sampleBytesWritten;
private long sampleTimeUs = C.TIME_UNSET;
private final List<TsPayloadReader.DvbSubtitleInfo> subtitleInfos;
private boolean writingSample;
public DvbSubtitleReader(List<TsPayloadReader.DvbSubtitleInfo> list) {
this.subtitleInfos = list;
this.outputs = new TrackOutput[list.size()];
}
public void seek() {
this.writingSample = false;
this.sampleTimeUs = C.TIME_UNSET;
}
public void createTracks(ExtractorOutput extractorOutput, TsPayloadReader.TrackIdGenerator trackIdGenerator) {
for (int i = 0; i < this.outputs.length; i++) {
TsPayloadReader.DvbSubtitleInfo dvbSubtitleInfo = this.subtitleInfos.get(i);
trackIdGenerator.generateNewId();
TrackOutput track = extractorOutput.track(trackIdGenerator.getTrackId(), 3);
track.format(new Format.Builder().setId(trackIdGenerator.getFormatId()).setSampleMimeType(MimeTypes.APPLICATION_DVBSUBS).setInitializationData(Collections.singletonList(dvbSubtitleInfo.initializationData)).setLanguage(dvbSubtitleInfo.language).build());
this.outputs[i] = track;
}
}
public void packetStarted(long j, int i) {
if ((i & 4) != 0) {
this.writingSample = true;
if (j != C.TIME_UNSET) {
this.sampleTimeUs = j;
}
this.sampleBytesWritten = 0;
this.bytesToCheck = 2;
}
}
public void packetFinished() {
if (this.writingSample) {
if (this.sampleTimeUs != C.TIME_UNSET) {
for (TrackOutput sampleMetadata : this.outputs) {
sampleMetadata.sampleMetadata(this.sampleTimeUs, 1, this.sampleBytesWritten, 0, (TrackOutput.CryptoData) null);
}
}
this.writingSample = false;
}
}
public void consume(ParsableByteArray parsableByteArray) {
if (!this.writingSample) {
return;
}
if (this.bytesToCheck != 2 || checkNextByte(parsableByteArray, 32)) {
if (this.bytesToCheck != 1 || checkNextByte(parsableByteArray, 0)) {
int position = parsableByteArray.getPosition();
int bytesLeft = parsableByteArray.bytesLeft();
for (TrackOutput sampleData : this.outputs) {
parsableByteArray.setPosition(position);
sampleData.sampleData(parsableByteArray, bytesLeft);
}
this.sampleBytesWritten += bytesLeft;
}
}
}
private boolean checkNextByte(ParsableByteArray parsableByteArray, int i) {
if (parsableByteArray.bytesLeft() == 0) {
return false;
}
if (parsableByteArray.readUnsignedByte() != i) {
this.writingSample = false;
}
this.bytesToCheck--;
return this.writingSample;
}
}
Download file