| 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); | 
| } | 
|  | 
|  |