5
5
#include " chrome/browser/media/webrtc/native_desktop_media_list.h"
6
6
7
7
#include " base/hash.h"
8
+ #include " base/single_thread_task_runner.h"
8
9
#include " base/strings/utf_string_conversions.h"
9
10
#include " base/task/post_task.h"
11
+ #include " base/threading/thread_restrictions.h"
12
+ #include " build/build_config.h"
10
13
#include " chrome/browser/media/webrtc/desktop_media_list_observer.h"
11
14
#include " chrome/grit/generated_resources.h"
12
15
#include " content/public/browser/browser_thread.h"
@@ -76,11 +79,13 @@ gfx::ImageSkia ScaleDesktopFrame(std::unique_ptr<webrtc::DesktopFrame> frame,
76
79
class NativeDesktopMediaList ::Worker
77
80
: public webrtc::DesktopCapturer::Callback {
78
81
public:
79
- Worker (base::WeakPtr<NativeDesktopMediaList> media_list,
82
+ Worker (scoped_refptr<base::SingleThreadTaskRunner> task_runner,
83
+ base::WeakPtr<NativeDesktopMediaList> media_list,
80
84
DesktopMediaID::Type type,
81
85
std::unique_ptr<webrtc::DesktopCapturer> capturer);
82
86
~Worker () override ;
83
87
88
+ void Start ();
84
89
void Refresh (const DesktopMediaID::Id& view_dialog_id);
85
90
86
91
void RefreshThumbnails (const std::vector<DesktopMediaID>& native_ids,
@@ -93,6 +98,9 @@ class NativeDesktopMediaList::Worker
93
98
void OnCaptureResult (webrtc::DesktopCapturer::Result result,
94
99
std::unique_ptr<webrtc::DesktopFrame> frame) override ;
95
100
101
+ // Task runner used for capturing operations.
102
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
103
+
96
104
base::WeakPtr<NativeDesktopMediaList> media_list_;
97
105
98
106
DesktopMediaID::Type type_;
@@ -106,17 +114,27 @@ class NativeDesktopMediaList::Worker
106
114
};
107
115
108
116
NativeDesktopMediaList::Worker::Worker (
117
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
109
118
base::WeakPtr<NativeDesktopMediaList> media_list,
110
119
DesktopMediaID::Type type,
111
120
std::unique_ptr<webrtc::DesktopCapturer> capturer)
112
- : media_list_(media_list), type_(type), capturer_(std::move(capturer)) {
113
- capturer_->Start (this );
121
+ : task_runner_(task_runner),
122
+ media_list_(media_list),
123
+ type_(type),
124
+ capturer_(std::move(capturer)) {}
125
+
126
+ NativeDesktopMediaList::Worker::~Worker () {
127
+ DCHECK (task_runner_->BelongsToCurrentThread ());
114
128
}
115
129
116
- NativeDesktopMediaList::Worker::~Worker () {}
130
+ void NativeDesktopMediaList::Worker::Start () {
131
+ DCHECK (task_runner_->BelongsToCurrentThread ());
132
+ capturer_->Start (this );
133
+ }
117
134
118
135
void NativeDesktopMediaList::Worker::Refresh (
119
136
const DesktopMediaID::Id& view_dialog_id) {
137
+ DCHECK (task_runner_->BelongsToCurrentThread ());
120
138
std::vector<SourceDescription> result;
121
139
122
140
webrtc::DesktopCapturer::SourceList sources;
@@ -163,6 +181,7 @@ void NativeDesktopMediaList::Worker::Refresh(
163
181
void NativeDesktopMediaList::Worker::RefreshThumbnails (
164
182
const std::vector<DesktopMediaID>& native_ids,
165
183
const gfx::Size & thumbnail_size) {
184
+ DCHECK (task_runner_->BelongsToCurrentThread ());
166
185
ImageHashesMap new_image_hashes;
167
186
168
187
// Get a thumbnail for each native source.
@@ -210,17 +229,30 @@ NativeDesktopMediaList::NativeDesktopMediaList(
210
229
std::unique_ptr<webrtc::DesktopCapturer> capturer)
211
230
: DesktopMediaListBase(base::TimeDelta::FromMilliseconds(
212
231
kDefaultNativeDesktopMediaListUpdatePeriod )),
232
+ thread_(" DesktopMediaListCaptureThread" ),
213
233
weak_factory_(this ) {
214
234
type_ = type;
215
- capture_task_runner_ = base::CreateSequencedTaskRunnerWithTraits (
216
- {base::MayBlock (), base::TaskPriority::USER_VISIBLE});
217
235
218
- worker_.reset (
219
- new Worker (weak_factory_.GetWeakPtr (), type, std::move (capturer)));
236
+ #if defined(OS_WIN) || defined(OS_MACOSX)
237
+ // On Windows/OSX the thread must be a UI thread.
238
+ base::MessageLoop::Type thread_type = base::MessageLoop::TYPE_UI;
239
+ #else
240
+ base::MessageLoop::Type thread_type = base::MessageLoop::TYPE_DEFAULT;
241
+ #endif
242
+ thread_.StartWithOptions (base::Thread::Options (thread_type, 0 ));
243
+
244
+ worker_.reset (new Worker (thread_.task_runner (), weak_factory_.GetWeakPtr (),
245
+ type, std::move (capturer)));
246
+
247
+ thread_.task_runner ()->PostTask (
248
+ FROM_HERE,
249
+ base::BindOnce (&Worker::Start, base::Unretained (worker_.get ())));
220
250
}
221
251
222
252
NativeDesktopMediaList::~NativeDesktopMediaList () {
223
- capture_task_runner_->DeleteSoon (FROM_HERE, worker_.release ());
253
+ base::ThreadRestrictions::ScopedAllowIO allow_io;
254
+ thread_.task_runner ()->DeleteSoon (FROM_HERE, worker_.release ());
255
+ thread_.Stop ();
224
256
}
225
257
226
258
void NativeDesktopMediaList::Refresh () {
@@ -230,7 +262,7 @@ void NativeDesktopMediaList::Refresh() {
230
262
new_aura_thumbnail_hashes_.clear ();
231
263
#endif
232
264
233
- capture_task_runner_ ->PostTask (
265
+ thread_. task_runner () ->PostTask (
234
266
FROM_HERE,
235
267
base::BindOnce (&Worker::Refresh, base::Unretained (worker_.get ()),
236
268
view_dialog_id_.id ));
@@ -280,7 +312,7 @@ void NativeDesktopMediaList::RefreshForAuraWindows(
280
312
#if defined(USE_AURA)
281
313
pending_native_thumbnail_capture_ = true ;
282
314
#endif
283
- capture_task_runner_ ->PostTask (
315
+ thread_. task_runner () ->PostTask (
284
316
FROM_HERE, base::BindOnce (&Worker::RefreshThumbnails,
285
317
base::Unretained (worker_.get ()), native_ids,
286
318
thumbnail_size_));
0 commit comments