gstreamer: Move timestamp calculation out of pad loop

The buffer pts and the pad latency are computed from the framebuffer
timestamp, separately for each pad. Use the sensor timestamp provided
through the request metadata instead, to compute the values once outside
of the pads loop.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
This commit is contained in:
Laurent Pinchart
2022-06-21 22:47:53 +03:00
parent 674c2bf1f1
commit 4517344a55

View File

@@ -34,6 +34,7 @@
#include <libcamera/camera.h>
#include <libcamera/camera_manager.h>
#include <libcamera/control_ids.h>
#include <gst/base/base.h>
@@ -164,22 +165,35 @@ GstLibcameraSrcState::requestCompleted(Request *request)
return;
}
GstClockTime latency;
GstClockTime pts;
if (GST_ELEMENT_CLOCK(src_)) {
int64_t timestamp = request->metadata().get(controls::SensorTimestamp);
GstClockTime gst_base_time = GST_ELEMENT(src_)->base_time;
GstClockTime gst_now = gst_clock_get_time(GST_ELEMENT_CLOCK(src_));
/* \todo Need to expose which reference clock the timestamp relates to. */
GstClockTime sys_now = g_get_monotonic_time() * 1000;
/* Deduced from: sys_now - sys_base_time == gst_now - gst_base_time */
GstClockTime sys_base_time = sys_now - (gst_now - gst_base_time);
pts = timestamp - sys_base_time;
latency = sys_now - timestamp;
} else {
latency = 0;
pts = GST_CLOCK_TIME_NONE;
}
for (GstPad *srcpad : srcpads_) {
Stream *stream = gst_libcamera_pad_get_stream(srcpad);
GstBuffer *buffer = wrap->detachBuffer(stream);
FrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);
if (GST_ELEMENT_CLOCK(src_)) {
GstClockTime gst_base_time = GST_ELEMENT(src_)->base_time;
GstClockTime gst_now = gst_clock_get_time(GST_ELEMENT_CLOCK(src_));
/* \todo Need to expose which reference clock the timestamp relates to. */
GstClockTime sys_now = g_get_monotonic_time() * 1000;
/* Deduced from: sys_now - sys_base_time == gst_now - gst_base_time */
GstClockTime sys_base_time = sys_now - (gst_now - gst_base_time);
GST_BUFFER_PTS(buffer) = fb->metadata().timestamp - sys_base_time;
gst_libcamera_pad_set_latency(srcpad, sys_now - fb->metadata().timestamp);
if (GST_CLOCK_TIME_IS_VALID(pts)) {
GST_BUFFER_PTS(buffer) = pts;
gst_libcamera_pad_set_latency(srcpad, latency);
} else {
GST_BUFFER_PTS(buffer) = 0;
}