From baf0c650b3747a6510af81cf92c4a584d7bfd3a1 Mon Sep 17 00:00:00 2001 From: Jianing Wei Date: Fri, 18 Apr 2014 17:35:00 -0700 Subject: Camera2 API: fix bug in Camera2 CTS test failure. * The bug is caused by the fact that we did not update the frame tracker when the listener is null or camera is closed. * This change fixes the bug 14151933. Bug: 14151933 Change-Id: I00e3024e403503a056834be805c44604cb1a8a6d --- .../hardware/camera2/impl/CameraDevice.java | 27 ++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/core/java/android/hardware/camera2/impl/CameraDevice.java b/core/java/android/hardware/camera2/impl/CameraDevice.java index 7328fe3..ee2adac 100644 --- a/core/java/android/hardware/camera2/impl/CameraDevice.java +++ b/core/java/android/hardware/camera2/impl/CameraDevice.java @@ -315,6 +315,12 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { holder = (index >= 0) ? mCaptureListenerMap.valueAt(index) : null; if (holder != null) { mCaptureListenerMap.removeAt(index); + if (DEBUG) { + Log.v(TAG, String.format( + "remove holder for requestId %d, " + + "because lastFrame is %d.", + requestId, lastFrameNumber)); + } } if (holder != null) { @@ -390,6 +396,10 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { if (listener != null) { mCaptureListenerMap.put(requestId, new CaptureListenerHolder(listener, requestList, handler, repeating)); + } else { + if (DEBUG) { + Log.d(TAG, "Listen for request " + requestId + " is null"); + } } long lastFrameNumber = lastFrameNumberRef.getNumber(); @@ -828,7 +838,8 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { CaptureResultExtras resultExtras) throws RemoteException { int requestId = resultExtras.getRequestId(); if (DEBUG) { - Log.d(TAG, "Received result for id " + requestId); + Log.v(TAG, "Received result frame " + resultExtras.getFrameNumber() + " for id " + + requestId); } final CaptureListenerHolder holder; synchronized (mLock) { @@ -838,17 +849,26 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { Boolean quirkPartial = result.get(CaptureResult.QUIRKS_PARTIAL_RESULT); boolean quirkIsPartialResult = (quirkPartial != null && quirkPartial); + // Update tracker (increment counter) when it's not a partial result. + if (!quirkIsPartialResult) { + mFrameNumberTracker.updateTracker(resultExtras.getFrameNumber(), /*error*/false); + } + // Check if we have a listener for this if (holder == null) { if (DEBUG) { - Log.v(TAG, "holder is null, early return"); + Log.d(TAG, + "holder is null, early return at frame " + + resultExtras.getFrameNumber()); } return; } if (isClosed()) { if (DEBUG) { - Log.v(TAG, "camera is closed, early return"); + Log.d(TAG, + "camera is closed, early return at frame " + + resultExtras.getFrameNumber()); } return; } @@ -891,7 +911,6 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { // Fire onCaptureSequenceCompleted if (!quirkIsPartialResult) { - mFrameNumberTracker.updateTracker(resultExtras.getFrameNumber(), /*error*/false); checkAndFireSequenceComplete(); } } -- cgit v1.1