mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2025-01-09 13:43:22 +00:00
601 lines
25 KiB
Java
601 lines
25 KiB
Java
package androidx.media3.exoplayer.source.chunk;
|
|
|
|
import androidx.media3.common.Format;
|
|
import androidx.media3.common.util.Assertions;
|
|
import androidx.media3.common.util.Util;
|
|
import androidx.media3.decoder.DecoderInputBuffer;
|
|
import androidx.media3.exoplayer.FormatHolder;
|
|
import androidx.media3.exoplayer.SeekParameters;
|
|
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
|
import androidx.media3.exoplayer.source.LoadEventInfo;
|
|
import androidx.media3.exoplayer.source.MediaSourceEventListener;
|
|
import androidx.media3.exoplayer.source.SampleQueue;
|
|
import androidx.media3.exoplayer.source.SampleStream;
|
|
import androidx.media3.exoplayer.source.SequenceableLoader;
|
|
import androidx.media3.exoplayer.source.chunk.ChunkSource;
|
|
import androidx.media3.exoplayer.upstream.Allocator;
|
|
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;
|
|
import androidx.media3.exoplayer.upstream.Loader;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, SequenceableLoader, Loader.Callback<Chunk>, Loader.ReleaseCallback {
|
|
private static final String TAG = "ChunkSampleStream";
|
|
private final SequenceableLoader.Callback<ChunkSampleStream<T>> callback;
|
|
private BaseMediaChunk canceledMediaChunk;
|
|
private final BaseMediaChunkOutput chunkOutput;
|
|
private final T chunkSource;
|
|
private final SampleQueue[] embeddedSampleQueues;
|
|
private final Format[] embeddedTrackFormats;
|
|
private final int[] embeddedTrackTypes;
|
|
private final boolean[] embeddedTracksSelected;
|
|
private long lastSeekPositionUs;
|
|
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
|
|
private final Loader loader;
|
|
private Chunk loadingChunk;
|
|
boolean loadingFinished;
|
|
private final ArrayList<BaseMediaChunk> mediaChunks;
|
|
private final MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher;
|
|
private final ChunkHolder nextChunkHolder;
|
|
private int nextNotifyPrimaryFormatMediaChunkIndex;
|
|
private long pendingResetPositionUs;
|
|
private Format primaryDownstreamTrackFormat;
|
|
private final SampleQueue primarySampleQueue;
|
|
public final int primaryTrackType;
|
|
private final List<BaseMediaChunk> readOnlyMediaChunks;
|
|
private ReleaseCallback<T> releaseCallback;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public interface ReleaseCallback<T extends ChunkSource> {
|
|
void onSampleStreamReleased(ChunkSampleStream<T> chunkSampleStream);
|
|
}
|
|
|
|
public T getChunkSource() {
|
|
return this.chunkSource;
|
|
}
|
|
|
|
boolean isPendingReset() {
|
|
return this.pendingResetPositionUs != -9223372036854775807L;
|
|
}
|
|
|
|
public ChunkSampleStream(int i, int[] iArr, Format[] formatArr, T t, SequenceableLoader.Callback<ChunkSampleStream<T>> callback, Allocator allocator, long j, DrmSessionManager drmSessionManager, DrmSessionEventListener.EventDispatcher eventDispatcher, LoadErrorHandlingPolicy loadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher eventDispatcher2) {
|
|
this.primaryTrackType = i;
|
|
int i2 = 0;
|
|
iArr = iArr == null ? new int[0] : iArr;
|
|
this.embeddedTrackTypes = iArr;
|
|
this.embeddedTrackFormats = formatArr == null ? new Format[0] : formatArr;
|
|
this.chunkSource = t;
|
|
this.callback = callback;
|
|
this.mediaSourceEventDispatcher = eventDispatcher2;
|
|
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy;
|
|
this.loader = new Loader(TAG);
|
|
this.nextChunkHolder = new ChunkHolder();
|
|
ArrayList<BaseMediaChunk> arrayList = new ArrayList<>();
|
|
this.mediaChunks = arrayList;
|
|
this.readOnlyMediaChunks = Collections.unmodifiableList(arrayList);
|
|
int length = iArr.length;
|
|
this.embeddedSampleQueues = new SampleQueue[length];
|
|
this.embeddedTracksSelected = new boolean[length];
|
|
int i3 = length + 1;
|
|
int[] iArr2 = new int[i3];
|
|
SampleQueue[] sampleQueueArr = new SampleQueue[i3];
|
|
SampleQueue createWithDrm = SampleQueue.createWithDrm(allocator, drmSessionManager, eventDispatcher);
|
|
this.primarySampleQueue = createWithDrm;
|
|
iArr2[0] = i;
|
|
sampleQueueArr[0] = createWithDrm;
|
|
while (i2 < length) {
|
|
SampleQueue createWithoutDrm = SampleQueue.createWithoutDrm(allocator);
|
|
this.embeddedSampleQueues[i2] = createWithoutDrm;
|
|
int i4 = i2 + 1;
|
|
sampleQueueArr[i4] = createWithoutDrm;
|
|
iArr2[i4] = this.embeddedTrackTypes[i2];
|
|
i2 = i4;
|
|
}
|
|
this.chunkOutput = new BaseMediaChunkOutput(iArr2, sampleQueueArr);
|
|
this.pendingResetPositionUs = j;
|
|
this.lastSeekPositionUs = j;
|
|
}
|
|
|
|
public void discardBuffer(long j, boolean z) {
|
|
if (isPendingReset()) {
|
|
return;
|
|
}
|
|
int firstIndex = this.primarySampleQueue.getFirstIndex();
|
|
this.primarySampleQueue.discardTo(j, z, true);
|
|
int firstIndex2 = this.primarySampleQueue.getFirstIndex();
|
|
if (firstIndex2 > firstIndex) {
|
|
long firstTimestampUs = this.primarySampleQueue.getFirstTimestampUs();
|
|
int i = 0;
|
|
while (true) {
|
|
SampleQueue[] sampleQueueArr = this.embeddedSampleQueues;
|
|
if (i >= sampleQueueArr.length) {
|
|
break;
|
|
}
|
|
sampleQueueArr[i].discardTo(firstTimestampUs, z, this.embeddedTracksSelected[i]);
|
|
i++;
|
|
}
|
|
}
|
|
discardDownstreamMediaChunks(firstIndex2);
|
|
}
|
|
|
|
public ChunkSampleStream<T>.EmbeddedSampleStream selectEmbeddedTrack(long j, int i) {
|
|
for (int i2 = 0; i2 < this.embeddedSampleQueues.length; i2++) {
|
|
if (this.embeddedTrackTypes[i2] == i) {
|
|
Assertions.checkState(!this.embeddedTracksSelected[i2]);
|
|
this.embeddedTracksSelected[i2] = true;
|
|
this.embeddedSampleQueues[i2].seekTo(j, true);
|
|
return new EmbeddedSampleStream(this, this.embeddedSampleQueues[i2], i2);
|
|
}
|
|
}
|
|
throw new IllegalStateException();
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SequenceableLoader
|
|
public long getBufferedPositionUs() {
|
|
if (this.loadingFinished) {
|
|
return Long.MIN_VALUE;
|
|
}
|
|
if (isPendingReset()) {
|
|
return this.pendingResetPositionUs;
|
|
}
|
|
long j = this.lastSeekPositionUs;
|
|
BaseMediaChunk lastMediaChunk = getLastMediaChunk();
|
|
if (!lastMediaChunk.isLoadCompleted()) {
|
|
if (this.mediaChunks.size() > 1) {
|
|
lastMediaChunk = this.mediaChunks.get(r2.size() - 2);
|
|
} else {
|
|
lastMediaChunk = null;
|
|
}
|
|
}
|
|
if (lastMediaChunk != null) {
|
|
j = Math.max(j, lastMediaChunk.endTimeUs);
|
|
}
|
|
return Math.max(j, this.primarySampleQueue.getLargestQueuedTimestampUs());
|
|
}
|
|
|
|
public long getAdjustedSeekPositionUs(long j, SeekParameters seekParameters) {
|
|
return this.chunkSource.getAdjustedSeekPositionUs(j, seekParameters);
|
|
}
|
|
|
|
public void seekToUs(long j) {
|
|
BaseMediaChunk baseMediaChunk;
|
|
boolean seekTo;
|
|
this.lastSeekPositionUs = j;
|
|
if (isPendingReset()) {
|
|
this.pendingResetPositionUs = j;
|
|
return;
|
|
}
|
|
int i = 0;
|
|
for (int i2 = 0; i2 < this.mediaChunks.size(); i2++) {
|
|
baseMediaChunk = this.mediaChunks.get(i2);
|
|
long j2 = baseMediaChunk.startTimeUs;
|
|
if (j2 == j && baseMediaChunk.clippedStartTimeUs == -9223372036854775807L) {
|
|
break;
|
|
} else {
|
|
if (j2 > j) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
baseMediaChunk = null;
|
|
if (baseMediaChunk != null) {
|
|
seekTo = this.primarySampleQueue.seekTo(baseMediaChunk.getFirstSampleIndex(0));
|
|
} else {
|
|
seekTo = this.primarySampleQueue.seekTo(j, j < getNextLoadPositionUs());
|
|
}
|
|
if (seekTo) {
|
|
this.nextNotifyPrimaryFormatMediaChunkIndex = primarySampleIndexToMediaChunkIndex(this.primarySampleQueue.getReadIndex(), 0);
|
|
SampleQueue[] sampleQueueArr = this.embeddedSampleQueues;
|
|
int length = sampleQueueArr.length;
|
|
while (i < length) {
|
|
sampleQueueArr[i].seekTo(j, true);
|
|
i++;
|
|
}
|
|
return;
|
|
}
|
|
this.pendingResetPositionUs = j;
|
|
this.loadingFinished = false;
|
|
this.mediaChunks.clear();
|
|
this.nextNotifyPrimaryFormatMediaChunkIndex = 0;
|
|
if (this.loader.isLoading()) {
|
|
this.primarySampleQueue.discardToEnd();
|
|
SampleQueue[] sampleQueueArr2 = this.embeddedSampleQueues;
|
|
int length2 = sampleQueueArr2.length;
|
|
while (i < length2) {
|
|
sampleQueueArr2[i].discardToEnd();
|
|
i++;
|
|
}
|
|
this.loader.cancelLoading();
|
|
return;
|
|
}
|
|
this.loader.clearFatalError();
|
|
resetSampleQueues();
|
|
}
|
|
|
|
public void release() {
|
|
release(null);
|
|
}
|
|
|
|
public void release(ReleaseCallback<T> releaseCallback) {
|
|
this.releaseCallback = releaseCallback;
|
|
this.primarySampleQueue.preRelease();
|
|
for (SampleQueue sampleQueue : this.embeddedSampleQueues) {
|
|
sampleQueue.preRelease();
|
|
}
|
|
this.loader.release(this);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.upstream.Loader.ReleaseCallback
|
|
public void onLoaderReleased() {
|
|
this.primarySampleQueue.release();
|
|
for (SampleQueue sampleQueue : this.embeddedSampleQueues) {
|
|
sampleQueue.release();
|
|
}
|
|
this.chunkSource.release();
|
|
ReleaseCallback<T> releaseCallback = this.releaseCallback;
|
|
if (releaseCallback != null) {
|
|
releaseCallback.onSampleStreamReleased(this);
|
|
}
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SampleStream
|
|
public boolean isReady() {
|
|
return !isPendingReset() && this.primarySampleQueue.isReady(this.loadingFinished);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SampleStream
|
|
public void maybeThrowError() throws IOException {
|
|
this.loader.maybeThrowError();
|
|
this.primarySampleQueue.maybeThrowError();
|
|
if (this.loader.isLoading()) {
|
|
return;
|
|
}
|
|
this.chunkSource.maybeThrowError();
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SampleStream
|
|
public int readData(FormatHolder formatHolder, DecoderInputBuffer decoderInputBuffer, int i) {
|
|
if (isPendingReset()) {
|
|
return -3;
|
|
}
|
|
BaseMediaChunk baseMediaChunk = this.canceledMediaChunk;
|
|
if (baseMediaChunk != null && baseMediaChunk.getFirstSampleIndex(0) <= this.primarySampleQueue.getReadIndex()) {
|
|
return -3;
|
|
}
|
|
maybeNotifyPrimaryTrackFormatChanged();
|
|
return this.primarySampleQueue.read(formatHolder, decoderInputBuffer, i, this.loadingFinished);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SampleStream
|
|
public int skipData(long j) {
|
|
if (isPendingReset()) {
|
|
return 0;
|
|
}
|
|
int skipCount = this.primarySampleQueue.getSkipCount(j, this.loadingFinished);
|
|
BaseMediaChunk baseMediaChunk = this.canceledMediaChunk;
|
|
if (baseMediaChunk != null) {
|
|
skipCount = Math.min(skipCount, baseMediaChunk.getFirstSampleIndex(0) - this.primarySampleQueue.getReadIndex());
|
|
}
|
|
this.primarySampleQueue.skip(skipCount);
|
|
maybeNotifyPrimaryTrackFormatChanged();
|
|
return skipCount;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.upstream.Loader.Callback
|
|
public void onLoadCompleted(Chunk chunk, long j, long j2) {
|
|
this.loadingChunk = null;
|
|
this.chunkSource.onChunkLoadCompleted(chunk);
|
|
LoadEventInfo loadEventInfo = new LoadEventInfo(chunk.loadTaskId, chunk.dataSpec, chunk.getUri(), chunk.getResponseHeaders(), j, j2, chunk.bytesLoaded());
|
|
this.loadErrorHandlingPolicy.onLoadTaskConcluded(chunk.loadTaskId);
|
|
this.mediaSourceEventDispatcher.loadCompleted(loadEventInfo, chunk.type, this.primaryTrackType, chunk.trackFormat, chunk.trackSelectionReason, chunk.trackSelectionData, chunk.startTimeUs, chunk.endTimeUs);
|
|
this.callback.onContinueLoadingRequested(this);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.upstream.Loader.Callback
|
|
public void onLoadCanceled(Chunk chunk, long j, long j2, boolean z) {
|
|
this.loadingChunk = null;
|
|
this.canceledMediaChunk = null;
|
|
LoadEventInfo loadEventInfo = new LoadEventInfo(chunk.loadTaskId, chunk.dataSpec, chunk.getUri(), chunk.getResponseHeaders(), j, j2, chunk.bytesLoaded());
|
|
this.loadErrorHandlingPolicy.onLoadTaskConcluded(chunk.loadTaskId);
|
|
this.mediaSourceEventDispatcher.loadCanceled(loadEventInfo, chunk.type, this.primaryTrackType, chunk.trackFormat, chunk.trackSelectionReason, chunk.trackSelectionData, chunk.startTimeUs, chunk.endTimeUs);
|
|
if (z) {
|
|
return;
|
|
}
|
|
if (isPendingReset()) {
|
|
resetSampleQueues();
|
|
} else if (isMediaChunk(chunk)) {
|
|
discardUpstreamMediaChunksFromIndex(this.mediaChunks.size() - 1);
|
|
if (this.mediaChunks.isEmpty()) {
|
|
this.pendingResetPositionUs = this.lastSeekPositionUs;
|
|
}
|
|
}
|
|
this.callback.onContinueLoadingRequested(this);
|
|
}
|
|
|
|
/* JADX WARN: Removed duplicated region for block: B:20:0x00a9 */
|
|
/* JADX WARN: Removed duplicated region for block: B:26:0x00f1 */
|
|
@Override // androidx.media3.exoplayer.upstream.Loader.Callback
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
public androidx.media3.exoplayer.upstream.Loader.LoadErrorAction onLoadError(androidx.media3.exoplayer.source.chunk.Chunk r31, long r32, long r34, java.io.IOException r36, int r37) {
|
|
/*
|
|
Method dump skipped, instructions count: 257
|
|
To view this dump add '--comments-level debug' option
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: androidx.media3.exoplayer.source.chunk.ChunkSampleStream.onLoadError(androidx.media3.exoplayer.source.chunk.Chunk, long, long, java.io.IOException, int):androidx.media3.exoplayer.upstream.Loader$LoadErrorAction");
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SequenceableLoader
|
|
public boolean continueLoading(long j) {
|
|
List<BaseMediaChunk> list;
|
|
long j2;
|
|
if (this.loadingFinished || this.loader.isLoading() || this.loader.hasFatalError()) {
|
|
return false;
|
|
}
|
|
boolean isPendingReset = isPendingReset();
|
|
if (isPendingReset) {
|
|
list = Collections.emptyList();
|
|
j2 = this.pendingResetPositionUs;
|
|
} else {
|
|
list = this.readOnlyMediaChunks;
|
|
j2 = getLastMediaChunk().endTimeUs;
|
|
}
|
|
this.chunkSource.getNextChunk(j, j2, list, this.nextChunkHolder);
|
|
boolean z = this.nextChunkHolder.endOfStream;
|
|
Chunk chunk = this.nextChunkHolder.chunk;
|
|
this.nextChunkHolder.clear();
|
|
if (z) {
|
|
this.pendingResetPositionUs = -9223372036854775807L;
|
|
this.loadingFinished = true;
|
|
return true;
|
|
}
|
|
if (chunk == null) {
|
|
return false;
|
|
}
|
|
this.loadingChunk = chunk;
|
|
if (isMediaChunk(chunk)) {
|
|
BaseMediaChunk baseMediaChunk = (BaseMediaChunk) chunk;
|
|
if (isPendingReset) {
|
|
long j3 = baseMediaChunk.startTimeUs;
|
|
long j4 = this.pendingResetPositionUs;
|
|
if (j3 != j4) {
|
|
this.primarySampleQueue.setStartTimeUs(j4);
|
|
for (SampleQueue sampleQueue : this.embeddedSampleQueues) {
|
|
sampleQueue.setStartTimeUs(this.pendingResetPositionUs);
|
|
}
|
|
}
|
|
this.pendingResetPositionUs = -9223372036854775807L;
|
|
}
|
|
baseMediaChunk.init(this.chunkOutput);
|
|
this.mediaChunks.add(baseMediaChunk);
|
|
} else if (chunk instanceof InitializationChunk) {
|
|
((InitializationChunk) chunk).init(this.chunkOutput);
|
|
}
|
|
this.mediaSourceEventDispatcher.loadStarted(new LoadEventInfo(chunk.loadTaskId, chunk.dataSpec, this.loader.startLoading(chunk, this, this.loadErrorHandlingPolicy.getMinimumLoadableRetryCount(chunk.type))), chunk.type, this.primaryTrackType, chunk.trackFormat, chunk.trackSelectionReason, chunk.trackSelectionData, chunk.startTimeUs, chunk.endTimeUs);
|
|
return true;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SequenceableLoader
|
|
public boolean isLoading() {
|
|
return this.loader.isLoading();
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SequenceableLoader
|
|
public long getNextLoadPositionUs() {
|
|
if (isPendingReset()) {
|
|
return this.pendingResetPositionUs;
|
|
}
|
|
if (this.loadingFinished) {
|
|
return Long.MIN_VALUE;
|
|
}
|
|
return getLastMediaChunk().endTimeUs;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SequenceableLoader
|
|
public void reevaluateBuffer(long j) {
|
|
if (this.loader.hasFatalError() || isPendingReset()) {
|
|
return;
|
|
}
|
|
if (this.loader.isLoading()) {
|
|
Chunk chunk = (Chunk) Assertions.checkNotNull(this.loadingChunk);
|
|
if (!(isMediaChunk(chunk) && haveReadFromMediaChunk(this.mediaChunks.size() - 1)) && this.chunkSource.shouldCancelLoad(j, chunk, this.readOnlyMediaChunks)) {
|
|
this.loader.cancelLoading();
|
|
if (isMediaChunk(chunk)) {
|
|
this.canceledMediaChunk = (BaseMediaChunk) chunk;
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
int preferredQueueSize = this.chunkSource.getPreferredQueueSize(j, this.readOnlyMediaChunks);
|
|
if (preferredQueueSize < this.mediaChunks.size()) {
|
|
discardUpstream(preferredQueueSize);
|
|
}
|
|
}
|
|
|
|
private void discardUpstream(int i) {
|
|
Assertions.checkState(!this.loader.isLoading());
|
|
int size = this.mediaChunks.size();
|
|
while (true) {
|
|
if (i >= size) {
|
|
i = -1;
|
|
break;
|
|
} else if (!haveReadFromMediaChunk(i)) {
|
|
break;
|
|
} else {
|
|
i++;
|
|
}
|
|
}
|
|
if (i == -1) {
|
|
return;
|
|
}
|
|
long j = getLastMediaChunk().endTimeUs;
|
|
BaseMediaChunk discardUpstreamMediaChunksFromIndex = discardUpstreamMediaChunksFromIndex(i);
|
|
if (this.mediaChunks.isEmpty()) {
|
|
this.pendingResetPositionUs = this.lastSeekPositionUs;
|
|
}
|
|
this.loadingFinished = false;
|
|
this.mediaSourceEventDispatcher.upstreamDiscarded(this.primaryTrackType, discardUpstreamMediaChunksFromIndex.startTimeUs, j);
|
|
}
|
|
|
|
private boolean isMediaChunk(Chunk chunk) {
|
|
return chunk instanceof BaseMediaChunk;
|
|
}
|
|
|
|
private void resetSampleQueues() {
|
|
this.primarySampleQueue.reset();
|
|
for (SampleQueue sampleQueue : this.embeddedSampleQueues) {
|
|
sampleQueue.reset();
|
|
}
|
|
}
|
|
|
|
private boolean haveReadFromMediaChunk(int i) {
|
|
int readIndex;
|
|
BaseMediaChunk baseMediaChunk = this.mediaChunks.get(i);
|
|
if (this.primarySampleQueue.getReadIndex() > baseMediaChunk.getFirstSampleIndex(0)) {
|
|
return true;
|
|
}
|
|
int i2 = 0;
|
|
do {
|
|
SampleQueue[] sampleQueueArr = this.embeddedSampleQueues;
|
|
if (i2 >= sampleQueueArr.length) {
|
|
return false;
|
|
}
|
|
readIndex = sampleQueueArr[i2].getReadIndex();
|
|
i2++;
|
|
} while (readIndex <= baseMediaChunk.getFirstSampleIndex(i2));
|
|
return true;
|
|
}
|
|
|
|
private void discardDownstreamMediaChunks(int i) {
|
|
int min = Math.min(primarySampleIndexToMediaChunkIndex(i, 0), this.nextNotifyPrimaryFormatMediaChunkIndex);
|
|
if (min > 0) {
|
|
Util.removeRange(this.mediaChunks, 0, min);
|
|
this.nextNotifyPrimaryFormatMediaChunkIndex -= min;
|
|
}
|
|
}
|
|
|
|
private void maybeNotifyPrimaryTrackFormatChanged() {
|
|
int primarySampleIndexToMediaChunkIndex = primarySampleIndexToMediaChunkIndex(this.primarySampleQueue.getReadIndex(), this.nextNotifyPrimaryFormatMediaChunkIndex - 1);
|
|
while (true) {
|
|
int i = this.nextNotifyPrimaryFormatMediaChunkIndex;
|
|
if (i > primarySampleIndexToMediaChunkIndex) {
|
|
return;
|
|
}
|
|
this.nextNotifyPrimaryFormatMediaChunkIndex = i + 1;
|
|
maybeNotifyPrimaryTrackFormatChanged(i);
|
|
}
|
|
}
|
|
|
|
private void maybeNotifyPrimaryTrackFormatChanged(int i) {
|
|
BaseMediaChunk baseMediaChunk = this.mediaChunks.get(i);
|
|
Format format = baseMediaChunk.trackFormat;
|
|
if (!format.equals(this.primaryDownstreamTrackFormat)) {
|
|
this.mediaSourceEventDispatcher.downstreamFormatChanged(this.primaryTrackType, format, baseMediaChunk.trackSelectionReason, baseMediaChunk.trackSelectionData, baseMediaChunk.startTimeUs);
|
|
}
|
|
this.primaryDownstreamTrackFormat = format;
|
|
}
|
|
|
|
private int primarySampleIndexToMediaChunkIndex(int i, int i2) {
|
|
do {
|
|
i2++;
|
|
if (i2 >= this.mediaChunks.size()) {
|
|
return this.mediaChunks.size() - 1;
|
|
}
|
|
} while (this.mediaChunks.get(i2).getFirstSampleIndex(0) <= i);
|
|
return i2 - 1;
|
|
}
|
|
|
|
private BaseMediaChunk getLastMediaChunk() {
|
|
return this.mediaChunks.get(r1.size() - 1);
|
|
}
|
|
|
|
private BaseMediaChunk discardUpstreamMediaChunksFromIndex(int i) {
|
|
BaseMediaChunk baseMediaChunk = this.mediaChunks.get(i);
|
|
ArrayList<BaseMediaChunk> arrayList = this.mediaChunks;
|
|
Util.removeRange(arrayList, i, arrayList.size());
|
|
this.nextNotifyPrimaryFormatMediaChunkIndex = Math.max(this.nextNotifyPrimaryFormatMediaChunkIndex, this.mediaChunks.size());
|
|
int i2 = 0;
|
|
this.primarySampleQueue.discardUpstreamSamples(baseMediaChunk.getFirstSampleIndex(0));
|
|
while (true) {
|
|
SampleQueue[] sampleQueueArr = this.embeddedSampleQueues;
|
|
if (i2 >= sampleQueueArr.length) {
|
|
return baseMediaChunk;
|
|
}
|
|
SampleQueue sampleQueue = sampleQueueArr[i2];
|
|
i2++;
|
|
sampleQueue.discardUpstreamSamples(baseMediaChunk.getFirstSampleIndex(i2));
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes2.dex */
|
|
public final class EmbeddedSampleStream implements SampleStream {
|
|
private final int index;
|
|
private boolean notifiedDownstreamFormat;
|
|
public final ChunkSampleStream<T> parent;
|
|
private final SampleQueue sampleQueue;
|
|
|
|
@Override // androidx.media3.exoplayer.source.SampleStream
|
|
public void maybeThrowError() {
|
|
}
|
|
|
|
public EmbeddedSampleStream(ChunkSampleStream<T> chunkSampleStream, SampleQueue sampleQueue, int i) {
|
|
this.parent = chunkSampleStream;
|
|
this.sampleQueue = sampleQueue;
|
|
this.index = i;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SampleStream
|
|
public boolean isReady() {
|
|
return !ChunkSampleStream.this.isPendingReset() && this.sampleQueue.isReady(ChunkSampleStream.this.loadingFinished);
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SampleStream
|
|
public int skipData(long j) {
|
|
if (ChunkSampleStream.this.isPendingReset()) {
|
|
return 0;
|
|
}
|
|
int skipCount = this.sampleQueue.getSkipCount(j, ChunkSampleStream.this.loadingFinished);
|
|
if (ChunkSampleStream.this.canceledMediaChunk != null) {
|
|
skipCount = Math.min(skipCount, ChunkSampleStream.this.canceledMediaChunk.getFirstSampleIndex(this.index + 1) - this.sampleQueue.getReadIndex());
|
|
}
|
|
this.sampleQueue.skip(skipCount);
|
|
if (skipCount > 0) {
|
|
maybeNotifyDownstreamFormat();
|
|
}
|
|
return skipCount;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.source.SampleStream
|
|
public int readData(FormatHolder formatHolder, DecoderInputBuffer decoderInputBuffer, int i) {
|
|
if (ChunkSampleStream.this.isPendingReset()) {
|
|
return -3;
|
|
}
|
|
if (ChunkSampleStream.this.canceledMediaChunk != null && ChunkSampleStream.this.canceledMediaChunk.getFirstSampleIndex(this.index + 1) <= this.sampleQueue.getReadIndex()) {
|
|
return -3;
|
|
}
|
|
maybeNotifyDownstreamFormat();
|
|
return this.sampleQueue.read(formatHolder, decoderInputBuffer, i, ChunkSampleStream.this.loadingFinished);
|
|
}
|
|
|
|
public void release() {
|
|
Assertions.checkState(ChunkSampleStream.this.embeddedTracksSelected[this.index]);
|
|
ChunkSampleStream.this.embeddedTracksSelected[this.index] = false;
|
|
}
|
|
|
|
private void maybeNotifyDownstreamFormat() {
|
|
if (this.notifiedDownstreamFormat) {
|
|
return;
|
|
}
|
|
ChunkSampleStream.this.mediaSourceEventDispatcher.downstreamFormatChanged(ChunkSampleStream.this.embeddedTrackTypes[this.index], ChunkSampleStream.this.embeddedTrackFormats[this.index], 0, null, ChunkSampleStream.this.lastSeekPositionUs);
|
|
this.notifiedDownstreamFormat = true;
|
|
}
|
|
}
|
|
}
|