diff options
author | Shuzhen Wang <shuzhenwang@google.com> | 2017-09-19 14:39:43 -0700 |
---|---|---|
committer | Shuzhen Wang <shuzhenwang@google.com> | 2017-09-20 09:37:06 -0700 |
commit | a1d82a9c32cecb6481dd450308eab3d798613105 (patch) | |
tree | c1f91dfad8d03fe635461dcb55d4cf95d5011b28 | |
parent | 5dea3e8a5173ad864594a3ff820bde0ca9e482e5 (diff) | |
download | camera-a1d82a9c32cecb6481dd450308eab3d798613105.tar.gz |
QCamera2: HAL3: Trigger ERROR_RESULT if partial result is dropped
If partial result of a particular frame number is dropped, HAL needs to trigger
notify(RESULT_ERROR) per API contract.
This means that for each dropped HAL metadata, there will be 2
RESULT_ERROR.
Test: Camera CTS
Bug: 65245828
Change-Id: Ieab9449af4f1c49e546f1431edfb7809df9db4cf
-rw-r--r-- | msm8998/QCamera2/HAL3/QCamera3HWI.cpp | 37 | ||||
-rw-r--r-- | msm8998/QCamera2/HAL3/QCamera3HWI.h | 1 |
2 files changed, 22 insertions, 16 deletions
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp index 87eadea..80eb78b 100644 --- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp +++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp @@ -3734,9 +3734,10 @@ void QCamera3HardwareInterface::handleMetadataWithLock( i->frame_number, urgent_frame_number); if ((!i->input_buffer) && (!i->hdrplus) && (i->frame_number < urgent_frame_number) && - (i->partial_result_cnt == 0)) { + (i->partial_result_cnt == 0)) { LOGE("Error: HAL missed urgent metadata for frame number %d", i->frame_number); + i->partialResultDropped = true; i->partial_result_cnt++; } @@ -3835,7 +3836,11 @@ void QCamera3HardwareInterface::handleMetadataWithLock( for (auto & pendingRequest : mPendingRequestsList) { // Find the pending request with the frame number. - if (pendingRequest.frame_number == frame_number) { + if (pendingRequest.frame_number < frame_number) { + // Workaround for case where shutter is missing due to dropped + // metadata + mShutterDispatcher.markShutterReady(pendingRequest.frame_number, capture_time); + } else if (pendingRequest.frame_number == frame_number) { // Update the sensor timestamp. pendingRequest.timestamp = capture_time; @@ -4300,6 +4305,7 @@ void QCamera3HardwareInterface::dispatchResultMetadataWithLock(uint32_t frameNum } bool thisLiveRequest = iter->hdrplus == false && iter->input_buffer == nullptr; + bool errorResult = false; camera3_capture_result_t result = {}; result.frame_number = iter->frame_number; @@ -4316,30 +4322,27 @@ void QCamera3HardwareInterface::dispatchResultMetadataWithLock(uint32_t frameNum iter++; continue; } + // Notify ERROR_RESULT if partial result was dropped. + errorResult = iter->partialResultDropped; } else if (iter->frame_number < frameNumber && isLiveRequest && thisLiveRequest) { // If the result metadata belongs to a live request, notify errors for previous pending // live requests. mPendingLiveRequest--; - CameraMetadata dummyMetadata; - dummyMetadata.update(ANDROID_REQUEST_ID, &(iter->request_id), 1); - result.result = dummyMetadata.release(); - - notifyError(iter->frame_number, CAMERA3_MSG_ERROR_RESULT); - - // partial_result should be PARTIAL_RESULT_CNT in case of - // ERROR_RESULT. - iter->partial_result_cnt = PARTIAL_RESULT_COUNT; - result.partial_result = PARTIAL_RESULT_COUNT; + LOGE("Error: HAL missed metadata for frame number %d", iter->frame_number); + errorResult = true; } else { iter++; continue; } - result.output_buffers = nullptr; - result.num_output_buffers = 0; - orchestrateResult(&result); - + if (errorResult) { + notifyError(iter->frame_number, CAMERA3_MSG_ERROR_RESULT); + } else { + result.output_buffers = nullptr; + result.num_output_buffers = 0; + orchestrateResult(&result); + } // For reprocessing, result metadata is the same as settings so do not free it here to // avoid double free. if (result.result != iter->settings) { @@ -12367,6 +12370,8 @@ int QCamera3HardwareInterface::translateFwkMetadataToHalMetadata( rc = BAD_VALUE; } } + } else { + LOGE("Fatal: Missing ANDROID_CONTROL_AF_MODE"); } } else { uint8_t focusMode = (uint8_t)CAM_FOCUS_MODE_INFINITY; diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.h b/msm8998/QCamera2/HAL3/QCamera3HWI.h index 52cbac0..c601b93 100644 --- a/msm8998/QCamera2/HAL3/QCamera3HWI.h +++ b/msm8998/QCamera2/HAL3/QCamera3HWI.h @@ -607,6 +607,7 @@ private: bool enableZsl; // If ZSL is enabled. bool hdrplus; // If this is an HDR+ request. uint8_t requestedLensShadingMapMode; // Lens shading map mode for this request. + bool partialResultDropped; // Whether partial metadata is dropped. } PendingRequestInfo; typedef struct { uint32_t frame_number; |