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 androidx.camera.extensions.impl.advanced.Camera2OutputConfigImpl;
20 import androidx.camera.extensions.impl.advanced.ImageReaderOutputConfigImpl;
21 import androidx.camera.extensions.impl.advanced.MultiResolutionImageReaderOutputConfigImpl;
22 import androidx.camera.extensions.impl.advanced.SurfaceOutputConfigImpl;
23 
24 import org.jspecify.annotations.NonNull;
25 
26 import java.util.ArrayList;
27 import java.util.List;
28 
29 /**
30  * For converting a {@link Camera2OutputConfigImpl} to a {@link Camera2OutputConfig}.
31  */
32 class Camera2OutputConfigConverter {
Camera2OutputConfigConverter()33     private Camera2OutputConfigConverter() {
34     }
35 
36     /**
37      * Create a {@link Camera2OutputConfig} from the {@link Camera2OutputConfigImpl}.
38      */
fromImpl(@onNull Camera2OutputConfigImpl impl)39     static @NonNull Camera2OutputConfig fromImpl(@NonNull Camera2OutputConfigImpl impl) {
40         List<Camera2OutputConfig> sharedOutputConfigs = new ArrayList<>();
41         if (impl.getSurfaceSharingOutputConfigs() != null) {
42             for (Camera2OutputConfigImpl surfaceSharingOutputConfig :
43                     impl.getSurfaceSharingOutputConfigs()) {
44                 Camera2OutputConfig sharedConfig = fromImpl(surfaceSharingOutputConfig);
45                 sharedOutputConfigs.add(sharedConfig);
46             }
47         }
48 
49         // Workaround to avoid the R8 issue (b/350689668)
50         // Force cast the input Camera2OutputConfigImpl instance to all possible types in sequence
51         // to know what is its real type.
52         try {
53             SurfaceOutputConfigImpl surfaceImpl = (SurfaceOutputConfigImpl) impl;
54             return SurfaceOutputConfig.create(
55                     surfaceImpl.getId(),
56                     surfaceImpl.getSurfaceGroupId(),
57                     surfaceImpl.getPhysicalCameraId(),
58                     sharedOutputConfigs,
59                     surfaceImpl.getSurface());
60         } catch (ClassCastException e) {
61             // Not type of SurfaceOutputConfigImpl! Go to try the next type.
62         }
63 
64         try {
65             ImageReaderOutputConfigImpl imageReaderImpl = (ImageReaderOutputConfigImpl) impl;
66             return ImageReaderOutputConfig.create(
67                     imageReaderImpl.getId(),
68                     imageReaderImpl.getSurfaceGroupId(),
69                     imageReaderImpl.getPhysicalCameraId(),
70                     sharedOutputConfigs,
71                     imageReaderImpl.getSize(),
72                     imageReaderImpl.getImageFormat(),
73                     imageReaderImpl.getMaxImages());
74         } catch (ClassCastException e) {
75             // Not type of ImageReaderOutputConfigImpl! Go to try the next type.
76         }
77 
78         try {
79             MultiResolutionImageReaderOutputConfigImpl multiResolutionImageReaderImpl =
80                     (MultiResolutionImageReaderOutputConfigImpl) impl;
81             return MultiResolutionImageReaderOutputConfig.create(
82                     multiResolutionImageReaderImpl.getId(),
83                     multiResolutionImageReaderImpl.getSurfaceGroupId(),
84                     multiResolutionImageReaderImpl.getPhysicalCameraId(),
85                     sharedOutputConfigs,
86                     multiResolutionImageReaderImpl.getImageFormat(),
87                     multiResolutionImageReaderImpl.getMaxImages());
88         } catch (ClassCastException e) {
89             // Not type of MultiResolutionImageReaderOutputConfigImpl!
90         }
91 
92         throw new IllegalArgumentException(
93                 "Not supported Camera2OutputConfigImpl: " + impl.getClass());
94     }
95 }
96