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) { |