diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-28 16:17:55 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-28 16:17:55 +0000 |
commit | 37acedad2399434b61b5fa1bc607ef576ef925a7 (patch) | |
tree | 99f44b38acff243e00559f9143f9eda104161d22 | |
parent | 84734acf71c00b3b3a42c3f8011099efbf5522bb (diff) | |
parent | e7267e37ed1a9d9440baccb8d8f3ea1eccb0bb52 (diff) | |
download | ex-37acedad2399434b61b5fa1bc607ef576ef925a7.tar.gz |
Snap for 8512216 from e7267e37ed1a9d9440baccb8d8f3ea1eccb0bb52 to tm-frc-neuralnetworks-release
Change-Id: I1475f2f40570e77cc49568294d32b71108a3e62e
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"], ) |