| Index: media/video/capture/screen/screen_capturer_fake.cc
|
| diff --git a/media/video/capture/screen/screen_capturer_fake.cc b/media/video/capture/screen/screen_capturer_fake.cc
|
| index ff4dedbd4eabde183f66855d7b1eda3616b5801b..416bcbb2bf6bf76ea1afa59523b52e21ede83df2 100644
|
| --- a/media/video/capture/screen/screen_capturer_fake.cc
|
| +++ b/media/video/capture/screen/screen_capturer_fake.cc
|
| @@ -4,8 +4,9 @@
|
|
|
| #include "media/video/capture/screen/screen_capturer_fake.h"
|
|
|
| +#include "base/logging.h"
|
| #include "base/time.h"
|
| -#include "media/video/capture/screen/screen_capture_data.h"
|
| +#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
|
|
|
| namespace media {
|
|
|
| @@ -24,66 +25,73 @@ COMPILE_ASSERT((kBoxWidth % kSpeed == 0) && (kWidth % kSpeed == 0) &&
|
| sizes_must_be_multiple_of_kSpeed);
|
|
|
| ScreenCapturerFake::ScreenCapturerFake()
|
| - : size_(SkISize::Make(0, 0)),
|
| + : callback_(NULL),
|
| + mouse_shape_observer_(NULL),
|
| bytes_per_row_(0),
|
| box_pos_x_(0),
|
| box_pos_y_(0),
|
| box_speed_x_(kSpeed),
|
| - box_speed_y_(kSpeed),
|
| - current_buffer_(0) {
|
| + box_speed_y_(kSpeed) {
|
| ScreenConfigurationChanged();
|
| }
|
|
|
| ScreenCapturerFake::~ScreenCapturerFake() {
|
| }
|
|
|
| -void ScreenCapturerFake::Start(Delegate* delegate) {
|
| - delegate_ = delegate;
|
| +void ScreenCapturerFake::Start(Callback* callback) {
|
| + DCHECK(!callback_);
|
| + DCHECK(callback);
|
| + callback_ = callback;
|
| +}
|
| +
|
| +void ScreenCapturerFake::Capture(const webrtc::DesktopRegion& region) {
|
| + base::Time capture_start_time = base::Time::Now();
|
|
|
| - // Create memory for the buffers.
|
| - int buffer_size = size_.height() * bytes_per_row_;
|
| - for (int i = 0; i < kNumBuffers; i++) {
|
| - shared_buffers_[i] = delegate_->CreateSharedBuffer(buffer_size);
|
| - if (shared_buffers_[i]) {
|
| - buffers_[i] = reinterpret_cast<uint8*>(shared_buffers_[i]->ptr());
|
| + queue_.MoveToNextFrame();
|
| +
|
| + if (!queue_.current_frame()) {
|
| + int buffer_size = size_.height() * bytes_per_row_;
|
| + webrtc::SharedMemory* shared_memory =
|
| + callback_->CreateSharedMemory(buffer_size);
|
| + scoped_ptr<webrtc::DesktopFrame> frame;
|
| + webrtc::DesktopSize frame_size(size_.width(), size_.height());
|
| + if (shared_memory) {
|
| + frame.reset(new webrtc::SharedMemoryDesktopFrame(
|
| + frame_size, bytes_per_row_, shared_memory));
|
| } else {
|
| - private_buffers_[i].reset(new uint8[buffer_size]);
|
| - buffers_[i] = private_buffers_[i].get();
|
| + frame.reset(new webrtc::BasicDesktopFrame(frame_size));
|
| }
|
| + queue_.ReplaceCurrentFrame(frame.Pass());
|
| }
|
| -}
|
| -
|
| -void ScreenCapturerFake::CaptureFrame() {
|
| - base::Time capture_start_time = base::Time::Now();
|
|
|
| + DCHECK(queue_.current_frame());
|
| GenerateImage();
|
| - helper_.InvalidateScreen(size_);
|
| -
|
| - SkRegion invalid_region;
|
| - helper_.SwapInvalidRegion(&invalid_region);
|
|
|
| - current_buffer_ = (current_buffer_ + 1) % kNumBuffers;
|
| -
|
| - scoped_refptr<ScreenCaptureData> capture_data(new ScreenCaptureData(
|
| - buffers_[current_buffer_], bytes_per_row_, size_));
|
| - capture_data->mutable_dirty_region() = invalid_region;
|
| -
|
| - helper_.set_size_most_recent(size_);
|
| + queue_.current_frame()->mutable_updated_region()->SetRect(
|
| + webrtc::DesktopRect::MakeSize(size_));
|
| + queue_.current_frame()->set_capture_time_ms(
|
| + (base::Time::Now() - capture_start_time).InMillisecondsRoundedUp());
|
|
|
| - capture_data->set_shared_buffer(shared_buffers_[current_buffer_]);
|
| + callback_->OnCaptureCompleted(queue_.current_frame()->Share());
|
| +}
|
|
|
| - capture_data->set_capture_time_ms(
|
| - (base::Time::Now() - capture_start_time).InMillisecondsRoundedUp());
|
| - delegate_->OnCaptureCompleted(capture_data);
|
| +void ScreenCapturerFake::SetMouseShapeObserver(
|
| + MouseShapeObserver* mouse_shape_observer) {
|
| + DCHECK(!mouse_shape_observer_);
|
| + DCHECK(mouse_shape_observer);
|
| + mouse_shape_observer_ = mouse_shape_observer;
|
| }
|
|
|
| void ScreenCapturerFake::GenerateImage() {
|
| - memset(buffers_[current_buffer_], 0xff,
|
| - size_.width() * size_.height() * ScreenCaptureData::kBytesPerPixel);
|
| + webrtc::DesktopFrame* frame = queue_.current_frame();
|
| +
|
| + const int kBytesPerPixel = webrtc::DesktopFrame::kBytesPerPixel;
|
| +
|
| + memset(frame->data(), 0xff,
|
| + size_.width() * size_.height() * kBytesPerPixel);
|
|
|
| - uint8* row = buffers_[current_buffer_] +
|
| - (box_pos_y_ * size_.width() + box_pos_x_) *
|
| - ScreenCaptureData::kBytesPerPixel;
|
| + uint8* row = frame->data() +
|
| + (box_pos_y_ * size_.width() + box_pos_x_) * kBytesPerPixel;
|
|
|
| box_pos_x_ += box_speed_x_;
|
| if (box_pos_x_ + kBoxWidth >= size_.width() || box_pos_x_ == 0)
|
| @@ -102,18 +110,19 @@ void ScreenCapturerFake::GenerateImage() {
|
| int r = x * 255 / kBoxWidth;
|
| int g = y * 255 / kBoxHeight;
|
| int b = 255 - (x * 255 / kBoxWidth);
|
| - row[x * ScreenCaptureData::kBytesPerPixel] = r;
|
| - row[x * ScreenCaptureData::kBytesPerPixel + 1] = g;
|
| - row[x * ScreenCaptureData::kBytesPerPixel + 2] = b;
|
| - row[x * ScreenCaptureData::kBytesPerPixel + 3] = 0xff;
|
| + row[x * kBytesPerPixel] = r;
|
| + row[x * kBytesPerPixel + 1] = g;
|
| + row[x * kBytesPerPixel + 2] = b;
|
| + row[x * kBytesPerPixel + 3] = 0xff;
|
| }
|
| row += bytes_per_row_;
|
| }
|
| }
|
|
|
| void ScreenCapturerFake::ScreenConfigurationChanged() {
|
| - size_ = SkISize::Make(kWidth, kHeight);
|
| - bytes_per_row_ = size_.width() * ScreenCaptureData::kBytesPerPixel;
|
| + size_.set(kWidth, kHeight);
|
| + queue_.Reset();
|
| + bytes_per_row_ = size_.width() * webrtc::DesktopFrame::kBytesPerPixel;
|
| }
|
|
|
| } // namespace media
|
|
|