18f51086c8177056345de996963515c4bd3415254Sascha Haeberling/* 28f51086c8177056345de996963515c4bd3415254Sascha Haeberling * Copyright (C) 2015 The Android Open Source Project 38f51086c8177056345de996963515c4bd3415254Sascha Haeberling * 48f51086c8177056345de996963515c4bd3415254Sascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License"); 58f51086c8177056345de996963515c4bd3415254Sascha Haeberling * you may not use this file except in compliance with the License. 68f51086c8177056345de996963515c4bd3415254Sascha Haeberling * You may obtain a copy of the License at 78f51086c8177056345de996963515c4bd3415254Sascha Haeberling * 88f51086c8177056345de996963515c4bd3415254Sascha Haeberling * http://www.apache.org/licenses/LICENSE-2.0 98f51086c8177056345de996963515c4bd3415254Sascha Haeberling * 108f51086c8177056345de996963515c4bd3415254Sascha Haeberling * Unless required by applicable law or agreed to in writing, software 118f51086c8177056345de996963515c4bd3415254Sascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS, 128f51086c8177056345de996963515c4bd3415254Sascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f51086c8177056345de996963515c4bd3415254Sascha Haeberling * See the License for the specific language governing permissions and 148f51086c8177056345de996963515c4bd3415254Sascha Haeberling * limitations under the License. 158f51086c8177056345de996963515c4bd3415254Sascha Haeberling */ 168f51086c8177056345de996963515c4bd3415254Sascha Haeberling 178f51086c8177056345de996963515c4bd3415254Sascha Haeberlingpackage com.android.camera.one.config; 188f51086c8177056345de996963515c4bd3415254Sascha Haeberling 198f51086c8177056345de996963515c4bd3415254Sascha Haeberlingimport android.annotation.TargetApi; 208f51086c8177056345de996963515c4bd3415254Sascha Haeberlingimport android.hardware.camera2.CameraCharacteristics; 218f51086c8177056345de996963515c4bd3415254Sascha Haeberlingimport android.os.Build; 228f51086c8177056345de996963515c4bd3415254Sascha Haeberling 238f51086c8177056345de996963515c4bd3415254Sascha Haeberlingimport com.google.common.base.Function; 248f51086c8177056345de996963515c4bd3415254Sascha Haeberlingimport com.google.common.base.Optional; 258f51086c8177056345de996963515c4bd3415254Sascha Haeberling 2646aac2cd824dceb30afebf1c8da955e4fa55ac5cSenpo Huimport com.android.camera.one.OneCamera; 2746aac2cd824dceb30afebf1c8da955e4fa55ac5cSenpo Hu 288f51086c8177056345de996963515c4bd3415254Sascha Haeberling/** 298f51086c8177056345de996963515c4bd3415254Sascha Haeberling * Contains the logic for which Camera API and features should be enabled on the 308f51086c8177056345de996963515c4bd3415254Sascha Haeberling * current device. 318f51086c8177056345de996963515c4bd3415254Sascha Haeberling */ 328f51086c8177056345de996963515c4bd3415254Sascha Haeberling@TargetApi(Build.VERSION_CODES.LOLLIPOP) 338f51086c8177056345de996963515c4bd3415254Sascha Haeberlingpublic class OneCameraFeatureConfig { 348f51086c8177056345de996963515c4bd3415254Sascha Haeberling 358f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** The camera API 2 support levels for capture module. */ 368f51086c8177056345de996963515c4bd3415254Sascha Haeberling public static enum CaptureSupportLevel { 378f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** 388f51086c8177056345de996963515c4bd3415254Sascha Haeberling * Our app maintains a YUV ringbuffer on FULL devices that support it. 398f51086c8177056345de996963515c4bd3415254Sascha Haeberling * App-level JPEG compression. (Option 1). 408f51086c8177056345de996963515c4bd3415254Sascha Haeberling */ 418f51086c8177056345de996963515c4bd3415254Sascha Haeberling ZSL, 428f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** This mode is required on LEGACY devices. (Option 2). */ 438f51086c8177056345de996963515c4bd3415254Sascha Haeberling LEGACY_JPEG, 448f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** Requests JPEG on LIMITED or FULL devices. (Option 3). */ 458f51086c8177056345de996963515c4bd3415254Sascha Haeberling LIMITED_JPEG, 468f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** 478f51086c8177056345de996963515c4bd3415254Sascha Haeberling * Requests YUV images on LIMITED or FULL with app-level JPEG 488f51086c8177056345de996963515c4bd3415254Sascha Haeberling * compression. (Option 4). 498f51086c8177056345de996963515c4bd3415254Sascha Haeberling */ 508f51086c8177056345de996963515c4bd3415254Sascha Haeberling LIMITED_YUV; 518f51086c8177056345de996963515c4bd3415254Sascha Haeberling 528f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** Given the GServices override flag, returns the support level. */ 538f51086c8177056345de996963515c4bd3415254Sascha Haeberling public static Optional<CaptureSupportLevel> fromFlag(int flag) { 548f51086c8177056345de996963515c4bd3415254Sascha Haeberling switch (flag) { 558f51086c8177056345de996963515c4bd3415254Sascha Haeberling case 1: 568f51086c8177056345de996963515c4bd3415254Sascha Haeberling return Optional.of(ZSL); 578f51086c8177056345de996963515c4bd3415254Sascha Haeberling case 2: 588f51086c8177056345de996963515c4bd3415254Sascha Haeberling return Optional.of(LEGACY_JPEG); 598f51086c8177056345de996963515c4bd3415254Sascha Haeberling case 3: 608f51086c8177056345de996963515c4bd3415254Sascha Haeberling return Optional.of(LIMITED_JPEG); 618f51086c8177056345de996963515c4bd3415254Sascha Haeberling case 4: 628f51086c8177056345de996963515c4bd3415254Sascha Haeberling return Optional.of(LIMITED_YUV); 638f51086c8177056345de996963515c4bd3415254Sascha Haeberling default: 648f51086c8177056345de996963515c4bd3415254Sascha Haeberling return Optional.absent(); 658f51086c8177056345de996963515c4bd3415254Sascha Haeberling } 668f51086c8177056345de996963515c4bd3415254Sascha Haeberling } 678f51086c8177056345de996963515c4bd3415254Sascha Haeberling } 688f51086c8177056345de996963515c4bd3415254Sascha Haeberling 698f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** The HDR+ support levels. */ 708f51086c8177056345de996963515c4bd3415254Sascha Haeberling public static enum HdrPlusSupportLevel { 718f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** No HDR+ supported. */ 728f51086c8177056345de996963515c4bd3415254Sascha Haeberling NONE, 738f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** Nexus 5 on KitKat using Camera shim. */ 748f51086c8177056345de996963515c4bd3415254Sascha Haeberling LEGACY, 758f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** Full API 2 HDR+ support. */ 768f51086c8177056345de996963515c4bd3415254Sascha Haeberling FULL 778f51086c8177056345de996963515c4bd3415254Sascha Haeberling } 788f51086c8177056345de996963515c4bd3415254Sascha Haeberling 798f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** Whether the capture module should be used (instead of PhotoModule). */ 808f51086c8177056345de996963515c4bd3415254Sascha Haeberling private final boolean mUseCaptureModule; 818f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** Determines the mode for regular capture on this device. */ 828f51086c8177056345de996963515c4bd3415254Sascha Haeberling private final Function<CameraCharacteristics, CaptureSupportLevel> mCaptureModeDetector; 838f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** The level of HDR+ support. */ 848f51086c8177056345de996963515c4bd3415254Sascha Haeberling private final HdrPlusSupportLevel mHdrPlusSupportLevel; 85a166b882d74c9c8d638479b79517c99448865e99Senpo Hu /** 86a166b882d74c9c8d638479b79517c99448865e99Senpo Hu * The maximum amount of memory can be consumed by all opened cameras 87a166b882d74c9c8d638479b79517c99448865e99Senpo Hu * during capture and processing, in megabytes. 88a166b882d74c9c8d638479b79517c99448865e99Senpo Hu */ 89a166b882d74c9c8d638479b79517c99448865e99Senpo Hu private final int mMaxMemoryMB; 90a166b882d74c9c8d638479b79517c99448865e99Senpo Hu 91a166b882d74c9c8d638479b79517c99448865e99Senpo Hu /** 92a166b882d74c9c8d638479b79517c99448865e99Senpo Hu * The maximum number of images the camera should allocate in the image reader. 93a166b882d74c9c8d638479b79517c99448865e99Senpo Hu */ 94a166b882d74c9c8d638479b79517c99448865e99Senpo Hu private final int mMaxAllowedImageReaderCount; 958f51086c8177056345de996963515c4bd3415254Sascha Haeberling 968f51086c8177056345de996963515c4bd3415254Sascha Haeberling OneCameraFeatureConfig(boolean useCaptureModule, 978f51086c8177056345de996963515c4bd3415254Sascha Haeberling Function<CameraCharacteristics, CaptureSupportLevel> captureModeDetector, 98a166b882d74c9c8d638479b79517c99448865e99Senpo Hu HdrPlusSupportLevel hdrPlusSupportLevel, 99a166b882d74c9c8d638479b79517c99448865e99Senpo Hu int maxMemoryMB, 100a166b882d74c9c8d638479b79517c99448865e99Senpo Hu int maxAllowedImageReaderCount) { 1018f51086c8177056345de996963515c4bd3415254Sascha Haeberling mUseCaptureModule = useCaptureModule; 1028f51086c8177056345de996963515c4bd3415254Sascha Haeberling mCaptureModeDetector = captureModeDetector; 1038f51086c8177056345de996963515c4bd3415254Sascha Haeberling mHdrPlusSupportLevel = hdrPlusSupportLevel; 104a166b882d74c9c8d638479b79517c99448865e99Senpo Hu mMaxMemoryMB = maxMemoryMB; 105a166b882d74c9c8d638479b79517c99448865e99Senpo Hu mMaxAllowedImageReaderCount = maxAllowedImageReaderCount; 1068f51086c8177056345de996963515c4bd3415254Sascha Haeberling } 1078f51086c8177056345de996963515c4bd3415254Sascha Haeberling 1088f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** 1098f51086c8177056345de996963515c4bd3415254Sascha Haeberling * @return Whether CaptureModule should be used for photo capture. 1108f51086c8177056345de996963515c4bd3415254Sascha Haeberling */ 1118f51086c8177056345de996963515c4bd3415254Sascha Haeberling public boolean isUsingCaptureModule() { 1128f51086c8177056345de996963515c4bd3415254Sascha Haeberling return mUseCaptureModule; 1138f51086c8177056345de996963515c4bd3415254Sascha Haeberling } 1148f51086c8177056345de996963515c4bd3415254Sascha Haeberling 1158f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** 1168f51086c8177056345de996963515c4bd3415254Sascha Haeberling * @param characteristics the characteristics of the camera. 1178f51086c8177056345de996963515c4bd3415254Sascha Haeberling * @return Whether the camera with the given characteristics supports 1188f51086c8177056345de996963515c4bd3415254Sascha Haeberling * app-level ZSL. 1198f51086c8177056345de996963515c4bd3415254Sascha Haeberling */ 1208f51086c8177056345de996963515c4bd3415254Sascha Haeberling public CaptureSupportLevel getCaptureSupportLevel(CameraCharacteristics characteristics) { 1218f51086c8177056345de996963515c4bd3415254Sascha Haeberling return mCaptureModeDetector.apply(characteristics); 1228f51086c8177056345de996963515c4bd3415254Sascha Haeberling } 1238f51086c8177056345de996963515c4bd3415254Sascha Haeberling 1248f51086c8177056345de996963515c4bd3415254Sascha Haeberling /** 1258f51086c8177056345de996963515c4bd3415254Sascha Haeberling * @return The general support level for HDR+ on this device. 1268f51086c8177056345de996963515c4bd3415254Sascha Haeberling */ 12746aac2cd824dceb30afebf1c8da955e4fa55ac5cSenpo Hu public HdrPlusSupportLevel getHdrPlusSupportLevel(OneCamera.Facing cameraFacing) { 12846aac2cd824dceb30afebf1c8da955e4fa55ac5cSenpo Hu if (cameraFacing == OneCamera.Facing.FRONT) { 12946aac2cd824dceb30afebf1c8da955e4fa55ac5cSenpo Hu return HdrPlusSupportLevel.NONE; 13046aac2cd824dceb30afebf1c8da955e4fa55ac5cSenpo Hu } 1318f51086c8177056345de996963515c4bd3415254Sascha Haeberling return mHdrPlusSupportLevel; 1328f51086c8177056345de996963515c4bd3415254Sascha Haeberling } 133a166b882d74c9c8d638479b79517c99448865e99Senpo Hu 134a166b882d74c9c8d638479b79517c99448865e99Senpo Hu /** 135a166b882d74c9c8d638479b79517c99448865e99Senpo Hu * @return The maximum amount of memory can be consumed by all opened 136a166b882d74c9c8d638479b79517c99448865e99Senpo Hu * cameras during capture and processing, in megabytes. 137a166b882d74c9c8d638479b79517c99448865e99Senpo Hu */ 138a166b882d74c9c8d638479b79517c99448865e99Senpo Hu public int getMaxMemoryMB() { 139a166b882d74c9c8d638479b79517c99448865e99Senpo Hu return mMaxMemoryMB; 140a166b882d74c9c8d638479b79517c99448865e99Senpo Hu } 141a166b882d74c9c8d638479b79517c99448865e99Senpo Hu 142a166b882d74c9c8d638479b79517c99448865e99Senpo Hu /** 143a166b882d74c9c8d638479b79517c99448865e99Senpo Hu * @return The maximum number of images the camera should allocate in the 144a166b882d74c9c8d638479b79517c99448865e99Senpo Hu * image reader. 145a166b882d74c9c8d638479b79517c99448865e99Senpo Hu */ 146a166b882d74c9c8d638479b79517c99448865e99Senpo Hu public int getMaxAllowedImageReaderCount() { 147a166b882d74c9c8d638479b79517c99448865e99Senpo Hu return mMaxAllowedImageReaderCount; 148a166b882d74c9c8d638479b79517c99448865e99Senpo Hu } 1498f51086c8177056345de996963515c4bd3415254Sascha Haeberling} 150