camera: intel: ipu6: Correct frameNumber when return event

When switching mode, sometimes the request Id couldn't
be found, which caused failed to return shutter/metadata
done event.

Use the frameNumber saved in buffer.

BUG=b:149068439, b:149068672
TEST=Full tested pass for camera functions.

Change-Id: I3cec7c4e80d8a98fd3f9115f4f9fd86cd70ad255
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/camera/+/3601862
Reviewed-by: Qingwu Zhang <qingwu.zhang@intel.corp-partner.google.com>
Tested-by: Qingwu Zhang <qingwu.zhang@intel.corp-partner.google.com>
Reviewed-by: Ren-Pei Zeng <kamesan@chromium.org>
Commit-Queue: Ren-Pei Zeng <kamesan@chromium.org>
diff --git a/hal/intel/ipu6/aal/PrivateStream.cpp b/hal/intel/ipu6/aal/PrivateStream.cpp
index cbf232b..632024f 100644
--- a/hal/intel/ipu6/aal/PrivateStream.cpp
+++ b/hal/intel/ipu6/aal/PrivateStream.cpp
@@ -82,6 +82,7 @@
     // Fill the specific setting
     buffer.s.usage = mHALStream.usage;
     buffer.s.id = mHALStream.id;
+    buffer.requestId = frameNumber;
     mBuffers[frameNumber] = buffer;
 
     LOG2("<id%d:req%u>@%s, mHALStream.id:%d, fetch buf addr:%p will run fd", mCameraId, frameNumber,
diff --git a/hal/intel/ipu6/aal/RequestManager.cpp b/hal/intel/ipu6/aal/RequestManager.cpp
index b32ff91..df63982 100644
--- a/hal/intel/ipu6/aal/RequestManager.cpp
+++ b/hal/intel/ipu6/aal/RequestManager.cpp
@@ -626,19 +626,25 @@
     if (!inputCam3Buf || opaqueRawInfo.sequence >= 0) {
         icamera::camera_buffer_t* buffer[kMaxStreamNum] = {nullptr};
         int numBuffers = 0;
+        bool hasNotRaw = false;
         for (auto& stream : mCamera3HALStreams) {
             if (stream->fetchRequestBuffers(&mCameraBufferInfo[index].halBuffer[numBuffers],
                                             request->frame_number)) {
                 mCameraBufferInfo[index].halBuffer[numBuffers].sequence = opaqueRawInfo.sequence;
                 mCameraBufferInfo[index].halBuffer[numBuffers].timestamp = opaqueRawInfo.timestamp;
                 buffer[numBuffers] = &mCameraBufferInfo[index].halBuffer[numBuffers];
+                if (mCameraBufferInfo[index].halBuffer[numBuffers].s.usage !=
+                    icamera::CAMERA_STREAM_OPAQUE_RAW) {
+                    hasNotRaw = true;
+                }
                 numBuffers++;
             }
         }
 
         // it supports one more video output to process face detection, it should trigger
         // the corresponding camera3Stream run. Only when bufferFd is not null, it will be processed
-        if (mFDStream) {
+        // Don't set FD buffer in cases, like Raw reprocessing or only Raw output.
+        if (mFDStream && opaqueRawInfo.sequence < 0 && hasNotRaw) {
             faceDetectionBuf = mFDStream->fetchRequestBuffers(request->frame_number);
             if (faceDetectionBuf) {
                 buffer[numBuffers] = faceDetectionBuf;
diff --git a/hal/intel/ipu6/src/core/CameraDevice.cpp b/hal/intel/ipu6/src/core/CameraDevice.cpp
index a443a00..110edcd 100644
--- a/hal/intel/ipu6/src/core/CameraDevice.cpp
+++ b/hal/intel/ipu6/src/core/CameraDevice.cpp
@@ -906,14 +906,9 @@
         case EVENT_PSYS_REQUEST_BUF_READY: {
             if (mCallback) {
                 camera_msg_data_t data = {CAMERA_ISP_BUF_READY, {}};
-                int32_t userRequestId = 0;
-                int ret = mParamGenerator->getUserRequestId(eventData.data.requestReady.sequence,
-                                                            userRequestId);
-                CheckAndLogError(ret != OK, VOID_VALUE, "failed to find request id,  seq %ld",
-                                 eventData.data.requestReady.sequence);
 
                 data.data.buffer_ready.timestamp = eventData.data.requestReady.timestamp;
-                data.data.buffer_ready.frameNumber = static_cast<uint32_t>(userRequestId);
+                data.data.buffer_ready.frameNumber = eventData.data.requestReady.requestId;
                 mCallback->notify(mCallback, data);
                 PlatformData::updateMakernoteTimeStamp(mCameraId,
                                                        eventData.data.requestReady.sequence,
@@ -925,14 +920,9 @@
         case EVENT_REQUEST_METADATA_READY: {
             if (mCallback) {
                 camera_msg_data_t data = {CAMERA_METADATA_READY, {}};
-                int32_t userRequestId = 0;
-                int ret = mParamGenerator->getUserRequestId(eventData.data.requestReady.sequence,
-                                                            userRequestId);
-                CheckAndLogError(ret != OK, VOID_VALUE, "failed to find request id,  seq %ld",
-                                 eventData.data.requestReady.sequence);
 
                 data.data.metadata_ready.sequence = eventData.data.requestReady.sequence;
-                data.data.metadata_ready.frameNumber = static_cast<uint32_t>(userRequestId);
+                data.data.metadata_ready.frameNumber = eventData.data.requestReady.requestId;
                 mCallback->notify(mCallback, data);
             }
             break;
diff --git a/hal/intel/ipu6/src/core/CameraEventType.h b/hal/intel/ipu6/src/core/CameraEventType.h
index a07bfcd..a08f51f 100644
--- a/hal/intel/ipu6/src/core/CameraEventType.h
+++ b/hal/intel/ipu6/src/core/CameraEventType.h
@@ -76,6 +76,7 @@
 struct EventRequestReady {
     int64_t timestamp;
     int64_t sequence;
+    uint32_t requestId;
 };
 
 struct EventData {
diff --git a/hal/intel/ipu6/src/core/PSysProcessor.cpp b/hal/intel/ipu6/src/core/PSysProcessor.cpp
index 7cb2258..42751f8 100644
--- a/hal/intel/ipu6/src/core/PSysProcessor.cpp
+++ b/hal/intel/ipu6/src/core/PSysProcessor.cpp
@@ -980,6 +980,7 @@
             event.data.requestReady.timestamp =
                 timestamp > 0 ? timestamp : output.second->getUserBuffer()->timestamp;
             event.data.requestReady.sequence = sequence;
+            event.data.requestReady.requestId = output.second->getUserBuffer()->requestId;
 
             notifyListeners(event);
             break;