AndroidCameraCapabilities.java revision 8097973089420749dcd1ab4974a629c2466b31cc
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.ex.camera2.portability; 18 19import android.hardware.Camera; 20 21import com.android.ex.camera2.portability.debug.Log; 22 23import java.util.Collections; 24import java.util.Comparator; 25import java.util.List; 26 27/** 28 * The subclass of {@link CameraCapabilities} for Android Camera 1 API. 29 */ 30class AndroidCameraCapabilities extends CameraCapabilities { 31 32 private static Log.Tag TAG = new Log.Tag("AndroidCameraCapabilities"); 33 34 private FpsComparator mFpsComparator = new FpsComparator(); 35 private SizeComparator mSizeComparator = new SizeComparator(); 36 37 AndroidCameraCapabilities(Camera.Parameters p) { 38 super(new AndroidCameraCapabilityStringifier()); 39 mMaxExposureCompensation = p.getMaxExposureCompensation(); 40 mMinExposureCompensation = p.getMinExposureCompensation(); 41 mExposureCompensationStep = p.getExposureCompensationStep(); 42 mMaxNumOfFacesSupported = p.getMaxNumDetectedFaces(); 43 mMaxNumOfMeteringArea = p.getMaxNumMeteringAreas(); 44 mPreferredPreviewSizeForVideo = new Size(p.getPreferredPreviewSizeForVideo()); 45 mSupportedPreviewFormats.addAll(p.getSupportedPreviewFormats()); 46 mSupportedPhotoFormats.addAll(p.getSupportedPictureFormats()); 47 mMaxZoomIndex = p.getMaxZoom(); 48 mZoomRatioList.addAll(p.getZoomRatios()); 49 mMaxZoomRatio = mZoomRatioList.get(mMaxZoomIndex); 50 buildPreviewFpsRange(p); 51 buildPreviewSizes(p); 52 buildVideoSizes(p); 53 buildPictureSizes(p); 54 buildSceneModes(p); 55 buildFlashModes(p); 56 buildFocusModes(p); 57 buildWhiteBalances(p); 58 59 if (p.isZoomSupported()) { 60 mSupportedFeatures.add(Feature.ZOOM); 61 } 62 if (p.isVideoSnapshotSupported()) { 63 mSupportedFeatures.add(Feature.VIDEO_SNAPSHOT); 64 } 65 if (p.isAutoExposureLockSupported()) { 66 mSupportedFeatures.add(Feature.AUTO_EXPOSURE_LOCK); 67 } 68 if (p.isAutoWhiteBalanceLockSupported()) { 69 mSupportedFeatures.add(Feature.AUTO_WHITE_BALANCE_LOCK); 70 } 71 if (supports(FocusMode.AUTO)) { 72 mMaxNumOfFocusAreas = p.getMaxNumFocusAreas(); 73 if (mMaxNumOfFocusAreas > 0) { 74 mSupportedFeatures.add(Feature.FOCUS_AREA); 75 } 76 } 77 if (mMaxNumOfMeteringArea > 0) { 78 mSupportedFeatures.add(Feature.METERING_AREA); 79 } 80 } 81 82 AndroidCameraCapabilities(AndroidCameraCapabilities src) { 83 super(src); 84 } 85 86 private void buildPreviewFpsRange(Camera.Parameters p) { 87 List<int[]> supportedPreviewFpsRange = p.getSupportedPreviewFpsRange(); 88 if (supportedPreviewFpsRange != null) { 89 mSupportedPreviewFpsRange.addAll(supportedPreviewFpsRange); 90 } 91 Collections.sort(mSupportedPreviewFpsRange, mFpsComparator); 92 } 93 94 private void buildPreviewSizes(Camera.Parameters p) { 95 List<Camera.Size> supportedPreviewSizes = p.getSupportedPreviewSizes(); 96 if (supportedPreviewSizes != null) { 97 for (Camera.Size s : supportedPreviewSizes) { 98 mSupportedPreviewSizes.add(new Size(s.width, s.height)); 99 } 100 } 101 Collections.sort(mSupportedPreviewSizes, mSizeComparator); 102 } 103 104 private void buildVideoSizes(Camera.Parameters p) { 105 List<Camera.Size> supportedVideoSizes = p.getSupportedVideoSizes(); 106 if (supportedVideoSizes != null) { 107 for (Camera.Size s : supportedVideoSizes) { 108 mSupportedVideoSizes.add(new Size(s.width, s.height)); 109 } 110 } 111 Collections.sort(mSupportedVideoSizes, mSizeComparator); 112 } 113 114 private void buildPictureSizes(Camera.Parameters p) { 115 List<Camera.Size> supportedPictureSizes = p.getSupportedPictureSizes(); 116 if (supportedPictureSizes != null) { 117 for (Camera.Size s : supportedPictureSizes) { 118 mSupportedPhotoSizes.add(new Size(s.width, s.height)); 119 } 120 } 121 Collections.sort(mSupportedPhotoSizes, mSizeComparator); 122 123 } 124 125 private void buildSceneModes(Camera.Parameters p) { 126 List<String> supportedSceneModes = p.getSupportedSceneModes(); 127 if (supportedSceneModes != null) { 128 for (String scene : supportedSceneModes) { 129 if (Camera.Parameters.SCENE_MODE_AUTO.equals(scene)) { 130 mSupportedSceneModes.add(SceneMode.AUTO); 131 } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(scene)) { 132 mSupportedSceneModes.add(SceneMode.ACTION); 133 } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(scene)) { 134 mSupportedSceneModes.add(SceneMode.BARCODE); 135 } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(scene)) { 136 mSupportedSceneModes.add(SceneMode.BEACH); 137 } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(scene)) { 138 mSupportedSceneModes.add(SceneMode.CANDLELIGHT); 139 } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(scene)) { 140 mSupportedSceneModes.add(SceneMode.FIREWORKS); 141 } else if (Camera.Parameters.SCENE_MODE_HDR.equals(scene)) { 142 mSupportedSceneModes.add(SceneMode.HDR); 143 } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(scene)) { 144 mSupportedSceneModes.add(SceneMode.LANDSCAPE); 145 } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(scene)) { 146 mSupportedSceneModes.add(SceneMode.NIGHT); 147 } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(scene)) { 148 mSupportedSceneModes.add(SceneMode.NIGHT_PORTRAIT); 149 } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(scene)) { 150 mSupportedSceneModes.add(SceneMode.PARTY); 151 } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(scene)) { 152 mSupportedSceneModes.add(SceneMode.PORTRAIT); 153 } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(scene)) { 154 mSupportedSceneModes.add(SceneMode.SNOW); 155 } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(scene)) { 156 mSupportedSceneModes.add(SceneMode.SPORTS); 157 } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(scene)) { 158 mSupportedSceneModes.add(SceneMode.STEADYPHOTO); 159 } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(scene)) { 160 mSupportedSceneModes.add(SceneMode.SUNSET); 161 } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(scene)) { 162 mSupportedSceneModes.add(SceneMode.THEATRE); 163 } 164 } 165 } 166 } 167 168 private void buildFlashModes(Camera.Parameters p) { 169 List<String> supportedFlashModes = p.getSupportedFlashModes(); 170 if (supportedFlashModes == null) { 171 // Camera 1 will return NULL if no flash mode is supported. 172 mSupportedFlashModes.add(FlashMode.NO_FLASH); 173 } else { 174 for (String flash : supportedFlashModes) { 175 if (Camera.Parameters.FLASH_MODE_AUTO.equals(flash)) { 176 mSupportedFlashModes.add(FlashMode.AUTO); 177 } else if (Camera.Parameters.FLASH_MODE_OFF.equals(flash)) { 178 mSupportedFlashModes.add(FlashMode.OFF); 179 } else if (Camera.Parameters.FLASH_MODE_ON.equals(flash)) { 180 mSupportedFlashModes.add(FlashMode.ON); 181 } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(flash)) { 182 mSupportedFlashModes.add(FlashMode.RED_EYE); 183 } 184 } 185 } 186 } 187 188 private void buildFocusModes(Camera.Parameters p) { 189 List<String> supportedFocusModes = p.getSupportedFocusModes(); 190 if (supportedFocusModes != null) { 191 for (String focus : supportedFocusModes) { 192 if (Camera.Parameters.FOCUS_MODE_AUTO.equals(focus)) { 193 mSupportedFocusModes.add(FocusMode.AUTO); 194 } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(focus)) { 195 mSupportedFocusModes.add(FocusMode.CONTINUOUS_PICTURE); 196 } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(focus)) { 197 mSupportedFocusModes.add(FocusMode.CONTINUOUS_VIDEO); 198 } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(focus)) { 199 mSupportedFocusModes.add(FocusMode.EXTENDED_DOF); 200 } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(focus)) { 201 mSupportedFocusModes.add(FocusMode.FIXED); 202 } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(focus)) { 203 mSupportedFocusModes.add(FocusMode.INFINITY); 204 } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(focus)) { 205 mSupportedFocusModes.add(FocusMode.MACRO); 206 } 207 } 208 } 209 } 210 211 private void buildWhiteBalances(Camera.Parameters p) { 212 List<String> supportedWhiteBalances = p.getSupportedFocusModes(); 213 if (supportedWhiteBalances != null) { 214 for (String wb : supportedWhiteBalances) { 215 if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(wb)) { 216 mSupportedWhiteBalances.add(WhiteBalance.AUTO); 217 } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(wb)) { 218 mSupportedWhiteBalances.add(WhiteBalance.CLOUDY_DAYLIGHT); 219 } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(wb)) { 220 mSupportedWhiteBalances.add(WhiteBalance.DAYLIGHT); 221 } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(wb)) { 222 mSupportedWhiteBalances.add(WhiteBalance.FLUORESCENT); 223 } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(wb)) { 224 mSupportedWhiteBalances.add(WhiteBalance.INCANDESCENT); 225 } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(wb)) { 226 mSupportedWhiteBalances.add(WhiteBalance.SHADE); 227 } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(wb)) { 228 mSupportedWhiteBalances.add(WhiteBalance.TWILIGHT); 229 } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(wb)) { 230 mSupportedWhiteBalances.add(WhiteBalance.WARM_FLUORESCENT); 231 } 232 } 233 } 234 } 235 236 private static class FpsComparator implements Comparator<int[]> { 237 @Override 238 public int compare(int[] fps1, int[] fps2) { 239 return (fps1[0] == fps2[0] ? fps1[1] - fps2[1] : fps1[0] - fps2[0]); 240 } 241 } 242 243 private static class SizeComparator implements Comparator<Size> { 244 245 @Override 246 public int compare(Size size1, Size size2) { 247 return (size1.width() == size2.width() ? size1.height() - size2.height() : 248 size1.width() - size2.width()); 249 } 250 } 251 252 private static class AndroidCameraCapabilityStringifier implements Stringifier { 253 254 @Override 255 public String stringify(FocusMode focus) { 256 if (focus == null) { 257 return null; 258 } 259 260 switch (focus) { 261 case AUTO: 262 return Camera.Parameters.FOCUS_MODE_AUTO; 263 case CONTINUOUS_PICTURE: 264 return Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE; 265 case CONTINUOUS_VIDEO: 266 return Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO; 267 case EXTENDED_DOF: 268 return Camera.Parameters.FOCUS_MODE_EDOF; 269 case FIXED: 270 return Camera.Parameters.FOCUS_MODE_FIXED; 271 case INFINITY: 272 return Camera.Parameters.FOCUS_MODE_INFINITY; 273 case MACRO: 274 return Camera.Parameters.FOCUS_MODE_MACRO; 275 } 276 return null; 277 } 278 279 @Override 280 public FocusMode focusModeFromString(String val) { 281 if (val == null) { 282 return null; 283 } 284 285 if (Camera.Parameters.FOCUS_MODE_AUTO.equals(val)) { 286 return FocusMode.AUTO; 287 } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(val)) { 288 return FocusMode.CONTINUOUS_PICTURE; 289 } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(val)) { 290 return FocusMode.CONTINUOUS_VIDEO; 291 } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(val)) { 292 return FocusMode.EXTENDED_DOF; 293 } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(val)) { 294 return FocusMode.FIXED; 295 } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(val)) { 296 return FocusMode.INFINITY; 297 } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(val)) { 298 return FocusMode.MACRO; 299 } else { 300 return null; 301 } 302 } 303 304 @Override 305 public String stringify(FlashMode flash) { 306 if (flash == null) { 307 return null; 308 } 309 310 switch (flash) { 311 case NO_FLASH: 312 return null; 313 case AUTO: 314 return Camera.Parameters.FLASH_MODE_AUTO; 315 case OFF: 316 return Camera.Parameters.FLASH_MODE_OFF; 317 case ON: 318 return Camera.Parameters.FLASH_MODE_ON; 319 case TORCH: 320 return Camera.Parameters.FLASH_MODE_TORCH; 321 case RED_EYE: 322 return Camera.Parameters.FLASH_MODE_RED_EYE; 323 } 324 return null; 325 } 326 327 @Override 328 public FlashMode flashModeFromString(String val) { 329 if (val == null) { 330 return FlashMode.NO_FLASH; 331 } else if (Camera.Parameters.FLASH_MODE_AUTO.equals(val)) { 332 return FlashMode.AUTO; 333 } else if (Camera.Parameters.FLASH_MODE_OFF.equals(val)) { 334 return FlashMode.OFF; 335 } else if (Camera.Parameters.FLASH_MODE_ON.equals(val)) { 336 return FlashMode.ON; 337 } else if (Camera.Parameters.FLASH_MODE_TORCH.equals(val)) { 338 return FlashMode.TORCH; 339 } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(val)) { 340 return FlashMode.RED_EYE; 341 } else { 342 return null; 343 } 344 } 345 346 @Override 347 public String stringify(SceneMode scene) { 348 if (scene == null) { 349 return null; 350 } 351 352 switch (scene) { 353 case AUTO: 354 return Camera.Parameters.SCENE_MODE_AUTO; 355 case ACTION: 356 return Camera.Parameters.SCENE_MODE_ACTION; 357 case BARCODE: 358 return Camera.Parameters.SCENE_MODE_BARCODE; 359 case BEACH: 360 return Camera.Parameters.SCENE_MODE_BEACH; 361 case CANDLELIGHT: 362 return Camera.Parameters.SCENE_MODE_CANDLELIGHT; 363 case FIREWORKS: 364 return Camera.Parameters.SCENE_MODE_FIREWORKS; 365 case HDR: 366 return Camera.Parameters.SCENE_MODE_HDR; 367 case LANDSCAPE: 368 return Camera.Parameters.SCENE_MODE_LANDSCAPE; 369 case NIGHT: 370 return Camera.Parameters.SCENE_MODE_NIGHT; 371 case NIGHT_PORTRAIT: 372 return Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT; 373 case PARTY: 374 return Camera.Parameters.SCENE_MODE_PARTY; 375 case PORTRAIT: 376 return Camera.Parameters.SCENE_MODE_PORTRAIT; 377 case SNOW: 378 return Camera.Parameters.SCENE_MODE_SNOW; 379 case SPORTS: 380 return Camera.Parameters.SCENE_MODE_SPORTS; 381 case STEADYPHOTO: 382 return Camera.Parameters.SCENE_MODE_STEADYPHOTO; 383 case SUNSET: 384 return Camera.Parameters.SCENE_MODE_SUNSET; 385 case THEATRE: 386 return Camera.Parameters.SCENE_MODE_THEATRE; 387 } 388 return null; 389 } 390 391 @Override 392 public SceneMode sceneModeFromString(String val) { 393 if (val == null) { 394 return SceneMode.NO_SCENE_MODE; 395 } else if (Camera.Parameters.SCENE_MODE_AUTO.equals(val)) { 396 return SceneMode.AUTO; 397 } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(val)) { 398 return SceneMode.ACTION; 399 } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(val)) { 400 return SceneMode.BARCODE; 401 } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(val)) { 402 return SceneMode.BEACH; 403 } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(val)) { 404 return SceneMode.CANDLELIGHT; 405 } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(val)) { 406 return SceneMode.FIREWORKS; 407 } else if (Camera.Parameters.SCENE_MODE_HDR.equals(val)) { 408 return SceneMode.HDR; 409 } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(val)) { 410 return SceneMode.LANDSCAPE; 411 } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(val)) { 412 return SceneMode.NIGHT; 413 } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(val)) { 414 return SceneMode.NIGHT_PORTRAIT; 415 } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(val)) { 416 return SceneMode.PARTY; 417 } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(val)) { 418 return SceneMode.PORTRAIT; 419 } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(val)) { 420 return SceneMode.SNOW; 421 } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(val)) { 422 return SceneMode.SPORTS; 423 } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(val)) { 424 return SceneMode.STEADYPHOTO; 425 } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(val)) { 426 return SceneMode.SUNSET; 427 } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(val)) { 428 return SceneMode.THEATRE; 429 } else { 430 return null; 431 } 432 } 433 434 @Override 435 public String stringify(WhiteBalance wb) { 436 if (wb == null) { 437 return null; 438 } 439 440 switch (wb) { 441 case AUTO: 442 return Camera.Parameters.WHITE_BALANCE_AUTO; 443 case CLOUDY_DAYLIGHT: 444 return Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT; 445 case DAYLIGHT: 446 return Camera.Parameters.WHITE_BALANCE_DAYLIGHT; 447 case FLUORESCENT: 448 return Camera.Parameters.WHITE_BALANCE_FLUORESCENT; 449 case INCANDESCENT: 450 return Camera.Parameters.WHITE_BALANCE_INCANDESCENT; 451 case SHADE: 452 return Camera.Parameters.WHITE_BALANCE_SHADE; 453 case TWILIGHT: 454 return Camera.Parameters.WHITE_BALANCE_TWILIGHT; 455 case WARM_FLUORESCENT: 456 return Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT; 457 } 458 return null; 459 } 460 461 @Override 462 public WhiteBalance whiteBalanceFromString(String val) { 463 if (val == null) { 464 return null; 465 } 466 467 if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(val)) { 468 return WhiteBalance.AUTO; 469 } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(val)) { 470 return WhiteBalance.CLOUDY_DAYLIGHT; 471 } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(val)) { 472 return WhiteBalance.DAYLIGHT; 473 } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(val)) { 474 return WhiteBalance.FLUORESCENT; 475 } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(val)) { 476 return WhiteBalance.INCANDESCENT; 477 } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(val)) { 478 return WhiteBalance.SHADE; 479 } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(val)) { 480 return WhiteBalance.TWILIGHT; 481 } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(val)) { 482 return WhiteBalance.WARM_FLUORESCENT; 483 } else { 484 return null; 485 } 486 } 487 } 488} 489