[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