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

Unified Diff: media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java

Issue 2808073003: Image Capture: wire supported exposure/focus/white balance modes Android (Closed)
Patch Set: reillyg@ comments Created 3 years, 8 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: media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
index d8c92d75fd51c1d677e5765e14f9a7456cf33268..3d30f1dad16135ec0d0936048748e26c65a1d23c 100644
--- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
+++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
@@ -741,9 +741,31 @@ public class VideoCaptureCamera2 extends VideoCapture {
builder.setMinZoom(1.0).setMaxZoom(mMaxZoom);
builder.setCurrentZoom(currentZoom).setStepZoom(0.1);
- final int focusMode = mPreviewRequest.get(CaptureRequest.CONTROL_AF_MODE);
// Classify the Focus capabilities. In CONTINUOUS and SINGLE_SHOT, we can call
// autoFocus(AutoFocusCallback) to configure region(s) to focus onto.
+ final int[] jniFocusModes =
+ cameraCharacteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
+ ArrayList<Integer> focusModes = new ArrayList<Integer>(3);
+ for (int mode : jniFocusModes) {
+ if (mode == CameraMetadata.CONTROL_AF_MODE_OFF) {
+ focusModes.add(Integer.valueOf(AndroidMeteringMode.FIXED));
+ } else if (mode == CameraMetadata.CONTROL_AF_MODE_AUTO
+ || mode == CameraMetadata.CONTROL_AF_MODE_MACRO) {
+ // CONTROL_AF_MODE_{AUTO,MACRO} do not imply continuously focusing.
+ if (!focusModes.contains(Integer.valueOf(AndroidMeteringMode.SINGLE_SHOT))) {
+ focusModes.add(Integer.valueOf(AndroidMeteringMode.SINGLE_SHOT));
+ }
+ } else if (mode == CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_VIDEO
+ || mode == CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE
+ || mode == CameraMetadata.CONTROL_AF_MODE_EDOF) {
+ if (!focusModes.contains(Integer.valueOf(AndroidMeteringMode.CONTINUOUS))) {
+ focusModes.add(Integer.valueOf(AndroidMeteringMode.CONTINUOUS));
+ }
+ }
+ }
+ builder.setFocusModes(integerArrayListToArray(focusModes));
+
+ final int focusMode = mPreviewRequest.get(CaptureRequest.CONTROL_AF_MODE);
int jniFocusMode = AndroidMeteringMode.NONE;
if (focusMode == CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_VIDEO
|| focusMode == CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE) {
@@ -758,6 +780,24 @@ public class VideoCaptureCamera2 extends VideoCapture {
}
builder.setFocusMode(jniFocusMode);
+ // Auto Exposure is the usual capability and state, unless AE is not available at all, which
+ // is signalled by an empty CONTROL_AE_AVAILABLE_MODES list. Exposure Compensation can also
+ // support or be locked, this is equivalent to AndroidMeteringMode.FIXED.
+ final int[] jniExposureModes =
+ cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
+ ArrayList<Integer> exposureModes = new ArrayList<Integer>(1);
+ for (int mode : jniExposureModes) {
+ if (mode == CameraMetadata.CONTROL_AE_MODE_ON
+ || mode == CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH
+ || mode == CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH
+ || mode == CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
+ exposureModes.add(Integer.valueOf(AndroidMeteringMode.CONTINUOUS));
+ break;
+ }
+ }
+ // TODO(mcasas): query |cameraCharacteristics| for CONTROL_AE_LOCK_AVAILABLE (API 23)
+ builder.setExposureModes(integerArrayListToArray(exposureModes));
+
int jniExposureMode = AndroidMeteringMode.CONTINUOUS;
if (mPreviewRequest.get(CaptureRequest.CONTROL_AE_MODE)
== CameraMetadata.CONTROL_AE_MODE_OFF) {
@@ -779,6 +819,18 @@ public class VideoCaptureCamera2 extends VideoCapture {
builder.setCurrentExposureCompensation(
mPreviewRequest.get(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION) * step);
+ final int[] jniWhiteBalanceMode =
+ cameraCharacteristics.get(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES);
+ ArrayList<Integer> whiteBalanceModes = new ArrayList<Integer>(1);
+ for (int mode : jniWhiteBalanceMode) {
+ if (mode == CameraMetadata.CONTROL_AWB_MODE_AUTO) {
+ whiteBalanceModes.add(Integer.valueOf(AndroidMeteringMode.CONTINUOUS));
+ break;
+ }
+ }
+ // TODO(mcasas): query |cameraCharacteristics| for CONTROL_AWE_LOCK_AVAILABLE (API 23)
+ builder.setWhiteBalanceModes(integerArrayListToArray(whiteBalanceModes));
+
final int whiteBalanceMode = mPreviewRequest.get(CaptureRequest.CONTROL_AWB_MODE);
if (whiteBalanceMode == CameraMetadata.CONTROL_AWB_MODE_OFF) {
builder.setWhiteBalanceMode(AndroidMeteringMode.NONE);
@@ -820,9 +872,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
modes.add(Integer.valueOf(AndroidFillLightMode.FLASH));
}
}
- int[] modesAsIntArray = new int[modes.size()];
- for (int i = 0; i < modes.size(); i++) modesAsIntArray[i] = modes.get(i).intValue();
- builder.setFillLightModes(modesAsIntArray);
+ builder.setFillLightModes(integerArrayListToArray(modes));
}
return builder.build();
@@ -870,7 +920,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
|| cameraCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE) > 0
|| cameraCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB) > 0;
if (pointsOfInterestSupported && pointsOfInterest2D.length > 0) {
- assert pointsOfInterest2D.length == 1 : "Only 1 point of interest supported";
+ assert pointsOfInterest2D.length == 2 : "Only 1 point of interest supported";
assert pointsOfInterest2D[0] <= 1.0 && pointsOfInterest2D[0] >= 0.0;
assert pointsOfInterest2D[1] <= 1.0 && pointsOfInterest2D[1] >= 0.0;
// Calculate a Rect of 1/8 the |visibleRect| dimensions, and center it w.r.t. |canvas|.

Powered by Google App Engine
This is Rietveld 408576698