Chromium Code Reviews| Index: content/renderer/media/media_stream_impl.cc |
| diff --git a/content/renderer/media/media_stream_impl.cc b/content/renderer/media/media_stream_impl.cc |
| index ee94acd70d4c2a649024dd04e7d930617e5d02fc..b7e20c973fd7dcdc9d836656c3e15f793d2144a6 100644 |
| --- a/content/renderer/media/media_stream_impl.cc |
| +++ b/content/renderer/media/media_stream_impl.cc |
| @@ -6,24 +6,18 @@ |
| #include <utility> |
| -#include "base/bind.h" |
| #include "base/logging.h" |
| -#include "base/metrics/histogram.h" |
| #include "base/string_number_conversions.h" |
| #include "base/stringprintf.h" |
| -#include "base/synchronization/waitable_event.h" |
| #include "base/utf_string_conversions.h" |
| -#include "content/common/child_thread.h" |
| #include "content/renderer/media/capture_video_decoder.h" |
| #include "content/renderer/media/media_stream_extra_data.h" |
| +#include "content/renderer/media/media_stream_source_extra_data.h" |
| #include "content/renderer/media/media_stream_dependency_factory.h" |
| #include "content/renderer/media/media_stream_dispatcher.h" |
| -#include "content/renderer/media/peer_connection_handler_jsep.h" |
| +#include "content/renderer/media/rtc_video_decoder.h" |
| #include "content/renderer/media/video_capture_impl_manager.h" |
| -#include "content/renderer/media/webrtc_audio_device_impl.h" |
| -#include "content/renderer/p2p/ipc_network_manager.h" |
| -#include "content/renderer/p2p/ipc_socket_factory.h" |
| -#include "jingle/glue/thread_wrapper.h" |
| +#include "content/renderer/media/webrtc_uma_histograms.h" |
| #include "media/base/message_loop_factory.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaStreamRegistry.h" |
| @@ -37,42 +31,10 @@ namespace { |
| const int kVideoCaptureWidth = 640; |
| const int kVideoCaptureHeight = 480; |
| const int kVideoCaptureFramePerSecond = 30; |
| - |
| -// Helper enum used for histogramming calls to WebRTC APIs from JavaScript. |
| -enum JavaScriptAPIName { |
| - kWebkitGetUserMedia, |
| - kWebkitPeerConnection, |
| - kInvalidName |
| -}; |
| } // namespace |
| -// Helper method used to collect information about the number of times |
| -// different WebRTC API:s are called from JavaScript. |
| -// The histogram can be viewed at chrome://histograms/WebRTC.webkitApiCount. |
| -static void UpdateWebRTCMethodCount(JavaScriptAPIName api_name) { |
| - UMA_HISTOGRAM_ENUMERATION("WebRTC.webkitApiCount", api_name, kInvalidName); |
| -} |
| - |
| static int g_next_request_id = 0; |
| -// MediaStreamSourceExtraData contains data stored in the |
| -// WebKit::WebMediaStreamSource extra data field. |
| -class MediaStreamSourceExtraData |
| - : public WebKit::WebMediaStreamSource::ExtraData { |
| - public: |
| - explicit MediaStreamSourceExtraData( |
| - const media_stream::StreamDeviceInfo& device_info) |
| - : device_info_(device_info) { |
| - } |
| - // Return device information about the camera or microphone. |
| - const media_stream::StreamDeviceInfo& device_info() const { |
| - return device_info_; |
| - } |
| - |
| - private: |
| - media_stream::StreamDeviceInfo device_info_; |
| -}; |
| - |
| // Creates a WebKit representation of a stream sources based on |
| // |devices| from the MediaStreamDispatcher. |
| static void CreateWebKitSourceVector( |
| @@ -80,7 +42,7 @@ static void CreateWebKitSourceVector( |
| const media_stream::StreamDeviceInfoArray& devices, |
| WebKit::WebMediaStreamSource::Type type, |
| WebKit::WebVector<WebKit::WebMediaStreamSource>& webkit_sources) { |
| - ASSERT(devices.size() == webkit_sources.size()); |
| + CHECK(devices.size() == webkit_sources.size()); |
|
tommi (sloooow) - chröme
2012/09/12 13:10:24
CHECK_EQ?
perkj_chrome
2012/09/12 13:54:39
Done.
|
| for (size_t i = 0; i < devices.size(); ++i) { |
| std::string source_id = StringPrintf("%s%d%u", label.c_str(), type, |
| static_cast<unsigned int>(i)); |
| @@ -96,39 +58,15 @@ static void CreateWebKitSourceVector( |
| MediaStreamImpl::MediaStreamImpl( |
| content::RenderView* render_view, |
| MediaStreamDispatcher* media_stream_dispatcher, |
| - content::P2PSocketDispatcher* p2p_socket_dispatcher, |
| VideoCaptureImplManager* vc_manager, |
| MediaStreamDependencyFactory* dependency_factory) |
| : content::RenderViewObserver(render_view), |
| dependency_factory_(dependency_factory), |
| media_stream_dispatcher_(media_stream_dispatcher), |
| - p2p_socket_dispatcher_(p2p_socket_dispatcher), |
| - network_manager_(NULL), |
| - vc_manager_(vc_manager), |
| - signaling_thread_(NULL), |
| - worker_thread_(NULL), |
| - chrome_worker_thread_("Chrome_libJingle_WorkerThread") { |
| + vc_manager_(vc_manager) { |
| } |
| MediaStreamImpl::~MediaStreamImpl() { |
| - CleanupPeerConnectionFactory(); |
| -} |
| - |
| -WebKit::WebPeerConnection00Handler* |
| -MediaStreamImpl::CreatePeerConnectionHandlerJsep( |
| - WebKit::WebPeerConnection00HandlerClient* client) { |
| - // Save histogram data so we can see how much PeerConnetion is used. |
| - // The histogram counts the number of calls to the JS API |
| - // webKitPeerConnection00. |
| - UpdateWebRTCMethodCount(kWebkitPeerConnection); |
| - DCHECK(CalledOnValidThread()); |
| - if (!EnsurePeerConnectionFactory()) |
| - return NULL; |
| - |
| - PeerConnectionHandlerJsep* pc_handler = new PeerConnectionHandlerJsep( |
| - client, |
| - dependency_factory_.get()); |
| - return pc_handler; |
| } |
| void MediaStreamImpl::StopLocalMediaStream( |
| @@ -145,17 +83,6 @@ void MediaStreamImpl::StopLocalMediaStream( |
| } |
| } |
| -void MediaStreamImpl::CreateMediaStream( |
| - WebKit::WebFrame* frame, |
| - WebKit::WebMediaStreamDescriptor* stream) { |
| - DVLOG(1) << "MediaStreamImpl::CreateMediaStream"; |
| - |
| - if (!CreateNativeLocalMediaStream(stream)) { |
| - DVLOG(1) << "Failed to create native stream in CreateMediaStream."; |
| - return; |
| - } |
| -} |
| - |
| void MediaStreamImpl::requestUserMedia( |
| const WebKit::WebUserMediaRequest& user_media_request, |
| const WebKit::WebVector<WebKit::WebMediaStreamSource>& audio_sources, |
| @@ -278,7 +205,7 @@ void MediaStreamImpl::OnStreamGenerated( |
| description.initialize(webkit_label, audio_source_vector, |
| video_source_vector); |
| - if (!CreateNativeLocalMediaStream(&description)) { |
| + if (!dependency_factory_->CreateNativeLocalMediaStream(&description)) { |
| DVLOG(1) << "Failed to create native stream in OnStreamGenerated."; |
| media_stream_dispatcher_->StopStream(label); |
| it->second.request_.requestFailed(); |
| @@ -384,102 +311,6 @@ void MediaStreamImpl::FrameWillClose(WebKit::WebFrame* frame) { |
| } |
| } |
| -void MediaStreamImpl::InitializeWorkerThread(talk_base::Thread** thread, |
| - base::WaitableEvent* event) { |
| - jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); |
| - jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true); |
| - *thread = jingle_glue::JingleThreadWrapper::current(); |
| - event->Signal(); |
| -} |
| - |
| -void MediaStreamImpl::CreateIpcNetworkManagerOnWorkerThread( |
| - base::WaitableEvent* event) { |
| - DCHECK_EQ(MessageLoop::current(), chrome_worker_thread_.message_loop()); |
| - network_manager_ = new content::IpcNetworkManager(p2p_socket_dispatcher_); |
| - event->Signal(); |
| -} |
| - |
| -void MediaStreamImpl::DeleteIpcNetworkManager() { |
| - DCHECK_EQ(MessageLoop::current(), chrome_worker_thread_.message_loop()); |
| - delete network_manager_; |
| - network_manager_ = NULL; |
| -} |
| - |
| -bool MediaStreamImpl::EnsurePeerConnectionFactory() { |
| - DCHECK(CalledOnValidThread()); |
| - if (!signaling_thread_) { |
| - jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); |
| - jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true); |
| - signaling_thread_ = jingle_glue::JingleThreadWrapper::current(); |
| - } |
| - |
| - if (!worker_thread_) { |
| - if (!chrome_worker_thread_.IsRunning()) { |
| - if (!chrome_worker_thread_.Start()) { |
| - LOG(ERROR) << "Could not start worker thread"; |
| - signaling_thread_ = NULL; |
| - return false; |
| - } |
| - } |
| - base::WaitableEvent event(true, false); |
| - chrome_worker_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| - &MediaStreamImpl::InitializeWorkerThread, |
| - base::Unretained(this), |
| - &worker_thread_, |
| - &event)); |
| - event.Wait(); |
| - DCHECK(worker_thread_); |
| - } |
| - |
| - if (!network_manager_) { |
| - base::WaitableEvent event(true, false); |
| - chrome_worker_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| - &MediaStreamImpl::CreateIpcNetworkManagerOnWorkerThread, |
| - base::Unretained(this), |
| - &event)); |
| - event.Wait(); |
| - } |
| - |
| - if (!socket_factory_.get()) { |
| - socket_factory_.reset( |
| - new content::IpcPacketSocketFactory(p2p_socket_dispatcher_)); |
| - } |
| - |
| - if (!dependency_factory_->PeerConnectionFactoryCreated()) { |
| - if (!dependency_factory_->CreatePeerConnectionFactory( |
| - worker_thread_, |
| - signaling_thread_, |
| - p2p_socket_dispatcher_, |
| - network_manager_, |
| - socket_factory_.get())) { |
| - LOG(ERROR) << "Could not create PeerConnection factory"; |
| - return false; |
| - } |
| - } |
| - |
| - return true; |
| -} |
| - |
| -void MediaStreamImpl::CleanupPeerConnectionFactory() { |
| - if (dependency_factory_.get()) |
| - dependency_factory_->ReleasePeerConnectionFactory(); |
| - if (network_manager_) { |
| - // The network manager needs to free its resources on the thread they were |
| - // created, which is the worked thread. |
| - if (chrome_worker_thread_.IsRunning()) { |
| - chrome_worker_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| - &MediaStreamImpl::DeleteIpcNetworkManager, |
| - base::Unretained(this))); |
| - // Stopping the thread will wait until all tasks have been |
| - // processed before returning. We wait for the above task to finish before |
| - // letting the the function continue to avoid any potential race issues. |
| - chrome_worker_thread_.Stop(); |
| - } else { |
| - NOTREACHED() << "Worker thread not running."; |
| - } |
| - } |
| -} |
| - |
| scoped_refptr<media::VideoDecoder> MediaStreamImpl::CreateLocalVideoDecoder( |
| webrtc::MediaStreamInterface* stream, |
| media::MessageLoopFactory* message_loop_factory) { |
| @@ -522,72 +353,6 @@ scoped_refptr<media::VideoDecoder> MediaStreamImpl::CreateRemoteVideoDecoder( |
| stream->video_tracks()->at(0)); |
| } |
| -bool MediaStreamImpl::CreateNativeLocalMediaStream( |
| - WebKit::WebMediaStreamDescriptor* description) { |
| - // Creating the peer connection factory can fail if for example the audio |
| - // (input or output) or video device cannot be opened. Handling such cases |
| - // better is a higher level design discussion which involves the media |
| - // manager, webrtc and libjingle. We cannot create any native |
| - // track objects however, so we'll just have to skip that. Furthermore, |
| - // creating a peer connection later on will fail if we don't have a factory. |
| - if (!EnsurePeerConnectionFactory()) |
| - return false; |
| - |
| - std::string label = UTF16ToUTF8(description->label()); |
| - LocalNativeStreamPtr native_stream = |
| - dependency_factory_->CreateLocalMediaStream(label); |
| - |
| - // Add audio tracks. |
| - WebKit::WebVector<WebKit::WebMediaStreamComponent> audio_components; |
| - description->audioSources(audio_components); |
| - for (size_t i = 0; i < audio_components.size(); ++i) { |
| - const WebKit::WebMediaStreamSource& source = audio_components[i].source(); |
| - MediaStreamSourceExtraData* source_data = |
| - static_cast<MediaStreamSourceExtraData*>(source.extraData()); |
| - if (!source_data) { |
| - // TODO(perkj): Implement support for sources from remote MediaStreams. |
| - NOTIMPLEMENTED(); |
| - continue; |
| - } |
| - // TODO(perkj): Refactor the creation of audio tracks to use a proper |
| - // interface for receiving audio input data. Currently NULL is passed since |
| - // the |audio_device| is the wrong class and is unused. |
| - talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> audio_track( |
| - dependency_factory_->CreateLocalAudioTrack( |
| - UTF16ToUTF8(source.id()), NULL)); |
| - native_stream->AddTrack(audio_track); |
| - audio_track->set_enabled(audio_components[i].isEnabled()); |
| - // TODO(xians): This set the source of all audio tracks to the same |
| - // microphone. Implement support for setting the source per audio track |
| - // instead. |
| - dependency_factory_->SetAudioDeviceSessionId( |
| - source_data->device_info().session_id); |
| - } |
| - |
| - // Add video tracks. |
| - WebKit::WebVector<WebKit::WebMediaStreamComponent> video_components; |
| - description->videoSources(video_components); |
| - for (size_t i = 0; i < video_components.size(); ++i) { |
| - const WebKit::WebMediaStreamSource& source = video_components[i].source(); |
| - MediaStreamSourceExtraData* source_data = |
| - static_cast<MediaStreamSourceExtraData*>(source.extraData()); |
| - if (!source_data) { |
| - // TODO(perkj): Implement support for sources from remote MediaStreams. |
| - NOTIMPLEMENTED(); |
| - continue; |
| - } |
| - talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> video_track( |
| - dependency_factory_->CreateLocalVideoTrack( |
| - UTF16ToUTF8(source.id()), source_data->device_info().session_id)); |
| - native_stream->AddTrack(video_track); |
| - video_track->set_enabled(video_components[i].isEnabled()); |
| - } |
| - |
| - description->setExtraData(new MediaStreamExtraData(native_stream)); |
| - |
| - return true; |
| -} |
| - |
| MediaStreamExtraData::MediaStreamExtraData( |
| webrtc::MediaStreamInterface* remote_stream) |
| : remote_stream_(remote_stream) { |