[libcamera-devel] [PATCH v4 1/2] gstreamer: Configure the camera before exposing the caps.
Rishikesh Donadkar
rishikeshdonadkar at gmail.com
Mon Sep 12 11:56:55 CEST 2022
In libcamerasrc capabilities are exposed on the src pad before
configuring the camera. To add support to control and
negotiate the framerate, the controls::FrameDuration needs to be
bound checked between the min/max values that camera can support
and later the applied framerate needs to be exposed along with
resolutions and colorimetry through caps. Valid bounds of the
controls::FrameDuration cannot be known before the
configuration of the camera.
Shift the camera::configure() before the for loop that is exposing
resolutions, colorimetry to the GStreamer through a new CAPS event.
Through this we can know the valid bounds of the FrameDuration and
clam the frame_duration accordingly before applying to the camera.
Through this caps can be exposed without a need of additional new
CAPS event for framerate.
Signed-off-by: Rishikesh Donadkar <rishikeshdonadkar at gmail.com>
---
src/gstreamer/gstlibcamerasrc.cpp | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index 16d70fea..1ee1d08a 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -515,6 +515,15 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread,
goto done;
}
+ ret = state->cam_->configure(state->config_.get());
+ if (ret) {
+ GST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,
+ ("Failed to configure camera: %s", g_strerror(-ret)),
+ ("Camera::configure() failed with error code %i", ret));
+ gst_task_stop(task);
+ return;
+ }
+
/*
* Regardless if it has been modified, create clean caps and push the
* caps event. Downstream will decide if the caps are acceptable.
@@ -535,15 +544,6 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread,
gst_pad_push_event(srcpad, gst_event_new_segment(&segment));
}
- ret = state->cam_->configure(state->config_.get());
- if (ret) {
- GST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,
- ("Failed to configure camera: %s", g_strerror(-ret)),
- ("Camera::configure() failed with error code %i", ret));
- gst_task_stop(task);
- return;
- }
-
self->allocator = gst_libcamera_allocator_new(state->cam_, state->config_.get());
if (!self->allocator) {
GST_ELEMENT_ERROR(self, RESOURCE, NO_SPACE_LEFT,
--
2.25.1
More information about the libcamera-devel
mailing list