1c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong/* 2c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * Copyright (C) 2014 The Android Open Source Project 3c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * 4c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * Licensed under the Apache License, Version 2.0 (the "License"); 5c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * you may not use this file except in compliance with the License. 6c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * You may obtain a copy of the License at 7c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * 8c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * http://www.apache.org/licenses/LICENSE-2.0 9c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * 10c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * Unless required by applicable law or agreed to in writing, software 11c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * distributed under the License is distributed on an "AS IS" BASIS, 12c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * See the License for the specific language governing permissions and 14c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * limitations under the License. 15c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong */ 16c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 17c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongpackage com.android.ex.camera2.portability; 18c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 19c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport android.hardware.Camera; 20c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 21c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport com.android.ex.camera2.portability.debug.Log; 22c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 23c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.Collections; 24c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.Comparator; 25c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kongimport java.util.List; 26c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 27c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong/** 28c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong * The subclass of {@link CameraCapabilities} for Android Camera 1 API. 29c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong */ 308097973089420749dcd1ab4974a629c2466b31ccAngus Kongclass AndroidCameraCapabilities extends CameraCapabilities { 31c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 32a0842b40441db5332a5290f941021636b1182761Sol Boucher private static Log.Tag TAG = new Log.Tag("AndCamCapabs"); 33c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 349d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher /** Conversion from ratios to percentages. */ 359d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher public static final float ZOOM_MULTIPLIER = 100f; 369d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher 37c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private FpsComparator mFpsComparator = new FpsComparator(); 38c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private SizeComparator mSizeComparator = new SizeComparator(); 39c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 40c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong AndroidCameraCapabilities(Camera.Parameters p) { 41a0842b40441db5332a5290f941021636b1182761Sol Boucher super(new Stringifier()); 42c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mMaxExposureCompensation = p.getMaxExposureCompensation(); 43c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mMinExposureCompensation = p.getMinExposureCompensation(); 44c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mExposureCompensationStep = p.getExposureCompensationStep(); 45c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mMaxNumOfFacesSupported = p.getMaxNumDetectedFaces(); 46c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mMaxNumOfMeteringArea = p.getMaxNumMeteringAreas(); 478097973089420749dcd1ab4974a629c2466b31ccAngus Kong mPreferredPreviewSizeForVideo = new Size(p.getPreferredPreviewSizeForVideo()); 48c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedPreviewFormats.addAll(p.getSupportedPreviewFormats()); 498097973089420749dcd1ab4974a629c2466b31ccAngus Kong mSupportedPhotoFormats.addAll(p.getSupportedPictureFormats()); 509d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher mMaxZoomRatio = p.getZoomRatios().get(p.getMaxZoom()) / ZOOM_MULTIPLIER; 5101e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong mHorizontalViewAngle = p.getHorizontalViewAngle(); 5201e7c02174ef268b6d6daaa5a5bb4f752d55964cAngus Kong mVerticalViewAngle = p.getVerticalViewAngle(); 53c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong buildPreviewFpsRange(p); 54c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong buildPreviewSizes(p); 55c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong buildVideoSizes(p); 56c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong buildPictureSizes(p); 57c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong buildSceneModes(p); 58c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong buildFlashModes(p); 59c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong buildFocusModes(p); 60c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong buildWhiteBalances(p); 61c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 62c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (p.isZoomSupported()) { 63c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFeatures.add(Feature.ZOOM); 64c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 65c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (p.isVideoSnapshotSupported()) { 66c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFeatures.add(Feature.VIDEO_SNAPSHOT); 67c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 68c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (p.isAutoExposureLockSupported()) { 69c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFeatures.add(Feature.AUTO_EXPOSURE_LOCK); 70c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 71c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (p.isAutoWhiteBalanceLockSupported()) { 72c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFeatures.add(Feature.AUTO_WHITE_BALANCE_LOCK); 73c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 74c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (supports(FocusMode.AUTO)) { 75c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mMaxNumOfFocusAreas = p.getMaxNumFocusAreas(); 76c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (mMaxNumOfFocusAreas > 0) { 77c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFeatures.add(Feature.FOCUS_AREA); 78c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 79c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 80c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (mMaxNumOfMeteringArea > 0) { 81c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFeatures.add(Feature.METERING_AREA); 82c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 83c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 84c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 85c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong AndroidCameraCapabilities(AndroidCameraCapabilities src) { 86c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong super(src); 87c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 88c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 89c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private void buildPreviewFpsRange(Camera.Parameters p) { 90c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong List<int[]> supportedPreviewFpsRange = p.getSupportedPreviewFpsRange(); 91c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (supportedPreviewFpsRange != null) { 92c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedPreviewFpsRange.addAll(supportedPreviewFpsRange); 93c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 94c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong Collections.sort(mSupportedPreviewFpsRange, mFpsComparator); 95c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 96c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 97c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private void buildPreviewSizes(Camera.Parameters p) { 98c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong List<Camera.Size> supportedPreviewSizes = p.getSupportedPreviewSizes(); 99c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (supportedPreviewSizes != null) { 100c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong for (Camera.Size s : supportedPreviewSizes) { 1018097973089420749dcd1ab4974a629c2466b31ccAngus Kong mSupportedPreviewSizes.add(new Size(s.width, s.height)); 102c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 103c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 104c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong Collections.sort(mSupportedPreviewSizes, mSizeComparator); 105c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 106c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 107c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private void buildVideoSizes(Camera.Parameters p) { 108c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong List<Camera.Size> supportedVideoSizes = p.getSupportedVideoSizes(); 109c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (supportedVideoSizes != null) { 110c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong for (Camera.Size s : supportedVideoSizes) { 1118097973089420749dcd1ab4974a629c2466b31ccAngus Kong mSupportedVideoSizes.add(new Size(s.width, s.height)); 112c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 113c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 114c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong Collections.sort(mSupportedVideoSizes, mSizeComparator); 115c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 116c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 117c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private void buildPictureSizes(Camera.Parameters p) { 118c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong List<Camera.Size> supportedPictureSizes = p.getSupportedPictureSizes(); 119c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (supportedPictureSizes != null) { 120c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong for (Camera.Size s : supportedPictureSizes) { 1218097973089420749dcd1ab4974a629c2466b31ccAngus Kong mSupportedPhotoSizes.add(new Size(s.width, s.height)); 122c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 123c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 1248097973089420749dcd1ab4974a629c2466b31ccAngus Kong Collections.sort(mSupportedPhotoSizes, mSizeComparator); 125c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 126c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 127c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 128c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private void buildSceneModes(Camera.Parameters p) { 129c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong List<String> supportedSceneModes = p.getSupportedSceneModes(); 130c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (supportedSceneModes != null) { 131c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong for (String scene : supportedSceneModes) { 132c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (Camera.Parameters.SCENE_MODE_AUTO.equals(scene)) { 133c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.AUTO); 134c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(scene)) { 135c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.ACTION); 136c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(scene)) { 137c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.BARCODE); 138c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(scene)) { 139c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.BEACH); 140c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(scene)) { 141c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.CANDLELIGHT); 142c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(scene)) { 143c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.FIREWORKS); 144c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_HDR.equals(scene)) { 145c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.HDR); 146c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(scene)) { 147c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.LANDSCAPE); 148c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(scene)) { 149c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.NIGHT); 150c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(scene)) { 151c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.NIGHT_PORTRAIT); 152c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(scene)) { 153c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.PARTY); 154c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(scene)) { 155c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.PORTRAIT); 156c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(scene)) { 157c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.SNOW); 158c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(scene)) { 159c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.SPORTS); 160c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(scene)) { 161c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.STEADYPHOTO); 162c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(scene)) { 163c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.SUNSET); 164c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(scene)) { 165c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedSceneModes.add(SceneMode.THEATRE); 166c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 167c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 168c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 169c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 170c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 171c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private void buildFlashModes(Camera.Parameters p) { 172c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong List<String> supportedFlashModes = p.getSupportedFlashModes(); 1738097973089420749dcd1ab4974a629c2466b31ccAngus Kong if (supportedFlashModes == null) { 1748097973089420749dcd1ab4974a629c2466b31ccAngus Kong // Camera 1 will return NULL if no flash mode is supported. 1758097973089420749dcd1ab4974a629c2466b31ccAngus Kong mSupportedFlashModes.add(FlashMode.NO_FLASH); 1768097973089420749dcd1ab4974a629c2466b31ccAngus Kong } else { 177c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong for (String flash : supportedFlashModes) { 178c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (Camera.Parameters.FLASH_MODE_AUTO.equals(flash)) { 179c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFlashModes.add(FlashMode.AUTO); 180c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FLASH_MODE_OFF.equals(flash)) { 181c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFlashModes.add(FlashMode.OFF); 182c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FLASH_MODE_ON.equals(flash)) { 183c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFlashModes.add(FlashMode.ON); 184c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(flash)) { 185c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFlashModes.add(FlashMode.RED_EYE); 18615773a64b42023e31e2aade23ae44273862a9c04Alan Newberger } else if (Camera.Parameters.FLASH_MODE_TORCH.equals(flash)) { 18715773a64b42023e31e2aade23ae44273862a9c04Alan Newberger mSupportedFlashModes.add(FlashMode.TORCH); 188c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 189c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 190c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 191c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 192c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 193c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private void buildFocusModes(Camera.Parameters p) { 194c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong List<String> supportedFocusModes = p.getSupportedFocusModes(); 195c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (supportedFocusModes != null) { 196c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong for (String focus : supportedFocusModes) { 197c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (Camera.Parameters.FOCUS_MODE_AUTO.equals(focus)) { 198c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFocusModes.add(FocusMode.AUTO); 199c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(focus)) { 200c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFocusModes.add(FocusMode.CONTINUOUS_PICTURE); 201c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(focus)) { 202c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFocusModes.add(FocusMode.CONTINUOUS_VIDEO); 203c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(focus)) { 204c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFocusModes.add(FocusMode.EXTENDED_DOF); 205c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(focus)) { 206c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFocusModes.add(FocusMode.FIXED); 207c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(focus)) { 208c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFocusModes.add(FocusMode.INFINITY); 209c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(focus)) { 210c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedFocusModes.add(FocusMode.MACRO); 211c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 212c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 213c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 214c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 215c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 216c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private void buildWhiteBalances(Camera.Parameters p) { 217c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong List<String> supportedWhiteBalances = p.getSupportedFocusModes(); 218c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (supportedWhiteBalances != null) { 219c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong for (String wb : supportedWhiteBalances) { 220c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(wb)) { 221c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedWhiteBalances.add(WhiteBalance.AUTO); 222c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(wb)) { 223c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedWhiteBalances.add(WhiteBalance.CLOUDY_DAYLIGHT); 224c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(wb)) { 225c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedWhiteBalances.add(WhiteBalance.DAYLIGHT); 226c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(wb)) { 227c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedWhiteBalances.add(WhiteBalance.FLUORESCENT); 228c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(wb)) { 229c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedWhiteBalances.add(WhiteBalance.INCANDESCENT); 230c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(wb)) { 231c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedWhiteBalances.add(WhiteBalance.SHADE); 232c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(wb)) { 233c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedWhiteBalances.add(WhiteBalance.TWILIGHT); 234c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(wb)) { 235c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong mSupportedWhiteBalances.add(WhiteBalance.WARM_FLUORESCENT); 236c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 237c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 238c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 239c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 240c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 241c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong private static class FpsComparator implements Comparator<int[]> { 242c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong @Override 243c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong public int compare(int[] fps1, int[] fps2) { 244c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong return (fps1[0] == fps2[0] ? fps1[1] - fps2[1] : fps1[0] - fps2[0]); 245c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 246c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 247c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 2488097973089420749dcd1ab4974a629c2466b31ccAngus Kong private static class SizeComparator implements Comparator<Size> { 249c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong 250c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong @Override 2518097973089420749dcd1ab4974a629c2466b31ccAngus Kong public int compare(Size size1, Size size2) { 2528097973089420749dcd1ab4974a629c2466b31ccAngus Kong return (size1.width() == size2.width() ? size1.height() - size2.height() : 2538097973089420749dcd1ab4974a629c2466b31ccAngus Kong size1.width() - size2.width()); 254c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 255c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong } 256c36e3c983c232dc45ed31f3d8e98d8cdd7ac14baAngus Kong} 257