[libcamera-devel] [PATCH 3/3] gst: utils: Add framerate to caps

Nicolas Dufresne nicolas at ndufresne.ca
Mon Mar 22 21:11:39 CET 2021


Le lundi 22 mars 2021 à 20:37 +0100, Marian Cichy a écrit :
> On 3/22/21 8:31 PM, Nicolas Dufresne wrote:
> > Le lundi 22 mars 2021 à 11:42 +0100, Marian Cichy a écrit :
> > > Access the frame duration from the controlList of the stream
> > > configuration and convert it to values fitting for GST_FRACTION. By
> > > setting the frame rate to the caps configuration, the Gstreamer pipeline
> > > has information about the camera frame rate, which can be potentially
> > > used for more efficient memory allocation or for debug purposes.
> > > 
> > > Signed-off-by: Marian Cichy <m.cichy at pengutronix.de>
> > > ---
> > >   src/gstreamer/gstlibcamera-utils.cpp | 7 +++++++
> > >   1 file changed, 7 insertions(+)
> > > 
> > > diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
> > > index 5381dca5..fdd8b85c 100644
> > > --- a/src/gstreamer/gstlibcamera-utils.cpp
> > > +++ b/src/gstreamer/gstlibcamera-utils.cpp
> > > @@ -8,6 +8,7 @@
> > >   
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > >   #include "gstlibcamera-utils.h"
> > >   
> > > 
> > > 
> > > 
> > > +#include <libcamera/control_ids.h>
> > >   #include <libcamera/formats.h>
> > >   
> > > 
> > > 
> > > 
> > >   using namespace libcamera;
> > > @@ -128,10 +129,16 @@ gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg
> > >   {
> > >   	GstCaps *caps = gst_caps_new_empty();
> > >   	GstStructure *s = bare_structure_from_format(stream_cfg.pixelFormat);
> > > +	int numerator;
> > > +	int denominator;
> > > +	double framerate = 1'000'000 / static_cast<double>(stream_cfg.controls.get(
> > > +				controls::FrameDurations)[0]);
> > Perhaps that would be defensive, but I'm worried duration might be 0, which
> > would crash here.
> 
> 
> Noted
> 
> 
> > 
> > Can you explain the array of duration, and why we know that the first item exist
> > (to we don't overrun the array) and will be the selected one ?
> 
> 
> By definition of the auto-generated controls, FrameDurations is a 
> uint64_t[2] where [0] is the minFrameDuration and [1] the 
> maxFrameDuration. I don't think this control can be generated in any 
> other way, as libcamera auto-generates these controls.

Thanks, I'm not familiar with how libcamera controls have been implemented. This
looks a bit strange considering that there is ranges type for width and height
somewhere else, but now that I know it's a range, it helps.

The minimum framerate will trigger the highest latency, so that is definitely
the best value to expose in GStreamer.

> 
> 
> > 
> > >   +	gst_util_double_to_fraction(framerate, &numerator, &denominator);
> > >   	gst_structure_set(s,
> > >   			  "width", G_TYPE_INT, stream_cfg.size.width,
> > >   			  "height", G_TYPE_INT, stream_cfg.size.height,
> > > +			  "framerate", GST_TYPE_FRACTION, numerator, denominator,
> > If duration is 0, this should be skipped, or set to 0/1 (which means variable
> > framerate in GStreamer).
> 
> 
> Skipping seems fine, as Gstreamer seems to default to 0/1, right?

Indeed, both ways do, I think I would set it to 0/1 as it's more explicit that
we don't know and what to expect. Users can always force it with videorate
afterward.

> 
> 
> Marian
> 
> 
> > 
> > >   			  nullptr);
> > >   	gst_caps_append_structure(caps, s);
> > >   
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > 
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel at lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel




More information about the libcamera-devel mailing list