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

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

Issue 2270563006: ImageCapture: support exposure mode configuration (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: reillyg@ comments Created 4 years, 4 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/VideoCaptureCamera.java
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java
index b1de85870ec057c68136c8a505101112d905180a..6bfbcfe35e8aaad5fd7958fca76607989beab27a 100644
--- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java
+++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java
@@ -338,28 +338,39 @@ public abstract class VideoCaptureCamera
// Classify the Focus capabilities. In CONTINUOUS and SINGLE_SHOT, we can call
// autoFocus(AutoFocusCallback) to configure region(s) to focus onto.
- int jniFocusMode = AndroidFocusMode.UNAVAILABLE;
+ int jniFocusMode = AndroidMeteringMode.UNAVAILABLE;
if (focusMode.equals(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)
|| focusMode.equals(
android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)
|| focusMode.equals(android.hardware.Camera.Parameters.FOCUS_MODE_EDOF)) {
- jniFocusMode = AndroidFocusMode.CONTINUOUS;
+ jniFocusMode = AndroidMeteringMode.CONTINUOUS;
} else if (focusMode.equals(android.hardware.Camera.Parameters.FOCUS_MODE_AUTO)
|| focusMode.equals(android.hardware.Camera.Parameters.FOCUS_MODE_MACRO)) {
- jniFocusMode = AndroidFocusMode.SINGLE_SHOT;
+ jniFocusMode = AndroidMeteringMode.SINGLE_SHOT;
} else if (focusMode.equals(android.hardware.Camera.Parameters.FOCUS_MODE_INFINITY)
|| focusMode.equals(android.hardware.Camera.Parameters.FOCUS_MODE_FIXED)) {
- jniFocusMode = AndroidFocusMode.FIXED;
+ jniFocusMode = AndroidMeteringMode.FIXED;
}
+ // Exposure is usually continuously updated except it not available at all, or if the
+ // exposure compensation is locked, in which case we consider it as FIXED.
+ int jniExposureMode = parameters.getMaxNumMeteringAreas() == 0
+ ? AndroidMeteringMode.UNAVAILABLE
+ : AndroidMeteringMode.CONTINUOUS;
+ if (parameters.isAutoExposureLockSupported() && parameters.getAutoExposureLock()) {
+ jniExposureMode = AndroidMeteringMode.FIXED;
+ }
+ // TODO(mcasas): https://crbug.com/518807 read the exposure compensation min and max
+ // values using getMinExposureCompensation() and getMaxExposureCompensation().
+
return new PhotoCapabilities(minIso, maxIso, currentIso, maxHeight, minHeight,
currentSize.height, maxWidth, minWidth, currentSize.width, maxZoom, minZoom,
- currentZoom, jniFocusMode);
+ currentZoom, jniFocusMode, jniExposureMode);
}
@Override
- public void setPhotoOptions(
- int zoom, int focusMode, int width, int height, float[] pointsOfInterest2D) {
+ public void setPhotoOptions(int zoom, int focusMode, int exposureMode, int width, int height,
+ float[] pointsOfInterest2D) {
android.hardware.Camera.Parameters parameters = getCameraParameters(mCamera);
if (parameters.isZoomSupported() && zoom > 0) {
@@ -374,14 +385,24 @@ public abstract class VideoCaptureCamera
parameters.setZoom(i - 1);
}
- if (focusMode == AndroidFocusMode.FIXED) {
+ if (focusMode == AndroidMeteringMode.FIXED) {
parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_FIXED);
- } else if (focusMode == AndroidFocusMode.SINGLE_SHOT) {
+ } else if (focusMode == AndroidMeteringMode.SINGLE_SHOT) {
parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_AUTO);
- } else if (focusMode == AndroidFocusMode.CONTINUOUS) {
+ } else if (focusMode == AndroidMeteringMode.CONTINUOUS) {
parameters.setFocusMode(
android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
+
+ if (parameters.isAutoExposureLockSupported()) {
+ if (exposureMode == AndroidMeteringMode.FIXED) {
+ parameters.setAutoExposureLock(true);
+ } else if (exposureMode != AndroidMeteringMode.UNAVAILABLE) {
+ parameters.setAutoExposureLock(false);
+ }
+ }
+ // TODO(mcasas): https://crbug.com/518807 set the exposure compensation.
+
if (width > 0) mPhotoWidth = width;
if (height > 0) mPhotoHeight = height;
@@ -389,6 +410,11 @@ public abstract class VideoCaptureCamera
if (mAreaOfInterest != null && !mAreaOfInterest.rect.isEmpty() && zoom > 0) {
mAreaOfInterest = null;
}
+ // Also clear |mAreaOfInterest| if the user sets it as UNAVAILABLE.
+ if (focusMode == AndroidMeteringMode.UNAVAILABLE
+ || exposureMode == AndroidMeteringMode.UNAVAILABLE) {
+ mAreaOfInterest = null;
+ }
// Update |mAreaOfInterest| if the camera supports and there are |pointsOfInterest2D|.
if (parameters.getMaxNumMeteringAreas() > 0 && pointsOfInterest2D.length > 0) {
@@ -414,11 +440,12 @@ public abstract class VideoCaptureCamera
}
if (mAreaOfInterest != null) {
parameters.setFocusAreas(Arrays.asList(mAreaOfInterest));
+ parameters.setMeteringAreas(Arrays.asList(mAreaOfInterest));
}
mCamera.setParameters(parameters);
- if (focusMode != AndroidFocusMode.SINGLE_SHOT) return;
+ if (focusMode != AndroidMeteringMode.SINGLE_SHOT) return;
mCamera.autoFocus(new android.hardware.Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, android.hardware.Camera camera) {

Powered by Google App Engine
This is Rietveld 408576698