Loading core/java/android/hardware/camera2/extension/CameraOutputConfig.aidl +2 −2 Original line number Original line Diff line number Diff line Loading @@ -15,8 +15,8 @@ */ */ package android.hardware.camera2.extension; package android.hardware.camera2.extension; import android.hardware.camera2.extension.Size; import android.hardware.camera2.extension.OutputConfigId; import android.hardware.camera2.extension.OutputConfigId; import android.hardware.camera2.extension.Size; import android.view.Surface; import android.view.Surface; /** @hide */ /** @hide */ Loading @@ -35,5 +35,5 @@ parcelable CameraOutputConfig OutputConfigId outputId; OutputConfigId outputId; int surfaceGroupId; int surfaceGroupId; String physicalCameraId; String physicalCameraId; List<OutputConfigId> surfaceSharingOutputConfigs; List<CameraOutputConfig> sharedSurfaceConfigs; } } core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java +46 −48 Original line number Original line Diff line number Diff line Loading @@ -217,60 +217,30 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes CameraSessionConfig sessionConfig = mSessionProcessor.initSession(mCameraDevice.getId(), CameraSessionConfig sessionConfig = mSessionProcessor.initSession(mCameraDevice.getId(), previewSurface, captureSurface); previewSurface, captureSurface); List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs; List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs; // map camera output ids to output configurations ArrayList<OutputConfiguration> outputList = new ArrayList<>(); HashMap<Integer, OutputConfiguration> cameraOutputs = new HashMap<>(); for (CameraOutputConfig output : outputConfigs) { for (CameraOutputConfig output : outputConfigs) { OutputConfiguration cameraOutput = null; Surface outputSurface = initializeSurfrace(output); switch(output.type) { if (outputSurface == null) { 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; continue; } } ImageReader reader = ImageReader.newInstance(output.size.width, OutputConfiguration cameraOutput = new OutputConfiguration(output.surfaceGroupId, output.size.height, output.imageFormat, output.capacity); outputSurface); 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<>(); if ((output.sharedSurfaceConfigs != null) && !output.sharedSurfaceConfigs.isEmpty()) { for (CameraOutputConfig output : outputConfigs) { cameraOutput.enableSurfaceSharing(); if (!cameraOutputs.containsKey(output.outputId.id)) { for (CameraOutputConfig sharedOutputConfig : output.sharedSurfaceConfigs) { // Shared surface already removed by a previous iteration Surface sharedSurface = initializeSurfrace(sharedOutputConfig); if (sharedSurface == null) { continue; continue; } } OutputConfiguration outConfig = cameraOutputs.get(output.outputId.id); cameraOutput.addSurface(sharedSurface); if ((output.surfaceSharingOutputConfigs != null) && mCameraConfigMap.put(sharedSurface, sharedOutputConfig); !output.surfaceSharingOutputConfigs.isEmpty()) { outConfig.enableSurfaceSharing(); for (OutputConfigId outputId : output.surfaceSharingOutputConfigs) { outConfig.addSurface(cameraOutputs.get(outputId.id).getSurface()); cameraOutputs.remove(outputId.id); } } } } outputList.add(outConfig); mCameraConfigMap.put(outConfig.getSurface(), output); cameraOutput.setPhysicalCameraId(output.physicalCameraId); outputList.add(cameraOutput); mCameraConfigMap.put(cameraOutput.getSurface(), output); } } SessionConfiguration sessionConfiguration = new SessionConfiguration( SessionConfiguration sessionConfiguration = new SessionConfiguration( Loading Loading @@ -995,4 +965,32 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes CameraMetadataNative.update(ret.getNativeMetadata(), request.parameters); CameraMetadataNative.update(ret.getNativeMetadata(), request.parameters); return ret; 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); } } } } packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java +35 −31 Original line number Original line Diff line number Diff line Loading @@ -1135,41 +1135,13 @@ public class CameraExtensionsProxyService extends Service { CameraSessionConfig ret = new CameraSessionConfig(); CameraSessionConfig ret = new CameraSessionConfig(); ret.outputConfigs = new ArrayList<>(); ret.outputConfigs = new ArrayList<>(); for (Camera2OutputConfigImpl output : outputConfigs) { for (Camera2OutputConfigImpl output : outputConfigs) { CameraOutputConfig entry = new CameraOutputConfig(); CameraOutputConfig entry = getCameraOutputConfig(output); 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!"); } List<Camera2OutputConfigImpl> sharedOutputs = List<Camera2OutputConfigImpl> sharedOutputs = output.getSurfaceSharingOutputConfigs(); output.getSurfaceSharingOutputConfigs(); if ((sharedOutputs != null) && (!sharedOutputs.isEmpty())) { if ((sharedOutputs != null) && (!sharedOutputs.isEmpty())) { entry.surfaceSharingOutputConfigs = new ArrayList<>(); entry.sharedSurfaceConfigs = new ArrayList<>(); for (Camera2OutputConfigImpl sharedOutput : sharedOutputs) { for (Camera2OutputConfigImpl sharedOutput : sharedOutputs) { OutputConfigId outputId = new OutputConfigId(); entry.sharedSurfaceConfigs.add(getCameraOutputConfig(sharedOutput)); outputId.id = sharedOutput.getId(); entry.surfaceSharingOutputConfigs.add(outputId); } } } } ret.outputConfigs.add(entry); ret.outputConfigs.add(entry); Loading Loading @@ -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; } } } Loading
core/java/android/hardware/camera2/extension/CameraOutputConfig.aidl +2 −2 Original line number Original line Diff line number Diff line Loading @@ -15,8 +15,8 @@ */ */ package android.hardware.camera2.extension; package android.hardware.camera2.extension; import android.hardware.camera2.extension.Size; import android.hardware.camera2.extension.OutputConfigId; import android.hardware.camera2.extension.OutputConfigId; import android.hardware.camera2.extension.Size; import android.view.Surface; import android.view.Surface; /** @hide */ /** @hide */ Loading @@ -35,5 +35,5 @@ parcelable CameraOutputConfig OutputConfigId outputId; OutputConfigId outputId; int surfaceGroupId; int surfaceGroupId; String physicalCameraId; String physicalCameraId; List<OutputConfigId> surfaceSharingOutputConfigs; List<CameraOutputConfig> sharedSurfaceConfigs; } }
core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java +46 −48 Original line number Original line Diff line number Diff line Loading @@ -217,60 +217,30 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes CameraSessionConfig sessionConfig = mSessionProcessor.initSession(mCameraDevice.getId(), CameraSessionConfig sessionConfig = mSessionProcessor.initSession(mCameraDevice.getId(), previewSurface, captureSurface); previewSurface, captureSurface); List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs; List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs; // map camera output ids to output configurations ArrayList<OutputConfiguration> outputList = new ArrayList<>(); HashMap<Integer, OutputConfiguration> cameraOutputs = new HashMap<>(); for (CameraOutputConfig output : outputConfigs) { for (CameraOutputConfig output : outputConfigs) { OutputConfiguration cameraOutput = null; Surface outputSurface = initializeSurfrace(output); switch(output.type) { if (outputSurface == null) { 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; continue; } } ImageReader reader = ImageReader.newInstance(output.size.width, OutputConfiguration cameraOutput = new OutputConfiguration(output.surfaceGroupId, output.size.height, output.imageFormat, output.capacity); outputSurface); 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<>(); if ((output.sharedSurfaceConfigs != null) && !output.sharedSurfaceConfigs.isEmpty()) { for (CameraOutputConfig output : outputConfigs) { cameraOutput.enableSurfaceSharing(); if (!cameraOutputs.containsKey(output.outputId.id)) { for (CameraOutputConfig sharedOutputConfig : output.sharedSurfaceConfigs) { // Shared surface already removed by a previous iteration Surface sharedSurface = initializeSurfrace(sharedOutputConfig); if (sharedSurface == null) { continue; continue; } } OutputConfiguration outConfig = cameraOutputs.get(output.outputId.id); cameraOutput.addSurface(sharedSurface); if ((output.surfaceSharingOutputConfigs != null) && mCameraConfigMap.put(sharedSurface, sharedOutputConfig); !output.surfaceSharingOutputConfigs.isEmpty()) { outConfig.enableSurfaceSharing(); for (OutputConfigId outputId : output.surfaceSharingOutputConfigs) { outConfig.addSurface(cameraOutputs.get(outputId.id).getSurface()); cameraOutputs.remove(outputId.id); } } } } outputList.add(outConfig); mCameraConfigMap.put(outConfig.getSurface(), output); cameraOutput.setPhysicalCameraId(output.physicalCameraId); outputList.add(cameraOutput); mCameraConfigMap.put(cameraOutput.getSurface(), output); } } SessionConfiguration sessionConfiguration = new SessionConfiguration( SessionConfiguration sessionConfiguration = new SessionConfiguration( Loading Loading @@ -995,4 +965,32 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes CameraMetadataNative.update(ret.getNativeMetadata(), request.parameters); CameraMetadataNative.update(ret.getNativeMetadata(), request.parameters); return ret; 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); } } } }
packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java +35 −31 Original line number Original line Diff line number Diff line Loading @@ -1135,41 +1135,13 @@ public class CameraExtensionsProxyService extends Service { CameraSessionConfig ret = new CameraSessionConfig(); CameraSessionConfig ret = new CameraSessionConfig(); ret.outputConfigs = new ArrayList<>(); ret.outputConfigs = new ArrayList<>(); for (Camera2OutputConfigImpl output : outputConfigs) { for (Camera2OutputConfigImpl output : outputConfigs) { CameraOutputConfig entry = new CameraOutputConfig(); CameraOutputConfig entry = getCameraOutputConfig(output); 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!"); } List<Camera2OutputConfigImpl> sharedOutputs = List<Camera2OutputConfigImpl> sharedOutputs = output.getSurfaceSharingOutputConfigs(); output.getSurfaceSharingOutputConfigs(); if ((sharedOutputs != null) && (!sharedOutputs.isEmpty())) { if ((sharedOutputs != null) && (!sharedOutputs.isEmpty())) { entry.surfaceSharingOutputConfigs = new ArrayList<>(); entry.sharedSurfaceConfigs = new ArrayList<>(); for (Camera2OutputConfigImpl sharedOutput : sharedOutputs) { for (Camera2OutputConfigImpl sharedOutput : sharedOutputs) { OutputConfigId outputId = new OutputConfigId(); entry.sharedSurfaceConfigs.add(getCameraOutputConfig(sharedOutput)); outputId.id = sharedOutput.getId(); entry.surfaceSharingOutputConfigs.add(outputId); } } } } ret.outputConfigs.add(entry); ret.outputConfigs.add(entry); Loading Loading @@ -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; } } }