[libcamera-devel] [PATCH v3 09/22] v4l2: v4l2_camera_proxy: Get stride and frameSize from stream config
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Jul 4 20:57:39 CEST 2020
Hi Paul,
Thank you for the patch.
On Sat, Jul 04, 2020 at 10:31:27PM +0900, Paul Elder wrote:
> The stride and frameSize should be obtained through StreamConfiguration
> rather than PixelFormatInfo, as pipeline handlers might have different
> values (eg. for alignment). Get the stride and frameSize values from
> StreamConfiguration instead of from PixelFormatInfo.
>
> This also removes the need for V4L2CameraProxy::calculateSizeImage, so
> remove it.
>
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> New in v3
> ---
> src/v4l2/v4l2_camera_proxy.cpp | 42 ++++------------------------------
> src/v4l2/v4l2_camera_proxy.h | 1 -
> 2 files changed, 5 insertions(+), 38 deletions(-)
>
> diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
> index 6a31415..9121d3d 100644
> --- a/src/v4l2/v4l2_camera_proxy.cpp
> +++ b/src/v4l2/v4l2_camera_proxy.cpp
> @@ -71,7 +71,6 @@ int V4L2CameraProxy::open(V4L2CameraFile *file)
>
> vcam_->getStreamConfig(&streamConfig_);
> setFmtFromConfig(streamConfig_);
> - sizeimage_ = calculateSizeImage(streamConfig_);
>
> files_.insert(file);
>
> @@ -166,30 +165,20 @@ bool V4L2CameraProxy::validateMemoryType(uint32_t memory)
> void V4L2CameraProxy::setFmtFromConfig(StreamConfiguration &streamConfig)
> {
> const PixelFormatInfo &info = PixelFormatInfo::info(streamConfig.pixelFormat);
> - Size size = streamConfig.size;
>
> - curV4L2Format_.fmt.pix.width = size.width;
> - curV4L2Format_.fmt.pix.height = size.height;
> + curV4L2Format_.fmt.pix.width = streamConfig.size.width;
> + curV4L2Format_.fmt.pix.height = streamConfig.size.height;
> curV4L2Format_.fmt.pix.pixelformat = info.v4l2Format;
> curV4L2Format_.fmt.pix.field = V4L2_FIELD_NONE;
> - curV4L2Format_.fmt.pix.bytesperline = info.stride(size.width, 0);
> - curV4L2Format_.fmt.pix.sizeimage = info.frameSize(size);
> + curV4L2Format_.fmt.pix.bytesperline = streamConfig.stride;
> + curV4L2Format_.fmt.pix.sizeimage = streamConfig.frameSize;
> curV4L2Format_.fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
> curV4L2Format_.fmt.pix.priv = V4L2_PIX_FMT_PRIV_MAGIC;
> curV4L2Format_.fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
> curV4L2Format_.fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT;
> curV4L2Format_.fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT;
> -}
> -
> -unsigned int V4L2CameraProxy::calculateSizeImage(StreamConfiguration &streamConfig)
> -{
> - /*
> - * \todo Merge this method with setFmtFromConfig (need imageSize to
> - * support all libcamera formats first, or filter out MJPEG for now).
> - */
> - const PixelFormatInfo &info = PixelFormatInfo::info(streamConfig.pixelFormat);
>
> - return info.frameSize(streamConfig.size);
> + sizeimage_ = streamConfig.frameSize;
> }
>
> void V4L2CameraProxy::querycap(std::shared_ptr<Camera> camera)
> @@ -359,12 +348,6 @@ int V4L2CameraProxy::vidioc_s_fmt(V4L2CameraFile *file, struct v4l2_format *arg)
> if (ret < 0)
> return -EINVAL;
>
> - unsigned int sizeimage = calculateSizeImage(streamConfig_);
> - if (sizeimage == 0)
> - return -EINVAL;
> -
> - sizeimage_ = sizeimage;
> -
> setFmtFromConfig(streamConfig_);
>
> return 0;
> @@ -505,21 +488,6 @@ int V4L2CameraProxy::vidioc_reqbufs(V4L2CameraFile *file, struct v4l2_requestbuf
> if (ret < 0)
> return -EINVAL;
>
> - sizeimage_ = calculateSizeImage(streamConfig_);
> - /*
> - * If we return -EINVAL here then the application will think that we
> - * don't support streaming mmap. Since we don't support readwrite and
> - * userptr either, the application will get confused and think that
> - * we don't support anything.
> - * On the other hand, if the set format at the time of reqbufs has a
> - * zero sizeimage we'll get a floating point exception when we try to
> - * stream it.
> - */
> - if (sizeimage_ == 0)
> - LOG(V4L2Compat, Warning)
> - << "sizeimage of at least one format is zero. "
> - << "Streaming this format will cause a floating point exception.";
> -
> setFmtFromConfig(streamConfig_);
>
> arg->count = streamConfig_.bufferCount;
> diff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h
> index 49184a1..e962694 100644
> --- a/src/v4l2/v4l2_camera_proxy.h
> +++ b/src/v4l2/v4l2_camera_proxy.h
> @@ -40,7 +40,6 @@ private:
> bool validateBufferType(uint32_t type);
> bool validateMemoryType(uint32_t memory);
> void setFmtFromConfig(StreamConfiguration &streamConfig);
> - unsigned int calculateSizeImage(StreamConfiguration &streamConfig);
> void querycap(std::shared_ptr<Camera> camera);
> void tryFormat(struct v4l2_format *arg);
> enum v4l2_priority maxPriority();
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list