diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 0094c8ea39..be15a7d643 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -234,6 +234,7 @@ if (is_android) { "src/java/org/webrtc/GlGenericDrawer.java", "src/java/org/webrtc/H264Utils.java", "src/java/org/webrtc/NV21Buffer.java", + "src/java/org/webrtc/VideoCodecMimeType.java", "src/java/org/webrtc/VideoDecoderWrapper.java", "src/java/org/webrtc/VideoEncoderWrapper.java", "src/java/org/webrtc/WrappedNativeI420Buffer.java", @@ -403,7 +404,6 @@ if (is_android) { "src/java/org/webrtc/MediaCodecWrapperFactory.java", "src/java/org/webrtc/MediaCodecWrapperFactoryImpl.java", "src/java/org/webrtc/NV12Buffer.java", - "src/java/org/webrtc/VideoCodecMimeType.java", ] deps = [ diff --git a/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java b/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java index 17ba76ab30..c9831c1843 100644 --- a/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java +++ b/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java @@ -94,7 +94,7 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory { return null; } - VideoCodecMimeType type = VideoCodecMimeType.valueOf(input.name); + VideoCodecMimeType type = VideoCodecMimeType.fromSdpCodecName(input.getName()); MediaCodecInfo info = findCodecForType(type); if (info == null) { @@ -142,7 +142,7 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory { VideoCodecMimeType.VP9, VideoCodecMimeType.H264, VideoCodecMimeType.AV1}) { MediaCodecInfo codec = findCodecForType(type); if (codec != null) { - String name = type.name(); + String name = type.toSdpCodecName(); // TODO(sakal): Always add H264 HP once WebRTC correctly removes codecs that are not // supported by the decoder. if (type == VideoCodecMimeType.H264 && isH264HighProfileSupported(codec)) { diff --git a/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java b/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java index da11e87ec3..0c9dcbe5a4 100644 --- a/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java +++ b/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java @@ -25,14 +25,18 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory { @Nullable @Override - public VideoDecoder createDecoder(VideoCodecInfo codecType) { - if (codecType.getName().equalsIgnoreCase("VP8")) { + public VideoDecoder createDecoder(VideoCodecInfo codecInfo) { + String codecName = codecInfo.getName(); + + if (codecName.equalsIgnoreCase(VideoCodecMimeType.VP8.toSdpCodecName())) { return new LibvpxVp8Decoder(); } - if (codecType.getName().equalsIgnoreCase("VP9") && LibvpxVp9Decoder.nativeIsSupported()) { + if (codecName.equalsIgnoreCase(VideoCodecMimeType.VP9.toSdpCodecName()) + && LibvpxVp9Decoder.nativeIsSupported()) { return new LibvpxVp9Decoder(); } - if (codecType.getName().equalsIgnoreCase("AV1") && LibaomAv1Decoder.nativeIsSupported()) { + if (codecName.equalsIgnoreCase(VideoCodecMimeType.AV1.toSdpCodecName()) + && LibaomAv1Decoder.nativeIsSupported()) { return new LibaomAv1Decoder(); } @@ -47,12 +51,12 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory { static VideoCodecInfo[] supportedCodecs() { List codecs = new ArrayList(); - codecs.add(new VideoCodecInfo("VP8", new HashMap<>())); + codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.toSdpCodecName(), new HashMap<>())); if (LibvpxVp9Decoder.nativeIsSupported()) { - codecs.add(new VideoCodecInfo("VP9", new HashMap<>())); + codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.toSdpCodecName(), new HashMap<>())); } if (LibaomAv1Decoder.nativeIsSupported()) { - codecs.add(new VideoCodecInfo("AV1", new HashMap<>())); + codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.toSdpCodecName(), new HashMap<>())); } return codecs.toArray(new VideoCodecInfo[codecs.size()]); diff --git a/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java b/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java index 528adab98c..4de39dcdba 100644 --- a/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java +++ b/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java @@ -18,14 +18,18 @@ import java.util.List; public class SoftwareVideoEncoderFactory implements VideoEncoderFactory { @Nullable @Override - public VideoEncoder createEncoder(VideoCodecInfo info) { - if (info.name.equalsIgnoreCase("VP8")) { + public VideoEncoder createEncoder(VideoCodecInfo codecInfo) { + String codecName = codecInfo.getName(); + + if (codecName.equalsIgnoreCase(VideoCodecMimeType.VP8.toSdpCodecName())) { return new LibvpxVp8Encoder(); } - if (info.name.equalsIgnoreCase("VP9") && LibvpxVp9Encoder.nativeIsSupported()) { + if (codecName.equalsIgnoreCase(VideoCodecMimeType.VP9.toSdpCodecName()) + && LibvpxVp9Encoder.nativeIsSupported()) { return new LibvpxVp9Encoder(); } - if (info.name.equalsIgnoreCase("AV1") && LibaomAv1Encoder.nativeIsSupported()) { + if (codecName.equalsIgnoreCase(VideoCodecMimeType.AV1.toSdpCodecName()) + && LibaomAv1Encoder.nativeIsSupported()) { return new LibaomAv1Encoder(); } @@ -40,12 +44,12 @@ public class SoftwareVideoEncoderFactory implements VideoEncoderFactory { static VideoCodecInfo[] supportedCodecs() { List codecs = new ArrayList(); - codecs.add(new VideoCodecInfo("VP8", new HashMap<>())); + codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.toSdpCodecName(), new HashMap<>())); if (LibvpxVp9Encoder.nativeIsSupported()) { - codecs.add(new VideoCodecInfo("VP9", new HashMap<>())); + codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.toSdpCodecName(), new HashMap<>())); } if (LibaomAv1Encoder.nativeIsSupported()) { - codecs.add(new VideoCodecInfo("AV1", new HashMap<>())); + codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.toSdpCodecName(), new HashMap<>())); } return codecs.toArray(new VideoCodecInfo[codecs.size()]); diff --git a/sdk/android/instrumentationtests/src/org/webrtc/DefaultVideoEncoderFactoryTest.java b/sdk/android/instrumentationtests/src/org/webrtc/DefaultVideoEncoderFactoryTest.java index 8ffacbe788..8135e80eaf 100644 --- a/sdk/android/instrumentationtests/src/org/webrtc/DefaultVideoEncoderFactoryTest.java +++ b/sdk/android/instrumentationtests/src/org/webrtc/DefaultVideoEncoderFactoryTest.java @@ -73,7 +73,7 @@ public class DefaultVideoEncoderFactoryTest { assertEquals(5, videoCodecs.length); assertEquals("VP8", videoCodecs[0].name); assertEquals("VP9", videoCodecs[1].name); - assertEquals("AV1", videoCodecs[2].name); + assertEquals("AV1X", videoCodecs[2].name); assertEquals("H264", videoCodecs[3].name); assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id")); assertEquals("H264", videoCodecs[4].name); @@ -89,7 +89,7 @@ public class DefaultVideoEncoderFactoryTest { assertEquals(4, videoCodecs.length); assertEquals("VP8", videoCodecs[0].name); assertEquals("VP9", videoCodecs[1].name); - assertEquals("AV1", videoCodecs[2].name); + assertEquals("AV1X", videoCodecs[2].name); assertEquals("H264", videoCodecs[3].name); assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id")); } @@ -103,7 +103,7 @@ public class DefaultVideoEncoderFactoryTest { assertEquals(5, videoCodecs.length); assertEquals("VP8", videoCodecs[0].name); assertEquals("VP9", videoCodecs[1].name); - assertEquals("AV1", videoCodecs[2].name); + assertEquals("AV1X", videoCodecs[2].name); assertEquals("H264", videoCodecs[3].name); assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id")); assertEquals("H264", videoCodecs[4].name); diff --git a/sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java b/sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java index bd446fb741..5a1d63e1c5 100644 --- a/sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java +++ b/sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java @@ -46,7 +46,7 @@ class MediaCodecVideoDecoderFactory implements VideoDecoderFactory { @Nullable @Override public VideoDecoder createDecoder(VideoCodecInfo codecType) { - VideoCodecMimeType type = VideoCodecMimeType.valueOf(codecType.getName()); + VideoCodecMimeType type = VideoCodecMimeType.fromSdpCodecName(codecType.getName()); MediaCodecInfo info = findCodecForType(type); if (info == null) { @@ -68,7 +68,7 @@ class MediaCodecVideoDecoderFactory implements VideoDecoderFactory { VideoCodecMimeType.VP9, VideoCodecMimeType.H264, VideoCodecMimeType.AV1}) { MediaCodecInfo codec = findCodecForType(type); if (codec != null) { - String name = type.name(); + String name = type.toSdpCodecName(); if (type == VideoCodecMimeType.H264 && isH264HighProfileSupported(codec)) { supportedCodecInfos.add(new VideoCodecInfo( name, MediaCodecUtils.getCodecProperties(type, /* highProfile= */ true))); diff --git a/sdk/android/src/java/org/webrtc/VideoCodecMimeType.java b/sdk/android/src/java/org/webrtc/VideoCodecMimeType.java index 26a030919d..93a9286165 100644 --- a/sdk/android/src/java/org/webrtc/VideoCodecMimeType.java +++ b/sdk/android/src/java/org/webrtc/VideoCodecMimeType.java @@ -26,4 +26,12 @@ enum VideoCodecMimeType { String mimeType() { return mimeType; } + + static VideoCodecMimeType fromSdpCodecName(String codecName) { + return codecName.equals("AV1X") ? AV1 : valueOf(codecName); + } + + String toSdpCodecName() { + return this == AV1 ? "AV1X" : name(); + } } diff --git a/sdk/android/src/jni/video_codec_info.cc b/sdk/android/src/jni/video_codec_info.cc index 8c86b7c376..a218a1d23f 100644 --- a/sdk/android/src/jni/video_codec_info.cc +++ b/sdk/android/src/jni/video_codec_info.cc @@ -19,33 +19,18 @@ namespace jni { SdpVideoFormat VideoCodecInfoToSdpVideoFormat(JNIEnv* jni, const JavaRef& j_info) { - std::string codecName = - JavaToNativeString(jni, Java_VideoCodecInfo_getName(jni, j_info)); - std::string sdpCodecName; - if (codecName == "AV1") { - // TODO(yyaroshevich): Undo mapping once AV1 sdp name is standardized - sdpCodecName = "AV1X"; - } else { - sdpCodecName = codecName; - } return SdpVideoFormat( - sdpCodecName, + JavaToNativeString(jni, Java_VideoCodecInfo_getName(jni, j_info)), JavaToNativeStringMap(jni, Java_VideoCodecInfo_getParams(jni, j_info))); } ScopedJavaLocalRef SdpVideoFormatToVideoCodecInfo( JNIEnv* jni, const SdpVideoFormat& format) { - std::string codecName; - if (format.name == "AV1X" || format.name == "AV1") { - codecName = "AV1"; - } else { - codecName = format.name; - } ScopedJavaLocalRef j_params = NativeToJavaStringMap(jni, format.parameters); return Java_VideoCodecInfo_Constructor( - jni, NativeToJavaString(jni, codecName), j_params); + jni, NativeToJavaString(jni, format.name), j_params); } } // namespace jni