1 /* 2 * Copyright 2019 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 androidx.camera.camera2.internal; 18 19 import android.util.Size; 20 21 import androidx.annotation.OptIn; 22 import androidx.camera.camera2.impl.Camera2ImplConfig; 23 import androidx.camera.camera2.internal.compat.params.OutputConfigurationCompat; 24 import androidx.camera.camera2.internal.compat.workaround.PreviewPixelHDRnet; 25 import androidx.camera.camera2.interop.ExperimentalCamera2Interop; 26 import androidx.camera.core.impl.Config; 27 import androidx.camera.core.impl.MutableOptionsBundle; 28 import androidx.camera.core.impl.OptionsBundle; 29 import androidx.camera.core.impl.PreviewConfig; 30 import androidx.camera.core.impl.SessionConfig; 31 import androidx.camera.core.impl.UseCaseConfig; 32 33 import org.jspecify.annotations.NonNull; 34 35 /** 36 * A {@link SessionConfig.OptionUnpacker} implementation for unpacking Camera2 options into a 37 * {@link SessionConfig.Builder}. 38 */ 39 final class Camera2SessionOptionUnpacker implements SessionConfig.OptionUnpacker { 40 41 static final Camera2SessionOptionUnpacker INSTANCE = new Camera2SessionOptionUnpacker(); 42 43 @OptIn(markerClass = ExperimentalCamera2Interop.class) 44 @Override unpack( @onNull Size resolution, @NonNull UseCaseConfig<?> config, final SessionConfig.@NonNull Builder builder)45 public void unpack( 46 @NonNull Size resolution, 47 @NonNull UseCaseConfig<?> config, 48 final SessionConfig.@NonNull Builder builder) { 49 SessionConfig defaultSessionConfig = 50 config.getDefaultSessionConfig(/*valueIfMissing=*/ null); 51 52 Config implOptions = OptionsBundle.emptyBundle(); 53 int templateType = SessionConfig.defaultEmptySessionConfig().getTemplateType(); 54 55 // Apply/extract defaults from session config 56 if (defaultSessionConfig != null) { 57 templateType = defaultSessionConfig.getTemplateType(); 58 builder.addAllDeviceStateCallbacks(defaultSessionConfig.getDeviceStateCallbacks()); 59 builder.addAllSessionStateCallbacks(defaultSessionConfig.getSessionStateCallbacks()); 60 builder.addAllRepeatingCameraCaptureCallbacks( 61 defaultSessionConfig.getRepeatingCameraCaptureCallbacks()); 62 implOptions = defaultSessionConfig.getImplementationOptions(); 63 } 64 65 // Set the any additional implementation options 66 builder.setImplementationOptions(implOptions); 67 68 // Apply quirks 69 if (config instanceof PreviewConfig) { 70 PreviewPixelHDRnet.setHDRnet(resolution, builder); 71 } 72 73 // Get Camera2 extended options 74 final Camera2ImplConfig camera2Config = new Camera2ImplConfig(config); 75 76 // Apply template type 77 builder.setTemplateType(camera2Config.getCaptureRequestTemplate(templateType)); 78 79 // Add extension callbacks 80 builder.addDeviceStateCallback( 81 camera2Config.getDeviceStateCallback( 82 CameraDeviceStateCallbacks.createNoOpCallback())); 83 builder.addSessionStateCallback( 84 camera2Config.getSessionStateCallback( 85 CameraCaptureSessionStateCallbacks.createNoOpCallback())); 86 builder.addCameraCaptureCallback( 87 CaptureCallbackContainer.create( 88 camera2Config.getSessionCaptureCallback( 89 Camera2CaptureCallbacks.createNoOpCallback()))); 90 91 // Set video stabilization mode 92 builder.setVideoStabilization(config.getVideoStabilizationMode()); 93 builder.setPreviewStabilization(config.getPreviewStabilizationMode()); 94 95 // Copy extended Camera2 configurations 96 MutableOptionsBundle extendedConfig = MutableOptionsBundle.create(); 97 extendedConfig.insertOption(Camera2ImplConfig.SESSION_PHYSICAL_CAMERA_ID_OPTION, 98 camera2Config.getPhysicalCameraId(null)); 99 extendedConfig.insertOption(Camera2ImplConfig.STREAM_USE_CASE_OPTION, 100 camera2Config.getStreamUseCase(OutputConfigurationCompat.STREAM_USE_CASE_NONE)); 101 builder.addImplementationOptions(extendedConfig); 102 103 // Copy extension keys 104 builder.addImplementationOptions(camera2Config.getCaptureRequestOptions()); 105 } 106 } 107