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

Side by Side Diff: content/renderer/media/webrtc/webrtc_media_stream_adapter.cc

Issue 2897603004: WebRtcMediaStreamAdapter using WebRtcMediaStreamTrackMap. (Closed)
Patch Set: Rebase after dep CL landed 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/webrtc/webrtc_media_stream_adapter.h" 5 #include "content/renderer/media/webrtc/webrtc_media_stream_adapter.h"
6 6
7 #include <utility>
8
7 #include "base/logging.h" 9 #include "base/logging.h"
8 #include "content/renderer/media/media_stream_audio_track.h" 10 #include "content/renderer/media/media_stream_audio_track.h"
9 #include "content/renderer/media/media_stream_track.h"
10 #include "content/renderer/media/webrtc/media_stream_video_webrtc_sink.h"
11 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" 11 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
12 #include "content/renderer/media/webrtc/processed_local_audio_source.h" 12 #include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h"
13 #include "content/renderer/media/webrtc/webrtc_audio_sink.h"
14 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" 13 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
15 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 14 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
16 #include "third_party/WebKit/public/platform/WebString.h"
17 15
18 namespace content { 16 namespace content {
19 17
20 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter( 18 WebRtcMediaStreamAdapter::WebRtcMediaStreamAdapter(
21 const blink::WebMediaStream& web_stream, 19 PeerConnectionDependencyFactory* factory,
22 PeerConnectionDependencyFactory* factory) 20 scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
23 : web_stream_(web_stream), 21 const blink::WebMediaStream& web_stream)
24 factory_(factory) { 22 : factory_(factory),
23 track_adapter_map_(track_adapter_map),
24 web_stream_(web_stream) {
25 webrtc_media_stream_ = 25 webrtc_media_stream_ =
26 factory_->CreateLocalMediaStream(web_stream.Id().Utf8()); 26 factory_->CreateLocalMediaStream(web_stream.Id().Utf8());
27 27
28 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; 28 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
29 web_stream_.AudioTracks(audio_tracks); 29 web_stream_.AudioTracks(audio_tracks);
30 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) 30 for (blink::WebMediaStreamTrack& audio_track : audio_tracks)
31 AddAudioSinkToTrack(audio_track); 31 TrackAdded(audio_track);
32 32
33 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; 33 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
34 web_stream_.VideoTracks(video_tracks); 34 web_stream_.VideoTracks(video_tracks);
35 for (blink::WebMediaStreamTrack& video_track : video_tracks) 35 for (blink::WebMediaStreamTrack& video_track : video_tracks)
36 AddVideoSinkToTrack(video_track); 36 TrackAdded(video_track);
37 37
38 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); 38 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_);
39 native_stream->AddObserver(this); 39 native_stream->AddObserver(this);
40 } 40 }
41 41
42 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() { 42 WebRtcMediaStreamAdapter::~WebRtcMediaStreamAdapter() {
43 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_); 43 MediaStream* const native_stream = MediaStream::GetMediaStream(web_stream_);
44 native_stream->RemoveObserver(this); 44 native_stream->RemoveObserver(this);
45 45
46 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; 46 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
47 web_stream_.AudioTracks(audio_tracks); 47 web_stream_.AudioTracks(audio_tracks);
48 for (blink::WebMediaStreamTrack& audio_track : audio_tracks) 48 for (blink::WebMediaStreamTrack& audio_track : audio_tracks)
49 TrackRemoved(audio_track); 49 TrackRemoved(audio_track);
50 DCHECK(audio_sinks_.empty()); 50
51 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; 51 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
52 web_stream_.VideoTracks(video_tracks); 52 web_stream_.VideoTracks(video_tracks);
53 for (blink::WebMediaStreamTrack& video_track : video_tracks) 53 for (blink::WebMediaStreamTrack& video_track : video_tracks)
54 TrackRemoved(video_track); 54 TrackRemoved(video_track);
55 DCHECK(video_sinks_.empty());
56 } 55 }
57 56
58 void WebRtcMediaStreamAdapter::TrackAdded( 57 void WebRtcMediaStreamAdapter::TrackAdded(
59 const blink::WebMediaStreamTrack& track) { 58 const blink::WebMediaStreamTrack& web_track) {
60 if (track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio) 59 std::string track_id = web_track.Id().Utf8();
61 AddAudioSinkToTrack(track); 60 DCHECK(adapter_refs_.find(track_id) == adapter_refs_.end());
62 else 61 bool is_audio_track =
63 AddVideoSinkToTrack(track); 62 (web_track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio);
63 if (is_audio_track && !MediaStreamAudioTrack::From(web_track)) {
64 DLOG(ERROR) << "No native track for blink audio track.";
65 return;
66 }
67 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> adapter_ref =
68 track_adapter_map_->GetOrCreateLocalTrackAdapter(web_track);
69 if (is_audio_track) {
70 webrtc_media_stream_->AddTrack(
71 static_cast<webrtc::AudioTrackInterface*>(adapter_ref->webrtc_track()));
72 } else {
73 webrtc_media_stream_->AddTrack(
74 static_cast<webrtc::VideoTrackInterface*>(adapter_ref->webrtc_track()));
75 }
76 adapter_refs_.insert(std::make_pair(track_id, std::move(adapter_ref)));
64 } 77 }
65 78
66 void WebRtcMediaStreamAdapter::TrackRemoved( 79 void WebRtcMediaStreamAdapter::TrackRemoved(
67 const blink::WebMediaStreamTrack& track) { 80 const blink::WebMediaStreamTrack& web_track) {
68 const std::string track_id = track.Id().Utf8(); 81 std::string track_id = web_track.Id().Utf8();
69 if (track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio) { 82 auto it = adapter_refs_.find(track_id);
70 scoped_refptr<webrtc::AudioTrackInterface> webrtc_track = 83 if (it == adapter_refs_.end()) {
71 make_scoped_refptr( 84 // This can happen for audio tracks that don't have a source, these would
72 webrtc_media_stream_->FindAudioTrack(track_id).get()); 85 // never be added in the first place.
73 if (!webrtc_track)
74 return;
75 webrtc_media_stream_->RemoveTrack(webrtc_track.get());
76
77 for (auto it = audio_sinks_.begin(); it != audio_sinks_.end(); ++it) {
78 if ((*it)->webrtc_audio_track() == webrtc_track.get()) {
79 if (auto* media_stream_track = MediaStreamAudioTrack::From(track))
80 media_stream_track->RemoveSink(it->get());
81 audio_sinks_.erase(it);
82 break;
83 }
84 }
85 } else {
86 DCHECK_EQ(track.Source().GetType(),
87 blink::WebMediaStreamSource::kTypeVideo);
88 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track =
89 make_scoped_refptr(
90 webrtc_media_stream_->FindVideoTrack(track_id).get());
91 if (!webrtc_track)
92 return;
93 webrtc_media_stream_->RemoveTrack(webrtc_track.get());
94
95 for (auto it = video_sinks_.begin(); it != video_sinks_.end(); ++it) {
96 if ((*it)->webrtc_video_track() == webrtc_track.get()) {
97 video_sinks_.erase(it);
98 break;
99 }
100 }
101 }
102 }
103
104 // TODO(hbos): Replace this code with |WebRtcMediaStreamTrackAdapter|.
105 // crbug.com/705901
106 void WebRtcMediaStreamAdapter::AddAudioSinkToTrack(
107 const blink::WebMediaStreamTrack& track) {
108 MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track);
109 if (!native_track) {
110 DLOG(ERROR) << "No native track for blink audio track.";
111 return; 86 return;
112 } 87 }
113 88 if (web_track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio) {
114 // Non-WebRtc remote sources and local sources do not provide an instance of 89 webrtc_media_stream_->RemoveTrack(
115 // the webrtc::AudioSourceInterface, and also do not need references to the 90 static_cast<webrtc::AudioTrackInterface*>(it->second->webrtc_track()));
116 // audio level calculator or audio processor passed to the sink. 91 } else {
117 webrtc::AudioSourceInterface* source_interface = nullptr; 92 webrtc_media_stream_->RemoveTrack(
118 WebRtcAudioSink* audio_sink = 93 static_cast<webrtc::VideoTrackInterface*>(it->second->webrtc_track()));
119 new WebRtcAudioSink(track.Id().Utf8(), source_interface,
120 factory_->GetWebRtcSignalingThread());
121
122 if (auto* media_stream_source = ProcessedLocalAudioSource::From(
123 MediaStreamAudioSource::From(track.Source()))) {
124 audio_sink->SetLevel(media_stream_source->audio_level());
125 // The sink only grabs stats from the audio processor. Stats are only
126 // available if audio processing is turned on. Therefore, only provide the
127 // sink a reference to the processor if audio processing is turned on.
128 if (auto processor = media_stream_source->audio_processor()) {
129 if (processor && processor->has_audio_processing())
130 audio_sink->SetAudioProcessor(processor);
131 }
132 } 94 }
133 95 adapter_refs_.erase(it);
134 audio_sinks_.push_back(std::unique_ptr<WebRtcAudioSink>(audio_sink));
135 native_track->AddSink(audio_sink);
136 webrtc_media_stream_->AddTrack(audio_sink->webrtc_audio_track());
137 }
138
139 // TODO(hbos): Replace this code with |WebRtcMediaStreamTrackAdapter|.
140 // crbug.com/705901
141 void WebRtcMediaStreamAdapter::AddVideoSinkToTrack(
142 const blink::WebMediaStreamTrack& track) {
143 DCHECK_EQ(track.Source().GetType(), blink::WebMediaStreamSource::kTypeVideo);
144 MediaStreamVideoWebRtcSink* video_sink =
145 new MediaStreamVideoWebRtcSink(track, factory_);
146 video_sinks_.push_back(
147 std::unique_ptr<MediaStreamVideoWebRtcSink>(video_sink));
148 webrtc_media_stream_->AddTrack(video_sink->webrtc_video_track());
149 } 96 }
150 97
151 } // namespace content 98 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698