[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