diff --git a/webrtc/examples/BUILD.gn b/webrtc/examples/BUILD.gn index c8078f46bf..b4d2bbeea7 100644 --- a/webrtc/examples/BUILD.gn +++ b/webrtc/examples/BUILD.gn @@ -446,6 +446,7 @@ if (is_linux || is_win) { } deps = [ "//build/config/sanitizers:deps", + "//third_party/libyuv", "//webrtc/api:libjingle_peerconnection", "//webrtc/system_wrappers:field_trial_default", "//webrtc/system_wrappers:metrics_default", diff --git a/webrtc/examples/peerconnection/client/linux/main_wnd.cc b/webrtc/examples/peerconnection/client/linux/main_wnd.cc index 95229c9e13..eda6617826 100644 --- a/webrtc/examples/peerconnection/client/linux/main_wnd.cc +++ b/webrtc/examples/peerconnection/client/linux/main_wnd.cc @@ -14,6 +14,7 @@ #include #include +#include "libyuv/convert_from.h" #include "webrtc/examples/peerconnection/client/defaults.h" #include "webrtc/base/common.h" #include "webrtc/base/logging.h" @@ -492,23 +493,13 @@ void GtkMainWnd::VideoRenderer::OnFrame( SetSize(frame.width(), frame.height()); - int size = width_ * height_ * 4; - // TODO(henrike): Convert directly to RGBA - frame.ConvertToRgbBuffer(cricket::FOURCC_ARGB, - image_.get(), - size, - width_ * 4); - // Convert the B,G,R,A frame to R,G,B,A, which is accepted by GTK. - // The 'A' is just padding for GTK, so we can use it as temp. - uint8_t* pix = image_.get(); - uint8_t* end = image_.get() + size; - while (pix < end) { - pix[3] = pix[0]; // Save B to A. - pix[0] = pix[2]; // Set Red. - pix[2] = pix[3]; // Set Blue. - pix[3] = 0xFF; // Fixed Alpha. - pix += 4; - } + rtc::scoped_refptr buffer( + frame.video_frame_buffer()); + libyuv::I420ToRGBA(buffer->DataY(), buffer->StrideY(), + buffer->DataU(), buffer->StrideU(), + buffer->DataV(), buffer->StrideV(), + image_.get(), width_ * 4, + buffer->width(), buffer->height()); gdk_threads_leave(); diff --git a/webrtc/examples/peerconnection/client/main_wnd.cc b/webrtc/examples/peerconnection/client/main_wnd.cc index ea2c366785..7fe5132fa0 100644 --- a/webrtc/examples/peerconnection/client/main_wnd.cc +++ b/webrtc/examples/peerconnection/client/main_wnd.cc @@ -12,6 +12,7 @@ #include +#include "libyuv/convert_argb.h" #include "webrtc/examples/peerconnection/client/defaults.h" #include "webrtc/base/arraysize.h" #include "webrtc/base/common.h" @@ -613,11 +614,15 @@ void MainWnd::VideoRenderer::OnFrame( SetSize(frame.width(), frame.height()); ASSERT(image_.get() != NULL); - frame.ConvertToRgbBuffer(cricket::FOURCC_ARGB, - image_.get(), - bmi_.bmiHeader.biSizeImage, - bmi_.bmiHeader.biWidth * - bmi_.bmiHeader.biBitCount / 8); + rtc::scoped_refptr buffer( + frame.video_frame_buffer()); + libyuv::I420ToARGB(buffer->DataY(), buffer->StrideY(), + buffer->DataU(), buffer->StrideU(), + buffer->DataV(), buffer->StrideV(), + image_.get(), + bmi_.bmiHeader.biWidth * + bmi_.bmiHeader.biBitCount / 8, + buffer->width(), buffer->height()); } InvalidateRect(wnd_, NULL, TRUE); } diff --git a/webrtc/media/base/videoframe.cc b/webrtc/media/base/videoframe.cc index 64d4c1f3b3..4ce0dfd90c 100644 --- a/webrtc/media/base/videoframe.cc +++ b/webrtc/media/base/videoframe.cc @@ -12,10 +12,6 @@ #include -#include "libyuv/convert_from.h" -#include "libyuv/compare.h" -#include "libyuv/planar_functions.h" -#include "libyuv/scale.h" #include "webrtc/base/arraysize.h" #include "webrtc/base/checks.h" #include "webrtc/base/logging.h" @@ -23,27 +19,6 @@ namespace cricket { -size_t VideoFrame::ConvertToRgbBuffer(uint32_t to_fourcc, - uint8_t* buffer, - size_t size, - int stride_rgb) const { - const size_t needed = std::abs(stride_rgb) * static_cast(height()); - if (size < needed) { - LOG(LS_WARNING) << "RGB buffer is not large enough"; - return needed; - } - - if (libyuv::ConvertFromI420( - video_frame_buffer()->DataY(), video_frame_buffer()->StrideY(), - video_frame_buffer()->DataU(), video_frame_buffer()->StrideU(), - video_frame_buffer()->DataV(), video_frame_buffer()->StrideV(), - buffer, stride_rgb, width(), height(), to_fourcc)) { - LOG(LS_ERROR) << "RGB type not supported: " << to_fourcc; - return 0; // 0 indicates error - } - return needed; -} - static const size_t kMaxSampleSize = 1000000000u; // Returns whether a sample is valid. bool VideoFrame::Validate(uint32_t fourcc, diff --git a/webrtc/media/base/videoframe.h b/webrtc/media/base/videoframe.h index ba020bd89d..156da25112 100644 --- a/webrtc/media/base/videoframe.h +++ b/webrtc/media/base/videoframe.h @@ -63,19 +63,6 @@ class VideoFrame { // webrtc::I420Buffer::Rotate instead. virtual const VideoFrame* GetCopyWithRotationApplied() const = 0; - // Converts the I420 data to RGB of a certain type such as ARGB and ABGR. - // Returns the frame's actual size, regardless of whether it was written or - // not (like snprintf). Parameters size and stride_rgb are in units of bytes. - // If there is insufficient space, nothing is written. - - // TODO(nisse): Deprecated. Should be moved or deleted in the - // cricket::VideoFrame and webrtc::VideoFrame merge. Use - // libyuv::ConvertFromI420 directly instead. - virtual size_t ConvertToRgbBuffer(uint32_t to_fourcc, - uint8_t* buffer, - size_t size, - int stride_rgb) const; - // Tests if sample is valid. Returns true if valid. // TODO(nisse): Deprecated. Should be deleted in the cricket::VideoFrame and diff --git a/webrtc/media/base/videoframe_unittest.h b/webrtc/media/base/videoframe_unittest.h index 13fb790c1a..8040804f83 100644 --- a/webrtc/media/base/videoframe_unittest.h +++ b/webrtc/media/base/videoframe_unittest.h @@ -768,54 +768,6 @@ class VideoFrameTest : public testing::Test { EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); } - // Test constructing an image from a RGB565 buffer - void ConstructRGB565() { - T frame1, frame2; - size_t out_size = kWidth * kHeight * 2; - std::unique_ptr outbuf(new uint8_t[out_size + kAlignment]); - uint8_t* out = ALIGNP(outbuf.get(), kAlignment); - T frame; - ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); - EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(cricket::FOURCC_RGBP, - out, - out_size, kWidth * 2)); - EXPECT_TRUE(LoadFrame(out, out_size, cricket::FOURCC_RGBP, - kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 20)); - } - - // Test constructing an image from a ARGB1555 buffer - void ConstructARGB1555() { - T frame1, frame2; - size_t out_size = kWidth * kHeight * 2; - std::unique_ptr outbuf(new uint8_t[out_size + kAlignment]); - uint8_t* out = ALIGNP(outbuf.get(), kAlignment); - T frame; - ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); - EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(cricket::FOURCC_RGBO, - out, - out_size, kWidth * 2)); - EXPECT_TRUE(LoadFrame(out, out_size, cricket::FOURCC_RGBO, - kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 20)); - } - - // Test constructing an image from a ARGB4444 buffer - void ConstructARGB4444() { - T frame1, frame2; - size_t out_size = kWidth * kHeight * 2; - std::unique_ptr outbuf(new uint8_t[out_size + kAlignment]); - uint8_t* out = ALIGNP(outbuf.get(), kAlignment); - T frame; - ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); - EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(cricket::FOURCC_R444, - out, - out_size, kWidth * 2)); - EXPECT_TRUE(LoadFrame(out, out_size, cricket::FOURCC_R444, - kWidth, kHeight, &frame2)); - EXPECT_TRUE(IsEqual(frame1, frame2, 20)); - } - // Macro to help test different rotations #define TEST_MIRROR(FOURCC, BPP) \ void Construct##FOURCC##Mirror() { \ @@ -1011,66 +963,6 @@ class VideoFrameTest : public testing::Test { EXPECT_EQ(3, frame.video_frame_buffer()->StrideV()); } - // Test 1 pixel edge case image ARGB buffer. - void ConstructARGB1Pixel() { - T frame; - uint8_t pixel[4] = {64, 128, 192, 255}; - for (int i = 0; i < repeat_; ++i) { - EXPECT_TRUE(frame.Init(cricket::FOURCC_ARGB, 1, 1, 1, 1, pixel, - sizeof(pixel), 0, - webrtc::kVideoRotation_0)); - } - // Convert back to ARGB. - size_t out_size = 4; - std::unique_ptr outbuf(new uint8_t[out_size + kAlignment]); - uint8_t* out = ALIGNP(outbuf.get(), kAlignment); - - EXPECT_EQ(out_size, frame.ConvertToRgbBuffer(cricket::FOURCC_ARGB, - out, - out_size, // buffer size - out_size)); // stride - #ifdef USE_LMI_CONVERT - // TODO(fbarchard): Expected to fail, but not crash. - EXPECT_FALSE(IsPlaneEqual("argb", pixel, 4, out, 4, 3, 1, 2)); - #else - // TODO(fbarchard): Check for overwrite. - EXPECT_TRUE(IsPlaneEqual("argb", pixel, 4, out, 4, 3, 1, 2)); - #endif - } - - // Test Black, White and Grey pixels. - void ConstructARGBBlackWhitePixel() { - T frame; - uint8_t pixel[10 * 4] = {0, 0, 0, 255, // Black. - 0, 0, 0, 255, // Black. - 64, 64, 64, 255, // Dark Grey. - 64, 64, 64, 255, // Dark Grey. - 128, 128, 128, 255, // Grey. - 128, 128, 128, 255, // Grey. - 196, 196, 196, 255, // Light Grey. - 196, 196, 196, 255, // Light Grey. - 255, 255, 255, 255, // White. - 255, 255, 255, 255}; // White. - - for (int i = 0; i < repeat_; ++i) { - EXPECT_TRUE(frame.Init(cricket::FOURCC_ARGB, 10, 1, 10, 1, pixel, - sizeof(pixel), 1, 1, 0, - webrtc::kVideoRotation_0)); - } - // Convert back to ARGB - size_t out_size = 10 * 4; - std::unique_ptr outbuf(new uint8_t[out_size + kAlignment]); - uint8_t* out = ALIGNP(outbuf.get(), kAlignment); - - EXPECT_EQ(out_size, frame.ConvertToRgbBuffer(cricket::FOURCC_ARGB, - out, - out_size, // buffer size. - out_size)); // stride. - EXPECT_TRUE(IsPlaneEqual("argb", pixel, out_size, - out, out_size, - out_size, 1, 2)); - } - // Test constructing an image from an I420 buffer with horizontal cropping. void ConstructI420CropHorizontal() { T frame1, frame2; @@ -1439,348 +1331,6 @@ class VideoFrameTest : public testing::Test { // Conversion tests // ////////////////////// - enum ToFrom { TO, FROM }; - - // Helper function for test converting from I420 to packed formats. - inline void ConvertToBuffer(int bpp, - int rowpad, - bool invert, - ToFrom to_from, - int error, - uint32_t fourcc, - int (*RGBToI420)(const uint8_t* src_frame, - int src_stride_frame, - uint8_t* dst_y, - int dst_stride_y, - uint8_t* dst_u, - int dst_stride_u, - uint8_t* dst_v, - int dst_stride_v, - int width, - int height)) { - T frame1, frame2; - int repeat_to = (to_from == TO) ? repeat_ : 1; - int repeat_from = (to_from == FROM) ? repeat_ : 1; - - int astride = kWidth * bpp + rowpad; - size_t out_size = astride * kHeight; - std::unique_ptr outbuf(new uint8_t[out_size + kAlignment + 1]); - memset(outbuf.get(), 0, out_size + kAlignment + 1); - uint8_t* outtop = ALIGNP(outbuf.get(), kAlignment); - uint8_t* out = outtop; - int stride = astride; - if (invert) { - out += (kHeight - 1) * stride; // Point to last row. - stride = -stride; - } - ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); - - for (int i = 0; i < repeat_to; ++i) { - EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(fourcc, - out, - out_size, stride)); - } - frame2.InitToEmptyBuffer(kWidth, kHeight); - for (int i = 0; i < repeat_from; ++i) { - EXPECT_EQ(0, RGBToI420(out, stride, - frame2.video_frame_buffer()->MutableDataY(), - frame2.video_frame_buffer()->StrideY(), - frame2.video_frame_buffer()->MutableDataU(), - frame2.video_frame_buffer()->StrideU(), - frame2.video_frame_buffer()->MutableDataV(), - frame2.video_frame_buffer()->StrideV(), - kWidth, kHeight)); - } - if (rowpad) { - EXPECT_EQ(0, outtop[kWidth * bpp]); // Ensure stride skipped end of row. - EXPECT_NE(0, outtop[astride]); // Ensure pixel at start of 2nd row. - } else { - EXPECT_NE(0, outtop[kWidth * bpp]); // Expect something to be here. - } - EXPECT_EQ(0, outtop[out_size]); // Ensure no overrun. - EXPECT_TRUE(IsEqual(frame1, frame2, error)); - } - - static const int kError = 20; - static const int kErrorHigh = 40; - static const int kOddStride = 23; - - // Tests ConvertToRGBBuffer formats. - void ConvertToARGBBuffer() { - ConvertToBuffer(4, 0, false, TO, kError, - cricket::FOURCC_ARGB, libyuv::ARGBToI420); - } - void ConvertToBGRABuffer() { - ConvertToBuffer(4, 0, false, TO, kError, - cricket::FOURCC_BGRA, libyuv::BGRAToI420); - } - void ConvertToABGRBuffer() { - ConvertToBuffer(4, 0, false, TO, kError, - cricket::FOURCC_ABGR, libyuv::ABGRToI420); - } - void ConvertToRGB24Buffer() { - ConvertToBuffer(3, 0, false, TO, kError, - cricket::FOURCC_24BG, libyuv::RGB24ToI420); - } - void ConvertToRAWBuffer() { - ConvertToBuffer(3, 0, false, TO, kError, - cricket::FOURCC_RAW, libyuv::RAWToI420); - } - void ConvertToRGB565Buffer() { - ConvertToBuffer(2, 0, false, TO, kError, - cricket::FOURCC_RGBP, libyuv::RGB565ToI420); - } - void ConvertToARGB1555Buffer() { - ConvertToBuffer(2, 0, false, TO, kError, - cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); - } - void ConvertToARGB4444Buffer() { - ConvertToBuffer(2, 0, false, TO, kError, - cricket::FOURCC_R444, libyuv::ARGB4444ToI420); - } - void ConvertToI400Buffer() { - ConvertToBuffer(1, 0, false, TO, 128, - cricket::FOURCC_I400, libyuv::I400ToI420); - } - void ConvertToYUY2Buffer() { - ConvertToBuffer(2, 0, false, TO, kError, - cricket::FOURCC_YUY2, libyuv::YUY2ToI420); - } - void ConvertToUYVYBuffer() { - ConvertToBuffer(2, 0, false, TO, kError, - cricket::FOURCC_UYVY, libyuv::UYVYToI420); - } - - // Tests ConvertToRGBBuffer formats with odd stride. - void ConvertToARGBBufferStride() { - ConvertToBuffer(4, kOddStride, false, TO, kError, - cricket::FOURCC_ARGB, libyuv::ARGBToI420); - } - void ConvertToBGRABufferStride() { - ConvertToBuffer(4, kOddStride, false, TO, kError, - cricket::FOURCC_BGRA, libyuv::BGRAToI420); - } - void ConvertToABGRBufferStride() { - ConvertToBuffer(4, kOddStride, false, TO, kError, - cricket::FOURCC_ABGR, libyuv::ABGRToI420); - } - void ConvertToRGB24BufferStride() { - ConvertToBuffer(3, kOddStride, false, TO, kError, - cricket::FOURCC_24BG, libyuv::RGB24ToI420); - } - void ConvertToRAWBufferStride() { - ConvertToBuffer(3, kOddStride, false, TO, kError, - cricket::FOURCC_RAW, libyuv::RAWToI420); - } - void ConvertToRGB565BufferStride() { - ConvertToBuffer(2, kOddStride, false, TO, kError, - cricket::FOURCC_RGBP, libyuv::RGB565ToI420); - } - void ConvertToARGB1555BufferStride() { - ConvertToBuffer(2, kOddStride, false, TO, kError, - cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); - } - void ConvertToARGB4444BufferStride() { - ConvertToBuffer(2, kOddStride, false, TO, kError, - cricket::FOURCC_R444, libyuv::ARGB4444ToI420); - } - void ConvertToI400BufferStride() { - ConvertToBuffer(1, kOddStride, false, TO, 128, - cricket::FOURCC_I400, libyuv::I400ToI420); - } - void ConvertToYUY2BufferStride() { - ConvertToBuffer(2, kOddStride, false, TO, kError, - cricket::FOURCC_YUY2, libyuv::YUY2ToI420); - } - void ConvertToUYVYBufferStride() { - ConvertToBuffer(2, kOddStride, false, TO, kError, - cricket::FOURCC_UYVY, libyuv::UYVYToI420); - } - - // Tests ConvertToRGBBuffer formats with negative stride to invert image. - void ConvertToARGBBufferInverted() { - ConvertToBuffer(4, 0, true, TO, kError, - cricket::FOURCC_ARGB, libyuv::ARGBToI420); - } - void ConvertToBGRABufferInverted() { - ConvertToBuffer(4, 0, true, TO, kError, - cricket::FOURCC_BGRA, libyuv::BGRAToI420); - } - void ConvertToABGRBufferInverted() { - ConvertToBuffer(4, 0, true, TO, kError, - cricket::FOURCC_ABGR, libyuv::ABGRToI420); - } - void ConvertToRGB24BufferInverted() { - ConvertToBuffer(3, 0, true, TO, kError, - cricket::FOURCC_24BG, libyuv::RGB24ToI420); - } - void ConvertToRAWBufferInverted() { - ConvertToBuffer(3, 0, true, TO, kError, - cricket::FOURCC_RAW, libyuv::RAWToI420); - } - void ConvertToRGB565BufferInverted() { - ConvertToBuffer(2, 0, true, TO, kError, - cricket::FOURCC_RGBP, libyuv::RGB565ToI420); - } - void ConvertToARGB1555BufferInverted() { - ConvertToBuffer(2, 0, true, TO, kError, - cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); - } - void ConvertToARGB4444BufferInverted() { - ConvertToBuffer(2, 0, true, TO, kError, - cricket::FOURCC_R444, libyuv::ARGB4444ToI420); - } - void ConvertToI400BufferInverted() { - ConvertToBuffer(1, 0, true, TO, 128, - cricket::FOURCC_I400, libyuv::I400ToI420); - } - void ConvertToYUY2BufferInverted() { - ConvertToBuffer(2, 0, true, TO, kError, - cricket::FOURCC_YUY2, libyuv::YUY2ToI420); - } - void ConvertToUYVYBufferInverted() { - ConvertToBuffer(2, 0, true, TO, kError, - cricket::FOURCC_UYVY, libyuv::UYVYToI420); - } - - // Tests ConvertFrom formats. - void ConvertFromARGBBuffer() { - ConvertToBuffer(4, 0, false, FROM, kError, - cricket::FOURCC_ARGB, libyuv::ARGBToI420); - } - void ConvertFromBGRABuffer() { - ConvertToBuffer(4, 0, false, FROM, kError, - cricket::FOURCC_BGRA, libyuv::BGRAToI420); - } - void ConvertFromABGRBuffer() { - ConvertToBuffer(4, 0, false, FROM, kError, - cricket::FOURCC_ABGR, libyuv::ABGRToI420); - } - void ConvertFromRGB24Buffer() { - ConvertToBuffer(3, 0, false, FROM, kError, - cricket::FOURCC_24BG, libyuv::RGB24ToI420); - } - void ConvertFromRAWBuffer() { - ConvertToBuffer(3, 0, false, FROM, kError, - cricket::FOURCC_RAW, libyuv::RAWToI420); - } - void ConvertFromRGB565Buffer() { - ConvertToBuffer(2, 0, false, FROM, kError, - cricket::FOURCC_RGBP, libyuv::RGB565ToI420); - } - void ConvertFromARGB1555Buffer() { - ConvertToBuffer(2, 0, false, FROM, kError, - cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); - } - void ConvertFromARGB4444Buffer() { - ConvertToBuffer(2, 0, false, FROM, kError, - cricket::FOURCC_R444, libyuv::ARGB4444ToI420); - } - void ConvertFromI400Buffer() { - ConvertToBuffer(1, 0, false, FROM, 128, - cricket::FOURCC_I400, libyuv::I400ToI420); - } - void ConvertFromYUY2Buffer() { - ConvertToBuffer(2, 0, false, FROM, kError, - cricket::FOURCC_YUY2, libyuv::YUY2ToI420); - } - void ConvertFromUYVYBuffer() { - ConvertToBuffer(2, 0, false, FROM, kError, - cricket::FOURCC_UYVY, libyuv::UYVYToI420); - } - - // Tests ConvertFrom formats with odd stride. - void ConvertFromARGBBufferStride() { - ConvertToBuffer(4, kOddStride, false, FROM, kError, - cricket::FOURCC_ARGB, libyuv::ARGBToI420); - } - void ConvertFromBGRABufferStride() { - ConvertToBuffer(4, kOddStride, false, FROM, kError, - cricket::FOURCC_BGRA, libyuv::BGRAToI420); - } - void ConvertFromABGRBufferStride() { - ConvertToBuffer(4, kOddStride, false, FROM, kError, - cricket::FOURCC_ABGR, libyuv::ABGRToI420); - } - void ConvertFromRGB24BufferStride() { - ConvertToBuffer(3, kOddStride, false, FROM, kError, - cricket::FOURCC_24BG, libyuv::RGB24ToI420); - } - void ConvertFromRAWBufferStride() { - ConvertToBuffer(3, kOddStride, false, FROM, kError, - cricket::FOURCC_RAW, libyuv::RAWToI420); - } - void ConvertFromRGB565BufferStride() { - ConvertToBuffer(2, kOddStride, false, FROM, kError, - cricket::FOURCC_RGBP, libyuv::RGB565ToI420); - } - void ConvertFromARGB1555BufferStride() { - ConvertToBuffer(2, kOddStride, false, FROM, kError, - cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); - } - void ConvertFromARGB4444BufferStride() { - ConvertToBuffer(2, kOddStride, false, FROM, kError, - cricket::FOURCC_R444, libyuv::ARGB4444ToI420); - } - void ConvertFromI400BufferStride() { - ConvertToBuffer(1, kOddStride, false, FROM, 128, - cricket::FOURCC_I400, libyuv::I400ToI420); - } - void ConvertFromYUY2BufferStride() { - ConvertToBuffer(2, kOddStride, false, FROM, kError, - cricket::FOURCC_YUY2, libyuv::YUY2ToI420); - } - void ConvertFromUYVYBufferStride() { - ConvertToBuffer(2, kOddStride, false, FROM, kError, - cricket::FOURCC_UYVY, libyuv::UYVYToI420); - } - - // Tests ConvertFrom formats with negative stride to invert image. - void ConvertFromARGBBufferInverted() { - ConvertToBuffer(4, 0, true, FROM, kError, - cricket::FOURCC_ARGB, libyuv::ARGBToI420); - } - void ConvertFromBGRABufferInverted() { - ConvertToBuffer(4, 0, true, FROM, kError, - cricket::FOURCC_BGRA, libyuv::BGRAToI420); - } - void ConvertFromABGRBufferInverted() { - ConvertToBuffer(4, 0, true, FROM, kError, - cricket::FOURCC_ABGR, libyuv::ABGRToI420); - } - void ConvertFromRGB24BufferInverted() { - ConvertToBuffer(3, 0, true, FROM, kError, - cricket::FOURCC_24BG, libyuv::RGB24ToI420); - } - void ConvertFromRAWBufferInverted() { - ConvertToBuffer(3, 0, true, FROM, kError, - cricket::FOURCC_RAW, libyuv::RAWToI420); - } - void ConvertFromRGB565BufferInverted() { - ConvertToBuffer(2, 0, true, FROM, kError, - cricket::FOURCC_RGBP, libyuv::RGB565ToI420); - } - void ConvertFromARGB1555BufferInverted() { - ConvertToBuffer(2, 0, true, FROM, kError, - cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); - } - void ConvertFromARGB4444BufferInverted() { - ConvertToBuffer(2, 0, true, FROM, kError, - cricket::FOURCC_R444, libyuv::ARGB4444ToI420); - } - void ConvertFromI400BufferInverted() { - ConvertToBuffer(1, 0, true, FROM, 128, - cricket::FOURCC_I400, libyuv::I400ToI420); - } - void ConvertFromYUY2BufferInverted() { - ConvertToBuffer(2, 0, true, FROM, kError, - cricket::FOURCC_YUY2, libyuv::YUY2ToI420); - } - void ConvertFromUYVYBufferInverted() { - ConvertToBuffer(2, 0, true, FROM, kError, - cricket::FOURCC_UYVY, libyuv::UYVYToI420); - } - // Test converting from I420 to I422. void ConvertToI422Buffer() { T frame1, frame2; diff --git a/webrtc/media/devices/carbonvideorenderer.cc b/webrtc/media/devices/carbonvideorenderer.cc index 766904231c..4c40f18b8d 100644 --- a/webrtc/media/devices/carbonvideorenderer.cc +++ b/webrtc/media/devices/carbonvideorenderer.cc @@ -12,6 +12,7 @@ #include "webrtc/media/devices/carbonvideorenderer.h" +#include "libyuv/convert_from.h" #include "webrtc/base/logging.h" #include "webrtc/media/base/videocommon.h" #include "webrtc/media/base/videoframe.h" @@ -117,11 +118,13 @@ void CarbonVideoRenderer::OnFrame(const VideoFrame& video_frame) { // Grab the image lock so we are not trashing up the image being drawn. rtc::CritScope cs(&image_crit_); - frame.ConvertToRgbBuffer(cricket::FOURCC_ABGR, - image_.get(), - static_cast(frame.width()) * - frame.height() * 4, - frame.width() * 4); + rtc::scoped_refptr buffer( + frame.video_frame_buffer()); + libyuv::I420ToABGR(buffer->DataY(), buffer->StrideY(), + buffer->DataU(), buffer->StrideU(), + buffer->DataV(), buffer->StrideV(), + image_.get(), frame.width() * 4, + buffer->width(), buffer->height()); } // Trigger a repaint event for the whole window. diff --git a/webrtc/media/devices/gdivideorenderer.cc b/webrtc/media/devices/gdivideorenderer.cc index 320b479a47..92c692b394 100644 --- a/webrtc/media/devices/gdivideorenderer.cc +++ b/webrtc/media/devices/gdivideorenderer.cc @@ -14,9 +14,9 @@ #include "webrtc/media/devices/gdivideorenderer.h" +#include "libyuv/convert_argb.h" #include "webrtc/base/thread.h" #include "webrtc/base/win32window.h" -#include "webrtc/media/base/videocommon.h" #include "webrtc/media/engine/webrtcvideoframe.h" namespace cricket { @@ -229,9 +229,13 @@ void GdiVideoRenderer::VideoWindow::OnRenderFrame(const VideoFrame* frame) { return; } // Convert frame to ARGB format, which is accepted by GDI - frame->ConvertToRgbBuffer(cricket::FOURCC_ARGB, image_.get(), - bmi_.bmiHeader.biSizeImage, - bmi_.bmiHeader.biWidth * 4); + rtc::scoped_refptr buffer( + frame->video_frame_buffer()); + libyuv::I420ToARGB(buffer->DataY(), buffer->StrideY(), + buffer->DataU(), buffer->StrideU(), + buffer->DataV(), buffer->StrideV(), + image_.get(), bmi_.bmiHeader.biWidth * 4, + buffer->width(), buffer->height()); InvalidateRect(handle(), 0, 0); } diff --git a/webrtc/media/devices/gtkvideorenderer.cc b/webrtc/media/devices/gtkvideorenderer.cc index 8fad53d794..91fa933e0d 100644 --- a/webrtc/media/devices/gtkvideorenderer.cc +++ b/webrtc/media/devices/gtkvideorenderer.cc @@ -16,7 +16,7 @@ #include #include -#include "webrtc/media/base/videocommon.h" +#include "libyuv/convert_argb.h" #include "webrtc/media/engine/webrtcvideoframe.h" namespace cricket { @@ -92,11 +92,13 @@ void GtkVideoRenderer::OnFrame(const VideoFrame& video_frame) { } // convert I420 frame to ABGR format, which is accepted by GTK - frame.ConvertToRgbBuffer(cricket::FOURCC_ABGR, - image_.get(), - static_cast(frame.width()) * - frame.height() * 4, - frame.width() * 4); + rtc::scoped_refptr buffer( + frame.video_frame_buffer()); + libyuv::I420ToARGB(buffer->DataY(), buffer->StrideY(), + buffer->DataU(), buffer->StrideU(), + buffer->DataV(), buffer->StrideV(), + image_.get(), frame.width() * 4, + buffer->width(), buffer->height()); ScopedGdkLock lock; diff --git a/webrtc/media/engine/webrtcvideoframe.cc b/webrtc/media/engine/webrtcvideoframe.cc index 3102b05f77..ecae7b1b22 100644 --- a/webrtc/media/engine/webrtcvideoframe.cc +++ b/webrtc/media/engine/webrtcvideoframe.cc @@ -103,15 +103,6 @@ webrtc::VideoRotation WebRtcVideoFrame::rotation() const { return rotation_; } -size_t WebRtcVideoFrame::ConvertToRgbBuffer(uint32_t to_fourcc, - uint8_t* buffer, - size_t size, - int stride_rgb) const { - RTC_CHECK(video_frame_buffer_); - RTC_CHECK(video_frame_buffer_->native_handle() == nullptr); - return VideoFrame::ConvertToRgbBuffer(to_fourcc, buffer, size, stride_rgb); -} - bool WebRtcVideoFrame::Reset(uint32_t format, int w, int h, diff --git a/webrtc/media/engine/webrtcvideoframe.h b/webrtc/media/engine/webrtcvideoframe.h index cfbef519aa..9228476286 100644 --- a/webrtc/media/engine/webrtcvideoframe.h +++ b/webrtc/media/engine/webrtcvideoframe.h @@ -93,11 +93,6 @@ class WebRtcVideoFrame : public VideoFrame { webrtc::VideoRotation rotation() const override; - size_t ConvertToRgbBuffer(uint32_t to_fourcc, - uint8_t* buffer, - size_t size, - int stride_rgb) const override; - const VideoFrame* GetCopyWithRotationApplied() const override; protected: diff --git a/webrtc/media/engine/webrtcvideoframe_unittest.cc b/webrtc/media/engine/webrtcvideoframe_unittest.cc index 336cff4a97..37153bb47b 100644 --- a/webrtc/media/engine/webrtcvideoframe_unittest.cc +++ b/webrtc/media/engine/webrtcvideoframe_unittest.cc @@ -93,9 +93,6 @@ TEST_WEBRTCVIDEOFRAME(ConstructARGBWide) TEST_WEBRTCVIDEOFRAME(ConstructBGRA) TEST_WEBRTCVIDEOFRAME(Construct24BG) TEST_WEBRTCVIDEOFRAME(ConstructRaw) -TEST_WEBRTCVIDEOFRAME(ConstructRGB565) -TEST_WEBRTCVIDEOFRAME(ConstructARGB1555) -TEST_WEBRTCVIDEOFRAME(ConstructARGB4444) TEST_WEBRTCVIDEOFRAME(ConstructI420Mirror) TEST_WEBRTCVIDEOFRAME(ConstructI420Rotate0) @@ -154,72 +151,6 @@ TEST_WEBRTCVIDEOFRAME(ValidateI420HugeSize) // Re-evaluate once WebRTC switches to libyuv // TEST_WEBRTCVIDEOFRAME(ConstructYuy2AllSizes) // TEST_WEBRTCVIDEOFRAME(ConstructARGBAllSizes) -TEST_WEBRTCVIDEOFRAME(ConvertToABGRBuffer) -TEST_WEBRTCVIDEOFRAME(ConvertToABGRBufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToABGRBufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToARGB1555BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToARGB4444BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToARGBBuffer) -TEST_WEBRTCVIDEOFRAME(ConvertToARGBBufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToARGBBufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToBGRABuffer) -TEST_WEBRTCVIDEOFRAME(ConvertToBGRABufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToBGRABufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToRAWBuffer) -TEST_WEBRTCVIDEOFRAME(ConvertToRAWBufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToRAWBufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToRGB24Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertToRGB24BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToRGB24BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToRGB565Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertToRGB565BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToRGB565BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToI400Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertToI400BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToI400BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToYUY2Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertToYUY2BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToYUY2BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBuffer) -TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertToUYVYBufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBuffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromABGRBufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGB1555BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGB4444BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBuffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromARGBBufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABuffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromBGRABufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBuffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromRAWBufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromRGB24BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromRGB565BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromI400Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromI400BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromI400BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2Buffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2BufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromYUY2BufferInverted) -TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBuffer) -TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBufferStride) -TEST_WEBRTCVIDEOFRAME(ConvertFromUYVYBufferInverted) // TEST_WEBRTCVIDEOFRAME(ConvertToI422Buffer) // TEST_WEBRTCVIDEOFRAME(ConstructARGBBlackWhitePixel)