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..a1580b52f4a34b091d46607593269aa07a765aa6 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 ContentHintTypeToWebRtcContentHint( |
+ 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,8 @@ MediaStreamVideoWebRtcSink::MediaStreamVideoWebRtcSink( |
video_track_ = factory->CreateLocalVideoTrack(track.id().utf8(), |
video_source_proxy_.get()); |
+ video_track_->set_content_hint( |
+ ContentHintTypeToWebRtcContentHint(track.contentHint())); |
video_track_->set_enabled(track.isEnabled()); |
source_adapter_ = new WebRtcVideoSourceAdapter( |
@@ -308,6 +353,14 @@ 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( |
+ ContentHintTypeToWebRtcContentHint(content_hint)); |
+} |
+ |
void MediaStreamVideoWebRtcSink::RequestRefreshFrame() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
content::RequestRefreshFrameFromVideoTrack(connected_track()); |