Index: media/capture/screen_capture_device_core.cc |
diff --git a/media/capture/screen_capture_device_core.cc b/media/capture/screen_capture_device_core.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a8993e7ef897b64691500c27b04eedcfbf7d2293 |
--- /dev/null |
+++ b/media/capture/screen_capture_device_core.cc |
@@ -0,0 +1,138 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "media/capture/screen_capture_device_core.h" |
+ |
+#include "base/bind.h" |
+#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "base/strings/stringprintf.h" |
+#include "base/threading/thread_checker.h" |
+ |
+namespace media { |
+ |
+namespace { |
+ |
+void DeleteCaptureMachine( |
+ scoped_ptr<VideoCaptureMachine> capture_machine) { |
+ capture_machine.reset(); |
+} |
+ |
+} // namespace |
+ |
+void ScreenCaptureDeviceCore::AllocateAndStart( |
+ const VideoCaptureParams& params, |
+ scoped_ptr<VideoCaptureDevice::Client> client) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ if (state_ != kIdle) { |
+ DVLOG(1) << "Allocate() invoked when not in state Idle."; |
+ return; |
+ } |
+ |
+ if (params.requested_format.frame_rate <= 0) { |
+ std::string error_msg("Invalid frame_rate: "); |
+ error_msg += base::DoubleToString(params.requested_format.frame_rate); |
+ DVLOG(1) << error_msg; |
+ client->OnError(error_msg); |
+ return; |
+ } |
+ |
+ if (params.requested_format.pixel_format != PIXEL_FORMAT_I420 && |
+ params.requested_format.pixel_format != PIXEL_FORMAT_TEXTURE) { |
+ std::string error_msg = base::StringPrintf( |
+ "unsupported format: %d", params.requested_format.pixel_format); |
+ DVLOG(1) << error_msg; |
+ client->OnError(error_msg); |
+ return; |
+ } |
+ |
+ if (params.requested_format.frame_size.IsEmpty()) { |
+ std::string error_msg = |
+ "invalid frame size: " + params.requested_format.frame_size.ToString(); |
+ DVLOG(1) << error_msg; |
+ client->OnError(error_msg); |
+ return; |
+ } |
+ |
+ oracle_proxy_ = new ThreadSafeCaptureOracle(client.Pass(), params); |
+ |
+ capture_machine_->Start( |
+ oracle_proxy_, |
+ params, |
+ base::Bind(&ScreenCaptureDeviceCore::CaptureStarted, AsWeakPtr())); |
+ |
+ TransitionStateTo(kCapturing); |
+} |
+ |
+void ScreenCaptureDeviceCore::StopAndDeAllocate() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ if (state_ != kCapturing) |
+ return; |
+ |
+ oracle_proxy_->Stop(); |
+ oracle_proxy_ = NULL; |
+ |
+ TransitionStateTo(kIdle); |
+ |
+ capture_machine_->Stop(base::Bind(&base::DoNothing)); |
+} |
+ |
+void ScreenCaptureDeviceCore::CaptureStarted(bool success) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!success) { |
+ std::string reason("Failed to start capture machine."); |
+ DVLOG(1) << reason; |
+ Error(reason); |
+ } |
+} |
+ |
+ScreenCaptureDeviceCore::ScreenCaptureDeviceCore( |
+ scoped_ptr<VideoCaptureMachine> capture_machine) |
+ : state_(kIdle), |
+ capture_machine_(capture_machine.Pass()) { |
+ DCHECK(capture_machine_.get()); |
+} |
+ |
+ScreenCaptureDeviceCore::~ScreenCaptureDeviceCore() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK_NE(state_, kCapturing); |
+ if (capture_machine_) { |
+ capture_machine_->Stop(base::Bind(&DeleteCaptureMachine, |
+ base::Passed(&capture_machine_))); |
+ } |
+ DVLOG(1) << "ScreenCaptureDeviceCore@" << this << " destroying."; |
+} |
+ |
+void ScreenCaptureDeviceCore::TransitionStateTo(State next_state) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+#ifndef NDEBUG |
+ static const char* kStateNames[] = { |
+ "Idle", "Allocated", "Capturing", "Error" |
+ }; |
+ DVLOG(1) << "State change: " << kStateNames[state_] |
+ << " --> " << kStateNames[next_state]; |
+#endif |
+ |
+ state_ = next_state; |
+} |
+ |
+void ScreenCaptureDeviceCore::Error(const std::string& reason) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ if (state_ == kIdle) |
+ return; |
+ |
+ if (oracle_proxy_.get()) |
+ oracle_proxy_->ReportError(reason); |
+ |
+ StopAndDeAllocate(); |
+ TransitionStateTo(kError); |
+} |
+ |
+} // namespace media |