CrackMe.apk
Download file
package com.google.android.exoplayer2.extractor.mp4;
import android.util.Pair;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.audio.Ac4Util;
import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorInput;
import com.google.android.exoplayer2.extractor.ExtractorOutput;
import com.google.android.exoplayer2.extractor.ExtractorsFactory;
import com.google.android.exoplayer2.extractor.GaplessInfoHolder;
import com.google.android.exoplayer2.extractor.PositionHolder;
import com.google.android.exoplayer2.extractor.SeekMap;
import com.google.android.exoplayer2.extractor.TrackOutput;
import com.google.android.exoplayer2.extractor.TrueHdSampleRechunker;
import com.google.android.exoplayer2.extractor.mp4.Atom;
import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata;
import com.google.android.exoplayer2.upstream.DataReader;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.NalUnitUtil;
import com.google.android.exoplayer2.util.ParsableByteArray;
import com.google.android.exoplayer2.util.Util;
import java.io.IOException;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
public final class Mp4Extractor implements Extractor, SeekMap {
public static final ExtractorsFactory FACTORY = Mp4Extractor$$ExternalSyntheticLambda0.INSTANCE;
private static final int FILE_TYPE_HEIC = 2;
private static final int FILE_TYPE_MP4 = 0;
private static final int FILE_TYPE_QUICKTIME = 1;
public static final int FLAG_READ_MOTION_PHOTO_METADATA = 2;
public static final int FLAG_READ_SEF_DATA = 4;
public static final int FLAG_WORKAROUND_IGNORE_EDIT_LISTS = 1;
private static final long MAXIMUM_READ_AHEAD_BYTES_STREAM = 10485760;
private static final long RELOAD_MINIMUM_SEEK_DISTANCE = 262144;
private static final int STATE_READING_ATOM_HEADER = 0;
private static final int STATE_READING_ATOM_PAYLOAD = 1;
private static final int STATE_READING_SAMPLE = 2;
private static final int STATE_READING_SEF = 3;
private long[][] accumulatedSampleSizes;
private ParsableByteArray atomData;
private final ParsableByteArray atomHeader;
private int atomHeaderBytesRead;
private long atomSize;
private int atomType;
private final ArrayDeque<Atom.ContainerAtom> containerAtoms;
private long durationUs;
private ExtractorOutput extractorOutput;
private int fileType;
private int firstVideoTrackIndex;
private final int flags;
private MotionPhotoMetadata motionPhotoMetadata;
private final ParsableByteArray nalLength;
private final ParsableByteArray nalStartCode;
private int parserState;
private int sampleBytesRead;
private int sampleBytesWritten;
private int sampleCurrentNalBytesRemaining;
private int sampleTrackIndex;
private final ParsableByteArray scratch;
private final SefReader sefReader;
private final List<Metadata.Entry> slowMotionMetadataEntries;
private Mp4Track[] tracks;
@Documented
@Target({ElementType.TYPE_USE})
@Retention(RetentionPolicy.SOURCE)
public @interface Flags {
}
private static int brandToFileType(int i) {
if (i != 1751476579) {
return i != 1903435808 ? 0 : 1;
}
return 2;
}
static /* synthetic */ Track lambda$processMoovAtom$1(Track track) {
return track;
}
private static boolean shouldParseContainerAtom(int i) {
return i == 1836019574 || i == 1953653099 || i == 1835297121 || i == 1835626086 || i == 1937007212 || i == 1701082227 || i == 1835365473;
}
private static boolean shouldParseLeafAtom(int i) {
return i == 1835296868 || i == 1836476516 || i == 1751411826 || i == 1937011556 || i == 1937011827 || i == 1937011571 || i == 1668576371 || i == 1701606260 || i == 1937011555 || i == 1937011578 || i == 1937013298 || i == 1937007471 || i == 1668232756 || i == 1953196132 || i == 1718909296 || i == 1969517665 || i == 1801812339 || i == 1768715124;
}
public boolean isSeekable() {
return true;
}
public void release() {
}
static /* synthetic */ Extractor[] lambda$static$0() {
return new Extractor[]{new Mp4Extractor()};
}
public Mp4Extractor() {
this(0);
}
public Mp4Extractor(int i) {
this.flags = i;
this.parserState = (i & 4) != 0 ? 3 : 0;
this.sefReader = new SefReader();
this.slowMotionMetadataEntries = new ArrayList();
this.atomHeader = new ParsableByteArray(16);
this.containerAtoms = new ArrayDeque<>();
this.nalStartCode = new ParsableByteArray(NalUnitUtil.NAL_START_CODE);
this.nalLength = new ParsableByteArray(4);
this.scratch = new ParsableByteArray();
this.sampleTrackIndex = -1;
this.extractorOutput = ExtractorOutput.PLACEHOLDER;
this.tracks = new Mp4Track[0];
}
public boolean sniff(ExtractorInput extractorInput) throws IOException {
return Sniffer.sniffUnfragmented(extractorInput, (this.flags & 2) != 0);
}
public void init(ExtractorOutput extractorOutput2) {
this.extractorOutput = extractorOutput2;
}
public void seek(long j, long j2) {
this.containerAtoms.clear();
this.atomHeaderBytesRead = 0;
this.sampleTrackIndex = -1;
this.sampleBytesRead = 0;
this.sampleBytesWritten = 0;
this.sampleCurrentNalBytesRemaining = 0;
if (j != 0) {
for (Mp4Track mp4Track : this.tracks) {
updateSampleIndex(mp4Track, j2);
if (mp4Track.trueHdSampleRechunker != null) {
mp4Track.trueHdSampleRechunker.reset();
}
}
} else if (this.parserState != 3) {
enterReadingAtomHeaderState();
} else {
this.sefReader.reset();
this.slowMotionMetadataEntries.clear();
}
}
public int read(ExtractorInput extractorInput, PositionHolder positionHolder) throws IOException {
while (true) {
int i = this.parserState;
if (i != 0) {
if (i != 1) {
if (i == 2) {
return readSample(extractorInput, positionHolder);
}
if (i == 3) {
return readSefData(extractorInput, positionHolder);
}
throw new IllegalStateException();
} else if (readAtomPayload(extractorInput, positionHolder)) {
return 1;
}
} else if (!readAtomHeader(extractorInput)) {
return -1;
}
}
}
public long getDurationUs() {
return this.durationUs;
}
public SeekMap.SeekPoints getSeekPoints(long j) {
return getSeekPoints(j, -1);
}
/* JADX WARNING: Removed duplicated region for block: B:25:0x0062 */
/* JADX WARNING: Removed duplicated region for block: B:36:0x0088 */
/* JADX WARNING: Removed duplicated region for block: B:38:0x008e */
/* Code decompiled incorrectly, please refer to instructions dump. */
public com.google.android.exoplayer2.extractor.SeekMap.SeekPoints getSeekPoints(long r17, int r19) {
/*
r16 = this;
r0 = r16
r1 = r17
r3 = r19
com.google.android.exoplayer2.extractor.mp4.Mp4Extractor$Mp4Track[] r4 = r0.tracks
int r5 = r4.length
if (r5 != 0) goto L_0x0013
com.google.android.exoplayer2.extractor.SeekMap$SeekPoints r1 = new com.google.android.exoplayer2.extractor.SeekMap$SeekPoints
com.google.android.exoplayer2.extractor.SeekPoint r2 = com.google.android.exoplayer2.extractor.SeekPoint.START
r1.<init>(r2)
return r1
L_0x0013:
r5 = -1
r7 = -1
if (r3 == r7) goto L_0x001a
r8 = r3
goto L_0x001c
L_0x001a:
int r8 = r0.firstVideoTrackIndex
L_0x001c:
r9 = -9223372036854775807(0x8000000000000001, double:-4.9E-324)
if (r8 == r7) goto L_0x0058
r4 = r4[r8]
com.google.android.exoplayer2.extractor.mp4.TrackSampleTable r4 = r4.sampleTable
int r8 = getSynchronizationSampleIndex(r4, r1)
if (r8 != r7) goto L_0x0035
com.google.android.exoplayer2.extractor.SeekMap$SeekPoints r1 = new com.google.android.exoplayer2.extractor.SeekMap$SeekPoints
com.google.android.exoplayer2.extractor.SeekPoint r2 = com.google.android.exoplayer2.extractor.SeekPoint.START
r1.<init>(r2)
return r1
L_0x0035:
long[] r11 = r4.timestampsUs
r12 = r11[r8]
long[] r11 = r4.offsets
r14 = r11[r8]
int r11 = (r12 > r1 ? 1 : (r12 == r1 ? 0 : -1))
if (r11 >= 0) goto L_0x005e
int r11 = r4.sampleCount
int r11 = r11 + -1
if (r8 >= r11) goto L_0x005e
int r1 = r4.getIndexOfLaterOrEqualSynchronizationSample(r1)
if (r1 == r7) goto L_0x005e
if (r1 == r8) goto L_0x005e
long[] r2 = r4.timestampsUs
r5 = r2[r1]
long[] r2 = r4.offsets
r1 = r2[r1]
goto L_0x0060
L_0x0058:
r14 = 9223372036854775807(0x7fffffffffffffff, double:NaN)
r12 = r1
L_0x005e:
r1 = r5
r5 = r9
L_0x0060:
if (r3 != r7) goto L_0x007f
r3 = 0
L_0x0063:
com.google.android.exoplayer2.extractor.mp4.Mp4Extractor$Mp4Track[] r4 = r0.tracks
int r7 = r4.length
if (r3 >= r7) goto L_0x007f
int r7 = r0.firstVideoTrackIndex
if (r3 == r7) goto L_0x007c
r4 = r4[r3]
com.google.android.exoplayer2.extractor.mp4.TrackSampleTable r4 = r4.sampleTable
long r14 = maybeAdjustSeekOffset(r4, r12, r14)
int r7 = (r5 > r9 ? 1 : (r5 == r9 ? 0 : -1))
if (r7 == 0) goto L_0x007c
long r1 = maybeAdjustSeekOffset(r4, r5, r1)
L_0x007c:
int r3 = r3 + 1
goto L_0x0063
L_0x007f:
com.google.android.exoplayer2.extractor.SeekPoint r3 = new com.google.android.exoplayer2.extractor.SeekPoint
r3.<init>(r12, r14)
int r4 = (r5 > r9 ? 1 : (r5 == r9 ? 0 : -1))
if (r4 != 0) goto L_0x008e
com.google.android.exoplayer2.extractor.SeekMap$SeekPoints r1 = new com.google.android.exoplayer2.extractor.SeekMap$SeekPoints
r1.<init>(r3)
return r1
L_0x008e:
com.google.android.exoplayer2.extractor.SeekPoint r4 = new com.google.android.exoplayer2.extractor.SeekPoint
r4.<init>(r5, r1)
com.google.android.exoplayer2.extractor.SeekMap$SeekPoints r1 = new com.google.android.exoplayer2.extractor.SeekMap$SeekPoints
r1.<init>(r3, r4)
return r1
*/
throw new UnsupportedOperationException("Method not decompiled: com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.getSeekPoints(long, int):com.google.android.exoplayer2.extractor.SeekMap$SeekPoints");
}
private void enterReadingAtomHeaderState() {
this.parserState = 0;
this.atomHeaderBytesRead = 0;
}
private boolean readAtomHeader(ExtractorInput extractorInput) throws IOException {
Atom.ContainerAtom peek;
if (this.atomHeaderBytesRead == 0) {
if (!extractorInput.readFully(this.atomHeader.getData(), 0, 8, true)) {
processEndOfStreamReadingAtomHeader();
return false;
}
this.atomHeaderBytesRead = 8;
this.atomHeader.setPosition(0);
this.atomSize = this.atomHeader.readUnsignedInt();
this.atomType = this.atomHeader.readInt();
}
long j = this.atomSize;
if (j == 1) {
extractorInput.readFully(this.atomHeader.getData(), 8, 8);
this.atomHeaderBytesRead += 8;
this.atomSize = this.atomHeader.readUnsignedLongToLong();
} else if (j == 0) {
long length = extractorInput.getLength();
if (length == -1 && (peek = this.containerAtoms.peek()) != null) {
length = peek.endPosition;
}
if (length != -1) {
this.atomSize = (length - extractorInput.getPosition()) + ((long) this.atomHeaderBytesRead);
}
}
if (this.atomSize >= ((long) this.atomHeaderBytesRead)) {
if (shouldParseContainerAtom(this.atomType)) {
long position = extractorInput.getPosition();
long j2 = this.atomSize;
int i = this.atomHeaderBytesRead;
long j3 = (position + j2) - ((long) i);
if (j2 != ((long) i) && this.atomType == 1835365473) {
maybeSkipRemainingMetaAtomHeaderBytes(extractorInput);
}
this.containerAtoms.push(new Atom.ContainerAtom(this.atomType, j3));
if (this.atomSize == ((long) this.atomHeaderBytesRead)) {
processAtomEnded(j3);
} else {
enterReadingAtomHeaderState();
}
} else if (shouldParseLeafAtom(this.atomType)) {
Assertions.checkState(this.atomHeaderBytesRead == 8);
Assertions.checkState(this.atomSize <= 2147483647L);
ParsableByteArray parsableByteArray = new ParsableByteArray((int) this.atomSize);
System.arraycopy(this.atomHeader.getData(), 0, parsableByteArray.getData(), 0, 8);
this.atomData = parsableByteArray;
this.parserState = 1;
} else {
processUnparsedAtom(extractorInput.getPosition() - ((long) this.atomHeaderBytesRead));
this.atomData = null;
this.parserState = 1;
}
return true;
}
throw ParserException.createForUnsupportedContainerFeature("Atom size less than header length (unsupported).");
}
/* JADX WARNING: Removed duplicated region for block: B:17:0x0064 A[ORIG_RETURN, RETURN, SYNTHETIC] */
/* JADX WARNING: Removed duplicated region for block: B:18:? A[RETURN, SYNTHETIC] */
/* Code decompiled incorrectly, please refer to instructions dump. */
private boolean readAtomPayload(com.google.android.exoplayer2.extractor.ExtractorInput r10, com.google.android.exoplayer2.extractor.PositionHolder r11) throws java.io.IOException {
/*
r9 = this;
long r0 = r9.atomSize
int r2 = r9.atomHeaderBytesRead
long r2 = (long) r2
long r0 = r0 - r2
long r2 = r10.getPosition()
long r2 = r2 + r0
com.google.android.exoplayer2.util.ParsableByteArray r4 = r9.atomData
r5 = 1
r6 = 0
if (r4 == 0) goto L_0x0044
byte[] r11 = r4.getData()
int r7 = r9.atomHeaderBytesRead
int r1 = (int) r0
r10.readFully(r11, r7, r1)
int r10 = r9.atomType
r11 = 1718909296(0x66747970, float:2.8862439E23)
if (r10 != r11) goto L_0x0029
int r10 = processFtypAtom(r4)
r9.fileType = r10
goto L_0x004f
L_0x0029:
java.util.ArrayDeque<com.google.android.exoplayer2.extractor.mp4.Atom$ContainerAtom> r10 = r9.containerAtoms
boolean r10 = r10.isEmpty()
if (r10 != 0) goto L_0x004f
java.util.ArrayDeque<com.google.android.exoplayer2.extractor.mp4.Atom$ContainerAtom> r10 = r9.containerAtoms
java.lang.Object r10 = r10.peek()
com.google.android.exoplayer2.extractor.mp4.Atom$ContainerAtom r10 = (com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom) r10
com.google.android.exoplayer2.extractor.mp4.Atom$LeafAtom r11 = new com.google.android.exoplayer2.extractor.mp4.Atom$LeafAtom
int r0 = r9.atomType
r11.<init>(r0, r4)
r10.add((com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom) r11)
goto L_0x004f
L_0x0044:
r7 = 262144(0x40000, double:1.295163E-318)
int r4 = (r0 > r7 ? 1 : (r0 == r7 ? 0 : -1))
if (r4 >= 0) goto L_0x0051
int r11 = (int) r0
r10.skipFully(r11)
L_0x004f:
r10 = 0
goto L_0x0059
L_0x0051:
long r7 = r10.getPosition()
long r7 = r7 + r0
r11.position = r7
r10 = 1
L_0x0059:
r9.processAtomEnded(r2)
if (r10 == 0) goto L_0x0064
int r10 = r9.parserState
r11 = 2
if (r10 == r11) goto L_0x0064
goto L_0x0065
L_0x0064:
r5 = 0
L_0x0065:
return r5
*/
throw new UnsupportedOperationException("Method not decompiled: com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.readAtomPayload(com.google.android.exoplayer2.extractor.ExtractorInput, com.google.android.exoplayer2.extractor.PositionHolder):boolean");
}
private int readSefData(ExtractorInput extractorInput, PositionHolder positionHolder) throws IOException {
int read = this.sefReader.read(extractorInput, positionHolder, this.slowMotionMetadataEntries);
if (read == 1 && positionHolder.position == 0) {
enterReadingAtomHeaderState();
}
return read;
}
private void processAtomEnded(long j) throws ParserException {
while (!this.containerAtoms.isEmpty() && this.containerAtoms.peek().endPosition == j) {
Atom.ContainerAtom pop = this.containerAtoms.pop();
if (pop.type == 1836019574) {
processMoovAtom(pop);
this.containerAtoms.clear();
this.parserState = 2;
} else if (!this.containerAtoms.isEmpty()) {
this.containerAtoms.peek().add(pop);
}
}
if (this.parserState != 2) {
enterReadingAtomHeaderState();
}
}
private void processMoovAtom(Atom.ContainerAtom containerAtom) throws ParserException {
Metadata metadata;
Metadata metadata2;
int i;
List<TrackSampleTable> list;
int i2;
Atom.ContainerAtom containerAtom2 = containerAtom;
ArrayList arrayList = new ArrayList();
boolean z = this.fileType == 1;
GaplessInfoHolder gaplessInfoHolder = new GaplessInfoHolder();
Atom.LeafAtom leafAtomOfType = containerAtom2.getLeafAtomOfType(Atom.TYPE_udta);
if (leafAtomOfType != null) {
Pair<Metadata, Metadata> parseUdta = AtomParsers.parseUdta(leafAtomOfType);
Metadata metadata3 = (Metadata) parseUdta.first;
Metadata metadata4 = (Metadata) parseUdta.second;
if (metadata3 != null) {
gaplessInfoHolder.setFromMetadata(metadata3);
}
metadata2 = metadata4;
metadata = metadata3;
} else {
metadata2 = null;
metadata = null;
}
Atom.ContainerAtom containerAtomOfType = containerAtom2.getContainerAtomOfType(Atom.TYPE_meta);
Metadata parseMdtaFromMeta = containerAtomOfType != null ? AtomParsers.parseMdtaFromMeta(containerAtomOfType) : null;
boolean z2 = (this.flags & 1) != 0;
long j = C.TIME_UNSET;
Metadata metadata5 = parseMdtaFromMeta;
List<TrackSampleTable> parseTraks = AtomParsers.parseTraks(containerAtom, gaplessInfoHolder, C.TIME_UNSET, (DrmInitData) null, z2, z, Mp4Extractor$$ExternalSyntheticLambda1.INSTANCE);
int size = parseTraks.size();
long j2 = -9223372036854775807L;
int i3 = 0;
int i4 = -1;
while (i3 < size) {
TrackSampleTable trackSampleTable = parseTraks.get(i3);
if (trackSampleTable.sampleCount == 0) {
list = parseTraks;
i = size;
} else {
Track track = trackSampleTable.track;
list = parseTraks;
i = size;
long j3 = track.durationUs != j ? track.durationUs : trackSampleTable.durationUs;
long max = Math.max(j2, j3);
Mp4Track mp4Track = new Mp4Track(track, trackSampleTable, this.extractorOutput.track(i3, track.type));
if (MimeTypes.AUDIO_TRUEHD.equals(track.format.sampleMimeType)) {
i2 = trackSampleTable.maximumSize * 16;
} else {
i2 = trackSampleTable.maximumSize + 30;
}
Format.Builder buildUpon = track.format.buildUpon();
buildUpon.setMaxInputSize(i2);
if (track.type == 2 && j3 > 0 && trackSampleTable.sampleCount > 1) {
buildUpon.setFrameRate(((float) trackSampleTable.sampleCount) / (((float) j3) / 1000000.0f));
}
MetadataUtil.setFormatGaplessInfo(track.type, gaplessInfoHolder, buildUpon);
int i5 = track.type;
Metadata[] metadataArr = new Metadata[2];
metadataArr[0] = metadata2;
metadataArr[1] = this.slowMotionMetadataEntries.isEmpty() ? null : new Metadata((List<? extends Metadata.Entry>) this.slowMotionMetadataEntries);
MetadataUtil.setFormatMetadata(i5, metadata, metadata5, buildUpon, metadataArr);
mp4Track.trackOutput.format(buildUpon.build());
if (track.type == 2) {
if (i4 == -1) {
i4 = arrayList.size();
}
}
arrayList.add(mp4Track);
j2 = max;
}
i3++;
parseTraks = list;
size = i;
j = C.TIME_UNSET;
}
this.firstVideoTrackIndex = i4;
this.durationUs = j2;
Mp4Track[] mp4TrackArr = (Mp4Track[]) arrayList.toArray(new Mp4Track[0]);
this.tracks = mp4TrackArr;
this.accumulatedSampleSizes = calculateAccumulatedSampleSizes(mp4TrackArr);
this.extractorOutput.endTracks();
this.extractorOutput.seekMap(this);
}
private int readSample(ExtractorInput extractorInput, PositionHolder positionHolder) throws IOException {
int i;
PositionHolder positionHolder2;
int i2;
ExtractorInput extractorInput2 = extractorInput;
long position = extractorInput.getPosition();
if (this.sampleTrackIndex == -1) {
int trackIndexOfNextReadSample = getTrackIndexOfNextReadSample(position);
this.sampleTrackIndex = trackIndexOfNextReadSample;
if (trackIndexOfNextReadSample == -1) {
return -1;
}
}
Mp4Track mp4Track = this.tracks[this.sampleTrackIndex];
TrackOutput trackOutput = mp4Track.trackOutput;
int i3 = mp4Track.sampleIndex;
long j = mp4Track.sampleTable.offsets[i3];
int i4 = mp4Track.sampleTable.sizes[i3];
TrueHdSampleRechunker trueHdSampleRechunker = mp4Track.trueHdSampleRechunker;
long j2 = (j - position) + ((long) this.sampleBytesRead);
if (j2 < 0) {
i = 1;
positionHolder2 = positionHolder;
} else if (j2 >= 262144) {
positionHolder2 = positionHolder;
i = 1;
} else {
if (mp4Track.track.sampleTransformation == 1) {
j2 += 8;
i4 -= 8;
}
extractorInput2.skipFully((int) j2);
if (mp4Track.track.nalUnitLengthFieldLength == 0) {
if (MimeTypes.AUDIO_AC4.equals(mp4Track.track.format.sampleMimeType)) {
if (this.sampleBytesWritten == 0) {
Ac4Util.getAc4SampleHeader(i4, this.scratch);
trackOutput.sampleData(this.scratch, 7);
this.sampleBytesWritten += 7;
}
i4 += 7;
} else if (trueHdSampleRechunker != null) {
trueHdSampleRechunker.startSample(extractorInput2);
}
while (true) {
int i5 = this.sampleBytesWritten;
if (i5 >= i4) {
break;
}
int sampleData = trackOutput.sampleData((DataReader) extractorInput2, i4 - i5, false);
this.sampleBytesRead += sampleData;
this.sampleBytesWritten += sampleData;
this.sampleCurrentNalBytesRemaining -= sampleData;
}
} else {
byte[] data = this.nalLength.getData();
data[0] = 0;
data[1] = 0;
data[2] = 0;
int i6 = mp4Track.track.nalUnitLengthFieldLength;
int i7 = 4;
int i8 = 4 - mp4Track.track.nalUnitLengthFieldLength;
while (this.sampleBytesWritten < i4) {
int i9 = this.sampleCurrentNalBytesRemaining;
if (i9 == 0) {
extractorInput2.readFully(data, i8, i6);
this.sampleBytesRead += i6;
this.nalLength.setPosition(0);
int readInt = this.nalLength.readInt();
if (readInt >= 0) {
this.sampleCurrentNalBytesRemaining = readInt;
this.nalStartCode.setPosition(0);
trackOutput.sampleData(this.nalStartCode, i7);
this.sampleBytesWritten += i7;
i4 += i8;
} else {
throw ParserException.createForMalformedContainer("Invalid NAL length", (Throwable) null);
}
} else {
int sampleData2 = trackOutput.sampleData((DataReader) extractorInput2, i9, false);
this.sampleBytesRead += sampleData2;
this.sampleBytesWritten += sampleData2;
this.sampleCurrentNalBytesRemaining -= sampleData2;
i7 = 4;
}
}
}
int i10 = i4;
long j3 = mp4Track.sampleTable.timestampsUs[i3];
int i11 = mp4Track.sampleTable.flags[i3];
if (trueHdSampleRechunker != null) {
int i12 = i10;
TrueHdSampleRechunker trueHdSampleRechunker2 = trueHdSampleRechunker;
trueHdSampleRechunker.sampleMetadata(trackOutput, j3, i11, i12, 0, (TrackOutput.CryptoData) null);
if (i3 + 1 == mp4Track.sampleTable.sampleCount) {
trueHdSampleRechunker2.outputPendingSampleMetadata(trackOutput, (TrackOutput.CryptoData) null);
}
i2 = 0;
} else {
i2 = 0;
trackOutput.sampleMetadata(j3, i11, i10, 0, (TrackOutput.CryptoData) null);
}
mp4Track.sampleIndex++;
this.sampleTrackIndex = -1;
this.sampleBytesRead = i2;
this.sampleBytesWritten = i2;
this.sampleCurrentNalBytesRemaining = i2;
return i2;
}
positionHolder2.position = j;
return i;
}
private int getTrackIndexOfNextReadSample(long j) {
int i = -1;
int i2 = -1;
int i3 = 0;
long j2 = Long.MAX_VALUE;
boolean z = true;
long j3 = Long.MAX_VALUE;
boolean z2 = true;
long j4 = Long.MAX_VALUE;
while (true) {
Mp4Track[] mp4TrackArr = this.tracks;
if (i3 >= mp4TrackArr.length) {
break;
}
Mp4Track mp4Track = mp4TrackArr[i3];
int i4 = mp4Track.sampleIndex;
if (i4 != mp4Track.sampleTable.sampleCount) {
long j5 = mp4Track.sampleTable.offsets[i4];
long j6 = ((long[][]) Util.castNonNull(this.accumulatedSampleSizes))[i3][i4];
long j7 = j5 - j;
boolean z3 = j7 < 0 || j7 >= 262144;
if ((!z3 && z2) || (z3 == z2 && j7 < j4)) {
z2 = z3;
j4 = j7;
i2 = i3;
j3 = j6;
}
if (j6 < j2) {
z = z3;
i = i3;
j2 = j6;
}
}
i3++;
}
return (j2 == Long.MAX_VALUE || !z || j3 < j2 + MAXIMUM_READ_AHEAD_BYTES_STREAM) ? i2 : i;
}
private void updateSampleIndex(Mp4Track mp4Track, long j) {
TrackSampleTable trackSampleTable = mp4Track.sampleTable;
int indexOfEarlierOrEqualSynchronizationSample = trackSampleTable.getIndexOfEarlierOrEqualSynchronizationSample(j);
if (indexOfEarlierOrEqualSynchronizationSample == -1) {
indexOfEarlierOrEqualSynchronizationSample = trackSampleTable.getIndexOfLaterOrEqualSynchronizationSample(j);
}
mp4Track.sampleIndex = indexOfEarlierOrEqualSynchronizationSample;
}
private void processEndOfStreamReadingAtomHeader() {
Metadata metadata;
if (this.fileType == 2 && (this.flags & 2) != 0) {
TrackOutput track = this.extractorOutput.track(0, 4);
if (this.motionPhotoMetadata == null) {
metadata = null;
} else {
metadata = new Metadata(this.motionPhotoMetadata);
}
track.format(new Format.Builder().setMetadata(metadata).build());
this.extractorOutput.endTracks();
this.extractorOutput.seekMap(new SeekMap.Unseekable(C.TIME_UNSET));
}
}
private void maybeSkipRemainingMetaAtomHeaderBytes(ExtractorInput extractorInput) throws IOException {
this.scratch.reset(8);
extractorInput.peekFully(this.scratch.getData(), 0, 8);
AtomParsers.maybeSkipRemainingMetaAtomHeaderBytes(this.scratch);
extractorInput.skipFully(this.scratch.getPosition());
extractorInput.resetPeekPosition();
}
private void processUnparsedAtom(long j) {
if (this.atomType == 1836086884) {
int i = this.atomHeaderBytesRead;
this.motionPhotoMetadata = new MotionPhotoMetadata(0, j, C.TIME_UNSET, j + ((long) i), this.atomSize - ((long) i));
}
}
private static long[][] calculateAccumulatedSampleSizes(Mp4Track[] mp4TrackArr) {
long[][] jArr = new long[mp4TrackArr.length][];
int[] iArr = new int[mp4TrackArr.length];
long[] jArr2 = new long[mp4TrackArr.length];
boolean[] zArr = new boolean[mp4TrackArr.length];
for (int i = 0; i < mp4TrackArr.length; i++) {
jArr[i] = new long[mp4TrackArr[i].sampleTable.sampleCount];
jArr2[i] = mp4TrackArr[i].sampleTable.timestampsUs[0];
}
long j = 0;
int i2 = 0;
while (i2 < mp4TrackArr.length) {
long j2 = Long.MAX_VALUE;
int i3 = -1;
for (int i4 = 0; i4 < mp4TrackArr.length; i4++) {
if (!zArr[i4] && jArr2[i4] <= j2) {
j2 = jArr2[i4];
i3 = i4;
}
}
int i5 = iArr[i3];
jArr[i3][i5] = j;
j += (long) mp4TrackArr[i3].sampleTable.sizes[i5];
int i6 = i5 + 1;
iArr[i3] = i6;
if (i6 < jArr[i3].length) {
jArr2[i3] = mp4TrackArr[i3].sampleTable.timestampsUs[i6];
} else {
zArr[i3] = true;
i2++;
}
}
return jArr;
}
private static long maybeAdjustSeekOffset(TrackSampleTable trackSampleTable, long j, long j2) {
int synchronizationSampleIndex = getSynchronizationSampleIndex(trackSampleTable, j);
if (synchronizationSampleIndex == -1) {
return j2;
}
return Math.min(trackSampleTable.offsets[synchronizationSampleIndex], j2);
}
private static int getSynchronizationSampleIndex(TrackSampleTable trackSampleTable, long j) {
int indexOfEarlierOrEqualSynchronizationSample = trackSampleTable.getIndexOfEarlierOrEqualSynchronizationSample(j);
return indexOfEarlierOrEqualSynchronizationSample == -1 ? trackSampleTable.getIndexOfLaterOrEqualSynchronizationSample(j) : indexOfEarlierOrEqualSynchronizationSample;
}
private static int processFtypAtom(ParsableByteArray parsableByteArray) {
parsableByteArray.setPosition(8);
int brandToFileType = brandToFileType(parsableByteArray.readInt());
if (brandToFileType != 0) {
return brandToFileType;
}
parsableByteArray.skipBytes(4);
while (parsableByteArray.bytesLeft() > 0) {
int brandToFileType2 = brandToFileType(parsableByteArray.readInt());
if (brandToFileType2 != 0) {
return brandToFileType2;
}
}
return 0;
}
private static final class Mp4Track {
public int sampleIndex;
public final TrackSampleTable sampleTable;
public final Track track;
public final TrackOutput trackOutput;
public final TrueHdSampleRechunker trueHdSampleRechunker;
public Mp4Track(Track track2, TrackSampleTable trackSampleTable, TrackOutput trackOutput2) {
this.track = track2;
this.sampleTable = trackSampleTable;
this.trackOutput = trackOutput2;
this.trueHdSampleRechunker = MimeTypes.AUDIO_TRUEHD.equals(track2.format.sampleMimeType) ? new TrueHdSampleRechunker() : null;
}
}
}
Download file