Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(158)

Unified Diff: webrtc/api/java/android/org/webrtc/CameraEnumerationAndroid.java

Issue 2010763003: Android: Add FramerateRange class (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Make constant static Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/api/java/android/org/webrtc/CameraEnumerationAndroid.java
diff --git a/webrtc/api/java/android/org/webrtc/CameraEnumerationAndroid.java b/webrtc/api/java/android/org/webrtc/CameraEnumerationAndroid.java
index c5c8be3a5d8e62443fb28ce70c9a8dc82fd0d1c5..2fa685d1fbceda2fbb9f7ceac4d2e2bb5bfdb251 100644
--- a/webrtc/api/java/android/org/webrtc/CameraEnumerationAndroid.java
+++ b/webrtc/api/java/android/org/webrtc/CameraEnumerationAndroid.java
@@ -43,21 +43,56 @@ public class CameraEnumerationAndroid {
}
public static class CaptureFormat {
+ // Class to represent a framerate range. The framerate varies because of lightning conditions.
+ // The values are multiplied by 1000, so 1000 represents one frame per second.
+ public static class FramerateRange {
+ public int min;
+ public int max;
+
+ public FramerateRange(int min, int max) {
+ this.min = min;
+ this.max = max;
+ }
+
+ @Override
+ public String toString() {
+ return "[" + (min / 1000.0f) + ":" + (max / 1000.0f) + "]";
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof FramerateRange)) {
+ return false;
+ }
+ final FramerateRange otherFramerate = (FramerateRange) other;
+ return min == otherFramerate.min && max == otherFramerate.max;
+ }
+
+ @Override
+ public int hashCode() {
+ // Use prime close to 2^16 to avoid collisions for normal values less than 2^16.
+ return 1 + 65537 * min + max;
+ }
+ }
+
public final int width;
public final int height;
- public final int maxFramerate;
- public final int minFramerate;
+ public final FramerateRange framerate;
// TODO(hbos): If VideoCapturer.startCapture is updated to support other image formats then this
// needs to be updated and VideoCapturer.getSupportedFormats need to return CaptureFormats of
// all imageFormats.
public final int imageFormat = ImageFormat.NV21;
- public CaptureFormat(int width, int height, int minFramerate,
- int maxFramerate) {
+ public CaptureFormat(int width, int height, int minFramerate, int maxFramerate) {
+ this.width = width;
+ this.height = height;
+ this.framerate = new FramerateRange(minFramerate, maxFramerate);
+ }
+
+ public CaptureFormat(int width, int height, FramerateRange framerate) {
this.width = width;
this.height = height;
- this.minFramerate = minFramerate;
- this.maxFramerate = maxFramerate;
+ this.framerate = framerate;
}
// Calculates the frame size of this capture format.
@@ -79,15 +114,14 @@ public class CameraEnumerationAndroid {
@Override
public String toString() {
- return width + "x" + height + "@[" + minFramerate + ":" + maxFramerate + "]";
+ return width + "x" + height + "@" + framerate;
}
public boolean isSameFormat(final CaptureFormat that) {
if (that == null) {
return false;
}
- return width == that.width && height == that.height && maxFramerate == that.maxFramerate
- && minFramerate == that.minFramerate;
+ return width == that.width && height == that.height && framerate.equals(that.framerate);
}
}
@@ -134,7 +168,9 @@ public class CameraEnumerationAndroid {
return getNameOfDevice(android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK);
}
- // Helper class for finding the closest supported format for the two functions below.
+ // Helper class for finding the closest supported format for the two functions below. It creates a
+ // comparator based on the difference to some requested parameters, where the element with the
+ // minimum difference is the element that is closest to the requested parameters.
private static abstract class ClosestComparator<T> implements Comparator<T> {
// Difference between supported and requested parameter.
abstract int diff(T supportedParameter);
@@ -145,20 +181,15 @@ public class CameraEnumerationAndroid {
}
}
- public static int[] getFramerateRange(android.hardware.Camera.Parameters parameters,
- final int framerate) {
- List<int[]> listFpsRange = parameters.getSupportedPreviewFpsRange();
- if (listFpsRange.isEmpty()) {
- Logging.w(TAG, "No supported preview fps range");
- return new int[]{0, 0};
- }
- return Collections.min(listFpsRange,
- new ClosestComparator<int[]>() {
- @Override int diff(int[] range) {
- final int maxFpsWeight = 10;
- return range[android.hardware.Camera.Parameters.PREVIEW_FPS_MIN_INDEX]
- + maxFpsWeight * abs(framerate
- - range[android.hardware.Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
+ public static CaptureFormat.FramerateRange getClosestSupportedFramerateRange(
+ List<CaptureFormat.FramerateRange> supportedFramerates, final int requestedFps) {
+ return Collections.min(supportedFramerates,
+ new ClosestComparator<CaptureFormat.FramerateRange>() {
+ private static final int MAX_FPS_WEIGHT = 10;
+
+ @Override
+ int diff(CaptureFormat.FramerateRange range) {
+ return range.min + MAX_FPS_WEIGHT * abs(requestedFps * 1000 - range.max);
}
});
}

Powered by Google App Engine
This is Rietveld 408576698