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>
This commit is contained in:
Umang Jain 2021-09-08 15:19:49 +05:30
parent 3d297f7ac8
commit e355ca0087

View file

@ -72,7 +72,22 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
*/ */
thumbnail->resize(rawThumbnail.size()); 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, {}, quality);
thumbnail->resize(jpeg_size); thumbnail->resize(jpeg_size);