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

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

Issue 2787933002: ImageCapture: separate fillLightMode, redEyeReduction and Torch (Closed)
Patch Set: Created 3 years, 9 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 e942169fcd667299fcf6c1d2790c4261a318a206..a73751b5bdf94b7ab03606bc11e5f7e3efeb596c 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
@@ -278,6 +278,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
private int mIso;
private boolean mRedEyeReduction;
private int mFillLightMode = AndroidFillLightMode.OFF;
+ private boolean mTorch;
// Service function to grab CameraCharacteristics and handle exceptions.
private static CameraCharacteristics getCameraCharacteristics(Context appContext, int id) {
@@ -371,9 +372,10 @@ public class VideoCaptureCamera2 extends VideoCapture {
// https://crbug.com/518807.
}
- // |mExposureMode| and |mFillLightMode| interact to configure the AE and Flash modes. In a
- // nutshell, FLASH_MODE is only effective if the auto-exposure is ON/OFF, otherwise the
- // auto-exposure related flash control (ON_{AUTO,ALWAYS}_FLASH{_REDEYE) takes priority.
+ // |mExposureMode|, |mFillLightMode| and |mTorch| interact to configure the AE and Flash
+ // modes. In a nutshell, FLASH_MODE is only effective if the auto-exposure is ON/OFF,
+ // otherwise the auto-exposure related flash control (ON_{AUTO,ALWAYS}_FLASH{_REDEYE) takes
+ // priority. |mTorch| mode overrides any previous |mFillLightMode| flash control.
if (mExposureMode == AndroidMeteringMode.NONE
|| mExposureMode == AndroidMeteringMode.FIXED) {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
@@ -396,14 +398,10 @@ public class VideoCaptureCamera2 extends VideoCapture {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
break;
- case AndroidFillLightMode.TORCH:
- requestBuilder.set(
- CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
- requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
- break;
- case AndroidFillLightMode.NONE:
- // NONE is only used for getting capabilities, to signify "no flash unit". Ignore.
+ default:
}
+ if (mTorch) requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
+
requestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, mExposureCompensation);
// White Balance mode AndroidMeteringMode.SINGLE_SHOT is not supported.
@@ -799,34 +797,29 @@ public class VideoCaptureCamera2 extends VideoCapture {
builder.setStepColorTemperature(1);
if (!cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
- builder.setFillLightMode(AndroidFillLightMode.NONE);
+ builder.setTorch(false);
+ builder.setRedEyeReduction(false);
} else {
- // CONTROL_AE_MODE overrides FLASH_MODE control unless it's in ON or OFF states.
- switch (mPreviewRequest.get(CaptureRequest.CONTROL_AE_MODE)) {
- case CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
- builder.setRedEyeReduction(true);
- builder.setFillLightMode(AndroidFillLightMode.AUTO);
- break;
- case CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH:
- builder.setFillLightMode(AndroidFillLightMode.AUTO);
- break;
- case CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH:
- builder.setFillLightMode(AndroidFillLightMode.FLASH);
- break;
- case CameraMetadata.CONTROL_AE_MODE_OFF:
- case CameraMetadata.CONTROL_AE_MODE_ON:
- final Integer flashMode = mPreviewRequest.get(CaptureRequest.FLASH_MODE);
- if (flashMode == CameraMetadata.FLASH_MODE_OFF) {
- builder.setFillLightMode(AndroidFillLightMode.OFF);
- } else if (flashMode == CameraMetadata.FLASH_MODE_SINGLE) {
- builder.setFillLightMode(AndroidFillLightMode.FLASH);
- } else if (flashMode == CameraMetadata.FLASH_MODE_TORCH) {
- builder.setFillLightMode(AndroidFillLightMode.TORCH);
- }
- break;
- default:
- builder.setFillLightMode(AndroidFillLightMode.NONE);
+ // There's no way to query if torch and/or red eye reduction modes are available using
+ // Camera2 API but since there's a Flash unit, we assume so.
+ builder.setTorch(true);
+ builder.setRedEyeReduction(true);
+
+ final int[] flashModes =
+ cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
+ ArrayList<Integer> modes = new ArrayList<Integer>(0);
+ for (int flashMode : flashModes) {
+ if (flashMode == CameraMetadata.FLASH_MODE_OFF) {
+ modes.add(Integer.valueOf(AndroidFillLightMode.OFF));
+ } else if (flashMode == CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH) {
+ modes.add(Integer.valueOf(AndroidFillLightMode.AUTO));
+ } else if (flashMode == CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH) {
+ 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);
}
return builder.build();
@@ -837,7 +830,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
double height, float[] pointsOfInterest2D, boolean hasExposureCompensation,
double exposureCompensation, int whiteBalanceMode, double iso,
boolean hasRedEyeReduction, boolean redEyeReduction, int fillLightMode,
- double colorTemperature) {
+ boolean hasTorch, boolean torch, double colorTemperature) {
final CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(mContext, mId);
final Rect canvas =
cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
@@ -906,7 +899,10 @@ public class VideoCaptureCamera2 extends VideoCapture {
if (mWhiteBalanceMode == AndroidMeteringMode.FIXED && colorTemperature > 0) {
mColorTemperature = (int) Math.round(colorTemperature);
}
+
+ if (hasRedEyeReduction) mRedEyeReduction = redEyeReduction;
if (fillLightMode != AndroidFillLightMode.NOT_SET) mFillLightMode = fillLightMode;
+ if (hasTorch) mTorch = torch;
final Handler mainHandler = new Handler(mContext.getMainLooper());
mainHandler.removeCallbacks(mRestartCapture);

Powered by Google App Engine
This is Rietveld 408576698