camera: Stop channel/stream immediately

When Easel triggers a fatal error, MIPI may have stopped so waiting
on frame boundary when stopping streams may fail. So force channel
and streams to stop immediately in case of Easel fatal errors.

Test: Camera CTS
Bug: 63090790
Change-Id: I28c36a757d8486ba9d6562b48904e31ce2baf376
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index bf7937a..12fa825 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -682,7 +682,7 @@
     }
     if (mChannelHandle) {
         mCameraHandle->ops->stop_channel(mCameraHandle->camera_handle,
-                mChannelHandle);
+                mChannelHandle, /*stop_immediately*/false);
         LOGD("stopping channel %d", mChannelHandle);
     }
 
@@ -1814,7 +1814,7 @@
     }
     if (mChannelHandle) {
         mCameraHandle->ops->stop_channel(mCameraHandle->camera_handle,
-                mChannelHandle);
+                mChannelHandle, /*stop_immediately*/false);
         LOGD("stopping channel %d", mChannelHandle);
     }
 
@@ -6145,13 +6145,15 @@
  *
  * PARAMETERS :
  *  @ restartChannels: re-start all channels
- *
+ *  @ stopChannelImmediately: stop the channel immediately. This should be used
+ *                            when device encountered an error and MIPI may has
+ *                            been stopped.
  *
  * RETURN     :
  *          0 on success
  *          Error code on failure
  *==========================================================================*/
-int QCamera3HardwareInterface::flush(bool restartChannels)
+int QCamera3HardwareInterface::flush(bool restartChannels, bool stopChannelImmediately)
 {
     KPI_ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_STOP_PREVIEW);
     int32_t rc = NO_ERROR;
@@ -6198,7 +6200,7 @@
     }
     if (mChannelHandle) {
         mCameraHandle->ops->stop_channel(mCameraHandle->camera_handle,
-                mChannelHandle);
+                mChannelHandle, stopChannelImmediately);
     }
 
     // Reset bundle info
@@ -6367,12 +6369,14 @@
  * DESCRIPTION: This function calls internal flush and notifies the error to
  *              framework and updates the state variable.
  *
- * PARAMETERS : None
+ * PARAMETERS :
+ *   @stopChannelImmediately : stop channels immediately without waiting for
+ *                             frame boundary.
  *
  * RETURN     : NO_ERROR on Success
  *              Error code on failure
  *==========================================================================*/
-int32_t QCamera3HardwareInterface::handleCameraDeviceError()
+int32_t QCamera3HardwareInterface::handleCameraDeviceError(bool stopChannelImmediately)
 {
     int32_t rc = NO_ERROR;
 
@@ -6386,7 +6390,7 @@
         }
         pthread_mutex_unlock(&mMutex);
 
-        rc = flush(false /* restart channels */);
+        rc = flush(false /* restart channels */, stopChannelImmediately);
         if (NO_ERROR != rc) {
             LOGE("internal flush to handle mState = ERROR failed");
         }
@@ -14695,7 +14699,7 @@
     mState = ERROR;
     pthread_mutex_unlock(&mMutex);
 
-    handleCameraDeviceError();
+    handleCameraDeviceError(/*stopChannelImmediately*/true);
 }
 
 void QCamera3HardwareInterface::onOpened(std::unique_ptr<HdrPlusClient> client)
@@ -14750,7 +14754,7 @@
     mState = ERROR;
     pthread_mutex_unlock(&mMutex);
 
-    handleCameraDeviceError();
+    handleCameraDeviceError(/*stopChannelImmediately*/true);
 }
 
 void QCamera3HardwareInterface::onCaptureResult(pbcamera::CaptureResult *result,