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