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

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

Issue 2791303002: Clone MediaStream video tracks correctly with spec-compliant constraints. (Closed)
Patch Set: rebase Created 3 years, 8 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/media_stream_center.h" 5 #include "content/renderer/media/media_stream_center.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <string> 9 #include <string>
10 10
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 media_stream_source = new WebAudioMediaStreamSource(&source); 54 media_stream_source = new WebAudioMediaStreamSource(&source);
55 source.setExtraData(media_stream_source); // Takes ownership. 55 source.setExtraData(media_stream_source); // Takes ownership.
56 } 56 }
57 57
58 if (media_stream_source) 58 if (media_stream_source)
59 media_stream_source->ConnectToTrack(track); 59 media_stream_source->ConnectToTrack(track);
60 else 60 else
61 LOG(DFATAL) << "WebMediaStreamSource missing its MediaStreamAudioSource."; 61 LOG(DFATAL) << "WebMediaStreamSource missing its MediaStreamAudioSource.";
62 } 62 }
63 63
64 void CreateNativeVideoMediaStreamTrack( 64 void CreateNativeVideoMediaStreamTrack(blink::WebMediaStreamTrack track) {
65 const blink::WebMediaStreamTrack& track) {
66 DCHECK(track.getTrackData() == NULL); 65 DCHECK(track.getTrackData() == NULL);
67 blink::WebMediaStreamSource source = track.source(); 66 blink::WebMediaStreamSource source = track.source();
68 DCHECK_EQ(source.getType(), blink::WebMediaStreamSource::TypeVideo); 67 DCHECK_EQ(source.getType(), blink::WebMediaStreamSource::TypeVideo);
69 MediaStreamVideoSource* native_source = 68 MediaStreamVideoSource* native_source =
70 MediaStreamVideoSource::GetVideoSource(source); 69 MediaStreamVideoSource::GetVideoSource(source);
71 DCHECK(native_source); 70 DCHECK(native_source);
72 blink::WebMediaStreamTrack writable_track(track);
73 if (IsOldVideoConstraints()) { 71 if (IsOldVideoConstraints()) {
74 // TODO(perkj): The constraints to use here should be passed from blink when 72 // TODO(perkj): The constraints to use here should be passed from blink when
75 // a new track is created. For cloning, it should be the constraints of the 73 // a new track is created. For cloning, it should be the constraints of the
76 // cloned track and not the originating source. 74 // cloned track and not the originating source.
77 // Also - source.constraints() returns an uninitialized constraint if the 75 // Also - source.constraints() returns an uninitialized constraint if the
78 // source is coming from a remote video track. See http://crbug/287805. 76 // source is coming from a remote video track. See http://crbug/287805.
79 blink::WebMediaConstraints constraints = source.constraints(); 77 blink::WebMediaConstraints constraints = source.constraints();
80 if (constraints.isNull()) 78 if (constraints.isNull())
81 constraints.initialize(); 79 constraints.initialize();
82 writable_track.setTrackData(new MediaStreamVideoTrack( 80 track.setTrackData(new MediaStreamVideoTrack(
83 native_source, constraints, 81 native_source, constraints,
84 MediaStreamVideoSource::ConstraintsCallback(), track.isEnabled())); 82 MediaStreamVideoSource::ConstraintsCallback(), track.isEnabled()));
85 } else { 83 } else {
86 // TODO(guidou): All existing uses are without constraints except for the 84 track.setTrackData(new MediaStreamVideoTrack(
87 // case of cloning a track. To fix this, create a new function in
88 // MediaStreamCenter specifically for cloning.
89 writable_track.setTrackData(new MediaStreamVideoTrack(
90 native_source, MediaStreamVideoSource::ConstraintsCallback(), 85 native_source, MediaStreamVideoSource::ConstraintsCallback(),
91 track.isEnabled())); 86 track.isEnabled()));
92 } 87 }
93 } 88 }
94 89
90 void CloneNativeVideoMediaStreamTrack(
91 const blink::WebMediaStreamTrack& original,
92 blink::WebMediaStreamTrack clone) {
93 DCHECK(!clone.getTrackData());
94 blink::WebMediaStreamSource source = clone.source();
95 DCHECK_EQ(source.getType(), blink::WebMediaStreamSource::TypeVideo);
96 MediaStreamVideoSource* native_source =
97 MediaStreamVideoSource::GetVideoSource(source);
98 DCHECK(native_source);
99 if (IsOldVideoConstraints()) {
100 // TODO(perkj): The constraints to use here should be passed from blink when
101 // a new track is created. For cloning, it should be the constraints of the
102 // cloned track and not the originating source.
103 // Also - source.constraints() returns an uninitialized constraint if the
104 // source is coming from a remote video track. See http://crbug/287805.
105 blink::WebMediaConstraints constraints = source.constraints();
106 if (constraints.isNull())
107 constraints.initialize();
108 clone.setTrackData(new MediaStreamVideoTrack(
109 native_source, constraints,
110 MediaStreamVideoSource::ConstraintsCallback(), clone.isEnabled()));
111 } else {
112 MediaStreamVideoTrack* original_track =
113 MediaStreamVideoTrack::GetVideoTrack(original);
114 DCHECK(original_track);
115 clone.setTrackData(new MediaStreamVideoTrack(
116 native_source, original_track->adapter_settings(),
117 original_track->noise_reduction(), original_track->is_screencast(),
118 original_track->min_frame_rate(),
119 MediaStreamVideoSource::ConstraintsCallback(), clone.isEnabled()));
120 }
121 }
122
95 } // namespace 123 } // namespace
96 124
97 MediaStreamCenter::MediaStreamCenter( 125 MediaStreamCenter::MediaStreamCenter(
98 blink::WebMediaStreamCenterClient* client, 126 blink::WebMediaStreamCenterClient* client,
99 PeerConnectionDependencyFactory* factory) {} 127 PeerConnectionDependencyFactory* factory) {}
100 128
101 MediaStreamCenter::~MediaStreamCenter() {} 129 MediaStreamCenter::~MediaStreamCenter() {}
102 130
103 void MediaStreamCenter::didCreateMediaStreamTrack( 131 void MediaStreamCenter::didCreateMediaStreamTrack(
104 const blink::WebMediaStreamTrack& track) { 132 const blink::WebMediaStreamTrack& track) {
105 DVLOG(1) << "MediaStreamCenter::didCreateMediaStreamTrack"; 133 DVLOG(1) << "MediaStreamCenter::didCreateMediaStreamTrack";
106 DCHECK(!track.isNull() && !track.getTrackData()); 134 DCHECK(!track.isNull() && !track.getTrackData());
107 DCHECK(!track.source().isNull()); 135 DCHECK(!track.source().isNull());
108 136
109 switch (track.source().getType()) { 137 switch (track.source().getType()) {
110 case blink::WebMediaStreamSource::TypeAudio: 138 case blink::WebMediaStreamSource::TypeAudio:
111 CreateNativeAudioMediaStreamTrack(track); 139 CreateNativeAudioMediaStreamTrack(track);
112 break; 140 break;
113 case blink::WebMediaStreamSource::TypeVideo: 141 case blink::WebMediaStreamSource::TypeVideo:
114 CreateNativeVideoMediaStreamTrack(track); 142 CreateNativeVideoMediaStreamTrack(track);
115 break; 143 break;
116 } 144 }
117 } 145 }
118 146
147 void MediaStreamCenter::didCloneMediaStreamTrack(
148 const blink::WebMediaStreamTrack& original,
149 const blink::WebMediaStreamTrack& clone) {
150 DCHECK(!clone.isNull());
151 DCHECK(!clone.getTrackData());
152 DCHECK(!clone.source().isNull());
153
154 switch (clone.source().getType()) {
155 case blink::WebMediaStreamSource::TypeAudio:
156 CreateNativeAudioMediaStreamTrack(clone);
157 break;
158 case blink::WebMediaStreamSource::TypeVideo:
159 CloneNativeVideoMediaStreamTrack(original, clone);
160 break;
161 }
162 }
163
119 void MediaStreamCenter::didSetContentHint( 164 void MediaStreamCenter::didSetContentHint(
120 const blink::WebMediaStreamTrack& track) { 165 const blink::WebMediaStreamTrack& track) {
121 MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track); 166 MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track);
122 if (native_track) 167 if (native_track)
123 native_track->SetContentHint(track.contentHint()); 168 native_track->SetContentHint(track.contentHint());
124 } 169 }
125 170
126 void MediaStreamCenter::didEnableMediaStreamTrack( 171 void MediaStreamCenter::didEnableMediaStreamTrack(
127 const blink::WebMediaStreamTrack& track) { 172 const blink::WebMediaStreamTrack& track) {
128 MediaStreamTrack* native_track = 173 MediaStreamTrack* native_track =
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 251
207 bool MediaStreamCenter::didRemoveMediaStreamTrack( 252 bool MediaStreamCenter::didRemoveMediaStreamTrack(
208 const blink::WebMediaStream& stream, 253 const blink::WebMediaStream& stream,
209 const blink::WebMediaStreamTrack& track) { 254 const blink::WebMediaStreamTrack& track) {
210 DVLOG(1) << "MediaStreamCenter::didRemoveMediaStreamTrack"; 255 DVLOG(1) << "MediaStreamCenter::didRemoveMediaStreamTrack";
211 MediaStream* native_stream = MediaStream::GetMediaStream(stream); 256 MediaStream* native_stream = MediaStream::GetMediaStream(stream);
212 return native_stream->RemoveTrack(track); 257 return native_stream->RemoveTrack(track);
213 } 258 }
214 259
215 } // namespace content 260 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_center.h ('k') | third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698