1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
content / browser / media / capture / aura_window_to_mojo_device_adapter.cc [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/media/capture/aura_window_to_mojo_device_adapter.h"
#include <memory>
#include <utility>
#include "base/task/bind_post_task.h"
#include "content/browser/media/capture/aura_window_video_capture_device.h"
#include "content/public/browser/desktop_media_id.h"
#include "mojo/public/cpp/bindings/callback_helpers.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "services/video_capture/public/cpp/receiver_mojo_to_media_adapter.h"
#include "services/video_capture/public/mojom/device.mojom.h"
namespace content {
AuraWindowToMojoDeviceAdapter::AuraWindowToMojoDeviceAdapter(
const content::DesktopMediaID& device_id)
: device_(
std::make_unique<content::AuraWindowVideoCaptureDevice>(device_id)) {}
AuraWindowToMojoDeviceAdapter::~AuraWindowToMojoDeviceAdapter() {
// The AuraWindowVideoCaptureDevice expects to be stopped before being
// destroyed. The video_capture::mojom::Device interface doesn't expose any
// stop method; but we expect to be started as a self-owned receiver, so being
// destroyed is the same as being told to stop.
device_->StopAndDeAllocate();
}
void AuraWindowToMojoDeviceAdapter::Start(
const media::VideoCaptureParams& requested_settings,
mojo::PendingRemote<video_capture::mojom::VideoFrameHandler>
handler_pending_remote) {
auto receiver = std::make_unique<video_capture::ReceiverMojoToMediaAdapter>(
mojo::Remote(std::move(handler_pending_remote)));
device_->AllocateAndStartWithReceiver(requested_settings,
std::move(receiver));
}
void AuraWindowToMojoDeviceAdapter::MaybeSuspend() {
device_->MaybeSuspend();
}
void AuraWindowToMojoDeviceAdapter::Resume() {
device_->Resume();
}
void AuraWindowToMojoDeviceAdapter::GetPhotoState(
GetPhotoStateCallback callback) {
media::VideoCaptureDevice::GetPhotoStateCallback scoped_callback =
mojo::WrapCallbackWithDefaultInvokeIfNotRun(
base::BindPostTaskToCurrentDefault(std::move(callback)), nullptr);
device_->GetPhotoState(std::move(scoped_callback));
}
void AuraWindowToMojoDeviceAdapter::SetPhotoOptions(
media::mojom::PhotoSettingsPtr settings,
SetPhotoOptionsCallback callback) {
media::mojom::ImageCapture::SetPhotoOptionsCallback scoped_callback =
mojo::WrapCallbackWithDefaultInvokeIfNotRun(
base::BindPostTaskToCurrentDefault(std::move(callback)), false);
device_->SetPhotoOptions(std::move(settings), std::move(scoped_callback));
}
void AuraWindowToMojoDeviceAdapter::TakePhoto(TakePhotoCallback callback) {
media::mojom::ImageCapture::TakePhotoCallback scoped_callback =
mojo::WrapCallbackWithDefaultInvokeIfNotRun(
base::BindPostTaskToCurrentDefault(std::move(callback)), nullptr);
device_->TakePhoto(std::move(scoped_callback));
}
void AuraWindowToMojoDeviceAdapter::ProcessFeedback(
const media::VideoCaptureFeedback& feedback) {
device_->OnUtilizationReport(feedback);
}
void AuraWindowToMojoDeviceAdapter::RequestRefreshFrame() {
device_->RequestRefreshFrame();
}
} // namespace content