Index: content/renderer/media/media_stream_video_track.cc |
diff --git a/content/renderer/media/media_stream_video_track.cc b/content/renderer/media/media_stream_video_track.cc |
index 70383236bac5f23d6ba73890fca640c6aec05185..cef5b14dc87c192736414bcdbbddc99f7f395456 100644 |
--- a/content/renderer/media/media_stream_video_track.cc |
+++ b/content/renderer/media/media_stream_video_track.cc |
@@ -10,50 +10,43 @@ |
namespace content { |
-// Wrapper which allows to use std::find_if() when adding and removing |
-// sinks to/from |sinks_|. |
-struct SinkWrapper { |
- explicit SinkWrapper(MediaStreamVideoSink* sink) : sink_(sink) {} |
- bool operator()( |
- const WebRtcVideoSinkAdapter* owner) { |
- return owner->sink() == sink_; |
- } |
- MediaStreamVideoSink* sink_; |
-}; |
- |
-MediaStreamVideoTrack::MediaStreamVideoTrack( |
- webrtc::VideoTrackInterface* track) |
- : MediaStreamTrack(track, false), |
- factory_(NULL) { |
+// static |
+MediaStreamVideoTrack* MediaStreamVideoTrack::GetVideoTrack( |
+ const blink::WebMediaStreamTrack& track) { |
+ return static_cast<MediaStreamVideoTrack*>(track.extraData()); |
} |
MediaStreamVideoTrack::MediaStreamVideoTrack( |
+ MediaStreamVideoSource* source, |
MediaStreamDependencyFactory* factory) |
: MediaStreamTrack(NULL, true), |
+ enabled_(true), |
+ source_(source), |
factory_(factory) { |
- DCHECK(factory_); |
} |
Alpha Left Google
2014/02/28 02:49:22
I'd actually call source_->AddTrack(this) here.
I
perkj_chrome
2014/03/02 09:20:44
Done.
|
MediaStreamVideoTrack::~MediaStreamVideoTrack() { |
DCHECK(sinks_.empty()); |
+ if (source_) |
Alpha Left Google
2014/02/28 02:49:22
There must be a source isn't it?
perkj_chrome
2014/03/02 09:20:44
Well- Admitingly WebRtcMediaStreamVideoTrack is a
|
+ source_->RemoveTrack(this); |
} |
void MediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(std::find_if(sinks_.begin(), sinks_.end(), |
- SinkWrapper(sink)) == sinks_.end()); |
- sinks_.push_back(new WebRtcVideoSinkAdapter(GetVideoAdapter(), sink)); |
+ DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end()); |
+ sinks_.push_back(sink); |
} |
void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- ScopedVector<WebRtcVideoSinkAdapter>::iterator it = |
- std::find_if(sinks_.begin(), sinks_.end(), SinkWrapper(sink)); |
+ std::vector<MediaStreamVideoSink*>::iterator it = |
+ std::find(sinks_.begin(), sinks_.end(), sink); |
DCHECK(it != sinks_.end()); |
sinks_.erase(it); |
} |
webrtc::VideoTrackInterface* MediaStreamVideoTrack::GetVideoAdapter() { |
Alpha Left Google
2014/02/28 02:49:22
Should this method be moved to WebRtcMediaStreamVi
perkj_chrome
2014/03/02 09:20:44
No, we still need to be able to create a libjingle
Alpha Left Google
2014/03/03 06:45:04
Then I think there should be a TODO here and a poi
perkj_chrome
2014/03/04 10:44:51
ok- added in the header file.
|
+ DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK_EQ(owner().source().type(), blink::WebMediaStreamSource::TypeVideo); |
if (!track_.get()) { |
MediaStreamVideoSource* source = |
@@ -67,4 +60,69 @@ webrtc::VideoTrackInterface* MediaStreamVideoTrack::GetVideoAdapter() { |
return static_cast<webrtc::VideoTrackInterface*>(track_.get()); |
} |
+void MediaStreamVideoTrack::SetEnabled(bool enabled) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ enabled_ = enabled; |
+ MediaStreamTrack::SetEnabled(enabled); |
+ for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); |
+ it != sinks_.end(); ++it) { |
+ (*it)->OnEnabledChanged(enabled); |
+ } |
+} |
+ |
+void MediaStreamVideoTrack::OnVideoFrame( |
+ const scoped_refptr<media::VideoFrame>& frame) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!enabled_) |
+ return; |
+ for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); |
+ it != sinks_.end(); ++it) { |
+ (*it)->OnVideoFrame(frame); |
+ } |
+} |
+ |
+void MediaStreamVideoTrack::OnReadyStateChanged( |
+ blink::WebMediaStreamSource::ReadyState state) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); |
+ it != sinks_.end(); ++it) { |
+ (*it)->OnReadyStateChanged(state); |
+ } |
+} |
+ |
+// Wrapper which allows to use std::find_if() when adding and removing |
+// sinks to/from |sinks_|. |
+struct SinkWrapper { |
+ explicit SinkWrapper(MediaStreamVideoSink* sink) : sink_(sink) {} |
+ bool operator()( |
+ const WebRtcVideoSinkAdapter* owner) { |
+ return owner->sink() == sink_; |
+ } |
+ MediaStreamVideoSink* sink_; |
+}; |
+ |
+WebRtcMediaStreamVideoTrack::WebRtcMediaStreamVideoTrack( |
Alpha Left Google
2014/02/28 02:49:22
This should be moved to a different file.
perkj_chrome
2014/03/02 09:20:44
This should all be replaced with a remote MediaStr
Alpha Left Google
2014/03/03 06:45:04
Okay. Just want to call this out. A TODO would be
perkj_chrome
2014/03/04 10:44:51
Its in the header file.
|
+ webrtc::VideoTrackInterface* track) |
+ : MediaStreamVideoTrack(NULL, NULL) { |
+ track_ = track; |
+} |
+ |
+WebRtcMediaStreamVideoTrack::~WebRtcMediaStreamVideoTrack() { |
+} |
+ |
+void WebRtcMediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(std::find_if(sinks_.begin(), sinks_.end(), |
+ SinkWrapper(sink)) == sinks_.end()); |
+ sinks_.push_back(new WebRtcVideoSinkAdapter(GetVideoAdapter(), sink)); |
+} |
+ |
+void WebRtcMediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ ScopedVector<WebRtcVideoSinkAdapter>::iterator it = |
+ std::find_if(sinks_.begin(), sinks_.end(), SinkWrapper(sink)); |
+ DCHECK(it != sinks_.end()); |
+ sinks_.erase(it); |
+} |
+ |
} // namespace content |