| Index: media/video/capture/screen/screen_capture_device.cc
|
| diff --git a/media/video/capture/screen/screen_capture_device.cc b/media/video/capture/screen/screen_capture_device.cc
|
| index a4f55bd9cbbe384d94daa4a11163de658c9aac52..546112b04f71cad931a758bec545a8052bc4dcc5 100644
|
| --- a/media/video/capture/screen/screen_capture_device.cc
|
| +++ b/media/video/capture/screen/screen_capture_device.cc
|
| @@ -10,9 +10,9 @@
|
| #include "base/sequenced_task_runner.h"
|
| #include "base/synchronization/lock.h"
|
| #include "media/video/capture/screen/mouse_cursor_shape.h"
|
| -#include "media/video/capture/screen/screen_capture_data.h"
|
| #include "third_party/skia/include/core/SkCanvas.h"
|
| #include "third_party/skia/include/core/SkDevice.h"
|
| +#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
|
|
|
| namespace media {
|
|
|
| @@ -22,7 +22,7 @@ const int kBytesPerPixel = 4;
|
|
|
| class ScreenCaptureDevice::Core
|
| : public base::RefCountedThreadSafe<Core>,
|
| - public ScreenCapturer::Delegate {
|
| + public webrtc::DesktopCapturer::Callback {
|
| public:
|
| explicit Core(scoped_refptr<base::SequencedTaskRunner> task_runner);
|
|
|
| @@ -39,17 +39,14 @@ class ScreenCaptureDevice::Core
|
| void Stop();
|
| void DeAllocate();
|
|
|
| - // ScreenCapturer::Delegate interface. Called by |screen_capturer_| on the
|
| - // |task_runner_|.
|
| - virtual void OnCaptureCompleted(
|
| - scoped_refptr<ScreenCaptureData> capture_data) OVERRIDE;
|
| - virtual void OnCursorShapeChanged(
|
| - scoped_ptr<MouseCursorShape> cursor_shape) OVERRIDE;
|
| -
|
| private:
|
| friend class base::RefCountedThreadSafe<Core>;
|
| virtual ~Core();
|
|
|
| + // webrtc::DesktopCapturer::Callback interface
|
| + virtual webrtc::SharedMemory* CreateSharedMemory(size_t size) OVERRIDE;
|
| + virtual void OnCaptureCompleted(webrtc::DesktopFrame* frame) OVERRIDE;
|
| +
|
| // Helper methods that run on the |task_runner_|. Posted from the
|
| // corresponding public methods.
|
| void DoAllocate(int frame_rate);
|
| @@ -88,7 +85,7 @@ class ScreenCaptureDevice::Core
|
| // capture at least one frame. Once screen size is known it's stored in
|
| // |frame_size_|.
|
| bool waiting_for_frame_size_;
|
| - SkISize frame_size_;
|
| + webrtc::DesktopSize frame_size_;
|
| SkBitmap resized_bitmap_;
|
|
|
| // True between DoStart() and DoStop(). Can't just check |event_handler_|
|
| @@ -152,16 +149,28 @@ void ScreenCaptureDevice::Core::DeAllocate() {
|
| task_runner_->PostTask(FROM_HERE, base::Bind(&Core::DoDeAllocate, this));
|
| }
|
|
|
| +webrtc::SharedMemory*
|
| +ScreenCaptureDevice::Core::CreateSharedMemory(size_t size) {
|
| + return NULL;
|
| +}
|
| +
|
| void ScreenCaptureDevice::Core::OnCaptureCompleted(
|
| - scoped_refptr<ScreenCaptureData> capture_data) {
|
| + webrtc::DesktopFrame* frame) {
|
| DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
| DCHECK(capture_in_progress_);
|
| - DCHECK(!capture_data->size().isEmpty());
|
|
|
| capture_in_progress_ = false;
|
|
|
| + if (!frame) {
|
| + LOG(ERROR) << "Failed to capture a frame.";
|
| + event_handler_->OnError();
|
| + return;
|
| + }
|
| +
|
| + scoped_ptr<webrtc::DesktopFrame> owned_frame(frame);
|
| +
|
| if (waiting_for_frame_size_) {
|
| - frame_size_ = capture_data->size();
|
| + frame_size_ = frame->size();
|
| waiting_for_frame_size_ = false;
|
|
|
| // Inform the EventHandler of the video frame dimensions and format.
|
| @@ -183,9 +192,9 @@ void ScreenCaptureDevice::Core::OnCaptureCompleted(
|
| return;
|
|
|
| size_t buffer_size = frame_size_.width() * frame_size_.height() *
|
| - ScreenCaptureData::kBytesPerPixel;
|
| + webrtc::DesktopFrame::kBytesPerPixel;
|
|
|
| - if (capture_data->size() == frame_size_) {
|
| + if (frame->size().equals(frame_size_)) {
|
| // If the captured frame matches the requested size, we don't need to
|
| // resize it.
|
| resized_bitmap_.reset();
|
| @@ -193,8 +202,7 @@ void ScreenCaptureDevice::Core::OnCaptureCompleted(
|
| base::AutoLock auto_lock(event_handler_lock_);
|
| if (event_handler_) {
|
| event_handler_->OnIncomingCapturedFrame(
|
| - capture_data->data(), buffer_size, base::Time::Now(),
|
| - 0, false, false);
|
| + frame->data(), buffer_size, base::Time::Now(), 0, false, false);
|
| }
|
| return;
|
| }
|
| @@ -203,7 +211,7 @@ void ScreenCaptureDevice::Core::OnCaptureCompleted(
|
| // is stored to |resized_bitmap_|. Only regions of the screen that are
|
| // changing are copied.
|
|
|
| - SkRegion dirty_region = capture_data->dirty_region();
|
| + webrtc::DesktopRegion dirty_region = frame->updated_region();
|
|
|
| if (resized_bitmap_.width() != frame_size_.width() ||
|
| resized_bitmap_.height() != frame_size_.height()) {
|
| @@ -211,13 +219,13 @@ void ScreenCaptureDevice::Core::OnCaptureCompleted(
|
| frame_size_.width(), frame_size_.height());
|
| resized_bitmap_.setIsOpaque(true);
|
| resized_bitmap_.allocPixels();
|
| - dirty_region.setRect(SkIRect::MakeSize(frame_size_));
|
| + dirty_region.SetRect(webrtc::DesktopRect::MakeSize(frame_size_));
|
| }
|
|
|
| float scale_x = static_cast<float>(frame_size_.width()) /
|
| - capture_data->size().width();
|
| + frame->size().width();
|
| float scale_y = static_cast<float>(frame_size_.height()) /
|
| - capture_data->size().height();
|
| + frame->size().height();
|
| float scale;
|
| float x, y;
|
| // Center the image in case aspect ratio is different.
|
| @@ -236,16 +244,17 @@ void ScreenCaptureDevice::Core::OnCaptureCompleted(
|
| SkCanvas canvas(&device);
|
| canvas.scale(scale, scale);
|
|
|
| - int source_stride = capture_data->stride();
|
| - for (SkRegion::Iterator i(dirty_region); !i.done(); i.next()) {
|
| + int source_stride = frame->stride();
|
| + for (webrtc::DesktopRegion::Iterator i(dirty_region); !i.IsAtEnd();
|
| + i.Advance()) {
|
| SkBitmap source_bitmap;
|
| source_bitmap.setConfig(SkBitmap::kARGB_8888_Config,
|
| i.rect().width(), i.rect().height(),
|
| source_stride);
|
| source_bitmap.setIsOpaque(true);
|
| source_bitmap.setPixels(
|
| - capture_data->data() + i.rect().top() * source_stride +
|
| - i.rect().left() * ScreenCaptureData::kBytesPerPixel);
|
| + frame->data() + i.rect().top() * source_stride +
|
| + i.rect().left() * webrtc::DesktopFrame::kBytesPerPixel);
|
| canvas.drawBitmap(source_bitmap, i.rect().left() + x / scale,
|
| i.rect().top() + y / scale, NULL);
|
| }
|
| @@ -258,13 +267,6 @@ void ScreenCaptureDevice::Core::OnCaptureCompleted(
|
| }
|
| }
|
|
|
| -void ScreenCaptureDevice::Core::OnCursorShapeChanged(
|
| - scoped_ptr<MouseCursorShape> cursor_shape) {
|
| - // TODO(sergeyu): Store mouse cursor shape and then render it to each captured
|
| - // frame. crbug.com/173265 .
|
| - DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
| -}
|
| -
|
| void ScreenCaptureDevice::Core::DoAllocate(int frame_rate) {
|
| DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
|
|
| @@ -338,16 +340,14 @@ void ScreenCaptureDevice::Core::OnCaptureTimer() {
|
| }
|
|
|
| void ScreenCaptureDevice::Core::DoCapture() {
|
| + DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
| DCHECK(!capture_in_progress_);
|
|
|
| capture_in_progress_ = true;
|
| - screen_capturer_->CaptureFrame();
|
| + screen_capturer_->Capture(webrtc::DesktopRegion());
|
|
|
| - // Assume that ScreenCapturer always calls OnCaptureCompleted()
|
| - // callback before it returns.
|
| - //
|
| - // TODO(sergeyu): Fix ScreenCapturer to return video frame
|
| - // synchronously instead of using Delegate interface.
|
| + // Currently only synchronous implementations of DesktopCapturer are
|
| + // supported.
|
| DCHECK(!capture_in_progress_);
|
| }
|
|
|
|
|