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

Unified Diff: media/video/capture/screen/screen_capture_device.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
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_);
}
« no previous file with comments | « media/video/capture/screen/screen_capture_data.cc ('k') | media/video/capture/screen/screen_capture_device_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698