| 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|.
|
|
|