From 1b63db956fb1131c540b701403acce9107f45148 Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Fri, 4 Jun 2021 12:13:37 +0200 Subject: [PATCH] Move AV1X-AV1 mapping to VideoCodecTypeMime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AV1X->AV1 mapping added to SdpVideoFormatToVideoCodecInfo in https://webrtc-review.googlesource.com/c/src/+/215586 results in discrepancy of codec name between SDP and VideoCodecInfo. That violates VideoCodecInfo design and breaks downstream projects. This CL moves the mapping from VideoCodecInfoToSdpVideoFormat and SdpVideoFormatToVideoCodecInfo to VideoCodecTypeMime. Bug: b/181690054 Change-Id: I2a76524c29b082241f2ec72a60a209ce9b0c7c5f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/221205 Reviewed-by: Philip Eliasson Reviewed-by: Xavier Lepaul‎ Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/master@{#34230} --- sdk/android/BUILD.gn | 2 +- .../webrtc/HardwareVideoEncoderFactory.java | 4 ++-- .../webrtc/SoftwareVideoDecoderFactory.java | 18 +++++++++++------- .../webrtc/SoftwareVideoEncoderFactory.java | 18 +++++++++++------- .../DefaultVideoEncoderFactoryTest.java | 6 +++--- .../webrtc/MediaCodecVideoDecoderFactory.java | 4 ++-- .../java/org/webrtc/VideoCodecMimeType.java | 8 ++++++++ sdk/android/src/jni/video_codec_info.cc | 19 ++----------------- 8 files changed, 40 insertions(+), 39 deletions(-) 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