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

Unified Diff: content/renderer/media/webmediaplayer_ms.cc

Issue 2969093002: Make rendering of MediaStreams reflect changes to its set of tracks. (Closed)
Patch Set: rebase and address comments by foolip@ Created 3 years, 5 months 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/webmediaplayer_ms.cc
diff --git a/content/renderer/media/webmediaplayer_ms.cc b/content/renderer/media/webmediaplayer_ms.cc
index f064d1ca786917cbb92d6ac228108fb099550fce..bf214944d24c65e00e7dff7846915318994530e4 100644
--- a/content/renderer/media/webmediaplayer_ms.cc
+++ b/content/renderer/media/webmediaplayer_ms.cc
@@ -20,6 +20,8 @@
#include "content/public/renderer/media_stream_audio_renderer.h"
#include "content/public/renderer/media_stream_renderer_factory.h"
#include "content/public/renderer/media_stream_video_renderer.h"
+#include "content/renderer/media/media_stream_audio_track.h"
+#include "content/renderer/media/media_stream_video_track.h"
#include "content/renderer/media/web_media_element_source_utils.h"
#include "content/renderer/media/webmediaplayer_ms_compositor.h"
#include "content/renderer/render_frame_impl.h"
@@ -190,6 +192,12 @@ WebMediaPlayerMS::~WebMediaPlayerMS() {
DVLOG(1) << __func__;
DCHECK(thread_checker_.CalledOnValidThread());
+ if (!web_stream_.IsNull()) {
+ MediaStream* native_stream = MediaStream::GetMediaStream(web_stream_);
+ if (native_stream)
+ native_stream->RemoveObserver(this);
+ }
+
// Destruct compositor resources in the proper order.
get_client()->SetWebLayer(nullptr);
if (video_weblayer_)
@@ -223,24 +231,29 @@ void WebMediaPlayerMS::Load(LoadType load_type,
// TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream)
// once Blink-side changes land.
DCHECK_NE(load_type, kLoadTypeMediaSource);
- blink::WebMediaStream web_stream =
- GetWebMediaStreamFromWebMediaPlayerSource(source);
+ web_stream_ = GetWebMediaStreamFromWebMediaPlayerSource(source);
+ if (!web_stream_.IsNull()) {
+ MediaStream* native_stream = MediaStream::GetMediaStream(web_stream_);
+ if (native_stream)
+ native_stream->AddObserver(this);
+ }
compositor_ = new WebMediaPlayerMSCompositor(
- compositor_task_runner_, io_task_runner_, web_stream, AsWeakPtr());
+ compositor_task_runner_, io_task_runner_, web_stream_, AsWeakPtr());
SetNetworkState(WebMediaPlayer::kNetworkStateLoading);
SetReadyState(WebMediaPlayer::kReadyStateHaveNothing);
std::string stream_id =
- web_stream.IsNull() ? std::string() : web_stream.Id().Utf8();
+ web_stream_.IsNull() ? std::string() : web_stream_.Id().Utf8();
media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id));
frame_deliverer_.reset(new WebMediaPlayerMS::FrameDeliverer(
AsWeakPtr(),
base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame, compositor_)));
video_frame_provider_ = renderer_factory_->GetVideoRenderer(
- web_stream, media::BindToCurrentLoop(base::Bind(
- &WebMediaPlayerMS::OnSourceError, AsWeakPtr())),
+ web_stream_,
+ media::BindToCurrentLoop(
+ base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr())),
frame_deliverer_->GetRepaintCallback(), io_task_runner_,
media_task_runner_, worker_task_runner_, gpu_factories_);
@@ -253,7 +266,7 @@ void WebMediaPlayerMS::Load(LoadType load_type,
media_log_.get());
audio_renderer_ = renderer_factory_->GetAudioRenderer(
- web_stream, frame->GetRoutingID(), initial_audio_output_device_id_,
+ web_stream_, frame->GetRoutingID(), initial_audio_output_device_id_,
initial_security_origin_);
}
@@ -275,6 +288,63 @@ void WebMediaPlayerMS::Load(LoadType load_type,
}
}
+void WebMediaPlayerMS::TrackAdded(const blink::WebMediaStreamTrack& track) {
+ Reload();
+}
+
+void WebMediaPlayerMS::TrackRemoved(const blink::WebMediaStreamTrack& track) {
+ Reload();
+}
+
+void WebMediaPlayerMS::Reload() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+
+ blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
+ // VideoTracks() is a getter.
+ web_stream_.VideoTracks(video_tracks);
+ bool has_video_track = !video_tracks.IsEmpty() &&
emircan 2017/07/05 18:04:09 const
Guido Urdaneta 2017/07/06 18:50:33 Removed.
+ MediaStreamVideoTrack::GetTrack(video_tracks[0]);
+
+ if (has_video_track && !video_frame_provider_) {
emircan 2017/07/05 18:04:09 I have a question regarding multiple video track c
Guido Urdaneta 2017/07/05 19:01:08 Good question. I'll check what other browsers do a
Guido Urdaneta 2017/07/06 18:50:33 Edge only plays a mediaStream if it has a single t
+ // Video track was added.
+ video_frame_provider_ = renderer_factory_->GetVideoRenderer(
+ web_stream_,
+ media::BindToCurrentLoop(
+ base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr())),
+ frame_deliverer_->GetRepaintCallback(), io_task_runner_,
+ media_task_runner_, worker_task_runner_, gpu_factories_);
+ DCHECK(video_frame_provider_);
+ video_frame_provider_->Start();
emircan 2017/07/05 18:04:09 You should also cover the uses of WebMediaPlayerMS
Guido Urdaneta 2017/07/05 19:01:08 Can you elaborate a bit since I don't have the ful
emircan 2017/07/05 19:45:57 RendererWebMediaPlayerDelegate::DidPlay() [0] keep
Guido Urdaneta 2017/07/06 18:50:33 As discussed offline, calling DidPlay twice causes
+ } else if (video_frame_provider_ && !has_video_track) {
+ // Video track was removed.
+ video_frame_provider_->Stop();
+ video_frame_provider_ = nullptr;
+ }
+
+ RenderFrame* const frame = RenderFrame::FromWebFrame(frame_);
+ if (frame) {
+ blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
+ // AudioTracks() is a getter.
+ web_stream_.AudioTracks(audio_tracks);
+ bool has_audio_track = !audio_tracks.IsEmpty() &&
+ MediaStreamAudioTrack::GetTrack(audio_tracks[0]);
+
+ if (has_audio_track && !audio_renderer_) {
+ // Audio track was added.
+ audio_renderer_ = renderer_factory_->GetAudioRenderer(
+ web_stream_, frame->GetRoutingID(), initial_audio_output_device_id_,
+ initial_security_origin_);
+ audio_renderer_->SetVolume(volume_);
+ audio_renderer_->Start();
+ audio_renderer_->Play();
+ } else if (!has_audio_track && audio_renderer_) {
+ // Audio track was removed.
+ audio_renderer_->Stop();
+ audio_renderer_ = nullptr;
+ }
+ }
+}
+
void WebMediaPlayerMS::Play() {
DVLOG(1) << __func__;
DCHECK(thread_checker_.CalledOnValidThread());
@@ -381,6 +451,9 @@ bool WebMediaPlayerMS::HasAudio() const {
blink::WebSize WebMediaPlayerMS::NaturalSize() const {
DCHECK(thread_checker_.CalledOnValidThread());
+ if (!video_frame_provider_)
+ return blink::WebSize();
+
if (video_rotation_ == media::VIDEO_ROTATION_90 ||
video_rotation_ == media::VideoRotation::VIDEO_ROTATION_270) {
const gfx::Size& current_size = compositor_->GetCurrentSize();

Powered by Google App Engine
This is Rietveld 408576698