Merge "Camera: fix race in onRepeatingRequestError callback" into oc-mr1-dev

This commit is contained in:
TreeHugger Robot
2017-09-08 21:48:08 +00:00
committed by Android (Google) Code Review
7 changed files with 25 additions and 16 deletions

View File

@@ -1769,7 +1769,7 @@ public class CameraDeviceImpl extends CameraDevice
} }
@Override @Override
public void onRepeatingRequestError(long lastFrameNumber) { public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "Repeating request error received. Last frame number is " + Log.d(TAG, "Repeating request error received. Last frame number is " +
lastFrameNumber); lastFrameNumber);
@@ -1782,9 +1782,12 @@ public class CameraDeviceImpl extends CameraDevice
} }
checkEarlyTriggerSequenceComplete(mRepeatingRequestId, lastFrameNumber); checkEarlyTriggerSequenceComplete(mRepeatingRequestId, lastFrameNumber);
// Check if there is already a new repeating request
if (mRepeatingRequestId == repeatingRequestId) {
mRepeatingRequestId = REQUEST_ID_NONE; mRepeatingRequestId = REQUEST_ID_NONE;
} }
} }
}
@Override @Override
public void onDeviceIdle() { public void onDeviceIdle() {

View File

@@ -77,7 +77,7 @@ public class CameraDeviceState {
void onCaptureStarted(RequestHolder holder, long timestamp); void onCaptureStarted(RequestHolder holder, long timestamp);
void onCaptureResult(CameraMetadataNative result, RequestHolder holder); void onCaptureResult(CameraMetadataNative result, RequestHolder holder);
void onRequestQueueEmpty(); 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> * <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 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() { mCurrentHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
mCurrentListener.onRepeatingRequestError(lastFrameNumber); mCurrentListener.onRepeatingRequestError(lastFrameNumber, repeatingRequestId);
} }
}); });
} }

View File

@@ -264,10 +264,10 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
} }
@Override @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, Message msg = getHandler().obtainMessage(REPEATING_REQUEST_ERROR,
/*arg1*/ (int) (lastFrameNumber & 0xFFFFFFFFL), /*obj*/ objArray);
/*arg2*/ (int) ( (lastFrameNumber >> 32) & 0xFFFFFFFFL));
getHandler().sendMessage(msg); getHandler().sendMessage(msg);
} }
@@ -329,9 +329,10 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
break; break;
} }
case REPEATING_REQUEST_ERROR: { case REPEATING_REQUEST_ERROR: {
long lastFrameNumber = msg.arg2 & 0xFFFFFFFFL; Object[] objArray = (Object[]) msg.obj;
lastFrameNumber = (lastFrameNumber << 32) | (msg.arg1 & 0xFFFFFFFFL); long lastFrameNumber = (Long) objArray[0];
mCallbacks.onRepeatingRequestError(lastFrameNumber); int repeatingRequestId = (Integer) objArray[1];
mCallbacks.onRepeatingRequestError(lastFrameNumber, repeatingRequestId);
break; break;
} }
case REQUEST_QUEUE_EMPTY: { case REQUEST_QUEUE_EMPTY: {

View File

@@ -263,7 +263,8 @@ public class LegacyCameraDevice implements AutoCloseable {
} }
@Override @Override
public void onRepeatingRequestError(final long lastFrameNumber) { public void onRepeatingRequestError(final long lastFrameNumber,
final int repeatingRequestId) {
mResultHandler.post(new Runnable() { mResultHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
@@ -271,7 +272,8 @@ public class LegacyCameraDevice implements AutoCloseable {
Log.d(TAG, "doing onRepeatingRequestError callback."); Log.d(TAG, "doing onRepeatingRequestError callback.");
} }
try { try {
mDeviceCallbacks.onRepeatingRequestError(lastFrameNumber); mDeviceCallbacks.onRepeatingRequestError(lastFrameNumber,
repeatingRequestId);
} catch (RemoteException e) { } catch (RemoteException e) {
throw new IllegalStateException( throw new IllegalStateException(
"Received remote exception during onRepeatingRequestError " + "Received remote exception during onRepeatingRequestError " +

View File

@@ -939,7 +939,8 @@ public class RequestThreadManager {
Log.d(TAG, "Stopped repeating request. Last frame number is " + Log.d(TAG, "Stopped repeating request. Last frame number is " +
lastFrameNumber); lastFrameNumber);
} }
mDeviceState.setRepeatingRequestError(lastFrameNumber); mDeviceState.setRepeatingRequestError(lastFrameNumber,
burstHolder.getRequestId());
} }
if (DEBUG) { if (DEBUG) {

View File

@@ -271,7 +271,7 @@ public class CameraBinderTest extends AndroidTestCase {
* @see android.hardware.camera2.ICameraDeviceCallbacks#onRepeatingRequestError() * @see android.hardware.camera2.ICameraDeviceCallbacks#onRepeatingRequestError()
*/ */
@Override @Override
public void onRepeatingRequestError(long lastFrameNumber) { public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
} }

View File

@@ -161,7 +161,7 @@ public class CameraDeviceBinderTest extends AndroidTestCase {
* @see android.hardware.camera2.ICameraDeviceCallbacks#onRepeatingRequestError() * @see android.hardware.camera2.ICameraDeviceCallbacks#onRepeatingRequestError()
*/ */
@Override @Override
public void onRepeatingRequestError(long lastFrameNumber) { public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
} }