Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1304)

Unified Diff: remoting/codec/codec_test.cc

Issue 13983010: Use webrtc::DesktopCapturer for screen capturer implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/codec/codec_test.h ('k') | remoting/codec/video_decoder_vp8_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/codec/codec_test.cc
diff --git a/remoting/codec/codec_test.cc b/remoting/codec/codec_test.cc
index af8b11bb362fcf09ad31dbe77e0e341e393c31e1..efcc872ab61f39c9a724bb28b068865f1c9f1a8b 100644
--- a/remoting/codec/codec_test.cc
+++ b/remoting/codec/codec_test.cc
@@ -14,27 +14,33 @@
#include "remoting/codec/video_encoder.h"
#include "remoting/base/util.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
+
+using webrtc::DesktopRect;
+using webrtc::DesktopSize;
namespace {
const int kBytesPerPixel = 4;
// Some sample rects for testing.
-std::vector<std::vector<SkIRect> > MakeTestRectLists(const SkISize& size) {
- std::vector<std::vector<SkIRect> > rect_lists;
- std::vector<SkIRect> rects;
- rects.push_back(SkIRect::MakeXYWH(0, 0, size.width(), size.height()));
+std::vector<std::vector<DesktopRect> > MakeTestRectLists(DesktopSize size) {
+ std::vector<std::vector<DesktopRect> > rect_lists;
+ std::vector<DesktopRect> rects;
+ rects.push_back(DesktopRect::MakeXYWH(0, 0, size.width(), size.height()));
rect_lists.push_back(rects);
rects.clear();
- rects.push_back(SkIRect::MakeXYWH(0, 0, size.width() / 2, size.height() / 2));
+ rects.push_back(DesktopRect::MakeXYWH(
+ 0, 0, size.width() / 2, size.height() / 2));
rect_lists.push_back(rects);
rects.clear();
- rects.push_back(SkIRect::MakeXYWH(size.width() / 2, size.height() / 2,
- size.width() / 2, size.height() / 2));
+ rects.push_back(DesktopRect::MakeXYWH(
+ size.width() / 2, size.height() / 2,
+ size.width() / 2, size.height() / 2));
rect_lists.push_back(rects);
rects.clear();
- rects.push_back(SkIRect::MakeXYWH(16, 16, 16, 16));
- rects.push_back(SkIRect::MakeXYWH(128, 64, 32, 32));
+ rects.push_back(DesktopRect::MakeXYWH(16, 16, 16, 16));
+ rects.push_back(DesktopRect::MakeXYWH(128, 64, 32, 32));
rect_lists.push_back(rects);
return rect_lists;
}
@@ -72,10 +78,10 @@ class VideoEncoderMessageTester {
++begin_rect_;
if (strict_) {
- SkIRect rect = rects_.front();
+ DesktopRect rect = rects_.front();
rects_.pop_front();
- EXPECT_EQ(rect.fLeft, packet->format().x());
- EXPECT_EQ(rect.fTop, packet->format().y());
+ EXPECT_EQ(rect.left(), packet->format().x());
+ EXPECT_EQ(rect.top(), packet->format().y());
EXPECT_EQ(rect.width(), packet->format().width());
EXPECT_EQ(rect.height(), packet->format().height());
}
@@ -107,7 +113,7 @@ class VideoEncoderMessageTester {
strict_ = strict;
}
- void AddRects(const SkIRect* rects, int count) {
+ void AddRects(const DesktopRect* rects, int count) {
rects_.insert(rects_.begin() + rects_.size(), rects, rects + count);
added_rects_ += count;
}
@@ -125,15 +131,16 @@ class VideoEncoderMessageTester {
State state_;
bool strict_;
- std::deque<SkIRect> rects_;
+ std::deque<DesktopRect> rects_;
DISALLOW_COPY_AND_ASSIGN(VideoEncoderMessageTester);
};
class VideoDecoderTester {
public:
- VideoDecoderTester(VideoDecoder* decoder, const SkISize& screen_size,
- const SkISize& view_size)
+ VideoDecoderTester(VideoDecoder* decoder,
+ const DesktopSize& screen_size,
+ const DesktopSize& view_size)
: screen_size_(screen_size),
view_size_(view_size),
strict_(false),
@@ -141,11 +148,12 @@ class VideoDecoderTester {
image_data_.reset(new uint8[
view_size_.width() * view_size_.height() * kBytesPerPixel]);
EXPECT_TRUE(image_data_.get());
- decoder_->Initialize(screen_size_);
+ decoder_->Initialize(
+ SkISize::Make(screen_size_.width(), screen_size_.height()));
}
void Reset() {
- expected_region_.setEmpty();
+ expected_region_.Clear();
update_region_.setEmpty();
}
@@ -165,11 +173,12 @@ class VideoDecoderTester {
}
void RenderFrame() {
- decoder_->RenderFrame(view_size_,
- SkIRect::MakeSize(view_size_),
- image_data_.get(),
- view_size_.width() * kBytesPerPixel,
- &update_region_);
+ decoder_->RenderFrame(
+ SkISize::Make(view_size_.width(), view_size_.height()),
+ SkIRect::MakeWH(view_size_.width(), view_size_.height()),
+ image_data_.get(),
+ view_size_.width() * kBytesPerPixel,
+ &update_region_);
}
void ReceivedScopedPacket(scoped_ptr<VideoPacket> packet) {
@@ -180,34 +189,46 @@ class VideoDecoderTester {
strict_ = strict;
}
- void set_capture_data(scoped_refptr<media::ScreenCaptureData> data) {
- capture_data_ = data;
+ void set_frame(webrtc::DesktopFrame* frame) {
+ frame_ = frame;
}
- void AddRects(const SkIRect* rects, int count) {
- SkRegion new_rects;
- new_rects.setRects(rects, count);
- AddRegion(new_rects);
+ void AddRects(const DesktopRect* rects, int count) {
+ for (int i = 0; i < count; ++i) {
+ expected_region_.AddRect(rects[i]);
+ }
}
- void AddRegion(const SkRegion& region) {
- expected_region_.op(region, SkRegion::kUnion_Op);
+ void AddRegion(const webrtc::DesktopRegion& region) {
+ expected_region_.AddRegion(region);
}
void VerifyResults() {
if (!strict_)
return;
- ASSERT_TRUE(capture_data_.get());
+ ASSERT_TRUE(frame_);
// Test the content of the update region.
- EXPECT_EQ(expected_region_, update_region_);
+ //
+ // TODO(sergeyu): Change this to use DesktopRegion when it's capable of
+ // merging the rectangles.
+ SkRegion expected_region;
+ for (webrtc::DesktopRegion::Iterator it(expected_region_);
+ !it.IsAtEnd(); it.Advance()) {
+ expected_region.op(
+ SkIRect::MakeXYWH(it.rect().top(), it.rect().left(),
+ it.rect().width(), it.rect().height()),
+ SkRegion::kUnion_Op);
+ }
+ EXPECT_EQ(expected_region, update_region_);
+
for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) {
const int stride = view_size_.width() * kBytesPerPixel;
- EXPECT_EQ(stride, capture_data_->stride());
+ EXPECT_EQ(stride, frame_->stride());
const int offset = stride * i.rect().top() +
kBytesPerPixel * i.rect().left();
- const uint8* original = capture_data_->data() + offset;
+ const uint8* original = frame_->data() + offset;
const uint8* decoded = image_data_.get() + offset;
const int row_size = kBytesPerPixel * i.rect().width();
for (int y = 0; y < i.rect().height(); ++y) {
@@ -265,14 +286,14 @@ class VideoDecoderTester {
}
private:
- SkISize screen_size_;
- SkISize view_size_;
+ DesktopSize screen_size_;
+ DesktopSize view_size_;
bool strict_;
- SkRegion expected_region_;
+ webrtc::DesktopRegion expected_region_;
SkRegion update_region_;
VideoDecoder* decoder_;
scoped_ptr<uint8[]> image_data_;
- scoped_refptr<media::ScreenCaptureData> capture_data_;
+ webrtc::DesktopFrame* frame_;
DISALLOW_COPY_AND_ASSIGN(VideoDecoderTester);
};
@@ -301,7 +322,7 @@ class VideoEncoderTester {
}
}
- void AddRects(const SkIRect* rects, int count) {
+ void AddRects(const DesktopRect* rects, int count) {
message_tester_->AddRects(rects, count);
}
@@ -317,34 +338,30 @@ class VideoEncoderTester {
DISALLOW_COPY_AND_ASSIGN(VideoEncoderTester);
};
-scoped_refptr<media::ScreenCaptureData> PrepareEncodeData(
- const SkISize& size,
- scoped_ptr<uint8[]>* memory) {
- int memory_size = size.width() * size.height() * kBytesPerPixel;
-
- memory->reset(new uint8[memory_size]);
+scoped_ptr<webrtc::DesktopFrame> PrepareFrame(const DesktopSize& size) {
+ scoped_ptr<webrtc::DesktopFrame> frame(new webrtc::BasicDesktopFrame(size));
srand(0);
+ int memory_size = size.width() * size.height() * kBytesPerPixel;
for (int i = 0; i < memory_size; ++i) {
- (*memory)[i] = rand() % 256;
+ frame->data()[i] = rand() % 256;
}
- scoped_refptr<media::ScreenCaptureData> data = new media::ScreenCaptureData(
- memory->get(), size.width() * kBytesPerPixel, size);
- return data;
+ return frame.Pass();
}
static void TestEncodingRects(VideoEncoder* encoder,
VideoEncoderTester* tester,
- scoped_refptr<media::ScreenCaptureData> data,
- const SkIRect* rects, int count) {
- data->mutable_dirty_region().setEmpty();
+ webrtc::DesktopFrame* frame,
+ const DesktopRect* rects,
+ int count) {
+ frame->mutable_updated_region()->Clear();
for (int i = 0; i < count; ++i) {
- data->mutable_dirty_region().op(rects[i], SkRegion::kUnion_Op);
+ frame->mutable_updated_region()->AddRect(rects[i]);
}
tester->AddRects(rects, count);
- encoder->Encode(data, true, base::Bind(
+ encoder->Encode(frame, base::Bind(
&VideoEncoderTester::DataAvailable, base::Unretained(tester)));
}
@@ -356,18 +373,15 @@ void TestVideoEncoder(VideoEncoder* encoder, bool strict) {
VideoEncoderTester tester(&message_tester);
- scoped_ptr<uint8[]> memory;
-
for (size_t xi = 0; xi < arraysize(kSizes); ++xi) {
for (size_t yi = 0; yi < arraysize(kSizes); ++yi) {
- SkISize size = SkISize::Make(kSizes[xi], kSizes[yi]);
- scoped_refptr<media::ScreenCaptureData> data =
- PrepareEncodeData(size, &memory);
- std::vector<std::vector<SkIRect> > test_rect_lists =
+ DesktopSize size = DesktopSize(kSizes[xi], kSizes[yi]);
+ scoped_ptr<webrtc::DesktopFrame> frame = PrepareFrame(size);
+ std::vector<std::vector<DesktopRect> > test_rect_lists =
MakeTestRectLists(size);
for (size_t i = 0; i < test_rect_lists.size(); ++i) {
- const std::vector<SkIRect>& test_rects = test_rect_lists[i];
- TestEncodingRects(encoder, &tester, data,
+ const std::vector<DesktopRect>& test_rects = test_rect_lists[i];
+ TestEncodingRects(encoder, &tester, frame.get(),
&test_rects[0], test_rects.size());
}
}
@@ -377,68 +391,69 @@ void TestVideoEncoder(VideoEncoder* encoder, bool strict) {
static void TestEncodeDecodeRects(VideoEncoder* encoder,
VideoEncoderTester* encoder_tester,
VideoDecoderTester* decoder_tester,
- scoped_refptr<media::ScreenCaptureData> data,
- const SkIRect* rects, int count) {
- data->mutable_dirty_region().setRects(rects, count);
+ webrtc::DesktopFrame* frame,
+ const DesktopRect* rects, int count) {
+ frame->mutable_updated_region()->Clear();
+ for (int i = 0; i < count; ++i) {
+ frame->mutable_updated_region()->AddRect(rects[i]);
+ }
encoder_tester->AddRects(rects, count);
decoder_tester->AddRects(rects, count);
// Generate random data for the updated region.
srand(0);
for (int i = 0; i < count; ++i) {
- const int bytes_per_pixel = 4; // Because of RGB32 on previous line.
- const int row_size = bytes_per_pixel * rects[i].width();
- uint8* memory = data->data() +
- data->stride() * rects[i].top() +
- bytes_per_pixel * rects[i].left();
+ const int row_size =
+ webrtc::DesktopFrame::kBytesPerPixel * rects[i].width();
+ uint8* memory = frame->data() +
+ frame->stride() * rects[i].top() +
+ webrtc::DesktopFrame::kBytesPerPixel * rects[i].left();
for (int y = 0; y < rects[i].height(); ++y) {
for (int x = 0; x < row_size; ++x)
memory[x] = rand() % 256;
- memory += data->stride();
+ memory += frame->stride();
}
}
- encoder->Encode(data, true, base::Bind(&VideoEncoderTester::DataAvailable,
- base::Unretained(encoder_tester)));
+ encoder->Encode(frame, base::Bind(&VideoEncoderTester::DataAvailable,
+ base::Unretained(encoder_tester)));
decoder_tester->VerifyResults();
decoder_tester->Reset();
}
void TestVideoEncoderDecoder(
VideoEncoder* encoder, VideoDecoder* decoder, bool strict) {
- SkISize kSize = SkISize::Make(320, 240);
+ DesktopSize kSize = DesktopSize(320, 240);
VideoEncoderMessageTester message_tester;
message_tester.set_strict(strict);
VideoEncoderTester encoder_tester(&message_tester);
- scoped_ptr<uint8[]> memory;
- scoped_refptr<media::ScreenCaptureData> data =
- PrepareEncodeData(kSize, &memory);
+ scoped_ptr<webrtc::DesktopFrame> frame = PrepareFrame(kSize);
VideoDecoderTester decoder_tester(decoder, kSize, kSize);
decoder_tester.set_strict(strict);
- decoder_tester.set_capture_data(data);
+ decoder_tester.set_frame(frame.get());
encoder_tester.set_decoder_tester(&decoder_tester);
- std::vector<std::vector<SkIRect> > test_rect_lists = MakeTestRectLists(kSize);
+ std::vector<std::vector<DesktopRect> > test_rect_lists =
+ MakeTestRectLists(kSize);
for (size_t i = 0; i < test_rect_lists.size(); ++i) {
- const std::vector<SkIRect> test_rects = test_rect_lists[i];
- TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data,
- &test_rects[0], test_rects.size());
+ const std::vector<DesktopRect> test_rects = test_rect_lists[i];
+ TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester,
+ frame.get(), &test_rects[0], test_rects.size());
}
}
-static void FillWithGradient(uint8* memory, const SkISize& frame_size,
- const SkIRect& rect) {
- for (int j = rect.top(); j < rect.bottom(); ++j) {
- uint8* p = memory + ((j * frame_size.width()) + rect.left()) * 4;
- for (int i = rect.left(); i < rect.right(); ++i) {
- *p++ = static_cast<uint8>((255.0 * i) / frame_size.width());
- *p++ = static_cast<uint8>((164.0 * j) / frame_size.height());
- *p++ = static_cast<uint8>((82.0 * (i + j)) /
- (frame_size.width() + frame_size.height()));
+static void FillWithGradient(webrtc::DesktopFrame* frame) {
+ for (int j = 0; j < frame->size().height(); ++j) {
+ uint8* p = frame->data() + j * frame->stride();
+ for (int i = 0; i < frame->size().width(); ++i) {
+ *p++ = (255.0 * i) / frame->size().width();
+ *p++ = (164.0 * j) / frame->size().height();
+ *p++ = (82.0 * (i + j)) /
+ (frame->size().width() + frame->size().height());
*p++ = 0;
}
}
@@ -446,42 +461,38 @@ static void FillWithGradient(uint8* memory, const SkISize& frame_size,
void TestVideoEncoderDecoderGradient(VideoEncoder* encoder,
VideoDecoder* decoder,
- const SkISize& screen_size,
- const SkISize& view_size,
+ const DesktopSize& screen_size,
+ const DesktopSize& view_size,
double max_error_limit,
double mean_error_limit) {
- SkIRect screen_rect = SkIRect::MakeSize(screen_size);
- scoped_ptr<uint8[]> screen_data(new uint8[
- screen_size.width() * screen_size.height() * kBytesPerPixel]);
- FillWithGradient(screen_data.get(), screen_size, screen_rect);
-
- SkIRect view_rect = SkIRect::MakeSize(view_size);
- scoped_ptr<uint8[]> expected_view_data(new uint8[
- view_size.width() * view_size.height() * kBytesPerPixel]);
- FillWithGradient(expected_view_data.get(), view_size, view_rect);
+ scoped_ptr<webrtc::BasicDesktopFrame> frame(
+ new webrtc::BasicDesktopFrame(screen_size));
+ FillWithGradient(frame.get());
+ frame->mutable_updated_region()->SetRect(DesktopRect::MakeSize(screen_size));
- scoped_refptr<media::ScreenCaptureData> capture_data =
- new media::ScreenCaptureData(
- screen_data.get(), screen_size.width() * kBytesPerPixel, screen_size);
- capture_data->mutable_dirty_region().op(screen_rect, SkRegion::kUnion_Op);
+ scoped_ptr<webrtc::BasicDesktopFrame> expected_result(
+ new webrtc::BasicDesktopFrame(view_size));
+ FillWithGradient(expected_result.get());
VideoDecoderTester decoder_tester(decoder, screen_size, view_size);
- decoder_tester.set_capture_data(capture_data);
- decoder_tester.AddRegion(capture_data->dirty_region());
+ decoder_tester.set_frame(frame.get());
+ decoder_tester.AddRegion(frame->updated_region());
- encoder->Encode(capture_data, true,
+ encoder->Encode(frame.get(),
base::Bind(&VideoDecoderTester::ReceivedScopedPacket,
base::Unretained(&decoder_tester)));
- decoder_tester.VerifyResultsApprox(expected_view_data.get(),
+ decoder_tester.VerifyResultsApprox(expected_result->data(),
max_error_limit, mean_error_limit);
// Check that the decoder correctly re-renders the frame if its client
// invalidates the frame.
decoder_tester.ResetRenderedData();
- decoder->Invalidate(view_size, SkRegion(view_rect));
+ decoder->Invalidate(
+ SkISize::Make(view_size.width(), view_size.height()),
+ SkRegion(SkIRect::MakeWH(view_size.width(), view_size.height())));
decoder_tester.RenderFrame();
- decoder_tester.VerifyResultsApprox(expected_view_data.get(),
+ decoder_tester.VerifyResultsApprox(expected_result->data(),
max_error_limit, mean_error_limit);
}
« no previous file with comments | « remoting/codec/codec_test.h ('k') | remoting/codec/video_decoder_vp8_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698