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

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

Issue 2013433003: WIP: Android Camera2 capture implementation (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fix CaptureFormat jni parsing 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..87f2adc1431e8376310999a342cf837182893c77 100644
--- a/webrtc/api/java/android/org/webrtc/CameraEnumerationAndroid.java
+++ b/webrtc/api/java/android/org/webrtc/CameraEnumerationAndroid.java
@@ -23,7 +23,7 @@ import java.util.List;
public class CameraEnumerationAndroid {
private final static String TAG = "CameraEnumerationAndroid";
// Synchronized on |CameraEnumerationAndroid.this|.
- private static Enumerator enumerator = new CameraEnumerator();
+ private static Enumerator enumerator = new Camera1Enumerator();
public interface Enumerator {
/**
@@ -43,26 +43,90 @@ public class CameraEnumerationAndroid {
}
public static class CaptureFormat {
- public final int width;
- public final int height;
- public final int maxFramerate;
- public final int minFramerate;
+ // Class for describing width and height dimensions in pixels.
+ public static class Size {
+ public int width;
+ public int height;
+
+ public Size(int width, int height) {
+ this.width = width;
+ this.height = height;
+ }
+
+ @Override
+ public String toString() {
+ return width + "x" + height;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof Size)) {
+ return false;
+ }
+ final Size otherSize = (Size) other;
+ return width == otherSize.width && height == otherSize.height;
+ }
+
+ @Override
+ public int hashCode() {
+ // Use prime close to 2^16 to avoid collisions for normal values less than 2^16.
+ return 1 + 65537 * width + height;
+ }
+ }
+
+ // 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 + ":" + max + "]";
+ }
+
+ @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 Size size;
+ 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) {
- this.width = width;
- this.height = height;
- this.minFramerate = minFramerate;
- this.maxFramerate = maxFramerate;
+ public CaptureFormat(int width, int height, int minFramerate, int maxFramerate) {
+ this.size = new Size(width, height);
+ this.framerate = new FramerateRange(minFramerate, maxFramerate);
+ }
+
+ public CaptureFormat(Size size, FramerateRange framerate) {
+ this.size = size;
+ this.framerate = framerate;
}
// Calculates the frame size of this capture format.
public int frameSize() {
- return frameSize(width, height, imageFormat);
+ return frameSize(size.width, size.height, imageFormat);
}
// Calculates the frame size of the specified image format. Currently only
@@ -79,15 +143,21 @@ public class CameraEnumerationAndroid {
@Override
public String toString() {
- return width + "x" + height + "@[" + minFramerate + ":" + maxFramerate + "]";
+ return size.toString() + "@" + framerate.toString();
}
- public boolean isSameFormat(final CaptureFormat that) {
- if (that == null) {
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof CaptureFormat)) {
return false;
}
- return width == that.width && height == that.height && maxFramerate == that.maxFramerate
- && minFramerate == that.minFramerate;
+ final CaptureFormat otherFormat = (CaptureFormat) other;
+ return size.equals(otherFormat.size) && framerate.equals(otherFormat.framerate);
+ }
+
+ @Override
+ public int hashCode() {
+ return 1 + 31 * size.hashCode() + framerate.hashCode();
}
}
@@ -134,7 +204,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,30 +217,27 @@ 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) {
+ // Prefer a fps range with an upper bound close to |framerate|. Also prefer a fps range with a low
+ // lower bound, to allow the framerate to fluctuate based on lightning conditions.
+ public static CaptureFormat.FramerateRange getClosestSupportedFramerate(
+ List<CaptureFormat.FramerateRange> supportedFramerates, final int requestedFps) {
+ return Collections.min(supportedFramerates,
+ new ClosestComparator<CaptureFormat.FramerateRange>() {
+ @Override
+ int diff(CaptureFormat.FramerateRange 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]);
+ return range.min + maxFpsWeight * abs(1000 * requestedFps - range.max);
}
});
}
- public static android.hardware.Camera.Size getClosestSupportedSize(
- List<android.hardware.Camera.Size> supportedSizes, final int requestedWidth,
+ public static CaptureFormat.Size getClosestSupportedSize(
+ List<CaptureFormat.Size> supportedSizes, final int requestedWidth,
final int requestedHeight) {
return Collections.min(supportedSizes,
- new ClosestComparator<android.hardware.Camera.Size>() {
- @Override int diff(android.hardware.Camera.Size size) {
+ new ClosestComparator<CaptureFormat.Size>() {
+ @Override
+ int diff(CaptureFormat.Size size) {
return abs(requestedWidth - size.width) + abs(requestedHeight - size.height);
}
});
« no previous file with comments | « webrtc/api/java/android/org/webrtc/Camera2Enumerator.java ('k') | webrtc/api/java/android/org/webrtc/CameraEnumerator.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698