Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1408)

Unified Diff: content/renderer/media/webrtc/media_stream_video_webrtc_sink.cc

Issue 2585313002: Propagate MediaStreamTrack video content hints. (Closed)
Patch Set: fix test Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());

Powered by Google App Engine
This is Rietveld 408576698