From 854f634c466c3c7dfc36dae8cb20ac75585ca2f4 Mon Sep 17 00:00:00 2001 From: Vincent Liu Date: Fri, 12 Sep 2014 17:25:29 +0800 Subject: [PATCH] Bug 1066410 - Serious color distortion happened when plays WebRTC. r=jesup --- content/media/webrtc/MediaEngineWebRTC.h | 1 + .../media/webrtc/MediaEngineWebRTCVideo.cpp | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/content/media/webrtc/MediaEngineWebRTC.h b/content/media/webrtc/MediaEngineWebRTC.h index c3ae80a7dc3..c2064dcae2a 100644 --- a/content/media/webrtc/MediaEngineWebRTC.h +++ b/content/media/webrtc/MediaEngineWebRTC.h @@ -197,6 +197,7 @@ public: void StopImpl(); void SnapshotImpl(); void RotateImage(layers::Image* aImage, uint32_t aWidth, uint32_t aHeight); + uint32_t ConvertPixexFormatToFOURCC(int aFormat); void Notify(const mozilla::hal::ScreenConfiguration& aConfiguration); nsresult TakePhoto(PhotoCallback* aCallback) MOZ_OVERRIDE; diff --git a/content/media/webrtc/MediaEngineWebRTCVideo.cpp b/content/media/webrtc/MediaEngineWebRTCVideo.cpp index de975509ace..5cd12cf02ef 100644 --- a/content/media/webrtc/MediaEngineWebRTCVideo.cpp +++ b/content/media/webrtc/MediaEngineWebRTCVideo.cpp @@ -968,6 +968,22 @@ MediaEngineWebRTCVideoSource::OnTakePictureComplete(uint8_t* aData, uint32_t aLe } } +uint32_t +MediaEngineWebRTCVideoSource::ConvertPixexFormatToFOURCC(int aFormat) +{ + switch (aFormat) { + case HAL_PIXEL_FORMAT_YCrCb_420_SP: + return libyuv::FOURCC_NV21; + case HAL_PIXEL_FORMAT_YV12: + return libyuv::FOURCC_YV12; + default: { + LOG((" xxxxx Unknown pixel format %d", aFormat)); + MOZ_ASSERT(false, "Unknown pixel format."); + return libyuv::FOURCC_ANY; + } + } +} + void MediaEngineWebRTCVideoSource::RotateImage(layers::Image* aImage, uint32_t aWidth, uint32_t aHeight) { layers::GrallocImage *nativeImage = static_cast(aImage); @@ -1003,7 +1019,7 @@ MediaEngineWebRTCVideoSource::RotateImage(layers::Image* aImage, uint32_t aWidth aWidth, aHeight, aWidth, aHeight, static_cast(mRotation), - libyuv::FOURCC_NV21); + ConvertPixexFormatToFOURCC(graphicBuffer->getPixelFormat())); graphicBuffer->unlock(); const uint8_t lumaBpp = 8;