Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Side by Side Diff: content/renderer/media/media_stream_video_track.cc

Issue 155853002: Chrome MediaStream VideoTrack implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed a comment. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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"
9 #include "content/renderer/media/webrtc/webrtc_video_sink_adapter.h" 8 #include "content/renderer/media/webrtc/webrtc_video_sink_adapter.h"
10 9
11 namespace content { 10 namespace content {
12 11
13 // Wrapper which allows to use std::find_if() when adding and removing 12 //static
14 // sinks to/from |sinks_|. 13 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack(
15 struct SinkWrapper { 14 MediaStreamVideoSource* source,
16 explicit SinkWrapper(MediaStreamVideoSink* sink) : sink_(sink) {} 15 const blink::WebMediaConstraints& constraints,
17 bool operator()( 16 const MediaStreamVideoSource::ConstraintsCallback& callback,
18 const WebRtcVideoSinkAdapter* owner) { 17 bool enabled,
19 return owner->sink() == sink_; 18 MediaStreamDependencyFactory* factory) {
20 } 19 blink::WebMediaStreamTrack track;
21 MediaStreamVideoSink* sink_; 20 track.initialize(source->owner());
22 }; 21 track.setExtraData(new MediaStreamVideoTrack(source,
22 constraints,
23 callback,
24 enabled,
25 factory));
26 return track;
27 }
23 28
24 MediaStreamVideoTrack::MediaStreamVideoTrack( 29 // static
25 webrtc::VideoTrackInterface* track) 30 MediaStreamVideoTrack* MediaStreamVideoTrack::GetVideoTrack(
26 : MediaStreamTrack(track, false), 31 const blink::WebMediaStreamTrack& track) {
27 factory_(NULL) { 32 return static_cast<MediaStreamVideoTrack*>(track.extraData());
28 } 33 }
29 34
30 MediaStreamVideoTrack::MediaStreamVideoTrack( 35 MediaStreamVideoTrack::MediaStreamVideoTrack(
36 MediaStreamVideoSource* source,
37 const blink::WebMediaConstraints& constraints,
38 const MediaStreamVideoSource::ConstraintsCallback& callback,
39 bool enabled,
31 MediaStreamDependencyFactory* factory) 40 MediaStreamDependencyFactory* factory)
32 : MediaStreamTrack(NULL, true), 41 : MediaStreamTrack(NULL, true),
42 enabled_(enabled),
43 source_(source),
33 factory_(factory) { 44 factory_(factory) {
34 DCHECK(factory_); 45 // TODO(perkj): source can be NULL if this is actually a remote video track.
46 // Remove as soon as we only have one implementation of video tracks.
47 if (source)
48 source->AddTrack(this, constraints, callback);
35 } 49 }
36 50
37 MediaStreamVideoTrack::~MediaStreamVideoTrack() { 51 MediaStreamVideoTrack::~MediaStreamVideoTrack() {
38 DCHECK(sinks_.empty()); 52 DCHECK(sinks_.empty());
53 // TODO(perkj): source can be NULL if this is actually a remote video track.
54 // Remove as soon as we only have one implementation of video tracks.
55 if (source_)
56 source_->RemoveTrack(this);
39 } 57 }
40 58
41 void MediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) { 59 void MediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) {
42 DCHECK(thread_checker_.CalledOnValidThread()); 60 DCHECK(thread_checker_.CalledOnValidThread());
43 DCHECK(std::find_if(sinks_.begin(), sinks_.end(), 61 DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
44 SinkWrapper(sink)) == sinks_.end()); 62 sinks_.push_back(sink);
45 sinks_.push_back(new WebRtcVideoSinkAdapter(GetVideoAdapter(), sink));
46 } 63 }
47 64
48 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { 65 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) {
49 DCHECK(thread_checker_.CalledOnValidThread()); 66 DCHECK(thread_checker_.CalledOnValidThread());
50 ScopedVector<WebRtcVideoSinkAdapter>::iterator it = 67 std::vector<MediaStreamVideoSink*>::iterator it =
51 std::find_if(sinks_.begin(), sinks_.end(), SinkWrapper(sink)); 68 std::find(sinks_.begin(), sinks_.end(), sink);
52 DCHECK(it != sinks_.end()); 69 DCHECK(it != sinks_.end());
53 sinks_.erase(it); 70 sinks_.erase(it);
54 } 71 }
55 72
56 webrtc::VideoTrackInterface* MediaStreamVideoTrack::GetVideoAdapter() { 73 webrtc::VideoTrackInterface* MediaStreamVideoTrack::GetVideoAdapter() {
74 DCHECK(thread_checker_.CalledOnValidThread());
57 DCHECK_EQ(owner().source().type(), blink::WebMediaStreamSource::TypeVideo); 75 DCHECK_EQ(owner().source().type(), blink::WebMediaStreamSource::TypeVideo);
58 if (!track_.get()) { 76 if (!track_.get()) {
59 MediaStreamVideoSource* source = 77 MediaStreamVideoSource* source =
60 static_cast<MediaStreamVideoSource*>(owner().source().extraData()); 78 static_cast<MediaStreamVideoSource*>(owner().source().extraData());
61 scoped_refptr<webrtc::VideoTrackInterface> video_track( 79 scoped_refptr<webrtc::VideoTrackInterface> video_track(
62 factory_->CreateLocalVideoTrack(owner().id().utf8(), 80 factory_->CreateLocalVideoTrack(owner().id().utf8(),
63 source->GetAdapter())); 81 source->GetAdapter()));
64 video_track->set_enabled(owner().isEnabled()); 82 video_track->set_enabled(owner().isEnabled());
65 track_ = video_track; 83 track_ = video_track;
66 } 84 }
67 return static_cast<webrtc::VideoTrackInterface*>(track_.get()); 85 return static_cast<webrtc::VideoTrackInterface*>(track_.get());
68 } 86 }
69 87
88 void MediaStreamVideoTrack::SetEnabled(bool enabled) {
89 DCHECK(thread_checker_.CalledOnValidThread());
90 enabled_ = enabled;
91 MediaStreamTrack::SetEnabled(enabled);
92 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin();
93 it != sinks_.end(); ++it) {
94 (*it)->OnEnabledChanged(enabled);
95 }
96 }
97
98 void MediaStreamVideoTrack::OnVideoFrame(
99 const scoped_refptr<media::VideoFrame>& frame) {
100 DCHECK(thread_checker_.CalledOnValidThread());
101 if (!enabled_)
102 return;
103 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin();
104 it != sinks_.end(); ++it) {
105 (*it)->OnVideoFrame(frame);
106 }
107 }
108
109 void MediaStreamVideoTrack::OnReadyStateChanged(
110 blink::WebMediaStreamSource::ReadyState state) {
111 DCHECK(thread_checker_.CalledOnValidThread());
112 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin();
113 it != sinks_.end(); ++it) {
114 (*it)->OnReadyStateChanged(state);
115 }
116 }
117
118 // Wrapper which allows to use std::find_if() when adding and removing
119 // sinks to/from |sinks_|.
120 struct SinkWrapper {
121 explicit SinkWrapper(MediaStreamVideoSink* sink) : sink_(sink) {}
122 bool operator()(
123 const WebRtcVideoSinkAdapter* owner) {
124 return owner->sink() == sink_;
125 }
126 MediaStreamVideoSink* sink_;
127 };
128
129 WebRtcMediaStreamVideoTrack::WebRtcMediaStreamVideoTrack(
130 webrtc::VideoTrackInterface* track)
131 : MediaStreamVideoTrack(NULL,
132 blink::WebMediaConstraints(),
133 MediaStreamVideoSource::ConstraintsCallback(),
134 track->enabled(),
135 NULL) {
136 track_ = track;
137 }
138
139 WebRtcMediaStreamVideoTrack::~WebRtcMediaStreamVideoTrack() {
140 }
141
142 void WebRtcMediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) {
143 DCHECK(thread_checker_.CalledOnValidThread());
144 DCHECK(std::find_if(sinks_.begin(), sinks_.end(),
145 SinkWrapper(sink)) == sinks_.end());
146 sinks_.push_back(new WebRtcVideoSinkAdapter(GetVideoAdapter(), sink));
147 }
148
149 void WebRtcMediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) {
150 DCHECK(thread_checker_.CalledOnValidThread());
151 ScopedVector<WebRtcVideoSinkAdapter>::iterator it =
152 std::find_if(sinks_.begin(), sinks_.end(), SinkWrapper(sink));
153 DCHECK(it != sinks_.end());
154 sinks_.erase(it);
155 }
156
70 } // namespace content 157 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698