diff --git a/src/drivers/v4l2/v4l2device.cpp b/src/drivers/v4l2/v4l2device.cpp index b9a83bc..c735e8f 100644 --- a/src/drivers/v4l2/v4l2device.cpp +++ b/src/drivers/v4l2/v4l2device.cpp @@ -93,13 +93,14 @@ void V4L2Device::__ioctl(uint64_t ctl, void* data, const QString& errorLabel) co //qDebug() << "IOCTL RUN: %1 with result %2"_q % d->ioctl_names.value(ctl, "%1"_q % ctl) % r; } -int V4L2Device::__xioctl(uint64_t ctl, void* data, const QString& errorLabel) const +int V4L2Device::__xioctl(uint64_t ctl, void* data, const QString &errorLabel, int ok_errno) const { try { this->ioctl(ctl, data, errorLabel); return 0; } catch(const V4L2Exception &e) { - qWarning() << e.what(); + if (errno != ok_errno) + qWarning() << e.what(); return -1; } } diff --git a/src/drivers/v4l2/v4l2device.h b/src/drivers/v4l2/v4l2device.h index deebe35..840dd23 100644 --- a/src/drivers/v4l2/v4l2device.h +++ b/src/drivers/v4l2/v4l2device.h @@ -33,11 +33,17 @@ class V4L2Device { inline operator bool() const; int descriptor() const; - template void ioctl(uint64_t ctl, T *data, const QString &errorLabel = {}) const { return __ioctl(ctl, reinterpret_cast(data), errorLabel); } - template int xioctl(uint64_t ctl, T *data, const QString &errorLabel = {}) const { return __xioctl(ctl, reinterpret_cast(data), errorLabel); } + template void ioctl(uint64_t ctl, T *data, const QString &errorLabel = {}) const { + return __ioctl(ctl, reinterpret_cast(data), errorLabel); + } + + template int xioctl(uint64_t ctl, T *data, const QString &errorLabel = {}, int ok_errno = 0) const { + return __xioctl(ctl, reinterpret_cast(data), errorLabel, ok_errno); + } + private: void __ioctl(uint64_t ctl, void *data, const QString &errorLabel) const; - int __xioctl(uint64_t ctl, void *data, const QString &errorLabel) const; + int __xioctl(uint64_t ctl, void *data, const QString &errorLabel, int ok_errno) const; DPTR }; diff --git a/src/drivers/v4l2/v4l2formats.cpp b/src/drivers/v4l2/v4l2formats.cpp index 2654ef0..d02b557 100644 --- a/src/drivers/v4l2/v4l2formats.cpp +++ b/src/drivers/v4l2/v4l2formats.cpp @@ -59,8 +59,9 @@ V4L2Formats::V4L2Formats(const V4L2DevicePtr& device) : dptr(device) v4l2_fmtdesc formats; formats.index = 0; formats.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - for(formats.index = 0; 0 ==device->xioctl(VIDIOC_ENUM_FMT, &formats); formats.index++) { + while (0 == device->xioctl(VIDIOC_ENUM_FMT, &formats, {}, EINVAL)) { d->formats.push_back(make_shared(formats, device)); + formats.index++; } for(auto format: d->formats) qDebug() << "Found format: " << *format; @@ -106,9 +107,11 @@ V4L2ResolutionPtr V4L2Formats::current_resolution() const V4L2Format::V4L2Format(const v4l2_fmtdesc &fmtdesc, const V4L2DevicePtr &device) : dptr(fmtdesc, device) { v4l2_frmsizeenum frmsize; + frmsize.index = 0; frmsize.pixel_format = fmtdesc.pixelformat; - for(frmsize.index = 0; device->xioctl(VIDIOC_ENUM_FRAMESIZES, &frmsize, "querying resolutions") >= 0; frmsize.index++) { + while (device->xioctl(VIDIOC_ENUM_FRAMESIZES, &frmsize, "querying resolutions", EINVAL) >= 0) { d->resolutions.push_back(make_shared(frmsize, device, *this)); + frmsize.index++; } } diff --git a/src/drivers/v4l2/v4l2imagingworker.cpp b/src/drivers/v4l2/v4l2imagingworker.cpp index cbdc0f1..bcf8d15 100644 --- a/src/drivers/v4l2/v4l2imagingworker.cpp +++ b/src/drivers/v4l2/v4l2imagingworker.cpp @@ -102,9 +102,10 @@ void V4L2ImagingWorker::Private::adjust_framerate() fps_s.height = format.fmt.pix.height; fps_s.pixel_format = format.fmt.pix.pixelformat; qDebug() << "scanning for fps with pixel format " << FOURCC2QS(fps_s.pixel_format); - for(fps_s.index = 0; device->xioctl(VIDIOC_ENUM_FRAMEINTERVALS, &fps_s) >= 0; fps_s.index++) { + while (device->xioctl(VIDIOC_ENUM_FRAMEINTERVALS, &fps_s, {}, EINVAL) >= 0) { qDebug() << "found fps: " << fps_s; rates.push_back(fps_s); + fps_s.index++; } auto ratio = [=](const v4l2_frmivalenum &a) { return static_cast(a.discrete.numerator)/static_cast(a.discrete.denominator); }; sort(begin(rates), end(rates), [&](const v4l2_frmivalenum &a, const v4l2_frmivalenum &b){ return ratio(a) < ratio(b);} );