diff options
author | Umang Jain <umang.jain@ideasonboard.com> | 2021-09-08 15:19:49 +0530 |
---|---|---|
committer | Umang Jain <umang.jain@ideasonboard.com> | 2021-09-09 22:31:53 +0530 |
commit | e355ca0087cd93ef80f74c61018e9e9228a93313 (patch) | |
tree | ffb3da1cb03e80a2cc8f8f1ee4ced6af42056758 /src | |
parent | 3d297f7ac840c3abe8e72d525f0fbc1fe607f94d (diff) |
android: jpeg: Split and pass the thumbnail planes to encoder
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@ideasonboard.com>
Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/android/jpeg/post_processor_jpeg.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
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); |