OLD | NEW |
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 "media/blink/webmediaplayer_impl.h" | 5 #include "media/blink/webmediaplayer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 client_(client), | 130 client_(client), |
131 delegate_(delegate), | 131 delegate_(delegate), |
132 defer_load_cb_(params.defer_load_cb()), | 132 defer_load_cb_(params.defer_load_cb()), |
133 context_3d_cb_(params.context_3d_cb()), | 133 context_3d_cb_(params.context_3d_cb()), |
134 supports_save_(true), | 134 supports_save_(true), |
135 chunk_demuxer_(NULL), | 135 chunk_demuxer_(NULL), |
136 compositor_task_runner_(params.compositor_task_runner()), | 136 compositor_task_runner_(params.compositor_task_runner()), |
137 compositor_(new VideoFrameCompositor( | 137 compositor_(new VideoFrameCompositor( |
138 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), | 138 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), |
139 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), | 139 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), |
140 encrypted_media_support_( | 140 encrypted_media_support_(cdm_factory, |
141 cdm_factory, | 141 client, |
142 client, | 142 params.media_permission(), |
143 params.media_permission(), | 143 base::Bind(&WebMediaPlayerImpl::SetCdm, |
144 base::Bind(&WebMediaPlayerImpl::SetCdm, AsWeakPtr())), | 144 AsWeakPtr(), |
| 145 base::Bind(&IgnoreCdmAttached))), |
145 renderer_factory_(renderer_factory.Pass()) { | 146 renderer_factory_(renderer_factory.Pass()) { |
146 // Threaded compositing isn't enabled universally yet. | 147 // Threaded compositing isn't enabled universally yet. |
147 if (!compositor_task_runner_.get()) | 148 if (!compositor_task_runner_.get()) |
148 compositor_task_runner_ = base::MessageLoopProxy::current(); | 149 compositor_task_runner_ = base::MessageLoopProxy::current(); |
149 | 150 |
150 media_log_->AddEvent( | 151 media_log_->AddEvent( |
151 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 152 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
152 | 153 |
153 if (params.initial_cdm()) { | 154 if (params.initial_cdm()) { |
154 SetCdm( | 155 SetCdm(base::Bind(&IgnoreCdmAttached), |
155 ToWebContentDecryptionModuleImpl(params.initial_cdm())->GetCdmContext(), | 156 ToWebContentDecryptionModuleImpl(params.initial_cdm()) |
156 base::Bind(&IgnoreCdmAttached)); | 157 ->GetCdmContext()); |
157 } | 158 } |
158 | 159 |
159 // TODO(xhwang): When we use an external Renderer, many methods won't work, | 160 // TODO(xhwang): When we use an external Renderer, many methods won't work, |
160 // e.g. GetCurrentFrameFromCompositor(). See http://crbug.com/434861 | 161 // e.g. GetCurrentFrameFromCompositor(). See http://crbug.com/434861 |
161 | 162 |
162 // Use the null sink if no sink was provided. | 163 // Use the null sink if no sink was provided. |
163 audio_source_provider_ = new WebAudioSourceProviderImpl( | 164 audio_source_provider_ = new WebAudioSourceProviderImpl( |
164 params.audio_renderer_sink().get() | 165 params.audio_renderer_sink().get() |
165 ? params.audio_renderer_sink() | 166 ? params.audio_renderer_sink() |
166 : new NullAudioSink(media_task_runner_)); | 167 : new NullAudioSink(media_task_runner_)); |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
653 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 654 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
654 | 655 |
655 // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324 | 656 // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324 |
656 if (!cdm) { | 657 if (!cdm) { |
657 result.completeWithError( | 658 result.completeWithError( |
658 blink::WebContentDecryptionModuleExceptionNotSupportedError, 0, | 659 blink::WebContentDecryptionModuleExceptionNotSupportedError, 0, |
659 "Null MediaKeys object is not supported."); | 660 "Null MediaKeys object is not supported."); |
660 return; | 661 return; |
661 } | 662 } |
662 | 663 |
663 SetCdm(ToWebContentDecryptionModuleImpl(cdm)->GetCdmContext(), | 664 SetCdm(BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnCdmAttached, result), |
664 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnCdmAttached, result)); | 665 ToWebContentDecryptionModuleImpl(cdm)->GetCdmContext()); |
665 } | 666 } |
666 | 667 |
667 void WebMediaPlayerImpl::OnEncryptedMediaInitData( | 668 void WebMediaPlayerImpl::OnEncryptedMediaInitData( |
668 EmeInitDataType init_data_type, | 669 EmeInitDataType init_data_type, |
669 const std::vector<uint8>& init_data) { | 670 const std::vector<uint8>& init_data) { |
670 DCHECK(init_data_type != EmeInitDataType::UNKNOWN); | 671 DCHECK(init_data_type != EmeInitDataType::UNKNOWN); |
671 | 672 |
672 // Do not fire "encrypted" event if encrypted media is not enabled. | 673 // Do not fire "encrypted" event if encrypted media is not enabled. |
673 // TODO(xhwang): Handle this in |client_|. | 674 // TODO(xhwang): Handle this in |client_|. |
674 if (!blink::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled() && | 675 if (!blink::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled() && |
(...skipping 13 matching lines...) Expand all Loading... |
688 | 689 |
689 void WebMediaPlayerImpl::OnWaitingForDecryptionKey() { | 690 void WebMediaPlayerImpl::OnWaitingForDecryptionKey() { |
690 client_->didBlockPlaybackWaitingForKey(); | 691 client_->didBlockPlaybackWaitingForKey(); |
691 | 692 |
692 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called | 693 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called |
693 // when a key has been successfully added (e.g. OnSessionKeysChange() with | 694 // when a key has been successfully added (e.g. OnSessionKeysChange() with |
694 // |has_additional_usable_key| = true). http://crbug.com/461903 | 695 // |has_additional_usable_key| = true). http://crbug.com/461903 |
695 client_->didResumePlaybackBlockedForKey(); | 696 client_->didResumePlaybackBlockedForKey(); |
696 } | 697 } |
697 | 698 |
698 void WebMediaPlayerImpl::SetCdm(CdmContext* cdm_context, | 699 void WebMediaPlayerImpl::SetCdm(const CdmAttachedCB& cdm_attached_cb, |
699 const CdmAttachedCB& cdm_attached_cb) { | 700 CdmContext* cdm_context) { |
700 pipeline_.SetCdm(cdm_context, cdm_attached_cb); | 701 pipeline_.SetCdm(cdm_context, cdm_attached_cb); |
701 } | 702 } |
702 | 703 |
703 void WebMediaPlayerImpl::OnCdmAttached( | 704 void WebMediaPlayerImpl::OnCdmAttached( |
704 blink::WebContentDecryptionModuleResult result, | 705 blink::WebContentDecryptionModuleResult result, |
705 bool success) { | 706 bool success) { |
706 if (success) { | 707 if (success) { |
707 result.complete(); | 708 result.complete(); |
708 return; | 709 return; |
709 } | 710 } |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1021 | 1022 |
1022 // pause() may be called after playback has ended and the HTMLMediaElement | 1023 // pause() may be called after playback has ended and the HTMLMediaElement |
1023 // requires that currentTime() == duration() after ending. We want to ensure | 1024 // requires that currentTime() == duration() after ending. We want to ensure |
1024 // |paused_time_| matches currentTime() in this case or a future seek() may | 1025 // |paused_time_| matches currentTime() in this case or a future seek() may |
1025 // incorrectly discard what it thinks is a seek to the existing time. | 1026 // incorrectly discard what it thinks is a seek to the existing time. |
1026 paused_time_ = | 1027 paused_time_ = |
1027 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); | 1028 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); |
1028 } | 1029 } |
1029 | 1030 |
1030 } // namespace media | 1031 } // namespace media |
OLD | NEW |