[libcamera-devel] [PATCH 2/2] v4l2: camera_proxy: Break out try_fmt
Jacopo Mondi
jacopo at jmondi.org
Tue Jan 7 17:50:38 CET 2020
Calling vidioc_s_fmt() calls vidioc_try_fmt() duplicating prinouts.
Breakout try format procedure and call it from both functions.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/v4l2/v4l2_camera_proxy.cpp | 53 +++++++++++++++++++---------------
src/v4l2/v4l2_camera_proxy.h | 1 +
2 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
index dbcf333a761f..a56318cb4fa3 100644
--- a/src/v4l2/v4l2_camera_proxy.cpp
+++ b/src/v4l2/v4l2_camera_proxy.cpp
@@ -236,13 +236,38 @@ int V4L2CameraProxy::vidioc_g_fmt(struct v4l2_format *arg)
return 0;
}
+void V4L2CameraProxy::tryFmt(struct v4l2_format *arg)
+{
+ PixelFormat format = v4l2ToDrm(arg->fmt.pix.pixelformat);
+ const std::vector<PixelFormat> &formats =
+ streamConfig_.formats().pixelformats();
+ if (std::find(formats.begin(), formats.end(), format) == formats.end())
+ format = streamConfig_.formats().pixelformats()[0];
+
+ Size size(arg->fmt.pix.width, arg->fmt.pix.height);
+ const std::vector<Size> &sizes = streamConfig_.formats().sizes(format);
+ if (std::find(sizes.begin(), sizes.end(), size) == sizes.end())
+ size = streamConfig_.formats().sizes(format)[0];
+
+ arg->fmt.pix.width = size.width;
+ arg->fmt.pix.height = size.height;
+ arg->fmt.pix.pixelformat = drmToV4L2(format);
+ arg->fmt.pix.field = V4L2_FIELD_NONE;
+ arg->fmt.pix.bytesperline = bplMultiplier(drmToV4L2(format)) *
+ arg->fmt.pix.width;
+ arg->fmt.pix.sizeimage = imageSize(drmToV4L2(format),
+ arg->fmt.pix.width,
+ arg->fmt.pix.height);
+ arg->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
+}
+
int V4L2CameraProxy::vidioc_s_fmt(struct v4l2_format *arg)
{
LOG(V4L2Compat, Debug) << "Servicing vidioc_s_fmt";
+ if (!validateBufferType(arg->type))
+ return -EINVAL;
- int ret = vidioc_try_fmt(arg);
- if (ret < 0)
- return ret;
+ tryFmt(arg);
Size size(arg->fmt.pix.width, arg->fmt.pix.height);
vcam_->invokeMethod(&V4L2Camera::configure, ConnectionTypeBlocking,
@@ -268,27 +293,7 @@ int V4L2CameraProxy::vidioc_try_fmt(struct v4l2_format *arg)
if (!validateBufferType(arg->type))
return -EINVAL;
- PixelFormat format = v4l2ToDrm(arg->fmt.pix.pixelformat);
- const std::vector<PixelFormat> &formats =
- streamConfig_.formats().pixelformats();
- if (std::find(formats.begin(), formats.end(), format) == formats.end())
- format = streamConfig_.formats().pixelformats()[0];
-
- Size size(arg->fmt.pix.width, arg->fmt.pix.height);
- const std::vector<Size> &sizes = streamConfig_.formats().sizes(format);
- if (std::find(sizes.begin(), sizes.end(), size) == sizes.end())
- size = streamConfig_.formats().sizes(format)[0];
-
- arg->fmt.pix.width = size.width;
- arg->fmt.pix.height = size.height;
- arg->fmt.pix.pixelformat = drmToV4L2(format);
- arg->fmt.pix.field = V4L2_FIELD_NONE;
- arg->fmt.pix.bytesperline = bplMultiplier(drmToV4L2(format)) *
- arg->fmt.pix.width;
- arg->fmt.pix.sizeimage = imageSize(drmToV4L2(format),
- arg->fmt.pix.width,
- arg->fmt.pix.height);
- arg->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
+ tryFmt(arg);
return 0;
}
diff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h
index bef0f0afab3b..d34de925cf29 100644
--- a/src/v4l2/v4l2_camera_proxy.h
+++ b/src/v4l2/v4l2_camera_proxy.h
@@ -39,6 +39,7 @@ private:
void setFmtFromConfig(StreamConfiguration &streamConfig);
unsigned int calculateSizeImage(StreamConfiguration &streamConfig);
void querycap(std::shared_ptr<Camera> camera);
+ void tryFmt(struct v4l2_format *arg);
void updateBuffers();
int freeBuffers();
--
2.24.0
More information about the libcamera-devel
mailing list