[libcamera-devel] [PATCH] gstreamer: Provide interlace-mode as fixated caps
Umang Jain
umang.jain at ideasonboard.com
Wed Aug 31 15:18:16 CEST 2022
Hi Kieran,
On 8/31/22 6:44 PM, Kieran Bingham wrote:
> Quoting Laurent Pinchart via libcamera-devel (2022-08-30 02:01:46)
>> Hi Umang,
>>
>> Thank you for the patch.
>>
>> On Mon, Aug 29, 2022 at 03:32:51PM +0530, Umang Jain via libcamera-devel wrote:
>>> The 'interlace-mode' for libcamerasrc will always be 'progressive'.
>> I'm *really* crossing my fingers, hoping that you're right :-)
>>
>>> Provide it via fixated caps mechanism [1]
>>>
>>> [1] https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/negotiation.html?gi-language=c#fixed-negotiation
>>>
>>> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
>>> ---
>>> Rishi, Can you please check this patch as well? I think it will closely
>>> co-relate with the framerate being captured in caps, as fixate
>>> negotitation mechanism.
>>> ---
>>> src/gstreamer/gstlibcamerasrc.cpp | 26 ++++++++++++++++++++++++++
>>> 1 file changed, 26 insertions(+)
>>>
>>> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
>>> index 16d70fea..24a2e33e 100644
>>> --- a/src/gstreamer/gstlibcamerasrc.cpp
>>> +++ b/src/gstreamer/gstlibcamerasrc.cpp
>>> @@ -800,11 +800,37 @@ gst_libcamera_src_release_pad(GstElement *element, GstPad *pad)
>>> gst_element_remove_pad(element, pad);
>>> }
>>>
>>> +static GstCaps *gst_libcamera_src_src_fixate([[maybe_unused]] GstBaseSrc *bsrc,
>>> + GstCaps *caps)
>>> +{
>>> + GstStructure *structure;
>> This could be a local variable within the loop, up to you.
>>
>>> + GstCaps *fixated_caps;
>>> +
>>> + fixated_caps = gst_caps_make_writable(caps);
>>> +
>>> + for (guint i = 0; i < gst_caps_get_size(fixated_caps); ++i) {
>>> + structure = gst_caps_get_structure(fixated_caps, i);
>>> + if (gst_structure_has_field(structure, "interlace-mode"))
>>> + gst_structure_fixate_field_string(structure, "interlace-mode",
>>> + "progressive");
>>> + else
>>> + gst_structure_set(structure, "interlace-mode", G_TYPE_STRING,
>>> + "progressive", NULL);
>>> + }
>>> +
>>> + fixated_caps = gst_caps_fixate(fixated_caps);
>>> +
>>> + return fixated_caps;
>> Just
>>
>> return gst_caps_fixate(fixated_caps);
>>
>> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>>
>> But I'm no expert here.
> Aha - I'm excited to see more gstreamer improvements here.
>
> I believe this was reported when trying to connect the v4l2h264enc
> testing on RPi.
I've asked Rishi to test the patch on RPi.
Rishikesh, do you have any update? As far as I can remember the
conversation was around:
https://bugs.libcamera.org/show_bug.cgi?id=75#c8
With this patch, one doesn't need to manually specify 'interlace-mode'
to make the pipeline work
>
> Perhaps it would be nice to have a before and after test case, but I'm
> not currently sure of the whole pipeline that caused issues with
> interlace-mode.
>
> This sounds and looks good though.
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
>>> +}
>>> +
>>> static void
>>> gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
>>> {
>>> GstElementClass *element_class = GST_ELEMENT_CLASS(klass);
>>> GObjectClass *object_class = G_OBJECT_CLASS(klass);
>>> + GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *)klass;
>>> +
>>> + gstbasesrc_class->fixate = gst_libcamera_src_src_fixate;
>>>
>>> object_class->set_property = gst_libcamera_src_set_property;
>>> object_class->get_property = gst_libcamera_src_get_property;
>> --
>> Regards,
>>
>> Laurent Pinchart
More information about the libcamera-devel
mailing list