Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "media/video/capture/linux/video_capture_device_chromeos.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/memory/ref_counted.h" | |
| 9 #include "ui/gfx/display.h" | |
| 10 #include "ui/gfx/display_observer.h" | |
| 11 #include "ui/gfx/screen.h" | |
| 12 | |
| 13 namespace media { | |
| 14 | |
| 15 // This is a delegate class used to transfer Display change events from the UI | |
| 16 // thread to the media thread. | |
| 17 class VideoCaptureDeviceChromeOS::ScreenObserverDelegate | |
| 18 : public gfx::DisplayObserver, | |
| 19 public base::RefCountedThreadSafe<ScreenObserverDelegate> { | |
| 20 public: | |
| 21 ScreenObserverDelegate(VideoCaptureDeviceChromeOS* capture_device) | |
| 22 : capture_device_(capture_device), | |
| 23 capture_thread_loop_(base::MessageLoop::current()) { | |
| 24 base::MessageLoopForUI::current()->PostTask( | |
| 25 FROM_HERE, | |
| 26 base::Bind(&ScreenObserverDelegate::AddObserverOnUIThread, this)); | |
| 27 } | |
| 28 | |
| 29 void RemoveObserver() { | |
|
perkj_chrome
2014/05/12 07:57:13
add thread check
Zachary Kuznia
2014/05/12 08:56:22
Done.
| |
| 30 capture_device_ = NULL; | |
| 31 base::MessageLoopForUI::current()->PostTask( | |
| 32 FROM_HERE, | |
| 33 base::Bind(&ScreenObserverDelegate::RemoveObserverOnUIThread, this)); | |
| 34 } | |
| 35 | |
| 36 private: | |
| 37 friend class base::RefCountedThreadSafe<ScreenObserverDelegate>; | |
| 38 | |
| 39 virtual ~ScreenObserverDelegate() { | |
| 40 DCHECK(!capture_device_); | |
| 41 } | |
| 42 | |
| 43 // gfx::DisplayObserver: | |
| 44 virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE { | |
| 45 SendDisplayRotation(display); | |
| 46 } | |
| 47 | |
| 48 virtual void OnDisplayAdded(const gfx::Display& /*new_display*/) OVERRIDE {} | |
| 49 virtual void OnDisplayRemoved(const gfx::Display& /*old_display*/) OVERRIDE {} | |
| 50 | |
| 51 void AddObserverOnUIThread() { | |
| 52 gfx::Screen* screen = | |
| 53 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE); | |
| 54 if (screen) { | |
| 55 screen->AddObserver(this); | |
| 56 SendDisplayRotation(screen->GetPrimaryDisplay()); | |
| 57 } | |
| 58 } | |
| 59 | |
| 60 void RemoveObserverOnUIThread() { | |
| 61 gfx::Screen* screen = | |
| 62 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE); | |
| 63 if (screen) | |
| 64 screen->RemoveObserver(this); | |
| 65 } | |
| 66 | |
| 67 void SendDisplayRotation(const gfx::Display& display) { | |
| 68 capture_thread_loop_->PostTask( | |
| 69 FROM_HERE, | |
| 70 base::Bind(&ScreenObserverDelegate::SendDisplayRotationOnCaptureThread, | |
| 71 this, display)); | |
| 72 } | |
| 73 | |
| 74 void SendDisplayRotationOnCaptureThread(const gfx::Display& display) { | |
| 75 capture_device_->SetDisplayRotation(display); | |
|
perkj_chrome
2014/05/12 07:57:13
add thread check
Zachary Kuznia
2014/05/12 08:56:22
Done.
| |
| 76 } | |
| 77 | |
| 78 VideoCaptureDeviceChromeOS* capture_device_; | |
| 79 base::MessageLoop* capture_thread_loop_; | |
|
perkj_chrome
2014/05/12 07:57:13
scoped_refptr<MessageLoopProxy> capture_thread_loo
Zachary Kuznia
2014/05/12 08:56:22
Unfortunately, MessageLoopProxy is not threadsafe,
perkj_chrome
2014/05/13 09:46:40
but if you set it in ctor and and only use it on t
| |
| 80 DISALLOW_IMPLICIT_CONSTRUCTORS(ScreenObserverDelegate); | |
| 81 }; | |
| 82 | |
| 83 | |
| 84 VideoCaptureDeviceChromeOS::VideoCaptureDeviceChromeOS(const Name& device_name) | |
| 85 : VideoCaptureDeviceLinux(device_name), | |
| 86 screen_observer_delegate_(new ScreenObserverDelegate(this)) { | |
| 87 } | |
| 88 | |
| 89 VideoCaptureDeviceChromeOS::~VideoCaptureDeviceChromeOS() { | |
| 90 } | |
| 91 | |
| 92 void VideoCaptureDeviceChromeOS::SetDisplayRotation( | |
| 93 const gfx::Display& display) { | |
|
perkj_chrome
2014/05/12 07:57:13
nit: Fits on line above?
Zachary Kuznia
2014/05/12 08:56:22
2 characters too long.
| |
| 94 if (display.IsInternal()) | |
| 95 SetRotation(display.rotation() * 90); | |
| 96 } | |
| 97 | |
| 98 } // namespace media | |
| OLD | NEW |