diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp index da317e27..ac47b8bd 100644 --- a/src/cam/drm.cpp +++ b/src/cam/drm.cpp @@ -595,12 +595,12 @@ const Object *Device::object(uint32_t id) std::unique_ptr Device::createFrameBuffer( const libcamera::FrameBuffer &buffer, const libcamera::PixelFormat &format, - const libcamera::Size &size, unsigned int stride) + const libcamera::Size &size, + const std::array &strides) { std::unique_ptr fb{ new FrameBuffer(this) }; uint32_t handles[4] = {}; - uint32_t pitches[4] = {}; uint32_t offsets[4] = {}; int ret; @@ -623,13 +623,12 @@ std::unique_ptr Device::createFrameBuffer( fb->planes_.push_back({ handle }); handles[i] = handle; - pitches[i] = stride; offsets[i] = 0; /* TODO */ ++i; } ret = drmModeAddFB2(fd_, size.width, size.height, format.fourcc(), handles, - pitches, offsets, &fb->id_, 0); + strides.data(), offsets, &fb->id_, 0); if (ret < 0) { ret = -errno; std::cerr diff --git a/src/cam/drm.h b/src/cam/drm.h index ee230402..00f7e798 100644 --- a/src/cam/drm.h +++ b/src/cam/drm.h @@ -7,9 +7,11 @@ #ifndef __CAM_DRM_H__ #define __CAM_DRM_H__ +#include #include #include #include +#include #include #include @@ -298,7 +300,8 @@ public: std::unique_ptr createFrameBuffer( const libcamera::FrameBuffer &buffer, const libcamera::PixelFormat &format, - const libcamera::Size &size, unsigned int stride); + const libcamera::Size &size, + const std::array &strides); libcamera::Signal requestComplete; diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp index 8c0b79c6..658192ef 100644 --- a/src/cam/kms_sink.cpp +++ b/src/cam/kms_sink.cpp @@ -7,10 +7,12 @@ #include "kms_sink.h" +#include #include #include #include #include +#include #include #include @@ -65,8 +67,32 @@ KMSSink::KMSSink(const std::string &connectorName) void KMSSink::mapBuffer(libcamera::FrameBuffer *buffer) { + std::array strides = {}; + + /* \todo Should libcamera report per-plane strides ? */ + unsigned int uvStrideMultiplier; + + switch (format_) { + case libcamera::formats::NV24: + case libcamera::formats::NV42: + uvStrideMultiplier = 4; + break; + case libcamera::formats::YUV420: + case libcamera::formats::YVU420: + case libcamera::formats::YUV422: + uvStrideMultiplier = 1; + break; + default: + uvStrideMultiplier = 2; + break; + } + + strides[0] = stride_; + for (unsigned int i = 1; i < buffer->planes().size(); ++i) + strides[i] = stride_ * uvStrideMultiplier / 2; + std::unique_ptr drmBuffer = - dev_.createFrameBuffer(*buffer, format_, size_, stride_); + dev_.createFrameBuffer(*buffer, format_, size_, strides); if (!drmBuffer) return;