Merge "Camera2: Add CameraDevice#flush()" into klp-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
fb3d78118b
@@ -10856,6 +10856,7 @@ package android.hardware.camera2 {
|
|||||||
method public abstract void close() throws java.lang.Exception;
|
method public abstract void close() throws java.lang.Exception;
|
||||||
method public abstract void configureOutputs(java.util.List<android.view.Surface>) throws android.hardware.camera2.CameraAccessException;
|
method public abstract void configureOutputs(java.util.List<android.view.Surface>) throws android.hardware.camera2.CameraAccessException;
|
||||||
method public abstract android.hardware.camera2.CaptureRequest createCaptureRequest(int) throws android.hardware.camera2.CameraAccessException;
|
method public abstract android.hardware.camera2.CaptureRequest createCaptureRequest(int) throws android.hardware.camera2.CameraAccessException;
|
||||||
|
method public abstract void flush() throws android.hardware.camera2.CameraAccessException;
|
||||||
method public abstract android.hardware.camera2.CameraProperties getProperties() throws android.hardware.camera2.CameraAccessException;
|
method public abstract android.hardware.camera2.CameraProperties getProperties() throws android.hardware.camera2.CameraAccessException;
|
||||||
method public abstract void setErrorListener(android.hardware.camera2.CameraDevice.ErrorListener);
|
method public abstract void setErrorListener(android.hardware.camera2.CameraDevice.ErrorListener);
|
||||||
method public abstract void setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraDevice.CaptureListener) throws android.hardware.camera2.CameraAccessException;
|
method public abstract void setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraDevice.CaptureListener) throws android.hardware.camera2.CameraAccessException;
|
||||||
|
|||||||
@@ -303,7 +303,8 @@ public interface CameraDevice extends AutoCloseable {
|
|||||||
* preview or other continuous stream of frames, without having to submit
|
* preview or other continuous stream of frames, without having to submit
|
||||||
* requests through {@link #capture} at video rates.</p>
|
* requests through {@link #capture} at video rates.</p>
|
||||||
*
|
*
|
||||||
* <p>To stop the repeating capture, call {@link #stopRepeating}</p>
|
* <p>To stop the repeating capture, call {@link #stopRepeating}. Calling
|
||||||
|
* {@link #flush} will also clear the request.</p>
|
||||||
*
|
*
|
||||||
* <p>Calling repeat will replace a burst set up by {@link
|
* <p>Calling repeat will replace a burst set up by {@link
|
||||||
* #setRepeatingBurst}, although any in-progress burst will be
|
* #setRepeatingBurst}, although any in-progress burst will be
|
||||||
@@ -323,6 +324,8 @@ public interface CameraDevice extends AutoCloseable {
|
|||||||
* @see #capture
|
* @see #capture
|
||||||
* @see #captureBurst
|
* @see #captureBurst
|
||||||
* @see #setRepeatingBurst
|
* @see #setRepeatingBurst
|
||||||
|
* @see #stopRepeating
|
||||||
|
* @see #flush
|
||||||
*/
|
*/
|
||||||
public void setRepeatingRequest(CaptureRequest request, CaptureListener listener)
|
public void setRepeatingRequest(CaptureRequest request, CaptureListener listener)
|
||||||
throws CameraAccessException;
|
throws CameraAccessException;
|
||||||
@@ -348,7 +351,8 @@ public interface CameraDevice extends AutoCloseable {
|
|||||||
* requests through {@link #capture} at video rates.</p>
|
* requests through {@link #capture} at video rates.</p>
|
||||||
*
|
*
|
||||||
* <p>To stop the repeating capture, call {@link #stopRepeating}. Any
|
* <p>To stop the repeating capture, call {@link #stopRepeating}. Any
|
||||||
* ongoing burst will still be completed, however.</p>
|
* ongoing burst will still be completed, however. Calling
|
||||||
|
* {@link #flush} will also clear the request.</p>
|
||||||
*
|
*
|
||||||
* <p>Calling repeatBurst will replace a repeating request set up by
|
* <p>Calling repeatBurst will replace a repeating request set up by
|
||||||
* {@link #setRepeatingRequest}, although any in-progress capture will be completed
|
* {@link #setRepeatingRequest}, although any in-progress capture will be completed
|
||||||
@@ -367,6 +371,8 @@ public interface CameraDevice extends AutoCloseable {
|
|||||||
* @see #capture
|
* @see #capture
|
||||||
* @see #captureBurst
|
* @see #captureBurst
|
||||||
* @see #setRepeatingRequest
|
* @see #setRepeatingRequest
|
||||||
|
* @see #stopRepeating
|
||||||
|
* @see #flush
|
||||||
*/
|
*/
|
||||||
public void setRepeatingBurst(List<CaptureRequest> requests, CaptureListener listener)
|
public void setRepeatingBurst(List<CaptureRequest> requests, CaptureListener listener)
|
||||||
throws CameraAccessException;
|
throws CameraAccessException;
|
||||||
@@ -434,6 +440,38 @@ public interface CameraDevice extends AutoCloseable {
|
|||||||
*/
|
*/
|
||||||
public void setErrorListener(ErrorListener listener);
|
public void setErrorListener(ErrorListener listener);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush all captures currently pending and in-progress as fast as
|
||||||
|
* possible.
|
||||||
|
*
|
||||||
|
* <p>The camera device will discard all of its current work as fast as
|
||||||
|
* possible. Some in-flight captures may complete successfully and call
|
||||||
|
* {@link CaptureListener#onCaptureComplete}, while others will trigger
|
||||||
|
* their {@link CaptureListener#onCaptureFailed} callbacks. If a repeating
|
||||||
|
* request or a repeating burst is set, it will be cleared by the flush.</p>
|
||||||
|
*
|
||||||
|
* <p>This method is the fastest way to idle the camera device for
|
||||||
|
* reconfiguration with {@link #configureOutputs}, at the cost of discarding
|
||||||
|
* in-progress work. Once the flush is complete, the idle callback will be
|
||||||
|
* called.</p>
|
||||||
|
*
|
||||||
|
* <p>Flushing will introduce at least a brief pause in the stream of data
|
||||||
|
* from the camera device, since once the flush is complete, the first new
|
||||||
|
* request has to make it through the entire camera pipeline before new
|
||||||
|
* output buffers are produced.</p>
|
||||||
|
*
|
||||||
|
* <p>This means that using {@code flush()} to simply remove pending
|
||||||
|
* requests is not recommended; it's best used for quickly switching output
|
||||||
|
* configurations, or for cancelling long in-progress requests (such as a
|
||||||
|
* multi-second capture).</p>
|
||||||
|
*
|
||||||
|
* @throws CameraAccessException if the camera device is no longer connected
|
||||||
|
* @see #setRepeatingRequest
|
||||||
|
* @see #setRepeatingBurst
|
||||||
|
* @see #configureOutputs
|
||||||
|
*/
|
||||||
|
public void flush() throws CameraAccessException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the connection to this camera device. After this call, all calls to
|
* Close the connection to this camera device. After this call, all calls to
|
||||||
* the camera device interface will throw a {@link IllegalStateException},
|
* the camera device interface will throw a {@link IllegalStateException},
|
||||||
|
|||||||
@@ -45,4 +45,6 @@ interface ICameraDeviceUser
|
|||||||
int getCameraInfo(out CameraMetadata info);
|
int getCameraInfo(out CameraMetadata info);
|
||||||
|
|
||||||
int waitUntilIdle();
|
int waitUntilIdle();
|
||||||
|
|
||||||
|
int flush();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,6 +279,20 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flush() throws CameraAccessException {
|
||||||
|
synchronized (mLock) {
|
||||||
|
try {
|
||||||
|
mRemoteDevice.flush();
|
||||||
|
} catch (CameraRuntimeException e) {
|
||||||
|
throw e.asChecked();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
// impossible
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws Exception {
|
public void close() throws Exception {
|
||||||
|
|
||||||
|
|||||||
@@ -309,4 +309,34 @@ public class CameraDeviceBinderTest extends AndroidTestCase {
|
|||||||
argThat(matcher));
|
argThat(matcher));
|
||||||
request.close();
|
request.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
public void testFlush() throws Exception {
|
||||||
|
int status;
|
||||||
|
|
||||||
|
// Initial flush should work
|
||||||
|
status = mCameraUser.flush();
|
||||||
|
assertEquals(CameraBinderTestUtils.NO_ERROR, status);
|
||||||
|
|
||||||
|
// Then set up a stream
|
||||||
|
CaptureRequest request = createDefaultRequest(/* needStream */true);
|
||||||
|
|
||||||
|
// Flush should still be a no-op, really
|
||||||
|
status = mCameraUser.flush();
|
||||||
|
assertEquals(CameraBinderTestUtils.NO_ERROR, status);
|
||||||
|
|
||||||
|
// Submit a few capture requests
|
||||||
|
int requestId1 = submitCameraRequest(request, /* streaming */false);
|
||||||
|
int requestId2 = submitCameraRequest(request, /* streaming */false);
|
||||||
|
int requestId3 = submitCameraRequest(request, /* streaming */false);
|
||||||
|
int requestId4 = submitCameraRequest(request, /* streaming */false);
|
||||||
|
int requestId5 = submitCameraRequest(request, /* streaming */false);
|
||||||
|
|
||||||
|
// Then flush
|
||||||
|
status = mCameraUser.flush();
|
||||||
|
assertEquals(CameraBinderTestUtils.NO_ERROR, status);
|
||||||
|
|
||||||
|
// TODO: When errors are hooked up, count that errors + successful
|
||||||
|
// requests equal to 5.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user