diff options
| author | Sean Owen <srowen@gmail.com> | 2014-05-01 02:03:35 +0400 |
|---|---|---|
| committer | Sean Owen <srowen@gmail.com> | 2014-05-01 02:03:35 +0400 |
| commit | 461d15a8908900772440ee2415f0afb5a17f08fc (patch) | |
| tree | d5a1b260a4ec5af087de85babda7d6de49a73b7d /android-core/src/main/java/com | |
| parent | 2209df1afa5aa7798d2a3dcc7f7e86fe2e514776 (diff) | |
| download | zxing-461d15a8908900772440ee2415f0afb5a17f08fc.tar.xz | |
Better zoom utility method, and FPS method that doesn't always pick the highest FPS, and that can be given a min/max FPS
Diffstat (limited to 'android-core/src/main/java/com')
| -rw-r--r-- | android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java | 63 |
1 files changed, 42 insertions, 21 deletions
diff --git a/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java b/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java index 4fd44f6cf..acdcf8aa4 100644 --- a/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java +++ b/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java @@ -43,6 +43,7 @@ public final class CameraConfigurationUtils { private static final float MIN_EXPOSURE_COMPENSATION = 0.0f; private static final double MAX_ASPECT_DISTORTION = 0.15; private static final int MIN_FPS = 10; + private static final int MAX_FPS = 20; private static final int AREA_PER_1000 = 400; private CameraConfigurationUtils() { @@ -129,33 +130,33 @@ public final class CameraConfigurationUtils { } public static void setBestPreviewFPS(Camera.Parameters parameters) { - setBestPreviewFPS(parameters, MIN_FPS); + setBestPreviewFPS(parameters, MIN_FPS, MAX_FPS); } - public static void setBestPreviewFPS(Camera.Parameters parameters, int minFPS) { + public static void setBestPreviewFPS(Camera.Parameters parameters, int minFPS, int maxFPS) { List<int[]> supportedPreviewFpsRanges = parameters.getSupportedPreviewFpsRange(); Log.i(TAG, "Supported FPS ranges: " + toString(supportedPreviewFpsRanges)); if (supportedPreviewFpsRanges != null && !supportedPreviewFpsRanges.isEmpty()) { - int[] minimumSuitableFpsRange = null; + int[] suitableFPSRange = null; for (int[] fpsRange : supportedPreviewFpsRanges) { - int fpsMax = fpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]; - if (fpsMax >= minFPS * 1000 && - (minimumSuitableFpsRange == null || - fpsMax > minimumSuitableFpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX])) { - minimumSuitableFpsRange = fpsRange; + int thisMin = fpsRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX]; + int thisMax = fpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]; + if (thisMin >= minFPS * 1000 && thisMax <= maxFPS * 1000) { + suitableFPSRange = fpsRange; + break; } } - if (minimumSuitableFpsRange == null) { + if (suitableFPSRange == null) { Log.i(TAG, "No suitable FPS range?"); } else { int[] currentFpsRange = new int[2]; parameters.getPreviewFpsRange(currentFpsRange); - if (Arrays.equals(currentFpsRange, minimumSuitableFpsRange)) { - Log.i(TAG, "FPS range already set to " + Arrays.toString(minimumSuitableFpsRange)); + if (Arrays.equals(currentFpsRange, suitableFPSRange)) { + Log.i(TAG, "FPS range already set to " + Arrays.toString(suitableFPSRange)); } else { - Log.i(TAG, "Setting FPS range to " + Arrays.toString(minimumSuitableFpsRange)); - parameters.setPreviewFpsRange(minimumSuitableFpsRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], - minimumSuitableFpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); + Log.i(TAG, "Setting FPS range to " + Arrays.toString(suitableFPSRange)); + parameters.setPreviewFpsRange(suitableFPSRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], + suitableFPSRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); } } } @@ -214,14 +215,12 @@ public final class CameraConfigurationUtils { } } - public static void setMaxZoom(Camera.Parameters parameters) { - int maxZoom = parameters.getMaxZoom(); - Log.i(TAG, "Setting zoom to max of " + maxZoom); - setZoom(parameters, maxZoom); - } - - public static void setZoom(Camera.Parameters parameters, int zoom) { + public static void setZoom(Camera.Parameters parameters, double targetZoomRatio) { if (parameters.isZoomSupported()) { + Integer zoom = indexOfClosestZoom(parameters, targetZoomRatio); + if (zoom == null) { + return; + } if (parameters.getZoom() == zoom) { Log.i(TAG, "Zoom is already set to " + zoom); } else { @@ -233,6 +232,28 @@ public final class CameraConfigurationUtils { } } + private static Integer indexOfClosestZoom(Camera.Parameters parameters, double targetZoomRatio) { + List<Integer> ratios = parameters.getZoomRatios(); + Log.i(TAG, "Zoom ratios: " + ratios); + int maxZoom = parameters.getMaxZoom(); + if (ratios == null || ratios.isEmpty() || ratios.size() != maxZoom + 1) { + Log.w(TAG, "Invalid zoom ratios!"); + return null; + } + double target100 = 100.0 * targetZoomRatio; + double smallestDiff = Double.POSITIVE_INFINITY; + int closestIndex = 0; + for (int i = 0; i < ratios.size(); i++) { + double diff = Math.abs(ratios.get(i) - target100); + if (diff < smallestDiff) { + smallestDiff = diff; + closestIndex = i; + } + } + Log.i(TAG, "Chose zoom ratio of " + (ratios.get(closestIndex) / 100.0)); + return closestIndex; + } + public static void setInvertColor(Camera.Parameters parameters) { if (Camera.Parameters.EFFECT_NEGATIVE.equals(parameters.getColorEffect())) { Log.i(TAG, "Negative effect already set"); |
