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 f6c6170313a2c88545baf0f238aeeb7c5354078d..52aaeb860c9391e396f32a02b1ed2d78c9588435 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 |
@@ -10,6 +10,7 @@ import android.graphics.Rect; |
import android.graphics.SurfaceTexture; |
import android.opengl.GLES20; |
import android.os.Build; |
+import android.util.SparseArray; |
import org.chromium.base.Log; |
import org.chromium.base.annotations.JNINamespace; |
@@ -33,6 +34,27 @@ public abstract class VideoCaptureCamera |
private static final String TAG = "VideoCapture"; |
protected static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65; |
+ // 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 SparseArray<String> COLOR_TEMPERATURES_MAP; |
+ static { |
+ COLOR_TEMPERATURES_MAP = new SparseArray<String>(); |
+ COLOR_TEMPERATURES_MAP.append( |
+ 2850, android.hardware.Camera.Parameters.WHITE_BALANCE_INCANDESCENT); |
+ COLOR_TEMPERATURES_MAP.append( |
+ 2940, android.hardware.Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT); |
+ COLOR_TEMPERATURES_MAP.append( |
+ 3000, android.hardware.Camera.Parameters.WHITE_BALANCE_TWILIGHT); |
+ COLOR_TEMPERATURES_MAP.append( |
+ 4230, android.hardware.Camera.Parameters.WHITE_BALANCE_FLUORESCENT); |
+ COLOR_TEMPERATURES_MAP.append( |
+ 6000, android.hardware.Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT); |
+ COLOR_TEMPERATURES_MAP.append( |
+ 6504, android.hardware.Camera.Parameters.WHITE_BALANCE_DAYLIGHT); |
+ COLOR_TEMPERATURES_MAP.append(7000, android.hardware.Camera.Parameters.WHITE_BALANCE_SHADE); |
+ }; |
+ |
private final Object mPhotoTakenCallbackLock = new Object(); |
// Storage of takePicture() callback Id. There can be one such request in flight at most, and |
@@ -75,6 +97,19 @@ public abstract class VideoCaptureCamera |
return parameters; |
} |
+ private String getClosestWhiteBalance(int colorTemperature) { |
+ int minDiff = Integer.MAX_VALUE; |
+ String matchedTemperature = null; |
+ |
+ 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; |
+ } |
+ |
private class CrErrorCallback implements android.hardware.Camera.ErrorCallback { |
@Override |
public void onError(int error, android.hardware.Camera camera) { |
@@ -383,7 +418,15 @@ public abstract class VideoCaptureCamera |
? AndroidMeteringMode.CONTINUOUS |
: AndroidMeteringMode.FIXED; |
} |
- builder.setWhiteBalanceMode(jniExposureMode); |
+ builder.setWhiteBalanceMode(jniWhiteBalanceMode); |
+ |
+ builder.setMinColorTemperature(COLOR_TEMPERATURES_MAP.keyAt(0)); |
+ builder.setMaxColorTemperature( |
+ COLOR_TEMPERATURES_MAP.keyAt(COLOR_TEMPERATURES_MAP.size() - 1)); |
+ if (jniWhiteBalanceMode == AndroidMeteringMode.FIXED) { |
+ final int index = COLOR_TEMPERATURES_MAP.indexOfValue(parameters.getWhiteBalance()); |
+ if (index >= 0) builder.setCurrentColorTemperature(COLOR_TEMPERATURES_MAP.keyAt(index)); |
+ } |
if (parameters.getSupportedFlashModes() == null) { |
builder.setFillLightMode(AndroidFillLightMode.NONE); |
@@ -417,7 +460,7 @@ public abstract class VideoCaptureCamera |
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) { |
android.hardware.Camera.Parameters parameters = getCameraParameters(mCamera); |
if (parameters.isZoomSupported() && zoom > 0) { |
@@ -505,6 +548,10 @@ public abstract class VideoCaptureCamera |
} else if (whiteBalanceMode == AndroidMeteringMode.FIXED |
&& parameters.isAutoWhiteBalanceLockSupported()) { |
parameters.setAutoWhiteBalanceLock(true); |
+ if (colorTemperature > 0) { |
+ final String closestSetting = getClosestWhiteBalance(colorTemperature); |
+ if (closestSetting != null) parameters.setWhiteBalance(closestSetting); |
+ } |
} |
// NONE is only used for getting capabilities, to signify "no flash unit". Ignore it. |