diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-05-18 23:03:38 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-05-18 23:03:38 +0000 |
commit | 7d80bf305ecab96a99926239d40caff9afbb6211 (patch) | |
tree | 7eeb58bbaa33503e4250c5d008245227a4d630f3 | |
parent | 61a0e2daffadd692bf462e8c79bd218731d991a1 (diff) | |
parent | 757d88d39e81036dd3f26e12b9aad577a0fce649 (diff) | |
download | camera-android-vts-10.0_r14.tar.gz |
Snap for 5582428 from 757d88d39e81036dd3f26e12b9aad577a0fce649 to qt-releaseandroid-vts-10.0_r9android-vts-10.0_r8android-vts-10.0_r7android-vts-10.0_r6android-vts-10.0_r5android-vts-10.0_r4android-vts-10.0_r3android-vts-10.0_r2android-vts-10.0_r16android-vts-10.0_r15android-vts-10.0_r14android-vts-10.0_r13android-vts-10.0_r12android-vts-10.0_r11android-vts-10.0_r10android-vts-10.0_r1android-cts-10.0_r9android-cts-10.0_r8android-cts-10.0_r7android-cts-10.0_r6android-cts-10.0_r5android-cts-10.0_r4android-cts-10.0_r3android-cts-10.0_r2android-cts-10.0_r16android-cts-10.0_r15android-cts-10.0_r14android-cts-10.0_r13android-cts-10.0_r12android-cts-10.0_r11android-cts-10.0_r10android-cts-10.0_r1android-10.0.0_r6android-10.0.0_r5android-10.0.0_r4android-10.0.0_r3android-10.0.0_r2android-10.0.0_r17android-10.0.0_r11android-10.0.0_r10android-10.0.0_r1android10-tests-releaseandroid10-s3-releaseandroid10-s2-releaseandroid10-s1-releaseandroid10-release
Change-Id: Ic1451fe4583ab2a18bfff77c935a9010621f4755
-rw-r--r-- | msm8998/QCamera2/HAL3/QCamera3HWI.cpp | 68 | ||||
-rw-r--r-- | msm8998/QCamera2/HAL3/QCamera3HWI.h | 17 |
2 files changed, 60 insertions, 25 deletions
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp index 5c7328d..ed11ff6 100644 --- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp +++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp @@ -4507,7 +4507,7 @@ void QCamera3HardwareInterface::handleInputBufferWithLock(uint32_t frame_number) i = erasePendingRequest(i); // Dispatch result metadata that may be just unblocked by this reprocess result. - dispatchResultMetadataWithLock(frame_number, /*isLiveRequest*/false); + dispatchResultMetadataWithLock(frame_number, REPROCESS, false/*isHdrPlus*/); } else { LOGE("Could not find input request for frame number %d", frame_number); } @@ -4658,17 +4658,17 @@ void QCamera3HardwareInterface::handlePendingResultMetadataWithLock(uint32_t fra requestIter->resultMetadata = resultMetadata; // Check what type of request this is. - bool liveRequest = false; + RequestType requestType = (requestIter->input_buffer != nullptr) ? REPROCESS : + (isStillZsl(*requestIter) ? ZSL : NORMAL); if (requestIter->hdrplus) { // HDR+ request doesn't have partial results. requestIter->partial_result_cnt = PARTIAL_RESULT_COUNT; - } else if (requestIter->input_buffer != nullptr) { + } else if (requestType == REPROCESS) { // Reprocessing request result is the same as settings. requestIter->resultMetadata = requestIter->settings; // Reprocessing request doesn't have partial results. requestIter->partial_result_cnt = PARTIAL_RESULT_COUNT; } else { - liveRequest = true; if ((requestIter->partial_result_cnt == 0) && !requestIter->partialResultDropped) { LOGE("Urgent metadata for frame number: %d didn't arrive!", frameNumber); requestIter->partialResultDropped = true; @@ -4686,15 +4686,15 @@ void QCamera3HardwareInterface::handlePendingResultMetadataWithLock(uint32_t fra } } - if (requestIter->input_buffer == nullptr) { + if (requestType != REPROCESS) { removeUnrequestedMetadata(requestIter, resultMetadata); } - dispatchResultMetadataWithLock(frameNumber, liveRequest); + dispatchResultMetadataWithLock(frameNumber, requestType, requestIter->hdrplus); } void QCamera3HardwareInterface::dispatchResultMetadataWithLock(uint32_t frameNumber, - bool isLiveRequest) { + RequestType requestType, bool isHdrPlus) { // The pending requests are ordered by increasing frame numbers. The result metadata are ready // to be sent if all previous pending requests are ready to be sent. bool readyToSend = true; @@ -4702,15 +4702,22 @@ void QCamera3HardwareInterface::dispatchResultMetadataWithLock(uint32_t frameNum // Iterate through the pending requests to send out result metadata that are ready. Also if // this result metadata belongs to a live request, notify errors for previous live requests // that don't have result metadata yet. + // Note: a live request is either a NORMAL request, or a ZSL non-hdrplus request. + bool isLiveRequest = requestType != REPROCESS && !isHdrPlus; auto iter = mPendingRequestsList.begin(); while (iter != mPendingRequestsList.end()) { + bool thisIsStillZsl = isStillZsl(*iter); + RequestType thisRequestType = (iter->input_buffer != nullptr) ? REPROCESS : + (thisIsStillZsl ? ZSL : NORMAL); + if (thisRequestType != requestType) { + iter++; + continue; + } // Check if current pending request is ready. If it's not ready, the following pending // requests are also not ready. - if (readyToSend && iter->resultMetadata == nullptr) { - readyToSend = false; - } + readyToSend &= iter->resultMetadata != nullptr; - bool thisLiveRequest = iter->hdrplus == false && iter->input_buffer == nullptr; + bool thisLiveRequest = !iter->hdrplus && iter->input_buffer == nullptr; bool errorResult = false; camera3_capture_result_t result = {}; @@ -4718,8 +4725,7 @@ void QCamera3HardwareInterface::dispatchResultMetadataWithLock(uint32_t frameNum result.result = iter->resultMetadata; result.partial_result = iter->partial_result_cnt; - // If this pending buffer has result metadata, we may be able to send out shutter callback - // and result metadata. + // If this pending buffer has result metadata, we may be able to send it out. if (iter->resultMetadata != nullptr) { if (!readyToSend) { // If any of the previous pending request is not ready, this pending request is @@ -5896,7 +5902,8 @@ no_error: // Let shutter dispatcher and buffer dispatcher know shutter and output buffers are expected // for the frame number. - mShutterDispatcher.expectShutter(frameNumber, request->input_buffer != nullptr); + mShutterDispatcher.expectShutter(frameNumber, request->input_buffer != nullptr, + isStillZsl(pendingRequest)); for (size_t i = 0; i < request->num_output_buffers; i++) { mOutputBufferDispatcher.expectBuffer(frameNumber, request->output_buffers[i].stream); } @@ -16742,12 +16749,14 @@ bool QCamera3HardwareInterface::parseStringArray(const char *str, float *dest, i ShutterDispatcher::ShutterDispatcher(QCamera3HardwareInterface *parent) : mParent(parent) {} -void ShutterDispatcher::expectShutter(uint32_t frameNumber, bool isReprocess) +void ShutterDispatcher::expectShutter(uint32_t frameNumber, bool isReprocess, bool isZsl) { std::lock_guard<std::mutex> lock(mLock); if (isReprocess) { mReprocessShutters.emplace(frameNumber, Shutter()); + } else if (isZsl) { + mZslShutters.emplace(frameNumber, Shutter()); } else { mShutters.emplace(frameNumber, Shutter()); } @@ -16761,15 +16770,21 @@ void ShutterDispatcher::markShutterReady(uint32_t frameNumber, uint64_t timestam // Find the shutter entry. auto shutter = mShutters.find(frameNumber); - if (shutter == mShutters.end()) { + if (shutter != mShutters.end()) { + shutters = &mShutters; + } else { shutter = mReprocessShutters.find(frameNumber); - if (shutter == mReprocessShutters.end()) { - // Shutter was already sent. - return; + if (shutter != mReprocessShutters.end()) { + shutters = &mReprocessShutters; + } else { + shutter = mZslShutters.find(frameNumber); + if (shutter != mZslShutters.end()) { + shutters = &mZslShutters; + } else { + // Shutter was already sent. + return; + } } - shutters = &mReprocessShutters; - } else { - shutters = &mShutters; } if (shutter->second.ready) { @@ -16804,6 +16819,7 @@ void ShutterDispatcher::clear(uint32_t frameNumber) std::lock_guard<std::mutex> lock(mLock); mShutters.erase(frameNumber); mReprocessShutters.erase(frameNumber); + mZslShutters.erase(frameNumber); } void ShutterDispatcher::clear() @@ -16824,8 +16840,16 @@ void ShutterDispatcher::clear() shutter.second.timestamp); } + // Log errors for stale ZSL shutters. + for (auto &shutter : mZslShutters) { + ALOGE("%s: stale zsl shutter: frame number %u, ready %d, timestamp %" PRId64, + __FUNCTION__, shutter.first, shutter.second.ready, + shutter.second.timestamp); + } + mShutters.clear(); mReprocessShutters.clear(); + mZslShutters.clear(); } OutputBufferDispatcher::OutputBufferDispatcher(QCamera3HardwareInterface *parent) : diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.h b/msm8998/QCamera2/HAL3/QCamera3HWI.h index 5dff305..03e9a12 100644 --- a/msm8998/QCamera2/HAL3/QCamera3HWI.h +++ b/msm8998/QCamera2/HAL3/QCamera3HWI.h @@ -173,7 +173,7 @@ public: virtual ~ShutterDispatcher() = default; // Tell dispatch to expect a shutter for a frame number. - void expectShutter(uint32_t frameNumber, bool isReprocess); + void expectShutter(uint32_t frameNumber, bool isReprocess, bool isZsl); // Mark a shutter callback for a frame ready. void markShutterReady(uint32_t frameNumber, uint64_t timestamp); // Discard a pending shutter for frame number. @@ -193,6 +193,7 @@ private: // frame number -> shutter map. Protected by mLock. std::map<uint32_t, Shutter> mShutters; std::map<uint32_t, Shutter> mReprocessShutters; + std::map<uint32_t, Shutter> mZslShutters; QCamera3HardwareInterface *mParent; }; @@ -462,8 +463,13 @@ private: // Going through pending request list and send out result metadata for requests // that are ready. // frameNumber is the lastest frame whose result metadata is ready. - // isLiveRequest is whether the frame belongs to a live request. - void dispatchResultMetadataWithLock(uint32_t frameNumber, bool isLiveRequest); + typedef enum { + NORMAL, + REPROCESS, + ZSL + } RequestType; + void dispatchResultMetadataWithLock(uint32_t frameNumber, + RequestType requestType, bool isHdrPlus); void handleDepthDataLocked(const cam_depth_data_t &depthData, uint32_t frameNumber, uint8_t valid); void notifyErrorFoPendingDepthData(QCamera3DepthChannel *depthCh); @@ -953,6 +959,11 @@ private: // Returns false on parse error static bool parseStringArray(const char *str, float *dest, int count); + static bool isStillZsl(const PendingRequestInfo& requestInfo) { + return requestInfo.enableZsl && + requestInfo.capture_intent == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; + } + float mLastFocusDistance; // Last cached EIS crop info. |