| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/media/webrtc/native_desktop_media_list.h" | 5 #include "chrome/browser/media/webrtc/native_desktop_media_list.h" | 
| 6 | 6 | 
| 7 #include "base/hash.h" | 7 #include "base/hash.h" | 
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" | 
| 9 #include "base/threading/sequenced_worker_pool.h" | 9 #include "base/task_scheduler/post_task.h" | 
| 10 #include "chrome/browser/media/webrtc/desktop_media_list_observer.h" | 10 #include "chrome/browser/media/webrtc/desktop_media_list_observer.h" | 
| 11 #include "chrome/grit/generated_resources.h" | 11 #include "chrome/grit/generated_resources.h" | 
| 12 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" | 
| 13 #include "media/base/video_util.h" | 13 #include "media/base/video_util.h" | 
| 14 #include "third_party/libyuv/include/libyuv/scale_argb.h" | 14 #include "third_party/libyuv/include/libyuv/scale_argb.h" | 
| 15 #include "third_party/skia/include/core/SkBitmap.h" | 15 #include "third_party/skia/include/core/SkBitmap.h" | 
| 16 #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" | 16 #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" | 
| 17 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | 17 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | 
| 18 #include "ui/aura/window.h" | 18 #include "ui/aura/window.h" | 
| 19 #include "ui/base/l10n/l10n_util.h" | 19 #include "ui/base/l10n/l10n_util.h" | 
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 230     std::unique_ptr<webrtc::DesktopFrame> frame) { | 230     std::unique_ptr<webrtc::DesktopFrame> frame) { | 
| 231   current_frame_ = std::move(frame); | 231   current_frame_ = std::move(frame); | 
| 232 } | 232 } | 
| 233 | 233 | 
| 234 NativeDesktopMediaList::NativeDesktopMediaList( | 234 NativeDesktopMediaList::NativeDesktopMediaList( | 
| 235     std::unique_ptr<webrtc::DesktopCapturer> screen_capturer, | 235     std::unique_ptr<webrtc::DesktopCapturer> screen_capturer, | 
| 236     std::unique_ptr<webrtc::DesktopCapturer> window_capturer) | 236     std::unique_ptr<webrtc::DesktopCapturer> window_capturer) | 
| 237     : DesktopMediaListBase( | 237     : DesktopMediaListBase( | 
| 238           base::TimeDelta::FromMilliseconds(kDefaultUpdatePeriod)), | 238           base::TimeDelta::FromMilliseconds(kDefaultUpdatePeriod)), | 
| 239       weak_factory_(this) { | 239       weak_factory_(this) { | 
| 240   base::SequencedWorkerPool* worker_pool = BrowserThread::GetBlockingPool(); | 240   capture_task_runner_ = base::CreateSequencedTaskRunnerWithTraits( | 
| 241   capture_task_runner_ = worker_pool->GetSequencedTaskRunner( | 241       {base::MayBlock(), base::TaskPriority::USER_VISIBLE}); | 
| 242       worker_pool->GetSequenceToken()); |  | 
| 243 | 242 | 
| 244   worker_.reset(new Worker(weak_factory_.GetWeakPtr(), | 243   worker_.reset(new Worker(weak_factory_.GetWeakPtr(), | 
| 245                            std::move(screen_capturer), | 244                            std::move(screen_capturer), | 
| 246                            std::move(window_capturer))); | 245                            std::move(window_capturer))); | 
| 247 } | 246 } | 
| 248 | 247 | 
| 249 NativeDesktopMediaList::~NativeDesktopMediaList() { | 248 NativeDesktopMediaList::~NativeDesktopMediaList() { | 
| 250   capture_task_runner_->DeleteSoon(FROM_HERE, worker_.release()); | 249   capture_task_runner_->DeleteSoon(FROM_HERE, worker_.release()); | 
| 251 } | 250 } | 
| 252 | 251 | 
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 338   gfx::NativeWindow window = DesktopMediaID::GetAuraWindowById(id); | 337   gfx::NativeWindow window = DesktopMediaID::GetAuraWindowById(id); | 
| 339   if (!window) | 338   if (!window) | 
| 340     return; | 339     return; | 
| 341 | 340 | 
| 342   gfx::Rect window_rect(window->bounds().width(), window->bounds().height()); | 341   gfx::Rect window_rect(window->bounds().width(), window->bounds().height()); | 
| 343   gfx::Rect scaled_rect = media::ComputeLetterboxRegion( | 342   gfx::Rect scaled_rect = media::ComputeLetterboxRegion( | 
| 344       gfx::Rect(thumbnail_size_), window_rect.size()); | 343       gfx::Rect(thumbnail_size_), window_rect.size()); | 
| 345 | 344 | 
| 346   pending_aura_capture_requests_++; | 345   pending_aura_capture_requests_++; | 
| 347   ui::GrabWindowSnapshotAndScaleAsyncAura( | 346   ui::GrabWindowSnapshotAndScaleAsyncAura( | 
| 348       window, window_rect, scaled_rect.size(), BrowserThread::GetBlockingPool(), | 347       window, window_rect, scaled_rect.size(), | 
|  | 348       base::CreateTaskRunnerWithTraits( | 
|  | 349           {base::MayBlock(), base::TaskPriority::USER_VISIBLE}), | 
| 349       base::Bind(&NativeDesktopMediaList::OnAuraThumbnailCaptured, | 350       base::Bind(&NativeDesktopMediaList::OnAuraThumbnailCaptured, | 
| 350                  weak_factory_.GetWeakPtr(), id)); | 351                  weak_factory_.GetWeakPtr(), id)); | 
| 351 } | 352 } | 
| 352 | 353 | 
| 353 void NativeDesktopMediaList::OnAuraThumbnailCaptured(const DesktopMediaID& id, | 354 void NativeDesktopMediaList::OnAuraThumbnailCaptured(const DesktopMediaID& id, | 
| 354                                                      const gfx::Image& image) { | 355                                                      const gfx::Image& image) { | 
| 355   if (!image.IsEmpty()) { | 356   if (!image.IsEmpty()) { | 
| 356     // Only new or changed thumbnail need update. | 357     // Only new or changed thumbnail need update. | 
| 357     new_aura_thumbnail_hashes_[id] = GetImageHash(image); | 358     new_aura_thumbnail_hashes_[id] = GetImageHash(image); | 
| 358     if (!previous_aura_thumbnail_hashes_.count(id) || | 359     if (!previous_aura_thumbnail_hashes_.count(id) || | 
| 359         previous_aura_thumbnail_hashes_[id] != new_aura_thumbnail_hashes_[id]) { | 360         previous_aura_thumbnail_hashes_[id] != new_aura_thumbnail_hashes_[id]) { | 
| 360       UpdateSourceThumbnail(id, image.AsImageSkia()); | 361       UpdateSourceThumbnail(id, image.AsImageSkia()); | 
| 361     } | 362     } | 
| 362   } | 363   } | 
| 363 | 364 | 
| 364   // After all aura windows are processed, schedule next refresh; | 365   // After all aura windows are processed, schedule next refresh; | 
| 365   pending_aura_capture_requests_--; | 366   pending_aura_capture_requests_--; | 
| 366   DCHECK_GE(pending_aura_capture_requests_, 0); | 367   DCHECK_GE(pending_aura_capture_requests_, 0); | 
| 367   if (pending_aura_capture_requests_ == 0) { | 368   if (pending_aura_capture_requests_ == 0) { | 
| 368     previous_aura_thumbnail_hashes_ = std::move(new_aura_thumbnail_hashes_); | 369     previous_aura_thumbnail_hashes_ = std::move(new_aura_thumbnail_hashes_); | 
| 369     // Schedule next refresh if aura thumbnail captures finished after native | 370     // Schedule next refresh if aura thumbnail captures finished after native | 
| 370     // thumbnail captures. | 371     // thumbnail captures. | 
| 371     if (!pending_native_thumbnail_capture_) | 372     if (!pending_native_thumbnail_capture_) | 
| 372       ScheduleNextRefresh(); | 373       ScheduleNextRefresh(); | 
| 373   } | 374   } | 
| 374 } | 375 } | 
| 375 | 376 | 
| 376 #endif  // defined(USE_AURA) | 377 #endif  // defined(USE_AURA) | 
| OLD | NEW | 
|---|