| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/webrtc/media_stream_remote_video_source.h" | 5 #include "content/renderer/media/webrtc/media_stream_remote_video_source.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 MediaStreamRemoteVideoSource::MediaStreamRemoteVideoSource( | 169 MediaStreamRemoteVideoSource::MediaStreamRemoteVideoSource( |
| 170 std::unique_ptr<TrackObserver> observer) | 170 std::unique_ptr<TrackObserver> observer) |
| 171 : observer_(std::move(observer)) { | 171 : observer_(std::move(observer)) { |
| 172 // The callback will be automatically cleared when 'observer_' goes out of | 172 // The callback will be automatically cleared when 'observer_' goes out of |
| 173 // scope and no further callbacks will occur. | 173 // scope and no further callbacks will occur. |
| 174 observer_->SetCallback(base::Bind(&MediaStreamRemoteVideoSource::OnChanged, | 174 observer_->SetCallback(base::Bind(&MediaStreamRemoteVideoSource::OnChanged, |
| 175 base::Unretained(this))); | 175 base::Unretained(this))); |
| 176 } | 176 } |
| 177 | 177 |
| 178 MediaStreamRemoteVideoSource::~MediaStreamRemoteVideoSource() { | 178 MediaStreamRemoteVideoSource::~MediaStreamRemoteVideoSource() { |
| 179 DCHECK(CalledOnValidThread()); | 179 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 180 DCHECK(!observer_); | 180 DCHECK(!observer_); |
| 181 } | 181 } |
| 182 | 182 |
| 183 void MediaStreamRemoteVideoSource::OnSourceTerminated() { | 183 void MediaStreamRemoteVideoSource::OnSourceTerminated() { |
| 184 DCHECK(CalledOnValidThread()); | 184 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 185 StopSourceImpl(); | 185 StopSourceImpl(); |
| 186 } | 186 } |
| 187 | 187 |
| 188 void MediaStreamRemoteVideoSource::GetCurrentSupportedFormats( | 188 void MediaStreamRemoteVideoSource::GetCurrentSupportedFormats( |
| 189 int max_requested_width, | 189 int max_requested_width, |
| 190 int max_requested_height, | 190 int max_requested_height, |
| 191 double max_requested_frame_rate, | 191 double max_requested_frame_rate, |
| 192 const VideoCaptureDeviceFormatsCB& callback) { | 192 const VideoCaptureDeviceFormatsCB& callback) { |
| 193 DCHECK(CalledOnValidThread()); | 193 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 194 media::VideoCaptureFormats formats; | 194 media::VideoCaptureFormats formats; |
| 195 // Since the remote end is free to change the resolution at any point in time | 195 // Since the remote end is free to change the resolution at any point in time |
| 196 // the supported formats are unknown. | 196 // the supported formats are unknown. |
| 197 callback.Run(formats); | 197 callback.Run(formats); |
| 198 } | 198 } |
| 199 | 199 |
| 200 void MediaStreamRemoteVideoSource::StartSourceImpl( | 200 void MediaStreamRemoteVideoSource::StartSourceImpl( |
| 201 const media::VideoCaptureFormat& format, | 201 const media::VideoCaptureFormat& format, |
| 202 const blink::WebMediaConstraints& constraints, | 202 const blink::WebMediaConstraints& constraints, |
| 203 const VideoCaptureDeliverFrameCB& frame_callback) { | 203 const VideoCaptureDeliverFrameCB& frame_callback) { |
| 204 DCHECK(CalledOnValidThread()); | 204 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 205 DCHECK(!delegate_.get()); | 205 DCHECK(!delegate_.get()); |
| 206 delegate_ = new RemoteVideoSourceDelegate(io_task_runner(), frame_callback); | 206 delegate_ = new RemoteVideoSourceDelegate(io_task_runner(), frame_callback); |
| 207 scoped_refptr<webrtc::VideoTrackInterface> video_track( | 207 scoped_refptr<webrtc::VideoTrackInterface> video_track( |
| 208 static_cast<webrtc::VideoTrackInterface*>(observer_->track().get())); | 208 static_cast<webrtc::VideoTrackInterface*>(observer_->track().get())); |
| 209 video_track->AddOrUpdateSink(delegate_.get(), rtc::VideoSinkWants()); | 209 video_track->AddOrUpdateSink(delegate_.get(), rtc::VideoSinkWants()); |
| 210 OnStartDone(MEDIA_DEVICE_OK); | 210 OnStartDone(MEDIA_DEVICE_OK); |
| 211 } | 211 } |
| 212 | 212 |
| 213 void MediaStreamRemoteVideoSource::StopSourceImpl() { | 213 void MediaStreamRemoteVideoSource::StopSourceImpl() { |
| 214 DCHECK(CalledOnValidThread()); | 214 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 215 // StopSourceImpl is called either when MediaStreamTrack.stop is called from | 215 // StopSourceImpl is called either when MediaStreamTrack.stop is called from |
| 216 // JS or blink gc the MediaStreamSource object or when OnSourceTerminated() | 216 // JS or blink gc the MediaStreamSource object or when OnSourceTerminated() |
| 217 // is called. Garbage collection will happen after the PeerConnection no | 217 // is called. Garbage collection will happen after the PeerConnection no |
| 218 // longer receives the video track. | 218 // longer receives the video track. |
| 219 if (!observer_) | 219 if (!observer_) |
| 220 return; | 220 return; |
| 221 DCHECK(state() != MediaStreamVideoSource::ENDED); | 221 DCHECK(state() != MediaStreamVideoSource::ENDED); |
| 222 scoped_refptr<webrtc::VideoTrackInterface> video_track( | 222 scoped_refptr<webrtc::VideoTrackInterface> video_track( |
| 223 static_cast<webrtc::VideoTrackInterface*>(observer_->track().get())); | 223 static_cast<webrtc::VideoTrackInterface*>(observer_->track().get())); |
| 224 video_track->RemoveSink(delegate_.get()); | 224 video_track->RemoveSink(delegate_.get()); |
| 225 // This removes the references to the webrtc video track. | 225 // This removes the references to the webrtc video track. |
| 226 observer_.reset(); | 226 observer_.reset(); |
| 227 } | 227 } |
| 228 | 228 |
| 229 rtc::VideoSinkInterface<webrtc::VideoFrame>* | 229 rtc::VideoSinkInterface<webrtc::VideoFrame>* |
| 230 MediaStreamRemoteVideoSource::SinkInterfaceForTest() { | 230 MediaStreamRemoteVideoSource::SinkInterfaceForTest() { |
| 231 return delegate_.get(); | 231 return delegate_.get(); |
| 232 } | 232 } |
| 233 | 233 |
| 234 void MediaStreamRemoteVideoSource::OnChanged( | 234 void MediaStreamRemoteVideoSource::OnChanged( |
| 235 webrtc::MediaStreamTrackInterface::TrackState state) { | 235 webrtc::MediaStreamTrackInterface::TrackState state) { |
| 236 DCHECK(CalledOnValidThread()); | 236 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 237 switch (state) { | 237 switch (state) { |
| 238 case webrtc::MediaStreamTrackInterface::kLive: | 238 case webrtc::MediaStreamTrackInterface::kLive: |
| 239 SetReadyState(blink::WebMediaStreamSource::kReadyStateLive); | 239 SetReadyState(blink::WebMediaStreamSource::kReadyStateLive); |
| 240 break; | 240 break; |
| 241 case webrtc::MediaStreamTrackInterface::kEnded: | 241 case webrtc::MediaStreamTrackInterface::kEnded: |
| 242 SetReadyState(blink::WebMediaStreamSource::kReadyStateEnded); | 242 SetReadyState(blink::WebMediaStreamSource::kReadyStateEnded); |
| 243 break; | 243 break; |
| 244 default: | 244 default: |
| 245 NOTREACHED(); | 245 NOTREACHED(); |
| 246 break; | 246 break; |
| 247 } | 247 } |
| 248 } | 248 } |
| 249 | 249 |
| 250 } // namespace content | 250 } // namespace content |
| OLD | NEW |