From 0e7a485528617102d45893317f8366e689b96e10 Mon Sep 17 00:00:00 2001 From: Hou Qi Date: Mon, 9 Aug 2021 10:46:30 +0800 Subject: [PATCH] v4l2: Add protection when set decoder capture fps accroding to output fps Some v4l2 drivers don't have the capacity to change framerate. There is chance to make decoder capture fps to be 0/0 if numerator and denominator returned by G_PARM ioctl are both 0. It causes critical warning "passed '0' as denominator for `GstFraction'". In order to fix this, add protection when set decoder capture fps according to output fps. Part-of: --- sys/v4l2/gstv4l2object.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index db60cbc857..9851ffc83a 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -2229,8 +2229,9 @@ gst_v4l2_object_get_streamparm (GstV4l2Object * v4l2object, GstVideoInfo * info) GST_WARNING_OBJECT (v4l2object->dbg_obj, "VIDIOC_G_PARM failed"); return FALSE; } - if (v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE - || v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { + if ((streamparm.parm.capture.timeperframe.numerator != 0) + && (v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE + || v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)) { GST_VIDEO_INFO_FPS_N (info) = streamparm.parm.capture.timeperframe.denominator; GST_VIDEO_INFO_FPS_D (info) = @@ -4239,7 +4240,8 @@ gst_v4l2_object_acquire_format (GstV4l2Object * v4l2object, GstVideoInfo * info) gst_v4l2_object_get_colorspace (v4l2object, &fmt, &info->colorimetry); gst_v4l2_object_get_streamparm (v4l2object, info); - if ((info->fps_n == 0) && (v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE + if ((info->fps_n == 0 && v4l2object->info.fps_d != 0) + && (v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE || v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)) { info->fps_d = v4l2object->info.fps_d; info->fps_n = v4l2object->info.fps_n;