| 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/native_desktop_media_list.h" | 5 #include "chrome/browser/media/native_desktop_media_list.h" |
| 6 | 6 |
| 7 #include <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
| 7 #include <map> | 10 #include <map> |
| 8 #include <set> | 11 #include <set> |
| 9 #include <sstream> | 12 #include <sstream> |
| 10 | 13 |
| 11 #include "base/hash.h" | 14 #include "base/hash.h" |
| 12 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/macros.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/threading/sequenced_worker_pool.h" | 18 #include "base/threading/sequenced_worker_pool.h" |
| 15 #include "chrome/browser/media/desktop_media_list_observer.h" | 19 #include "chrome/browser/media/desktop_media_list_observer.h" |
| 16 #include "chrome/grit/generated_resources.h" | 20 #include "chrome/grit/generated_resources.h" |
| 17 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
| 18 #include "media/base/video_util.h" | 22 #include "media/base/video_util.h" |
| 19 #include "third_party/libyuv/include/libyuv/scale_argb.h" | 23 #include "third_party/libyuv/include/libyuv/scale_argb.h" |
| 20 #include "third_party/skia/include/core/SkBitmap.h" | 24 #include "third_party/skia/include/core/SkBitmap.h" |
| 21 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | 25 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
| 22 #include "third_party/webrtc/modules/desktop_capture/screen_capturer.h" | 26 #include "third_party/webrtc/modules/desktop_capture/screen_capturer.h" |
| 23 #include "third_party/webrtc/modules/desktop_capture/window_capturer.h" | 27 #include "third_party/webrtc/modules/desktop_capture/window_capturer.h" |
| 24 #include "ui/base/l10n/l10n_util.h" | 28 #include "ui/base/l10n/l10n_util.h" |
| 25 #include "ui/gfx/skia_util.h" | 29 #include "ui/gfx/skia_util.h" |
| 26 | 30 |
| 27 using content::BrowserThread; | 31 using content::BrowserThread; |
| 28 using content::DesktopMediaID; | 32 using content::DesktopMediaID; |
| 29 | 33 |
| 30 namespace { | 34 namespace { |
| 31 | 35 |
| 32 // Update the list every second. | 36 // Update the list every second. |
| 33 const int kDefaultUpdatePeriod = 1000; | 37 const int kDefaultUpdatePeriod = 1000; |
| 34 | 38 |
| 35 // Returns a hash of a DesktopFrame content to detect when image for a desktop | 39 // Returns a hash of a DesktopFrame content to detect when image for a desktop |
| 36 // media source has changed. | 40 // media source has changed. |
| 37 uint32 GetFrameHash(webrtc::DesktopFrame* frame) { | 41 uint32_t GetFrameHash(webrtc::DesktopFrame* frame) { |
| 38 int data_size = frame->stride() * frame->size().height(); | 42 int data_size = frame->stride() * frame->size().height(); |
| 39 return base::SuperFastHash(reinterpret_cast<char*>(frame->data()), data_size); | 43 return base::SuperFastHash(reinterpret_cast<char*>(frame->data()), data_size); |
| 40 } | 44 } |
| 41 | 45 |
| 42 gfx::ImageSkia ScaleDesktopFrame(scoped_ptr<webrtc::DesktopFrame> frame, | 46 gfx::ImageSkia ScaleDesktopFrame(scoped_ptr<webrtc::DesktopFrame> frame, |
| 43 gfx::Size size) { | 47 gfx::Size size) { |
| 44 gfx::Rect scaled_rect = media::ComputeLetterboxRegion( | 48 gfx::Rect scaled_rect = media::ComputeLetterboxRegion( |
| 45 gfx::Rect(0, 0, size.width(), size.height()), | 49 gfx::Rect(0, 0, size.width(), size.height()), |
| 46 gfx::Size(frame->size().width(), frame->size().height())); | 50 gfx::Size(frame->size().width(), frame->size().height())); |
| 47 | 51 |
| 48 SkBitmap result; | 52 SkBitmap result; |
| 49 result.allocN32Pixels(scaled_rect.width(), scaled_rect.height(), true); | 53 result.allocN32Pixels(scaled_rect.width(), scaled_rect.height(), true); |
| 50 result.lockPixels(); | 54 result.lockPixels(); |
| 51 | 55 |
| 52 uint8* pixels_data = reinterpret_cast<uint8*>(result.getPixels()); | 56 uint8_t* pixels_data = reinterpret_cast<uint8_t*>(result.getPixels()); |
| 53 libyuv::ARGBScale(frame->data(), frame->stride(), | 57 libyuv::ARGBScale(frame->data(), frame->stride(), |
| 54 frame->size().width(), frame->size().height(), | 58 frame->size().width(), frame->size().height(), |
| 55 pixels_data, result.rowBytes(), | 59 pixels_data, result.rowBytes(), |
| 56 scaled_rect.width(), scaled_rect.height(), | 60 scaled_rect.width(), scaled_rect.height(), |
| 57 libyuv::kFilterBilinear); | 61 libyuv::kFilterBilinear); |
| 58 | 62 |
| 59 // Set alpha channel values to 255 for all pixels. | 63 // Set alpha channel values to 255 for all pixels. |
| 60 // TODO(sergeyu): Fix screen/window capturers to capture alpha channel and | 64 // TODO(sergeyu): Fix screen/window capturers to capture alpha channel and |
| 61 // remove this code. Currently screen/window capturers (at least some | 65 // remove this code. Currently screen/window capturers (at least some |
| 62 // implementations) only capture R, G and B channels and set Alpha to 0. | 66 // implementations) only capture R, G and B channels and set Alpha to 0. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 87 public: | 91 public: |
| 88 Worker(base::WeakPtr<NativeDesktopMediaList> media_list, | 92 Worker(base::WeakPtr<NativeDesktopMediaList> media_list, |
| 89 scoped_ptr<webrtc::ScreenCapturer> screen_capturer, | 93 scoped_ptr<webrtc::ScreenCapturer> screen_capturer, |
| 90 scoped_ptr<webrtc::WindowCapturer> window_capturer); | 94 scoped_ptr<webrtc::WindowCapturer> window_capturer); |
| 91 ~Worker() override; | 95 ~Worker() override; |
| 92 | 96 |
| 93 void Refresh(const gfx::Size& thumbnail_size, | 97 void Refresh(const gfx::Size& thumbnail_size, |
| 94 content::DesktopMediaID::Id view_dialog_id); | 98 content::DesktopMediaID::Id view_dialog_id); |
| 95 | 99 |
| 96 private: | 100 private: |
| 97 typedef std::map<DesktopMediaID, uint32> ImageHashesMap; | 101 typedef std::map<DesktopMediaID, uint32_t> ImageHashesMap; |
| 98 | 102 |
| 99 // webrtc::DesktopCapturer::Callback interface. | 103 // webrtc::DesktopCapturer::Callback interface. |
| 100 webrtc::SharedMemory* CreateSharedMemory(size_t size) override; | 104 webrtc::SharedMemory* CreateSharedMemory(size_t size) override; |
| 101 void OnCaptureCompleted(webrtc::DesktopFrame* frame) override; | 105 void OnCaptureCompleted(webrtc::DesktopFrame* frame) override; |
| 102 | 106 |
| 103 base::WeakPtr<NativeDesktopMediaList> media_list_; | 107 base::WeakPtr<NativeDesktopMediaList> media_list_; |
| 104 | 108 |
| 105 scoped_ptr<webrtc::ScreenCapturer> screen_capturer_; | 109 scoped_ptr<webrtc::ScreenCapturer> screen_capturer_; |
| 106 scoped_ptr<webrtc::WindowCapturer> window_capturer_; | 110 scoped_ptr<webrtc::WindowCapturer> window_capturer_; |
| 107 | 111 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 break; | 195 break; |
| 192 | 196 |
| 193 default: | 197 default: |
| 194 NOTREACHED(); | 198 NOTREACHED(); |
| 195 } | 199 } |
| 196 | 200 |
| 197 // Expect that DesktopCapturer to always captures frames synchronously. | 201 // Expect that DesktopCapturer to always captures frames synchronously. |
| 198 // |current_frame_| may be NULL if capture failed (e.g. because window has | 202 // |current_frame_| may be NULL if capture failed (e.g. because window has |
| 199 // been closed). | 203 // been closed). |
| 200 if (current_frame_) { | 204 if (current_frame_) { |
| 201 uint32 frame_hash = GetFrameHash(current_frame_.get()); | 205 uint32_t frame_hash = GetFrameHash(current_frame_.get()); |
| 202 new_image_hashes[source.id] = frame_hash; | 206 new_image_hashes[source.id] = frame_hash; |
| 203 | 207 |
| 204 // Scale the image only if it has changed. | 208 // Scale the image only if it has changed. |
| 205 ImageHashesMap::iterator it = image_hashes_.find(source.id); | 209 ImageHashesMap::iterator it = image_hashes_.find(source.id); |
| 206 if (it == image_hashes_.end() || it->second != frame_hash) { | 210 if (it == image_hashes_.end() || it->second != frame_hash) { |
| 207 gfx::ImageSkia thumbnail = | 211 gfx::ImageSkia thumbnail = |
| 208 ScaleDesktopFrame(current_frame_.Pass(), thumbnail_size); | 212 ScaleDesktopFrame(current_frame_.Pass(), thumbnail_size); |
| 209 BrowserThread::PostTask( | 213 BrowserThread::PostTask( |
| 210 BrowserThread::UI, FROM_HERE, | 214 BrowserThread::UI, FROM_HERE, |
| 211 base::Bind(&NativeDesktopMediaList::OnSourceThumbnail, | 215 base::Bind(&NativeDesktopMediaList::OnSourceThumbnail, |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 observer_->OnSourceThumbnailChanged(index); | 365 observer_->OnSourceThumbnailChanged(index); |
| 362 } | 366 } |
| 363 | 367 |
| 364 void NativeDesktopMediaList::OnRefreshFinished() { | 368 void NativeDesktopMediaList::OnRefreshFinished() { |
| 365 BrowserThread::PostDelayedTask( | 369 BrowserThread::PostDelayedTask( |
| 366 BrowserThread::UI, FROM_HERE, | 370 BrowserThread::UI, FROM_HERE, |
| 367 base::Bind(&NativeDesktopMediaList::Refresh, | 371 base::Bind(&NativeDesktopMediaList::Refresh, |
| 368 weak_factory_.GetWeakPtr()), | 372 weak_factory_.GetWeakPtr()), |
| 369 update_period_); | 373 update_period_); |
| 370 } | 374 } |
| OLD | NEW |