From cf27eb19cd0f663971cfb477487f2360f6facc94 Mon Sep 17 00:00:00 2001 From: Jared Duke Date: Fri, 15 Apr 2022 16:03:16 -0700 Subject: Remove stale proguard.flags reference As part of the effort to enable transitive inheritance of java_library Proguard references, remove references to nonexistent proguard files. Bug: 212623640 Test: m Change-Id: I8fdc26a16cf6ac275561084e6c6301b5433b24af --- framesequence/Android.bp | 3 --- 1 file changed, 3 deletions(-) diff --git a/framesequence/Android.bp b/framesequence/Android.bp index 9a6d0f55..8d44f1d2 100644 --- a/framesequence/Android.bp +++ b/framesequence/Android.bp @@ -22,7 +22,4 @@ java_library { name: "android-common-framesequence", sdk_version: "8", srcs: ["src/**/*.java"], - optimize: { - proguard_flags_files: ["proguard.flags"], - }, } -- cgit v1.2.3 From 9adf4cc3c4721fae394540107a3784906c70c8cb Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Tue, 21 Jun 2022 13:21:15 -0700 Subject: Camera: Synchronize access to 'mWriter' during HDR preview The HDR preview extension tries to emulate a preview processor by forwarding all incoming preview frames directly to the registered output surface. At the moment, the preview extension 'deInit' can be called from a different thread than the one that triggers preview processing. This can result in a race condition when trying to attach new buffers in the image writer. Test: test -c -d cts/tests/camera/src/android/hardware/camera2/cts/CameraExtensionSessionTest.java#testCloseExtensionSession --iterations=10 and check for any extension proxy crashes Bug: 235940605 Change-Id: I8d7848f3785f6041b6909170cbea3314e6b43cb7 --- .../extensions/impl/HdrPreviewExtenderImpl.java | 37 +++++++++++++++------- 1 file changed, 26 insertions(+), 11 deletions(-) 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 78b0a9d0..7cbe9243 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 @@ -27,6 +27,7 @@ import android.util.Pair; import android.util.Size; import android.view.Surface; +import java.io.Closeable; import java.util.ArrayList; import java.util.concurrent.Executor; import java.util.List; @@ -43,8 +44,6 @@ import java.util.List; public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl { private static final int DEFAULT_STAGE_ID = 0; - ImageWriter mWriter; - /** * @hide */ @@ -109,17 +108,32 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl { return null; } - private PreviewImageProcessorImpl mProcessor = new PreviewImageProcessorImpl() { + private HdrPreviewProcessor mProcessor = new HdrPreviewProcessor(); + + private static class HdrPreviewProcessor implements PreviewImageProcessorImpl, Closeable { Surface mSurface; int mFormat = -1; + final Object mLock = new Object(); // Synchronize access to 'mWriter' + ImageWriter mWriter; - private void setWindowSurface() { - if (mSurface != null && mFormat >= 0) { + public void close() { + synchronized(mLock) { if (mWriter != null) { mWriter.close(); + mWriter = null; } + } + } - mWriter = ImageWriter.newInstance(mSurface, 2, mFormat); + private void setWindowSurface() { + synchronized(mLock) { + if (mSurface != null && mFormat >= 0) { + if (mWriter != null) { + mWriter.close(); + } + + mWriter = ImageWriter.newInstance(mSurface, 2, mFormat); + } } } @@ -132,7 +146,11 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl { @Override public void process(Image image, TotalCaptureResult result) { - mWriter.queueInputImage(image); + synchronized(mLock) { + if (mWriter != null) { + mWriter.queueInputImage(image); + } + } } @Override @@ -209,10 +227,7 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl { */ @Override public void onDeInit() { - if (mWriter != null) { - mWriter.close(); - mWriter = null; - } + mProcessor.close(); } /** -- cgit v1.2.3 From 905c184b0d7045235791872ed01a85b1e3aa8f6b Mon Sep 17 00:00:00 2001 From: Ravneet Date: Thu, 15 Sep 2022 22:34:36 +0000 Subject: Add support for capture settings/results to advanced extension sample - Add startTrigger example impl to advanced extension sample to support capture request and capture result keys - Updates for code readability Test: CTS tests Bug: 233231017 Change-Id: I7384cd11cb6e5d7adb1a7567482c1324268397e3 --- .../impl/advanced/BaseAdvancedExtenderImpl.java | 123 ++++++++++++++++++--- .../impl/advanced/BokehAdvancedExtenderImpl.java | 23 ++++ .../impl/advanced/HdrAdvancedExtenderImpl.java | 31 +++++- .../impl/advanced/NightAdvancedExtenderImpl.java | 2 + 4 files changed, 161 insertions(+), 18 deletions(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java index 2e5e9451..6758a325 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java @@ -51,12 +51,13 @@ import java.util.Arrays; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.Executor; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @SuppressLint("UnknownNullness") -public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { +public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { static { try { @@ -72,10 +73,8 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { } @Override - public boolean isExtensionAvailable(String cameraId, - Map characteristicsMap) { - return false; - } + public abstract boolean isExtensionAvailable(String cameraId, + Map characteristicsMap); @Override public void init(String cameraId, @@ -209,7 +208,7 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { } protected void addSessionParameter(Camera2SessionConfigImplBuilder builder) { - + // default empty implementation } @Override @@ -243,11 +242,75 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { } } + protected void addTriggerRequestKeys(RequestBuilder builder, + Map, Object> triggers) { + HashSet supportedCaptureRequestKeys = + new HashSet<>(getAvailableCaptureRequestKeys()); + + for (CaptureRequest.Key key : triggers.keySet()) { + if (supportedCaptureRequestKeys.contains(key)) { + Object value = triggers.get(key); + builder.setParameters(key, value); + } + } + } + @Override public int startTrigger(Map, Object> triggers, - CaptureCallback callback) { - /* TODO */ - return 0; + CaptureCallback captureCallback) { + RequestBuilder builder = new RequestBuilder(mPreviewOutputConfig.getId(), + CameraDevice.TEMPLATE_PREVIEW, 0); + addTriggerRequestKeys(builder, triggers); + + final int seqId = mNextCaptureSequenceId.getAndIncrement(); + + RequestProcessorImpl.Callback callback = new RequestProcessorImpl.Callback() { + @Override + public void onCaptureStarted(RequestProcessorImpl.Request request, long frameNumber, + long timestamp) { + captureCallback.onCaptureStarted(seqId, timestamp); + } + + @Override + public void onCaptureProgressed(RequestProcessorImpl.Request request, + CaptureResult partialResult) { + + } + + @Override + public void onCaptureCompleted(RequestProcessorImpl.Request request, + TotalCaptureResult totalCaptureResult) { + addCaptureResultKeys(seqId, totalCaptureResult, captureCallback); + + captureCallback.onCaptureProcessStarted(seqId); + } + + @Override + public void onCaptureFailed(RequestProcessorImpl.Request request, + CaptureFailure captureFailure) { + captureCallback.onCaptureFailed(seqId); + } + + @Override + public void onCaptureBufferLost(RequestProcessorImpl.Request request, + long frameNumber, int outputStreamId) { + captureCallback.onCaptureFailed(seqId); + } + + @Override + public void onCaptureSequenceCompleted(int sequenceId, long frameNumber) { + captureCallback.onCaptureSequenceCompleted(seqId); + } + + @Override + public void onCaptureSequenceAborted(int sequenceId) { + captureCallback.onCaptureSequenceAborted(seqId); + } + }; + + mRequestProcessor.submit(builder.build(), callback); + + return seqId; } @Override @@ -262,6 +325,8 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { .Builder(mCaptureOutputSurfaceConfig.getSurface()) .setImageFormat(ImageFormat.JPEG) .setMaxImages(MAX_NUM_IMAGES) + // For JPEG format, width x height should be set to (w*h) x 1 + // since the JPEG image is returned as a 1D byte array .setWidthAndHeight(mCaptureOutputSurfaceConfig.getSize().getWidth() * mCaptureOutputSurfaceConfig.getSize().getHeight(), 1) .build(); @@ -308,6 +373,8 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { @Override public void onCaptureCompleted(RequestProcessorImpl.Request request, TotalCaptureResult totalCaptureResult) { + addCaptureResultKeys(seqId, totalCaptureResult, captureCallback); + captureCallback.onCaptureProcessStarted(seqId); } @@ -339,6 +406,28 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { return seqId; } + protected void addCaptureResultKeys( + @NonNull int seqId, + @NonNull TotalCaptureResult result, + @NonNull CaptureCallback captureCallback) { + HashMap captureResults = new HashMap<>(); + + Long shutterTimestamp = result.get(CaptureResult.SENSOR_TIMESTAMP); + + if (shutterTimestamp != null) { + + List captureResultKeys = getAvailableCaptureResultKeys(); + for (CaptureResult.Key key : captureResultKeys) { + if (result.get(key) != null) { + captureResults.put(key, result.get(key)); + } + } + + captureCallback.onCaptureCompleted(shutterTimestamp, seqId, + captureResults); + } + } + protected void addCaptureRequestParameters(List requestList) { RequestBuilder build = new RequestBuilder(mCaptureOutputConfig.getId(), CameraDevice.TEMPLATE_STILL_CAPTURE, DEFAULT_CAPTURE_ID); @@ -373,6 +462,8 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { RequestBuilder.RequestProcessorRequest requestProcessorRequest = (RequestBuilder.RequestProcessorRequest) request; + addCaptureResultKeys(seqId, totalCaptureResult, captureCallback); + mImageCaptureCaptureResultImageMatcher.setCameraCaptureCallback( totalCaptureResult, requestProcessorRequest.getCaptureStageId()); @@ -453,6 +544,7 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { } if (captureSurfaceWriterImageFormat == ImageFormat.JPEG) { + // Simple processing sample that encodes image from YUV to JPEG Image yuvImage = imageDataPairs.get(DEFAULT_CAPTURE_ID).first.get(); Integer jpegOrientation = JPEG_DEFAULT_ROTATION; @@ -470,6 +562,7 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { resultImage.setTimestamp(yuvImage.getTimestamp()); } else { + // Simple processing sample that transfers bytes and returns image as is ByteBuffer yByteBuffer = resultImage.getPlanes()[0].getBuffer(); ByteBuffer uByteBuffer = resultImage.getPlanes()[2].getBuffer(); ByteBuffer vByteBuffer = resultImage.getPlanes()[1].getBuffer(); @@ -509,17 +602,19 @@ public class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { } @Override - public SessionProcessorImpl createSessionProcessor() { - return new BaseAdvancedSessionProcessor(); - } + public abstract SessionProcessorImpl createSessionProcessor(); @Override public List getAvailableCaptureRequestKeys() { - return new ArrayList<>(); + final CaptureRequest.Key [] CAPTURE_REQUEST_SET = {CaptureRequest.JPEG_QUALITY, + CaptureRequest.JPEG_ORIENTATION}; + return Arrays.asList(CAPTURE_REQUEST_SET); } @Override public List getAvailableCaptureResultKeys() { - return new ArrayList<>(); + final CaptureResult.Key [] CAPTURE_RESULT_SET = {CaptureResult.JPEG_QUALITY, + CaptureResult.JPEG_ORIENTATION}; + return Arrays.asList(CAPTURE_RESULT_SET); } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java index 08bb871b..01569911 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BokehAdvancedExtenderImpl.java @@ -24,6 +24,8 @@ import android.graphics.ImageFormat; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.CaptureResult; +import android.hardware.camera2.TotalCaptureResult; import android.os.Build; import android.util.Log; @@ -33,6 +35,9 @@ import android.view.Surface; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -89,4 +94,22 @@ public class BokehAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { public SessionProcessorImpl createSessionProcessor() { return new BokehAdvancedSessionProcessor(); } + + @Override + public List getAvailableCaptureRequestKeys() { + final CaptureRequest.Key [] CAPTURE_REQUEST_SET = {CaptureRequest.CONTROL_AE_MODE, + CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_LOCK, + CaptureRequest.FLASH_MODE, CaptureRequest.JPEG_QUALITY, + CaptureRequest.JPEG_ORIENTATION}; + return Arrays.asList(CAPTURE_REQUEST_SET); + } + + @Override + public List getAvailableCaptureResultKeys() { + 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, CaptureResult.JPEG_QUALITY, CaptureResult.JPEG_ORIENTATION}; + return Arrays.asList(CAPTURE_RESULT_SET); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java index 420024e4..6d9e013d 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java @@ -215,7 +215,7 @@ public class HdrAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { @NonNull TotalCaptureResult totalCaptureResult, int captureId) { processImageCapture(imageReferenceImpl, totalCaptureResult, - captureId); + captureId, seqId, captureCallback); } }); } @@ -223,10 +223,11 @@ public class HdrAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { return seqId; } - @Override - protected void processImageCapture(@NonNull ImageReferenceImpl imageReferenceImpl, + private void processImageCapture(@NonNull ImageReferenceImpl imageReferenceImpl, @NonNull TotalCaptureResult totalCaptureResult, - int captureId) { + int captureId, + int seqId, + @NonNull CaptureCallback captureCallback) { mCaptureResults.put(captureId, new Pair<>(imageReferenceImpl, totalCaptureResult)); @@ -256,6 +257,8 @@ public class HdrAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { JpegEncoder.encodeToJpeg(yuvImage, resultImage, jpegOrientation, JPEG_DEFAULT_QUALITY); + addCaptureResultKeys(seqId, imageDataPairs.get(UNDER_EXPOSED_CAPTURE_ID) + .second, captureCallback); resultImage.setTimestamp(imageDataPairs.get(UNDER_EXPOSED_CAPTURE_ID) .first.get().getTimestamp()); @@ -271,6 +274,8 @@ public class HdrAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { vByteBuffer.put(imageDataPairs.get( NORMAL_EXPOSED_CAPTURE_ID).first.get().getPlanes()[1].getBuffer()); + addCaptureResultKeys(seqId, imageDataPairs.get(UNDER_EXPOSED_CAPTURE_ID) + .second, captureCallback); resultImage.setTimestamp(imageDataPairs.get( UNDER_EXPOSED_CAPTURE_ID).first.get().getTimestamp()); } @@ -294,4 +299,22 @@ public class HdrAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { public SessionProcessorImpl createSessionProcessor() { return new HDRAdvancedSessionProcessor(); } + + @Override + public List getAvailableCaptureRequestKeys() { + final CaptureRequest.Key [] CAPTURE_REQUEST_SET = {CaptureRequest.CONTROL_ZOOM_RATIO, + CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_REGIONS, + CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.JPEG_QUALITY, + CaptureRequest.JPEG_ORIENTATION}; + return Arrays.asList(CAPTURE_REQUEST_SET); + } + + @Override + public List getAvailableCaptureResultKeys() { + 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, + CaptureResult.JPEG_QUALITY, CaptureResult.JPEG_ORIENTATION}; + return Arrays.asList(CAPTURE_RESULT_SET); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java index bf20597e..31c79404 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java @@ -229,6 +229,8 @@ public class NightAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { public void onCaptureCompleted(RequestProcessorImpl.Request request, TotalCaptureResult totalCaptureResult) { + addCaptureResultKeys(seqId, totalCaptureResult, captureCallback); + mCaptureResultImageMatcher.setCameraCaptureCallback( totalCaptureResult); -- cgit v1.2.3 From 2dd32e656614dfeebae1e4c2684200ae680bea93 Mon Sep 17 00:00:00 2001 From: Ravneet Date: Fri, 30 Sep 2022 05:04:19 +0000 Subject: Exclude kotlin generated files from camera extensions package - Advanced extensions generate kotlin files due to usage of androidx.annotation causing CTS test StrictJavaPackagesTest.testNoKotlinFilesInClasspaths to fail - Add jarjar rule for kotlin classes introduced from usage of androidx.annotation to fix failure in StrictJavaPackagesTest. testApkInApex_nonClasspathClasses Test: CTS test Bug: 233231017 Change-Id: I6db1e90eb6f24c452db651f95f5fee545bf10c3d --- camera2/extensions/advancedSample/Android.bp | 2 ++ camera2/extensions/advancedSample/jarjar-rules.txt | 1 + 2 files changed, 3 insertions(+) create mode 100644 camera2/extensions/advancedSample/jarjar-rules.txt diff --git a/camera2/extensions/advancedSample/Android.bp b/camera2/extensions/advancedSample/Android.bp index bf5ca793..9f0df8e4 100644 --- a/camera2/extensions/advancedSample/Android.bp +++ b/camera2/extensions/advancedSample/Android.bp @@ -22,9 +22,11 @@ java_library { static_libs: [ "androidx.annotation_annotation" ], + exclude_kotlinc_generated_files: true, srcs: ["src/**/*.java"], sdk_version: "current", vendor: true, + jarjar_rules: "jarjar-rules.txt", } prebuilt_etc { diff --git a/camera2/extensions/advancedSample/jarjar-rules.txt b/camera2/extensions/advancedSample/jarjar-rules.txt new file mode 100644 index 00000000..7442cef5 --- /dev/null +++ b/camera2/extensions/advancedSample/jarjar-rules.txt @@ -0,0 +1 @@ +rule kotlin.** androidx.camera.extensions.impl.advanced.@0 \ No newline at end of file -- cgit v1.2.3 From b19233662735f5303ff07948dd5877945dce3671 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Tue, 18 Oct 2022 09:43:44 -0700 Subject: Camera Extension sample: Update CaptureProcessorImpl It appears that we have a delta in the sample vs. stub inheritance hierarchy that was uncovered by a recent JVM update. Sync the CaptureProcessorImpl with the stubs to avoid possible exceptions. Bug: 254142725 Test: atest -c -d cts/tests/camera/src/android/hardware/camera2/cts/CameraExtensionSessionTest.java Change-Id: Ic415c6c5889e856140b85384f2eacad05d360af3 --- .../extensions/impl/CaptureProcessorImpl.java | 48 ++++------------------ .../extensions/impl/CaptureProcessorImpl.java | 48 ++++------------------ 2 files changed, 18 insertions(+), 78 deletions(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java index efd0afac..3eee146a 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java @@ -16,42 +16,32 @@ package androidx.camera.extensions.impl; +import android.annotation.SuppressLint; +import android.graphics.ImageFormat; import android.hardware.camera2.TotalCaptureResult; import android.media.Image; import android.util.Pair; -import android.util.Size; import android.view.Surface; -import java.util.concurrent.Executor; import java.util.Map; +import java.util.concurrent.Executor; /** * The interface for processing a set of {@link Image}s that have captured. * * @since 1.0 - * @hide */ -public interface CaptureProcessorImpl { - /** - * This gets called to update where the CaptureProcessor should write the output of {@link - * #process(Map)}. - * - * @param surface The {@link Surface} that the CaptureProcessor should write data into. - * @param imageFormat The format of that the surface expects. - * @hide - */ - void onOutputSurface(Surface surface, int imageFormat); - +@SuppressLint("UnknownNullness") +public interface CaptureProcessorImpl extends ProcessorImpl { /** * Process a set images captured that were requested. * *

The result of the processing step should be written to the {@link Surface} that was * received by {@link #onOutputSurface(Surface, int)}. * - * @param results The map of images and metadata to process. The {@link Image} that are - * contained within the map will become invalid after this method completes, - * so no references to them should be kept. - * @hide + * @param results The map of {@link ImageFormat#YUV_420_888} format images and metadata to + * process. The {@link Image} that are contained within the map will become + * invalid after this method completes, so no references to them should be kept. */ void process(Map> results); @@ -66,31 +56,11 @@ public interface CaptureProcessorImpl { * become invalid after this method completes, so no references to them * should be kept. * @param resultCallback Capture result callback to be called once the capture result - * values are ready. + * values of the processed image are ready. * @param executor The executor to run the callback on. If null then the callback will * run on any arbitrary executor. * @since 1.3 */ void process(Map> results, ProcessResultImpl resultCallback, Executor executor); - - /** - * This callback will be invoked when CameraX changes the configured input resolution. After - * this call, {@link CaptureProcessorImpl} should expect any {@link Image} received as input - * to be at the specified resolution. - * - * @param size for the surface. - * @hide - */ - void onResolutionUpdate(Size size); - - /** - * This callback will be invoked when CameraX changes the configured input image format. - * After this call, {@link CaptureProcessorImpl} should expect any {@link Image} received as - * input to have the specified image format. - * - * @param imageFormat for the surface. - * @hide - */ - void onImageFormatUpdate(int imageFormat); } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java index efd0afac..3eee146a 100644 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java @@ -16,42 +16,32 @@ package androidx.camera.extensions.impl; +import android.annotation.SuppressLint; +import android.graphics.ImageFormat; import android.hardware.camera2.TotalCaptureResult; import android.media.Image; import android.util.Pair; -import android.util.Size; import android.view.Surface; -import java.util.concurrent.Executor; import java.util.Map; +import java.util.concurrent.Executor; /** * The interface for processing a set of {@link Image}s that have captured. * * @since 1.0 - * @hide */ -public interface CaptureProcessorImpl { - /** - * This gets called to update where the CaptureProcessor should write the output of {@link - * #process(Map)}. - * - * @param surface The {@link Surface} that the CaptureProcessor should write data into. - * @param imageFormat The format of that the surface expects. - * @hide - */ - void onOutputSurface(Surface surface, int imageFormat); - +@SuppressLint("UnknownNullness") +public interface CaptureProcessorImpl extends ProcessorImpl { /** * Process a set images captured that were requested. * *

The result of the processing step should be written to the {@link Surface} that was * received by {@link #onOutputSurface(Surface, int)}. * - * @param results The map of images and metadata to process. The {@link Image} that are - * contained within the map will become invalid after this method completes, - * so no references to them should be kept. - * @hide + * @param results The map of {@link ImageFormat#YUV_420_888} format images and metadata to + * process. The {@link Image} that are contained within the map will become + * invalid after this method completes, so no references to them should be kept. */ void process(Map> results); @@ -66,31 +56,11 @@ public interface CaptureProcessorImpl { * become invalid after this method completes, so no references to them * should be kept. * @param resultCallback Capture result callback to be called once the capture result - * values are ready. + * values of the processed image are ready. * @param executor The executor to run the callback on. If null then the callback will * run on any arbitrary executor. * @since 1.3 */ void process(Map> results, ProcessResultImpl resultCallback, Executor executor); - - /** - * This callback will be invoked when CameraX changes the configured input resolution. After - * this call, {@link CaptureProcessorImpl} should expect any {@link Image} received as input - * to be at the specified resolution. - * - * @param size for the surface. - * @hide - */ - void onResolutionUpdate(Size size); - - /** - * This callback will be invoked when CameraX changes the configured input image format. - * After this call, {@link CaptureProcessorImpl} should expect any {@link Image} received as - * input to have the specified image format. - * - * @param imageFormat for the surface. - * @hide - */ - void onImageFormatUpdate(int imageFormat); } -- cgit v1.2.3 From d9eede6200d32078c328c5bc8691f7af9251f0ba Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Mon, 17 Oct 2022 13:26:16 -0700 Subject: Camera Extension stub: Add support for session types Allow extension vendors to specify the camera capture session type. Bug: 254351814 Test: Camera CTS Change-Id: I974a09b1e719ff27699e068272227013b7cf667c --- .../extensions/impl/AutoImageCaptureExtenderImpl.java | 4 ++++ .../camera/extensions/impl/AutoPreviewExtenderImpl.java | 5 +++++ .../extensions/impl/BeautyImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/BeautyPreviewExtenderImpl.java | 5 +++++ .../extensions/impl/BokehImageCaptureExtenderImpl.java | 4 ++++ .../camera/extensions/impl/BokehPreviewExtenderImpl.java | 5 +++++ .../camera/extensions/impl/ExtenderStateListener.java | 16 ++++++++++++++++ .../extensions/impl/HdrImageCaptureExtenderImpl.java | 5 +++++ .../camera/extensions/impl/HdrPreviewExtenderImpl.java | 5 +++++ .../extensions/impl/NightImageCaptureExtenderImpl.java | 5 +++++ .../camera/extensions/impl/NightPreviewExtenderImpl.java | 5 +++++ .../impl/advanced/Camera2SessionConfigImpl.java | 12 ++++++++++++ .../impl/advanced/Camera2SessionConfigImplBuilder.java | 16 ++++++++++++++++ 13 files changed, 92 insertions(+) diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index ccb0dacf..f0c51073 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -113,4 +113,8 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI throw new RuntimeException("Stub, replace with implementation."); } + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java index 100f6658..0c4577a4 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java @@ -93,4 +93,9 @@ public final class AutoPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 2d266390..435fdbd4 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -112,4 +112,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java index bc3e48dd..1f501745 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java @@ -93,4 +93,9 @@ public final class BeautyPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java index 66c5839d..015591ed 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java @@ -113,4 +113,8 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender throw new RuntimeException("Stub, replace with implementation."); } + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java index ff588623..1dc5ed79 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java @@ -91,4 +91,9 @@ public final class BokehPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java index 2879568f..4a3b01cd 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java @@ -80,4 +80,20 @@ public interface ExtenderStateListener { * @return The request information to customize the session. */ CaptureStageImpl onDisableSession(); + + /** + * This will be invoked before the {@link android.hardware.camera2.CameraCaptureSession} is + * initialized and must return a valid camera session type + * {@link android.hardware.camera2.params.SessionConfiguration#getSessionType} + * to be used to configure camera capture session. Both the preview and the image capture + * extender must return the same session type value for a specific extension type. If there + * is inconsistency between the session type values from preview and image extenders, then + * the session configuration will fail. + * + * @since 1.4 + * @return Camera capture session type. Regular and vendor specific types are supported but + * not high speed values. The extension can return -1 in which case the camera capture session + * will be configured to use the default regular type. + */ + int onSessionType(); } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java index f1191dcf..db0044a6 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java @@ -112,4 +112,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java index 0eb4a610..af484646 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java @@ -93,4 +93,9 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index c8ac9788..6ddcdf8c 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -112,4 +112,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java index a5809f6b..825994f5 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java @@ -93,4 +93,9 @@ public final class NightPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImpl.java index d1217177..850f0e1b 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImpl.java @@ -43,4 +43,16 @@ public interface Camera2SessionConfigImpl { * {@link android.hardware.camera2.params.SessionConfiguration#setSessionParameters}. */ int getSessionTemplateId(); + + + /** + * Retrieves the session type to be used when initializing the + * {@link android.hardware.camera2.CameraCaptureSession}. + * + * @since 1.4 + * @return Camera capture session type. Regular and vendor specific types are supported but + * not high speed values. The extension can return -1 in which case the camera capture session + * will be configured to use the default regular type. + */ + int getSessionType(); } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImplBuilder.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImplBuilder.java index a3011666..dc1feccd 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImplBuilder.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImplBuilder.java @@ -20,6 +20,7 @@ package androidx.camera.extensions.impl.advanced; import android.annotation.SuppressLint; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.params.SessionConfiguration; import java.util.ArrayList; import java.util.HashMap; @@ -32,6 +33,7 @@ import java.util.Map; @SuppressLint("UnknownNullness") public class Camera2SessionConfigImplBuilder { private int mSessionTemplateId = CameraDevice.TEMPLATE_PREVIEW; + private int mSessionType = SessionConfiguration.SESSION_REGULAR; Map, Object> mSessionParameters = new HashMap<>(); List mCamera2OutputConfigs = new ArrayList<>(); @@ -85,6 +87,13 @@ public class Camera2SessionConfigImplBuilder { return mCamera2OutputConfigs; } + /** + * Gets the camera capture session type. + */ + public int getSessionType() { + return mSessionType; + } + /** * Builds a {@link Camera2SessionConfigImpl} instance. */ @@ -95,6 +104,7 @@ public class Camera2SessionConfigImplBuilder { private static class Camera2SessionConfigImplImpl implements Camera2SessionConfigImpl { int mSessionTemplateId; + int mSessionType; Map, Object> mSessionParameters; List mCamera2OutputConfigs; @@ -102,6 +112,7 @@ public class Camera2SessionConfigImplBuilder { mSessionTemplateId = builder.getSessionTemplateId(); mSessionParameters = builder.getSessionParameters(); mCamera2OutputConfigs = builder.getCamera2OutputConfigs(); + mSessionType = builder.getSessionType(); } @Override @@ -118,6 +129,11 @@ public class Camera2SessionConfigImplBuilder { public int getSessionTemplateId() { return mSessionTemplateId; } + + @Override + public int getSessionType() { + return mSessionType; + } } } -- cgit v1.2.3 From e12b2c639b3c35441299581dc328f06c815d45d4 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Mon, 17 Oct 2022 13:51:49 -0700 Subject: Camera Extension sample: Add support for session types Allow extension vendors to specify the camera capture session type. Bug: 254351814 Test: Camera CTS Change-Id: Idfe702f64f140006bfa57652c8d13704cdce5f2a --- .../extensions/impl/AutoImageCaptureExtenderImpl.java | 4 ++++ .../camera/extensions/impl/AutoPreviewExtenderImpl.java | 5 +++++ .../extensions/impl/BeautyImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/BeautyPreviewExtenderImpl.java | 5 +++++ .../extensions/impl/BokehImageCaptureExtenderImpl.java | 4 ++++ .../extensions/impl/BokehPreviewExtenderImpl.java | 5 +++++ .../camera/extensions/impl/ExtenderStateListener.java | 17 +++++++++++++++++ .../camera/extensions/impl/ExtensionVersionImpl.java | 4 ++-- .../extensions/impl/HdrImageCaptureExtenderImpl.java | 5 +++++ .../camera/extensions/impl/HdrPreviewExtenderImpl.java | 5 +++++ .../extensions/impl/NightImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/NightPreviewExtenderImpl.java | 5 +++++ .../impl/advanced/Camera2SessionConfigImpl.java | 11 +++++++++++ .../impl/advanced/Camera2SessionConfigImplBuilder.java | 16 ++++++++++++++++ .../extensions/impl/AutoImageCaptureExtenderImpl.java | 6 ++++++ .../camera/extensions/impl/AutoPreviewExtenderImpl.java | 6 ++++++ .../extensions/impl/BeautyImageCaptureExtenderImpl.java | 6 ++++++ .../extensions/impl/BeautyPreviewExtenderImpl.java | 6 ++++++ .../extensions/impl/BokehImageCaptureExtenderImpl.java | 6 ++++++ .../extensions/impl/BokehPreviewExtenderImpl.java | 6 ++++++ .../camera/extensions/impl/ExtenderStateListener.java | 17 +++++++++++++++++ .../camera/extensions/impl/ExtensionVersionImpl.java | 2 +- .../extensions/impl/HdrImageCaptureExtenderImpl.java | 6 ++++++ .../camera/extensions/impl/HdrPreviewExtenderImpl.java | 6 ++++++ .../extensions/impl/NightImageCaptureExtenderImpl.java | 6 ++++++ .../extensions/impl/NightPreviewExtenderImpl.java | 6 ++++++ 26 files changed, 172 insertions(+), 3 deletions(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index ccb0dacf..f0c51073 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -113,4 +113,8 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI throw new RuntimeException("Stub, replace with implementation."); } + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java index 100f6658..0c4577a4 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java @@ -93,4 +93,9 @@ public final class AutoPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 2d266390..435fdbd4 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -112,4 +112,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java index bc3e48dd..1f501745 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java @@ -93,4 +93,9 @@ public final class BeautyPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java index 66c5839d..015591ed 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java @@ -113,4 +113,8 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender throw new RuntimeException("Stub, replace with implementation."); } + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java index ff588623..1dc5ed79 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java @@ -91,4 +91,9 @@ public final class BokehPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ExtenderStateListener.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ExtenderStateListener.java index 2879568f..3a88ab2e 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ExtenderStateListener.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ExtenderStateListener.java @@ -80,4 +80,21 @@ public interface ExtenderStateListener { * @return The request information to customize the session. */ CaptureStageImpl onDisableSession(); + + /** + * This will be invoked before the {@link android.hardware.camera2.CameraCaptureSession} is + * initialized and must return a valid camera session type + * {@link android.hardware.camera2.params.SessionConfiguration#getSessionType} + * to be used to configure camera capture session. Both the preview and the image capture + * extender must return the same session type value for a specific extension type. If there + * is inconsistency between the session type values from preview and image extenders, then + * the session configuration will fail. + * + * + * @since 1.4 + * @return Camera capture session type. Regular and vendor specific types are supported but + * not high speed values. The extension can return -1 in which case the camera capture session + * will be configured to use the default regular type. + */ + int onSessionType(); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java index e3dc9932..1f285720 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java @@ -29,7 +29,7 @@ import android.util.Log; */ public class ExtensionVersionImpl { private static final String TAG = "ExtenderVersionImpl"; - private static final String VERSION = "1.3.0"; + private static final String VERSION = "1.4.0"; /** * @hide @@ -71,4 +71,4 @@ public class ExtensionVersionImpl { public boolean isAdvancedExtenderImplemented() { return true; } -} \ No newline at end of file +} diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java index f1191dcf..db0044a6 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java @@ -112,4 +112,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java index 0eb4a610..af484646 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java @@ -93,4 +93,9 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index c8ac9788..6ddcdf8c 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -112,4 +112,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java index a5809f6b..825994f5 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java @@ -93,4 +93,9 @@ public final class NightPreviewExtenderImpl implements PreviewExtenderImpl { public List> getSupportedResolutions() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public int onSessionType() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImpl.java index 47a0d226..6fb45bca 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImpl.java @@ -43,4 +43,15 @@ public interface Camera2SessionConfigImpl { * {@link android.hardware.camera2.params.SessionConfiguration#setSessionParameters}. */ int getSessionTemplateId(); + + /** + * Retrieves the session type to be used when initializing the + * {@link android.hardware.camera2.CameraCaptureSession}. + * + * @since 1.4 + * @return Camera capture session type. Regular and vendor specific types are supported but + * not high speed values. The extension can return -1 in which case the camera capture session + * will be configured to use the default regular type. + */ + int getSessionType(); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImplBuilder.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImplBuilder.java index a3011666..dc1feccd 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImplBuilder.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/Camera2SessionConfigImplBuilder.java @@ -20,6 +20,7 @@ package androidx.camera.extensions.impl.advanced; import android.annotation.SuppressLint; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.params.SessionConfiguration; import java.util.ArrayList; import java.util.HashMap; @@ -32,6 +33,7 @@ import java.util.Map; @SuppressLint("UnknownNullness") public class Camera2SessionConfigImplBuilder { private int mSessionTemplateId = CameraDevice.TEMPLATE_PREVIEW; + private int mSessionType = SessionConfiguration.SESSION_REGULAR; Map, Object> mSessionParameters = new HashMap<>(); List mCamera2OutputConfigs = new ArrayList<>(); @@ -85,6 +87,13 @@ public class Camera2SessionConfigImplBuilder { return mCamera2OutputConfigs; } + /** + * Gets the camera capture session type. + */ + public int getSessionType() { + return mSessionType; + } + /** * Builds a {@link Camera2SessionConfigImpl} instance. */ @@ -95,6 +104,7 @@ public class Camera2SessionConfigImplBuilder { private static class Camera2SessionConfigImplImpl implements Camera2SessionConfigImpl { int mSessionTemplateId; + int mSessionType; Map, Object> mSessionParameters; List mCamera2OutputConfigs; @@ -102,6 +112,7 @@ public class Camera2SessionConfigImplBuilder { mSessionTemplateId = builder.getSessionTemplateId(); mSessionParameters = builder.getSessionParameters(); mCamera2OutputConfigs = builder.getCamera2OutputConfigs(); + mSessionType = builder.getSessionType(); } @Override @@ -118,6 +129,11 @@ public class Camera2SessionConfigImplBuilder { public int getSessionTemplateId() { return mSessionTemplateId; } + + @Override + public int getSessionType() { + return mSessionType; + } } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index 5f6cb2ba..b01280a4 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -20,6 +20,7 @@ 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.SessionConfiguration; import android.media.Image; import android.media.ImageWriter; import android.os.Build; @@ -257,4 +258,9 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public List getAvailableCaptureResultKeys() { return new ArrayList<>(); } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java index 5018df8a..aa95a4a7 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java @@ -18,6 +18,7 @@ package androidx.camera.extensions.impl; import android.content.Context; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.params.SessionConfiguration; import android.util.Pair; import android.util.Size; @@ -162,4 +163,9 @@ public final class AutoPreviewExtenderImpl implements PreviewExtenderImpl { return captureStage; } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 5c9b2d39..50fa185a 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -21,6 +21,7 @@ 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.SessionConfiguration; import android.hardware.camera2.params.StreamConfigurationMap; import android.media.Image; import android.media.ImageWriter; @@ -280,4 +281,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public List getAvailableCaptureResultKeys() { return new ArrayList<>(); } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java index fcc78d55..2ef357c3 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java @@ -19,6 +19,7 @@ import android.content.Context; import android.graphics.ImageFormat; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.params.SessionConfiguration; import android.hardware.camera2.params.StreamConfigurationMap; import android.util.Pair; import android.util.Size; @@ -183,4 +184,9 @@ public final class BeautyPreviewExtenderImpl implements PreviewExtenderImpl { return captureStage; } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } 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 5c3882b8..e6750295 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 @@ -20,6 +20,7 @@ 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.SessionConfiguration; import android.media.Image; import android.media.ImageWriter; import android.os.Build; @@ -341,4 +342,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender CaptureResult.FLASH_STATE}; return Arrays.asList(CAPTURE_RESULT_SET); } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } 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 45c7f47c..ace54c8b 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 @@ -19,6 +19,7 @@ import android.content.Context; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.TotalCaptureResult; +import android.hardware.camera2.params.SessionConfiguration; import android.util.Pair; import android.util.Size; import android.view.Surface; @@ -202,4 +203,9 @@ public final class BokehPreviewExtenderImpl implements PreviewExtenderImpl { return captureStage; } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ExtenderStateListener.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ExtenderStateListener.java index f926cff9..23570c4b 100644 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ExtenderStateListener.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ExtenderStateListener.java @@ -84,4 +84,21 @@ public interface ExtenderStateListener { * @hide */ CaptureStageImpl onDisableSession(); + + /** + * This will be invoked before the {@link android.hardware.camera2.CameraCaptureSession} is + * initialized and must return a valid camera session type + * {@link android.hardware.camera2.params.SessionConfiguration#getSessionType} + * to be used to configure camera capture session. Both the preview and the image capture + * extender must return the same session type value for a specific extension type. If there + * is inconsistency between the session type values from preview and image extenders, then + * the session configuration will fail. + * + * + * @since 1.4 + * @return Camera capture session type. Regular and vendor specific types are supported but + * not high speed values. The extension can return -1 in which case the camera capture session + * will be configured to use the default regular type. + */ + int onSessionType(); } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java index af147ed7..75739ce0 100644 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java @@ -29,7 +29,7 @@ import android.util.Log; */ public class ExtensionVersionImpl { private static final String TAG = "ExtenderVersionImpl"; - private static final String VERSION = "1.3.0"; + private static final String VERSION = "1.4.0"; /** * @hide 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 57b7fe65..4b04f46b 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 @@ -21,6 +21,7 @@ import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureResult; import android.hardware.camera2.TotalCaptureResult; import android.hardware.camera2.params.MeteringRectangle; +import android.hardware.camera2.params.SessionConfiguration; import android.media.Image; import android.media.ImageWriter; import android.os.Build; @@ -351,4 +352,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm CaptureResult.CONTROL_AF_TRIGGER, CaptureResult.CONTROL_AF_STATE}; return Arrays.asList(CAPTURE_RESULT_SET); } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } 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 7cbe9243..eb513906 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 @@ -21,6 +21,7 @@ import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureResult; import android.hardware.camera2.TotalCaptureResult; import android.hardware.camera2.params.MeteringRectangle; +import android.hardware.camera2.params.SessionConfiguration; import android.media.ImageWriter; import android.media.Image; import android.util.Pair; @@ -253,4 +254,9 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl { public CaptureStageImpl onDisableSession() { return null; } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index f0821ed7..cd93506f 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -20,6 +20,7 @@ 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.SessionConfiguration; import android.media.Image; import android.media.ImageWriter; import android.os.Build; @@ -257,4 +258,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public List getAvailableCaptureResultKeys() { return new ArrayList<>(); } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java index e29abec1..46be86ab 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java @@ -18,6 +18,7 @@ package androidx.camera.extensions.impl; import android.content.Context; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.params.SessionConfiguration; import android.util.Pair; import android.util.Size; @@ -162,4 +163,9 @@ public final class NightPreviewExtenderImpl implements PreviewExtenderImpl { return captureStage; } + + @Override + public int onSessionType() { + return SessionConfiguration.SESSION_REGULAR; + } } -- cgit v1.2.3 From 6a85b7f63214f576ea24402f7dea72d00922fffd Mon Sep 17 00:00:00 2001 From: Ravneet Date: Thu, 20 Oct 2022 20:31:15 +0000 Subject: Remove image format conversion - Surface format in native surface utils was updated to reflect the public format, so no need to convert Test: CTS test Bug: 254701813 Change-Id: I2e66c938f93e837a451805b5b31599c955bf9b7e --- .../extensions/impl/advanced/BaseAdvancedExtenderImpl.java | 3 +-- .../camera/extensions/impl/advanced/JpegEncoder.java | 12 ------------ 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java index 6758a325..d627ecb6 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java @@ -319,8 +319,7 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { if (mCaptureOutputSurfaceConfig.getSurface() != null) { synchronized (mLockCaptureSurfaceImageWriter) { - if (JpegEncoder.imageFormatToPublic(mCaptureOutputSurfaceConfig - .getImageFormat()) == ImageFormat.JPEG) { + if (mCaptureOutputSurfaceConfig.getImageFormat() == ImageFormat.JPEG) { mCaptureSurfaceImageWriter = new ImageWriter .Builder(mCaptureOutputSurfaceConfig.getSurface()) .setImageFormat(ImageFormat.JPEG) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/JpegEncoder.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/JpegEncoder.java index f3eb7eab..e163da0d 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/JpegEncoder.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/JpegEncoder.java @@ -121,16 +121,4 @@ public class JpegEncoder { 0, 0, yuvImage.getWidth(), yuvImage.getHeight(), jpegOrientation); } - - public static int imageFormatToPublic(int format) { - switch (format) { - case HAL_PIXEL_FORMAT_BLOB: - return ImageFormat.JPEG; - case ImageFormat.JPEG: - throw new IllegalArgumentException( - "ImageFormat.JPEG is an unknown internal format"); - default: - return format; - } - } } \ No newline at end of file -- cgit v1.2.3 From 9fb6070509f748a45fdf0ed9124e60081189ed6e Mon Sep 17 00:00:00 2001 From: Ravneet Dhanjal Date: Thu, 20 Oct 2022 22:22:01 +0000 Subject: Revert "Remove image format conversion" This reverts commit 6a85b7f63214f576ea24402f7dea72d00922fffd. Reason for revert: Surface format utils reflecting public format was reverted, thus the image format should actually be converted Change-Id: I67926caa3c2cd6bab9542393136a6daeb8b1b55a --- .../extensions/impl/advanced/BaseAdvancedExtenderImpl.java | 3 ++- .../camera/extensions/impl/advanced/JpegEncoder.java | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java index d627ecb6..6758a325 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java @@ -319,7 +319,8 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { if (mCaptureOutputSurfaceConfig.getSurface() != null) { synchronized (mLockCaptureSurfaceImageWriter) { - if (mCaptureOutputSurfaceConfig.getImageFormat() == ImageFormat.JPEG) { + if (JpegEncoder.imageFormatToPublic(mCaptureOutputSurfaceConfig + .getImageFormat()) == ImageFormat.JPEG) { mCaptureSurfaceImageWriter = new ImageWriter .Builder(mCaptureOutputSurfaceConfig.getSurface()) .setImageFormat(ImageFormat.JPEG) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/JpegEncoder.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/JpegEncoder.java index e163da0d..f3eb7eab 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/JpegEncoder.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/JpegEncoder.java @@ -121,4 +121,16 @@ public class JpegEncoder { 0, 0, yuvImage.getWidth(), yuvImage.getHeight(), jpegOrientation); } + + public static int imageFormatToPublic(int format) { + switch (format) { + case HAL_PIXEL_FORMAT_BLOB: + return ImageFormat.JPEG; + case ImageFormat.JPEG: + throw new IllegalArgumentException( + "ImageFormat.JPEG is an unknown internal format"); + default: + return format; + } + } } \ No newline at end of file -- cgit v1.2.3 From 60f0c4a59ec498b8e062752e43cba5008967e267 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Mon, 24 Oct 2022 23:42:39 -0700 Subject: Camera Extension stub: Add support for progress callbacks Bug: 255536242 Test: Camera CTS Change-Id: I2c002fc3c4aab795f8cbceec3a053affcfe1ee9a --- .../extensions/impl/AutoImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/BeautyImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/BokehImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/HdrImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/ImageCaptureExtenderImpl.java | 9 +++++++++ .../extensions/impl/NightImageCaptureExtenderImpl.java | 5 +++++ .../camera/extensions/impl/ProcessResultImpl.java | 17 ++++++++++++++++- .../extensions/impl/advanced/AdvancedExtenderImpl.java | 9 +++++++++ .../impl/advanced/AutoAdvancedExtenderImpl.java | 5 +++++ .../impl/advanced/BeautyAdvancedExtenderImpl.java | 5 +++++ .../impl/advanced/BokehAdvancedExtenderImpl.java | 5 +++++ .../impl/advanced/HdrAdvancedExtenderImpl.java | 5 +++++ .../impl/advanced/NightAdvancedExtenderImpl.java | 5 +++++ .../extensions/impl/advanced/SessionProcessorImpl.java | 15 +++++++++++++++ 14 files changed, 99 insertions(+), 1 deletion(-) diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index f0c51073..aab25811 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 435fdbd4..1860044e 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java index 015591ed..64514930 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java index db0044a6..99978522 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index 88bd105a..1a257e92 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -159,4 +159,13 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.3 */ List getAvailableCaptureResultKeys(); + + /** + * Advertise support for {@link ProcessResultImpl#onCaptureProcessProgressed}. + * + * @return {@code true} in case the process progress callback is supported and is expected to + * be triggered, {@code false} otherwise. + * @since 1.4 + */ + boolean isCaptureProcessProgressAvailable(); } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index 6ddcdf8c..110367ae 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ProcessResultImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ProcessResultImpl.java index d0e3605d..0e154450 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ProcessResultImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ProcessResultImpl.java @@ -25,7 +25,6 @@ import java.util.List; /** * Allows clients to receive information about the capture result values of processed frames. * - * @since 1.3 */ @SuppressLint("UnknownNullness") public interface ProcessResultImpl { @@ -40,6 +39,22 @@ public interface ProcessResultImpl { * 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. + * @since 1.3 */ void onCaptureCompleted(long shutterTimestamp, List> result); + + /** + * Capture progress callback that needs to be called when the process capture is + * ongoing and includes the estimated progress of the processing. + * + *

Extensions must ensure that they always call this callback with monotonically increasing + * values.

+ * + *

Extensions are allowed to trigger this callback multiple times but at the minimum the + * callback is expected to be called once when processing is done with value 100.

+ * + * @param progress Value between 0 and 100. + * @since 1.4 + */ + void onCaptureProcessProgressed(int progress); } 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 465bfe88..7e708fec 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 @@ -185,4 +185,13 @@ public interface AdvancedExtenderImpl { * @since 1.3 */ List getAvailableCaptureResultKeys(); + + /** + * Advertise support for {@link SessionProcessorImpl#onCaptureProcessProgressed}. + * + * @return {@code true} in case the process progress callback is supported and is expected to + * be triggered, {@code false} otherwise. + * @since 1.4 + */ + public boolean isCaptureProcessProgressAvailable(); } 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 0d3bd4a0..4d33ed57 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 @@ -88,4 +88,9 @@ public class AutoAdvancedExtenderImpl implements AdvancedExtenderImpl { public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + 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 1dec3266..c709d252 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 @@ -88,4 +88,9 @@ public class BeautyAdvancedExtenderImpl implements AdvancedExtenderImpl { public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + 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 bc41b4e0..e15d7ad0 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 @@ -88,4 +88,9 @@ public class BokehAdvancedExtenderImpl implements AdvancedExtenderImpl { public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + 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 06157dc3..07f4aa62 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 @@ -89,4 +89,9 @@ public class HdrAdvancedExtenderImpl implements AdvancedExtenderImpl { public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + 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 97da5c14..177769bf 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 @@ -88,4 +88,9 @@ public class NightAdvancedExtenderImpl implements AdvancedExtenderImpl { public List getAvailableCaptureResultKeys() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + 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 fabfc2bf..53382ace 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 @@ -277,5 +277,20 @@ public interface SessionProcessorImpl { */ void onCaptureCompleted(long timestamp, int captureSequenceId, Map result); + + /** + * Capture progress callback that needs to be called when the process capture is + * ongoing and includes the estimated progress of the processing. + * + *

Extensions must ensure that they always call this callback with monotonically + * increasing values.

+ * + *

Extensions are allowed to trigger this callback multiple times but at the minimum the + * callback is expected to be called once when processing is done with value 100.

+ * + * @param progress Value between 0 and 100. + * @since 1.4 + */ + void onCaptureProcessProgressed(int progress); } } -- cgit v1.2.3 From 19dde760eb9a133a3725a8167d9a8489205d134e Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Tue, 25 Oct 2022 00:25:44 -0700 Subject: Camera Extension sample: Enable progress callbacks Bug: 255536242 Test: Camera CTS Change-Id: I5a2e4715d13663feb55cb40aefae2bbe2c3bde90 --- .../extensions/impl/AutoImageCaptureExtenderImpl.java | 7 +++++++ .../impl/BeautyImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/BokehImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/HdrImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/ImageCaptureExtenderImpl.java | 9 +++++++++ .../extensions/impl/NightImageCaptureExtenderImpl.java | 5 +++++ .../camera/extensions/impl/ProcessResultImpl.java | 17 ++++++++++++++++- .../extensions/impl/advanced/AdvancedExtenderImpl.java | 9 +++++++++ .../impl/advanced/BaseAdvancedExtenderImpl.java | 6 ++++++ .../extensions/impl/advanced/SessionProcessorImpl.java | 15 +++++++++++++++ .../extensions/impl/AutoImageCaptureExtenderImpl.java | 5 +++++ .../impl/BeautyImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/BokehImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/HdrImageCaptureExtenderImpl.java | 8 ++++++++ .../extensions/impl/ImageCaptureExtenderImpl.java | 9 +++++++++ .../extensions/impl/NightImageCaptureExtenderImpl.java | 5 +++++ .../camera/extensions/impl/ProcessResultImpl.java | 18 +++++++++++++++++- 17 files changed, 136 insertions(+), 2 deletions(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index f0c51073..20456b53 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -117,4 +117,11 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } + + } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 435fdbd4..1860044e 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java index 015591ed..64514930 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java index db0044a6..99978522 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index 88bd105a..1a257e92 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -159,4 +159,13 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.3 */ List getAvailableCaptureResultKeys(); + + /** + * Advertise support for {@link ProcessResultImpl#onCaptureProcessProgressed}. + * + * @return {@code true} in case the process progress callback is supported and is expected to + * be triggered, {@code false} otherwise. + * @since 1.4 + */ + boolean isCaptureProcessProgressAvailable(); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index 6ddcdf8c..110367ae 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -117,4 +117,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public int onSessionType() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ProcessResultImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ProcessResultImpl.java index d0e3605d..0e154450 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ProcessResultImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ProcessResultImpl.java @@ -25,7 +25,6 @@ import java.util.List; /** * Allows clients to receive information about the capture result values of processed frames. * - * @since 1.3 */ @SuppressLint("UnknownNullness") public interface ProcessResultImpl { @@ -40,6 +39,22 @@ public interface ProcessResultImpl { * 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. + * @since 1.3 */ void onCaptureCompleted(long shutterTimestamp, List> result); + + /** + * Capture progress callback that needs to be called when the process capture is + * ongoing and includes the estimated progress of the processing. + * + *

Extensions must ensure that they always call this callback with monotonically increasing + * values.

+ * + *

Extensions are allowed to trigger this callback multiple times but at the minimum the + * callback is expected to be called once when processing is done with value 100.

+ * + * @param progress Value between 0 and 100. + * @since 1.4 + */ + void onCaptureProcessProgressed(int progress); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java index f5335e05..fcda9bee 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java @@ -185,4 +185,13 @@ public interface AdvancedExtenderImpl { * @since 1.3 */ List getAvailableCaptureResultKeys(); + + /** + * Advertise support for {@link SessionProcessorImpl#onCaptureProcessProgressed}. + * + * @return {@code true} in case the process progress callback is supported and is expected to + * be triggered, {@code false} otherwise. + * @since 1.4 + */ + boolean isCaptureProcessProgressAvailable(); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java index 6758a325..440292be 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java @@ -484,6 +484,7 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { @Override public void onCaptureSequenceCompleted(int sequenceId, long frameNumber) { captureCallback.onCaptureSequenceCompleted(seqId); + captureCallback.onCaptureProcessProgressed(100); } @Override @@ -617,4 +618,9 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { CaptureResult.JPEG_ORIENTATION}; return Arrays.asList(CAPTURE_RESULT_SET); } + + @Override + public boolean isCaptureProcessProgressAvailable() { + return true; + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java index fabfc2bf..53382ace 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java @@ -277,5 +277,20 @@ public interface SessionProcessorImpl { */ void onCaptureCompleted(long timestamp, int captureSequenceId, Map result); + + /** + * Capture progress callback that needs to be called when the process capture is + * ongoing and includes the estimated progress of the processing. + * + *

Extensions must ensure that they always call this callback with monotonically + * increasing values.

+ * + *

Extensions are allowed to trigger this callback multiple times but at the minimum the + * callback is expected to be called once when processing is done with value 100.

+ * + * @param progress Value between 0 and 100. + * @since 1.4 + */ + void onCaptureProcessProgressed(int progress); } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index b01280a4..7c50c2fa 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -263,4 +263,9 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public int onSessionType() { return SessionConfiguration.SESSION_REGULAR; } + + @Override + public boolean isCaptureProcessProgressAvailable() { + return false; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 50fa185a..3690fdc5 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -286,4 +286,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public int onSessionType() { return SessionConfiguration.SESSION_REGULAR; } + + @Override + public boolean isCaptureProcessProgressAvailable() { + return false; + } } 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 e6750295..e75c7da2 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 @@ -347,4 +347,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public int onSessionType() { return SessionConfiguration.SESSION_REGULAR; } + + @Override + public boolean isCaptureProcessProgressAvailable() { + return false; + } } 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 4b04f46b..63e1d12e 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 @@ -188,9 +188,12 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm if (executor != null) { executor.execute(() -> resultCallback.onCaptureCompleted( shutterTimestamp, captureResults)); + executor.execute(() -> + resultCallback.onCaptureProcessProgressed(100)); } else { resultCallback.onCaptureCompleted(shutterTimestamp, captureResults); + resultCallback.onCaptureProcessProgressed(100); } } } @@ -357,4 +360,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public int onSessionType() { return SessionConfiguration.SESSION_REGULAR; } + + @Override + public boolean isCaptureProcessProgressAvailable() { + return true; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index c27a5dbb..7439b14b 100644 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -138,5 +138,14 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.3 */ List getAvailableCaptureResultKeys(); + + /** + * Advertise support for {@link ProcessResultImpl#onCaptureProcessProgressed}. + * + * @return {@code true} in case the process progress callback is supported and is expected to + * be triggered, {@code false} otherwise. + * @since 1.4 + */ + boolean isCaptureProcessProgressAvailable(); } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index cd93506f..7deab9f4 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -263,4 +263,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public int onSessionType() { return SessionConfiguration.SESSION_REGULAR; } + + @Override + public boolean isCaptureProcessProgressAvailable() { + return false; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ProcessResultImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ProcessResultImpl.java index d4c2014d..518942e9 100644 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ProcessResultImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ProcessResultImpl.java @@ -24,7 +24,6 @@ import java.util.List; /** * Allows clients to receive information about the capture result values of processed frames. * - * @since 1.3 */ public interface ProcessResultImpl { /** @@ -38,6 +37,23 @@ public interface ProcessResultImpl { * 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. + * @since 1.3 */ void onCaptureCompleted(long shutterTimestamp, List> result); + + + /** + * Capture progress callback that needs to be called when the process capture is + * ongoing and includes the estimated progress of the processing. + * + *

Extensions must ensure that they always call this callback with monotonically increasing + * values.

+ * + *

Extensions are allowed to trigger this callback multiple times but at the minimum the + * callback is expected to be called once when processing is done with value 100.

+ * + * @param progress Value between 0 and 100. + * @since 1.4 + */ + void onCaptureProcessProgressed(int progress); } -- cgit v1.2.3 From f606f73079afcd17457a828716c127b84533beb3 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Wed, 2 Nov 2022 16:59:11 -0700 Subject: Camera Extension sample: Add support extension specific metadata Bug: 257136838 Test: Camera CTS Change-Id: I49f68717d15be0a37ec6dd8bddf4e44160de8323 --- .../extensions/impl/HdrImageCaptureExtenderImpl.java | 16 ++++++++++++++-- .../camera/extensions/impl/HdrPreviewExtenderImpl.java | 9 +++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) 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 4b04f46b..c5153627 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 @@ -17,6 +17,7 @@ package androidx.camera.extensions.impl; import android.content.Context; import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraExtensionCharacteristics; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureResult; import android.hardware.camera2.TotalCaptureResult; @@ -185,6 +186,16 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm jpegOrientation)); } + Integer strength = result.second.get( + CaptureResult.EXTENSION_STRENGTH); + if (strength != null) { + captureResults.add(new Pair<>(CaptureResult.EXTENSION_STRENGTH, + strength)); + } + + captureResults.add(new Pair<>(CaptureResult.EXTENSION_CURRENT_TYPE, + CameraExtensionCharacteristics.EXTENSION_HDR)); + if (executor != null) { executor.execute(() -> resultCallback.onCaptureCompleted( shutterTimestamp, captureResults)); @@ -341,7 +352,7 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public List getAvailableCaptureRequestKeys() { final CaptureRequest.Key [] CAPTURE_REQUEST_SET = {CaptureRequest.CONTROL_ZOOM_RATIO, CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_REGIONS, - CaptureRequest.CONTROL_AF_TRIGGER}; + CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.EXTENSION_STRENGTH}; return Arrays.asList(CAPTURE_REQUEST_SET); } @@ -349,7 +360,8 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public List getAvailableCaptureResultKeys() { 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}; + CaptureResult.CONTROL_AF_TRIGGER, CaptureResult.CONTROL_AF_STATE, + CaptureResult.EXTENSION_CURRENT_TYPE, CaptureResult.EXTENSION_STRENGTH}; 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 eb513906..7777bfa2 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 @@ -18,6 +18,7 @@ package androidx.camera.extensions.impl; import android.content.Context; import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraExtensionCharacteristics; import android.hardware.camera2.CaptureResult; import android.hardware.camera2.TotalCaptureResult; import android.hardware.camera2.params.MeteringRectangle; @@ -194,6 +195,14 @@ public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl { jpegOrientation)); } + Integer strength = result.get(CaptureResult.EXTENSION_STRENGTH); + if (strength != null) { + captureResults.add(new Pair<>(CaptureResult.EXTENSION_STRENGTH, strength)); + } + + captureResults.add(new Pair<>(CaptureResult.EXTENSION_CURRENT_TYPE, + CameraExtensionCharacteristics.EXTENSION_HDR)); + if (executor != null) { executor.execute(() -> resultCallback.onCaptureCompleted(shutterTimestamp, captureResults)); -- cgit v1.2.3 From c4f2c11830649eed486f69555e36925579a4991b Mon Sep 17 00:00:00 2001 From: Ravneet Dhanjal Date: Tue, 8 Nov 2022 21:28:17 +0000 Subject: Camera Extensions: Add OutputSurfaceConfiguration class to retrieve surface outputs - Add OutputSurfaceConfiguration class to get the surface outputs in the advanced extensions to reduce output surface parameters in initSession for the addition of future surfaces Test: CTS Tests Bug: 258296845 Change-Id: I55bcebe21a53a7cf3a7bf921c9719fdc05c5daaa --- .../impl/advanced/BaseAdvancedExtenderImpl.java | 58 +++++++++++++++++++--- .../impl/advanced/NightAdvancedExtenderImpl.java | 12 ++--- .../advanced/OutputSurfaceConfigurationImpl.java | 33 ++++++++++++ .../impl/advanced/SessionProcessorImpl.java | 56 +++++++++++++++++++-- .../advanced/OutputSurfaceConfigurationImpl.java | 33 ++++++++++++ .../impl/advanced/SessionProcessorImpl.java | 56 +++++++++++++++++++-- 6 files changed, 228 insertions(+), 20 deletions(-) create mode 100644 camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java create mode 100644 camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java index 6758a325..2f84087a 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java @@ -161,14 +161,12 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { public Camera2SessionConfigImpl initSession(@NonNull String cameraId, @NonNull Map cameraCharacteristicsMap, @NonNull Context context, - @NonNull OutputSurfaceImpl previewSurfaceConfig, - @NonNull OutputSurfaceImpl imageCaptureSurfaceConfig, - @Nullable OutputSurfaceImpl imageAnalysisSurfaceConfig) { + @NonNull OutputSurfaceConfigurationImpl surfaceConfigs) { Log.d(TAG, "initSession cameraId=" + cameraId); - mPreviewOutputSurfaceConfig = previewSurfaceConfig; - mCaptureOutputSurfaceConfig = imageCaptureSurfaceConfig; + mPreviewOutputSurfaceConfig = surfaceConfigs.getPreviewOutputSurface(); + mCaptureOutputSurfaceConfig = surfaceConfigs.getImageCaptureOutputSurface(); Camera2SessionConfigImplBuilder builder = new Camera2SessionConfigImplBuilder() @@ -180,7 +178,7 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { previewOutputConfigBuilder = Camera2OutputConfigImplBuilder.newSurfaceConfig( - previewSurfaceConfig.getSurface()); + mPreviewOutputSurfaceConfig.getSurface()); mPreviewOutputConfig = previewOutputConfigBuilder.build(); @@ -193,7 +191,7 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { captureOutputConfigBuilder = Camera2OutputConfigImplBuilder.newImageReaderConfig( - imageCaptureSurfaceConfig.getSize(), + mCaptureOutputSurfaceConfig.getSize(), ImageFormat.YUV_420_888, BASIC_CAPTURE_PROCESS_MAX_IMAGES); @@ -207,6 +205,23 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { return builder.build(); } + @Override + public Camera2SessionConfigImpl initSession(@NonNull String cameraId, + @NonNull Map cameraCharacteristicsMap, + @NonNull Context context, + @NonNull OutputSurfaceImpl previewSurfaceConfig, + @NonNull OutputSurfaceImpl imageCaptureSurfaceConfig, + @Nullable OutputSurfaceImpl imageAnalysisSurfaceConfig) { + + // Since this sample impl uses version 1.4, the other initSession method will be + // called. This is just a sample for earlier versions if wanting to redirect this call. + OutputSurfaceConfigurationImplImpl surfaceConfigs = + new OutputSurfaceConfigurationImplImpl(previewSurfaceConfig, + imageCaptureSurfaceConfig, imageAnalysisSurfaceConfig); + + return initSession(cameraId, cameraCharacteristicsMap, context, surfaceConfigs); + } + protected void addSessionParameter(Camera2SessionConfigImplBuilder builder) { // default empty implementation } @@ -601,6 +616,35 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { } } + public static class OutputSurfaceConfigurationImplImpl implements OutputSurfaceConfigurationImpl { + private OutputSurfaceImpl mOutputPreviewSurfaceImpl; + private OutputSurfaceImpl mOutputImageCaptureSurfaceImpl; + private OutputSurfaceImpl mOutputImageAnalysisSurfaceImpl; + + public OutputSurfaceConfigurationImplImpl(OutputSurfaceImpl previewSurfaceConfig, + OutputSurfaceImpl imageCaptureSurfaceConfig, + OutputSurfaceImpl imageAnalysisSurfaceConfig) { + mOutputPreviewSurfaceImpl = previewSurfaceConfig; + mOutputImageCaptureSurfaceImpl = imageCaptureSurfaceConfig; + mOutputImageAnalysisSurfaceImpl = imageAnalysisSurfaceConfig; + } + + @Override + public OutputSurfaceImpl getPreviewOutputSurface() { + return mOutputPreviewSurfaceImpl; + } + + @Override + public OutputSurfaceImpl getImageCaptureOutputSurface() { + return mOutputImageCaptureSurfaceImpl; + } + + @Override + public OutputSurfaceImpl getImageAnalysisOutputSurface() { + return mOutputImageAnalysisSurfaceImpl; + } + } + @Override public abstract SessionProcessorImpl createSessionProcessor(); diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java index 31c79404..82940635 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/NightAdvancedExtenderImpl.java @@ -86,14 +86,12 @@ public class NightAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { public Camera2SessionConfigImpl initSession(@NonNull String cameraId, @NonNull Map cameraCharacteristicsMap, @NonNull Context context, - @NonNull OutputSurfaceImpl previewSurfaceConfig, - @NonNull OutputSurfaceImpl imageCaptureSurfaceConfig, - @Nullable OutputSurfaceImpl imageAnalysisSurfaceConfig) { + @NonNull OutputSurfaceConfigurationImpl surfaceConfigs) { Log.d(TAG, "initSession cameraId=" + cameraId); - mPreviewOutputSurfaceConfig = previewSurfaceConfig; - mCaptureOutputSurfaceConfig = imageCaptureSurfaceConfig; + mPreviewOutputSurfaceConfig = surfaceConfigs.getPreviewOutputSurface(); + mCaptureOutputSurfaceConfig = surfaceConfigs.getImageCaptureOutputSurface(); Camera2SessionConfigImplBuilder builder = new Camera2SessionConfigImplBuilder() @@ -105,7 +103,7 @@ public class NightAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { previewOutputConfigBuilder = Camera2OutputConfigImplBuilder.newImageReaderConfig( - previewSurfaceConfig.getSize(), + mPreviewOutputSurfaceConfig.getSize(), ImageFormat.YUV_420_888, BASIC_CAPTURE_PROCESS_MAX_IMAGES); @@ -120,7 +118,7 @@ public class NightAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { captureOutputConfigBuilder = Camera2OutputConfigImplBuilder.newImageReaderConfig( - imageCaptureSurfaceConfig.getSize(), + mCaptureOutputSurfaceConfig.getSize(), ImageFormat.YUV_420_888, BASIC_CAPTURE_PROCESS_MAX_IMAGES); diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java new file mode 100644 index 00000000..8e470139 --- /dev/null +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 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 androidx.camera.extensions.impl.advanced; + +import android.annotation.SuppressLint; + +/** + * For specifying the output surface configurations for the extension. + * + * since 1.4 + */ +@SuppressLint("UnknownNullness") +public interface OutputSurfaceConfigurationImpl { + public OutputSurfaceImpl getPreviewOutputSurface(); + + public OutputSurfaceImpl getImageCaptureOutputSurface(); + + public OutputSurfaceImpl getImageAnalysisOutputSurface(); +} diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java index fabfc2bf..53492832 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java @@ -64,9 +64,59 @@ public interface SessionProcessorImpl { * preparing a CameraCaptureSession. After initSession() is called, the camera ID, * cameraCharacteristics and context will not change until deInitSession() has been called. * - *

CameraX specifies the output surface configurations for preview, image capture and image - * analysis[optional]. And OEM returns a {@link Camera2SessionConfigImpl} which consists of a - * list of {@link Camera2OutputConfigImpl} and session parameters. The + *

CameraX / Camera2 specifies the output surface configurations for preview using + * {@link OutputSurfaceConfigurationImpl#getPreviewOutputSurface}, image capture using + * {@link OutputSurfaceConfigurationImpl#getImageCaptureOutputSurface}, and image analysis + * [optional] using {@link OutputSurfaceConfigurationImpl#getImageAnalysisOutputSurface}. + * And OEM returns a {@link Camera2SessionConfigImpl} which consists of a list of + * {@link Camera2OutputConfigImpl} and session parameters. The {@link Camera2SessionConfigImpl} + * will be used to configure the CameraCaptureSession. + * + *

OEM is responsible for outputting correct camera images output to these output surfaces. + * OEM can have the following options to enable the output: + *

+     * (1) Add these output surfaces in CameraCaptureSession directly using
+     * {@link Camera2OutputConfigImplBuilder#newSurfaceConfig(Surface)} }. Processing is done in
+     * HAL.
+     *
+     * (2) Use surface sharing with other surface by calling
+     * {@link Camera2OutputConfigImplBuilder#addSurfaceSharingOutputConfig(Camera2OutputConfigImpl)}
+     * to add the output surface to the other {@link Camera2OutputConfigImpl}.
+     *
+     * (3) Process output from other surfaces (RAW, YUV..) and write the result to the output
+     * surface. The output surface won't be contained in the returned
+     * {@link Camera2SessionConfigImpl}.
+     * 
+ * + *

{@link Camera2OutputConfigImplBuilder} and {@link Camera2SessionConfigImplBuilder} + * implementations are provided in the stub for OEM to construct the + * {@link Camera2OutputConfigImpl} and {@link Camera2SessionConfigImpl} instances. + * + * @param surfaceConfigs contains output surfaces for preview, image capture, and an + * optional output config for image analysis (YUV_420_888). + * @return a {@link Camera2SessionConfigImpl} consisting of a list of + * {@link Camera2OutputConfigImpl} and session parameters which will decide the + * {@link android.hardware.camera2.params.SessionConfiguration} for configuring the + * CameraCaptureSession. Please note that the OutputConfiguration list may not be part of any + * supported or mandatory stream combination BUT OEM must ensure this list will always + * produce a valid camera capture session. + * + * @since 1.4 + */ + Camera2SessionConfigImpl initSession( + String cameraId, + Map cameraCharacteristicsMap, + Context context, + OutputSurfaceConfigurationImpl surfaceConfigs); + + /** + * Initializes the session for the extension. This is where the OEMs allocate resources for + * preparing a CameraCaptureSession. After initSession() is called, the camera ID, + * cameraCharacteristics and context will not change until deInitSession() has been called. + * + *

CameraX / Camera2 specifies the output surface configurations for preview, image capture + * and image analysis[optional]. And OEM returns a {@link Camera2SessionConfigImpl} which + * consists of a list of {@link Camera2OutputConfigImpl} and session parameters. The * {@link Camera2SessionConfigImpl} will be used to configure the CameraCaptureSession. * *

OEM is responsible for outputting correct camera images output to these output surfaces. diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java new file mode 100644 index 00000000..707b285b --- /dev/null +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java @@ -0,0 +1,33 @@ +/* + * Copyright 2022 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 androidx.camera.extensions.impl.advanced; + +import android.annotation.SuppressLint; + +/** + * For specifying the output surface configurations for the extension. + * + * @since 1.4 + */ +@SuppressLint("UnknownNullness") +public interface OutputSurfaceConfigurationImpl { + public OutputSurfaceImpl getPreviewOutputSurface(); + + public OutputSurfaceImpl getImageCaptureOutputSurface(); + + public OutputSurfaceImpl getImageAnalysisOutputSurface(); +} 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 fabfc2bf..993d4356 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 @@ -64,9 +64,59 @@ public interface SessionProcessorImpl { * preparing a CameraCaptureSession. After initSession() is called, the camera ID, * cameraCharacteristics and context will not change until deInitSession() has been called. * - *

CameraX specifies the output surface configurations for preview, image capture and image - * analysis[optional]. And OEM returns a {@link Camera2SessionConfigImpl} which consists of a - * list of {@link Camera2OutputConfigImpl} and session parameters. The + *

CameraX / Camera2 specifies the output surface configurations for preview using + * {@link OutputSurfaceConfigurationImpl#getPreviewOutputSurface}, image capture using + * {@link OutputSurfaceConfigurationImpl#getImageCaptureOutputSurface}, and image analysis + * [optional] using {@link OutputSurfaceConfigurationImpl#getImageAnalysisOutputSurface}. + * And OEM returns a {@link Camera2SessionConfigImpl} which consists of a list of + * {@link Camera2OutputConfigImpl} and session parameters. The {@link Camera2SessionConfigImpl} + * will be used to configure the CameraCaptureSession. + * + *

OEM is responsible for outputting correct camera images output to these output surfaces. + * OEM can have the following options to enable the output: + *

+     * (1) Add these output surfaces in CameraCaptureSession directly using
+     * {@link Camera2OutputConfigImplBuilder#newSurfaceConfig(Surface)} }. Processing is done in
+     * HAL.
+     *
+     * (2) Use surface sharing with other surface by calling
+     * {@link Camera2OutputConfigImplBuilder#addSurfaceSharingOutputConfig(Camera2OutputConfigImpl)}
+     * to add the output surface to the other {@link Camera2OutputConfigImpl}.
+     *
+     * (3) Process output from other surfaces (RAW, YUV..) and write the result to the output
+     * surface. The output surface won't be contained in the returned
+     * {@link Camera2SessionConfigImpl}.
+     * 
+ * + *

{@link Camera2OutputConfigImplBuilder} and {@link Camera2SessionConfigImplBuilder} + * implementations are provided in the stub for OEM to construct the + * {@link Camera2OutputConfigImpl} and {@link Camera2SessionConfigImpl} instances. + * + * @param surfaceConfigs contains output surfaces for preview, image capture, and an + * optional output config for image analysis (YUV_420_888). + * @return a {@link Camera2SessionConfigImpl} consisting of a list of + * {@link Camera2OutputConfigImpl} and session parameters which will decide the + * {@link android.hardware.camera2.params.SessionConfiguration} for configuring the + * CameraCaptureSession. Please note that the OutputConfiguration list may not be part of any + * supported or mandatory stream combination BUT OEM must ensure this list will always + * produce a valid camera capture session. + * + * @since 1.4 + */ + Camera2SessionConfigImpl initSession( + String cameraId, + Map cameraCharacteristicsMap, + Context context, + OutputSurfaceConfigurationImpl surfaceConfigs); + + /** + * Initializes the session for the extension. This is where the OEMs allocate resources for + * preparing a CameraCaptureSession. After initSession() is called, the camera ID, + * cameraCharacteristics and context will not change until deInitSession() has been called. + * + *

CameraX / Camera 2 specifies the output surface configurations for preview, image capture + * and image analysis[optional]. And OEM returns a {@link Camera2SessionConfigImpl} which + * consists of a list of {@link Camera2OutputConfigImpl} and session parameters. The * {@link Camera2SessionConfigImpl} will be used to configure the CameraCaptureSession. * *

OEM is responsible for outputting correct camera images output to these output surfaces. -- cgit v1.2.3 From 3b33dca1352e43728d64249818d43d904f4104ad Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Fri, 2 Dec 2022 12:45:56 -0800 Subject: Camera extensions: Add support for dynamic latency estimation Introduce the necessary extension side API to support dynamic still capture latency estimation. Additionally update the library samples with trivial latency implementations. Bug: 260266021 Test: Camera CTS Change-Id: I4595632898a45ddaefcf627302fec41a53d98a17 --- .../impl/AutoImageCaptureExtenderImpl.java | 5 ++++- .../impl/BeautyImageCaptureExtenderImpl.java | 5 +++++ .../impl/BokehImageCaptureExtenderImpl.java | 5 +++++ .../impl/HdrImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/ImageCaptureExtenderImpl.java | 20 ++++++++++++++++++ .../impl/NightImageCaptureExtenderImpl.java | 5 +++++ .../impl/advanced/BaseAdvancedExtenderImpl.java | 5 +++++ .../impl/advanced/SessionProcessorImpl.java | 24 ++++++++++++++++++++++ .../impl/AutoImageCaptureExtenderImpl.java | 5 +++++ .../impl/BeautyImageCaptureExtenderImpl.java | 5 +++++ .../impl/BokehImageCaptureExtenderImpl.java | 5 +++++ .../impl/HdrImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/ImageCaptureExtenderImpl.java | 21 ++++++++++++++++++- .../impl/NightImageCaptureExtenderImpl.java | 5 +++++ .../impl/AutoImageCaptureExtenderImpl.java | 5 +++++ .../impl/BeautyImageCaptureExtenderImpl.java | 5 +++++ .../impl/BokehImageCaptureExtenderImpl.java | 5 +++++ .../impl/HdrImageCaptureExtenderImpl.java | 5 +++++ .../extensions/impl/ImageCaptureExtenderImpl.java | 20 ++++++++++++++++++ .../impl/NightImageCaptureExtenderImpl.java | 5 +++++ .../impl/advanced/SessionProcessorImpl.java | 24 ++++++++++++++++++++++ 21 files changed, 187 insertions(+), 2 deletions(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index 20456b53..49a5a0ef 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -123,5 +123,8 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI throw new RuntimeException("Stub, replace with implementation."); } - + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 1860044e..4a7f9203 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java index 64514930..576029c0 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java index 99978522..a505cb8b 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index 1a257e92..cfc23b11 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -168,4 +168,24 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.4 */ boolean isCaptureProcessProgressAvailable(); + + /** + * Returns the dynamically calculated capture latency pair in milliseconds. + * + *

In contrast to {@link #getEstimatedCaptureLatencyRange} this method is guaranteed to be + * called after the camera capture session is initialized and camera preview is enabled. + * The measurement is expected to take in to account dynamic parameters such as the current + * scene, the state of 3A algorithms, the state of internal HW modules and return a more + * accurate assessment of the still capture latency.

+ * + * @return pair that includes the estimated input frame/frames camera capture latency as the + * first field and the estimated post-processing latency {@link CaptureProcessorImpl#process} + * as the second pair field. Both first and second fields will be in milliseconds. The total + * still capture latency will be the sum of both the first and second values. + * The pair is expected to be null if the dynamic latency estimation is not supported. + * If clients have not configured a still capture output, then this method can also return a + * null pair. + * @since 1.4 + */ + Pair getRealtimeCaptureLatency(); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index 110367ae..829c8a09 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java index 8101b117..7041dae5 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java @@ -615,6 +615,11 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { public void abortCapture(int captureSequenceId) { } + + @Override + public Pair getRealtimeCaptureLatency() { + return null; + } } public static class OutputSurfaceConfigurationImplImpl implements OutputSurfaceConfigurationImpl { diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java index 31171f80..11e63956 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java @@ -21,6 +21,7 @@ import android.content.Context; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureResult; +import android.util.Pair; import android.view.Surface; import java.util.Map; @@ -242,6 +243,29 @@ public interface SessionProcessorImpl { */ void abortCapture(int captureSequenceId); + /** + * Returns the dynamically calculated capture latency pair in milliseconds. + * + *

In contrast to {@link AdvancedExtenderImpl#getEstimatedCaptureLatencyRange} this method is + * guaranteed to be called after {@link #onCaptureSessionStart}. + * The measurement is expected to take in to account dynamic parameters such as the current + * scene, the state of 3A algorithms, the state of internal HW modules and return a more + * accurate assessment of the still capture latency.

+ * + * @return pair that includes the estimated input frame/frames camera capture latency as the + * first field. This is the time between {@link #onCaptureStarted} and + * {@link #onCaptureProcessStarted}. The second field value includes the estimated + * post-processing latency. This is the time between {@link #onCaptureProcessStarted} until + * the processed frame returns back to the client registered surface. + * Both first and second values will be in milliseconds. The total still capture latency will be + * the sum of both the first and second values of the pair. + * The pair is expected to be null if the dynamic latency estimation is not supported. + * If clients have not configured a still capture output, then this method can also return a + * null pair. + * @since 1.4 + */ + Pair getRealtimeCaptureLatency(); + /** * Callback for notifying the status of {@link #startCapture(CaptureCallback)} and * {@link #startRepeating(CaptureCallback)}. diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index 7c50c2fa..fa19a03a 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -268,4 +268,9 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public boolean isCaptureProcessProgressAvailable() { return false; } + + @Override + public Pair getRealtimeCaptureLatency() { + return null; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 3690fdc5..f769549b 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -291,4 +291,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public boolean isCaptureProcessProgressAvailable() { return false; } + + @Override + public Pair getRealtimeCaptureLatency() { + return null; + } } 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 e75c7da2..d3412eb0 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 @@ -352,4 +352,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public boolean isCaptureProcessProgressAvailable() { return false; } + + @Override + public Pair getRealtimeCaptureLatency() { + return null; + } } 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 6ecb84e7..e0f59558 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 @@ -377,4 +377,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public boolean isCaptureProcessProgressAvailable() { return true; } + + @Override + public Pair getRealtimeCaptureLatency() { + return null; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index 7439b14b..8cb64ea2 100644 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -147,5 +147,24 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.4 */ boolean isCaptureProcessProgressAvailable(); -} + /** + * Returns the dynamically calculated capture latency pair in milliseconds. + * + *

In contrast to {@link #getEstimatedCaptureLatencyRange} this method is guaranteed to be + * called after the camera capture session is initialized and camera preview is enabled. + * The measurement is expected to take in to account dynamic parameters such as the current + * scene, the state of 3A algorithms, the state of internal HW modules and return a more + * accurate assessment of the still capture latency.

+ * + * @return pair that includes the estimated input frame/frames camera capture latency as the + * first field and the estimated post-processing latency {@link CaptureProcessorImpl#process} + * as the second pair field. Both first and second fields will be in milliseconds. The total + * still capture latency will be the sum of both the first and second values. + * The pair is expected to be null if the dynamic latency estimation is not supported. + * If clients have not configured a still capture output, then this method can also return a + * null pair. + * @since 1.4 + */ + Pair getRealtimeCaptureLatency(); +} diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index 7deab9f4..c233ef8f 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -268,4 +268,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public boolean isCaptureProcessProgressAvailable() { return false; } + + @Override + public Pair getRealtimeCaptureLatency() { + return null; + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index aab25811..49a5a0ef 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 1860044e..4a7f9203 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java index 64514930..576029c0 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java index 99978522..a505cb8b 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index 1a257e92..cfc23b11 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -168,4 +168,24 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.4 */ boolean isCaptureProcessProgressAvailable(); + + /** + * Returns the dynamically calculated capture latency pair in milliseconds. + * + *

In contrast to {@link #getEstimatedCaptureLatencyRange} this method is guaranteed to be + * called after the camera capture session is initialized and camera preview is enabled. + * The measurement is expected to take in to account dynamic parameters such as the current + * scene, the state of 3A algorithms, the state of internal HW modules and return a more + * accurate assessment of the still capture latency.

+ * + * @return pair that includes the estimated input frame/frames camera capture latency as the + * first field and the estimated post-processing latency {@link CaptureProcessorImpl#process} + * as the second pair field. Both first and second fields will be in milliseconds. The total + * still capture latency will be the sum of both the first and second values. + * The pair is expected to be null if the dynamic latency estimation is not supported. + * If clients have not configured a still capture output, then this method can also return a + * null pair. + * @since 1.4 + */ + Pair getRealtimeCaptureLatency(); } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index 110367ae..829c8a09 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -122,4 +122,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public Pair getRealtimeCaptureLatency() { + 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 3f6502ff..2a1f7dc8 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 @@ -21,6 +21,7 @@ import android.content.Context; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureResult; +import android.util.Pair; import android.view.Surface; import java.util.Map; @@ -242,6 +243,29 @@ public interface SessionProcessorImpl { */ void abortCapture(int captureSequenceId); + /** + * Returns the dynamically calculated capture latency pair in milliseconds. + * + *

In contrast to {@link AdvancedExtenderImpl#getEstimatedCaptureLatencyRange} this method is + * guaranteed to be called after {@link #onCaptureSessionStart}. + * The measurement is expected to take in to account dynamic parameters such as the current + * scene, the state of 3A algorithms, the state of internal HW modules and return a more + * accurate assessment of the still capture latency.

+ * + * @return pair that includes the estimated input frame/frames camera capture latency as the + * first field. This is the time between {@link #onCaptureStarted} and + * {@link #onCaptureProcessStarted}. The second field value includes the estimated + * post-processing latency. This is the time between {@link #onCaptureProcessStarted} until + * the processed frame returns back to the client registered surface. + * Both first and second values will be in milliseconds. The total still capture latency will be + * the sum of both the first and second values of the pair. + * The pair is expected to be null if the dynamic latency estimation is not supported. + * If clients have not configured a still capture output, then this method can also return a + * null pair. + * @since 1.4 + */ + Pair getRealtimeCaptureLatency(); + /** * Callback for notifying the status of {@link #startCapture(CaptureCallback)} and * {@link #startRepeating(CaptureCallback)}. -- cgit v1.2.3 From 542843cef6cc62151071a501e038622fcd214cf4 Mon Sep 17 00:00:00 2001 From: Ravneet Dhanjal Date: Thu, 1 Dec 2022 19:53:05 +0000 Subject: Camera Extensions: Add Postview to Extensions Stub - Add postview support to camera extensions stub Test: Camera CTS Bug: 258295487 Change-Id: I178740c6994ef42611ace513c3ba28c65ef58b8d --- .../impl/AutoImageCaptureExtenderImpl.java | 10 +++++ .../impl/BeautyImageCaptureExtenderImpl.java | 10 +++++ .../impl/BokehImageCaptureExtenderImpl.java | 10 +++++ .../extensions/impl/CaptureProcessorImpl.java | 50 ++++++++++++++++++++++ .../impl/HdrImageCaptureExtenderImpl.java | 10 +++++ .../extensions/impl/ImageCaptureExtenderImpl.java | 26 +++++++++++ .../impl/NightImageCaptureExtenderImpl.java | 10 +++++ .../impl/advanced/AdvancedExtenderImpl.java | 22 ++++++++++ .../impl/advanced/AutoAdvancedExtenderImpl.java | 11 +++++ .../impl/advanced/BeautyAdvancedExtenderImpl.java | 11 +++++ .../impl/advanced/BokehAdvancedExtenderImpl.java | 11 +++++ .../impl/advanced/HdrAdvancedExtenderImpl.java | 11 +++++ .../impl/advanced/NightAdvancedExtenderImpl.java | 11 +++++ .../advanced/OutputSurfaceConfigurationImpl.java | 2 + .../impl/advanced/SessionProcessorImpl.java | 20 +++++++++ 15 files changed, 225 insertions(+) diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index 49a5a0ef..bd605708 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 4a7f9203..50c80407 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java index 576029c0..ee777cf9 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java index 3eee146a..f4719b8b 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java @@ -21,6 +21,7 @@ import android.graphics.ImageFormat; import android.hardware.camera2.TotalCaptureResult; import android.media.Image; import android.util.Pair; +import android.util.Size; import android.view.Surface; import java.util.Map; @@ -45,6 +46,29 @@ public interface CaptureProcessorImpl extends ProcessorImpl { */ void process(Map> results); + /** + * Informs the CaptureProcessorImpl where it should write the postview output to. + * This will only be invoked once if a valid postview surface was set. + * + * @param surface A valid {@link ImageFormat#YUV_420_888} {@link Surface} + * that the CaptureProcessorImpl should write data into. + * @since 1.4 + */ + void onPostviewOutputSurface(Surface surface); + + /** + * Invoked when the Camera Framework changes the configured output resolution for + * still capture and postview. + * + *

After this call, {@link CaptureProcessorImpl} should expect any {@link Image} received as + * input for still capture and postview to be at the specified resolutions. + * + * @param size for the surface for still capture. + * @param postviewSize for the surface for postview. + * @since 1.4 + */ + void onResolutionUpdate(Size size, Size postviewSize); + /** * Process a set images captured that were requested. * @@ -63,4 +87,30 @@ public interface CaptureProcessorImpl extends ProcessorImpl { */ void process(Map> results, ProcessResultImpl resultCallback, Executor executor); + + /** + * Process a set images captured that were requested for both postview and + * still capture. + * + *

This processing method will be called if a postview was requested, therefore the + * processed postview should be written to the + * {@link Surface} received by {@link #onPostviewOutputSurface(Surface, int)}. + * The final result of the processing step should be written to the {@link Surface} that was + * received by {@link #onOutputSurface(Surface, int)}. Since postview should be available + * before the capture, it should be processed and written to the surface before + * the final capture is processed. + * + * @param results The map of {@link ImageFormat#YUV_420_888} format images and + * metadata to process. The {@link Image} that are contained within + * the map will become invalid after this method completes, so no + * references to them should be kept. + * @param resultCallback Capture result callback to be called once the capture result + * values of the processed image are ready. + * @param executor The executor to run the callback on. If null then the callback + * will run on any arbitrary executor. + * @throws RuntimeException if postview feature is not supported + * @since 1.4 + */ + void processWithPostview(Map> results, + ProcessResultImpl resultCallback, Executor executor); } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java index a505cb8b..f3fd2f3b 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index cfc23b11..70c1804e 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -84,6 +84,21 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { */ List> getSupportedResolutions(); + /** + * Returns the customized supported postview resolutions for a still capture using + * its size. + * + *

Pair list composed with {@link ImageFormat} and {@link Size} array will be returned. + * + *

The returned resolutions should be subset of the supported sizes retrieved from + * {@link android.hardware.camera2.params.StreamConfigurationMap} for the camera device. + * + * @return the customized supported resolutions, or null to support all sizes retrieved from + * {@link android.hardware.camera2.params.StreamConfigurationMap}. + * @since 1.4 + */ + List> getSupportedPostviewResolutions(Size captureSize); + /** * Returns the estimated capture latency range in milliseconds for the target capture * resolution. @@ -188,4 +203,15 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.4 */ Pair getRealtimeCaptureLatency(); + + /** + * Indicates whether the extension supports the postview for still capture feature. + * If the extension is using HAL processing, false should be returned since the + * postview feature is not currently supported for this case. + * + * @return {@code true} in case postview for still capture is supported + * {@code false} otherwise. + * @since 1.4 + */ + boolean isPostviewAvailable(); } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index 829c8a09..6f0eaef9 100755 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } 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 7e708fec..d13efc85 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 @@ -123,6 +123,17 @@ public interface AdvancedExtenderImpl { */ Map> getSupportedCaptureOutputResolutions(String cameraId); + /** + * Returns supported output format/size map for postview image. OEM is required to support + * both JPEG and YUV_420_888 format output. + * + *

The surface created with this supported format/size could configure + * intermediate surfaces(YUV/RAW..) and write the output to the output surface.

+ * + * @since 1.4 + */ + Map> getSupportedPostviewResolutions(Size captureSize); + /** * Returns supported output sizes for Image Analysis (YUV_420_888 format). * @@ -194,4 +205,15 @@ public interface AdvancedExtenderImpl { * @since 1.4 */ public boolean isCaptureProcessProgressAvailable(); + + /** + * Indicates whether the extension supports the postview for still capture feature. + * If the extension is using HAL processing, false should be returned since the + * postview feature is not currently supported for this case. + * + * @return {@code true} in case postview for still capture is supported + * {@code false} otherwise. + * @since 1.4 + */ + boolean isPostviewAvailable(); } 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 4d33ed57..8c3ac11c 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 @@ -68,6 +68,12 @@ public class AutoAdvancedExtenderImpl implements AdvancedExtenderImpl { throw new RuntimeException("Stub, replace with implementation."); } + @Override + public Map> getSupportedPostviewResolutions( + Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Override public List getSupportedYuvAnalysisResolutions( String cameraId) { @@ -93,4 +99,9 @@ public class AutoAdvancedExtenderImpl implements AdvancedExtenderImpl { public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + 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 c709d252..135306c8 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 @@ -68,6 +68,12 @@ public class BeautyAdvancedExtenderImpl implements AdvancedExtenderImpl { throw new RuntimeException("Stub, replace with implementation."); } + @Override + public Map> getSupportedPostviewResolutions( + Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Override public List getSupportedYuvAnalysisResolutions( String cameraId) { @@ -93,4 +99,9 @@ public class BeautyAdvancedExtenderImpl implements AdvancedExtenderImpl { public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + 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 e15d7ad0..fa4ad0dc 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 @@ -68,6 +68,12 @@ public class BokehAdvancedExtenderImpl implements AdvancedExtenderImpl { throw new RuntimeException("Stub, replace with implementation."); } + @Override + public Map> getSupportedPostviewResolutions( + Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Override public List getSupportedYuvAnalysisResolutions( String cameraId) { @@ -93,4 +99,9 @@ public class BokehAdvancedExtenderImpl implements AdvancedExtenderImpl { public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + 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 07f4aa62..dc5b2b60 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 @@ -69,6 +69,12 @@ public class HdrAdvancedExtenderImpl implements AdvancedExtenderImpl { throw new RuntimeException("Stub, replace with implementation."); } + @Override + public Map> getSupportedPostviewResolutions( + Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Override public List getSupportedYuvAnalysisResolutions( String cameraId) { @@ -94,4 +100,9 @@ public class HdrAdvancedExtenderImpl implements AdvancedExtenderImpl { public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + 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 177769bf..5b0ed8ee 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 @@ -68,6 +68,12 @@ public class NightAdvancedExtenderImpl implements AdvancedExtenderImpl { throw new RuntimeException("Stub, replace with implementation."); } + @Override + public Map> getSupportedPostviewResolutions( + Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Override public List getSupportedYuvAnalysisResolutions( String cameraId) { @@ -93,4 +99,9 @@ public class NightAdvancedExtenderImpl implements AdvancedExtenderImpl { public boolean isCaptureProcessProgressAvailable() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java index 707b285b..723f0f4e 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java @@ -30,4 +30,6 @@ public interface OutputSurfaceConfigurationImpl { public OutputSurfaceImpl getImageCaptureOutputSurface(); public OutputSurfaceImpl getImageAnalysisOutputSurface(); + + public OutputSurfaceImpl getPostviewOutputSurface(); } 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 2a1f7dc8..06270812 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 @@ -238,6 +238,26 @@ public interface SessionProcessorImpl { */ int startCapture(CaptureCallback callback); + /** + * Start a multi-frame capture with a postview. {@link #startCapture(CaptureCallback)} + * will be used for captures without a postview request. + * + * Postview will be available before the capture. Upon postview completion, + * {@code OnImageAvailableListener#onImageAvailable} will be called on the ImageReader + * that creates the postview output surface. When the capture is completed, + * {@link CaptureCallback#onCaptureSequenceCompleted} is called and + * {@code OnImageAvailableListener#onImageAvailable} will also be called on the ImageReader + * that creates the image capture output surface. + * + *

Only one capture can perform at a time. Starting a capture when another capture is + * running will cause onCaptureFailed to be called immediately. + * + * @param callback a callback to report the status. + * @return the id of the capture sequence. + * @since 1.4 + */ + int startCaptureWithPostview(CaptureCallback callback); + /** * Abort all capture tasks. */ -- cgit v1.2.3 From 8e874f79e1a83b1492fe1b78dc658323c3c7e79e Mon Sep 17 00:00:00 2001 From: Ravneet Dhanjal Date: Thu, 1 Dec 2022 19:50:01 +0000 Subject: Camera Extensions: Add Postview to sample - Enable postview in extension samples - Add sample postview feature to the basic extension sample Test: Camera CTS Bug: 258295487 Change-Id: I98506f0edd6c2e7f2da0740a243bb564db82274d --- .../impl/AutoImageCaptureExtenderImpl.java | 10 ++ .../impl/BeautyImageCaptureExtenderImpl.java | 10 ++ .../impl/BokehImageCaptureExtenderImpl.java | 10 ++ .../extensions/impl/CaptureProcessorImpl.java | 50 +++++++++ .../impl/HdrImageCaptureExtenderImpl.java | 10 ++ .../extensions/impl/ImageCaptureExtenderImpl.java | 26 +++++ .../impl/NightImageCaptureExtenderImpl.java | 10 ++ .../impl/advanced/AdvancedExtenderImpl.java | 22 ++++ .../impl/advanced/BaseAdvancedExtenderImpl.java | 28 ++++- .../advanced/OutputSurfaceConfigurationImpl.java | 2 + .../impl/advanced/SessionProcessorImpl.java | 20 ++++ .../impl/AutoImageCaptureExtenderImpl.java | 35 ++++++ .../impl/BeautyImageCaptureExtenderImpl.java | 35 ++++++ .../impl/BokehImageCaptureExtenderImpl.java | 125 ++++++++++++++++++++- .../extensions/impl/CaptureProcessorImpl.java | 50 +++++++++ .../impl/HdrImageCaptureExtenderImpl.java | 35 ++++++ .../extensions/impl/ImageCaptureExtenderImpl.java | 26 +++++ .../impl/NightImageCaptureExtenderImpl.java | 35 ++++++ 18 files changed, 536 insertions(+), 3 deletions(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index 49a5a0ef..bd605708 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index 4a7f9203..50c80407 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java index 576029c0..ee777cf9 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java index 3eee146a..f4719b8b 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java @@ -21,6 +21,7 @@ import android.graphics.ImageFormat; import android.hardware.camera2.TotalCaptureResult; import android.media.Image; import android.util.Pair; +import android.util.Size; import android.view.Surface; import java.util.Map; @@ -45,6 +46,29 @@ public interface CaptureProcessorImpl extends ProcessorImpl { */ void process(Map> results); + /** + * Informs the CaptureProcessorImpl where it should write the postview output to. + * This will only be invoked once if a valid postview surface was set. + * + * @param surface A valid {@link ImageFormat#YUV_420_888} {@link Surface} + * that the CaptureProcessorImpl should write data into. + * @since 1.4 + */ + void onPostviewOutputSurface(Surface surface); + + /** + * Invoked when the Camera Framework changes the configured output resolution for + * still capture and postview. + * + *

After this call, {@link CaptureProcessorImpl} should expect any {@link Image} received as + * input for still capture and postview to be at the specified resolutions. + * + * @param size for the surface for still capture. + * @param postviewSize for the surface for postview. + * @since 1.4 + */ + void onResolutionUpdate(Size size, Size postviewSize); + /** * Process a set images captured that were requested. * @@ -63,4 +87,30 @@ public interface CaptureProcessorImpl extends ProcessorImpl { */ void process(Map> results, ProcessResultImpl resultCallback, Executor executor); + + /** + * Process a set images captured that were requested for both postview and + * still capture. + * + *

This processing method will be called if a postview was requested, therefore the + * processed postview should be written to the + * {@link Surface} received by {@link #onPostviewOutputSurface(Surface, int)}. + * The final result of the processing step should be written to the {@link Surface} that was + * received by {@link #onOutputSurface(Surface, int)}. Since postview should be available + * before the capture, it should be processed and written to the surface before + * the final capture is processed. + * + * @param results The map of {@link ImageFormat#YUV_420_888} format images and + * metadata to process. The {@link Image} that are contained within + * the map will become invalid after this method completes, so no + * references to them should be kept. + * @param resultCallback Capture result callback to be called once the capture result + * values of the processed image are ready. + * @param executor The executor to run the callback on. If null then the callback + * will run on any arbitrary executor. + * @throws RuntimeException if postview feature is not supported + * @since 1.4 + */ + void processWithPostview(Map> results, + ProcessResultImpl resultCallback, Executor executor); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java index a505cb8b..f3fd2f3b 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index cfc23b11..70c1804e 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -84,6 +84,21 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { */ List> getSupportedResolutions(); + /** + * Returns the customized supported postview resolutions for a still capture using + * its size. + * + *

Pair list composed with {@link ImageFormat} and {@link Size} array will be returned. + * + *

The returned resolutions should be subset of the supported sizes retrieved from + * {@link android.hardware.camera2.params.StreamConfigurationMap} for the camera device. + * + * @return the customized supported resolutions, or null to support all sizes retrieved from + * {@link android.hardware.camera2.params.StreamConfigurationMap}. + * @since 1.4 + */ + List> getSupportedPostviewResolutions(Size captureSize); + /** * Returns the estimated capture latency range in milliseconds for the target capture * resolution. @@ -188,4 +203,15 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.4 */ Pair getRealtimeCaptureLatency(); + + /** + * Indicates whether the extension supports the postview for still capture feature. + * If the extension is using HAL processing, false should be returned since the + * postview feature is not currently supported for this case. + * + * @return {@code true} in case postview for still capture is supported + * {@code false} otherwise. + * @since 1.4 + */ + boolean isPostviewAvailable(); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index 829c8a09..6f0eaef9 100755 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -95,6 +95,11 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender throw new RuntimeException("Stub, replace with implementation."); } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + throw new RuntimeException("Stub, replace with implementation."); + } + @Nullable @Override public Range getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) { @@ -127,4 +132,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public Pair getRealtimeCaptureLatency() { throw new RuntimeException("Stub, replace with implementation."); } + + @Override + public boolean isPostviewAvailable() { + throw new RuntimeException("Stub, replace with implementation."); + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java index fcda9bee..abcbf5fd 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/AdvancedExtenderImpl.java @@ -123,6 +123,17 @@ public interface AdvancedExtenderImpl { */ Map> getSupportedCaptureOutputResolutions(String cameraId); + /** + * Returns supported output format/size map for postview image. OEM is required to support + * both JPEG and YUV_420_888 format output. + * + *

The surface created with this supported format/size could configure + * intermediate surfaces(YUV/RAW..) and write the output to the output surface.

+ * + * @since 1.4 + */ + Map> getSupportedPostviewResolutions(Size captureSize); + /** * Returns supported output sizes for Image Analysis (YUV_420_888 format). * @@ -194,4 +205,15 @@ public interface AdvancedExtenderImpl { * @since 1.4 */ boolean isCaptureProcessProgressAvailable(); + + /** + * Indicates whether the extension supports the postview for still capture feature. + * If the extension is using HAL processing, false should be returned since the + * postview feature is not currently supported for this case. + * + * @return {@code true} in case postview for still capture is supported + * {@code false} otherwise. + * @since 1.4 + */ + boolean isPostviewAvailable(); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java index 7041dae5..00b57058 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/BaseAdvancedExtenderImpl.java @@ -115,6 +115,11 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { return filterOutputResolutions(Arrays.asList(ImageFormat.JPEG, ImageFormat.YUV_420_888)); } + @Override + public Map> getSupportedPostviewResolutions(Size captureSize) { + return new HashMap<>(); + } + @Override public List getSupportedYuvAnalysisResolutions( String cameraId) { @@ -217,7 +222,8 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { // called. This is just a sample for earlier versions if wanting to redirect this call. OutputSurfaceConfigurationImplImpl surfaceConfigs = new OutputSurfaceConfigurationImplImpl(previewSurfaceConfig, - imageCaptureSurfaceConfig, imageAnalysisSurfaceConfig); + imageCaptureSurfaceConfig, imageAnalysisSurfaceConfig, + null /*postviewSurfaceConfig*/); return initSession(cameraId, cameraCharacteristicsMap, context, surfaceConfigs); } @@ -451,6 +457,11 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { requestList.add(build.build()); } + @Override + public int startCaptureWithPostview(@NonNull CaptureCallback captureCallback) { + return startCapture(captureCallback); + } + @Override public int startCapture(@NonNull CaptureCallback captureCallback) { List requestList = new ArrayList<>(); @@ -626,13 +637,16 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { private OutputSurfaceImpl mOutputPreviewSurfaceImpl; private OutputSurfaceImpl mOutputImageCaptureSurfaceImpl; private OutputSurfaceImpl mOutputImageAnalysisSurfaceImpl; + private OutputSurfaceImpl mOutputPostviewSurfaceImpl; public OutputSurfaceConfigurationImplImpl(OutputSurfaceImpl previewSurfaceConfig, OutputSurfaceImpl imageCaptureSurfaceConfig, - OutputSurfaceImpl imageAnalysisSurfaceConfig) { + OutputSurfaceImpl imageAnalysisSurfaceConfig, + OutputSurfaceImpl postviewSurfaceConfig) { mOutputPreviewSurfaceImpl = previewSurfaceConfig; mOutputImageCaptureSurfaceImpl = imageCaptureSurfaceConfig; mOutputImageAnalysisSurfaceImpl = imageAnalysisSurfaceConfig; + mOutputPostviewSurfaceImpl = postviewSurfaceConfig; } @Override @@ -649,6 +663,11 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { public OutputSurfaceImpl getImageAnalysisOutputSurface() { return mOutputImageAnalysisSurfaceImpl; } + + @Override + public OutputSurfaceImpl getPostviewOutputSurface() { + return mOutputPostviewSurfaceImpl; + } } @Override @@ -672,4 +691,9 @@ public abstract class BaseAdvancedExtenderImpl implements AdvancedExtenderImpl { public boolean isCaptureProcessProgressAvailable() { return true; } + + @Override + public boolean isPostviewAvailable() { + return false; + } } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java index 8e470139..ca3832e3 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/OutputSurfaceConfigurationImpl.java @@ -30,4 +30,6 @@ public interface OutputSurfaceConfigurationImpl { public OutputSurfaceImpl getImageCaptureOutputSurface(); public OutputSurfaceImpl getImageAnalysisOutputSurface(); + + public OutputSurfaceImpl getPostviewOutputSurface(); } diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java index 11e63956..8dbfadc2 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/SessionProcessorImpl.java @@ -223,6 +223,26 @@ public interface SessionProcessorImpl { */ void stopRepeating(); + /** + * Start a multi-frame capture with a postview. {@link #startCapture(CaptureCallback)} + * will be used for captures without a postview request. + * + * Postview will be available before the capture. Upon postview completion, + * {@code OnImageAvailableListener#onImageAvailable} will be called on the ImageReader + * that creates the postview output surface. When the capture is completed, + * {@link CaptureCallback#onCaptureSequenceCompleted} is called and + * {@code OnImageAvailableListener#onImageAvailable} will also be called on the ImageReader + * that creates the image capture output surface. + * + *

Only one capture can perform at a time. Starting a capture when another capture is + * running will cause onCaptureFailed to be called immediately. + * + * @param callback a callback to report the status. + * @return the id of the capture sequence. + * @since 1.4 + */ + int startCaptureWithPostview(CaptureCallback callback); + /** * Start a multi-frame capture. * diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java index fa19a03a..30a79a6b 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java @@ -116,6 +116,26 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI } } + @Override + public void onPostviewOutputSurface(Surface surface) { + + } + + @Override + public void processWithPostview( + Map> results, + ProcessResultImpl resultCallback, Executor executor) { + if (!isPostviewAvailable()) { + throw new RuntimeException("The extension doesn't support postview"); + } + + if (resultCallback != null) { + process(results, resultCallback, executor); + } else { + process(results); + } + } + @Override public void process(Map> results, ProcessResultImpl resultCallback, Executor executor) { @@ -164,6 +184,11 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI } + @Override + public void onResolutionUpdate(Size size, Size postviewSize) { + + } + @Override public void onImageFormatUpdate(int imageFormat) { @@ -244,6 +269,11 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI return null; } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + return new ArrayList<>(); + } + @Override public Range getEstimatedCaptureLatencyRange(Size captureOutputSize) { return null; @@ -273,4 +303,9 @@ public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderI public Pair getRealtimeCaptureLatency() { return null; } + + @Override + public boolean isPostviewAvailable() { + return false; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java index f769549b..c9b24206 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java @@ -118,6 +118,26 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende } } + @Override + public void onPostviewOutputSurface(Surface surface) { + + } + + @Override + public void processWithPostview( + Map> results, + ProcessResultImpl resultCallback, Executor executor) { + if (!isPostviewAvailable()) { + throw new RuntimeException("The extension doesn't support postview"); + } + + if (resultCallback != null) { + process(results, resultCallback, executor); + } else { + process(results); + } + } + @Override public void process(Map> results, ProcessResultImpl resultCallback, Executor executor) { @@ -166,6 +186,11 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende } + @Override + public void onResolutionUpdate(Size size, Size postviewSize) { + + } + @Override public void onImageFormatUpdate(int imageFormat) { @@ -267,6 +292,11 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende return formatResolutionsPairList; } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + return new ArrayList<>(); + } + @Override public Range getEstimatedCaptureLatencyRange(Size captureOutputSize) { return null; @@ -296,4 +326,9 @@ public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtende public Pair getRealtimeCaptureLatency() { return null; } + + @Override + public boolean isPostviewAvailable() { + return false; + } } 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 d3412eb0..a72deef6 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 @@ -16,11 +16,13 @@ package androidx.camera.extensions.impl; import android.content.Context; +import android.graphics.ImageFormat; 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.SessionConfiguration; +import android.hardware.camera2.params.StreamConfigurationMap; import android.media.Image; import android.media.ImageWriter; import android.os.Build; @@ -52,6 +54,8 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender private static final int SESSION_STAGE_ID = 101; private static final int MODE = CaptureRequest.CONTROL_AWB_MODE_SHADE; + private CameraCharacteristics mCameraCharacteristics; + /** * @hide */ @@ -63,6 +67,7 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender */ @Override public void init(String cameraId, CameraCharacteristics cameraCharacteristics) { + mCameraCharacteristics = cameraCharacteristics; } /** @@ -105,6 +110,7 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender CaptureProcessorImpl captureProcessor = new CaptureProcessorImpl() { private ImageWriter mImageWriter; + private ImageWriter mImageWriterPostview; @Override public void onOutputSurface(Surface surface, int imageFormat) { @@ -113,6 +119,61 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender } } + @Override + public void onPostviewOutputSurface(Surface surface) { + if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) && + mImageWriterPostview == null) { + mImageWriterPostview = ImageWriter.newInstance(surface, 1); + } + } + + @Override + public void processWithPostview( + Map> results, + ProcessResultImpl resultCallback, Executor executor) { + + Pair result = results.get(DEFAULT_STAGE_ID); + if (result == null) { + Log.w(TAG, + "Unable to process since images does not contain all " + + "stages."); + return; + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Image image = mImageWriterPostview.dequeueInputImage(); + + // Postview processing here + ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer(); + ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer(); + ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer(); + + // For sample, allocate empty buffer to match postview size + yByteBuffer.put(ByteBuffer.allocate(image.getPlanes()[0] + .getBuffer().capacity())); + uByteBuffer.put(ByteBuffer.allocate(image.getPlanes()[2] + .getBuffer().capacity())); + vByteBuffer.put(ByteBuffer.allocate(image.getPlanes()[1] + .getBuffer().capacity())); + Long sensorTimestamp = + result.second.get(CaptureResult.SENSOR_TIMESTAMP); + if (sensorTimestamp != null) { + image.setTimestamp(sensorTimestamp); + } else { + Log.e(TAG, "Sensor timestamp absent using default!"); + } + + mImageWriterPostview.queueInputImage(image); + } + } + + // Process still capture + if (resultCallback != null) { + process(results, resultCallback, executor); + } else { + process(results); + } + } + @Override public void process(Map> results, ProcessResultImpl resultCallback, Executor executor) { @@ -241,6 +302,11 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender } + @Override + public void onResolutionUpdate(Size size, Size postviewSize) { + + } + @Override public void onImageFormatUpdate(int imageFormat) { @@ -318,7 +384,59 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender */ @Override public List> getSupportedResolutions() { - return null; + List> formatResolutionsPairList = new ArrayList<>(); + + StreamConfigurationMap map = + mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + + if (map != null) { + // The sample implementation only retrieves originally supported resolutions from + // CameraCharacteristics for JPEG and YUV_420_888 formats to return. + Size[] outputSizes = map.getOutputSizes(ImageFormat.JPEG); + + if (outputSizes != null) { + formatResolutionsPairList.add(Pair.create(ImageFormat.JPEG, outputSizes)); + } + + outputSizes = map.getOutputSizes(ImageFormat.YUV_420_888); + + if (outputSizes != null) { + formatResolutionsPairList.add(Pair.create(ImageFormat.YUV_420_888, outputSizes)); + } + } + + return formatResolutionsPairList; + } + + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + // Sample for supported postview sizes, returns subset of supported resolutions for + // still capture that are less than its size and match the aspect ratio + List> res = new ArrayList<>(); + List> captureSupportedResolutions = getSupportedResolutions(); + float targetAr = ((float) captureSize.getWidth()) / captureSize.getHeight(); + + for (Pair elem : captureSupportedResolutions) { + Integer currFormat = elem.first; + Size[] currFormatSizes = elem.second; + List postviewSizes = new ArrayList<>(); + + for (Size s : currFormatSizes) { + if ((s.equals(captureSize)) || (s.getWidth() > captureSize.getWidth()) + || (s.getHeight() > captureSize.getHeight())) continue; + float currentAr = ((float) s.getWidth()) / s.getHeight(); + if (Math.abs(targetAr - currentAr) < 0.01) { + postviewSizes.add(s); + } + } + + if (!postviewSizes.isEmpty()) { + res.add(new Pair(currFormat, + postviewSizes.toArray(new Size[postviewSizes.size()]))); + } + } + + return res; } @Override @@ -357,4 +475,9 @@ public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtender public Pair getRealtimeCaptureLatency() { return null; } + + @Override + public boolean isPostviewAvailable() { + return true; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java index 3eee146a..f4719b8b 100644 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java @@ -21,6 +21,7 @@ import android.graphics.ImageFormat; import android.hardware.camera2.TotalCaptureResult; import android.media.Image; import android.util.Pair; +import android.util.Size; import android.view.Surface; import java.util.Map; @@ -45,6 +46,29 @@ public interface CaptureProcessorImpl extends ProcessorImpl { */ void process(Map> results); + /** + * Informs the CaptureProcessorImpl where it should write the postview output to. + * This will only be invoked once if a valid postview surface was set. + * + * @param surface A valid {@link ImageFormat#YUV_420_888} {@link Surface} + * that the CaptureProcessorImpl should write data into. + * @since 1.4 + */ + void onPostviewOutputSurface(Surface surface); + + /** + * Invoked when the Camera Framework changes the configured output resolution for + * still capture and postview. + * + *

After this call, {@link CaptureProcessorImpl} should expect any {@link Image} received as + * input for still capture and postview to be at the specified resolutions. + * + * @param size for the surface for still capture. + * @param postviewSize for the surface for postview. + * @since 1.4 + */ + void onResolutionUpdate(Size size, Size postviewSize); + /** * Process a set images captured that were requested. * @@ -63,4 +87,30 @@ public interface CaptureProcessorImpl extends ProcessorImpl { */ void process(Map> results, ProcessResultImpl resultCallback, Executor executor); + + /** + * Process a set images captured that were requested for both postview and + * still capture. + * + *

This processing method will be called if a postview was requested, therefore the + * processed postview should be written to the + * {@link Surface} received by {@link #onPostviewOutputSurface(Surface, int)}. + * The final result of the processing step should be written to the {@link Surface} that was + * received by {@link #onOutputSurface(Surface, int)}. Since postview should be available + * before the capture, it should be processed and written to the surface before + * the final capture is processed. + * + * @param results The map of {@link ImageFormat#YUV_420_888} format images and + * metadata to process. The {@link Image} that are contained within + * the map will become invalid after this method completes, so no + * references to them should be kept. + * @param resultCallback Capture result callback to be called once the capture result + * values of the processed image are ready. + * @param executor The executor to run the callback on. If null then the callback + * will run on any arbitrary executor. + * @throws RuntimeException if postview feature is not supported + * @since 1.4 + */ + void processWithPostview(Map> results, + ProcessResultImpl resultCallback, Executor executor); } 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 e0f59558..25232635 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 @@ -131,6 +131,26 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm } } + @Override + public void onPostviewOutputSurface(Surface surface) { + + } + + @Override + public void processWithPostview( + Map> results, + ProcessResultImpl resultCallback, Executor executor) { + if (!isPostviewAvailable()) { + throw new RuntimeException("The extension doesn't support postview"); + } + + if (resultCallback != null) { + process(results, resultCallback, executor); + } else { + process(results); + } + } + @Override public void process(Map> results, ProcessResultImpl resultCallback, Executor executor) { @@ -278,6 +298,11 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm } + @Override + public void onResolutionUpdate(Size size, Size postviewSize) { + + } + @Override public void onImageFormatUpdate(int imageFormat) { @@ -346,6 +371,11 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm return null; } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + return new ArrayList<>(); + } + @Override public Range getEstimatedCaptureLatencyRange(Size captureOutputSize) { return null; @@ -382,4 +412,9 @@ public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderIm public Pair getRealtimeCaptureLatency() { return null; } + + @Override + public boolean isPostviewAvailable() { + return false; + } } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java index 8cb64ea2..37e7baf3 100644 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java @@ -90,6 +90,21 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { */ List> getSupportedResolutions(); + /** + * Returns the customized supported postview resolutions for a still capture using + * its size. + * + *

Pair list composed with {@link ImageFormat} and {@link Size} array will be returned. + * + *

The returned resolutions should be subset of the supported sizes retrieved from + * {@link android.hardware.camera2.params.StreamConfigurationMap} for the camera device. + * + * @return the customized supported resolutions, or null to support all sizes retrieved from + * {@link android.hardware.camera2.params.StreamConfigurationMap}. + * @since 1.4 + */ + List> getSupportedPostviewResolutions(Size captureSize); + /** * Returns the estimated capture latency range in milliseconds for the target capture * resolution. @@ -167,4 +182,15 @@ public interface ImageCaptureExtenderImpl extends ExtenderStateListener { * @since 1.4 */ Pair getRealtimeCaptureLatency(); + + /** + * Indicates whether the extension supports the postview for still capture feature. + * If the extension is using HAL processing, false should be returned since the + * postview feature is not currently supported for this case. + * + * @return {@code true} in case postview for still capture is supported + * {@code false} otherwise. + * @since 1.4 + */ + boolean isPostviewAvailable(); } diff --git a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java index c233ef8f..e3317d94 100755 --- a/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java +++ b/camera2/extensions/sample/src/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java @@ -116,6 +116,26 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender } } + @Override + public void onPostviewOutputSurface(Surface surface) { + + } + + @Override + public void processWithPostview( + Map> results, + ProcessResultImpl resultCallback, Executor executor) { + if (!isPostviewAvailable()) { + throw new RuntimeException("The extension doesn't support postview"); + } + + if (resultCallback != null) { + process(results, resultCallback, executor); + } else { + process(results); + } + } + @Override public void process(Map> results, ProcessResultImpl resultCallback, Executor executor) { @@ -164,6 +184,11 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender } + @Override + public void onResolutionUpdate(Size size, Size postviewSize) { + + } + @Override public void onImageFormatUpdate(int imageFormat) { @@ -244,6 +269,11 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender return null; } + @Override + public List> getSupportedPostviewResolutions(Size captureSize) { + return new ArrayList<>(); + } + @Override public Range getEstimatedCaptureLatencyRange(Size captureOutputSize) { return null; @@ -273,4 +303,9 @@ public final class NightImageCaptureExtenderImpl implements ImageCaptureExtender public Pair getRealtimeCaptureLatency() { return null; } + + @Override + public boolean isPostviewAvailable() { + return false; + } } -- cgit v1.2.3 From f479b81c40b7db0a5ce200680645487978b93681 Mon Sep 17 00:00:00 2001 From: Austin Borger Date: Tue, 14 Mar 2023 21:07:02 -0700 Subject: Modify BlockingCameraManager to allow for inheritance Bug: 264434827 Test: Built locally. Change-Id: I0f9267499b566ab7359d373fa6b45bbd1527e32c --- .../ex/camera2/blocking/BlockingCameraManager.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/camera2/public/src/com/android/ex/camera2/blocking/BlockingCameraManager.java b/camera2/public/src/com/android/ex/camera2/blocking/BlockingCameraManager.java index 21014d03..5b5a38d9 100644 --- a/camera2/public/src/com/android/ex/camera2/blocking/BlockingCameraManager.java +++ b/camera2/public/src/com/android/ex/camera2/blocking/BlockingCameraManager.java @@ -89,7 +89,7 @@ public class BlockingCameraManager { } } - private final CameraManager mManager; + protected final CameraManager mManager; /** * Create a new blocking camera manager. @@ -168,7 +168,7 @@ public class BlockingCameraManager { *

Time out after {@link #OPEN_TIME_OUT_MS} and unblock. Clean up camera if it arrives * later.

*/ - private class OpenListener extends CameraDevice.StateCallback { + protected class OpenListener extends CameraDevice.StateCallback { private static final int ERROR_UNINITIALIZED = -1; private final String mCameraId; @@ -186,9 +186,13 @@ public class BlockingCameraManager { private boolean mNoReply = true; // Start with no reply until proven otherwise private boolean mTimedOut = false; - OpenListener(CameraManager manager, String cameraId, - CameraDevice.StateCallback listener, Handler handler) - throws CameraAccessException { + protected OpenListener(String cameraId, CameraDevice.StateCallback listener) { + mCameraId = cameraId; + mProxy = listener; + } + + OpenListener(CameraManager manager, String cameraId, CameraDevice.StateCallback listener, + Handler handler) throws CameraAccessException { mCameraId = cameraId; mProxy = listener; manager.openCamera(cameraId, this, handler); @@ -281,7 +285,7 @@ public class BlockingCameraManager { if (mProxy != null) mProxy.onClosed(camera); } - CameraDevice blockUntilOpen() throws BlockingOpenException { + public CameraDevice blockUntilOpen() throws BlockingOpenException { /** * Block until onOpened, onError, or onDisconnected */ -- cgit v1.2.3 From dbcd516b6d72b1fd91a327a6775f3c04eac6f385 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Fri, 28 Apr 2023 20:34:33 +0000 Subject: Camera Extensions: Call progress callback during HDR The advanced HDR extensions advertises support for progress callbacks but never triggers the corresponding callback. Bug: 280102680 Test: atest -c -d cts/tests/camera/src/android/hardware/camera2/cts/CameraExtensionSessionTest.java Change-Id: Ia046d86f98d433127908b90f00c9294d010b250f --- .../camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java index 6d9e013d..d8b99289 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/HdrAdvancedExtenderImpl.java @@ -176,6 +176,7 @@ public class HdrAdvancedExtenderImpl extends BaseAdvancedExtenderImpl { @Override public void onCaptureSequenceCompleted(int sequenceId, long frameNumber) { captureCallback.onCaptureSequenceCompleted(seqId); + captureCallback.onCaptureProcessProgressed(100); } @Override -- cgit v1.2.3 From 78c9bf65d80ec1523d8fc610a70ddc5122b72c96 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Fri, 19 May 2023 11:38:10 -0700 Subject: CameraExtensions: Align 'onNextImageAvailable' doc with implementation The current 'onNextImageAvailable' implementation expects extensions to decrement the incoming image reference reference count when they are no longer needed. Bug: 283038375 Test: Camera CTS Change-Id: I4fe48cd1f1f05cf60a870b3603b491819b646a88 --- .../androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java | 3 +-- .../androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java | 3 +-- .../androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java index ce17c4f7..037e9479 100644 --- a/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java +++ b/camera2/extensions/advancedSample/src/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java @@ -26,8 +26,7 @@ import android.annotation.SuppressLint; @SuppressLint("UnknownNullness") public interface ImageProcessorImpl { /** - * The reference count will be decremented when this method returns. If an extension wants - * to hold onto the image it should increment the reference count in this method and + * The reference count will not be decremented when this method returns. Extensions must * decrement it when the image is no longer needed. * *

If OEM is not closing(decrement) the image fast enough, the imageReference passed diff --git a/camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java b/camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java index ce17c4f7..037e9479 100644 --- a/camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java +++ b/camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java @@ -26,8 +26,7 @@ import android.annotation.SuppressLint; @SuppressLint("UnknownNullness") public interface ImageProcessorImpl { /** - * The reference count will be decremented when this method returns. If an extension wants - * to hold onto the image it should increment the reference count in this method and + * The reference count will not be decremented when this method returns. Extensions must * decrement it when the image is no longer needed. * *

If OEM is not closing(decrement) the image fast enough, the imageReference passed diff --git a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java index ce17c4f7..037e9479 100644 --- a/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java +++ b/camera2/extensions/stub/src/main/java/androidx/camera/extensions/impl/advanced/ImageProcessorImpl.java @@ -26,8 +26,7 @@ import android.annotation.SuppressLint; @SuppressLint("UnknownNullness") public interface ImageProcessorImpl { /** - * The reference count will be decremented when this method returns. If an extension wants - * to hold onto the image it should increment the reference count in this method and + * The reference count will not be decremented when this method returns. Extensions must * decrement it when the image is no longer needed. * *

If OEM is not closing(decrement) the image fast enough, the imageReference passed -- cgit v1.2.3