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

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

Issue 2969093002: Make rendering of MediaStreams reflect changes to its set of tracks. (Closed)
Patch Set: 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..92c65e34269605a01181fb705648649f0f4577ee 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);
foolip 2017/07/05 08:49:44 Can a DCHECK be added here or in the management of
Guido Urdaneta 2017/07/05 13:05:02 RemoveObserver DCHECKs that its observer argument
foolip 2017/07/05 13:13:52 Yep.
+ }
+
// 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,59 @@ void WebMediaPlayerMS::Load(LoadType load_type,
}
}
+void WebMediaPlayerMS::TrackAdded(const blink::WebMediaStreamTrack& track) {
+ Reload();
+}
foolip 2017/07/05 08:49:44 Blank lines between functions seems to be the norm
Guido Urdaneta 2017/07/05 13:05:02 Done.
+void WebMediaPlayerMS::TrackRemoved(const blink::WebMediaStreamTrack& track) {
+ Reload();
+}
+void WebMediaPlayerMS::Reload() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+
+ blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
+ web_stream_.VideoTracks(video_tracks);
+ bool has_video_track = !video_tracks.IsEmpty() &&
+ MediaStreamVideoTrack::GetTrack(video_tracks[0]);
+
+ if (has_video_track && !video_frame_provider_) {
+ // 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();
+ } 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;
+ web_stream_.AudioTracks(audio_tracks);
foolip 2017/07/05 08:49:44 Can you add a comment explaining that this is a ge
Guido Urdaneta 2017/07/05 13:05:02 Done. Also for VideoTracks above.
+ 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 +447,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