diff options
Diffstat (limited to 'chromium/media/base/android/media_player_bridge.cc')
-rw-r--r-- | chromium/media/base/android/media_player_bridge.cc | 83 |
1 files changed, 62 insertions, 21 deletions
diff --git a/chromium/media/base/android/media_player_bridge.cc b/chromium/media/base/android/media_player_bridge.cc index eeab111c274..41d0ab6356d 100644 --- a/chromium/media/base/android/media_player_bridge.cc +++ b/chromium/media/base/android/media_player_bridge.cc @@ -80,6 +80,8 @@ MediaPlayerBridge::MediaPlayerBridge(const GURL& url, url_(url), site_for_cookies_(site_for_cookies), top_frame_origin_(top_frame_origin), + pending_retrieve_cookies_(false), + should_prepare_on_retrieved_cookies_(false), user_agent_(user_agent), hide_url_log_(hide_url_log), width_(0), @@ -127,6 +129,7 @@ void MediaPlayerBridge::Initialize() { media::MediaResourceGetter* resource_getter = client_->GetMediaResourceGetter(); + pending_retrieve_cookies_ = true; resource_getter->GetCookies( url_, site_for_cookies_, top_frame_origin_, base::BindOnce(&MediaPlayerBridge::OnCookiesRetrieved, @@ -164,6 +167,17 @@ void MediaPlayerBridge::SetVideoSurface(gl::ScopedJavaSurface surface) { surface_.j_surface()); } +void MediaPlayerBridge::SetPlaybackRate(double playback_rate) { + if (j_media_player_bridge_.is_null()) + return; + + JNIEnv* env = base::android::AttachCurrentThread(); + CHECK(env); + + Java_MediaPlayerBridge_setPlaybackRate(env, j_media_player_bridge_, + playback_rate); +} + void MediaPlayerBridge::Prepare() { DCHECK(j_media_player_bridge_.is_null()); @@ -200,31 +214,52 @@ void MediaPlayerBridge::SetDataSource(const std::string& url) { OnMediaError(MEDIA_ERROR_FORMAT); return; } - } else { - // Create a Java String for the URL. - ScopedJavaLocalRef<jstring> j_url_string = - ConvertUTF8ToJavaString(env, url); - - const std::string data_uri_prefix("data:"); - if (base::StartsWith(url, data_uri_prefix, base::CompareCase::SENSITIVE)) { - if (!Java_MediaPlayerBridge_setDataUriDataSource( - env, j_media_player_bridge_, j_url_string)) { - OnMediaError(MEDIA_ERROR_FORMAT); - } - return; - } - ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString( - env, cookies_); - ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString( - env, user_agent_); + if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_)) + OnMediaError(MEDIA_ERROR_FORMAT); + + return; + } - if (!Java_MediaPlayerBridge_setDataSource(env, j_media_player_bridge_, - j_url_string, j_cookies, - j_user_agent, hide_url_log_)) { + // Create a Java String for the URL. + ScopedJavaLocalRef<jstring> j_url_string = ConvertUTF8ToJavaString(env, url); + + const std::string data_uri_prefix("data:"); + if (base::StartsWith(url, data_uri_prefix, base::CompareCase::SENSITIVE)) { + if (!Java_MediaPlayerBridge_setDataUriDataSource( + env, j_media_player_bridge_, j_url_string)) { OnMediaError(MEDIA_ERROR_FORMAT); - return; } + return; + } + + // Cookies may not have been retrieved yet, delay prepare until they are + // retrieved. + if (pending_retrieve_cookies_) { + should_prepare_on_retrieved_cookies_ = true; + return; + } + SetDataSourceInternal(); +} + +void MediaPlayerBridge::SetDataSourceInternal() { + DCHECK(!pending_retrieve_cookies_); + + JNIEnv* env = base::android::AttachCurrentThread(); + CHECK(env); + + ScopedJavaLocalRef<jstring> j_cookies = + ConvertUTF8ToJavaString(env, cookies_); + ScopedJavaLocalRef<jstring> j_user_agent = + ConvertUTF8ToJavaString(env, user_agent_); + ScopedJavaLocalRef<jstring> j_url_string = + ConvertUTF8ToJavaString(env, url_.spec()); + + if (!Java_MediaPlayerBridge_setDataSource(env, j_media_player_bridge_, + j_url_string, j_cookies, + j_user_agent, hide_url_log_)) { + OnMediaError(MEDIA_ERROR_FORMAT); + return; } if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_)) @@ -267,9 +302,15 @@ void MediaPlayerBridge::OnDidSetDataUriDataSource( void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { cookies_ = cookies; + pending_retrieve_cookies_ = false; client_->GetMediaResourceGetter()->GetAuthCredentials( url_, base::BindOnce(&MediaPlayerBridge::OnAuthCredentialsRetrieved, weak_factory_.GetWeakPtr())); + + if (should_prepare_on_retrieved_cookies_) { + SetDataSourceInternal(); + should_prepare_on_retrieved_cookies_ = false; + } } void MediaPlayerBridge::OnAuthCredentialsRetrieved( |