Delete cricket::VideoFrame::ConvertToRgbBuffer.

Users are updated to call libyuv functions directly. Also delete
related unit tests.

BUG=webrtc:5682

Review-Url: https://codereview.webrtc.org/2287233002
Cr-Commit-Position: refs/heads/master@{#14013}
This commit is contained in:
nisse 2016-09-01 01:06:23 -07:00 committed by Commit bot
parent 275afc5d2e
commit 9f8e37b6f8
12 changed files with 43 additions and 608 deletions

View File

@ -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",

View File

@ -14,6 +14,7 @@
#include <gtk/gtk.h>
#include <stddef.h>
#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<webrtc::VideoFrameBuffer> 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();

View File

@ -12,6 +12,7 @@
#include <math.h>
#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<webrtc::VideoFrameBuffer> 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);
}

View File

@ -12,10 +12,6 @@
#include <string.h>
#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<size_t>(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,

View File

@ -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

View File

@ -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<uint8_t[]> 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<uint8_t[]> 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<uint8_t[]> 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<uint8_t[]> 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<uint8_t[]> 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<uint8_t[]> 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;

View File

@ -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<size_t>(frame.width()) *
frame.height() * 4,
frame.width() * 4);
rtc::scoped_refptr<webrtc::VideoFrameBuffer> 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.

View File

@ -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<webrtc::VideoFrameBuffer> 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);
}

View File

@ -16,7 +16,7 @@
#include <glib.h>
#include <gtk/gtk.h>
#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<size_t>(frame.width()) *
frame.height() * 4,
frame.width() * 4);
rtc::scoped_refptr<webrtc::VideoFrameBuffer> 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;

View File

@ -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,

View File

@ -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:

View File

@ -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)