| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base/android/media_player_bridge.h" | 5 #include "media/base/android/media_player_bridge.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 | 27 |
| 28 MediaPlayerBridge::MediaPlayerBridge( | 28 MediaPlayerBridge::MediaPlayerBridge( |
| 29 int player_id, | 29 int player_id, |
| 30 const GURL& url, | 30 const GURL& url, |
| 31 const GURL& first_party_for_cookies, | 31 const GURL& first_party_for_cookies, |
| 32 const std::string& user_agent, | 32 const std::string& user_agent, |
| 33 bool hide_url_log, | 33 bool hide_url_log, |
| 34 MediaPlayerManager* manager, | 34 MediaPlayerManager* manager, |
| 35 const RequestMediaResourcesCB& request_media_resources_cb, | 35 const RequestMediaResourcesCB& request_media_resources_cb, |
| 36 const ReleaseMediaResourcesCB& release_media_resources_cb) | 36 const ReleaseMediaResourcesCB& release_media_resources_cb) |
| 37 : MediaPlayerAndroid(player_id, manager, request_media_resources_cb, | 37 : MediaPlayerAndroid(player_id, |
| 38 manager, |
| 39 request_media_resources_cb, |
| 38 release_media_resources_cb), | 40 release_media_resources_cb), |
| 39 prepared_(false), | 41 prepared_(false), |
| 40 pending_play_(false), | 42 pending_play_(false), |
| 41 url_(url), | 43 url_(url), |
| 42 first_party_for_cookies_(first_party_for_cookies), | 44 first_party_for_cookies_(first_party_for_cookies), |
| 43 user_agent_(user_agent), | 45 user_agent_(user_agent), |
| 44 hide_url_log_(hide_url_log), | 46 hide_url_log_(hide_url_log), |
| 45 width_(0), | 47 width_(0), |
| 46 height_(0), | 48 height_(0), |
| 47 can_pause_(true), | 49 can_pause_(true), |
| 48 can_seek_forward_(true), | 50 can_seek_forward_(true), |
| 49 can_seek_backward_(true), | 51 can_seek_backward_(true), |
| 50 weak_this_(this), | 52 is_surface_in_use_(false), |
| 51 listener_(base::MessageLoopProxy::current(), | 53 weak_factory_(this) { |
| 52 weak_this_.GetWeakPtr()), | 54 listener_.reset(new MediaPlayerListener(base::MessageLoopProxy::current(), |
| 53 is_surface_in_use_(false) { | 55 weak_factory_.GetWeakPtr())); |
| 54 } | 56 } |
| 55 | 57 |
| 56 MediaPlayerBridge::~MediaPlayerBridge() { | 58 MediaPlayerBridge::~MediaPlayerBridge() { |
| 57 if (!j_media_player_bridge_.is_null()) { | 59 if (!j_media_player_bridge_.is_null()) { |
| 58 JNIEnv* env = base::android::AttachCurrentThread(); | 60 JNIEnv* env = base::android::AttachCurrentThread(); |
| 59 CHECK(env); | 61 CHECK(env); |
| 60 Java_MediaPlayerBridge_destroy(env, j_media_player_bridge_.obj()); | 62 Java_MediaPlayerBridge_destroy(env, j_media_player_bridge_.obj()); |
| 61 } | 63 } |
| 62 Release(); | 64 Release(); |
| 63 } | 65 } |
| 64 | 66 |
| 65 void MediaPlayerBridge::Initialize() { | 67 void MediaPlayerBridge::Initialize() { |
| 66 cookies_.clear(); | 68 cookies_.clear(); |
| 67 if (url_.SchemeIsFile()) { | 69 if (url_.SchemeIsFile()) { |
| 68 ExtractMediaMetadata(url_.spec()); | 70 ExtractMediaMetadata(url_.spec()); |
| 69 return; | 71 return; |
| 70 } | 72 } |
| 71 | 73 |
| 72 media::MediaResourceGetter* resource_getter = | 74 media::MediaResourceGetter* resource_getter = |
| 73 manager()->GetMediaResourceGetter(); | 75 manager()->GetMediaResourceGetter(); |
| 74 if (url_.SchemeIsFileSystem() || url_.SchemeIs(kBlobScheme)) { | 76 if (url_.SchemeIsFileSystem() || url_.SchemeIs(kBlobScheme)) { |
| 75 resource_getter->GetPlatformPathFromURL(url_, base::Bind( | 77 resource_getter->GetPlatformPathFromURL( |
| 76 &MediaPlayerBridge::ExtractMediaMetadata, weak_this_.GetWeakPtr())); | 78 url_, |
| 79 base::Bind(&MediaPlayerBridge::ExtractMediaMetadata, |
| 80 weak_factory_.GetWeakPtr())); |
| 77 return; | 81 return; |
| 78 } | 82 } |
| 79 | 83 |
| 80 resource_getter->GetCookies(url_, first_party_for_cookies_, base::Bind( | 84 resource_getter->GetCookies(url_, |
| 81 &MediaPlayerBridge::OnCookiesRetrieved, weak_this_.GetWeakPtr())); | 85 first_party_for_cookies_, |
| 86 base::Bind(&MediaPlayerBridge::OnCookiesRetrieved, |
| 87 weak_factory_.GetWeakPtr())); |
| 82 } | 88 } |
| 83 | 89 |
| 84 void MediaPlayerBridge::CreateJavaMediaPlayerBridge() { | 90 void MediaPlayerBridge::CreateJavaMediaPlayerBridge() { |
| 85 JNIEnv* env = base::android::AttachCurrentThread(); | 91 JNIEnv* env = base::android::AttachCurrentThread(); |
| 86 CHECK(env); | 92 CHECK(env); |
| 87 | 93 |
| 88 j_media_player_bridge_.Reset(Java_MediaPlayerBridge_create( | 94 j_media_player_bridge_.Reset(Java_MediaPlayerBridge_create( |
| 89 env, reinterpret_cast<intptr_t>(this))); | 95 env, reinterpret_cast<intptr_t>(this))); |
| 90 | 96 |
| 91 SetMediaPlayerListener(); | 97 SetMediaPlayerListener(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 103 GetJavaMediaPlayerBridge() { | 109 GetJavaMediaPlayerBridge() { |
| 104 base::android::ScopedJavaLocalRef<jobject> j_bridge( | 110 base::android::ScopedJavaLocalRef<jobject> j_bridge( |
| 105 j_media_player_bridge_); | 111 j_media_player_bridge_); |
| 106 return j_bridge; | 112 return j_bridge; |
| 107 } | 113 } |
| 108 | 114 |
| 109 void MediaPlayerBridge::SetMediaPlayerListener() { | 115 void MediaPlayerBridge::SetMediaPlayerListener() { |
| 110 jobject j_context = base::android::GetApplicationContext(); | 116 jobject j_context = base::android::GetApplicationContext(); |
| 111 DCHECK(j_context); | 117 DCHECK(j_context); |
| 112 | 118 |
| 113 listener_.CreateMediaPlayerListener(j_context, j_media_player_bridge_.obj()); | 119 listener_->CreateMediaPlayerListener(j_context, j_media_player_bridge_.obj()); |
| 114 } | 120 } |
| 115 | 121 |
| 116 void MediaPlayerBridge::SetDuration(base::TimeDelta duration) { | 122 void MediaPlayerBridge::SetDuration(base::TimeDelta duration) { |
| 117 duration_ = duration; | 123 duration_ = duration; |
| 118 } | 124 } |
| 119 | 125 |
| 120 void MediaPlayerBridge::SetVideoSurface(gfx::ScopedJavaSurface surface) { | 126 void MediaPlayerBridge::SetVideoSurface(gfx::ScopedJavaSurface surface) { |
| 121 if (j_media_player_bridge_.is_null()) { | 127 if (j_media_player_bridge_.is_null()) { |
| 122 if (surface.IsEmpty()) | 128 if (surface.IsEmpty()) |
| 123 return; | 129 return; |
| 124 Prepare(); | 130 Prepare(); |
| 125 } | 131 } |
| 126 | 132 |
| 127 JNIEnv* env = base::android::AttachCurrentThread(); | 133 JNIEnv* env = base::android::AttachCurrentThread(); |
| 128 CHECK(env); | 134 CHECK(env); |
| 129 is_surface_in_use_ = true; | 135 is_surface_in_use_ = true; |
| 130 Java_MediaPlayerBridge_setSurface( | 136 Java_MediaPlayerBridge_setSurface( |
| 131 env, j_media_player_bridge_.obj(), surface.j_surface().obj()); | 137 env, j_media_player_bridge_.obj(), surface.j_surface().obj()); |
| 132 } | 138 } |
| 133 | 139 |
| 134 void MediaPlayerBridge::Prepare() { | 140 void MediaPlayerBridge::Prepare() { |
| 135 DCHECK(j_media_player_bridge_.is_null()); | 141 DCHECK(j_media_player_bridge_.is_null()); |
| 136 CreateJavaMediaPlayerBridge(); | 142 CreateJavaMediaPlayerBridge(); |
| 137 if (url_.SchemeIsFileSystem() || url_.SchemeIs(kBlobScheme)) { | 143 if (url_.SchemeIsFileSystem() || url_.SchemeIs(kBlobScheme)) { |
| 138 manager()->GetMediaResourceGetter()->GetPlatformPathFromURL( | 144 manager()->GetMediaResourceGetter()->GetPlatformPathFromURL( |
| 139 url_, base::Bind(&MediaPlayerBridge::SetDataSource, | 145 url_, |
| 140 weak_this_.GetWeakPtr())); | 146 base::Bind(&MediaPlayerBridge::SetDataSource, |
| 147 weak_factory_.GetWeakPtr())); |
| 141 return; | 148 return; |
| 142 } | 149 } |
| 143 | 150 |
| 144 SetDataSource(url_.spec()); | 151 SetDataSource(url_.spec()); |
| 145 } | 152 } |
| 146 | 153 |
| 147 void MediaPlayerBridge::SetDataSource(const std::string& url) { | 154 void MediaPlayerBridge::SetDataSource(const std::string& url) { |
| 148 if (j_media_player_bridge_.is_null()) | 155 if (j_media_player_bridge_.is_null()) |
| 149 return; | 156 return; |
| 150 | 157 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 OnMediaError(MEDIA_ERROR_FORMAT); | 201 OnMediaError(MEDIA_ERROR_FORMAT); |
| 195 } | 202 } |
| 196 | 203 |
| 197 void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { | 204 void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { |
| 198 cookies_ = cookies; | 205 cookies_ = cookies; |
| 199 ExtractMediaMetadata(url_.spec()); | 206 ExtractMediaMetadata(url_.spec()); |
| 200 } | 207 } |
| 201 | 208 |
| 202 void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) { | 209 void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) { |
| 203 manager()->GetMediaResourceGetter()->ExtractMediaMetadata( | 210 manager()->GetMediaResourceGetter()->ExtractMediaMetadata( |
| 204 url, cookies_, user_agent_, | 211 url, |
| 212 cookies_, |
| 213 user_agent_, |
| 205 base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted, | 214 base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted, |
| 206 weak_this_.GetWeakPtr())); | 215 weak_factory_.GetWeakPtr())); |
| 207 } | 216 } |
| 208 | 217 |
| 209 void MediaPlayerBridge::OnMediaMetadataExtracted( | 218 void MediaPlayerBridge::OnMediaMetadataExtracted( |
| 210 base::TimeDelta duration, int width, int height, bool success) { | 219 base::TimeDelta duration, int width, int height, bool success) { |
| 211 if (success) { | 220 if (success) { |
| 212 duration_ = duration; | 221 duration_ = duration; |
| 213 width_ = width; | 222 width_ = width; |
| 214 height_ = height; | 223 height_ = height; |
| 215 } | 224 } |
| 216 manager()->OnMediaMetadataChanged( | 225 manager()->OnMediaMetadataChanged( |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 if (prepared_) | 312 if (prepared_) |
| 304 pending_seek_ = GetCurrentTime(); | 313 pending_seek_ = GetCurrentTime(); |
| 305 prepared_ = false; | 314 prepared_ = false; |
| 306 pending_play_ = false; | 315 pending_play_ = false; |
| 307 is_surface_in_use_ = false; | 316 is_surface_in_use_ = false; |
| 308 SetVideoSurface(gfx::ScopedJavaSurface()); | 317 SetVideoSurface(gfx::ScopedJavaSurface()); |
| 309 JNIEnv* env = base::android::AttachCurrentThread(); | 318 JNIEnv* env = base::android::AttachCurrentThread(); |
| 310 Java_MediaPlayerBridge_release(env, j_media_player_bridge_.obj()); | 319 Java_MediaPlayerBridge_release(env, j_media_player_bridge_.obj()); |
| 311 j_media_player_bridge_.Reset(); | 320 j_media_player_bridge_.Reset(); |
| 312 release_media_resources_cb_.Run(player_id()); | 321 release_media_resources_cb_.Run(player_id()); |
| 313 listener_.ReleaseMediaPlayerListenerResources(); | 322 listener_->ReleaseMediaPlayerListenerResources(); |
| 314 } | 323 } |
| 315 | 324 |
| 316 void MediaPlayerBridge::SetVolume(double volume) { | 325 void MediaPlayerBridge::SetVolume(double volume) { |
| 317 if (j_media_player_bridge_.is_null()) | 326 if (j_media_player_bridge_.is_null()) |
| 318 return; | 327 return; |
| 319 | 328 |
| 320 JNIEnv* env = base::android::AttachCurrentThread(); | 329 JNIEnv* env = base::android::AttachCurrentThread(); |
| 321 CHECK(env); | 330 CHECK(env); |
| 322 Java_MediaPlayerBridge_setVolume( | 331 Java_MediaPlayerBridge_setVolume( |
| 323 env, j_media_player_bridge_.obj(), volume); | 332 env, j_media_player_bridge_.obj(), volume); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 | 473 |
| 465 GURL MediaPlayerBridge::GetFirstPartyForCookies() { | 474 GURL MediaPlayerBridge::GetFirstPartyForCookies() { |
| 466 return first_party_for_cookies_; | 475 return first_party_for_cookies_; |
| 467 } | 476 } |
| 468 | 477 |
| 469 bool MediaPlayerBridge::IsSurfaceInUse() const { | 478 bool MediaPlayerBridge::IsSurfaceInUse() const { |
| 470 return is_surface_in_use_; | 479 return is_surface_in_use_; |
| 471 } | 480 } |
| 472 | 481 |
| 473 } // namespace media | 482 } // namespace media |
| OLD | NEW |