Merge "Camera: Use characteristic from user app for extension" into udc-dev

This commit is contained in:
Treehugger Robot
2023-05-09 18:23:52 +00:00
committed by Android (Google) Code Review
9 changed files with 121 additions and 72 deletions

View File

@@ -30,6 +30,7 @@ import android.hardware.camera2.extension.IInitializeSessionCallback;
import android.hardware.camera2.extension.IPreviewExtenderImpl; import android.hardware.camera2.extension.IPreviewExtenderImpl;
import android.hardware.camera2.extension.LatencyRange; import android.hardware.camera2.extension.LatencyRange;
import android.hardware.camera2.extension.SizeList; import android.hardware.camera2.extension.SizeList;
import android.hardware.camera2.impl.CameraExtensionUtils;
import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.params.ExtensionSessionConfiguration; import android.hardware.camera2.params.ExtensionSessionConfiguration;
import android.hardware.camera2.params.StreamConfigurationMap; import android.hardware.camera2.params.StreamConfigurationMap;
@@ -47,8 +48,10 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Future; import java.util.concurrent.Future;
@@ -161,16 +164,19 @@ public final class CameraExtensionCharacteristics {
private final Context mContext; private final Context mContext;
private final String mCameraId; private final String mCameraId;
private final CameraCharacteristics mChars; private final Map<String, CameraCharacteristics> mCharacteristicsMap;
private final Map<String, CameraMetadataNative> mCharacteristicsMapNative;
/** /**
* @hide * @hide
*/ */
public CameraExtensionCharacteristics(Context context, String cameraId, public CameraExtensionCharacteristics(Context context, String cameraId,
CameraCharacteristics chars) { Map<String, CameraCharacteristics> characteristicsMap) {
mContext = context; mContext = context;
mCameraId = cameraId; mCameraId = cameraId;
mChars = chars; mCharacteristicsMap = characteristicsMap;
mCharacteristicsMapNative =
CameraExtensionUtils.getCharacteristicsMapNative(characteristicsMap);
} }
private static ArrayList<Size> getSupportedSizes(List<SizeList> sizesList, private static ArrayList<Size> getSupportedSizes(List<SizeList> sizesList,
@@ -468,11 +474,11 @@ public final class CameraExtensionCharacteristics {
* @hide * @hide
*/ */
public static boolean isExtensionSupported(String cameraId, int extensionType, public static boolean isExtensionSupported(String cameraId, int extensionType,
CameraCharacteristics chars) { Map<String, CameraMetadataNative> characteristicsMap) {
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
try { try {
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extensionType); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extensionType);
return extender.isExtensionAvailable(cameraId); return extender.isExtensionAvailable(cameraId, characteristicsMap);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Failed to query extension availability! Extension service does not" Log.e(TAG, "Failed to query extension availability! Extension service does not"
+ " respond!"); + " respond!");
@@ -487,8 +493,10 @@ public final class CameraExtensionCharacteristics {
} }
try { try {
return extenders.first.isExtensionAvailable(cameraId, chars.getNativeMetadata()) && return extenders.first.isExtensionAvailable(cameraId,
extenders.second.isExtensionAvailable(cameraId, chars.getNativeMetadata()); characteristicsMap.get(cameraId))
&& extenders.second.isExtensionAvailable(cameraId,
characteristicsMap.get(cameraId));
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Failed to query extension availability! Extension service does not" Log.e(TAG, "Failed to query extension availability! Extension service does not"
+ " respond!"); + " respond!");
@@ -563,7 +571,7 @@ public final class CameraExtensionCharacteristics {
try { try {
for (int extensionType : EXTENSION_LIST) { for (int extensionType : EXTENSION_LIST) {
if (isExtensionSupported(mCameraId, extensionType, mChars)) { if (isExtensionSupported(mCameraId, extensionType, mCharacteristicsMapNative)) {
ret.add(extensionType); ret.add(extensionType);
} }
} }
@@ -597,18 +605,18 @@ public final class CameraExtensionCharacteristics {
} }
try { try {
if (!isExtensionSupported(mCameraId, extension, mChars)) { if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) {
throw new IllegalArgumentException("Unsupported extension"); throw new IllegalArgumentException("Unsupported extension");
} }
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
extender.init(mCameraId); extender.init(mCameraId, mCharacteristicsMapNative);
return extender.isPostviewAvailable(); return extender.isPostviewAvailable();
} else { } else {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.second.init(mCameraId, mChars.getNativeMetadata()); extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId));
return extenders.second.isPostviewAvailable(); return extenders.second.isPostviewAvailable();
} }
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -655,7 +663,7 @@ public final class CameraExtensionCharacteristics {
} }
try { try {
if (!isExtensionSupported(mCameraId, extension, mChars)) { if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) {
throw new IllegalArgumentException("Unsupported extension"); throw new IllegalArgumentException("Unsupported extension");
} }
@@ -664,7 +672,7 @@ public final class CameraExtensionCharacteristics {
sz.width = captureSize.getWidth(); sz.width = captureSize.getWidth();
sz.height = captureSize.getHeight(); sz.height = captureSize.getHeight();
StreamConfigurationMap streamMap = mChars.get( StreamConfigurationMap streamMap = mCharacteristicsMap.get(mCameraId).get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
@@ -676,13 +684,13 @@ public final class CameraExtensionCharacteristics {
throw new IllegalArgumentException("Unsupported format: " + format); throw new IllegalArgumentException("Unsupported format: " + format);
} }
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
extender.init(mCameraId); extender.init(mCameraId, mCharacteristicsMapNative);
return generateSupportedSizes(extender.getSupportedPostviewResolutions( return generateSupportedSizes(extender.getSupportedPostviewResolutions(
sz), format, streamMap); sz), format, streamMap);
} else { } else {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.second.init(mCameraId, mChars.getNativeMetadata()); extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId));
if ((extenders.second.getCaptureProcessor() == null) || if ((extenders.second.getCaptureProcessor() == null) ||
!isPostviewAvailable(extension)) { !isPostviewAvailable(extension)) {
// Extensions that don't implement any capture processor // Extensions that don't implement any capture processor
@@ -754,22 +762,23 @@ public final class CameraExtensionCharacteristics {
} }
try { try {
if (!isExtensionSupported(mCameraId, extension, mChars)) { if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) {
throw new IllegalArgumentException("Unsupported extension"); throw new IllegalArgumentException("Unsupported extension");
} }
StreamConfigurationMap streamMap = mChars.get( StreamConfigurationMap streamMap = mCharacteristicsMap.get(mCameraId).get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
extender.init(mCameraId); extender.init(mCameraId, mCharacteristicsMapNative);
return generateSupportedSizes( return generateSupportedSizes(
extender.getSupportedPreviewOutputResolutions(mCameraId), extender.getSupportedPreviewOutputResolutions(mCameraId),
ImageFormat.PRIVATE, streamMap); ImageFormat.PRIVATE, streamMap);
} else { } else {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.first.init(mCameraId, mChars.getNativeMetadata()); extenders.first.init(mCameraId,
mCharacteristicsMapNative.get(mCameraId));
return generateSupportedSizes(extenders.first.getSupportedResolutions(), return generateSupportedSizes(extenders.first.getSupportedResolutions(),
ImageFormat.PRIVATE, streamMap); ImageFormat.PRIVATE, streamMap);
} }
@@ -811,11 +820,11 @@ public final class CameraExtensionCharacteristics {
} }
try { try {
if (!isExtensionSupported(mCameraId, extension, mChars)) { if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) {
throw new IllegalArgumentException("Unsupported extension"); throw new IllegalArgumentException("Unsupported extension");
} }
StreamConfigurationMap streamMap = mChars.get( StreamConfigurationMap streamMap = mCharacteristicsMap.get(mCameraId).get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
switch(format) { switch(format) {
@@ -826,14 +835,14 @@ public final class CameraExtensionCharacteristics {
throw new IllegalArgumentException("Unsupported format: " + format); throw new IllegalArgumentException("Unsupported format: " + format);
} }
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
extender.init(mCameraId); extender.init(mCameraId, mCharacteristicsMapNative);
return generateSupportedSizes(extender.getSupportedCaptureOutputResolutions( return generateSupportedSizes(extender.getSupportedCaptureOutputResolutions(
mCameraId), format, streamMap); mCameraId), format, streamMap);
} else { } else {
if (format == ImageFormat.YUV_420_888) { if (format == ImageFormat.YUV_420_888) {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.second.init(mCameraId, mChars.getNativeMetadata()); extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId));
if (extenders.second.getCaptureProcessor() == null) { if (extenders.second.getCaptureProcessor() == null) {
// Extensions that don't implement any capture processor are limited to // Extensions that don't implement any capture processor are limited to
// JPEG only! // JPEG only!
@@ -844,7 +853,7 @@ public final class CameraExtensionCharacteristics {
} else if (format == ImageFormat.JPEG) { } else if (format == ImageFormat.JPEG) {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.second.init(mCameraId, mChars.getNativeMetadata()); extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId));
if (extenders.second.getCaptureProcessor() != null) { if (extenders.second.getCaptureProcessor() != null) {
// The framework will perform the additional encoding pass on the // The framework will perform the additional encoding pass on the
// processed YUV_420 buffers. // processed YUV_420 buffers.
@@ -900,7 +909,7 @@ public final class CameraExtensionCharacteristics {
} }
try { try {
if (!isExtensionSupported(mCameraId, extension, mChars)) { if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) {
throw new IllegalArgumentException("Unsupported extension"); throw new IllegalArgumentException("Unsupported extension");
} }
@@ -910,7 +919,7 @@ public final class CameraExtensionCharacteristics {
sz.height = captureOutputSize.getHeight(); sz.height = captureOutputSize.getHeight();
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
extender.init(mCameraId); extender.init(mCameraId, mCharacteristicsMapNative);
LatencyRange latencyRange = extender.getEstimatedCaptureLatencyRange(mCameraId, LatencyRange latencyRange = extender.getEstimatedCaptureLatencyRange(mCameraId,
sz, format); sz, format);
if (latencyRange != null) { if (latencyRange != null) {
@@ -919,7 +928,7 @@ public final class CameraExtensionCharacteristics {
} else { } else {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.second.init(mCameraId, mChars.getNativeMetadata()); extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId));
if ((format == ImageFormat.YUV_420_888) && if ((format == ImageFormat.YUV_420_888) &&
(extenders.second.getCaptureProcessor() == null) ){ (extenders.second.getCaptureProcessor() == null) ){
// Extensions that don't implement any capture processor are limited to // Extensions that don't implement any capture processor are limited to
@@ -965,18 +974,18 @@ public final class CameraExtensionCharacteristics {
} }
try { try {
if (!isExtensionSupported(mCameraId, extension, mChars)) { if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) {
throw new IllegalArgumentException("Unsupported extension"); throw new IllegalArgumentException("Unsupported extension");
} }
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
extender.init(mCameraId); extender.init(mCameraId, mCharacteristicsMapNative);
return extender.isCaptureProcessProgressAvailable(); return extender.isCaptureProcessProgressAvailable();
} else { } else {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.second.init(mCameraId, mChars.getNativeMetadata()); extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId));
return extenders.second.isCaptureProcessProgressAvailable(); return extenders.second.isCaptureProcessProgressAvailable();
} }
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -1012,20 +1021,20 @@ public final class CameraExtensionCharacteristics {
HashSet<CaptureRequest.Key> ret = new HashSet<>(); HashSet<CaptureRequest.Key> ret = new HashSet<>();
try { try {
if (!isExtensionSupported(mCameraId, extension, mChars)) { if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) {
throw new IllegalArgumentException("Unsupported extension"); throw new IllegalArgumentException("Unsupported extension");
} }
CameraMetadataNative captureRequestMeta = null; CameraMetadataNative captureRequestMeta = null;
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
extender.init(mCameraId); extender.init(mCameraId, mCharacteristicsMapNative);
captureRequestMeta = extender.getAvailableCaptureRequestKeys(mCameraId); captureRequestMeta = extender.getAvailableCaptureRequestKeys(mCameraId);
} else { } else {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.second.onInit(mCameraId, mChars.getNativeMetadata()); extenders.second.onInit(mCameraId, mCharacteristicsMapNative.get(mCameraId));
extenders.second.init(mCameraId, mChars.getNativeMetadata()); extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId));
captureRequestMeta = extenders.second.getAvailableCaptureRequestKeys(); captureRequestMeta = extenders.second.getAvailableCaptureRequestKeys();
extenders.second.onDeInit(); extenders.second.onDeInit();
} }
@@ -1090,20 +1099,20 @@ public final class CameraExtensionCharacteristics {
HashSet<CaptureResult.Key> ret = new HashSet<>(); HashSet<CaptureResult.Key> ret = new HashSet<>();
try { try {
if (!isExtensionSupported(mCameraId, extension, mChars)) { if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) {
throw new IllegalArgumentException("Unsupported extension"); throw new IllegalArgumentException("Unsupported extension");
} }
CameraMetadataNative captureResultMeta = null; CameraMetadataNative captureResultMeta = null;
if (areAdvancedExtensionsSupported()) { if (areAdvancedExtensionsSupported()) {
IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
extender.init(mCameraId); extender.init(mCameraId, mCharacteristicsMapNative);
captureResultMeta = extender.getAvailableCaptureResultKeys(mCameraId); captureResultMeta = extender.getAvailableCaptureResultKeys(mCameraId);
} else { } else {
Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders = Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
initializeExtension(extension); initializeExtension(extension);
extenders.second.onInit(mCameraId, mChars.getNativeMetadata()); extenders.second.onInit(mCameraId, mCharacteristicsMapNative.get(mCameraId));
extenders.second.init(mCameraId, mChars.getNativeMetadata()); extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId));
captureResultMeta = extenders.second.getAvailableCaptureResultKeys(); captureResultMeta = extenders.second.getAvailableCaptureResultKeys();
extenders.second.onDeInit(); extenders.second.onDeInit();
} }

View File

@@ -694,7 +694,10 @@ public final class CameraManager {
public CameraExtensionCharacteristics getCameraExtensionCharacteristics( public CameraExtensionCharacteristics getCameraExtensionCharacteristics(
@NonNull String cameraId) throws CameraAccessException { @NonNull String cameraId) throws CameraAccessException {
CameraCharacteristics chars = getCameraCharacteristics(cameraId); CameraCharacteristics chars = getCameraCharacteristics(cameraId);
return new CameraExtensionCharacteristics(mContext, cameraId, chars); Map<String, CameraCharacteristics> characteristicsMap = getPhysicalIdToCharsMap(chars);
characteristicsMap.put(cameraId, chars);
return new CameraExtensionCharacteristics(mContext, cameraId, characteristicsMap);
} }
private Map<String, CameraCharacteristics> getPhysicalIdToCharsMap( private Map<String, CameraCharacteristics> getPhysicalIdToCharsMap(

View File

@@ -15,6 +15,8 @@
*/ */
package android.hardware.camera2.extension; package android.hardware.camera2.extension;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.extension.ISessionProcessorImpl; import android.hardware.camera2.extension.ISessionProcessorImpl;
import android.hardware.camera2.extension.LatencyRange; import android.hardware.camera2.extension.LatencyRange;
import android.hardware.camera2.extension.Size; import android.hardware.camera2.extension.Size;
@@ -24,8 +26,8 @@ import android.hardware.camera2.impl.CameraMetadataNative;
/** @hide */ /** @hide */
interface IAdvancedExtenderImpl interface IAdvancedExtenderImpl
{ {
boolean isExtensionAvailable(in String cameraId); boolean isExtensionAvailable(in String cameraId, in Map<String, CameraMetadataNative> charsMap);
void init(in String cameraId); void init(in String cameraId, in Map<String, CameraMetadataNative> charsMap);
LatencyRange getEstimatedCaptureLatencyRange(in String cameraId, in Size outputSize, LatencyRange getEstimatedCaptureLatencyRange(in String cameraId, in Size outputSize,
int format); int format);
@nullable List<SizeList> getSupportedPreviewOutputResolutions(in String cameraId); @nullable List<SizeList> getSupportedPreviewOutputResolutions(in String cameraId);

View File

@@ -15,6 +15,8 @@
*/ */
package android.hardware.camera2.extension; package android.hardware.camera2.extension;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.extension.CameraSessionConfig; import android.hardware.camera2.extension.CameraSessionConfig;
import android.hardware.camera2.extension.ICaptureCallback; import android.hardware.camera2.extension.ICaptureCallback;
@@ -26,7 +28,8 @@ import android.hardware.camera2.extension.OutputSurface;
/** @hide */ /** @hide */
interface ISessionProcessorImpl interface ISessionProcessorImpl
{ {
CameraSessionConfig initSession(in String cameraId, in OutputSurface previewSurface, CameraSessionConfig initSession(in String cameraId,
in Map<String, CameraMetadataNative> charsMap, in OutputSurface previewSurface,
in OutputSurface imageCaptureSurface, in OutputSurface postviewSurface); in OutputSurface imageCaptureSurface, in OutputSurface postviewSurface);
void deInitSession(); void deInitSession();
void onCaptureSessionStart(IRequestProcessorImpl requestProcessor); void onCaptureSessionStart(IRequestProcessorImpl requestProcessor);

View File

@@ -29,7 +29,6 @@ import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraExtensionCharacteristics; import android.hardware.camera2.CameraExtensionCharacteristics;
import android.hardware.camera2.CameraExtensionSession; import android.hardware.camera2.CameraExtensionSession;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureFailure; import android.hardware.camera2.CaptureFailure;
import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult; import android.hardware.camera2.CaptureResult;
@@ -78,6 +77,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
private final Executor mExecutor; private final Executor mExecutor;
private final CameraDevice mCameraDevice; private final CameraDevice mCameraDevice;
private final Map<String, CameraMetadataNative> mCharacteristicsMap;
private final long mExtensionClientId; private final long mExtensionClientId;
private final Handler mHandler; private final Handler mHandler;
private final HandlerThread mHandlerThread; private final HandlerThread mHandlerThread;
@@ -109,6 +109,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
@RequiresPermission(android.Manifest.permission.CAMERA) @RequiresPermission(android.Manifest.permission.CAMERA)
public static CameraAdvancedExtensionSessionImpl createCameraAdvancedExtensionSession( public static CameraAdvancedExtensionSessionImpl createCameraAdvancedExtensionSession(
@NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice, @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice,
@NonNull Map<String, CameraCharacteristics> characteristicsMap,
@NonNull Context ctx, @NonNull ExtensionSessionConfiguration config, int sessionId) @NonNull Context ctx, @NonNull ExtensionSessionConfiguration config, int sessionId)
throws CameraAccessException, RemoteException { throws CameraAccessException, RemoteException {
long clientId = CameraExtensionCharacteristics.registerClient(ctx); long clientId = CameraExtensionCharacteristics.registerClient(ctx);
@@ -117,13 +118,13 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
} }
String cameraId = cameraDevice.getId(); String cameraId = cameraDevice.getId();
CameraManager manager = ctx.getSystemService(CameraManager.class);
CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId);
CameraExtensionCharacteristics extensionChars = new CameraExtensionCharacteristics(ctx, CameraExtensionCharacteristics extensionChars = new CameraExtensionCharacteristics(ctx,
cameraId, chars); cameraId, characteristicsMap);
Map<String, CameraMetadataNative> characteristicsMapNative =
CameraExtensionUtils.getCharacteristicsMapNative(characteristicsMap);
if (!CameraExtensionCharacteristics.isExtensionSupported(cameraDevice.getId(), if (!CameraExtensionCharacteristics.isExtensionSupported(cameraDevice.getId(),
config.getExtension(), chars)) { config.getExtension(), characteristicsMapNative)) {
throw new UnsupportedOperationException("Unsupported extension type: " + throw new UnsupportedOperationException("Unsupported extension type: " +
config.getExtension()); config.getExtension());
} }
@@ -198,11 +199,12 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
IAdvancedExtenderImpl extender = CameraExtensionCharacteristics.initializeAdvancedExtension( IAdvancedExtenderImpl extender = CameraExtensionCharacteristics.initializeAdvancedExtension(
config.getExtension()); config.getExtension());
extender.init(cameraId); extender.init(cameraId, characteristicsMapNative);
CameraAdvancedExtensionSessionImpl ret = new CameraAdvancedExtensionSessionImpl(clientId, CameraAdvancedExtensionSessionImpl ret = new CameraAdvancedExtensionSessionImpl(clientId,
extender, cameraDevice, repeatingRequestSurface, burstCaptureSurface, extender, cameraDevice, characteristicsMapNative, repeatingRequestSurface,
postviewSurface, config.getStateCallback(), config.getExecutor(), sessionId); burstCaptureSurface, postviewSurface, config.getStateCallback(),
config.getExecutor(), sessionId);
ret.initialize(); ret.initialize();
return ret; return ret;
@@ -210,14 +212,16 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
private CameraAdvancedExtensionSessionImpl(long extensionClientId, private CameraAdvancedExtensionSessionImpl(long extensionClientId,
@NonNull IAdvancedExtenderImpl extender, @NonNull IAdvancedExtenderImpl extender,
@NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice, @NonNull CameraDeviceImpl cameraDevice,
Map<String, CameraMetadataNative> characteristicsMap,
@Nullable Surface repeatingRequestSurface, @Nullable Surface burstCaptureSurface, @Nullable Surface repeatingRequestSurface, @Nullable Surface burstCaptureSurface,
@Nullable Surface postviewSurface, @Nullable Surface postviewSurface,
@NonNull CameraExtensionSession.StateCallback callback, @NonNull Executor executor, @NonNull StateCallback callback, @NonNull Executor executor,
int sessionId) { int sessionId) {
mExtensionClientId = extensionClientId; mExtensionClientId = extensionClientId;
mAdvancedExtender = extender; mAdvancedExtender = extender;
mCameraDevice = cameraDevice; mCameraDevice = cameraDevice;
mCharacteristicsMap = characteristicsMap;
mCallbacks = callback; mCallbacks = callback;
mExecutor = executor; mExecutor = executor;
mClientRepeatingRequestSurface = repeatingRequestSurface; mClientRepeatingRequestSurface = repeatingRequestSurface;
@@ -247,7 +251,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
mSessionProcessor = mAdvancedExtender.getSessionProcessor(); mSessionProcessor = mAdvancedExtender.getSessionProcessor();
CameraSessionConfig sessionConfig = mSessionProcessor.initSession(mCameraDevice.getId(), CameraSessionConfig sessionConfig = mSessionProcessor.initSession(mCameraDevice.getId(),
previewSurface, captureSurface, postviewSurface); mCharacteristicsMap, previewSurface, captureSurface, postviewSurface);
List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs; List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs;
ArrayList<OutputConfiguration> outputList = new ArrayList<>(); ArrayList<OutputConfiguration> outputList = new ArrayList<>();
for (CameraOutputConfig output : outputConfigs) { for (CameraOutputConfig output : outputConfigs) {

View File

@@ -2517,14 +2517,19 @@ public class CameraDeviceImpl extends CameraDevice
@Override @Override
public void createExtensionSession(ExtensionSessionConfiguration extensionConfiguration) public void createExtensionSession(ExtensionSessionConfiguration extensionConfiguration)
throws CameraAccessException { throws CameraAccessException {
HashMap<String, CameraCharacteristics> characteristicsMap = new HashMap<>(
mPhysicalIdsToChars);
characteristicsMap.put(mCameraId, mCharacteristics);
try { try {
if (CameraExtensionCharacteristics.areAdvancedExtensionsSupported()) { if (CameraExtensionCharacteristics.areAdvancedExtensionsSupported()) {
mCurrentAdvancedExtensionSession = mCurrentAdvancedExtensionSession =
CameraAdvancedExtensionSessionImpl.createCameraAdvancedExtensionSession( CameraAdvancedExtensionSessionImpl.createCameraAdvancedExtensionSession(
this, mContext, extensionConfiguration, mNextSessionId++); this, characteristicsMap, mContext, extensionConfiguration,
mNextSessionId++);
} else { } else {
mCurrentExtensionSession = CameraExtensionSessionImpl.createCameraExtensionSession( mCurrentExtensionSession = CameraExtensionSessionImpl.createCameraExtensionSession(
this, mContext, extensionConfiguration, mNextSessionId++); this, characteristicsMap, mContext, extensionConfiguration,
mNextSessionId++);
} }
} catch (RemoteException e) { } catch (RemoteException e) {
throw new CameraAccessException(CameraAccessException.CAMERA_ERROR); throw new CameraAccessException(CameraAccessException.CAMERA_ERROR);

View File

@@ -129,6 +129,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
@RequiresPermission(android.Manifest.permission.CAMERA) @RequiresPermission(android.Manifest.permission.CAMERA)
public static CameraExtensionSessionImpl createCameraExtensionSession( public static CameraExtensionSessionImpl createCameraExtensionSession(
@NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice, @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice,
@NonNull Map<String, CameraCharacteristics> characteristicsMap,
@NonNull Context ctx, @NonNull Context ctx,
@NonNull ExtensionSessionConfiguration config, @NonNull ExtensionSessionConfiguration config,
int sessionId) int sessionId)
@@ -139,13 +140,12 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
} }
String cameraId = cameraDevice.getId(); String cameraId = cameraDevice.getId();
CameraManager manager = ctx.getSystemService(CameraManager.class);
CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId);
CameraExtensionCharacteristics extensionChars = new CameraExtensionCharacteristics(ctx, CameraExtensionCharacteristics extensionChars = new CameraExtensionCharacteristics(ctx,
cameraId, chars); cameraId, characteristicsMap);
if (!CameraExtensionCharacteristics.isExtensionSupported(cameraDevice.getId(), if (!CameraExtensionCharacteristics.isExtensionSupported(cameraDevice.getId(),
config.getExtension(), chars)) { config.getExtension(),
CameraExtensionUtils.getCharacteristicsMapNative(characteristicsMap))) {
throw new UnsupportedOperationException("Unsupported extension type: " + throw new UnsupportedOperationException("Unsupported extension type: " +
config.getExtension()); config.getExtension());
} }
@@ -222,10 +222,10 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
} }
} }
extenders.first.init(cameraId, chars.getNativeMetadata()); extenders.first.init(cameraId, characteristicsMap.get(cameraId).getNativeMetadata());
extenders.first.onInit(cameraId, chars.getNativeMetadata()); extenders.first.onInit(cameraId, characteristicsMap.get(cameraId).getNativeMetadata());
extenders.second.init(cameraId, chars.getNativeMetadata()); extenders.second.init(cameraId, characteristicsMap.get(cameraId).getNativeMetadata());
extenders.second.onInit(cameraId, chars.getNativeMetadata()); extenders.second.onInit(cameraId, characteristicsMap.get(cameraId).getNativeMetadata());
CameraExtensionSessionImpl session = new CameraExtensionSessionImpl( CameraExtensionSessionImpl session = new CameraExtensionSessionImpl(
extenders.second, extenders.second,

View File

@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.graphics.ImageFormat; import android.graphics.ImageFormat;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.hardware.HardwareBuffer; import android.hardware.HardwareBuffer;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraExtensionCharacteristics; import android.hardware.camera2.CameraExtensionCharacteristics;
import android.hardware.camera2.params.OutputConfiguration; import android.hardware.camera2.params.OutputConfiguration;
import android.hardware.camera2.params.StreamConfigurationMap; import android.hardware.camera2.params.StreamConfigurationMap;
@@ -34,6 +35,7 @@ import android.view.Surface;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionException;
@@ -169,4 +171,13 @@ public final class CameraExtensionUtils {
return null; return null;
} }
public static Map<String, CameraMetadataNative> getCharacteristicsMapNative(
Map<String, CameraCharacteristics> charsMap) {
HashMap<String, CameraMetadataNative> ret = new HashMap<>();
for (Map.Entry<String, CameraCharacteristics> entry : charsMap.entrySet()) {
ret.put(entry.getKey(), entry.getValue().getNativeMetadata());
}
return ret;
}
} }

View File

@@ -151,7 +151,6 @@ public class CameraExtensionsProxyService extends Service {
(EXTENSIONS_VERSION.startsWith(RESULTS_VERSION_PREFIX) || (EXTENSIONS_VERSION.startsWith(RESULTS_VERSION_PREFIX) ||
EXTENSIONS_VERSION.startsWith(LATENCY_VERSION_PREFIX)); EXTENSIONS_VERSION.startsWith(LATENCY_VERSION_PREFIX));
private HashMap<String, CameraCharacteristics> mCharacteristicsHashMap = new HashMap<>();
private HashMap<String, Long> mMetadataVendorIdMap = new HashMap<>(); private HashMap<String, Long> mMetadataVendorIdMap = new HashMap<>();
private CameraManager mCameraManager; private CameraManager mCameraManager;
@@ -501,7 +500,6 @@ public class CameraExtensionsProxyService extends Service {
if (cameraIds != null) { if (cameraIds != null) {
for (String cameraId : cameraIds) { for (String cameraId : cameraIds) {
CameraCharacteristics chars = mCameraManager.getCameraCharacteristics(cameraId); CameraCharacteristics chars = mCameraManager.getCameraCharacteristics(cameraId);
mCharacteristicsHashMap.put(cameraId, chars);
Object thisClass = CameraCharacteristics.Key.class; Object thisClass = CameraCharacteristics.Key.class;
Class<CameraCharacteristics.Key<?>> keyClass = Class<CameraCharacteristics.Key<?>> keyClass =
(Class<CameraCharacteristics.Key<?>>)thisClass; (Class<CameraCharacteristics.Key<?>>)thisClass;
@@ -554,6 +552,15 @@ public class CameraExtensionsProxyService extends Service {
return ret; return ret;
} }
private static Map<String, CameraCharacteristics> getCharacteristicsMap(
Map<String, CameraMetadataNative> charsMap) {
HashMap<String, CameraCharacteristics> ret = new HashMap<>();
for (Map.Entry<String, CameraMetadataNative> entry : charsMap.entrySet()) {
ret.put(entry.getKey(), new CameraCharacteristics(entry.getValue()));
}
return ret;
}
private static List<SizeList> initializeParcelable( private static List<SizeList> initializeParcelable(
Map<Integer, List<android.util.Size>> sizes) { Map<Integer, List<android.util.Size>> sizes) {
if (sizes == null) { if (sizes == null) {
@@ -734,13 +741,15 @@ public class CameraExtensionsProxyService extends Service {
} }
@Override @Override
public boolean isExtensionAvailable(String cameraId) { public boolean isExtensionAvailable(String cameraId,
return mAdvancedExtender.isExtensionAvailable(cameraId, mCharacteristicsHashMap); Map<String, CameraMetadataNative> charsMapNative) {
return mAdvancedExtender.isExtensionAvailable(cameraId,
getCharacteristicsMap(charsMapNative));
} }
@Override @Override
public void init(String cameraId) { public void init(String cameraId, Map<String, CameraMetadataNative> charsMapNative) {
mAdvancedExtender.init(cameraId, mCharacteristicsHashMap); mAdvancedExtender.init(cameraId, getCharacteristicsMap(charsMapNative));
} }
@Override @Override
@@ -1192,7 +1201,8 @@ public class CameraExtensionsProxyService extends Service {
} }
@Override @Override
public CameraSessionConfig initSession(String cameraId, OutputSurface previewSurface, public CameraSessionConfig initSession(String cameraId,
Map<String, CameraMetadataNative> charsMapNative, OutputSurface previewSurface,
OutputSurface imageCaptureSurface, OutputSurface postviewSurface) { OutputSurface imageCaptureSurface, OutputSurface postviewSurface) {
OutputSurfaceImplStub outputPreviewSurfaceImpl = OutputSurfaceImplStub outputPreviewSurfaceImpl =
new OutputSurfaceImplStub(previewSurface); new OutputSurfaceImplStub(previewSurface);
@@ -1211,10 +1221,12 @@ public class CameraExtensionsProxyService extends Service {
outputPostviewSurfaceImpl); outputPostviewSurfaceImpl);
sessionConfig = mSessionProcessor.initSession(cameraId, sessionConfig = mSessionProcessor.initSession(cameraId,
mCharacteristicsHashMap, getApplicationContext(), outputSurfaceConfigs); getCharacteristicsMap(charsMapNative),
getApplicationContext(), outputSurfaceConfigs);
} else { } else {
sessionConfig = mSessionProcessor.initSession(cameraId, sessionConfig = mSessionProcessor.initSession(cameraId,
mCharacteristicsHashMap, getApplicationContext(), outputPreviewSurfaceImpl, getCharacteristicsMap(charsMapNative),
getApplicationContext(), outputPreviewSurfaceImpl,
outputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/); outputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/);
} }