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/screen.h" | |
11 | |
12 namespace media { | |
13 | |
14 // This is a delegate class used to transfer Display change events from the UI | |
15 // thread to the media thread. | |
16 class VideoCaptureDeviceChromeOS::ScreenObserverDelegate | |
17 : public gfx::DisplayObserver, | |
18 public base::RefCountedThreadSafe<ScreenObserverDelegate> { | |
19 public: | |
20 ScreenObserverDelegate(VideoCaptureDeviceChromeOS* capture_device) | |
21 : capture_device_(capture_device), | |
22 media_message_loop_(base::MessageLoop::current()) { | |
23 base::MessageLoopForUI::current()->PostTask( | |
24 FROM_HERE, | |
25 base::Bind(&ScreenObserverDelegate::AddObserverOnUIThread, this)); | |
26 } | |
27 | |
28 ~ScreenObserverDelegate() { | |
29 DCHECK(!capture_device_); | |
30 } | |
31 | |
32 void RemoveObserver() { | |
33 capture_device_ = NULL; | |
34 base::MessageLoopForUI::current()->PostTask( | |
35 FROM_HERE, | |
36 base::Bind(&ScreenObserverDelegate::RemoveObserverOnUIThread, this)); | |
37 } | |
38 | |
39 private: | |
40 friend class base::RefCountedThreadSafe<ScreenObserverDelegate>; | |
mcasas
2014/05/11 18:41:25
According to base/memory/ref_counted.h, if you use
Zachary Kuznia
2014/05/12 02:54:18
Done.
| |
41 | |
42 // gfx::DisplayObserver: | |
43 virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE { | |
44 SendDisplayRotation(display); | |
45 } | |
46 | |
47 virtual void OnDisplayAdded(const gfx::Display& /*new_display*/) OVERRIDE {} | |
48 virtual void OnDisplayRemoved(const gfx::Display& /*old_display*/) OVERRIDE {} | |
mcasas
2014/05/11 18:41:25
Shouldn't these 3 methods from gfx::DisplayObserve
Zachary Kuznia
2014/05/12 02:54:18
This is a controversial topic. See: https://group
| |
49 | |
50 void AddObserverOnUIThread() { | |
51 gfx::Screen* screen = | |
52 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE); | |
mcasas
2014/05/11 18:41:25
Why not gfx::SCREEN_TYPE_NATIVE?
Zachary Kuznia
2014/05/12 02:54:18
Because this is the pattern established in ash/she
| |
53 if (screen) { | |
54 screen->AddObserver(this); | |
55 SendDisplayRotation(screen->GetPrimaryDisplay()); | |
56 } | |
57 } | |
58 | |
59 void RemoveObserverOnUIThread() { | |
60 gfx::Screen* screen = | |
61 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE); | |
62 if (screen) | |
63 screen->RemoveObserver(this); | |
64 } | |
65 | |
66 void SendDisplayRotation(const gfx::Display& display) { | |
67 media_message_loop_->PostTask( | |
68 FROM_HERE, | |
69 base::Bind(&ScreenObserverDelegate::SendDisplayRotationOnMediaThread, | |
70 this, display)); | |
71 } | |
72 | |
73 void SendDisplayRotationOnMediaThread(const gfx::Display& display) { | |
74 capture_device_->SetDisplayRotation(display); | |
75 } | |
76 | |
77 VideoCaptureDeviceChromeOS* capture_device_; | |
mcasas
2014/05/11 18:41:25
Ugh naked pointer. Maybe const?
Zachary Kuznia
2014/05/12 02:54:18
Unfortunately, that would require marking rotation
| |
78 base::MessageLoop* media_message_loop_; | |
mcasas
2014/05/11 18:41:25
const?
ultra-nit: would you mind terribly calling
Zachary Kuznia
2014/05/12 02:54:18
Nits Done. The MessageLoop pointer can't be const
| |
79 DISALLOW_IMPLICIT_CONSTRUCTORS(ScreenObserverDelegate); | |
80 }; | |
81 | |
82 | |
83 VideoCaptureDeviceChromeOS::VideoCaptureDeviceChromeOS(const Name& device_name) | |
84 : VideoCaptureDeviceLinux(device_name), | |
85 screen_observer_delegate_(new ScreenObserverDelegate(this)) { | |
86 } | |
87 | |
88 VideoCaptureDeviceChromeOS::~VideoCaptureDeviceChromeOS() { | |
89 | |
mcasas
2014/05/11 18:41:25
nit: no empty line.
Zachary Kuznia
2014/05/12 02:54:18
Done.
| |
90 } | |
91 | |
92 void VideoCaptureDeviceChromeOS::SetDisplayRotation( | |
93 const gfx::Display& display) { | |
94 if (display.IsInternal()) | |
95 SetRotation(display.rotation() * 90); | |
96 } | |
97 | |
98 } // namespace media | |
OLD | NEW |