mozilla-bmo1511604.patch
author Wolfgang Rosenauer <wr@rosenauer.org>
Fri, 20 Sep 2019 14:10:22 +0200
branchfirefox69
changeset 1110 9e4b30f05706
parent 1109 972f68ac6b1a
permissions -rw-r--r--
Firefox 69.0.1

# HG changeset patch
# User A. Wilcox <AWilcox@Wilcox-Tech.com>
# 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