[libcamera-devel] [PATCH 3/3] gst: utils: Add framerate to caps
Marian Cichy
mci at pengutronix.de
Mon Mar 22 20:37:40 CET 2021
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.
>
>> + 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?
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