summaryrefslogtreecommitdiff
path: root/src/android/jpeg
diff options
context:
space:
mode:
authorUmang Jain <umang.jain@ideasonboard.com>2021-09-08 15:19:49 +0530
committerUmang Jain <umang.jain@ideasonboard.com>2021-09-09 22:31:53 +0530
commite355ca0087cd93ef80f74c61018e9e9228a93313 (patch)
treeffb3da1cb03e80a2cc8f8f1ee4ced6af42056758 /src/android/jpeg
parent3d297f7ac840c3abe8e72d525f0fbc1fe607f94d (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/android/jpeg')
-rw-r--r--src/android/jpeg/post_processor_jpeg.cpp17
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);