@@ -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;
@@ -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;
@@ -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;
}
@@ -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;
@@ -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();
@@ -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;
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> --- src/qcam/main_window.cpp | 3 ++- src/qcam/viewfinder.h | 3 ++- src/qcam/viewfinder_gl.cpp | 7 ++----- src/qcam/viewfinder_gl.h | 3 ++- src/qcam/viewfinder_qt.cpp | 3 ++- src/qcam/viewfinder_qt.h | 3 ++- 6 files changed, 12 insertions(+), 10 deletions(-)