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