diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2017-09-08 21:48:08 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-09-08 21:48:08 +0000 |
| commit | f23334869dde8f4cb1cafa198e88f5c14dfc420b (patch) | |
| tree | 37cafed4d65f74547789fb76fe312d25e7aff8a2 /core/java | |
| parent | ea842b4e4c7d30509c4cac7023c9f9f25a9b03ae (diff) | |
| parent | 8cd12e9b7cc73b1bbe5e478acdf463c5381f33ef (diff) | |
Merge "Camera: fix race in onRepeatingRequestError callback" into oc-mr1-dev
Diffstat (limited to 'core/java')
5 files changed, 23 insertions, 14 deletions
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 0d5c5e3538c1..bfeb14dedb5c 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -1769,7 +1769,7 @@ public class CameraDeviceImpl extends CameraDevice } @Override - public void onRepeatingRequestError(long lastFrameNumber) { + public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) { if (DEBUG) { Log.d(TAG, "Repeating request error received. Last frame number is " + lastFrameNumber); @@ -1782,7 +1782,10 @@ public class CameraDeviceImpl extends CameraDevice } checkEarlyTriggerSequenceComplete(mRepeatingRequestId, lastFrameNumber); - mRepeatingRequestId = REQUEST_ID_NONE; + // Check if there is already a new repeating request + if (mRepeatingRequestId == repeatingRequestId) { + mRepeatingRequestId = REQUEST_ID_NONE; + } } } diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceState.java b/core/java/android/hardware/camera2/legacy/CameraDeviceState.java index 135d92ba6ea7..89ecd5f1ce63 100644 --- a/core/java/android/hardware/camera2/legacy/CameraDeviceState.java +++ b/core/java/android/hardware/camera2/legacy/CameraDeviceState.java @@ -77,7 +77,7 @@ public class CameraDeviceState { void onCaptureStarted(RequestHolder holder, long timestamp); void onCaptureResult(CameraMetadataNative result, RequestHolder holder); void onRequestQueueEmpty(); - void onRepeatingRequestError(long lastFrameNumber); + void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId); } /** @@ -208,12 +208,14 @@ public class CameraDeviceState { * <p>Repeating request has been stopped due to an error such as abandoned output surfaces.</p> * * @param lastFrameNumber Frame number of the last repeating request before it is stopped. + * @param repeatingRequestId The ID of the repeating request being stopped */ - public synchronized void setRepeatingRequestError(final long lastFrameNumber) { + public synchronized void setRepeatingRequestError(final long lastFrameNumber, + final int repeatingRequestId) { mCurrentHandler.post(new Runnable() { @Override public void run() { - mCurrentListener.onRepeatingRequestError(lastFrameNumber); + mCurrentListener.onRepeatingRequestError(lastFrameNumber, repeatingRequestId); } }); } diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java index d8df9a067c63..49d4096e3f3e 100644 --- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java +++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java @@ -264,10 +264,10 @@ public class CameraDeviceUserShim implements ICameraDeviceUser { } @Override - public void onRepeatingRequestError(long lastFrameNumber) { + public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) { + Object[] objArray = new Object[] { lastFrameNumber, repeatingRequestId }; Message msg = getHandler().obtainMessage(REPEATING_REQUEST_ERROR, - /*arg1*/ (int) (lastFrameNumber & 0xFFFFFFFFL), - /*arg2*/ (int) ( (lastFrameNumber >> 32) & 0xFFFFFFFFL)); + /*obj*/ objArray); getHandler().sendMessage(msg); } @@ -329,9 +329,10 @@ public class CameraDeviceUserShim implements ICameraDeviceUser { break; } case REPEATING_REQUEST_ERROR: { - long lastFrameNumber = msg.arg2 & 0xFFFFFFFFL; - lastFrameNumber = (lastFrameNumber << 32) | (msg.arg1 & 0xFFFFFFFFL); - mCallbacks.onRepeatingRequestError(lastFrameNumber); + Object[] objArray = (Object[]) msg.obj; + long lastFrameNumber = (Long) objArray[0]; + int repeatingRequestId = (Integer) objArray[1]; + mCallbacks.onRepeatingRequestError(lastFrameNumber, repeatingRequestId); break; } case REQUEST_QUEUE_EMPTY: { diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java index 621ea8455d1e..cb59fd14f5c5 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java +++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java @@ -263,7 +263,8 @@ public class LegacyCameraDevice implements AutoCloseable { } @Override - public void onRepeatingRequestError(final long lastFrameNumber) { + public void onRepeatingRequestError(final long lastFrameNumber, + final int repeatingRequestId) { mResultHandler.post(new Runnable() { @Override public void run() { @@ -271,7 +272,8 @@ public class LegacyCameraDevice implements AutoCloseable { Log.d(TAG, "doing onRepeatingRequestError callback."); } try { - mDeviceCallbacks.onRepeatingRequestError(lastFrameNumber); + mDeviceCallbacks.onRepeatingRequestError(lastFrameNumber, + repeatingRequestId); } catch (RemoteException e) { throw new IllegalStateException( "Received remote exception during onRepeatingRequestError " + diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java index 565a43e933ce..aaf07e60bef5 100644 --- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java +++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java @@ -939,7 +939,8 @@ public class RequestThreadManager { Log.d(TAG, "Stopped repeating request. Last frame number is " + lastFrameNumber); } - mDeviceState.setRepeatingRequestError(lastFrameNumber); + mDeviceState.setRepeatingRequestError(lastFrameNumber, + burstHolder.getRequestId()); } if (DEBUG) { |
