Files
rr3-apk/decompiled/sources/com/mbridge/msdk/playercommon/exoplayer2/audio/MediaCodecAudioRenderer.java
Daniel Elliott f9d20bb3fc Add decompiled APK source code (JADX)
- 28,932 files
- Full Java source code
- Smali files
- Resources

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-18 14:52:23 -08:00

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);
}
}
}