[libcamera-devel] [PATCH] gstreamer: Provide interlace-mode as fixated caps
Umang Jain
umang.jain at ideasonboard.com
Thu Sep 1 14:50:11 CEST 2022
On 8/31/22 6:48 PM, Umang Jain via libcamera-devel wrote:
> 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
hmm, still failing in my testing, I will investigate but later...
>>
>> 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