1 /* 2 * Copyright (C) 2023 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 17 package android.hardware.camera2.extension; 18 19 import android.annotation.FlaggedApi; 20 import android.annotation.NonNull; 21 import android.annotation.Nullable; 22 import android.annotation.SystemApi; 23 import android.hardware.camera2.params.DynamicRangeProfiles; 24 25 import com.android.internal.camera.flags.Flags; 26 27 import java.util.ArrayList; 28 import java.util.List; 29 30 /** 31 * Helper class used to describe a single camera 32 * output configuration that is intended to be configured 33 * internally by the extension implementation. 34 * 35 * @hide 36 */ 37 @SystemApi 38 public class ExtensionOutputConfiguration { 39 private final List<CameraOutputSurface> mSurfaces; 40 private final String mPhysicalCameraId; 41 private final int mOutputConfigId; 42 private final int mSurfaceGroupId; 43 44 /** 45 * Initialize an extension output configuration instance 46 * 47 * @param outputs List of camera {@link CameraOutputSurface outputs}. 48 * The list may include more than one entry 49 * only in case of shared camera outputs. 50 * In all other cases the list will only include 51 * a single entry. 52 * @param outputConfigId Unique output configuration id used to identify 53 * this particular configuration. 54 * @param physicalCameraId In case of physical camera capture, this field 55 * must contain a valid physical camera id. 56 * @param surfaceGroupId In case of surface group, this field must 57 * contain the surface group id 58 */ ExtensionOutputConfiguration(@onNull List<CameraOutputSurface> outputs, int outputConfigId, @Nullable String physicalCameraId, int surfaceGroupId)59 public ExtensionOutputConfiguration(@NonNull List<CameraOutputSurface> outputs, 60 int outputConfigId, @Nullable String physicalCameraId, int surfaceGroupId) { 61 mSurfaces = outputs; 62 mPhysicalCameraId = physicalCameraId; 63 mOutputConfigId = outputConfigId; 64 mSurfaceGroupId = surfaceGroupId; 65 } 66 initializeOutputConfig(@onNull CameraOutputConfig config, @NonNull CameraOutputSurface surface)67 private void initializeOutputConfig(@NonNull CameraOutputConfig config, 68 @NonNull CameraOutputSurface surface) { 69 config.surface = surface.getSurface(); 70 if (surface.getSize() != null) { 71 config.size = new Size(); 72 config.size.width = surface.getSize().getWidth(); 73 config.size.height = surface.getSize().getHeight(); 74 } 75 config.imageFormat = surface.getImageFormat(); 76 config.type = CameraOutputConfig.TYPE_SURFACE; 77 config.physicalCameraId = mPhysicalCameraId; 78 config.outputId = new OutputConfigId(); 79 config.outputId.id = mOutputConfigId; 80 config.surfaceGroupId = mSurfaceGroupId; 81 config.dynamicRangeProfile = surface.getDynamicRangeProfile(); 82 } 83 getOutputConfig()84 @Nullable CameraOutputConfig getOutputConfig() { 85 if (mSurfaces.isEmpty()) { 86 return null; 87 } 88 89 CameraOutputConfig ret = new CameraOutputConfig(); 90 initializeOutputConfig(ret, mSurfaces.get(0)); 91 if (mSurfaces.size() > 1) { 92 ret.sharedSurfaceConfigs = new ArrayList<>(mSurfaces.size() - 1); 93 for (int i = 1; i < mSurfaces.size(); i++) { 94 CameraOutputConfig sharedConfig = new CameraOutputConfig(); 95 initializeOutputConfig(sharedConfig, mSurfaces.get(i)); 96 ret.sharedSurfaceConfigs.add(sharedConfig); 97 } 98 } 99 100 return ret; 101 } 102 } 103