summaryrefslogtreecommitdiff
path: root/camera2/extensions/service_based_sample/extensions_service/src/com/android/oemextensions/AdvancedExtenderImplStub.java
diff options
context:
space:
mode:
Diffstat (limited to 'camera2/extensions/service_based_sample/extensions_service/src/com/android/oemextensions/AdvancedExtenderImplStub.java')
-rw-r--r--camera2/extensions/service_based_sample/extensions_service/src/com/android/oemextensions/AdvancedExtenderImplStub.java270
1 files changed, 270 insertions, 0 deletions
diff --git a/camera2/extensions/service_based_sample/extensions_service/src/com/android/oemextensions/AdvancedExtenderImplStub.java b/camera2/extensions/service_based_sample/extensions_service/src/com/android/oemextensions/AdvancedExtenderImplStub.java
new file mode 100644
index 00000000..a10c1659
--- /dev/null
+++ b/camera2/extensions/service_based_sample/extensions_service/src/com/android/oemextensions/AdvancedExtenderImplStub.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.oemextensions;
+
+import android.content.Context;
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.params.MeteringRectangle;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.os.RemoteException;
+import android.util.Log;
+import android.util.Size;
+
+import androidx.annotation.NonNull;
+import androidx.camera.extensions.impl.service.CameraMetadataWrapper;
+import androidx.camera.extensions.impl.service.IAdvancedExtenderImpl;
+import androidx.camera.extensions.impl.service.ISessionProcessorImpl;
+import androidx.camera.extensions.impl.service.LatencyRange;
+import androidx.camera.extensions.impl.service.SizeList;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AdvancedExtenderImplStub extends IAdvancedExtenderImpl.Stub {
+ private static final String TAG = "AdvancedExtenderStub";
+ private Context mContext;
+ private int mExtensionType;
+ private String mCurrentCameraId;
+ private Map<String, CameraCharacteristics> mCharacteristicsMap = new HashMap<>();
+
+ /**
+ * Construct the AdvancedExtenderImplStub instance.
+ *
+ * @param context a context.
+ * @param extensionType CameraExtensionCharacteristics#EXTENSION_AUTOMATIC for Auto,
+ * CameraExtensionCharacteristics#EXTENSION_NIGHT for Night,
+ * CameraExtensionCharacteristics#EXTENSION_HDR for HDR,
+ * CameraExtensionCharacteristics#EXTENSION_BOKEH for Bokeh,
+ * CameraExtensionCharacteristics#EXTENSION_FACE_RETOUCH for face retouch.
+ */
+ public AdvancedExtenderImplStub(@NonNull Context context, int extensionType) {
+ mContext = context;
+ mExtensionType = extensionType;
+ }
+
+ @Override
+ public boolean isExtensionAvailable(@NonNull String cameraId) throws RemoteException {
+ return true;
+ }
+
+ @Override
+ public void init(@NonNull String cameraId) throws RemoteException {
+ mCurrentCameraId = cameraId;
+ }
+
+ @Override
+ @NonNull
+ public LatencyRange getEstimatedCaptureLatencyRange(@NonNull String cameraId,
+ @NonNull androidx.camera.extensions.impl.service.Size outputSize,
+ int format) throws RemoteException {
+ Log.d(TAG, "getEstimatedCaptureLatencyRange format" + format);
+
+ LatencyRange latencyRange = new LatencyRange();
+ latencyRange.min = 100;
+ latencyRange.max = 1000;
+ return latencyRange;
+ }
+
+ private CameraCharacteristics getCameraCharacteristics(String cameraId) {
+ CameraCharacteristics characteristics = mCharacteristicsMap.get(cameraId);
+ if (characteristics != null) {
+ return characteristics;
+ }
+ try {
+ CameraManager cameraManager = mContext.getSystemService(CameraManager.class);
+ characteristics = cameraManager.getCameraCharacteristics(cameraId);
+ mCharacteristicsMap.put(cameraId, characteristics);
+ return characteristics;
+ } catch (CameraAccessException e) {
+ Log.e(TAG, "Cannot get CameraCharacteristics", e);
+ return null;
+ }
+ }
+
+ private static SizeList getSupportedSizeByFormat(
+ CameraCharacteristics cameraCharacteristics, int imageFormat) {
+ StreamConfigurationMap streamConfigMap =
+ cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+
+ Size[] sizes = streamConfigMap.getOutputSizes(imageFormat);
+ SizeList sizeList = new SizeList();
+ sizeList.sizes = new ArrayList<>();
+ for (Size size : sizes) {
+ androidx.camera.extensions.impl.service.Size sz =
+ new androidx.camera.extensions.impl.service.Size();
+ sz.width = size.getWidth();
+ sz.height = size.getHeight();
+ sizeList.sizes.add(sz);
+ }
+ sizeList.format = imageFormat;
+ return sizeList;
+ }
+
+ @Override
+ @NonNull
+ public List<SizeList> getSupportedPreviewOutputResolutions(@NonNull String cameraId)
+ throws RemoteException {
+ CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(cameraId);
+ if (cameraCharacteristics == null) {
+ return Collections.emptyList();
+ }
+
+ return Arrays.asList(
+ getSupportedSizeByFormat(cameraCharacteristics, ImageFormat.PRIVATE));
+ }
+
+ @Override
+ @NonNull
+ public List<SizeList> getSupportedCaptureOutputResolutions(@NonNull String cameraId)
+ throws RemoteException {
+ CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(cameraId);
+ if (cameraCharacteristics == null) {
+ return Collections.emptyList();
+ }
+ return Arrays.asList(
+ getSupportedSizeByFormat(cameraCharacteristics,
+ ImageFormat.JPEG),
+ getSupportedSizeByFormat(cameraCharacteristics,
+ ImageFormat.YUV_420_888));
+ }
+
+ @Override
+ @NonNull
+ public List<SizeList> getSupportedYuvAnalysisResolutions(@NonNull String cameraId)
+ throws RemoteException {
+ CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(cameraId);
+ if (cameraCharacteristics == null) {
+ return Collections.emptyList();
+ }
+
+ return Arrays.asList(
+ getSupportedSizeByFormat(cameraCharacteristics, ImageFormat.YUV_420_888));
+ }
+
+ @Override
+ @NonNull
+ public ISessionProcessorImpl getSessionProcessor() throws RemoteException {
+ Log.d(TAG, "getSessionProcessor");
+ return new SimpleSessionProcessorStub(getCameraCharacteristics(mCurrentCameraId),
+ getSupportedCaptureRequestKeys(mCurrentCameraId).keySet(),
+ getSupportedCaptureResultKeys(mCurrentCameraId).keySet());
+ }
+
+ private Map<CaptureRequest.Key, Object> getSupportedCaptureRequestKeys(String cameraId) {
+ Map<CaptureRequest.Key, Object> map = new HashMap<>();
+ map.put(CaptureRequest.CONTROL_ZOOM_RATIO,
+ 1.0f /* don't care, must not be null */);
+ map.put(CaptureRequest.SCALER_CROP_REGION,
+ new Rect() /* don't care, must not be null */);
+ map.put(CaptureRequest.CONTROL_AE_REGIONS,
+ new MeteringRectangle[0] /* don't care, must not be null */);
+ map.put(CaptureRequest.CONTROL_AWB_REGIONS,
+ new MeteringRectangle[0] /* don't care, must not be null */);
+ map.put(CaptureRequest.JPEG_QUALITY,
+ (byte)0 /* don't care, must not be null */);
+ map.put(CaptureRequest.JPEG_ORIENTATION,
+ 0 /* don't care, must not be null */);
+ if (isAfAutoSupported(cameraId)) {
+ Log.e("AAAAA", "support AF: cameraid=" + cameraId);
+ map.put(CaptureRequest.CONTROL_AF_TRIGGER,
+ 0 /* don't care, must not be null */);
+ map.put(CaptureRequest.CONTROL_AF_MODE,
+ 0 /* don't care, must not be null */);
+ map.put(CaptureRequest.CONTROL_AF_REGIONS,
+ new MeteringRectangle[0] /* don't care, must not be null */);
+ }
+ return map;
+ }
+
+ private Map<CaptureResult.Key, Object> getSupportedCaptureResultKeys(String cameraId) {
+ Map<CaptureResult.Key, Object> map = new HashMap<>();
+ map.put(CaptureResult.CONTROL_ZOOM_RATIO,
+ 1.0f /* don't care, must not be null */);
+ map.put(CaptureResult.SCALER_CROP_REGION,
+ new Rect() /* don't care, must not be null */);
+ map.put(CaptureResult.CONTROL_AE_REGIONS,
+ new MeteringRectangle[0] /* don't care, must not be null */);
+ map.put(CaptureResult.CONTROL_AWB_REGIONS,
+ new MeteringRectangle[0] /* don't care, must not be null */);
+ map.put(CaptureResult.JPEG_QUALITY,
+ (byte)0 /* don't care, must not be null */);
+ map.put(CaptureResult.JPEG_ORIENTATION,
+ 0 /* don't care, must not be null */);
+ if (isAfAutoSupported(cameraId)) {
+ map.put(CaptureResult.CONTROL_AF_REGIONS,
+ new MeteringRectangle[0] /* don't care, must not be null */);
+ map.put(CaptureResult.CONTROL_AF_TRIGGER,
+ 0 /* don't care, must not be null */);
+ map.put(CaptureResult.CONTROL_AF_MODE,
+ 0 /* don't care, must not be null */);
+ map.put(CaptureResult.CONTROL_AF_STATE,
+ 0 /* don't care, must not be null */);
+ }
+ return map;
+ }
+
+ private boolean isAfAutoSupported(String cameraId) {
+ int[] afModes = getCameraCharacteristics(cameraId)
+ .get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
+ if (afModes == null) {
+ return false;
+ }
+
+ for (int afMode : afModes) {
+ if (afMode == CameraCharacteristics.CONTROL_AF_MODE_AUTO) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public CameraMetadataWrapper getAvailableCaptureRequestKeys(String cameraId)
+ throws RemoteException {
+ CameraMetadataWrapper cameraMetadataWrapper =
+ new CameraMetadataWrapper(getCameraCharacteristics(cameraId));
+ Map<CaptureRequest.Key, Object> keysmap = getSupportedCaptureRequestKeys(cameraId);
+ for (CaptureRequest.Key key : keysmap.keySet()) {
+ cameraMetadataWrapper.set(key, keysmap.get(key));
+ }
+
+ return cameraMetadataWrapper;
+ }
+
+ @Override
+ public CameraMetadataWrapper getAvailableCaptureResultKeys(String cameraId)
+ throws RemoteException {
+ CameraMetadataWrapper cameraMetadataWrapper =
+ new CameraMetadataWrapper(getCameraCharacteristics(cameraId));
+ Map<CaptureResult.Key, Object> keysmap = getSupportedCaptureResultKeys(cameraId);
+ for (CaptureResult.Key key : keysmap.keySet()) {
+ cameraMetadataWrapper.set(key, keysmap.get(key));
+ }
+
+ return cameraMetadataWrapper;
+ }
+}