| 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 "webkit/renderer/media/android/webmediaplayer_android.h" | 5 #include "webkit/renderer/media/android/webmediaplayer_android.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient.
h" | 22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient.
h" |
| 23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaSource.h" | 23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaSource.h" |
| 24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h" | 24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h" |
| 25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| 26 #include "webkit/renderer/compositor_bindings/web_layer_impl.h" | 26 #include "webkit/renderer/compositor_bindings/web_layer_impl.h" |
| 27 #include "webkit/renderer/media/android/webmediaplayer_manager_android.h" | 27 #include "webkit/renderer/media/android/webmediaplayer_manager_android.h" |
| 28 #include "webkit/renderer/media/android/webmediaplayer_proxy_android.h" | 28 #include "webkit/renderer/media/android/webmediaplayer_proxy_android.h" |
| 29 #include "webkit/renderer/media/crypto/key_systems.h" | 29 #include "webkit/renderer/media/crypto/key_systems.h" |
| 30 #include "webkit/renderer/media/webmediaplayer_util.h" | 30 #include "webkit/renderer/media/webmediaplayer_util.h" |
| 31 | 31 |
| 32 #if defined(GOOGLE_TV) |
| 33 #include "webkit/renderer/media/media_stream_audio_renderer.h" |
| 34 #include "webkit/renderer/media/media_stream_client.h" |
| 35 #endif |
| 36 |
| 32 static const uint32 kGLTextureExternalOES = 0x8D65; | 37 static const uint32 kGLTextureExternalOES = 0x8D65; |
| 33 | 38 |
| 34 using WebKit::WebMediaPlayer; | 39 using WebKit::WebMediaPlayer; |
| 35 using WebKit::WebMediaSource; | 40 using WebKit::WebMediaSource; |
| 36 using WebKit::WebSize; | 41 using WebKit::WebSize; |
| 37 using WebKit::WebString; | 42 using WebKit::WebString; |
| 38 using WebKit::WebTimeRanges; | 43 using WebKit::WebTimeRanges; |
| 39 using WebKit::WebURL; | 44 using WebKit::WebURL; |
| 40 using media::MediaPlayerAndroid; | 45 using media::MediaPlayerAndroid; |
| 41 using media::VideoFrame; | 46 using media::VideoFrame; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 66 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 71 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
| 67 is_playing_(false), | 72 is_playing_(false), |
| 68 needs_establish_peer_(true), | 73 needs_establish_peer_(true), |
| 69 stream_texture_proxy_initialized_(false), | 74 stream_texture_proxy_initialized_(false), |
| 70 has_size_info_(false), | 75 has_size_info_(false), |
| 71 stream_texture_factory_(factory), | 76 stream_texture_factory_(factory), |
| 72 needs_external_surface_(false), | 77 needs_external_surface_(false), |
| 73 video_frame_provider_client_(NULL), | 78 video_frame_provider_client_(NULL), |
| 74 proxy_(proxy), | 79 proxy_(proxy), |
| 75 current_time_(0), | 80 current_time_(0), |
| 76 media_log_(media_log) { | 81 media_log_(media_log), |
| 82 media_stream_client_(NULL) { |
| 77 main_loop_->AddDestructionObserver(this); | 83 main_loop_->AddDestructionObserver(this); |
| 78 if (manager_) | 84 if (manager_) |
| 79 player_id_ = manager_->RegisterMediaPlayer(this); | 85 player_id_ = manager_->RegisterMediaPlayer(this); |
| 80 | 86 |
| 81 if (stream_texture_factory_) { | 87 if (stream_texture_factory_) { |
| 82 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy()); | 88 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy()); |
| 83 stream_id_ = stream_texture_factory_->CreateStreamTexture(&texture_id_); | 89 stream_id_ = stream_texture_factory_->CreateStreamTexture(&texture_id_); |
| 84 ReallocateVideoFrame(); | 90 ReallocateVideoFrame(); |
| 85 } | 91 } |
| 86 | 92 |
| 87 #if defined(GOOGLE_TV) | 93 #if defined(GOOGLE_TV) |
| 88 if (WebKit::WebRuntimeFeatures::isLegacyEncryptedMediaEnabled()) { | 94 if (WebKit::WebRuntimeFeatures::isLegacyEncryptedMediaEnabled()) { |
| 89 // |decryptor_| is owned, so Unretained() is safe here. | 95 // |decryptor_| is owned, so Unretained() is safe here. |
| 90 decryptor_.reset(new ProxyDecryptor( | 96 decryptor_.reset(new ProxyDecryptor( |
| 91 client, | 97 client, |
| 92 frame, | 98 frame, |
| 93 base::Bind(&WebMediaPlayerAndroid::OnKeyAdded, base::Unretained(this)), | 99 base::Bind(&WebMediaPlayerAndroid::OnKeyAdded, base::Unretained(this)), |
| 94 base::Bind(&WebMediaPlayerAndroid::OnKeyError, base::Unretained(this)), | 100 base::Bind(&WebMediaPlayerAndroid::OnKeyError, base::Unretained(this)), |
| 95 base::Bind(&WebMediaPlayerAndroid::OnKeyMessage, | 101 base::Bind(&WebMediaPlayerAndroid::OnKeyMessage, |
| 96 base::Unretained(this)), | 102 base::Unretained(this)), |
| 97 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)))); | 103 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)))); |
| 98 } | 104 } |
| 105 |
| 106 demuxer_ = NULL; |
| 99 #endif // defined(GOOGLE_TV) | 107 #endif // defined(GOOGLE_TV) |
| 100 } | 108 } |
| 101 | 109 |
| 102 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { | 110 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
| 103 SetVideoFrameProviderClient(NULL); | 111 SetVideoFrameProviderClient(NULL); |
| 104 client_->setWebLayer(NULL); | 112 client_->setWebLayer(NULL); |
| 105 | 113 |
| 106 if (proxy_) | 114 if (proxy_) |
| 107 proxy_->DestroyPlayer(player_id_); | 115 proxy_->DestroyPlayer(player_id_); |
| 108 | 116 |
| 109 if (stream_id_) | 117 if (stream_id_) |
| 110 stream_texture_factory_->DestroyStreamTexture(texture_id_); | 118 stream_texture_factory_->DestroyStreamTexture(texture_id_); |
| 111 | 119 |
| 112 if (manager_) | 120 if (manager_) |
| 113 manager_->UnregisterMediaPlayer(player_id_); | 121 manager_->UnregisterMediaPlayer(player_id_); |
| 114 | 122 |
| 115 if (main_loop_) | 123 if (main_loop_) |
| 116 main_loop_->RemoveDestructionObserver(this); | 124 main_loop_->RemoveDestructionObserver(this); |
| 125 #if defined(GOOGLE_TV) |
| 126 if (demuxer_ && !destroy_demuxer_cb_.is_null()) { |
| 127 media_source_delegate_.reset(); |
| 128 destroy_demuxer_cb_.Run(); |
| 129 } |
| 130 #endif |
| 117 } | 131 } |
| 118 | 132 |
| 119 void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { | 133 void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { |
| 120 load(url, NULL, cors_mode); | 134 load(url, NULL, cors_mode); |
| 121 } | 135 } |
| 122 | 136 |
| 123 void WebMediaPlayerAndroid::load(const WebURL& url, | 137 void WebMediaPlayerAndroid::load(const WebURL& url, |
| 124 WebMediaSource* media_source, | 138 WebMediaSource* media_source, |
| 125 CORSMode cors_mode) { | 139 CORSMode cors_mode) { |
| 126 if (cors_mode != CORSModeUnspecified) | 140 if (cors_mode != CORSModeUnspecified) |
| 127 NOTIMPLEMENTED() << "No CORS support"; | 141 NOTIMPLEMENTED() << "No CORS support"; |
| 128 | 142 |
| 129 if (media_source) { | 143 MediaPlayerAndroid::SourceType source_type = |
| 144 MediaPlayerAndroid::SOURCE_TYPE_URL; |
| 145 |
| 146 if (media_source) |
| 147 source_type = MediaPlayerAndroid::SOURCE_TYPE_MSE; |
| 148 #if defined(GOOGLE_TV) |
| 149 if (media_stream_client_) { |
| 150 DCHECK(!media_source); |
| 151 source_type = MediaPlayerAndroid::SOURCE_TYPE_STREAM; |
| 152 } |
| 153 #endif |
| 154 |
| 155 if (source_type != MediaPlayerAndroid::SOURCE_TYPE_URL) { |
| 130 media_source_delegate_.reset( | 156 media_source_delegate_.reset( |
| 131 new MediaSourceDelegate(proxy_, player_id_, media_log_)); | 157 new MediaSourceDelegate(proxy_, player_id_, media_log_)); |
| 132 // |media_source_delegate_| is owned, so Unretained() is safe here. | 158 // |media_source_delegate_| is owned, so Unretained() is safe here. |
| 133 media_source_delegate_->Initialize( | 159 if (source_type == MediaPlayerAndroid::SOURCE_TYPE_MSE) { |
| 134 media_source, | 160 media_source_delegate_->InitializeMediaSource( |
| 135 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), | 161 media_source, |
| 136 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, | 162 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), |
| 137 base::Unretained(this))); | 163 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
| 164 base::Unretained(this))); |
| 165 } |
| 166 #if defined(GOOGLE_TV) |
| 167 if (source_type == MediaPlayerAndroid::SOURCE_TYPE_STREAM) { |
| 168 media_source_delegate_->InitializeMediaStream( |
| 169 demuxer_, |
| 170 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
| 171 base::Unretained(this))); |
| 172 } |
| 173 #endif |
| 138 } | 174 } |
| 139 | 175 |
| 176 InitializeMediaPlayer(url, source_type); |
| 177 } |
| 178 |
| 179 void WebMediaPlayerAndroid::InitializeMediaPlayer( |
| 180 const WebURL& url, |
| 181 MediaPlayerAndroid::SourceType source_type) { |
| 140 url_ = url; | 182 url_ = url; |
| 141 GURL first_party_url = frame_->document().firstPartyForCookies(); | 183 GURL first_party_url = frame_->document().firstPartyForCookies(); |
| 142 if (proxy_) { | 184 if (proxy_) { |
| 143 proxy_->Initialize(player_id_, url_, media_source != NULL, first_party_url); | 185 proxy_->Initialize(player_id_, url, source_type, first_party_url); |
| 144 if (manager_->IsInFullscreen(frame_)) | 186 if (manager_->IsInFullscreen(frame_)) |
| 145 proxy_->EnterFullscreen(player_id_); | 187 proxy_->EnterFullscreen(player_id_); |
| 146 } | 188 } |
| 147 | 189 |
| 148 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | 190 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); |
| 149 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); | 191 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); |
| 150 } | 192 } |
| 151 | 193 |
| 152 void WebMediaPlayerAndroid::cancelLoad() { | 194 void WebMediaPlayerAndroid::cancelLoad() { |
| 153 NOTIMPLEMENTED(); | 195 NOTIMPLEMENTED(); |
| (...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 912 const GURL default_url_gurl(default_url); | 954 const GURL default_url_gurl(default_url); |
| 913 DLOG_IF(WARNING, !default_url.empty() && !default_url_gurl.is_valid()) | 955 DLOG_IF(WARNING, !default_url.empty() && !default_url_gurl.is_valid()) |
| 914 << "Invalid URL in default_url: " << default_url; | 956 << "Invalid URL in default_url: " << default_url; |
| 915 | 957 |
| 916 client_->keyMessage(WebString::fromUTF8(key_system), | 958 client_->keyMessage(WebString::fromUTF8(key_system), |
| 917 WebString::fromUTF8(session_id), | 959 WebString::fromUTF8(session_id), |
| 918 reinterpret_cast<const uint8*>(message.data()), | 960 reinterpret_cast<const uint8*>(message.data()), |
| 919 message.size(), | 961 message.size(), |
| 920 default_url_gurl); | 962 default_url_gurl); |
| 921 } | 963 } |
| 964 |
| 965 bool WebMediaPlayerAndroid::InjectMediaStream( |
| 966 MediaStreamClient* media_stream_client, |
| 967 media::Demuxer* demuxer, |
| 968 const base::Closure& destroy_demuxer_cb) { |
| 969 DCHECK(!demuxer); |
| 970 media_stream_client_ = media_stream_client; |
| 971 demuxer_ = demuxer; |
| 972 destroy_demuxer_cb_ = destroy_demuxer_cb; |
| 973 return true; |
| 974 } |
| 922 #endif // defined(GOOGLE_TV) | 975 #endif // defined(GOOGLE_TV) |
| 923 | 976 |
| 924 void WebMediaPlayerAndroid::OnNeedKey(const std::string& key_system, | 977 void WebMediaPlayerAndroid::OnNeedKey(const std::string& key_system, |
| 925 const std::string& session_id, | 978 const std::string& session_id, |
| 926 const std::string& type, | 979 const std::string& type, |
| 927 scoped_ptr<uint8[]> init_data, | 980 scoped_ptr<uint8[]> init_data, |
| 928 int init_data_size) { | 981 int init_data_size) { |
| 929 // Do not fire NeedKey event if encrypted media is not enabled. | 982 // Do not fire NeedKey event if encrypted media is not enabled. |
| 930 if (!decryptor_) | 983 if (!decryptor_) |
| 931 return; | 984 return; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 960 void WebMediaPlayerAndroid::exitFullscreen() { | 1013 void WebMediaPlayerAndroid::exitFullscreen() { |
| 961 if (proxy_) | 1014 if (proxy_) |
| 962 proxy_->ExitFullscreen(player_id_); | 1015 proxy_->ExitFullscreen(player_id_); |
| 963 } | 1016 } |
| 964 | 1017 |
| 965 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1018 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
| 966 return manager_->CanEnterFullscreen(frame_); | 1019 return manager_->CanEnterFullscreen(frame_); |
| 967 } | 1020 } |
| 968 | 1021 |
| 969 } // namespace webkit_media | 1022 } // namespace webkit_media |
| OLD | NEW |