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

Side by Side Diff: content/renderer/media/remote_media_stream_track_adapter.h

Issue 2883023002: WebRtcMediaStreamTrackAdapter, maps 1 webrtc and 1 blink track (Closed)
Patch Set: Created 3 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
OLDNEW
(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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698