Chromium Code Reviews| Index: content/renderer/media/webrtc/media_stream_video_webrtc_sink.cc |
| diff --git a/content/renderer/media/webrtc/media_stream_video_webrtc_sink.cc b/content/renderer/media/webrtc/media_stream_video_webrtc_sink.cc |
| index 99db0f2c3ee77976d518bb820a65e109f563d0d0..a9f98060c79016b21b3c2599add549f34a1c701a 100644 |
| --- a/content/renderer/media/webrtc/media_stream_video_webrtc_sink.cc |
| +++ b/content/renderer/media/webrtc/media_stream_video_webrtc_sink.cc |
| @@ -59,6 +59,24 @@ const int64_t kDefaultRefreshIntervalMicros = |
| const int64_t kLowerBoundRefreshIntervalMicros = |
| base::Time::kMicrosecondsPerSecond / media::limits::kMaxFramesPerSecond; |
| +webrtc::VideoTrackInterface::ContentHint TranslateContentHint( |
|
emircan
2016/12/19 21:14:27
ContentHintTypeToWebrtcContentHint()? I have seen
pbos
2016/12/19 21:42:26
Done.
|
| + blink::WebMediaStreamTrack::ContentHintType content_hint) { |
| + switch (content_hint) { |
| + case blink::WebMediaStreamTrack::ContentHintType::None: |
| + return webrtc::VideoTrackInterface::ContentHint::kNone; |
| + case blink::WebMediaStreamTrack::ContentHintType::AudioSpeech: |
| + case blink::WebMediaStreamTrack::ContentHintType::AudioMusic: |
| + NOTREACHED(); |
| + break; |
| + case blink::WebMediaStreamTrack::ContentHintType::VideoFluid: |
| + return webrtc::VideoTrackInterface::ContentHint::kFluid; |
| + case blink::WebMediaStreamTrack::ContentHintType::VideoDetailed: |
| + return webrtc::VideoTrackInterface::ContentHint::kDetailed; |
| + } |
| + NOTREACHED(); |
| + return webrtc::VideoTrackInterface::ContentHint::kNone; |
| +} |
| + |
| } // namespace |
| // Simple help class used for receiving video frames on the IO-thread from a |
| @@ -82,13 +100,20 @@ class MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter |
| // destroyed. |
| void ReleaseSourceOnMainThread(); |
| + void SetContentHint(blink::WebMediaStreamTrack::ContentHintType content_hint); |
| + |
| void OnVideoFrameOnIO(const scoped_refptr<media::VideoFrame>& frame, |
| base::TimeTicks estimated_capture_time); |
| private: |
| + friend class base::RefCountedThreadSafe<WebRtcVideoSourceAdapter>; |
| + |
| void OnVideoFrameOnWorkerThread( |
| const scoped_refptr<media::VideoFrame>& frame); |
| - friend class base::RefCountedThreadSafe<WebRtcVideoSourceAdapter>; |
| + |
| + void SetContentHintOnWorkerThread( |
| + blink::WebMediaStreamTrack::ContentHintType content_hint); |
| + |
| virtual ~WebRtcVideoSourceAdapter(); |
| // Called whenever a video frame was just delivered on the IO thread. This |
| @@ -161,14 +186,14 @@ MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter:: |
| } |
| void MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter:: |
| -ResetRefreshTimerOnMainThread() { |
| + ResetRefreshTimerOnMainThread() { |
| DCHECK(render_thread_checker_.CalledOnValidThread()); |
| if (refresh_timer_.IsRunning()) |
| refresh_timer_.Reset(); |
| } |
| void MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter:: |
| -ReleaseSourceOnMainThread() { |
| + ReleaseSourceOnMainThread() { |
| DCHECK(render_thread_checker_.CalledOnValidThread()); |
| // Since frames are posted to the worker thread, this object might be deleted |
| // on that thread. However, since |video_source_| was created on the render |
| @@ -179,6 +204,24 @@ ReleaseSourceOnMainThread() { |
| video_source_ = NULL; |
| } |
| +void MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter::SetContentHint( |
| + blink::WebMediaStreamTrack::ContentHintType content_hint) { |
| + DCHECK(render_thread_checker_.CalledOnValidThread()); |
| + libjingle_worker_thread_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&WebRtcVideoSourceAdapter::SetContentHintOnWorkerThread, this, |
| + content_hint)); |
| +} |
| + |
| +void MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter:: |
| + SetContentHintOnWorkerThread( |
| + blink::WebMediaStreamTrack::ContentHintType content_hint) { |
| + DCHECK(libjingle_worker_thread_->BelongsToCurrentThread()); |
| + base::AutoLock auto_lock(capture_adapter_stop_lock_); |
| + if (capture_adapter_) |
| + capture_adapter_->SetContentHint(content_hint); |
| +} |
| + |
| void MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter::OnVideoFrameOnIO( |
| const scoped_refptr<media::VideoFrame>& frame, |
| base::TimeTicks estimated_capture_time) { |
| @@ -267,8 +310,8 @@ MediaStreamVideoWebRtcSink::MediaStreamVideoWebRtcSink( |
| // by removing the need for and dependency on a cricket::VideoCapturer. |
| video_source_ = scoped_refptr<WebRtcVideoSource>( |
| new rtc::RefCountedObject<WebRtcVideoSource>( |
| - new WebRtcVideoCapturerAdapter(is_screencast), is_screencast, |
| - needs_denoising)); |
| + new WebRtcVideoCapturerAdapter(is_screencast, track.contentHint()), |
| + is_screencast, needs_denoising)); |
| // TODO(pbos): Consolidate the local video track with the source proxy and |
| // move into PeerConnectionDependencyFactory. This now separately holds on a |
| @@ -279,6 +322,7 @@ MediaStreamVideoWebRtcSink::MediaStreamVideoWebRtcSink( |
| video_track_ = factory->CreateLocalVideoTrack(track.id().utf8(), |
| video_source_proxy_.get()); |
| + video_track_->set_content_hint(TranslateContentHint(track.contentHint())); |
| video_track_->set_enabled(track.isEnabled()); |
| source_adapter_ = new WebRtcVideoSourceAdapter( |
| @@ -308,6 +352,13 @@ void MediaStreamVideoWebRtcSink::OnEnabledChanged(bool enabled) { |
| video_track_->set_enabled(enabled); |
| } |
| +void MediaStreamVideoWebRtcSink::OnContentHintChanged( |
| + blink::WebMediaStreamTrack::ContentHintType content_hint) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + source_adapter_->SetContentHint(content_hint); |
| + video_track_->set_content_hint(TranslateContentHint(content_hint)); |
| +} |
| + |
| void MediaStreamVideoWebRtcSink::RequestRefreshFrame() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| content::RequestRefreshFrameFromVideoTrack(connected_track()); |