Merge "Camera2: Add buffer drop error callback" into nyc-dev

am: 95171050e9

* commit '95171050e9877deb9b1f84b4c55aa828229e2809':
  Camera2: Add buffer drop error callback
This commit is contained in:
Eino-Ville Talvala
2016-03-11 18:18:13 +00:00
committed by android-build-merger
7 changed files with 99 additions and 41 deletions

View File

@@ -13776,6 +13776,7 @@ package android.hardware.camera2 {
public static abstract class CameraCaptureSession.CaptureCallback { public static abstract class CameraCaptureSession.CaptureCallback {
ctor public CameraCaptureSession.CaptureCallback(); ctor public CameraCaptureSession.CaptureCallback();
method public void onCaptureBufferLost(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.view.Surface, long);
method public void onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult); method public void onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult);
method public void onCaptureFailed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure); method public void onCaptureFailed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure);
method public void onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult); method public void onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult);

View File

@@ -14177,6 +14177,7 @@ package android.hardware.camera2 {
public static abstract class CameraCaptureSession.CaptureCallback { public static abstract class CameraCaptureSession.CaptureCallback {
ctor public CameraCaptureSession.CaptureCallback(); ctor public CameraCaptureSession.CaptureCallback();
method public void onCaptureBufferLost(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.view.Surface, long);
method public void onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult); method public void onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult);
method public void onCaptureFailed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure); method public void onCaptureFailed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure);
method public void onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult); method public void onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult);

View File

@@ -13786,6 +13786,7 @@ package android.hardware.camera2 {
public static abstract class CameraCaptureSession.CaptureCallback { public static abstract class CameraCaptureSession.CaptureCallback {
ctor public CameraCaptureSession.CaptureCallback(); ctor public CameraCaptureSession.CaptureCallback();
method public void onCaptureBufferLost(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.view.Surface, long);
method public void onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult); method public void onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult);
method public void onCaptureFailed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure); method public void onCaptureFailed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure);
method public void onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult); method public void onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult);

View File

@@ -990,6 +990,30 @@ public abstract class CameraCaptureSession implements AutoCloseable {
int sequenceId) { int sequenceId) {
// default empty implementation // default empty implementation
} }
/**
* <p>This method is called if a single buffer for a capture could not be sent to its
* destination surface.</p>
*
* <p>If the whole capture failed, then {@link #onCaptureFailed} will be called instead. If
* some but not all buffers were captured but the result metadata will not be available,
* then onCaptureFailed will be invoked with {@link CaptureFailure#wasImageCaptured}
* returning true, along with one or more calls to {@link #onCaptureBufferLost} for the
* failed outputs.</p>
*
* @param session
* The session returned by {@link CameraDevice#createCaptureSession}
* @param request
* The request that was given to the CameraDevice
* @param target
* The target Surface that the buffer will not be produced for
* @param frameNumber
* The frame number for the request
*/
public void onCaptureBufferLost(@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request, @NonNull Surface target, long frameNumber) {
// default empty implementation
}
} }
/** /**

View File

@@ -1116,6 +1116,11 @@ public class CameraDeviceImpl extends CameraDevice
int sequenceId) { int sequenceId) {
// default empty implementation // default empty implementation
} }
public void onCaptureBufferLost(CameraDevice camera,
CaptureRequest request, Surface target, long frameNumber) {
// default empty implementation
}
} }
/** /**
@@ -1887,48 +1892,66 @@ public class CameraDeviceImpl extends CameraDevice
final CaptureRequest request = holder.getRequest(subsequenceId); final CaptureRequest request = holder.getRequest(subsequenceId);
// No way to report buffer errors right now Runnable failureDispatch = null;
if (errorCode == ERROR_CAMERA_BUFFER) { if (errorCode == ERROR_CAMERA_BUFFER) {
Log.e(TAG, String.format("Lost output buffer reported for frame %d", frameNumber)); final Surface outputSurface =
return; mConfiguredOutputs.get(resultExtras.getErrorStreamId()).getSurface();
} if (DEBUG) {
Log.v(TAG, String.format("Lost output buffer reported for frame %d, target %s",
boolean mayHaveBuffers = (errorCode == ERROR_CAMERA_RESULT); frameNumber, outputSurface));
// This is only approximate - exact handling needs the camera service and HAL to
// disambiguate between request failures to due abort and due to real errors.
// For now, assume that if the session believes we're mid-abort, then the error
// is due to abort.
int reason = (mCurrentSession != null && mCurrentSession.isAborting()) ?
CaptureFailure.REASON_FLUSHED :
CaptureFailure.REASON_ERROR;
final CaptureFailure failure = new CaptureFailure(
request,
reason,
/*dropped*/ mayHaveBuffers,
requestId,
frameNumber);
Runnable failureDispatch = new Runnable() {
@Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()){
holder.getCallback().onCaptureFailed(
CameraDeviceImpl.this,
request,
failure);
}
} }
}; failureDispatch = new Runnable() {
holder.getHandler().post(failureDispatch); @Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()){
holder.getCallback().onCaptureBufferLost(
CameraDeviceImpl.this,
request,
outputSurface,
frameNumber);
}
}
};
} else {
boolean mayHaveBuffers = (errorCode == ERROR_CAMERA_RESULT);
// Fire onCaptureSequenceCompleted if appropriate // This is only approximate - exact handling needs the camera service and HAL to
if (DEBUG) { // disambiguate between request failures to due abort and due to real errors. For
Log.v(TAG, String.format("got error frame %d", frameNumber)); // now, assume that if the session believes we're mid-abort, then the error is due
// to abort.
int reason = (mCurrentSession != null && mCurrentSession.isAborting()) ?
CaptureFailure.REASON_FLUSHED :
CaptureFailure.REASON_ERROR;
final CaptureFailure failure = new CaptureFailure(
request,
reason,
/*dropped*/ mayHaveBuffers,
requestId,
frameNumber);
failureDispatch = new Runnable() {
@Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()){
holder.getCallback().onCaptureFailed(
CameraDeviceImpl.this,
request,
failure);
}
}
};
// Fire onCaptureSequenceCompleted if appropriate
if (DEBUG) {
Log.v(TAG, String.format("got error frame %d", frameNumber));
}
mFrameNumberTracker.updateTracker(frameNumber, /*error*/true, request.isReprocess());
checkAndFireSequenceComplete();
} }
mFrameNumberTracker.updateTracker(frameNumber, /*error*/true, request.isReprocess());
checkAndFireSequenceComplete(); // Dispatch the failure callback
holder.getHandler().post(failureDispatch);
} }
} // public class CameraDeviceCallbacks } // public class CameraDeviceCallbacks

View File

@@ -28,6 +28,7 @@ public class CaptureResultExtras implements Parcelable {
private int precaptureTriggerId; private int precaptureTriggerId;
private long frameNumber; private long frameNumber;
private int partialResultCount; private int partialResultCount;
private int errorStreamId;
public static final Parcelable.Creator<CaptureResultExtras> CREATOR = public static final Parcelable.Creator<CaptureResultExtras> CREATOR =
new Parcelable.Creator<CaptureResultExtras>() { new Parcelable.Creator<CaptureResultExtras>() {
@@ -48,13 +49,14 @@ public class CaptureResultExtras implements Parcelable {
public CaptureResultExtras(int requestId, int subsequenceId, int afTriggerId, public CaptureResultExtras(int requestId, int subsequenceId, int afTriggerId,
int precaptureTriggerId, long frameNumber, int precaptureTriggerId, long frameNumber,
int partialResultCount) { int partialResultCount, int errorStreamId) {
this.requestId = requestId; this.requestId = requestId;
this.subsequenceId = subsequenceId; this.subsequenceId = subsequenceId;
this.afTriggerId = afTriggerId; this.afTriggerId = afTriggerId;
this.precaptureTriggerId = precaptureTriggerId; this.precaptureTriggerId = precaptureTriggerId;
this.frameNumber = frameNumber; this.frameNumber = frameNumber;
this.partialResultCount = partialResultCount; this.partialResultCount = partialResultCount;
this.errorStreamId = errorStreamId;
} }
@Override @Override
@@ -70,6 +72,7 @@ public class CaptureResultExtras implements Parcelable {
dest.writeInt(precaptureTriggerId); dest.writeInt(precaptureTriggerId);
dest.writeLong(frameNumber); dest.writeLong(frameNumber);
dest.writeInt(partialResultCount); dest.writeInt(partialResultCount);
dest.writeInt(errorStreamId);
} }
public void readFromParcel(Parcel in) { public void readFromParcel(Parcel in) {
@@ -79,6 +82,7 @@ public class CaptureResultExtras implements Parcelable {
precaptureTriggerId = in.readInt(); precaptureTriggerId = in.readInt();
frameNumber = in.readLong(); frameNumber = in.readLong();
partialResultCount = in.readInt(); partialResultCount = in.readInt();
errorStreamId = in.readInt();
} }
public int getRequestId() { public int getRequestId() {
@@ -104,4 +108,8 @@ public class CaptureResultExtras implements Parcelable {
public int getPartialResultCount() { public int getPartialResultCount() {
return partialResultCount; return partialResultCount;
} }
public int getErrorStreamId() {
return errorStreamId;
}
} }

View File

@@ -91,11 +91,11 @@ public class LegacyCameraDevice implements AutoCloseable {
private CaptureResultExtras getExtrasFromRequest(RequestHolder holder) { private CaptureResultExtras getExtrasFromRequest(RequestHolder holder) {
if (holder == null) { if (holder == null) {
return new CaptureResultExtras(ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE, return new CaptureResultExtras(ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE,
ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE); ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE);
} }
return new CaptureResultExtras(holder.getRequestId(), holder.getSubsequeceId(), return new CaptureResultExtras(holder.getRequestId(), holder.getSubsequeceId(),
/*afTriggerId*/0, /*precaptureTriggerId*/0, holder.getFrameNumber(), /*afTriggerId*/0, /*precaptureTriggerId*/0, holder.getFrameNumber(),
/*partialResultCount*/1); /*partialResultCount*/1, /*errorStreamId*/-1);
} }
/** /**