Fix fillRGBAFromYUYV() method
This CL corrects the output format of fillRGBAFromYUYV() as RGBA format.
Fix: 189610770
Test: Run evs_app
Change-Id: I5c9630fee1696597c1b2a4e23b335e9dc6d401b9
diff --git a/cpp/evs/sampleDriver/bufferCopy.cpp b/cpp/evs/sampleDriver/bufferCopy.cpp
index d9578e6..098af61 100644
--- a/cpp/evs/sampleDriver/bufferCopy.cpp
+++ b/cpp/evs/sampleDriver/bufferCopy.cpp
@@ -123,14 +123,27 @@
void fillRGBAFromYUYV(const BufferDesc& tgtBuff, uint8_t* tgt, void* imgData, unsigned imgStride) {
const AHardwareBuffer_Desc* pDesc =
reinterpret_cast<const AHardwareBuffer_Desc*>(&tgtBuff.buffer.description);
+ // Converts YUY2ToARGB (little endian). Please note that libyuv uses the
+ // little endian while we're using the big endian in RGB format names.
+ const auto dstStrideInBytes = pDesc->stride * 4; // 4-byte per pixel
auto result = libyuv::YUY2ToARGB((const uint8_t*)imgData,
imgStride, // input stride in bytes
tgt,
- (pDesc->stride << 2), // output stride in bytes
+ dstStrideInBytes, // output stride in bytes
pDesc->width,
pDesc->height);
if (result) {
- LOG(ERROR) << "Failed to convert YUYV to ARGB.";
+ LOG(ERROR) << "Failed to convert YUYV to BGRA.";
+ return;
+ }
+
+ // Swaps R and B pixels to convert BGRA to RGBA in place.
+ // TODO(b/190783702): Consider allocating an extra space to store ARGB data
+ // temporarily if below operation is too slow.
+ result = libyuv::ABGRToARGB(tgt, dstStrideInBytes, tgt, dstStrideInBytes,
+ pDesc->width, pDesc->height);
+ if (result) {
+ LOG(ERROR) << "Failed to convert BGRA to RGBA.";
}
}