1 /*
2  * Copyright 2022 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.extensions.internal.sessionprocessor;
18 
19 import android.hardware.camera2.CameraDevice;
20 import android.hardware.camera2.CaptureRequest;
21 
22 import androidx.camera.core.impl.Config;
23 import androidx.camera.core.impl.RequestProcessor;
24 import androidx.camera.extensions.internal.RequestOptionConfig;
25 
26 import org.jspecify.annotations.NonNull;
27 
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32 
33 /**
34  * A builder for building {@link androidx.camera.core.impl.RequestProcessor.Request}.
35  */
36 class RequestBuilder {
37     private List<Integer> mTargetOutputConfigIds = new ArrayList<>();
38     private Map<CaptureRequest.Key<?>, Object> mParameters = new HashMap<>();
39     private int mTemplateId = CameraDevice.TEMPLATE_PREVIEW;
40     int mCaptureStageId;
41 
RequestBuilder()42     RequestBuilder() {
43     }
44 
addTargetOutputConfigIds(int targetOutputConfigId)45     @NonNull RequestBuilder addTargetOutputConfigIds(int targetOutputConfigId) {
46         mTargetOutputConfigIds.add(targetOutputConfigId);
47         return this;
48     }
49 
setParameters(CaptureRequest.@onNull Key<?> key, @NonNull Object value)50     @NonNull RequestBuilder setParameters(CaptureRequest.@NonNull Key<?> key,
51             @NonNull Object value) {
52         mParameters.put(key, value);
53         return this;
54     }
55 
setTemplateId(int templateId)56     @NonNull RequestBuilder setTemplateId(int templateId) {
57         mTemplateId = templateId;
58         return this;
59     }
60 
setCaptureStageId(int captureStageId)61     public @NonNull RequestBuilder setCaptureStageId(int captureStageId) {
62         mCaptureStageId = captureStageId;
63         return this;
64     }
65 
build()66     RequestProcessor.@NonNull Request build() {
67         return new RequestProcessorRequest(
68                 mTargetOutputConfigIds, mParameters, mTemplateId, mCaptureStageId);
69     }
70 
71     static class RequestProcessorRequest implements RequestProcessor.Request {
72         final List<Integer> mTargetOutputConfigIds;
73         final Config mParameterConfig;
74         final int mTemplateId;
75         final int mCaptureStageId;
76 
RequestProcessorRequest(List<Integer> targetOutputConfigIds, Map<CaptureRequest.Key<?>, Object> parameters, int templateId, int captureStageId)77         RequestProcessorRequest(List<Integer> targetOutputConfigIds,
78                 Map<CaptureRequest.Key<?>, Object> parameters,
79                 int templateId,
80                 int captureStageId) {
81             mTargetOutputConfigIds = targetOutputConfigIds;
82             mTemplateId = templateId;
83             mCaptureStageId = captureStageId;
84 
85             RequestOptionConfig.Builder requestOptionBuilder = new RequestOptionConfig.Builder();
86             for (CaptureRequest.Key<?> key : parameters.keySet()) {
87                 @SuppressWarnings("unchecked")
88                 CaptureRequest.Key<Object> objKey = (CaptureRequest.Key<Object>) key;
89                 requestOptionBuilder.setCaptureRequestOption(objKey,
90                         parameters.get(objKey));
91             }
92             mParameterConfig = requestOptionBuilder.build();
93         }
94 
95         @Override
getTargetOutputConfigIds()96         public @NonNull List<Integer> getTargetOutputConfigIds() {
97             return mTargetOutputConfigIds;
98         }
99 
100         @Override
getParameters()101         public @NonNull Config getParameters() {
102             return mParameterConfig;
103         }
104 
105         @Override
getTemplateId()106         public int getTemplateId() {
107             return mTemplateId;
108         }
109 
getCaptureStageId()110         public int getCaptureStageId() {
111             return mCaptureStageId;
112         }
113     }
114 }
115