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 75b266dc49187d94d2be4d1ca66d02897d941e2b..f3d3429d6fb004b04eb72844ec186862ff0bcc47 100644 |
--- a/content/renderer/media/media_stream_center.cc |
+++ b/content/renderer/media/media_stream_center.cc |
@@ -9,17 +9,79 @@ |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/utf_string_conversions.h" |
+#include "content/renderer/media/media_stream_impl.h" |
+#include "content/renderer/media/media_stream_extra_data.h" |
+#include "content/renderer/render_view_impl.h" |
#include "third_party/libjingle/source/talk/app/webrtc/jsep.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebICECandidateDescriptor.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamCenterClient.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamComponent.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamDescriptor.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamSource.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamSourcesRequest.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSessionDescriptionDescriptor.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
namespace content { |
+static MediaStreamImpl* GetMediaStreamImpl(WebKit::WebFrame* web_frame) { |
+ RenderViewImpl* render_view = RenderViewImpl::FromWebView(web_frame->view()); |
+ if (!render_view) |
+ return NULL; |
+ |
+ // TODO(perkj): Avoid this cast? |
+ return static_cast<MediaStreamImpl*>(render_view->userMediaClient()); |
+} |
+ |
+static webrtc::MediaStreamInterface* GetNativeMediaStream( |
+ const WebKit::WebMediaStreamDescriptor& stream) { |
+ MediaStreamExtraData* extra_data = |
+ static_cast<MediaStreamExtraData*>(stream.extraData()); |
tommi (sloooow) - chröme
2012/05/14 14:33:52
unless extraData returns a type that is related to
perkj_chrome
2012/05/14 15:14:33
inheritance
|
+ if (extra_data && extra_data->remote_stream()) |
+ return extra_data->remote_stream(); |
+ |
+ if (extra_data && extra_data->local_stream()) |
+ return extra_data->local_stream(); |
+ |
+ // TODO(perkj): This can occur if a JS create a new MediaStream based on an |
+ // existing MediaStream. |
+ NOTIMPLEMENTED(); |
+ return NULL; |
+} |
+ |
+template <class TrackList> |
+static webrtc::MediaStreamTrackInterface* GetTrack( |
+ const std::string& source_id, |
+ TrackList* tracks) { |
+ for (size_t i = 0; i < tracks->count(); ++i) { |
+ if (tracks->at(i)->label() == source_id) |
+ return tracks->at(i); |
+ } |
+ return NULL; |
+} |
+ |
+static webrtc::MediaStreamTrackInterface* GetNativeMediaStreamTrack( |
+ const WebKit::WebMediaStreamDescriptor& stream, |
+ const WebKit::WebMediaStreamComponent& component) { |
+ std::string source_id = UTF16ToUTF8(component.source().id()); |
+ webrtc::MediaStreamInterface* native_stream = GetNativeMediaStream(stream); |
+ if (native_stream) { |
+ if (component.source().type() == WebKit::WebMediaStreamSource::TypeAudio) { |
+ return GetTrack<webrtc::AudioTracks>( |
+ source_id, native_stream->audio_tracks()); |
+ } |
+ if (component.source().type() == WebKit::WebMediaStreamSource::TypeVideo) { |
+ return GetTrack<webrtc::VideoTracks>( |
+ source_id, native_stream->video_tracks()); |
+ } |
+ } |
+ // TODO(perkj): This can occur if a JS create a new MediaStream based on an |
+ // existing MediaStream. |
+ NOTIMPLEMENTED(); |
+ return NULL; |
+} |
+ |
MediaStreamCenter::MediaStreamCenter( |
WebKit::WebMediaStreamCenterClient* client) |
: client_(client) { |
@@ -34,19 +96,47 @@ void MediaStreamCenter::queryMediaStreamSources( |
void MediaStreamCenter::didEnableMediaStreamTrack( |
const WebKit::WebMediaStreamDescriptor& stream, |
const WebKit::WebMediaStreamComponent& component) { |
+ webrtc::MediaStreamTrackInterface* track = |
+ GetNativeMediaStreamTrack(stream, component); |
+ if (track) |
+ track->set_enabled(true); |
} |
void MediaStreamCenter::didDisableMediaStreamTrack( |
const WebKit::WebMediaStreamDescriptor& stream, |
const WebKit::WebMediaStreamComponent& component) { |
+ webrtc::MediaStreamTrackInterface* track = |
+ GetNativeMediaStreamTrack(stream, component); |
+ if (track) |
+ track->set_enabled(false); |
} |
void MediaStreamCenter::didStopLocalMediaStream( |
const WebKit::WebMediaStreamDescriptor& stream) { |
+ DVLOG(1) << "MediaStreamCenter::didStopLocalMediaStream"; |
+ WebKit::WebFrame* web_frame = WebKit::WebFrame::frameForCurrentContext(); |
+ if (!web_frame) |
+ return; |
+ MediaStreamImpl* ms_impl = GetMediaStreamImpl(web_frame); |
+ if (ms_impl) { |
+ ms_impl->StopLocalMediaStream(stream); |
+ return; |
+ } |
+ |
+ NOTREACHED(); |
} |
-void MediaStreamCenter::didConstructMediaStream( |
- const WebKit::WebMediaStreamDescriptor& stream) { |
+void MediaStreamCenter::didCreateMediaStream( |
+ WebKit::WebMediaStreamDescriptor& stream) { |
+ WebKit::WebFrame* web_frame = WebKit::WebFrame::frameForCurrentContext(); |
+ if (!web_frame) |
+ return; |
+ MediaStreamImpl* ms_impl = GetMediaStreamImpl(web_frame); |
+ if (ms_impl) { |
+ ms_impl->CreateMediaStream(web_frame, &stream); |
+ return; |
+ } |
+ NOTREACHED(); |
} |
WebKit::WebString MediaStreamCenter::constructSDP( |