diff options
author | Rishikesh Donadkar <rishikeshdonadkar@gmail.com> | 2022-09-15 17:17:33 +0530 |
---|---|---|
committer | Umang Jain <umang.jain@ideasonboard.com> | 2022-11-12 00:14:52 +0530 |
commit | 872588301fe6badb4b22cd8d16ab094753138b52 (patch) | |
tree | 4937d3e2d471cfec0b7dbca8d54238bbc44a186c | |
parent | 86735b12ec60567c12305a5231d0aeb3fae218fc (diff) |
gstreamer: Do not expose the caps before configuring the camera
Configure the camera before exposing the caps valid controls values
(and bounds) are available. These control values might be of interest
to be exposed on the capabilites, which otherwise, would not be
available if the camera is configured after the update caps event.
For instance, the FrameDurationLimits are computed by RPi's IPA in
its configure(). Hence, we need to Camera::configure() to happen in
order to know the FrameDurationLimits, that can be exposed in the caps.
This ties into the framerate support for libcamerasrc which will happen
in a follow-up commit.
Signed-off-by: Rishikesh Donadkar <rishikeshdonadkar@gmail.com>
Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Tested-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r-- | src/gstreamer/gstlibcamerasrc.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp index 16d70fea..60032236 100644 --- a/src/gstreamer/gstlibcamerasrc.cpp +++ b/src/gstreamer/gstlibcamerasrc.cpp @@ -515,6 +515,16 @@ 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); + flow_ret = GST_FLOW_NOT_NEGOTIATED; + goto done; + } + /* * Regardless if it has been modified, create clean caps and push the * caps event. Downstream will decide if the caps are acceptable. @@ -535,15 +545,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, |