Message ID | 20200708134417.67747-5-paul.elder@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Paul, Thank you for the patch. On Wed, Jul 08, 2020 at 10:44:00PM +0900, Paul Elder wrote: > Add tryFormat and its variations (meta, single-plane, multi-plane) to > V4L2VideoDevice. > > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > --- > Changes in v4: > - merge tryFormat{Meta,Multiplane,SinglePlane} into setFormat with a > flag > > New in v3 > --- > include/libcamera/internal/v4l2_videodevice.h | 7 +-- > src/libcamera/v4l2_videodevice.cpp | 50 ++++++++++++++----- > 2 files changed, 42 insertions(+), 15 deletions(-) > > diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h > index 4d21f5a..fb4c0aa 100644 > --- a/include/libcamera/internal/v4l2_videodevice.h > +++ b/include/libcamera/internal/v4l2_videodevice.h > @@ -186,6 +186,7 @@ public: > const V4L2Capability &caps() const { return caps_; } > > int getFormat(V4L2DeviceFormat *format); > + int tryFormat(V4L2DeviceFormat *format); > int setFormat(V4L2DeviceFormat *format); > std::map<V4L2PixelFormat, std::vector<SizeRange>> formats(uint32_t code = 0); > > @@ -217,13 +218,13 @@ protected: > > private: > int getFormatMeta(V4L2DeviceFormat *format); > - int setFormatMeta(V4L2DeviceFormat *format); > + int trySetFormatMeta(V4L2DeviceFormat *format, bool set); > > int getFormatMultiplane(V4L2DeviceFormat *format); > - int setFormatMultiplane(V4L2DeviceFormat *format); > + int trySetFormatMultiplane(V4L2DeviceFormat *format, bool set); > > int getFormatSingleplane(V4L2DeviceFormat *format); > - int setFormatSingleplane(V4L2DeviceFormat *format); > + int trySetFormatSingleplane(V4L2DeviceFormat *format, bool set); > > std::vector<V4L2PixelFormat> enumPixelformats(uint32_t code); > std::vector<SizeRange> enumSizes(V4L2PixelFormat pixelFormat); > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp > index 3614b2e..16c78b6 100644 > --- a/src/libcamera/v4l2_videodevice.cpp > +++ b/src/libcamera/v4l2_videodevice.cpp > @@ -723,6 +723,26 @@ int V4L2VideoDevice::getFormat(V4L2DeviceFormat *format) > return getFormatSingleplane(format); > } > > +/** > + * \brief Try an image format on the V4L2 video device > + * \param[inout] format The image format to test applicability to the video device > + * > + * Try the supplied \a format on the video device without applying it, returning > + * the format that would be applied. This is equivalent to setFormat(), except > + * that the device configuration is not changed. > + * > + * \return 0 on success or a negative error code otherwise > + */ > +int V4L2VideoDevice::tryFormat(V4L2DeviceFormat *format) > +{ > + if (caps_.isMeta()) > + return trySetFormatMeta(format, false); > + else if (caps_.isMultiplanar()) > + return trySetFormatMultiplane(format, false); > + else > + return trySetFormatSingleplane(format, false); > +} > + > /** > * \brief Configure an image format on the V4L2 video device > * \param[inout] format The image format to apply to the video device > @@ -735,11 +755,11 @@ int V4L2VideoDevice::getFormat(V4L2DeviceFormat *format) > int V4L2VideoDevice::setFormat(V4L2DeviceFormat *format) > { > if (caps_.isMeta()) > - return setFormatMeta(format); > + return trySetFormatMeta(format, true); > else if (caps_.isMultiplanar()) > - return setFormatMultiplane(format); > + return trySetFormatMultiplane(format, true); > else > - return setFormatSingleplane(format); > + return trySetFormatSingleplane(format, true); > } > > int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format) > @@ -765,7 +785,7 @@ int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format) > return 0; > } > > -int V4L2VideoDevice::setFormatMeta(V4L2DeviceFormat *format) > +int V4L2VideoDevice::trySetFormatMeta(V4L2DeviceFormat *format, bool set) > { > struct v4l2_format v4l2Format = {}; > struct v4l2_meta_format *pix = &v4l2Format.fmt.meta; > @@ -774,9 +794,11 @@ int V4L2VideoDevice::setFormatMeta(V4L2DeviceFormat *format) > v4l2Format.type = bufferType_; > pix->dataformat = format->fourcc; > pix->buffersize = format->planes[0].size; > - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); > + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); No need for the extra parentheses. Same in the next two functions. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > if (ret) { > - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); > + LOG(V4L2, Error) > + << "Unable to " << (set ? "set" : "try") > + << " format: " << strerror(-ret); > return ret; > } > > @@ -820,7 +842,7 @@ int V4L2VideoDevice::getFormatMultiplane(V4L2DeviceFormat *format) > return 0; > } > > -int V4L2VideoDevice::setFormatMultiplane(V4L2DeviceFormat *format) > +int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set) > { > struct v4l2_format v4l2Format = {}; > struct v4l2_pix_format_mplane *pix = &v4l2Format.fmt.pix_mp; > @@ -838,9 +860,11 @@ int V4L2VideoDevice::setFormatMultiplane(V4L2DeviceFormat *format) > pix->plane_fmt[i].sizeimage = format->planes[i].size; > } > > - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); > + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); > if (ret) { > - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); > + LOG(V4L2, Error) > + << "Unable to " << (set ? "set" : "try") > + << " format: " << strerror(-ret); > return ret; > } > > @@ -883,7 +907,7 @@ int V4L2VideoDevice::getFormatSingleplane(V4L2DeviceFormat *format) > return 0; > } > > -int V4L2VideoDevice::setFormatSingleplane(V4L2DeviceFormat *format) > +int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set) > { > struct v4l2_format v4l2Format = {}; > struct v4l2_pix_format *pix = &v4l2Format.fmt.pix; > @@ -895,9 +919,11 @@ int V4L2VideoDevice::setFormatSingleplane(V4L2DeviceFormat *format) > pix->pixelformat = format->fourcc; > pix->bytesperline = format->planes[0].bpl; > pix->field = V4L2_FIELD_NONE; > - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); > + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); > if (ret) { > - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); > + LOG(V4L2, Error) > + << "Unable to " << (set ? "set" : "try") > + << " format: " << strerror(-ret); > return ret; > } >
Hi Paul, On Wed, Jul 08, 2020 at 10:44:00PM +0900, Paul Elder wrote: > Add tryFormat and its variations (meta, single-plane, multi-plane) to > V4L2VideoDevice. > > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Thanks j > --- > Changes in v4: > - merge tryFormat{Meta,Multiplane,SinglePlane} into setFormat with a > flag > > New in v3 > --- > include/libcamera/internal/v4l2_videodevice.h | 7 +-- > src/libcamera/v4l2_videodevice.cpp | 50 ++++++++++++++----- > 2 files changed, 42 insertions(+), 15 deletions(-) > > diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h > index 4d21f5a..fb4c0aa 100644 > --- a/include/libcamera/internal/v4l2_videodevice.h > +++ b/include/libcamera/internal/v4l2_videodevice.h > @@ -186,6 +186,7 @@ public: > const V4L2Capability &caps() const { return caps_; } > > int getFormat(V4L2DeviceFormat *format); > + int tryFormat(V4L2DeviceFormat *format); > int setFormat(V4L2DeviceFormat *format); > std::map<V4L2PixelFormat, std::vector<SizeRange>> formats(uint32_t code = 0); > > @@ -217,13 +218,13 @@ protected: > > private: > int getFormatMeta(V4L2DeviceFormat *format); > - int setFormatMeta(V4L2DeviceFormat *format); > + int trySetFormatMeta(V4L2DeviceFormat *format, bool set); > > int getFormatMultiplane(V4L2DeviceFormat *format); > - int setFormatMultiplane(V4L2DeviceFormat *format); > + int trySetFormatMultiplane(V4L2DeviceFormat *format, bool set); > > int getFormatSingleplane(V4L2DeviceFormat *format); > - int setFormatSingleplane(V4L2DeviceFormat *format); > + int trySetFormatSingleplane(V4L2DeviceFormat *format, bool set); > > std::vector<V4L2PixelFormat> enumPixelformats(uint32_t code); > std::vector<SizeRange> enumSizes(V4L2PixelFormat pixelFormat); > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp > index 3614b2e..16c78b6 100644 > --- a/src/libcamera/v4l2_videodevice.cpp > +++ b/src/libcamera/v4l2_videodevice.cpp > @@ -723,6 +723,26 @@ int V4L2VideoDevice::getFormat(V4L2DeviceFormat *format) > return getFormatSingleplane(format); > } > > +/** > + * \brief Try an image format on the V4L2 video device > + * \param[inout] format The image format to test applicability to the video device > + * > + * Try the supplied \a format on the video device without applying it, returning > + * the format that would be applied. This is equivalent to setFormat(), except > + * that the device configuration is not changed. > + * > + * \return 0 on success or a negative error code otherwise > + */ > +int V4L2VideoDevice::tryFormat(V4L2DeviceFormat *format) > +{ > + if (caps_.isMeta()) > + return trySetFormatMeta(format, false); > + else if (caps_.isMultiplanar()) > + return trySetFormatMultiplane(format, false); > + else > + return trySetFormatSingleplane(format, false); > +} > + > /** > * \brief Configure an image format on the V4L2 video device > * \param[inout] format The image format to apply to the video device > @@ -735,11 +755,11 @@ int V4L2VideoDevice::getFormat(V4L2DeviceFormat *format) > int V4L2VideoDevice::setFormat(V4L2DeviceFormat *format) > { > if (caps_.isMeta()) > - return setFormatMeta(format); > + return trySetFormatMeta(format, true); > else if (caps_.isMultiplanar()) > - return setFormatMultiplane(format); > + return trySetFormatMultiplane(format, true); > else > - return setFormatSingleplane(format); > + return trySetFormatSingleplane(format, true); > } > > int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format) > @@ -765,7 +785,7 @@ int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format) > return 0; > } > > -int V4L2VideoDevice::setFormatMeta(V4L2DeviceFormat *format) > +int V4L2VideoDevice::trySetFormatMeta(V4L2DeviceFormat *format, bool set) > { > struct v4l2_format v4l2Format = {}; > struct v4l2_meta_format *pix = &v4l2Format.fmt.meta; > @@ -774,9 +794,11 @@ int V4L2VideoDevice::setFormatMeta(V4L2DeviceFormat *format) > v4l2Format.type = bufferType_; > pix->dataformat = format->fourcc; > pix->buffersize = format->planes[0].size; > - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); > + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); > if (ret) { > - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); > + LOG(V4L2, Error) > + << "Unable to " << (set ? "set" : "try") > + << " format: " << strerror(-ret); > return ret; > } > > @@ -820,7 +842,7 @@ int V4L2VideoDevice::getFormatMultiplane(V4L2DeviceFormat *format) > return 0; > } > > -int V4L2VideoDevice::setFormatMultiplane(V4L2DeviceFormat *format) > +int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set) > { > struct v4l2_format v4l2Format = {}; > struct v4l2_pix_format_mplane *pix = &v4l2Format.fmt.pix_mp; > @@ -838,9 +860,11 @@ int V4L2VideoDevice::setFormatMultiplane(V4L2DeviceFormat *format) > pix->plane_fmt[i].sizeimage = format->planes[i].size; > } > > - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); > + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); > if (ret) { > - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); > + LOG(V4L2, Error) > + << "Unable to " << (set ? "set" : "try") > + << " format: " << strerror(-ret); > return ret; > } > > @@ -883,7 +907,7 @@ int V4L2VideoDevice::getFormatSingleplane(V4L2DeviceFormat *format) > return 0; > } > > -int V4L2VideoDevice::setFormatSingleplane(V4L2DeviceFormat *format) > +int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set) > { > struct v4l2_format v4l2Format = {}; > struct v4l2_pix_format *pix = &v4l2Format.fmt.pix; > @@ -895,9 +919,11 @@ int V4L2VideoDevice::setFormatSingleplane(V4L2DeviceFormat *format) > pix->pixelformat = format->fourcc; > pix->bytesperline = format->planes[0].bpl; > pix->field = V4L2_FIELD_NONE; > - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); > + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); > if (ret) { > - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); > + LOG(V4L2, Error) > + << "Unable to " << (set ? "set" : "try") > + << " format: " << strerror(-ret); > return ret; > } > > -- > 2.27.0 > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h index 4d21f5a..fb4c0aa 100644 --- a/include/libcamera/internal/v4l2_videodevice.h +++ b/include/libcamera/internal/v4l2_videodevice.h @@ -186,6 +186,7 @@ public: const V4L2Capability &caps() const { return caps_; } int getFormat(V4L2DeviceFormat *format); + int tryFormat(V4L2DeviceFormat *format); int setFormat(V4L2DeviceFormat *format); std::map<V4L2PixelFormat, std::vector<SizeRange>> formats(uint32_t code = 0); @@ -217,13 +218,13 @@ protected: private: int getFormatMeta(V4L2DeviceFormat *format); - int setFormatMeta(V4L2DeviceFormat *format); + int trySetFormatMeta(V4L2DeviceFormat *format, bool set); int getFormatMultiplane(V4L2DeviceFormat *format); - int setFormatMultiplane(V4L2DeviceFormat *format); + int trySetFormatMultiplane(V4L2DeviceFormat *format, bool set); int getFormatSingleplane(V4L2DeviceFormat *format); - int setFormatSingleplane(V4L2DeviceFormat *format); + int trySetFormatSingleplane(V4L2DeviceFormat *format, bool set); std::vector<V4L2PixelFormat> enumPixelformats(uint32_t code); std::vector<SizeRange> enumSizes(V4L2PixelFormat pixelFormat); diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 3614b2e..16c78b6 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -723,6 +723,26 @@ int V4L2VideoDevice::getFormat(V4L2DeviceFormat *format) return getFormatSingleplane(format); } +/** + * \brief Try an image format on the V4L2 video device + * \param[inout] format The image format to test applicability to the video device + * + * Try the supplied \a format on the video device without applying it, returning + * the format that would be applied. This is equivalent to setFormat(), except + * that the device configuration is not changed. + * + * \return 0 on success or a negative error code otherwise + */ +int V4L2VideoDevice::tryFormat(V4L2DeviceFormat *format) +{ + if (caps_.isMeta()) + return trySetFormatMeta(format, false); + else if (caps_.isMultiplanar()) + return trySetFormatMultiplane(format, false); + else + return trySetFormatSingleplane(format, false); +} + /** * \brief Configure an image format on the V4L2 video device * \param[inout] format The image format to apply to the video device @@ -735,11 +755,11 @@ int V4L2VideoDevice::getFormat(V4L2DeviceFormat *format) int V4L2VideoDevice::setFormat(V4L2DeviceFormat *format) { if (caps_.isMeta()) - return setFormatMeta(format); + return trySetFormatMeta(format, true); else if (caps_.isMultiplanar()) - return setFormatMultiplane(format); + return trySetFormatMultiplane(format, true); else - return setFormatSingleplane(format); + return trySetFormatSingleplane(format, true); } int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format) @@ -765,7 +785,7 @@ int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format) return 0; } -int V4L2VideoDevice::setFormatMeta(V4L2DeviceFormat *format) +int V4L2VideoDevice::trySetFormatMeta(V4L2DeviceFormat *format, bool set) { struct v4l2_format v4l2Format = {}; struct v4l2_meta_format *pix = &v4l2Format.fmt.meta; @@ -774,9 +794,11 @@ int V4L2VideoDevice::setFormatMeta(V4L2DeviceFormat *format) v4l2Format.type = bufferType_; pix->dataformat = format->fourcc; pix->buffersize = format->planes[0].size; - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); if (ret) { - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); + LOG(V4L2, Error) + << "Unable to " << (set ? "set" : "try") + << " format: " << strerror(-ret); return ret; } @@ -820,7 +842,7 @@ int V4L2VideoDevice::getFormatMultiplane(V4L2DeviceFormat *format) return 0; } -int V4L2VideoDevice::setFormatMultiplane(V4L2DeviceFormat *format) +int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set) { struct v4l2_format v4l2Format = {}; struct v4l2_pix_format_mplane *pix = &v4l2Format.fmt.pix_mp; @@ -838,9 +860,11 @@ int V4L2VideoDevice::setFormatMultiplane(V4L2DeviceFormat *format) pix->plane_fmt[i].sizeimage = format->planes[i].size; } - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); if (ret) { - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); + LOG(V4L2, Error) + << "Unable to " << (set ? "set" : "try") + << " format: " << strerror(-ret); return ret; } @@ -883,7 +907,7 @@ int V4L2VideoDevice::getFormatSingleplane(V4L2DeviceFormat *format) return 0; } -int V4L2VideoDevice::setFormatSingleplane(V4L2DeviceFormat *format) +int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set) { struct v4l2_format v4l2Format = {}; struct v4l2_pix_format *pix = &v4l2Format.fmt.pix; @@ -895,9 +919,11 @@ int V4L2VideoDevice::setFormatSingleplane(V4L2DeviceFormat *format) pix->pixelformat = format->fourcc; pix->bytesperline = format->planes[0].bpl; pix->field = V4L2_FIELD_NONE; - ret = ioctl(VIDIOC_S_FMT, &v4l2Format); + ret = ioctl((set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT), &v4l2Format); if (ret) { - LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); + LOG(V4L2, Error) + << "Unable to " << (set ? "set" : "try") + << " format: " << strerror(-ret); return ret; }