| 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 c2438da244e94d1146118c681904fa00cb31ef47..81a02d02bec1cdb9bd28cfc8186ebb9d2410cdef 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
|
| @@ -24,6 +24,7 @@ import android.os.Handler;
|
| import android.os.HandlerThread;
|
| import android.util.Range;
|
| import android.util.Size;
|
| +import android.util.SparseIntArray;
|
| import android.view.Surface;
|
|
|
| import org.chromium.base.Log;
|
| @@ -112,7 +113,6 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| private class CrImageReaderListener implements ImageReader.OnImageAvailableListener {
|
| @Override
|
| public void onImageAvailable(ImageReader reader) {
|
| - Log.d(TAG, "CrImageReaderListener.onImageAvailable");
|
| try (Image image = reader.acquireLatestImage()) {
|
| if (image == null) return;
|
|
|
| @@ -200,7 +200,6 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
|
|
| @Override
|
| public void onImageAvailable(ImageReader reader) {
|
| - Log.d(TAG, "CrPhotoReaderListener.onImageAvailable");
|
| try (Image image = reader.acquireLatestImage()) {
|
| if (image == null) {
|
| throw new IllegalStateException();
|
| @@ -237,6 +236,21 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| private static final double kNanoSecondsToFps = 1.0E-9;
|
| private static final String TAG = "VideoCapture";
|
|
|
| + // Map of the equivalent color temperature in Kelvin for the White Balance setting. The
|
| + // values are a mixture of educated guesses and data from Android's Camera2 API. The
|
| + // temperatures must be ordered increasingly.
|
| + private static final SparseIntArray COLOR_TEMPERATURES_MAP;
|
| + static {
|
| + COLOR_TEMPERATURES_MAP = new SparseIntArray();
|
| + COLOR_TEMPERATURES_MAP.append(2850, CameraMetadata.CONTROL_AWB_MODE_INCANDESCENT);
|
| + COLOR_TEMPERATURES_MAP.append(2940, CameraMetadata.CONTROL_AWB_MODE_WARM_FLUORESCENT);
|
| + COLOR_TEMPERATURES_MAP.append(3000, CameraMetadata.CONTROL_AWB_MODE_TWILIGHT);
|
| + COLOR_TEMPERATURES_MAP.append(4230, CameraMetadata.CONTROL_AWB_MODE_FLUORESCENT);
|
| + COLOR_TEMPERATURES_MAP.append(6000, CameraMetadata.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT);
|
| + COLOR_TEMPERATURES_MAP.append(6504, CameraMetadata.CONTROL_AWB_MODE_DAYLIGHT);
|
| + COLOR_TEMPERATURES_MAP.append(7000, CameraMetadata.CONTROL_AWB_MODE_SHADE);
|
| + };
|
| +
|
| private static enum CameraState { OPENING, CONFIGURING, STARTED, STOPPED }
|
|
|
| private final Object mCameraStateLock = new Object();
|
| @@ -256,6 +270,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| private MeteringRectangle mAreaOfInterest;
|
| private int mExposureCompensation = 0;
|
| private int mWhiteBalanceMode = AndroidMeteringMode.CONTINUOUS;
|
| + private int mColorTemperature = -1;
|
| private int mIso = 0;
|
| private boolean mRedEyeReduction = false;
|
| private int mFillLightMode = AndroidFillLightMode.OFF;
|
| @@ -399,6 +414,12 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_OFF);
|
| } else if (mWhiteBalanceMode == AndroidMeteringMode.FIXED) {
|
| requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);
|
| + if (mColorTemperature > 0) {
|
| + final int colorSetting = getClosestWhiteBalance(mColorTemperature);
|
| + if (colorSetting != -1) {
|
| + requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, colorSetting);
|
| + }
|
| + }
|
| }
|
|
|
| if (mAreaOfInterest != null) {
|
| @@ -444,6 +465,19 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| return closestSize;
|
| }
|
|
|
| + private int getClosestWhiteBalance(int colorTemperature) {
|
| + int minDiff = Integer.MAX_VALUE;
|
| + int matchedTemperature = -1;
|
| +
|
| + for (int i = 0; i < COLOR_TEMPERATURES_MAP.size(); ++i) {
|
| + final int diff = Math.abs(colorTemperature - COLOR_TEMPERATURES_MAP.keyAt(i));
|
| + if (diff >= minDiff) continue;
|
| + minDiff = diff;
|
| + matchedTemperature = COLOR_TEMPERATURES_MAP.valueAt(i);
|
| + }
|
| + return matchedTemperature;
|
| + }
|
| +
|
| static boolean isLegacyDevice(Context appContext, int id) {
|
| final CameraCharacteristics cameraCharacteristics =
|
| getCameraCharacteristics(appContext, id);
|
| @@ -733,6 +767,13 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| } else {
|
| builder.setWhiteBalanceMode(AndroidMeteringMode.FIXED);
|
| }
|
| + builder.setMinColorTemperature(COLOR_TEMPERATURES_MAP.keyAt(0));
|
| + builder.setMaxColorTemperature(
|
| + COLOR_TEMPERATURES_MAP.keyAt(COLOR_TEMPERATURES_MAP.size() - 1));
|
| + final int index = COLOR_TEMPERATURES_MAP.indexOfValue(whiteBalanceMode);
|
| + if (index >= 0) {
|
| + builder.setCurrentColorTemperature(COLOR_TEMPERATURES_MAP.keyAt(index));
|
| + }
|
|
|
| if (!cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
|
| builder.setFillLightMode(AndroidFillLightMode.NONE);
|
| @@ -772,7 +813,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| public void setPhotoOptions(int zoom, int focusMode, int exposureMode, int width, int height,
|
| float[] pointsOfInterest2D, boolean hasExposureCompensation, int exposureCompensation,
|
| int whiteBalanceMode, int iso, boolean hasRedEyeReduction, boolean redEyeReduction,
|
| - int fillLightMode) {
|
| + int fillLightMode, int colorTemperature) {
|
| final CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(mContext, mId);
|
| final Rect canvas =
|
| cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
|
| @@ -790,6 +831,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
|
|
| if (focusMode != AndroidMeteringMode.NOT_SET) mFocusMode = focusMode;
|
| if (exposureMode != AndroidMeteringMode.NOT_SET) mExposureMode = exposureMode;
|
| + if (whiteBalanceMode != AndroidMeteringMode.NOT_SET) mWhiteBalanceMode = whiteBalanceMode;
|
|
|
| if (width > 0) mPhotoWidth = width;
|
| if (height > 0) mPhotoHeight = height;
|
| @@ -805,7 +847,8 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| // Update |mAreaOfInterest| if the camera supports and there are |pointsOfInterest2D|.
|
| final boolean pointsOfInterestSupported =
|
| cameraCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF) > 0
|
| - || cameraCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE) > 0;
|
| + || 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[0] <= 1.0 && pointsOfInterest2D[0] >= 0.0;
|
| @@ -835,10 +878,10 @@ public class VideoCaptureCamera2 extends VideoCapture {
|
| / cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP)
|
| .floatValue());
|
| }
|
| - if (whiteBalanceMode != AndroidMeteringMode.NOT_SET) mWhiteBalanceMode = whiteBalanceMode;
|
| if (iso > 0) mIso = iso;
|
| -
|
| - if (hasRedEyeReduction) mRedEyeReduction = redEyeReduction;
|
| + if (mWhiteBalanceMode == AndroidMeteringMode.FIXED && colorTemperature > 0) {
|
| + mColorTemperature = colorTemperature;
|
| + }
|
| if (fillLightMode != AndroidFillLightMode.NOT_SET) mFillLightMode = fillLightMode;
|
|
|
| final Handler mainHandler = new Handler(mContext.getMainLooper());
|
|
|