Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: media/video/capture/linux/video_capture_device_chromeos.cc

Issue 270263008: Add a ChromeOS implementation of VideoCaptureDevice (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 "base/message_loop/message_loop_proxy.h"
10 #include "ui/gfx/display.h"
11 #include "ui/gfx/display_observer.h"
12 #include "ui/gfx/screen.h"
13
14 namespace media {
15
16 // This is a delegate class used to transfer Display change events from the UI
17 // thread to the media thread.
18 class VideoCaptureDeviceChromeOS::ScreenObserverDelegate
19 : public gfx::DisplayObserver,
20 public base::RefCountedThreadSafe<ScreenObserverDelegate> {
21 public:
22 ScreenObserverDelegate(
23 VideoCaptureDeviceChromeOS* capture_device,
24 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
25 : capture_device_(capture_device),
26 ui_task_runner_(ui_task_runner),
27 capture_task_runner_(base::MessageLoopProxy::current()) {
28 ui_task_runner_->PostTask(
29 FROM_HERE,
30 base::Bind(&ScreenObserverDelegate::AddObserverOnUIThread, this));
31 }
32
33 void RemoveObserver() {
34 DCHECK(capture_task_runner_->BelongsToCurrentThread());
35 capture_device_ = NULL;
36 ui_task_runner_->PostTask(
37 FROM_HERE,
38 base::Bind(&ScreenObserverDelegate::RemoveObserverOnUIThread, this));
39 }
40
41 private:
42 friend class base::RefCountedThreadSafe<ScreenObserverDelegate>;
43
44 virtual ~ScreenObserverDelegate() {
45 DCHECK(!capture_device_);
46 }
47
48 // gfx::DisplayObserver:
49 virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE {
50 SendDisplayRotation(display);
51 }
52
53 virtual void OnDisplayAdded(const gfx::Display& /*new_display*/) OVERRIDE {}
54 virtual void OnDisplayRemoved(const gfx::Display& /*old_display*/) OVERRIDE {}
55
56 void AddObserverOnUIThread() {
57 DCHECK(ui_task_runner_->BelongsToCurrentThread());
58 gfx::Screen* screen =
59 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE);
60 if (screen) {
61 screen->AddObserver(this);
62 SendDisplayRotation(screen->GetPrimaryDisplay());
63 }
64 }
65
66 void RemoveObserverOnUIThread() {
67 DCHECK(ui_task_runner_->BelongsToCurrentThread());
68 gfx::Screen* screen =
69 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE);
70 if (screen)
71 screen->RemoveObserver(this);
72 }
73
74 void SendDisplayRotation(const gfx::Display& display) {
75 DCHECK(capture_task_runner_->BelongsToCurrentThread());
76 capture_task_runner_->PostTask(
77 FROM_HERE,
78 base::Bind(&ScreenObserverDelegate::SendDisplayRotationOnCaptureThread,
79 this, display));
80 }
81
82 void SendDisplayRotationOnCaptureThread(const gfx::Display& display) {
83 DCHECK(capture_task_runner_->BelongsToCurrentThread());
84 capture_device_->SetDisplayRotation(display);
85 }
86
87 VideoCaptureDeviceChromeOS* capture_device_;
88 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
89 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner_;
90 DISALLOW_IMPLICIT_CONSTRUCTORS(ScreenObserverDelegate);
91 };
92
93
94 VideoCaptureDeviceChromeOS::VideoCaptureDeviceChromeOS(
95 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
96 const Name& device_name)
97 : VideoCaptureDeviceLinux(device_name),
98 screen_observer_delegate_(new ScreenObserverDelegate(this,
99 ui_task_runner)) {
100 }
101
102 VideoCaptureDeviceChromeOS::~VideoCaptureDeviceChromeOS() {
103 screen_observer_delegate_->RemoveObserver();
104 }
105
106 void VideoCaptureDeviceChromeOS::SetDisplayRotation(
107 const gfx::Display& display) {
108 if (display.IsInternal())
109 SetRotation(display.rotation() * 90);
110 }
111
112 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698