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:
parent
275afc5d2e
commit
9f8e37b6f8
@ -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",
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user