| 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" |
| 11 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
| 12 #include "base/location.h" | 12 #include "base/location.h" |
| 13 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
| 14 #include "content/renderer/media/webrtc/track_observer.h" | 14 #include "content/renderer/media/webrtc/track_observer.h" |
| 15 #include "media/base/bind_to_current_loop.h" | 15 #include "media/base/bind_to_current_loop.h" |
| 16 #include "media/base/timestamp_constants.h" | 16 #include "media/base/timestamp_constants.h" |
| 17 #include "media/base/video_frame.h" | 17 #include "media/base/video_frame.h" |
| 18 #include "media/base/video_util.h" | 18 #include "media/base/video_util.h" |
| 19 #include "third_party/webrtc/media/base/videoframe.h" | |
| 20 #include "third_party/webrtc/media/base/videosinkinterface.h" | 19 #include "third_party/webrtc/media/base/videosinkinterface.h" |
| 21 | 20 |
| 22 namespace content { | 21 namespace content { |
| 23 | 22 |
| 24 namespace { | 23 namespace { |
| 25 | 24 |
| 26 media::VideoRotation WebRTCToMediaVideoRotation( | 25 media::VideoRotation WebRTCToMediaVideoRotation( |
| 27 webrtc::VideoRotation rotation) { | 26 webrtc::VideoRotation rotation) { |
| 28 switch (rotation) { | 27 switch (rotation) { |
| 29 case webrtc::kVideoRotation_0: | 28 case webrtc::kVideoRotation_0: |
| 30 return media::VIDEO_ROTATION_0; | 29 return media::VIDEO_ROTATION_0; |
| 31 case webrtc::kVideoRotation_90: | 30 case webrtc::kVideoRotation_90: |
| 32 return media::VIDEO_ROTATION_90; | 31 return media::VIDEO_ROTATION_90; |
| 33 case webrtc::kVideoRotation_180: | 32 case webrtc::kVideoRotation_180: |
| 34 return media::VIDEO_ROTATION_180; | 33 return media::VIDEO_ROTATION_180; |
| 35 case webrtc::kVideoRotation_270: | 34 case webrtc::kVideoRotation_270: |
| 36 return media::VIDEO_ROTATION_270; | 35 return media::VIDEO_ROTATION_270; |
| 37 } | 36 } |
| 38 return media::VIDEO_ROTATION_0; | 37 return media::VIDEO_ROTATION_0; |
| 39 } | 38 } |
| 40 | 39 |
| 41 } // anonymous namespace | 40 } // anonymous namespace |
| 42 | 41 |
| 43 // Internal class used for receiving frames from the webrtc track on a | 42 // Internal class used for receiving frames from the webrtc track on a |
| 44 // libjingle thread and forward it to the IO-thread. | 43 // libjingle thread and forward it to the IO-thread. |
| 45 class MediaStreamRemoteVideoSource::RemoteVideoSourceDelegate | 44 class MediaStreamRemoteVideoSource::RemoteVideoSourceDelegate |
| 46 : public base::RefCountedThreadSafe<RemoteVideoSourceDelegate>, | 45 : public base::RefCountedThreadSafe<RemoteVideoSourceDelegate>, |
| 47 public rtc::VideoSinkInterface<cricket::VideoFrame> { | 46 public rtc::VideoSinkInterface<webrtc::VideoFrame> { |
| 48 public: | 47 public: |
| 49 RemoteVideoSourceDelegate( | 48 RemoteVideoSourceDelegate( |
| 50 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, | 49 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, |
| 51 const VideoCaptureDeliverFrameCB& new_frame_callback); | 50 const VideoCaptureDeliverFrameCB& new_frame_callback); |
| 52 | 51 |
| 53 protected: | 52 protected: |
| 54 friend class base::RefCountedThreadSafe<RemoteVideoSourceDelegate>; | 53 friend class base::RefCountedThreadSafe<RemoteVideoSourceDelegate>; |
| 55 ~RemoteVideoSourceDelegate() override; | 54 ~RemoteVideoSourceDelegate() override; |
| 56 | 55 |
| 57 // Implements rtc::VideoSinkInterface used for receiving video frames | 56 // Implements rtc::VideoSinkInterface used for receiving video frames |
| 58 // from the PeerConnection video track. May be called on a libjingle internal | 57 // from the PeerConnection video track. May be called on a libjingle internal |
| 59 // thread. | 58 // thread. |
| 60 void OnFrame(const cricket::VideoFrame& frame) override; | 59 void OnFrame(const webrtc::VideoFrame& frame) override; |
| 61 | 60 |
| 62 void DoRenderFrameOnIOThread( | 61 void DoRenderFrameOnIOThread( |
| 63 const scoped_refptr<media::VideoFrame>& video_frame); | 62 const scoped_refptr<media::VideoFrame>& video_frame); |
| 64 | 63 |
| 65 private: | 64 private: |
| 66 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; | 65 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; |
| 67 | 66 |
| 68 // |frame_callback_| is accessed on the IO thread. | 67 // |frame_callback_| is accessed on the IO thread. |
| 69 VideoCaptureDeliverFrameCB frame_callback_; | 68 VideoCaptureDeliverFrameCB frame_callback_; |
| 70 | 69 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 89 | 88 |
| 90 MediaStreamRemoteVideoSource:: | 89 MediaStreamRemoteVideoSource:: |
| 91 RemoteVideoSourceDelegate::~RemoteVideoSourceDelegate() { | 90 RemoteVideoSourceDelegate::~RemoteVideoSourceDelegate() { |
| 92 } | 91 } |
| 93 | 92 |
| 94 namespace { | 93 namespace { |
| 95 void DoNothing(const scoped_refptr<rtc::RefCountInterface>& ref) {} | 94 void DoNothing(const scoped_refptr<rtc::RefCountInterface>& ref) {} |
| 96 } // anonymous | 95 } // anonymous |
| 97 | 96 |
| 98 void MediaStreamRemoteVideoSource::RemoteVideoSourceDelegate::OnFrame( | 97 void MediaStreamRemoteVideoSource::RemoteVideoSourceDelegate::OnFrame( |
| 99 const cricket::VideoFrame& incoming_frame) { | 98 const webrtc::VideoFrame& incoming_frame) { |
| 100 const base::TimeDelta incoming_timestamp = base::TimeDelta::FromMicroseconds( | 99 const base::TimeDelta incoming_timestamp = base::TimeDelta::FromMicroseconds( |
| 101 incoming_frame.timestamp_us()); | 100 incoming_frame.timestamp_us()); |
| 102 const base::TimeTicks render_time = | 101 const base::TimeTicks render_time = |
| 103 base::TimeTicks() + incoming_timestamp + time_diff_; | 102 base::TimeTicks() + incoming_timestamp + time_diff_; |
| 104 | 103 |
| 105 TRACE_EVENT1("webrtc", "RemoteVideoSourceDelegate::RenderFrame", | 104 TRACE_EVENT1("webrtc", "RemoteVideoSourceDelegate::RenderFrame", |
| 106 "Ideal Render Instant", render_time.ToInternalValue()); | 105 "Ideal Render Instant", render_time.ToInternalValue()); |
| 107 | 106 |
| 108 CHECK_NE(media::kNoTimestamp, incoming_timestamp); | 107 CHECK_NE(media::kNoTimestamp, incoming_timestamp); |
| 109 if (start_timestamp_ == media::kNoTimestamp) | 108 if (start_timestamp_ == media::kNoTimestamp) |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 if (!observer_) | 218 if (!observer_) |
| 220 return; | 219 return; |
| 221 DCHECK(state() != MediaStreamVideoSource::ENDED); | 220 DCHECK(state() != MediaStreamVideoSource::ENDED); |
| 222 scoped_refptr<webrtc::VideoTrackInterface> video_track( | 221 scoped_refptr<webrtc::VideoTrackInterface> video_track( |
| 223 static_cast<webrtc::VideoTrackInterface*>(observer_->track().get())); | 222 static_cast<webrtc::VideoTrackInterface*>(observer_->track().get())); |
| 224 video_track->RemoveSink(delegate_.get()); | 223 video_track->RemoveSink(delegate_.get()); |
| 225 // This removes the references to the webrtc video track. | 224 // This removes the references to the webrtc video track. |
| 226 observer_.reset(); | 225 observer_.reset(); |
| 227 } | 226 } |
| 228 | 227 |
| 229 rtc::VideoSinkInterface<cricket::VideoFrame>* | 228 rtc::VideoSinkInterface<webrtc::VideoFrame>* |
| 230 MediaStreamRemoteVideoSource::SinkInterfaceForTest() { | 229 MediaStreamRemoteVideoSource::SinkInterfaceForTest() { |
| 231 return delegate_.get(); | 230 return delegate_.get(); |
| 232 } | 231 } |
| 233 | 232 |
| 234 void MediaStreamRemoteVideoSource::OnChanged( | 233 void MediaStreamRemoteVideoSource::OnChanged( |
| 235 webrtc::MediaStreamTrackInterface::TrackState state) { | 234 webrtc::MediaStreamTrackInterface::TrackState state) { |
| 236 DCHECK(CalledOnValidThread()); | 235 DCHECK(CalledOnValidThread()); |
| 237 switch (state) { | 236 switch (state) { |
| 238 case webrtc::MediaStreamTrackInterface::kLive: | 237 case webrtc::MediaStreamTrackInterface::kLive: |
| 239 SetReadyState(blink::WebMediaStreamSource::ReadyStateLive); | 238 SetReadyState(blink::WebMediaStreamSource::ReadyStateLive); |
| 240 break; | 239 break; |
| 241 case webrtc::MediaStreamTrackInterface::kEnded: | 240 case webrtc::MediaStreamTrackInterface::kEnded: |
| 242 SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded); | 241 SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded); |
| 243 break; | 242 break; |
| 244 default: | 243 default: |
| 245 NOTREACHED(); | 244 NOTREACHED(); |
| 246 break; | 245 break; |
| 247 } | 246 } |
| 248 } | 247 } |
| 249 | 248 |
| 250 } // namespace content | 249 } // namespace content |
| OLD | NEW |