[libcamera-devel] [PATCH v6 1/2] gstreamer: Do not expose the caps before configuring the camera
Umang Jain
umang.jain at ideasonboard.com
Tue Nov 8 09:36:26 CET 2022
Hi Kieran,
On 11/4/22 4:34 PM, Kieran Bingham wrote:
> Quoting Umang Jain via libcamera-devel (2022-11-02 13:56:13)
>> From: Rishikesh Donadkar <rishikeshdonadkar at gmail.com>
>>
>> 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
> Argh, validate() is supposed to be able to give you everything you need,
> but clearly it doesn't. Maybe we need to look at making calls into the
> IPA for validation too.
Precisely. validate() doesn't give the info such as FrameDurationLimits
(which are I suppose, static information) until we configure the camera
and read the camera->controls().
> But that's an aside to this patch,
>
>> 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 at gmail.com>
>> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
>> Tested-by: Umang Jain <umang.jain at ideasonboard.com>
>> Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
>> ---
>> src/gstreamer/gstlibcamerasrc.cpp | 19 ++++++++++---------
>> 1 file 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;
>> + }
>> +
> If you weren't already taking ownership of the camera, I would have
> worreid here - because you shouldn't change the state of the camera just
> to be able to get it's properties - however, in this instance I beleive
> we're ok - as it's the start streaming thread - so the camera is
> acquired anyway.
>
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
>> /*
>> * 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,
>> --
>> 2.37.3
>>
More information about the libcamera-devel
mailing list