Chromium Code Reviews| 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 |