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

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: More cleanup. 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" 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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698