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