diff options
4 files changed, 56 insertions, 26 deletions
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 2e59eee60aa4..e55ee6777740 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -533,6 +533,20 @@ public class CameraDeviceImpl extends android.hardware.camera2.CameraDevice { handler = checkHandler(handler); } + // Make sure that there all requests have at least 1 surface; all surfaces are non-null + for (CaptureRequest request : requestList) { + if (request.getTargets().isEmpty()) { + throw new IllegalArgumentException( + "Each request must have at least one Surface target"); + } + + for (Surface surface : request.getTargets()) { + if (surface == null) { + throw new IllegalArgumentException("Null Surface targets are not allowed"); + } + } + } + try (ScopedLock scopedLock = mCloseLock.acquireExclusiveLock()) { checkIfCameraClosedOrInError(); int requestId; diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java index d7b1a36ad566..3ef538cebbe8 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java +++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java @@ -154,16 +154,6 @@ public class LegacyMetadataMapper { private static void mapCharacteristicsFromParameters(CameraMetadataNative m, Camera.Parameters p) { /* - * info.supportedHardwareLevel - */ - m.set(INFO_SUPPORTED_HARDWARE_LEVEL, INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED); - - /* - * scaler.availableStream*, scaler.available*Durations, sensor.info.maxFrameDuration - */ - mapScalerStreamConfigs(m, p); - - /* * control.ae* */ mapControlAe(m, p); @@ -205,6 +195,17 @@ public class LegacyMetadataMapper { * sync.* */ mapSync(m, p); + + /* + * info.supportedHardwareLevel + */ + m.set(INFO_SUPPORTED_HARDWARE_LEVEL, INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED); + + /* + * scaler.availableStream*, scaler.available*Durations, sensor.info.maxFrameDuration + */ + mapScalerStreamConfigs(m, p); + } private static void mapScalerStreamConfigs(CameraMetadataNative m, Camera.Parameters p) { diff --git a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java index 3345967a87f9..17dda0839a1d 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java +++ b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java @@ -176,8 +176,23 @@ public class LegacyRequestMapper { Range<Integer> aeFpsRange = request.get(CONTROL_AE_TARGET_FPS_RANGE); if (aeFpsRange != null) { int[] legacyFps = convertAeFpsRangeToLegacy(aeFpsRange); - params.setPreviewFpsRange(legacyFps[Parameters.PREVIEW_FPS_MIN_INDEX], - legacyFps[Parameters.PREVIEW_FPS_MAX_INDEX]); + + // TODO - Should we enforce that all HAL1 devices must include (30, 30) FPS range? + boolean supported = false; + for(int[] range : params.getSupportedPreviewFpsRange()) { + if (legacyFps[0] == range[0] && legacyFps[1] == range[1]) { + supported = true; + break; + } + } + if (supported) { + params.setPreviewFpsRange(legacyFps[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], + legacyFps[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); + params.setRecordingHint(false); + } else { + Log.w(TAG, "Unsupported FPS range set [" + legacyFps[0] + "," + legacyFps[1] + "]"); + params.setRecordingHint(true); + } } /* diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java index a9f9355e3fd5..e6d84c564826 100644 --- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java +++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java @@ -78,8 +78,8 @@ public class RequestThreadManager { private volatile RequestHolder mInFlightPreview; private volatile RequestHolder mInFlightJpeg; - private final List<Surface> mPreviewOutputs = new ArrayList<Surface>(); - private final List<Surface> mCallbackOutputs = new ArrayList<Surface>(); + private final List<Surface> mPreviewOutputs = new ArrayList<>(); + private final List<Surface> mCallbackOutputs = new ArrayList<>(); private GLThreadManager mGLThreadManager; private SurfaceTexture mPreviewTexture; private Camera.Parameters mParams; @@ -274,18 +274,6 @@ public class RequestThreadManager { mPreviewTexture.setDefaultBufferSize(mIntermediateBufferSize.getWidth(), mIntermediateBufferSize.getHeight()); mCamera.setPreviewTexture(mPreviewTexture); - Camera.Parameters params = mCamera.getParameters(); - List<int[]> supportedFpsRanges = params.getSupportedPreviewFpsRange(); - int[] bestRange = getPhotoPreviewFpsRange(supportedFpsRanges); - if (DEBUG) { - Log.d(TAG, "doPreviewCapture - Selected range [" + - bestRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] + "," + - bestRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] + "]"); - } - params.setPreviewFpsRange(bestRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], - bestRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); - params.setRecordingHint(true); - mCamera.setParameters(params); startPreview(); } @@ -322,6 +310,18 @@ public class RequestThreadManager { } } mParams = mCamera.getParameters(); + + List<int[]> supportedFpsRanges = mParams.getSupportedPreviewFpsRange(); + int[] bestRange = getPhotoPreviewFpsRange(supportedFpsRanges); + if (DEBUG) { + Log.d(TAG, "doPreviewCapture - Selected range [" + + bestRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] + "," + + bestRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] + "]"); + } + mParams.setPreviewFpsRange(bestRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], + bestRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); + mParams.setRecordingHint(true); + if (mPreviewOutputs.size() > 0) { List<Size> outputSizes = new ArrayList<>(outputs.size()); for (Surface s : mPreviewOutputs) { |