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 51a32dc31a2e7f14fddbd14a8d48486c5d03cbb1..07b9376ca77e8786bd272dd1756e12df5e241996 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 |
@@ -21,6 +21,7 @@ import android.media.ImageReader; |
import android.os.Build; |
import android.os.Handler; |
import android.os.HandlerThread; |
+import android.util.Range; |
import android.util.Size; |
import android.view.Surface; |
@@ -360,6 +361,27 @@ public class VideoCaptureCamera2 extends VideoCapture { |
} |
} |
+ // Finds the closest Size to (|width|x|height|) in |sizes|, and returns it or null. |
+ // Ignores |width| or |height| if either is zero (== don't care). |
+ private static Size findClosestSizeInArray(Size[] sizes, int width, int height) { |
+ if (sizes == null) return null; |
+ Size closestSize = null; |
+ int minDiff = Integer.MAX_VALUE; |
+ for (Size size : sizes) { |
+ final int diff = ((width > 0) ? Math.abs(size.getWidth() - width) : 0) |
+ + ((height > 0) ? Math.abs(size.getHeight() - height) : 0); |
+ if (diff < minDiff) { |
+ minDiff = diff; |
+ closestSize = size; |
+ } |
+ } |
+ if (minDiff == Integer.MAX_VALUE) { |
+ Log.e(TAG, "Couldn't find resolution close to (%dx%d)", width, height); |
+ return null; |
+ } |
+ return closestSize; |
+ } |
+ |
static boolean isLegacyDevice(Context appContext, int id) { |
final CameraCharacteristics cameraCharacteristics = |
getCameraCharacteristics(appContext, id); |
@@ -476,18 +498,8 @@ public class VideoCaptureCamera2 extends VideoCapture { |
// Find closest supported size. |
final Size[] supportedSizes = streamMap.getOutputSizes(ImageFormat.YUV_420_888); |
- if (supportedSizes == null) return false; |
- Size closestSupportedSize = null; |
- int minDiff = Integer.MAX_VALUE; |
- for (Size size : supportedSizes) { |
- final int diff = |
- Math.abs(size.getWidth() - width) + Math.abs(size.getHeight() - height); |
- if (diff < minDiff) { |
- minDiff = diff; |
- closestSupportedSize = size; |
- } |
- } |
- if (minDiff == Integer.MAX_VALUE) { |
+ final Size closestSupportedSize = findClosestSizeInArray(supportedSizes, width, height); |
+ if (closestSupportedSize == null) { |
Log.e(TAG, "No supported resolutions."); |
return false; |
} |
@@ -562,11 +574,36 @@ public class VideoCaptureCamera2 extends VideoCapture { |
public PhotoCapabilities getPhotoCapabilities() { |
final CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(mContext, mId); |
+ int minIso = 0; |
+ int maxIso = 0; |
+ final Range<Integer> iso_range = |
+ cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE); |
+ if (iso_range != null) { |
+ minIso = iso_range.getLower(); |
+ maxIso = iso_range.getUpper(); |
+ } |
+ final int currentIso = mPreviewRequest.get(CaptureRequest.SENSOR_SENSITIVITY); |
+ |
+ final StreamConfigurationMap streamMap = |
+ cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); |
+ final Size[] supportedSizes = streamMap.getOutputSizes(ImageFormat.JPEG); |
+ int minWidth = Integer.MAX_VALUE; |
+ int minHeight = Integer.MAX_VALUE; |
+ int maxWidth = 0; |
+ int maxHeight = 0; |
+ for (Size size : supportedSizes) { |
+ if (size.getWidth() < minWidth) minWidth = size.getWidth(); |
+ if (size.getHeight() < minHeight) minHeight = size.getHeight(); |
+ if (size.getWidth() > maxWidth) maxWidth = size.getWidth(); |
+ if (size.getHeight() > maxHeight) maxHeight = size.getHeight(); |
+ } |
+ final int currentHeight = mCaptureFormat.getHeight(); |
+ final int currentWidth = mCaptureFormat.getWidth(); |
+ |
// The Min and Max zoom are returned as x100 by the API to avoid using floating point. There |
// is no min-zoom per se, so clamp it to always 100 (TODO(mcasas): make const member). |
final int minZoom = 100; |
final int maxZoom = Math.round(mMaxZoom * 100); |
- |
// Width Ratio x100 is used as measure of current zoom. |
final int currentZoom = 100 * mPreviewRequest.get(CaptureRequest.SCALER_CROP_REGION).width() |
/ cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE) |
@@ -577,7 +614,9 @@ public class VideoCaptureCamera2 extends VideoCapture { |
final boolean isFocusManual = (focusMode == CameraMetadata.CONTROL_AF_MODE_OFF) |
|| (focusMode == CameraMetadata.CONTROL_AF_MODE_EDOF); |
- return new PhotoCapabilities(maxZoom, minZoom, currentZoom, !isFocusManual); |
+ return new PhotoCapabilities(minIso, maxIso, currentIso, maxHeight, minHeight, |
+ currentHeight, maxWidth, minWidth, currentWidth, maxZoom, minZoom, currentZoom, |
+ !isFocusManual); |
} |
@Override |
@@ -606,12 +645,24 @@ public class VideoCaptureCamera2 extends VideoCapture { |
} |
@Override |
- public boolean takePhoto(final long callbackId) { |
+ public boolean takePhoto(final long callbackId, int width, int height) { |
Log.d(TAG, "takePhoto " + callbackId); |
if (mCameraDevice == null || mCameraState != CameraState.STARTED) return false; |
- final ImageReader imageReader = ImageReader.newInstance(mCaptureFormat.getWidth(), |
- mCaptureFormat.getHeight(), ImageFormat.JPEG, 1 /* maxImages */); |
+ final CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(mContext, mId); |
+ final StreamConfigurationMap streamMap = |
+ cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); |
+ final Size[] supportedSizes = streamMap.getOutputSizes(ImageFormat.JPEG); |
+ final Size closestSize = findClosestSizeInArray(supportedSizes, width, height); |
+ |
+ Log.d(TAG, "requested resolution: (%dx%d)", width, height); |
+ if (closestSize != null) { |
+ Log.d(TAG, " matched (%dx%d)", closestSize.getWidth(), closestSize.getHeight()); |
+ } |
+ final ImageReader imageReader = ImageReader.newInstance( |
+ (closestSize != null) ? closestSize.getWidth() : mCaptureFormat.getWidth(), |
+ (closestSize != null) ? closestSize.getHeight() : mCaptureFormat.getHeight(), |
+ ImageFormat.JPEG, 1 /* maxImages */); |
HandlerThread thread = new HandlerThread("CameraPicture"); |
thread.start(); |