[libcamera-devel] [PATCH] gstreamer: Do not lookup controls by id

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sat Nov 19 01:26:04 CET 2022


Hello,

On Fri, Nov 18, 2022 at 11:59:01PM +0530, Umang Jain wrote:
> On 11/18/22 9:51 PM, Jacopo Mondi via libcamera-devel wrote:
> > The libcamerasrc element looks for the availability of the
> > FrameDurationLimits control by looking it up by numeric control id.
> >
> > The ControlinfoMap::find(unsigned int i) function searches the control
> > numerical identifier on the ContorlInfoMap::idMap_ class member, which
> > might be not initialized if the pipeline handler does not register
> > any control, causing an invalid memory access.
> >
> > Avoid looking up the control by numerical id and use the ControlId
> > instance instead to prevent that.
> 
> Nice spot.
> 
> I wonder if it's specific to ISI Pipeline-handler (probably yes) that 
> you hit this non-initialization situation.

It's because the ISI pipeline handler doesn't expose any control. That's
not supposed to be a common situation, and will likely be fixed, but
it's still better to use find(Control *) than find(int).

> > Fixes: ccfe0a1af77c ("gstreamer: Provide framerate support for libcamerasrc")
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> 
> Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> > ---
> >   src/gstreamer/gstlibcamera-utils.cpp | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
> > index 64d197010008..36b9564c4cb4 100644
> > --- a/src/gstreamer/gstlibcamera-utils.cpp
> > +++ b/src/gstreamer/gstlibcamera-utils.cpp
> > @@ -436,7 +436,7 @@ void gst_libcamera_clamp_and_set_frameduration(ControlList &initCtrls,
> >   	if (!gst_structure_has_field_typed(element_caps, "framerate", GST_TYPE_FRACTION))
> >   		return;
> >
> > -	auto iterFrameDuration = cam_ctrls.find(controls::FrameDurationLimits.id());
> > +	auto iterFrameDuration = cam_ctrls.find(&controls::FrameDurationLimits);
> >   	if (iterFrameDuration == cam_ctrls.end()) {
> >   		GST_WARNING("FrameDurationLimits not found in camera controls.");
> >   		return;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list