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

Side by Side Diff: services/video_capture/device_factory_media_to_mojo_adapter.cc

Issue 2824883005: [Mojo Video Capture] Stop service when last client disconnects. (Closed)
Patch Set: Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "services/video_capture/device_factory_media_to_mojo_adapter.h" 5 #include "services/video_capture/device_factory_media_to_mojo_adapter.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 default; 72 default;
73 73
74 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry::ActiveDeviceEntry( 74 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry::ActiveDeviceEntry(
75 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry&& other) = default; 75 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry&& other) = default;
76 76
77 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry& 77 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry&
78 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry::operator=( 78 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry::operator=(
79 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry&& other) = default; 79 DeviceFactoryMediaToMojoAdapter::ActiveDeviceEntry&& other) = default;
80 80
81 DeviceFactoryMediaToMojoAdapter::DeviceFactoryMediaToMojoAdapter( 81 DeviceFactoryMediaToMojoAdapter::DeviceFactoryMediaToMojoAdapter(
82 std::unique_ptr<service_manager::ServiceContextRef> service_ref,
82 std::unique_ptr<media::VideoCaptureSystem> capture_system, 83 std::unique_ptr<media::VideoCaptureSystem> capture_system,
83 const media::VideoCaptureJpegDecoderFactoryCB& 84 const media::VideoCaptureJpegDecoderFactoryCB&
84 jpeg_decoder_factory_callback) 85 jpeg_decoder_factory_callback)
85 : capture_system_(std::move(capture_system)), 86 : service_ref_(std::move(service_ref)),
86 jpeg_decoder_factory_callback_(jpeg_decoder_factory_callback) {} 87 capture_system_(std::move(capture_system)),
88 jpeg_decoder_factory_callback_(jpeg_decoder_factory_callback),
89 weak_factory_(this) {}
87 90
88 DeviceFactoryMediaToMojoAdapter::~DeviceFactoryMediaToMojoAdapter() = default; 91 DeviceFactoryMediaToMojoAdapter::~DeviceFactoryMediaToMojoAdapter() = default;
89 92
90 void DeviceFactoryMediaToMojoAdapter::GetDeviceInfos( 93 void DeviceFactoryMediaToMojoAdapter::GetDeviceInfos(
91 const GetDeviceInfosCallback& callback) { 94 const GetDeviceInfosCallback& callback) {
92 capture_system_->GetDeviceInfosAsync( 95 capture_system_->GetDeviceInfosAsync(
93 base::Bind(&TranslateDeviceInfos, callback)); 96 base::Bind(&TranslateDeviceInfos, callback));
97 has_called_get_device_infos_ = true;
94 } 98 }
95 99
96 void DeviceFactoryMediaToMojoAdapter::CreateDevice( 100 void DeviceFactoryMediaToMojoAdapter::CreateDevice(
97 const std::string& device_id, 101 const std::string& device_id,
98 mojom::DeviceRequest device_request, 102 mojom::DeviceRequest device_request,
99 const CreateDeviceCallback& callback) { 103 const CreateDeviceCallback& callback) {
100 auto active_device_iter = active_devices_by_id_.find(device_id); 104 auto active_device_iter = active_devices_by_id_.find(device_id);
101 if (active_device_iter != active_devices_by_id_.end()) { 105 if (active_device_iter != active_devices_by_id_.end()) {
102 // The requested device is already in use. 106 // The requested device is already in use.
103 // Revoke the access and close the device, then bind to the new request. 107 // Revoke the access and close the device, then bind to the new request.
104 ActiveDeviceEntry& device_entry = active_device_iter->second; 108 ActiveDeviceEntry& device_entry = active_device_iter->second;
105 device_entry.binding->Unbind(); 109 device_entry.binding->Unbind();
106 device_entry.device->Stop(); 110 device_entry.device->Stop();
107 device_entry.binding->Bind(std::move(device_request)); 111 device_entry.binding->Bind(std::move(device_request));
108 device_entry.binding->set_connection_error_handler(base::Bind( 112 device_entry.binding->set_connection_error_handler(base::Bind(
109 &DeviceFactoryMediaToMojoAdapter::OnClientConnectionErrorOrClose, 113 &DeviceFactoryMediaToMojoAdapter::OnClientConnectionErrorOrClose,
110 base::Unretained(this), device_id)); 114 base::Unretained(this), device_id));
111 callback.Run(mojom::DeviceAccessResultCode::SUCCESS); 115 callback.Run(mojom::DeviceAccessResultCode::SUCCESS);
112 return; 116 return;
113 } 117 }
114 118
119 if (!has_called_get_device_infos_) {
120 capture_system_->GetDeviceInfosAsync(base::Bind(
121 &DeviceFactoryMediaToMojoAdapter::DiscardDeviceInfosAndCallContinuation,
122 weak_factory_.GetWeakPtr(),
123 base::Bind(&DeviceFactoryMediaToMojoAdapter::CreateAndAddNewDevice,
124 weak_factory_.GetWeakPtr(), device_id,
125 base::Passed(&device_request), callback)));
126 } else {
127 CreateAndAddNewDevice(device_id, std::move(device_request),
128 std::move(callback));
129 }
mcasas 2017/04/26 22:12:31 This if-else reads complex, what about: const a
chfremer 2017/04/26 23:33:35 Done.
130 }
131
132 void DeviceFactoryMediaToMojoAdapter::DiscardDeviceInfosAndCallContinuation(
mcasas 2017/04/26 22:12:31 This doesn't need to be a member: make it file-sta
chfremer 2017/04/26 23:33:35 Done.
133 base::Closure continuation,
134 const std::vector<media::VideoCaptureDeviceInfo>&) {
135 continuation.Run();
136 }
137
138 void DeviceFactoryMediaToMojoAdapter::CreateAndAddNewDevice(
139 const std::string& device_id,
140 mojom::DeviceRequest device_request,
141 const CreateDeviceCallback& callback) {
115 std::unique_ptr<media::VideoCaptureDevice> media_device = 142 std::unique_ptr<media::VideoCaptureDevice> media_device =
116 capture_system_->CreateDevice(device_id); 143 capture_system_->CreateDevice(device_id);
117 if (media_device == nullptr) { 144 if (media_device == nullptr) {
118 callback.Run(mojom::DeviceAccessResultCode::ERROR_DEVICE_NOT_FOUND); 145 callback.Run(mojom::DeviceAccessResultCode::ERROR_DEVICE_NOT_FOUND);
119 return; 146 return;
120 } 147 }
121 148
122 // Add entry to active_devices to keep track of it 149 // Add entry to active_devices to keep track of it
123 ActiveDeviceEntry device_entry; 150 ActiveDeviceEntry device_entry;
124 device_entry.device = base::MakeUnique<DeviceMediaToMojoAdapter>( 151 device_entry.device = base::MakeUnique<DeviceMediaToMojoAdapter>(
125 std::move(media_device), jpeg_decoder_factory_callback_); 152 service_ref_->Clone(), std::move(media_device),
153 jpeg_decoder_factory_callback_);
126 device_entry.binding = base::MakeUnique<mojo::Binding<mojom::Device>>( 154 device_entry.binding = base::MakeUnique<mojo::Binding<mojom::Device>>(
127 device_entry.device.get(), std::move(device_request)); 155 device_entry.device.get(), std::move(device_request));
128 device_entry.binding->set_connection_error_handler(base::Bind( 156 device_entry.binding->set_connection_error_handler(base::Bind(
129 &DeviceFactoryMediaToMojoAdapter::OnClientConnectionErrorOrClose, 157 &DeviceFactoryMediaToMojoAdapter::OnClientConnectionErrorOrClose,
130 base::Unretained(this), device_id)); 158 base::Unretained(this), device_id));
131 active_devices_by_id_[device_id] = std::move(device_entry); 159 active_devices_by_id_[device_id] = std::move(device_entry);
132 160
133 callback.Run(mojom::DeviceAccessResultCode::SUCCESS); 161 callback.Run(mojom::DeviceAccessResultCode::SUCCESS);
134 } 162 }
135 163
136 void DeviceFactoryMediaToMojoAdapter::OnClientConnectionErrorOrClose( 164 void DeviceFactoryMediaToMojoAdapter::OnClientConnectionErrorOrClose(
137 const std::string& device_id) { 165 const std::string& device_id) {
138 active_devices_by_id_[device_id].device->Stop(); 166 active_devices_by_id_[device_id].device->Stop();
139 active_devices_by_id_.erase(device_id); 167 active_devices_by_id_.erase(device_id);
140 } 168 }
141 169
142 } // namespace video_capture 170 } // namespace video_capture
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698