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

Side by Side Diff: content/renderer/media/video_capture_service.cc

Issue 960103002: Rename VideoCaptureImplManager to VideoCaptureService Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix some nits Created 5 years, 10 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // Implementation notes about interactions with VideoCaptureImpl. 5 // Implementation notes about interactions with VideoCaptureImpl.
6 // 6 //
7 // How is VideoCaptureImpl used: 7 // How is VideoCaptureImpl used:
8 // 8 //
9 // VideoCaptureImpl is an IO thread object while VideoCaptureImplManager 9 // VideoCaptureImpl is an IO thread object while VideoCaptureService
10 // lives only on the render thread. It is only possible to access an 10 // lives only on the render thread. It is only possible to access an
11 // object of VideoCaptureImpl via a task on the IO thread. 11 // object of VideoCaptureImpl via a task on the IO thread.
12 // 12 //
13 // How is VideoCaptureImpl deleted: 13 // How is VideoCaptureImpl deleted:
14 // 14 //
15 // A task is posted to the IO thread to delete a VideoCaptureImpl. 15 // A task is posted to the IO thread to delete a VideoCaptureImpl.
16 // Immediately after that the pointer to it is dropped. This means no 16 // Immediately after that the pointer to it is dropped. This means no
17 // access to this VideoCaptureImpl object is possible on the render 17 // access to this VideoCaptureImpl object is possible on the render
18 // thread. Also note that VideoCaptureImpl does not post task to itself. 18 // thread. Also note that VideoCaptureImpl does not post task to itself.
19 // 19 //
20 // The use of Unretained: 20 // The use of Unretained:
21 // 21 //
22 // We make sure deletion is the last task on the IO thread for a 22 // We make sure deletion is the last task on the IO thread for a
23 // VideoCaptureImpl object. This allows the use of Unretained() binding. 23 // VideoCaptureImpl object. This allows the use of Unretained() binding.
24 24
25 #include "content/renderer/media/video_capture_impl_manager.h" 25 #include "content/renderer/media/video_capture_service.h"
26 26
27 #include "base/bind.h" 27 #include "base/bind.h"
28 #include "base/bind_helpers.h" 28 #include "base/bind_helpers.h"
29 #include "content/child/child_process.h" 29 #include "content/child/child_process.h"
30 #include "content/renderer/media/video_capture_impl.h" 30 #include "content/renderer/media/video_capture_impl.h"
31 #include "content/renderer/media/video_capture_message_filter.h" 31 #include "content/renderer/media/video_capture_message_filter.h"
32 #include "media/base/bind_to_current_loop.h" 32 #include "media/base/bind_to_current_loop.h"
33 33
34 namespace content { 34 namespace content {
35 35
36 VideoCaptureImplManager::VideoCaptureImplManager() 36 VideoCaptureService::VideoCaptureService()
37 : next_client_id_(0), 37 : next_client_id_(0),
38 filter_(new VideoCaptureMessageFilter()), 38 filter_(new VideoCaptureMessageFilter()),
39 weak_factory_(this) { 39 weak_factory_(this) {
40 } 40 }
41 41
42 VideoCaptureImplManager::~VideoCaptureImplManager() { 42 VideoCaptureService::~VideoCaptureService() {
43 DCHECK(thread_checker_.CalledOnValidThread()); 43 DCHECK(thread_checker_.CalledOnValidThread());
44 if (devices_.empty()) 44 if (devices_.empty())
45 return; 45 return;
46 // Forcibly release all video capture resources. 46 // Forcibly release all video capture resources.
47 for (VideoCaptureDeviceMap::iterator it = devices_.begin(); 47 for (VideoCaptureDeviceMap::iterator it = devices_.begin();
48 it != devices_.end(); ++it) { 48 it != devices_.end(); ++it) {
49 VideoCaptureImpl* impl = it->second.second; 49 VideoCaptureImpl* impl = it->second.second;
50 ChildProcess::current()->io_message_loop_proxy()->PostTask( 50 ChildProcess::current()->io_message_loop_proxy()->PostTask(
51 FROM_HERE, 51 FROM_HERE,
52 base::Bind(&VideoCaptureImpl::DeInit, 52 base::Bind(&VideoCaptureImpl::DeInit,
53 base::Unretained(impl))); 53 base::Unretained(impl)));
54 ChildProcess::current()->io_message_loop_proxy()->PostTask( 54 ChildProcess::current()->io_message_loop_proxy()->PostTask(
55 FROM_HERE, 55 FROM_HERE,
56 base::Bind(&base::DeletePointer<VideoCaptureImpl>, 56 base::Bind(&base::DeletePointer<VideoCaptureImpl>,
57 base::Unretained(impl))); 57 base::Unretained(impl)));
58 } 58 }
59 devices_.clear(); 59 devices_.clear();
60 } 60 }
61 61
62 base::Closure VideoCaptureImplManager::UseDevice( 62 base::Closure VideoCaptureService::UseDevice(
63 media::VideoCaptureSessionId id) { 63 media::VideoCaptureSessionId id) {
64 DCHECK(thread_checker_.CalledOnValidThread()); 64 DCHECK(thread_checker_.CalledOnValidThread());
65 65
66 VideoCaptureImpl* impl = NULL; 66 VideoCaptureImpl* impl = NULL;
67 VideoCaptureDeviceMap::iterator it = devices_.find(id); 67 VideoCaptureDeviceMap::iterator it = devices_.find(id);
68 if (it == devices_.end()) { 68 if (it == devices_.end()) {
69 impl = CreateVideoCaptureImplForTesting(id, filter_.get()); 69 impl = CreateVideoCaptureImplForTesting(id, filter_.get());
70 if (!impl) 70 if (!impl)
71 impl = new VideoCaptureImpl(id, filter_.get()); 71 impl = new VideoCaptureImpl(id, filter_.get());
72 devices_[id] = std::make_pair(1, impl); 72 devices_[id] = std::make_pair(1, impl);
73 ChildProcess::current()->io_message_loop_proxy()->PostTask( 73 ChildProcess::current()->io_message_loop_proxy()->PostTask(
74 FROM_HERE, 74 FROM_HERE,
75 base::Bind(&VideoCaptureImpl::Init, 75 base::Bind(&VideoCaptureImpl::Init,
76 base::Unretained(impl))); 76 base::Unretained(impl)));
77 } else { 77 } else {
78 ++it->second.first; 78 ++it->second.first;
79 } 79 }
80 return base::Bind(&VideoCaptureImplManager::UnrefDevice, 80 return base::Bind(&VideoCaptureService::UnrefDevice,
81 weak_factory_.GetWeakPtr(), id); 81 weak_factory_.GetWeakPtr(), id);
82 } 82 }
83 83
84 base::Closure VideoCaptureImplManager::StartCapture( 84 base::Closure VideoCaptureService::StartCapture(
85 media::VideoCaptureSessionId id, 85 media::VideoCaptureSessionId id,
86 const media::VideoCaptureParams& params, 86 const media::VideoCaptureParams& params,
87 const VideoCaptureStateUpdateCB& state_update_cb, 87 const VideoCaptureStateUpdateCB& state_update_cb,
88 const VideoCaptureDeliverFrameCB& deliver_frame_cb) { 88 const VideoCaptureDeliverFrameCB& deliver_frame_cb) {
89 DCHECK(thread_checker_.CalledOnValidThread()); 89 DCHECK(thread_checker_.CalledOnValidThread());
90 VideoCaptureDeviceMap::iterator it = devices_.find(id); 90 VideoCaptureDeviceMap::iterator it = devices_.find(id);
91 DCHECK(it != devices_.end()); 91 DCHECK(it != devices_.end());
92 VideoCaptureImpl* impl = it->second.second; 92 VideoCaptureImpl* impl = it->second.second;
93 93
94 // This ID is used to identify a client of VideoCaptureImpl. 94 // This ID is used to identify a client of VideoCaptureImpl.
95 const int client_id = ++next_client_id_; 95 const int client_id = ++next_client_id_;
96 96
97 ChildProcess::current()->io_message_loop_proxy()->PostTask( 97 ChildProcess::current()->io_message_loop_proxy()->PostTask(
98 FROM_HERE, 98 FROM_HERE,
99 base::Bind(&VideoCaptureImpl::StartCapture, 99 base::Bind(&VideoCaptureImpl::StartCapture,
100 base::Unretained(impl), 100 base::Unretained(impl),
101 client_id, 101 client_id,
102 params, 102 params,
103 state_update_cb, 103 state_update_cb,
104 deliver_frame_cb)); 104 deliver_frame_cb));
105 return base::Bind(&VideoCaptureImplManager::StopCapture, 105 return base::Bind(&VideoCaptureService::StopCapture,
106 weak_factory_.GetWeakPtr(), 106 weak_factory_.GetWeakPtr(),
107 client_id, id); 107 client_id, id);
108 } 108 }
109 109
110 void VideoCaptureImplManager::GetDeviceSupportedFormats( 110 void VideoCaptureService::GetDeviceSupportedFormats(
111 media::VideoCaptureSessionId id, 111 media::VideoCaptureSessionId id,
112 const VideoCaptureDeviceFormatsCB& callback) { 112 const VideoCaptureDeviceFormatsCB& callback) {
113 DCHECK(thread_checker_.CalledOnValidThread()); 113 DCHECK(thread_checker_.CalledOnValidThread());
114 VideoCaptureDeviceMap::iterator it = devices_.find(id); 114 VideoCaptureDeviceMap::iterator it = devices_.find(id);
115 DCHECK(it != devices_.end()); 115 DCHECK(it != devices_.end());
116 VideoCaptureImpl* impl = it->second.second; 116 VideoCaptureImpl* impl = it->second.second;
117 ChildProcess::current()->io_message_loop_proxy()->PostTask( 117 ChildProcess::current()->io_message_loop_proxy()->PostTask(
118 FROM_HERE, 118 FROM_HERE,
119 base::Bind(&VideoCaptureImpl::GetDeviceSupportedFormats, 119 base::Bind(&VideoCaptureImpl::GetDeviceSupportedFormats,
120 base::Unretained(impl), callback)); 120 base::Unretained(impl), callback));
121 } 121 }
122 122
123 void VideoCaptureImplManager::GetDeviceFormatsInUse( 123 void VideoCaptureService::GetDeviceFormatsInUse(
124 media::VideoCaptureSessionId id, 124 media::VideoCaptureSessionId id,
125 const VideoCaptureDeviceFormatsCB& callback) { 125 const VideoCaptureDeviceFormatsCB& callback) {
126 DCHECK(thread_checker_.CalledOnValidThread()); 126 DCHECK(thread_checker_.CalledOnValidThread());
127 VideoCaptureDeviceMap::iterator it = devices_.find(id); 127 VideoCaptureDeviceMap::iterator it = devices_.find(id);
128 DCHECK(it != devices_.end()); 128 DCHECK(it != devices_.end());
129 VideoCaptureImpl* impl = it->second.second; 129 VideoCaptureImpl* impl = it->second.second;
130 ChildProcess::current()->io_message_loop_proxy()->PostTask( 130 ChildProcess::current()->io_message_loop_proxy()->PostTask(
131 FROM_HERE, 131 FROM_HERE,
132 base::Bind(&VideoCaptureImpl::GetDeviceFormatsInUse, 132 base::Bind(&VideoCaptureImpl::GetDeviceFormatsInUse,
133 base::Unretained(impl), callback)); 133 base::Unretained(impl), callback));
134 } 134 }
135 135
136 VideoCaptureImpl* 136 VideoCaptureImpl*
137 VideoCaptureImplManager::CreateVideoCaptureImplForTesting( 137 VideoCaptureService::CreateVideoCaptureImplForTesting(
138 media::VideoCaptureSessionId id, 138 media::VideoCaptureSessionId id,
139 VideoCaptureMessageFilter* filter) const { 139 VideoCaptureMessageFilter* filter) const {
140 return NULL; 140 return NULL;
141 } 141 }
142 142
143 void VideoCaptureImplManager::StopCapture( 143 void VideoCaptureService::StopCapture(
144 int client_id, media::VideoCaptureSessionId id) { 144 int client_id, media::VideoCaptureSessionId id) {
145 DCHECK(thread_checker_.CalledOnValidThread()); 145 DCHECK(thread_checker_.CalledOnValidThread());
146 VideoCaptureDeviceMap::iterator it = devices_.find(id); 146 VideoCaptureDeviceMap::iterator it = devices_.find(id);
147 DCHECK(it != devices_.end()); 147 DCHECK(it != devices_.end());
148 VideoCaptureImpl* impl = it->second.second; 148 VideoCaptureImpl* impl = it->second.second;
149 ChildProcess::current()->io_message_loop_proxy()->PostTask( 149 ChildProcess::current()->io_message_loop_proxy()->PostTask(
150 FROM_HERE, 150 FROM_HERE,
151 base::Bind(&VideoCaptureImpl::StopCapture, 151 base::Bind(&VideoCaptureImpl::StopCapture,
152 base::Unretained(impl), client_id)); 152 base::Unretained(impl), client_id));
153 } 153 }
154 154
155 void VideoCaptureImplManager::UnrefDevice( 155 void VideoCaptureService::UnrefDevice(
156 media::VideoCaptureSessionId id) { 156 media::VideoCaptureSessionId id) {
157 DCHECK(thread_checker_.CalledOnValidThread()); 157 DCHECK(thread_checker_.CalledOnValidThread());
158 VideoCaptureDeviceMap::iterator it = devices_.find(id); 158 VideoCaptureDeviceMap::iterator it = devices_.find(id);
159 DCHECK(it != devices_.end()); 159 DCHECK(it != devices_.end());
160 VideoCaptureImpl* impl = it->second.second; 160 VideoCaptureImpl* impl = it->second.second;
161 161
162 // Unref and destroy on the IO thread if there's no more client. 162 // Unref and destroy on the IO thread if there's no more client.
163 DCHECK(it->second.first); 163 DCHECK(it->second.first);
164 --it->second.first; 164 --it->second.first;
165 if (!it->second.first) { 165 if (!it->second.first) {
166 devices_.erase(id); 166 devices_.erase(id);
167 ChildProcess::current()->io_message_loop_proxy()->PostTask( 167 ChildProcess::current()->io_message_loop_proxy()->PostTask(
168 FROM_HERE, 168 FROM_HERE,
169 base::Bind(&VideoCaptureImpl::DeInit, 169 base::Bind(&VideoCaptureImpl::DeInit,
170 base::Unretained(impl))); 170 base::Unretained(impl)));
171 ChildProcess::current()->io_message_loop_proxy()->PostTask( 171 ChildProcess::current()->io_message_loop_proxy()->PostTask(
172 FROM_HERE, 172 FROM_HERE,
173 base::Bind(&base::DeletePointer<VideoCaptureImpl>, 173 base::Bind(&base::DeletePointer<VideoCaptureImpl>,
174 base::Unretained(impl))); 174 base::Unretained(impl)));
175 } 175 }
176 } 176 }
177 177
178 void VideoCaptureImplManager::SuspendDevices(bool suspend) { 178 void VideoCaptureService::SuspendDevices(bool suspend) {
179 DCHECK(thread_checker_.CalledOnValidThread()); 179 DCHECK(thread_checker_.CalledOnValidThread());
180 for (VideoCaptureDeviceMap::iterator it = devices_.begin(); 180 for (VideoCaptureDeviceMap::iterator it = devices_.begin();
181 it != devices_.end(); ++it) { 181 it != devices_.end(); ++it) {
182 VideoCaptureImpl* impl = it->second.second; 182 VideoCaptureImpl* impl = it->second.second;
183 ChildProcess::current()->io_message_loop_proxy()->PostTask( 183 ChildProcess::current()->io_message_loop_proxy()->PostTask(
184 FROM_HERE, 184 FROM_HERE,
185 base::Bind(&VideoCaptureImpl::SuspendCapture, 185 base::Bind(&VideoCaptureImpl::SuspendCapture,
186 base::Unretained(impl), suspend)); 186 base::Unretained(impl), suspend));
187 } 187 }
188 } 188 }
189 189
190 } // namespace content 190 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698