OLD | NEW |
---|---|
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "config.h" | 5 #include "config.h" |
6 #include "web/WebMediaPlayerClientImpl.h" | 6 #include "web/WebMediaPlayerClientImpl.h" |
7 | 7 |
8 #include "core/frame/LocalFrame.h" | 8 #include "core/frame/LocalFrame.h" |
9 #include "core/html/HTMLMediaElement.h" | 9 #include "core/html/HTMLMediaElement.h" |
10 #include "core/html/TimeRanges.h" | 10 #include "core/html/TimeRanges.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
63 | 63 |
64 WebMediaPlayer* WebMediaPlayerClientImpl::webMediaPlayer() const | 64 WebMediaPlayer* WebMediaPlayerClientImpl::webMediaPlayer() const |
65 { | 65 { |
66 return m_webMediaPlayer.get(); | 66 return m_webMediaPlayer.get(); |
67 } | 67 } |
68 | 68 |
69 // WebMediaPlayerClient -------------------------------------------------------- | 69 // WebMediaPlayerClient -------------------------------------------------------- |
70 | 70 |
71 WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl() | 71 WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl() |
72 { | 72 { |
73 #if ENABLE(OILPAN) | |
74 #if ENABLE(WEB_AUDIO) | |
75 if (audioSourceProvider()) | |
76 audioSourceProvider()->setClient(0); | |
haraken
2014/06/03 05:31:08
I'm a bit confused: Why do we need to explicitly c
sof
2014/06/03 08:04:11
Because we will call clearMediaPlayerAndAudioSourc
| |
77 #endif | |
78 // See detach() comment why we are clearing this reference. | |
79 m_client.clear(); | |
80 | |
73 // Explicitly destroy the WebMediaPlayer to allow verification of tear down. | 81 // Explicitly destroy the WebMediaPlayer to allow verification of tear down. |
74 m_webMediaPlayer.clear(); | 82 m_webMediaPlayer.clear(); |
83 #else | |
84 // Check that detach has been called. It should always have been done | |
85 // with Oilpan not enabled. | |
86 ASSERT(!m_webMediaPlayer); | |
87 #endif | |
88 } | |
75 | 89 |
90 void WebMediaPlayerClientImpl::detach() | |
91 { | |
92 // FIXME: This ad-hoc notification call to the supplement is out | |
93 // here to avoid a core/html/ -> modules/encryptedmedia/ | |
94 // dependency. Consider adding a detach notification from the | |
95 // media element supplementable to its supplements instead to | |
96 // avoid involving this client object as a third party. | |
76 HTMLMediaElementEncryptedMedia::playerDestroyed(mediaElement()); | 97 HTMLMediaElementEncryptedMedia::playerDestroyed(mediaElement()); |
98 | |
99 // For Oilpan, the client object is on the heap and cannot be safely | |
100 // accessed by WebMediaPlayerClientImpl when it later is GCed. | |
101 // Clear out the client reference early. | |
102 // | |
103 // FIXME: the browser-side WebMediaPlayer implementation performs a | |
104 // twisty callback to clear the WebLayer (i.e., calls setWebLayer(0)) | |
105 // when being destructed. This resetting is now handled by the | |
106 // media element directly when detaching. Follow up and support | |
107 // clearing of the WebMediaPlayer's client reference, so as to | |
108 // avoid that callback. | |
109 m_client.clear(); | |
110 | |
111 // Explicitly destroy the WebMediaPlayer to allow verification of tear down. | |
112 m_webMediaPlayer.clear(); | |
113 } | |
114 | |
115 void WebMediaPlayerClientImpl::trace(Visitor* visitor) | |
116 { | |
117 visitor->trace(m_client); | |
118 MediaPlayer::trace(visitor); | |
77 } | 119 } |
78 | 120 |
79 void WebMediaPlayerClientImpl::networkStateChanged() | 121 void WebMediaPlayerClientImpl::networkStateChanged() |
80 { | 122 { |
81 m_client->mediaPlayerNetworkStateChanged(); | 123 m_client->mediaPlayerNetworkStateChanged(); |
82 } | 124 } |
83 | 125 |
84 void WebMediaPlayerClientImpl::readyStateChanged() | 126 void WebMediaPlayerClientImpl::readyStateChanged() |
85 { | 127 { |
86 m_client->mediaPlayerReadyStateChanged(); | 128 m_client->mediaPlayerReadyStateChanged(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
136 HTMLMediaElementEncryptedMedia::keyMessage(mediaElement(), keySystem, sessio nId, message, messageLength, defaultURL); | 178 HTMLMediaElementEncryptedMedia::keyMessage(mediaElement(), keySystem, sessio nId, message, messageLength, defaultURL); |
137 } | 179 } |
138 | 180 |
139 void WebMediaPlayerClientImpl::keyNeeded(const WebString& contentType, const uns igned char* initData, unsigned initDataLength) | 181 void WebMediaPlayerClientImpl::keyNeeded(const WebString& contentType, const uns igned char* initData, unsigned initDataLength) |
140 { | 182 { |
141 HTMLMediaElementEncryptedMedia::keyNeeded(mediaElement(), contentType, initD ata, initDataLength); | 183 HTMLMediaElementEncryptedMedia::keyNeeded(mediaElement(), contentType, initD ata, initDataLength); |
142 } | 184 } |
143 | 185 |
144 void WebMediaPlayerClientImpl::setWebLayer(blink::WebLayer* layer) | 186 void WebMediaPlayerClientImpl::setWebLayer(blink::WebLayer* layer) |
145 { | 187 { |
188 if (!m_client) { | |
189 // Only expect the WebLayer to be cleared when finalizing. | |
190 // FIXME: switch to assume a non-zero layer argument; see | |
191 // detach() comment. | |
192 ASSERT(!layer); | |
193 return; | |
194 } | |
146 m_client->mediaPlayerSetWebLayer(layer); | 195 m_client->mediaPlayerSetWebLayer(layer); |
147 } | 196 } |
148 | 197 |
149 void WebMediaPlayerClientImpl::addTextTrack(WebInbandTextTrack* textTrack) | 198 void WebMediaPlayerClientImpl::addTextTrack(WebInbandTextTrack* textTrack) |
150 { | 199 { |
151 m_client->mediaPlayerDidAddTextTrack(textTrack); | 200 m_client->mediaPlayerDidAddTextTrack(textTrack); |
152 } | 201 } |
153 | 202 |
154 void WebMediaPlayerClientImpl::removeTextTrack(WebInbandTextTrack* textTrack) | 203 void WebMediaPlayerClientImpl::removeTextTrack(WebInbandTextTrack* textTrack) |
155 { | 204 { |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
360 return timeValue; | 409 return timeValue; |
361 } | 410 } |
362 | 411 |
363 #if ENABLE(WEB_AUDIO) | 412 #if ENABLE(WEB_AUDIO) |
364 AudioSourceProvider* WebMediaPlayerClientImpl::audioSourceProvider() | 413 AudioSourceProvider* WebMediaPlayerClientImpl::audioSourceProvider() |
365 { | 414 { |
366 return &m_audioSourceProvider; | 415 return &m_audioSourceProvider; |
367 } | 416 } |
368 #endif | 417 #endif |
369 | 418 |
370 PassOwnPtr<MediaPlayer> WebMediaPlayerClientImpl::create(MediaPlayerClient* clie nt) | 419 PassOwnPtrWillBeRawPtr<MediaPlayer> WebMediaPlayerClientImpl::create(MediaPlayer Client* client) |
371 { | 420 { |
372 return adoptPtr(new WebMediaPlayerClientImpl(client)); | 421 return adoptPtrWillBeNoop(new WebMediaPlayerClientImpl(client)); |
373 } | 422 } |
374 | 423 |
375 #if OS(ANDROID) | 424 #if OS(ANDROID) |
376 void WebMediaPlayerClientImpl::paintOnAndroid(WebCore::GraphicsContext* context, const IntRect& rect, uint8_t alpha) | 425 void WebMediaPlayerClientImpl::paintOnAndroid(WebCore::GraphicsContext* context, const IntRect& rect, uint8_t alpha) |
377 { | 426 { |
378 OwnPtr<blink::WebGraphicsContext3DProvider> provider = adoptPtr(blink::Platf orm::current()->createSharedOffscreenGraphicsContext3DProvider()); | 427 OwnPtr<blink::WebGraphicsContext3DProvider> provider = adoptPtr(blink::Platf orm::current()->createSharedOffscreenGraphicsContext3DProvider()); |
379 if (!provider) | 428 if (!provider) |
380 return; | 429 return; |
381 WebGraphicsContext3D* context3D = provider->context3d(); | 430 WebGraphicsContext3D* context3D = provider->context3d(); |
382 if (!context || !context3D || !m_webMediaPlayer || context->paintingDisabled ()) | 431 if (!context || !context3D || !m_webMediaPlayer || context->paintingDisabled ()) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
415 , m_rate(1.0) | 464 , m_rate(1.0) |
416 #if OS(ANDROID) | 465 #if OS(ANDROID) |
417 , m_usePaintOnAndroid(false) | 466 , m_usePaintOnAndroid(false) |
418 #endif | 467 #endif |
419 { | 468 { |
420 ASSERT(m_client); | 469 ASSERT(m_client); |
421 } | 470 } |
422 | 471 |
423 WebCore::HTMLMediaElement& WebMediaPlayerClientImpl::mediaElement() const | 472 WebCore::HTMLMediaElement& WebMediaPlayerClientImpl::mediaElement() const |
424 { | 473 { |
425 return *static_cast<HTMLMediaElement*>(m_client); | 474 return *static_cast<HTMLMediaElement*>(m_client.get()); |
426 } | 475 } |
427 | 476 |
428 #if ENABLE(WEB_AUDIO) | 477 #if ENABLE(WEB_AUDIO) |
429 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::wrap(WebAudioSourceProvi der* provider) | 478 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::wrap(WebAudioSourceProvi der* provider) |
430 { | 479 { |
431 MutexLocker locker(provideInputLock); | 480 MutexLocker locker(provideInputLock); |
432 | 481 |
433 if (m_webAudioSourceProvider && provider != m_webAudioSourceProvider) | 482 if (m_webAudioSourceProvider && provider != m_webAudioSourceProvider) |
434 m_webAudioSourceProvider->setClient(0); | 483 m_webAudioSourceProvider->setClient(0); |
435 | 484 |
436 m_webAudioSourceProvider = provider; | 485 m_webAudioSourceProvider = provider; |
437 if (m_webAudioSourceProvider) | 486 if (m_webAudioSourceProvider) |
438 m_webAudioSourceProvider->setClient(m_client.get()); | 487 m_webAudioSourceProvider->setClient(m_client.get()); |
439 } | 488 } |
440 | 489 |
441 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::setClient(AudioSourcePro viderClient* client) | 490 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::setClient(AudioSourcePro viderClient* client) |
442 { | 491 { |
443 MutexLocker locker(provideInputLock); | 492 MutexLocker locker(provideInputLock); |
444 | 493 |
445 if (client) | 494 if (client) |
446 m_client = adoptPtr(new WebMediaPlayerClientImpl::AudioClientImpl(client )); | 495 m_client = adoptPtr(new WebMediaPlayerClientImpl::AudioClientImpl(client )); |
447 else | 496 else |
448 m_client.clear(); | 497 m_client.clear(); |
449 | 498 |
450 if (m_webAudioSourceProvider) | 499 if (m_webAudioSourceProvider) { |
451 m_webAudioSourceProvider->setClient(m_client.get()); | 500 m_webAudioSourceProvider->setClient(m_client.get()); |
501 if (!m_client) | |
502 m_webAudioSourceProvider = 0; | |
haraken
2014/06/03 05:31:08
The same question here. I'm curious why we need to
sof
2014/06/03 08:04:11
See answer to https://codereview.chromium.org/302
| |
503 } | |
452 } | 504 } |
453 | 505 |
454 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::provideInput(AudioBus* b us, size_t framesToProcess) | 506 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::provideInput(AudioBus* b us, size_t framesToProcess) |
455 { | 507 { |
456 ASSERT(bus); | 508 ASSERT(bus); |
457 if (!bus) | 509 if (!bus) |
458 return; | 510 return; |
459 | 511 |
460 MutexTryLocker tryLocker(provideInputLock); | 512 MutexTryLocker tryLocker(provideInputLock); |
461 if (!tryLocker.locked() || !m_webAudioSourceProvider || !m_client.get()) { | 513 if (!tryLocker.locked() || !m_webAudioSourceProvider || !m_client.get()) { |
(...skipping 12 matching lines...) Expand all Loading... | |
474 | 526 |
475 void WebMediaPlayerClientImpl::AudioClientImpl::setFormat(size_t numberOfChannel s, float sampleRate) | 527 void WebMediaPlayerClientImpl::AudioClientImpl::setFormat(size_t numberOfChannel s, float sampleRate) |
476 { | 528 { |
477 if (m_client) | 529 if (m_client) |
478 m_client->setFormat(numberOfChannels, sampleRate); | 530 m_client->setFormat(numberOfChannels, sampleRate); |
479 } | 531 } |
480 | 532 |
481 #endif | 533 #endif |
482 | 534 |
483 } // namespace blink | 535 } // namespace blink |
OLD | NEW |