Bug 1321076 - Added util functions to help with YUVA to BGRA conversion. r=jya draft
authorkaro <kkoorts@mozilla.com>
Wed, 21 Dec 2016 15:00:46 +1300
changeset 452675 572dbf59e8a3b41e6c7366d1579a28e365062260
parent 452674 a2b4bad848c6350041c2cff805803fb5728342d2
child 452676 fcde786d529f69ba6fe2a533e351a8b33afa1de7
push id39448
push userbmo:kkoorts@mozilla.com
push dateThu, 22 Dec 2016 00:02:10 +0000
reviewersjya
bugs1321076
milestone53.0a1
Bug 1321076 - Added util functions to help with YUVA to BGRA conversion. r=jya MozReview-Commit-ID: JZDdbM2gt0g
dom/media/MediaData.cpp
gfx/ycbcr/YCbCrUtils.cpp
gfx/ycbcr/YCbCrUtils.h
gfx/ycbcr/yuv_convert.cpp
gfx/ycbcr/yuv_convert.h
--- a/dom/media/MediaData.cpp
+++ b/dom/media/MediaData.cpp
@@ -3,16 +3,18 @@
 /* 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 "MediaData.h"
 #include "MediaInfo.h"
 #include "VideoUtils.h"
 #include "ImageContainer.h"
+#include "mozilla/layers/SharedRGBImage.h"
+#include "YCbCrUtils.h"
 
 #ifdef MOZ_WIDGET_GONK
 #include <cutils/properties.h>
 #endif
 #include <stdint.h>
 
 namespace mozilla {
 
--- a/gfx/ycbcr/YCbCrUtils.cpp
+++ b/gfx/ycbcr/YCbCrUtils.cpp
@@ -148,10 +148,31 @@ ConvertYCbCrToRGB(const layers::PlanarYC
                           aData.mYStride,
                           aData.mCbCrStride,
                           aStride,
                           yuvtype,
                           aData.mYUVColorSpace);
   }
 }
 
+void
+ConvertYCbCrAToARGB(const uint8_t* aSrcY,
+                    const uint8_t* aSrcU,
+                    const uint8_t* aSrcV,
+                    const uint8_t* aSrcA,
+                    int aSrcStrideYA, int aSrcStrideUV,
+                    uint8_t* aDstARGB, int aDstStrideARGB,
+                    int aWidth, int aHeight) {
+
+  ConvertYCbCrAToARGB32(aSrcY,
+                        aSrcU,
+                        aSrcV,
+                        aSrcA,
+                        aDstARGB,
+                        aWidth,
+                        aHeight,
+                        aSrcStrideYA,
+                        aSrcStrideUV,
+                        aDstStrideARGB);
+}
+
 } // namespace gfx
 } // namespace mozilla
--- a/gfx/ycbcr/YCbCrUtils.h
+++ b/gfx/ycbcr/YCbCrUtils.h
@@ -1,15 +1,15 @@
 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  * 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/. */
 
-#ifndef MOZILLA_GFX_UTILS_H_
-#define MOZILLA_GFX_UTILS_H_
+#ifndef Y_CB_CR_UTILS_H_
+#define Y_CB_CR_UTILS_H_
 
 #include "mozilla/gfx/Types.h"
 #include "ImageContainer.h"
 
 namespace mozilla {
 namespace gfx {
 
 void
@@ -19,12 +19,22 @@ GetYCbCrToRGBDestFormatAndSize(const lay
 
 void
 ConvertYCbCrToRGB(const layers::PlanarYCbCrData& aData,
                   const SurfaceFormat& aDestFormat,
                   const IntSize& aDestSize,
                   unsigned char* aDestBuffer,
                   int32_t aStride);
 
+// Currently this function only has support for I420 type.
+void
+ConvertYCbCrAToARGB(const uint8_t* aSrcY,
+                    const uint8_t* aSrcU,
+                    const uint8_t* aSrcV,
+                    const uint8_t* aSrcA,
+                    int aSrcStrideYA, int aSrcStrideUV,
+                    uint8_t* aDstARGB, int aDstStrideARGB,
+                    int aWidth, int aHeight);
+
 } // namespace gfx
 } // namespace mozilla
 
-#endif /* MOZILLA_GFX_UTILS_H_ */
+#endif /* Y_CB_CR_UTILS_H_ */
--- a/gfx/ycbcr/yuv_convert.cpp
+++ b/gfx/ycbcr/yuv_convert.cpp
@@ -500,11 +500,32 @@ void ScaleYCbCrToRGB32_deprecated(const 
                          dest_pixel, width, source_dx);
 #endif
     }
   }
   // MMX used for FastConvertYUVToRGB32Row and FilterRows requires emms.
   if (has_mmx)
     EMMS();
 }
+void ConvertYCbCrAToARGB32(const uint8* y_buf,
+                           const uint8* u_buf,
+                           const uint8* v_buf,
+                           const uint8* a_buf,
+                           uint8* argb_buf,
+                           int pic_width,
+                           int pic_height,
+                           int ya_pitch,
+                           int uv_pitch,
+                           int argb_pitch) {
+
+  // The downstream graphics stack expects an attenuated input, hence why the
+  // attenuation parameter is set.
+  DebugOnly<int> err = libyuv::I420AlphaToARGB(y_buf, ya_pitch,
+                                               u_buf, uv_pitch,
+                                               v_buf, uv_pitch,
+                                               a_buf, ya_pitch,
+                                               argb_buf, argb_pitch,
+                                               pic_width, pic_height, 1);
+  MOZ_ASSERT(!err);
+}
 
 } // namespace gfx
 } // namespace mozilla
--- a/gfx/ycbcr/yuv_convert.h
+++ b/gfx/ycbcr/yuv_convert.h
@@ -99,12 +99,23 @@ void ScaleYCbCrToRGB32_deprecated(const 
                                   int height,
                                   int ystride,
                                   int uvstride,
                                   int rgbstride,
                                   YUVType yuv_type,
                                   Rotate view_rotate,
                                   ScaleFilter filter);
 
+void ConvertYCbCrAToARGB32(const uint8* yplane,
+                           const uint8* uplane,
+                           const uint8* vplane,
+                           const uint8* aplane,
+                           uint8* argbframe,
+                           int pic_width,
+                           int pic_height,
+                           int yastride,
+                           int uvstride,
+                           int argbstride);
+
 } // namespace gfx
 } // namespace mozilla
- 
+
 #endif  // MEDIA_BASE_YUV_CONVERT_H_