- 28,932 files - Full Java source code - Smali files - Resources Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
419 lines
20 KiB
Java
419 lines
20 KiB
Java
package com.mbridge.msdk.playercommon.exoplayer2.audio;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.annotation.TargetApi;
|
|
import android.content.Context;
|
|
import android.content.pm.PackageManager;
|
|
import android.media.MediaCodec;
|
|
import android.media.MediaCrypto;
|
|
import android.media.MediaFormat;
|
|
import android.os.Handler;
|
|
import android.view.Surface;
|
|
import androidx.annotation.Nullable;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.BaseRenderer;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.ExoPlaybackException;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.Format;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.PlaybackParameters;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.audio.AudioRendererEventListener;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.audio.AudioSink;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.decoder.DecoderInputBuffer;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.drm.DrmInitData;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.drm.DrmSessionManager;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.drm.FrameworkMediaCrypto;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecInfo;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecSelector;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecUtil;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaFormatUtil;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.util.MediaClock;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.util.MimeTypes;
|
|
import com.mbridge.msdk.playercommon.exoplayer2.util.Util;
|
|
import com.unity3d.ads.core.domain.HandleInvocationsFromAdViewer;
|
|
import java.nio.ByteBuffer;
|
|
|
|
@TargetApi(16)
|
|
/* loaded from: classes4.dex */
|
|
public class MediaCodecAudioRenderer extends MediaCodecRenderer implements MediaClock {
|
|
private boolean allowFirstBufferPositionDiscontinuity;
|
|
private boolean allowPositionDiscontinuity;
|
|
private final AudioSink audioSink;
|
|
private int channelCount;
|
|
private int codecMaxInputSize;
|
|
private boolean codecNeedsDiscardChannelsWorkaround;
|
|
private final Context context;
|
|
private long currentPositionUs;
|
|
private int encoderDelay;
|
|
private int encoderPadding;
|
|
private final AudioRendererEventListener.EventDispatcher eventDispatcher;
|
|
private boolean passthroughEnabled;
|
|
private MediaFormat passthroughMediaFormat;
|
|
private int pcmEncoding;
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public int canKeepCodec(MediaCodec mediaCodec, MediaCodecInfo mediaCodecInfo, Format format, Format format2) {
|
|
return 0;
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.BaseRenderer, com.mbridge.msdk.playercommon.exoplayer2.Renderer
|
|
public MediaClock getMediaClock() {
|
|
return this;
|
|
}
|
|
|
|
public void onAudioSessionId(int i) {
|
|
}
|
|
|
|
public void onAudioTrackPositionDiscontinuity() {
|
|
}
|
|
|
|
public void onAudioTrackUnderrun(int i, long j, long j2) {
|
|
}
|
|
|
|
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector) {
|
|
this(context, mediaCodecSelector, (DrmSessionManager<FrameworkMediaCrypto>) null, false);
|
|
}
|
|
|
|
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, boolean z) {
|
|
this(context, mediaCodecSelector, drmSessionManager, z, null, null);
|
|
}
|
|
|
|
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector, @Nullable Handler handler, @Nullable AudioRendererEventListener audioRendererEventListener) {
|
|
this(context, mediaCodecSelector, null, false, handler, audioRendererEventListener);
|
|
}
|
|
|
|
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, boolean z, @Nullable Handler handler, @Nullable AudioRendererEventListener audioRendererEventListener) {
|
|
this(context, mediaCodecSelector, drmSessionManager, z, handler, audioRendererEventListener, null, new AudioProcessor[0]);
|
|
}
|
|
|
|
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, boolean z, @Nullable Handler handler, @Nullable AudioRendererEventListener audioRendererEventListener, @Nullable AudioCapabilities audioCapabilities, AudioProcessor... audioProcessorArr) {
|
|
this(context, mediaCodecSelector, drmSessionManager, z, handler, audioRendererEventListener, new DefaultAudioSink(audioCapabilities, audioProcessorArr));
|
|
}
|
|
|
|
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, boolean z, @Nullable Handler handler, @Nullable AudioRendererEventListener audioRendererEventListener, AudioSink audioSink) {
|
|
super(1, mediaCodecSelector, drmSessionManager, z);
|
|
this.context = context.getApplicationContext();
|
|
this.audioSink = audioSink;
|
|
this.eventDispatcher = new AudioRendererEventListener.EventDispatcher(handler, audioRendererEventListener);
|
|
audioSink.setListener(new AudioSinkListener());
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public int supportsFormat(MediaCodecSelector mediaCodecSelector, DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, Format format) throws MediaCodecUtil.DecoderQueryException {
|
|
boolean z;
|
|
int i;
|
|
int i2;
|
|
String str = format.sampleMimeType;
|
|
if (!MimeTypes.isAudio(str)) {
|
|
return 0;
|
|
}
|
|
int i3 = Util.SDK_INT >= 21 ? 32 : 0;
|
|
boolean supportsFormatDrm = BaseRenderer.supportsFormatDrm(drmSessionManager, format.drmInitData);
|
|
if (supportsFormatDrm && allowPassthrough(str) && mediaCodecSelector.getPassthroughDecoderInfo() != null) {
|
|
return i3 | 12;
|
|
}
|
|
if ((MimeTypes.AUDIO_RAW.equals(str) && !this.audioSink.isEncodingSupported(format.pcmEncoding)) || !this.audioSink.isEncodingSupported(2)) {
|
|
return 1;
|
|
}
|
|
DrmInitData drmInitData = format.drmInitData;
|
|
if (drmInitData != null) {
|
|
z = false;
|
|
for (int i4 = 0; i4 < drmInitData.schemeDataCount; i4++) {
|
|
z |= drmInitData.get(i4).requiresSecureDecryption;
|
|
}
|
|
} else {
|
|
z = false;
|
|
}
|
|
MediaCodecInfo decoderInfo = mediaCodecSelector.getDecoderInfo(str, z);
|
|
if (decoderInfo == null) {
|
|
return (!z || mediaCodecSelector.getDecoderInfo(str, false) == null) ? 1 : 2;
|
|
}
|
|
if (supportsFormatDrm) {
|
|
return ((Util.SDK_INT < 21 || (((i = format.sampleRate) == -1 || decoderInfo.isAudioSampleRateSupportedV21(i)) && ((i2 = format.channelCount) == -1 || decoderInfo.isAudioChannelCountSupportedV21(i2)))) ? 4 : 3) | i3 | 8;
|
|
}
|
|
return 2;
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public MediaCodecInfo getDecoderInfo(MediaCodecSelector mediaCodecSelector, Format format, boolean z) throws MediaCodecUtil.DecoderQueryException {
|
|
MediaCodecInfo passthroughDecoderInfo;
|
|
return (!allowPassthrough(format.sampleMimeType) || (passthroughDecoderInfo = mediaCodecSelector.getPassthroughDecoderInfo()) == null) ? super.getDecoderInfo(mediaCodecSelector, format, z) : passthroughDecoderInfo;
|
|
}
|
|
|
|
public boolean allowPassthrough(String str) {
|
|
int encoding = MimeTypes.getEncoding(str);
|
|
return encoding != 0 && this.audioSink.isEncodingSupported(encoding);
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public void configureCodec(MediaCodecInfo mediaCodecInfo, MediaCodec mediaCodec, Format format, MediaCrypto mediaCrypto) {
|
|
this.codecMaxInputSize = getCodecMaxInputSize(mediaCodecInfo, format, getStreamFormats());
|
|
this.codecNeedsDiscardChannelsWorkaround = codecNeedsDiscardChannelsWorkaround(mediaCodecInfo.name);
|
|
this.passthroughEnabled = mediaCodecInfo.passthrough;
|
|
String str = mediaCodecInfo.mimeType;
|
|
if (str == null) {
|
|
str = MimeTypes.AUDIO_RAW;
|
|
}
|
|
MediaFormat mediaFormat = getMediaFormat(format, str, this.codecMaxInputSize);
|
|
mediaCodec.configure(mediaFormat, (Surface) null, mediaCrypto, 0);
|
|
if (!this.passthroughEnabled) {
|
|
this.passthroughMediaFormat = null;
|
|
} else {
|
|
this.passthroughMediaFormat = mediaFormat;
|
|
mediaFormat.setString("mime", format.sampleMimeType);
|
|
}
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public void onCodecInitialized(String str, long j, long j2) {
|
|
this.eventDispatcher.decoderInitialized(str, j, j2);
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public void onInputFormatChanged(Format format) throws ExoPlaybackException {
|
|
super.onInputFormatChanged(format);
|
|
this.eventDispatcher.inputFormatChanged(format);
|
|
this.pcmEncoding = MimeTypes.AUDIO_RAW.equals(format.sampleMimeType) ? format.pcmEncoding : 2;
|
|
this.channelCount = format.channelCount;
|
|
this.encoderDelay = format.encoderDelay;
|
|
this.encoderPadding = format.encoderPadding;
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public void onOutputFormatChanged(MediaCodec mediaCodec, MediaFormat mediaFormat) throws ExoPlaybackException {
|
|
int i;
|
|
int[] iArr;
|
|
int i2;
|
|
MediaFormat mediaFormat2 = this.passthroughMediaFormat;
|
|
if (mediaFormat2 != null) {
|
|
i = MimeTypes.getEncoding(mediaFormat2.getString("mime"));
|
|
mediaFormat = this.passthroughMediaFormat;
|
|
} else {
|
|
i = this.pcmEncoding;
|
|
}
|
|
int i3 = i;
|
|
int integer = mediaFormat.getInteger("channel-count");
|
|
int integer2 = mediaFormat.getInteger("sample-rate");
|
|
if (this.codecNeedsDiscardChannelsWorkaround && integer == 6 && (i2 = this.channelCount) < 6) {
|
|
iArr = new int[i2];
|
|
for (int i4 = 0; i4 < this.channelCount; i4++) {
|
|
iArr[i4] = i4;
|
|
}
|
|
} else {
|
|
iArr = null;
|
|
}
|
|
try {
|
|
this.audioSink.configure(i3, integer, integer2, 0, iArr, this.encoderDelay, this.encoderPadding);
|
|
} catch (AudioSink.ConfigurationException e) {
|
|
throw ExoPlaybackException.createForRenderer(e, getIndex());
|
|
}
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer, com.mbridge.msdk.playercommon.exoplayer2.BaseRenderer
|
|
public void onEnabled(boolean z) throws ExoPlaybackException {
|
|
super.onEnabled(z);
|
|
this.eventDispatcher.enabled(this.decoderCounters);
|
|
int i = getConfiguration().tunnelingAudioSessionId;
|
|
if (i != 0) {
|
|
this.audioSink.enableTunnelingV21(i);
|
|
} else {
|
|
this.audioSink.disableTunneling();
|
|
}
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer, com.mbridge.msdk.playercommon.exoplayer2.BaseRenderer
|
|
public void onPositionReset(long j, boolean z) throws ExoPlaybackException {
|
|
super.onPositionReset(j, z);
|
|
this.audioSink.reset();
|
|
this.currentPositionUs = j;
|
|
this.allowFirstBufferPositionDiscontinuity = true;
|
|
this.allowPositionDiscontinuity = true;
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer, com.mbridge.msdk.playercommon.exoplayer2.BaseRenderer
|
|
public void onStarted() {
|
|
super.onStarted();
|
|
this.audioSink.play();
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer, com.mbridge.msdk.playercommon.exoplayer2.BaseRenderer
|
|
public void onStopped() {
|
|
updateCurrentPosition();
|
|
this.audioSink.pause();
|
|
super.onStopped();
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer, com.mbridge.msdk.playercommon.exoplayer2.BaseRenderer
|
|
public void onDisabled() {
|
|
try {
|
|
this.audioSink.release();
|
|
try {
|
|
super.onDisabled();
|
|
} finally {
|
|
}
|
|
} catch (Throwable th) {
|
|
try {
|
|
super.onDisabled();
|
|
throw th;
|
|
} finally {
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer, com.mbridge.msdk.playercommon.exoplayer2.Renderer
|
|
public boolean isEnded() {
|
|
return super.isEnded() && this.audioSink.isEnded();
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer, com.mbridge.msdk.playercommon.exoplayer2.Renderer
|
|
public boolean isReady() {
|
|
return this.audioSink.hasPendingData() || super.isReady();
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.util.MediaClock
|
|
public long getPositionUs() {
|
|
if (getState() == 2) {
|
|
updateCurrentPosition();
|
|
}
|
|
return this.currentPositionUs;
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.util.MediaClock
|
|
public PlaybackParameters setPlaybackParameters(PlaybackParameters playbackParameters) {
|
|
return this.audioSink.setPlaybackParameters(playbackParameters);
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.util.MediaClock
|
|
public PlaybackParameters getPlaybackParameters() {
|
|
return this.audioSink.getPlaybackParameters();
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public void onQueueInputBuffer(DecoderInputBuffer decoderInputBuffer) {
|
|
if (!this.allowFirstBufferPositionDiscontinuity || decoderInputBuffer.isDecodeOnly()) {
|
|
return;
|
|
}
|
|
if (Math.abs(decoderInputBuffer.timeUs - this.currentPositionUs) > 500000) {
|
|
this.currentPositionUs = decoderInputBuffer.timeUs;
|
|
}
|
|
this.allowFirstBufferPositionDiscontinuity = false;
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public boolean processOutputBuffer(long j, long j2, MediaCodec mediaCodec, ByteBuffer byteBuffer, int i, int i2, long j3, boolean z) throws ExoPlaybackException {
|
|
if (this.passthroughEnabled && (i2 & 2) != 0) {
|
|
mediaCodec.releaseOutputBuffer(i, false);
|
|
return true;
|
|
}
|
|
if (z) {
|
|
mediaCodec.releaseOutputBuffer(i, false);
|
|
this.decoderCounters.skippedOutputBufferCount++;
|
|
this.audioSink.handleDiscontinuity();
|
|
return true;
|
|
}
|
|
try {
|
|
if (!this.audioSink.handleBuffer(byteBuffer, j3)) {
|
|
return false;
|
|
}
|
|
mediaCodec.releaseOutputBuffer(i, false);
|
|
this.decoderCounters.renderedOutputBufferCount++;
|
|
return true;
|
|
} catch (AudioSink.InitializationException | AudioSink.WriteException e) {
|
|
throw ExoPlaybackException.createForRenderer(e, getIndex());
|
|
}
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.mediacodec.MediaCodecRenderer
|
|
public void renderToEndOfStream() throws ExoPlaybackException {
|
|
try {
|
|
this.audioSink.playToEndOfStream();
|
|
} catch (AudioSink.WriteException e) {
|
|
throw ExoPlaybackException.createForRenderer(e, getIndex());
|
|
}
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.BaseRenderer, com.mbridge.msdk.playercommon.exoplayer2.PlayerMessage.Target
|
|
public void handleMessage(int i, Object obj) throws ExoPlaybackException {
|
|
if (i == 2) {
|
|
this.audioSink.setVolume(((Float) obj).floatValue());
|
|
} else if (i == 3) {
|
|
this.audioSink.setAudioAttributes((AudioAttributes) obj);
|
|
} else {
|
|
super.handleMessage(i, obj);
|
|
}
|
|
}
|
|
|
|
public int getCodecMaxInputSize(MediaCodecInfo mediaCodecInfo, Format format, Format[] formatArr) {
|
|
return getCodecMaxInputSize(mediaCodecInfo, format);
|
|
}
|
|
|
|
private int getCodecMaxInputSize(MediaCodecInfo mediaCodecInfo, Format format) {
|
|
PackageManager packageManager;
|
|
int i = Util.SDK_INT;
|
|
if (i >= 24 || !"OMX.google.raw.decoder".equals(mediaCodecInfo.name) || (i == 23 && (packageManager = this.context.getPackageManager()) != null && packageManager.hasSystemFeature("android.software.leanback"))) {
|
|
return format.maxInputSize;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
@SuppressLint({"InlinedApi"})
|
|
public MediaFormat getMediaFormat(Format format, String str, int i) {
|
|
MediaFormat mediaFormat = new MediaFormat();
|
|
mediaFormat.setString("mime", str);
|
|
mediaFormat.setInteger("channel-count", format.channelCount);
|
|
mediaFormat.setInteger("sample-rate", format.sampleRate);
|
|
MediaFormatUtil.setCsdBuffers(mediaFormat, format.initializationData);
|
|
MediaFormatUtil.maybeSetInteger(mediaFormat, "max-input-size", i);
|
|
if (Util.SDK_INT >= 23) {
|
|
mediaFormat.setInteger(HandleInvocationsFromAdViewer.KEY_DOWNLOAD_PRIORITY, 0);
|
|
}
|
|
return mediaFormat;
|
|
}
|
|
|
|
private void updateCurrentPosition() {
|
|
long currentPositionUs = this.audioSink.getCurrentPositionUs(isEnded());
|
|
if (currentPositionUs != Long.MIN_VALUE) {
|
|
if (!this.allowPositionDiscontinuity) {
|
|
currentPositionUs = Math.max(this.currentPositionUs, currentPositionUs);
|
|
}
|
|
this.currentPositionUs = currentPositionUs;
|
|
this.allowPositionDiscontinuity = false;
|
|
}
|
|
}
|
|
|
|
private static boolean areAdaptationCompatible(Format format, Format format2) {
|
|
return format.sampleMimeType.equals(format2.sampleMimeType) && format.channelCount == format2.channelCount && format.sampleRate == format2.sampleRate && format.encoderDelay == 0 && format.encoderPadding == 0 && format2.encoderDelay == 0 && format2.encoderPadding == 0 && format.initializationDataEquals(format2);
|
|
}
|
|
|
|
private static boolean codecNeedsDiscardChannelsWorkaround(String str) {
|
|
if (Util.SDK_INT < 24 && "OMX.SEC.aac.dec".equals(str) && "samsung".equals(Util.MANUFACTURER)) {
|
|
String str2 = Util.DEVICE;
|
|
if (str2.startsWith("zeroflte") || str2.startsWith("herolte") || str2.startsWith("heroqlte")) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public final class AudioSinkListener implements AudioSink.Listener {
|
|
private AudioSinkListener() {
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.audio.AudioSink.Listener
|
|
public final void onAudioSessionId(int i) {
|
|
MediaCodecAudioRenderer.this.eventDispatcher.audioSessionId(i);
|
|
MediaCodecAudioRenderer.this.onAudioSessionId(i);
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.audio.AudioSink.Listener
|
|
public final void onPositionDiscontinuity() {
|
|
MediaCodecAudioRenderer.this.onAudioTrackPositionDiscontinuity();
|
|
MediaCodecAudioRenderer.this.allowPositionDiscontinuity = true;
|
|
}
|
|
|
|
@Override // com.mbridge.msdk.playercommon.exoplayer2.audio.AudioSink.Listener
|
|
public final void onUnderrun(int i, long j, long j2) {
|
|
MediaCodecAudioRenderer.this.eventDispatcher.audioTrackUnderrun(i, j, j2);
|
|
MediaCodecAudioRenderer.this.onAudioTrackUnderrun(i, j, j2);
|
|
}
|
|
}
|
|
}
|