diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 7573089b52..063fa08c7f 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -77,8 +77,10 @@ Camera3Device::Camera3Device(const String8 &id): mTimestampOffset(0), mNextResultFrameNumber(0), mNextReprocessResultFrameNumber(0), + mNextZslStillResultFrameNumber(0), mNextShutterFrameNumber(0), mNextReprocessShutterFrameNumber(0), + mNextZslStillShutterFrameNumber(0), mListener(NULL), mVendorTagId(CAMERA_METADATA_INVALID_VENDOR_ID), mLastTemplateId(-1), @@ -3464,7 +3466,7 @@ void Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata, CaptureResultExtras &resultExtras, CameraMetadata &collectedPartialResult, uint32_t frameNumber, - bool reprocess, + bool reprocess, bool zslStillCapture, const std::vector& physicalMetadatas) { ATRACE_CALL(); if (pendingMetadata.isEmpty()) @@ -3481,6 +3483,14 @@ void Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata, return; } mNextReprocessResultFrameNumber = frameNumber + 1; + } else if (zslStillCapture) { + if (frameNumber < mNextZslStillResultFrameNumber) { + SET_ERR("Out-of-order ZSL still capture result metadata submitted! " + "(got frame number %d, expecting %d)", + frameNumber, mNextZslStillResultFrameNumber); + return; + } + mNextZslStillResultFrameNumber = frameNumber + 1; } else { if (frameNumber < mNextResultFrameNumber) { SET_ERR("Out-of-order capture result metadata submitted! " @@ -3741,7 +3751,8 @@ void Camera3Device::processCaptureResult(const camera3_capture_result *result) { metadata = result->result; sendCaptureResult(metadata, request.resultExtras, collectedPartialResult, frameNumber, - hasInputBufferInRequest, request.physicalMetadatas); + hasInputBufferInRequest, request.zslCapture && request.stillCapture, + request.physicalMetadatas); } } @@ -3919,12 +3930,20 @@ void Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg, // TODO: need to track errors for tighter bounds on expected frame number. if (r.hasInputBuffer) { if (msg.frame_number < mNextReprocessShutterFrameNumber) { - SET_ERR("Shutter notification out-of-order. Expected " + SET_ERR("Reprocess shutter notification out-of-order. Expected " "notification for frame %d, got frame %d", mNextReprocessShutterFrameNumber, msg.frame_number); return; } mNextReprocessShutterFrameNumber = msg.frame_number + 1; + } else if (r.zslCapture && r.stillCapture) { + if (msg.frame_number < mNextZslStillShutterFrameNumber) { + SET_ERR("ZSL still capture shutter notification out-of-order. Expected " + "notification for frame %d, got frame %d", + mNextZslStillShutterFrameNumber, msg.frame_number); + return; + } + mNextZslStillShutterFrameNumber = msg.frame_number + 1; } else { if (msg.frame_number < mNextShutterFrameNumber) { SET_ERR("Shutter notification out-of-order. Expected " @@ -3948,7 +3967,8 @@ void Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg, // send pending result and buffers sendCaptureResult(r.pendingMetadata, r.resultExtras, r.collectedPartialResult, msg.frame_number, - r.hasInputBuffer, r.physicalMetadatas); + r.hasInputBuffer, r.zslCapture && r.stillCapture, + r.physicalMetadatas); } bool timestampIncreasing = !(r.zslCapture || r.hasInputBuffer); returnOutputBuffers(r.pendingOutputBuffers.array(), diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 8f74611849..de5323e264 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -1186,10 +1186,14 @@ class Camera3Device : uint32_t mNextResultFrameNumber; // the minimal frame number of the next reprocess result uint32_t mNextReprocessResultFrameNumber; + // the minimal frame number of the next ZSL still capture result + uint32_t mNextZslStillResultFrameNumber; // the minimal frame number of the next non-reprocess shutter uint32_t mNextShutterFrameNumber; // the minimal frame number of the next reprocess shutter uint32_t mNextReprocessShutterFrameNumber; + // the minimal frame number of the next ZSL still capture shutter + uint32_t mNextZslStillShutterFrameNumber; List mResultQueue; Condition mResultSignal; wp mListener; @@ -1226,7 +1230,8 @@ class Camera3Device : void sendCaptureResult(CameraMetadata &pendingMetadata, CaptureResultExtras &resultExtras, CameraMetadata &collectedPartialResult, uint32_t frameNumber, - bool reprocess, const std::vector& physicalMetadatas); + bool reprocess, bool zslStillCapture, + const std::vector& physicalMetadatas); bool isLastFullResult(const InFlightRequest& inFlightRequest);