| 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());
|
|
|