Index: content/browser/renderer_host/media/service_video_capture_device_launcher.cc |
diff --git a/content/browser/renderer_host/media/service_video_capture_device_launcher.cc b/content/browser/renderer_host/media/service_video_capture_device_launcher.cc |
index 94d4e0617c3ab107963fd72f075933bd7f451e66..b74cf52865a5a817f84c712489d31c1dc6316391 100644 |
--- a/content/browser/renderer_host/media/service_video_capture_device_launcher.cc |
+++ b/content/browser/renderer_host/media/service_video_capture_device_launcher.cc |
@@ -4,13 +4,65 @@ |
#include "content/browser/renderer_host/media/service_video_capture_device_launcher.h" |
+#include "content/browser/renderer_host/media/service_launched_video_capture_device.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "media/capture/video/video_frame_receiver_on_task_runner.h" |
+#include "mojo/public/cpp/bindings/strong_binding.h" |
+#include "services/video_capture/public/cpp/receiver_media_to_mojo_adapter.h" |
+ |
namespace content { |
+namespace { |
+ |
+void ConcludeLaunchDeviceWithSuccess( |
+ bool abort_requested, |
+ const media::VideoCaptureParams& params, |
+ video_capture::mojom::DevicePtr device, |
+ base::WeakPtr<media::VideoFrameReceiver> receiver, |
+ VideoCaptureDeviceLauncher::Callbacks* callbacks, |
+ base::OnceClosure done_cb) { |
+ if (abort_requested) { |
+ device.reset(); |
+ callbacks->OnDeviceLaunchAborted(); |
+ base::ResetAndReturn(&done_cb).Run(); |
+ return; |
+ } |
+ |
+ auto receiver_adapter = |
+ base::MakeUnique<video_capture::ReceiverMediaToMojoAdapter>( |
+ base::MakeUnique<media::VideoFrameReceiverOnTaskRunner>( |
+ std::move(receiver), |
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::IO))); |
+ video_capture::mojom::ReceiverPtr receiver_proxy; |
+ mojo::MakeStrongBinding<video_capture::mojom::Receiver>( |
+ std::move(receiver_adapter), mojo::MakeRequest(&receiver_proxy)); |
+ device->Start(params, std::move(receiver_proxy)); |
+ callbacks->OnDeviceLaunched( |
+ base::MakeUnique<ServiceLaunchedVideoCaptureDevice>(std::move(device))); |
+ base::ResetAndReturn(&done_cb).Run(); |
+} |
+ |
+void ConcludeLaunchDeviceWithFailure( |
+ bool abort_requested, |
+ VideoCaptureDeviceLauncher::Callbacks* callbacks, |
+ base::OnceClosure done_cb) { |
+ if (abort_requested) |
+ callbacks->OnDeviceLaunchAborted(); |
+ else |
+ callbacks->OnDeviceLaunchFailed(); |
+ base::ResetAndReturn(&done_cb).Run(); |
+} |
+ |
+} // anonymous namespace |
+ |
ServiceVideoCaptureDeviceLauncher::ServiceVideoCaptureDeviceLauncher( |
video_capture::mojom::DeviceFactoryPtr* device_factory) |
- : device_factory_(device_factory) {} |
+ : device_factory_(device_factory), state_(State::READY_TO_LAUNCH) {} |
-ServiceVideoCaptureDeviceLauncher::~ServiceVideoCaptureDeviceLauncher() {} |
+ServiceVideoCaptureDeviceLauncher::~ServiceVideoCaptureDeviceLauncher() { |
+ DCHECK(sequence_checker_.CalledOnValidSequence()); |
+ DCHECK(state_ == State::READY_TO_LAUNCH); |
+} |
void ServiceVideoCaptureDeviceLauncher::LaunchDeviceAsync( |
const std::string& device_id, |
@@ -19,11 +71,63 @@ void ServiceVideoCaptureDeviceLauncher::LaunchDeviceAsync( |
base::WeakPtr<media::VideoFrameReceiver> receiver, |
Callbacks* callbacks, |
base::OnceClosure done_cb) { |
- NOTIMPLEMENTED(); |
+ DCHECK(sequence_checker_.CalledOnValidSequence()); |
+ DCHECK(state_ == State::READY_TO_LAUNCH); |
+ |
+ if (stream_type != content::MEDIA_DEVICE_VIDEO_CAPTURE) { |
+ // This launcher only supports MEDIA_DEVICE_VIDEO_CAPTURE. |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ if (!device_factory_->is_bound()) { |
+ // This can happen when the ServiceVideoCaptureProvider owning |
+ // |device_factory_| loses connection to the service process and resets |
+ // |device_factory_|. |
+ ConcludeLaunchDeviceWithFailure(false, callbacks, std::move(done_cb)); |
+ return; |
+ } |
+ video_capture::mojom::DevicePtr device; |
+ (*device_factory_) |
+ ->CreateDevice( |
+ device_id, mojo::MakeRequest(&device), |
+ base::Bind( |
+ // Use of Unretained |this| is safe, because |done_cb| guarantees |
+ // that |this| stays alive. |
+ &ServiceVideoCaptureDeviceLauncher::OnCreateDeviceCallback, |
+ base::Unretained(this), params, base::Passed(&device), |
+ std::move(receiver), callbacks, base::Passed(&done_cb))); |
+ state_ = State::DEVICE_START_IN_PROGRESS; |
} |
void ServiceVideoCaptureDeviceLauncher::AbortLaunch() { |
- NOTIMPLEMENTED(); |
+ DCHECK(sequence_checker_.CalledOnValidSequence()); |
+ if (state_ == State::DEVICE_START_IN_PROGRESS) |
+ state_ = State::DEVICE_START_ABORTING; |
+} |
+ |
+void ServiceVideoCaptureDeviceLauncher::OnCreateDeviceCallback( |
+ const media::VideoCaptureParams& params, |
+ video_capture::mojom::DevicePtr device, |
+ base::WeakPtr<media::VideoFrameReceiver> receiver, |
+ Callbacks* callbacks, |
+ base::OnceClosure done_cb, |
+ video_capture::mojom::DeviceAccessResultCode result_code) { |
+ DCHECK(sequence_checker_.CalledOnValidSequence()); |
+ const bool abort_requested = (state_ == State::DEVICE_START_ABORTING); |
+ state_ = State::READY_TO_LAUNCH; |
+ switch (result_code) { |
+ case video_capture::mojom::DeviceAccessResultCode::SUCCESS: |
+ ConcludeLaunchDeviceWithSuccess(abort_requested, params, |
+ std::move(device), std::move(receiver), |
+ callbacks, std::move(done_cb)); |
+ return; |
+ case video_capture::mojom::DeviceAccessResultCode::ERROR_DEVICE_NOT_FOUND: |
+ case video_capture::mojom::DeviceAccessResultCode::NOT_INITIALIZED: |
+ ConcludeLaunchDeviceWithFailure(abort_requested, callbacks, |
+ std::move(done_cb)); |
+ return; |
+ } |
} |
} // namespace content |