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/webrtc/webrtc_video_sink_adapter.h" | 8 #include "content/renderer/media/webrtc/webrtc_video_sink_adapter.h" |
9 | 9 |
10 namespace content { | 10 namespace content { |
11 | 11 |
12 // Empty method used for keeping a reference to the original media::VideoFrame | |
13 // in RTCVideoRenderer::OnVideoFrame if a color conversion between I420 and | |
14 // YV12 is needed. | |
15 static void ReleaseOriginalFrame( | |
16 const scoped_refptr<media::VideoFrame>& frame) { | |
17 } | |
18 | |
19 //static | 12 //static |
20 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack( | 13 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack( |
21 MediaStreamVideoSource* source, | 14 MediaStreamVideoSource* source, |
22 const blink::WebMediaConstraints& constraints, | 15 const blink::WebMediaConstraints& constraints, |
23 const MediaStreamVideoSource::ConstraintsCallback& callback, | 16 const MediaStreamVideoSource::ConstraintsCallback& callback, |
24 bool enabled, | 17 bool enabled, |
25 MediaStreamDependencyFactory* factory) { | 18 MediaStreamDependencyFactory* factory) { |
26 blink::WebMediaStreamTrack track; | 19 blink::WebMediaStreamTrack track; |
27 track.initialize(source->owner()); | 20 track.initialize(source->owner()); |
28 track.setExtraData(new MediaStreamVideoTrack(source, | 21 track.setExtraData(new MediaStreamVideoTrack(source, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
101 (*it)->OnEnabledChanged(enabled); | 94 (*it)->OnEnabledChanged(enabled); |
102 } | 95 } |
103 } | 96 } |
104 | 97 |
105 void MediaStreamVideoTrack::OnVideoFrame( | 98 void MediaStreamVideoTrack::OnVideoFrame( |
106 const scoped_refptr<media::VideoFrame>& frame) { | 99 const scoped_refptr<media::VideoFrame>& frame) { |
107 DCHECK(thread_checker_.CalledOnValidThread()); | 100 DCHECK(thread_checker_.CalledOnValidThread()); |
108 if (!enabled_) | 101 if (!enabled_) |
109 return; | 102 return; |
110 | 103 |
111 scoped_refptr<media::VideoFrame> video_frame = frame; | |
112 if (frame->format() == media::VideoFrame::I420) { | |
113 // Rendering do not support I420 but video capture use I420. | |
114 // The only difference between YV12 and I420 is the order of U and V plane. | |
115 // To solve that the I420 frame is simply wrapped in an YV12 video frame. | |
116 // crbug/341452. | |
117 video_frame = media::VideoFrame::WrapExternalYuvData( | |
118 media::VideoFrame::YV12, | |
119 frame->coded_size(), | |
120 frame->visible_rect(), | |
121 frame->natural_size(), | |
122 frame->stride(media::VideoFrame::kYPlane), | |
123 frame->stride(media::VideoFrame::kUPlane), | |
124 frame->stride(media::VideoFrame::kVPlane), | |
125 frame->data(media::VideoFrame::kYPlane), | |
126 frame->data(media::VideoFrame::kUPlane), | |
127 frame->data(media::VideoFrame::kVPlane), | |
128 frame->GetTimestamp(), | |
129 base::Bind(&ReleaseOriginalFrame, frame)); | |
130 } | |
131 | |
132 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); | 104 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); |
133 it != sinks_.end(); ++it) { | 105 it != sinks_.end(); ++it) { |
134 (*it)->OnVideoFrame(video_frame); | 106 (*it)->OnVideoFrame(frame); |
perkj_chrome
2014/03/27 09:25:39
Note that you will have to talk to the Pepper team
| |
135 } | 107 } |
136 } | 108 } |
137 | 109 |
138 void MediaStreamVideoTrack::OnReadyStateChanged( | 110 void MediaStreamVideoTrack::OnReadyStateChanged( |
139 blink::WebMediaStreamSource::ReadyState state) { | 111 blink::WebMediaStreamSource::ReadyState state) { |
140 DCHECK(thread_checker_.CalledOnValidThread()); | 112 DCHECK(thread_checker_.CalledOnValidThread()); |
141 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); | 113 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin(); |
142 it != sinks_.end(); ++it) { | 114 it != sinks_.end(); ++it) { |
143 (*it)->OnReadyStateChanged(state); | 115 (*it)->OnReadyStateChanged(state); |
144 } | 116 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 | 149 |
178 void WebRtcMediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { | 150 void WebRtcMediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { |
179 DCHECK(thread_checker_.CalledOnValidThread()); | 151 DCHECK(thread_checker_.CalledOnValidThread()); |
180 ScopedVector<WebRtcVideoSinkAdapter>::iterator it = | 152 ScopedVector<WebRtcVideoSinkAdapter>::iterator it = |
181 std::find_if(sinks_.begin(), sinks_.end(), SinkWrapper(sink)); | 153 std::find_if(sinks_.begin(), sinks_.end(), SinkWrapper(sink)); |
182 DCHECK(it != sinks_.end()); | 154 DCHECK(it != sinks_.end()); |
183 sinks_.erase(it); | 155 sinks_.erase(it); |
184 } | 156 } |
185 | 157 |
186 } // namespace content | 158 } // namespace content |
OLD | NEW |