discord-jadx/app/src/main/java/org/webrtc/MediaCodecVideoDecoderFacto...

101 lines
4.3 KiB
Java

package org.webrtc;
import android.media.MediaCodecInfo;
import android.media.MediaCodecList;
import android.os.Build;
import androidx.annotation.Nullable;
import h0.c.q0;
import java.util.ArrayList;
import org.webrtc.EglBase;
public class MediaCodecVideoDecoderFactory implements VideoDecoderFactory {
private static final String TAG = "MediaCodecVideoDecoderFactory";
@Nullable
private final Predicate<MediaCodecInfo> codecAllowedPredicate;
@Nullable
private final EglBase.Context sharedContext;
public MediaCodecVideoDecoderFactory(@Nullable EglBase.Context context, @Nullable Predicate<MediaCodecInfo> predicate) {
this.sharedContext = context;
this.codecAllowedPredicate = predicate;
}
@Nullable
private MediaCodecInfo findCodecForType(VideoCodecMimeType videoCodecMimeType) {
int i = 0;
while (true) {
MediaCodecInfo mediaCodecInfo = null;
if (i >= MediaCodecList.getCodecCount()) {
return null;
}
try {
mediaCodecInfo = MediaCodecList.getCodecInfoAt(i);
} catch (IllegalArgumentException e) {
Logging.e("MediaCodecVideoDecoderFactory", "Cannot retrieve decoder codec info", e);
}
if (mediaCodecInfo != null && !mediaCodecInfo.isEncoder() && isSupportedCodec(mediaCodecInfo, videoCodecMimeType)) {
return mediaCodecInfo;
}
i++;
}
}
private boolean isCodecAllowed(MediaCodecInfo mediaCodecInfo) {
Predicate<MediaCodecInfo> predicate = this.codecAllowedPredicate;
if (predicate == null) {
return true;
}
return predicate.test(mediaCodecInfo);
}
private boolean isH264HighProfileSupported(MediaCodecInfo mediaCodecInfo) {
String name = mediaCodecInfo.getName();
int i = Build.VERSION.SDK_INT;
if (name.startsWith("OMX.qcom.")) {
return true;
}
return i >= 23 && name.startsWith("OMX.Exynos.");
}
private boolean isSupportedCodec(MediaCodecInfo mediaCodecInfo, VideoCodecMimeType videoCodecMimeType) {
mediaCodecInfo.getName();
if (MediaCodecUtils.codecSupportsType(mediaCodecInfo, videoCodecMimeType) && MediaCodecUtils.selectColorFormat(MediaCodecUtils.DECODER_COLOR_FORMATS, mediaCodecInfo.getCapabilitiesForType(videoCodecMimeType.mimeType())) != null) {
return isCodecAllowed(mediaCodecInfo);
}
return false;
}
@Override // org.webrtc.VideoDecoderFactory
public /* synthetic */ VideoDecoder createDecoder(String str) {
return q0.a(this, str);
}
@Override // org.webrtc.VideoDecoderFactory
@Nullable
public VideoDecoder createDecoder(VideoCodecInfo videoCodecInfo) {
VideoCodecMimeType valueOf = VideoCodecMimeType.valueOf(videoCodecInfo.getName());
MediaCodecInfo findCodecForType = findCodecForType(valueOf);
if (findCodecForType == null) {
return null;
}
return new AndroidVideoDecoder(new MediaCodecWrapperFactoryImpl(), findCodecForType.getName(), valueOf, MediaCodecUtils.selectColorFormat(MediaCodecUtils.DECODER_COLOR_FORMATS, findCodecForType.getCapabilitiesForType(valueOf.mimeType())).intValue(), this.sharedContext);
}
@Override // org.webrtc.VideoDecoderFactory
public VideoCodecInfo[] getSupportedCodecs() {
ArrayList arrayList = new ArrayList();
VideoCodecMimeType[] videoCodecMimeTypeArr = {VideoCodecMimeType.VP8, VideoCodecMimeType.VP9, VideoCodecMimeType.H264};
for (int i = 0; i < 3; i++) {
VideoCodecMimeType videoCodecMimeType = videoCodecMimeTypeArr[i];
MediaCodecInfo findCodecForType = findCodecForType(videoCodecMimeType);
if (findCodecForType != null) {
String name = videoCodecMimeType.name();
if (videoCodecMimeType == VideoCodecMimeType.H264 && isH264HighProfileSupported(findCodecForType)) {
arrayList.add(new VideoCodecInfo(name, MediaCodecUtils.getCodecProperties(videoCodecMimeType, true)));
}
arrayList.add(new VideoCodecInfo(name, MediaCodecUtils.getCodecProperties(videoCodecMimeType, false)));
}
}
return (VideoCodecInfo[]) arrayList.toArray(new VideoCodecInfo[arrayList.size()]);
}
}