Index: content/renderer/media/media_stream_video_source.cc |
diff --git a/content/renderer/media/media_stream_video_source.cc b/content/renderer/media/media_stream_video_source.cc |
index 118d66e3cddc59faa72ed1fd4c7448c0bc0c377e..a8614f0cb2477622a4c6101666859baba3a1d6a1 100644 |
--- a/content/renderer/media/media_stream_video_source.cc |
+++ b/content/renderer/media/media_stream_video_source.cc |
@@ -10,6 +10,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 { |
@@ -214,6 +215,12 @@ const media::VideoCaptureFormat& GetBestCaptureFormat( |
} // anonymous namespace |
+// static |
+MediaStreamVideoSource* MediaStreamVideoSource::GetVideoSource( |
+ const blink::WebMediaStreamSource& source) { |
+ return static_cast<MediaStreamVideoSource*>(source.extraData()); |
+} |
+ |
MediaStreamVideoSource::MediaStreamVideoSource( |
MediaStreamDependencyFactory* factory) |
: state_(NEW), |
@@ -226,12 +233,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 |
@@ -254,8 +266,8 @@ void MediaStreamVideoSource::AddTrack( |
} |
case STARTING: |
case RETRIEVING_CAPABILITIES: { |
- // The |callback| will be triggered once the delegate has started or |
- // the capabilitites has been retrieved. |
+ // The |callback| will be triggered once the source has started or |
+ // the capabilities has been retrieved. |
break; |
} |
case ENDED: |
@@ -266,9 +278,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() { |
@@ -298,12 +312,18 @@ void MediaStreamVideoSource::DoStopSource() { |
DVLOG(3) << "DoStopSource()"; |
StopSourceImpl(); |
state_ = ENDED; |
+ SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded); |
} |
void MediaStreamVideoSource::DeliverVideoFrame( |
const scoped_refptr<media::VideoFrame>& frame) { |
if (capture_adapter_) |
capture_adapter_->OnFrameCaptured(frame); |
+ |
+ for (std::vector<MediaStreamVideoTrack*>::iterator it = tracks_.begin(); |
+ it != tracks_.end(); ++it) { |
+ (*it)->OnVideoFrame(frame); |
+ } |
} |
void MediaStreamVideoSource::OnSupportedFormats( |
@@ -377,8 +397,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); |
@@ -390,7 +411,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( |