mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2024-12-26 17:12:31 -06:00
1533 lines
71 KiB
Java
1533 lines
71 KiB
Java
package com.google.android.exoplayer2.mediacodec;
|
|
|
|
import android.media.MediaCodec;
|
|
import android.media.MediaCrypto;
|
|
import android.media.MediaCryptoException;
|
|
import android.media.MediaFormat;
|
|
import android.media.metrics.LogSessionId;
|
|
import android.os.Bundle;
|
|
import android.os.SystemClock;
|
|
import com.google.android.exoplayer2.BaseRenderer;
|
|
import com.google.android.exoplayer2.C;
|
|
import com.google.android.exoplayer2.ExoPlaybackException;
|
|
import com.google.android.exoplayer2.Format;
|
|
import com.google.android.exoplayer2.FormatHolder;
|
|
import com.google.android.exoplayer2.analytics.PlayerId;
|
|
import com.google.android.exoplayer2.decoder.CryptoConfig;
|
|
import com.google.android.exoplayer2.decoder.DecoderCounters;
|
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
|
import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation;
|
|
import com.google.android.exoplayer2.drm.DrmSession;
|
|
import com.google.android.exoplayer2.drm.FrameworkCryptoConfig;
|
|
import com.google.android.exoplayer2.mediacodec.MediaCodecAdapter;
|
|
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;
|
|
import com.google.android.exoplayer2.util.Assertions;
|
|
import com.google.android.exoplayer2.util.Log;
|
|
import com.google.android.exoplayer2.util.NalUnitUtil;
|
|
import com.google.android.exoplayer2.util.TimedValueQueue;
|
|
import com.google.android.exoplayer2.util.TraceUtil;
|
|
import com.google.android.exoplayer2.util.Util;
|
|
import com.google.common.base.Ascii;
|
|
import io.sentry.protocol.ViewHierarchyNode;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
import java.util.ArrayDeque;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public abstract class MediaCodecRenderer extends BaseRenderer {
|
|
private static final byte[] ADAPTATION_WORKAROUND_BUFFER = {0, 0, 1, 103, 66, -64, Ascii.VT, -38, 37, -112, 0, 0, 1, 104, -50, Ascii.SI, 19, 32, 0, 0, 1, 101, -120, -124, Ascii.CR, -50, 113, Ascii.CAN, -96, 0, 47, -65, Ascii.FS, 49, -61, 39, 93, 120};
|
|
private static final int ADAPTATION_WORKAROUND_MODE_ALWAYS = 2;
|
|
private static final int ADAPTATION_WORKAROUND_MODE_NEVER = 0;
|
|
private static final int ADAPTATION_WORKAROUND_MODE_SAME_RESOLUTION = 1;
|
|
private static final int ADAPTATION_WORKAROUND_SLICE_WIDTH_HEIGHT = 32;
|
|
protected static final float CODEC_OPERATING_RATE_UNSET = -1.0f;
|
|
private static final int DRAIN_ACTION_FLUSH = 1;
|
|
private static final int DRAIN_ACTION_FLUSH_AND_UPDATE_DRM_SESSION = 2;
|
|
private static final int DRAIN_ACTION_NONE = 0;
|
|
private static final int DRAIN_ACTION_REINITIALIZE = 3;
|
|
private static final int DRAIN_STATE_NONE = 0;
|
|
private static final int DRAIN_STATE_SIGNAL_END_OF_STREAM = 1;
|
|
private static final int DRAIN_STATE_WAIT_END_OF_STREAM = 2;
|
|
private static final long MAX_CODEC_HOTSWAP_TIME_MS = 1000;
|
|
private static final int RECONFIGURATION_STATE_NONE = 0;
|
|
private static final int RECONFIGURATION_STATE_QUEUE_PENDING = 2;
|
|
private static final int RECONFIGURATION_STATE_WRITE_PENDING = 1;
|
|
private static final String TAG = "MediaCodecRenderer";
|
|
private final float assumedMinimumCodecOperatingRate;
|
|
private ArrayDeque<MediaCodecInfo> availableCodecInfos;
|
|
private final DecoderInputBuffer buffer;
|
|
private final BatchBuffer bypassBatchBuffer;
|
|
private boolean bypassDrainAndReinitialize;
|
|
private boolean bypassEnabled;
|
|
private final DecoderInputBuffer bypassSampleBuffer;
|
|
private boolean bypassSampleBufferPending;
|
|
private C2Mp3TimestampTracker c2Mp3TimestampTracker;
|
|
private MediaCodecAdapter codec;
|
|
private int codecAdaptationWorkaroundMode;
|
|
private final MediaCodecAdapter.Factory codecAdapterFactory;
|
|
private int codecDrainAction;
|
|
private int codecDrainState;
|
|
private DrmSession codecDrmSession;
|
|
private boolean codecHasOutputMediaFormat;
|
|
private long codecHotswapDeadlineMs;
|
|
private MediaCodecInfo codecInfo;
|
|
private Format codecInputFormat;
|
|
private boolean codecNeedsAdaptationWorkaroundBuffer;
|
|
private boolean codecNeedsDiscardToSpsWorkaround;
|
|
private boolean codecNeedsEosBufferTimestampWorkaround;
|
|
private boolean codecNeedsEosFlushWorkaround;
|
|
private boolean codecNeedsEosOutputExceptionWorkaround;
|
|
private boolean codecNeedsEosPropagation;
|
|
private boolean codecNeedsFlushWorkaround;
|
|
private boolean codecNeedsMonoChannelCountWorkaround;
|
|
private boolean codecNeedsSosFlushWorkaround;
|
|
private float codecOperatingRate;
|
|
private MediaFormat codecOutputMediaFormat;
|
|
private boolean codecOutputMediaFormatChanged;
|
|
private boolean codecReceivedBuffers;
|
|
private boolean codecReceivedEos;
|
|
private int codecReconfigurationState;
|
|
private boolean codecReconfigured;
|
|
private float currentPlaybackSpeed;
|
|
private final ArrayList<Long> decodeOnlyPresentationTimestamps;
|
|
protected DecoderCounters decoderCounters;
|
|
private final boolean enableDecoderFallback;
|
|
private Format inputFormat;
|
|
private int inputIndex;
|
|
private boolean inputStreamEnded;
|
|
private boolean isDecodeOnlyOutputBuffer;
|
|
private boolean isLastOutputBuffer;
|
|
private long largestQueuedPresentationTimeUs;
|
|
private long lastBufferInStreamPresentationTimeUs;
|
|
private long lastProcessedOutputBufferTimeUs;
|
|
private final MediaCodecSelector mediaCodecSelector;
|
|
private MediaCrypto mediaCrypto;
|
|
private boolean mediaCryptoRequiresSecureDecoder;
|
|
private boolean needToNotifyOutputFormatChangeAfterStreamChange;
|
|
private final DecoderInputBuffer noDataBuffer;
|
|
private ByteBuffer outputBuffer;
|
|
private final MediaCodec.BufferInfo outputBufferInfo;
|
|
private Format outputFormat;
|
|
private int outputIndex;
|
|
private boolean outputStreamEnded;
|
|
private OutputStreamInfo outputStreamInfo;
|
|
private boolean pendingOutputEndOfStream;
|
|
private final ArrayDeque<OutputStreamInfo> pendingOutputStreamChanges;
|
|
private ExoPlaybackException pendingPlaybackException;
|
|
private DecoderInitializationException preferredDecoderInitializationException;
|
|
private long renderTimeLimitMs;
|
|
private boolean shouldSkipAdaptationWorkaroundOutputBuffer;
|
|
private DrmSession sourceDrmSession;
|
|
private float targetPlaybackSpeed;
|
|
private boolean waitingForFirstSampleInFormat;
|
|
|
|
private boolean drainAndFlushCodec() {
|
|
if (this.codecReceivedBuffers) {
|
|
this.codecDrainState = 1;
|
|
if (this.codecNeedsFlushWorkaround || this.codecNeedsEosFlushWorkaround) {
|
|
this.codecDrainAction = 3;
|
|
return false;
|
|
}
|
|
this.codecDrainAction = 1;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private boolean hasOutputBuffer() {
|
|
return this.outputIndex >= 0;
|
|
}
|
|
|
|
private void resetOutputBuffer() {
|
|
this.outputIndex = -1;
|
|
this.outputBuffer = null;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final MediaCodecAdapter getCodec() {
|
|
return this.codec;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final MediaCodecInfo getCodecInfo() {
|
|
return this.codecInfo;
|
|
}
|
|
|
|
protected boolean getCodecNeedsEosPropagation() {
|
|
return false;
|
|
}
|
|
|
|
protected float getCodecOperatingRate() {
|
|
return this.codecOperatingRate;
|
|
}
|
|
|
|
protected float getCodecOperatingRateV23(float f, Format format, Format[] formatArr) {
|
|
return CODEC_OPERATING_RATE_UNSET;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final MediaFormat getCodecOutputMediaFormat() {
|
|
return this.codecOutputMediaFormat;
|
|
}
|
|
|
|
protected abstract List<MediaCodecInfo> getDecoderInfos(MediaCodecSelector mediaCodecSelector, Format format, boolean z) throws MediaCodecUtil.DecoderQueryException;
|
|
|
|
protected abstract MediaCodecAdapter.Configuration getMediaCodecConfiguration(MediaCodecInfo mediaCodecInfo, Format format, MediaCrypto mediaCrypto, float f);
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public float getPlaybackSpeed() {
|
|
return this.currentPlaybackSpeed;
|
|
}
|
|
|
|
protected void handleInputBufferSupplementalData(DecoderInputBuffer decoderInputBuffer) throws ExoPlaybackException {
|
|
}
|
|
|
|
@Override // com.google.android.exoplayer2.Renderer
|
|
public boolean isEnded() {
|
|
return this.outputStreamEnded;
|
|
}
|
|
|
|
protected void onCodecError(Exception exc) {
|
|
}
|
|
|
|
protected void onCodecInitialized(String str, MediaCodecAdapter.Configuration configuration, long j, long j2) {
|
|
}
|
|
|
|
protected void onCodecReleased(String str) {
|
|
}
|
|
|
|
protected void onOutputFormatChanged(Format format, MediaFormat mediaFormat) throws ExoPlaybackException {
|
|
}
|
|
|
|
protected void onOutputStreamOffsetUsChanged(long j) {
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public void onProcessedStreamChange() {
|
|
}
|
|
|
|
protected void onQueueInputBuffer(DecoderInputBuffer decoderInputBuffer) throws ExoPlaybackException {
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // com.google.android.exoplayer2.BaseRenderer
|
|
public void onStarted() {
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // com.google.android.exoplayer2.BaseRenderer
|
|
public void onStopped() {
|
|
}
|
|
|
|
protected abstract boolean processOutputBuffer(long j, long j2, MediaCodecAdapter mediaCodecAdapter, ByteBuffer byteBuffer, int i, int i2, int i3, long j3, boolean z, boolean z2, Format format) throws ExoPlaybackException;
|
|
|
|
protected void renderToEndOfStream() throws ExoPlaybackException {
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final void setPendingOutputEndOfStream() {
|
|
this.pendingOutputEndOfStream = true;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final void setPendingPlaybackException(ExoPlaybackException exoPlaybackException) {
|
|
this.pendingPlaybackException = exoPlaybackException;
|
|
}
|
|
|
|
public void setRenderTimeLimitMs(long j) {
|
|
this.renderTimeLimitMs = j;
|
|
}
|
|
|
|
protected boolean shouldInitCodec(MediaCodecInfo mediaCodecInfo) {
|
|
return true;
|
|
}
|
|
|
|
protected boolean shouldReinitCodec() {
|
|
return false;
|
|
}
|
|
|
|
protected boolean shouldUseBypass(Format format) {
|
|
return false;
|
|
}
|
|
|
|
protected abstract int supportsFormat(MediaCodecSelector mediaCodecSelector, Format format) throws MediaCodecUtil.DecoderQueryException;
|
|
|
|
@Override // com.google.android.exoplayer2.BaseRenderer, com.google.android.exoplayer2.RendererCapabilities
|
|
public final int supportsMixedMimeTypeAdaptation() {
|
|
return 8;
|
|
}
|
|
|
|
/* loaded from: classes2.dex */
|
|
public static class DecoderInitializationException extends Exception {
|
|
private static final int CUSTOM_ERROR_CODE_BASE = -50000;
|
|
private static final int DECODER_QUERY_ERROR = -49998;
|
|
private static final int NO_SUITABLE_DECODER_ERROR = -49999;
|
|
public final MediaCodecInfo codecInfo;
|
|
public final String diagnosticInfo;
|
|
public final DecoderInitializationException fallbackDecoderInitializationException;
|
|
public final String mimeType;
|
|
public final boolean secureDecoderRequired;
|
|
|
|
public DecoderInitializationException(Format format, Throwable th, boolean z, int i) {
|
|
this("Decoder init failed: [" + i + "], " + format, th, format.sampleMimeType, z, null, buildCustomDiagnosticInfo(i), null);
|
|
}
|
|
|
|
public DecoderInitializationException(Format format, Throwable th, boolean z, MediaCodecInfo mediaCodecInfo) {
|
|
this("Decoder init failed: " + mediaCodecInfo.name + ", " + format, th, format.sampleMimeType, z, mediaCodecInfo, Util.SDK_INT >= 21 ? getDiagnosticInfoV21(th) : null, null);
|
|
}
|
|
|
|
private DecoderInitializationException(String str, Throwable th, String str2, boolean z, MediaCodecInfo mediaCodecInfo, String str3, DecoderInitializationException decoderInitializationException) {
|
|
super(str, th);
|
|
this.mimeType = str2;
|
|
this.secureDecoderRequired = z;
|
|
this.codecInfo = mediaCodecInfo;
|
|
this.diagnosticInfo = str3;
|
|
this.fallbackDecoderInitializationException = decoderInitializationException;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public DecoderInitializationException copyWithFallbackException(DecoderInitializationException decoderInitializationException) {
|
|
return new DecoderInitializationException(getMessage(), getCause(), this.mimeType, this.secureDecoderRequired, this.codecInfo, this.diagnosticInfo, decoderInitializationException);
|
|
}
|
|
|
|
private static String getDiagnosticInfoV21(Throwable th) {
|
|
if (th instanceof MediaCodec.CodecException) {
|
|
return ((MediaCodec.CodecException) th).getDiagnosticInfo();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static String buildCustomDiagnosticInfo(int i) {
|
|
return "com.google.android.exoplayer2.mediacodec.MediaCodecRenderer_" + (i < 0 ? "neg_" : "") + Math.abs(i);
|
|
}
|
|
}
|
|
|
|
public MediaCodecRenderer(int i, MediaCodecAdapter.Factory factory, MediaCodecSelector mediaCodecSelector, boolean z, float f) {
|
|
super(i);
|
|
this.codecAdapterFactory = factory;
|
|
this.mediaCodecSelector = (MediaCodecSelector) Assertions.checkNotNull(mediaCodecSelector);
|
|
this.enableDecoderFallback = z;
|
|
this.assumedMinimumCodecOperatingRate = f;
|
|
this.noDataBuffer = DecoderInputBuffer.newNoDataInstance();
|
|
this.buffer = new DecoderInputBuffer(0);
|
|
this.bypassSampleBuffer = new DecoderInputBuffer(2);
|
|
BatchBuffer batchBuffer = new BatchBuffer();
|
|
this.bypassBatchBuffer = batchBuffer;
|
|
this.decodeOnlyPresentationTimestamps = new ArrayList<>();
|
|
this.outputBufferInfo = new MediaCodec.BufferInfo();
|
|
this.currentPlaybackSpeed = 1.0f;
|
|
this.targetPlaybackSpeed = 1.0f;
|
|
this.renderTimeLimitMs = -9223372036854775807L;
|
|
this.pendingOutputStreamChanges = new ArrayDeque<>();
|
|
setOutputStreamInfo(OutputStreamInfo.UNSET);
|
|
batchBuffer.ensureSpaceForWrite(0);
|
|
batchBuffer.data.order(ByteOrder.nativeOrder());
|
|
this.codecOperatingRate = CODEC_OPERATING_RATE_UNSET;
|
|
this.codecAdaptationWorkaroundMode = 0;
|
|
this.codecReconfigurationState = 0;
|
|
this.inputIndex = -1;
|
|
this.outputIndex = -1;
|
|
this.codecHotswapDeadlineMs = -9223372036854775807L;
|
|
this.largestQueuedPresentationTimeUs = -9223372036854775807L;
|
|
this.lastBufferInStreamPresentationTimeUs = -9223372036854775807L;
|
|
this.lastProcessedOutputBufferTimeUs = -9223372036854775807L;
|
|
this.codecDrainState = 0;
|
|
this.codecDrainAction = 0;
|
|
}
|
|
|
|
@Override // com.google.android.exoplayer2.RendererCapabilities
|
|
public final int supportsFormat(Format format) throws ExoPlaybackException {
|
|
try {
|
|
return supportsFormat(this.mediaCodecSelector, format);
|
|
} catch (MediaCodecUtil.DecoderQueryException e) {
|
|
throw this.createRendererException(e, format, 4002);
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final void maybeInitCodecOrBypass() throws ExoPlaybackException {
|
|
Format format;
|
|
if (this.codec != null || this.bypassEnabled || (format = this.inputFormat) == null) {
|
|
return;
|
|
}
|
|
if (this.sourceDrmSession == null && shouldUseBypass(format)) {
|
|
initBypass(this.inputFormat);
|
|
return;
|
|
}
|
|
setCodecDrmSession(this.sourceDrmSession);
|
|
String str = this.inputFormat.sampleMimeType;
|
|
DrmSession drmSession = this.codecDrmSession;
|
|
if (drmSession != null) {
|
|
if (this.mediaCrypto == null) {
|
|
FrameworkCryptoConfig frameworkCryptoConfig = getFrameworkCryptoConfig(drmSession);
|
|
if (frameworkCryptoConfig == null) {
|
|
if (this.codecDrmSession.getError() == null) {
|
|
return;
|
|
}
|
|
} else {
|
|
try {
|
|
this.mediaCrypto = new MediaCrypto(frameworkCryptoConfig.uuid, frameworkCryptoConfig.sessionId);
|
|
this.mediaCryptoRequiresSecureDecoder = !frameworkCryptoConfig.forceAllowInsecureDecoderComponents && this.mediaCrypto.requiresSecureDecoderComponent(str);
|
|
} catch (MediaCryptoException e) {
|
|
throw createRendererException(e, this.inputFormat, 6006);
|
|
}
|
|
}
|
|
}
|
|
if (FrameworkCryptoConfig.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC) {
|
|
int state = this.codecDrmSession.getState();
|
|
if (state == 1) {
|
|
DrmSession.DrmSessionException drmSessionException = (DrmSession.DrmSessionException) Assertions.checkNotNull(this.codecDrmSession.getError());
|
|
throw createRendererException(drmSessionException, this.inputFormat, drmSessionException.errorCode);
|
|
}
|
|
if (state != 4) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
try {
|
|
maybeInitCodecWithFallback(this.mediaCrypto, this.mediaCryptoRequiresSecureDecoder);
|
|
} catch (DecoderInitializationException e2) {
|
|
throw createRendererException(e2, this.inputFormat, 4001);
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final void updateOutputFormatForTime(long j) throws ExoPlaybackException {
|
|
Format pollFloor = this.outputStreamInfo.formatQueue.pollFloor(j);
|
|
if (pollFloor == null && this.needToNotifyOutputFormatChangeAfterStreamChange && this.codecOutputMediaFormat != null) {
|
|
pollFloor = this.outputStreamInfo.formatQueue.pollFirst();
|
|
}
|
|
if (pollFloor != null) {
|
|
this.outputFormat = pollFloor;
|
|
} else if (!this.codecOutputMediaFormatChanged || this.outputFormat == null) {
|
|
return;
|
|
}
|
|
onOutputFormatChanged(this.outputFormat, this.codecOutputMediaFormat);
|
|
this.codecOutputMediaFormatChanged = false;
|
|
this.needToNotifyOutputFormatChangeAfterStreamChange = false;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // com.google.android.exoplayer2.BaseRenderer
|
|
public void onEnabled(boolean z, boolean z2) throws ExoPlaybackException {
|
|
this.decoderCounters = new DecoderCounters();
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
/* JADX WARN: Code restructure failed: missing block: B:13:0x0036, code lost:
|
|
|
|
if (r5 >= r1) goto L13;
|
|
*/
|
|
@Override // com.google.android.exoplayer2.BaseRenderer
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
public void onStreamChanged(com.google.android.exoplayer2.Format[] r13, long r14, long r16) throws com.google.android.exoplayer2.ExoPlaybackException {
|
|
/*
|
|
r12 = this;
|
|
r0 = r12
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo r1 = r0.outputStreamInfo
|
|
long r1 = r1.streamOffsetUs
|
|
r3 = -9223372036854775807(0x8000000000000001, double:-4.9E-324)
|
|
int r1 = (r1 > r3 ? 1 : (r1 == r3 ? 0 : -1))
|
|
if (r1 != 0) goto L20
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo r1 = new com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo
|
|
r6 = -9223372036854775807(0x8000000000000001, double:-4.9E-324)
|
|
r5 = r1
|
|
r8 = r14
|
|
r10 = r16
|
|
r5.<init>(r6, r8, r10)
|
|
r12.setOutputStreamInfo(r1)
|
|
goto L65
|
|
L20:
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo> r1 = r0.pendingOutputStreamChanges
|
|
boolean r1 = r1.isEmpty()
|
|
if (r1 == 0) goto L55
|
|
long r1 = r0.largestQueuedPresentationTimeUs
|
|
int r5 = (r1 > r3 ? 1 : (r1 == r3 ? 0 : -1))
|
|
if (r5 == 0) goto L38
|
|
long r5 = r0.lastProcessedOutputBufferTimeUs
|
|
int r7 = (r5 > r3 ? 1 : (r5 == r3 ? 0 : -1))
|
|
if (r7 == 0) goto L55
|
|
int r1 = (r5 > r1 ? 1 : (r5 == r1 ? 0 : -1))
|
|
if (r1 < 0) goto L55
|
|
L38:
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo r1 = new com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo
|
|
r6 = -9223372036854775807(0x8000000000000001, double:-4.9E-324)
|
|
r5 = r1
|
|
r8 = r14
|
|
r10 = r16
|
|
r5.<init>(r6, r8, r10)
|
|
r12.setOutputStreamInfo(r1)
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo r1 = r0.outputStreamInfo
|
|
long r1 = r1.streamOffsetUs
|
|
int r1 = (r1 > r3 ? 1 : (r1 == r3 ? 0 : -1))
|
|
if (r1 == 0) goto L65
|
|
r12.onProcessedStreamChange()
|
|
goto L65
|
|
L55:
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo> r1 = r0.pendingOutputStreamChanges
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo r9 = new com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$OutputStreamInfo
|
|
long r3 = r0.largestQueuedPresentationTimeUs
|
|
r2 = r9
|
|
r5 = r14
|
|
r7 = r16
|
|
r2.<init>(r3, r5, r7)
|
|
r1.add(r9)
|
|
L65:
|
|
return
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onStreamChanged(com.google.android.exoplayer2.Format[], long, long):void");
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // com.google.android.exoplayer2.BaseRenderer
|
|
public void onPositionReset(long j, boolean z) throws ExoPlaybackException {
|
|
this.inputStreamEnded = false;
|
|
this.outputStreamEnded = false;
|
|
this.pendingOutputEndOfStream = false;
|
|
if (this.bypassEnabled) {
|
|
this.bypassBatchBuffer.clear();
|
|
this.bypassSampleBuffer.clear();
|
|
this.bypassSampleBufferPending = false;
|
|
} else {
|
|
flushOrReinitializeCodec();
|
|
}
|
|
if (this.outputStreamInfo.formatQueue.size() > 0) {
|
|
this.waitingForFirstSampleInFormat = true;
|
|
}
|
|
this.outputStreamInfo.formatQueue.clear();
|
|
this.pendingOutputStreamChanges.clear();
|
|
}
|
|
|
|
@Override // com.google.android.exoplayer2.Renderer
|
|
public void setPlaybackSpeed(float f, float f2) throws ExoPlaybackException {
|
|
this.currentPlaybackSpeed = f;
|
|
this.targetPlaybackSpeed = f2;
|
|
updateCodecOperatingRate(this.codecInputFormat);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // com.google.android.exoplayer2.BaseRenderer
|
|
public void onDisabled() {
|
|
this.inputFormat = null;
|
|
setOutputStreamInfo(OutputStreamInfo.UNSET);
|
|
this.pendingOutputStreamChanges.clear();
|
|
flushOrReleaseCodec();
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // com.google.android.exoplayer2.BaseRenderer
|
|
public void onReset() {
|
|
try {
|
|
disableBypass();
|
|
releaseCodec();
|
|
} finally {
|
|
setSourceDrmSession(null);
|
|
}
|
|
}
|
|
|
|
private void disableBypass() {
|
|
this.bypassDrainAndReinitialize = false;
|
|
this.bypassBatchBuffer.clear();
|
|
this.bypassSampleBuffer.clear();
|
|
this.bypassSampleBufferPending = false;
|
|
this.bypassEnabled = false;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
public void releaseCodec() {
|
|
try {
|
|
MediaCodecAdapter mediaCodecAdapter = this.codec;
|
|
if (mediaCodecAdapter != null) {
|
|
mediaCodecAdapter.release();
|
|
this.decoderCounters.decoderReleaseCount++;
|
|
onCodecReleased(this.codecInfo.name);
|
|
}
|
|
this.codec = null;
|
|
try {
|
|
MediaCrypto mediaCrypto = this.mediaCrypto;
|
|
if (mediaCrypto != null) {
|
|
mediaCrypto.release();
|
|
}
|
|
} finally {
|
|
}
|
|
} catch (Throwable th) {
|
|
this.codec = null;
|
|
try {
|
|
MediaCrypto mediaCrypto2 = this.mediaCrypto;
|
|
if (mediaCrypto2 != null) {
|
|
mediaCrypto2.release();
|
|
}
|
|
throw th;
|
|
} finally {
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // com.google.android.exoplayer2.Renderer
|
|
public void render(long j, long j2) throws ExoPlaybackException {
|
|
boolean z = false;
|
|
if (this.pendingOutputEndOfStream) {
|
|
this.pendingOutputEndOfStream = false;
|
|
processEndOfStream();
|
|
}
|
|
ExoPlaybackException exoPlaybackException = this.pendingPlaybackException;
|
|
if (exoPlaybackException != null) {
|
|
this.pendingPlaybackException = null;
|
|
throw exoPlaybackException;
|
|
}
|
|
try {
|
|
if (this.outputStreamEnded) {
|
|
renderToEndOfStream();
|
|
return;
|
|
}
|
|
if (this.inputFormat != null || readSourceOmittingSampleData(2)) {
|
|
maybeInitCodecOrBypass();
|
|
if (this.bypassEnabled) {
|
|
TraceUtil.beginSection("bypassRender");
|
|
do {
|
|
} while (bypassRender(j, j2));
|
|
TraceUtil.endSection();
|
|
} else if (this.codec != null) {
|
|
long elapsedRealtime = SystemClock.elapsedRealtime();
|
|
TraceUtil.beginSection("drainAndFeed");
|
|
while (drainOutputBuffer(j, j2) && shouldContinueRendering(elapsedRealtime)) {
|
|
}
|
|
while (feedInputBuffer() && shouldContinueRendering(elapsedRealtime)) {
|
|
}
|
|
TraceUtil.endSection();
|
|
} else {
|
|
this.decoderCounters.skippedInputBufferCount += skipSource(j);
|
|
readSourceOmittingSampleData(1);
|
|
}
|
|
this.decoderCounters.ensureUpdated();
|
|
}
|
|
} catch (IllegalStateException e) {
|
|
if (isMediaCodecException(e)) {
|
|
onCodecError(e);
|
|
if (Util.SDK_INT >= 21 && isRecoverableMediaCodecExceptionV21(e)) {
|
|
z = true;
|
|
}
|
|
if (z) {
|
|
releaseCodec();
|
|
}
|
|
throw createRendererException(createDecoderException(e, getCodecInfo()), this.inputFormat, z, 4003);
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final boolean flushOrReinitializeCodec() throws ExoPlaybackException {
|
|
boolean flushOrReleaseCodec = flushOrReleaseCodec();
|
|
if (flushOrReleaseCodec) {
|
|
maybeInitCodecOrBypass();
|
|
}
|
|
return flushOrReleaseCodec;
|
|
}
|
|
|
|
protected boolean flushOrReleaseCodec() {
|
|
if (this.codec == null) {
|
|
return false;
|
|
}
|
|
int i = this.codecDrainAction;
|
|
if (i == 3 || this.codecNeedsFlushWorkaround || ((this.codecNeedsSosFlushWorkaround && !this.codecHasOutputMediaFormat) || (this.codecNeedsEosFlushWorkaround && this.codecReceivedEos))) {
|
|
releaseCodec();
|
|
return true;
|
|
}
|
|
if (i == 2) {
|
|
Assertions.checkState(Util.SDK_INT >= 23);
|
|
if (Util.SDK_INT >= 23) {
|
|
try {
|
|
updateDrmSessionV23();
|
|
} catch (ExoPlaybackException e) {
|
|
Log.w(TAG, "Failed to update the DRM session, releasing the codec instead.", e);
|
|
releaseCodec();
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
flushCodec();
|
|
return false;
|
|
}
|
|
|
|
private void flushCodec() {
|
|
try {
|
|
this.codec.flush();
|
|
} finally {
|
|
resetCodecStateForFlush();
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public void resetCodecStateForFlush() {
|
|
resetInputBuffer();
|
|
resetOutputBuffer();
|
|
this.codecHotswapDeadlineMs = -9223372036854775807L;
|
|
this.codecReceivedEos = false;
|
|
this.codecReceivedBuffers = false;
|
|
this.codecNeedsAdaptationWorkaroundBuffer = false;
|
|
this.shouldSkipAdaptationWorkaroundOutputBuffer = false;
|
|
this.isDecodeOnlyOutputBuffer = false;
|
|
this.isLastOutputBuffer = false;
|
|
this.decodeOnlyPresentationTimestamps.clear();
|
|
this.largestQueuedPresentationTimeUs = -9223372036854775807L;
|
|
this.lastBufferInStreamPresentationTimeUs = -9223372036854775807L;
|
|
this.lastProcessedOutputBufferTimeUs = -9223372036854775807L;
|
|
C2Mp3TimestampTracker c2Mp3TimestampTracker = this.c2Mp3TimestampTracker;
|
|
if (c2Mp3TimestampTracker != null) {
|
|
c2Mp3TimestampTracker.reset();
|
|
}
|
|
this.codecDrainState = 0;
|
|
this.codecDrainAction = 0;
|
|
this.codecReconfigurationState = this.codecReconfigured ? 1 : 0;
|
|
}
|
|
|
|
protected void resetCodecStateForRelease() {
|
|
resetCodecStateForFlush();
|
|
this.pendingPlaybackException = null;
|
|
this.c2Mp3TimestampTracker = null;
|
|
this.availableCodecInfos = null;
|
|
this.codecInfo = null;
|
|
this.codecInputFormat = null;
|
|
this.codecOutputMediaFormat = null;
|
|
this.codecOutputMediaFormatChanged = false;
|
|
this.codecHasOutputMediaFormat = false;
|
|
this.codecOperatingRate = CODEC_OPERATING_RATE_UNSET;
|
|
this.codecAdaptationWorkaroundMode = 0;
|
|
this.codecNeedsDiscardToSpsWorkaround = false;
|
|
this.codecNeedsFlushWorkaround = false;
|
|
this.codecNeedsSosFlushWorkaround = false;
|
|
this.codecNeedsEosFlushWorkaround = false;
|
|
this.codecNeedsEosOutputExceptionWorkaround = false;
|
|
this.codecNeedsEosBufferTimestampWorkaround = false;
|
|
this.codecNeedsMonoChannelCountWorkaround = false;
|
|
this.codecNeedsEosPropagation = false;
|
|
this.codecReconfigured = false;
|
|
this.codecReconfigurationState = 0;
|
|
this.mediaCryptoRequiresSecureDecoder = false;
|
|
}
|
|
|
|
protected MediaCodecDecoderException createDecoderException(Throwable th, MediaCodecInfo mediaCodecInfo) {
|
|
return new MediaCodecDecoderException(th, mediaCodecInfo);
|
|
}
|
|
|
|
private boolean readSourceOmittingSampleData(int i) throws ExoPlaybackException {
|
|
FormatHolder formatHolder = getFormatHolder();
|
|
this.noDataBuffer.clear();
|
|
int readSource = readSource(formatHolder, this.noDataBuffer, i | 4);
|
|
if (readSource == -5) {
|
|
onInputFormatChanged(formatHolder);
|
|
return true;
|
|
}
|
|
if (readSource != -4 || !this.noDataBuffer.isEndOfStream()) {
|
|
return false;
|
|
}
|
|
this.inputStreamEnded = true;
|
|
processEndOfStream();
|
|
return false;
|
|
}
|
|
|
|
/* JADX WARN: Removed duplicated region for block: B:24:0x009a */
|
|
/* JADX WARN: Removed duplicated region for block: B:27:0x00ac A[SYNTHETIC] */
|
|
/* JADX WARN: Removed duplicated region for block: B:31:0x0049 A[SYNTHETIC] */
|
|
/* JADX WARN: Removed duplicated region for block: B:32:0x009d */
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
private void maybeInitCodecWithFallback(android.media.MediaCrypto r8, boolean r9) throws com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.DecoderInitializationException {
|
|
/*
|
|
r7 = this;
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecInfo> r0 = r7.availableCodecInfos
|
|
r1 = 0
|
|
if (r0 != 0) goto L39
|
|
java.util.List r0 = r7.getAvailableCodecInfos(r9) // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
java.util.ArrayDeque r2 = new java.util.ArrayDeque // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
r2.<init>() // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
r7.availableCodecInfos = r2 // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
boolean r3 = r7.enableDecoderFallback // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
if (r3 == 0) goto L18
|
|
r2.addAll(r0) // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
goto L2a
|
|
L18:
|
|
boolean r2 = r0.isEmpty() // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
if (r2 != 0) goto L2a
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecInfo> r2 = r7.availableCodecInfos // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
r3 = 0
|
|
java.lang.Object r0 = r0.get(r3) // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecInfo r0 = (com.google.android.exoplayer2.mediacodec.MediaCodecInfo) r0 // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
r2.add(r0) // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
L2a:
|
|
r7.preferredDecoderInitializationException = r1 // Catch: com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException -> L2d
|
|
goto L39
|
|
L2d:
|
|
r8 = move-exception
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException r0 = new com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException
|
|
com.google.android.exoplayer2.Format r7 = r7.inputFormat
|
|
r1 = -49998(0xffffffffffff3cb2, float:NaN)
|
|
r0.<init>(r7, r8, r9, r1)
|
|
throw r0
|
|
L39:
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecInfo> r0 = r7.availableCodecInfos
|
|
boolean r0 = r0.isEmpty()
|
|
if (r0 != 0) goto Lb2
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecInfo> r0 = r7.availableCodecInfos
|
|
java.lang.Object r0 = r0.peekFirst()
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecInfo r0 = (com.google.android.exoplayer2.mediacodec.MediaCodecInfo) r0
|
|
L49:
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecAdapter r2 = r7.codec
|
|
if (r2 != 0) goto Laf
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecInfo> r2 = r7.availableCodecInfos
|
|
java.lang.Object r2 = r2.peekFirst()
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecInfo r2 = (com.google.android.exoplayer2.mediacodec.MediaCodecInfo) r2
|
|
boolean r3 = r7.shouldInitCodec(r2)
|
|
if (r3 != 0) goto L5c
|
|
return
|
|
L5c:
|
|
r7.initCodec(r2, r8) // Catch: java.lang.Exception -> L60
|
|
goto L49
|
|
L60:
|
|
r3 = move-exception
|
|
java.lang.String r4 = "MediaCodecRenderer"
|
|
if (r2 != r0) goto L73
|
|
java.lang.String r3 = "Preferred decoder instantiation failed. Sleeping for 50ms then retrying."
|
|
com.google.android.exoplayer2.util.Log.w(r4, r3) // Catch: java.lang.Exception -> L74
|
|
r5 = 50
|
|
java.lang.Thread.sleep(r5) // Catch: java.lang.Exception -> L74
|
|
r7.initCodec(r2, r8) // Catch: java.lang.Exception -> L74
|
|
goto L49
|
|
L73:
|
|
throw r3 // Catch: java.lang.Exception -> L74
|
|
L74:
|
|
r3 = move-exception
|
|
java.lang.StringBuilder r5 = new java.lang.StringBuilder
|
|
java.lang.String r6 = "Failed to initialize decoder: "
|
|
r5.<init>(r6)
|
|
java.lang.StringBuilder r5 = r5.append(r2)
|
|
java.lang.String r5 = r5.toString()
|
|
com.google.android.exoplayer2.util.Log.w(r4, r5, r3)
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecInfo> r4 = r7.availableCodecInfos
|
|
r4.removeFirst()
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException r4 = new com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException
|
|
com.google.android.exoplayer2.Format r5 = r7.inputFormat
|
|
r4.<init>(r5, r3, r9, r2)
|
|
r7.onCodecError(r4)
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException r2 = r7.preferredDecoderInitializationException
|
|
if (r2 != 0) goto L9d
|
|
r7.preferredDecoderInitializationException = r4
|
|
goto La3
|
|
L9d:
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException r2 = com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.DecoderInitializationException.access$000(r2, r4)
|
|
r7.preferredDecoderInitializationException = r2
|
|
La3:
|
|
java.util.ArrayDeque<com.google.android.exoplayer2.mediacodec.MediaCodecInfo> r2 = r7.availableCodecInfos
|
|
boolean r2 = r2.isEmpty()
|
|
if (r2 != 0) goto Lac
|
|
goto L49
|
|
Lac:
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException r7 = r7.preferredDecoderInitializationException
|
|
throw r7
|
|
Laf:
|
|
r7.availableCodecInfos = r1
|
|
return
|
|
Lb2:
|
|
com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException r8 = new com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException
|
|
com.google.android.exoplayer2.Format r7 = r7.inputFormat
|
|
r0 = -49999(0xffffffffffff3cb1, float:NaN)
|
|
r8.<init>(r7, r1, r9, r0)
|
|
throw r8
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(android.media.MediaCrypto, boolean):void");
|
|
}
|
|
|
|
private List<MediaCodecInfo> getAvailableCodecInfos(boolean z) throws MediaCodecUtil.DecoderQueryException {
|
|
List<MediaCodecInfo> decoderInfos = getDecoderInfos(this.mediaCodecSelector, this.inputFormat, z);
|
|
if (decoderInfos.isEmpty() && z) {
|
|
decoderInfos = getDecoderInfos(this.mediaCodecSelector, this.inputFormat, false);
|
|
if (!decoderInfos.isEmpty()) {
|
|
Log.w(TAG, "Drm session requires secure decoder for " + this.inputFormat.sampleMimeType + ", but no secure decoder available. Trying to proceed with " + decoderInfos + ".");
|
|
}
|
|
}
|
|
return decoderInfos;
|
|
}
|
|
|
|
private void initBypass(Format format) {
|
|
disableBypass();
|
|
String str = format.sampleMimeType;
|
|
if (!"audio/mp4a-latm".equals(str) && !"audio/mpeg".equals(str) && !"audio/opus".equals(str)) {
|
|
this.bypassBatchBuffer.setMaxSampleCount(1);
|
|
} else {
|
|
this.bypassBatchBuffer.setMaxSampleCount(32);
|
|
}
|
|
this.bypassEnabled = true;
|
|
}
|
|
|
|
private void initCodec(MediaCodecInfo mediaCodecInfo, MediaCrypto mediaCrypto) throws Exception {
|
|
String str = mediaCodecInfo.name;
|
|
int i = Util.SDK_INT;
|
|
float f = CODEC_OPERATING_RATE_UNSET;
|
|
float codecOperatingRateV23 = i < 23 ? -1.0f : getCodecOperatingRateV23(this.targetPlaybackSpeed, this.inputFormat, getStreamFormats());
|
|
if (codecOperatingRateV23 > this.assumedMinimumCodecOperatingRate) {
|
|
f = codecOperatingRateV23;
|
|
}
|
|
long elapsedRealtime = SystemClock.elapsedRealtime();
|
|
MediaCodecAdapter.Configuration mediaCodecConfiguration = getMediaCodecConfiguration(mediaCodecInfo, this.inputFormat, mediaCrypto, f);
|
|
if (Util.SDK_INT >= 31) {
|
|
Api31.setLogSessionIdToMediaCodecFormat(mediaCodecConfiguration, getPlayerId());
|
|
}
|
|
try {
|
|
TraceUtil.beginSection("createCodec:" + str);
|
|
this.codec = this.codecAdapterFactory.createAdapter(mediaCodecConfiguration);
|
|
TraceUtil.endSection();
|
|
long elapsedRealtime2 = SystemClock.elapsedRealtime();
|
|
if (!mediaCodecInfo.isFormatSupported(this.inputFormat)) {
|
|
Log.w(TAG, Util.formatInvariant("Format exceeds selected codec's capabilities [%s, %s]", Format.toLogString(this.inputFormat), str));
|
|
}
|
|
this.codecInfo = mediaCodecInfo;
|
|
this.codecOperatingRate = f;
|
|
this.codecInputFormat = this.inputFormat;
|
|
this.codecAdaptationWorkaroundMode = codecAdaptationWorkaroundMode(str);
|
|
this.codecNeedsDiscardToSpsWorkaround = codecNeedsDiscardToSpsWorkaround(str, this.codecInputFormat);
|
|
this.codecNeedsFlushWorkaround = codecNeedsFlushWorkaround(str);
|
|
this.codecNeedsSosFlushWorkaround = codecNeedsSosFlushWorkaround(str);
|
|
this.codecNeedsEosFlushWorkaround = codecNeedsEosFlushWorkaround(str);
|
|
this.codecNeedsEosOutputExceptionWorkaround = codecNeedsEosOutputExceptionWorkaround(str);
|
|
this.codecNeedsEosBufferTimestampWorkaround = codecNeedsEosBufferTimestampWorkaround(str);
|
|
this.codecNeedsMonoChannelCountWorkaround = codecNeedsMonoChannelCountWorkaround(str, this.codecInputFormat);
|
|
this.codecNeedsEosPropagation = codecNeedsEosPropagationWorkaround(mediaCodecInfo) || getCodecNeedsEosPropagation();
|
|
if (this.codec.needsReconfiguration()) {
|
|
this.codecReconfigured = true;
|
|
this.codecReconfigurationState = 1;
|
|
this.codecNeedsAdaptationWorkaroundBuffer = this.codecAdaptationWorkaroundMode != 0;
|
|
}
|
|
if ("c2.android.mp3.decoder".equals(mediaCodecInfo.name)) {
|
|
this.c2Mp3TimestampTracker = new C2Mp3TimestampTracker();
|
|
}
|
|
if (getState() == 2) {
|
|
this.codecHotswapDeadlineMs = SystemClock.elapsedRealtime() + 1000;
|
|
}
|
|
this.decoderCounters.decoderInitCount++;
|
|
onCodecInitialized(str, mediaCodecConfiguration, elapsedRealtime2, elapsedRealtime2 - elapsedRealtime);
|
|
} catch (Throwable th) {
|
|
TraceUtil.endSection();
|
|
throw th;
|
|
}
|
|
}
|
|
|
|
private boolean shouldContinueRendering(long j) {
|
|
return this.renderTimeLimitMs == -9223372036854775807L || SystemClock.elapsedRealtime() - j < this.renderTimeLimitMs;
|
|
}
|
|
|
|
private void resetInputBuffer() {
|
|
this.inputIndex = -1;
|
|
this.buffer.data = null;
|
|
}
|
|
|
|
private void setSourceDrmSession(DrmSession drmSession) {
|
|
DrmSession.replaceSession(this.sourceDrmSession, drmSession);
|
|
this.sourceDrmSession = drmSession;
|
|
}
|
|
|
|
private void setCodecDrmSession(DrmSession drmSession) {
|
|
DrmSession.replaceSession(this.codecDrmSession, drmSession);
|
|
this.codecDrmSession = drmSession;
|
|
}
|
|
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
/* JADX WARN: Type inference failed for: r15v0, types: [com.google.android.exoplayer2.mediacodec.MediaCodecRenderer] */
|
|
/* JADX WARN: Type inference failed for: r15v1, types: [com.google.android.exoplayer2.mediacodec.MediaCodecRenderer] */
|
|
/* JADX WARN: Type inference failed for: r15v3, types: [com.google.android.exoplayer2.decoder.DecoderCounters] */
|
|
private boolean feedInputBuffer() throws ExoPlaybackException {
|
|
int i;
|
|
if (this.codec == null || (i = this.codecDrainState) == 2 || this.inputStreamEnded) {
|
|
return false;
|
|
}
|
|
if (i == 0 && shouldReinitCodec()) {
|
|
drainAndReinitializeCodec();
|
|
}
|
|
if (this.inputIndex < 0) {
|
|
int dequeueInputBufferIndex = this.codec.dequeueInputBufferIndex();
|
|
this.inputIndex = dequeueInputBufferIndex;
|
|
if (dequeueInputBufferIndex < 0) {
|
|
return false;
|
|
}
|
|
this.buffer.data = this.codec.getInputBuffer(dequeueInputBufferIndex);
|
|
this.buffer.clear();
|
|
}
|
|
if (this.codecDrainState == 1) {
|
|
if (!this.codecNeedsEosPropagation) {
|
|
this.codecReceivedEos = true;
|
|
this.codec.queueInputBuffer(this.inputIndex, 0, 0, 0L, 4);
|
|
resetInputBuffer();
|
|
}
|
|
this.codecDrainState = 2;
|
|
return false;
|
|
}
|
|
if (this.codecNeedsAdaptationWorkaroundBuffer) {
|
|
this.codecNeedsAdaptationWorkaroundBuffer = false;
|
|
ByteBuffer byteBuffer = this.buffer.data;
|
|
byte[] bArr = ADAPTATION_WORKAROUND_BUFFER;
|
|
byteBuffer.put(bArr);
|
|
this.codec.queueInputBuffer(this.inputIndex, 0, bArr.length, 0L, 0);
|
|
resetInputBuffer();
|
|
this.codecReceivedBuffers = true;
|
|
return true;
|
|
}
|
|
if (this.codecReconfigurationState == 1) {
|
|
for (int i2 = 0; i2 < this.codecInputFormat.initializationData.size(); i2++) {
|
|
this.buffer.data.put(this.codecInputFormat.initializationData.get(i2));
|
|
}
|
|
this.codecReconfigurationState = 2;
|
|
}
|
|
int position = this.buffer.data.position();
|
|
FormatHolder formatHolder = getFormatHolder();
|
|
try {
|
|
int readSource = readSource(formatHolder, this.buffer, 0);
|
|
if (hasReadStreamToEnd() || this.buffer.isLastSample()) {
|
|
this.lastBufferInStreamPresentationTimeUs = this.largestQueuedPresentationTimeUs;
|
|
}
|
|
if (readSource == -3) {
|
|
return false;
|
|
}
|
|
if (readSource == -5) {
|
|
if (this.codecReconfigurationState == 2) {
|
|
this.buffer.clear();
|
|
this.codecReconfigurationState = 1;
|
|
}
|
|
onInputFormatChanged(formatHolder);
|
|
return true;
|
|
}
|
|
if (this.buffer.isEndOfStream()) {
|
|
if (this.codecReconfigurationState == 2) {
|
|
this.buffer.clear();
|
|
this.codecReconfigurationState = 1;
|
|
}
|
|
this.inputStreamEnded = true;
|
|
if (!this.codecReceivedBuffers) {
|
|
processEndOfStream();
|
|
return false;
|
|
}
|
|
try {
|
|
if (!this.codecNeedsEosPropagation) {
|
|
this.codecReceivedEos = true;
|
|
this.codec.queueInputBuffer(this.inputIndex, 0, 0, 0L, 4);
|
|
resetInputBuffer();
|
|
}
|
|
return false;
|
|
} catch (MediaCodec.CryptoException e) {
|
|
throw createRendererException(e, this.inputFormat, Util.getErrorCodeForMediaDrmErrorCode(e.getErrorCode()));
|
|
}
|
|
}
|
|
if (!this.codecReceivedBuffers && !this.buffer.isKeyFrame()) {
|
|
this.buffer.clear();
|
|
if (this.codecReconfigurationState == 2) {
|
|
this.codecReconfigurationState = 1;
|
|
}
|
|
return true;
|
|
}
|
|
boolean isEncrypted = this.buffer.isEncrypted();
|
|
if (isEncrypted) {
|
|
this.buffer.cryptoInfo.increaseClearDataFirstSubSampleBy(position);
|
|
}
|
|
if (this.codecNeedsDiscardToSpsWorkaround && !isEncrypted) {
|
|
NalUnitUtil.discardToSps(this.buffer.data);
|
|
if (this.buffer.data.position() == 0) {
|
|
return true;
|
|
}
|
|
this.codecNeedsDiscardToSpsWorkaround = false;
|
|
}
|
|
long j = this.buffer.timeUs;
|
|
C2Mp3TimestampTracker c2Mp3TimestampTracker = this.c2Mp3TimestampTracker;
|
|
if (c2Mp3TimestampTracker != null) {
|
|
j = c2Mp3TimestampTracker.updateAndGetPresentationTimeUs(this.inputFormat, this.buffer);
|
|
this.largestQueuedPresentationTimeUs = Math.max(this.largestQueuedPresentationTimeUs, this.c2Mp3TimestampTracker.getLastOutputBufferPresentationTimeUs(this.inputFormat));
|
|
}
|
|
long j2 = j;
|
|
if (this.buffer.isDecodeOnly()) {
|
|
this.decodeOnlyPresentationTimestamps.add(Long.valueOf(j2));
|
|
}
|
|
if (this.waitingForFirstSampleInFormat) {
|
|
if (!this.pendingOutputStreamChanges.isEmpty()) {
|
|
this.pendingOutputStreamChanges.peekLast().formatQueue.add(j2, this.inputFormat);
|
|
} else {
|
|
this.outputStreamInfo.formatQueue.add(j2, this.inputFormat);
|
|
}
|
|
this.waitingForFirstSampleInFormat = false;
|
|
}
|
|
this.largestQueuedPresentationTimeUs = Math.max(this.largestQueuedPresentationTimeUs, j2);
|
|
this.buffer.flip();
|
|
if (this.buffer.hasSupplementalData()) {
|
|
handleInputBufferSupplementalData(this.buffer);
|
|
}
|
|
onQueueInputBuffer(this.buffer);
|
|
try {
|
|
if (isEncrypted) {
|
|
this.codec.queueSecureInputBuffer(this.inputIndex, 0, this.buffer.cryptoInfo, j2, 0);
|
|
} else {
|
|
this.codec.queueInputBuffer(this.inputIndex, 0, this.buffer.data.limit(), j2, 0);
|
|
}
|
|
resetInputBuffer();
|
|
this.codecReceivedBuffers = true;
|
|
this.codecReconfigurationState = 0;
|
|
this = this.decoderCounters;
|
|
this.queuedInputBufferCount++;
|
|
return true;
|
|
} catch (MediaCodec.CryptoException e2) {
|
|
throw this.createRendererException(e2, this.inputFormat, Util.getErrorCodeForMediaDrmErrorCode(e2.getErrorCode()));
|
|
}
|
|
} catch (DecoderInputBuffer.InsufficientCapacityException e3) {
|
|
onCodecError(e3);
|
|
readSourceOmittingSampleData(0);
|
|
flushCodec();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
/* JADX WARN: Code restructure failed: missing block: B:34:0x0080, code lost:
|
|
|
|
if (drainAndUpdateCodecDrmSessionV23() == false) goto L69;
|
|
*/
|
|
/* JADX WARN: Code restructure failed: missing block: B:35:0x00ce, code lost:
|
|
|
|
r7 = 2;
|
|
*/
|
|
/* JADX WARN: Code restructure failed: missing block: B:62:0x00b2, code lost:
|
|
|
|
if (drainAndUpdateCodecDrmSessionV23() == false) goto L69;
|
|
*/
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
public com.google.android.exoplayer2.decoder.DecoderReuseEvaluation onInputFormatChanged(com.google.android.exoplayer2.FormatHolder r12) throws com.google.android.exoplayer2.ExoPlaybackException {
|
|
/*
|
|
Method dump skipped, instructions count: 247
|
|
To view this dump add '--comments-level debug' option
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(com.google.android.exoplayer2.FormatHolder):com.google.android.exoplayer2.decoder.DecoderReuseEvaluation");
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public void onProcessedOutputBuffer(long j) {
|
|
this.lastProcessedOutputBufferTimeUs = j;
|
|
while (!this.pendingOutputStreamChanges.isEmpty() && j >= this.pendingOutputStreamChanges.peek().previousStreamLastBufferTimeUs) {
|
|
setOutputStreamInfo(this.pendingOutputStreamChanges.poll());
|
|
onProcessedStreamChange();
|
|
}
|
|
}
|
|
|
|
protected DecoderReuseEvaluation canReuseCodec(MediaCodecInfo mediaCodecInfo, Format format, Format format2) {
|
|
return new DecoderReuseEvaluation(mediaCodecInfo.name, format, format2, 0, 1);
|
|
}
|
|
|
|
@Override // com.google.android.exoplayer2.Renderer
|
|
public boolean isReady() {
|
|
return this.inputFormat != null && (isSourceReady() || hasOutputBuffer() || (this.codecHotswapDeadlineMs != -9223372036854775807L && SystemClock.elapsedRealtime() < this.codecHotswapDeadlineMs));
|
|
}
|
|
|
|
protected final boolean updateCodecOperatingRate() throws ExoPlaybackException {
|
|
return updateCodecOperatingRate(this.codecInputFormat);
|
|
}
|
|
|
|
private boolean updateCodecOperatingRate(Format format) throws ExoPlaybackException {
|
|
if (Util.SDK_INT >= 23 && this.codec != null && this.codecDrainAction != 3 && getState() != 0) {
|
|
float codecOperatingRateV23 = getCodecOperatingRateV23(this.targetPlaybackSpeed, format, getStreamFormats());
|
|
float f = this.codecOperatingRate;
|
|
if (f == codecOperatingRateV23) {
|
|
return true;
|
|
}
|
|
if (codecOperatingRateV23 == CODEC_OPERATING_RATE_UNSET) {
|
|
drainAndReinitializeCodec();
|
|
return false;
|
|
}
|
|
if (f == CODEC_OPERATING_RATE_UNSET && codecOperatingRateV23 <= this.assumedMinimumCodecOperatingRate) {
|
|
return true;
|
|
}
|
|
Bundle bundle = new Bundle();
|
|
bundle.putFloat("operating-rate", codecOperatingRateV23);
|
|
this.codec.setParameters(bundle);
|
|
this.codecOperatingRate = codecOperatingRateV23;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private boolean drainAndUpdateCodecDrmSessionV23() throws ExoPlaybackException {
|
|
if (this.codecReceivedBuffers) {
|
|
this.codecDrainState = 1;
|
|
if (this.codecNeedsFlushWorkaround || this.codecNeedsEosFlushWorkaround) {
|
|
this.codecDrainAction = 3;
|
|
return false;
|
|
}
|
|
this.codecDrainAction = 2;
|
|
} else {
|
|
updateDrmSessionV23();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void drainAndReinitializeCodec() throws ExoPlaybackException {
|
|
if (!this.codecReceivedBuffers) {
|
|
reinitializeCodec();
|
|
} else {
|
|
this.codecDrainState = 1;
|
|
this.codecDrainAction = 3;
|
|
}
|
|
}
|
|
|
|
private boolean drainOutputBuffer(long j, long j2) throws ExoPlaybackException {
|
|
boolean z;
|
|
boolean processOutputBuffer;
|
|
int dequeueOutputBufferIndex;
|
|
if (!hasOutputBuffer()) {
|
|
if (this.codecNeedsEosOutputExceptionWorkaround && this.codecReceivedEos) {
|
|
try {
|
|
dequeueOutputBufferIndex = this.codec.dequeueOutputBufferIndex(this.outputBufferInfo);
|
|
} catch (IllegalStateException unused) {
|
|
processEndOfStream();
|
|
if (this.outputStreamEnded) {
|
|
releaseCodec();
|
|
}
|
|
return false;
|
|
}
|
|
} else {
|
|
dequeueOutputBufferIndex = this.codec.dequeueOutputBufferIndex(this.outputBufferInfo);
|
|
}
|
|
if (dequeueOutputBufferIndex < 0) {
|
|
if (dequeueOutputBufferIndex == -2) {
|
|
processOutputMediaFormatChanged();
|
|
return true;
|
|
}
|
|
if (this.codecNeedsEosPropagation && (this.inputStreamEnded || this.codecDrainState == 2)) {
|
|
processEndOfStream();
|
|
}
|
|
return false;
|
|
}
|
|
if (this.shouldSkipAdaptationWorkaroundOutputBuffer) {
|
|
this.shouldSkipAdaptationWorkaroundOutputBuffer = false;
|
|
this.codec.releaseOutputBuffer(dequeueOutputBufferIndex, false);
|
|
return true;
|
|
}
|
|
if (this.outputBufferInfo.size == 0 && (this.outputBufferInfo.flags & 4) != 0) {
|
|
processEndOfStream();
|
|
return false;
|
|
}
|
|
this.outputIndex = dequeueOutputBufferIndex;
|
|
ByteBuffer outputBuffer = this.codec.getOutputBuffer(dequeueOutputBufferIndex);
|
|
this.outputBuffer = outputBuffer;
|
|
if (outputBuffer != null) {
|
|
outputBuffer.position(this.outputBufferInfo.offset);
|
|
this.outputBuffer.limit(this.outputBufferInfo.offset + this.outputBufferInfo.size);
|
|
}
|
|
if (this.codecNeedsEosBufferTimestampWorkaround && this.outputBufferInfo.presentationTimeUs == 0 && (this.outputBufferInfo.flags & 4) != 0) {
|
|
long j3 = this.largestQueuedPresentationTimeUs;
|
|
if (j3 != -9223372036854775807L) {
|
|
this.outputBufferInfo.presentationTimeUs = j3;
|
|
}
|
|
}
|
|
this.isDecodeOnlyOutputBuffer = isDecodeOnlyBuffer(this.outputBufferInfo.presentationTimeUs);
|
|
this.isLastOutputBuffer = this.lastBufferInStreamPresentationTimeUs == this.outputBufferInfo.presentationTimeUs;
|
|
updateOutputFormatForTime(this.outputBufferInfo.presentationTimeUs);
|
|
}
|
|
if (this.codecNeedsEosOutputExceptionWorkaround && this.codecReceivedEos) {
|
|
try {
|
|
z = false;
|
|
try {
|
|
processOutputBuffer = processOutputBuffer(j, j2, this.codec, this.outputBuffer, this.outputIndex, this.outputBufferInfo.flags, 1, this.outputBufferInfo.presentationTimeUs, this.isDecodeOnlyOutputBuffer, this.isLastOutputBuffer, this.outputFormat);
|
|
} catch (IllegalStateException unused2) {
|
|
processEndOfStream();
|
|
if (this.outputStreamEnded) {
|
|
releaseCodec();
|
|
}
|
|
return z;
|
|
}
|
|
} catch (IllegalStateException unused3) {
|
|
z = false;
|
|
}
|
|
} else {
|
|
z = false;
|
|
processOutputBuffer = processOutputBuffer(j, j2, this.codec, this.outputBuffer, this.outputIndex, this.outputBufferInfo.flags, 1, this.outputBufferInfo.presentationTimeUs, this.isDecodeOnlyOutputBuffer, this.isLastOutputBuffer, this.outputFormat);
|
|
}
|
|
if (processOutputBuffer) {
|
|
onProcessedOutputBuffer(this.outputBufferInfo.presentationTimeUs);
|
|
boolean z2 = (this.outputBufferInfo.flags & 4) != 0 ? true : z;
|
|
resetOutputBuffer();
|
|
if (!z2) {
|
|
return true;
|
|
}
|
|
processEndOfStream();
|
|
}
|
|
return z;
|
|
}
|
|
|
|
private void processOutputMediaFormatChanged() {
|
|
this.codecHasOutputMediaFormat = true;
|
|
MediaFormat outputFormat = this.codec.getOutputFormat();
|
|
if (this.codecAdaptationWorkaroundMode != 0 && outputFormat.getInteger(ViewHierarchyNode.JsonKeys.WIDTH) == 32 && outputFormat.getInteger(ViewHierarchyNode.JsonKeys.HEIGHT) == 32) {
|
|
this.shouldSkipAdaptationWorkaroundOutputBuffer = true;
|
|
return;
|
|
}
|
|
if (this.codecNeedsMonoChannelCountWorkaround) {
|
|
outputFormat.setInteger("channel-count", 1);
|
|
}
|
|
this.codecOutputMediaFormat = outputFormat;
|
|
this.codecOutputMediaFormatChanged = true;
|
|
}
|
|
|
|
private void processEndOfStream() throws ExoPlaybackException {
|
|
int i = this.codecDrainAction;
|
|
if (i == 1) {
|
|
flushCodec();
|
|
return;
|
|
}
|
|
if (i == 2) {
|
|
flushCodec();
|
|
updateDrmSessionV23();
|
|
} else if (i == 3) {
|
|
reinitializeCodec();
|
|
} else {
|
|
this.outputStreamEnded = true;
|
|
renderToEndOfStream();
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public final long getOutputStreamOffsetUs() {
|
|
return this.outputStreamInfo.streamOffsetUs;
|
|
}
|
|
|
|
private void setOutputStreamInfo(OutputStreamInfo outputStreamInfo) {
|
|
this.outputStreamInfo = outputStreamInfo;
|
|
if (outputStreamInfo.streamOffsetUs != -9223372036854775807L) {
|
|
this.needToNotifyOutputFormatChangeAfterStreamChange = true;
|
|
onOutputStreamOffsetUsChanged(outputStreamInfo.streamOffsetUs);
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public static boolean supportsFormatDrm(Format format) {
|
|
return format.cryptoType == 0 || format.cryptoType == 2;
|
|
}
|
|
|
|
private boolean drmNeedsCodecReinitialization(MediaCodecInfo mediaCodecInfo, Format format, DrmSession drmSession, DrmSession drmSession2) throws ExoPlaybackException {
|
|
FrameworkCryptoConfig frameworkCryptoConfig;
|
|
if (drmSession == drmSession2) {
|
|
return false;
|
|
}
|
|
if (drmSession2 == null || drmSession == null || !drmSession2.getSchemeUuid().equals(drmSession.getSchemeUuid()) || Util.SDK_INT < 23 || C.PLAYREADY_UUID.equals(drmSession.getSchemeUuid()) || C.PLAYREADY_UUID.equals(drmSession2.getSchemeUuid()) || (frameworkCryptoConfig = getFrameworkCryptoConfig(drmSession2)) == null) {
|
|
return true;
|
|
}
|
|
return !mediaCodecInfo.secure && (frameworkCryptoConfig.forceAllowInsecureDecoderComponents ? false : drmSession2.requiresSecureDecoder(format.sampleMimeType));
|
|
}
|
|
|
|
private void reinitializeCodec() throws ExoPlaybackException {
|
|
releaseCodec();
|
|
maybeInitCodecOrBypass();
|
|
}
|
|
|
|
private boolean isDecodeOnlyBuffer(long j) {
|
|
int size = this.decodeOnlyPresentationTimestamps.size();
|
|
for (int i = 0; i < size; i++) {
|
|
if (this.decodeOnlyPresentationTimestamps.get(i).longValue() == j) {
|
|
this.decodeOnlyPresentationTimestamps.remove(i);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void updateDrmSessionV23() throws ExoPlaybackException {
|
|
try {
|
|
this.mediaCrypto.setMediaDrmSession(getFrameworkCryptoConfig(this.sourceDrmSession).sessionId);
|
|
setCodecDrmSession(this.sourceDrmSession);
|
|
this.codecDrainState = 0;
|
|
this.codecDrainAction = 0;
|
|
} catch (MediaCryptoException e) {
|
|
throw createRendererException(e, this.inputFormat, 6006);
|
|
}
|
|
}
|
|
|
|
private FrameworkCryptoConfig getFrameworkCryptoConfig(DrmSession drmSession) throws ExoPlaybackException {
|
|
CryptoConfig cryptoConfig = drmSession.getCryptoConfig();
|
|
if (cryptoConfig != null && !(cryptoConfig instanceof FrameworkCryptoConfig)) {
|
|
throw createRendererException(new IllegalArgumentException("Expecting FrameworkCryptoConfig but found: " + cryptoConfig), this.inputFormat, 6001);
|
|
}
|
|
return (FrameworkCryptoConfig) cryptoConfig;
|
|
}
|
|
|
|
private boolean bypassRender(long j, long j2) throws ExoPlaybackException {
|
|
boolean z;
|
|
Assertions.checkState(!this.outputStreamEnded);
|
|
if (!this.bypassBatchBuffer.hasSamples()) {
|
|
z = false;
|
|
} else {
|
|
if (!processOutputBuffer(j, j2, null, this.bypassBatchBuffer.data, this.outputIndex, 0, this.bypassBatchBuffer.getSampleCount(), this.bypassBatchBuffer.getFirstSampleTimeUs(), this.bypassBatchBuffer.isDecodeOnly(), this.bypassBatchBuffer.isEndOfStream(), this.outputFormat)) {
|
|
return false;
|
|
}
|
|
onProcessedOutputBuffer(this.bypassBatchBuffer.getLastSampleTimeUs());
|
|
this.bypassBatchBuffer.clear();
|
|
z = false;
|
|
}
|
|
if (this.inputStreamEnded) {
|
|
this.outputStreamEnded = true;
|
|
return z;
|
|
}
|
|
if (this.bypassSampleBufferPending) {
|
|
Assertions.checkState(this.bypassBatchBuffer.append(this.bypassSampleBuffer));
|
|
this.bypassSampleBufferPending = z;
|
|
}
|
|
if (this.bypassDrainAndReinitialize) {
|
|
if (this.bypassBatchBuffer.hasSamples()) {
|
|
return true;
|
|
}
|
|
disableBypass();
|
|
this.bypassDrainAndReinitialize = z;
|
|
maybeInitCodecOrBypass();
|
|
if (!this.bypassEnabled) {
|
|
return z;
|
|
}
|
|
}
|
|
bypassRead();
|
|
if (this.bypassBatchBuffer.hasSamples()) {
|
|
this.bypassBatchBuffer.flip();
|
|
}
|
|
if (this.bypassBatchBuffer.hasSamples() || this.inputStreamEnded || this.bypassDrainAndReinitialize) {
|
|
return true;
|
|
}
|
|
return z;
|
|
}
|
|
|
|
private void bypassRead() throws ExoPlaybackException {
|
|
Assertions.checkState(!this.inputStreamEnded);
|
|
FormatHolder formatHolder = getFormatHolder();
|
|
this.bypassSampleBuffer.clear();
|
|
do {
|
|
this.bypassSampleBuffer.clear();
|
|
int readSource = readSource(formatHolder, this.bypassSampleBuffer, 0);
|
|
if (readSource == -5) {
|
|
onInputFormatChanged(formatHolder);
|
|
return;
|
|
}
|
|
if (readSource != -4) {
|
|
if (readSource != -3) {
|
|
throw new IllegalStateException();
|
|
}
|
|
return;
|
|
} else {
|
|
if (this.bypassSampleBuffer.isEndOfStream()) {
|
|
this.inputStreamEnded = true;
|
|
return;
|
|
}
|
|
if (this.waitingForFirstSampleInFormat) {
|
|
Format format = (Format) Assertions.checkNotNull(this.inputFormat);
|
|
this.outputFormat = format;
|
|
onOutputFormatChanged(format, null);
|
|
this.waitingForFirstSampleInFormat = false;
|
|
}
|
|
this.bypassSampleBuffer.flip();
|
|
}
|
|
} while (this.bypassBatchBuffer.append(this.bypassSampleBuffer));
|
|
this.bypassSampleBufferPending = true;
|
|
}
|
|
|
|
private static boolean isMediaCodecException(IllegalStateException illegalStateException) {
|
|
if (Util.SDK_INT >= 21 && isMediaCodecExceptionV21(illegalStateException)) {
|
|
return true;
|
|
}
|
|
StackTraceElement[] stackTrace = illegalStateException.getStackTrace();
|
|
return stackTrace.length > 0 && stackTrace[0].getClassName().equals("android.media.MediaCodec");
|
|
}
|
|
|
|
private static boolean isMediaCodecExceptionV21(IllegalStateException illegalStateException) {
|
|
return illegalStateException instanceof MediaCodec.CodecException;
|
|
}
|
|
|
|
private static boolean isRecoverableMediaCodecExceptionV21(IllegalStateException illegalStateException) {
|
|
if (illegalStateException instanceof MediaCodec.CodecException) {
|
|
return ((MediaCodec.CodecException) illegalStateException).isRecoverable();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private static boolean codecNeedsFlushWorkaround(String str) {
|
|
return Util.SDK_INT < 18 || (Util.SDK_INT == 18 && ("OMX.SEC.avc.dec".equals(str) || "OMX.SEC.avc.dec.secure".equals(str))) || (Util.SDK_INT == 19 && Util.MODEL.startsWith("SM-G800") && ("OMX.Exynos.avc.dec".equals(str) || "OMX.Exynos.avc.dec.secure".equals(str)));
|
|
}
|
|
|
|
private int codecAdaptationWorkaroundMode(String str) {
|
|
if (Util.SDK_INT <= 25 && "OMX.Exynos.avc.dec.secure".equals(str) && (Util.MODEL.startsWith("SM-T585") || Util.MODEL.startsWith("SM-A510") || Util.MODEL.startsWith("SM-A520") || Util.MODEL.startsWith("SM-J700"))) {
|
|
return 2;
|
|
}
|
|
if (Util.SDK_INT >= 24) {
|
|
return 0;
|
|
}
|
|
if ("OMX.Nvidia.h264.decode".equals(str) || "OMX.Nvidia.h264.decode.secure".equals(str)) {
|
|
return ("flounder".equals(Util.DEVICE) || "flounder_lte".equals(Util.DEVICE) || "grouper".equals(Util.DEVICE) || "tilapia".equals(Util.DEVICE)) ? 1 : 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private static boolean codecNeedsDiscardToSpsWorkaround(String str, Format format) {
|
|
return Util.SDK_INT < 21 && format.initializationData.isEmpty() && "OMX.MTK.VIDEO.DECODER.AVC".equals(str);
|
|
}
|
|
|
|
private static boolean codecNeedsSosFlushWorkaround(String str) {
|
|
return Util.SDK_INT == 29 && "c2.android.aac.decoder".equals(str);
|
|
}
|
|
|
|
private static boolean codecNeedsEosPropagationWorkaround(MediaCodecInfo mediaCodecInfo) {
|
|
String str = mediaCodecInfo.name;
|
|
return (Util.SDK_INT <= 25 && "OMX.rk.video_decoder.avc".equals(str)) || (Util.SDK_INT <= 17 && "OMX.allwinner.video.decoder.avc".equals(str)) || ((Util.SDK_INT <= 29 && ("OMX.broadcom.video_decoder.tunnel".equals(str) || "OMX.broadcom.video_decoder.tunnel.secure".equals(str) || "OMX.bcm.vdec.avc.tunnel".equals(str) || "OMX.bcm.vdec.avc.tunnel.secure".equals(str) || "OMX.bcm.vdec.hevc.tunnel".equals(str) || "OMX.bcm.vdec.hevc.tunnel.secure".equals(str))) || ("Amazon".equals(Util.MANUFACTURER) && "AFTS".equals(Util.MODEL) && mediaCodecInfo.secure));
|
|
}
|
|
|
|
private static boolean codecNeedsEosFlushWorkaround(String str) {
|
|
return (Util.SDK_INT <= 23 && "OMX.google.vorbis.decoder".equals(str)) || (Util.SDK_INT <= 19 && (("hb2000".equals(Util.DEVICE) || "stvm8".equals(Util.DEVICE)) && ("OMX.amlogic.avc.decoder.awesome".equals(str) || "OMX.amlogic.avc.decoder.awesome.secure".equals(str))));
|
|
}
|
|
|
|
private static boolean codecNeedsEosBufferTimestampWorkaround(String str) {
|
|
return Util.SDK_INT < 21 && "OMX.SEC.mp3.dec".equals(str) && "samsung".equals(Util.MANUFACTURER) && (Util.DEVICE.startsWith("baffin") || Util.DEVICE.startsWith("grand") || Util.DEVICE.startsWith("fortuna") || Util.DEVICE.startsWith("gprimelte") || Util.DEVICE.startsWith("j2y18lte") || Util.DEVICE.startsWith("ms01"));
|
|
}
|
|
|
|
private static boolean codecNeedsEosOutputExceptionWorkaround(String str) {
|
|
return Util.SDK_INT == 21 && "OMX.google.aac.decoder".equals(str);
|
|
}
|
|
|
|
private static boolean codecNeedsMonoChannelCountWorkaround(String str, Format format) {
|
|
return Util.SDK_INT <= 18 && format.channelCount == 1 && "OMX.MTK.AUDIO.DECODER.MP3".equals(str);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* loaded from: classes2.dex */
|
|
public static final class OutputStreamInfo {
|
|
public static final OutputStreamInfo UNSET = new OutputStreamInfo(-9223372036854775807L, -9223372036854775807L, -9223372036854775807L);
|
|
public final TimedValueQueue<Format> formatQueue = new TimedValueQueue<>();
|
|
public final long previousStreamLastBufferTimeUs;
|
|
public final long startPositionUs;
|
|
public final long streamOffsetUs;
|
|
|
|
public OutputStreamInfo(long j, long j2, long j3) {
|
|
this.previousStreamLastBufferTimeUs = j;
|
|
this.startPositionUs = j2;
|
|
this.streamOffsetUs = j3;
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* loaded from: classes2.dex */
|
|
public static final class Api31 {
|
|
private Api31() {
|
|
}
|
|
|
|
public static void setLogSessionIdToMediaCodecFormat(MediaCodecAdapter.Configuration configuration, PlayerId playerId) {
|
|
LogSessionId logSessionId = playerId.getLogSessionId();
|
|
if (logSessionId.equals(LogSessionId.LOG_SESSION_ID_NONE)) {
|
|
return;
|
|
}
|
|
configuration.mediaFormat.setString("log-session-id", logSessionId.getStringId());
|
|
}
|
|
}
|
|
}
|