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

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: Addressed nits Created 3 years, 6 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* web_track() {
43 DCHECK(main_thread_->BelongsToCurrentThread());
44 DCHECK(!web_track_.IsNull());
45 return &web_track_;
46 }
47
48 const std::string& id() const { return id_; }
49
50 bool initialized() const {
51 DCHECK(main_thread_->BelongsToCurrentThread());
52 return !web_track_.IsNull();
53 }
54
55 void Initialize() {
56 DCHECK(main_thread_->BelongsToCurrentThread());
57 DCHECK(!initialized());
58 web_initialize_.Run();
59 web_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 InitializeWebTrack(blink::WebMediaStreamSource::Type type) {
72 DCHECK(main_thread_->BelongsToCurrentThread());
73 DCHECK(web_track_.IsNull());
74
75 blink::WebString web_track_id(blink::WebString::FromUTF8(id_));
76 blink::WebMediaStreamSource web_source;
77 web_source.Initialize(web_track_id, type, web_track_id, true /* remote */);
78 web_track_.Initialize(web_track_id, web_source);
79 DCHECK(!web_track_.IsNull());
80 }
81
82 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
83 // This callback will be run when Initialize() is called and then freed.
84 // The callback is used by derived classes to bind objects that need to be
85 // instantiated and initialized on the signaling thread but then moved to
86 // and used on the main thread when initializing the web object(s).
87 base::Callback<void()> web_initialize_;
88
89 private:
90 const scoped_refptr<WebRtcMediaStreamTrackType> webrtc_track_;
91 blink::WebMediaStreamTrack web_track_;
92 // const copy of the webrtc track id that allows us to check it from both the
93 // main and signaling threads without incurring a synchronous thread hop.
94 const std::string id_;
95
96 DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackAdapter);
97 };
98
99 class RemoteVideoTrackAdapter
100 : public RemoteMediaStreamTrackAdapter<webrtc::VideoTrackInterface> {
101 public:
102 // Called on the signaling thread.
103 RemoteVideoTrackAdapter(
104 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
105 webrtc::VideoTrackInterface* webrtc_track);
106
107 protected:
108 ~RemoteVideoTrackAdapter() override;
109
110 private:
111 void InitializeWebVideoTrack(std::unique_ptr<TrackObserver> observer,
112 bool enabled);
113 };
114
115 // RemoteAudioTrackAdapter is responsible for listening on state
116 // change notifications on a remote webrtc audio MediaStreamTracks and notify
117 // Blink.
118 class RemoteAudioTrackAdapter
119 : public RemoteMediaStreamTrackAdapter<webrtc::AudioTrackInterface>,
120 public webrtc::ObserverInterface {
121 public:
122 // Called on the signaling thread.
123 RemoteAudioTrackAdapter(
124 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
125 webrtc::AudioTrackInterface* webrtc_track);
126
127 void Unregister();
128
129 protected:
130 ~RemoteAudioTrackAdapter() override;
131
132 private:
133 void InitializeWebAudioTrack();
134
135 // webrtc::ObserverInterface implementation.
136 void OnChanged() override;
137
138 void OnChangedOnMainThread(
139 webrtc::MediaStreamTrackInterface::TrackState state);
140
141 #if DCHECK_IS_ON()
142 bool unregistered_;
143 #endif
144
145 webrtc::MediaStreamTrackInterface::TrackState state_;
146
147 DISALLOW_COPY_AND_ASSIGN(RemoteAudioTrackAdapter);
148 };
149
150 } // namespace content
151
152 #endif // CONTENT_RENDERER_MEDIA_REMOTE_MEDIA_TRACK_ADAPTER_H_
OLDNEW
« no previous file with comments | « content/renderer/media/remote_media_stream_impl.cc ('k') | content/renderer/media/remote_media_stream_track_adapter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698