Revert "Camera: Add lastCompletedFrameNumber in CaptureResultExtras"

Revert "Camera: Fix race for onCaptureBufferLost callback"

Revert submission 11415576-bufferErrorLossFix

Reason for revert: Breaks Camera on at least the wembley device
Reverted Changes:
I12b716acc:Camera: Fix race for onCaptureBufferLost callback
I43f0f5ea1:Camera: Add lastCompletedFrameNumber in CaptureRes...

Bug: 158622719
Change-Id: I98440c52f61d571e1cb6692667fb067020746795
Test: Locally tried this revert on rvc-dev on a wembley, and now the Camera works
diff --git a/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp b/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp
index 4994393..603f516 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp
@@ -395,7 +395,7 @@
 
 void removeInFlightRequestIfReadyLocked(CaptureOutputStates& states, int idx) {
     InFlightRequestMap& inflightMap = states.inflightMap;
-    InFlightRequest &request = inflightMap.editValueAt(idx);
+    const InFlightRequest &request = inflightMap.valueAt(idx);
     const uint32_t frameNumber = inflightMap.keyAt(idx);
 
     nsecs_t sensorTimestamp = request.sensorTimestamp;
@@ -405,8 +405,8 @@
     // In the case of a successful request:
     //      all input and output buffers, all result metadata, shutter callback
     //      arrived.
-    // In the case of an unsuccessful request:
-    //      all input and output buffers, as well as error notifications, arrived.
+    // In the case of a unsuccessful request:
+    //      all input and output buffers arrived.
     if (request.numBuffersLeft == 0 &&
             (request.skipResultMetadata ||
             (request.haveResultMetadata && shutterTimestamp != 0))) {
@@ -430,26 +430,14 @@
         assert(request.requestStatus != OK ||
                request.pendingOutputBuffers.size() == 0);
 
-        size_t bufferErrorCnt = returnOutputBuffers(
+        returnOutputBuffers(
             states.useHalBufManager, states.listener,
             request.pendingOutputBuffers.array(),
             request.pendingOutputBuffers.size(), 0, /*timestampIncreasing*/true,
             request.outputSurfaces, request.resultExtras);
 
-        request.numErrorBuffersReturned += bufferErrorCnt;
-        if (request.numErrorBuffersReturned == request.numErrorBuffersNotified) {
-            removeInFlightMapEntryLocked(states, idx);
-            ALOGVV("%s: removed frame %d from InFlightMap", __FUNCTION__, frameNumber);
-
-            // Note down the just completed frame number
-            if (request.hasInputBuffer) {
-                states.lastCompletedReprocessFrameNumber = frameNumber;
-            } else if (request.zslCapture) {
-                states.lastCompletedZslFrameNumber = frameNumber;
-            } else {
-                states.lastCompletedRegularFrameNumber = frameNumber;
-            }
-        }
+        removeInFlightMapEntryLocked(states, idx);
+        ALOGVV("%s: removed frame %d from InFlightMap", __FUNCTION__, frameNumber);
     }
 
     states.inflightIntf.checkInflightMapLengthLocked();
@@ -499,10 +487,10 @@
         InFlightRequest &request = states.inflightMap.editValueAt(idx);
         ALOGVV("%s: got InFlightRequest requestId = %" PRId32
                 ", frameNumber = %" PRId64 ", burstId = %" PRId32
-                ", partialResultCount = %d, hasCallback = %d, num_output_buffers %d",
+                ", partialResultCount = %d, hasCallback = %d",
                 __FUNCTION__, request.resultExtras.requestId,
                 request.resultExtras.frameNumber, request.resultExtras.burstId,
-                result->partial_result, request.hasCallback, result->num_output_buffers);
+                result->partial_result, request.hasCallback);
         // Always update the partial count to the latest one if it's not 0
         // (buffers only). When framework aggregates adjacent partial results
         // into one, the latest partial count will be used.
@@ -601,11 +589,10 @@
                 result->num_output_buffers);
         } else {
             bool timestampIncreasing = !(request.zslCapture || request.hasInputBuffer);
-            auto numErrorBuffers = returnOutputBuffers(states.useHalBufManager, states.listener,
+            returnOutputBuffers(states.useHalBufManager, states.listener,
                 result->output_buffers, result->num_output_buffers,
                 shutterTimestamp, timestampIncreasing,
                 request.outputSurfaces, request.resultExtras);
-            request.numErrorBuffersReturned += numErrorBuffers;
         }
 
         if (result->result != NULL && !isPartialResult) {
@@ -643,7 +630,6 @@
                       "  its stream:%s (%d)",  __FUNCTION__,
                       frameNumber, strerror(-res), res);
             }
-
         } else {
             ALOGW("%s: Input buffer should be NULL if there is no input"
                     " buffer sent in the request, skipping input buffer return.",
@@ -799,7 +785,7 @@
     processCaptureResult(states, &r);
 }
 
-size_t returnOutputBuffers(
+void returnOutputBuffers(
         bool useHalBufManager,
         sp<NotificationListener> listener,
         const camera3_stream_buffer_t *outputBuffers, size_t numBuffers,
@@ -807,7 +793,6 @@
         const SurfaceMap& outputSurfaces,
         const CaptureResultExtras &inResultExtras) {
 
-    size_t numErrorBuffers = 0;
     for (size_t i = 0; i < numBuffers; i++)
     {
         if (outputBuffers[i].buffer == nullptr) {
@@ -816,10 +801,6 @@
                 // has not got a output buffer handle filled yet. This is though illegal if HAL
                 // buffer management API is not being used.
                 ALOGE("%s: cannot return a null buffer!", __FUNCTION__);
-            } else {
-                if (outputBuffers[i].status == CAMERA3_BUFFER_STATUS_ERROR) {
-                    numErrorBuffers++;
-                }
             }
             continue;
         }
@@ -863,13 +844,8 @@
                         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER,
                         extras);
             }
-        } else {
-            if (outputBuffers[i].status == CAMERA3_BUFFER_STATUS_ERROR) {
-               numErrorBuffers++;
-            }
         }
     }
-    return numErrorBuffers;
 }
 
 void notifyShutter(CaptureOutputStates& states, const camera3_shutter_msg_t &msg) {
@@ -923,12 +899,6 @@
                     msg.frame_number, r.resultExtras.requestId, msg.timestamp);
                 // Call listener, if any
                 if (states.listener != nullptr) {
-                    r.resultExtras.lastCompletedRegularFrameNumber =
-                            states.lastCompletedRegularFrameNumber;
-                    r.resultExtras.lastCompletedReprocessFrameNumber =
-                            states.lastCompletedReprocessFrameNumber;
-                    r.resultExtras.lastCompletedZslFrameNumber =
-                            states.lastCompletedZslFrameNumber;
                     states.listener->notifyShutter(r.resultExtras, msg.timestamp);
                 }
                 // send pending result and buffers
@@ -939,12 +909,11 @@
                     r.rotateAndCropAuto, r.cameraIdsWithZoom, r.physicalMetadatas);
             }
             bool timestampIncreasing = !(r.zslCapture || r.hasInputBuffer);
-            size_t bufferErrorCnt = returnOutputBuffers(
+            returnOutputBuffers(
                     states.useHalBufManager, states.listener,
                     r.pendingOutputBuffers.array(),
                     r.pendingOutputBuffers.size(), r.shutterTimestamp, timestampIncreasing,
                     r.outputSurfaces, r.resultExtras);
-            r.numErrorBuffersReturned += bufferErrorCnt;
             r.pendingOutputBuffers.clear();
 
             removeInFlightRequestIfReadyLocked(states, idx);
@@ -1007,7 +976,7 @@
                     InFlightRequest &r = states.inflightMap.editValueAt(idx);
                     r.requestStatus = msg.error_code;
                     resultExtras = r.resultExtras;
-                    bool physicalDeviceResultError = false;
+                    bool logicalDeviceResultError = false;
                     if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT ==
                             errorCode) {
                         if (physicalCameraId.size() > 0) {
@@ -1021,39 +990,23 @@
                             }
                             r.physicalCameraIds.erase(iter);
                             resultExtras.errorPhysicalCameraId = physicalCameraId;
-                            physicalDeviceResultError = true;
+                        } else {
+                            logicalDeviceResultError = true;
                         }
                     }
 
-                    if (!physicalDeviceResultError) {
-                        if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT
-                                == errorCode) {
-                            r.skipResultMetadata = true;
-                        } else if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER
-                                == errorCode) {
-                            r.numErrorBuffersNotified ++;
-                        } else {
-                            // errorCode is ERROR_CAMERA_REQUEST
-                            if (!r.skipResultMetadata) {
-                                // In case HAL calls multiples ERROR_REQUEST
-                                // callback, only count the pending buffer
-                                // notify error counter once. And also handle
-                                // the case where ERROR_BUFFERs are sent before
-                                // ERROR_REQUEST, even though it's not allowed
-                                // by the HAL API.
-                                if (r.numErrorBuffersNotified != 0) {
-                                    ALOGW("Camera %s: %s: HAL should not notify ERROR_REQUEST"
-                                            " and ERROR_BUFFER for the same request",
-                                            states.cameraId.string(), __FUNCTION__);
-                                }
-                                r.numErrorBuffersNotified =
-                                        r.numOutputBuffers - r.numErrorBuffersNotified;
-                                r.skipResultMetadata = true;
-                            }
-                        }
-
-                        // Check whether the buffers returned. If they returned,
-                        // remove inflight request.
+                    if (logicalDeviceResultError
+                            ||  hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST ==
+                            errorCode) {
+                        r.skipResultMetadata = true;
+                    }
+                    if (logicalDeviceResultError) {
+                        // In case of missing result check whether the buffers
+                        // returned. If they returned, then remove inflight
+                        // request.
+                        // TODO: should we call this for ERROR_CAMERA_REQUEST as well?
+                        //       otherwise we are depending on HAL to send the buffers back after
+                        //       calling notifyError. Not sure if that's in the spec.
                         removeInFlightRequestIfReadyLocked(states, idx);
                     }
                 } else {
@@ -1379,23 +1332,14 @@
     { // First return buffers cached in mInFlightMap
         std::lock_guard<std::mutex> l(states.inflightLock);
         for (size_t idx = 0; idx < states.inflightMap.size(); idx++) {
-            InFlightRequest &request = states.inflightMap.editValueAt(idx);
-            size_t bufferErrorCnt = returnOutputBuffers(
+            const InFlightRequest &request = states.inflightMap.valueAt(idx);
+            returnOutputBuffers(
                 states.useHalBufManager, states.listener,
                 request.pendingOutputBuffers.array(),
                 request.pendingOutputBuffers.size(), 0,
                 /*timestampIncreasing*/true, request.outputSurfaces,
                 request.resultExtras);
-            request.numErrorBuffersReturned += bufferErrorCnt;
-            ALOGW("%s: Frame %d |  Timestamp: %" PRId64 ", metadata"
-                    " arrived: %s, buffers left: %d, buffers returned with STATUS_ERROR: %d, "
-                    " buffers notified with error: %d\n", __FUNCTION__,
-                    states.inflightMap.keyAt(idx), request.shutterTimestamp,
-                    request.haveResultMetadata ? "true" : "false",
-                    request.numBuffersLeft, request.numErrorBuffersReturned,
-                    request.numErrorBuffersNotified);
         }
-
         states.inflightMap.clear();
         states.inflightIntf.onInflightMapFlushedLocked();
     }