blob: 4ebd30713239ae7409584fde6b0a73f1e09b858e [file] [log] [blame]
// Copyright 2017 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 "content/browser/renderer_host/media/service_launched_video_capture_device.h"
#include <utility>
#include "base/bind.h"
#include "base/bind_helpers.h"
namespace content {
ServiceLaunchedVideoCaptureDevice::ServiceLaunchedVideoCaptureDevice(
video_capture::mojom::VideoSourcePtr source,
video_capture::mojom::PushVideoStreamSubscriptionPtr subscription,
base::OnceClosure connection_lost_cb)
: source_(std::move(source)),
subscription_(std::move(subscription)),
connection_lost_cb_(std::move(connection_lost_cb)) {
// Unretained |this| is safe, because |this| owns |source_|.
source_.set_connection_error_handler(
base::BindOnce(&ServiceLaunchedVideoCaptureDevice::
OnLostConnectionToSourceOrSubscription,
base::Unretained(this)));
// Unretained |this| is safe, because |this| owns |subscription_|.
subscription_.set_connection_error_handler(
base::BindOnce(&ServiceLaunchedVideoCaptureDevice::
OnLostConnectionToSourceOrSubscription,
base::Unretained(this)));
}
ServiceLaunchedVideoCaptureDevice::~ServiceLaunchedVideoCaptureDevice() {
DCHECK(sequence_checker_.CalledOnValidSequence());
}
void ServiceLaunchedVideoCaptureDevice::GetPhotoState(
media::VideoCaptureDevice::GetPhotoStateCallback callback) {
DCHECK(sequence_checker_.CalledOnValidSequence());
subscription_->GetPhotoState(base::BindOnce(
&ServiceLaunchedVideoCaptureDevice::OnGetPhotoStateResponse,
base::Unretained(this), std::move(callback)));
}
void ServiceLaunchedVideoCaptureDevice::SetPhotoOptions(
media::mojom::PhotoSettingsPtr settings,
media::VideoCaptureDevice::SetPhotoOptionsCallback callback) {
DCHECK(sequence_checker_.CalledOnValidSequence());
subscription_->SetPhotoOptions(
std::move(settings),
base::BindOnce(
&ServiceLaunchedVideoCaptureDevice::OnSetPhotoOptionsResponse,
base::Unretained(this), std::move(callback)));
}
void ServiceLaunchedVideoCaptureDevice::TakePhoto(
media::VideoCaptureDevice::TakePhotoCallback callback) {
DCHECK(sequence_checker_.CalledOnValidSequence());
TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("video_and_image_capture"),
"ServiceLaunchedVideoCaptureDevice::TakePhoto",
TRACE_EVENT_SCOPE_PROCESS);
subscription_->TakePhoto(
base::BindOnce(&ServiceLaunchedVideoCaptureDevice::OnTakePhotoResponse,
base::Unretained(this), std::move(callback)));
}
void ServiceLaunchedVideoCaptureDevice::MaybeSuspendDevice() {
DCHECK(sequence_checker_.CalledOnValidSequence());
subscription_->Suspend(base::DoNothing());
}
void ServiceLaunchedVideoCaptureDevice::ResumeDevice() {
DCHECK(sequence_checker_.CalledOnValidSequence());
subscription_->Resume();
}
void ServiceLaunchedVideoCaptureDevice::RequestRefreshFrame() {
DCHECK(sequence_checker_.CalledOnValidSequence());
// Nothing to do here. The video capture service does not support refresh
// frames.
}
void ServiceLaunchedVideoCaptureDevice::SetDesktopCaptureWindowIdAsync(
gfx::NativeViewId window_id,
base::OnceClosure done_cb) {
// This method should only be called for desktop capture devices.
// The video_capture Mojo service does not support desktop capture devices
// (yet) and should not be used for it.
NOTREACHED();
}
void ServiceLaunchedVideoCaptureDevice::OnUtilizationReport(
int frame_feedback_id,
double utilization) {
DCHECK(sequence_checker_.CalledOnValidSequence());
// Nothing to do here. The video capture service does not support utilization
// reporting.
}
void ServiceLaunchedVideoCaptureDevice::
OnLostConnectionToSourceOrSubscription() {
DCHECK(sequence_checker_.CalledOnValidSequence());
source_.reset();
subscription_.reset();
std::move(connection_lost_cb_).Run();
}
void ServiceLaunchedVideoCaptureDevice::OnGetPhotoStateResponse(
media::VideoCaptureDevice::GetPhotoStateCallback callback,
media::mojom::PhotoStatePtr capabilities) const {
if (!capabilities)
return;
std::move(callback).Run(std::move(capabilities));
}
void ServiceLaunchedVideoCaptureDevice::OnSetPhotoOptionsResponse(
media::VideoCaptureDevice::SetPhotoOptionsCallback callback,
bool success) {
if (!success)
return;
std::move(callback).Run(true);
}
void ServiceLaunchedVideoCaptureDevice::OnTakePhotoResponse(
media::VideoCaptureDevice::TakePhotoCallback callback,
media::mojom::BlobPtr blob) {
if (!blob)
return;
std::move(callback).Run(std::move(blob));
}
} // namespace content