summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUmang Jain <umang.jain@ideasonboard.com>2021-05-26 18:40:25 +0530
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-05-26 19:15:28 +0300
commitc43c12a24bc8b89a13ec17e501dbf9dbe0e40977 (patch)
tree19392c50c463d244ffedd6d7054b41ae52d39ec3
parentabbc4bd11bda70a4d23b5a047aeda5f59d114b3f (diff)
ipa: ipu3: Provide frame timestamps through IPU3Event
Pass in frame timestamps from IPU3 pipeline handler to IPU3 IPA via IPU3Event. Frame timestamps are helpful to IPA algorithms to convergence, by setting them via IPA stats. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Hirokazu Honda <hiroh@chromium.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--include/libcamera/ipa/ipu3.mojom1
-rw-r--r--src/ipa/ipu3/ipu3.cpp4
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp5
3 files changed, 7 insertions, 3 deletions
diff --git a/include/libcamera/ipa/ipu3.mojom b/include/libcamera/ipa/ipu3.mojom
index 32c046ad..29b4c805 100644
--- a/include/libcamera/ipa/ipu3.mojom
+++ b/include/libcamera/ipa/ipu3.mojom
@@ -21,6 +21,7 @@ enum IPU3Operations {
struct IPU3Event {
IPU3Operations op;
uint32 frame;
+ int64 frameTimestamp;
uint32 bufferId;
libcamera.ControlList controls;
};
diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index 769c24d3..581297be 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -53,6 +53,7 @@ private:
void processControls(unsigned int frame, const ControlList &controls);
void fillParams(unsigned int frame, ipu3_uapi_params *params);
void parseStatistics(unsigned int frame,
+ int64_t frameTimestamp,
const ipu3_uapi_stats_3a *stats);
void setControls(unsigned int frame);
@@ -214,7 +215,7 @@ void IPAIPU3::processEvent(const IPU3Event &event)
const ipu3_uapi_stats_3a *stats =
reinterpret_cast<ipu3_uapi_stats_3a *>(mem.data());
- parseStatistics(event.frame, stats);
+ parseStatistics(event.frame, event.frameTimestamp, stats);
break;
}
case EventFillParams: {
@@ -257,6 +258,7 @@ void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
}
void IPAIPU3::parseStatistics(unsigned int frame,
+ [[maybe_unused]] int64_t frameTimestamp,
[[maybe_unused]] const ipu3_uapi_stats_3a *stats)
{
ControlList ctrls(controls::controls);
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 750880ed..58923bc7 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -1357,6 +1357,8 @@ void IPU3CameraData::statBufferReady(FrameBuffer *buffer)
if (!info)
return;
+ Request *request = info->request;
+
if (buffer->metadata().status == FrameMetadata::FrameCancelled) {
info->metadataProcessed = true;
@@ -1364,8 +1366,6 @@ void IPU3CameraData::statBufferReady(FrameBuffer *buffer)
* tryComplete() will delete info if it completes the IPU3Frame.
* In that event, we must have obtained the Request before hand.
*/
- Request *request = info->request;
-
if (frameInfos_.tryComplete(info))
pipe_->completeRequest(request);
@@ -1376,6 +1376,7 @@ void IPU3CameraData::statBufferReady(FrameBuffer *buffer)
ev.op = ipa::ipu3::EventStatReady;
ev.frame = info->id;
ev.bufferId = info->statBuffer->cookie();
+ ev.frameTimestamp = request->metadata().get(controls::SensorTimestamp);
ipa_->processEvent(ev);
}