Camera2: Add support for partial result metadata quirk
- Add new CaptureListener.onCapturePartial() callback for receiving
partial result metadata sooner than the full result metadata will be sent
in onCaptureComplete().
- Add hidden keys for the partial result quirk
- Dispatch results to onCapturePartial based on the partial result quirk
All additions are hidden for now.
Bug: 11115603
Change-Id: Ie9a3be640f147257ae22e5b5edf0974bddc1cb85
diff --git a/core/java/android/hardware/camera2/impl/CameraDevice.java b/core/java/android/hardware/camera2/impl/CameraDevice.java
index 814aa96..40586f0 100644
--- a/core/java/android/hardware/camera2/impl/CameraDevice.java
+++ b/core/java/android/hardware/camera2/impl/CameraDevice.java
@@ -577,6 +577,9 @@
}
final CaptureListenerHolder holder;
+ Boolean quirkPartial = result.get(CaptureResult.QUIRKS_PARTIAL_RESULT);
+ boolean quirkIsPartialResult = (quirkPartial != null && quirkPartial);
+
synchronized (mLock) {
// TODO: move this whole map into this class to make it more testable,
// exposing the methods necessary like subscribeToRequest, unsubscribe..
@@ -585,7 +588,7 @@
holder = CameraDevice.this.mCaptureListenerMap.get(requestId);
// Clean up listener once we no longer expect to see it.
- if (holder != null && !holder.isRepeating()) {
+ if (holder != null && !holder.isRepeating() && !quirkIsPartialResult) {
CameraDevice.this.mCaptureListenerMap.remove(requestId);
}
@@ -595,7 +598,7 @@
// If we received a result for a repeating request and have
// prior repeating requests queued for deletion, remove those
// requests from mCaptureListenerMap.
- if (holder != null && holder.isRepeating()
+ if (holder != null && holder.isRepeating() && !quirkIsPartialResult
&& mRepeatingRequestIdDeletedList.size() > 0) {
Iterator<Integer> iter = mRepeatingRequestIdDeletedList.iterator();
while (iter.hasNext()) {
@@ -619,8 +622,25 @@
final CaptureRequest request = holder.getRequest();
final CaptureResult resultAsCapture = new CaptureResult(result, request, requestId);
- holder.getHandler().post(
- new Runnable() {
+ Runnable resultDispatch = null;
+
+ // Either send a partial result or the final capture completed result
+ if (quirkIsPartialResult) {
+ // Partial result
+ resultDispatch = new Runnable() {
+ @Override
+ public void run() {
+ if (!CameraDevice.this.isClosed()){
+ holder.getListener().onCapturePartial(
+ CameraDevice.this,
+ request,
+ resultAsCapture);
+ }
+ }
+ };
+ } else {
+ // Final capture result
+ resultDispatch = new Runnable() {
@Override
public void run() {
if (!CameraDevice.this.isClosed()){
@@ -630,7 +650,10 @@
resultAsCapture);
}
}
- });
+ };
+ }
+
+ holder.getHandler().post(resultDispatch);
}
}