[libcamera-devel] [PATCH v3] android: jpeg: Split and pass the thumbnail planes to encoder

paul.elder at ideasonboard.com paul.elder at ideasonboard.com
Fri Sep 10 02:49:47 CEST 2021


Hi Umang,

On Thu, Sep 09, 2021 at 09:18:57PM +0530, Umang Jain wrote:
> After multi-planar support was introduced for jpeg encoding as well,
> EncoderLibJpeg::encode() expects a vector of planes as the source of
> framebuffer to be encoded. Currently, we are passing a contiguous buffer
> which is treated as only one plane (instead of two, as thumbnail is NV12).
> 
> Hence, split the thumbnail data into respective planes according to NV12.
> This fixes a crash in encoding of thumbnails.
> 
> Fixes: 894ca69f6043("android: jpeg: Support multi-planar buffers")
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> Reviewed-by: Hirokazu Honda <hiroh at chromium.org>
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>

Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>

> ---
> Changes in v3:
> - Use planeSize() helpers recently introduced for readability.
> ---
>  src/android/jpeg/post_processor_jpeg.cpp | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp
> index 68d74842..ef2d98cc 100644
> --- a/src/android/jpeg/post_processor_jpeg.cpp
> +++ b/src/android/jpeg/post_processor_jpeg.cpp
> @@ -72,7 +72,22 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
>  		 */
>  		thumbnail->resize(rawThumbnail.size());
>  
> -		int jpeg_size = thumbnailEncoder_.encode({ rawThumbnail },
> +		/*
> +		 * Split planes manually as the encoder expects a vector of
> +		 * planes.
> +		 *
> +		 * \todo Pass a vector of planes directly to
> +		 * Thumbnailer::createThumbnailer above and remove the manual
> +		 * planes split from here.
> +		 */
> +		std::vector<Span<uint8_t>> thumbnailPlanes;
> +		const PixelFormatInfo &formatNV12 = PixelFormatInfo::info(formats::NV12);
> +		size_t YPlaneSize = formatNV12.planeSize(targetSize, 0);
> +		size_t UVPlaneSize = formatNV12.planeSize(targetSize, 1);
> +		thumbnailPlanes.push_back({ rawThumbnail.data(), YPlaneSize });
> +		thumbnailPlanes.push_back({ rawThumbnail.data() + YPlaneSize, UVPlaneSize });
> +
> +		int jpeg_size = thumbnailEncoder_.encode(thumbnailPlanes,
>  							 *thumbnail, {}, quality);
>  		thumbnail->resize(jpeg_size);
>  
> -- 
> 2.31.0
> 


More information about the libcamera-devel mailing list