summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-09-06 22:09:45 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-09-22 10:58:37 +0300
commitf3671b33d90cf2bb13ee59ac83822a3294689b22 (patch)
tree7ea7bdbfea3c01d79e315dcbf6a305a8acb21aef
parentd165f7da34b83753ef70b094d6b49608c24e8f56 (diff)
qcam: viewfinder: Pass stride value to viewfinder
qcam currently assumes that no padding is used at end of lines, and uses the image width as the stride. This leads to rendering failures with some formats on some platforms. To prepare for stride support, add a stride parameter to the ViewFinder::setFormat() function to pass the stride from the stream configuration to the viewfinder. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
-rw-r--r--src/qcam/main_window.cpp3
-rw-r--r--src/qcam/viewfinder.h3
-rw-r--r--src/qcam/viewfinder_gl.cpp7
-rw-r--r--src/qcam/viewfinder_gl.h3
-rw-r--r--src/qcam/viewfinder_qt.cpp3
-rw-r--r--src/qcam/viewfinder_qt.h3
6 files changed, 12 insertions, 10 deletions
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index b933ab21..ae51fa67 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -448,7 +448,8 @@ int MainWindow::startCapture()
/* Configure the viewfinder. */
ret = viewfinder_->setFormat(vfConfig.pixelFormat,
- QSize(vfConfig.size.width, vfConfig.size.height));
+ QSize(vfConfig.size.width, vfConfig.size.height),
+ vfConfig.stride);
if (ret < 0) {
qInfo() << "Failed to set viewfinder format";
return ret;
diff --git a/src/qcam/viewfinder.h b/src/qcam/viewfinder.h
index fb462835..4c2102a6 100644
--- a/src/qcam/viewfinder.h
+++ b/src/qcam/viewfinder.h
@@ -23,7 +23,8 @@ public:
virtual const QList<libcamera::PixelFormat> &nativeFormats() const = 0;
- virtual int setFormat(const libcamera::PixelFormat &format, const QSize &size) = 0;
+ virtual int setFormat(const libcamera::PixelFormat &format, const QSize &size,
+ unsigned int stride) = 0;
virtual void render(libcamera::FrameBuffer *buffer, Image *image) = 0;
virtual void stop() = 0;
diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
index 32232faa..aeb1ea02 100644
--- a/src/qcam/viewfinder_gl.cpp
+++ b/src/qcam/viewfinder_gl.cpp
@@ -72,7 +72,7 @@ const QList<libcamera::PixelFormat> &ViewFinderGL::nativeFormats() const
}
int ViewFinderGL::setFormat(const libcamera::PixelFormat &format,
- const QSize &size)
+ const QSize &size, unsigned int stride)
{
if (format != format_) {
/*
@@ -92,6 +92,7 @@ int ViewFinderGL::setFormat(const libcamera::PixelFormat &format,
}
size_ = size;
+ stride_ = stride;
updateGeometry();
return 0;
@@ -119,10 +120,6 @@ void ViewFinderGL::render(libcamera::FrameBuffer *buffer, Image *image)
renderComplete(buffer_);
image_ = image;
- /*
- * \todo Get the stride from the buffer instead of computing it naively
- */
- stride_ = buffer->metadata().planes()[0].bytesused / size_.height();
update();
buffer_ = buffer;
}
diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h
index 72a60ecb..2b2b1e86 100644
--- a/src/qcam/viewfinder_gl.h
+++ b/src/qcam/viewfinder_gl.h
@@ -38,7 +38,8 @@ public:
const QList<libcamera::PixelFormat> &nativeFormats() const override;
- int setFormat(const libcamera::PixelFormat &format, const QSize &size) override;
+ int setFormat(const libcamera::PixelFormat &format, const QSize &size,
+ unsigned int stride) override;
void render(libcamera::FrameBuffer *buffer, Image *image) override;
void stop() override;
diff --git a/src/qcam/viewfinder_qt.cpp b/src/qcam/viewfinder_qt.cpp
index 0d357d86..cd051760 100644
--- a/src/qcam/viewfinder_qt.cpp
+++ b/src/qcam/viewfinder_qt.cpp
@@ -52,7 +52,8 @@ const QList<libcamera::PixelFormat> &ViewFinderQt::nativeFormats() const
}
int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,
- const QSize &size)
+ const QSize &size,
+ [[maybe_unused]] unsigned int stride)
{
image_ = QImage();
diff --git a/src/qcam/viewfinder_qt.h b/src/qcam/viewfinder_qt.h
index 6b48ef48..756f3fa3 100644
--- a/src/qcam/viewfinder_qt.h
+++ b/src/qcam/viewfinder_qt.h
@@ -31,7 +31,8 @@ public:
const QList<libcamera::PixelFormat> &nativeFormats() const override;
- int setFormat(const libcamera::PixelFormat &format, const QSize &size) override;
+ int setFormat(const libcamera::PixelFormat &format, const QSize &size,
+ unsigned int stride) override;
void render(libcamera::FrameBuffer *buffer, Image *image) override;
void stop() override;