summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-04-28 16:17:55 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-04-28 16:17:55 +0000
commit37acedad2399434b61b5fa1bc607ef576ef925a7 (patch)
tree99f44b38acff243e00559f9143f9eda104161d22
parent84734acf71c00b3b3a42c3f8011099efbf5522bb (diff)
parente7267e37ed1a9d9440baccb8d8f3ea1eccb0bb52 (diff)
downloadex-37acedad2399434b61b5fa1bc607ef576ef925a7.tar.gz
Snap for 8512216 from e7267e37ed1a9d9440baccb8d8f3ea1eccb0bb52 to tm-frc-neuralnetworks-release
Change-Id: I1475f2f40570e77cc49568294d32b71108a3e62e
-rw-r--r--camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java98
-rw-r--r--camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java3
-rw-r--r--camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java49
-rw-r--r--camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java64
-rw-r--r--camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java34
-rw-r--r--camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java35
-rw-r--r--camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AutoAdvancedExtenderImpl.java12
-rw-r--r--camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BeautyAdvancedExtenderImpl.java12
-rw-r--r--camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java12
-rw-r--r--camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java12
-rw-r--r--camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java12
-rw-r--r--camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java42
-rw-r--r--common/BUILD1
13 files changed, 354 insertions, 32 deletions
diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
index 03d66dd3..51a86540 100644
--- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
+++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
@@ -30,6 +30,7 @@ import android.view.Surface;
import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.concurrent.Executor;
import java.util.List;
import java.util.Map;
@@ -77,7 +78,8 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender
return false;
}
- return CameraCharacteristicAvailability.isWBModeAvailable(cameraCharacteristics, MODE);
+ return CameraCharacteristicAvailability.isWBModeAvailable(cameraCharacteristics, MODE) &&
+ CameraCharacteristicAvailability.hasFlashUnit(cameraCharacteristics);
}
/**
@@ -112,8 +114,80 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender
@Override
public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
ProcessResultImpl resultCallback, Executor executor) {
- throw new RuntimeException("The extension doesn't support capture " +
- "results!");
+ Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
+
+ if ((resultCallback != null) && (result != null)) {
+ ArrayList<Pair<CaptureResult.Key, Object>> captureResults =
+ new ArrayList<>();
+ Long shutterTimestamp =
+ result.second.get(CaptureResult.SENSOR_TIMESTAMP);
+ if (shutterTimestamp != null) {
+ Integer aeMode = result.second.get(
+ CaptureResult.CONTROL_AE_MODE);
+ if (aeMode != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AE_MODE,
+ aeMode));
+ }
+
+ Integer aeTrigger = result.second.get(
+ CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER);
+ if (aeTrigger != null) {
+ captureResults.add(new Pair<>(
+ CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER,
+ aeTrigger));
+ }
+
+ Boolean aeLock = result.second.get(CaptureResult.CONTROL_AE_LOCK);
+ if (aeLock != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AE_LOCK,
+ aeLock));
+ }
+
+ Integer aeState = result.second.get(
+ CaptureResult.CONTROL_AE_STATE);
+ if (aeState != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AE_STATE,
+ aeState));
+ }
+
+ Integer flashMode = result.second.get(
+ CaptureResult.FLASH_MODE);
+ if (flashMode != null) {
+ captureResults.add(new Pair<>(CaptureResult.FLASH_MODE,
+ flashMode));
+ }
+
+ Integer flashState = result.second.get(
+ CaptureResult.FLASH_STATE);
+ if (flashState != null) {
+ captureResults.add(new Pair<>(CaptureResult.FLASH_STATE,
+ flashState));
+ }
+
+ Byte jpegQuality = result.second.get(CaptureResult.JPEG_QUALITY);
+ if (jpegQuality != null) {
+ captureResults.add(new Pair<>(CaptureResult.JPEG_QUALITY,
+ jpegQuality));
+ }
+
+ Integer jpegOrientation = result.second.get(
+ CaptureResult.JPEG_ORIENTATION);
+ if (jpegOrientation != null) {
+ captureResults.add(new Pair<>(CaptureResult.JPEG_ORIENTATION,
+ jpegOrientation));
+ }
+
+ if (executor != null) {
+ executor.execute(() -> resultCallback.onCaptureCompleted(
+ shutterTimestamp, captureResults));
+ } else {
+ resultCallback.onCaptureCompleted(shutterTimestamp,
+ captureResults);
+ }
+ }
+ }
+
+ process(results);
}
@Override
@@ -140,6 +214,13 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender
yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
+ Long sensorTimestamp =
+ result.second.get(CaptureResult.SENSOR_TIMESTAMP);
+ if (sensorTimestamp != null) {
+ image.setTimestamp(sensorTimestamp);
+ } else {
+ Log.e(TAG, "Sensor timestamp absent using default!");
+ }
mImageWriter.queueInputImage(image);
}
@@ -240,11 +321,18 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender
@Override
public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
- return null;
+ final CaptureRequest.Key [] CAPTURE_REQUEST_SET = {CaptureRequest.CONTROL_AE_MODE,
+ CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_LOCK,
+ CaptureRequest.FLASH_MODE};
+ return Arrays.asList(CAPTURE_REQUEST_SET);
}
@Override
public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
- return null;
+ final CaptureResult.Key [] CAPTURE_RESULT_SET = {CaptureResult.CONTROL_AE_MODE,
+ CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureResult.CONTROL_AE_LOCK,
+ CaptureResult.CONTROL_AE_STATE, CaptureResult.FLASH_MODE,
+ CaptureResult.FLASH_STATE};
+ return Arrays.asList(CAPTURE_RESULT_SET);
}
}
diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java
index 8c43d345..45c7f47c 100644
--- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java
+++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java
@@ -68,7 +68,8 @@ public final class BokehPreviewExtenderImpl implements PreviewExtenderImpl {
return false;
}
- return CameraCharacteristicAvailability.isWBModeAvailable(cameraCharacteristics, MODE);
+ return CameraCharacteristicAvailability.isWBModeAvailable(cameraCharacteristics, MODE) &&
+ CameraCharacteristicAvailability.hasFlashUnit(cameraCharacteristics);
}
/**
diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java
index 0b51c7c5..f7c6569c 100644
--- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java
+++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java
@@ -18,6 +18,7 @@ package androidx.camera.extensions.impl;
import android.hardware.camera2.CameraCharacteristics;
import android.util.Log;
+import android.util.Range;
import java.util.Arrays;
@@ -31,6 +32,54 @@ final class CameraCharacteristicAvailability {
}
/**
+ * Check if the given device supports flash.
+ *
+ * @param cameraCharacteristics the camera characteristics.
+ * @return {@code true} if the device supports flash
+ * {@code false} otherwise.
+ */
+ static boolean hasFlashUnit(CameraCharacteristics cameraCharacteristics) {
+ Boolean flashInfo = cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
+
+ return (flashInfo != null) ? flashInfo : false;
+ }
+
+ /**
+ * Check if the given device supports zoom ratio.
+ *
+ * @param cameraCharacteristics the camera characteristics.
+ * @return {@code true} if the device supports zoom ratio
+ * {@code false} otherwise.
+ */
+ static boolean supportsZoomRatio(CameraCharacteristics cameraCharacteristics) {
+ Range<Float> zoomRatioRange = cameraCharacteristics.get(
+ CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE);
+
+ return (zoomRatioRange != null) && (zoomRatioRange.getUpper() > 1.f);
+ }
+
+ /**
+ * Check if the given device is fixed focus or not.
+ *
+ * @param cameraCharacteristics the camera characteristics.
+ * @return {@code true} if the device is not fixed focus
+ * {@code false} otherwise.
+ */
+ static boolean hasFocuser(CameraCharacteristics cameraCharacteristics) {
+ Float minFocusDistance = cameraCharacteristics.get(
+ CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
+ if (minFocusDistance == null) {
+ Log.d(TAG, "No LENS_INFO_MINIMUM_FOCUS_DISTANCE info");
+ return false;
+ }
+
+ if (minFocusDistance > 0.f) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Check if the given white balance mode id is available in the camera characteristics.
*
* @param cameraCharacteristics the camera characteristics.
diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
index a1bad670..5f745e96 100644
--- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
+++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
@@ -20,12 +20,12 @@ import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.params.MeteringRectangle;
import android.media.Image;
import android.media.ImageWriter;
import android.os.Build;
import android.util.Log;
import android.util.Pair;
-import android.util.Range;
import android.util.Size;
import android.view.Surface;
@@ -52,10 +52,6 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm
private static final int NORMAL_STAGE_ID = 1;
private static final int OVER_STAGE_ID = 2;
private static final int SESSION_STAGE_ID = 101;
- private static final CaptureRequest.Key<Float> SUPPORTED_CAPTURE_REQUEST_KEY =
- CaptureRequest.CONTROL_ZOOM_RATIO;
- private static final CaptureResult.Key<Float> SUPPORTED_CAPTURE_RESULT_KEY =
- CaptureResult.CONTROL_ZOOM_RATIO;
/**
* @hide
@@ -76,17 +72,14 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm
@Override
public boolean isExtensionAvailable(String cameraId,
CameraCharacteristics cameraCharacteristics) {
- boolean zoomRatioSupported = false;
- if (cameraCharacteristics != null) {
- Range<Float> zoomRatioRange = cameraCharacteristics.get(
- CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE);
-
- zoomRatioSupported = (zoomRatioRange != null) && (zoomRatioRange.getUpper() > 1.f);
- }
+ boolean zoomRatioSupported =
+ CameraCharacteristicAvailability.supportsZoomRatio(cameraCharacteristics);
+ boolean hasFocuser =
+ CameraCharacteristicAvailability.hasFocuser(cameraCharacteristics);
// Requires API 23 for ImageWriter
return (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) &&
- zoomRatioSupported;
+ zoomRatioSupported && hasFocuser;
}
/**
@@ -143,14 +136,39 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm
if ((resultCallback != null) && (result != null)) {
ArrayList<Pair<CaptureResult.Key, Object>> captureResults =
new ArrayList<>();
- Long shutterTimestamp =
- result.second.get(CaptureResult.SENSOR_TIMESTAMP);
+ Long shutterTimestamp = results.get(UNDER_STAGE_ID).second.get(
+ CaptureResult.SENSOR_TIMESTAMP);
if (shutterTimestamp != null) {
- Float zoomRatio = result.second.get(SUPPORTED_CAPTURE_RESULT_KEY);
+ Float zoomRatio = result.second.get(
+ CaptureResult.CONTROL_ZOOM_RATIO);
if (zoomRatio != null) {
- captureResults.add(new Pair<>(SUPPORTED_CAPTURE_RESULT_KEY,
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_ZOOM_RATIO,
zoomRatio));
}
+ Integer afMode = result.second.get(
+ CaptureResult.CONTROL_AF_MODE);
+ if (afMode != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AF_MODE,
+ afMode));
+ }
+ Integer afTrigger = result.second.get(
+ CaptureResult.CONTROL_AF_TRIGGER);
+ if (afTrigger != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AF_TRIGGER,
+ afTrigger));
+ }
+ Integer afState = result.second.get(
+ CaptureResult.CONTROL_AF_STATE);
+ if (afState != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AF_STATE,
+ afState));
+ }
+ MeteringRectangle[] afRegions = result.second.get(
+ CaptureResult.CONTROL_AF_REGIONS);
+ if (afRegions != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AF_REGIONS,
+ afRegions));
+ }
Byte jpegQuality = result.second.get(CaptureResult.JPEG_QUALITY);
if (jpegQuality != null) {
@@ -227,7 +245,7 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm
NORMAL_STAGE_ID).first.getPlanes()[1].getBuffer());
image.setTimestamp(imageDataPairs.get(
- NORMAL_STAGE_ID).first.getTimestamp());
+ UNDER_STAGE_ID).first.getTimestamp());
mImageWriter.queueInputImage(image);
}
@@ -314,11 +332,17 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm
@Override
public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
- return Arrays.asList(SUPPORTED_CAPTURE_REQUEST_KEY);
+ final CaptureRequest.Key [] CAPTURE_REQUEST_SET = {CaptureRequest.CONTROL_ZOOM_RATIO,
+ CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_REGIONS,
+ CaptureRequest.CONTROL_AF_TRIGGER};
+ return Arrays.asList(CAPTURE_REQUEST_SET);
}
@Override
public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
- return Arrays.asList(SUPPORTED_CAPTURE_RESULT_KEY);
+ final CaptureResult.Key [] CAPTURE_RESULT_SET = {CaptureResult.CONTROL_ZOOM_RATIO,
+ CaptureResult.CONTROL_AF_MODE, CaptureResult.CONTROL_AF_REGIONS,
+ CaptureResult.CONTROL_AF_TRIGGER, CaptureResult.CONTROL_AF_STATE};
+ return Arrays.asList(CAPTURE_RESULT_SET);
}
}
diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java
index 5f36d512..78b0a9d0 100644
--- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java
+++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.params.MeteringRectangle;
import android.media.ImageWriter;
import android.media.Image;
import android.util.Pair;
@@ -41,8 +42,6 @@ import java.util.List;
*/
public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl {
private static final int DEFAULT_STAGE_ID = 0;
- private static final CaptureResult.Key<Float> SUPPORTED_CAPTURE_RESULT_KEY =
- CaptureResult.CONTROL_ZOOM_RATIO;
ImageWriter mWriter;
@@ -64,8 +63,14 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl {
@Override
public boolean isExtensionAvailable(String cameraId,
CameraCharacteristics cameraCharacteristics) {
- // Implement the logic to check whether the extension function is supported or not.
- return true;
+ boolean zoomRatioSupported =
+ CameraCharacteristicAvailability.supportsZoomRatio(cameraCharacteristics);
+ boolean hasFocuser =
+ CameraCharacteristicAvailability.hasFocuser(cameraCharacteristics);
+
+ // Requires API 23 for ImageWriter
+ return (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) &&
+ zoomRatioSupported && hasFocuser;
}
/**
@@ -137,10 +142,27 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl {
ArrayList<Pair<CaptureResult.Key, Object>> captureResults = new ArrayList<>();
Long shutterTimestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
if (shutterTimestamp != null) {
- Float zoomRatio = result.get(SUPPORTED_CAPTURE_RESULT_KEY);
+ Float zoomRatio = result.get(CaptureResult.CONTROL_ZOOM_RATIO);
if (zoomRatio != null) {
- captureResults.add(new Pair<>(SUPPORTED_CAPTURE_RESULT_KEY, zoomRatio));
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_ZOOM_RATIO, zoomRatio));
}
+ Integer afMode = result.get(CaptureResult.CONTROL_AF_MODE);
+ if (afMode != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AF_MODE, afMode));
+ }
+ Integer afTrigger = result.get(CaptureResult.CONTROL_AF_TRIGGER);
+ if (afTrigger != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AF_TRIGGER, afTrigger));
+ }
+ Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
+ if (afState != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AF_STATE, afState));
+ }
+ MeteringRectangle[] afRegions = result.get(CaptureResult.CONTROL_AF_REGIONS);
+ if (afRegions != null) {
+ captureResults.add(new Pair<>(CaptureResult.CONTROL_AF_REGIONS, afRegions));
+ }
+
Byte jpegQuality = result.get(CaptureResult.JPEG_QUALITY);
if (jpegQuality != null) {
diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java
index 86424c41..97c02c83 100644
--- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java
+++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java
@@ -18,9 +18,12 @@ package androidx.camera.extensions.impl.advanced;
import android.annotation.SuppressLint;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
import android.util.Range;
import android.util.Size;
+import androidx.annotation.NonNull;
import androidx.camera.extensions.impl.ExtensionVersionImpl;
import java.util.List;
@@ -135,4 +138,36 @@ public interface AdvancedExtenderImpl {
* required for starting a extension and cleanup.
*/
SessionProcessorImpl createSessionProcessor();
+
+ /**
+ * Return a list of orthogonal capture request keys.
+ *
+ * <p>Any keys included in the list will be configurable by clients of the extension and will
+ * affect the extension functionality.</p>
+ *
+ * <p>If supported, then controls 'android.jpeg.quality' and 'android.jpeg.orientation' must
+ * always be present in the supported list.</p>
+ *
+ * @return List of supported orthogonal capture keys, or
+ * an empty list if no capture settings are not supported.
+ * @since 1.3
+ */
+ @NonNull
+ List<CaptureRequest.Key> getAvailableCaptureRequestKeys();
+
+ /**
+ * Return a list of supported capture result keys.
+ *
+ * <p>Any keys included in this list must be available as part of the registered
+ * {@link SessionProcessorImpl.CaptureCallback#onCaptureCompleted} callback.</p>
+ *
+ * <p>At the very minimum, it is expected that the result key list is a superset of the
+ * capture request keys.</p>
+ *
+ * @return List of supported capture result keys, or
+ * an empty list if capture results are not supported.
+ * @since 1.3
+ */
+ @NonNull
+ List<CaptureResult.Key> getAvailableCaptureResultKeys();
}
diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AutoAdvancedExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AutoAdvancedExtenderImpl.java
index 7753258b..0d3bd4a0 100644
--- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AutoAdvancedExtenderImpl.java
+++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/AutoAdvancedExtenderImpl.java
@@ -18,6 +18,8 @@ package androidx.camera.extensions.impl.advanced;
import android.annotation.SuppressLint;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
import android.util.Range;
import android.util.Size;
@@ -76,4 +78,14 @@ public class AutoAdvancedExtenderImpl implements AdvancedExtenderImpl {
public SessionProcessorImpl createSessionProcessor() {
throw new RuntimeException("Stub, replace with implementation.");
}
+
+ @Override
+ public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
+
+ @Override
+ public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
}
diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BeautyAdvancedExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BeautyAdvancedExtenderImpl.java
index 91d8171b..1dec3266 100644
--- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BeautyAdvancedExtenderImpl.java
+++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BeautyAdvancedExtenderImpl.java
@@ -18,6 +18,8 @@ package androidx.camera.extensions.impl.advanced;
import android.annotation.SuppressLint;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
import android.util.Range;
import android.util.Size;
@@ -76,4 +78,14 @@ public class BeautyAdvancedExtenderImpl implements AdvancedExtenderImpl {
public SessionProcessorImpl createSessionProcessor() {
throw new RuntimeException("Stub, replace with implementation.");
}
+
+ @Override
+ public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
+
+ @Override
+ public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
}
diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java
index b05740d0..bc41b4e0 100644
--- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java
+++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java
@@ -18,6 +18,8 @@ package androidx.camera.extensions.impl.advanced;
import android.annotation.SuppressLint;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
import android.util.Range;
import android.util.Size;
@@ -76,4 +78,14 @@ public class BokehAdvancedExtenderImpl implements AdvancedExtenderImpl {
public SessionProcessorImpl createSessionProcessor() {
throw new RuntimeException("Stub, replace with implementation.");
}
+
+ @Override
+ public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
+
+ @Override
+ public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
}
diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java
index bfd8e9a5..06157dc3 100644
--- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java
+++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java
@@ -18,6 +18,8 @@ package androidx.camera.extensions.impl.advanced;
import android.annotation.SuppressLint;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
import android.util.Range;
import android.util.Size;
@@ -77,4 +79,14 @@ public class HdrAdvancedExtenderImpl implements AdvancedExtenderImpl {
public SessionProcessorImpl createSessionProcessor() {
throw new RuntimeException("Stub, replace with implementation.");
}
+
+ @Override
+ public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
+
+ @Override
+ public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
}
diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java
index fc052240..97da5c14 100644
--- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java
+++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java
@@ -18,6 +18,8 @@ package androidx.camera.extensions.impl.advanced;
import android.annotation.SuppressLint;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
import android.util.Range;
import android.util.Size;
@@ -76,4 +78,14 @@ public class NightAdvancedExtenderImpl implements AdvancedExtenderImpl {
public SessionProcessorImpl createSessionProcessor() {
throw new RuntimeException("Stub, replace with implementation.");
}
+
+ @Override
+ public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
+
+ @Override
+ public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
+ throw new RuntimeException("Stub, replace with implementation.");
+ }
}
diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java
index 9ac3eeb7..4ad05d8d 100644
--- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java
+++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java
@@ -19,6 +19,7 @@ package androidx.camera.extensions.impl.advanced;
import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.CaptureRequest;
import android.view.Surface;
@@ -132,6 +133,22 @@ public interface SessionProcessorImpl {
void setParameters(Map<CaptureRequest.Key<?>, Object> parameters);
/**
+ * CameraX / Camera2 will call this interface in response to client requests involving
+ * the output preview surface. Typical examples include requests that include AF/AE triggers.
+ * Extensions can disregard any capture request keys that were not advertised in
+ * {@link AdvancedExtenderImpl#getAvailableCaptureRequestKeys}.
+ *
+ * @param triggers Capture request key value map.
+ * @param callback a callback to report the status.
+ * @return the id of the capture sequence.
+ *
+ * @throws IllegalArgumentException If there are no valid settings that can be applied
+ *
+ * @since 1.3
+ */
+ int startTrigger(Map<CaptureRequest.Key<?>, Object> triggers, CaptureCallback callback);
+
+ /**
* This will be invoked once after the {@link android.hardware.camera2.CameraCaptureSession}
* has been created. {@link RequestProcessorImpl} is passed for OEM to submit single
* requests or set repeating requests. This ExtensionRequestProcessor will be valid to use
@@ -245,5 +262,30 @@ public interface SessionProcessorImpl {
* @param captureSequenceId id of the current capture sequence
*/
void onCaptureSequenceAborted(int captureSequenceId);
+
+ /**
+ * Capture result callback that needs to be called when the process capture results are
+ * ready as part of frame post-processing.
+ *
+ * This callback will fire after {@link #onCaptureStarted}, {@link #onCaptureProcessStarted}
+ * and before {@link #onCaptureSequenceCompleted}. The callback is not expected to fire
+ * in case of capture failure {@link #onCaptureFailed} or capture abort
+ * {@link #onCaptureSequenceAborted}.
+ *
+ * @param timestamp The timestamp at start of capture. The same timestamp value
+ * passed to {@link #onCaptureStarted}.
+ * @param captureSequenceId the capture id of the request that generated the capture
+ * results. This is the return value of either
+ * {@link #startRepeating} or {@link #startCapture}.
+ * @param result Map containing the supported capture results. Do note
+ * that if results 'android.jpeg.quality' and
+ * 'android.jpeg.orientation' are present in the process
+ * capture input results, then the values must also be passed
+ * as part of this callback. Both Camera2 and CameraX guarantee
+ * that those two settings and results are always supported and
+ * applied by the corresponding framework.
+ */
+ void onCaptureCompleted(long timestamp, int captureSequenceId,
+ Map<CaptureResult.Key, Object> result);
}
}
diff --git a/common/BUILD b/common/BUILD
index f7ce4868..80893a06 100644
--- a/common/BUILD
+++ b/common/BUILD
@@ -15,4 +15,5 @@ android_library(
custom_package = "com.android.common",
manifest = "AndroidManifest.xml",
visibility = ["//visibility:public"],
+ deps = ["//prebuilts/sdk:public_current_android_sdk_java_import"],
)