/*
* 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.
*
* <pre>
* @see <a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice">
* CameraDevice</a>
* </pre>
*/
@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<SurfaceCombination> getLegacySupportedCombinationList() {
List<SurfaceCombination> 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<SurfaceCombination> getLimitedSupportedCombinationList() {
List<SurfaceCombination> 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<SurfaceCombination> getFullSupportedCombinationList() {
List<SurfaceCombination> 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<SurfaceCombination> getRAWSupportedCombinationList() {
List<SurfaceCombination> 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<SurfaceCombination> getBurstSupportedCombinationList() {
List<SurfaceCombination> 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<SurfaceCombination> getLevel3SupportedCombinationList() {
List<SurfaceCombination> 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<SurfaceCombination> generateSupportedCombinationList(int hardwareLevel,
boolean isRawSupported, boolean isBurstCaptureSupported) {
List<SurfaceCombination> 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;
}
}