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

Side by Side Diff: content/renderer/media/webmediaplayer_ms.cc

Issue 1570043002: Implement MediaSession on top of the WebMediaPlayerDelegate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@media_session
Patch Set: Reorder. Created 4 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/webmediaplayer_ms.h" 5 #include "content/renderer/media/webmediaplayer_ms.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 14 matching lines...) Expand all
25 #include "gpu/blink/webgraphicscontext3d_impl.h" 25 #include "gpu/blink/webgraphicscontext3d_impl.h"
26 #include "media/base/media_log.h" 26 #include "media/base/media_log.h"
27 #include "media/base/video_frame.h" 27 #include "media/base/video_frame.h"
28 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" 28 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h"
29 #include "third_party/WebKit/public/platform/WebRect.h" 29 #include "third_party/WebKit/public/platform/WebRect.h"
30 #include "third_party/WebKit/public/platform/WebSize.h" 30 #include "third_party/WebKit/public/platform/WebSize.h"
31 #include "third_party/WebKit/public/platform/WebURL.h" 31 #include "third_party/WebKit/public/platform/WebURL.h"
32 32
33 namespace content { 33 namespace content {
34 34
35 namespace {
36
37 static const float DEFAULT_AUDIO_VOLUME = 1.0f;
38
39 } // anonymous namespace
40
41 WebMediaPlayerMS::WebMediaPlayerMS( 35 WebMediaPlayerMS::WebMediaPlayerMS(
42 blink::WebFrame* frame, 36 blink::WebFrame* frame,
43 blink::WebMediaPlayerClient* client, 37 blink::WebMediaPlayerClient* client,
44 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, 38 base::WeakPtr<media::WebMediaPlayerDelegate> delegate,
45 media::MediaLog* media_log, 39 media::MediaLog* media_log,
46 scoped_ptr<MediaStreamRendererFactory> factory, 40 scoped_ptr<MediaStreamRendererFactory> factory,
47 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, 41 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
48 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, 42 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
49 const scoped_refptr<base::TaskRunner>& worker_task_runner, 43 const scoped_refptr<base::TaskRunner>& worker_task_runner,
50 media::GpuVideoAcceleratorFactories* gpu_factories, 44 media::GpuVideoAcceleratorFactories* gpu_factories,
51 const blink::WebString& sink_id, 45 const blink::WebString& sink_id,
52 const blink::WebSecurityOrigin& security_origin) 46 const blink::WebSecurityOrigin& security_origin)
53 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)), 47 : frame_(frame),
54 frame_(frame),
55 network_state_(WebMediaPlayer::NetworkStateEmpty), 48 network_state_(WebMediaPlayer::NetworkStateEmpty),
56 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 49 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
57 buffered_(static_cast<size_t>(0)), 50 buffered_(static_cast<size_t>(0)),
58 client_(client), 51 client_(client),
59 delegate_(delegate), 52 delegate_(delegate),
53 delegate_id_(0),
60 paused_(true), 54 paused_(true),
61 render_frame_suspended_(false), 55 render_frame_suspended_(false),
62 received_first_frame_(false), 56 received_first_frame_(false),
63 media_log_(media_log), 57 media_log_(media_log),
64 renderer_factory_(std::move(factory)), 58 renderer_factory_(std::move(factory)),
65 media_task_runner_(media_task_runner), 59 media_task_runner_(media_task_runner),
66 worker_task_runner_(worker_task_runner), 60 worker_task_runner_(worker_task_runner),
67 gpu_factories_(gpu_factories), 61 gpu_factories_(gpu_factories),
68 compositor_task_runner_(compositor_task_runner), 62 compositor_task_runner_(compositor_task_runner),
69 initial_audio_output_device_id_(sink_id.utf8()), 63 initial_audio_output_device_id_(sink_id.utf8()),
70 initial_security_origin_(security_origin.isNull() 64 initial_security_origin_(security_origin.isNull()
71 ? url::Origin() 65 ? url::Origin()
72 : url::Origin(security_origin)) { 66 : url::Origin(security_origin)),
67 volume_(1.0),
68 volume_multiplier_(1.0) {
73 DVLOG(1) << __FUNCTION__; 69 DVLOG(1) << __FUNCTION__;
74 DCHECK(client); 70 DCHECK(client);
71 if (delegate_)
72 delegate_id_ = delegate_->AddObserver(this);
73
75 media_log_->AddEvent( 74 media_log_->AddEvent(
76 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 75 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
77 } 76 }
78 77
79 WebMediaPlayerMS::~WebMediaPlayerMS() { 78 WebMediaPlayerMS::~WebMediaPlayerMS() {
80 DVLOG(1) << __FUNCTION__; 79 DVLOG(1) << __FUNCTION__;
81 DCHECK(thread_checker_.CalledOnValidThread()); 80 DCHECK(thread_checker_.CalledOnValidThread());
82 81
83 if (compositor_ && !compositor_task_runner_->BelongsToCurrentThread()) 82 if (compositor_ && !compositor_task_runner_->BelongsToCurrentThread())
84 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release()); 83 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release());
85 84
86 get_client()->setWebLayer(nullptr); 85 get_client()->setWebLayer(nullptr);
87 86
88 if (video_frame_provider_) 87 if (video_frame_provider_)
89 video_frame_provider_->Stop(); 88 video_frame_provider_->Stop();
90 89
91 if (audio_renderer_) 90 if (audio_renderer_)
92 audio_renderer_->Stop(); 91 audio_renderer_->Stop();
93 92
94 media_log_->AddEvent( 93 media_log_->AddEvent(
95 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); 94 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
96 95
97 if (delegate_.get()) 96 if (delegate_) {
98 delegate_->PlayerGone(this); 97 delegate_->PlayerGone(delegate_id_);
98 delegate_->RemoveObserver(delegate_id_);
99 }
99 } 100 }
100 101
101 void WebMediaPlayerMS::load(LoadType load_type, 102 void WebMediaPlayerMS::load(LoadType load_type,
102 const blink::WebURL& url, 103 const blink::WebURL& url,
103 CORSMode /*cors_mode*/) { 104 CORSMode /*cors_mode*/) {
104 DVLOG(1) << __FUNCTION__; 105 DVLOG(1) << __FUNCTION__;
105 DCHECK(thread_checker_.CalledOnValidThread()); 106 DCHECK(thread_checker_.CalledOnValidThread());
106 107
107 // TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream) 108 // TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream)
108 // once Blink-side changes land. 109 // once Blink-side changes land.
(...skipping 21 matching lines...) Expand all
130 url, frame->GetRoutingID(), initial_audio_output_device_id_, 131 url, frame->GetRoutingID(), initial_audio_output_device_id_,
131 initial_security_origin_); 132 initial_security_origin_);
132 } 133 }
133 134
134 if (!video_frame_provider_ && !audio_renderer_) { 135 if (!video_frame_provider_ && !audio_renderer_) {
135 SetNetworkState(WebMediaPlayer::NetworkStateNetworkError); 136 SetNetworkState(WebMediaPlayer::NetworkStateNetworkError);
136 return; 137 return;
137 } 138 }
138 139
139 if (audio_renderer_) { 140 if (audio_renderer_) {
140 audio_renderer_->SetVolume(DEFAULT_AUDIO_VOLUME); 141 audio_renderer_->SetVolume(volume_);
141 audio_renderer_->Start(); 142 audio_renderer_->Start();
142 } 143 }
143 if (video_frame_provider_) 144 if (video_frame_provider_)
144 video_frame_provider_->Start(); 145 video_frame_provider_->Start();
145 if (audio_renderer_ && !video_frame_provider_) { 146 if (audio_renderer_ && !video_frame_provider_) {
146 // This is audio-only mode. 147 // This is audio-only mode.
147 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 148 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
148 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 149 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
149 } 150 }
150 } 151 }
151 152
152 void WebMediaPlayerMS::play() { 153 void WebMediaPlayerMS::play() {
153 DVLOG(1) << __FUNCTION__; 154 DVLOG(1) << __FUNCTION__;
154 DCHECK(thread_checker_.CalledOnValidThread()); 155 DCHECK(thread_checker_.CalledOnValidThread());
155 if (paused_) { 156 if (paused_) {
156 if (video_frame_provider_.get()) 157 if (video_frame_provider_.get())
157 video_frame_provider_->Play(); 158 video_frame_provider_->Play();
158 159
159 compositor_->StartRendering(); 160 compositor_->StartRendering();
160 161
161 if (audio_renderer_.get()) 162 if (audio_renderer_.get())
162 audio_renderer_->Play(); 163 audio_renderer_->Play();
163 164
164 if (delegate_.get()) 165 if (delegate_) {
165 delegate_->DidPlay(this); 166 delegate_->DidPlay(delegate_id_, hasVideo(), hasAudio(), false,
167 media::kInfiniteDuration());
168 }
166 } 169 }
167 170
168 paused_ = false; 171 paused_ = false;
169 172
170 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY)); 173 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY));
171 } 174 }
172 175
173 void WebMediaPlayerMS::pause() { 176 void WebMediaPlayerMS::pause() {
174 DVLOG(1) << __FUNCTION__; 177 DVLOG(1) << __FUNCTION__;
175 DCHECK(thread_checker_.CalledOnValidThread()); 178 DCHECK(thread_checker_.CalledOnValidThread());
176 179
177 if (video_frame_provider_.get()) 180 if (video_frame_provider_.get())
178 video_frame_provider_->Pause(); 181 video_frame_provider_->Pause();
179 182
180 compositor_->StopRendering(); 183 compositor_->StopRendering();
181 compositor_->ReplaceCurrentFrameWithACopy(); 184 compositor_->ReplaceCurrentFrameWithACopy();
182 185
183 if (!paused_) { 186 if (!paused_) {
184 if (audio_renderer_.get()) 187 if (audio_renderer_.get())
185 audio_renderer_->Pause(); 188 audio_renderer_->Pause();
186 189
187 if (delegate_.get()) 190 if (delegate_)
188 delegate_->DidPause(this); 191 delegate_->DidPause(delegate_id_, false);
189 } 192 }
190 193
191 paused_ = true; 194 paused_ = true;
192 195
193 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); 196 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE));
194 } 197 }
195 198
196 bool WebMediaPlayerMS::supportsSave() const { 199 bool WebMediaPlayerMS::supportsSave() const {
197 DCHECK(thread_checker_.CalledOnValidThread()); 200 DCHECK(thread_checker_.CalledOnValidThread());
198 return false; 201 return false;
199 } 202 }
200 203
201 void WebMediaPlayerMS::seek(double seconds) { 204 void WebMediaPlayerMS::seek(double seconds) {
202 DCHECK(thread_checker_.CalledOnValidThread()); 205 DCHECK(thread_checker_.CalledOnValidThread());
203 } 206 }
204 207
205 void WebMediaPlayerMS::setRate(double rate) { 208 void WebMediaPlayerMS::setRate(double rate) {
206 DCHECK(thread_checker_.CalledOnValidThread()); 209 DCHECK(thread_checker_.CalledOnValidThread());
207 } 210 }
208 211
209 void WebMediaPlayerMS::setVolume(double volume) { 212 void WebMediaPlayerMS::setVolume(double volume) {
210 DVLOG(1) << __FUNCTION__ << "(volume=" << volume << ")"; 213 DVLOG(1) << __FUNCTION__ << "(volume=" << volume << ")";
211 DCHECK(thread_checker_.CalledOnValidThread()); 214 DCHECK(thread_checker_.CalledOnValidThread());
215 volume_ = volume;
212 if (audio_renderer_.get()) 216 if (audio_renderer_.get())
213 audio_renderer_->SetVolume(volume); 217 audio_renderer_->SetVolume(volume_ * volume_multiplier_);
214 } 218 }
215 219
216 void WebMediaPlayerMS::setSinkId( 220 void WebMediaPlayerMS::setSinkId(
217 const blink::WebString& sink_id, 221 const blink::WebString& sink_id,
218 const blink::WebSecurityOrigin& security_origin, 222 const blink::WebSecurityOrigin& security_origin,
219 blink::WebSetSinkIdCallbacks* web_callback) { 223 blink::WebSetSinkIdCallbacks* web_callback) {
220 DVLOG(1) << __FUNCTION__; 224 DVLOG(1) << __FUNCTION__;
221 DCHECK(thread_checker_.CalledOnValidThread()); 225 DCHECK(thread_checker_.CalledOnValidThread());
222 const media::SwitchOutputDeviceCB callback = 226 const media::SwitchOutputDeviceCB callback =
223 media::ConvertToSwitchOutputDeviceCB(web_callback); 227 media::ConvertToSwitchOutputDeviceCB(web_callback);
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 NOTIMPLEMENTED(); 357 NOTIMPLEMENTED();
354 return 0; 358 return 0;
355 } 359 }
356 360
357 unsigned WebMediaPlayerMS::videoDecodedByteCount() const { 361 unsigned WebMediaPlayerMS::videoDecodedByteCount() const {
358 DCHECK(thread_checker_.CalledOnValidThread()); 362 DCHECK(thread_checker_.CalledOnValidThread());
359 NOTIMPLEMENTED(); 363 NOTIMPLEMENTED();
360 return 0; 364 return 0;
361 } 365 }
362 366
363 void WebMediaPlayerMS::WasHidden() { 367 void WebMediaPlayerMS::OnHidden() {
364 #if defined(OS_ANDROID) 368 #if defined(OS_ANDROID)
365 DCHECK(thread_checker_.CalledOnValidThread()); 369 DCHECK(thread_checker_.CalledOnValidThread());
366 DCHECK(!render_frame_suspended_); 370 DCHECK(!render_frame_suspended_);
367 371
368 // Method called when the RenderFrame is sent to background and suspended 372 // Method called when the RenderFrame is sent to background and suspended
369 // (android). Substitute the displayed VideoFrame with a copy to avoid 373 // (android). Substitute the displayed VideoFrame with a copy to avoid
370 // holding on to it unnecessarily. 374 // holding on to it unnecessarily.
371 render_frame_suspended_=true; 375 render_frame_suspended_ = true;
372 if (!paused_) 376 if (!paused_)
373 compositor_->ReplaceCurrentFrameWithACopy(); 377 compositor_->ReplaceCurrentFrameWithACopy();
374 #endif // defined(OS_ANDROID) 378 #endif // defined(OS_ANDROID)
375 } 379 }
376 380
377 void WebMediaPlayerMS::WasShown() { 381 void WebMediaPlayerMS::OnShown() {
378 #if defined(OS_ANDROID) 382 #if defined(OS_ANDROID)
379 DCHECK(thread_checker_.CalledOnValidThread()); 383 DCHECK(thread_checker_.CalledOnValidThread());
380 384
381 render_frame_suspended_ = false; 385 render_frame_suspended_ = false;
382 #endif // defined(OS_ANDROID) 386 #endif // defined(OS_ANDROID)
383 } 387 }
384 388
389 void WebMediaPlayerMS::OnPlay() {
390 play();
391 client_->playbackStateChanged();
392 }
393
394 void WebMediaPlayerMS::OnPause() {
395 pause();
396 client_->playbackStateChanged();
397 }
398
399 void WebMediaPlayerMS::OnVolumeMultiplierUpdate(double multiplier) {
400 volume_multiplier_ = multiplier;
401 setVolume(volume_);
402 }
403
385 bool WebMediaPlayerMS::copyVideoTextureToPlatformTexture( 404 bool WebMediaPlayerMS::copyVideoTextureToPlatformTexture(
386 blink::WebGraphicsContext3D* web_graphics_context, 405 blink::WebGraphicsContext3D* web_graphics_context,
387 unsigned int texture, 406 unsigned int texture,
388 unsigned int internal_format, 407 unsigned int internal_format,
389 unsigned int type, 408 unsigned int type,
390 bool premultiply_alpha, 409 bool premultiply_alpha,
391 bool flip_y) { 410 bool flip_y) {
392 TRACE_EVENT0("media", "WebMediaPlayerMS:copyVideoTextureToPlatformTexture"); 411 TRACE_EVENT0("media", "WebMediaPlayerMS:copyVideoTextureToPlatformTexture");
393 DCHECK(thread_checker_.CalledOnValidThread()); 412 DCHECK(thread_checker_.CalledOnValidThread());
394 413
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 media::SkCanvasVideoRenderer* WebMediaPlayerMS::GetSkCanvasVideoRenderer() { 501 media::SkCanvasVideoRenderer* WebMediaPlayerMS::GetSkCanvasVideoRenderer() {
483 return &video_renderer_; 502 return &video_renderer_;
484 } 503 }
485 504
486 void WebMediaPlayerMS::ResetCanvasCache() { 505 void WebMediaPlayerMS::ResetCanvasCache() {
487 DCHECK(thread_checker_.CalledOnValidThread()); 506 DCHECK(thread_checker_.CalledOnValidThread());
488 video_renderer_.ResetCache(); 507 video_renderer_.ResetCache();
489 } 508 }
490 509
491 } // namespace content 510 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/webmediaplayer_ms.h ('k') | content/test/data/android/media/audio-1second.mp3 » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698