/* * Copyright 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package androidx.camera.camera2.internal; import android.hardware.camera2.CameraCharacteristics; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.camera.core.impl.SurfaceCombination; import androidx.camera.core.impl.SurfaceConfig; import androidx.camera.core.impl.SurfaceConfig.ConfigSize; import androidx.camera.core.impl.SurfaceConfig.ConfigType; import java.util.ArrayList; import java.util.List; /** * Utility class for providing hardcoded sets of supported stream combinations based on the * hardware level and capabilities of the device. * *
 * @see 
 *     CameraDevice
 * 
*/ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java public final class GuaranteedConfigurationsUtil { private GuaranteedConfigurationsUtil() { } /** * Returns the at least supported stream combinations for legacy devices. */ @NonNull public static List getLegacySupportedCombinationList() { List combinationList = new ArrayList<>(); // (PRIV, MAXIMUM) SurfaceCombination surfaceCombination1 = new SurfaceCombination(); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination1); // (JPEG, MAXIMUM) SurfaceCombination surfaceCombination2 = new SurfaceCombination(); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination2); // (YUV, MAXIMUM) SurfaceCombination surfaceCombination3 = new SurfaceCombination(); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination3); // Below two combinations are all supported in the combination // (PRIV, PREVIEW) + (JPEG, MAXIMUM) SurfaceCombination surfaceCombination4 = new SurfaceCombination(); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination4); // (YUV, PREVIEW) + (JPEG, MAXIMUM) SurfaceCombination surfaceCombination5 = new SurfaceCombination(); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination5); // (PRIV, PREVIEW) + (PRIV, PREVIEW) SurfaceCombination surfaceCombination6 = new SurfaceCombination(); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); combinationList.add(surfaceCombination6); // (PRIV, PREVIEW) + (YUV, PREVIEW) SurfaceCombination surfaceCombination7 = new SurfaceCombination(); surfaceCombination7.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination7.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); combinationList.add(surfaceCombination7); // (PRIV, PREVIEW) + (PRIV, PREVIEW) + (JPEG, MAXIMUM) SurfaceCombination surfaceCombination8 = new SurfaceCombination(); surfaceCombination8.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination8.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination8.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination8); return combinationList; } /** * Returns the at least supported stream combinations for limited-level devices * in addition to those for legacy devices. */ @NonNull public static List getLimitedSupportedCombinationList() { List combinationList = new ArrayList<>(); // (PRIV, PREVIEW) + (PRIV, RECORD) SurfaceCombination surfaceCombination1 = new SurfaceCombination(); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.RECORD)); combinationList.add(surfaceCombination1); // (PRIV, PREVIEW) + (YUV, RECORD) SurfaceCombination surfaceCombination2 = new SurfaceCombination(); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.RECORD)); combinationList.add(surfaceCombination2); // (YUV, PREVIEW) + (YUV, RECORD) SurfaceCombination surfaceCombination3 = new SurfaceCombination(); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.RECORD)); combinationList.add(surfaceCombination3); // (PRIV, PREVIEW) + (PRIV, RECORD) + (JPEG, RECORD) SurfaceCombination surfaceCombination4 = new SurfaceCombination(); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.RECORD)); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.RECORD)); combinationList.add(surfaceCombination4); // (PRIV, PREVIEW) + (YUV, RECORD) + (JPEG, RECORD) SurfaceCombination surfaceCombination5 = new SurfaceCombination(); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.RECORD)); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.RECORD)); combinationList.add(surfaceCombination5); // (YUV, PREVIEW) + (YUV, PREVIEW) + (JPEG, MAXIMUM) SurfaceCombination surfaceCombination6 = new SurfaceCombination(); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination6); return combinationList; } /** * Returns the at least supported stream combinations for full-level devices * in addition to those for limited-level and legacy devices. */ @NonNull public static List getFullSupportedCombinationList() { List combinationList = new ArrayList<>(); // (PRIV, PREVIEW) + (PRIV, MAXIMUM) SurfaceCombination surfaceCombination1 = new SurfaceCombination(); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination1); // (PRIV, PREVIEW) + (YUV, MAXIMUM) SurfaceCombination surfaceCombination2 = new SurfaceCombination(); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination2); // (YUV, PREVIEW) + (YUV, MAXIMUM) SurfaceCombination surfaceCombination3 = new SurfaceCombination(); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination3); // (PRIV, PREVIEW) + (PRIV, PREVIEW) + (JPEG, MAXIMUM) SurfaceCombination surfaceCombination4 = new SurfaceCombination(); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination4); // (YUV, ANALYSIS) + (PRIV, PREVIEW) + (YUV, MAXIMUM) SurfaceCombination surfaceCombination5 = new SurfaceCombination(); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.VGA)); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination5); // (YUV, ANALYSIS) + (YUV, PREVIEW) + (YUV, MAXIMUM) SurfaceCombination surfaceCombination6 = new SurfaceCombination(); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.VGA)); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination6); return combinationList; } /** * Returns the at least supported stream combinations for RAW-capability devices * on both full and limited devices. */ @NonNull public static List getRAWSupportedCombinationList() { List combinationList = new ArrayList<>(); // (RAW, MAXIMUM) SurfaceCombination surfaceCombination1 = new SurfaceCombination(); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination1); // (PRIV, PREVIEW) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination2 = new SurfaceCombination(); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination2); // (YUV, PREVIEW) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination3 = new SurfaceCombination(); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination3); // (PRIV, PREVIEW) + (PRIV, PREVIEW) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination4 = new SurfaceCombination(); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination4.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination4); // (PRIV, PREVIEW) + (YUV, PREVIEW) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination5 = new SurfaceCombination(); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination5.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination5); // (YUV, PREVIEW) + (YUV, PREVIEW) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination6 = new SurfaceCombination(); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination6.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination6); // (PRIV, PREVIEW) + (JPEG, MAXIMUM) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination7 = new SurfaceCombination(); surfaceCombination7.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination7.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); surfaceCombination7.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination7); // (YUV, PREVIEW) + (JPEG, MAXIMUM) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination8 = new SurfaceCombination(); surfaceCombination8.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination8.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); surfaceCombination8.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination8); return combinationList; } /** * Returns the at least supported stream combinations for BURST-capability devices * in addition to those for limited device. Note that all FULL-level devices support the * BURST capability, and the below list is a strict subset of the list for FULL-level * devices, so this table is only relevant for LIMITED-level devices that support the * BURST_CAPTURE capability. */ @NonNull public static List getBurstSupportedCombinationList() { List combinationList = new ArrayList<>(); // (PRIV, PREVIEW) + (PRIV, MAXIMUM) SurfaceCombination surfaceCombination1 = new SurfaceCombination(); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination1); // (PRIV, PREVIEW) + (YUV, MAXIMUM) SurfaceCombination surfaceCombination2 = new SurfaceCombination(); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination2); // (YUV, PREVIEW) + (YUV, MAXIMUM) SurfaceCombination surfaceCombination3 = new SurfaceCombination(); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.PREVIEW)); surfaceCombination3.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination3); return combinationList; } /** * Returns the at least supported stream combinations for level-3 devices * in addition to tje combinations for full and for RAW capability. */ @NonNull public static List getLevel3SupportedCombinationList() { List combinationList = new ArrayList<>(); // (PRIV, PREVIEW) + (PRIV, ANALYSIS) + (YUV, MAXIMUM) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination1 = new SurfaceCombination(); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.VGA)); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.YUV, ConfigSize.MAXIMUM)); surfaceCombination1.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination1); // (PRIV, PREVIEW) + (PRIV, ANALYSIS) + (JPEG, MAXIMUM) + (RAW, MAXIMUM) SurfaceCombination surfaceCombination2 = new SurfaceCombination(); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.PREVIEW)); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.PRIV, ConfigSize.VGA)); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.JPEG, ConfigSize.MAXIMUM)); surfaceCombination2.addSurfaceConfig( SurfaceConfig.create(ConfigType.RAW, ConfigSize.MAXIMUM)); combinationList.add(surfaceCombination2); return combinationList; } /** * Returns the supported stream combinations based on the hardware level and capabilities of * the device. */ @NonNull public static List generateSupportedCombinationList(int hardwareLevel, boolean isRawSupported, boolean isBurstCaptureSupported) { List surfaceCombinations = new ArrayList<>(); surfaceCombinations.addAll(getLegacySupportedCombinationList()); if (hardwareLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED || hardwareLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL || hardwareLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3) { surfaceCombinations.addAll(getLimitedSupportedCombinationList()); } if (hardwareLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL || hardwareLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3) { surfaceCombinations.addAll(getFullSupportedCombinationList()); } if (isRawSupported) { surfaceCombinations.addAll(getRAWSupportedCombinationList()); } if (isBurstCaptureSupported && hardwareLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED) { surfaceCombinations.addAll(getBurstSupportedCombinationList()); } if (hardwareLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3) { surfaceCombinations.addAll(getLevel3SupportedCombinationList()); } return surfaceCombinations; } }