OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2017 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 #ifndef CONTENT_RENDERER_MEDIA_REMOTE_MEDIA_TRACK_ADAPTER_H_ | |
6 #define CONTENT_RENDERER_MEDIA_REMOTE_MEDIA_TRACK_ADAPTER_H_ | |
7 | |
8 #include <string> | |
9 | |
10 #include "base/bind.h" | |
11 #include "base/callback_forward.h" | |
12 #include "base/logging.h" | |
13 #include "base/memory/ref_counted.h" | |
14 #include "base/single_thread_task_runner.h" | |
15 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | |
16 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | |
17 #include "third_party/webrtc/api/mediastreaminterface.h" | |
18 | |
19 namespace content { | |
20 | |
21 class TrackObserver; | |
22 | |
23 // Base class used for mapping between webrtc and blink MediaStream tracks. | |
24 // RemoteMediaStreamImpl has a RemoteMediaStreamTrackAdapter per remote audio | |
25 // (RemoteAudioTrackAdapter) and video (RemoteVideoTrackAdapter) track. | |
26 template <typename WebRtcMediaStreamTrackType> | |
27 class RemoteMediaStreamTrackAdapter | |
28 : public base::RefCountedThreadSafe< | |
29 RemoteMediaStreamTrackAdapter<WebRtcMediaStreamTrackType>> { | |
30 public: | |
31 RemoteMediaStreamTrackAdapter( | |
32 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread, | |
33 WebRtcMediaStreamTrackType* webrtc_track) | |
34 : main_thread_(main_thread), | |
35 webrtc_track_(webrtc_track), | |
36 id_(webrtc_track->id()) {} | |
37 | |
38 const scoped_refptr<WebRtcMediaStreamTrackType>& observed_track() { | |
39 return webrtc_track_; | |
40 } | |
41 | |
42 blink::WebMediaStreamTrack* webkit_track() { | |
43 DCHECK(main_thread_->BelongsToCurrentThread()); | |
44 DCHECK(!webkit_track_.IsNull()); | |
45 return &webkit_track_; | |
Guido Urdaneta
2017/05/22 14:26:38
Can you take this opportunity to rename things tha
hbos_chromium
2017/05/29 11:24:17
Done.
| |
46 } | |
47 | |
48 const std::string& id() const { return id_; } | |
49 | |
50 bool initialized() const { | |
51 DCHECK(main_thread_->BelongsToCurrentThread()); | |
52 return !webkit_track_.IsNull(); | |
53 } | |
54 | |
55 void Initialize() { | |
56 DCHECK(main_thread_->BelongsToCurrentThread()); | |
57 DCHECK(!initialized()); | |
58 webkit_initialize_.Run(); | |
59 webkit_initialize_.Reset(); | |
60 DCHECK(initialized()); | |
61 } | |
62 | |
63 protected: | |
64 friend class base::RefCountedThreadSafe< | |
65 RemoteMediaStreamTrackAdapter<WebRtcMediaStreamTrackType>>; | |
66 | |
67 virtual ~RemoteMediaStreamTrackAdapter() { | |
68 DCHECK(main_thread_->BelongsToCurrentThread()); | |
69 } | |
70 | |
71 void InitializeWebkitTrack(blink::WebMediaStreamSource::Type type) { | |
72 DCHECK(main_thread_->BelongsToCurrentThread()); | |
73 DCHECK(webkit_track_.IsNull()); | |
74 | |
75 blink::WebString webkit_track_id(blink::WebString::FromUTF8(id_)); | |
76 blink::WebMediaStreamSource webkit_source; | |
77 webkit_source.Initialize(webkit_track_id, type, webkit_track_id, | |
78 true /* remote */); | |
79 webkit_track_.Initialize(webkit_track_id, webkit_source); | |
80 DCHECK(!webkit_track_.IsNull()); | |
81 } | |
82 | |
83 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; | |
84 // This callback will be run when Initialize() is called and then freed. | |
85 // The callback is used by derived classes to bind objects that need to be | |
86 // instantiated and initialized on the signaling thread but then moved to | |
87 // and used on the main thread when initializing the webkit object(s). | |
88 base::Callback<void()> webkit_initialize_; | |
89 | |
90 private: | |
91 const scoped_refptr<WebRtcMediaStreamTrackType> webrtc_track_; | |
92 blink::WebMediaStreamTrack webkit_track_; | |
93 // const copy of the webrtc track id that allows us to check it from both the | |
94 // main and signaling threads without incurring a synchronous thread hop. | |
95 const std::string id_; | |
96 | |
97 DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackAdapter); | |
98 }; | |
99 | |
100 class RemoteVideoTrackAdapter | |
101 : public RemoteMediaStreamTrackAdapter<webrtc::VideoTrackInterface> { | |
102 public: | |
103 // Called on the signaling thread. | |
104 RemoteVideoTrackAdapter( | |
105 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread, | |
106 webrtc::VideoTrackInterface* webrtc_track); | |
107 | |
108 protected: | |
109 ~RemoteVideoTrackAdapter() override; | |
110 | |
111 private: | |
112 void InitializeWebkitVideoTrack(std::unique_ptr<TrackObserver> observer, | |
113 bool enabled); | |
114 }; | |
115 | |
116 // RemoteAudioTrackAdapter is responsible for listening on state | |
117 // change notifications on a remote webrtc audio MediaStreamTracks and notify | |
118 // WebKit. | |
119 class RemoteAudioTrackAdapter | |
120 : public RemoteMediaStreamTrackAdapter<webrtc::AudioTrackInterface>, | |
121 public webrtc::ObserverInterface { | |
122 public: | |
123 // Called on the signaling thread. | |
124 RemoteAudioTrackAdapter( | |
125 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread, | |
126 webrtc::AudioTrackInterface* webrtc_track); | |
127 | |
128 void Unregister(); | |
129 | |
130 protected: | |
131 ~RemoteAudioTrackAdapter() override; | |
132 | |
133 private: | |
134 void InitializeWebkitAudioTrack(); | |
135 | |
136 // webrtc::ObserverInterface implementation. | |
137 void OnChanged() override; | |
138 | |
139 void OnChangedOnMainThread( | |
140 webrtc::MediaStreamTrackInterface::TrackState state); | |
141 | |
142 #if DCHECK_IS_ON() | |
143 bool unregistered_; | |
144 #endif | |
145 | |
146 webrtc::MediaStreamTrackInterface::TrackState state_; | |
147 | |
148 DISALLOW_COPY_AND_ASSIGN(RemoteAudioTrackAdapter); | |
149 }; | |
150 | |
151 } // namespace content | |
152 | |
153 #endif // CONTENT_RENDERER_MEDIA_REMOTE_MEDIA_TRACK_ADAPTER_H_ | |
OLD | NEW |