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