diff options
author | perkj@chromium.org <perkj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-15 13:02:53 +0000 |
---|---|---|
committer | perkj@chromium.org <perkj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-15 13:02:53 +0000 |
commit | 86d72aad0e44725b83dffa62c505edcc0ff0f21e (patch) | |
tree | 00fdcbdc9ac19d4c72e83ef8572ebd0847d90a62 /content/renderer/media/media_stream_center.cc | |
parent | e0ac3589f22e27e0b383d92070da53aa344cacfb (diff) | |
download | chromium_src-86d72aad0e44725b83dffa62c505edcc0ff0f21e.zip chromium_src-86d72aad0e44725b83dffa62c505edcc0ff0f21e.tar.gz chromium_src-86d72aad0e44725b83dffa62c505edcc0ff0f21e.tar.bz2 |
Refactor MediaStreamImpl and PeerConnection glue implementation after WebKit changes.
With this cl a WebKitMediaStreamDescriptor holds a scoped_refptr to the native implementation of MediaStreams.
This simplifies the glue code and allows us to hook up events from MediaStreamCenter to the correct native MediaStream.
BUG=
TEST= unit tests and https://apprtc.appspot.com
Review URL: https://chromiumcodereview.appspot.com/10383151
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@137110 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/media/media_stream_center.cc')
-rw-r--r-- | content/renderer/media/media_stream_center.cc | 94 |
1 files changed, 92 insertions, 2 deletions
diff --git a/content/renderer/media/media_stream_center.cc b/content/renderer/media/media_stream_center.cc index 75b266d..f3d3429 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()); + 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( |