diff options
| author | 2022-05-24 22:20:42 +0000 | |
|---|---|---|
| committer | 2022-05-24 22:20:42 +0000 | |
| commit | f25e9aec2adb610e15e2b3b235b3debc8ff708c6 (patch) | |
| tree | 59327d4cd22accb3c2d7f42754e556f52fdf18c0 | |
| parent | 27a45d8ec3003009c0fdee717310a7d9c858e9d0 (diff) | |
| parent | c7f3fa192076b72139c794724eda0588182f9ce5 (diff) | |
Merge "Camera: Pass shared outputs during advanced extension configuration" into tm-dev
3 files changed, 83 insertions, 81 deletions
diff --git a/core/java/android/hardware/camera2/extension/CameraOutputConfig.aidl b/core/java/android/hardware/camera2/extension/CameraOutputConfig.aidl index a61bb3304c12..34d016adbc06 100644 --- a/core/java/android/hardware/camera2/extension/CameraOutputConfig.aidl +++ b/core/java/android/hardware/camera2/extension/CameraOutputConfig.aidl @@ -15,8 +15,8 @@ */ package android.hardware.camera2.extension; -import android.hardware.camera2.extension.Size; import android.hardware.camera2.extension.OutputConfigId; +import android.hardware.camera2.extension.Size; import android.view.Surface; /** @hide */ @@ -35,5 +35,5 @@ parcelable CameraOutputConfig OutputConfigId outputId; int surfaceGroupId; String physicalCameraId; - List<OutputConfigId> surfaceSharingOutputConfigs; + List<CameraOutputConfig> sharedSurfaceConfigs; } diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java index 5503e2834d98..c8dc2d0b0b91 100644 --- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java @@ -217,60 +217,30 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes CameraSessionConfig sessionConfig = mSessionProcessor.initSession(mCameraDevice.getId(), previewSurface, captureSurface); List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs; - // map camera output ids to output configurations - HashMap<Integer, OutputConfiguration> cameraOutputs = new HashMap<>(); - for (CameraOutputConfig output : outputConfigs) { - OutputConfiguration cameraOutput = null; - switch(output.type) { - case CameraOutputConfig.TYPE_SURFACE: - if (output.surface == null) { - Log.w(TAG, "Unsupported client output id: " + output.outputId.id + - ", skipping!"); - continue; - } - cameraOutput = new OutputConfiguration(output.surfaceGroupId, - output.surface); - break; - case CameraOutputConfig.TYPE_IMAGEREADER: - if ((output.imageFormat == ImageFormat.UNKNOWN) || (output.size.width <= 0) || - (output.size.height <= 0)) { - Log.w(TAG, "Unsupported client output id: " + output.outputId.id + - ", skipping!"); - continue; - } - ImageReader reader = ImageReader.newInstance(output.size.width, - output.size.height, output.imageFormat, output.capacity); - mReaderMap.put(output.outputId.id, reader); - cameraOutput = new OutputConfiguration(output.surfaceGroupId, - reader.getSurface()); - break; - case CameraOutputConfig.TYPE_MULTIRES_IMAGEREADER: - // Support for multi-resolution outputs to be added in future releases - default: - throw new IllegalArgumentException("Unsupported output config type: " + - output.type); - } - cameraOutput.setPhysicalCameraId(output.physicalCameraId); - cameraOutputs.put(output.outputId.id, cameraOutput); - } - ArrayList<OutputConfiguration> outputList = new ArrayList<>(); for (CameraOutputConfig output : outputConfigs) { - if (!cameraOutputs.containsKey(output.outputId.id)) { - // Shared surface already removed by a previous iteration + Surface outputSurface = initializeSurfrace(output); + if (outputSurface == null) { continue; } - OutputConfiguration outConfig = cameraOutputs.get(output.outputId.id); - if ((output.surfaceSharingOutputConfigs != null) && - !output.surfaceSharingOutputConfigs.isEmpty()) { - outConfig.enableSurfaceSharing(); - for (OutputConfigId outputId : output.surfaceSharingOutputConfigs) { - outConfig.addSurface(cameraOutputs.get(outputId.id).getSurface()); - cameraOutputs.remove(outputId.id); + OutputConfiguration cameraOutput = new OutputConfiguration(output.surfaceGroupId, + outputSurface); + + if ((output.sharedSurfaceConfigs != null) && !output.sharedSurfaceConfigs.isEmpty()) { + cameraOutput.enableSurfaceSharing(); + for (CameraOutputConfig sharedOutputConfig : output.sharedSurfaceConfigs) { + Surface sharedSurface = initializeSurfrace(sharedOutputConfig); + if (sharedSurface == null) { + continue; + } + cameraOutput.addSurface(sharedSurface); + mCameraConfigMap.put(sharedSurface, sharedOutputConfig); } } - outputList.add(outConfig); - mCameraConfigMap.put(outConfig.getSurface(), output); + + cameraOutput.setPhysicalCameraId(output.physicalCameraId); + outputList.add(cameraOutput); + mCameraConfigMap.put(cameraOutput.getSurface(), output); } SessionConfiguration sessionConfiguration = new SessionConfiguration( @@ -995,4 +965,32 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes CameraMetadataNative.update(ret.getNativeMetadata(), request.parameters); return ret; } + + private Surface initializeSurfrace(CameraOutputConfig output) { + switch(output.type) { + case CameraOutputConfig.TYPE_SURFACE: + if (output.surface == null) { + Log.w(TAG, "Unsupported client output id: " + output.outputId.id + + ", skipping!"); + return null; + } + return output.surface; + case CameraOutputConfig.TYPE_IMAGEREADER: + if ((output.imageFormat == ImageFormat.UNKNOWN) || (output.size.width <= 0) || + (output.size.height <= 0)) { + Log.w(TAG, "Unsupported client output id: " + output.outputId.id + + ", skipping!"); + return null; + } + ImageReader reader = ImageReader.newInstance(output.size.width, + output.size.height, output.imageFormat, output.capacity); + mReaderMap.put(output.outputId.id, reader); + return reader.getSurface(); + case CameraOutputConfig.TYPE_MULTIRES_IMAGEREADER: + // Support for multi-resolution outputs to be added in future releases + default: + throw new IllegalArgumentException("Unsupported output config type: " + + output.type); + } + } } diff --git a/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java b/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java index e27b7a659ae6..09a05bb6b40e 100644 --- a/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java +++ b/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java @@ -1135,41 +1135,13 @@ public class CameraExtensionsProxyService extends Service { CameraSessionConfig ret = new CameraSessionConfig(); ret.outputConfigs = new ArrayList<>(); for (Camera2OutputConfigImpl output : outputConfigs) { - CameraOutputConfig entry = new CameraOutputConfig(); - entry.outputId = new OutputConfigId(); - entry.outputId.id = output.getId(); - entry.physicalCameraId = output.getPhysicalCameraId(); - entry.surfaceGroupId = output.getSurfaceGroupId(); - if (output instanceof SurfaceOutputConfigImpl) { - SurfaceOutputConfigImpl surfaceConfig = (SurfaceOutputConfigImpl) output; - entry.type = CameraOutputConfig.TYPE_SURFACE; - entry.surface = surfaceConfig.getSurface(); - } else if (output instanceof ImageReaderOutputConfigImpl) { - ImageReaderOutputConfigImpl imageReaderOutputConfig = - (ImageReaderOutputConfigImpl) output; - entry.type = CameraOutputConfig.TYPE_IMAGEREADER; - entry.size = new android.hardware.camera2.extension.Size(); - entry.size.width = imageReaderOutputConfig.getSize().getWidth(); - entry.size.height = imageReaderOutputConfig.getSize().getHeight(); - entry.imageFormat = imageReaderOutputConfig.getImageFormat(); - entry.capacity = imageReaderOutputConfig.getMaxImages(); - } else if (output instanceof MultiResolutionImageReaderOutputConfigImpl) { - MultiResolutionImageReaderOutputConfigImpl multiResReaderConfig = - (MultiResolutionImageReaderOutputConfigImpl) output; - entry.type = CameraOutputConfig.TYPE_MULTIRES_IMAGEREADER; - entry.imageFormat = multiResReaderConfig.getImageFormat(); - entry.capacity = multiResReaderConfig.getMaxImages(); - } else { - throw new IllegalStateException("Unknown output config type!"); - } + CameraOutputConfig entry = getCameraOutputConfig(output); List<Camera2OutputConfigImpl> sharedOutputs = output.getSurfaceSharingOutputConfigs(); if ((sharedOutputs != null) && (!sharedOutputs.isEmpty())) { - entry.surfaceSharingOutputConfigs = new ArrayList<>(); + entry.sharedSurfaceConfigs = new ArrayList<>(); for (Camera2OutputConfigImpl sharedOutput : sharedOutputs) { - OutputConfigId outputId = new OutputConfigId(); - outputId.id = sharedOutput.getId(); - entry.surfaceSharingOutputConfigs.add(outputId); + entry.sharedSurfaceConfigs.add(getCameraOutputConfig(sharedOutput)); } } ret.outputConfigs.add(entry); @@ -1854,4 +1826,36 @@ public class CameraExtensionsProxyService extends Service { } } } + + private static CameraOutputConfig getCameraOutputConfig(Camera2OutputConfigImpl output) { + CameraOutputConfig ret = new CameraOutputConfig(); + ret.outputId = new OutputConfigId(); + ret.outputId.id = output.getId(); + ret.physicalCameraId = output.getPhysicalCameraId(); + ret.surfaceGroupId = output.getSurfaceGroupId(); + if (output instanceof SurfaceOutputConfigImpl) { + SurfaceOutputConfigImpl surfaceConfig = (SurfaceOutputConfigImpl) output; + ret.type = CameraOutputConfig.TYPE_SURFACE; + ret.surface = surfaceConfig.getSurface(); + } else if (output instanceof ImageReaderOutputConfigImpl) { + ImageReaderOutputConfigImpl imageReaderOutputConfig = + (ImageReaderOutputConfigImpl) output; + ret.type = CameraOutputConfig.TYPE_IMAGEREADER; + ret.size = new android.hardware.camera2.extension.Size(); + ret.size.width = imageReaderOutputConfig.getSize().getWidth(); + ret.size.height = imageReaderOutputConfig.getSize().getHeight(); + ret.imageFormat = imageReaderOutputConfig.getImageFormat(); + ret.capacity = imageReaderOutputConfig.getMaxImages(); + } else if (output instanceof MultiResolutionImageReaderOutputConfigImpl) { + MultiResolutionImageReaderOutputConfigImpl multiResReaderConfig = + (MultiResolutionImageReaderOutputConfigImpl) output; + ret.type = CameraOutputConfig.TYPE_MULTIRES_IMAGEREADER; + ret.imageFormat = multiResReaderConfig.getImageFormat(); + ret.capacity = multiResReaderConfig.getMaxImages(); + } else { + throw new IllegalStateException("Unknown output config type!"); + } + + return ret; + } } |