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 <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ | 96 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ |
97 BindToCurrentLoop(base::Bind(function, AsWeakPtr()))) | 97 BindToCurrentLoop(base::Bind(function, AsWeakPtr()))) |
98 | 98 |
99 #define BIND_TO_RENDER_LOOP1(function, arg1) \ | 99 #define BIND_TO_RENDER_LOOP1(function, arg1) \ |
100 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ | 100 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ |
101 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) | 101 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) |
102 | 102 |
103 WebMediaPlayerImpl::WebMediaPlayerImpl( | 103 WebMediaPlayerImpl::WebMediaPlayerImpl( |
104 blink::WebLocalFrame* frame, | 104 blink::WebLocalFrame* frame, |
105 blink::WebMediaPlayerClient* client, | 105 blink::WebMediaPlayerClient* client, |
| 106 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, |
106 base::WeakPtr<WebMediaPlayerDelegate> delegate, | 107 base::WeakPtr<WebMediaPlayerDelegate> delegate, |
107 scoped_ptr<RendererFactory> renderer_factory, | 108 scoped_ptr<RendererFactory> renderer_factory, |
108 CdmFactory* cdm_factory, | 109 CdmFactory* cdm_factory, |
109 const WebMediaPlayerParams& params) | 110 const WebMediaPlayerParams& params) |
110 : frame_(frame), | 111 : frame_(frame), |
111 network_state_(WebMediaPlayer::NetworkStateEmpty), | 112 network_state_(WebMediaPlayer::NetworkStateEmpty), |
112 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 113 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
113 preload_(BufferedDataSource::AUTO), | 114 preload_(BufferedDataSource::AUTO), |
114 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 115 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
115 media_task_runner_(params.media_task_runner()), | 116 media_task_runner_(params.media_task_runner()), |
116 media_log_(params.media_log()), | 117 media_log_(params.media_log()), |
117 pipeline_(media_task_runner_, media_log_.get()), | 118 pipeline_(media_task_runner_, media_log_.get()), |
118 load_type_(LoadTypeURL), | 119 load_type_(LoadTypeURL), |
119 opaque_(false), | 120 opaque_(false), |
120 playback_rate_(0.0), | 121 playback_rate_(0.0), |
121 paused_(true), | 122 paused_(true), |
122 seeking_(false), | 123 seeking_(false), |
123 ended_(false), | 124 ended_(false), |
124 pending_seek_(false), | 125 pending_seek_(false), |
125 should_notify_time_changed_(false), | 126 should_notify_time_changed_(false), |
126 client_(client), | 127 client_(client), |
| 128 encrypted_client_(encrypted_client), |
127 delegate_(delegate), | 129 delegate_(delegate), |
128 defer_load_cb_(params.defer_load_cb()), | 130 defer_load_cb_(params.defer_load_cb()), |
129 context_3d_cb_(params.context_3d_cb()), | 131 context_3d_cb_(params.context_3d_cb()), |
130 supports_save_(true), | 132 supports_save_(true), |
131 chunk_demuxer_(NULL), | 133 chunk_demuxer_(NULL), |
132 // Threaded compositing isn't enabled universally yet. | 134 // Threaded compositing isn't enabled universally yet. |
133 compositor_task_runner_( | 135 compositor_task_runner_( |
134 params.compositor_task_runner() | 136 params.compositor_task_runner() |
135 ? params.compositor_task_runner() | 137 ? params.compositor_task_runner() |
136 : base::MessageLoop::current()->task_runner()), | 138 : base::MessageLoop::current()->task_runner()), |
137 compositor_(new VideoFrameCompositor( | 139 compositor_(new VideoFrameCompositor( |
138 compositor_task_runner_, | 140 compositor_task_runner_, |
139 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), | 141 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), |
140 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), | 142 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), |
141 encrypted_media_support_(cdm_factory, | 143 encrypted_media_support_(cdm_factory, |
142 client, | 144 encrypted_client, |
143 params.media_permission(), | 145 params.media_permission(), |
144 base::Bind(&WebMediaPlayerImpl::SetCdm, | 146 base::Bind(&WebMediaPlayerImpl::SetCdm, |
145 AsWeakPtr(), | 147 AsWeakPtr(), |
146 base::Bind(&IgnoreCdmAttached))), | 148 base::Bind(&IgnoreCdmAttached))), |
147 renderer_factory_(renderer_factory.Pass()) { | 149 renderer_factory_(renderer_factory.Pass()) { |
148 media_log_->AddEvent( | 150 media_log_->AddEvent( |
149 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 151 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
150 | 152 |
151 if (params.initial_cdm()) { | 153 if (params.initial_cdm()) { |
152 SetCdm(base::Bind(&IgnoreCdmAttached), | 154 SetCdm(base::Bind(&IgnoreCdmAttached), |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 if (!blink::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled() && | 699 if (!blink::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled() && |
698 !blink::WebRuntimeFeatures::isEncryptedMediaEnabled()) { | 700 !blink::WebRuntimeFeatures::isEncryptedMediaEnabled()) { |
699 return; | 701 return; |
700 } | 702 } |
701 | 703 |
702 // TODO(xhwang): Update this UMA name. | 704 // TODO(xhwang): Update this UMA name. |
703 UMA_HISTOGRAM_COUNTS("Media.EME.NeedKey", 1); | 705 UMA_HISTOGRAM_COUNTS("Media.EME.NeedKey", 1); |
704 | 706 |
705 encrypted_media_support_.SetInitDataType(init_data_type); | 707 encrypted_media_support_.SetInitDataType(init_data_type); |
706 | 708 |
707 client_->encrypted(ConvertToWebInitDataType(init_data_type), | 709 encrypted_client_->encrypted( |
708 vector_as_array(&init_data), | 710 ConvertToWebInitDataType(init_data_type), vector_as_array(&init_data), |
709 base::saturated_cast<unsigned int>(init_data.size())); | 711 base::saturated_cast<unsigned int>(init_data.size())); |
710 } | 712 } |
711 | 713 |
712 void WebMediaPlayerImpl::OnWaitingForDecryptionKey() { | 714 void WebMediaPlayerImpl::OnWaitingForDecryptionKey() { |
713 client_->didBlockPlaybackWaitingForKey(); | 715 encrypted_client_->didBlockPlaybackWaitingForKey(); |
714 | 716 |
715 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called | 717 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called |
716 // when a key has been successfully added (e.g. OnSessionKeysChange() with | 718 // when a key has been successfully added (e.g. OnSessionKeysChange() with |
717 // |has_additional_usable_key| = true). http://crbug.com/461903 | 719 // |has_additional_usable_key| = true). http://crbug.com/461903 |
718 client_->didResumePlaybackBlockedForKey(); | 720 encrypted_client_->didResumePlaybackBlockedForKey(); |
719 } | 721 } |
720 | 722 |
721 void WebMediaPlayerImpl::SetCdm(const CdmAttachedCB& cdm_attached_cb, | 723 void WebMediaPlayerImpl::SetCdm(const CdmAttachedCB& cdm_attached_cb, |
722 CdmContext* cdm_context) { | 724 CdmContext* cdm_context) { |
723 // If CDM initialization succeeded, tell the pipeline about it. | 725 // If CDM initialization succeeded, tell the pipeline about it. |
724 if (cdm_context) | 726 if (cdm_context) |
725 pipeline_.SetCdm(cdm_context, cdm_attached_cb); | 727 pipeline_.SetCdm(cdm_context, cdm_attached_cb); |
726 } | 728 } |
727 | 729 |
728 void WebMediaPlayerImpl::OnCdmAttached( | 730 void WebMediaPlayerImpl::OnCdmAttached( |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1031 | 1033 |
1032 // pause() may be called after playback has ended and the HTMLMediaElement | 1034 // pause() may be called after playback has ended and the HTMLMediaElement |
1033 // requires that currentTime() == duration() after ending. We want to ensure | 1035 // requires that currentTime() == duration() after ending. We want to ensure |
1034 // |paused_time_| matches currentTime() in this case or a future seek() may | 1036 // |paused_time_| matches currentTime() in this case or a future seek() may |
1035 // incorrectly discard what it thinks is a seek to the existing time. | 1037 // incorrectly discard what it thinks is a seek to the existing time. |
1036 paused_time_ = | 1038 paused_time_ = |
1037 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); | 1039 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); |
1038 } | 1040 } |
1039 | 1041 |
1040 } // namespace media | 1042 } // namespace media |
OLD | NEW |