diff options
author | Samuli Piippo <samuli.piippo@qt.io> | 2022-12-23 07:50:09 +0000 |
---|---|---|
committer | Samuli Piippo <samuli.piippo@qt.io> | 2023-01-04 11:42:55 +0000 |
commit | e98cfba8b1ef3d1c0fa4fccc2f2e12379e16db7b (patch) | |
tree | 05b998f729da6fe11b58ba0a907f32c558253bfe | |
parent | a4068b36a7284458a41af6c927b1a17f2e076798 (diff) |
ffmpeg: avoid infinite loop with non-discreate framesizes
The v4l2 camera checkup can properly handly only discrete types.
In case ioctl reports anything else, make sure we increase the index
to avoid getting stuck on infinite loop.
Fixes: QTBUG-109535
Change-Id: I7e669b8167361875b75d4eece5c0c9a92a76c331
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
(cherry picked from commit 8897d36de57db3ce9d75fbd87bcec96bbbd4d69f)
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qv4l2camera.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qv4l2camera.cpp b/src/plugins/multimedia/ffmpeg/qv4l2camera.cpp index e00641419..17516bad6 100644 --- a/src/plugins/multimedia/ffmpeg/qv4l2camera.cpp +++ b/src/plugins/multimedia/ffmpeg/qv4l2camera.cpp @@ -146,6 +146,7 @@ void QV4L2CameraDevices::doCheckCameras() frameSize.pixel_format = formatDesc.pixelformat; while (!ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frameSize)) { + ++frameSize.index; if (frameSize.type != V4L2_FRMSIZE_TYPE_DISCRETE) continue; @@ -159,9 +160,9 @@ void QV4L2CameraDevices::doCheckCameras() frameInterval.height = frameSize.discrete.height; while (!ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &frameInterval)) { + ++frameInterval.index; if (frameInterval.type != V4L2_FRMIVAL_TYPE_DISCRETE) continue; - ++frameInterval.index; float rate = float(frameInterval.discrete.denominator)/float(frameInterval.discrete.numerator); if (rate > max) max = rate; @@ -170,7 +171,6 @@ void QV4L2CameraDevices::doCheckCameras() } // qDebug() << " " << resolution << min << max; - ++frameSize.index; if (min <= max) { QCameraFormatPrivate *fmt = new QCameraFormatPrivate; |