# HG changeset patch # User A. Wilcox # Date 1543674229 0 # Sat Dec 01 14:23:49 2018 +0000 # Node ID 0309ff19e46b126c527e633518d7de8570442114 # Parent ba2c9b0542c95cc5ee26c264e8338fc9ba94c958 Bug 1511604 - Swizzle YCbCr->RGB data on big-endian machines Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1511604 This is very closely related to mozilla-bmo1504834 Again, input for skia is swizzled to LE, as skia only understands LE. diff --git a/gfx/ycbcr/YCbCrUtils.cpp b/gfx/ycbcr/YCbCrUtils.cpp --- a/gfx/ycbcr/YCbCrUtils.cpp +++ b/gfx/ycbcr/YCbCrUtils.cpp @@ -1,14 +1,16 @@ /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "mozilla/EndianUtils.h" #include "gfx2DGlue.h" +#include "mozilla/gfx/Swizzle.h" #include "YCbCrUtils.h" #include "yuv_convert.h" #include "ycbcr_to_rgb565.h" namespace mozilla { namespace gfx { @@ -231,16 +233,23 @@ ConvertYCbCrToRGB(const layers::PlanarYC srcData.mPicSize.width, srcData.mPicSize.height, srcData.mYStride, srcData.mCbCrStride, aStride, yuvtype, srcData.mYUVColorSpace); } +#if MOZ_BIG_ENDIAN + // libyuv makes endian-correct result, which needs to be swapped to BGRX + if (aDestFormat != SurfaceFormat::R5G6B5_UINT16) + gfx::SwizzleData(aDestBuffer, aStride, gfx::SurfaceFormat::X8R8G8B8, + aDestBuffer, aStride, gfx::SurfaceFormat::B8G8R8X8, + srcData.mPicSize); +#endif } void ConvertYCbCrAToARGB(const uint8_t* aSrcY, const uint8_t* aSrcU, const uint8_t* aSrcV, const uint8_t* aSrcA, int aSrcStrideYA, int aSrcStrideUV, @@ -252,12 +261,18 @@ ConvertYCbCrAToARGB(const uint8_t* aSrcY aSrcV, aSrcA, aDstARGB, aWidth, aHeight, aSrcStrideYA, aSrcStrideUV, aDstStrideARGB); +#if MOZ_BIG_ENDIAN + // libyuv makes endian-correct result, which needs to be swapped to BGRA + gfx::SwizzleData(aDstARGB, aDstStrideARGB, gfx::SurfaceFormat::A8R8G8B8, + aDstARGB, aDstStrideARGB, gfx::SurfaceFormat::B8G8R8A8, + IntSize(aWidth, aHeight)); +#endif } } // namespace gfx } // namespace mozilla