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 #include <string> | 10 #include <string> |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 #define BIND_TO_RENDER_LOOP1(function, arg1) \ | 123 #define BIND_TO_RENDER_LOOP1(function, arg1) \ |
124 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ | 124 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ |
125 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) | 125 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) |
126 | 126 |
127 WebMediaPlayerImpl::WebMediaPlayerImpl( | 127 WebMediaPlayerImpl::WebMediaPlayerImpl( |
128 blink::WebLocalFrame* frame, | 128 blink::WebLocalFrame* frame, |
129 blink::WebMediaPlayerClient* client, | 129 blink::WebMediaPlayerClient* client, |
130 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, | 130 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, |
131 base::WeakPtr<WebMediaPlayerDelegate> delegate, | 131 base::WeakPtr<WebMediaPlayerDelegate> delegate, |
132 scoped_ptr<RendererFactory> renderer_factory, | 132 scoped_ptr<RendererFactory> renderer_factory, |
133 CdmFactory* cdm_factory, | |
134 linked_ptr<UrlIndex> url_index, | 133 linked_ptr<UrlIndex> url_index, |
135 const WebMediaPlayerParams& params) | 134 const WebMediaPlayerParams& params) |
136 : frame_(frame), | 135 : frame_(frame), |
137 network_state_(WebMediaPlayer::NetworkStateEmpty), | 136 network_state_(WebMediaPlayer::NetworkStateEmpty), |
138 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 137 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
139 preload_(BufferedDataSource::AUTO), | 138 preload_(BufferedDataSource::AUTO), |
140 buffering_strategy_( | 139 buffering_strategy_( |
141 BufferedDataSourceInterface::BUFFERING_STRATEGY_NORMAL), | 140 BufferedDataSourceInterface::BUFFERING_STRATEGY_NORMAL), |
142 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 141 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
143 media_task_runner_(params.media_task_runner()), | 142 media_task_runner_(params.media_task_runner()), |
(...skipping 30 matching lines...) Expand all Loading... |
174 url_index_(url_index), | 173 url_index_(url_index), |
175 // Threaded compositing isn't enabled universally yet. | 174 // Threaded compositing isn't enabled universally yet. |
176 compositor_task_runner_( | 175 compositor_task_runner_( |
177 params.compositor_task_runner() | 176 params.compositor_task_runner() |
178 ? params.compositor_task_runner() | 177 ? params.compositor_task_runner() |
179 : base::MessageLoop::current()->task_runner()), | 178 : base::MessageLoop::current()->task_runner()), |
180 compositor_(new VideoFrameCompositor( | 179 compositor_(new VideoFrameCompositor( |
181 compositor_task_runner_, | 180 compositor_task_runner_, |
182 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), | 181 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), |
183 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), | 182 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), |
184 encrypted_media_support_(cdm_factory, | |
185 encrypted_client, | |
186 params.media_permission(), | |
187 base::Bind(&WebMediaPlayerImpl::SetCdm, | |
188 AsWeakPtr(), | |
189 base::Bind(&IgnoreCdmAttached))), | |
190 is_cdm_attached_(false), | 183 is_cdm_attached_(false), |
191 #if defined(OS_ANDROID) // WMPI_CAST | 184 #if defined(OS_ANDROID) // WMPI_CAST |
192 cast_impl_(this, client_, params.context_3d_cb()), | 185 cast_impl_(this, client_, params.context_3d_cb()), |
193 #endif | 186 #endif |
194 volume_(1.0), | 187 volume_(1.0), |
195 volume_multiplier_(1.0), | 188 volume_multiplier_(1.0), |
196 renderer_factory_(std::move(renderer_factory)), | 189 renderer_factory_(std::move(renderer_factory)), |
197 surface_manager_(params.surface_manager()) { | 190 surface_manager_(params.surface_manager()) { |
198 DCHECK(!adjust_allocated_memory_cb_.is_null()); | 191 DCHECK(!adjust_allocated_memory_cb_.is_null()); |
199 DCHECK(renderer_factory_); | 192 DCHECK(renderer_factory_); |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 // GLES2Interface. | 784 // GLES2Interface. |
792 gpu::gles2::GLES2Interface* gl = | 785 gpu::gles2::GLES2Interface* gl = |
793 static_cast<gpu_blink::WebGraphicsContext3DImpl*>(web_graphics_context) | 786 static_cast<gpu_blink::WebGraphicsContext3DImpl*>(web_graphics_context) |
794 ->GetGLInterface(); | 787 ->GetGLInterface(); |
795 SkCanvasVideoRenderer::CopyVideoFrameSingleTextureToGLTexture( | 788 SkCanvasVideoRenderer::CopyVideoFrameSingleTextureToGLTexture( |
796 gl, video_frame.get(), texture, internal_format, type, premultiply_alpha, | 789 gl, video_frame.get(), texture, internal_format, type, premultiply_alpha, |
797 flip_y); | 790 flip_y); |
798 return true; | 791 return true; |
799 } | 792 } |
800 | 793 |
801 WebMediaPlayer::MediaKeyException | |
802 WebMediaPlayerImpl::generateKeyRequest(const WebString& key_system, | |
803 const unsigned char* init_data, | |
804 unsigned init_data_length) { | |
805 DCHECK(main_task_runner_->BelongsToCurrentThread()); | |
806 | |
807 return encrypted_media_support_.GenerateKeyRequest( | |
808 frame_, key_system, init_data, init_data_length); | |
809 } | |
810 | |
811 WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::addKey( | |
812 const WebString& key_system, | |
813 const unsigned char* key, | |
814 unsigned key_length, | |
815 const unsigned char* init_data, | |
816 unsigned init_data_length, | |
817 const WebString& session_id) { | |
818 DCHECK(main_task_runner_->BelongsToCurrentThread()); | |
819 | |
820 return encrypted_media_support_.AddKey( | |
821 key_system, key, key_length, init_data, init_data_length, session_id); | |
822 } | |
823 | |
824 WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::cancelKeyRequest( | |
825 const WebString& key_system, | |
826 const WebString& session_id) { | |
827 DCHECK(main_task_runner_->BelongsToCurrentThread()); | |
828 | |
829 return encrypted_media_support_.CancelKeyRequest(key_system, session_id); | |
830 } | |
831 | |
832 void WebMediaPlayerImpl::setContentDecryptionModule( | 794 void WebMediaPlayerImpl::setContentDecryptionModule( |
833 blink::WebContentDecryptionModule* cdm, | 795 blink::WebContentDecryptionModule* cdm, |
834 blink::WebContentDecryptionModuleResult result) { | 796 blink::WebContentDecryptionModuleResult result) { |
835 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 797 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
836 | 798 |
837 // Once the CDM is set it can't be cleared as there may be frames being | 799 // Once the CDM is set it can't be cleared as there may be frames being |
838 // decrypted on other threads. So fail this request. | 800 // decrypted on other threads. So fail this request. |
839 // http://crbug.com/462365#c7. | 801 // http://crbug.com/462365#c7. |
840 if (!cdm) { | 802 if (!cdm) { |
841 result.completeWithError( | 803 result.completeWithError( |
(...skipping 18 matching lines...) Expand all Loading... |
860 | 822 |
861 SetCdm(BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnCdmAttached), | 823 SetCdm(BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnCdmAttached), |
862 ToWebContentDecryptionModuleImpl(cdm)->GetCdmContext()); | 824 ToWebContentDecryptionModuleImpl(cdm)->GetCdmContext()); |
863 } | 825 } |
864 | 826 |
865 void WebMediaPlayerImpl::OnEncryptedMediaInitData( | 827 void WebMediaPlayerImpl::OnEncryptedMediaInitData( |
866 EmeInitDataType init_data_type, | 828 EmeInitDataType init_data_type, |
867 const std::vector<uint8_t>& init_data) { | 829 const std::vector<uint8_t>& init_data) { |
868 DCHECK(init_data_type != EmeInitDataType::UNKNOWN); | 830 DCHECK(init_data_type != EmeInitDataType::UNKNOWN); |
869 | 831 |
870 // Do not fire "encrypted" event if encrypted media is not enabled. | 832 // Do not fire the "encrypted" event if Encrypted Media is not enabled. |
871 // TODO(xhwang): Handle this in |client_|. | 833 // EME may not be enabled on Android Jelly Bean. |
872 if (!blink::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled() && | 834 if (!blink::WebRuntimeFeatures::isEncryptedMediaEnabled()) { |
873 !blink::WebRuntimeFeatures::isEncryptedMediaEnabled()) { | |
874 return; | 835 return; |
875 } | 836 } |
876 | 837 |
877 // TODO(xhwang): Update this UMA name. | 838 // TODO(xhwang): Update this UMA name. |
878 UMA_HISTOGRAM_COUNTS("Media.EME.NeedKey", 1); | 839 UMA_HISTOGRAM_COUNTS("Media.EME.NeedKey", 1); |
879 | 840 |
880 encrypted_media_support_.SetInitDataType(init_data_type); | |
881 | |
882 encrypted_client_->encrypted( | 841 encrypted_client_->encrypted( |
883 ConvertToWebInitDataType(init_data_type), init_data.data(), | 842 ConvertToWebInitDataType(init_data_type), init_data.data(), |
884 base::saturated_cast<unsigned int>(init_data.size())); | 843 base::saturated_cast<unsigned int>(init_data.size())); |
885 } | 844 } |
886 | 845 |
887 void WebMediaPlayerImpl::OnWaitingForDecryptionKey() { | 846 void WebMediaPlayerImpl::OnWaitingForDecryptionKey() { |
888 encrypted_client_->didBlockPlaybackWaitingForKey(); | 847 encrypted_client_->didBlockPlaybackWaitingForKey(); |
889 | 848 |
890 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called | 849 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called |
891 // when a key has been successfully added (e.g. OnSessionKeysChange() with | 850 // when a key has been successfully added (e.g. OnSessionKeysChange() with |
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1615 << ", Video: " << stats.video_memory_usage << ", DataSource: " | 1574 << ", Video: " << stats.video_memory_usage << ", DataSource: " |
1616 << (data_source_ ? data_source_->GetMemoryUsage() : 0) | 1575 << (data_source_ ? data_source_->GetMemoryUsage() : 0) |
1617 << ", Demuxer: " << demuxer_memory_usage; | 1576 << ", Demuxer: " << demuxer_memory_usage; |
1618 | 1577 |
1619 const int64_t delta = current_memory_usage - last_reported_memory_usage_; | 1578 const int64_t delta = current_memory_usage - last_reported_memory_usage_; |
1620 last_reported_memory_usage_ = current_memory_usage; | 1579 last_reported_memory_usage_ = current_memory_usage; |
1621 adjust_allocated_memory_cb_.Run(delta); | 1580 adjust_allocated_memory_cb_.Run(delta); |
1622 } | 1581 } |
1623 | 1582 |
1624 } // namespace media | 1583 } // namespace media |
OLD | NEW |