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;