From 5ee9984930753d3231f457be1bbcdba8910b7666 Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Fri, 12 Apr 2019 11:55:48 -0700 Subject: [PATCH] Camera: Allow out of order ZSL shutter vs regular shutter HAL ZSL request may be out-of-order compared to normal/reprocess requests. Allow such case to improve shot lantecy. Test: Camera CTS, 3P camera app sanity test. Bug: 120604717 Change-Id: Id994efbe392094cdae694afaa2d159bc9c49d5f0 --- .../device3/Camera3Device.cpp | 28 ++++++++++++++++--- .../libcameraservice/device3/Camera3Device.h | 7 ++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 415b2d80a5..6f9f039f8e 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), @@ -3457,7 +3459,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()) @@ -3474,6 +3476,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! " @@ -3728,7 +3738,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); } } @@ -3906,12 +3917,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 " @@ -3935,7 +3954,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 f8245df821..f32a90b5b2 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -1183,10 +1183,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; @@ -1223,7 +1227,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);