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/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 |