[v5,2/3] virtual: Use stride helper for final buffer copy
diff mbox series

Message ID 20261019224902.177382-3-robert.mader@collabora.com
State New
Headers show
Series
  • virtual: Support more common pixel formats
Related show

Commit Message

Robert Mader Oct. 19, 2026, 10:49 p.m. UTC
In preparation of supporting more output formats, compute the stride
based on the used format instead of hardcoding it.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
---
 src/libcamera/pipeline/virtual/image_frame_generator.cpp | 7 +++++--
 .../pipeline/virtual/test_pattern_generator.cpp          | 9 +++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)

Comments

Laurent Pinchart Oct. 19, 2026, 11:03 p.m. UTC | #1
On Tue, Oct 20, 2026 at 12:49:01AM +0200, Robert Mader wrote:
> In preparation of supporting more output formats, compute the stride
> based on the used format instead of hardcoding it.
> 
> Signed-off-by: Robert Mader <robert.mader@collabora.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  src/libcamera/pipeline/virtual/image_frame_generator.cpp | 7 +++++--
>  .../pipeline/virtual/test_pattern_generator.cpp          | 9 +++++++--
>  2 files changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/virtual/image_frame_generator.cpp b/src/libcamera/pipeline/virtual/image_frame_generator.cpp
> index 1853bddeca27..5caad8b72763 100644
> --- a/src/libcamera/pipeline/virtual/image_frame_generator.cpp
> +++ b/src/libcamera/pipeline/virtual/image_frame_generator.cpp
> @@ -12,9 +12,11 @@
>  #include <libcamera/base/file.h>
>  #include <libcamera/base/log.h>
>  
> +#include <libcamera/formats.h>
>  #include <libcamera/framebuffer.h>
>  
>  #include "libcamera/internal/dma_buf_allocator.h"
> +#include "libcamera/internal/formats.h"
>  #include "libcamera/internal/mapped_framebuffer.h"
>  
>  #include "libyuv/convert.h"
> @@ -141,6 +143,7 @@ int ImageFrameGenerator::generateFrame(const Size &size, const FrameBuffer *buff
>  					    MappedFrameBuffer::MapFlag::Write);
>  
>  	const auto &planes = mappedFrameBuffer.planes();
> +	const PixelFormatInfo &info = PixelFormatInfo::info(formats::NV12);
>  
>  	/* Loop only around the number of images available */
>  	frameIndex_ %= imageFrameDatas_.size();
> @@ -148,8 +151,8 @@ int ImageFrameGenerator::generateFrame(const Size &size, const FrameBuffer *buff
>  	/* Write the scaledY and scaledUV to the mapped frame buffer */
>  	libyuv::NV12Copy(scaledFrameDatas_[frameIndex_].Y.get(), size.width,
>  			 scaledFrameDatas_[frameIndex_].UV.get(), size.width,
> -			 planes[0].data(), size.width,
> -			 planes[1].data(), size.width,
> +			 planes[0].data(), info.stride(size.width, 0),
> +			 planes[1].data(), info.stride(size.width, 1),
>  			 size.width, size.height);
>  
>  	/* Proceed to the next image every 4 frames */
> diff --git a/src/libcamera/pipeline/virtual/test_pattern_generator.cpp b/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
> index 7b53e8b32327..571be4fbf65d 100644
> --- a/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
> +++ b/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
> @@ -11,7 +11,9 @@
>  
>  #include <libcamera/base/log.h>
>  
> +#include <libcamera/formats.h>
>  #include "libcamera/internal/dma_buf_allocator.h"
> +#include "libcamera/internal/formats.h"
>  #include "libcamera/internal/mapped_framebuffer.h"
>  
>  #include <libyuv/convert_from_argb.h>
> @@ -58,13 +60,16 @@ int TestPatternGenerator::generateFrame(const Size &size,
>  					    MappedFrameBuffer::MapFlag::Write);
>  
>  	const auto &planes = mappedFrameBuffer.planes();
> +	const PixelFormatInfo &info = PixelFormatInfo::info(formats::NV12);
>  
>  	rotateLeft1Column<kARGBSize>(size, template_.get());
>  
>  	/* Convert the template_ to the frame buffer */
>  	int ret = libyuv::ARGBToNV12(template_.get(), size.width * kARGBSize,
> -				     planes[0].data(), size.width,
> -				     planes[1].data(), size.width,
> +				     planes[0].data(),
> +				     info.stride(size.width, 0),
> +				     planes[1].data(),
> +				     info.stride(size.width, 1),
>  				     size.width, size.height);
>  	if (ret != 0)
>  		LOG(Virtual, Error) << "ARGBToNV12() failed with " << ret;

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/virtual/image_frame_generator.cpp b/src/libcamera/pipeline/virtual/image_frame_generator.cpp
index 1853bddeca27..5caad8b72763 100644
--- a/src/libcamera/pipeline/virtual/image_frame_generator.cpp
+++ b/src/libcamera/pipeline/virtual/image_frame_generator.cpp
@@ -12,9 +12,11 @@ 
 #include <libcamera/base/file.h>
 #include <libcamera/base/log.h>
 
+#include <libcamera/formats.h>
 #include <libcamera/framebuffer.h>
 
 #include "libcamera/internal/dma_buf_allocator.h"
+#include "libcamera/internal/formats.h"
 #include "libcamera/internal/mapped_framebuffer.h"
 
 #include "libyuv/convert.h"
@@ -141,6 +143,7 @@  int ImageFrameGenerator::generateFrame(const Size &size, const FrameBuffer *buff
 					    MappedFrameBuffer::MapFlag::Write);
 
 	const auto &planes = mappedFrameBuffer.planes();
+	const PixelFormatInfo &info = PixelFormatInfo::info(formats::NV12);
 
 	/* Loop only around the number of images available */
 	frameIndex_ %= imageFrameDatas_.size();
@@ -148,8 +151,8 @@  int ImageFrameGenerator::generateFrame(const Size &size, const FrameBuffer *buff
 	/* Write the scaledY and scaledUV to the mapped frame buffer */
 	libyuv::NV12Copy(scaledFrameDatas_[frameIndex_].Y.get(), size.width,
 			 scaledFrameDatas_[frameIndex_].UV.get(), size.width,
-			 planes[0].data(), size.width,
-			 planes[1].data(), size.width,
+			 planes[0].data(), info.stride(size.width, 0),
+			 planes[1].data(), info.stride(size.width, 1),
 			 size.width, size.height);
 
 	/* Proceed to the next image every 4 frames */
diff --git a/src/libcamera/pipeline/virtual/test_pattern_generator.cpp b/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
index 7b53e8b32327..571be4fbf65d 100644
--- a/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
+++ b/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
@@ -11,7 +11,9 @@ 
 
 #include <libcamera/base/log.h>
 
+#include <libcamera/formats.h>
 #include "libcamera/internal/dma_buf_allocator.h"
+#include "libcamera/internal/formats.h"
 #include "libcamera/internal/mapped_framebuffer.h"
 
 #include <libyuv/convert_from_argb.h>
@@ -58,13 +60,16 @@  int TestPatternGenerator::generateFrame(const Size &size,
 					    MappedFrameBuffer::MapFlag::Write);
 
 	const auto &planes = mappedFrameBuffer.planes();
+	const PixelFormatInfo &info = PixelFormatInfo::info(formats::NV12);
 
 	rotateLeft1Column<kARGBSize>(size, template_.get());
 
 	/* Convert the template_ to the frame buffer */
 	int ret = libyuv::ARGBToNV12(template_.get(), size.width * kARGBSize,
-				     planes[0].data(), size.width,
-				     planes[1].data(), size.width,
+				     planes[0].data(),
+				     info.stride(size.width, 0),
+				     planes[1].data(),
+				     info.stride(size.width, 1),
 				     size.width, size.height);
 	if (ret != 0)
 		LOG(Virtual, Error) << "ARGBToNV12() failed with " << ret;