QCamera2: HAL3: Set proper partial_result for dropped metadata
In case there is dropped metadata for certain frame number, HAL should
make sure:
1. partial_result field of the capture_result isn't 0.
2. the pending CaptureRequest for the frame number needs to be returned.
This change also makes sure buffers are returned properly for dropped metadata.
Previously, when a metadata is dropped, the cached buffers are not
returned.
Test: Verified no error if metadata is dropped
Bug: 29699751
Change-Id: Iab51f4493c14bb0bee641baa8d7c8b74819a94e5
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index 0bed08f..c16a7b5 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -3442,6 +3442,7 @@
(i->partial_result_cnt == 0)) {
LOGE("Error: HAL missed urgent metadata for frame number %d",
i->frame_number);
+ i->partial_result_cnt++;
}
if (i->frame_number == urgent_frame_number &&
@@ -4094,43 +4095,6 @@
result.input_buffer = iter->input_buffer;
- // Prepare output buffer array
- for (auto bufferInfoIter = iter->buffers.begin();
- bufferInfoIter != iter->buffers.end(); bufferInfoIter++) {
- if (bufferInfoIter->buffer != nullptr) {
-
- QCamera3Channel *channel =
- (QCamera3Channel *)bufferInfoIter->buffer->stream->priv;
- uint32_t streamID = channel->getStreamID(channel->getStreamTypeMask());
-
- // Check if this buffer is a dropped frame.
- auto frameDropIter = mPendingFrameDropList.begin();
- while (frameDropIter != mPendingFrameDropList.end()) {
- if((frameDropIter->stream_ID == streamID) &&
- (frameDropIter->frame_number == frameNumber)) {
- bufferInfoIter->buffer->status = CAMERA3_BUFFER_STATUS_ERROR;
- LOGE("Stream STATUS_ERROR frame_number=%u, streamID=%u", frameNumber,
- streamID);
- mPendingFrameDropList.erase(frameDropIter);
- break;
- } else {
- frameDropIter++;
- }
- }
-
- // Check buffer error status
- bufferInfoIter->buffer->status |= mPendingBuffersMap.getBufErrStatus(
- bufferInfoIter->buffer->buffer);
- mPendingBuffersMap.removeBuf(bufferInfoIter->buffer->buffer);
-
- outputBuffers.push_back(*(bufferInfoIter->buffer));
- free(bufferInfoIter->buffer);
- bufferInfoIter->buffer = NULL;
- }
- }
-
- result.output_buffers = outputBuffers.size() > 0 ? &outputBuffers[0] : nullptr;
- result.num_output_buffers = outputBuffers.size();
} else if (iter->frame_number < frameNumber && liveRequest && thisLiveRequest) {
// If the result metadata belongs to a live request, notify errors for previous pending
// live requests.
@@ -4141,11 +4105,55 @@
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;
+
} else {
iter++;
continue;
}
+ // Prepare output buffer array
+ for (auto bufferInfoIter = iter->buffers.begin();
+ bufferInfoIter != iter->buffers.end(); bufferInfoIter++) {
+ if (bufferInfoIter->buffer != nullptr) {
+
+ QCamera3Channel *channel =
+ (QCamera3Channel *)bufferInfoIter->buffer->stream->priv;
+ uint32_t streamID = channel->getStreamID(channel->getStreamTypeMask());
+
+ // Check if this buffer is a dropped frame.
+ auto frameDropIter = mPendingFrameDropList.begin();
+ while (frameDropIter != mPendingFrameDropList.end()) {
+ if((frameDropIter->stream_ID == streamID) &&
+ (frameDropIter->frame_number == frameNumber)) {
+ bufferInfoIter->buffer->status = CAMERA3_BUFFER_STATUS_ERROR;
+ LOGE("Stream STATUS_ERROR frame_number=%u, streamID=%u", frameNumber,
+ streamID);
+ mPendingFrameDropList.erase(frameDropIter);
+ break;
+ } else {
+ frameDropIter++;
+ }
+ }
+
+ // Check buffer error status
+ bufferInfoIter->buffer->status |= mPendingBuffersMap.getBufErrStatus(
+ bufferInfoIter->buffer->buffer);
+ mPendingBuffersMap.removeBuf(bufferInfoIter->buffer->buffer);
+
+ outputBuffers.push_back(*(bufferInfoIter->buffer));
+ free(bufferInfoIter->buffer);
+ bufferInfoIter->buffer = NULL;
+ }
+ }
+
+ result.output_buffers = outputBuffers.size() > 0 ? &outputBuffers[0] : nullptr;
+ result.num_output_buffers = outputBuffers.size();
+
orchestrateResult(&result);
// For reprocessing, result metadata is the same as settings so do not free it here to