Index: content/renderer/media/media_stream_center.cc |
diff --git a/content/renderer/media/media_stream_center.cc b/content/renderer/media/media_stream_center.cc |
index 283df659d9c55fdb7bfca9b9895a660de88d0c89..fbbfb8fd686ad79d20d5a712509ab980a089362c 100644 |
--- a/content/renderer/media/media_stream_center.cc |
+++ b/content/renderer/media/media_stream_center.cc |
@@ -61,15 +61,13 @@ void CreateNativeAudioMediaStreamTrack( |
LOG(DFATAL) << "WebMediaStreamSource missing its MediaStreamAudioSource."; |
} |
-void CreateNativeVideoMediaStreamTrack( |
- const blink::WebMediaStreamTrack& track) { |
+void CreateNativeVideoMediaStreamTrack(blink::WebMediaStreamTrack track) { |
DCHECK(track.getTrackData() == NULL); |
blink::WebMediaStreamSource source = track.source(); |
DCHECK_EQ(source.getType(), blink::WebMediaStreamSource::TypeVideo); |
MediaStreamVideoSource* native_source = |
MediaStreamVideoSource::GetVideoSource(source); |
DCHECK(native_source); |
- blink::WebMediaStreamTrack writable_track(track); |
if (IsOldVideoConstraints()) { |
// TODO(perkj): The constraints to use here should be passed from blink when |
// a new track is created. For cloning, it should be the constraints of the |
@@ -79,19 +77,49 @@ void CreateNativeVideoMediaStreamTrack( |
blink::WebMediaConstraints constraints = source.constraints(); |
if (constraints.isNull()) |
constraints.initialize(); |
- writable_track.setTrackData(new MediaStreamVideoTrack( |
+ track.setTrackData(new MediaStreamVideoTrack( |
native_source, constraints, |
MediaStreamVideoSource::ConstraintsCallback(), track.isEnabled())); |
} else { |
- // TODO(guidou): All existing uses are without constraints except for the |
- // case of cloning a track. To fix this, create a new function in |
- // MediaStreamCenter specifically for cloning. |
- writable_track.setTrackData(new MediaStreamVideoTrack( |
+ track.setTrackData(new MediaStreamVideoTrack( |
native_source, MediaStreamVideoSource::ConstraintsCallback(), |
track.isEnabled())); |
} |
} |
+void CloneNativeVideoMediaStreamTrack( |
+ const blink::WebMediaStreamTrack& original, |
+ blink::WebMediaStreamTrack clone) { |
+ DCHECK(!clone.getTrackData()); |
+ blink::WebMediaStreamSource source = clone.source(); |
+ DCHECK_EQ(source.getType(), blink::WebMediaStreamSource::TypeVideo); |
+ MediaStreamVideoSource* native_source = |
+ MediaStreamVideoSource::GetVideoSource(source); |
+ DCHECK(native_source); |
+ if (IsOldVideoConstraints()) { |
+ // TODO(perkj): The constraints to use here should be passed from blink when |
+ // a new track is created. For cloning, it should be the constraints of the |
+ // cloned track and not the originating source. |
+ // Also - source.constraints() returns an uninitialized constraint if the |
+ // source is coming from a remote video track. See http://crbug/287805. |
+ blink::WebMediaConstraints constraints = source.constraints(); |
+ if (constraints.isNull()) |
+ constraints.initialize(); |
+ clone.setTrackData(new MediaStreamVideoTrack( |
+ native_source, constraints, |
+ MediaStreamVideoSource::ConstraintsCallback(), clone.isEnabled())); |
+ } else { |
+ MediaStreamVideoTrack* original_track = |
+ MediaStreamVideoTrack::GetVideoTrack(original); |
+ DCHECK(original_track); |
+ clone.setTrackData(new MediaStreamVideoTrack( |
+ native_source, original_track->adapter_settings(), |
+ original_track->noise_reduction(), original_track->is_screencast(), |
+ original_track->min_frame_rate(), |
+ MediaStreamVideoSource::ConstraintsCallback(), clone.isEnabled())); |
+ } |
+} |
+ |
} // namespace |
MediaStreamCenter::MediaStreamCenter( |
@@ -116,6 +144,23 @@ void MediaStreamCenter::didCreateMediaStreamTrack( |
} |
} |
+void MediaStreamCenter::didCloneMediaStreamTrack( |
+ const blink::WebMediaStreamTrack& original, |
+ const blink::WebMediaStreamTrack& clone) { |
+ DCHECK(!clone.isNull()); |
+ DCHECK(!clone.getTrackData()); |
+ DCHECK(!clone.source().isNull()); |
+ |
+ switch (clone.source().getType()) { |
+ case blink::WebMediaStreamSource::TypeAudio: |
+ CreateNativeAudioMediaStreamTrack(clone); |
+ break; |
+ case blink::WebMediaStreamSource::TypeVideo: |
+ CloneNativeVideoMediaStreamTrack(original, clone); |
+ break; |
+ } |
+} |
+ |
void MediaStreamCenter::didSetContentHint( |
const blink::WebMediaStreamTrack& track) { |
MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track); |