summaryrefslogtreecommitdiffstats
path: root/content/renderer/media/media_stream_center.cc
diff options
context:
space:
mode:
authorperkj@chromium.org <perkj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-15 13:02:53 +0000
committerperkj@chromium.org <perkj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-15 13:02:53 +0000
commit86d72aad0e44725b83dffa62c505edcc0ff0f21e (patch)
tree00fdcbdc9ac19d4c72e83ef8572ebd0847d90a62 /content/renderer/media/media_stream_center.cc
parente0ac3589f22e27e0b383d92070da53aa344cacfb (diff)
downloadchromium_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.cc94
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(