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 33fd1d01ae79d9a96115f1080b77bd79fcde41eb..f633d7a5fe115ed306cb18f7091bd095fe842b9a 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 |
@@ -246,7 +246,8 @@ public class VideoCaptureCamera2 extends VideoCapture { |
private CameraState mCameraState = CameraState.STOPPED; |
private final float mMaxZoom; |
private Rect mCropRect = new Rect(); |
- private int mFocusMode = AndroidFocusMode.CONTINUOUS; |
+ private int mFocusMode = AndroidMeteringMode.CONTINUOUS; |
+ private int mExposureMode = AndroidMeteringMode.CONTINUOUS; |
private int mPhotoWidth = 0; |
private int mPhotoHeight = 0; |
private MeteringRectangle mAreaOfInterest; |
@@ -307,11 +308,11 @@ public class VideoCaptureCamera2 extends VideoCapture { |
previewRequestBuilder.set(CaptureRequest.EDGE_MODE, CameraMetadata.EDGE_MODE_FAST); |
previewRequestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, |
CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON); |
- if (mFocusMode == AndroidFocusMode.CONTINUOUS) { |
+ if (mFocusMode == AndroidMeteringMode.CONTINUOUS) { |
Log.d(TAG, "Focus: CONTROL_AF_MODE_CONTINUOUS_PICTURE"); |
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, |
CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE); |
- } else if (mFocusMode == AndroidFocusMode.SINGLE_SHOT) { |
+ } else if (mFocusMode == AndroidMeteringMode.SINGLE_SHOT) { |
Log.d(TAG, "Focus: triggering a single shot"); |
previewRequestBuilder.set( |
CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_AUTO); |
@@ -319,13 +320,21 @@ public class VideoCaptureCamera2 extends VideoCapture { |
CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); |
} |
+ if (mExposureMode == AndroidMeteringMode.FIXED) { |
+ previewRequestBuilder.set( |
+ CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF); |
+ } else { |
+ previewRequestBuilder.set( |
+ CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); |
+ } |
+ |
if (mAreaOfInterest != null) { |
MeteringRectangle[] array = {mAreaOfInterest}; |
- Log.d(TAG, "Area of interest (set) %s", mAreaOfInterest.toString()); |
+ Log.d(TAG, "Area of interest %s", mAreaOfInterest.toString()); |
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, array); |
+ previewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, array); |
} |
- // SENSOR_EXPOSURE_TIME ? |
if (!mCropRect.isEmpty()) { |
previewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, mCropRect); |
} |
@@ -601,30 +610,40 @@ public class VideoCaptureCamera2 extends VideoCapture { |
/ mPreviewRequest.get(CaptureRequest.SCALER_CROP_REGION).width(); |
final int focusMode = mPreviewRequest.get(CaptureRequest.CONTROL_AF_MODE); |
- Log.d(TAG, "focusMode: %s", focusMode); |
// 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 == CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_VIDEO |
|| focusMode == CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE) { |
- jniFocusMode = AndroidFocusMode.CONTINUOUS; |
+ jniFocusMode = AndroidMeteringMode.CONTINUOUS; |
} else if (focusMode == CameraMetadata.CONTROL_AF_MODE_AUTO |
|| focusMode == CameraMetadata.CONTROL_AF_MODE_MACRO) { |
- jniFocusMode = AndroidFocusMode.SINGLE_SHOT; |
+ jniFocusMode = AndroidMeteringMode.SINGLE_SHOT; |
} else if (focusMode == CameraMetadata.CONTROL_AF_MODE_OFF) { |
- jniFocusMode = AndroidFocusMode.FIXED; |
+ jniFocusMode = AndroidMeteringMode.FIXED; |
} else { |
assert jniFocusMode == CameraMetadata.CONTROL_AF_MODE_EDOF; |
} |
+ int jniExposureMode = AndroidMeteringMode.CONTINUOUS; |
+ if (mPreviewRequest.get(CaptureRequest.CONTROL_AE_MODE) |
+ == CameraMetadata.CONTROL_AE_MODE_OFF) { |
+ jniExposureMode = AndroidMeteringMode.UNAVAILABLE; |
+ } |
+ if (mPreviewRequest.get(CaptureRequest.CONTROL_AE_LOCK)) { |
+ jniExposureMode = AndroidMeteringMode.FIXED; |
+ } |
+ // TODO(mcasas): https://crbug.com/518807 read the exposure compensation min and max |
+ // values using CONTROL_AE_COMPENSATION_RANGE. |
+ |
return new PhotoCapabilities(minIso, maxIso, currentIso, maxHeight, minHeight, |
currentHeight, maxWidth, minWidth, currentWidth, maxZoom, minZoom, currentZoom, |
- jniFocusMode); |
+ 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) { |
final CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(mContext, mId); |
final Rect canvas = |
cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); |
@@ -640,7 +659,10 @@ public class VideoCaptureCamera2 extends VideoCapture { |
Log.d(TAG, "zoom level %f, rectangle: %s", normalizedZoom, mCropRect.toString()); |
} |
- mFocusMode = focusMode; |
+ if (focusMode != AndroidMeteringMode.NOT_SET) mFocusMode = focusMode; |
+ if (exposureMode != AndroidMeteringMode.NOT_SET) mExposureMode = exposureMode; |
+ |
+ // TODO(mcasas): https://crbug.com/518807 support exposure compensation. |
if (width > 0) mPhotoWidth = width; |
if (height > 0) mPhotoHeight = height; |
@@ -649,6 +671,11 @@ public class VideoCaptureCamera2 extends VideoCapture { |
if (mAreaOfInterest != null && !mAreaOfInterest.getRect().isEmpty() && zoom > 0) { |
mAreaOfInterest = null; |
} |
+ // Also clear |mAreaOfInterest| if the user sets it as UNAVAILABLE. |
+ if (mFocusMode == AndroidMeteringMode.UNAVAILABLE |
+ || mExposureMode == AndroidMeteringMode.UNAVAILABLE) { |
+ mAreaOfInterest = null; |
+ } |
// Update |mAreaOfInterest| if the camera supports and there are |pointsOfInterest2D|. |
if (cameraCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF) > 0 |
&& pointsOfInterest2D.length > 0) { |
@@ -729,19 +756,29 @@ public class VideoCaptureCamera2 extends VideoCapture { |
photoRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, mCropRect); |
} |
- if (mFocusMode == AndroidFocusMode.CONTINUOUS) { |
+ if (mFocusMode == AndroidMeteringMode.CONTINUOUS) { |
photoRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, |
CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE); |
- } else if (mFocusMode == AndroidFocusMode.SINGLE_SHOT) { |
- Log.d(TAG, "triggering auto focus (maybe?)"); |
+ } else if (mFocusMode == AndroidMeteringMode.SINGLE_SHOT) { |
photoRequestBuilder.set( |
CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); |
} |
+ if (mExposureMode == AndroidMeteringMode.FIXED) { |
+ photoRequestBuilder.set( |
+ CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF); |
+ } else { |
+ photoRequestBuilder.set( |
+ CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); |
+ // TODO(mcasas): set to CONTROL_AE_MODE_ON_{AUTO,ALWAYS}_FLASH{,_REDEYE} depending on |
+ // other options that need to be wired and passed to setPhotoOptions(). |
+ } |
+ |
if (mAreaOfInterest != null) { |
MeteringRectangle[] array = {mAreaOfInterest}; |
- Log.d(TAG, "Area of interest (set) %s", mAreaOfInterest.toString()); |
+ Log.d(TAG, "Area of interest %s", mAreaOfInterest.toString()); |
photoRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, array); |
+ photoRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, array); |
} |
final CaptureRequest photoRequest = photoRequestBuilder.build(); |