diff options
author | perkj@chromium.org <perkj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-09 12:49:17 +0000 |
---|---|---|
committer | perkj@chromium.org <perkj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-09 12:49:17 +0000 |
commit | 16ce556666d0a2fa7095cb417287916e4d3d35fa (patch) | |
tree | 0f53958eccbd404573e0f0289ae9e28ee95afe33 /content/renderer/media/media_stream_video_source.cc | |
parent | 5526e7cd50cfd5ae27c822fd694ae742a975fda2 (diff) | |
download | chromium_src-16ce556666d0a2fa7095cb417287916e4d3d35fa.zip chromium_src-16ce556666d0a2fa7095cb417287916e4d3d35fa.tar.gz chromium_src-16ce556666d0a2fa7095cb417287916e4d3d35fa.tar.bz2 |
MediaStream VideoTrack implementation.
This implementation only use Chrome video classes for local rendering.
A libjingle representation is created once its connected to a PeerConnection.
BUG=334241
Review URL: https://codereview.chromium.org/155853002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255846 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/media/media_stream_video_source.cc')
-rw-r--r-- | content/renderer/media/media_stream_video_source.cc | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/content/renderer/media/media_stream_video_source.cc b/content/renderer/media/media_stream_video_source.cc index fa98014..5566199 100644 --- a/content/renderer/media/media_stream_video_source.cc +++ b/content/renderer/media/media_stream_video_source.cc @@ -11,6 +11,7 @@ #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "content/renderer/media/media_stream_dependency_factory.h" +#include "content/renderer/media/media_stream_video_track.h" #include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h" namespace content { @@ -276,6 +277,12 @@ void ReleaseOriginalFrame( } // anonymous namespace +// static +MediaStreamVideoSource* MediaStreamVideoSource::GetVideoSource( + const blink::WebMediaStreamSource& source) { + return static_cast<MediaStreamVideoSource*>(source.extraData()); +} + MediaStreamVideoSource::MediaStreamVideoSource( MediaStreamDependencyFactory* factory) : state_(NEW), @@ -288,12 +295,17 @@ MediaStreamVideoSource::~MediaStreamVideoSource() { } void MediaStreamVideoSource::AddTrack( - const blink::WebMediaStreamTrack& track, + MediaStreamVideoTrack* track, const blink::WebMediaConstraints& constraints, const ConstraintsCallback& callback) { DCHECK(CalledOnValidThread()); - requested_constraints_.push_back(RequestedConstraints(constraints, - callback)); + DCHECK(std::find(tracks_.begin(), tracks_.end(), + track) == tracks_.end()); + tracks_.push_back(track); + + requested_constraints_.push_back( + RequestedConstraints(constraints, callback)); + switch (state_) { case NEW: { // Tab capture and Screen capture needs the maximum requested height @@ -312,7 +324,7 @@ void MediaStreamVideoSource::AddTrack( } case STARTING: case RETRIEVING_CAPABILITIES: { - // The |callback| will be triggered once the delegate has started or + // The |callback| will be triggered once the source has started or // the capabilities have been retrieved. break; } @@ -324,9 +336,11 @@ void MediaStreamVideoSource::AddTrack( } } -void MediaStreamVideoSource::RemoveTrack( - const blink::WebMediaStreamTrack& track) { - // TODO(ronghuawu): What should be done here? Do we really need RemoveTrack? +void MediaStreamVideoSource::RemoveTrack(MediaStreamVideoTrack* video_track) { + std::vector<MediaStreamVideoTrack*>::iterator it = + std::find(tracks_.begin(), tracks_.end(), video_track); + DCHECK(it != tracks_.end()); + tracks_.erase(it); } void MediaStreamVideoSource::InitAdapter() { @@ -356,6 +370,7 @@ void MediaStreamVideoSource::DoStopSource() { DVLOG(3) << "DoStopSource()"; StopSourceImpl(); state_ = ENDED; + SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded); } void MediaStreamVideoSource::DeliverVideoFrame( @@ -395,6 +410,11 @@ void MediaStreamVideoSource::DeliverVideoFrame( capture_adapter_) { capture_adapter_->OnFrameCaptured(video_frame); } + + for (std::vector<MediaStreamVideoTrack*>::iterator it = tracks_.begin(); + it != tracks_.end(); ++it) { + (*it)->OnVideoFrame(video_frame); + } } void MediaStreamVideoSource::OnSupportedFormats( @@ -474,8 +494,9 @@ void MediaStreamVideoSource::FinalizeAddTrack() { callbacks.swap(requested_constraints_); for (std::vector<RequestedConstraints>::iterator it = callbacks.begin(); it != callbacks.end(); ++it) { + bool success = state_ == STARTED && - !FilterFormats(it->constraints, formats).empty(); + !FilterFormats(it->constraints, formats).empty(); DVLOG(3) << "FinalizeAddTrack() success " << success; if (!it->callback.is_null()) it->callback.Run(this, success); @@ -487,7 +508,10 @@ void MediaStreamVideoSource::SetReadyState( if (!owner().isNull()) { owner().setReadyState(state); } - // TODO(perkj): Notify all registered tracks. + for (std::vector<MediaStreamVideoTrack*>::iterator it = tracks_.begin(); + it != tracks_.end(); ++it) { + (*it)->OnReadyStateChanged(state); + } } MediaStreamVideoSource::RequestedConstraints::RequestedConstraints( |