Implement equals() and hashCode() for VideoCodecInfo.
To be able to compare VideoCodecInfos in a nice way in Java and still
use the correct criteria for comparing H264 codec infos.
A similar thing was done for Obj-C here:
https://webrtc-review.googlesource.com/c/src/+/4383
Bug: webrtc:7925
Change-Id: I43f532d4efa557fc8fe25a82eebc35072b91e6db
Reviewed-on: https://webrtc-review.googlesource.com/23240
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20716}
diff --git a/sdk/android/api/org/webrtc/DefaultVideoEncoderFactory.java b/sdk/android/api/org/webrtc/DefaultVideoEncoderFactory.java
index db6af87..309ae74 100644
--- a/sdk/android/api/org/webrtc/DefaultVideoEncoderFactory.java
+++ b/sdk/android/api/org/webrtc/DefaultVideoEncoderFactory.java
@@ -10,8 +10,8 @@
package org.webrtc;
-import java.util.ArrayList;
import java.util.Arrays;
+import java.util.LinkedHashSet;
import java.util.List;
public class DefaultVideoEncoderFactory implements VideoEncoderFactory {
@@ -33,38 +33,20 @@
@Override
public VideoEncoder createEncoder(VideoCodecInfo info) {
- List<VideoCodecInfo> hardwareSupportedCodecs =
- Arrays.asList(hardwareVideoEncoderFactory.getSupportedCodecs());
- if (containsSameCodec(hardwareSupportedCodecs, info)) {
- return hardwareVideoEncoderFactory.createEncoder(info);
- } else {
- return softwareVideoEncoderFactory.createEncoder(info);
+ final VideoEncoder videoEncoder = hardwareVideoEncoderFactory.createEncoder(info);
+ if (videoEncoder != null) {
+ return videoEncoder;
}
+ return softwareVideoEncoderFactory.createEncoder(info);
}
@Override
public VideoCodecInfo[] getSupportedCodecs() {
- List<VideoCodecInfo> supportedCodecInfos = new ArrayList<>();
+ LinkedHashSet<VideoCodecInfo> supportedCodecInfos = new LinkedHashSet<VideoCodecInfo>();
supportedCodecInfos.addAll(Arrays.asList(softwareVideoEncoderFactory.getSupportedCodecs()));
-
- for (VideoCodecInfo info : hardwareVideoEncoderFactory.getSupportedCodecs()) {
- if (!containsSameCodec(supportedCodecInfos, info)) {
- supportedCodecInfos.add(info);
- }
- }
+ supportedCodecInfos.addAll(Arrays.asList(hardwareVideoEncoderFactory.getSupportedCodecs()));
return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]);
}
-
- private static boolean containsSameCodec(List<VideoCodecInfo> infos, VideoCodecInfo info) {
- for (VideoCodecInfo otherInfo : infos) {
- if (isSameCodec(info, otherInfo)) {
- return true;
- }
- }
- return false;
- }
-
- private static native boolean isSameCodec(VideoCodecInfo info1, VideoCodecInfo info2);
}
diff --git a/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java b/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java
index 02a96f8..25b7c77 100644
--- a/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java
+++ b/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java
@@ -93,6 +93,16 @@
Integer yuvColorFormat = MediaCodecUtils.selectColorFormat(
MediaCodecUtils.ENCODER_COLOR_FORMATS, info.getCapabilitiesForType(mime));
+ if (type == VideoCodecType.H264) {
+ boolean isHighProfile = isSameH264Profile(input.params, getCodecProperties(type, true))
+ && isH264HighProfileSupported(info);
+ boolean isBaselineProfile = isSameH264Profile(input.params, getCodecProperties(type, false));
+
+ if (!isHighProfile && !isBaselineProfile) {
+ return null;
+ }
+ }
+
return new HardwareVideoEncoder(codecName, type, surfaceColorFormat, yuvColorFormat,
input.params, getKeyFrameIntervalSec(type), getForcedKeyFrameIntervalMs(type, codecName),
createBitrateAdjuster(type, codecName), sharedContext);
@@ -269,4 +279,7 @@
throw new IllegalArgumentException("Unsupported codec: " + type);
}
}
+
+ private static native boolean isSameH264Profile(
+ Map<String, String> params1, Map<String, String> params2);
}
diff --git a/sdk/android/api/org/webrtc/VideoCodecInfo.java b/sdk/android/api/org/webrtc/VideoCodecInfo.java
index 208a992..9f52cf2 100644
--- a/sdk/android/api/org/webrtc/VideoCodecInfo.java
+++ b/sdk/android/api/org/webrtc/VideoCodecInfo.java
@@ -10,6 +10,8 @@
package org.webrtc;
+import java.util.Arrays;
+import java.util.Locale;
import java.util.Map;
/**
@@ -45,4 +47,23 @@
this.name = name;
this.params = params;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null)
+ return false;
+ if (obj == this)
+ return true;
+ if (!(obj instanceof VideoCodecInfo))
+ return false;
+
+ VideoCodecInfo otherInfo = (VideoCodecInfo) obj;
+ return name.equalsIgnoreCase(otherInfo.name) && params.equals(otherInfo.params);
+ }
+
+ @Override
+ public int hashCode() {
+ Object[] values = {name.toUpperCase(Locale.ROOT), params};
+ return Arrays.hashCode(values);
+ }
}