Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/media_stream_video_track.h" | 5 #include "content/renderer/media/media_stream_video_track.h" |
| 6 | 6 |
| 7 #include "content/renderer/media/media_stream_dependency_factory.h" | 7 #include "content/renderer/media/media_stream_dependency_factory.h" |
| 8 #include "content/renderer/media/media_stream_video_source.h" | 8 #include "content/renderer/media/media_stream_video_source.h" |
| 9 #include "content/renderer/media/webrtc/webrtc_video_sink_adapter.h" | 9 #include "content/renderer/media/webrtc/webrtc_video_sink_adapter.h" |
| 10 | 10 |
| 11 namespace content { | 11 namespace content { |
| 12 | 12 |
| 13 // Wrapper which allows to use std::find_if() when adding and removing | 13 // static |
| 14 // sinks to/from |sinks_|. | 14 MediaStreamVideoTrack* MediaStreamVideoTrack::GetVideoTrack( |
| 15 struct SinkWrapper { | 15 const blink::WebMediaStreamTrack& track) { |
| 16 explicit SinkWrapper(MediaStreamVideoSink* sink) : sink_(sink) {} | 16 return static_cast<MediaStreamVideoTrack*>(track.extraData()); |
| 17 bool operator()( | |
| 18 const WebRtcVideoSinkAdapter* owner) { | |
| 19 return owner->sink() == sink_; | |
| 20 } | |
| 21 MediaStreamVideoSink* sink_; | |
| 22 }; | |
| 23 | |
| 24 MediaStreamVideoTrack::MediaStreamVideoTrack( | |
| 25 webrtc::VideoTrackInterface* track) | |
| 26 : MediaStreamTrack(track, false), | |
| 27 factory_(NULL) { | |
| 28 } | 17 } |
| 29 | 18 |
| 30 MediaStreamVideoTrack::MediaStreamVideoTrack( | 19 MediaStreamVideoTrack::MediaStreamVideoTrack( |
| 20 MediaStreamVideoSource* source, | |
| 31 MediaStreamDependencyFactory* factory) | 21 MediaStreamDependencyFactory* factory) |
| 32 : MediaStreamTrack(NULL, true), | 22 : MediaStreamTrack(NULL, true), |
| 23 enabled_(true), | |
| 24 source_(source), | |
| 33 factory_(factory) { | 25 factory_(factory) { |
| 34 DCHECK(factory_); | |
| 35 } | 26 } |
|
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.
| |
| 36 | 27 |
| 37 MediaStreamVideoTrack::~MediaStreamVideoTrack() { | 28 MediaStreamVideoTrack::~MediaStreamVideoTrack() { |
| 38 DCHECK(sinks_.empty()); | 29 DCHECK(sinks_.empty()); |
| 30 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
| |
| 31 source_->RemoveTrack(this); | |
| 39 } | 32 } |
| 40 | 33 |
| 41 void MediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) { | 34 void MediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) { |
| 42 DCHECK(thread_checker_.CalledOnValidThread()); | 35 DCHECK(thread_checker_.CalledOnValidThread()); |
| 43 DCHECK(std::find_if(sinks_.begin(), sinks_.end(), | 36 DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end()); |
| 44 SinkWrapper(sink)) == sinks_.end()); | 37 sinks_.push_back(sink); |
| 45 sinks_.push_back(new WebRtcVideoSinkAdapter(GetVideoAdapter(), sink)); | |
| 46 } | 38 } |
| 47 | 39 |
| 48 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { | 40 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { |
| 49 DCHECK(thread_checker_.CalledOnValidThread()); | 41 DCHECK(thread_checker_.CalledOnValidThread()); |
| 50 ScopedVector<WebRtcVideoSinkAdapter>::iterator it = | 42 std::vector<MediaStreamVideoSink*>::iterator it = |
| 51 std::find_if(sinks_.begin(), sinks_.end(), SinkWrapper(sink)); | 43 std::find(sinks_.begin(), sinks_.end(), sink); |
| 52 DCHECK(it != sinks_.end()); | 44 DCHECK(it != sinks_.end()); |
| 53 sinks_.erase(it); | 45 sinks_.erase(it); |
| 54 } | 46 } |
| 55 | 47 |
| 56 webrtc::VideoTrackInterface* MediaStreamVideoTrack::GetVideoAdapter() { | 48 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.
| |
| 49 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 57 DCHECK_EQ(owner().source().type(), blink::WebMediaStreamSource::TypeVideo); | 50 DCHECK_EQ(owner().source().type(), blink::WebMediaStreamSource::TypeVideo); |
| 58 if (!track_.get()) { | 51 if (!track_.get()) { |
| 59 MediaStreamVideoSource* source = | 52 MediaStreamVideoSource* source = |
| 60 static_cast<MediaStreamVideoSource*>(owner().source().extraData()); | 53 static_cast<MediaStreamVideoSource*>(owner().source().extraData()); |
| 61 scoped_refptr<webrtc::VideoTrackInterface> video_track( | 54 scoped_refptr<webrtc::VideoTrackInterface> video_track( |
| 62 factory_->CreateLocalVideoTrack(owner().id().utf8(), | 55 factory_->CreateLocalVideoTrack(owner().id().utf8(), |
| 63 source->GetAdapter())); | 56 source->GetAdapter())); |
| 64 video_track->set_enabled(owner().isEnabled()); | 57 video_track->set_enabled(owner().isEnabled()); |
| 65 track_ = video_track; | 58 track_ = video_track; |
| 66 } | 59 } |
| 67 return static_cast<webrtc::VideoTrackInterface*>(track_.get()); | 60 return static_cast<webrtc::VideoTrackInterface*>(track_.get()); |
| 68 } | 61 } |
| 69 | 62 |
| 63 void MediaStreamVideoTrack::SetEnabled(bool enabled) { | |
| 64 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 65 enabled_ = enabled; | |
| 66 MediaStreamTrack::SetEnabled(enabled); | |
| 67 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); | |
| 68 it != sinks_.end(); ++it) { | |
| 69 (*it)->OnEnabledChanged(enabled); | |
| 70 } | |
| 71 } | |
| 72 | |
| 73 void MediaStreamVideoTrack::OnVideoFrame( | |
| 74 const scoped_refptr<media::VideoFrame>& frame) { | |
| 75 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 76 if (!enabled_) | |
| 77 return; | |
| 78 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); | |
| 79 it != sinks_.end(); ++it) { | |
| 80 (*it)->OnVideoFrame(frame); | |
| 81 } | |
| 82 } | |
| 83 | |
| 84 void MediaStreamVideoTrack::OnReadyStateChanged( | |
| 85 blink::WebMediaStreamSource::ReadyState state) { | |
| 86 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 87 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); | |
| 88 it != sinks_.end(); ++it) { | |
| 89 (*it)->OnReadyStateChanged(state); | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 // Wrapper which allows to use std::find_if() when adding and removing | |
| 94 // sinks to/from |sinks_|. | |
| 95 struct SinkWrapper { | |
| 96 explicit SinkWrapper(MediaStreamVideoSink* sink) : sink_(sink) {} | |
| 97 bool operator()( | |
| 98 const WebRtcVideoSinkAdapter* owner) { | |
| 99 return owner->sink() == sink_; | |
| 100 } | |
| 101 MediaStreamVideoSink* sink_; | |
| 102 }; | |
| 103 | |
| 104 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.
| |
| 105 webrtc::VideoTrackInterface* track) | |
| 106 : MediaStreamVideoTrack(NULL, NULL) { | |
| 107 track_ = track; | |
| 108 } | |
| 109 | |
| 110 WebRtcMediaStreamVideoTrack::~WebRtcMediaStreamVideoTrack() { | |
| 111 } | |
| 112 | |
| 113 void WebRtcMediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) { | |
| 114 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 115 DCHECK(std::find_if(sinks_.begin(), sinks_.end(), | |
| 116 SinkWrapper(sink)) == sinks_.end()); | |
| 117 sinks_.push_back(new WebRtcVideoSinkAdapter(GetVideoAdapter(), sink)); | |
| 118 } | |
| 119 | |
| 120 void WebRtcMediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { | |
| 121 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 122 ScopedVector<WebRtcVideoSinkAdapter>::iterator it = | |
| 123 std::find_if(sinks_.begin(), sinks_.end(), SinkWrapper(sink)); | |
| 124 DCHECK(it != sinks_.end()); | |
| 125 sinks_.erase(it); | |
| 126 } | |
| 127 | |
| 70 } // namespace content | 128 } // namespace content |
| OLD | NEW |