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

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

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 #include "content/renderer/media/remote_media_stream_track_adapter.h"
6
7 #include "content/renderer/media/media_stream_audio_source.h"
8 #include "content/renderer/media/media_stream_video_track.h"
9 #include "content/renderer/media/webrtc/media_stream_remote_video_source.h"
10 #include "content/renderer/media/webrtc/peer_connection_remote_audio_source.h"
11 #include "content/renderer/media/webrtc/track_observer.h"
12
13 namespace content {
14
15 RemoteVideoTrackAdapter::RemoteVideoTrackAdapter(
16 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
17 webrtc::VideoTrackInterface* webrtc_track)
18 : RemoteMediaStreamTrackAdapter(main_thread, webrtc_track) {
19 std::unique_ptr<TrackObserver> observer(
20 new TrackObserver(main_thread, observed_track().get()));
21 // Here, we use base::Unretained() to avoid a circular reference.
22 webkit_initialize_ =
23 base::Bind(&RemoteVideoTrackAdapter::InitializeWebkitVideoTrack,
24 base::Unretained(this), base::Passed(&observer),
25 observed_track()->enabled());
26 }
27
28 RemoteVideoTrackAdapter::~RemoteVideoTrackAdapter() {
29 DCHECK(main_thread_->BelongsToCurrentThread());
30 if (initialized()) {
31 static_cast<MediaStreamRemoteVideoSource*>(
32 webkit_track()->Source().GetExtraData())
33 ->OnSourceTerminated();
34 }
35 }
36
37 void RemoteVideoTrackAdapter::InitializeWebkitVideoTrack(
38 std::unique_ptr<TrackObserver> observer,
39 bool enabled) {
40 DCHECK(main_thread_->BelongsToCurrentThread());
41 std::unique_ptr<MediaStreamRemoteVideoSource> video_source(
42 new MediaStreamRemoteVideoSource(std::move(observer)));
43 InitializeWebkitTrack(blink::WebMediaStreamSource::kTypeVideo);
44 webkit_track()->Source().SetExtraData(video_source.get());
45 MediaStreamVideoTrack* media_stream_track = new MediaStreamVideoTrack(
46 video_source.release(), MediaStreamVideoSource::ConstraintsCallback(),
47 enabled);
48 webkit_track()->SetTrackData(media_stream_track);
49 }
50
51 RemoteAudioTrackAdapter::RemoteAudioTrackAdapter(
52 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
53 webrtc::AudioTrackInterface* webrtc_track)
54 : RemoteMediaStreamTrackAdapter(main_thread, webrtc_track),
55 #if DCHECK_IS_ON()
56 unregistered_(false),
57 #endif
58 state_(observed_track()->state()) {
59 // TODO(tommi): Use TrackObserver instead.
60 observed_track()->RegisterObserver(this);
61 // Here, we use base::Unretained() to avoid a circular reference.
62 webkit_initialize_ =
63 base::Bind(&RemoteAudioTrackAdapter::InitializeWebkitAudioTrack,
64 base::Unretained(this));
65 }
66
67 RemoteAudioTrackAdapter::~RemoteAudioTrackAdapter() {
68 #if DCHECK_IS_ON()
69 DCHECK(unregistered_);
70 #endif
71 }
72
73 void RemoteAudioTrackAdapter::Unregister() {
74 #if DCHECK_IS_ON()
75 DCHECK(!unregistered_);
76 unregistered_ = true;
77 #endif
78 observed_track()->UnregisterObserver(this);
79 }
80
81 void RemoteAudioTrackAdapter::InitializeWebkitAudioTrack() {
82 InitializeWebkitTrack(blink::WebMediaStreamSource::kTypeAudio);
83
84 MediaStreamAudioSource* const source =
85 new PeerConnectionRemoteAudioSource(observed_track().get());
86 webkit_track()->Source().SetExtraData(source); // Takes ownership.
87 source->ConnectToTrack(*(webkit_track()));
88 }
89
90 void RemoteAudioTrackAdapter::OnChanged() {
91 main_thread_->PostTask(
92 FROM_HERE, base::Bind(&RemoteAudioTrackAdapter::OnChangedOnMainThread,
93 this, observed_track()->state()));
94 }
95
96 void RemoteAudioTrackAdapter::OnChangedOnMainThread(
97 webrtc::MediaStreamTrackInterface::TrackState state) {
98 DCHECK(main_thread_->BelongsToCurrentThread());
99
100 if (state == state_ || !initialized())
101 return;
102
103 state_ = state;
104
105 switch (state) {
106 case webrtc::MediaStreamTrackInterface::kLive:
107 webkit_track()->Source().SetReadyState(
108 blink::WebMediaStreamSource::kReadyStateLive);
109 break;
110 case webrtc::MediaStreamTrackInterface::kEnded:
111 webkit_track()->Source().SetReadyState(
112 blink::WebMediaStreamSource::kReadyStateEnded);
113 break;
114 default:
115 NOTREACHED();
116 break;
117 }
118 }
119
120 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698