summaryrefslogtreecommitdiff
path: root/chromium/media/base/android/media_player_bridge.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/base/android/media_player_bridge.cc')
-rw-r--r--chromium/media/base/android/media_player_bridge.cc83
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(